如何基于Spring AI + MCP Client实现工具/模块启用/禁用功能
基于Spring AI与MCP Client实现模块/工具禁用功能的实现建议
需求明确
- 复刻Cloud Desktop的核心能力:支持全局禁用MCP Server模块,或仅禁用其中特定工具
- 已规划通过REST API提供「查看活跃工具」「执行停用操作」的入口
一、先理清Spring中MCP Client的核心运作逻辑
- MCP Client在Spring生态中以Bean实例形式存在,通过自动装配或配置类注入,负责与MCP Server建立连接、转发工具调用请求、接收执行结果
- 每个MCP工具对应Client内部的一个工具代理类/配置项,Client会维护已注册工具的列表,以及与Server的实时连接状态
二、核心实现方案
1. 全局禁用MCP Server模块
方案一:配置开关控制Bean初始化
- 在
application.yml中添加开关配置:mcp: client: enabled: true # true启用,false禁用 - 自定义配置类,用
@ConditionalOnProperty控制MCP Client Bean的创建:@Configuration @ConditionalOnProperty(name = "mcp.client.enabled", havingValue = "true", matchIfMissing = true) public class McpClientAutoConfig { // 此处编写MCP Client Bean的配置代码 } - REST API中提供修改配置的接口,结合
@RefreshScope实现配置热刷新,无需重启应用
方案二:运行时动态禁用
- 在MCP Client实例中扩展
disable()方法,用于断开与Server的连接、清空本地工具缓存 - 维护全局状态标记(如
AtomicBoolean isMcpEnabled),所有工具调用请求先校验该标记,若禁用则直接返回错误 - 通过REST API触发该禁用逻辑,同时可提供恢复接口
2. 禁用特定工具
步骤1:维护工具状态注册表
- 创建
McpToolRegistry组件,存储工具的唯一标识(ID/名称)和启用状态:@Component public class McpToolRegistry { private final Map<String, Boolean> toolStatusMap = new ConcurrentHashMap<>(); // 初始化时从MCP Client加载所有工具,默认设为启用 @PostConstruct public void init(McpClient mcpClient) { List<String> toolIds = mcpClient.getRegisteredToolIds(); toolIds.forEach(id -> toolStatusMap.put(id, true)); } public boolean isToolEnabled(String toolId) { return toolStatusMap.getOrDefault(toolId, true); } public void disableTool(String toolId) { toolStatusMap.put(toolId, false); } public void enableTool(String toolId) { toolStatusMap.put(toolId, true); } }
步骤2:拦截工具调用请求
- 封装MCP Client为代理类,在调用工具前校验状态:
@Component public class McpToolInvocationProxy { private final McpClient mcpClient; private final McpToolRegistry toolRegistry; public McpToolInvocationProxy(McpClient mcpClient, McpToolRegistry toolRegistry) { this.mcpClient = mcpClient; this.toolRegistry = toolRegistry; } public Object invokeTool(String toolId, Map<String, Object> params) { if (!toolRegistry.isToolEnabled(toolId)) { throw new IllegalStateException("工具[" + toolId + "]已被禁用"); } return mcpClient.invokeTool(toolId, params); } }
步骤3:实现REST API接口
- 查看活跃工具:
GET /api/mcp/tools,返回所有工具的ID、名称和启用状态 - 禁用特定工具:
PUT /api/mcp/tools/{toolId}/disable,调用McpToolRegistry的disableTool方法 - 启用特定工具:
PUT /api/mcp/tools/{toolId}/enable,调用McpToolRegistry的enableTool方法
三、额外注意事项
- 状态持久化:若需重启应用后保留禁用状态,可将工具状态存储到数据库或配置中心
- 权限控制:给REST API添加权限校验,确保仅授权用户能执行禁用操作
- 异常处理:禁用后需返回清晰的错误信息,避免无意义的MCP Server连接尝试
内容的提问来源于stack exchange,提问作者Isael Sousa
相关产品推荐
相关产品推荐

