From 263166c9d191820f7940561c138f00d316a24709 Mon Sep 17 00:00:00 2001 From: one Date: Tue, 19 Aug 2025 10:26:06 +0800 Subject: [PATCH] refactor: improve mcp server list (#9257) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * refactor: mcp server list * feat: add a delete button, improve button style * refactor(McpServerList): extract McpServerCard * feat: show numbers in tab titles * refactor(preload): 明确getServerVersion返回类型为Promise * refactor(hooks): 移除MCPServer数组的类型断言 * refactor(MCPSettings): 简化服务器标签的渲染逻辑 * Revert "refactor(MCPSettings): 简化服务器标签的渲染逻辑" This reverts commit 1dd08909afffd7b104aad66c606dc22342a25298. * doc: add comments --------- Co-authored-by: icarus --- src/preload/index.ts | 3 +- src/renderer/src/hooks/useMCPServers.ts | 4 +- .../settings/MCPSettings/McpServerCard.tsx | 181 +++++++++++++ .../settings/MCPSettings/McpServersList.tsx | 249 +++++------------- .../settings/MCPSettings/McpSettings.tsx | 10 +- 5 files changed, 260 insertions(+), 187 deletions(-) create mode 100644 src/renderer/src/pages/settings/MCPSettings/McpServerCard.tsx diff --git a/src/preload/index.ts b/src/preload/index.ts index 9b46576476..9cf68543a8 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -295,7 +295,8 @@ const api = { return ipcRenderer.invoke(IpcChannel.Mcp_UploadDxt, buffer, file.name) }, abortTool: (callId: string) => ipcRenderer.invoke(IpcChannel.Mcp_AbortTool, callId), - getServerVersion: (server: MCPServer) => ipcRenderer.invoke(IpcChannel.Mcp_GetServerVersion, server) + getServerVersion: (server: MCPServer): Promise => + ipcRenderer.invoke(IpcChannel.Mcp_GetServerVersion, server) }, python: { execute: (script: string, context?: Record, timeout?: number) => diff --git a/src/renderer/src/hooks/useMCPServers.ts b/src/renderer/src/hooks/useMCPServers.ts index d1e58fabc4..c4f2815f45 100644 --- a/src/renderer/src/hooks/useMCPServers.ts +++ b/src/renderer/src/hooks/useMCPServers.ts @@ -1,6 +1,6 @@ import { createSelector } from '@reduxjs/toolkit' import NavigationService from '@renderer/services/NavigationService' -import store, { useAppDispatch, useAppSelector } from '@renderer/store' +import store, { RootState, useAppDispatch, useAppSelector } from '@renderer/store' import { addMCPServer, deleteMCPServer, setMCPServers, updateMCPServer } from '@renderer/store/mcp' import { MCPServer } from '@renderer/types' import { IpcChannel } from '@shared/IpcChannel' @@ -16,7 +16,7 @@ window.electron.ipcRenderer.on(IpcChannel.Mcp_AddServer, (_event, server: MCPSer NavigationService.navigate?.(`/settings/mcp/settings/${encodeURIComponent(server.id)}`) }) -const selectMcpServers = (state) => state.mcp.servers +const selectMcpServers = (state: RootState) => state.mcp.servers const selectActiveMcpServers = createSelector([selectMcpServers], (servers) => servers.filter((server) => server.isActive) ) diff --git a/src/renderer/src/pages/settings/MCPSettings/McpServerCard.tsx b/src/renderer/src/pages/settings/MCPSettings/McpServerCard.tsx new file mode 100644 index 0000000000..1f8d5822ba --- /dev/null +++ b/src/renderer/src/pages/settings/MCPSettings/McpServerCard.tsx @@ -0,0 +1,181 @@ +import { DeleteIcon } from '@renderer/components/Icons' +import { getMcpTypeLabel } from '@renderer/i18n/label' +import { MCPServer } from '@renderer/types' +import { Badge, Button, Switch, Tag } from 'antd' +import { Settings2, SquareArrowOutUpRight } from 'lucide-react' +import { FC } from 'react' +import styled from 'styled-components' + +interface McpServerCardProps { + server: MCPServer + version?: string | null + isLoading: boolean + onToggle: (active: boolean) => void + onDelete: () => void + onEdit: () => void + onOpenUrl: (url: string) => void +} + +const McpServerCard: FC = ({ + server, + version, + isLoading, + onToggle, + onDelete, + onEdit, + onOpenUrl +}) => { + const handleOpenUrl = (e: React.MouseEvent) => { + e.stopPropagation() + if (server.providerUrl) { + onOpenUrl(server.providerUrl) + } + } + + return ( + + + + {server.logoUrl && } + {server.name} + {version && } + {server.providerUrl && ( + - )} - - - - - e.stopPropagation()}> - handleToggleActive(server, checked)} - size="small" - /> -