工具名称前缀生成
MCP客户端启动器通过McpToolNamePrefixGenerator接口支持可自定义的工具名称前缀生成。此功能通过为工具名称添加唯一前缀,有助于在集成来自多个MCP服务器的工具时避免命名冲突。
默认情况下,如果未提供自定义的McpToolNamePrefixGenerator bean,启动器将使用DefaultMcpToolNamePrefixGenerator,以确保所有MCP客户端连接中的工具名称都是唯一的。默认生成器:
跟踪所有现有连接和工具名称,以确保唯一性
通过用下划线替换非字母数字字符来格式化工具名称(例如,my-tool变为my_tool)
当在不同连接中检测到重复的工具名称时,会添加一个计数器前缀(例如,alt_1_toolName、alt_2_toolName)
它是线程安全的,并且保持幂等性——相同的(客户端、服务器、工具)组合总是会得到相同的唯一名称
确保最终名称不超过64个字符(如有必要,从开头截断)
例如:* 首次出现工具搜索 → 搜索 * 从不同连接中第二次出现工具搜索 → alt_1_search * 带有特殊字符的工具 my-special-tool → my_special_tool
你可以通过提供自己的实现来定制此行为:
@Componentpublic class CustomToolNamePrefixGenerator implements McpToolNamePrefixGenerator { @Override public String prefixedToolName(McpConnectionInfo connectionInfo, Tool tool) { // Custom logic to generate prefixed tool names // Example: Use server name and version as prefix String serverName = connectionInfo.initializeResult().serverInfo().name(); String serverVersion = connectionInfo.initializeResult().serverInfo().version(); return serverName + "_v" + serverVersion.replace(".", "_") + "_" + tool.name(); }}
McpConnectionInfo 记录提供了有关 MCP 连接的全面信息:
clientCapabilities - MCP客户端的能力
clientInfo - 关于MCP客户端的信息(名称、标题和版本)
initializeResult - 来自MCP服务器的初始化结果,包括服务器信息
内置前缀生成器
该框架提供了多个内置的前缀生成器:
DefaultMcpToolNamePrefixGenerator - 通过跟踪重复项并在需要时添加计数器前缀来确保工具名称的唯一性(如果未提供自定义Bean,则默认使用此工具)
McpToolNamePrefixGenerator.noPrefix() - 返回不带任何前缀的工具名称(如果多个服务器提供的工具名称相同,可能会引起冲突)
要完全禁用前缀并使用原始工具名称(如果使用多个MCP服务器,则不建议这样做),请将无前缀生成器注册为Bean:
@Configurationpublic classMcpConfiguration{ @Bean public McpToolNamePrefixGenerator mcpToolNamePrefixGenerator() { return McpToolNamePrefixGenerator.noPrefix(); }}
前缀生成器通过Spring的ObjectProvider机制自动检测并应用于同步和异步的MCP工具回调提供者。如果未提供自定义生成器Bean,则会自动使用DefaultMcpToolNamePrefixGenerator。
当在多个MCP服务器上使用McpToolNamePrefixGenerator.noPrefix()方法时,如果工具名称重复,将引发IllegalStateException异常。默认的DefaultMcpToolNamePrefixGenerator会通过为重复的工具名称自动添加唯一前缀来防止这种情况发生。
MCP元转换器工具上下文
MCP客户端引导启动器支持通过ToolContextToMcpMetaConverter接口,将Spring AI的ToolContext可定制地转换为MCP工具调用元数据。此功能允许您将额外的上下文信息(例如用户ID、秘密令牌)作为元数据与大型语言模型(LLM)生成的调用参数一起传递。
例如,您可以将MCP的progressToken传递到工具上下文的MCP进度流中,以跟踪长时间运行的操作的进度:
ChatModel chatModel = ...String response = ChatClient.create(chatModel) .prompt("Tell me more about the customer with ID 42") .toolContext(Map.of("progressToken", "my-progress-token")) .call() .content();
默认情况下,如果没有提供自定义转换器Bean,启动器将使用ToolContextToMcpMetaConverter.defaultConverter(),该方法:
你可以通过提供自己的实现来定制此行为:
@Componentpublic class CustomToolContextToMcpMetaConverter implements ToolContextToMcpMetaConverter { @Override public Map<String, Object> convert(ToolContext toolContext) { if (toolContext == null || toolContext.getContext() == null) { return Map.of(); } // Custom logic to convert tool context to MCP metadata Map<String, Object> metadata = new HashMap<>(); // Example: Add custom prefix to all keys for (Map.Entry<String, Object> entry : toolContext.getContext().entrySet()) { if (entry.getValue() != null) { metadata.put("app_" + entry.getKey(), entry.getValue()); } } // Example: Add additional metadata metadata.put("timestamp", System.currentTimeMillis()); metadata.put("source", "spring-ai"); return metadata; }}
内置转换器
该框架提供了内置的转换器:
要完全禁用上下文到元数据的转换:
@Configurationpublic classMcpConfiguration{ @Bean public ToolContextToMcpMetaConverter toolContextToMcpMetaConverter() { return ToolContextToMcpMetaConverter.noOp(); }}
通过Spring的ObjectProvider机制,转换器将被自动检测并应用于同步和异步的MCP工具回调。如果未提供自定义转换器Bean,则将自动使用默认转换器。
禁用MCP工具回调自动配置
MCP ToolCallback 的自动配置功能默认已启用,但可以通过设置 spring.ai.mcp.client.toolcallback.enabled=false 属性来禁用。
当禁用时,不会从可用的MCP工具中创建ToolCallbackProvider bean。