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" - /> -