> For the complete documentation index, see [llms.txt](https://docs.onerpa.ru/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.onerpa.ru/mcp-servery-1c/servery/graph-metadata-search.md).

# Graph Metadata Search

Графовый поиск по метаданным конфигурации 1С через Neo4j.

## Назначение

Graph Metadata Search строит граф связей метаданных вашей конфигурации 1С. ИИ начинает понимать, как объекты связаны между собой, а не просто видит их названия. Сервер поддерживает анализ BSL-кода, структуры форм, расширений, подписок на события, прав ролей и предопределённых элементов.

## Возможности

ИИ получает инструменты для:

* Анализа связей документов, регистров, справочников
* Нахождения зависимостей и анализа влияния изменений (`trace_impact`)
* Навигации по графу вызовов BSL-процедур (`trace_call_chain`)
* Получения полного досье объекта за один вызов (`get_object_dossier`)
* Поиска по описаниям, синонимам и справке объектов (`search_metadata_by_description`)
* Семантического и полнотекстового поиска по BSL-коду на уровне процедур
* Сравнения базовой конфигурации и расширения (`compare_base_and_extension`)
* Работы со структурой управляемых и обычных форм (элементы, события, привязки)
* Поиска путей между двумя сущностями графа (`find_graph_path`) и построения затронутого подграфа (`affected_subgraph`)
* Обоснования ответов — на каких фактах построен узел, связь или путь (`explain_graph_evidence`, `explain_path`)
* Работы с доменными связями 1С: права ролей, подписки на события, предопределённые, движения регистров, СКД отчётов
* Управления несколькими графовыми проектами в одной установке (регистрация, пересборка, сравнение поколений)
* Шаблонных запросов без LLM — мгновенные детерминированные ответы

## Примеры использования

* "Какие регистры использует документ Реализация?"
* "Покажи все объекты, связанные со справочником Контрагенты"
* "Какая структура модуля документа Заказ?"
* "Какие формы есть у справочника Номенклатура?"
* "Покажи полное досье справочника Контрагенты"
* "Кто вызывает процедуру ПроверитьЗаполнение?"
* "Какое влияние окажет изменение справочника Номенклатура?"
* "Что изменило расширение МоёРасширение в справочнике Контрагенты?"
* "Найди все неиспользуемые процедуры в документе Реализация"
* "Какие роли имеют доступ к справочнику Контрагенты?"

## Особенности

* Использует **Neo4j** для хранения графа
* Понимает связи между объектами (USED\_IN, DO\_MOVEMENTS\_IN, CALLS, EXTENDS, OVERRIDES)
* Особенно полезен для больших/чужих конфигураций
* Требует docker-compose для запуска
* Поддерживает **шаблонный режим** — работа без LLM через JSON-запросы
* Поддерживает **расширения конфигурации** и сравнение с базой
* **Фоновая индексация** — сервер доступен сразу, обогащение данных выполняется в фоне
* **Веб-интерфейс Neo4j Browser** для визуализации графа: `http://localhost:7474`
* Отдельные HTTP-пробы во всех режимах: опубликованные beta-образы используют `/healthz` для живости процесса и созданного драйвера, `/readyz` — для доступности Neo4j и опубликованного MCP tool surface

## Доступные инструменты MCP

ИИ получает следующие инструменты.

### Поиск и навигация

| Инструмент                       | Описание                                                                                             |
| -------------------------------- | ---------------------------------------------------------------------------------------------------- |
| `search_metadata`                | Структурный поиск объектов метаданных через Cypher или JSON-шаблоны                                  |
| `search_metadata_by_description` | Поиск объектов метаданных по описанию, синониму, справке (полнотекстовый + семантический)            |
| `business_search`                | Семантический поиск по бизнес-описаниям с обогащением граф-контекстом                                |
| `search_code`                    | Поиск по BSL-коду процедур/функций (полнотекстовый, семантический, гибридный) с уровнями детализации |
| `answer_metadata_question`       | RAG-ответы на аналитические вопросы о метаданных (требует LLM)                                       |
| `get_object_dossier`             | Полное досье объекта: структура, формы, подписки, роли, зависимости, код                             |
| `find_by_guid`                   | Поиск узла метаданных по GUID-идентификатору                                                         |
| `resolve_qualified_name`         | Резолв квалифицированного имени (например, `Справочник.Контрагенты.Реквизит.ИНН`)                    |
| `get_metadata_prompt`            | Получение схемы БД Neo4j, примеров Cypher и списка шаблонных операций                                |
| `run_graph_cypher_template`      | Выполнение read-only Cypher-шаблона из allow-list сервера                                            |
| `find_test_artifacts`            | Поиск тестовых артефактов проекта (без их запуска)                                                   |

### Связи и анализ влияния

| Инструмент                    | Описание                                                                      |
| ----------------------------- | ----------------------------------------------------------------------------- |
| `find_objects_using_object`   | Объекты, использующие данный как тип (через USED\_IN)                         |
| `find_usages_of_object`       | Конкретные реквизиты/измерения/ресурсы, ссылающиеся на объект                 |
| `find_register_movement_docs` | Документы, делающие движения в указанный регистр                              |
| `trace_impact`                | Анализ влияния — рекурсивный обход зависимостей объекта                       |
| `trace_call_chain`            | Анализ цепочки вызовов BSL-процедур в обоих направлениях                      |
| `affected_subgraph`           | Что затрагивает изменение транзитивно, с кратчайшим обоснованием каждого узла |
| `find_graph_path`             | K кратчайших путей между двумя конкретными сущностями графа                   |
| `explain_path`                | Развёрнутое обоснование (evidence) каждого шага пути                          |
| `explain_graph_evidence`      | На чём основан конкретный узел или связь графа                                |

### Сущности графа

| Инструмент             | Описание                                                               |
| ---------------------- | ---------------------------------------------------------------------- |
| `resolve_graph_entity` | Резолв ссылки (имя, путь, строка кода) в стабильный идентификатор узла |
| `explain_graph_entity` | Карточка узла: что это и с чем связано                                 |
| `fetch_graph_nodes`    | Разворачивание идентификаторов компактного графа обратно в полные узлы |

### Доменные связи 1С

| Инструмент                | Описание                                                                                                                              |
| ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
| `search_forms`            | Поиск форм проекта — обычных, управляемых или всех                                                                                    |
| `get_form_structure`      | Полная структура формы: элементы, реквизиты, команды, меню, события                                                                   |
| `find_form_links`         | Связи формы: обработчики, привязки, метаданные, модуль. Владелец может быть указан как `ПереносОтпуска` или `Документ.ПереносОтпуска` |
| `get_access_rights`       | Права ролей на объект или на его поле                                                                                                 |
| `get_event_subscriptions` | Цепочка «источник → подписка на событие → обработчик»                                                                                 |
| `find_predefined_values`  | Предопределённые элементы объекта с иерархией                                                                                         |
| `get_register_writers`    | Документы, пишущие движения в регистр, и наоборот                                                                                     |
| `find_object_referrers`   | Обратный индекс: какие объекты обращаются к объекту напрямую из кода, с файлом и строкой каждого обращения                            |
| `get_data_links`          | Ссылочные пути данных в объект и из него                                                                                              |
| `get_report_dcs_lineage`  | Цепочка «отчёт → СКД → наборы данных и запросы → поля»                                                                                |

### Расширения и сравнение

| Инструмент                   | Описание                                                                                                                                                                                                     |
| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `compare_base_and_extension` | Сравнение объекта базовой конфигурации и расширения                                                                                                                                                          |
| `resolve_effective_entity`   | Какая версия сущности работает с учётом слоёв расширений                                                                                                                                                     |
| `compare_graph_scope`        | Что изменилось между двумя поколениями, проектами или расширением и базой. В режиме `extension_ref` базовая сторона — только объекты базы, связанные с расширением рёбрами `EXTENDS`/`OVERRIDES`, и их связи |

### Состояние и наблюдаемость

| Инструмент                | Описание                                                                                  |
| ------------------------- | ----------------------------------------------------------------------------------------- |
| `get_indexing_status`     | Статус фоновой индексации и последняя ошибка, если она была                               |
| `health_graph`            | Живость сервера, доступность Neo4j и провайдеров                                          |
| `get_graph_schema`        | Виды узлов и связей в графе проекта                                                       |
| `get_graph_stats`         | Счётчики графа по типам узлов, связей и evidence                                          |
| `list_graph_indexes`      | Индексы базы с состоянием и наполнением                                                   |
| `get_graph_capabilities`  | Что сервис анализирует сам, а что делегирует                                              |
| `list_graph_capabilities` | Список опубликованных инструментов с версией, хешем и feature-gate                        |
| `get_graph_tool_schema`   | JSON Schema, аннотации и пример вызова инструмента                                        |
| `list_plugins`            | Загруженные плагины, их hooks, таблицы, порядок выполнения, ошибки и текущая plugin epoch |
| `metadata_report`         | Заглушка удалённого монолитного отчёта: сообщает, чем он заменён                          |

### Обычные формы (профиль `admin`)

| Инструмент             | Описание                                                                                |
| ---------------------- | --------------------------------------------------------------------------------------- |
| `unpack_ordinary_form` | Распаковка двоичного `Form.bin` обычной формы в редактируемый рабочий каталог           |
| `build_ordinary_form`  | Обратная сборка рабочего каталога в `Form.bin` с проверкой логической полезной нагрузки |

Обычная форма выгружается Конфигуратором как `Forms/<Имя>/Ext/Form.bin` — двоичный контейнер, а не XML, и обычные разборщики форм её не читают. Пара публикуется под теми же именами, с теми же аргументами и той же полезной нагрузкой, что и у [CodeMetadataSearchServer](/mcp-servery-1c/servery/code-metadata-search.md#unpack_ordinary_form): контракт один, и пара, изученная на одном сервере, вызывается так же на другом. Здесь полезная нагрузка приходит в секции `data` общего конверта ответа. Manifest и workspace считаются недоверенным вводом: абсолютные пути, выход из рабочего каталога, ссылки/junction/reparse points, дубликаты, лишние payload-файлы и превышение лимитов отклоняются до запуска сборщика. При отказе output и staging-артефакты не создаются.

Пара пишет файлы на хосте — рабочий каталог при распаковке и `Form.bin` при сборке, — поэтому публикуется только в профиле `admin`. Ничего не заменяется без явного `overwrite`, но профиль `read-only` существует ровно затем, чтобы клиент не мог изменить вообще ничего, включая файловую систему. К проекту инструменты не привязаны: `project_id` и `generation` к ним не добавляются.

Записи контейнера сборка всегда пишет в открытом виде, без Deflate, что бы ни говорил флаг `deflated` в манифесте: платформа читает потоки `form` и `module` отдельного `Form.bin` только как открытый текст UTF-8 с BOM, а сжатый поток — «Ошибка формата потока» и аварийное завершение толстого клиента (наблюдалось на 8.3.27.2074). Сжатый исходник отмечается в `warnings` при распаковке и в `notes` при сборке.

### Управление проектами (профиль `admin`)

| Инструмент                 | Описание                                                                                                                                                                          |
| -------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `list_graph_projects`      | Список зарегистрированных графовых проектов                                                                                                                                       |
| `get_graph_project_status` | Статус жизненного цикла и загрузки одного проекта                                                                                                                                 |
| `register_graph_project`   | Регистрация проекта в текущем namespace                                                                                                                                           |
| `refresh_graph_project`    | Обновление проекта: `mode=incremental` (по умолчанию) применяет изменения по манифесту исходных единиц, `mode=full` пересобирает проект в staging-поколение с последующим promote |
| `refresh_extension_layers` | Принудительно перечитать слои расширений установки: без `layers` — все слои каталога, с `layers` — только названные                                                               |
| `delete_graph_project`     | Удаление данных проекта и его регистрации                                                                                                                                         |
| `reload_plugins`           | Атомарно перечитать каталог плагинов; требует уникальный `operation_id`                                                                                                           |

**`refresh_graph_project`: что отказывает и до какой записи.** Оба режима отказывают типизированно и до первой записи, а не на середине прогона.

* `mode=incremental` обновляет живой граф по одной исходной единице, и поштучное обновление есть только у BSL-модулей. План, называющий другие виды (дескрипторы метаданных, формы, роли, подписки), отклоняется с `refresh_capability_unavailable`: код перечисляет виды и указывает на `mode=full`. Тем же отказом закрыт контур эмбеддингов — установка, которая их строит, обязана уметь пересобрать инвалидированные, иначе первый вектор не очищается.
* `mode=full` читает зарегистрированный `configuration_root` в отдельное staging-поколение и переключает его на проект одной транзакцией. Staging — это второй `project_id`, поэтому режим существует только при `GRAPH_SCOPE_ENFORCED=true`; без него — отказ `data_store_unavailable`. Пересобираются только структурный граф, BSL-граф, XML-источники и формы, а promote *удаляет* данные активного поколения: проект, у которого уже есть бизнес-описания или эмбеддинги, получает `refresh_capability_unavailable`, а проект без них — список непостроенных контуров в `lanes_not_built`. Вызов возвращает `completed` по завершении: чтение целой конфигурации занимает минуты, это долгий вызов, а не хэндл для опроса.
* Установка без манифеста исходных единиц инкрементального конвейера не имеет: `mode=incremental` там пересобирает проект целиком, ответ приходит с `mode=full` и исходным значением в `requested_mode`, а `changed_paths` отклоняется, а не принимается и игнорируется.

**`refresh_extension_layers`: зачем он нужен отдельно.** Фаза каталога расширений при старте приводит граф в соответствие с *каталогом*: добавляет слой, выгрузка которого появилась, и удаляет слой, выгрузка которого исчезла. Слой, который уже есть в графе, она возвращает как `untouched` — ей неоткуда узнать, какие выгрузки изменились. Одного списка изменённых слоёв тоже недостаточно: дорожки метаданных, BSL и форм по отдельности пропускают то, что уже есть в графе, поэтому перевыгруженный патч под теми же путями остался бы прежним.

Этот инструмент перечитывает слой заново и сливает результат с тем, что есть; ничего не очищается. Проход ограничен слоями каталога: базовая конфигурация слоем каталога не является и этим вызовом не перечитывается, чужие проекты — тоже. Гейт один writer на процесс, оба отказа — до первой записи. Пока индексация этого процесса ещё пишет, вызов отклоняется с `ingestion_busy`. Второй проход по тому же проекту, пока первый держит writer, тоже `ingestion_busy`; если writer-брони нет и охраняет только регистрация in-flight, отказ — `refresh_in_progress`. Пустой список `layers` — это `invalid_argument`, а не «все слои»: «все» получается только если параметр опустить. Один упавший слой не останавливает остальные — он попадает в `failed` и не считается в `refreshed`; падение всех попытанных слоёв даёт `operation_failed` и оставляет `operation_id` свободным. Вызов долгий: он читает выгрузки.

| Параметр       | Тип    | По умолчанию      | Описание                                                                                                                                                                                                                  |
| -------------- | ------ | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `operation_id` | string | —                 | Идентификатор вызова: повтор с тем же значением возвращает первый результат и не читает слои второй раз. Неудачный проход не фиксируется — тот же идентификатор можно повторить                                           |
| `layers`       | list   | все слои каталога | Имена слоёв для перечитывания. Параметр опускают, чтобы перечитать все слои каталога; пустой список отклоняется с `invalid_argument`. Имя, которого в каталоге нет, попадает в `warnings` и не расширяет проход до «всех» |

{% hint style="warning" %}
Инструмент `execute_metadata_cypher` (произвольный Cypher от клиента) удалён. Его заменяет `run_graph_cypher_template`, который выполняет только разрешённые read-only шаблоны в рамках scope, который вызывающая сторона не может расширить.
{% endhint %}

## Профили инструментов

Переменная `MCP_TOOL_PROFILE` определяет, какой набор инструментов сервер публикует в `tools/list`:

| Профиль                | Поведение                                                                                                                                                                                                                                                              |
| ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `admin` (по умолчанию) | Публикуются все инструменты, включая `register_graph_project`, `refresh_graph_project`, `refresh_extension_layers`, `delete_graph_project`, `reload_plugins`, `unpack_ordinary_form`, `build_ordinary_form`                                                            |
| `read-only`            | Инструменты изменения состояния (`register_graph_project`, `refresh_graph_project`, `refresh_extension_layers`, `delete_graph_project`, `reload_plugins`) и пишущая на диск пара `unpack_ordinary_form` / `build_ordinary_form` не регистрируются — клиент их не видит |

## Общие параметры контракта

Каждый опубликованный инструмент дополнительно принимает параметры контракта. Их не нужно объявлять в запросе явно — они добавляются сервером ко всем инструментам единообразно:

| Параметр     | Тип    | Описание                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| ------------ | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `project_id` | string | Графовый проект, к которому относится вызов (см. `list_graph_projects`). Строго обязателен при `GRAPH_SCOPE_ENFORCED=true` и закрытом `GRAPH_SCOPE_MIGRATION_WINDOW=false`. При открытом окне и единственном проекте он временно подставляется с отметкой `deprecated`. Пока `GRAPH_SCOPE_ENFORCED=false`, в графе нет свойств scope и ни один путь чтения ими не ограничен, поэтому вызов без `project_id` не отклоняется, а обслуживается — единственным доступным проектом, а при пустом реестре legacy-scope из `PROJECT_NAME` (или `<unscoped>`, если и он пуст); ответ помечается `deprecated`, а предупреждение об отсутствии ограничения результатов проектом возвращают `list_graph_capabilities` и `health_graph` в `installation_notices`. Отклоняется только вызов без `project_id` в namespace с несколькими доступными проектами: там выбор реальный. Добавляется только к project-scoped инструментам |
| `generation` | string | Поколение графа, из которого должен прийти ответ. По умолчанию — активное; неактуальное поколение возвращает ошибку `stale_generation`. Добавляется только к project-scoped инструментам                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| `cursor`     | string | Токен продолжения из поля `cursor` усечённого ответа. Действителен только для того же проекта, поколения, инструмента и запроса                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| `max_items`  | int    | Размер страницы, ограничен жёстким лимитом сервера (`GRAPH_MAX_ITEMS`)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |

Ответы возвращаются в общем конверте версии `contract_version: "2.0"`. Всегда присутствуют только `contract_version`, `context`, `total` и `returned`; остальные ключи появляются, когда действительно сообщают что-то: `items`, `text`, `nodes`/`edges` или `data`, `truncated` и `truncation_reason`, `cursor`, `warnings`, `degraded`, `evidence`, `limits`, `deprecated`, `request` и `error`. Перечень не исчерпывающий: отдельные инструменты добавляют собственные счётчики. Отсутствие необязательного ключа означает пустое, `false` или `null`; `limits` возвращается только при усечении, а постоянные пределы доступны через capabilities. Подстановка project scope отражается в `deprecated`, а не дублируется в `warnings`. JSON на проводе минифицирован. Инструменты не публикуют `outputSchema`, поэтому FastMCP не дублирует тот же ответ в `structuredContent`. Ошибки типизированы: неизвестный проект, устаревшее поколение, таймаут, некорректный аргумент, некорректный курсор.

{% hint style="warning" %}
Контракт 2.0, обновлённая логика scope и файловый источник Designer XML опубликованы в тегах `latest-beta`, `light-beta` и `arm64-beta`. Stable-теги пока сохраняют контракт 1.x и старый режим подготовки данных. Для конкретного развёртывания всё равно проверяйте `contract_version` и `get_graph_capabilities`, а не только имя тега.
{% endhint %}

Инструменты, не привязанные к проекту (`get_metadata_prompt`, `get_indexing_status`, `health_graph`, `get_graph_capabilities`, `list_graph_capabilities`, `get_graph_tool_schema`, `metadata_report`, `unpack_ordinary_form`, `build_ordinary_form`, а также инструменты управления проектами), получают только `cursor` и `max_items`; `project_id` у административных инструментов — обычный доменный аргумент.

### Краткие сигнатуры остальных инструментов

Ниже перечислены доменные параметры инструментов, для которых дальше нет отдельной таблицы параметров. Общие параметры контракта добавляются по правилам выше. Точные JSON Schema, типы и значения по умолчанию текущего образа возвращает `get_graph_tool_schema`.

| Инструмент                 | Доменные параметры                                                                                                                                       |
| -------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `explain_graph_evidence`   | `ref`, `label`, `key`, `include_inferred`, `min_confidence`, `include_closed`                                                                            |
| `explain_path`             | `path`, `include_inferred`, `min_confidence`, `include_closed`                                                                                           |
| `fetch_graph_nodes`        | `node_ids`                                                                                                                                               |
| `resolve_graph_entity`     | `reference`, `reference_kind`, `entity_kind`, `source_path`, `line`, `form_kind`                                                                         |
| `explain_graph_entity`     | `reference`, `reference_kind`, `entity_kind`, `source_path`, `line`, `relation_kind`, `direction`, `group_limit`, `include_inferred`, `min_confidence`   |
| `find_graph_path`          | `from_ref`, `to_ref`, `direction`, `edge_types`, `max_depth`, `max_paths`, `include_inferred`, `min_confidence`, `form_kind`                             |
| `affected_subgraph`        | `roots`, `direction`, `max_depth`, `edge_types`, `node_kinds`, `stop_kinds`, `include_inferred`, `min_confidence`, `max_nodes`, `max_paths`, `form_kind` |
| `get_graph_capabilities`   | `capability`                                                                                                                                             |
| `search_forms`             | `name`, `form_kind`, `object_name`                                                                                                                       |
| `get_access_rights`        | `role`, `object_name`, `rights`, `field_name`, `direction`                                                                                               |
| `get_event_subscriptions`  | `subscription`, `source_object`, `event`, `handler`, `depth`                                                                                             |
| `find_predefined_values`   | `object_name`, `name`, `is_folder`, `depth`                                                                                                              |
| `get_register_writers`     | `register`, `document`, `direction`                                                                                                                      |
| `find_object_referrers`    | `object_name`, `access`, `min_referrers`                                                                                                                 |
| `get_data_links`           | `object_name`, `direction`, `usage_type`, `attribute_name`, `depth`                                                                                      |
| `get_report_dcs_lineage`   | `report`, `layout`, `data_set`, `depth`, `stages`                                                                                                        |
| `resolve_effective_entity` | `object_name`, `entity_kind`, `entity_name`                                                                                                              |
| `compare_graph_scope`      | `base_generation`, `target_generation`, `compare_project_id`, `extension_ref`, `node_kinds`, `edge_types`                                                |
| `register_graph_project`   | `project_id`, `configuration_root`, `operation_id`, `mode`                                                                                               |
| `refresh_graph_project`    | `project_id`, `operation_id`, `mode`, `changed_paths`, `expected_generation`                                                                             |
| `get_graph_tool_schema`    | `tool`                                                                                                                                                   |
| `unpack_ordinary_form`     | `form_path`, `workspace_path`, `overwrite`, `include`, `max_chars`                                                                                       |
| `build_ordinary_form`      | `workspace_path`, `output_path`, `overwrite`, `verify`                                                                                                   |

### search\_metadata

Структурный поиск объектов метаданных 1С по точным или частичным именам, категориям, связям и свойствам. Обращается к графовой базе Neo4j только через шаблонные и параметризованные запросы.

Поддерживает два формата запросов:

1. **JSON-шаблон** (предпочтительный — мгновенный, детерминированный, без LLM): `{"operation": "list_attributes", "object_name": "Контрагенты"}`
2. **Структурный текст** — запрос нормализуется и обслуживается параметризованными выборками и векторным/полнотекстовым поиском.

{% hint style="info" %}
Cypher-запрос по тексту модели больше не генерируется и не выполняется: это нарушало правило «никакого произвольного Cypher на публичной поверхности» (валидатор пропускал `CREATE`, `MERGE`, `DELETE` и административные операторы). Произвольный Cypher недоступен ни одному инструменту; разрешённые read-only шаблоны выполняет `run_graph_cypher_template`.
{% endhint %}

| Параметр       | Тип    | По умолчанию | Описание                                                                             |
| -------------- | ------ | ------------ | ------------------------------------------------------------------------------------ |
| `query`        | string | —            | JSON-шаблон или структурный запрос на естественном языке                             |
| `project_name` | string | —            | Фильтр по имени конфигурации. Нужен только при нескольких конфигурациях в одной базе |

**Возврат**: Результаты шаблонной операции или параметризованной выборки в текстовом формате.

> Этот инструмент предназначен для СТРУКТУРНЫХ запросов — когда известны имена объектов, категории или типы связей. Для поиска по смыслу используйте `business_search` или `search_metadata_by_description`.

### search\_metadata\_by\_description

Поиск объектов метаданных 1С по описательным полям: имя, Синоним, Комментарий, Описание, справка (`help_text`). Поддерживает полнотекстовый и гибридный (fulltext + vector) режимы.

| Параметр       | Тип    | По умолчанию | Описание                                                                                                                 |
| -------------- | ------ | ------------ | ------------------------------------------------------------------------------------------------------------------------ |
| `query`        | string | —            | Описание искомых объектов на естественном языке. Поддерживается синтаксис Lucene: AND, OR, "точная фраза", подстановка\* |
| `top_k`        | int    | 10           | Максимальное количество результатов                                                                                      |
| `filter_type`  | string | —            | Фильтр по категории метаданных (например, `Справочники`, `Документы`)                                                    |
| `project_name` | string | —            | Фильтр по имени конфигурации. Нужен только при нескольких конфигурациях в одной базе                                     |
| `use_fuzzy`    | bool   | `false`      | Нечёткий поиск — полезен при возможных опечатках или неточном написании                                                  |
| `alpha`        | float  | `0.5`        | Баланс fulltext / vector при гибридном режиме (1.0 = только fulltext, 0.0 = только vector)                               |

**Возврат**: Ранжированные результаты с именем, категорией, score и отрывком из описания.

> При `ENABLE_METADATA_DESCRIPTION_EMBEDDING=true` автоматически включается гибридный режим (fulltext + vector) для более точного ранжирования.

### get\_metadata\_prompt

Возвращает описание схемы базы данных Neo4j и примеры Cypher-запросов. При включённом шаблонном режиме (`TEMPLATE_MODE_ENABLED=true`) также возвращает список всех доступных шаблонных операций с параметрами и примерами JSON.

Параметры отсутствуют.

**Возврат**: Строка со схемой БД, примерами запросов и (опционально) описанием шаблонных операций.

### run\_graph\_cypher\_template

Выполнение одного из разрешённых сервером read-only Cypher-шаблонов. Пришёл на смену `execute_metadata_cypher`: клиент выбирает шаблон по идентификатору и передаёт аргументы, но не может прислать произвольный Cypher и не может расширить scope запроса.

| Параметр      | Тип    | По умолчанию | Описание                                    |
| ------------- | ------ | ------------ | ------------------------------------------- |
| `template_id` | string | —            | Идентификатор шаблона из allow-list сервера |
| `arguments`   | object | —            | Аргументы шаблона                           |

**Возврат**: Результаты шаблонного запроса в конверте контракта. Пустые необязательные поля строк не передаются. Шаблоны `object_attributes`, `object_attribute_properties` и `object_tabular_parts` принимают необязательный `category_name` для выбора категории объекта. `object_attributes` возвращает имя, тип, синоним и комментарий; полный набор свойств доступен через `object_attribute_properties`. Если шаблон `object_tabular_parts` нашёл табличные части, но ни у одной нет колонок, ответ содержит предупреждение `tabular_part_columns_not_indexed`: такое состояние означает незавершённую загрузку, а не доказанное отсутствие колонок. Обновите проект или прочитайте колонки через `get_metadata_details` в CodeMetadataSearchServer.

> Список доступных шаблонов и их параметры возвращает `get_metadata_prompt`.

### find\_objects\_using\_object

Поиск всех объектов метаданных, в которых указанный объект используется как ссылочный тип (через связь USED\_IN). Отвечает на вопрос «Где используется справочник Контрагенты?».

| Параметр       | Тип    | По умолчанию | Описание                                                                          |
| -------------- | ------ | ------------ | --------------------------------------------------------------------------------- |
| `object_name`  | string | —            | Имя объекта без префикса категории (`Контрагенты`, а не `Справочник.Контрагенты`) |
| `project_name` | string | —            | Фильтр по имени конфигурации                                                      |

**Возврат**: Список объектов, ссылающихся на указанный.

### find\_usages\_of\_object

Поиск конкретных реквизитов, измерений и ресурсов, в которых указанный объект используется как тип. Более детальная версия `find_objects_using_object` — показывает каждый отдельный реквизит с владельцем и типом.

| Параметр       | Тип    | По умолчанию | Описание                                 |
| -------------- | ------ | ------------ | ---------------------------------------- |
| `object_name`  | string | —            | Имя объекта без префикса категории       |
| `project_name` | string | —            | Фильтр по имени конфигурации             |
| `limit`        | int    | 100          | Максимальное количество записей в ответе |
| `offset`       | int    | 0            | Смещение для постраничного обхода        |

**Возврат**: Список реквизитов/измерений/ресурсов с указанием объекта-владельца и типа.

### find\_register\_movement\_docs

Поиск всех документов, делающих движения (проводки) в указанный регистр. Отвечает на вопрос «Какие документы делают движения по регистру Продажи?».

| Параметр        | Тип    | По умолчанию | Описание                                                                          |
| --------------- | ------ | ------------ | --------------------------------------------------------------------------------- |
| `register_name` | string | —            | Имя регистра без префикса категории (`Продажи`, а не `РегистрНакопления.Продажи`) |
| `project_name`  | string | —            | Фильтр по имени конфигурации                                                      |

**Возврат**: Список документов с указанием категории.

### search\_code

Поиск по BSL-коду процедур и функций. Работает на уровне отдельных `Routine`-нод (при загруженном BSL-графе) или на уровне `MetadataObject.program_code` (fallback). В гибридном режиме используется Reciprocal Rank Fusion (RRF, k=60) для объединения результатов.

| Параметр       | Тип           | По умолчанию | Описание                                                                             |
| -------------- | ------------- | ------------ | ------------------------------------------------------------------------------------ |
| `query`        | string        | —            | Имя функции, ключевое слово или описание на естественном языке                       |
| `search_type`  | string (enum) | `hybrid`     | Тип поиска: `fulltext`, `semantic`, `hybrid`                                         |
| `top_k`        | int           | 3            | Максимальное количество результатов на каждый тип поиска                             |
| `filter_type`  | string        | —            | Фильтр по категории метаданных                                                       |
| `project_name` | string        | —            | Фильтр по имени конфигурации. Нужен только при нескольких конфигурациях в одной базе |
| `detail_level` | string        | `L1`         | Уровень детализации результатов: `L0`, `L1`, `L2`, `L3`                              |

**Уровни детализации**:

| Уровень | Содержимое                                                          |
| ------- | ------------------------------------------------------------------- |
| `L0`    | Полный код процедуры без обрезки                                    |
| `L1`    | Сигнатура + описание + первые 5 вызовов (по умолчанию)              |
| `L2`    | Краткая карточка: имя, владелец, тип модуля, export-флаг, директива |
| `L3`    | Только имя и score (минимальный расход токенов)                     |

**Примеры**:

* `search_code("ПроверитьЗаполнение")` — поиск по имени функции
* `search_code("расчет скидки", search_type="semantic")` — поиск по назначению
* `search_code("Процедура AND Скидк*", search_type="fulltext")` — синтаксис Lucene
* `search_code("расчет", detail_level="L3", top_k=20)` — максимум результатов, минимум токенов

### business\_search

Семантический поиск объектов метаданных по описанию бизнес-функциональности. Результаты автоматически обогащаются граф-контекстом: реквизиты, табличные части, формы, связи.

| Параметр            | Тип    | По умолчанию | Описание                                                                             |
| ------------------- | ------ | ------------ | ------------------------------------------------------------------------------------ |
| `query`             | string | —            | Описание искомой функциональности на естественном языке                              |
| `top_k`             | int    | 10           | Максимальное количество результатов                                                  |
| `filter_type`       | string | —            | Фильтр по категории метаданных                                                       |
| `include_structure` | bool   | true         | Обогащать результаты граф-контекстом (реквизиты, ТЧ, формы, USED\_IN)                |
| `project_name`      | string | —            | Фильтр по имени конфигурации. Нужен только при нескольких конфигурациях в одной базе |

**Возврат**: Ранжированные результаты с оценками релевантности, бизнес-контекстом и структурой объекта.

> Требует включения `ENABLE_BUSINESS_SEARCH` в конфигурации. При `include_structure=false` возвращается плоский результат без граф-контекста. При недоступности векторного индекса автоматически переключается на полнотекстовый поиск.

### answer\_metadata\_question

Ответы на сложные аналитические вопросы о метаданных 1С с использованием RAG (Retrieval-Augmented Generation). Собирает контекст из графа Neo4j и кода, затем генерирует ответ через LLM.

Используйте этот инструмент, когда вопрос требует РАССУЖДЕНИЯ или АНАЛИЗА нескольких объектов, а не простого поиска. Для простых запросов используйте специализированные инструменты: `get_object_dossier`, `search_metadata`, `business_search`, `search_code`, `trace_impact`.

| Параметр       | Тип    | По умолчанию | Описание                                                                       |
| -------------- | ------ | ------------ | ------------------------------------------------------------------------------ |
| `question`     | string | —            | Аналитический вопрос о метаданных на русском языке. Чем конкретнее — тем лучше |
| `max_tokens`   | int    | 4000         | Максимальное количество токенов для ответа LLM                                 |
| `include_code` | bool   | `true`       | Включать фрагменты кода в контекст                                             |
| `project_name` | string | —            | Фильтр по имени конфигурации                                                   |

**Возврат**: Структурированный ответ с источниками, количеством использованных токенов и оценкой уверенности.

**Примеры**:

* `answer_metadata_question(question="Как реализован механизм скидок?")`
* `answer_metadata_question(question="Какие объекты участвуют в процессе закупки и как они связаны?")`

> Требует настроенного LLM (`OPENAI_API_KEY`).

### get\_object\_dossier

Полное досье объекта метаданных — структурированный паспорт со всеми фактическими данными из графа за один вызов, без LLM.

| Параметр       | Тип    | По умолчанию | Описание                                                                                               |
| -------------- | ------ | ------------ | ------------------------------------------------------------------------------------------------------ |
| `object_name`  | string | —            | Имя объекта метаданных                                                                                 |
| `sections`     | list   | все          | Список секций: `structure`, `forms`, `subscriptions`, `roles`, `dependencies`, `code`, `business_info` |
| `project_name` | string | —            | Фильтр по имени конфигурации                                                                           |

**Секции досье**:

| Секция          | Содержимое                                                                                                                                                                                    |
| --------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `structure`     | Все реквизиты (без внутреннего лимита — усечение и курсор задаёт общий контракт ответа), табличные части с колонками, измерения, ресурсы, команды, макеты                                     |
| `forms`         | Список форм с указанием форм по умолчанию                                                                                                                                                     |
| `subscriptions` | Подписки на события, источником которых является объект                                                                                                                                       |
| `roles`         | Роли с правами доступа к объекту                                                                                                                                                              |
| `dependencies`  | Зависимости USED\_IN (upstream/downstream) и движения регистров                                                                                                                               |
| `code`          | Перечень модулей и процедур (имена и сигнатуры, без тел); процедуры сгруппированы по файлу модуля, у модулей форм и команд в заголовке указано имя формы/команды (`FormModule — ФормаСписка`) |
| `business_info` | AI-описание бизнес-функциональности (если доступно)                                                                                                                                           |

**Возврат**: Структурированный текст с заголовками секций и фактами из графа. Если граф содержит имена табличных частей, но ни одной их колонки, конверт дополнительно возвращает предупреждение `tabular_part_columns_not_indexed`.

### trace\_impact

Анализ влияния — рекурсивный обход зависимостей объекта по связям `USED_IN`, `DO_MOVEMENTS_IN` и `CALLS`.

| Параметр             | Тип           | По умолчанию | Описание                                                                             |
| -------------------- | ------------- | ------------ | ------------------------------------------------------------------------------------ |
| `object_name`        | string        | —            | Имя объекта метаданных                                                               |
| `depth`              | int           | 3            | Глубина обхода (максимум 5)                                                          |
| `direction`          | string (enum) | `downstream` | Направление: `downstream` (кто зависит), `upstream` (от чего зависит), `both`        |
| `relationship_types` | list          | все          | Фильтр типов связей: `USED_IN`, `DO_MOVEMENTS_IN`, `CALLS`                           |
| `project_name`       | string        | —            | Фильтр по имени конфигурации. Нужен только при нескольких конфигурациях в одной базе |
| `response_format`    | string        | `text`       | Формат ответа: `text` (список по уровням глубины) или `compact_graph`                |
| `form_kind`          | string        | `any`        | Учитывать формы: `any`, `ordinary` (обычные), `managed` (управляемые)                |

**Возврат**: Список зависимых объектов с указанием глубины, типа связи, категории и промежуточного объекта. Результат усекается до 500 записей.

**Примеры**:

* `trace_impact(object_name="Контрагенты")` — все downstream-зависимости на глубину 3
* `trace_impact(object_name="Продажи", direction="upstream")` — от чего зависит регистр
* `trace_impact(object_name="Контрагенты", relationship_types=["USED_IN"])` — только ссылочные зависимости

### trace\_call\_chain

Анализ цепочки вызовов BSL-процедур — рекурсивный обход графа вызовов в обоих направлениях.

У `trace_impact.direction`, `trace_call_chain.direction` и `search_code.search_type` допустимые значения перечислены в JSON-схеме MCP (`tools/list`). Значения чувствительны к регистру; неизвестный вариант отвергается MCP-валидацией до выполнения инструмента с указанием разрешённых значений. Например, `trace_call_chain` принимает `callers` или `callees`, но не `both`, а режим `search_type="vector"` следует задавать как `search_type="semantic"`. При пропущенном параметре сохраняется значение по умолчанию из таблицы.

| Параметр       | Тип           | По умолчанию | Описание                                                         |
| -------------- | ------------- | ------------ | ---------------------------------------------------------------- |
| `routine_name` | string        | —            | Имя процедуры/функции                                            |
| `object_name`  | string        | —            | Имя объекта-владельца (для устранения неоднозначности)           |
| `direction`    | string (enum) | `callees`    | Направление: `callees` (кого вызывает), `callers` (кто вызывает) |
| `depth`        | int           | 3            | Глубина обхода (максимум 10)                                     |
| `project_name` | string        | —            | Фильтр по имени конфигурации                                     |

**Возврат**: Дерево вызовов с обогащёнными данными: имя процедуры, объект-владелец, тип модуля, директива, сигнатура, export-флаг, глубина. Результат усекается до 200 записей.

При вызове `Документы.ИмяОбъекта.Метод()` базовый модуль менеджера имеет приоритет, только если он объявляет этот метод. Метод, добавленный расширением в заимствованный модуль менеджера, остаётся доступен в графе вызовов. После обновления beta от 14 сентября 2026 года ранее пропущенные рёбра `CALLS` нужно сформировать заново обновлением BSL-графа. Полная штатная перестройка — `refresh_graph_project` с `mode=full`; на крупном проекте учитывайте стоимость перестройки и embeddings. Одна замена контейнера существующие рёбра не меняет.

> Требует загруженного BSL-графа (`LOAD_BSL_SIGNATURES=true` и `CODE_EXPORT_PATH`).

### find\_by\_guid

Поиск любого узла метаданных по его GUID-идентификатору. Возвращает тип узла, имя и свойства.

| Параметр       | Тип    | По умолчанию | Описание                                                           |
| -------------- | ------ | ------------ | ------------------------------------------------------------------ |
| `guid`         | string | —            | GUID для поиска (например, `8f1c2d34-5678-4abc-9def-0123456789ab`) |
| `project_name` | string | —            | Фильтр по имени конфигурации                                       |

**Возврат**: Информация о найденном узле или сообщение об ошибке.

### resolve\_qualified\_name

Резолв полного квалифицированного имени 1С-метаданных в соответствующий узел графа. Поддерживает паттерны: `Справочник.Контрагенты`, `Справочник.Контрагенты.Реквизит.ОсновнойМенеджер`, `Документ.РеализацияТоваровУслуг.ТабличнаяЧасть.Товары`.

| Параметр         | Тип    | По умолчанию | Описание                                                                         |
| ---------------- | ------ | ------------ | -------------------------------------------------------------------------------- |
| `qualified_name` | string | —            | Точечное квалифицированное имя (например, `Справочник.Контрагенты.Реквизит.ИНН`) |
| `project_name`   | string | —            | Фильтр по имени конфигурации                                                     |

**Возврат**: Информация о резолвленном узле.

### get\_indexing\_status

Возвращает состояние фоновой индексации и обогащения данных. Используйте после запуска сервера и после изменения выгрузки, чтобы проверить, завершились ли этапы загрузки метаданных, BSL-кода, форм, прав и embedding-индексов.

Параметры отсутствуют.

**Возврат**: Строка со статусом индексации, прогрессом этапов и диагностикой последней ошибки, если она возникла.

### compare\_base\_and\_extension

Структурное сравнение объекта базовой конфигурации и его расширения: что добавлено, что переопределено, что осталось из базы.

| Параметр         | Тип    | Описание               |
| ---------------- | ------ | ---------------------- |
| `object_name`    | string | Имя объекта метаданных |
| `extension_name` | string | Имя расширения         |

**Возврат**: Детальное сравнение по секциям — реквизиты, формы, процедуры — с указанием статуса каждого элемента (из базы / переопределён / добавлен расширением).

Процедура или форма с явной связью `OVERRIDES` относится к переопределённым, даже если её имя отличается от имени базового элемента; в добавленных она повторно не перечисляется.

> Требует предварительной загрузки и базовой конфигурации, и расширения (через `EXTENSION_NAME` и `EXTENSION_BASE_PROJECT`).

## Шаблонные операции (Template Mode)

При включённом шаблонном режиме (`TEMPLATE_MODE_ENABLED=true`) инструмент `search_metadata` принимает JSON-запросы вида `{"operation": "...", ...}` и возвращает мгновенные детерминированные ответы без LLM.

### Режимы работы

| Режим         | Переменные                                               | Поведение                                                      |
| ------------- | -------------------------------------------------------- | -------------------------------------------------------------- |
| Template Only | `TEMPLATE_MODE_ENABLED=true`, `TEMPLATE_MODE_ONLY=true`  | Только JSON-запросы, LLM не используется                       |
| Combined      | `TEMPLATE_MODE_ENABLED=true`, `TEMPLATE_MODE_ONLY=false` | JSON → шаблон, текст → LLM, fallback LLM при пустом результате |
| LLM Only      | `TEMPLATE_MODE_ENABLED=false`                            | Только LLM (поведение по умолчанию)                            |

### Доступные операции

#### Структура объектов

| Операция             | Параметры     | Описание                                                                          |
| -------------------- | ------------- | --------------------------------------------------------------------------------- |
| `list_attributes`    | `object_name` | Реквизиты объекта с типами                                                        |
| `list_tabular_parts` | `object_name` | Табличные части с их реквизитами                                                  |
| `object_structure`   | `object_name` | Полная структура: реквизиты, ТЧ, формы, измерения, ресурсы, значения перечислений |
| `list_forms`         | `object_name` | Формы объекта                                                                     |
| `list_enum_values`   | `object_name` | Значения перечисления                                                             |
| `list_resources`     | `object_name` | Ресурсы регистра                                                                  |
| `list_dimensions`    | `object_name` | Измерения регистра                                                                |
| `list_commands`      | `object_name` | Команды объекта                                                                   |
| `list_layouts`       | `object_name` | Макеты объекта                                                                    |

#### Навигация

| Операция                   | Параметры        | Описание                                                                          |
| -------------------------- | ---------------- | --------------------------------------------------------------------------------- |
| `list_objects_by_category` | `category_name`  | Все объекты указанной категории                                                   |
| `list_objects_by_name`     | `name_pattern`   | Поиск объектов по подстроке имени                                                 |
| `find_by_guid`             | `guid`           | Поиск узла по GUID                                                                |
| `resolve_qn`               | `qualified_name` | Резолв квалифицированного имени (например, `Справочник.Контрагенты.Реквизит.ИНН`) |
| `find_objects_by_command`  | `command_name`   | Объекты, содержащие команду с указанным именем                                    |
| `find_objects_by_layout`   | `layout_name`    | Объекты, содержащие макет с указанным именем                                      |

#### Типы данных

| Операция                    | Параметры                       | Описание                                                                                                                                                      |
| --------------------------- | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `get_attribute_type`        | `object_name`, `attribute_name` | Тип указанного реквизита                                                                                                                                      |
| `list_attributes_with_type` | `type_name`                     | Все реквизиты с указанным типом. `type`, `typeName`, `type_pattern` и `typePattern` — совместимые алиасы; `object` и `object_name` вместо типа не принимаются |

#### Связи и зависимости

| Операция                                        | Параметры                                           | Описание                                                      |
| ----------------------------------------------- | --------------------------------------------------- | ------------------------------------------------------------- |
| `find_objects_using_object`                     | `object_name`                                       | Объекты, использующие данный как тип                          |
| `find_usages_of_object`                         | `object_name`                                       | Конкретные реквизиты/ресурсы/измерения, ссылающиеся на объект |
| `find_documents_making_movements_into_register` | `register_name`                                     | Документы, делающие движения в регистр                        |
| `trace_impact`                                  | `object_name`, `depth`, `direction`                 | Рекурсивный анализ зависимостей                               |
| `trace_call_chain`                              | `routine_name`, `object_name`, `direction`, `depth` | Цепочка вызовов BSL-процедур                                  |

#### HTTP-сервисы

| Операция                        | Параметры                       | Описание                                   |
| ------------------------------- | ------------------------------- | ------------------------------------------ |
| `list_http_services`            | —                               | Все HTTP-сервисы конфигурации              |
| `list_url_templates_of_service` | `service_name`                  | Шаблоны URL указанного HTTP-сервиса        |
| `list_url_methods_of_template`  | `service_name`, `template_name` | Методы (GET, POST, ...) указанного шаблона |

#### Подписки на события

| Операция                             | Параметры           | Описание                                        |
| ------------------------------------ | ------------------- | ----------------------------------------------- |
| `list_event_subscriptions`           | —                   | Все подписки на события в конфигурации          |
| `list_event_subscriptions_of_object` | `object_name`       | Подписки, в которых объект является источником  |
| `get_event_subscription_sources`     | `subscription_name` | Объекты-источники указанной подписки на событие |

#### Предопределённые элементы

| Операция                            | Параметры                                | Описание                                          |
| ----------------------------------- | ---------------------------------------- | ------------------------------------------------- |
| `list_predefined_of_object`         | `object_name`                            | Предопределённые элементы объекта с иерархией     |
| `find_predefined_by_flag`           | `object_name`, `flag_name`, `flag_value` | Поиск предопределённых по значению свойства       |
| `find_predefined_by_name_in_object` | `object_name`, `item_name`               | Поиск предопределённого элемента объекта по имени |

#### Права доступа

| Операция                           | Параметры                  | Описание                             |
| ---------------------------------- | -------------------------- | ------------------------------------ |
| `list_roles_with_access_to_target` | `target_name`              | Роли с доступом к объекту            |
| `list_access_targets_of_role`      | `role_name`                | Объекты, к которым имеет доступ роль |
| `get_access_of_role_to_target`     | `role_name`, `target_name` | Детальные права роли к объекту       |

#### Структура форм (XML)

| Операция                   | Параметры                  | Описание                                      |
| -------------------------- | -------------------------- | --------------------------------------------- |
| `list_form_controls`       | `object_name`, `form_name` | Элементы управления формы с иерархией         |
| `list_form_attributes`     | `object_name`, `form_name` | Реквизиты управляемой формы                   |
| `list_form_events`         | `object_name`, `form_name` | События формы и её элементов                  |
| `list_form_commands`       | `object_name`, `form_name` | Команды формы                                 |
| `list_form_bindings`       | `object_name`, `form_name` | Привязки элементов к данным и командам        |
| `list_form_event_handlers` | `object_name`, `form_name` | Пары (событие → обработчик Routine)           |
| `get_default_forms`        | `object_name`              | Формы по умолчанию (элемента, списка, выбора) |

#### BSL-код

| Операция                      | Параметры                                          | Описание                                                  |
| ----------------------------- | -------------------------------------------------- | --------------------------------------------------------- |
| `get_routine_body`            | `routine_name`, `owner_name`                       | Полное тело процедуры с сигнатурой и описанием            |
| `list_modules_of_owner`       | `object_name`                                      | BSL-модули объекта метаданных                             |
| `list_module_routines`        | `object_name`, `module_type` (опц.)                | Процедуры и функции модулей объекта                       |
| `list_common_module_routines` | `module_name`                                      | Процедуры и функции общего модуля                         |
| `find_routines_by_name`       | `routine_name`                                     | Поиск процедур и функций по имени (полнотекстовый индекс) |
| `find_routines_by_signature`  | `search_text`                                      | Поиск процедур и функций по тексту сигнатуры              |
| `find_calls_between_owners`   | `source_object`, `target_object`                   | Вызовы между процедурами двух объектов метаданных         |
| `list_callers_of_routine`     | `routine_name`, `owner_name`                       | Кто вызывает указанную процедуру                          |
| `list_callees_of_routine`     | `routine_name`, `owner_name`                       | Кого вызывает указанная процедура                         |
| `call_graph_subtree`          | `routine_name`, `owner_name`, `depth`, `direction` | Поддерево вызовов на указанную глубину                    |
| `find_unused_routines`        | `owner_name`                                       | Неиспользуемые процедуры объекта                          |
| `list_exported_routines`      | `owner_name`                                       | Экспортные методы объекта                                 |

#### Расширения

| Операция                   | Параметры                        | Описание                                                     |
| -------------------------- | -------------------------------- | ------------------------------------------------------------ |
| `find_base_object`         | `object_name`, `extension_name`  | Базовый объект, на который указывает EXTENDS                 |
| `list_overrides_of_object` | `object_name`, `extension_name`  | Список переопределённых элементов (формы, модули, процедуры) |
| `list_extension_objects`   | `extension_name`, `extends_type` | Все объекты расширения с типом (added/modified)              |

#### Досье

| Операция             | Параметры                 | Описание                                          |
| -------------------- | ------------------------- | ------------------------------------------------- |
| `get_object_dossier` | `object_name`, `sections` | Полное досье объекта (аналогично MCP-инструменту) |

### Пример JSON-запроса

```json
{"operation": "list_attributes", "object_name": "Контрагенты"}
```

```json
{"operation": "trace_impact", "object_name": "Контрагенты", "depth": 2}
```

```json
{"operation": "list_form_controls", "object_name": "Контрагенты", "form_name": "ФормаЭлемента"}
```

## Веб-интерфейсы

### Neo4j Browser

```
http://localhost:7474
```

Логин: `neo4j` Пароль: указанный в `NEO4J_PASSWORD` (значения по умолчанию нет — переменную задаёт развёртывание)

В Neo4j Browser можно:

* Визуализировать граф метаданных
* Выполнять Cypher-запросы
* Исследовать связи между объектами

### Служебные эндпоинты

| Эндпоинт                                                                                                         | Назначение                                                                                                                                                                                                                         |
| ---------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `/healthz`                                                                                                       | Liveness-проба опубликованных beta-образов: процесс жив и драйвер Neo4j создан. Не выполняет запросов к графу                                                                                                                      |
| `/readyz`                                                                                                        | Readiness-проба опубликованных beta-образов: Neo4j доступен и MCP tool surface опубликован                                                                                                                                         |
| `/status`, `/search/index-status`                                                                                | Состояние фоновых задач и индексов — то же, что отдаёт MCP-инструмент `get_indexing_status`                                                                                                                                        |
| `/search`, `/docs`                                                                                               | Страница поиска и описание HTTP API (OpenAPI)                                                                                                                                                                                      |
| `POST /search/update-graph`, `/search/update-business`, `/search/reindex-only`, `/search/generate-business-info` | Административные операции: обновить граф из источников, загрузить бизнес-описания, подтянуть `business_info.html` с диска, явный запуск генерации описаний. Требуют заголовок `X-Admin-Token` (`ADMIN_TOKEN`) — см. «Конфигурация» |

{% hint style="info" %}
Healthcheck в docker-compose использует дешёвый `/healthz`; текущий сервер публикует и короткие алиасы `/health` и `/ready`. Статус индексации и поколений удобнее читать MCP-инструментами `get_indexing_status` и `get_graph_project_status` — они доступны из того же клиента, что и поиск.
{% endhint %}

## Требования

* Docker Engine или Docker Desktop с поддержкой Linux-контейнеров
* Лицензионный ключ
* Embedding модель (LM Studio или CPU)
* **Designer XML-выгрузка конфигурации** из Конфигуратора; готовый текстовый отчёт необязателен
* \~2 ГБ RAM для Neo4j

Для расширенных функций:

* **Проект 1C:EDT** поддерживается через адаптер источника; отдельный текстовый отчёт ему не нужен — базовые метаданные читаются из `.mdo`-дескрипторов проекта при `METADATA_SOURCE=auto` или `edt`
* **OpenAI-совместимый LLM** — для режима Combined (LLM fallback) и генерации бизнес-описаний

## Порт

**8006** (MCP сервер) **7474** (Neo4j Browser) **7687** (Neo4j Bolt)

## Образ Docker

```
comol/1c_graph_metadata:latest-beta
```

Stable: `latest`, `light`, `arm64`; beta: `latest-beta`, `light-beta`, `arm64-beta`. Новые контракт 2.0, project scope и система плагинов сначала публикуются в beta. Подробнее: [Каналы образов](/mcp-servery-1c/kanaly-obrazov.md).

## Архитектура

```
┌──────────────────┐     ┌──────────────────┐
│   MCP Server     │────▶│     Neo4j        │
│   (порт 8006)    │     │  (порт 7687)     │
│                  │     │                  │
│ Template Engine  │     │  Граф метаданных │
│ BSL Parser       │     │  BSL-граф        │
│ Form XML Parser  │     │  Векторные       │
│ Vector Indexer   │     │  индексы         │
└──────────────────┘     └──────────────────┘
         │                        │
         ▼                        ▼
   Cursor IDE              Neo4j Browser
                          (порт 7474)
```

## Быстрый старт

Используйте docker-compose для запуска обоих сервисов.

Подробнее: [Установка](/mcp-servery-1c/servery/graph-metadata-search/ustanovka.md)

## Конфигурация Cursor

```json
{
  "mcpServers": {
    "1c-graph-metadata-mcp": {
      "url": "http://localhost:8006/mcp",
      "connection_id": "1c_graph_service_001"
    }
  }
}
```

## Структура раздела

* [Установка](/mcp-servery-1c/servery/graph-metadata-search/ustanovka.md) — docker-compose
* [Подготовка данных](/mcp-servery-1c/servery/graph-metadata-search/podgotovka-dannyh.md) — выгрузка из Конфигуратора
* [Конфигурация](/mcp-servery-1c/servery/graph-metadata-search/konfiguraciya.md) — все параметры

## Доработка

Сервер расширяется плагинами при `GRAPH_PLUGINS_ENABLED=true`: восемь hooks (четыре в рамках вызова и четыре формирующих граф, полнотекстовый и векторный маршруты) и таблицы `ALIASES`, `TOOL_PRESETS`, `CYPHER_TEMPLATES`. См. [Систему плагинов](/mcp-servery-1c/sistema-pluginov.md) и [Конфигурацию](/mcp-servery-1c/servery/graph-metadata-search/konfiguraciya.md).

## Применение исправления CALLS к существующему графу

Graph beta от 14.09.2026 при обычном запуске обновляет связи CALLS с маркера версии 2 до версии 3. Это включает методы менеджера, добавленные расширением, когда у базового менеджера такого метода нет. Неизменённые модули и их embeddings сохраняются; уже готовые связи доступа к регистрам не пересчитываются. Пересчёт CALLS может занять время, но сам по себе не требует embedding API.

Обновите контейнер расширения, оставив прежние данные, экспорт и параметры. Не нужны удаление графа, `refresh_graph_project(mode="full")` или включение source-unit manifest. Запрет полного refresh при `refresh_capability_unavailable` сохраняется и защищает от потери embeddings.

Если legacy-база ещё не записывала ingestion checkpoint, Graph обнаруживает существующие данные только для базы, явно указанной в `EXTENSION_BASE_PROJECT_ID` либо `EXTENSION_BASE_PROJECT`, и только в том же `MCP_NAMESPACE`. Такая база отображается как inherited; переиндексировать её для регистрации не требуется. Имя должно точно совпадать с project\_id базы, а оба контейнера должны обращаться к общей Neo4j. Отсутствующие данные, чужой namespace, staging и некорректный checkpoint не дают доступ к проекту.
