You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动