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 }); },