仿生人MCP接入点

This commit is contained in:
BBIT-Kai
2025-11-05 18:06:40 +08:00
parent f50521e548
commit 7ff894e875
12 changed files with 2088 additions and 0 deletions
+258
View File
@@ -0,0 +1,258 @@
"""
MCP Endpoint Server
主服务器文件
"""
import json
import signal
import sys
from contextlib import asynccontextmanager
from urllib.parse import quote
import uvicorn
from fastapi import FastAPI, WebSocket, WebSocketDisconnect
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import RedirectResponse
from core.connection_manager import connection_manager
from handlers.websocket_handler import websocket_handler
from utils import __version__
from utils.aes_utils import decrypt, encrypt
from utils.config import config
from utils.jsonrpc import (
JSONRPCProtocol,
)
from utils.logger import get_logger
from utils.util import get_local_ip
logger = get_logger()
async def validate_token_and_get_agent_id(websocket: WebSocket) -> str:
"""
验证token并获取agentId的公共方法
Args:
websocket: WebSocket连接对象
Returns:
str: 验证成功返回agentId,失败返回None
"""
token = websocket.query_params.get("token")
if not token:
logger.error("缺少token参数")
await websocket.close(code=1008, reason="缺少token参数")
return None
data = decrypt(config.get("server", "key", ""), token)
if not data:
logger.error(f"token解密失败: {token}")
await websocket.close(code=1008, reason="token解密失败")
return None
try:
data = json.loads(data)
agent_id = data.get("agentId")
if not agent_id:
logger.error("无对应agentId")
await websocket.close(code=1008, reason="无对应agentId")
return None
return agent_id
except json.JSONDecodeError:
logger.error("token数据格式错误")
await websocket.close(code=1008, reason="token数据格式错误")
return None
@asynccontextmanager
async def lifespan(app: FastAPI):
"""应用生命周期管理"""
# 启动时
logger.info("MCP Endpoint Server 正在启动...")
logger.info(f"=====下面的地址分别是智控台/单模块MCP接入点地址====")
local_ip = get_local_ip()
logger.info(
f"智控台MCP参数配置: http://{local_ip}:{config.getint('server', 'port', 8004)}/mcp_endpoint/health?key={config.get('server', 'key', '')}"
)
encrypted_token = encrypt(
config.get("server", "key", ""), '{"agentId":"single_module"}'
)
token = quote(encrypted_token)
logger.info(
f"单模块部署MCP接入点: ws://{local_ip}:{config.getint('server', 'port', 8004)}/mcp_endpoint/mcp/?token={token}"
)
logger.info(
"=====请根据具体部署选择使用,请勿泄露给任何人======",
)
yield
# 关闭时
logger.info("MCP Endpoint Server 已关闭")
# 创建FastAPI应用
app = FastAPI(
title="MCP Endpoint Server",
description="高效的WebSocket中转服务器",
version=__version__,
lifespan=lifespan,
)
# 配置CORS
if config.getboolean("security", "enable_cors", True):
app.add_middleware(
CORSMiddleware,
allow_origins=[config.get("security", "allowed_origins", "*")],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
@app.get("/")
async def redirect_root():
"""根路径重定向到 /mcp_endpoint/"""
return RedirectResponse(url="/mcp_endpoint/")
@app.get("/mcp_endpoint/")
async def root():
"""根路径"""
response = JSONRPCProtocol.create_success_response(
result={
"message": "MCP Endpoint Server",
"version": __version__,
"status": "running",
}
)
return JSONRPCProtocol.to_dict(response)
@app.get("/mcp_endpoint/health")
async def health_check(key: str = None):
"""健康检查"""
# 验证key参数
expected_key = config.get("server", "key", "")
if not key or key != expected_key:
response = JSONRPCProtocol.create_error_response(
error_code=JSONRPCProtocol.AUTHENTICATION_ERROR,
error_message="密钥验证失败",
error_data={"details": "提供的密钥无效或缺失"},
)
return JSONRPCProtocol.to_dict(response)
stats = connection_manager.get_connection_stats()
response = JSONRPCProtocol.create_success_response(
result={"status": "success", "connections": stats}
)
return JSONRPCProtocol.to_dict(response)
@app.websocket("/mcp_endpoint/mcp/")
async def websocket_tool_endpoint(websocket: WebSocket):
"""工具端WebSocket端点"""
await websocket.accept()
# 获取agentId参数
agent_id = await validate_token_and_get_agent_id(websocket)
if not agent_id:
return
try:
# 注册连接
await connection_manager.register_tool_connection(agent_id, websocket)
logger.info(f"工具端连接已建立: {agent_id}")
# 处理消息
while True:
try:
message = await websocket.receive_text()
await websocket_handler._handle_tool_message(agent_id, message)
except WebSocketDisconnect:
break
except Exception as e:
logger.error(f"处理工具端消息时发生错误: {e}")
break
except Exception as e:
logger.error(f"处理工具端连接时发生错误: {e}")
finally:
await connection_manager.unregister_tool_connection(agent_id)
logger.info(f"工具端连接已关闭: {agent_id}")
@app.websocket("/mcp_endpoint/call/")
async def websocket_robot_endpoint(websocket: WebSocket):
"""小智端WebSocket端点"""
await websocket.accept()
# 获取agentId参数
agent_id = await validate_token_and_get_agent_id(websocket)
if not agent_id:
return
try:
# 注册连接并获取UUID
connection_uuid = await connection_manager.register_robot_connection(
agent_id, websocket
)
logger.info(f"小智端连接已建立: {agent_id} (UUID: {connection_uuid})")
# 处理消息
while True:
try:
message = await websocket.receive_text()
await websocket_handler._handle_robot_message(
agent_id, message, connection_uuid
)
except WebSocketDisconnect:
break
except Exception as e:
logger.error(f"处理小智端消息时发生错误: {e}")
break
except Exception as e:
logger.error(f"处理小智端连接时发生错误: {e}")
finally:
await connection_manager.unregister_robot_connection(connection_uuid)
logger.info(f"小智端连接已关闭: {agent_id} (UUID: {connection_uuid})")
def signal_handler(signum, frame):
"""信号处理器"""
logger.info(f"收到信号 {signum},正在关闭服务器...")
sys.exit(0)
def main():
"""主函数"""
# 设置uvicorn日志拦截
from utils.logger import logger_manager
logger_manager.setup_uvicorn_logging()
# 注册信号处理器
signal.signal(signal.SIGINT, signal_handler)
signal.signal(signal.SIGTERM, signal_handler)
# 获取配置
host = config.get("server", "host", "0.0.0.0")
port = config.getint("server", "port", 8004)
debug = config.getboolean("server", "debug", False)
logger.info(f"启动MCP Endpoint Server: {host}:{port}")
# 启动服务器
uvicorn.run(
"app:app",
host=host,
port=port,
reload=debug,
log_level=config.get("server", "log_level", "INFO").lower(),
access_log=False,
log_config=None, # 禁用uvicorn默认日志配置
use_colors=True, # 启用颜色支持
)
if __name__ == "__main__":
main()
+270
View File
@@ -0,0 +1,270 @@
"""
连接管理器
负责管理WebSocket连接和消息转发
"""
import asyncio
import json
import time
import uuid
from typing import Dict, Any, List, Optional, Tuple
from websockets.server import WebSocketServerProtocol
from websockets.exceptions import ConnectionClosed
from utils.logger import get_logger
logger = get_logger()
class RobotConnection:
"""小智端连接信息"""
def __init__(self, websocket: WebSocketServerProtocol, agent_id: str):
self.websocket = websocket
self.agent_id = agent_id
self.connection_uuid = str(uuid.uuid4())
self.timestamp = time.time()
class ConnectionManager:
"""连接管理器"""
def __init__(self):
# 工具端连接: {agentId: websocket}
self.tool_connections: Dict[str, WebSocketServerProtocol] = {}
# 小智端连接: {connection_uuid: RobotConnection}
self.robot_connections: Dict[str, RobotConnection] = {}
# 连接时间戳: {agentId: timestamp}
self.connection_timestamps: Dict[str, float] = {}
# 连接锁
self._lock = asyncio.Lock()
async def register_tool_connection(
self, agent_id: str, websocket: WebSocketServerProtocol
):
"""注册工具端连接"""
async with self._lock:
# 如果已存在连接,先关闭旧连接
if agent_id in self.tool_connections:
old_websocket = self.tool_connections[agent_id]
try:
await old_websocket.close(1000, "新连接替换")
except Exception as e:
logger.warning(f"关闭旧工具端连接失败: {e}")
self.tool_connections[agent_id] = websocket
self.connection_timestamps[agent_id] = time.time()
logger.info(f"工具端连接已注册: {agent_id}")
async def register_robot_connection(
self, agent_id: str, websocket: WebSocketServerProtocol
) -> str:
"""注册小智端连接,返回分配的UUID"""
async with self._lock:
robot_conn = RobotConnection(websocket, agent_id)
self.robot_connections[robot_conn.connection_uuid] = robot_conn
self.connection_timestamps[agent_id] = time.time()
logger.info(
f"小智端连接已注册: {agent_id}, UUID: {robot_conn.connection_uuid}"
)
return robot_conn.connection_uuid
async def unregister_tool_connection(self, agent_id: str):
"""注销工具端连接"""
async with self._lock:
if agent_id in self.tool_connections:
del self.tool_connections[agent_id]
if agent_id in self.connection_timestamps:
del self.connection_timestamps[agent_id]
logger.info(f"工具端连接已注销: {agent_id}")
async def unregister_robot_connection(self, connection_uuid: str):
"""注销小智端连接"""
async with self._lock:
if connection_uuid in self.robot_connections:
robot_conn = self.robot_connections[connection_uuid]
del self.robot_connections[connection_uuid]
logger.info(
f"小智端连接已注销: {robot_conn.agent_id}, UUID: {connection_uuid}"
)
def _transform_jsonrpc_id(self, original_id: Any, connection_uuid: str) -> str:
"""转换JSON-RPC ID"""
if isinstance(original_id, int):
return f"{connection_uuid}_n_{original_id}"
elif isinstance(original_id, str):
return f"{connection_uuid}_s_{original_id}"
else:
# 其他类型转换为字符串
return f"{connection_uuid}_s_{str(original_id)}"
def _restore_jsonrpc_id(self, transformed_id: str) -> Tuple[Optional[str], Any]:
"""还原JSON-RPC ID,返回(connection_uuid, original_id)"""
if not transformed_id or "_" not in transformed_id:
return None, None
# 解析格式: uuid_type_original_id
parts = transformed_id.split("_", 2)
if len(parts) < 3:
return None, None
connection_uuid = parts[0]
id_type = parts[1]
original_id_part = parts[2]
if id_type == "n":
# 数字类型
try:
original_id = int(original_id_part)
except ValueError:
original_id = original_id_part
elif id_type == "s":
# 字符串类型
if original_id_part == "null":
original_id = None
else:
original_id = original_id_part
else:
# 未知类型,保持原样
original_id = original_id_part
return connection_uuid, original_id
def transform_jsonrpc_message(
self, message: Dict[str, Any], connection_uuid: str
) -> Dict[str, Any]:
"""转换JSON-RPC消息的ID"""
if not isinstance(message, dict):
return message
# 创建消息副本
transformed_message = message.copy()
# 转换ID
if "id" in transformed_message:
original_id = transformed_message["id"]
if original_id:
transformed_message["id"] = self._transform_jsonrpc_id(
original_id, connection_uuid
)
return transformed_message
def restore_jsonrpc_message(
self, message: Dict[str, Any]
) -> Tuple[Optional[str], Dict[str, Any]]:
"""还原JSON-RPC消息的ID,返回(connection_uuid, restored_message)"""
if not isinstance(message, dict):
return None, message
# 创建消息副本
restored_message = message.copy()
# 还原ID
if "id" in restored_message:
transformed_id = restored_message["id"]
connection_uuid, original_id = self._restore_jsonrpc_id(transformed_id)
if connection_uuid:
restored_message["id"] = original_id
return connection_uuid, restored_message
return None, restored_message
async def forward_to_tool(self, agent_id: str, message: Any) -> bool:
"""转发消息给工具端"""
async with self._lock:
if agent_id not in self.tool_connections:
logger.warning(f"工具端连接不存在: {agent_id}")
return False
websocket = self.tool_connections[agent_id]
try:
# 确保消息是字符串格式
if isinstance(message, dict):
message_str = json.dumps(message, ensure_ascii=False)
elif isinstance(message, str):
message_str = message
else:
message_str = str(message)
await websocket.send_text(message_str)
logger.debug(f"消息已转发给工具端 {agent_id}: {message_str[:100]}...")
return True
except ConnectionClosed:
logger.warning(f"工具端连接已关闭: {agent_id}")
await self.unregister_tool_connection(agent_id)
return False
except Exception as e:
logger.error(f"转发消息给工具端失败: {e}")
return False
async def forward_to_robot_by_uuid(
self, connection_uuid: str, message: Any
) -> bool:
"""根据UUID转发消息给特定的小智端连接"""
async with self._lock:
if connection_uuid not in self.robot_connections:
logger.warning(f"小智端连接不存在: {connection_uuid}")
return False
robot_conn = self.robot_connections[connection_uuid]
try:
# 确保消息是字符串格式
if isinstance(message, dict):
message_str = json.dumps(message, ensure_ascii=False)
elif isinstance(message, str):
message_str = message
else:
message_str = str(message)
await robot_conn.websocket.send_text(message_str)
logger.debug(
f"消息已转发给小智端 {robot_conn.agent_id} (UUID: {connection_uuid}): {message_str[:100]}..."
)
return True
except ConnectionClosed:
logger.warning(f"小智端连接已关闭: {connection_uuid}")
await self.unregister_robot_connection(connection_uuid)
return False
except Exception as e:
logger.error(f"转发消息给小智端失败: {e}")
return False
def get_connection_stats(self) -> Dict[str, Any]:
"""获取连接统计信息"""
# 统计每个agent_id的连接数
agent_connection_counts = {}
for robot_conn in self.robot_connections.values():
agent_id = robot_conn.agent_id
agent_connection_counts[agent_id] = (
agent_connection_counts.get(agent_id, 0) + 1
)
return {
"tool_connections": len(self.tool_connections),
"robot_connections": len(self.robot_connections),
"total_connections": len(self.tool_connections)
+ len(self.robot_connections),
"robot_connections_by_agent": agent_connection_counts,
}
def is_tool_connected(self, agent_id: str) -> bool:
"""检查工具端是否已连接"""
return agent_id in self.tool_connections
def is_robot_connected(self, agent_id: str) -> bool:
"""检查小智端是否已连接"""
return any(
conn.agent_id == agent_id for conn in self.robot_connections.values()
)
def get_robot_connections_by_agent(self, agent_id: str) -> List[RobotConnection]:
"""获取指定agent_id的所有小智端连接"""
return [
conn
for conn in self.robot_connections.values()
if conn.agent_id == agent_id
]
# 全局连接管理器实例
connection_manager = ConnectionManager()
@@ -0,0 +1,22 @@
[server]
host = 127.0.0.1
port = 8004
debug = false
log_level = INFO
key = f4222eccc20e4361861d88b121af07f4
[websocket]
max_connections = 1000
ping_interval = 30
ping_timeout = 10
close_timeout = 10
[security]
allowed_origins = *
enable_cors = true
[logging]
log_file = logs/mcp_server.log
max_file_size = 10MB
backup_count = 5
@@ -0,0 +1,117 @@
"""
WebSocket处理器
处理工具端和小智端的WebSocket连接
"""
import json
from core.connection_manager import connection_manager
from utils.logger import get_logger
from utils.jsonrpc import (
create_tool_not_connected_error,
create_forward_failed_error,
)
logger = get_logger()
class WebSocketHandler:
"""WebSocket处理器"""
def __init__(self):
pass
async def _handle_tool_message(self, agent_id: str, message: str):
"""处理工具端消息"""
try:
# 解析消息
logger.debug(f"收到工具端消息: {agent_id} - {message}")
# 尝试解析JSON-RPC响应消息
try:
message_data = json.loads(message)
# 还原JSON-RPC ID并获取目标连接UUID
connection_uuid, restored_message = (
connection_manager.restore_jsonrpc_message(message_data)
)
if connection_uuid:
# 有特定的目标连接,发送给该连接
success = await connection_manager.forward_to_robot_by_uuid(
connection_uuid, restored_message
)
if not success:
logger.error(f"转发消息给特定小智端连接失败: {connection_uuid}")
else:
logger.error(f"没有特定目标,无法转发消息")
except json.JSONDecodeError:
# 如果不是JSON格式,按原来的方式处理
logger.error(f"由于消息不是JSON格式,已忽略: {message}")
except json.JSONDecodeError:
logger.error(f"工具端消息格式错误: {message}")
except Exception as e:
logger.error(f"处理工具端消息时发生错误: {e}")
async def _handle_robot_message(
self, agent_id: str, message: str, connection_uuid: str
):
"""处理小智端消息"""
try:
# 解析消息
logger.debug(
f"收到小智端消息: {agent_id} (UUID: {connection_uuid}) - {message}"
)
# 尝试解析JSON-RPC消息以获取id
request_id = None
transformed_message = message
try:
message_data = json.loads(message)
request_id = message_data.get("id")
# 转换JSON-RPC ID
transformed_message_data = connection_manager.transform_jsonrpc_message(
message_data, connection_uuid
)
transformed_message = json.dumps(
transformed_message_data, ensure_ascii=False
)
logger.debug(
f"转换后的消息ID: {message_data.get('id')} -> {transformed_message_data.get('id')}"
)
except json.JSONDecodeError:
logger.warning(f"小智端消息不是有效的JSON格式: {message}")
# 如果消息不是JSON格式,仍然检查工具端连接状态
# 检查是否有对应的工具端连接
if not connection_manager.is_tool_connected(agent_id):
logger.warning(f"工具端未连接: {agent_id}")
# 发送JSON-RPC格式的错误消息给小智端
error_message = create_tool_not_connected_error(request_id, agent_id)
await connection_manager.forward_to_robot_by_uuid(
connection_uuid, error_message
)
return
# 转发转换后的消息给工具端
success = await connection_manager.forward_to_tool(
agent_id, transformed_message
)
if not success:
logger.error(f"转发消息给工具端失败: {agent_id}")
# 发送JSON-RPC格式的错误消息给小智端
error_message = create_forward_failed_error(request_id, agent_id)
await connection_manager.forward_to_robot_by_uuid(
connection_uuid, error_message
)
except json.JSONDecodeError:
logger.error(f"小智端消息格式错误: {message}")
except Exception as e:
logger.error(f"处理小智端消息时发生错误: {e}")
# 全局WebSocket处理器实例
websocket_handler = WebSocketHandler()
+778
View File
@@ -0,0 +1,778 @@
2025-10-31 14:39:23 [0.0.6][__main__] INFO - 启动MCP Endpoint Server: 127.0.0.1:8004
2025-10-31 14:39:23 [0.0.6][uvicorn.config] ERROR - Error loading ASGI app. Could not import module "src.server".
2025-10-31 06:39:59 [0.0.6][__main__] INFO - 启动MCP Endpoint Server: 0.0.0.0:8004
2025-10-31 06:39:59 [0.0.6][uvicorn.server] INFO - Started server process [1]
2025-10-31 06:39:59 [0.0.6][uvicorn.lifespan.on] INFO - Waiting for application startup.
2025-10-31 06:39:59 [0.0.6][app] INFO - MCP Endpoint Server 正在启动...
2025-10-31 06:39:59 [0.0.6][app] INFO - =====下面的地址分别是智控台/单模块MCP接入点地址====
2025-10-31 06:39:59 [0.0.6][app] INFO - 智控台MCP参数配置: http://172.18.0.8:8004/mcp_endpoint/health?key=3d880556c4f3470b8b2242d0db0971f9
2025-10-31 06:39:59 [0.0.6][app] INFO - 单模块部署MCP接入点: ws://172.18.0.8:8004/mcp_endpoint/mcp/?token=BnFypoQ5p4qy2Ir6Hvqg4jxQbSfuyFYiF2fQ/pCPmnw%3D
2025-10-31 06:39:59 [0.0.6][app] INFO - =====请根据具体部署选择使用,请勿泄露给任何人======
2025-10-31 06:39:59 [0.0.6][uvicorn.lifespan.on] INFO - Application startup complete.
2025-10-31 06:39:59 [0.0.6][uvicorn.server] INFO - Uvicorn running on http://0.0.0.0:8004 (Press CTRL+C to quit)
2025-10-31 06:41:53 [0.0.6][uvicorn.server] INFO - Shutting down
2025-10-31 06:41:53 [0.0.6][uvicorn.lifespan.on] INFO - Waiting for application shutdown.
2025-10-31 06:41:53 [0.0.6][app] INFO - MCP Endpoint Server 已关闭
2025-10-31 06:41:53 [0.0.6][uvicorn.lifespan.on] INFO - Application shutdown complete.
2025-10-31 06:41:53 [0.0.6][uvicorn.server] INFO - Finished server process [1]
2025-10-31 06:41:55 [0.0.6][utils.logger] INFO - Logger test message
2025-10-31 06:41:56 [0.0.6][__main__] INFO - 启动MCP Endpoint Server: 0.0.0.0:8004
2025-10-31 06:41:56 [0.0.6][uvicorn.server] INFO - Started server process [1]
2025-10-31 06:41:56 [0.0.6][uvicorn.lifespan.on] INFO - Waiting for application startup.
2025-10-31 06:41:56 [0.0.6][app] INFO - MCP Endpoint Server 正在启动...
2025-10-31 06:41:56 [0.0.6][app] INFO - =====下面的地址分别是智控台/单模块MCP接入点地址====
2025-10-31 06:41:56 [0.0.6][app] INFO - 智控台MCP参数配置: http://172.18.0.8:8004/mcp_endpoint/health?key=3d880556c4f3470b8b2242d0db0971f9
2025-10-31 06:41:56 [0.0.6][app] INFO - 单模块部署MCP接入点: ws://172.18.0.8:8004/mcp_endpoint/mcp/?token=BnFypoQ5p4qy2Ir6Hvqg4jxQbSfuyFYiF2fQ/pCPmnw%3D
2025-10-31 06:41:56 [0.0.6][app] INFO - =====请根据具体部署选择使用,请勿泄露给任何人======
2025-10-31 06:41:56 [0.0.6][uvicorn.lifespan.on] INFO - Application startup complete.
2025-10-31 06:41:56 [0.0.6][uvicorn.server] INFO - Uvicorn running on http://0.0.0.0:8004 (Press CTRL+C to quit)
2025-10-31 07:12:26 [0.0.6][uvicorn.server] INFO - Shutting down
2025-10-31 07:12:26 [0.0.6][uvicorn.lifespan.on] INFO - Waiting for application shutdown.
2025-10-31 07:12:26 [0.0.6][app] INFO - MCP Endpoint Server 已关闭
2025-10-31 07:12:26 [0.0.6][uvicorn.lifespan.on] INFO - Application shutdown complete.
2025-10-31 07:12:26 [0.0.6][uvicorn.server] INFO - Finished server process [1]
2025-10-31 07:15:09 [0.0.6][utils.logger] INFO - Logger test message
2025-10-31 07:15:10 [0.0.6][__main__] INFO - 启动MCP Endpoint Server: 0.0.0.0:8004
2025-10-31 07:15:10 [0.0.6][uvicorn.server] INFO - Started server process [1]
2025-10-31 07:15:10 [0.0.6][uvicorn.lifespan.on] INFO - Waiting for application startup.
2025-10-31 07:15:10 [0.0.6][app] INFO - MCP Endpoint Server 正在启动...
2025-10-31 07:15:10 [0.0.6][app] INFO - =====下面的地址分别是智控台/单模块MCP接入点地址====
2025-10-31 07:15:10 [0.0.6][app] INFO - 智控台MCP参数配置: http://172.18.0.9:8004/mcp_endpoint/health?key=3d880556c4f3470b8b2242d0db0971f9
2025-10-31 07:15:10 [0.0.6][app] INFO - 单模块部署MCP接入点: ws://172.18.0.9:8004/mcp_endpoint/mcp/?token=BnFypoQ5p4qy2Ir6Hvqg4jxQbSfuyFYiF2fQ/pCPmnw%3D
2025-10-31 07:15:10 [0.0.6][app] INFO - =====请根据具体部署选择使用,请勿泄露给任何人======
2025-10-31 07:15:10 [0.0.6][uvicorn.lifespan.on] INFO - Application startup complete.
2025-10-31 07:15:10 [0.0.6][uvicorn.server] INFO - Uvicorn running on http://0.0.0.0:8004 (Press CTRL+C to quit)
2025-10-31 09:47:53 [0.0.6][uvicorn.server] INFO - Shutting down
2025-10-31 09:47:53 [0.0.6][uvicorn.lifespan.on] INFO - Waiting for application shutdown.
2025-10-31 09:47:53 [0.0.6][app] INFO - MCP Endpoint Server 已关闭
2025-10-31 09:47:53 [0.0.6][uvicorn.lifespan.on] INFO - Application shutdown complete.
2025-10-31 09:47:53 [0.0.6][uvicorn.server] INFO - Finished server process [1]
2025-11-03 01:54:05 [0.0.6][utils.logger] INFO - Logger test message
2025-11-03 01:54:05 [0.0.6][__main__] INFO - 启动MCP Endpoint Server: 0.0.0.0:8004
2025-11-03 01:54:05 [0.0.6][uvicorn.server] INFO - Started server process [1]
2025-11-03 01:54:05 [0.0.6][uvicorn.lifespan.on] INFO - Waiting for application startup.
2025-11-03 01:54:05 [0.0.6][app] INFO - MCP Endpoint Server 正在启动...
2025-11-03 01:54:05 [0.0.6][app] INFO - =====下面的地址分别是智控台/单模块MCP接入点地址====
2025-11-03 01:54:05 [0.0.6][app] INFO - 智控台MCP参数配置: http://172.18.0.5:8004/mcp_endpoint/health?key=3d880556c4f3470b8b2242d0db0971f9
2025-11-03 01:54:05 [0.0.6][app] INFO - 单模块部署MCP接入点: ws://172.18.0.5:8004/mcp_endpoint/mcp/?token=BnFypoQ5p4qy2Ir6Hvqg4jxQbSfuyFYiF2fQ/pCPmnw%3D
2025-11-03 01:54:05 [0.0.6][app] INFO - =====请根据具体部署选择使用,请勿泄露给任何人======
2025-11-03 01:54:05 [0.0.6][uvicorn.lifespan.on] INFO - Application startup complete.
2025-11-03 01:54:05 [0.0.6][uvicorn.server] INFO - Uvicorn running on http://0.0.0.0:8004 (Press CTRL+C to quit)
2025-11-03 08:36:00 [0.0.6][uvicorn.server] INFO - Shutting down
2025-11-03 08:36:00 [0.0.6][uvicorn.lifespan.on] INFO - Waiting for application shutdown.
2025-11-03 08:36:00 [0.0.6][app] INFO - MCP Endpoint Server 已关闭
2025-11-03 08:36:00 [0.0.6][uvicorn.lifespan.on] INFO - Application shutdown complete.
2025-11-03 08:36:00 [0.0.6][uvicorn.server] INFO - Finished server process [1]
2025-11-03 08:36:26 [0.0.6][utils.logger] INFO - Logger test message
2025-11-03 08:36:26 [0.0.6][__main__] INFO - 启动MCP Endpoint Server: 0.0.0.0:8004
2025-11-03 08:36:26 [0.0.6][uvicorn.server] INFO - Started server process [1]
2025-11-03 08:36:26 [0.0.6][uvicorn.lifespan.on] INFO - Waiting for application startup.
2025-11-03 08:36:26 [0.0.6][app] INFO - MCP Endpoint Server 正在启动...
2025-11-03 08:36:26 [0.0.6][app] INFO - =====下面的地址分别是智控台/单模块MCP接入点地址====
2025-11-03 08:36:26 [0.0.6][app] INFO - 智控台MCP参数配置: http://172.18.0.5:8004/mcp_endpoint/health?key=3d880556c4f3470b8b2242d0db0971f9
2025-11-03 08:36:26 [0.0.6][app] INFO - 单模块部署MCP接入点: ws://172.18.0.5:8004/mcp_endpoint/mcp/?token=BnFypoQ5p4qy2Ir6Hvqg4jxQbSfuyFYiF2fQ/pCPmnw%3D
2025-11-03 08:36:26 [0.0.6][app] INFO - =====请根据具体部署选择使用,请勿泄露给任何人======
2025-11-03 08:36:26 [0.0.6][uvicorn.lifespan.on] INFO - Application startup complete.
2025-11-03 08:36:26 [0.0.6][uvicorn.server] INFO - Uvicorn running on http://0.0.0.0:8004 (Press CTRL+C to quit)
2025-11-03 08:38:07 [0.0.6][utils.logger] INFO - Logger test message
2025-11-03 08:38:07 [0.0.6][__main__] INFO - 启动MCP Endpoint Server: 0.0.0.0:8004
2025-11-03 08:38:07 [0.0.6][uvicorn.server] INFO - Started server process [1]
2025-11-03 08:38:07 [0.0.6][uvicorn.lifespan.on] INFO - Waiting for application startup.
2025-11-03 08:38:07 [0.0.6][app] INFO - MCP Endpoint Server 正在启动...
2025-11-03 08:38:07 [0.0.6][app] INFO - =====下面的地址分别是智控台/单模块MCP接入点地址====
2025-11-03 08:38:07 [0.0.6][app] INFO - 智控台MCP参数配置: http://172.18.0.5:8004/mcp_endpoint/health?key=3d880556c4f3470b8b2242d0db0971f9
2025-11-03 08:38:07 [0.0.6][app] INFO - 单模块部署MCP接入点: ws://172.18.0.5:8004/mcp_endpoint/mcp/?token=BnFypoQ5p4qy2Ir6Hvqg4jxQbSfuyFYiF2fQ/pCPmnw%3D
2025-11-03 08:38:07 [0.0.6][app] INFO - =====请根据具体部署选择使用,请勿泄露给任何人======
2025-11-03 08:38:07 [0.0.6][uvicorn.lifespan.on] INFO - Application startup complete.
2025-11-03 08:38:07 [0.0.6][uvicorn.server] INFO - Uvicorn running on http://0.0.0.0:8004 (Press CTRL+C to quit)
2025-11-03 09:02:40 [0.0.6][uvicorn.server] INFO - Shutting down
2025-11-03 09:02:41 [0.0.6][uvicorn.lifespan.on] INFO - Waiting for application shutdown.
2025-11-03 09:02:41 [0.0.6][app] INFO - MCP Endpoint Server 已关闭
2025-11-03 09:02:41 [0.0.6][uvicorn.lifespan.on] INFO - Application shutdown complete.
2025-11-03 09:02:41 [0.0.6][uvicorn.server] INFO - Finished server process [1]
2025-11-03 09:03:16 [0.0.6][utils.logger] INFO - Logger test message
2025-11-03 09:03:16 [0.0.6][__main__] INFO - 启动MCP Endpoint Server: 0.0.0.0:8004
2025-11-03 09:03:16 [0.0.6][uvicorn.server] INFO - Started server process [1]
2025-11-03 09:03:16 [0.0.6][uvicorn.lifespan.on] INFO - Waiting for application startup.
2025-11-03 09:03:16 [0.0.6][app] INFO - MCP Endpoint Server 正在启动...
2025-11-03 09:03:16 [0.0.6][app] INFO - =====下面的地址分别是智控台/单模块MCP接入点地址====
2025-11-03 09:03:16 [0.0.6][app] INFO - 智控台MCP参数配置: http://172.18.0.5:8004/mcp_endpoint/health?key=3d880556c4f3470b8b2242d0db0971f9
2025-11-03 09:03:16 [0.0.6][app] INFO - 单模块部署MCP接入点: ws://172.18.0.5:8004/mcp_endpoint/mcp/?token=BnFypoQ5p4qy2Ir6Hvqg4jxQbSfuyFYiF2fQ/pCPmnw%3D
2025-11-03 09:03:16 [0.0.6][app] INFO - =====请根据具体部署选择使用,请勿泄露给任何人======
2025-11-03 09:03:16 [0.0.6][uvicorn.lifespan.on] INFO - Application startup complete.
2025-11-03 09:03:16 [0.0.6][uvicorn.server] INFO - Uvicorn running on http://0.0.0.0:8004 (Press CTRL+C to quit)
2025-11-03 09:51:11 [0.0.6][uvicorn.server] INFO - Shutting down
2025-11-03 09:51:11 [0.0.6][uvicorn.lifespan.on] INFO - Waiting for application shutdown.
2025-11-03 09:51:11 [0.0.6][app] INFO - MCP Endpoint Server 已关闭
2025-11-03 09:51:11 [0.0.6][uvicorn.lifespan.on] INFO - Application shutdown complete.
2025-11-03 09:51:11 [0.0.6][uvicorn.server] INFO - Finished server process [1]
2025-11-03 09:51:32 [0.0.6][utils.logger] INFO - Logger test message
2025-11-03 09:51:32 [0.0.6][__main__] INFO - 启动MCP Endpoint Server: 0.0.0.0:8004
2025-11-03 09:51:32 [0.0.6][uvicorn.server] INFO - Started server process [1]
2025-11-03 09:51:32 [0.0.6][uvicorn.lifespan.on] INFO - Waiting for application startup.
2025-11-03 09:51:32 [0.0.6][app] INFO - MCP Endpoint Server 正在启动...
2025-11-03 09:51:32 [0.0.6][app] INFO - =====下面的地址分别是智控台/单模块MCP接入点地址====
2025-11-03 09:51:32 [0.0.6][app] INFO - 智控台MCP参数配置: http://172.18.0.4:8004/mcp_endpoint/health?key=3d880556c4f3470b8b2242d0db0971f9
2025-11-03 09:51:32 [0.0.6][app] INFO - 单模块部署MCP接入点: ws://172.18.0.4:8004/mcp_endpoint/mcp/?token=BnFypoQ5p4qy2Ir6Hvqg4jxQbSfuyFYiF2fQ/pCPmnw%3D
2025-11-03 09:51:32 [0.0.6][app] INFO - =====请根据具体部署选择使用,请勿泄露给任何人======
2025-11-03 09:51:32 [0.0.6][uvicorn.lifespan.on] INFO - Application startup complete.
2025-11-03 09:51:32 [0.0.6][uvicorn.server] INFO - Uvicorn running on http://0.0.0.0:8004 (Press CTRL+C to quit)
2025-11-03 09:58:47 [0.0.6][uvicorn.server] INFO - Shutting down
2025-11-03 09:58:47 [0.0.6][uvicorn.lifespan.on] INFO - Waiting for application shutdown.
2025-11-03 09:58:47 [0.0.6][app] INFO - MCP Endpoint Server 已关闭
2025-11-03 09:58:47 [0.0.6][uvicorn.lifespan.on] INFO - Application shutdown complete.
2025-11-03 09:58:47 [0.0.6][uvicorn.server] INFO - Finished server process [1]
2025-11-03 09:59:03 [0.0.6][utils.logger] INFO - Logger test message
2025-11-03 09:59:03 [0.0.6][__main__] INFO - 启动MCP Endpoint Server: 0.0.0.0:8004
2025-11-03 09:59:03 [0.0.6][uvicorn.server] INFO - Started server process [1]
2025-11-03 09:59:03 [0.0.6][uvicorn.lifespan.on] INFO - Waiting for application startup.
2025-11-03 09:59:03 [0.0.6][app] INFO - MCP Endpoint Server 正在启动...
2025-11-03 09:59:03 [0.0.6][app] INFO - =====下面的地址分别是智控台/单模块MCP接入点地址====
2025-11-03 09:59:03 [0.0.6][app] INFO - 智控台MCP参数配置: http://172.18.0.7:8004/mcp_endpoint/health?key=3d880556c4f3470b8b2242d0db0971f9
2025-11-03 09:59:03 [0.0.6][app] INFO - 单模块部署MCP接入点: ws://172.18.0.7:8004/mcp_endpoint/mcp/?token=BnFypoQ5p4qy2Ir6Hvqg4jxQbSfuyFYiF2fQ/pCPmnw%3D
2025-11-03 09:59:03 [0.0.6][app] INFO - =====请根据具体部署选择使用,请勿泄露给任何人======
2025-11-03 09:59:03 [0.0.6][uvicorn.lifespan.on] INFO - Application startup complete.
2025-11-03 09:59:03 [0.0.6][uvicorn.server] INFO - Uvicorn running on http://0.0.0.0:8004 (Press CTRL+C to quit)
2025-11-03 09:59:55 [0.0.6][logging] INFO - ('172.18.0.10', 33774) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 09:59:55 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 09:59:55 [0.0.6][logging] INFO - connection open
2025-11-03 09:59:55 [0.0.6][logging] INFO - connection closed
2025-11-03 09:59:57 [0.0.6][logging] INFO - ('172.18.0.10', 33780) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 09:59:57 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 09:59:57 [0.0.6][logging] INFO - connection open
2025-11-03 09:59:57 [0.0.6][logging] INFO - connection closed
2025-11-03 10:00:01 [0.0.6][logging] INFO - ('172.18.0.10', 33794) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 10:00:01 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 10:00:01 [0.0.6][logging] INFO - connection open
2025-11-03 10:00:01 [0.0.6][logging] INFO - connection closed
2025-11-03 10:00:12 [0.0.6][logging] INFO - ('172.18.0.10', 33362) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 10:00:12 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 10:00:12 [0.0.6][logging] INFO - connection open
2025-11-03 10:00:12 [0.0.6][logging] INFO - connection closed
2025-11-03 10:00:28 [0.0.6][logging] INFO - ('172.18.0.10', 59602) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 10:00:28 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 10:00:28 [0.0.6][logging] INFO - connection open
2025-11-03 10:00:28 [0.0.6][logging] INFO - connection closed
2025-11-03 10:01:03 [0.0.6][logging] INFO - ('172.18.0.10', 46950) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 10:01:03 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 10:01:03 [0.0.6][logging] INFO - connection open
2025-11-03 10:01:03 [0.0.6][logging] INFO - connection closed
2025-11-03 10:02:12 [0.0.6][logging] INFO - ('172.18.0.10', 38688) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 10:02:12 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 10:02:12 [0.0.6][logging] INFO - connection open
2025-11-03 10:02:12 [0.0.6][logging] INFO - connection closed
2025-11-03 10:04:36 [0.0.6][logging] INFO - ('172.18.0.10', 60918) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 10:04:36 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 10:04:36 [0.0.6][logging] INFO - connection open
2025-11-03 10:04:36 [0.0.6][logging] INFO - connection closed
2025-11-03 10:09:16 [0.0.6][logging] INFO - ('172.18.0.10', 46652) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 10:09:16 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 10:09:16 [0.0.6][logging] INFO - connection open
2025-11-03 10:09:16 [0.0.6][logging] INFO - connection closed
2025-11-03 10:18:35 [0.0.6][logging] INFO - ('172.18.0.10', 34952) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 10:18:35 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 10:18:35 [0.0.6][logging] INFO - connection open
2025-11-03 10:18:35 [0.0.6][logging] INFO - connection closed
2025-11-03 10:29:25 [0.0.6][logging] INFO - ('172.18.0.10', 41772) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 10:29:25 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 10:29:25 [0.0.6][logging] INFO - connection open
2025-11-03 10:29:25 [0.0.6][logging] INFO - connection closed
2025-11-03 10:40:21 [0.0.6][logging] INFO - ('172.18.0.10', 41772) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 10:40:21 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 10:40:21 [0.0.6][logging] INFO - connection open
2025-11-03 10:40:21 [0.0.6][logging] INFO - connection closed
2025-11-03 10:51:15 [0.0.6][logging] INFO - ('172.18.0.10', 54638) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 10:51:15 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 10:51:15 [0.0.6][logging] INFO - connection open
2025-11-03 10:51:15 [0.0.6][logging] INFO - connection closed
2025-11-03 11:02:12 [0.0.6][logging] INFO - ('172.18.0.10', 39022) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 11:02:12 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 11:02:12 [0.0.6][logging] INFO - connection open
2025-11-03 11:02:12 [0.0.6][logging] INFO - connection closed
2025-11-03 11:13:08 [0.0.6][logging] INFO - ('172.18.0.10', 56952) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 11:13:08 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 11:13:08 [0.0.6][logging] INFO - connection open
2025-11-03 11:13:08 [0.0.6][logging] INFO - connection closed
2025-11-03 11:24:05 [0.0.6][logging] INFO - ('172.18.0.10', 57290) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 11:24:05 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 11:24:05 [0.0.6][logging] INFO - connection open
2025-11-03 11:24:05 [0.0.6][logging] INFO - connection closed
2025-11-03 11:35:01 [0.0.6][logging] INFO - ('172.18.0.10', 52482) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 11:35:01 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 11:35:01 [0.0.6][logging] INFO - connection open
2025-11-03 11:35:01 [0.0.6][logging] INFO - connection closed
2025-11-03 11:45:59 [0.0.6][logging] INFO - ('172.18.0.10', 36152) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 11:45:59 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 11:45:59 [0.0.6][logging] INFO - connection open
2025-11-03 11:45:59 [0.0.6][logging] INFO - connection closed
2025-11-03 11:56:58 [0.0.6][logging] INFO - ('172.18.0.10', 38246) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 11:56:58 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 11:56:58 [0.0.6][logging] INFO - connection open
2025-11-03 11:56:58 [0.0.6][logging] INFO - connection closed
2025-11-03 12:07:57 [0.0.6][logging] INFO - ('172.18.0.10', 39284) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 12:07:57 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 12:07:57 [0.0.6][logging] INFO - connection open
2025-11-03 12:07:57 [0.0.6][logging] INFO - connection closed
2025-11-03 12:18:56 [0.0.6][logging] INFO - ('172.18.0.10', 38896) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 12:18:56 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 12:18:56 [0.0.6][logging] INFO - connection open
2025-11-03 12:18:56 [0.0.6][logging] INFO - connection closed
2025-11-03 12:29:56 [0.0.6][logging] INFO - ('172.18.0.10', 57660) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 12:29:56 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 12:29:56 [0.0.6][logging] INFO - connection open
2025-11-03 12:29:56 [0.0.6][logging] INFO - connection closed
2025-11-03 12:40:56 [0.0.6][logging] INFO - ('172.18.0.10', 42822) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 12:40:56 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 12:40:56 [0.0.6][logging] INFO - connection open
2025-11-03 12:40:56 [0.0.6][logging] INFO - connection closed
2025-11-03 12:51:52 [0.0.6][logging] INFO - ('172.18.0.10', 60762) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 12:51:52 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 12:51:52 [0.0.6][logging] INFO - connection open
2025-11-03 12:51:52 [0.0.6][logging] INFO - connection closed
2025-11-03 13:02:49 [0.0.6][logging] INFO - ('172.18.0.10', 48016) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 13:02:49 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 13:02:49 [0.0.6][logging] INFO - connection open
2025-11-03 13:02:49 [0.0.6][logging] INFO - connection closed
2025-11-03 13:13:44 [0.0.6][logging] INFO - ('172.18.0.10', 47830) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 13:13:44 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 13:13:44 [0.0.6][logging] INFO - connection open
2025-11-03 13:13:44 [0.0.6][logging] INFO - connection closed
2025-11-03 13:24:40 [0.0.6][logging] INFO - ('172.18.0.10', 42664) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 13:24:40 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 13:24:40 [0.0.6][logging] INFO - connection open
2025-11-03 13:24:40 [0.0.6][logging] INFO - connection closed
2025-11-03 13:35:38 [0.0.6][logging] INFO - ('172.18.0.10', 37546) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 13:35:38 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 13:35:38 [0.0.6][logging] INFO - connection open
2025-11-03 13:35:38 [0.0.6][logging] INFO - connection closed
2025-11-03 13:46:35 [0.0.6][logging] INFO - ('172.18.0.10', 38050) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 13:46:35 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 13:46:35 [0.0.6][logging] INFO - connection open
2025-11-03 13:46:35 [0.0.6][logging] INFO - connection closed
2025-11-03 13:56:48 [0.0.6][logging] INFO - ('172.18.0.10', 51598) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 13:56:48 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 13:56:48 [0.0.6][logging] INFO - connection open
2025-11-03 13:56:48 [0.0.6][logging] INFO - connection closed
2025-11-03 14:06:49 [0.0.6][logging] INFO - ('172.18.0.10', 35434) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 14:06:49 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 14:06:49 [0.0.6][logging] INFO - connection open
2025-11-03 14:06:49 [0.0.6][logging] INFO - connection closed
2025-11-03 14:16:49 [0.0.6][logging] INFO - ('172.18.0.10', 39798) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 14:16:49 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 14:16:49 [0.0.6][logging] INFO - connection open
2025-11-03 14:16:49 [0.0.6][logging] INFO - connection closed
2025-11-03 14:26:49 [0.0.6][logging] INFO - ('172.18.0.10', 46696) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 14:26:49 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 14:26:49 [0.0.6][logging] INFO - connection open
2025-11-03 14:26:49 [0.0.6][logging] INFO - connection closed
2025-11-03 14:36:49 [0.0.6][logging] INFO - ('172.18.0.10', 52006) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 14:36:49 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 14:36:49 [0.0.6][logging] INFO - connection open
2025-11-03 14:36:49 [0.0.6][logging] INFO - connection closed
2025-11-03 14:46:50 [0.0.6][logging] INFO - ('172.18.0.10', 38752) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 14:46:50 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 14:46:50 [0.0.6][logging] INFO - connection open
2025-11-03 14:46:50 [0.0.6][logging] INFO - connection closed
2025-11-03 14:56:50 [0.0.6][logging] INFO - ('172.18.0.10', 34576) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 14:56:50 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 14:56:50 [0.0.6][logging] INFO - connection open
2025-11-03 14:56:50 [0.0.6][logging] INFO - connection closed
2025-11-03 15:06:50 [0.0.6][logging] INFO - ('172.18.0.10', 38102) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 15:06:50 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 15:06:50 [0.0.6][logging] INFO - connection open
2025-11-03 15:06:50 [0.0.6][logging] INFO - connection closed
2025-11-03 15:16:51 [0.0.6][logging] INFO - ('172.18.0.10', 43402) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 15:16:51 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 15:16:51 [0.0.6][logging] INFO - connection open
2025-11-03 15:16:51 [0.0.6][logging] INFO - connection closed
2025-11-03 15:26:51 [0.0.6][logging] INFO - ('172.18.0.10', 51620) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 15:26:51 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 15:26:51 [0.0.6][logging] INFO - connection open
2025-11-03 15:26:51 [0.0.6][logging] INFO - connection closed
2025-11-03 15:36:52 [0.0.6][logging] INFO - ('172.18.0.10', 33372) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 15:36:52 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 15:36:52 [0.0.6][logging] INFO - connection open
2025-11-03 15:36:52 [0.0.6][logging] INFO - connection closed
2025-11-03 15:46:52 [0.0.6][logging] INFO - ('172.18.0.10', 34550) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 15:46:52 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 15:46:52 [0.0.6][logging] INFO - connection open
2025-11-03 15:46:52 [0.0.6][logging] INFO - connection closed
2025-11-03 15:56:53 [0.0.6][logging] INFO - ('172.18.0.10', 41424) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 15:56:53 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 15:56:53 [0.0.6][logging] INFO - connection open
2025-11-03 15:56:53 [0.0.6][logging] INFO - connection closed
2025-11-03 16:06:54 [0.0.6][logging] INFO - ('172.18.0.10', 35624) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 16:06:54 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 16:06:54 [0.0.6][logging] INFO - connection open
2025-11-03 16:06:54 [0.0.6][logging] INFO - connection closed
2025-11-03 16:16:54 [0.0.6][logging] INFO - ('172.18.0.10', 55244) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 16:16:54 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 16:16:54 [0.0.6][logging] INFO - connection open
2025-11-03 16:16:54 [0.0.6][logging] INFO - connection closed
2025-11-03 16:26:55 [0.0.6][logging] INFO - ('172.18.0.10', 55950) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 16:26:55 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 16:26:55 [0.0.6][logging] INFO - connection open
2025-11-03 16:26:55 [0.0.6][logging] INFO - connection closed
2025-11-03 16:36:56 [0.0.6][logging] INFO - ('172.18.0.10', 48478) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 16:36:56 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 16:36:56 [0.0.6][logging] INFO - connection open
2025-11-03 16:36:56 [0.0.6][logging] INFO - connection closed
2025-11-03 16:46:57 [0.0.6][logging] INFO - ('172.18.0.10', 40862) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 16:46:57 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 16:46:57 [0.0.6][logging] INFO - connection open
2025-11-03 16:46:57 [0.0.6][logging] INFO - connection closed
2025-11-03 16:56:58 [0.0.6][logging] INFO - ('172.18.0.10', 37676) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 16:56:58 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 16:56:58 [0.0.6][logging] INFO - connection open
2025-11-03 16:56:58 [0.0.6][logging] INFO - connection closed
2025-11-03 17:06:59 [0.0.6][logging] INFO - ('172.18.0.10', 37758) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 17:06:59 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 17:06:59 [0.0.6][logging] INFO - connection open
2025-11-03 17:06:59 [0.0.6][logging] INFO - connection closed
2025-11-03 17:17:00 [0.0.6][logging] INFO - ('172.18.0.10', 59096) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 17:17:00 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 17:17:00 [0.0.6][logging] INFO - connection open
2025-11-03 17:17:00 [0.0.6][logging] INFO - connection closed
2025-11-03 17:27:01 [0.0.6][logging] INFO - ('172.18.0.10', 57200) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 17:27:01 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 17:27:01 [0.0.6][logging] INFO - connection open
2025-11-03 17:27:01 [0.0.6][logging] INFO - connection closed
2025-11-03 17:37:03 [0.0.6][logging] INFO - ('172.18.0.10', 54724) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 17:37:03 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 17:37:03 [0.0.6][logging] INFO - connection open
2025-11-03 17:37:03 [0.0.6][logging] INFO - connection closed
2025-11-03 17:47:04 [0.0.6][logging] INFO - ('172.18.0.10', 42634) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 17:47:04 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 17:47:04 [0.0.6][logging] INFO - connection open
2025-11-03 17:47:04 [0.0.6][logging] INFO - connection closed
2025-11-03 17:57:05 [0.0.6][logging] INFO - ('172.18.0.10', 55540) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 17:57:05 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 17:57:05 [0.0.6][logging] INFO - connection open
2025-11-03 17:57:05 [0.0.6][logging] INFO - connection closed
2025-11-03 18:07:07 [0.0.6][logging] INFO - ('172.18.0.10', 49926) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 18:07:07 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 18:07:07 [0.0.6][logging] INFO - connection open
2025-11-03 18:07:07 [0.0.6][logging] INFO - connection closed
2025-11-03 18:17:08 [0.0.6][logging] INFO - ('172.18.0.10', 38836) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 18:17:08 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 18:17:08 [0.0.6][logging] INFO - connection open
2025-11-03 18:17:08 [0.0.6][logging] INFO - connection closed
2025-11-03 18:27:10 [0.0.6][logging] INFO - ('172.18.0.10', 39552) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 18:27:10 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 18:27:10 [0.0.6][logging] INFO - connection open
2025-11-03 18:27:10 [0.0.6][logging] INFO - connection closed
2025-11-03 18:37:12 [0.0.6][logging] INFO - ('172.18.0.10', 44082) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 18:37:12 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 18:37:12 [0.0.6][logging] INFO - connection open
2025-11-03 18:37:12 [0.0.6][logging] INFO - connection closed
2025-11-03 18:47:14 [0.0.6][logging] INFO - ('172.18.0.10', 45024) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 18:47:14 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 18:47:14 [0.0.6][logging] INFO - connection open
2025-11-03 18:47:14 [0.0.6][logging] INFO - connection closed
2025-11-03 18:57:15 [0.0.6][logging] INFO - ('172.18.0.10', 51342) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 18:57:15 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 18:57:15 [0.0.6][logging] INFO - connection open
2025-11-03 18:57:15 [0.0.6][logging] INFO - connection closed
2025-11-03 19:07:17 [0.0.6][logging] INFO - ('172.18.0.10', 52246) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 19:07:17 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 19:07:17 [0.0.6][logging] INFO - connection open
2025-11-03 19:07:17 [0.0.6][logging] INFO - connection closed
2025-11-03 19:17:19 [0.0.6][logging] INFO - ('172.18.0.10', 40578) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 19:17:19 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 19:17:19 [0.0.6][logging] INFO - connection open
2025-11-03 19:17:19 [0.0.6][logging] INFO - connection closed
2025-11-03 19:27:22 [0.0.6][logging] INFO - ('172.18.0.10', 35984) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 19:27:22 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 19:27:22 [0.0.6][logging] INFO - connection open
2025-11-03 19:27:22 [0.0.6][logging] INFO - connection closed
2025-11-03 19:37:24 [0.0.6][logging] INFO - ('172.18.0.10', 57670) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 19:37:24 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 19:37:24 [0.0.6][logging] INFO - connection open
2025-11-03 19:37:24 [0.0.6][logging] INFO - connection closed
2025-11-03 19:47:26 [0.0.6][logging] INFO - ('172.18.0.10', 53822) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 19:47:26 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 19:47:26 [0.0.6][logging] INFO - connection open
2025-11-03 19:47:26 [0.0.6][logging] INFO - connection closed
2025-11-03 19:57:28 [0.0.6][logging] INFO - ('172.18.0.10', 46848) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 19:57:28 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 19:57:28 [0.0.6][logging] INFO - connection open
2025-11-03 19:57:28 [0.0.6][logging] INFO - connection closed
2025-11-03 20:07:31 [0.0.6][logging] INFO - ('172.18.0.10', 49986) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 20:07:31 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 20:07:31 [0.0.6][logging] INFO - connection open
2025-11-03 20:07:31 [0.0.6][logging] INFO - connection closed
2025-11-03 20:17:33 [0.0.6][logging] INFO - ('172.18.0.10', 46008) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 20:17:33 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 20:17:33 [0.0.6][logging] INFO - connection open
2025-11-03 20:17:33 [0.0.6][logging] INFO - connection closed
2025-11-03 20:27:35 [0.0.6][logging] INFO - ('172.18.0.10', 49254) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 20:27:35 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 20:27:35 [0.0.6][logging] INFO - connection open
2025-11-03 20:27:35 [0.0.6][logging] INFO - connection closed
2025-11-03 20:37:38 [0.0.6][logging] INFO - ('172.18.0.10', 34218) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 20:37:38 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 20:37:38 [0.0.6][logging] INFO - connection open
2025-11-03 20:37:38 [0.0.6][logging] INFO - connection closed
2025-11-03 20:47:41 [0.0.6][logging] INFO - ('172.18.0.10', 35518) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 20:47:41 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 20:47:41 [0.0.6][logging] INFO - connection open
2025-11-03 20:47:41 [0.0.6][logging] INFO - connection closed
2025-11-03 20:57:43 [0.0.6][logging] INFO - ('172.18.0.10', 58096) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 20:57:43 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 20:57:43 [0.0.6][logging] INFO - connection open
2025-11-03 20:57:43 [0.0.6][logging] INFO - connection closed
2025-11-03 21:07:46 [0.0.6][logging] INFO - ('172.18.0.10', 42942) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 21:07:46 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 21:07:46 [0.0.6][logging] INFO - connection open
2025-11-03 21:07:46 [0.0.6][logging] INFO - connection closed
2025-11-03 21:17:49 [0.0.6][logging] INFO - ('172.18.0.10', 56536) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 21:17:49 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 21:17:49 [0.0.6][logging] INFO - connection open
2025-11-03 21:17:49 [0.0.6][logging] INFO - connection closed
2025-11-03 21:27:52 [0.0.6][logging] INFO - ('172.18.0.10', 38202) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 21:27:52 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 21:27:52 [0.0.6][logging] INFO - connection open
2025-11-03 21:27:52 [0.0.6][logging] INFO - connection closed
2025-11-03 21:37:55 [0.0.6][logging] INFO - ('172.18.0.10', 34984) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 21:37:55 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 21:37:55 [0.0.6][logging] INFO - connection open
2025-11-03 21:37:55 [0.0.6][logging] INFO - connection closed
2025-11-03 21:47:58 [0.0.6][logging] INFO - ('172.18.0.10', 41392) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 21:47:58 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 21:47:58 [0.0.6][logging] INFO - connection open
2025-11-03 21:47:58 [0.0.6][logging] INFO - connection closed
2025-11-03 21:58:01 [0.0.6][logging] INFO - ('172.18.0.10', 55616) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 21:58:01 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 21:58:01 [0.0.6][logging] INFO - connection open
2025-11-03 21:58:01 [0.0.6][logging] INFO - connection closed
2025-11-03 22:08:04 [0.0.6][logging] INFO - ('172.18.0.10', 45020) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 22:08:04 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 22:08:04 [0.0.6][logging] INFO - connection open
2025-11-03 22:08:04 [0.0.6][logging] INFO - connection closed
2025-11-03 22:18:08 [0.0.6][logging] INFO - ('172.18.0.10', 57632) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 22:18:08 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 22:18:08 [0.0.6][logging] INFO - connection open
2025-11-03 22:18:08 [0.0.6][logging] INFO - connection closed
2025-11-03 22:28:13 [0.0.6][logging] INFO - ('172.18.0.10', 55672) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 22:28:13 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 22:28:13 [0.0.6][logging] INFO - connection open
2025-11-03 22:28:13 [0.0.6][logging] INFO - connection closed
2025-11-03 22:38:23 [0.0.6][logging] INFO - ('172.18.0.10', 56638) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 22:38:23 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 22:38:23 [0.0.6][logging] INFO - connection open
2025-11-03 22:38:23 [0.0.6][logging] INFO - connection closed
2025-11-03 22:48:36 [0.0.6][logging] INFO - ('172.18.0.10', 33558) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 22:48:36 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 22:48:36 [0.0.6][logging] INFO - connection open
2025-11-03 22:48:36 [0.0.6][logging] INFO - connection closed
2025-11-03 22:58:50 [0.0.6][logging] INFO - ('172.18.0.10', 34622) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 22:58:50 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 22:58:50 [0.0.6][logging] INFO - connection open
2025-11-03 22:58:50 [0.0.6][logging] INFO - connection closed
2025-11-03 23:09:04 [0.0.6][logging] INFO - ('172.18.0.10', 52642) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 23:09:04 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 23:09:04 [0.0.6][logging] INFO - connection open
2025-11-03 23:09:04 [0.0.6][logging] INFO - connection closed
2025-11-03 23:19:19 [0.0.6][logging] INFO - ('172.18.0.10', 35700) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 23:19:19 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 23:19:19 [0.0.6][logging] INFO - connection open
2025-11-03 23:19:19 [0.0.6][logging] INFO - connection closed
2025-11-03 23:29:35 [0.0.6][logging] INFO - ('172.18.0.10', 59092) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 23:29:35 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 23:29:35 [0.0.6][logging] INFO - connection open
2025-11-03 23:29:35 [0.0.6][logging] INFO - connection closed
2025-11-03 23:39:50 [0.0.6][logging] INFO - ('172.18.0.10', 59886) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 23:39:50 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 23:39:50 [0.0.6][logging] INFO - connection open
2025-11-03 23:39:50 [0.0.6][logging] INFO - connection closed
2025-11-03 23:50:06 [0.0.6][logging] INFO - ('172.18.0.10', 59722) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-03 23:50:06 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-03 23:50:06 [0.0.6][logging] INFO - connection open
2025-11-03 23:50:06 [0.0.6][logging] INFO - connection closed
2025-11-04 00:00:23 [0.0.6][logging] INFO - ('172.18.0.10', 55050) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-04 00:00:23 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-04 00:00:23 [0.0.6][logging] INFO - connection open
2025-11-04 00:00:23 [0.0.6][logging] INFO - connection closed
2025-11-04 00:10:39 [0.0.6][logging] INFO - ('172.18.0.10', 33866) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-04 00:10:39 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-04 00:10:39 [0.0.6][logging] INFO - connection open
2025-11-04 00:10:39 [0.0.6][logging] INFO - connection closed
2025-11-04 00:20:56 [0.0.6][logging] INFO - ('172.18.0.10', 46180) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-04 00:20:56 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-04 00:20:56 [0.0.6][logging] INFO - connection open
2025-11-04 00:20:56 [0.0.6][logging] INFO - connection closed
2025-11-04 00:31:14 [0.0.6][logging] INFO - ('172.18.0.10', 41228) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-04 00:31:14 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-04 00:31:14 [0.0.6][logging] INFO - connection open
2025-11-04 00:31:14 [0.0.6][logging] INFO - connection closed
2025-11-04 00:41:32 [0.0.6][logging] INFO - ('172.18.0.10', 35724) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-04 00:41:32 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-04 00:41:32 [0.0.6][logging] INFO - connection open
2025-11-04 00:41:32 [0.0.6][logging] INFO - connection closed
2025-11-04 00:51:50 [0.0.6][logging] INFO - ('172.18.0.10', 35948) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-04 00:51:50 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-04 00:51:50 [0.0.6][logging] INFO - connection open
2025-11-04 00:51:50 [0.0.6][logging] INFO - connection closed
2025-11-04 00:58:12 [0.0.6][uvicorn.server] INFO - Shutting down
2025-11-04 00:58:12 [0.0.6][uvicorn.lifespan.on] INFO - Waiting for application shutdown.
2025-11-04 00:58:12 [0.0.6][app] INFO - MCP Endpoint Server 已关闭
2025-11-04 00:58:12 [0.0.6][uvicorn.lifespan.on] INFO - Application shutdown complete.
2025-11-04 00:58:12 [0.0.6][uvicorn.server] INFO - Finished server process [1]
2025-11-04 01:45:06 [0.0.6][utils.logger] INFO - Logger test message
2025-11-04 01:45:06 [0.0.6][__main__] INFO - 启动MCP Endpoint Server: 0.0.0.0:8004
2025-11-04 01:45:06 [0.0.6][uvicorn.server] INFO - Started server process [1]
2025-11-04 01:45:06 [0.0.6][uvicorn.lifespan.on] INFO - Waiting for application startup.
2025-11-04 01:45:06 [0.0.6][app] INFO - MCP Endpoint Server 正在启动...
2025-11-04 01:45:06 [0.0.6][app] INFO - =====下面的地址分别是智控台/单模块MCP接入点地址====
2025-11-04 01:45:06 [0.0.6][app] INFO - 智控台MCP参数配置: http://172.18.0.10:8004/mcp_endpoint/health?key=3d880556c4f3470b8b2242d0db0971f9
2025-11-04 01:45:06 [0.0.6][app] INFO - 单模块部署MCP接入点: ws://172.18.0.10:8004/mcp_endpoint/mcp/?token=BnFypoQ5p4qy2Ir6Hvqg4jxQbSfuyFYiF2fQ/pCPmnw%3D
2025-11-04 01:45:06 [0.0.6][app] INFO - =====请根据具体部署选择使用,请勿泄露给任何人======
2025-11-04 01:45:06 [0.0.6][uvicorn.lifespan.on] INFO - Application startup complete.
2025-11-04 01:45:06 [0.0.6][uvicorn.server] INFO - Uvicorn running on http://0.0.0.0:8004 (Press CTRL+C to quit)
2025-11-04 01:45:12 [0.0.6][logging] INFO - ('172.18.0.8', 45144) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-04 01:45:12 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-04 01:45:12 [0.0.6][logging] INFO - connection open
2025-11-04 01:45:12 [0.0.6][logging] INFO - ('172.18.0.8', 45158) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-04 01:45:12 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-04 01:45:12 [0.0.6][logging] INFO - connection open
2025-11-04 01:45:12 [0.0.6][logging] INFO - connection closed
2025-11-04 01:45:12 [0.0.6][logging] INFO - connection closed
2025-11-04 01:45:14 [0.0.6][logging] INFO - ('172.18.0.8', 45172) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-04 01:45:14 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-04 01:45:14 [0.0.6][logging] INFO - connection open
2025-11-04 01:45:14 [0.0.6][logging] INFO - ('172.18.0.8', 45184) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-04 01:45:14 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-04 01:45:14 [0.0.6][logging] INFO - connection open
2025-11-04 01:45:14 [0.0.6][logging] INFO - connection closed
2025-11-04 01:45:14 [0.0.6][logging] INFO - connection closed
2025-11-04 01:45:19 [0.0.6][logging] INFO - ('172.18.0.8', 45196) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-04 01:45:19 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-04 01:45:19 [0.0.6][logging] INFO - connection open
2025-11-04 01:45:19 [0.0.6][logging] INFO - ('172.18.0.8', 45210) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-04 01:45:19 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-04 01:45:19 [0.0.6][logging] INFO - connection open
2025-11-04 01:45:19 [0.0.6][logging] INFO - connection closed
2025-11-04 01:45:19 [0.0.6][logging] INFO - connection closed
2025-11-04 01:45:27 [0.0.6][logging] INFO - ('172.18.0.8', 41914) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-04 01:45:27 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-04 01:45:27 [0.0.6][logging] INFO - connection open
2025-11-04 01:45:27 [0.0.6][logging] INFO - ('172.18.0.8', 41928) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-04 01:45:27 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-04 01:45:27 [0.0.6][logging] INFO - connection open
2025-11-04 01:45:27 [0.0.6][logging] INFO - connection closed
2025-11-04 01:45:27 [0.0.6][logging] INFO - connection closed
2025-11-04 01:45:37 [0.0.6][uvicorn.server] INFO - Shutting down
2025-11-04 01:45:37 [0.0.6][uvicorn.lifespan.on] INFO - Waiting for application shutdown.
2025-11-04 01:45:37 [0.0.6][app] INFO - MCP Endpoint Server 已关闭
2025-11-04 01:45:37 [0.0.6][uvicorn.lifespan.on] INFO - Application shutdown complete.
2025-11-04 01:45:37 [0.0.6][uvicorn.server] INFO - Finished server process [1]
2025-11-04 01:46:30 [0.0.6][utils.logger] INFO - Logger test message
2025-11-04 01:46:31 [0.0.6][__main__] INFO - 启动MCP Endpoint Server: 0.0.0.0:8004
2025-11-04 01:46:31 [0.0.6][uvicorn.server] INFO - Started server process [1]
2025-11-04 01:46:31 [0.0.6][uvicorn.lifespan.on] INFO - Waiting for application startup.
2025-11-04 01:46:31 [0.0.6][app] INFO - MCP Endpoint Server 正在启动...
2025-11-04 01:46:31 [0.0.6][app] INFO - =====下面的地址分别是智控台/单模块MCP接入点地址====
2025-11-04 01:46:31 [0.0.6][app] INFO - 智控台MCP参数配置: http://172.18.0.3:8004/mcp_endpoint/health?key=3d880556c4f3470b8b2242d0db0971f9
2025-11-04 01:46:31 [0.0.6][app] INFO - 单模块部署MCP接入点: ws://172.18.0.3:8004/mcp_endpoint/mcp/?token=BnFypoQ5p4qy2Ir6Hvqg4jxQbSfuyFYiF2fQ/pCPmnw%3D
2025-11-04 01:46:31 [0.0.6][app] INFO - =====请根据具体部署选择使用,请勿泄露给任何人======
2025-11-04 01:46:31 [0.0.6][uvicorn.lifespan.on] INFO - Application startup complete.
2025-11-04 01:46:31 [0.0.6][uvicorn.server] INFO - Uvicorn running on http://0.0.0.0:8004 (Press CTRL+C to quit)
2025-11-05 01:45:02 [0.0.6][utils.logger] INFO - Logger test message
2025-11-05 01:45:02 [0.0.6][__main__] INFO - 启动MCP Endpoint Server: 0.0.0.0:8004
2025-11-05 01:45:02 [0.0.6][uvicorn.server] INFO - Started server process [1]
2025-11-05 01:45:02 [0.0.6][uvicorn.lifespan.on] INFO - Waiting for application startup.
2025-11-05 01:45:02 [0.0.6][app] INFO - MCP Endpoint Server 正在启动...
2025-11-05 01:45:02 [0.0.6][app] INFO - =====下面的地址分别是智控台/单模块MCP接入点地址====
2025-11-05 01:45:02 [0.0.6][app] INFO - 智控台MCP参数配置: http://172.18.0.9:8004/mcp_endpoint/health?key=3d880556c4f3470b8b2242d0db0971f9
2025-11-05 01:45:02 [0.0.6][app] INFO - 单模块部署MCP接入点: ws://172.18.0.9:8004/mcp_endpoint/mcp/?token=BnFypoQ5p4qy2Ir6Hvqg4jxQbSfuyFYiF2fQ/pCPmnw%3D
2025-11-05 01:45:02 [0.0.6][app] INFO - =====请根据具体部署选择使用,请勿泄露给任何人======
2025-11-05 01:45:02 [0.0.6][uvicorn.lifespan.on] INFO - Application startup complete.
2025-11-05 01:45:02 [0.0.6][uvicorn.server] INFO - Uvicorn running on http://0.0.0.0:8004 (Press CTRL+C to quit)
2025-11-05 01:45:09 [0.0.6][logging] INFO - ('172.18.0.8', 49452) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-05 01:45:09 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-05 01:45:09 [0.0.6][logging] INFO - connection open
2025-11-05 01:45:09 [0.0.6][logging] INFO - connection closed
2025-11-05 01:45:11 [0.0.6][logging] INFO - ('172.18.0.8', 49456) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-05 01:45:11 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-05 01:45:11 [0.0.6][logging] INFO - connection open
2025-11-05 01:45:11 [0.0.6][logging] INFO - connection closed
2025-11-05 01:45:15 [0.0.6][logging] INFO - ('172.18.0.8', 49460) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-05 01:45:15 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-05 01:45:15 [0.0.6][logging] INFO - connection open
2025-11-05 01:45:15 [0.0.6][logging] INFO - connection closed
2025-11-05 01:45:23 [0.0.6][logging] INFO - ('172.18.0.8', 40690) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-05 01:45:23 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-05 01:45:23 [0.0.6][logging] INFO - connection open
2025-11-05 01:45:23 [0.0.6][logging] INFO - connection closed
2025-11-05 01:45:42 [0.0.6][logging] INFO - ('172.18.0.8', 60058) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-05 01:45:42 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-05 01:45:42 [0.0.6][logging] INFO - connection open
2025-11-05 01:45:42 [0.0.6][logging] INFO - connection closed
2025-11-05 01:46:17 [0.0.6][logging] INFO - ('172.18.0.8', 56204) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-05 01:46:17 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-05 01:46:17 [0.0.6][logging] INFO - connection open
2025-11-05 01:46:17 [0.0.6][logging] INFO - connection closed
2025-11-05 01:47:26 [0.0.6][logging] INFO - ('172.18.0.8', 55854) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-05 01:47:26 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-05 01:47:26 [0.0.6][logging] INFO - connection open
2025-11-05 01:47:26 [0.0.6][logging] INFO - connection closed
2025-11-05 01:49:45 [0.0.6][logging] INFO - ('172.18.0.8', 33270) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-05 01:49:45 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-05 01:49:45 [0.0.6][logging] INFO - connection open
2025-11-05 01:49:45 [0.0.6][logging] INFO - connection closed
2025-11-05 01:54:26 [0.0.6][logging] INFO - ('172.18.0.8', 33764) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-05 01:54:26 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-05 01:54:26 [0.0.6][logging] INFO - connection open
2025-11-05 01:54:26 [0.0.6][logging] INFO - connection closed
2025-11-05 02:03:44 [0.0.6][logging] INFO - ('172.18.0.8', 35806) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-05 02:03:44 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-05 02:03:44 [0.0.6][logging] INFO - connection open
2025-11-05 02:03:44 [0.0.6][logging] INFO - connection closed
2025-11-05 02:14:39 [0.0.6][logging] INFO - ('172.18.0.8', 51698) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-05 02:14:39 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-05 02:14:39 [0.0.6][logging] INFO - connection open
2025-11-05 02:14:39 [0.0.6][logging] INFO - connection closed
2025-11-05 02:25:34 [0.0.6][logging] INFO - ('172.18.0.8', 53374) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-05 02:25:34 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-05 02:25:34 [0.0.6][logging] INFO - connection open
2025-11-05 02:25:34 [0.0.6][logging] INFO - connection closed
2025-11-05 02:36:28 [0.0.6][logging] INFO - ('172.18.0.8', 55554) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-05 02:36:28 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-05 02:36:28 [0.0.6][logging] INFO - connection open
2025-11-05 02:36:28 [0.0.6][logging] INFO - connection closed
2025-11-05 02:47:23 [0.0.6][logging] INFO - ('172.18.0.8', 44798) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-05 02:47:23 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-05 02:47:23 [0.0.6][logging] INFO - connection open
2025-11-05 02:47:23 [0.0.6][logging] INFO - connection closed
2025-11-05 02:58:17 [0.0.6][logging] INFO - ('172.18.0.8', 53318) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-05 02:58:17 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-05 02:58:17 [0.0.6][logging] INFO - connection open
2025-11-05 02:58:17 [0.0.6][logging] INFO - connection closed
2025-11-05 03:09:12 [0.0.6][logging] INFO - ('172.18.0.8', 49218) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-05 03:09:12 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-05 03:09:12 [0.0.6][logging] INFO - connection open
2025-11-05 03:09:12 [0.0.6][logging] INFO - connection closed
2025-11-05 03:20:07 [0.0.6][logging] INFO - ('172.18.0.8', 36586) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-05 03:20:07 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-05 03:20:07 [0.0.6][logging] INFO - connection open
2025-11-05 03:20:07 [0.0.6][logging] INFO - connection closed
2025-11-05 03:31:12 [0.0.6][logging] INFO - ('172.18.0.8', 46802) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-05 03:31:12 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-05 03:31:12 [0.0.6][logging] INFO - connection open
2025-11-05 03:31:12 [0.0.6][logging] INFO - connection closed
2025-11-05 03:42:18 [0.0.6][logging] INFO - ('172.18.0.8', 41244) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-05 03:42:18 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-05 03:42:18 [0.0.6][logging] INFO - connection open
2025-11-05 03:42:19 [0.0.6][logging] INFO - connection closed
2025-11-05 03:53:25 [0.0.6][logging] INFO - ('172.18.0.8', 45432) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-05 03:53:25 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-05 03:53:25 [0.0.6][logging] INFO - connection open
2025-11-05 03:53:25 [0.0.6][logging] INFO - connection closed
2025-11-05 04:04:32 [0.0.6][logging] INFO - ('172.18.0.8', 41128) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-05 04:04:32 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-05 04:04:32 [0.0.6][logging] INFO - connection open
2025-11-05 04:04:32 [0.0.6][logging] INFO - connection closed
2025-11-05 04:15:39 [0.0.6][logging] INFO - ('172.18.0.8', 35856) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-05 04:15:39 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-05 04:15:39 [0.0.6][logging] INFO - connection open
2025-11-05 04:15:39 [0.0.6][logging] INFO - connection closed
2025-11-05 04:26:45 [0.0.6][logging] INFO - ('172.18.0.8', 39766) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-05 04:26:45 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-05 04:26:45 [0.0.6][logging] INFO - connection open
2025-11-05 04:26:46 [0.0.6][logging] INFO - connection closed
2025-11-05 04:37:51 [0.0.6][logging] INFO - ('172.18.0.8', 54630) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-05 04:37:51 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-05 04:37:51 [0.0.6][logging] INFO - connection open
2025-11-05 04:37:51 [0.0.6][logging] INFO - connection closed
2025-11-05 04:48:57 [0.0.6][logging] INFO - ('172.18.0.8', 39460) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-05 04:48:57 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-05 04:48:57 [0.0.6][logging] INFO - connection open
2025-11-05 04:48:57 [0.0.6][logging] INFO - connection closed
2025-11-05 05:00:04 [0.0.6][logging] INFO - ('172.18.0.8', 49738) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-05 05:00:04 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-05 05:00:04 [0.0.6][logging] INFO - connection open
2025-11-05 05:00:04 [0.0.6][logging] INFO - connection closed
2025-11-05 05:11:08 [0.0.6][logging] INFO - ('172.18.0.8', 48464) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-05 05:11:08 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-05 05:11:08 [0.0.6][logging] INFO - connection open
2025-11-05 05:11:08 [0.0.6][logging] INFO - connection closed
2025-11-05 05:22:13 [0.0.6][logging] INFO - ('172.18.0.8', 58710) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-05 05:22:13 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-05 05:22:13 [0.0.6][logging] INFO - connection open
2025-11-05 05:22:13 [0.0.6][logging] INFO - connection closed
2025-11-05 05:33:20 [0.0.6][logging] INFO - ('172.18.0.8', 34964) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-05 05:33:20 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-05 05:33:20 [0.0.6][logging] INFO - connection open
2025-11-05 05:33:20 [0.0.6][logging] INFO - connection closed
2025-11-05 05:44:26 [0.0.6][logging] INFO - ('172.18.0.8', 53732) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-05 05:44:26 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-05 05:44:26 [0.0.6][logging] INFO - connection open
2025-11-05 05:44:26 [0.0.6][logging] INFO - connection closed
2025-11-05 05:55:33 [0.0.6][logging] INFO - ('172.18.0.8', 49772) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-05 05:55:33 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-05 05:55:33 [0.0.6][logging] INFO - connection open
2025-11-05 05:55:33 [0.0.6][logging] INFO - connection closed
2025-11-05 06:06:40 [0.0.6][logging] INFO - ('172.18.0.8', 51164) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-05 06:06:40 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-05 06:06:40 [0.0.6][logging] INFO - connection open
2025-11-05 06:06:40 [0.0.6][logging] INFO - connection closed
2025-11-05 06:17:47 [0.0.6][logging] INFO - ('172.18.0.8', 36048) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-05 06:17:47 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-05 06:17:47 [0.0.6][logging] INFO - connection open
2025-11-05 06:17:47 [0.0.6][logging] INFO - connection closed
2025-11-05 06:28:53 [0.0.6][logging] INFO - ('172.18.0.8', 56434) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-05 06:28:53 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-05 06:28:53 [0.0.6][logging] INFO - connection open
2025-11-05 06:28:53 [0.0.6][logging] INFO - connection closed
2025-11-05 06:40:00 [0.0.6][logging] INFO - ('172.18.0.8', 56104) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-05 06:40:00 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-05 06:40:00 [0.0.6][logging] INFO - connection open
2025-11-05 06:40:00 [0.0.6][logging] INFO - connection closed
2025-11-05 06:51:07 [0.0.6][logging] INFO - ('172.18.0.8', 53728) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-05 06:51:07 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-05 06:51:07 [0.0.6][logging] INFO - connection open
2025-11-05 06:51:07 [0.0.6][logging] INFO - connection closed
2025-11-05 07:02:14 [0.0.6][logging] INFO - ('172.18.0.8', 45504) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-05 07:02:14 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-05 07:02:14 [0.0.6][logging] INFO - connection open
2025-11-05 07:02:14 [0.0.6][logging] INFO - connection closed
2025-11-05 07:13:20 [0.0.6][logging] INFO - ('172.18.0.8', 57376) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-05 07:13:20 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-05 07:13:20 [0.0.6][logging] INFO - connection open
2025-11-05 07:13:20 [0.0.6][logging] INFO - connection closed
2025-11-05 07:24:27 [0.0.6][logging] INFO - ('172.18.0.8', 59154) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-05 07:24:27 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-05 07:24:27 [0.0.6][logging] INFO - connection open
2025-11-05 07:24:27 [0.0.6][logging] INFO - connection closed
2025-11-05 07:35:34 [0.0.6][logging] INFO - ('172.18.0.8', 47866) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-05 07:35:34 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-05 07:35:34 [0.0.6][logging] INFO - connection open
2025-11-05 07:35:34 [0.0.6][logging] INFO - connection closed
2025-11-05 07:46:41 [0.0.6][logging] INFO - ('172.18.0.8', 38918) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-05 07:46:41 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-05 07:46:41 [0.0.6][logging] INFO - connection open
2025-11-05 07:46:41 [0.0.6][logging] INFO - connection closed
2025-11-05 07:57:47 [0.0.6][logging] INFO - ('172.18.0.8', 37214) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-05 07:57:47 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-05 07:57:47 [0.0.6][logging] INFO - connection open
2025-11-05 07:57:47 [0.0.6][logging] INFO - connection closed
2025-11-05 08:08:54 [0.0.6][logging] INFO - ('172.18.0.8', 35880) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-05 08:08:54 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-05 08:08:54 [0.0.6][logging] INFO - connection open
2025-11-05 08:08:54 [0.0.6][logging] INFO - connection closed
2025-11-05 08:20:01 [0.0.6][logging] INFO - ('172.18.0.8', 35274) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-05 08:20:01 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-05 08:20:01 [0.0.6][logging] INFO - connection open
2025-11-05 08:20:01 [0.0.6][logging] INFO - connection closed
2025-11-05 08:31:08 [0.0.6][logging] INFO - ('172.18.0.8', 44888) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-05 08:31:08 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-05 08:31:08 [0.0.6][logging] INFO - connection open
2025-11-05 08:31:08 [0.0.6][logging] INFO - connection closed
2025-11-05 08:42:06 [0.0.6][logging] INFO - ('172.18.0.8', 45238) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-05 08:42:06 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-05 08:42:06 [0.0.6][logging] INFO - connection open
2025-11-05 08:42:06 [0.0.6][logging] INFO - connection closed
2025-11-05 08:53:21 [0.0.6][logging] INFO - ('172.18.0.8', 51856) - "WebSocket /mcp_endpoint/mcp/?token=TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk%3D" [accepted]
2025-11-05 08:53:21 [0.0.6][app] ERROR - token解密失败: TsSP9lBq6Oa1WMkachHoS2TtNt4GKV/Gli24pk5Rjpk=
2025-11-05 08:53:21 [0.0.6][logging] INFO - connection open
2025-11-05 08:53:21 [0.0.6][logging] INFO - connection closed
+10
View File
@@ -0,0 +1,10 @@
fastapi==0.104.1
uvicorn[standard]==0.24.0
websockets==12.0
python-multipart==0.0.6
pydantic==2.5.0
python-dotenv==1.0.0
configparser==6.0.0
asyncio-mqtt==0.16.1
pycryptodome==3.23.0
loguru==0.7.2
+5
View File
@@ -0,0 +1,5 @@
"""
工具模块
"""
__version__ = "0.0.6"
+117
View File
@@ -0,0 +1,117 @@
import base64
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import hashlib
def pad_key(key: str) -> bytes:
"""
填充密钥到指定长度(16、24或32位)
@param key: 原始密钥字符串
@return: 填充后的密钥字节数组
"""
key_bytes = key.encode("utf-8")
key_length = len(key_bytes)
if key_length == 16 or key_length == 24 or key_length == 32:
return key_bytes
# 如果密钥长度不足,用0填充;如果超过,截取前32位
padded_key = bytearray(32)
padded_key[: min(key_length, 32)] = key_bytes[: min(key_length, 32)]
return bytes(padded_key)
def encrypt(key: str, plain_text: str) -> str:
"""
AES加密
@param key: 密钥(16位、24位或32位)
@param plain_text: 待加密字符串
@return: 加密后的Base64字符串
"""
try:
# 确保密钥长度为16、24或32位
key_bytes = pad_key(key)
cipher = AES.new(key_bytes, AES.MODE_ECB)
# 对明文进行PKCS7填充
try:
plain_bytes = plain_text.encode("utf-8")
padded_data = pad(plain_bytes, AES.block_size)
except Exception as e:
raise ValueError(f"明文编码或填充失败: {str(e)}")
# 加密
try:
encrypted_bytes = cipher.encrypt(padded_data)
except Exception as e:
raise ValueError(f"加密失败: {str(e)}")
# Base64编码
try:
return base64.b64encode(encrypted_bytes).decode("utf-8")
except Exception as e:
raise ValueError(f"Base64编码失败: {str(e)}")
except ValueError as e:
# 重新抛出ValueError,保持错误类型一致
raise e
except Exception as e:
raise RuntimeError(f"加密过程中发生未知错误: {str(e)}")
def decrypt(key: str, encrypted_text: str) -> str:
"""
AES解密
@param key: 密钥(16位、24位或32位)
@param encrypted_text: 待解密的Base64字符串
@return: 解密后的字符串
"""
try:
# 确保密钥长度为16、24或32位
key_bytes = pad_key(key)
cipher = AES.new(key_bytes, AES.MODE_ECB)
# 解码Base64
try:
encrypted_bytes = base64.b64decode(encrypted_text)
except Exception as e:
return None
# 解密
try:
decrypted_bytes = cipher.decrypt(encrypted_bytes)
except Exception as e:
return None
# 去除PKCS7填充
try:
unpadded_data = unpad(decrypted_bytes, AES.block_size)
except Exception as e:
return None
return unpadded_data.decode("utf-8")
except ValueError as e:
# 重新抛出ValueError,保持错误类型一致
return None
except Exception as e:
return None
if __name__ == "__main__":
# 测试代码
test_key = "6a369b7f1bcf4d3e8d123ece38bb9627"
test_text = '{"agentId": "test1"}'
print(f"原始文本: {test_text}")
print(f"密钥: {test_key}")
# 加密
encrypted = encrypt(test_key, test_text)
print(f"加密结果: {encrypted}")
# 解密
decrypted = decrypt(test_key, encrypted)
print(f"解密结果: {decrypted}")
# 验证
print(f"加解密一致性: {test_text == decrypted}")
+131
View File
@@ -0,0 +1,131 @@
"""
配置管理工具
"""
import os
import configparser
import uuid
from typing import Optional
from pathlib import Path
class ConfigManager:
"""配置管理器"""
def __init__(self, config_file: str = "data/.mcp-endpoint-server.cfg"):
self.config_file = config_file
self.config = configparser.ConfigParser()
self._load_config()
def _load_config(self):
"""加载配置文件"""
if os.path.exists(self.config_file):
self.config.read(self.config_file, encoding="utf-8")
# 检查并生成key
self._check_and_generate_key()
else:
# 如果配置文件不存在,从根目录拷贝
self._copy_config_from_root()
def _copy_config_from_root(self):
"""从根目录拷贝配置文件到data目录"""
root_config = "mcp-endpoint-server.cfg"
if os.path.exists(root_config):
# 确保data目录存在
os.makedirs(os.path.dirname(self.config_file), exist_ok=True)
# 拷贝配置文件
import shutil
shutil.copy2(root_config, self.config_file)
# 重新加载配置
self.config.read(self.config_file, encoding="utf-8")
# 检查并生成key
self._check_and_generate_key()
else:
# 如果根目录也没有配置文件,则创建默认配置
self._create_default_config()
def _check_and_generate_key(self):
"""检查key是否存在且长度足够,如果不足则生成新的"""
try:
current_key = self.config.get("server", "key", fallback="")
if not current_key or len(current_key) < 32:
# 生成32位随机密码
new_key = self._generate_random_key()
self.config.set("server", "key", new_key)
# 保存到配置文件
with open(self.config_file, "w", encoding="utf-8") as f:
self.config.write(f)
print(f"已自动生成新的32位密钥: {new_key}")
except Exception as e:
print(f"检查密钥时发生错误: {e}")
def _generate_random_key(self) -> str:
"""生成指定长度的随机密钥"""
# 使用UUID生成密钥,移除连字符
return str(uuid.uuid4()).replace("-", "")
def _create_default_config(self):
"""创建默认配置"""
self.config["server"] = {
"host": "127.0.0.1",
"port": "8004",
"debug": "false",
"log_level": "INFO",
"key": self._generate_random_key(), # 生成默认密钥
}
self.config["websocket"] = {
"max_connections": "1000",
"ping_interval": "30",
"ping_timeout": "10",
"close_timeout": "10",
}
self.config["security"] = {"allowed_origins": "*", "enable_cors": "true"}
self.config["logging"] = {
"log_file": "logs/mcp_server.log",
"max_file_size": "10MB",
"backup_count": "5",
}
# 确保目录存在
os.makedirs(os.path.dirname(self.config_file), exist_ok=True)
# 保存默认配置
with open(self.config_file, "w", encoding="utf-8") as f:
self.config.write(f)
def get(self, section: str, key: str, default: Optional[str] = None) -> str:
"""获取配置值"""
try:
return self.config.get(section, key)
except (configparser.NoSectionError, configparser.NoOptionError):
return default
def getint(self, section: str, key: str, default: int = 0) -> int:
"""获取整数配置值"""
try:
return self.config.getint(section, key)
except (configparser.NoSectionError, configparser.NoOptionError, ValueError):
return default
def getboolean(self, section: str, key: str, default: bool = False) -> bool:
"""获取布尔配置值"""
try:
return self.config.getboolean(section, key)
except (configparser.NoSectionError, configparser.NoOptionError, ValueError):
return default
def reload(self):
"""重新加载配置"""
self._load_config()
# 全局配置实例
config = ConfigManager()
+224
View File
@@ -0,0 +1,224 @@
"""
JSON-RPC 2.0 协议封装类
用于统一处理JSON-RPC消息的格式化和解析
"""
import json
from typing import Any, Dict, Optional, Union
from dataclasses import dataclass, asdict
@dataclass
class JSONRPCError:
"""JSON-RPC错误对象"""
code: int
message: str
data: Optional[Any] = None
@dataclass
class JSONRPCRequest:
"""JSON-RPC请求对象"""
method: str
params: Optional[Union[Dict, list]] = None
id: Optional[Union[str, int]] = None
jsonrpc: str = "2.0"
@dataclass
class JSONRPCResponse:
"""JSON-RPC响应对象"""
result: Optional[Any] = None
error: Optional[JSONRPCError] = None
id: Optional[Union[str, int]] = None
jsonrpc: str = "2.0"
class JSONRPCProtocol:
"""JSON-RPC 2.0 协议封装类"""
# 预定义错误码
PARSE_ERROR = -32700
INVALID_REQUEST = -32600
METHOD_NOT_FOUND = -32601
INVALID_PARAMS = -32602
INTERNAL_ERROR = -32603
# 自定义错误码
TOOL_NOT_CONNECTED = -32001
FORWARD_FAILED = -32002
CONNECTION_ERROR = -32003
AUTHENTICATION_ERROR = -32004
@staticmethod
def create_request(
method: str,
params: Optional[Union[Dict, list]] = None,
request_id: Optional[Union[str, int]] = None,
) -> JSONRPCRequest:
"""创建JSON-RPC请求"""
return JSONRPCRequest(
method=method, params=params, id=request_id, jsonrpc="2.0"
)
@staticmethod
def create_success_response(
result: Any, request_id: Optional[Union[str, int]] = None
) -> JSONRPCResponse:
"""创建成功响应"""
return JSONRPCResponse(result=result, id=request_id, jsonrpc="2.0")
@staticmethod
def create_error_response(
error_code: int,
error_message: str,
error_data: Optional[Any] = None,
request_id: Optional[Union[str, int]] = None,
) -> JSONRPCResponse:
"""创建错误响应"""
error = JSONRPCError(code=error_code, message=error_message, data=error_data)
return JSONRPCResponse(error=error, id=request_id, jsonrpc="2.0")
@staticmethod
def create_notification(
method: str, params: Optional[Union[Dict, list]] = None
) -> JSONRPCRequest:
"""创建通知消息(无ID的请求)"""
return JSONRPCRequest(method=method, params=params, id=None, jsonrpc="2.0")
@staticmethod
def to_dict(obj: Union[JSONRPCRequest, JSONRPCResponse]) -> Dict:
"""将对象转换为字典"""
return asdict(obj)
@staticmethod
def to_json(
obj: Union[JSONRPCRequest, JSONRPCResponse], ensure_ascii: bool = False
) -> str:
"""将对象转换为JSON字符串"""
return json.dumps(asdict(obj), ensure_ascii=ensure_ascii)
@staticmethod
def parse_request(json_str: str) -> Optional[JSONRPCRequest]:
"""解析JSON-RPC请求"""
try:
data = json.loads(json_str)
if not isinstance(data, dict):
return None
# 验证必需字段
if "jsonrpc" not in data or data["jsonrpc"] != "2.0":
return None
if "method" not in data:
return None
return JSONRPCRequest(
method=data["method"],
params=data.get("params"),
id=data.get("id"),
jsonrpc=data["jsonrpc"],
)
except (json.JSONDecodeError, KeyError, TypeError):
return None
@staticmethod
def parse_response(json_str: str) -> Optional[JSONRPCResponse]:
"""解析JSON-RPC响应"""
try:
data = json.loads(json_str)
if not isinstance(data, dict):
return None
# 验证必需字段
if "jsonrpc" not in data or data["jsonrpc"] != "2.0":
return None
# 检查是否有result或error字段
has_result = "result" in data
has_error = "error" in data
if not has_result and not has_error:
return None
if has_result and has_error:
return None
response = JSONRPCResponse(id=data.get("id"), jsonrpc=data["jsonrpc"])
if has_result:
response.result = data["result"]
else:
error_data = data["error"]
response.error = JSONRPCError(
code=error_data["code"],
message=error_data["message"],
data=error_data.get("data"),
)
return response
except (json.JSONDecodeError, KeyError, TypeError):
return None
@staticmethod
def is_valid_request(json_str: str) -> bool:
"""验证是否为有效的JSON-RPC请求"""
return JSONRPCProtocol.parse_request(json_str) is not None
@staticmethod
def is_valid_response(json_str: str) -> bool:
"""验证是否为有效的JSON-RPC响应"""
return JSONRPCProtocol.parse_response(json_str) is not None
@staticmethod
def is_notification(json_str: str) -> bool:
"""检查是否为通知消息(无ID的请求)"""
request = JSONRPCProtocol.parse_request(json_str)
return request is not None and request.id is None
def create_tool_not_connected_error(
request_id: Optional[Union[str, int]] = None, agent_id: Optional[str] = None
) -> str:
"""创建工具端未连接的错误消息"""
error_data = (
{"agent_id": agent_id, "details": "请求的工具端连接不存在或已断开"}
if agent_id
else None
)
response = JSONRPCProtocol.create_error_response(
error_code=JSONRPCProtocol.TOOL_NOT_CONNECTED,
error_message="工具端未连接",
error_data=error_data,
request_id=request_id,
)
return JSONRPCProtocol.to_json(response, ensure_ascii=False)
def create_forward_failed_error(
request_id: Optional[Union[str, int]] = None, agent_id: Optional[str] = None
) -> str:
"""创建转发失败的错误消息"""
error_data = (
{"agent_id": agent_id, "details": "消息转发过程中发生错误"}
if agent_id
else None
)
response = JSONRPCProtocol.create_error_response(
error_code=JSONRPCProtocol.FORWARD_FAILED,
error_message="转发消息失败",
error_data=error_data,
request_id=request_id,
)
return JSONRPCProtocol.to_json(response, ensure_ascii=False)
def create_authentication_error(message: str = "认证失败") -> str:
"""创建认证错误消息"""
response = JSONRPCProtocol.create_error_response(
error_code=JSONRPCProtocol.AUTHENTICATION_ERROR, error_message=message
)
return JSONRPCProtocol.to_json(response, ensure_ascii=False)
+143
View File
@@ -0,0 +1,143 @@
"""
日志管理工具
"""
import os
import sys
import logging
from typing import Optional
from loguru import logger
from .config import config
# 版本号
from . import __version__ as VERSION
class InterceptHandler(logging.Handler):
"""拦截标准库日志并转发到loguru"""
def emit(self, record):
# 获取对应的loguru级别
try:
level = logger.level(record.levelname).name
except ValueError:
level = record.levelno
# 查找调用者
frame, depth = sys._getframe(6), 6
while frame and frame.f_code.co_filename == __file__:
frame = frame.f_back
depth += 1
logger.opt(depth=depth, exception=record.exc_info).log(
level, record.getMessage()
)
class LoggerManager:
"""日志管理器"""
def __init__(self):
self._setup_logger()
def _setup_logger(self):
"""设置日志器"""
# 移除默认的处理器
logger.remove()
# 自定义格式:时间[版本号][模块路径]-级别-消息
# 不同部分使用不同颜色
custom_format = (
f"<green>{{time:YYMMDD HH:mm:ss}}</green>"
f"<blue>[{VERSION}][{{name}}]</blue>"
"<level>-{level}-</level>"
"<green>{message}</green>"
)
# 控制台处理器
logger.add(
sys.stdout,
format=custom_format,
level=config.get("server", "log_level", "INFO"),
colorize=True,
backtrace=True,
diagnose=True,
enqueue=True,
catch=True,
)
# 文件处理器(不带颜色)
log_file = config.get("logging", "log_file", "logs/mcp_server.log")
if log_file:
# 确保日志目录存在
os.makedirs(os.path.dirname(log_file), exist_ok=True)
# 文件格式(不带颜色)
file_format = f"{{time:YYYY-MM-DD HH:mm:ss}} [{VERSION}][{{name}}] {{level}} - {{message}}"
# 获取文件大小限制
max_file_size = config.get("logging", "max_file_size", "10MB")
max_bytes = self._parse_size(max_file_size)
# 获取备份数量
backup_count = config.getint("logging", "backup_count", 5)
logger.add(
log_file,
format=file_format,
level=config.get("server", "log_level", "INFO"),
rotation=max_bytes,
retention=backup_count,
compression="zip",
encoding="utf-8",
enqueue=True,
catch=True,
)
print("Logger initialized", flush=True)
logger.info("Logger test message")
def _parse_size(self, size_str: str) -> int:
"""解析文件大小字符串"""
size_str = size_str.upper()
if size_str.endswith("MB"):
return int(float(size_str[:-2]) * 1024 * 1024)
elif size_str.endswith("KB"):
return int(float(size_str[:-2]) * 1024)
elif size_str.endswith("B"):
return int(size_str[:-1])
else:
return int(size_str)
def get_logger(self):
"""获取日志器"""
return logger
def reload(self):
"""重新加载日志配置"""
self._setup_logger()
def setup_uvicorn_logging(self):
"""设置uvicorn日志拦截"""
import logging
# 拦截标准库日志
logging.basicConfig(handlers=[InterceptHandler()], level=0, force=True)
# 直接禁用uvicorn.access日志
logging.getLogger("uvicorn.access").disabled = True
logging.getLogger("uvicorn.access").propagate = False
# 拦截其他uvicorn日志
for name in logging.root.manager.loggerDict.keys():
if not name.startswith("uvicorn.access"):
logging.getLogger(name).handlers = []
logging.getLogger(name).propagate = True
# 全局日志管理器实例
logger_manager = LoggerManager()
def get_logger(name: str = "mcp_server"):
"""获取日志器"""
return logger.bind(name=name)
+13
View File
@@ -0,0 +1,13 @@
import socket
def get_local_ip():
try:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# Connect to Google's DNS servers
s.connect(("8.8.8.8", 80))
local_ip = s.getsockname()[0]
s.close()
return local_ip
except Exception as e:
return "127.0.0.1"