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

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

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

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

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

理解模型上下文协议

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

模型上下文协议 (MCP) 是一个标准化接口,允许 AI 应用和 Agent 执行以下操作:访问外部工具检索资源使用提示模板

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 Schema
  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 实现的一个关键见解是

提示:客户端实现依赖于以下事实:MCP 的 ToolCallbackProvider#getToolCallbacks 实现将始终从服务器检索当前 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 社区的所有近期活动。

查看全部