From 7942df6a32a176fc855746c08eacc3d21bf905a3 Mon Sep 17 00:00:00 2001 From: BBQ Date: Fri, 13 Feb 2026 00:40:53 +0800 Subject: [PATCH] feat(web): implement bot MCP management page and remove global MCP page - Add bot-mcp.vue component with table, create/edit dialog, import/export - Wire MCP tab into bot detail page - Remove dead global MCP page, composable, and form component (/mcp route) - Add i18n keys for import/export/copy and MCP CRUD messages - Fix store/User.ts case sensitivity for Linux builds --- .../web/src/components/create-mcp/index.vue | 313 --------- packages/web/src/composables/api/useMcp.ts | 70 -- .../web/src/composables/useKeyValueTags.ts | 2 +- packages/web/src/i18n/locales/en.json | 20 +- packages/web/src/i18n/locales/zh.json | 20 +- .../web/src/pages/bots/components/bot-mcp.vue | 620 ++++++++++++++++++ packages/web/src/pages/bots/detail.vue | 3 +- packages/web/src/pages/mcp/index.vue | 106 --- packages/web/src/router.ts | 8 - 9 files changed, 659 insertions(+), 503 deletions(-) delete mode 100644 packages/web/src/components/create-mcp/index.vue delete mode 100644 packages/web/src/composables/api/useMcp.ts create mode 100644 packages/web/src/pages/bots/components/bot-mcp.vue delete mode 100644 packages/web/src/pages/mcp/index.vue diff --git a/packages/web/src/components/create-mcp/index.vue b/packages/web/src/components/create-mcp/index.vue deleted file mode 100644 index cbeea3ee..00000000 --- a/packages/web/src/components/create-mcp/index.vue +++ /dev/null @@ -1,313 +0,0 @@ - - - diff --git a/packages/web/src/composables/api/useMcp.ts b/packages/web/src/composables/api/useMcp.ts deleted file mode 100644 index a4bc35b2..00000000 --- a/packages/web/src/composables/api/useMcp.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { client } from '@memoh/sdk/client' -import { useQuery, useMutation, useQueryCache } from '@pinia/colada' - -// ---- Types ---- - -export interface MCPListItem { - id: string - type: string - name: string - config: { - cwd: string - env: Record - args: string[] - type: string - command: string - } - active: boolean - user: string - createdAt: string - updatedAt: string -} - -export interface CreateMcpRequest { - name: string - config: Record - active: boolean -} - -export interface UpdateMcpRequest extends CreateMcpRequest { - id?: string -} - -// ---- Query: MCP list ---- - -export function useMcpList() { - return useQuery({ - key: ['mcp'], - query: async () => { - const { data } = await client.get({ - url: '/mcp/', - throwOnError: true, - }) as { data: { items: MCPListItem[] } } - return data.items - }, - }) -} - -// ---- Mutations ---- - -export function useCreateOrUpdateMcp() { - const queryCache = useQueryCache() - return useMutation({ - mutation: (data: UpdateMcpRequest) => { - const isEdit = !!data.id - return isEdit - ? client.put({ url: `/mcp/${data.id}`, body: data, throwOnError: true }) - : client.post({ url: '/mcp/', body: data, throwOnError: true }) - }, - onSettled: () => queryCache.invalidateQueries({ key: ['mcp'] }), - }) -} - -export function useDeleteMcp() { - const queryCache = useQueryCache() - return useMutation({ - mutation: (id: string) => - client.delete({ url: `/mcp/${id}`, throwOnError: true }), - onSettled: () => queryCache.invalidateQueries({ key: ['mcp'] }), - }) -} diff --git a/packages/web/src/composables/useKeyValueTags.ts b/packages/web/src/composables/useKeyValueTags.ts index 89fdc82e..075ad660 100644 --- a/packages/web/src/composables/useKeyValueTags.ts +++ b/packages/web/src/composables/useKeyValueTags.ts @@ -1,7 +1,7 @@ import { ref } from 'vue' /** - * TagsInput key:value two-way conversion for add-platform config and create-mcp env. + * TagsInput key:value two-way conversion for platform config and MCP env/headers. * Input: string[] of "key:value"; output: Record via callback. */ export function useKeyValueTags() { diff --git a/packages/web/src/i18n/locales/en.json b/packages/web/src/i18n/locales/en.json index d7ed5d0f..0b703073 100644 --- a/packages/web/src/i18n/locales/en.json +++ b/packages/web/src/i18n/locales/en.json @@ -11,7 +11,11 @@ "loading": "Loading...", "operation": "Actions", "enable": "Enable", - "optional": "optional" + "optional": "optional", + "import": "Import", + "export": "Export", + "copy": "Copy", + "copied": "Copied to clipboard" }, "auth": { "welcome": "Welcome Back", @@ -167,7 +171,19 @@ "cwd": "Working Directory", "arguments": "Arguments", "env": "Environment" - } + }, + "empty": "No MCP servers configured yet.", + "deleteConfirm": "Are you sure you want to delete this MCP server?", + "loadFailed": "Failed to load MCP servers", + "saveFailed": "Failed to save MCP server", + "createSuccess": "MCP server created", + "updateSuccess": "MCP server updated", + "deleteSuccess": "MCP server deleted", + "deleteFailed": "Failed to delete MCP server", + "importHint": "Paste a standard mcpServers JSON configuration. Existing servers with the same name will be updated.", + "importSuccess": "MCP servers imported", + "importFailed": "Failed to import MCP servers", + "exportFailed": "Failed to export MCP servers" }, "home": { "title": "Home" diff --git a/packages/web/src/i18n/locales/zh.json b/packages/web/src/i18n/locales/zh.json index f4775d8e..9adaa33a 100644 --- a/packages/web/src/i18n/locales/zh.json +++ b/packages/web/src/i18n/locales/zh.json @@ -11,7 +11,11 @@ "loading": "加载中...", "operation": "操作", "enable": "启用", - "optional": "可选" + "optional": "可选", + "import": "导入", + "export": "导出", + "copy": "复制", + "copied": "已复制到剪贴板" }, "auth": { "welcome": "欢迎回来", @@ -167,7 +171,19 @@ "cwd": "工作目录", "arguments": "参数", "env": "环境变量" - } + }, + "empty": "暂未配置 MCP 服务器。", + "deleteConfirm": "确定要删除这个 MCP 服务器吗?", + "loadFailed": "加载 MCP 服务器列表失败", + "saveFailed": "保存 MCP 服务器失败", + "createSuccess": "MCP 服务器已创建", + "updateSuccess": "MCP 服务器已更新", + "deleteSuccess": "MCP 服务器已删除", + "deleteFailed": "删除 MCP 服务器失败", + "importHint": "粘贴标准 mcpServers JSON 配置。同名的服务器会被更新配置。", + "importSuccess": "MCP 服务器已导入", + "importFailed": "导入 MCP 服务器失败", + "exportFailed": "导出 MCP 服务器失败" }, "home": { "title": "首页" diff --git a/packages/web/src/pages/bots/components/bot-mcp.vue b/packages/web/src/pages/bots/components/bot-mcp.vue new file mode 100644 index 00000000..55ac3450 --- /dev/null +++ b/packages/web/src/pages/bots/components/bot-mcp.vue @@ -0,0 +1,620 @@ +