@@ -83,6 +83,14 @@ async def get_mcp_servers(self):
8383 )
8484 mcp_servers = {}
8585
86+ # 按 server 名预分组 MCP 工具,避免每台服务器都扫一遍 func_list
87+ mcp_tools_by_server : dict [str , list [MCPTool ]] = {}
88+ for f in self .tool_mgr .func_list :
89+ if isinstance (f , MCPTool ):
90+ mcp_tools_by_server .setdefault (f .mcp_server_name , []).append (f )
91+
92+ runtime_view = self .tool_mgr .mcp_server_runtime_view
93+
8694 # 获取所有服务器并添加它们的工具列表
8795 for name , server_config in mcp_servers .items ():
8896 if not isinstance (server_config , dict ):
@@ -103,20 +111,14 @@ async def get_mcp_servers(self):
103111
104112 # tools 为 namespaced 名(与 personaForm.tools 匹配),
105113 # original_tool_names 为原始名(给 UI 显示)
106- for name_key , runtime in self .tool_mgr .mcp_server_runtime_view .items ():
107- if name_key == name :
108- mcp_client = runtime .client
109- mcp_tools = [
110- f
111- for f in self .tool_mgr .func_list
112- if isinstance (f , MCPTool ) and f .mcp_server_name == name
113- ]
114- server_info ["tools" ] = [f .name for f in mcp_tools ]
115- server_info ["original_tool_names" ] = [
116- f .original_tool_name for f in mcp_tools
117- ]
118- server_info ["errlogs" ] = mcp_client .server_errlogs
119- break
114+ runtime = runtime_view .get (name )
115+ if runtime is not None :
116+ mcp_tools = mcp_tools_by_server .get (name , [])
117+ server_info ["tools" ] = [f .name for f in mcp_tools ]
118+ server_info ["original_tool_names" ] = [
119+ f .original_tool_name for f in mcp_tools
120+ ]
121+ server_info ["errlogs" ] = runtime .client .server_errlogs
120122 else :
121123 server_info ["tools" ] = []
122124 server_info ["original_tool_names" ] = []
0 commit comments