Wie übergeben Sie Daten von einem MCP -Client an einen MCP -Server in Java mit Spring AI?
Posted: 17 Aug 2025, 20:03
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.
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.
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.
Als ich mich mit syncmcptoolcallback in Paket org.springframework.ai.mcp :
angesehen habe
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) {
}
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();
}
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]
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"
}