v8unpack-mcp
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.
README
v8unpack-mcp
MCP-сервер (stdio) для полного цикла работы с бинарными файлами 1С
(.cf / .cfe / .epf / .erf) без импорта в проект EDT:
unpack → чтение/правка → repack → cleanup
Единственная точка распаковки — unpack. Все остальные инструменты принимают
dir_path — каталог, созданный unpack, и не выполняют неявной распаковки.
Возможности
| Инструмент | Сигнатура | Что делает |
|---|---|---|
unpack |
(file_path) |
полная распаковка в отдельный временный каталог (без лимита размера), возвращает путь |
list_objects |
(dir_path) |
список объектов внутри контейнера {вид_объекта: [имена]} (только имена) |
get_metadata |
(dir_path, object_path="", detail=false) |
метаданные: вид, счётчики по типам, объект (uuid, синоним, формы, макеты, модули) |
read_module |
(dir_path, object_path="", module_name="") |
исходник BSL-модуля объекта (защищённый помечает encrypted) |
read_bytecode |
(dir_path, object_path="") |
разбор байт-кода закрытого модуля (методы, константы, опкоды) |
search_code |
(dir_path, pattern, ...) |
поиск подстроки/regex по коду, формам, макетам (слои layers) |
set_help |
(dir_path, object_path="", help_html="", overwrite=false) |
записать справку объекта в raw-слой (сборку делает repack) |
diff |
(dir_a, dir_b, full=true) |
сравнение двух распакованных каталогов пообъектно + дифф |
repack |
(dir_path, output_path) |
сборка файла из распакованного каталога |
cleanup |
(dir_path=null, all=false) |
удалить каталог unpack (или все по префиксу) |
Поиск бинарников .cf/.cfe/.epf/.erf на диске — стандартными файловыми
инструментами клиента (glob/list).
Рабочий цикл
unpack(file_path)→{status, dir, file, kind}. Каталогdirсодержит:- организованное дерево (
Тип/Имя+.json/.obj.bsl/ формы / макеты) — чтение и правка кода, форм, макетов, реквизитов; - raw-слой
.v8unpack_raw/(brace-файлы:text/image/help) — дляread_bytecode/set_help.
- организованное дерево (
- Чтение —
list_objects/get_metadata/read_module/read_bytecode/search_code; правка — файлами вdir(илиset_help). repack(dir_path, output_path)→{status, output, bytes}.cleanup(dir_path)(илиcleanup(all=true)).
Ошибки (нет файла/каталога, неверный тип) — исключениями. Каталог после repack
не удаляется автоматически — можно переиспользовать для нескольких сборок.
Схема repack
repack собирает через v8unpack.build(use_raw=True):
- организованное дерево не правилось → raw-слой восстанавливается побайтно (сохраняются help, байт-код, шифрованные модули);
- организованное дерево правилось → пересборка из организованного дерева.
Ограничение (all-or-nothing): в одной сессии либо правки организованного слоя (код/формы), либо raw-слоя (help/байт-код) — не оба сразу. Пообъектное слияние — отдельная задача.
Что ищется в search_code
.bsl— исходники модулей;.json— заголовки объектов, реквизиты и дерево элементов форм;.txt/.html— текстовые и HTML-макеты;.bin(СКД) — схема компоновки данных: бинарный префикс + XML с текстом запроса.
Параметр layers ограничивает области поиска: modules (.bsl), forms (.json),
templates_text (.txt), templates_html (.html), dcc (.bin-СКД). Пусто = все.
Каждое совпадение содержит поле layer.
Не ищется (бинарное): .mxl (табличный документ), картинки, роли (.c1brace),
зашифрованные модули. Парсер MXL — отдельная research-задача (см. .ai/).
Сравнение (diff)
diff(dir_a, dir_b, full=true) сравнивает два распакованных каталога пообъектно:
- перечисляет каталоги объектов (
Тип/Имядля cf/cfe, корень для epf/erf); - собирает файлы каждого объекта (без служебного
.id.json); - статусы:
changed/added/removed/unchanged; - для изменённых строится
unified diff, обрезанный лимитами (MAX_DIFF_LINES=400, MAX_DIFF_FILES=20); full=false— только факт изменения, без построения диффа.
Архитектура
- Ядро распаковки — saby v8unpack
(Python, MIT). Вендорено в
src/v8unpack/с локальными патчами (keep_raw/use_raw,detect_formatдля 8.3.24+, толерантность к неизвестным группам метаданных). - Своя обёртка —
src/v8unpack_mcp:core.py(логика),textlayers.py(извлечение текстовых слоёв),server.py(MCP-сервер). - Распаковка — в отдельный временный каталог
%TEMP%\v8unpack_unpack_*на каждый вызовunpack; общий кэш отсутствует (агент сам управляет жизненным циклом черезcleanup). - Для MCP отключаем multiprocessing v8unpack (серийный пул) и глушим stdout/stderr,
чтобы не ломать stdio-протокол;
OrganizerFile.pack/unpackпропускают.v8unpack_raw.
v8unpack-mcp/
├── src/
│ ├── v8unpack/ # вендоренное ядро saby v8unpack (MIT) + патчи
│ └── v8unpack_mcp/
│ ├── __init__.py
│ ├── __main__.py # python -m v8unpack_mcp
│ ├── core.py # инструменты: unpack/чтение/правка/repack/cleanup
│ ├── textlayers.py # извлечение текстовых слоёв (поиск)
│ ├── bytecode.py # чтение байт-кода закрытых модулей (из raw-слоя)
│ ├── decompiler.py # декомпилятор байт-кода → BSL
│ ├── diffing.py # сравнение распакованных каталогов
│ └── server.py # MCP-сервер (stdio)
├── tests/
│ ├── test_core.py
│ └── test_server_e2e.py
└── pyproject.toml
Установка и запуск
# MCP-сервер (вендоренное ядро v8unpack входит в пакет)
pip install -e .
# запуск (stdio)
python -m v8unpack_mcp
# или консольная команда
v8unpack-mcp
Подключение к клиенту (MCP)
Сервер работает по stdio: каждый клиент сам запускает его отдельным процессом
по одной команде. Все инструменты принимают абсолютные пути к файлам, поэтому
рабочий каталог процесса не важен. Временные каталоги распаковки создаются в
системном %TEMP% с префиксом v8unpack_unpack_.
Рекомендуемая команда запуска — консольный скрипт v8unpack-mcp (создаётся при
pip install) либо python -m v8unpack_mcp. Для GUI-клиентов, которые не наследуют
ваш PATH, надёжнее указывать абсолютный путь к интерпретатору.
Стандартный формат MCP (command + args)
Claude Desktop, Claude Code, Cline, Continue, Roo, VS Code (.mcp.json) и другие
используют общий формат с полями command и args:
{
"mcpServers": {
"v8unpack": {
"command": "v8unpack-mcp",
"args": []
}
}
}
Или с явным интерпретатором:
{
"mcpServers": {
"v8unpack": {
"command": "~/путь/к/python.exe",
"args": ["-m", "v8unpack_mcp"]
}
}
}
Где разместить:
- Claude Desktop —
claude_desktop_config.json(Настройки → Разработчик → Edit Config); - Claude Code —
~/.claude.jsonили проектный.mcp.json; - Cline / Continue / Roo — проектный
.mcp.json(шарится между участниками) или настройки пользователя; - VS Code —
.vscode/mcp.json(для сервера проекта) или пользовательские настройки.
Kilo Code / Kilo CLI (kilo.json, команда — массив)
Формат Kilo отличается: серверы задаются в kilo.json под ключом "mcp", а команда
передаётся одним массивом (без разделения на command+args). Файл — проектный
./kilo.json / .kilo/kilo.json либо глобальный ~/.config/kilo/kilo.json.
// kilo.json (проект)
{
"mcp": {
"v8unpack": {
"type": "local",
"command": ["v8unpack-mcp"],
"enabled": true,
"timeout": 15000
}
}
}
Или через python -m:
{
"mcp": {
"v8unpack": {
"type": "local",
"command": ["python", "-m", "v8unpack_mcp"],
"enabled": true
}
}
}
Сервер включается/выключается в TUI командой /mcps. Унаследованный сервер можно
отключить: { "v8unpack": { "enabled": false } }.
Права на инструменты сервера — по ключам v8unpack_* (glob, срабатывает последнее
совпадение сверху вниз):
{
"permission": {
"v8unpack_*": "allow"
}
}
Рекомендации для нескольких клиентов
- Установка: один раз
pip install -e .(для разработки) илиpip install dist/v8unpack_mcp-0.2.0-py3-none-any.whl(из собранного колеса); зависимостьv8unpackподтянется автоматически изpyproject.toml. - Единый интерпретатор: используйте консольную команду
v8unpack-mcp(попадает вPATHустановки) либо один и тот же абсолютный путь кpython.exeво всех конфигах — тогда любой клиент подхватит ту же установку. - Клиенты независимы: каждый клиент держит свой stdio-процесс; общее состояние — только временные каталоги unpack на диске. Можно смело подключать один и тот же сервер к нескольким клиентам одновременно.
- Пути с пробелами/кириллицей: в JSON-конфигах пути заключайте в кавычки;
в массиве
command(Kilo) элементы экранируются автоматически. - Тихий запуск: сервер глушит прогресс распаковки и работает только по stdio — интерактивный вывод в конфиги добавлять не нужно.
Сборка
pip install build wheel # инструменты сборки
python -m build # создаст dist/v8unpack_mcp-<ver>-py3-none-any.whl и .tar.gz
pip install dist/v8unpack_mcp-0.2.0-py3-none-any.whl # установка из колеса
Тесты
python tests/test_core.py # юнит-смоук ядра
python tests/test_server_e2e.py # end-to-end через stdio
Тесты используют файлы из ../testdata (личные файлы, в git не входят — положите свои).
Ограничения
- Большие
.cf(сотни МБ — ГБ):unpackделает полный extract в отдельный каталог. Пообъектный индекс (чтение одного объекта без полного extract) — следующий шаг. - Табличные макеты (
.mxl) пока не ищутся — бинарный формат, парсер в TODO. - Защищённые (зашифрованные) модули: исходник без пароля не восстановить, но
read_bytecodeразбирает компилированный байт-код, аdecompiler.pyумеет декомпилировать его в BSL (инструментdecompile— в планах). - Правки организованного слоя и raw-слоя (help/байт-код) в одной сессии не сливаются
(all-or-nothing
use_raw).
Заимствованные компоненты
Проект переиспользует открытые разработки сообщества:
| Компонент | Лицензия | Назначение | Ссылка |
|---|---|---|---|
| saby v8unpack | MIT (Copyright 2015 infactum) | ядро распаковки/сборки контейнеров 1С — вендорено в src/v8unpack/ с патчами |
https://github.com/saby-integration/v8unpack |
| EvilBeaver/v8asm | MIT | формат стека и таблица опкодов байт-кода 1С | https://github.com/EvilBeaver/v8asm |
| 1C-inversion | без явной лицензии (учебная, форк v8asm) | алгоритм декомпиляции байт-кода → BSL | https://github.com/ProhorP/1C-inversion |
saby v8unpack включён в состав пакета как src/v8unpack/ (лицензия MIT сохранена в
src/v8unpack/LICENSE). decompiler.py — порт алгоритма 1C-inversion; bytecode.py
использует формат из v8asm.
⚠️ Правовое замечание. См. DISCLAIMER.md и LICENSE:
- Проект распространяется по лицензии MIT «как есть», без гарантий — использование на свой риск.
- Лицензия «1С:Предприятия 8» запрещает изменять код/данные продукта нештатными средствами, а также декомпилировать программную часть системы. Это ограничение защищает платформу и типовые конфигурации 1С; на собственные конфигурации, расширения и внешние обработки/отчёты оно не распространяется — работайте только со своими объектами.
- Декомпиляция закрытых (запароленных) модулей реализована в исследовательских целях и не должна применяться для взлома или снятия защиты чужих конфигураций (ст. 146 УК РФ). Используйте только для восстановления собственных модулей.
Полезные ссылки
- saby v8unpack: https://github.com/saby-integration/v8unpack
- EvilBeaver/v8asm: https://github.com/EvilBeaver/v8asm
- 1C-inversion: https://github.com/ProhorP/1C-inversion
- Формат MXL8 (спека): https://github.com/azubar/SpreadSheet/blob/main/docs/format-mxl.md
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。