1c-configuration
Allows using Ollama as an embedder for semantic search, providing an OpenAI-compatible API to generate vector embeddings for configuration objects and BSL code.
Allows using OpenAI's embeddings API as a backend for semantic search, enabling vector indexing of configuration metadata and code.
Stores the configuration graph (objects, elements, symbols, calls, references) in a local SQLite database, enabling structural queries without external services.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@1c-configurationWhich module procedures call 'UpdatePrices'?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
1C Configuration MCP Server
MCP-сервер для навигации по конфигурации 1С:Предприятие, выгруженной в исходный код (XML-метаданные + BSL-модули). Предназначен для подключения LLM-агентов (Claude, Cursor и любых MCP-клиентов) к «внутреннему устройству» конфигурации: справочники, документы, регистры, реквизиты, процедуры модулей и граф вызовов.
Транспорт: streamable HTTP (FastMCP 4.x), эндпоинт http://<host>:8765/mcp.
Возможности
Разбор XML-экспорта конфигурации (объекты, элементы, типы данных, ссылки между объектами) —
src/config_parser.py.Разбор BSL-модулей: процедуры/функции, видимость (
Экспорт), вызовы, ссылки на объекты конфигурации (Справочники.X,Документы.Y, ...) —src/bs_parser.py.SQLite-граф (объекты → элементы, модули → символы, вызовы, ссылки) —
src/graph.py.Семантический поиск: внешний эмбеддер (OpenAI-совместимый
/embeddings) → ANN-поиск в Qdrant → внешний реранкер (Cohere/Jina-совместимый/rerank) —src/embedder.py,src/reranker.py.Инкрементальный индекс: хэши контента в SQLite, переэмбедятся только изменившиеся узлы; удалённые объекты чистятся из обоих хранилищ —
src/indexer.py.
Related MCP server: Onec Platform Help MCP Server
Требования
Python 3.11+
Qdrant (сервер по HTTP или локальный режим на диске)
Эмбеддер с OpenAI-совместимым API: Ollama (
/v1), vLLM, TEI, Jina, OpenAI, Azure — любой, кто отвечает наPOST /embeddingsв формате OpenAI.Реранкер (необязаtельно): Cohere/Jina-совместимый
POST /rerankБез реранкера:search_configработает, возвращается порядок ANN-поиска (graceful fallback).
Деградация без внешних сервисов
Компонент | Что недоступно | Что работает |
Без эмбеддера |
| Все структурные инструменты: |
Без реранкера | Переупорядочивание кандидатов |
|
Без Qdrant |
| SQLite-граф полностью функционален; индексация с |
Индексация без эмбеддера: python -m src.indexer --no-vectors — строит только
SQLite-граф (объекты, элементы, рёбра). Семантический поиск появится после
заполнения embedder.base_url и повторного прогона индексации.
Установка
git clone --recurse-submodules https://github.com/axel-avb/mcp-1c-metadata.git
# или, после обычного clone:
git submodule update --init --recursive
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txtКонфигурация
Приоритет (высший побеждает):
Переменные окружения (
ONEC_*) — для секретов и деплоя.JSON-файл конфигурации (путь из
ONEC_MCP_CONFIG, по умолчанию./config.json).Значения по умолчанию в
src/config.py.
Шаблон: config.json.example. Скопируйте в config.json и заполните.
{
"config_root": "/path/to/onec/sources",
"project_data_dir": "/path/to/onec/project-export",
"xml_root": "/path/to/onec/code",
"txt_root": "/path/to/onec/metadata",
"qdrant": { "url": "http://localhost:6333", "collection": "onec_config" },
"graph_db_path": "./data/graph.sqlite3",
"embedder": {
"base_url": "http://localhost:11434/v1",
"api_key": "",
"model": "bge-m3",
"dimensions": 1024,
"batch_size": 32
},
"reranker": {
"endpoint": "",
"api_key": "",
"model": ""
},
"search": { "top_k": 5, "candidate_multiplier": 4 },
"host": "0.0.0.0",
"port": 8765,
"auth_token": "",
"payload_only": false,
"node_id_in_payload": true
}Если auth_token (или ONEC_AUTH_TOKEN) задан, сервер требует заголовок
Authorization: Bearer <token> на всех HTTP-запросах. Пустое значение —
аутентификация отключена.
Переменные окружения
Переменная | Описание |
| Корень исходников конфигурации 1С (XML/BSL) |
| URL Qdrant, напр. http://localhost:6333 |
| API-ключ Qdrant (если включён) |
| Имя коллекции (по умолчанию onec_config) |
| Путь к SQLite-графу |
| Base URL эмбеддера (OpenAI-совместимый /embeddings) |
| Ключ эмбеддера |
| Модель эмбеддинга (по умолчанию bge-m3) |
| Размерность вектора (должна совпадать с моделью) |
| Пакетность эмбеддинга |
| URL реранкера (Cohere/Jina-совместимый), пусто = выключен |
| Ключ реранкера |
| Модель реранкера (необязательно) |
| Сколько результатов возвращать |
| Адрес HTTP-сервера (по умолчанию 0.0.0.0) |
| Порт HTTP-сервера (по умолчанию: 8765) |
| Токен аутентификации: если задан, требуется заголовок |
| Корень XML-выгрузки ( |
| Корень TXT-отчёта ( |
|
|
|
|
Полный точный список — в _ENV_MAP в src/config.py.
Формат исходников конфигурации
Ожидается стандартная выгрузка «конфигурация в исходном коде»:
<config_root>/
Config.xml # корневые метаданные
Catalogs/Catalog.Номенклатура/
Info.xml # метаданные объекта
ObjectModule.bsl # модуль объекта
ManagerModule.bsl # модуль менеджера
Forms/FormНоменклатуры/FormModule.bsl # модуль формы
Documents/Document.Реализация/...
Constants/Constant.ИнформацияОКомпании/...
Registers/AccumulationRegisters/Register.Обороты/...
Registers/InformationRegisters/Register.ЦеноваяИнформация/...Парсер терпим к вариациям: принимает и плоские элементы (<Type>Catalog</Type>),
и пары «свойство-значение». Имена объектов нормализуются к полной форме с
русским префиксом типа: Каталог.Номенклатура, Документ.Реализация.
В tests/sample_config/ лежит минимальный образец для ручного прогона.
Индексация
# инкрементальная (по умолчанию): переэмбедятся только изменившиеся узлы
python -m src.indexer
# полный пересбор
python -m src.indexer --full
# без векторов (только граф в SQLite) — для отладки парсеров
python -m src.indexer --no-vectors
# переиндексация одного объекта (русское или английское имя)
python -m src.indexer --object Справочник.Колледжи
python -m src.indexer --object Catalog.Колледжи
# эмбеддить только один слой (object|element|symbol); граф остаётся в SQLite
python -m src.indexer --kind symbol
# обновить только payload в Qdrant без переэмбеддинга (после смены флагов)
python -m src.indexer --payload-only
# другой файл конфигурации
python -m src.indexer --config /path/to/config.jsonВывод — статистика: число объектов, BSL-файлов, узлов/рёбер графа и обновлённых векторов. Индексация идемпотентна; при удалении объектов из конфигурации их узлы и векторы удаляются из хранилищ.
Запуск MCP-сервера
python -m src.server
# INFO: Starting MCP server '1c-configuration' with transport 'streamable-http'
# on http://0.0.0.0:8765/mcpСервер читает ту же конфигурацию и держит в памяти граф, клиент эмбеддера и клиент реранкера. Векторные запросы к Qdrant выполняются на лету.
Инструменты (tools)
Инвентарь и структура
Инструмент | Назначение |
| Инвентарь: |
| Досье объекта одним вызовом: счётчики, структура, формы, BSL-модули, использование |
| Структура объекта по секциям (attributes/tabular_parts/forms/commands/layouts/resources/dimensions) |
| Типизированные дети объекта (реквизиты/ресурсы/измерения/…) |
| Разрешение ссылки в карточку узла (object/element/symbol) |
| Объекты по типам с числом элементов |
| Элементы объекта: реквизиты, табличные части, команды |
Поиск
Инструмент | Назначение |
| Семантический поиск по объектам/элементам/процедурам (embed → Qdrant → rerank) |
| Найти объекты по описанию или по имени дочернего элемента («где поле X») |
| Дочерние элементы по всему проекту с контекстом владельца |
| Кто ссылается на объект / какие модули его используют |
BSL
Инструмент | Назначение |
| Семантический поиск по телам процедур/функций |
| Процедура/функция: сигнатура, видимость, модуль, тело |
| Кто вызывает процедуру (входные рёбра) |
| Что вызывает процедура (выходные рёбра) |
| Граф вызовов: |
| Тело рутины с пагинацией |
| Модули объекта и их рутины |
| Поиск рутин по имени/экспорту/сигнатуре |
Ссылки и служебные
Инструмент | Назначение |
| Ссылки на объект и от объекта |
| Пересбор индекса в фоне |
| Статус фоновой переиндексации |
| Статистика графа: узлы/рёбра по видам |
Дорожная карта оставшегося (полная — PLAN.md §13):
Слой B (нужна интеграция парсеров из сабмодуля):
find_predefined_values,get_event_subscriptions,get_access_rights.Слой C (отложено, нет модели):
get_extension_object_diff,get_form_structure/find_form_links,find_dependency_paths.
Расход токенов на инициализацию модели
Полный tools/list для всех 23 инструментов — ~16 800 символов (~4.2 тыс.
токенов при латинском тексте). Эта сумма уходит на каждый старт/повторную
инициализацию клиента (загрузка схемы инструментов в контекст).
Большую часть объёма составляет JSON-schema (генерируется FastMCP автоматически),
а не docstring'и. В pre-4-cut из docstring'ов убраны многословные перечисления
значений (sections, element_type, search_by, списки типов) — они
дублировали схему; экономия ~1К символов без потери функциональности.
Примеры вызовов (что видит LLM-агент):
list_objects(type="catalog")
→ «Каталоги (catalog) — 2
• Каталог.Номенклатура — Номенклатура [5 elem.]
• Каталог.ПрайсЛист [12 elem.]»
search_config(query="где хранится цена товара", top_k=5)
→ [0.87] element: Цена [Число(10,2)] (объект: Каталог.Номенклатура)
[0.74] object: РегистрСведений.ЦеноваяИнформация ...
get_callers(name="РассчитатьСуммуРеализации")
→ Callers of РассчитатьСуммуРеалиции:
• Обработать — Документ.Реализация (Documents/Document.Реализация/ObjectModule.bsl)Подключение MCP-клиента
Эндпоинт: http://<host>:<port>/mcp (transport: streamable HTTP).
Claude Desktop / Claude Code
{
"mcpServers": {
"1c": {
"url": "http://localhost:8765/mcp",
"headers": { "Authorization": "Bearer <token>" }
}
}
}Заголовок headers нужен только если задан auth_token.
Python (FastMCP Client)
from fastmcp import Client
async def main():
async with Client("http://localhost:8765/mcp") as c:
print(await c.call_tool("list_objects", {}))
print(await c.call_tool("search_config", {"query": "цена товара"}))Проверка вручную
# список инструментов (MCP JSON-RPC)
curl -s http://localhost:8765/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'Docker
docker-compose.yml поднимает Qdrant + сервер. Исходники конфигурации
монтируются в /data/config, эмбеддер ожидается по адресу
ONEC_EMBEDDER_BASE_URL (например, Ollama на хосте: http://host.docker.internal:11434/v1).
# 1. заполнить .env (см. .env.example) и config.json
# 2. загрузить модель эмбеддинга в Ollama (или другой сервис):
# ollama pull bge-m3
docker compose up -d --build
# индексация при старте выполняется автоматически (entrypoint.sh)
docker compose logs -f mcpВручную: docker compose run --rm mcp python -m src.indexer --full.
Архитектура
XML/BSL-экспорт 1С
│
▼
src/config_parser.py ── объекты, элементы, ссылки (типы данных)
src/bs_parser.py ────── процедуры, вызовы, ссылки из кода
│
▼
src/indexer.py ───────── инкрементальная сборка
├──► src/graph.py SQLite: узлы (object/element/symbol/module),
│ рёбра (HAS_ELEMENT, CHILD_ELEMENT, REFERENCE,
│ DEFINES, CALLS, USES)
└──► Qdrant векторы (эмбеддер: OpenAI-совместимый API)
│
▼
src/server.py (FastMCP, streamable HTTP :8765/mcp)
list_objects / get_object_elements / search_config (embed→Qdrant→rerank)
get_symbol / get_callers / get_callees / get_references / reindex / graph_statsВиды рёбер графа:
HAS_ELEMENT— объект → элемент (прямые дети)CHILD_ELEMENT— элемент → вложенный элементREFERENCE— элемент → объект (типы данных, напр. реквизит → справочник)DEFINES— модуль → символCALLS— символ → символ (1С имеет плоское глобальное пространство имён, поэтому вызов может вести к нескольким одноимённым символам — это норма)USES— модуль → объект (Справочники.Xи т.п. в коде)
Тесты
# unit-тесты (парсеры/маппинг/легаси-флаг/чек-суммы)
pytest tests/
# компиляция всех модулей
python -m compileall srcОграничения
BSL-парсер строковый/regex'овый, а не полный грамматический: достаточен для графа вызовов и поиска, но не для строгой валидации кода.
Условная компиляция не раскрывается. BSL-парсер не обрабатывает директивы препроцессора
#Если/#Иначе/#КонецЕсли, поэтому процедура, объявленная в обеих ветках (напр. сервернаяПечатьдля обычных неуправляемых форм внутри#Если ТолстыйКлиентОбычноеПриложение ... #Иначе ... #КонецЕсли), даёт две декларации с одинаковымstable_id. На поиск/граф не влияет (upsert по id перезаписывает), но в счётчике символов возможен дубль.Вызовы разрешаются по имени (глобальное пространство имён 1С): при одноимённых процедурах в разных модулях
CALLS-рёбра ведут на всех кандидатов; инструментget_symbolпринимаетobject_nameдля уточнения.Размерность вектора (
embedder.dimensions) должна совпадать с моделью, иначе Qdrant отклонит upsert.Объекты вне
.txt-отчёта (бизнес-процессы, общие модули/формы, веб-сервисы и др.) индексируются как module/symbol, но без object-узла иHAS_MODULE-связи (см.PLAN.md§12).Легаси-формы (
FormType=Ordinary,Form.bin) — BSL-код извлекается вендоренным бинарным парсером (parsers/, из github.com/axel-avb/v8_ordinary_unpack); процедуры попадают в граф вызовов сis_legacy=True. Схема формы (элементы управления) — в text-описании парсера, не раскладывается в узлы графа.Qdrant RAM — единственное реальное ограничение по объёму: ~6 КБ/вектор (1536 dims float32), для ЕРП 2.x это десятки ГБ RAM (см.
PLAN.md§12).
This server cannot be deployed
Maintenance
Related MCP Connectors
Code intelligence for coding agents: semantic, AST, graph, and full-text search. 279+ languages.
Code intelligence for LLMs. Analyze, search, and retrieve code from any public git repository.
Search indexed code, trace dependencies, assess change impact, and recall repository memory.
Shared memory for coding agents. Stop re-explaining your codebase every session.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables semantic search through 1C codebase exports using local CPU-based RAG with sentence transformers and FAISS indexing. Supports fast XML file indexing and retrieval of 1C code with metadata parsing.11MIT
- AlicenseNot gradedqualityFmaintenanceProvides a RAG-based search system for 1C:Enterprise platform documentation using hybrid BM25 and semantic search across multiple versions. It enables developers to retrieve API signatures, methods, and usage examples directly within IDEs or through a REST API.22MIT
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to interact with 1C:Enterprise databases through natural language, providing metadata retrieval, configuration analysis, and code generation.9-
- AlicenseNot gradedqualityAmaintenanceEnables searching through 1C:Enterprise configuration source code (XML+BSL) with full-text indexing, providing tools to find code, metadata objects, procedures, and modules.MIT