You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 02:34:56