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

Программисты 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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