Class McpRootsBootstrapper

java.lang.Object
com.github._1c_syntax.bsl.languageserver.mcp.McpRootsBootstrapper

@Component @Profile("mcp") public class McpRootsBootstrapper extends Object
Проактивно запрашивает MCP-roots у клиента после первого tool-вызова.

Согласно MCP-спецификации сервер сам должен один раз дёрнуть roots/list после notifications/initialized, если клиент объявил roots-capability. Уведомление notifications/roots/list_changed — только для последующих изменений. Если клиент (например, Claude Code 2.1.178 на Windows) объявляет пустой набор и не шлёт list_changed, без проактивного запроса сервер не узнает об открытых workspace-folder'ах и все workspace-зависимые tools падают с «No registered workspace».

Spring AI 2.0 не предоставляет post-initialize hook, поэтому запрашиваем roots лениво: при первом получении McpSyncServerExchange в любом tool-вызове. Бутстрап однократный — попытка фиксируется флагом, повторных запросов не идёт. Уведомления roots/list_changed (если клиент их шлёт) продолжают обрабатываться штатно через McpRootsChangeConsumer.

  • Constructor Details

  • Method Details

    • bootstrapIfNeeded

      public void bootstrapIfNeeded(@Nullable McpSyncServerExchange exchange)
      При первом вызове запрашивает у клиента roots/list, если он объявил roots-capability, и передаёт ответ в McpRootsChangeConsumer. Повторные вызовы — no-op (включая случаи когда клиент не поддерживает roots или запрос упал с ошибкой).
      Parameters:
      exchange - exchange tool-вызова, через который выполняется запрос.