Spring AI中MCP客户端向服务端传递API Key失败(Tool Context未生效)问题排查与解决咨询
Spring AI中MCP客户端向服务端传递API Key失败(Tool Context未生效)问题排查与解决咨询
最近在搞Spring AI的MCP(模型上下文协议)的时候碰到个头疼的问题:想在不把API Key塞进prompt的前提下,从MCP客户端把API Key传到服务端,试了用Tool Context但完全没生效,怀疑是自己的实现有问题,来请教下各位怎么解决。
我的实现代码
MCP客户端代码
chatClient .prompt() .system(""" System prompt. """) .user(requestDto.prompt()) .toolCallbacks(toolCallbackProvider.getToolCallbacks()) .toolContext(Map.of("apiKey", "test_key")) .call() .content()
MCP客户端配置
@Configuration public class MCPConfig { @Bean public SyncMcpToolCallbackProvider toolCallbackProvider(List<McpSyncClient> clients) { return new SyncMcpToolCallbackProvider(clients); } }
MCP服务端工具代码
@Tool(name = "tool name", description = "tool description") public List<Data> getData(@ToolParam(description = "des") PlayBackState playBackState, ToolContext toolContext) { String apiKey = toolContext.getContext().get("apiKey").toString(); }
遇到的问题
- 服务端的
ToolContext里根本拿不到客户端传的apiKey,整个上下文Map里只有一个exchange键,调用时直接抛出空指针异常 - 查看服务端日志,发现收到的
tools/call请求参数里完全没有携带我在客户端设置的Tool Context内容:
2025-06-22T20:09:21.463+05:30 DEBUG 17000 --- [app-mcp-server] [nio-8081-exec-3] io.modelcontextprotocol.spec.McpSchema : Received JSON message: {"jsonrpc":"2.0","method":"tools/call","id":"355f2a07-8","params":{"name":"playback_controller","arguments":{"playBackState":"PAUSE"}}}
我的排查发现
我翻了Spring AI的SyncMcpToolCallback类(包路径org.springframework.ai.mcp)的源码,发现它的call方法虽然接收了ToolContext参数,但实际根本没用到,直接调用了无参的call方法:
public String call(String toolArguments, ToolContext toolContext) { return this.call(toolArguments); }
这是不是意味着客户端设置的Tool Context根本没被封装到网络请求里?如果是这样的话,为什么框架要这么设计呢?
客户端收到的错误响应
{ "type": "about:blank", "title": "Bad Request", "status": 400, "detail": "java.util.concurrent.TimeoutException: Did not observe any item or terminal signal within 30000ms in 'Mono.def" }
想请教下大家:如果这个问题确实可以用Tool Context解决,能不能分享下正确的实现方式?或者有没有其他安全的方法,可以在MCP客户端和服务端之间传递API Key这类敏感信息?
内容来源于stack exchange




