Контекст безопасности не распространяется при вызове инструментов на сервере Spring AI MCP ⇐ JAVA

Программисты JAVA общаются здесь
Anonymous
Контекст безопасности не распространяется при вызове инструментов на сервере Spring AI MCP

Сообщение Anonymous »

Я интегрирую приложение Spring Boot с сервером Spring AI MCP (spring-ai-starter-mcp-server-webmvc). Я тестирую его, используя другое приложение Spring Boot в качестве клиента, используя зависимость Spring-ai-starter-mcp-client.
Клиент настроен на отправку запросов с токеном-носителем, который отлично работает для инструментов листинга:
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

Вернуться в «JAVA»