# 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`)
* Работы со структурой управляемых форм (элементы, события, привязки)
* Шаблонных запросов без LLM — мгновенные детерминированные ответы

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

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

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

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

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

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

| Инструмент                       | Описание                                                                                             |
| -------------------------------- | ---------------------------------------------------------------------------------------------------- |
| `search_metadata`                | Структурный поиск объектов метаданных через Cypher или JSON-шаблоны                                  |
| `search_metadata_by_description` | Поиск объектов метаданных по описанию, синониму, справке (полнотекстовый + семантический)            |
| `get_metadata_prompt`            | Получение схемы БД Neo4j, примеров Cypher и списка шаблонных операций                                |
| `execute_metadata_cypher`        | Прямое выполнение Cypher-запросов к Neo4j                                                            |
| `find_objects_using_object`      | Объекты, использующие данный как тип (через USED\_IN)                                                |
| `find_usages_of_object`          | Конкретные реквизиты/измерения/ресурсы, ссылающиеся на объект                                        |
| `find_register_movement_docs`    | Документы, делающие движения в указанный регистр                                                     |
| `search_code`                    | Поиск по BSL-коду процедур/функций (полнотекстовый, семантический, гибридный) с уровнями детализации |
| `business_search`                | Семантический поиск по бизнес-описаниям с обогащением граф-контекстом                                |
| `answer_metadata_question`       | RAG-ответы на аналитические вопросы о метаданных (требует LLM)                                       |
| `get_object_dossier`             | Полное досье объекта: структура, формы, подписки, роли, зависимости, код                             |
| `trace_impact`                   | Анализ влияния — рекурсивный обход зависимостей объекта                                              |
| `trace_call_chain`               | Анализ цепочки вызовов BSL-процедур в обоих направлениях                                             |
| `find_by_guid`                   | Поиск узла метаданных по GUID-идентификатору                                                         |
| `resolve_qualified_name`         | Резолв квалифицированного имени (например, `Справочник.Контрагенты.Реквизит.ИНН`)                    |
| `compare_base_and_extension`     | Сравнение объекта базовой конфигурации и расширения                                                  |

### search\_metadata

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

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

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

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

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

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

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

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

### execute\_metadata\_cypher

Прямое выполнение Cypher-запроса к базе метаданных Neo4j. Используйте схему из `get_metadata_prompt` для построения запросов.

| Параметр | Тип    | По умолчанию | Описание                     |
| -------- | ------ | ------------ | ---------------------------- |
| `query`  | string | —            | Cypher-запрос для выполнения |

**Возврат**: Результаты запроса в JSON-формате.

### 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 | —            | Фильтр по имени конфигурации       |

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

### 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 | `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` |

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

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

**Возврат**: Структурированный текст с заголовками секций и фактами из графа.

### trace\_impact

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

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

**Возврат**: Список зависимых объектов с указанием глубины, типа связи, категории и промежуточного объекта. Результат усекается до 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-процедур — рекурсивный обход графа вызовов в обоих направлениях.

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

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

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

### find\_by\_guid

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

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

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

### resolve\_qualified\_name

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

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

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

### compare\_base\_and\_extension

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

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

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

> Требует предварительной загрузки и базовой конфигурации, и расширения (через `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` | Резолв квалифицированного имени (например, `Справочник.Контрагенты.Реквизит.ИНН`) |

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

| Операция                    | Параметры                       | Описание                        |
| --------------------------- | ------------------------------- | ------------------------------- |
| `get_attribute_type`        | `object_name`, `attribute_name` | Тип указанного реквизита        |
| `list_attributes_with_type` | `type_pattern`                  | Все реквизиты с указанным типом |

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

| Операция                                        | Параметры                                           | Описание                                                      |
| ----------------------------------------------- | --------------------------------------------------- | ------------------------------------------------------------- |
| `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` | Подписки, в которых объект является источником |

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

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

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

| Операция                           | Параметры                  | Описание                             |
| ---------------------------------- | -------------------------- | ------------------------------------ |
| `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_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_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` (по умолчанию `password123`)

В Neo4j Browser можно:

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

### Интерфейс поиска

```
http://localhost:8006/search
```

Простой веб-интерфейс для поиска по метаданным без использования Cursor.

### OpenAPI документация

```
http://localhost:8006/docs
```

Автогенерируемая документация FastAPI с описанием HTTP-эндпоинтов.

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

* Docker Desktop с WSL2
* Лицензионный ключ
* Embedding модель (LM Studio или CPU)
* **Выгрузка конфигурации** из Конфигуратора (отчёт + опционально файлы)
* \~2 ГБ RAM для Neo4j

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

* **XML-выгрузка конфигурации** в файлы — для BSL-графа, форм, подписок, ролей, предопределённых
* **OpenAI-совместимый LLM** — для режима Combined (LLM fallback) и генерации бизнес-описаний

## Порт

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

## Образ Docker

```
comol/1c_graph_metadata:latest
```

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

```
┌──────────────────┐     ┌──────────────────┐
│   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) — все параметры


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.onerpa.ru/mcp-servery-1c/servery/graph-metadata-search.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
