先行一步
VMware 提供培训和认证,为您的进步加速。
了解更多模型上下文协议 (MCP) 是 Spring AI 中一个强大的功能,它使 AI 模型能够通过标准化接口访问外部工具和资源。MCP 的一个有趣能力是它能够在运行时动态更新可用工具。
本篇博客文章将探讨 Spring AI 如何在 MCP 中实现动态工具更新,从而为 AI 驱动的应用程序提供灵活性和可扩展性。
相关示例代码可在此处获取:动态工具更新示例
在深入探讨动态工具更新之前,让我们先了解 MCP 是什么以及它为何重要
模型上下文协议 (MCP) 是一个标准化接口,允许 AI 应用和 Agent 执行以下操作:访问外部工具 、检索资源 、使用提示模板 。
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 实现的一个关键见解是
提示:客户端实现依赖于以下事实:MCP 的 ToolCallbackProvider#getToolCallbacks 实现将始终从服务器检索当前 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 应用,这些应用可以根据运行时条件、用户需求和系统要求来发展其能力。