edt-bridge
edt-bridge is an MCP server that provides a comprehensive toolset for managing 1C:EDT projects, bridging to EDT-MCP for metadata operations and offering file-level mutations, form/MXL manipulation, extension role creation, interface editing, and validation.
Plan and apply mutation packages atomically with dry-run preview, hash verification, backup, and rollback on failure.
Compile forms from JSON-DSL and parse existing forms into structured elements, commands, parameters, and events.
Remove forms with two-phase confirmation, including pre-check of BSL references via
search_in_code.Convert MXL templates to/from JSON-DSL and inspect template structure without screenshots.
Create extension main roles (via proxy
create_metadata) with fallback to file-level creation.Edit subsystem command interfaces: hide, show, place, and reorder commands; view current interface info.
Query panel layouts and home page configuration for command panels.
Run project/extension validation using
ring edt validateor1cedtcli.Leverage EDT-MCP proxy methods (create/modify metadata, write module source, search code, resync) with graceful degradation to file operations and manual resync when EDT-MCP is unavailable.
Supports environment-based configuration (project path, EDT-MCP URL, file mutation allowance) and ensures file mutations are gated behind
EDTB_ALLOW_FILE_MUTATIONS=1.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@edt-bridge Compile the CustomerCard form with the dialog preset"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
edt-bridge
MCP-сервер, который переносит функционал Unica на проекты в формате 1C:EDT. Unica жёстко привязана к XML-формату конфигуратора (DESIGNER); edt-bridge реализует аналогичные возможности для EDT-формата как прослойку над EDT-MCP плюс аккуратные файловые операции с resync обратно в EDT.
Это не форк Unica — кодовая база новая, LGPL-лицензия и runtime Unica не используются.
Инструменты (18)
Инструмент | Что делает | Аналог в Unica |
| Валидация пакета мутаций, dryRun-план, planHash, confirmToken для удалений | пакетные операции |
| Атомарное применение пакета: backup → apply → rollback при ошибке → resync | typed packages + dryRun |
| Компиляция формы из JSON-DSL (create/patch, dryRun, пресеты dialog/list-with-filter/wizard) | form-compile |
| Headless-разбор Form.form → элементы/команды/параметры/события | form-info |
| Двухфазное удаление формы с пре-чеком BSL-ссылок через | form-remove |
| MXL (табличный документ) → JSON-DSL | mxl-decompile |
| JSON-DSL → MXL | mxl-compile |
| Сводка по макету MXL | — |
| Скаффолдинг внешней обработки/отчёта по БСП (БСП-API, подсистемы) | epf-bsp-init |
| Добавление раздела справки в BSP-объект | help-add |
| Заимствование метода в расширение (CFE) с корректной обёрткой | cfe-borrow |
| Роль расширения: добавление прав в роль CFE | role-compile (CFE) |
| Правка командного интерфейса подсистемы (CommandInterface.xml) | command-interface |
| Чтение командного интерфейса | — |
| Панели конфигурации / начальная страница (Configuration.mdo) | config-panels |
| Чтение панелей и home page | — |
| Обёртка | designer-check |
| Сборка 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"
}
}
}
}Переменные окружения
Переменная | Назначение |
| Корень EDT-проекта (если не передан |
| URL EDT-MCP (по умолчанию |
|
|
Безопасность
Файловые мутации только при
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 toolsedtb_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
Scored across 18 tools
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.
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.
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.
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
Related MCP Connectors
mtdt.io MCP: Salesforce DevOps platform connector (metadata deployments, backups and more)
One OAuth connector for your team's remote MCP servers, with Tool Packs, guardrails and logs.
A MCP server built for developers enabling Git based project management with project and personal…
518.PLUS: MCP tool marketplace. Run tools on files, text or JSON, share results, publish your own.
Related MCP Servers
AlicenseBqualityBmaintenanceMCP 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.5147MIT- FlicenseNot gradedqualityAmaintenanceMCP 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-
- AlicenseNot gradedqualityAmaintenanceRust-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.161MIT
- AlicenseAqualityCmaintenanceMCP 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.208MIT