From b75d24d92c6b95331349d8f0dd69c8504dab768a Mon Sep 17 00:00:00 2001 From: Soulter <905617992@qq.com> Date: Sat, 12 Apr 2025 17:56:23 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=F0=9F=8E=88=20perf:=20=E9=80=82=E9=85=8D?= =?UTF-8?q?=20MCP=20=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6=E5=B8=A6=20mcpSer?= =?UTF-8?q?vers=20=E7=9A=84=E6=83=85=E5=86=B5(Cursor)=20=F0=9F=90=9B=20fix?= =?UTF-8?q?:=20=E5=85=B3=E9=97=AD/=E5=88=A0=E9=99=A4=20MCP=20=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E5=99=A8=E5=90=8E=20Tools=20=E6=B2=A1=E6=9C=89?= =?UTF-8?q?=E6=B8=85=E9=99=A4=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- astrbot/core/provider/func_tool_manager.py | 14 ++++++++++++++ astrbot/dashboard/routes/tools.py | 12 ++++++++++-- dashboard/src/views/ToolUsePage.vue | 9 +++++++++ 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/astrbot/core/provider/func_tool_manager.py b/astrbot/core/provider/func_tool_manager.py index 325f89199..0de8a9054 100644 --- a/astrbot/core/provider/func_tool_manager.py +++ b/astrbot/core/provider/func_tool_manager.py @@ -95,6 +95,10 @@ class MCPClient: mcp_server_config (dict): Configuration for the MCP server. See https://modelcontextprotocol.io/quickstart/server """ cfg = mcp_server_config.copy() + print(cfg) + if "mcpServers" in cfg: + key_0 = list(cfg["mcpServers"].keys())[0] + cfg = cfg["mcpServers"][key_0] cfg.pop("active", None) server_params = mcp.StdioServerParameters( **cfg, @@ -260,6 +264,11 @@ class FuncCall: if data["name"] in self.mcp_client_event: self.mcp_client_event[data["name"]].set() self.mcp_client_event.pop(data["name"], None) + self.func_list = [ + f + for f in self.func_list + if not (f.origin == "mcp" and f.mcp_server_name == data["name"]) + ] else: for name in self.mcp_client_dict.keys(): # await self._terminate_mcp_client(name) @@ -267,6 +276,11 @@ class FuncCall: if name in self.mcp_client_event: self.mcp_client_event[name].set() self.mcp_client_event.pop(name, None) + self.func_list = [ + f + for f in self.func_list + if not (f.origin == "mcp") + ] async def _init_mcp_client_task_wrapper( self, name: str, cfg: dict, event: asyncio.Event diff --git a/astrbot/dashboard/routes/tools.py b/astrbot/dashboard/routes/tools.py index 36da48ce4..2bf1b6e18 100644 --- a/astrbot/dashboard/routes/tools.py +++ b/astrbot/dashboard/routes/tools.py @@ -106,7 +106,11 @@ class ToolsRoute(Route): # 复制所有配置字段 for key, value in server_data.items(): if key not in ["name", "active", "tools"]: # 排除特殊字段 - server_config[key] = value + if key == "mcpServers": + key_0 = list(server_data["mcpServers"].keys())[0] + server_config = server_data["mcpServers"][key_0] + else: + server_config[key] = value has_valid_config = True if not has_valid_config: @@ -163,7 +167,11 @@ class ToolsRoute(Route): # 复制所有配置字段 for key, value in server_data.items(): if key not in ["name", "active", "tools"]: # 排除特殊字段 - server_config[key] = value + if key == "mcpServers": + key_0 = list(server_data["mcpServers"].keys())[0] + server_config = server_data["mcpServers"][key_0] + else: + server_config[key] = value only_update_active = False # 如果只更新活动状态,保留原始配置 diff --git a/dashboard/src/views/ToolUsePage.vue b/dashboard/src/views/ToolUsePage.vue index 27eb3dcc1..1d27811d6 100644 --- a/dashboard/src/views/ToolUsePage.vue +++ b/dashboard/src/views/ToolUsePage.vue @@ -32,6 +32,7 @@ mdi-server MCP 服务器 + 新增服务器 @@ -404,6 +405,11 @@ export default { mounted() { this.getServers(); this.getTools(); + setInterval(() => { + this.getServers(); + this.getTools(); + }, 5000); // 每10秒刷新一次服务器列表 + }, methods: { @@ -420,12 +426,15 @@ export default { }, getServers() { + this.loading = true axios.get('/api/tools/mcp/servers') .then(response => { this.mcpServers = response.data.data || []; + this.loading = false }) .catch(error => { this.showError("获取 MCP 服务器列表失败: " + error.message); + this.loading = false }); }, From 709c324e18f33a1e7a88a0cdd94b2fb6d19cf5ae Mon Sep 17 00:00:00 2001 From: Soulter <905617992@qq.com> Date: Sat, 12 Apr 2025 18:19:06 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=F0=9F=90=9B=20fix:=20=E4=BF=AE=E5=A4=8D=20?= =?UTF-8?q?MCP=20=E6=9C=8D=E5=8A=A1=E5=99=A8=E9=85=8D=E7=BD=AE=E5=A4=84?= =?UTF-8?q?=E7=90=86=E9=80=BB=E8=BE=91=EF=BC=8C=E7=A1=AE=E4=BF=9D=E6=AD=A3?= =?UTF-8?q?=E7=A1=AE=E5=A4=84=E7=90=86=E7=A9=BA=20mcpServers=20=E6=83=85?= =?UTF-8?q?=E5=86=B5=E5=B9=B6=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81=E5=8F=AF?= =?UTF-8?q?=E8=AF=BB=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- astrbot/core/provider/func_tool_manager.py | 7 +++---- astrbot/dashboard/routes/tools.py | 4 ++-- dashboard/src/views/ToolUsePage.vue | 2 +- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/astrbot/core/provider/func_tool_manager.py b/astrbot/core/provider/func_tool_manager.py index 0de8a9054..53f5048fa 100644 --- a/astrbot/core/provider/func_tool_manager.py +++ b/astrbot/core/provider/func_tool_manager.py @@ -95,11 +95,10 @@ class MCPClient: mcp_server_config (dict): Configuration for the MCP server. See https://modelcontextprotocol.io/quickstart/server """ cfg = mcp_server_config.copy() - print(cfg) - if "mcpServers" in cfg: + if "mcpServers" in cfg and len(cfg["mcpServers"]) > 0: key_0 = list(cfg["mcpServers"].keys())[0] cfg = cfg["mcpServers"][key_0] - cfg.pop("active", None) + cfg.pop("active", None) # Remove active flag from config server_params = mcp.StdioServerParameters( **cfg, ) @@ -279,7 +278,7 @@ class FuncCall: self.func_list = [ f for f in self.func_list - if not (f.origin == "mcp") + if f.origin != "mcp" ] async def _init_mcp_client_task_wrapper( diff --git a/astrbot/dashboard/routes/tools.py b/astrbot/dashboard/routes/tools.py index 2bf1b6e18..9a3c5aa53 100644 --- a/astrbot/dashboard/routes/tools.py +++ b/astrbot/dashboard/routes/tools.py @@ -107,7 +107,7 @@ class ToolsRoute(Route): for key, value in server_data.items(): if key not in ["name", "active", "tools"]: # 排除特殊字段 if key == "mcpServers": - key_0 = list(server_data["mcpServers"].keys())[0] + key_0 = list(server_data["mcpServers"].keys())[0] # 不考虑为空的情况 server_config = server_data["mcpServers"][key_0] else: server_config[key] = value @@ -168,7 +168,7 @@ class ToolsRoute(Route): for key, value in server_data.items(): if key not in ["name", "active", "tools"]: # 排除特殊字段 if key == "mcpServers": - key_0 = list(server_data["mcpServers"].keys())[0] + key_0 = list(server_data["mcpServers"].keys())[0] # 不考虑为空的情况 server_config = server_data["mcpServers"][key_0] else: server_config[key] = value diff --git a/dashboard/src/views/ToolUsePage.vue b/dashboard/src/views/ToolUsePage.vue index 1d27811d6..a3121f0f6 100644 --- a/dashboard/src/views/ToolUsePage.vue +++ b/dashboard/src/views/ToolUsePage.vue @@ -408,7 +408,7 @@ export default { setInterval(() => { this.getServers(); this.getTools(); - }, 5000); // 每10秒刷新一次服务器列表 + }, 5000); // 每 5 秒刷新一次服务器列表 },