From b62743dbae3b7f3e7a7415d10caf4f39818ec0f2 Mon Sep 17 00:00:00 2001 From: one Date: Fri, 23 May 2025 00:39:02 +0800 Subject: [PATCH] feat: toggle MCP servers on the card list (#6232) --- .../settings/MCPSettings/McpServersList.tsx | 45 +++++++++++++++++-- .../settings/MCPSettings/McpSettings.tsx | 11 +---- src/renderer/src/utils/error.ts | 9 ++++ 3 files changed, 53 insertions(+), 12 deletions(-) diff --git a/src/renderer/src/pages/settings/MCPSettings/McpServersList.tsx b/src/renderer/src/pages/settings/MCPSettings/McpServersList.tsx index ed2102530c..de0b83c137 100644 --- a/src/renderer/src/pages/settings/MCPSettings/McpServersList.tsx +++ b/src/renderer/src/pages/settings/MCPSettings/McpServersList.tsx @@ -4,7 +4,8 @@ import DragableList from '@renderer/components/DragableList' import Scrollbar from '@renderer/components/Scrollbar' import { useMCPServers } from '@renderer/hooks/useMCPServers' import { MCPServer } from '@renderer/types' -import { Button, Dropdown, Empty, Tag } from 'antd' +import { formatMcpError } from '@renderer/utils/error' +import { Button, Dropdown, Empty, Switch, Tag } from 'antd' import { MonitorCheck, Plus, RefreshCw, Settings2, SquareArrowOutUpRight } from 'lucide-react' import { FC, useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' @@ -17,10 +18,11 @@ import EditMcpJsonPopup from './EditMcpJsonPopup' import SyncServersPopup from './SyncServersPopup' const McpServersList: FC = () => { - const { mcpServers, addMCPServer, updateMcpServers } = useMCPServers() + const { mcpServers, addMCPServer, updateMcpServers, updateMCPServer } = useMCPServers() const { t } = useTranslation() const navigate = useNavigate() const [isAddModalVisible, setIsAddModalVisible] = useState(false) + const [loadingServerIds, setLoadingServerIds] = useState>(new Set()) const onAddMcpServer = useCallback(async () => { const newServer = { @@ -53,6 +55,33 @@ const McpServersList: FC = () => { [addMCPServer, t] ) + const handleToggleActive = async (server: MCPServer, active: boolean) => { + setLoadingServerIds((prev) => new Set(prev).add(server.id)) + const oldActiveState = server.isActive + + try { + if (active) { + await window.api.mcp.listTools(server) + } else { + await window.api.mcp.stopServer(server) + } + updateMCPServer({ ...server, isActive: active }) + } catch (error: any) { + window.modal.error({ + title: t('settings.mcp.startError'), + content: formatMcpError(error), + centered: true + }) + updateMCPServer({ ...server, isActive: oldActiveState }) + } finally { + setLoadingServerIds((prev) => { + const next = new Set(prev) + next.delete(server.id) + return next + }) + } + } + return ( @@ -108,7 +137,14 @@ const McpServersList: FC = () => { - + e.stopPropagation()}> + handleToggleActive(server, checked)} + size="small" + />