Перейти к содержимому
Elemctl
Русский
Esc
navigateopen⌘Jpreview
На этой странице

MCP-сервер и редакторы

Работа с elemctl из ИИ-агента по MCP, плюс плагины и расширение VS Code.

MCP-сервер

Сервер отдаёт операции платформы как MCP-инструменты (транспорт stdio):

pip install "elemctl[mcp]"
claude mcp add elemctl -- elemctl mcp

Реквизиты подключения сервер берёт из тех же переменных ELEMENT_* / .env.

Инструменты

Инструмент Что делает
list_apps список приложений; name фильтрует по подстроке имени на клиенте, brief (по умолчанию) оставляет от карточки id, имя, статус, uri и применённую версию
find_app найти приложение по точному имени: id и признак found; удалённые пропускаются, если не задан include_deleted
get_app карточка приложения: статус, uri, фактическая версия проекта
create_app создать приложение; по одному project_id источником берётся последняя сборка проекта. В ответе sign-in – способ войти
ensure_app создать приложение по имени, только если его ещё нет; существующее не пересоздаётся (created: false)
start_app запустить приложение
stop_app остановить приложение
delete_app удалить приложение. НЕОБРАТИМО: данные теряются, а пересозданное получит другой URL
list_app_tasks задачи приложений; app_id – необязательный фильтр
debug_info данные сессии отладки: debug-token и debug-address (нужна включённая отладка на сервере)
list_spaces список пространств
list_projects список проектов; name фильтрует по подстроке имени на клиенте, удалённые скрыты, пока не задан include_deleted; brief (по умолчанию) – id, имя, вид проекта, пространство, счётчик приложений, признак удаления
list_builds список сборок проекта, свежие первыми; limit (по умолчанию 10, 0 – все), brief (по умолчанию) оставляет ид, версии, дату, ветку и коммит
build_assembly локально собрать архив .xasm/.xlib из исходников (к платформе не обращается)
inspect_assembly разобрать готовый архив: манифест, свойства проекта, подсистемы и глобальные типы с полными именами (локально)
deploy полный цикл из исходников с честной проверкой применения; итог – поле ok, детали – problems и log
probe проверить компиляцию серверным компилятором, НЕ трогая рабочее приложение; ошибки с файлом, строкой и колонкой, за собой убирает
apply_build применить загруженную сборку к приложению по её ид
verify_deploy проверить фактическое применение: задачи с ошибками, сверка применённой сборки, доступность uri
list_user_lists списки пользователей; name фильтрует по подстроке представления
configure_user_list самостоятельная регистрация и вход по паролю; без флагов только показывает состояние
list_branches список веток среды разработки; фильтры project_id и name необязательны
merge_branch принять изменения ветки среды разработки
debug_adapter путь к debug-адаптеру платформы из плагина; отсутствие плагина – это ответ (found: false), а не ошибка (локально)

Рядом с ними встают инструменты, которые приносят плагины (см. ниже).

Одним окружением дело не ограничено: у каждого инструмента, обращающегося к платформе, есть необязательный env_file - путь к .env другого стенда. Так один сервер работает и с облаком, и с локальной установкой, без перезапуска с другими реквизитами. list_apps по умолчанию отдаёт краткие карточки (id, имя, статус, uri, применённая версия): полные карточки пространства - это десятки тысяч символов в ответе агенту, за ними - brief=false; параметр name фильтрует по подстроке имени без учёта регистра на клиенте (платформа query-параметр игнорирует). Так же ведёт себя list_projects (id, имя, вид проекта, пространство, счётчик приложений, признак удаления): name у него тоже фильтрует по подстроке, а проекты с признаком удаления скрыты, пока не задан include_deleted, – на стенде, живущем не первый месяц, их в перечне сотни против единиц живых. list_builds тоже отвечает краткими карточками (ид, версии, дата, ветка, коммит) и десятью свежими сборками, пока limit не скажет иного (0 снимает срез): у давнего проекта сборок тысячи. get_app, delete_app, start_app, stop_app и debug_info принимают ид приложения (UUID) либо его точное имя - не-UUID резолвится по списку, несколько совпадений - ошибка, а не угадывание. create_app и ensure_app добавляют к ответу поле sign-in - адрес и учётную запись, которой входят в только что созданное приложение (запись ПАНЕЛИ УПРАВЛЕНИЯ; учётные записи других приложений там не работают): агент видит только JSON.

