diff --git a/src/renderer/src/i18n/locales/en-us.json b/src/renderer/src/i18n/locales/en-us.json index 4dd64a6a..fcb5d9a4 100644 --- a/src/renderer/src/i18n/locales/en-us.json +++ b/src/renderer/src/i18n/locales/en-us.json @@ -1027,7 +1027,9 @@ "inputSchema": "Input Schema", "availableTools": "Available Tools", "noToolsAvailable": "No tools available" - } + }, + "deleteServer": "Delete Server", + "deleteServerConfirm": "Are you sure you want to delete this server?" }, "messages.divider": "Show divider between messages", "messages.grid_columns": "Message grid display columns", diff --git a/src/renderer/src/i18n/locales/ja-jp.json b/src/renderer/src/i18n/locales/ja-jp.json index f43948ad..6d752f08 100644 --- a/src/renderer/src/i18n/locales/ja-jp.json +++ b/src/renderer/src/i18n/locales/ja-jp.json @@ -1026,7 +1026,9 @@ "inputSchema": "入力スキーマ", "availableTools": "利用可能なツール", "noToolsAvailable": "利用可能なツールはありません" - } + }, + "deleteServer": "サーバーを削除", + "deleteServerConfirm": "このサーバーを削除してもよろしいですか?" }, "messages.divider": "メッセージ間に区切り線を表示", "messages.grid_columns": "メッセージグリッドの表示列数", diff --git a/src/renderer/src/i18n/locales/ru-ru.json b/src/renderer/src/i18n/locales/ru-ru.json index 770a3a2c..de6d5d82 100644 --- a/src/renderer/src/i18n/locales/ru-ru.json +++ b/src/renderer/src/i18n/locales/ru-ru.json @@ -1026,7 +1026,9 @@ "inputSchema": "входные параметры", "availableTools": "доступные инструменты", "noToolsAvailable": "нет доступных инструментов" - } + }, + "deleteServer": "Удалить сервер", + "deleteServerConfirm": "Вы уверены, что хотите удалить этот сервер?" }, "messages.divider": "Показывать разделитель между сообщениями", "messages.grid_columns": "Количество столбцов сетки сообщений", diff --git a/src/renderer/src/i18n/locales/zh-cn.json b/src/renderer/src/i18n/locales/zh-cn.json index 9ee6d033..cd7d6815 100644 --- a/src/renderer/src/i18n/locales/zh-cn.json +++ b/src/renderer/src/i18n/locales/zh-cn.json @@ -1027,7 +1027,9 @@ "inputSchema": "输入参数", "availableTools": "可用工具", "noToolsAvailable": "没有可用工具" - } + }, + "deleteServer": "删除服务器", + "deleteServerConfirm": "确定要删除此服务器吗?" }, "messages.divider": "消息分割线", "messages.grid_columns": "消息网格展示列数", diff --git a/src/renderer/src/i18n/locales/zh-tw.json b/src/renderer/src/i18n/locales/zh-tw.json index 73f50223..54b4f546 100644 --- a/src/renderer/src/i18n/locales/zh-tw.json +++ b/src/renderer/src/i18n/locales/zh-tw.json @@ -1026,7 +1026,9 @@ "inputSchema": "輸入參數", "availableTools": "可用工具", "noToolsAvailable": "沒有可用工具" - } + }, + "deleteServer": "刪除伺服器", + "deleteServerConfirm": "確定要刪除此伺服器嗎?" }, "messages.divider": "訊息間顯示分隔線", "messages.grid_columns": "訊息網格展示列數", diff --git a/src/renderer/src/pages/settings/MCPSettings/McpSettings.tsx b/src/renderer/src/pages/settings/MCPSettings/McpSettings.tsx index 741fe220..f77c3dd4 100644 --- a/src/renderer/src/pages/settings/MCPSettings/McpSettings.tsx +++ b/src/renderer/src/pages/settings/MCPSettings/McpSettings.tsx @@ -1,3 +1,4 @@ +import { DeleteOutlined, SaveOutlined } from '@ant-design/icons' import { useMCPServers } from '@renderer/hooks/useMCPServers' import { MCPServer, MCPTool } from '@renderer/types' import { Button, Flex, Form, Input, Radio, Switch } from 'antd' @@ -159,9 +160,16 @@ const McpSettings: React.FC = ({ server }) => { const onDeleteMcpServer = useCallback( async (server: MCPServer) => { try { - await window.api.mcp.removeServer(server) - deleteMCPServer(server.id) - window.message.success({ content: t('settings.mcp.deleteSuccess'), key: 'mcp-list' }) + window.modal.confirm({ + title: t('settings.mcp.deleteServer'), + content: t('settings.mcp.deleteServerConfirm'), + centered: true, + onOk: async () => { + await window.api.mcp.removeServer(server) + deleteMCPServer(server.id) + window.message.success({ content: t('settings.mcp.deleteSuccess'), key: 'mcp-list' }) + } + }) } catch (error: any) { window.message.error({ content: `${t('settings.mcp.deleteError')}: ${error.message}`, @@ -214,7 +222,10 @@ const McpSettings: React.FC = ({ server }) => { - {server?.name} + + {server?.name} + - @@ -288,7 +296,6 @@ const McpSettings: React.FC = ({ server }) => { )} - {server.isActive && } diff --git a/src/renderer/src/pages/settings/MCPSettings/NpxSearch.tsx b/src/renderer/src/pages/settings/MCPSettings/NpxSearch.tsx index 12c1a6b1..ad07e8e7 100644 --- a/src/renderer/src/pages/settings/MCPSettings/NpxSearch.tsx +++ b/src/renderer/src/pages/settings/MCPSettings/NpxSearch.tsx @@ -39,8 +39,10 @@ const NpxSearch: FC = () => { _searchResults = searchResults // Add new function to handle npm scope search - const handleNpmSearch = async () => { - if (!npmScope.trim()) { + const handleNpmSearch = async (scopeOverride?: string) => { + const searchScope = scopeOverride || npmScope + console.log('handleNpmSearch', searchScope) + if (!searchScope.trim()) { window.message.warning({ content: t('settings.mcp.npx_list.scope_required'), key: 'mcp-npx-scope-required' }) return } @@ -53,7 +55,7 @@ const NpxSearch: FC = () => { try { // Call npxFinder to search for packages - const packages = await npxFinder(npmScope) + const packages = await npxFinder(searchScope) // Map the packages to our desired format const formattedResults = packages.map((pkg) => { @@ -74,6 +76,8 @@ const NpxSearch: FC = () => { window.message.info({ content: t('settings.mcp.npx_list.no_packages'), key: 'mcp-npx-no-packages' }) } } catch (error: unknown) { + setSearchResults([]) + _searchResults = [] if (error instanceof Error) { window.message.error({ content: `${t('settings.mcp.npx_list.search_error')}: ${error.message}`, @@ -101,9 +105,9 @@ const NpxSearch: FC = () => { placeholder={t('settings.mcp.npx_list.scope_placeholder')} value={npmScope} onChange={(e) => setNpmScope(e.target.value)} - onPressEnter={handleNpmSearch} + onPressEnter={() => handleNpmSearch(npmScope)} /> - @@ -112,10 +116,8 @@ const NpxSearch: FC = () => { { - if (!searchLoading) { - setNpmScope(scope) - setTimeout(handleNpmSearch, 100) - } + setNpmScope(scope) + handleNpmSearch(scope) }} style={{ cursor: searchLoading ? 'not-allowed' : 'pointer' }}> {scope}