Spring AI 的模型上下文协议中的动态工具更新

工程 | Christian Tzolov | 2025 年 5 月 4 日 | ...

模型上下文协议 (MCP) 是 Spring AI 中的一项强大功能,它使 AI 模型能够通过标准化接口访问外部工具和资源。MCP 的一项有趣功能是它能够在运行时动态更新可用工具。

这篇博客文章探讨了 Spring AI 如何在 MCP 中实现动态工具更新,为 AI 驱动的应用程序提供灵活性和可扩展性。

相关示例代码可在此处获取:动态工具更新示例

理解模型上下文协议

在深入探讨动态工具更新之前,让我们先了解一下 MCP 是什么以及它为何重要

模型上下文协议 (MCP) 是一个标准化接口,它允许 AI 应用程序和代理: 访问外部工具检索资源使用提示模板

MCP 遵循客户端-服务器架构MCP 服务器 - 暴露工具、资源和提示; MCP 客户端 - 连接到服务器并使用其功能; AI 模型 - 通过这些客户端与世界交互

Spring AI 提供了 MCP 的全面实现,包括客户端服务器组件,使得将 AI 能力集成到 Spring 应用程序中变得轻而易举。

动态工具更新功能

MCP 的一个强大之处在于能够在运行时动态更新可用工具。这意味着

  • MCP 服务器可以添加或移除工具而无需重启
  • MCP 客户端可以检测这些更改
  • AI 模型可以立即使用新功能

动态工具更新的工作原理

动态工具更新过程涉及多个组件协同工作

服务器端实现

Spring AI 的 @Tool 注解使得将方法作为 MCP 工具暴露变得容易

public class MathTools {

    @Tool(description = "Adds two numbers")
    public int sumNumbers(int number1, int number2) {
        return number1 + number2;
    }

    // ...
}

该框架自动

  1. 将方法参数提取为工具输入
  2. 生成适当的 JSON 模式
  3. 处理参数验证和转换

在服务器端,Spring AI 的 MCP 实现提供了一种直接的方式来在启动时和运行时动态添加 MCP 工具

@SpringBootApplication
public class ServerApplication {

    //1. Tools added at start time by the Spring AI MCP Server Boot starter
    @Bean
    public ToolCallbackProvider weatherTools(WeatherService weatherService) {
        return MethodToolCallbackProvider.builder().toolObjects(weatherService).build();
    }

    //2. Runtime tool addition
    @Bean
    public CommandLineRunner commandRunner(McpSyncServer mcpSyncServer) {
        return args -> {

            // Wait for some tool update signal

            // Add math tools dynamically
            List<SyncToolSpecification> newTools = McpToolUtils
                    .toSyncToolSpecifications(ToolCallbacks.from(new MathTools()));

            for (SyncToolSpecification newTool : newTools) {
				mcpSyncServer.addTool(newTool);
			}
        };
    }
}

在此示例中

  1. 服务器最初只暴露天气预报工具
  2. 当收到自定义工具更新信号时,使用 McpSyncServer.addTool() 方法动态注册新工具

McpSyncServer 类提供了工具管理方法

  • addTool(SyncToolSpecification) - 添加新工具
  • removeTool(String) - 按名称移除工具
  • notifyToolsListChanged() - 通知客户端工具更改

注意: 您只能在客户端/服务器连接初始化后添加和/或移除工具。

客户端实现

MCP 协议包含一个通知系统,允许服务器告知客户端可用工具的更改。此通知系统确保客户端始终拥有服务器能力的最新视图。

在客户端,Spring AI 提供了检测和响应工具更改的机制

@Bean
McpSyncClientCustomizer customizeMcpClient() {
    return (name, mcpClientSpec) -> {
        mcpClientSpec.toolsChangeConsumer(tv -> {
            logger.info("\nMCP TOOLS CHANGE: " + tv);
            latch.countDown();
        });
    };
}

客户端注册一个监听器,每当服务器的可用工具发生变化时就会调用该监听器。这使得客户端能够

  1. 在添加或移除工具时收到通知
  2. 相应地更新其内部状态
  3. 使新工具立即对 AI 模型可用

目前 Spring AI 不维护有关更新工具的内部状态,但您可以使用自定义监听器来实现智能工具缓存或类似功能。

工具发现与使用

客户端可以随时发现可用工具

List<ToolDescription> toolDescriptions = chatClientBuilder.build()
        .prompt("What tools are available?")
        .toolCallbacks(tools)
        .call()
        .entity(new ParameterizedTypeReference<List<ToolDescription>>() {});

Spring AI MCP 实现的一个关键洞察是

提示:客户端实现依赖于 ToolCallbackProvider#getToolCallbacks 对于 MCP 的实现总是从服务器检索当前 MCP 工具列表这一事实。

这意味着无论何时客户端请求可用工具,它都将始终从服务器获取最新列表,而无需重启或重新初始化客户端。

实际应用

MCP 中的动态工具更新支持多种强大的用例

1. AI 功能的特性标志

您可以实现控制哪些 AI 功能可用的特性标志

if (featureFlags.isEnabled("advanced-math")) {
    mcpSyncServer.addTool(advancedMathTools);
}

2. 上下文感知工具加载

根据当前上下文或用户权限加载工具

if (userHasPermission(currentUser, "admin-tools")) {
    mcpSyncServer.addTool(adminTools);
}

3. 渐进式增强

从基本工具开始,并根据需要添加更高级的功能

// Start with basic tools
mcpSyncServer.addTool(basicTools);

// Add advanced tools when the user reaches a certain level
userService.onUserLevelUp(user -> {
    if (user.getLevel() >= 5) {
        mcpSyncServer.addTool(advancedTools);
    }
});

4. 动态插件架构

实现一个插件系统,可以在运行时添加新功能

pluginRegistry.onPluginLoaded(plugin -> {
    if (plugin.hasMcpTools()) {
        mcpSyncServer.addTool(plugin.getMcpTools());
    }
});

结论

Spring AI 对模型上下文协议中动态工具更新的处理提供了一种在运行时扩展 AI 能力的机制。此功能使得 AI 应用程序更加灵活、可扩展和资源高效。

主要收获

  1. 标准化接口:MCP 提供了一种一致的方式,让 AI 模型与外部工具和资源进行交互。

  2. 动态更新:可以在运行时添加或移除工具,而无需重新启动应用程序。

  3. 自动发现:客户端可以检测可用工具的变化,并立即将其提供给 AI 模型。

  4. 简单 API:Spring AI 提供了一个简洁的、基于注解的 API 来定义和管理 MCP 工具。

通过利用 Spring AI 的 MCP 实现中的动态工具更新,开发人员可以创建更具适应性的 AI 应用程序,这些应用程序可以根据运行时条件、用户需求和系统要求演进其功能。

资源

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,助您加速进步。

了解更多

获得支持

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件,只需一份简单的订阅。

了解更多

即将举行的活动

查看 Spring 社区所有即将举行的活动。

查看所有