Skip to content
Desko77Public

About

MCP-сервер внутри 1C:EDT: дает AI-агентам семантический доступ к проекту - код BSL, метаданные, валидация и живая отладка

Topics

Resources

Contributing

Security policy

Stars

20 stars

Watchers

0 watching

Forks

Repository files navigation

Русский · English

AI-EDT - агентная разработка для 1C:EDT: AI-агент получает доступ к проекту и конфигурации через MCP-сервер

Сборка Релиз Update site Telegram

1C:EDT Java MCP License

Дайте AI-ассистенту структурированный доступ к проекту 1С через службы запущенного экземпляра EDT.

Быстрый старт · Возможности · Архитектура · Участие в разработке


AI-EDT - MCP-сервер в виде плагина, работающего внутри запущенного экземпляра 1C:EDT. Он позволяет Claude, Cursor, GitHub Copilot и другим MCP-клиентам исследовать и изменять метаданные и BSL, переходить по семантическим ссылкам, управлять отладчиком, проверять проекты и работать с подключенной информационной базой.

Вместо того чтобы воспринимать рабочее пространство EDT как каталог XML- и BSL-файлов, ассистент использует семантическую модель, индексы, валидаторы и службы отладки самой EDT.

Important

Текущая версия работает на 1C:EDT 2026.2 и 2026.1. Сборка идет против 2026.1, поэтому один артефакт ставится на обе. Плагин работает везде, где работает EDT; на Windows рассчитаны только описанные ниже скрипты сборки и установки.

🎯 Зачем нужен AI-EDT

Ассистент с доступом только к тексту может искать по файлам, но не способен надежно отвечать на вопросы, зависящие от модели IDE:

  • На какой объект метаданных указывает эта ссылка?
  • Какие формы, роли и подсистемы зависят от справочника?
  • Какой тип EDT вывела в этой позиции BSL?
  • Почему валидатор проекта отклоняет объект?
  • Что происходит в приостановленной отладочной сессии 1С?
  • Можно ли применить изменение метаданных без ручного редактирования XML EDT?
  • Соберется ли этот запрос именно на этой конфигурации - есть ли в ней такие таблицы и поля?
  • Что скажет о новом коде валидатор EDT, а не текстовый линтер со стороны?
  • Откроется ли эта форма у пользователя или развалится при загрузке конфигурации в базу?
  • Соберется ли схема компоновки так, чтобы отчет заработал, а не просто существовал в файле?

AI-EDT дает для этого специализированные MCP-инструменты - те же службы, которыми пользуется сама среда. Ассистент не просто пишет BSL, запрос, форму, схему компоновки или объект метаданных: он тут же проверяет результат валидаторами EDT, поэтому ошибка всплывает на месте, а не в тот момент, когда конфигурацию впервые загружают в информационную базу. Меньше гадания, меньше хрупких текстовых правок, и вся работа идет в той же модели, которую видит разработчик в IDE.

⚡ Что можно делать

Сценарий Что может сделать ассистент
🔍 Исследовать код и метаданные Искать по BSL, разрешать символы, находить семантические ссылки, строить иерархии вызовов, получать список модулей и структуру объектов.
🏗️ Создавать и изменять метаданные Создавать справочники, документы, регистры, формы, роли, команды, сервисы и другие объекты через edit_metadata, включая предпросмотр и пакетные операции.
🐞 Отлаживать BSL Запускать или подключать отладочную сессию, ставить обычные и exception breakpoints, смотреть переменные, вычислять выражения, выполнять шаги и собирать профилирование.
🩺 Диагностировать конфигурацию Получать проблемы EDT, перевалидировать объекты, исследовать граф зависимостей, находить антипаттерны запросов и оценивать влияние изменений.
🧱 Собирать сложные артефакты Работать со СКД, MXL, XDTO, расширениями, внешними объектами и внешними источниками данных через специализированные мастерские.
🧪 Тестировать и исследовать данные Запускать и отлаживать тесты YAxUnit, выполнять сценарии Vanessa Automation и исследовать состояние исполнения в приостановленной сессии отладки.
🛡️ Проверять границы доступа Аудировать роли и RLS, искать потенциально чувствительные данные в коде и метаданных, отключать записывающие инструменты пресетами.
📦 Забирать поставку одним файлом Импортировать конфигурацию или расширение из .cf и .cfe прямо в проект - последний сценарий, ради которого приходилось открывать Конфигуратор. Расширение импортируется к названному проекту основной конфигурации (baseProjectName).
🔀 Обновлять конфигурацию на поддержке Сравнить проект с новой поставкой и с общим предком, принять решения по объектам или по отдельным методам, применить обновление с сохранением доработок. Читать реестр поддержки поставщика и записывать режимы объектов в файл перед объединением.
🧯 Проверить расширение до обновления Получить список объектов расширения, которые после новой поставки перестанут применяться, с причиной по каждому: изменившаяся сигнатура перехватываемого метода, исчезнувшая цель, несовпадение заимствованного объекта.
👀 Видеть, что делал агент Открыть историю вызовов из строки состояния: что вызывалось, с какими аргументами и что ответило.
🧪 Запустить обработку под отладчиком Открыть внешнюю обработку или отчет в клиенте, который запускается под отладчиком, чтобы ее код исполнился при уже расставленных точках останова.
🔔 Узнать, что среда ждет ответа Увидеть модальное окно, которое держит вызов - заголовок, текст и кнопки - и нажать названную, вместо того чтобы ждать человека у клавиатуры.
🔎 Спросить, что даст обновление Узнать до запуска, нужно ли базе обновление и какое: update_database с dryRun=true отвечает состоянием обновления и ничего не запускает. Готовность базы и проверка выгрузки так не выполняются - ответ называет их списком notCheckedInDryRun.
🧷 Подключить существующую базу Добавить файловую базу по пути или серверную по строке соединения в список EDT и связать с проектом одним вызовом - вместе с пользователем и паролем базы, без окна запроса доступа: infobase_admin operation=register_infobase.
📤 Взять объект из базы, а не из проекта Выгрузить форму или объект конфигурации информационной базы в XML Конфигуратора (config_io operation=export_infobase_objects) - например, чтобы сравнить с проектом то, что правили в Конфигураторе.
🧰 Вернуть базе инкрементальное обновление Перестроить хранимый файл сведений выгрузки штатной выгрузкой Конфигуратора (sync_control operation=rebuild_dump_info), когда update_database отказывает на чужом формате файла, и отметить синхронизированной привязку базы, у которой еще нет базовой линии (mark_synchronized). Инкрементальное update_database отказывает, пока хранимая копия описывает другую базу или базу, замененную загрузкой .dt; verifyInfobaseContent=true перед обновлением сверяет копию с самой базой.
💾 Снять базу в один файл и вернуть из него Выгрузить информационную базу целиком в .dt (infobase_admin operation=export_database_snapshot; файл, уже стоящий по пути, отклоняется, а не заменяется) и загрузить обратно (restore_database_snapshot; перед загрузкой пишется копия текущего содержимого базы - backupTo, без довода рядом с загружаемым файлом, - и загрузка не начинается без копии; загрузка заменяет все, что база держит). Обе операции занимают базу монополией на время прогона: отказ busy называет держателей блоком infobaseHolders, когда сервер их видит, дольше timeoutSeconds - ответ Pending с runKey.
🔁 Забрать правки из базы в проект Подтянуть изменения, сделанные в информационной базе, в проект - направление, обратное update_database: infobase_admin operation=sync_control с syncOperation=retrieve_database_changes. Проект с собственными правками отказывается от подтягивания, пока не передан replaceLocal=true; толстый клиент, запущенный этой EDT, отказывает до подтягивания по имени запуска (heldBy); после успешного подтягивания markSynchronized=true перезаписывает базовую линию синхронизации.
🖨️ Проверить печатную форму до печати Узнать по модели макета, поместится ли область печати на лист по ширине и с каким запасом: mxl_workshop operation=check_print_width, без запуска платформы.
🎬 Проверить действие в работающей 1С Открыть список, встать на строку, нажать кнопку и получить кадр экрана с окном клиента тестирования после действия: vanessa с доводами списка.
🤝 Спросить 1С:Напарника Задать вопрос Напарнику из агента (naparnik operation=ask) при включенном мосте; по умолчанию Напарнику доступны только инструменты чтения, среди них поиск по документации платформы и ИТС в базе знаний сервиса.
📜 Смотреть, что было в базе Читать журнал регистрации файловой информационной базы: входы, проведения, обновления конфигурации, ошибки платформы - с отбором по времени, событию, пользователю и важности.
🧭 Не путать запущенные EDT Сервер называет рабочую область, в которой запущен, а self_status перечисляет живые экземпляры на машине с портами и открытыми проектами.
🛑 Не потерять данные при обновлении Узнать до обновления базы, какие таблицы потеряют данные из-за удаленного объекта или его части: update_database отказывает со списком dataLossTables и не захватывает базу, пока потеря не принята явно (acceptDataLoss=true).
↩️ Вернуть файл или проект после объединения Посмотреть изменения файла против коммита, в том числе по методам модуля (git operation=show_file_changes), вернуть файл из коммита с концами строк, которые дал бы git checkout (revert_file), и вернуть файлы проекта к точке, записанной перед объединением с поставкой (restore_merge_point).
📥 Выгрузить конфигурацию из базы Выгрузить конфигурацию или расширение информационной базы в .cf и .cfe (config_io operation=export_database_configuration, export_database_extension); занятый путь и база, отличающаяся от проекта, отклоняются без явного разрешения.
🗂️ Увидеть список баз EDT Получить базы из списка EDT с группами, строкой соединения с паролем под маской, версией платформы и привязанными проектами: infobase_admin operation=list_registered_infobases.
🎨 Настроить условное оформление формы Добавить, прочитать и снять правила условного оформления управляемой формы: edit_metadata add_form_appearance_rule, list_form_appearance_rules, remove_form_appearance_rule.
⏸️ Приостановить поток отладки Остановить поток или всю сессию (launch_debugger action=pause_thread), выключить точку останова без удаления (set_breakpoint_state) и заменить набор точек модуля одним вызовом (add_breakpoint с replaceModuleSet).

Сервер предоставляет более ста операций. Родственные действия объединены фасадами code_search, edit_metadata, launch_debugger, diagnostics, insights и security_audit, поэтому MCP-клиент видит компактный набор инструментов вместо длинного списка почти одинаковых команд.

🧮 Метаданные, запросы и формы - там, где текстовый ассистент ломается чаще всего

Метаданные создаются по описанию, а не правкой XML. Разработчику достаточно сказать, что нужно: справочник с такими-то реквизитами, документ с движениями, форма списка к нему. Ассистент раскладывает это в план операций edit_metadata и выполняет его одним пакетом, а не десятком разрозненных вызовов. Любой шаг заранее прогоняется с dryRun=true и показывает, что именно будет затронуто; удаление и прочие деструктивные операции требуют отдельного подтверждения. Изменения идут через модель EDT, а не текстом по .mdo, и сразу после применения объекты перевалидируются, так что ошибка видна на месте, а не при первой загрузке в информационную базу.

Открытый редактор виднее файла. read_module_source отдает то, что держит редактор, если в нем есть несохраненные правки, и говорит об этом в ответе: иначе ассистент рассуждал бы о версии, на которую разработчик уже не смотрит. write_module_source в таком случае отказывает и называет файл - запись поверх открытого редактора уничтожает либо вашу несохраненную работу, либо свою собственную, смотря кто сохранится последним, и делает это молча. Текст читается через менеджер файловых буферов платформы, поэтому ни окно, ни поток отображения для этого не нужны.

Запрос проверяется до того, как его кто-то запустит. validate_query разбирает текст в контексте проекта и возвращает синтаксические и семантические ошибки с номерами строк, отдельно для обычных запросов и для запросов СКД. Вместе с ними приходит список подсказок на типовые промахи: слова SQL вместо языка запросов 1С, УБЫВАНИЕ вместо УБЫВ. Ассистенту не нужно запускать конфигурацию, чтобы выяснить, что запрос не соберется.

И что этот запрос вернет - тоже. С describeResult=true тот же инструмент сообщает колонки каждого результата и их типы, взятые из модели конструктора запросов EDT, а не вычитанные из текста. Пакет разбирается целиком: временные таблицы не выдаются за результат, но занимают свою позицию в ВыполнитьПакет(), поэтому индексы совпадают с реальными. Тип, который определить нельзя, не указывается вовсе - уверенная неправда обошлась бы дороже честного пробела. Ассистент перестает угадывать имена колонок, а с ними уходит целый класс ошибок, которые иначе доживают до рантайма.

Форму собирает генератор EDT, а не ассистент. Достаточно описать, какая форма нужна: create_form принимает назначение - форма объекта, форма списка, форма выбора, русские синонимы тоже принимаются, - и форму строит тот же генератор, которым пользуется мастер IDE, с основным реквизитом и рабочей раскладкой. Если генератор не отработал, create_form отказывает и форму не создает, а layout=empty создает пустую форму без генератора. Дальше она правится по частям: реквизиты и колонки, поля, таблицы динамических списков, команды, обработчики событий, параметры, командный интерфейс, функциональные опции. Результат читается через get_form_structure - он же отдает настройки компоновки каждого динамического списка формы: порядок, отбор, группировки и условное оформление - и просматривается глазами через get_form_screenshot - в редакторе, а через vanessa с доводом formToOpen еще и в работающей 1С, где сценарий открывает форму и сохраняет кадр верхнего окна клиента тестирования - его рисует в файл внешняя компонента, что бы ни было поверх, - а validate_for_export ловит дефекты формы, которые проходят валидацию EDT и проявляются только при загрузке в информационную базу; ту же проверку update_database выполняет сам и отказывает на находке, не доводя дело до платформы.

🔄 Типичный цикл работы агента

flowchart TD
    Q["Разработчик описывает задачу"] --> S["AI исследует модель EDT:<br/>код, метаданные, зависимости"]
    S --> P["Показывает предлагаемые изменения"]
    P --> E["Изменяет BSL или метаданные"]
    E --> V["Запускает валидацию EDT и тесты"]
    V --> D{"Найдена проблема?"}
    D -- Да --> B["Отлаживает сессию 1С"]
    B --> E
    D -- Нет --> R["Возвращает проверенный результат"]
Loading

🧩 Как это работает

flowchart TD
    subgraph Client["MCP-клиент"]
        AI["Claude · Cursor · Copilot · Cline"]
    end
    subgraph Plugin["Плагин AI-EDT · внутри процесса EDT"]
        direction LR
        HTTP["MCP endpoint<br/>Streamable HTTP + SSE"] --> GATE["Политика доступа<br/>пресеты и разрешения"] --> TOOLS["Фасады<br/>и мастерские"]
    end
    subgraph EDT["Службы 1C:EDT"]
        direction LR
        BM["Семантическая<br/>модель"]
        AST["Парсер BSL"]
        CHECKS["Валидация"]
        DEBUG["Отладчик"]
    end
    subgraph Runtime["1С:Предприятие"]
        APP["Клиент · сервер · задания · тесты"]
    end
    AI <-->|"JSON-RPC · localhost:12250"| HTTP
    TOOLS --> BM
    TOOLS --> AST
    TOOLS --> CHECKS
    TOOLS --> DEBUG
    DEBUG <--> APP
Loading

По умолчанию сервер доступен по адресу http://localhost:12250/mcp. Плагин не является отдельным headless-сервером: EDT должна быть запущена, а целевой проект - загружен. Благодаря этому инструментам доступны разрешенные ссылки, выведенные типы, текущие маркеры валидации и состояние живой отладки.

Другой бандл EDT может добавить плагину инструменты и модули: сервис IMcpTool становится вызываемым инструментом (свойство сервиса ru.aiedt.mcp.tool.writes говорит, пишет ли он; пресеты Read-only, Code Review и Debug & Test выключают пишущий вместе с собственными писателями плагина, а инструмент без свойства считается пишущим), сервис IModuleSourceProvider отдает модули, у которых есть адрес, но нет файла, - read_module_source, write_module_source, get_module_structure, read_method_source, list_modules и text_search работают с ними по адресу, а ответы, построенные по индексу BSL, заканчиваются строкой покрытия такого поставщика. Плагин экспортирует для этого пакеты ru.aiedt.mcp.server.support.modules, toolkit и wire.

🚀 Быстрый старт

📋 1. Требования

  • 1C:EDT
    • 2026.2
    • 2026.1
  • Java / JDK
    • 25 - для 1C:EDT 2026.2
    • 17 - для 1C:EDT 2026.1
  • Maven 3.9+ для сборки из исходников
  • MCP-совместимый клиент
  • ОС - любая, где работает 1C:EDT. Плагин собирается и полностью прогоняет тесты на Linux в CI. Windows нужна только вспомогательным скриптам build.cmd и scripts/edt-selfupdate.ps1, а команды установки ниже записаны для PowerShell; сама установка через p2 director от ОС не зависит

Для дополнительных возможностей потребуются YAxUnit, Vanessa Automation или конфигурация Attach. Подробнее - в разделе Дополнительные интеграции.

🔨 2. Сборка

В корне репозитория выполните:

build.cmd [EDT_INSTALL_DIR]

Альтернативный вариант - собрать Maven-реактор напрямую:

cd mcp
mvn clean verify

Сгенерированный P2-репозиторий:

mcp/repositories/ru.aiedt.mcp.server.repository/target/repository

📦 3. Установка в EDT

🤖 Просто попросите агента установить плагин

Установка сводится к одному сообщению агенту: он поставит плагин сам, без единого щелчка мышью. Нужен AI-агент с доступом к оболочке на той машине, где стоит EDT.

Скопируйте ему этот промпт:

Установи мне плагин AI-EDT в 1C:EDT.

Рецепт: https://github.com/Desko77/ai-edt/blob/main/docs/agent-install.md
Прочитай его целиком и следуй ему.

Ставь с update site https://desko77.github.io/ai-edt/ через Equinox p2 director
(1cedtc.exe из каталога установки EDT). Мастер "Установить новое ПО" не используй.
Это первая установка, поэтому -uninstallIU не передавай.

Перед установкой закрой запущенный сеанс EDT, запомнив его командную строку;
после установки запусти его теми же аргументами и дождись ответа status: ok
от health endpoint.

После этого поставь себе скил из каталога skills/ai-edt репозитория - без него
ты будешь пользоваться сервером вслепую. Порядок в skills/README.md.

Ничего не завершай принудительно. Если EDT не закрывается сам - остановись и скажи мне.

Если плагин уже установлен и вы его обновляете, замените предложение про первую установку на: Плагин уже установлен, обновляй его одним запросом director с -uninstallIU и -installIU.

Полный рецепт вместе с правилами обращения с запущенной средой - в docs/agent-install.md.

🖱️ Через интерфейс EDT

Оба ручных пути - мастер EDT и командная строка - ставят ту же фичу с того же update site, поэтому собирать плагин самостоятельно не обязательно:

https://desko77.github.io/ai-edt/

Этот адрес указывается в EDT так же, как локальный архив.

Шаг 1. Запустите EDT и откройте Справка → Установить новое ПО.

Установка начинается из меню Справка.

Шаг 2. Нажмите Добавить рядом с полем Работать с.

Установщик открывается без выбранного репозитория.

Шаг 3. В диалоге Добавить репозиторий укажите, откуда ставить. Подходит любой из вариантов:

  • поле Расположение и адрес update site https://desko77.github.io/ai-edt/;

  • то же поле и адрес прямо на архив последнего релиза - p2 умеет читать репозиторий внутри zip по HTTP:

    jar:https://github.com/Desko77/ai-edt/releases/latest/download/AI-EDT-update-site.zip!/
    

    Этот вариант всегда указывает на свежий выпуск и не зависит от публикации страницы, поэтому отстать от релиза не может. Обратите внимание на префикс jar: и завершающие символы !/ - без них адрес не работает.

  • Архив... и файл mcp/repositories/ru.aiedt.mcp.server.repository/target/AI-EDT-<версия>.zip из локальной сборки;

  • Расположение... и каталог mcp/repositories/ru.aiedt.mcp.server.repository/target/repository.

Имя репозитория произвольное, например AI-EDT.

Выберите архив или каталог репозитория и подтвердите.

Шаг 4. Отметьте категорию AI-EDT или фичу AI-EDT (1C AI tools for EDT) внутри нее и нажмите Далее. Если список выглядит пустым, снимите флажок Группировать элементы по категории.

Фича появляется в категории AI-EDT.

Шаг 5. Проверьте состав установки, примите лицензионное соглашение и нажмите Готово.

На странице деталей видны фича и устанавливаемая версия.

Шаг 6. Сборка не подписана, поэтому при первой установке EDT просит подтвердить установку неподписанного содержимого. Согласитесь, чтобы продолжить.

Шаг 7. Когда установщик предложит перезапустить EDT, нажмите Перезапустить.

По завершении установки EDT предлагает перезапуск.

После перезапуска переходите к разделу 4. Запуск и проверка.

🔏 Проверка архива выпуска

К каждому выпуску приложены release-manifest.json (имя, размер в байтах и SHA-256 каждого архива) и SHA256SUMS, а на сами архивы GitHub выпускает аттестацию сборки. Архив, скачанный для установки через Архив..., проверяется так: скачайте его и release-manifest.json из одного выпуска и сверьте размер и хеш с записью манифеста, затем проверьте аттестацию (нужен GitHub CLI):

Get-FileHash -Algorithm SHA256 .\AI-EDT-update-site.zip
(Get-Item .\AI-EDT-update-site.zip).Length
gh attestation verify .\AI-EDT-update-site.zip --repo Desko77/ai-edt

В Linux и Git Bash хеши всех скачанных архивов сверяет sha256sum -c SHA256SUMS --ignore-missing. gh attestation verify проходит только для архива, собранного workflow выпуска этого репозитория.

⌨️ Из командной строки

Equinox P2 director ставит ту же фичу без интерфейса. Сначала закройте обновляемый сеанс EDT: запущенный экземпляр держит старый плагин в памяти до перезапуска, то есть перезапуск все равно понадобится, а сеанс, который сам выполняет операцию установки, удерживает блокировку профиля.

& "<EDT>\1cedtc.exe" -nosplash `
  -application org.eclipse.equinox.p2.director `
  -repository "file:///C:/path/to/AI-EDT/mcp/repositories/ru.aiedt.mcp.server.repository/target/repository" `
  -uninstallIU ru.aiedt.mcp.server.feature.feature.group `
  -installIU ru.aiedt.mcp.server.feature.feature.group `
  -profileProperties org.eclipse.update.reconcile=true

Фича - это p2-синглтон, поэтому установка новой версии поверх существующей не пройдет, если в том же запросе не удалить старую. При самой первой установке строку -uninstallIU нужно убрать: удалять еще нечего.

Для рабочей среды разработки скрипт scripts/edt-selfupdate.ps1 выполняет весь цикл: аккуратное закрытие, установку, перезапуск и проверку состояния.

🎓 И сразу поставьте скил агенту

Каким бы путем вы ни поставили плагин, установка на этом не заканчивается. Плагин дает агенту инструменты, но не объясняет, как ими пользоваться: какой фасад брать под задачу, какие проверки обязательны после правки, что означает ответ с ключом возврата. Это знание лежит в скиле skills/ai-edt и ставится копированием каталога:

Copy-Item -Recurse skills\ai-edt "$env:USERPROFILE\.claude\skills\ai-edt"
cp -r skills/ai-edt ~/.claude/skills/ai-edt

Это расположение для Claude Code на уровне пользователя; каталог .claude/skills/ai-edt внутри проекта ограничит скил одним проектом. Если вы ставили плагин с update site и чекаута рядом нет, заберите каталог поверхностным клоном:

git clone --depth 1 https://github.com/Desko77/ai-edt.git "$env:TEMP\ai-edt-skill"
Copy-Item -Recurse "$env:TEMP\ai-edt-skill\skills\ai-edt" "$env:USERPROFILE\.claude\skills\ai-edt"
Remove-Item -Recurse -Force "$env:TEMP\ai-edt-skill"

Для другого агента действует его собственное соглашение: SKILL.md - обычный Markdown с именем и описанием во front matter, файлы references/ подгружаются по мере надобности. Подробности - skills/README.md.

Скил необязателен: без него агент тоже работает, просто дороже - читает модули целиком, правит руками файлы, которыми владеет EDT, и повторяет вызов, который уже вернул ключ возврата.

▶️ 4. Запуск и проверка

Откройте Window → Preferences → AI-EDT и проверьте:

  1. порт сервера, обычно 12250, и сколько портов подряд разрешено занять. По умолчанию десять: сервер берет первый свободный, поэтому вторая EDT на той же машине поднимается сама, без правки настроек. Поставьте 1, если порт прописан в конфигурации клиента и должен остаться ровно этим;
  2. нажмите Start, чтобы запустить сервер сейчас, либо включите Auto-start и перезапустите EDT;
  3. Plain text mode для клиентов без поддержки MCP resources;
  4. активный пресет инструментов.

На странице General настраиваются транспорт, внешние инструменты, сетевая безопасность, история вызовов, обновления и жизненный цикл сервера.

После этого проверьте health endpoint:

curl.exe http://localhost:12250/health

Готовый экземпляр возвращает ответ со значениями status: ok и phase: ready. Если указано phase: indexing, дождитесь завершения загрузки проекта в EDT.

Строка состояния показывает работающий сервер: порт, последний вызов инструмента, а также остановку или перезапуск одним щелчком.

Тот же элемент открывает контекстное меню: скопировать адрес конечной точки, перезапустить сервер или остановить его.

🔗 5. Подключение AI-клиента

Сервер слушает только 127.0.0.1 и принимает запросы без токена. Флажок Require bearer token на странице Window → Preferences → AI-EDT включает проверку: тогда каждый запрос несет заголовок Authorization: Bearer <токен> с токеном из поля Bearer token той же страницы (он создается при первом запуске сервера), а клиент без него получает 401. В примерах ниже заголовок указан; при выключенной проверке сервер его не читает, строку можно опустить.

Claude Code

Добавьте сервер в %USERPROFILE%\.claude.json:

{
  "mcpServers": {
    "AI-EDT": {
      "type": "http",
      "url": "http://localhost:12250/mcp",
      "headers": {"Authorization": "Bearer <токен со страницы Preferences > AI-EDT>"}
    }
  }
}

Cursor

Создайте .cursor/mcp.json в корне проекта и включите Plain text mode в настройках AI-EDT:

{
  "mcpServers": {
    "AI-EDT": {
      "url": "http://localhost:12250/mcp",
      "headers": {"Authorization": "Bearer <токен со страницы Preferences > AI-EDT>"}
    }
  }
}

Пошаговая инструкция - подключение, скил и правило для Cursor, примеры задач и что делать, если не подключается: docs/cursor.md.

Установить и настроить все одним промптом агенту Cursor - рецепт для агента docs/cursor-agent-setup.md, готовый промпт в начале docs/cursor.md.

VS Code / GitHub Copilot

Создайте .vscode/mcp.json; токен запрашивается при первом подключении и хранится VS Code, в файл он не попадает:

{
  "inputs": [
    {"id": "ai-edt-token", "type": "promptString", "description": "AI-EDT bearer token", "password": true}
  ],
  "servers": {
    "AI-EDT": {
      "type": "http",
      "url": "http://localhost:12250/mcp",
      "headers": {"Authorization": "Bearer ${input:ai-edt-token}"}
    }
  }
}

Конфигурации для Claude Desktop, Cline и Antigravity находятся в docs/clients.md.

🎓 5a. Проверьте, что скил на месте

Скил skills/ai-edt ставится на шаге установки - И сразу поставьте скил агенту. Если вы его пропустили, сейчас самый момент: клиент уже подключен, и разница видна с первого задания. Проверить просто - в Claude Code скил появляется в списке доступных под именем ai-edt.

💬 6. Первый вызов

Попросите клиента вывести список проектов EDT или версию EDT. Успешный ответ должен содержать структурированную информацию о проекте, а не сообщение "инструмент недоступен".

Примеры запросов:

Покажи проекты EDT в текущем рабочем пространстве и кратко опиши состояние их валидации.
Найди все семантические ссылки на Справочник.Номенклатура и сгруппируй их по метаданным, формам и модулям BSL.

Один вызов возвращает модель объекта: реквизиты с типами, табличные части и формы.

Не заработало или непонятно - спрашивайте в группе Telegram.

🧰 Набор инструментов

В основе API AI-EDT лежат фасады. Фасад принимает дискриминатор операции и направляет родственные действия через единую стабильную точку входа.

Tip

Открыть полный каталог инструментов →
Все группы инструментов, режимы доступа и раскрываемые описания ключевых фасадов.

Фасад Область применения
code_search Текстовый поиск, ссылки, разрешение символов, иерархия вызовов, информация о символах и content assist (в том числе пакетом позиций одним вызовом через positions).
edit_metadata Изменение метаданных, форм, команд, ролей, сервисов, макетов и других элементов модели.
launch_debugger Запуск/подключение, точки останова, шаги, переменные, вычисление выражений и профилирование.
diagnostics Проблемы проекта, документация проверок, очистка и точечная перевалидация.
insights Зависимости, метрики, антипаттерны, трехстороннее сравнение с поставкой и объединение, анализ влияния.
security_audit Права ролей, нарушения RLS и поиск чувствительных данных.
project_admin / infobase_admin Проекты рабочего пространства, конфигурации запуска, обновление ИБ и синхронизация.
config_io Импорт и экспорт конфигурации и отдельных артефактов.
docs_lookup Документация платформы и встроенная справка объектов 1С.
workspace_marks Теги, объекты по тегам, закладки и задачи.
git Репозиторий проекта внутри EDT: статус, ветки, история, коммит названных файлов, переход по веткам, изменения файла и его возврат из коммита, точка перед объединением - через JGit, который среда несет сама. Записи commit, checkout, revert_file и restore_merge_point гасятся пресетами под именами git_commit, git_checkout и git_revert_file; create_merge_restore_point в рабочее дерево не пишет и пресетами не выключается.
dcs_workshop / mxl_workshop / xdto_workshop / external_data_source_workshop Программные конструкторы сложных артефактов 1С.
extension_workshop / external_object_workshop Жизненный цикл расширений, внешних отчетов и обработок; import_external_object преобразует .epf / .erf через Конфигуратор названной базы (applicationId) и отдает базу обратно EDT.
yaxunit_tests Запуск или отладка выбранных тестов YAxUnit и чтение отчетов.
support_registry Состояние поддержки поставщика: конфигурации-поставщики и их релизы, режимы объектов, запись и восстановление режимов.

Прежние отдельные имена инструментов сохранены как алиасы для обратной совместимости. Пресет Canonical скрывает их из tools/list, уменьшая расход контекста без потери возможностей.

Справка фасада - operation=help, с topic - по одной операции или доводу; find=<слова> ищет по справке и называет тему, по которой открыть раздел целиком.

Один фасад покрывает множество операций: здесь code_search разбирает исходящие вызовы метода.

Долгие операции

Вызов, который не укладывается в ожидание, возвращает status=Pending и runKey. Повторный вызов с этим ключом отдает результат; работа при этом не перезапускается. Длину ожидания задает timeoutSeconds - от 5 до 120 секунд, по умолчанию 25.

Ответ edit_metadata batch дополнительно несет progress: сколько операций выполнено, применено и отклонено и какая идет сейчас. Батч фиксирует каждую операцию отдельно, поэтому названные примененными уже записаны.

Клиент, объявивший ревизию протокола 2026-07-28, получает тот же прогон как задание - tasks/get, tasks/update, tasks/cancel.

tasks/cancel переводит задание в cancelled, а statusMessage говорит, чем кончилась остановка: работа остановлена; ей велено остановиться, но она еще идет и может писать; либо сервер только перестал ее ждать, потому что процесс Конфигуратора после запуска не прерывается. Пока остановленная работа не завершилась, повторный вызов той же работы отвечает stillStopping: true, вторая копия не запускается.

Тяжелые вызовы - обновление базы, в том числе перед запуском клиента, выгрузка и загрузка конфигурации, запуск Конфигуратора, создание базы, широкие обходы проекта - выполняются не больше трех одновременно, а при остатке кучи EDT выше 92 % после сборки мусора новый тяжелый вызов отклоняется до начала работы. Внешний клиент получает отказ 503 с Retry-After. Ответ Pending держит разрешение до конца фоновой работы; опрос по runKey разрешения не занимает.

Отмена вызова

Клиент отзывает отправленный вызов уведомлением notifications/cancelled с его requestId. Отзыв действует в пределах своего клиента: сервер сопоставляет идентификатор среди вызовов с тем же MCP-Session-Id, который выдает при рукопожатии. Отзыв, обогнавший свой вызов, срабатывает, когда тот появляется.

Восемь обходов останавливаются на границе, за которой собранное остается целым: find_dead_code, detect_query_anti_patterns, sensitive_data_scan, find_rls_violations, project_metrics, dependency_graph, semantic_metadata_search, find_references. Ответ приходит с тем, что было найдено, и несет cancelled с числом пройденных единиц. Пустой результат остановленного обхода говорит, что обход остановлен, а не что находок нет.

project_metrics при остановке отвечает partial=true и списком unscannedModules; разделы, шаг которых не выполнялся, в ответе отсутствуют, а не равны нулю.

Оператор останавливает вызов из строки состояния. Когда вызовов несколько, кнопка и указатель относятся к старейшему выполняющемуся, а строка показывает +N при остальных.

🔐 Пресеты инструментов и безопасность

На странице настроек Tools инструменты сгруппированы по назначению и доступны следующие пресеты:

Пресет Назначение
Canonical Рекомендуемый вариант. В списке видны фасады, а алиасы совместимости остаются вызываемыми, но скрытыми.
All Tools Показывает каждый зарегистрированный инструмент и алиас. Полезно для исследования API.
Read-only Поиск, навигация и валидация без правок, отладки и обновления ИБ.
Editing Чтение и запись без отладки.
Debug & Test Чтение, отладка и тесты без изменения исходников и метаданных.
Code Review Анализ кода и метаданных без записи.

У каждого инструмента может быть состояние listed, callable-hidden или disabled. Скрытые инструменты продолжают принимать вызовы, отключенные - отклоняются. Благодаря этому Canonical уменьшает шум в каталоге, а ограничивающие пресеты действительно устанавливают границы доступа.

Пресеты делают каталог MCP компактным и могут ограничивать доступ режимом только для чтения или конкретной задачи.

Раскрытая группа показывает каждый инструмент с описанием и состоянием: в списке, вызываемый скрыто или отключенный.

Caution

Плагин работает с правами процесса EDT. Он может изменять исходники, метаданные и информационные базы. Храните проект в системе контроля версий, проверяйте предпросмотр перед подтверждением разрушающих операций и не публикуйте локальный порт за пределами loopback-интерфейса.

Токен доступа, происхождение страницы и привязка к интерфейсу

Сервер слушает только 127.0.0.1; проверка bearer-токена включается на странице настроек.

  • Bearer-токен. Он создается при первом запуске сервера, если поле на странице Preferences → AI-EDT пусто, и показан только там. Клиент передает его заголовком Authorization: Bearer <токен>; сравнение идет за константное время. Запрос без верного токена получает 401, тело отказа называет страницу настроек и не содержит токена. В журнал рабочей области токен не пишется. Кнопка Generate подставляет новый токен, Apply с пустым полем создает его сам; новый токен действует после того, как сохранен в настройках, - пока запись не завершена, действует прежний.
  • Require bearer token (mcpAuthEnabled, по умолчанию выключен) включает проверку для сервера на 127.0.0.1; при привязке ко всем интерфейсам токен требуется независимо от флажка.
  • /health без токена при включенной проверке отвечает тремя полями: status, phase, edt_version. Имя рабочей области, текущий инструмент, показатели кучи и очереди - только с токеном.
  • Путь, которого у сервера нет, отвечает 404 с текстом, называющим /mcp, заголовок Authorization: Bearer <токен> и страницу настроек.
  • Происхождение страницы. Запрос браузера принимается, когда заголовок Origin целиком равен http://localhost, http://127.0.0.1, http://[::1] (с портом или без, по http или https) либо vscode-webview://<id>. http://localhost.evil.example отвергается. Страница, открытая из файла, шлет Origin: null - такой запрос принимается только при включенной настройке Accept browser pages without an origin, по умолчанию выключенной.
  • Привязка ко всем интерфейсам. Снимает ограничение loopback: любой хост, который дотянется до машины и знает токен, получит право читать и менять исходники и информационную базу.

Маскирование персональных данных

Отдельная настройка включает маскирование данных, попадающих в ответ инструмента, - по категориям 152-ФЗ: ИНН, СНИЛС, номер карты, паспорт, телефон, email. По умолчанию выключена.

Что важно понимать про нее честно:

  • Маскирование сделано с приоритетом точности над полнотой. ИНН, СНИЛС и карта проверяются по контрольной сумме, у паспорта и телефона обязателен разделитель - поэтому произвольный числовой идентификатор не будет испорчен. Обратная сторона: это не ловит ФИО, адреса и прочие персональные данные в свободном тексте.
  • Маскируется собственный вывод инструмента и текст ошибок, но не конверт JSON-RPC и не бинарные изображения: структура ответа не меняется, только содержимое строк.
  • Это снижает риск утечки в облачную модель, но не заменяет решение о том, какие данные вообще показывать ассистенту.

История вызовов

Каждый вызов инструмента записывается: что вызвали, с какими аргументами, что ответили, сколько заняло, и кто ответил агенту - инструмент или ваш сигнал из строки состояния. Запись несет arbitratedBy (tool / signal), deliveryStatus (delivered / failed), для сигнала - signalType и текст signalNote. Колонка Outcome показывает ok, interrupted (CANCEL) или failed, not delivered; в статистике get_mcp_history и self_status счетчики interrupted и undelivered идут поверх success и failure. Открыть - из индикатора AI-EDT в строке состояния, пункт Call history. Окно немодальное: агент продолжает работать, пока вы читаете.

Окно истории вызовов: список с отбором по инструменту и по неудачам, под ним запрос и ответ выбранного вызова.

Заголовок окна показывает, сколько вызовов хранится и по скольку символов запроса и ответа, а над панелью ответа видно, какая часть сохранена: Response (303 of 1957 characters). Так урезанную запись нельзя принять за короткий ответ.

Настройки в Window -> Preferences -> AI-EDT, раздел Call history: вести ли запись вообще, сколько вызовов хранить, сколько символов запроса и ответа сохранять. Умолчания рассчитаны на вопрос "какие инструменты отработали", а не "что именно они ответили" - если нужен полный ответ, увеличьте число символов, оно и решает, что вы увидите.

Глубина и объем ограничены совместно: буфер целиком не превышает заданного предела памяти, и если запрошенные значения в него не помещаются, число символов уменьшается пропорционально. Фактические значения показаны в заголовке окна истории, так что урезание видно. Умолчания до этого предела не достают.

Полный текст вызова хранится на диске рядом с буфером: get_mcp_history с доводом entryId из записи списка отдает один вызов целиком - полные аргументы и полный ответ, замаскированные так же, как в журнале, - а в окне истории тот же текст открывается по выбору записи. Запись, которой в хранилище больше нет, получает названный отказ, а не урезанную копию под видом полной. Чем это управляется - группа Call history on disk на странице настроек: хранить ли полный текст (по умолчанию да), сколько дней хранить (14, ноль означает до предела размера) и в какой папке (пусто - служебный каталог плагина). При выключенной записи вызовов на диск не пишется ничего.

Отдельная настройка дописывает каждый вызов в файл в служебном каталоге плагина, чтобы запись пережила перезапуск EDT. По умолчанию выключена. Файл ограничен по размеру и ротируется. Пароли информационных баз в него не попадают: значения аргументов с ключом вида password, token, secret заменяются на *** до записи. Персональные данные в файле маскируются - это можно отключить, но по умолчанию включено, потому что файл живет дольше сессии и уезжает вместе с приложением к отчету об ошибке.

Прочие меры

  • Инструменты рефакторинга метаданных используют сценарий preview/confirm.
  • Для незнакомых проектов рекомендуется пресет Read-only.
  • evaluate_expression выполняет код в живой сессии 1С.
  • Удаление ИБ, импорт конфигурации и синхронизацию можно отключить отдельно.
  • Перед структурными обновлениями, которые нельзя отменить через Git, сделайте резервную копию ИБ.

🐞 Отладка клиентского и серверного кода

Фасад отладки поддерживает обычные клиентские запуски и конфигурации Attach to 1C:Enterprise Debug Server. Attach необходим для HTTP-сервисов, серверных вызовов, фоновых и регламентных заданий, а также кода, выполняемого в rphost.

Агент получает список конфигураций запуска EDT, подключается к серверу отладки 1С, устанавливает точку останова и ждет приостановки. После этого AI-EDT возвращает стабильные ссылки на поток, стек и кадр, чтобы агент мог исследовать переменные, вычислять выражения, выполнять код по шагам и продолжать выполнение.

Запуск считается состоявшимся только тогда, когда видна живая цель отладки; иначе приходит отказ с тем, что произошло вместо этого, и со списком модальных окон, открывшихся во время запуска. Довод debugServerPort дает запуску свой порт отладочного сервера, когда порт по умолчанию уже занят другой средой на этой машине. Запускаемый клиент может сразу открыть внешнюю обработку или отчет: среда собирает для этого дамп внешнего объекта, поэтому запуск проверяет, включена ли генерация дампа у проекта внешних объектов, и включает ее по доводу enableExternalObjectDump. Параметры открываемой обработке передаются строкой /C через довод startupOption - он пишется в копию конфигурации запуска, сохраненная не меняется; Attach-конфигурация и уже идущий сеанс его отвергают.

Клиент следует режиму запуска конфигурации. Конфигурация, у которой основной режим - обычное приложение, запускается в толстом клиенте: конфигурация запуска, которую создает запуск, сохраняется с толстым клиентом, существующая запускает этот запуск с ним, а /RunModeOrdinaryApplication кладется в дополнительные параметры запуска базы на ссылке, которую EDT держит в сеансе, - список баз на диске не пишется. Доводы clientType (thin, thick, web) и runMode (ordinary, managed) у launch_debugger action=launch и infobase_admin operation=start_client называют выбор прямо; clientType=thin у конфигурации обычного приложения без runMode=managed отвергается. Ответ говорит, что решено (clientType, clientTypeSource, runMode, runModeSource) и что изменено (runModeFlagState, runModeFlagScope, infobaseAdditionalParameters).

🔌 Дополнительные интеграции

Интеграция Что становится доступно Что нужно настроить
YAxUnit Запуск и отладка unit-тестов, фильтрация наборов и разбор JUnit-отчетов. Установить расширение YAxUnit в целевую информационную базу.
Vanessa Automation Выполнение сценарных UI-тестов, синхронно либо ключом возврата, с отменой прогона и снимками, привязанными к упавшему шагу. Отдельно настроить Vanessa и требуемую конфигурацию запуска.
Сервер отладки 1С Отладка серверного BSL через Attach. Запустить ragent с -debug -http и создать конфигурацию Attach в EDT.
BSL Language Server Дополнительный анализ исходников через code_review. Указать внешний JAR в настройках AI-EDT.

⚠️ Ограничения

  • AI-EDT зависит от внутренних и публичных служб EDT; после крупного обновления EDT может потребоваться новая версия плагина.
  • Сервер доступен только при запущенной EDT.
  • Для части семантических инструментов необходимо дождаться завершения индексации проекта; пока она идет, такой инструмент отказывает с указанием причины.
  • Endpoint слушает loopback; проверка bearer-токена и привязка ко всем интерфейсам включаются на странице настроек - см. раздел про безопасность.
  • Update site публикуется автоматически при выпуске релиза. Промежуточные сборки между релизами ставятся из исходников или из локального P2-репозитория.

🤝 Участие в разработке

Проект принимает воспроизводимые сообщения об ошибках, сфокусированные предложения возможностей, улучшения документации и pull request. Баги и предложения - в Issues по формам Дефект и Пожелание, вопросы и живое обсуждение - в теме Плагин группы Telegram. Агент готовит такую issue сам по правилу скила skills/ai-edt или скилом report-issue наборов правил: обезличенный черновик, отправка только с вашего согласия.

Начните с документов:

  • CHANGELOG.md - что изменилось в каждом выпуске, одной строкой со ссылкой на подробности;
  • CONTRIBUTING.md - сборка, стиль кода и правила участия;
  • SECURITY.md - закрытая передача уязвимостей и модель угроз;
  • docs/PROVENANCE.md - происхождение исходников и история переимплементации.

Структура репозитория:

mcp/
├── bundles/       # реализация OSGi-плагина
├── features/      # устанавливаемая Eclipse feature
├── repositories/  # генерируемый P2-репозиторий
├── targets/       # target platform EDT
└── tests/         # тесты плагина и контрактов

docs/              # руководства, аудиты и release notes
scripts/           # автоматизация разработки и обновления

Перед созданием pull request соберите Maven-реактор и опишите, как изменение было проверено на запущенном экземпляре EDT.

📜 Происхождение проекта

AI-EDT - самостоятельный продукт, созданный на основе EDT-MCP автора DitriX. Проект распространяется под лицензией AGPL-3.0-or-later; сохраненные уведомления и подробная история исходников описаны в LICENSE и docs/PROVENANCE.md.

⚖️ Лицензия

GNU Affero General Public License версии 3.0 или новее. Полный текст - в LICENSE.

About

MCP-сервер внутри 1C:EDT: дает AI-агентам семантический доступ к проекту - код BSL, метаданные, валидация и живая отладка

Topics

Resources

Contributing

Security policy

Stars

20 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages