Установка
Предварительные требования
Docker Engine или Docker Desktop запущен
Команда запуска
docker run -d -p 8002:8002 `
--name 1c_syntaxcheck_mcp `
-e LICENSE_KEY=YOUR_LICENSE_KEY `
comol/1c_syntaxcheck_mcp:latestЭто всё! Сервер не требует дополнительной настройки.
На arm64-хосте
Стабильный образ публикуется только для linux/amd64 — upstream не выпускает arm64-бинарник анализатора, а анализатор обязан быть нативным. На Apple Silicon и ARM-серверах есть два пути:
# 1. Стабильный образ под эмуляцией
docker run -d -p 8002:8002 --platform linux/amd64 `
--name 1c_syntaxcheck_mcp `
-e LICENSE_KEY=YOUR_LICENSE_KEY `
comol/1c_syntaxcheck_mcp:latest
# 2. Нативный beta-образ
docker run -d -p 8002:8002 `
--name 1c_syntaxcheck_mcp `
-e LICENSE_KEY=YOUR_LICENSE_KEY `
comol/1c_syntaxcheck_mcp:arm64-betaПеременные окружения
LICENSE_KEY
Лицензионный ключ
Да
USESSE
SSE транспорт для legacy клиентов
Нет
FILES_DIR
Каталог BSL-файлов; включает инструмент syntaxcheck_file, если каталог существует
Нет
FULLINDEX
true (или 1, yes, on) включает режим полного индекса: содержимое FILES_DIR индексируется при старте, и UnresolvedMethodCall, UnresolvedField, QueryToMissingMetadata отвечают из индекса. Без смонтированного FILES_DIR индексировать нечего
Нет (пусто)
INDEX_DIR
Где хранится индекс. Этот путь образ объявляет томом, поэтому индекс переживает перезапуск и без явного -v
Нет (/index)
FULLINDEX_REINDEX_INTERVAL_SEC
Только для режима полного индекса: как долго готовый индекс не переспрашивают, то есть как быстро подхватывается изменение исходников после первой сборки. Отключить переиндексацию нельзя: 0, отрицательное значение и не-число читаются как значение по умолчанию, положительное ограничивается диапазоном 60…86400 секунд
Нет (3600)
PLUGINS_DIR
Каталог Python-плагинов; пустое значение использует /app/plugins
Нет
LOG_LEVEL
Уровень журналирования сервера и ошибок плагинов
Нет (INFO)
MCP_HTTP_PATH
Endpoint streamable-http
Нет (/mcp)
MCP_SSE_PATH
Endpoint потока событий в SSE-режиме
Нет (/sse)
MCP_MESSAGE_PATH
Endpoint отправки сообщений в SSE-режиме
Нет (/messages/)
BSL_ANALYZER_TIMEOUT_SECONDS
Таймаут запуска анализатора
Нет (30)
BSL_ANALYZER_STDOUT_LIMIT_BYTES
Максимальный размер сырого JSONL-отчёта анализатора до преобразования опубликованной текстовой части beta в TOON
Нет (16777216)
BSL_ANALYZER_STDERR_LIMIT_BYTES
Максимальный размер диагностического вывода анализатора
Нет (4194304)
BSL_ANALYZER_KILL_GRACE_SECONDS
Ожидание между terminate и принудительным kill
Нет (2)
BSL_ANALYZER_AUTO_UPDATE
Beta. Самообновление анализатора. Выключается значениями 0, false, no, off; любое другое значение и отсутствие переменной означают включено
Нет (включено)
BSL_ANALYZER_UPDATE_INTERVAL_SECONDS
Beta. Интервал между проверками новых версий. 0 — проверить один раз при старте и больше не проверять
Нет (86400)
BSL_ANALYZER_UPDATE_REPO
Beta. Откуда берётся анализатор: и список релизов, и загрузка следуют за этим значением (форк или зеркало)
Нет (itrous/bsl-analyzer)
BSL_ANALYZER_UPDATE_TIMEOUT_SECONDS
Beta. Бюджет одной проверки с учётом загрузки артефакта (около 70 МБ)
Нет (900)
GITHUB_TOKEN
Beta. Только для обхода ограничения частоты GitHub API; читаемый API публичен и токена не требует
Нет
BSL_SOURCE_ENCODING
Кодировка файлов из FILES_DIR; пустое значение пробует UTF-8 с BOM, затем CP1251
Нет
Режим полного индекса (beta)
По умолчанию сервер анализирует один модуль и не видит остальной конфигурации, поэтому три межмодульные проверки в нём выключены. FULLINDEX=true со смонтированным FILES_DIR индексирует каталог исходников при старте и отвечает на них из индекса:
Индексация 10156 модулей занимает около 8 минут; контейнер отвечает всё это время, а provenance.index в каждом ответе сообщает состояние — absent, building, ready или failed. Проверка файла стоит около 200 мс без индекса, около 190 с на первом вызове после ready и около 11 с на всех следующих. Подробности и оговорки — в описании сервера.
Плагины
Свой каталог плагинов можно подключить томом в /app/plugins. Инструмент plugin_state показывает текущий набор, а plugin_reload перечитывает его без перезапуска контейнера.
Плагин — один Python-файл: ни базового класса, ни декоратора, ни регистрации, ни манифеста. Объявлены четыре hooks — on_startup, on_request, on_diagnostics, on_result — и таблица SUPPRESSED_DIAGNOSTICS (код диагностики → причина, по которой она не попадает в отчёт). Все хуки call-scoped: сервер ничего не хранит между вызовами, поэтому здесь нет ни пересборок, ни отпечатков годности, ни курсоров.
Номера строк в payload хуков нулевые — публикуемая база применяется уже после хуков. Аргумент file_name присутствует в каждом запросе syntaxcheck (пустая строка, если вызывающая сторона его не задала); из-за его появления версия набора хуков этого сервера — HOOKS_VERSION = 2.
Полный контракт — в образе (/app/plugin_api.py, /app/plugins/AGENTS.md, /app/plugins/example.py). Общие правила и рецепты: Доработка MCP: система плагинов и справочник хуков SyntaxCheckServer.
SSE транспорт
При USESSE=true клиент подключается к http://localhost:8002/sse; /messages/ — служебный endpoint, который сообщает сам SSE-поток, его не указывают как URL сервера в конфигурации клиента.
Если ваш клиент требует SSE:
Проверка работы
Статус контейнера
Просмотр логов
Конфигурация Cursor
mcp.json для streamable-http
Для SSE укажите endpoint потока событий:
Управление контейнером
Устранение проблем
Контейнер не запускается
Порт занят
Если порт занят, используйте другой порт:
И измените порт в mcp.json: http://localhost:8102/mcp
Last updated