Content
# 1C Metacode MCP Server
Loads metadata and 1C configuration code into a graph database and provides MCP tools for querying the graph.
#### Key Features
- Loading all 1C configuration metadata into the Neo4j graph database from the configuration report.
- Loading managed form data - attributes, form elements, events, commands. Binding form and element events, commands to handlers.
- Loading predefined values and role rights.
- Loading event subscriptions and binding to handlers.
- Loading procedure/function signatures from all modules (including the form module of regular forms), forming a call graph.
- Loading the description and body of all procedures and functions (including the form module of regular forms) with full-text or hybrid search by description.
- Wide connectivity of metadata objects: in attributes, in form controls, in accumulation/information registers, in access rights.
- MCP tools: search_metadata, search_metadata_by_description, search_code
- Support for loading and searching for information on multiple configurations (projects). When searching, you do not need to specify which project to search in. The system automatically filters.
- Ability to search both with LLM (agent mode, which translates a natural language query into a cypher query) and without LLM (template search). A hybrid mode is also possible. Most of the information can be found using templates.
#### Data structure
```mermaid
graph TB
%% Компактная вертикальная структура
Project(["Project<br/>Проект"]) -->|"contains"| Configuration(["Configuration<br/>Конфигурация"])
Configuration -->|"has"| MetadataCategory(["MetadataCategory<br/>Категория метаданных"])
MetadataCategory -->|"contains"| MetadataObject(["MetadataObject<br/>Объект метаданных"])
%% Формы и интерфейс (левая колонка)
MetadataObject -->|"HAS_FORM"| Form(["Form<br/>Форма"])
Form -->|"HAS_CONTROL"| FormControl(["FormControl<br/>Элемент формы"])
Form -->|"HAS_EVENT"| FormEvent(["FormEvent<br/>Событие формы"])
Form -->|"HAS_FORM_ATTRIBUTE"| FormAttribute(["FormAttribute<br/>Атрибут формы"])
FormControl -->|"HAS_EVENT"| FormControlEvent(["FormEvent<br/>Событие элемента"])
FormEvent -->|"HAS_HANDLER"| EventHandler(["Routine<br/>Обработчик события"])
FormControlEvent -->|"HAS_HANDLER"| ControlEventHandler(["Routine<br/>Обработчик события"])
%% Данные и атрибуты (правая колонка)
MetadataObject -->|"HAS_ATTRIBUTE"| Attribute(["Attribute<br/>Атрибут"])
MetadataObject -->|"HAS_TABULAR_PART"| TabularPart(["TabularPart<br/>Табличная часть"])
MetadataObject -->|"HAS_RESOURCE"| Resource(["Resource<br/>Ресурс"])
MetadataObject -->|"HAS_DIMENSION"| Dimension(["Dimension<br/>Измерение"])
TabularPart -->|"HAS_ATTRIBUTE"| TabularAttribute(["Attribute<br/>Атрибут табл. части"])
%% Связи и зависимости (нижняя секция)
MetadataObject -->|"USED_IN"| UsedInTarget(["Target Object<br/>Целевой объект"])
MetadataObject -->|"DO_MOVEMENTS_IN"| RegisterObject(["Register<br/>Регистр"])
MetadataObject -->|"GRANTS_ACCESS_TO"| AccessTarget(["Access Target<br/>Цель доступа"])
%% Модули и код (вертикальная цепочка)
MetadataObject -->|"HAS_MODULE"| Module(["Module<br/>Модуль"])
Module -->|"DECLARES"| Routine(["Routine<br/>Процедура/Функция"])
Routine -->|"CALLS"| CalledRoutine(["Called Routine<br/>Вызываемая процедура"])
%% Дополнительные компоненты (компактно)
MetadataObject -->|"HAS_COMMAND"| Command(["Command<br/>Команда"])
MetadataObject -->|"HAS_URL_TEMPLATE"| UrlTemplate(["UrlTemplate<br/>Шаблон URL"])
MetadataObject -->|"HAS_EVENT_SUBSCRIPTION"| EventSubscription(["EventSubscription<br/>Подписка на событие"])
MetadataObject -->|"HAS_PREDEFINED"| PredefinedItem(["PredefinedItem<br/>Предопределенный элемент"])
%% Связи HTTP и форм (компактно)
UrlTemplate -->|"HAS_URL_METHOD"| UrlMethod(["UrlMethod<br/>Метод URL"])
UrlMethod -->|"HAS_HANDLER"| UrlHandler(["Routine<br/>Обработчик HTTP"])
FormControl -->|"BINDS_TO"| BindTarget(["Bind Target<br/>Цель связывания"])
FormControl -->|"LINKS_TO_COMMAND"| LinkedCommand(["Command<br/>Команда"])
%% Новые добавления: дополнительные сущности и связи
MetadataObject -->|"HAS_LAYOUT"| Layout(["Layout<br/>Макет"])
MetadataObject -->|"HAS_CHARACTERISTIC"| Characteristic(["Characteristic<br/>Характеристика"])
MetadataObject -->|"HAS_ENUM_VALUE"| EnumValue(["EnumValue<br/>ЗначениеПеречисления"])
MetadataObject -->|"HAS_GRAPH"| JournalGraph(["JournalGraph<br/>Граф журнала"])
MetadataObject -->|"HAS_ACCOUNTING_FLAG"| AccountingFlag(["AccountingFlag<br/>ПризнакУчета"])
MetadataObject -->|"HAS_DIMENSION_ACCOUNTING_FLAG"| DimensionAccountingFlag(["DimensionAccountingFlag<br/>ПризнакУчетаСубконто"])
MetadataObject -->|"CONTAINS_OBJECT"| SubsystemChild(["MetadataObject<br/>Дочерний объект<br/>(подсистемы)"])
PredefinedItem -->|"HAS_CHILD"| PredefinedChild(["PredefinedItem<br/>Дочерний элемент"])
FormControl -->|"HAS_CHILD"| FormControlChild(["FormControl<br/>Дочерний элемент"])
Form -->|"HAS_COMMAND"| FormCommand(["Command<br/>Команда формы"])
EventSubscription -->|"HAS_HANDLER"| EventSubHandler(["Routine<br/>Обработчик подписки"])
Command -->|"HAS_HANDLER"| CommandHandler(["Routine<br/>Обработчик команды"])
FormCommand -->|"HAS_HANDLER"| FormCommandHandler(["Routine<br/>Обработчик команды формы"])
%% Уникальные стили для каждого типа узла (упрощено, без лишних подтипов)
classDef projectClass fill:#FF6B6B,stroke:#C92A2A,stroke-width:2px,color:#FFFFFF
classDef configClass fill:#4ECDC4,stroke:#26A69A,stroke-width:2px,color:#FFFFFF
classDef categoryClass fill:#45B7D1,stroke:#1976D2,stroke-width:2px,color:#FFFFFF
classDef objectClass fill:#96CEB4,stroke:#388E3C,stroke-width:2px,color:#FFFFFF
classDef formClass fill:#FFEAA7,stroke:#FD8D3C,stroke-width:2px,color:#000000
classDef formControlClass fill:#AED6F1,stroke:#3498DB,stroke-width:2px,color:#FFFFFF
classDef formEventClass fill:#FF69B4,stroke:#C2185B,stroke-width:2px,color:#FFFFFF
classDef formAttrClass fill:#A3E4D7,stroke:#1ABC9C,stroke-width:2px,color:#000000
classDef attributeClass fill:#85C1E9,stroke:#2980B9,stroke-width:2px,color:#FFFFFF
classDef tabularClass fill:#F7DC6F,stroke:#F39C12,stroke-width:2px,color:#000000
classDef resourceClass fill:#F8C471,stroke:#E67E22,stroke-width:2px,color:#000000
classDef dimensionClass fill:#82E0AA,stroke:#27AE60,stroke-width:2px,color:#FFFFFF
classDef targetClass fill:#CACFD2,stroke:#7F8C8D,stroke-width:2px,color:#000000
classDef moduleClass fill:#98D8C8,stroke:#16A085,stroke-width:2px,color:#FFFFFF
classDef routineClass fill:#F1948A,stroke:#E74C3C,stroke-width:2px,color:#FFFFFF
classDef commandClass fill:#E1BEE7,stroke:#9C27B0,stroke-width:2px,color:#FFFFFF
classDef urlTemplateClass fill:#F9E79F,stroke:#F1C40F,stroke-width:2px,color:#000000
classDef urlMethodClass fill:#D98880,stroke:#CD6155,stroke-width:2px,color:#FFFFFF
classDef eventSubClass fill:#AEB6BF,stroke:#5D6D7E,stroke-width:2px,color:#FFFFFF
classDef predefinedClass fill:#BB8FCE,stroke:#8E44AD,stroke-width:2px,color:#FFFFFF
classDef bindTargetClass fill:#D5DBDB,stroke:#BDC3C7,stroke-width:2px,color:#000000
classDef layoutClass fill:#F0E68C,stroke:#DAA520,stroke-width:2px,color:#000000
classDef characteristicClass fill:#DEB887,stroke:#CD853F,stroke-width:2px,color:#000000
classDef enumValueClass fill:#FFA07A,stroke:#FF6347,stroke-width:2px,color:#FFFFFF
classDef journalGraphClass fill:#20B2AA,stroke:#008B8B,stroke-width:2px,color:#FFFFFF
classDef accountingFlagClass fill:#87CEEB,stroke:#4682B4,stroke-width:2px,color:#FFFFFF
classDef dimensionAccountingFlagClass fill:#DDA0DD,stroke:#BA55D3,stroke-width:2px,color:#FFFFFF
classDef subsystemChildClass fill:#A8E6CF,stroke:#3D9970,stroke-width:2px,color:#FFFFFF
classDef formControlChildClass fill:#B3E5FC,stroke:#03A9F4,stroke-width:2px,color:#FFFFFF
classDef tabularAttributeClass fill:#90CAF9,stroke:#2196F3,stroke-width:2px,color:#FFFFFF
%% Применение цветов (упрощено)
class Project projectClass
class Configuration configClass
class MetadataCategory categoryClass
class MetadataObject,SubsystemChild subsystemChildClass
class Form formClass
class FormControl,FormControlChild formControlChildClass
class FormEvent formEventClass
class FormAttribute formAttrClass
class Attribute,TabularAttribute tabularAttributeClass
class TabularPart tabularClass
class Resource resourceClass
class Dimension dimensionClass
class UsedInTarget,RegisterObject,AccessTarget targetClass
class Module moduleClass
class Routine,CalledRoutine,EventHandler,ControlEventHandler,UrlHandler,EventSubHandler,CommandHandler,FormCommandHandler routineClass
class Command,FormCommand,LinkedCommand commandClass
class UrlTemplate urlTemplateClass
class UrlMethod urlMethodClass
class EventSubscription eventSubClass
class PredefinedItem,PredefinedChild predefinedClass
class BindTarget bindTargetClass
class Layout layoutClass
class Characteristic characteristicClass
class EnumValue enumValueClass
class JournalGraph journalGraphClass
class AccountingFlag accountingFlagClass
class DimensionAccountingFlag dimensionAccountingFlagClass
```
#### Быстрый старт
- Docker и Docker Compose
- Свободные порты 7474/7687 (Neo4j) и 6001 (MCP)
1. Подготовьте .env
Скопируйте пример и заполните значения (минимум пароль Neo4j):
Обязательно задайте пароль Neo4j
NEO4J_PASSWORD=...
В файле .env указываются значение, которые общие для всех контейнеров.
Значения, которые различаются для каждого контейнера лучше указывать непосредственно в docker-compose.yml
2. Подготовьте docker-compose.yml
Скопируйте пример docker-compose.example.yml в туже папку где у вас файл .env и переименуйте в docker-compose.yml
Задайте PROJECT_NAME в сервисе 1c-metacode-prj1 (можно переименовать название сервиса как нравится)
Если у вас только один проект, то второй сервис 1c-metacode-prj2 можно удалить полностью
Если нужно больше двух то продублируйте секцию сервиса и обязательно задайте другой порт на хосте ( меняем только первый порт в этой строке "6001:6001") и другой PROJECT_NAME
3. Разместите данные
В корне папки где располагаются файлы .env и docker-compose.yml создайте структуру для монтирования в контейнер:
- ./data/prj1/metadata — Выгрузка отчет по конфигурации в формате .txt (в папке должен быть только один txt файл). В конфигураторе Конфигурация -> Отчет по конфигурации (в текстовый файл, Вся конфигурация)
- ./data/prj1/code — Выгрузка конфигурации в файлы. В конфигураторе Конфигурация -> Выгрузить конфигурацию в файлы (XML-файлы)
Аналогично по другим проектам:
- ./data/prj2/metadata
- ./data/prj2/code
4. Запуск
```
docker compose up -d
```
#### Сервисы
- Neo4j: http://localhost:7474 (логин neo4j / пароль из NEO4J_PASSWORD)
- Bolt: bolt://localhost:7687
- MCP сервер: http://localhost:6001/mcp (и другие порты, указанные в docker-compose.yml)
#### Логи приложения
```
docker compose logs -f 1c-metacode-prj1
```
#### Первичный запуск
- Приложение создаст индексы в Neo4j
- Проведёт загрузку метаданных из ./data/metadata/*.txt
- При включённых флагах — просканирует ./data/code и догрузит формы, предопределённые значения, права, подписки на события, модули с процедурами и функциями
- Загрузка всех данных (без векторной индексации) занимает около 30 минут для типовой конфигурации Бухгалтерия (может увеличиться если слабый компьютер)
- При включенной векторной индексации она запускается в фоне, после загрузки всех данных. MCP сервер во время векторной индексации доступен для запросов.
- Векторная индексация описаний метадананных и процедур/функций занимает около 30 минут для типовой конфигурации Бухгалтерия с использованием модели Qwen3-Embedding-4B_Q8 на 5070Ti
- Для загрузки требуется оперативной памяти из расчета 4 ГБ для Neo4j и по 6 ГБ на каждую одновременно загружаемую базу. После загрузки потребление памяти значительно снижается.
#### Обновление/перезагрузка данных
- Для полной перезагрузки данных проекта установите в docker-compose.yml переменную для соответсвующего проекта и перезапустите контейнер:
```
FULL_METADATA_RELOAD=true
docker compose restart 1c-metacode-prj1
```
#### Инструменты MCP
Сервер публикует 3 инструмента:
- `search_metadata` — Поиск объектов метаданных по их структурным свойствам, связям, техническим характеристикам и отношениям.
- `search_metadata_by_description` — Поиск объектов метаданных по их семантическому содержанию, используя описания, комментарии, синонимы и внутренние имена.
- `search_code` — Семантический поиск процедур и функций по их описаниям и получение исходного кода BSL.
Более подробно в **[Описание возможностей MCP сервера](./MCP_SERVER_CAPABILITIES.md)**
Транспорт:
- По умолчанию streamable-http (HTTP путь /mcp)
- При MCP_USE_SSE=true — SSE-режим
Подключение клиентов
Используйте любой MCP-совместимый клиент (например, IDE/агенты с поддержкой OpenAI MCP). Укажите:
- transport: streamable-http или sse
- endpoint: http://localhost:6001/mcp
Пример mcp.json для Cline
```
{
"mcpServers": {
"1c-metacode": {
"url": "http://localhost:6001/mcp",
"connection_id": "1c_metacode_service_001",
"alwaysAllow": [],
"type": "streamable-http",
"timeout": 300
}
}
}
```
#### Обновление
Для обновления на новую версию приложения
```
docker compose pull
docker compose down --volumes
docker compose up -d --force-recreate
```
Если нужно начать всё с нуля и удалить полностью базу то выполните
```
docker compose down --volumes
docker compose up -d --force-recreate
```
#### Changelog
##### v1.3.0 - 2025-10-29
- Добавлена поддержка загрузки процедур/функций из модуля формы обычных форм (файлы Form.bin).
- Улучшена скорость загрузки (примерно в 2 раза) путем распараллеливания процесса загрузки на несколько ядер.
- Добавлена векторная индексация описаний процедур/функций, описаний метаданных, а так же гибридный поиск по этим описаниям.
##### v1.2.0 - 2025-10-20
- Добавлена загрузка тела процедур и функций, а также их описаний (комментарии над сигнатурой).
- Возможность полнотекстового поиска процедур и функций по описанию.
- Возможность получения тела процедуры/функции прямо из графовой базы.
- Добавлена поддержка загрузки справки по объектам метаданным с возможностью полнотекстового поиска объектов метаданных по этой справке, а так же по другим описательным полям.
##### v1.1.0 - 2025-10-07
- Добавлена поддержка загрузки подписок на события
- Добавлена поддержка загрузки модулей с процедурами/функциями и формирования графа вызовов
##### v1.0.0 - 2025-09-30
- Первоначальный релиз с загрузкой метаданных 1С в Neo4j
- Поддержка MCP инструментов для поиска метаданных
Connection Info
You Might Also Like
markitdown
MarkItDown-MCP is a lightweight server for converting URIs to Markdown.
markitdown
Python tool for converting files and office documents to Markdown.
Filesystem
Node.js MCP Server for filesystem operations with dynamic access control.
Sequential Thinking
A structured MCP server for dynamic problem-solving and reflective thinking.
Fetch
Retrieve and process content from web pages by converting HTML into markdown format.
TrendRadar
TrendRadar: Your hotspot assistant for real news in just 30 seconds.