⚡ Легковесный MCP-сервер для графа метаданных 1С:Предприятие
🧠 Memgraph + Python FastMCP — в 3 раза меньше RAM чем Neo4j
MCP-сервер, который загружает метаданные конфигурации 1С:Предприятие в графовую базу данных и предоставляет инструменты для AI-ассистентов (Claude Code, Cursor, Windsurf и др.) через Model Context Protocol.
Ваш AI-ассистент получает полное структурное знание о конфигурации 1С:
- 📦 Все объекты метаданных (справочники, документы, регистры, перечисления и т.д.)
- 📝 Реквизиты, ресурсы, измерения с типами
- 🖥️ Формы, элементы управления, события, привязки
- 💻 BSL-код: процедуры, функции, сигнатуры, граф вызовов
- 🔐 Роли и права доступа
- 🔗 Перекрёстные ссылки между объектами (USED_IN)
- 📌 Предопределённые элементы
Оригинальный подход использует Neo4j (графовая БД на JVM). На типичных машинах это означает:
| Компонент | 🐘 Стек Neo4j | 🦎 Lite (Memgraph) | 💰 Экономия |
|---|---|---|---|
| Графовая БД | 1200 -- 1500 МБ | 100 -- 500 МБ | 3 -- 5x |
| 1 MCP-сервис | 200 -- 400 МБ | 80 -- 150 МБ | 2 -- 3x |
| 2 проекта + БД | ~2500 МБ | ~600 -- 1000 МБ | 2.5x |
| 5 проектов + БД | ~3500 МБ | ~1000 -- 1500 МБ | 2.5x |
| Этап | 🐘 Стек Neo4j | 🦎 Lite |
|---|---|---|
| БД готова | 30 -- 45 сек | 2 -- 5 сек ⚡ |
| Загрузка маленькой конфигурации (361 объект) | ~30 сек | 6 сек ⚡ |
| Загрузка большой конфигурации (8000+ объектов) | 5 -- 20 мин | 1 -- 3 мин ⚡ |
| MCP-сервер принимает запросы | после полной загрузки | мгновенно 🎯 |
| Проблема | 🐘 Стек Neo4j | 🦎 Lite |
|---|---|---|
JVM crash (assembler_x86.cpp) |
Бывает на некоторых хостах 😵 | Нет JVM вообще ✅ |
docker stop зависает после краша |
Часто 😤 | Никогда ✅ |
| Transaction timeout при нагрузке | При загрузке 5 сервисов 💥 | Нет (нативный C++) ✅ |
Требуется -Xint (без JIT) |
Да, замедляет всё 🐢 | Не нужен ✅ |
| Строгий порядок запуска обязателен | Да, поэтапно 😰 | Нет, можно все сразу ✅ |
Memgraph (bolt://7687)
|
+--------+-------+-------+--------+
| | | | |
erp_main erp_ext ssl3 do_main do_ext
:6001 :6002 :6003 :6004 :6005
(Python FastMCP, SSE транспорт)
- 🗄️ Memgraph -- графовая БД (Bolt-протокол, Cypher-запросы, совместима с Neo4j-драйвером)
- 🐍 MCP-сервисы -- Python 3.12 + FastMCP, SSE-транспорт
- 🔒 Все проекты используют один Memgraph, изолированы по
project_name
Каждому проекту нужна директория с:
ваш-проект/
metadata/
ОтчетПоКонфигурации.txt # Отчет по конфигурации (UTF-16 или UTF-8)
code/
ConfigDumpInfo.xml # GUID-маппинг (опционально)
ОбщиеМодули/ # BSL исходники
Справочники/
Документы/
...
📋 Экспорт отчёта по конфигурации из Конфигуратора 1С: Конфигурация -> Отчёт по конфигурации (выбрать все объекты, сохранить как
.txt)
Отредактируйте lite/docker-compose.yml -- замените /path/to/erp_main на реальный путь:
volumes:
- /path/to/erp_main:/app/data
⚠️ Для Windows: используйте локальные пути типаC:\1c-data\erp_main, НЕ UNC-пути.
cd lite/
docker compose up -d✅ Всё! Memgraph стартует за ~3 секунды, MCP-сервер начинает принимать запросы мгновенно, данные загружаются в фоне.
# 👀 Проверить что контейнеры запущены
docker ps
# 🔍 Тест SSE-эндпоинта (ожидаемый ответ: 200)
curl -s -o /dev/null -w "%{http_code}" http://localhost:6001/sse --max-time 5claude mcp add erp_main --transport sse http://localhost:6001/sseИли в ~/.claude/settings.json:
{
"mcpServers": {
"erp_main": { "type": "sse", "url": "http://localhost:6001/sse" }
}
}SSE-эндпоинт: http://localhost:6001/sse
Основной инструмент. Принимает JSON с полем "op":
{"op": "list_categories"}
{"op": "list_objects_by_name", "name": "Контрагенты"}
{"op": "object_structure", "name": "ДокументыПредприятия"}
{"op": "list_attributes_with_type", "name": "АМЕ_ДоговорыКонтрагентов"}
{"op": "find_routines_by_name", "name": "ОтправитьЗапрос"}
{"op": "get_routine_body", "id": "do_ext/АМЕ/CommonModules/КоннекторHTTP.ОтправитьЗапрос"}
{"op": "find_usages_of_object", "name": "Контрагенты"}📜 Полный список операций (нажмите чтобы развернуть)
📦 Объекты и категории
| Операция | Описание |
|---|---|
list_categories |
Список всех категорий метаданных |
list_objects_by_category |
Объекты в категории |
list_objects_by_name |
Поиск объектов по имени (CONTAINS) |
object_structure |
Полная карточка объекта: реквизиты, формы, ссылки |
resolve_qn |
Разрешить квалифицированное имя в узел |
resolve_qn_prefix |
Поиск узлов по префиксу QN |
find_by_guid |
Поиск узла по GUID |
get_node_properties |
Все свойства узла |
📝 Реквизиты и структура
| Операция | Описание |
|---|---|
list_attributes / list_attributes_with_type |
Реквизиты объекта с типами |
list_resources / list_resources_with_type |
Ресурсы регистра |
list_dimensions / list_dimensions_with_type |
Измерения регистра |
list_characteristics / list_characteristics_with_type |
Характеристики |
list_tabular_parts |
Табличные части |
list_tabular_attributes |
Реквизиты табличной части |
find_objects_with_tabular |
Объекты с определённой табличной частью |
find_objects_by_attribute_in_tabular |
Поиск по реквизиту в табличной части |
🖥️ Формы
| Операция | Описание |
|---|---|
list_forms |
Формы объекта |
list_form_controls |
Элементы формы |
list_form_events / list_form_event_handlers |
События формы |
list_form_attributes_of_form |
Реквизиты формы |
list_form_commands |
Команды формы (кнопки) |
list_form_bindings |
Привязки элементов к реквизитам |
find_controls_bound_to |
Элементы привязанные к реквизиту |
get_default_forms |
Основные формы |
⚙️ Команды и макеты
| Операция | Описание |
|---|---|
list_commands |
Команды объекта |
list_layouts |
Макеты объекта |
💻 Модули и код
| Операция | Описание |
|---|---|
list_modules_of_owner |
Модули объекта |
list_module_routines |
Процедуры/функции модуля |
list_common_module_routines |
Процедуры общего модуля |
list_exported_routines |
Экспортные процедуры |
get_routine_body |
Полный исходный код процедуры |
find_routines_by_name |
Поиск процедур по имени |
find_routines_by_signature |
Поиск по тексту сигнатуры |
find_unused_routines |
Неиспользуемые процедуры |
🔀 Граф вызовов
| Операция | Описание |
|---|---|
list_callers_of_routine |
Кто вызывает процедуру |
list_callees_of_routine |
Что вызывает процедура |
call_graph_subtree |
Дерево вызовов (глубина 1-3) |
find_calls_between_owners |
Вызовы между двумя модулями/объектами |
📌 Перечисления и предопределённые
| Операция | Описание |
|---|---|
list_enum_values |
Значения перечисления |
list_predefined_of_object |
Предопределённые элементы |
find_predefined_by_name_in_object |
Поиск предопределённого по имени |
find_predefined_by_flag |
Поиск по признаку папка/элемент |
🔐 Роли и доступ
| Операция | Описание |
|---|---|
list_roles_with_access_to_target |
Роли с доступом к объекту |
list_access_targets_of_role |
Объекты доступные роли |
get_access_of_role_to_target |
Конкретные права роли на объект |
🔗 Перекрёстные ссылки
| Операция | Описание |
|---|---|
find_usages_of_object |
Кто ссылается на объект (через типы) |
find_objects_using_object |
На что ссылается объект |
find_documents_making_movements_into_register |
Документы делающие движения в регистр |
find_journals_by_graph |
Графы журналов |
🌐 События и HTTP
| Операция | Описание |
|---|---|
list_event_subscriptions |
Все подписки на события |
list_event_subscriptions_of_object |
Подписки для объекта |
list_http_services |
HTTP-сервисы |
list_url_templates_of_service |
URL-шаблоны |
list_url_methods_of_template |
HTTP-методы |
{"op": "find_routines_by_description", "text": "HTTP", "export": true}
{"op": "get_routine_body", "name": "ВыполнитьЗапрос"}{"text": "премия"}
{"text": "контрагент", "category": "Справочники"}Скопируйте блок сервиса в lite/docker-compose.yml:
1c-metacode-ssl3:
image: svhov/1c-metacode-lite
build: ./mcp-service
restart: unless-stopped
ports:
- "6003:6001" # уникальный порт на хосте
volumes:
- /path/to/ssl3:/app/data # ваши данные
environment:
- PROJECT_NAME=ssl3 # уникальное имя
- MEMGRAPH_URI=bolt://memgraph:7687
- MCP_PORT=6001
- FULL_METADATA_RELOAD=true
depends_on:
memgraph:
condition: service_healthy| Переменная | Описание | По умолчанию |
|---|---|---|
PROJECT_NAME |
Уникальный идентификатор проекта | default |
MEMGRAPH_URI |
Bolt URI для Memgraph | bolt://localhost:7687 |
MCP_PORT |
Порт MCP-сервера внутри контейнера | 6001 |
FULL_METADATA_RELOAD |
Очистить и перезагрузить все данные при старте | false |
LOAD_BSL_SIGNATURES |
Парсить .bsl файлы (процедуры/функции) | true |
LOAD_FORMS_FROM_XML |
Парсить файлы Form.xml | true |
LOAD_PREDEFINED_VALUES |
Парсить предопределённые элементы | true |
LOAD_ROLE_RIGHTS |
Парсить права ролей | true |
Project
+-- Configuration
+-- MetadataCategory
+-- MetadataObject
|-- Attribute (с type_info)
|-- Resource
|-- Dimension
|-- TabularPart
| +-- Attribute
|-- Form
| |-- FormControl --BINDS_TO--> FormAttribute
| +-- FormEvent
|-- EnumValue
|-- PredefinedItem
|-- Command
|-- Layout
+-- Module
+-- Routine --CALLS--> Routine
MetadataObject --USED_IN--> MetadataObject
MetadataObject --GRANTS_ACCESS_TO--> MetadataObject (роли)
- 🚫 Нет векторного/embedding поиска -- только шаблонные запросы, LLM не нужен
- 🚫 Нет запросов на естественном языке -- только JSON-операции (by design: ноль внешних зависимостей)
- 🔤 Поиск по кириллице --
toLower()в Memgraph не работает с кириллицей; поиск использует множественные варианты регистра из Python - 🔗 USED_IN связи строятся только из типов реквизитов (
СправочникСсылка.X), не из всех возможных ссылок
|
Сухов Андрей 🎯 Автор проекта |
Claude (Anthropic) 🤖 AI co-author |
Jeremiah Lowin ⚡ Автор FastMCP |
MIT
Если проект оказался полезен, можете поддержать автора 🙏
| 🏦 Сбербанк | 2202 2054 0027 9540 |
|---|---|
| 👤 Получатель | Сухов Андрей Евгеньевич |