2
0
Просмотр исходного кода

fix(mcp): 修复启用/禁用按钮文本反转和代码清理

- 修复 McpServerCard.tsx 按钮文本逻辑反转问题
  - 错误: isEnabled ? '启用' : '禁用'
  - 修复: isEnabled ? '禁用' : '启用'
- 删除 mcp-token-manager.ts 中重复的 getAllTokens() 函数
- 添加 debug 日志跟踪 MCP 过滤流程

验证通过:
- 0 个 MCP 启用 → 0 个工具
- 1 个 MCP 启用 → 11 个工具
- 2 个 MCP 启用 → 36 个工具

Co-Authored-By: Claude <noreply@anthropic.com>
Claude AI 1 час назад
Родитель
Сommit
9062ea7fee

+ 8 - 0
backend/app_fastapi.py

@@ -16,6 +16,7 @@ from fastapi.staticfiles import StaticFiles
 import httpx
 from anthropic import Anthropic
 
+from debug_logger import log_debug
 from config import MCP_SERVERS, ANTHROPIC_API_KEY, ANTHROPIC_BASE_URL, ANTHROPIC_MODEL
 from conversation_manager import ConversationManager
 from tool_handler import ToolCallHandler
@@ -451,6 +452,13 @@ async def chat_stream(request: Request):
         available_components = data.get('availableComponents')  # 前端发送的组件列表
         enabled_mcp_list = data.get('enabledMcpList')  # 前端发送的已启用 MCP 列表
 
+        # 记录到 JSONL 文件
+        log_debug("app_fastapi.api_chat_stream_received", {
+            "message_preview": message[:50] if message else None,
+            "enabled_mcp_list": enabled_mcp_list,
+            "enabled_mcp_list_type": str(type(enabled_mcp_list))
+        })
+
         # DEBUG: 打印收到的 token
         print(f"[DEBUG /api/chat/stream] mcp_tokens type: {type(mcp_tokens)}")
         print(f"[DEBUG /api/chat/stream] mcp_tokens value: {mcp_tokens[:150] if mcp_tokens else 'None'}...")

+ 28 - 4
backend/mcp_client.py

@@ -7,6 +7,7 @@ import asyncio
 import re
 from typing import Dict, List, Any, Optional
 from config import MCP_SERVERS
+from debug_logger import log_debug
 
 
 def parse_sse_response(text: str) -> str:
@@ -191,18 +192,41 @@ class MCPClient:
             session_id: 会话 ID
             mcp_tokens: MCP token 映射
             enabled_mcp_list: 前端传递的已启用 MCP 列表(优先级高于 config.py 中的配置)
+                            - None: 前端未传递,使用 config.py fallback
+                            - []: 前端明确禁用所有 MCP
+                            - [xxx]: 前端指定启用的 MCP 列表
         """
         all_tools = []
 
+        # DEBUG: 打印接收到的启用列表
+        print(f"[DEBUG MCPClient.get_all_tools_with_tokens_async] enabled_mcp_list: {enabled_mcp_list}")
+        log_debug("mcp_client.get_all_tools_with_tokens_async_start", {
+            "enabled_mcp_list": enabled_mcp_list,
+            "enabled_mcp_list_type": str(type(enabled_mcp_list)),
+            "enabled_mcp_list_is_none": enabled_mcp_list is None,
+            "enabled_mcp_list_len": len(enabled_mcp_list) if enabled_mcp_list is not None else "N/A"
+        })
+
         for server_id in MCP_SERVERS.keys():
-            # 优先使用前端传递的启用列表,其次使用配置文件中的 enabled 状态
-            if enabled_mcp_list is not None and len(enabled_mcp_list) > 0:
-                # 前端传递了启用列表,只处理列表中的 MCP
+            # 优先使用前端传递的启用列表
+            log_debug("mcp_client.checking_server", {
+                "server_id": server_id,
+                "enabled_mcp_list": enabled_mcp_list,
+                "is_none": enabled_mcp_list is None
+            })
+            if enabled_mcp_list is not None:
+                # 前端传递了启用列表(可能是空数组),只处理列表中的 MCP
+                in_list = server_id in enabled_mcp_list
+                log_debug("mcp_client.server_in_list_check", {
+                    "server_id": server_id,
+                    "in_enabled_list": in_list,
+                    "will_skip": not in_list
+                })
                 if server_id not in enabled_mcp_list:
                     print(f"[DEBUG MCPClient] Skipping {server_id} (not in enabled_mcp_list from frontend)")
                     continue
             else:
-                # 前端未传递启用列表或列表为空,使用配置文件中的 enabled 状态
+                # 前端未传递启用列表(None),使用配置文件中的 enabled 状态作为 fallback
                 if not MCP_SERVERS[server_id].get("enabled", False):
                     continue
 

+ 1 - 1
frontend-v2/components/McpServerCard.tsx

@@ -266,7 +266,7 @@ export function McpServerCard({ mcpType, config, onConnectionStatusChange, onEna
               title={isEnabled ? '点击禁用此 MCP 服务器' : '点击启用此 MCP 服务器'}
             >
               <span className={`w-1.5 h-1.5 rounded-full ${isEnabled ? 'bg-green-500' : 'bg-gray-400'}`} />
-              {isEnabled ? '启用' : '禁用'}
+              {isEnabled ? '禁用' : '启用'}
             </button>
           </div>
           <p className="text-sm text-gray-500 dark:text-gray-400 mt-1">

+ 0 - 19
frontend-v2/lib/mcp-token-manager.ts

@@ -353,25 +353,6 @@ export class McpTokenManager {
   getEnabledMcpList(): string[] {
     return Object.keys(MCP_SERVERS).filter(mcpType => this.isEnabled(mcpType));
   }
-
-  /**
-   * 获取所有已启用且已登录的 MCP Token
-   * 用于聊天请求中携带 token
-   */
-  getAllTokens(): Record<string, string> {
-    const tokens: Record<string, string> = {};
-    for (const mcpType of Object.keys(MCP_SERVERS)) {
-      // 只返回已启用且已登录的 token
-      if (this.isEnabled(mcpType)) {
-        const token = this.getToken(mcpType);
-        if (token) {
-          tokens[mcpType] = token;
-        }
-      }
-    }
-    return tokens;
-  }
-
   /**
    * 获取已启用且已登录的 MCP 数量
    */