From 7ff894e8753bf56bac811b62e9a4726372c1df83 Mon Sep 17 00:00:00 2001 From: BBIT-Kai <2911862937@qq.com> Date: Wed, 5 Nov 2025 18:06:40 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=BF=E7=94=9F=E4=BA=BAMCP=E6=8E=A5?= =?UTF-8?q?=E5=85=A5=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bbit_ai/app_mcp/app.py | 258 ++++++ bbit_ai/app_mcp/core/connection_manager.py | 270 ++++++ bbit_ai/app_mcp/data/.mcp-endpoint-server.cfg | 22 + bbit_ai/app_mcp/handlers/websocket_handler.py | 117 +++ bbit_ai/app_mcp/logs/mcp_server.log | 778 ++++++++++++++++++ bbit_ai/app_mcp/requirements.txt | 10 + bbit_ai/app_mcp/utils/__init__.py | 5 + bbit_ai/app_mcp/utils/aes_utils.py | 117 +++ bbit_ai/app_mcp/utils/config.py | 131 +++ bbit_ai/app_mcp/utils/jsonrpc.py | 224 +++++ bbit_ai/app_mcp/utils/logger.py | 143 ++++ bbit_ai/app_mcp/utils/util.py | 13 + 12 files changed, 2088 insertions(+) create mode 100644 bbit_ai/app_mcp/app.py create mode 100644 bbit_ai/app_mcp/core/connection_manager.py create mode 100644 bbit_ai/app_mcp/data/.mcp-endpoint-server.cfg create mode 100644 bbit_ai/app_mcp/handlers/websocket_handler.py create mode 100644 bbit_ai/app_mcp/logs/mcp_server.log create mode 100644 bbit_ai/app_mcp/requirements.txt create mode 100644 bbit_ai/app_mcp/utils/__init__.py create mode 100644 bbit_ai/app_mcp/utils/aes_utils.py create mode 100644 bbit_ai/app_mcp/utils/config.py create mode 100644 bbit_ai/app_mcp/utils/jsonrpc.py create mode 100644 bbit_ai/app_mcp/utils/logger.py create mode 100644 bbit_ai/app_mcp/utils/util.py diff --git a/bbit_ai/app_mcp/app.py b/bbit_ai/app_mcp/app.py new file mode 100644 index 0000000..28f00ff --- /dev/null +++ b/bbit_ai/app_mcp/app.py @@ -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() diff --git a/bbit_ai/app_mcp/core/connection_manager.py b/bbit_ai/app_mcp/core/connection_manager.py new file mode 100644 index 0000000..b82f139 --- /dev/null +++ b/bbit_ai/app_mcp/core/connection_manager.py @@ -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() diff --git a/bbit_ai/app_mcp/data/.mcp-endpoint-server.cfg b/bbit_ai/app_mcp/data/.mcp-endpoint-server.cfg new file mode 100644 index 0000000..bb66bad --- /dev/null +++ b/bbit_ai/app_mcp/data/.mcp-endpoint-server.cfg @@ -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 + diff --git a/bbit_ai/app_mcp/handlers/websocket_handler.py b/bbit_ai/app_mcp/handlers/websocket_handler.py new file mode 100644 index 0000000..0567150 --- /dev/null +++ b/bbit_ai/app_mcp/handlers/websocket_handler.py @@ -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() diff --git a/bbit_ai/app_mcp/logs/mcp_server.log b/bbit_ai/app_mcp/logs/mcp_server.log new file mode 100644 index 0000000..c39a8f1 --- /dev/null +++ b/bbit_ai/app_mcp/logs/mcp_server.log @@ -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 diff --git a/bbit_ai/app_mcp/requirements.txt b/bbit_ai/app_mcp/requirements.txt new file mode 100644 index 0000000..6eac34c --- /dev/null +++ b/bbit_ai/app_mcp/requirements.txt @@ -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 \ No newline at end of file diff --git a/bbit_ai/app_mcp/utils/__init__.py b/bbit_ai/app_mcp/utils/__init__.py new file mode 100644 index 0000000..0c912b9 --- /dev/null +++ b/bbit_ai/app_mcp/utils/__init__.py @@ -0,0 +1,5 @@ +""" +工具模块 +""" + +__version__ = "0.0.6" diff --git a/bbit_ai/app_mcp/utils/aes_utils.py b/bbit_ai/app_mcp/utils/aes_utils.py new file mode 100644 index 0000000..0216f13 --- /dev/null +++ b/bbit_ai/app_mcp/utils/aes_utils.py @@ -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}") diff --git a/bbit_ai/app_mcp/utils/config.py b/bbit_ai/app_mcp/utils/config.py new file mode 100644 index 0000000..39808c6 --- /dev/null +++ b/bbit_ai/app_mcp/utils/config.py @@ -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() diff --git a/bbit_ai/app_mcp/utils/jsonrpc.py b/bbit_ai/app_mcp/utils/jsonrpc.py new file mode 100644 index 0000000..b5d85f9 --- /dev/null +++ b/bbit_ai/app_mcp/utils/jsonrpc.py @@ -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) diff --git a/bbit_ai/app_mcp/utils/logger.py b/bbit_ai/app_mcp/utils/logger.py new file mode 100644 index 0000000..3dfed3c --- /dev/null +++ b/bbit_ai/app_mcp/utils/logger.py @@ -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"{{time:YYMMDD HH:mm:ss}}" + f"[{VERSION}][{{name}}]" + "-{level}-" + "{message}" + ) + + # 控制台处理器 + 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) diff --git a/bbit_ai/app_mcp/utils/util.py b/bbit_ai/app_mcp/utils/util.py new file mode 100644 index 0000000..47e4294 --- /dev/null +++ b/bbit_ai/app_mcp/utils/util.py @@ -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"