- Python 76.9%
- JavaScript 23.1%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| .gitignore | ||
| cmtp_payload.py | ||
| library.py | ||
| mcp_server.cjs | ||
| package-lock.json | ||
| package.json | ||
| project_catalog.py | ||
| project_document.py | ||
| project_render.py | ||
| README.md | ||
| semantic_text.py | ||
| smoke_mcp.cjs | ||
| SOURCE_COMMIT | ||
EasyBuilder Pro MCP
MCP-сервер для работы с проектами EasyBuilder Pro (.cmtp, библиотеки .flbx) из ИИ-агентов
(Claude Desktop, Claude Code, pi и любые MCP-клиенты): читать окна, объекты, адреса PLC, аварии, теги, макросы,
метки; править их; копировать объекты и окна; получать картинку окна в PNG. EasyBuilder при этом не запускается
и окна не открываются — нужен только файл EasyBuilder Pro.exe (из него берётся ключ шифрования проекта).
Все правки пишутся в новый файл и требуют SHA исходника из свежего чтения; исходник не перезаписывается. Правки выбранного окна требуют полного разбора этого окна; последующие байты сохраняются как есть. Операции документа требуют разбора всего проекта до конца файла. Проверяйте результат компиляцией в EasyBuilder.
Версии проектов пробуются по умолчанию, без списка разрешённых версий; версия/схема исходного файла сохраняется при правке.
Отличие от базовой 6.10.02.421/schema493 явно отмечается в warnings как unverified_version, даже при успешном чтении.
Проверены 6.10.02.421 и чтение проектов 6.10.02.470, включая цифровые часы (0x4a).
Неизвестные записи с явной длиной (действия, элементы условий) исключаются из результата с warnings и diagnostics,
после них разбор продолжается. Отчёт помечен partial: true, complete: false, read_only: true;
windows_complete показывает, удалось ли пройти все окна. Распознанные объекты текущего окна сохраняются.
У обычного MFC-объекта общей длины нет: неизвестный тип исключается из вида, но дальше разбор останавливается
с предупреждением о непрочитанном остатке. Непрочитанные окна не считаются пустыми, исходный файл не меняется.
Размер неизвестного не угадывается; правки, требующие его разбора, блокируются, частичный отчёт не разрешает редактирование.
Повреждённые заголовки, длины и неподдержанные схемы остаются ошибками.
Установка
Нужны Node.js ≥ 22, Python 3 (только стандартная библиотека), OpenSSL (на Windows есть в Git for Windows)
и EasyBuilder Pro.exe именно 6.10.02.421 для ключа шифрования (проверяется SHA-256).
Это требование к EXE, а не ограничение версии проекта.
# распаковать релиз (или git clone), затем в папке:
npm ci --ignore-scripts
Проверка (копия проекта, чтение, одна правка, картинка окна):
node smoke_mcp.cjs --project "путь/к/проекту.cmtp" --window 10 --ebpro "путь/EasyBuilder Pro.exe" --openssl "путь/openssl"
Подключение к MCP-клиенту
--root — папка с вашими проектами; все пути в инструментах указываются относительно неё.
Связанные .flbx-библиотеки держите рядом с проектом — тогда их картинки видны в ebpro_render_window.
Windows (например claude_desktop_config.json):
{
"mcpServers": {
"ebpro": {
"command": "node",
"args": ["C:\\tools\\ebpro_mcp\\mcp_server.cjs",
"--root", "C:\\work\\hmi",
"--ebpro", "C:\\Program Files\\EasyBuilder Pro\\EasyBuilder Pro.exe",
"--openssl", "C:\\Program Files\\Git\\usr\\bin\\openssl.exe"]
}
}
}
Linux: то же с путями Linux (python3 и openssl из PATH подхватываются по умолчанию).
Инструменты (46)
| Что | Инструменты |
|---|---|
| Картинка окна (без EasyBuilder/Wine/окон) | ebpro_render_window → PNG: рамки объектов, тексты своим шрифтом/размером/цветом, подписи кнопок Combo, картинки состояния 0 из проекта и из связанных .flbx-библиотек (ищутся по имени файла рядом с проектом и в --root; GUID картинки = SHA-1 name_generator EasyBuilder от сохранённого пути библиотеки + номера группы); Combo/Grid/BarGraph/Scale — синие контуры. annotate подписывает слой/объект, вид и адреса. Картинки встроенных библиотек EasyBuilder (в основном клавиатурные окна) — пунктирные рамки. Каркас, не скриншот: цвета фигур, значения, содержимое трендов/таблиц не рисуются |
| Окна, слои, объекты (чтение) | ebpro_inspect_project_windows, ebpro_inspect_project_objects, ebpro_inspect_text, ebpro_inspect_project_catalog |
| Ссылки | ebpro_inspect_project_references (popup-окна в Combo), ebpro_retarget_popups (from → to, фильтр window), ebpro_inspect_project_object_references (Grid) |
| Тексты и геометрия | ebpro_inspect_state_texts (тексты по состояниям: Text/Comment, лампы, кнопки), ebpro_set_state_text (текст одного состояния), ebpro_replace_texts (подстрока во всех редактируемых текстах окна, все состояния), ebpro_set_text, ebpro_set_text_bounds, ebpro_set_object_bounds Также: ebpro_replace_texts (подстрока во всех редактируемых текстах окна), ebpro_set_text, ebpro_set_text_bounds, ebpro_set_object_bounds |
| Стиль текста по состояниям | ebpro_inspect_object_styles (окно: текст, шрифт, размер, цвет #RRGGBB, выравнивание, позиция текста для каждого состояния объекта), ebpro_set_text_style (размер 8..255 и/или цвет; Text/Comment и двухсостоянийный kind 0x17, state 0/1) |
| Окна и слои | ebpro_copy_project_window (копия окна в пустой слот с новым именем; окна 5/10/70 — только в слот после исходного), ebpro_copy_project_object (копия объекта в конец слоя, номер по правилу EasyBuilder, смещение dx/dy; фон окна не копируется; первый экземпляр класса — только в позицию после него), ebpro_rename_project_window, ebpro_rename_project_layer, ebpro_move_project_layer, ebpro_move_project_object, ebpro_transfer_project_object, ebpro_transfer_project_object_window, ebpro_delete_empty_project_layer, ebpro_delete_empty_project_window |
| Документ: порты, метки, теги, журналы, аварии, макросы | ebpro_inspect_project_document, ebpro_set_document_text (сообщение/адрес аварии, адрес тега, код макроса, текст/описание метки, колонка журнала) |
| Аварии и теги: добавить/удалить | ebpro_add_document_item, ebpro_delete_document_item |
| Макросы | ebpro_add_macro (копия настроек, следующий id, новое имя и код), ebpro_delete_macro, ebpro_rename_macro, ebpro_inspect_macro_triggers (какие кнопки запускают какой макрос), ebpro_retarget_macro_triggers (id from → to, фильтр window) |
| Адреса PLC/HMI в объектах | ebpro_inspect_project_addresses, ebpro_set_object_address, ebpro_replace_addresses (массово, exact/prefix, фильтры device/window, по объектам, авариям и тегам) |
Библиотеки .flbx |
ebpro_inspect_library, ebpro_create_library, ebpro_create_library_group, ebpro_rename_library_group, ebpro_copy_library_group, ebpro_delete_library_group, ebpro_copy_library_state, ebpro_delete_library_state |
Подробности параметров — в описаниях инструментов (tools/list). У Python-частей есть CLI:
semantic_text.py (тексты, окна, слои), project_catalog.py (каталог/окна/объекты/ссылки),
project_document.py (документ, аварии, теги, адреса), project_render.py (картинка окна), library.py.
ebpro_compile / ebpro_native_save (компиляция и пересохранение настоящим EasyBuilder в Wine-песочнице на Linux)
в этот пакет не входят — проверяйте результат компиляцией в своём EasyBuilder.
Типовой цикл
- Прочитать:
ebpro_inspect_project_document/ebpro_inspect_project_addresses→ взятьsource_sha256. - Править в новый файл, цепочкой (каждый шаг — SHA предыдущего результата).
- Открыть результат в EasyBuilder и скомпилировать: компилятор ловит, например, несуществующие
переменные PLC и висящие ссылки на удалённые теги.
ebpro_render_window— быстро посмотреть окно без EasyBuilder.
Пример генерации страницы (проверен компиляцией и пересохранением в EasyBuilder): ebpro_copy_project_window
(окно 12 → пустой слот 18, новое имя), копия всплывающего окна (20 → 23) → ebpro_replace_addresses с window: 18
→ ebpro_retarget_popups (20 → 23, window: 18) → ebpro_replace_texts (window: 18) → компиляция.
Замена текстов меняет все состояния многосостоянийных объектов; read-only совпадения (Text mode3, пустые)
пропускает и перечисляет.
Ограничения
- Проверено на одном реальном проекте (драйверы встроенный HMI + CODESYS V3) и производных от него. Другие PLC-драйверы, рецепты с данными, неизученные варианты объектов (например legacy19/1b flags1 в тестовых fixture-проектах) — честный отказ, не догадка.
- Имена тегов и меток не меняются; тег, имя которого используется объектами, не удаляется.
- Макросы: кнопки (MacroTrigger в Combo) ссылаются на id макроса (проверено в EasyBuilder: ссылка на
несуществующий id — ошибка компиляции). Удаление отказывает, если id запускается кнопкой, имя встречается где-либо
ещё в проекте или любой другой макрос вызывает
TRIG_MACRO; макрос 0 (определяет MFC-класс) не удаляется. Переименование отказывает, если старое имя встречается где-либо ещё. Ссылки на макросы из неразобранных мест (например, макрос при запуске в настройках проекта) не видны — после удаления обязательно скомпилируйте проект. - Окна и объекты с первым определением MFC-класса (окна 5/10/70, их первые объекты) копируются только в позицию ПОСЛЕ исходного (в копии определение заменяется ссылкой на оригинал); копия раньше исходного (например 70 → 23) отклоняется — перенос определений не реализован.
- Нет создания объектов с нуля, нового проекта, перестановки устройства или типа адреса.
- Стиль: правятся только размер шрифта и цвет текста (Text/Comment с литеральным текстом и kind 0x17). Имя шрифта, выравнивание, курсив/подчёркивание/мигание, цвета фигур/рамок/заливки и картинки состояний не правятся; рамка объекта при увеличении шрифта не пересчитывается. Размер/чёрный цвет/выравнивание Center сверены с окном свойств EasyBuilder; порядок каналов цвета (COLORREF 0x00BBGGRR) выведен из совпадений с именованными цветами в проекте; два байта стиля не названы. Код макросов массовой заменой не трогается (только отчёт).
- Тексты состояний: только kind_wire 21 (Text/Comment mode0/mode2), 23, 24, 25, 26, 28, 33 и только непустые собственные тексты. Пустые (объект берёт текст из библиотеки меток или подписи нет), Text mode3 (текст из адреса) и kind 27 (текст не попадает в компиляцию) не редактируются; шрифт/цвет не меняются.
- Ничего не исполняется: ни макросы, ни действия, ни связь с PLC/HMI, ни загрузка на устройство.