领先一步
VMware 提供培训和认证,助您加速进步。
了解更多模型上下文协议 (MCP) 是 Spring AI 中的一项强大功能,它使 AI 模型能够通过标准化接口访问外部工具和资源。MCP 的一项有趣功能是它能够在运行时动态更新可用工具。
这篇博客文章探讨了 Spring AI 如何在 MCP 中实现动态工具更新,为 AI 驱动的应用程序提供灵活性和可扩展性。
相关示例代码可在此处获取:动态工具更新示例
在深入探讨动态工具更新之前,让我们先了解一下 MCP 是什么以及它为何重要
模型上下文协议 (MCP) 是一个标准化接口,它允许 AI 应用程序和代理: 访问外部工具 、 检索资源 、 使用提示模板 。
MCP 遵循客户端-服务器架构: MCP 服务器 - 暴露工具、资源和提示; MCP 客户端 - 连接到服务器并使用其功能; AI 模型 - 通过这些客户端与世界交互
Spring AI 提供了 MCP 的全面实现,包括客户端和服务器组件,使得将 AI 能力集成到 Spring 应用程序中变得轻而易举。
MCP 的一个强大之处在于能够在运行时动态更新可用工具。这意味着
动态工具更新过程涉及多个组件协同工作
Spring AI 的 @Tool 注解使得将方法作为 MCP 工具暴露变得容易
public class MathTools {
@Tool(description = "Adds two numbers")
public int sumNumbers(int number1, int number2) {
return number1 + number2;
}
// ...
}
该框架自动
在服务器端,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);
}
};
}
}
在此示例中
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();
});
};
}
客户端注册一个监听器,每当服务器的可用工具发生变化时就会调用该监听器。这使得客户端能够
目前 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 中的动态工具更新支持多种强大的用例
您可以实现控制哪些 AI 功能可用的特性标志
if (featureFlags.isEnabled("advanced-math")) {
mcpSyncServer.addTool(advancedMathTools);
}
根据当前上下文或用户权限加载工具
if (userHasPermission(currentUser, "admin-tools")) {
mcpSyncServer.addTool(adminTools);
}
从基本工具开始,并根据需要添加更高级的功能
// 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);
}
});
实现一个插件系统,可以在运行时添加新功能
pluginRegistry.onPluginLoaded(plugin -> {
if (plugin.hasMcpTools()) {
mcpSyncServer.addTool(plugin.getMcpTools());
}
});
Spring AI 对模型上下文协议中动态工具更新的处理提供了一种在运行时扩展 AI 能力的机制。此功能使得 AI 应用程序更加灵活、可扩展和资源高效。
主要收获
标准化接口:MCP 提供了一种一致的方式,让 AI 模型与外部工具和资源进行交互。
动态更新:可以在运行时添加或移除工具,而无需重新启动应用程序。
自动发现:客户端可以检测可用工具的变化,并立即将其提供给 AI 模型。
简单 API:Spring AI 提供了一个简洁的、基于注解的 API 来定义和管理 MCP 工具。
通过利用 Spring AI 的 MCP 实现中的动态工具更新,开发人员可以创建更具适应性的 AI 应用程序,这些应用程序可以根据运行时条件、用户需求和系统要求演进其功能。