Клиент настроен на отправку запросов с токеном-носителем, который отлично работает для инструментов листинга:
McpSyncClient client = McpClientFactory.getInstance();
client.listTools();
Однако при вызове инструмента с помощью:
client.callTool(new McpSchema.CallToolRequest(toolName, params));
Я столкнулся с ошибкой: Контекст безопасности недействителен.
Похоже, проблема заключается в том, что сервер MCP делегирует выполнение инструмента потокуboundedElastic, который не распространяет SecurityContext исходного запроса. Контекст безопасности необходим на уровне инструмента для определения таких параметров, как идентификатор организации.
Что я пробовал:
- DelegatingSecurityContextAsyncTaskExecutor (не распространялось)
- DelegatingSecurityContextTaskExecutor (не распространялось)
- SecurityContextHolder.MODE_INHERITABLETHREADLOCAL (распространяется, но беспорядок для пула потоков)
- Замена WebMvcSseServerTransportProvider SDK на настраиваемого поставщика: так что я могу вручную установить контекст в новом потоке, но простое копирование класса SDK все равно изменило поведение и не удалось даже получить список инструментов, не говоря уже о его изменении.
@Bean
@Primary
public McpServerTransportProvider customWebMvcSseServerTransportProvider(){
return new CustomWebMvcSseServerTransportProvider(objectMapper, "/mcp/message");
}
Метод поставщика SDK, который ведет к потокуboundedElastic:
public Mono sendMessage(McpSchema.JSONRPCMessage message) {
return Mono.fromRunnable(() -> {
try {
String jsonText = WebMvcSseServerTransportProvider.this.objectMapper.writeValueAsString(message);
this.sseBuilder.id(this.sessionId).event("message").data(jsonText);
WebMvcSseServerTransportProvider.logger.debug("Message sent to session {}", this.sessionId);
} catch (Exception var3) {
Exception e = var3;
WebMvcSseServerTransportProvider.logger.error("Failed to send message to session {}: {}", this.sessionId, e.getMessage());
this.sseBuilder.error(e);
}
});
}
Вопрос:
Как обеспечить правильное распространение контекста безопасности в потокboundedElastic при вызове инструментов на сервере Spring AI MCP? Существует ли рекомендуемая конфигурация или способ решения этой проблемы?
Используемые зависимости:
Сервер:
org.springframework.ai
spring-ai-bom
1.0.0-SNAPSHOT
pom
import
org.springframework.ai
spring-ai-starter-mcp-server-webmvc
Клиент:
org.springframework.ai
spring-ai-bom
1.0.0-SNAPSHOT
pom
import
org.springframework.ai
spring-ai-starter-mcp-client
Подробнее здесь: https://stackoverflow.com/questions/796 ... mcp-server
Мобильная версия