Как я могу передать ключ API от клиента MCP на сервер MCP в Spring AI, не включив его в приглашение? Я попытался использовать контекст инструментов, но он не работал. Если эта проблема может быть решена с помощью контекста инструмента, может ли кто -нибудь поделиться, как это сделать? Может быть, моя реализация была неверной. < /P>
Клиентский код MCP, где я хочу перенести ключ API от MCP Client к MCP-серверу: < /p>
chatClient
.prompt()
.system("""
System prompt.
""")
.user(requestDto.prompt())
.toolCallbacks(toolCallbackProvider.getToolCallbacks())
.toolContext(Map.of("apiKey", "test_key"))
.call()
.content()
< /code>
mcp-сервер, где я хочу прочитать код API, отправленный из клиента: < /p>
@Tool(name = "tool name", description = "tool description")
public List getData(@ToolParam(description = "des") TimeRange timeRange,
ToolContext toolContext) {
}
В приведенном выше ToolContext я не могу получить ключ API, который я отправляю от клиента.
В контексте карты Toolcontext
был только ключ «Exchange». Вот почему я пришел к выводу, что контекст инструментов не работал, так как я не смог увидеть значение ключа на карте, которую я передал от клиента.@Configuration
public class MCPConfig {
@Bean
public SyncMcpToolCallbackProvider toolCallbackProvider(List clients) {
return new SyncMcpToolCallbackProvider(clients);
}
}
< /code>
в коде сервера MCP: < /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();
}
Здесь я получаю nullpointerexception as .get ("apikey") возвращает null .
В идеале он должен был вернуть значение, передаваемое от клиента MCP; "test_key" - это значение, которое должно было присутствовать.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]
Когда я изучал Syncmcptoolcallback класс в пакете org.springframework.ai.mcp :
public String call(String toolArguments, ToolContext toolContext) {
return this.call(toolArguments);
}
< /code>
ToolContext не используется. Так что, по моему мнению, ToolContext < /code> не передается по сети в MCP Client.
может ли это быть причиной? Если это так, почему это делается так?{
"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"
}
Подробнее здесь: https://stackoverflow.com/questions/796 ... -spring-ai
Как перенести данные от клиента MCP на сервер MCP в Java с Spring AI? ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение