Skip to main content
Glama
edt-bridge
by BaniBaushev

edt-bridge

MCP-сервер, который переносит функционал Unica на проекты в формате 1C:EDT. Unica жёстко привязана к XML-формату конфигуратора (DESIGNER); edt-bridge реализует аналогичные возможности для EDT-формата как прослойку над EDT-MCP плюс аккуратные файловые операции с resync обратно в EDT.

Это не форк Unica — кодовая база новая, LGPL-лицензия и runtime Unica не используются.

Инструменты (18)

Инструмент

Что делает

Аналог в Unica

edtb_plan_mutations

Валидация пакета мутаций, dryRun-план, planHash, confirmToken для удалений

пакетные операции

edtb_apply_mutations

Атомарное применение пакета: backup → apply → rollback при ошибке → resync

typed packages + dryRun

edtb_form_compile

Компиляция формы из JSON-DSL (create/patch, dryRun, пресеты dialog/list-with-filter/wizard)

form-compile

edtb_form_info

Headless-разбор Form.form → элементы/команды/параметры/события

form-info

edtb_form_remove

Двухфазное удаление формы с пре-чеком BSL-ссылок через search_in_code

form-remove

edtb_mxl_decompile

MXL (табличный документ) → JSON-DSL

mxl-decompile

edtb_mxl_compile

JSON-DSL → MXL

mxl-compile

edtb_mxl_info

Сводка по макету MXL

—

edtb_epf_scaffold

Скаффолдинг внешней обработки/отчёта по БСП (БСП-API, подсистемы)

epf-bsp-init

edtb_help_add

Добавление раздела справки в BSP-объект

help-add

edtb_cfe_borrow_method

Заимствование метода в расширение (CFE) с корректной обёрткой

cfe-borrow

edtb_cfe_init_role

Роль расширения: добавление прав в роль CFE

role-compile (CFE)

edtb_interface_edit

Правка командного интерфейса подсистемы (CommandInterface.xml)

command-interface

edtb_interface_info

Чтение командного интерфейса

—

edtb_cf_panels

Панели конфигурации / начальная страница (Configuration.mdo)

config-panels

edtb_cf_panels_info

Чтение панелей и home page

—

edtb_designer_check

Обёртка 1cv8 DESIGNER /CheckConfig (через ring/1cedtcli)

designer-check

edtb_cf_artifact

Сборка cf/epf артефактов через внешние CLI

build-artifact

Related MCP server: bsl-context

Архитектура

OpenCode / любой MCP-клиент
        │  stdio
        ▼
  edt-bridge (этот сервер)
        ├─ стратегия «edt-mcp»: JSON-RPC → EDT-MCP (http://localhost:8765/mcp)
        │     create_metadata / modify_metadata / delete_metadata /
        │     write_module_source / search_in_code / resync_to_disk /
        │     revalidate_objects / get_server_status
        └─ стратегия «file»: точечные lxml-патчи файлов EDT-проекта
              (только при EDTB_ALLOW_FILE_MUTATIONS=1, backup + resync)

Тонкие свойства форм (inputHint, titleLocation, pagesRepresentation, условное оформление, ChangeAndValidate) EDT-MCP не умеет — они идут файловой стратегией; остальное проходит через живую модель EDT.

Установка

pip install -e .
# зависимости: fastmcp, httpx, lxml, pydantic

Подключение в OpenCode (opencode.json):

{
  "mcp": {
    "edt-bridge": {
      "type": "local",
      "command": ["edt-bridge"],
      "environment": {
        "EDTB_EDT_MCP_URL": "http://localhost:8765/mcp"
      }
    }
  }
}

Переменные окружения

Переменная

Назначение

EDTB_PROJECT_PATH

Корень EDT-проекта (если не передан projectPath в вызове)

EDTB_EDT_MCP_URL

URL EDT-MCP (по умолчанию http://localhost:8765/mcp)

EDTB_ALLOW_FILE_MUTATIONS

1 — разрешить файловые правки проекта (по умолчанию запрещены)

Безопасность

  • Файловые мутации только при EDTB_ALLOW_FILE_MUTATIONS=1.

  • Перед правкой — backup в .edtb-backup/<timestamp>/, ошибка середины пакета откатывает изменения.

  • Удаления двухфазные: сначала план с confirmToken, затем применение по токену.

  • При недоступности EDT-MCP сервер не падает: операции деградируют с warning «выполните resync вручную».

  • Warning при незакоммиченных изменениях в git-дереве проекта.

Разработка

pip install -e ".[dev]"
python -m pytest tests -q   # 133 теста

Спецификация: SPEC.md. Гэпы Unica→EDT, которые закрывает проект: ../gaps.md (в репозитории см. SPEC).

Ограничения

  • Схема EventHandlerExtension и условного оформления восстановлена по докам/коду EDT — проверяйте на живом EDT перед продом.

  • Точные свойства форм-элементов в create_metadata стоит сверять через get_metadata_details(assignable).

  • MXL-парсер покрывает основную модель табличного документа; экзотика (вложенные объекты рисунков) — в TODO.

  • TODO (требуют живого EDT-MCP для верификации): MCP-хендшейк initialize/notifications.initialized перед tools/call; семантика resync_to_disk — проверить, что вызов после файловых правок не затирает их.

  • Rollback при ошибке середины пакета гарантирован для edtb_apply_mutations; в одиночных операциях bsp/extensions/interface при частичном применении смотрите warnings и backup в .edtb-backup/.

Лицензия

LGPL-3.0 (по аналогии с Unica).

Available Tools

18 tools
edtb_apply_mutationsEdtb Apply MutationsA

Применить пакет мутаций по hash свежего плана.

Стратегии: edt-mcp (через proxy) и file (правка XML + resync). dryRun=true возвращает diff-preview без применения. При ошибке середины пакета файловые изменения откатываются из backup'а.

Inputs: ops (required), planHash (required), dryRun, projectPath. Returns: object

edtb_cf_artifactEdtb Cf ArtifactA

Выгрузка/загрузка артефакта поставки .cf/.cfe.

action: "dump" — выгрузить из ИБ в файл path; "load" — загрузить файл в ИБ. Используется 1cv8 DESIGNER (EDTB_DESIGNER_CMD) с параметрами ИБ из EDTB_INFOBASE_PATH (файловая ИБ); без интерактива, с таймаутом.

Inputs: path (required), action (required), projectPath. Returns: object

edtb_cfe_borrow_methodEdtb Cfe Borrow MethodA

Заимствование BSL-метода: перехватчик в расширении (GAP-CFE-BORROW-BSL).

Читает метод из .bsl базового проекта, генерирует перехватчик с корректной сигнатурой (&Перед/&После/&Вместо/&ИзменениеИКонтроль) и вставляет в модуль расширения: через write_module_source (proxy), при недоступности EDT-MCP — файлово (дописывание в .bsl) + resync.

Параметры: baseObjectName: FQN объекта базовой конфигурации (CommonModule.РаботаСФайлами, Catalog.Контрагенты). moduleType: ObjectModule|ManagerModule|RecordSetModule|Module|FormModule. methodName: имя перехватываемого метода. mode: Before|After|Instead|ChangeAndValidate. newName: имя перехватчика (по умолчанию Расш_<ИмяМетода>). extProjectPath: корень проекта расширения (иначе EDTB_PROJECT_PATH). baseProjectPath: корень базового проекта (иначе = extProjectPath). formName: имя формы для moduleType=FormModule. dryRun: вернуть план и текст перехватчика без применения.

Возвращает: dict с полями ok, interceptor, target, via, warnings.

Inputs: methodName (required), moduleType (required), baseObjectName (required), mode, +5 more. Returns: object

edtb_cfe_init_roleEdtb Cfe Init RoleA

Создать «основную роль» расширения (GAP-CFE-NOROLE).

Основной путь — create_metadata Role через proxy (композиция после create_project). Fallback — файловый .mdo роли в src/Roles/<roleName>.mdo + регистрация в Configuration.mdo + resync.

Параметры: roleName: имя роли (по умолчанию "ОсновнаяРоль"). extProjectPath: корень проекта расширения (иначе EDTB_PROJECT_PATH). projectName: имя проекта в EDT для create_metadata. dryRun: вернуть план без применения.

Возвращает: dict с полями ok, roleName, via, warnings.

Inputs: dryRun, roleName, projectName, extProjectPath. Returns: object

edtb_cf_panelsEdtb Cf PanelsB

Правка секций интерфейса в Configuration.mdo.

ops:

  • "panels": [{"panel": "NavigationPanel"|"InformationPanel"|..., "location": "Top"|"Bottom"|"Left"|"Right"|"Hidden"}, ...]

  • "homePage": {"columns": [{"forms": ["Catalog.X.Form.ListForm", ...]}, ...]} dryRun: вернуть unified diff без записи на диск.

Inputs: ops (required), dryRun, projectPath. Returns: object

edtb_cf_panels_infoEdtb Cf Panels InfoC

Текущая раскладка панелей и состав начальной страницы из Configuration.mdo.

Inputs: projectPath. Returns: object

edtb_designer_checkEdtb Designer CheckC

Проверка проекта/расширения: ring edt validate или 1cedtcli.

scope: "project" | "extension". Возвращает {ok, tool, errors, warnings, raw} либо структурированную ошибку CLI_NOT_FOUND с инструкцией по установке.

Inputs: scope, projectPath. Returns: object

edtb_epf_scaffoldEdtb Epf ScaffoldA

Сгенерировать каркас внешней обработки/отчёта (GAP-EPF-ROOT).

Создаёт в src/ExternalDataProcessors|ExternalReports/<name>/: корневой <name>.mdo (валидный EDT XML, producedTypes/ containedObjects, uuid4), ObjectModule.bsl (стабы БСП СведенияОВнешнейОбработке при withBspModules), stub формы Forms/Форма/Form.form + Module.bsl. Регистрирует объект в Configuration.mdo (externalObjects), затем resync.

Параметры: name: имя объекта (идентификатор 1С). kind: "ExternalDataProcessor" или "ExternalReport". withBspModules: добавить ли БСП-стабы в модуль объекта. projectPath: корень EDT-проекта (иначе EDTB_PROJECT_PATH). dryRun: вернуть план без применения.

Возвращает: dict с полями ok, plan/files, warnings.

Inputs: name (required), kind, dryRun, projectPath, +1 more. Returns: object

edtb_form_compileEdtb Form CompileB

Компиляция формы из JSON-DSL (GAP-FORM-DSL/BATCH/PRESETS).

Inputs: dsl (required), objectName (required), mode, dryRun, +2 more. Returns: object

edtb_form_infoEdtb Form InfoB

Разбор Form.form → {elements, commands, params, events} (headless).

Inputs: formName (required), objectName (required), projectPath. Returns: object

edtb_form_removeEdtb Form RemoveA

Удаление формы с пре-чеком BSL-ссылок (GAP-FORM-REMOVE-CASCADE).

Фаза 1 (dryRun/default): search_in_code по имени формы через proxy, отчёт о ссылках и одноразовый confirmToken. Фаза 2: удаление каталога формы (при EDTB_ALLOW_FILE_MUTATIONS=1) + resync; регистрация в .mdo родителя убирается файлово.

Inputs: formName (required), objectName (required), dryRun, projectPath, +1 more. Returns: object

edtb_help_addEdtb Help AddA

Добавить встроенную справку объекту (GAP-HELP-ADD).

Создаёт Help/<lang>.html в каталоге объекта проекта. При updateForms=True пробует выставить IncludeHelpInContents у форм объекта через modify_metadata (proxy); при недоступности EDT-MCP — warning с указанием установить флаг в EDT UI.

Параметры: objectName: FQN объекта, например Catalog.МойСправочник или ExternalDataProcessor.МояОбработка. lang: код языка справки (по умолчанию "ru"). html: содержимое страницы справки; если пусто — генерируется stub. updateForms: обновлять ли IncludeHelpInContents у форм объекта. projectPath: корень EDT-проекта (иначе EDTB_PROJECT_PATH). dryRun: вернуть план без применения.

Возвращает: dict с полями ok, helpFile, forms, warnings.

Inputs: objectName (required), html, lang, dryRun, +2 more. Returns: object

edtb_interface_editEdtb Interface EditA

Правка CommandInterface.xml подсистемы: hide/show/place/order команд.

ops: список операций:

  • {"operation": "hide", "command": "<FQN команды>"}

  • {"operation": "show", "command": "<FQN команды>"}

  • {"operation": "place", "command": ..., "group": "NavigationPanelOrdinary|..."}

  • {"operation": "order", "command": ..., "group": ..., "index": } dryRun: вернуть unified diff без записи на диск.

Inputs: ops (required), subsystemFQN (required), dryRun, projectPath. Returns: object

edtb_interface_infoEdtb Interface InfoC

Текущая видимость, размещение и порядок команд из CommandInterface.xml.

Inputs: subsystemFQN (required), projectPath. Returns: object

edtb_mxl_compileEdtb Mxl CompileB

Скомпилировать JSON-DSL в макет.

strategy: auto — подмножество → modify_metadata, полный DSL → файл; edt-mcp — принудительно через proxy; file — принудительно файл.

Inputs: dsl (required), objectName (required), templateName (required), dryRun, +2 more. Returns: object

edtb_mxl_decompileEdtb Mxl DecompileC

Декомпилировать макет .mxl проекта в JSON-DSL.

Inputs: objectName (required), templateName (required), projectPath. Returns: object

edtb_mxl_infoEdtb Mxl InfoC

Структурная информация о макете из файла (без скриншота, headless).

Inputs: objectName (required), templateName (required), projectPath. Returns: object

edtb_plan_mutationsEdtb Plan MutationsA

Провалидировать пакет мутаций БЕЗ применения.

Для каждой op: проверка схемы, адресуемости цели, оценка риска. Возвращает план с hash для edtb_apply_mutations и confirmToken для deleteMetadata (двухфазное удаление).

Inputs: ops (required), projectPath. Returns: object

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.5/5.0

    Scored across 18 tools

    Disambiguation5/5

    Every tool targets a clearly distinct resource/action pair: generic mutations, forms, MXL layouts, CF artifacts/extensions, interface/panels, and validation. Even the edit/info pairs are unambiguous because they operate on different objects or return different views.

    Naming Consistency4/5

    All tools share the edtb_ prefix and lower_snake_case, and most follow a <resource>_<operation> pattern. plan_mutations and apply_mutations invert the order, and cf_panels/cf_artifact are noun-heavy names, so the pattern is not perfectly uniform but remains predictable.

    Tool Count4/5

    18 tools is on the heavy side, but the server covers several distinct EDT workflows such as forms, MXL, CF artifacts, extensions, interface configuration, and validation. Each tool earns its place, so the count is slightly above ideal rather than bloated.

    Completeness4/5

    The set covers the main lifecycle pairs: plan/apply mutations, compile/decompile/info for forms and MXL, edit/info for interface and panels, plus CF dump/load and validation. Minor gaps exist, such as no direct generic metadata read/list or extension project creation tool, but agents can often work around them via mutations.

    Maintenance

    ActivityStale
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      B
      quality
      B
      maintenance
      MCP server for 1C:Enterprise ERP with 35 tools: metadata inspection, document CRUD, register queries, and BSP integration. First MCP server for Russian ERP systems (300,000+ organizations). JSON-RPC 2.0 compliant BSL implementation.
      51
      47
      MIT
    • F
      license
      Not graded
      quality
      A
      maintenance
      MCP server that validates AI-generated 1C:Enterprise (BSL) code against the real platform API. Catches unknown enum values, wrong argument counts, and missing type members by parsing the platform syntax-helper (shcntx_ru.hbk) — independent Rust implementation with built-in expression validator.
      33
      -
    • A
      license
      Not graded
      quality
      A
      maintenance
      Rust-native code index MCP server with first-class 1C:Enterprise (BSL) support. Static binary, no runtime — 25 MCP tools (18 universal + 7 BSL-specific), tree-sitter AST for 10 languages, federation across multiple repos.
      161
      MIT
    • A
      license
      A
      quality
      C
      maintenance
      MCP server for full lifecycle of 1C binary files (CF/CFE/EPF/ERF) without EDT import: unpack to a temporary directory, read and edit code/forms/help, search, diff, repack, and cleanup. Enables code analysis, patching, and bytecode decompilation of protected modules via natural language.
      20
      8
      MIT