From 6590ac762dac883867d00342dce24e379adf9ed1 Mon Sep 17 00:00:00 2001 From: wanghanlin <1533525126@qq.com> Date: Fri, 14 Aug 2026 15:48:30 +0800 Subject: [PATCH] =?UTF-8?q?feat(role):=20=E5=AE=A2=E6=9C=8D=E8=A7=92?= =?UTF-8?q?=E8=89=B2=20MCP=20=E5=B7=A5=E5=85=B7=E6=8E=88=E6=9D=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修正 allowedMcpTools 空列表语义:仅无角色(null)回退为全部,空列表=严格禁止 - 三个对话入口区分「无角色」与「角色无授权」,无角色向后兼容允许全部 - 工具注册名引入 configId 命名空间(mcp__),避免跨 Server 同名工具冲突 - 新增 GET /mcp-server/tools 接口,返回按 Server 分组的可用工具清单 - 更新角色 MCP 授权后清理 AssistantApp ChatClient 缓存,改动即时生效 - listRoles 解析 allowed_mcp_tools JSONB 为 string[],避免 PGobject 原样返回 - 前端 RoleManager 新增「MCP 工具授权」区块,接入保存/脏检测/全部授权 --- frontend/src/api/mcp-server.ts | 1 + frontend/src/api/role.ts | 3 + frontend/src/types/models.ts | 2 + frontend/src/views/RoleManager.vue | 109 +++++++++++++++++- .../com/wok/supportbot/app/AssistantApp.java | 4 +- .../com/wok/supportbot/app/ChatContext.java | 2 +- .../supportbot/controller/AiController.java | 4 +- .../CustomerServiceRoleController.java | 5 + .../controller/McpServerConfigController.java | 49 ++++++++ .../controller/OpenApiController.java | 3 +- .../mcp/McpToolCallbackAdapter.java | 24 +++- .../service/CustomerServiceRoleService.java | 3 + 12 files changed, 200 insertions(+), 9 deletions(-) diff --git a/frontend/src/api/mcp-server.ts b/frontend/src/api/mcp-server.ts index 14f9f14..b098b67 100644 --- a/frontend/src/api/mcp-server.ts +++ b/frontend/src/api/mcp-server.ts @@ -9,3 +9,4 @@ export function deleteMcpServer(id: string): Promise { return reque export function toggleMcpServer(id: string, active: boolean): Promise { return request.put(`/mcp-server/${id}/toggle?active=${active}`).then(r => r.data) } export function testMcpServer(id: string): Promise { return request.post(`/mcp-server/${id}/test`, {}).then(r => r.data) } export function refreshMcpServers(): Promise { return request.post('/mcp-server/refresh', {}).then(r => r.data) } +export function listAvailableMcpTools(): Promise { return request.get('/mcp-server/tools').then(r => r.data) } diff --git a/frontend/src/api/role.ts b/frontend/src/api/role.ts index 5351cdb..d37b9e2 100644 --- a/frontend/src/api/role.ts +++ b/frontend/src/api/role.ts @@ -9,3 +9,6 @@ export function deleteRole(roleId: string): Promise { return reques export function updateRoleCategories(roleId: string, categoryIds: string[]): Promise { return request.put(`/role/${roleId}/categories`, { categoryIds }).then(r => r.data) } +export function updateRoleMcpTools(roleId: string, allowedMcpTools: string[]): Promise { + return request.put(`/role/${roleId}/mcp-tools`, { allowedMcpTools }).then(r => r.data) +} diff --git a/frontend/src/types/models.ts b/frontend/src/types/models.ts index 96a03da..e6dbaad 100644 --- a/frontend/src/types/models.ts +++ b/frontend/src/types/models.ts @@ -150,8 +150,10 @@ export interface SupportRole { id: string name: string description?: string + prompt?: string systemPrompt?: string categoryIds?: string[] + allowedMcpTools?: string[] enabled: boolean createTime?: string updateTime?: string diff --git a/frontend/src/views/RoleManager.vue b/frontend/src/views/RoleManager.vue index a14685e..a2dbeee 100644 --- a/frontend/src/views/RoleManager.vue +++ b/frontend/src/views/RoleManager.vue @@ -115,6 +115,40 @@ 暂无知识库分类,请先在知识库管理中创建分类 + + +
+ + 全部授权(允许调用所有已接入的 MCP 工具) + + + +
+
{{ s.serverName }}
+ + {{ t.rawName }} + — {{ t.description }} + +
+
+ + 暂无已接入的 MCP 工具,请先在「MCP 服务管理」中配置并启用 Server + +
+
+