Page 1 of 1

Wie übergeben Sie Daten von einem MCP -Client an einen MCP -Server in Java mit Spring AI?

Posted: 17 Aug 2025, 20:03
by Anonymous
Wie kann ich die API -Schlüssel vom MCP -Client in Spring AI an den MCP -Server übergeben, ohne ihn in die Eingabeaufforderung einzubeziehen? Ich habe versucht, den Tool -Kontext zu verwenden, aber es hat nicht funktioniert. Wenn dieses Problem mit dem Tool -Kontext gelöst werden kann, kann jemand teilen, wie das geht? Vielleicht war meine Implementierung falsch.

Code: Select all

chatClient
.prompt()
.system("""
System prompt.
""")
.user(requestDto.prompt())
.toolCallbacks(toolCallbackProvider.getToolCallbacks())
.toolContext(Map.of("apiKey", "test_key"))
.call()
.content()
< /code>
MCP-Server, auf dem ich den vom Client gesendeten API-Code lesen möchte: < /p>
@Tool(name = "tool name", description = "tool description")
public List getData(@ToolParam(description = "des") TimeRange timeRange,
ToolContext toolContext) {

}
Im obigen ToolContext kann ich nicht den API -Schlüssel abrufen. Aus diesem Grund habe ich die Schlussfolgerung gelangt, dass der Tool-Kontext nicht funktionierte, da ich den Schlüsselwert in der Karte, die ich vom Client habe, nicht sehen konnte.

Code: Select all

@Configuration
public class MCPConfig {
@Bean
public SyncMcpToolCallbackProvider toolCallbackProvider(List clients) {
return new SyncMcpToolCallbackProvider(clients);
}
}
< /code>
Im MCP-Servercode: < /p>
@Tool(name = "tool name", description = "tool description")
public List getData(@ToolParam(description = "des") PlayBackState playBackState,
ToolContext toolContext) {
String apiKey = toolContext.getContext().get("apiKey").toString();
}
Hier erhalte ich nullPoInterexception as .get ("apikey") kehrt null zurück.

Idealerweise hätte es den vom MCP -Client übergebenen Wert zurückgeben müssen. "test_key" ist der Wert, der vorhanden sein sollte.

Code: Select all

2025-06-22T20:09:21.463+05:30 TRACE 17000 --- [app-mcp-server] [nio-8081-exec-3] o.s.w.s.f.support.RouterFunctionMapping  : Mapped to io.modelcontextprotocol.server.transport.WebMvcSseServerTransportProvider$$Lambda/0x000001ba36662f38@b76b7d8
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"}}}
2025-06-22T20:09:21.463+05:30 DEBUG 17000 --- [app-mcp-server] [nio-8081-exec-3] i.m.spec.McpServerSession                : Received request: JSONRPCRequest[jsonrpc=2.0, method=tools/call, id=355f2a07-8, params={name=playback_controller, arguments={playBackState=PAUSE}}]
2025-06-22T20:09:21.463+05:30 DEBUG 17000 --- [app-mcp-server] [oundedElastic-1] o.s.ai.tool.method.MethodToolCallback    : Starting execution of tool: playback_controller
2025-06-22T20:09:59.228+05:30 DEBUG 17000 --- [app-mcp-server] [nio-8081-Poller] org.apache.tomcat.util.net.NioEndpoint   : timeout completed: keys processed=2; now=1750603199227; nextExpiration=1750603161517; keyCount=0; hasEvents=false; eval=false
2025-06-22T20:09:59.231+05:30 DEBUG 17000 --- [app-mcp-server] [oundedElastic-1] i.m.s.t.WebMvcSseServerTransportProvider : Message sent to session a3545270-ab97-4ede-882f-2bdccb36097a
2025-06-22T20:09:59.232+05:30 TRACE 17000 --- [app-mcp-server] [nio-8081-exec-3] o.s.web.servlet.DispatcherServlet        : No view rendering, null ModelAndView returned.
2025-06-22T20:09:59.232+05:30 DEBUG 17000 --- [app-mcp-server] [nio-8081-exec-3] o.s.web.servlet.DispatcherServlet        : Completed 200 OK, headers={}
2025-06-22T20:09:59.232+05:30 TRACE 17000 --- [app-mcp-server] [nio-8081-exec-3] o.s.b.w.s.f.OrderedRequestContextFilter  : Cleared thread-bound request context: org.apache.catalina.connector.RequestFacade@4cb31c2e
2025-06-22T20:09:59.232+05:30 DEBUG 17000 --- [app-mcp-server] [nio-8081-exec-3] o.a.coyote.http11.Http11InputBuffer      : Before fill(): parsingHeader: [true], parsingRequestLine: [true], parsingRequestLinePhase: [0], parsingRequestLineStart: [0], byteBuffer.position(): [0], byteBuffer.limit(): [0], end: [351]
Als ich mich mit syncmcptoolcallback in Paket org.springframework.ai.mcp :
angesehen habe

Code: Select all

public String call(String toolArguments, ToolContext toolContext) {
return this.call(toolArguments);
}
< /code>
ToolContext wird nicht verwendet. Nach meinem Verständnis wird der ToolContext < /code> im MCP -Client nicht über das Netzwerk übergeben.

Kann dies der Grund sein? Wenn ja, warum wird das so gemacht?{
"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.deferContextual ⇢ at io.modelcontextprotocol.spec.McpClientSession.sendRequest(McpClientSession.java:233)' (and no fallback has been configured)",
"instance": "/chat"
}