Плагины

elemctl подхватывает внешние пакеты через точки расширения importlib.metadata: сам он в своём pyproject.toml о плагинах ничего не объявляет, а читает их при обращении. Так непубликуемые вендорские артефакты живут отдельным пакетом, а ядро elemctl остаётся чистым и общедоступным.

elemctl.debug_adapter - пакет-плагин объявляет каталог debug-адаптера платформы (проприетарные jar 1С, в состав elemctl не входят). Значение точки расширения - путь либо функция без аргументов, возвращающая путь; путь указывает на каталог с подкаталогом repo/, где лежат jar-файлы адаптера.

elemctl.commands - пакет-плагин приносит собственные команды. Значение точки расширения - Command, их список либо функция без аргументов, возвращающая одно из этого. ОДНО объявление даёт обе поверхности: elemctl строит по нему подкоманду CLI и инструмент MCP с настоящей схемой, а о том, что команда делает, ничего не знает. Там и место команде, которая знает про ваше окружение - внутренние контуры, смежные системы, ваши стенды - и потому в публичном ядре жить не может.

# pyproject.toml пакета-плагина
[project.entry-points."elemctl.debug_adapter"]
имя = "мой_пакет:adapter_root"     # () -> Path на каталог, содержащий repo/

[project.entry-points."elemctl.commands"]
имя = "мой_пакет.commands:commands"   # () -> list[Command]
# мой_пакет/commands.py
from elemctl.plugins import Argument, Command

def warm_up(context, stand="", force=False):
    context.log(f"прогреваем {stand}")          # прогресс: stderr в CLI, поле log в MCP
    card = context.client.get_app(stand)        # клиент строится при первом обращении
    return {"ok": True, "status": card.get("status")}

def commands():
    return [Command(
        name="warm-up",
        help="открыть админку свежего стенда",
        handler=warm_up,
        arguments=[Argument("--stand", help="приложение"), Argument("--force", type=bool)],
    )]

Результат обработчика обязан быть JSON-сериализуемым: CLI его печатает, инструмент MCP возвращает. Результат-словарь с "ok": false даёт в CLI код возврата 1 - та же конвенция, что у отчётов deploy и probe. Типы аргументов - str, int, float и bool (флаг); env_file к инструменту MCP добавляет сам elemctl, поэтому команда плагина дотягивается до других окружений ровно так же, как инструменты ядра. Занять имя, которое уже есть у ядра, команда не может - это ошибка, а не молчаливая подмена.

# путь к адаптеру от установленного плагина (для расширения VS Code):
# {"path": "...", "found": true} либо {"path": null, "found": false}
elemctl debug-adapter

# что приносят плагины - каталоги адаптера и команды
elemctl plugins

Сам адаптер (проприетарные jar 1С) извлекается из дистрибутива платформы скриптом tools/extract_adapter.py - в каталог для ручной настройки xbsl.debug.adapterPath либо для сборки пакета-плагина. Скрипт в дистрибутив пакета не входит.

Обнаружение плагинов отключается переменной ELEMCTL_NO_PLUGINS=1 (прогон только со штатными возможностями ядра).

VS Code

С редактором elemctl связывает расширение-спутник:

  • XBSL (проект xbsl) – подсветка, линтер, конструктор форм, дерево метаданных, кнопка “XBSL: деплой на стенд”, запускающая elemctl deploy терминальной задачей с проверкой применения, и отладка приложений 1С:Элемента штатным DAP-адаптером платформы, данные сессии для которой даёт elemctl apps debug. Отладка была отдельным расширением XBSL Debug в репозитории elemctl; с версии XBSL 0.57 она часть одного расширения, а в репозитории осталась только сторона elemctl.

Оно публикуется и в Open VSX.

Последнее обновление 6 сентября 2026 г.

Эта страница была полезной?