Skip to main content
Glama
kopyshok

rules-mcp

by kopyshok

rules-mcp — правила обмена 1С в чате

MCP-сервер, который разбирает боевые правила обмена 1С (Конвертация данных 2.0) и отвечает на вопросы о них прямо в чате Open WebUI: как работает конкретный обмен, что создаётся у приёмника, где расхождение с конфигурацией.

Правила обмена — это XML на десятки мегабайт со встроенным кодом обработчиков. Прочитать их целиком нельзя, искать по ним вслепую — терять каскады и протекающие ветки. Сервер разбирает их один раз в индекс и отвечает точечно.

Разбор — обычная программа, языковая модель в нём не участвует и токены на него не тратятся. Токены уходят только на то, что инструмент вернул в чат.

  • Поддерживается КД 2.0 (ExchangeRules.xml + RegistrationRules.xml). Конвертация данных 3 (EnterpriseData) — другой формат, здесь не поддерживается.

  • Только стандартная библиотека Python для разбора, одна зависимость для MCP.

  • Индекс живёт в памяти, базы данных нет. 36 МБ правил разбираются за секунду.


Что умеет

Инструмент

Отвечает на вопрос

exchange_overview

Какие есть направления, документы, процессы

trace_document

Что происходит с документом при обмене — от регистрации до приёмника

get_conversion_rule

Одно правило конвертации целиком: реквизиты, табличные части, каскады

search_rules

Где вообще упоминается реквизит, алгоритм или фрагмент логики

receiver_fields

Что правила ждут от конфигурации приёмника — для сверки

refresh_rules

Перечитать правила из репозитория сейчас (под паролем)

Инструменты намеренно общие, а не готовые отчёты: пользователь спрашивает как угодно, а ответ складывает модель. Шесть штук — потолок, за которым модели начинают путаться в выборе.

Ради чего всё затевалось

Правила целиком состоят из ссылок на реквизиты и типы двух конфигураций. Проверить их в одиночку нельзя. Но если рядом подключён сервер, читающий конфигурации 1С (например rlm-tools-bsl), появляется проверка, которую иначе делают руками:

1. rules-mcp        → «правила пишут вот в эти реквизиты приёмника, вот их типы»
2. сервер конфигураций → «а вот что реально есть у этого объекта»
3. модель           → сравнивает и показывает расхождения

Реквизита нет, он переименован или сменил тип — обмен на этом не падает, он молча не переносит данные. Это самая дорогая и самая незаметная поломка обмена.

Серверы друг друга не знают и ничего друг о друге не предполагают — разворачиваются и чинятся независимо.


Related MCP server: bsl-context

Как должны лежать правила

Папка на направление обмена, внутри выгрузка из Конвертации данных:

<корень или подкаталог репозитория>/
├── УПП_ERP/
│   ├── ExchangeRules.xml              правила выгрузки (ПВД) и конвертации (ПКО)
│   ├── RegistrationRules.xml          правила регистрации (ПРО)
│   └── CorrespondentExchangeRules.xml не читается
├── ERP_УПП/
│   └── …
└── Розница_ERP/
    └── …

Направление определяется по файлу ExchangeRules.xml; папка без него молча пропускается. Имена папок могут быть на кириллице или латиницей — стороны обмена берутся из самих правил, а не из имени папки, поэтому «УПП → ЕРП», «упп erp», «из розницы в ерп» и «УПП_ERP» распознаются одинаково.

Порядок сторон значим: УПП_ERP и ERP_УПП — разные направления с разными правилами, и сервер их не путает.


Установка

Вариант 1. Docker рядом с Open WebUI (рекомендуется)

Добавьте в ваш docker-compose.yml (или возьмите готовый фрагмент из docker-compose.yml):

services:
  rules-mcp:
    build: ./rules-mcp                     # или image: ghcr.io/…, если соберёте свой
    environment:
      GITLAB_REPO: https://gitlab.example.ru/exchange/rules.git
      GITLAB_TOKEN: ${GITLAB_TOKEN}
      GITLAB_BRANCH: main
      RULES_SUBDIR: ""
      REFRESH_INTERVAL: "3600"
      REFRESH_PASSWORD: ${RULES_REFRESH_PASSWORD}
    volumes:
      - rules-clone:/data                  # клон переживает перезапуск контейнера
    restart: unless-stopped
    networks: [ai]

  open-webui:
    # ваш существующий сервис; нужно добавить только это
    environment:
      WEBUI_SECRET_KEY: ${WEBUI_SECRET_KEY}
    networks: [ai]

volumes:
  rules-clone:

networks:
  ai:
git clone https://github.com/kopyshok/rules-mcp.git
cp rules-mcp/.env.example .env      # заполнить токен и пароль
docker compose up -d --build rules-mcp
docker compose logs -f rules-mcp

Секции ports намеренно нет: наружу сервис публиковать не надо, Open WebUI дотянется до него по внутренней сети. Это же снимает вопрос доступа извне.

Вариант 2. Без Docker

git clone https://github.com/kopyshok/rules-mcp.git && cd rules-mcp
python -m venv .venv && . .venv/bin/activate   # Windows: .venv\Scripts\activate
pip install -r requirements.txt

export RULES_DIR=/путь/к/каталогу/с/направлениями
export REFRESH_INTERVAL=0                      # работать с тем, что уже на диске
python server.py

Нужен Python 3.10+ и установленный git, если правила берутся из репозитория.


Настройки

Все настройки — через переменные окружения. Образец: .env.example.

Переменная

По умолчанию

Смысл

GITLAB_REPO

пусто

Адрес репозитория с правилами по HTTPS. Пусто — работать с тем, что уже лежит в RULES_DIR

GITLAB_TOKEN

пусто

Токен на чтение репозитория

GITLAB_BRANCH

пусто

Ветка с правилами. Пусто — ветка по умолчанию

RULES_SUBDIR

пусто

Подкаталог внутри репозитория, если папки направлений лежат не в корне

REFRESH_INTERVAL

3600

Период опроса, секунды. 0 — не опрашивать

REFRESH_PASSWORD

пусто

Пароль для refresh_rules. Не задан — команда недоступна

RULES_DIR

/data/rules

Каталог с направлениями. При работе из репозитория клон кладётся в /data/checkout

HOST / PORT

0.0.0.0 / 8000

Адрес прослушивания

Несмотря на имена, GITLAB_* работают с любым git-сервером — GitHub, Gitea, Bitbucket. Имена оставлены такими, потому что писалось под GitLab.


Подключение к GitLab

1. Токен на чтение

Лучше deploy-токен: он привязан к репозиторию, а не к человеку, и не отвалится, когда сотрудник уйдёт.

Settings → Repository → Deploy tokens → Add token

  • Name: rules-mcp

  • Expires: можно оставить пустым

  • Scopes: только read_repository

GitLab покажет имя пользователя и сам токен один раз. Сервису нужен только токен — имя пользователя он подставляет сам.

Личный токен (Settings → Access Tokens, область read_repository) тоже подойдёт, если deploy-токены запрещены политикой.

2. Адрес репозитория

Только HTTPS. SSH не поддерживается — в контейнере нет ключей и известных хостов, и заводить их ради чтения одного репозитория не стоит.

GITLAB_REPO=https://gitlab.example.ru/exchange/rules.git
GITLAB_TOKEN=glpat-xxxxxxxxxxxxxxxxxxxx

Токен не надо вписывать в адрес — сервис подставит его сам при обращении. Так он не попадает ни в логи, ни в вывод команд.

Если GitLab на нестандартном порту, укажите его в адресе как обычно: https://gitlab.example.ru:8443/exchange/rules.git.

3. Ветка с правилами

GITLAB_BRANCH=main

Указывайте ветку явно. Если оставить пусто, берётся ветка по умолчанию — а она в репозиториях с правилами часто оказывается черновой. Аналитики будут читать не то, что стоит на продуктиве, и не узнают об этом.

Заведите отдельную ветку под боевые правила (prod, production, release) и укажите её. Сервис работает ровно с ней: git fetch и git reset идут по указанной ветке, изменения в других ветках его не трогают.

Ветка видна в ответе каждого инструмента — поле «версия правил»:

ветка prod, коммит d54877b от 08.09.2026

Так человек в чате всегда видит, на какой версии правил построен ответ.

4. Правила лежат не в корне

RULES_SUBDIR=exchange/rules

Клонируется репозиторий целиком, но папки направлений ищутся в этом подкаталоге. Путь указывается от корня репозитория, через /.

5. Проверка

docker compose logs rules-mcp        # клонирование и старт

Если токена не хватает или ветки нет, сервис не падает: он продолжает отвечать на прежнем индексе, а в каждый ответ добавляется поле «внимание» с текстом ошибки. Это видно прямо в чате — молчаливой рассинхронизации не будет.


Подключение к Open WebUI

Родная поддержка MCP появилась в Open WebUI 0.6.31. На версиях старее понадобится обновление либо прослойка mcpo.

Настройки → Админ → Интеграции → Внешние серверы инструментов → Добавить:

Поле

Значение

Тип

MCP (Streamable HTTP)

Адрес

http://rules-mcp:8000/mcp

Авторизация

None

Три места, где спотыкаются:

  1. Тип должен быть MCP, не OpenAPI. Если вписать MCP-настройки в подключение типа OpenAPI, интерфейс уходит в бесконечную загрузку. Лечится удалением подключения и повторным добавлением.

  2. Адрес — имя контейнера, а не localhost. Глобальные подключения выполняются самим Open WebUI, и localhost внутри его контейнера означает его же, а не сервер.

  3. Авторизация именно None. Выбранный «Bearer» с пустым ключом шлёт пустой заголовок, и соединение рвётся.

В Open WebUI должен быть задан WEBUI_SECRET_KEY, иначе подключения слетают при каждом пересоздании контейнера.

Чтобы люди не включали инструмент вручную

Глобальный инструмент в чате сам не появляется — каждому пришлось бы включать его в меню интеграций. Вместо этого соберите модель:

Рабочая область → Модели → Создать

  • базовая модель — ваша обычная;

  • системная подсказка — как читать правила, на что смотреть;

  • знания — методичка, карта процессов, если они у вас есть;

  • инструменты — rules-mcp и сервер конфигураций, включены принудительно;

  • доступ — нужной группе.

Пользователь выбирает модель из списка, и у него уже всё настроено.


Обновление правил

Три пути, все работают вместе:

  • Автоматически раз в REFRESH_INTERVAL секунд. Если коммит не сменился, индекс не пересобирается — проверка стоит несколько килобайт трафика.

  • Из чата — инструмент refresh_rules с паролем. Нужен, когда только что выложили релиз и ждать час не хочется. Пароль спрашивается у человека, чтобы модель не запускала обновление сама.

  • Перезапуском контейнера — индекс собирается заново при старте.

Индекс подменяется целиком и только после того, как новый успешно собран. Пока он строится, сервер продолжает отвечать на старом. Если забрать правила не удалось, старый индекс остаётся в работе.


Если что-то не работает

Симптом

Причина

Open WebUI не видит сервер

Адрес localhost вместо имени контейнера; контейнеры в разных сетях

Интерфейс виснет при добавлении

Выбран тип OpenAPI вместо MCP

Соединение сразу рвётся

Авторизация «Bearer» с пустым ключом; нужна None

Подключения слетают после пересоздания

Не задан WEBUI_SECRET_KEY в Open WebUI

«направлений: 0»

Не тот RULES_SUBDIR, не та ветка, или в папках нет ExchangeRules.xml

В ответах поле «внимание»

Не проходит обновление: протух токен, нет ветки, недоступна сеть. Текст ошибки там же

Модель не зовёт инструменты

Вопрос к модели, а не к серверу. Проверьте на модели с надёжным вызовом инструментов

Посмотреть, что сервер вообще отдаёт:

docker compose exec rules-mcp python -c "
import asyncio
from fastmcp import Client
async def m():
    async with Client('http://127.0.0.1:8000/mcp') as c:
        for t in await c.list_tools(): print(t.name)
        print((await c.call_tool('exchange_overview', {})).data)
asyncio.run(m())"

Как устроено внутри

  • rules_index.py — разбор XML и индекс. Только стандартная библиотека. Правила регистрации, ветки выгрузки, правила конвертации со всеми свойствами и табличными частями, каскады в подчинённые правила, функциональные блоки (процессы), которыми разработчики помечают ветки.

  • server.py — шесть инструментов, работа с git, фоновое обновление.

Отбор регистрации разворачивается в читаемое дерево условий вместо XML:

(ИЛИ:
  (И:
    ВидОперации = ПокупкаКомиссия
    ВидПоступления = ПоОрдеру
    Контрагент.НеЯвляетсяРезидентом = Истина
  )
  …
)

Ответы по умолчанию сжатые: тексты обработчиков отдаются только по запросу (get_conversion_rule с verbose=true), состав справочников приёмника — отдельным вызовом. Иначе один ответ съедает контекст чата.

Проверка

python test_rules_index.py /путь/к/каталогу/с/направлениями

Проверяет на настоящих правилах: направления распознаются с учётом порядка сторон, ветки выгрузки не зовут несуществующих правил конвертации, отбор регистрации разбирается, каскады не зацикливаются, справочники без своей ветки выгрузки находятся через подчинённые правила.

Лицензия

MIT — см. LICENSE.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

No tool schema history has been recorded yet.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    MCP server providing tools for interacting with 1С:Напарник AI, including asking questions, syntax explanation, code review, and documentation search. Also serves as a web chat interface and OpenAI-compatible API gateway.
    101
    AGPL 3.0
  • F
    license
    Not graded
    quality
    A
    maintenance
    MCP server that validates AI-generated 1C:Enterprise (BSL) code against the real platform API. Catches unknown enum values, wrong argument counts, and missing type members by parsing the platform syntax-helper (shcntx_ru.hbk) — independent Rust implementation with built-in expression validator.
    21
    -
  • F
    license
    Not graded
    quality
    B
    maintenance
    MCP server for searching and analyzing 1C enterprise metadata and BSL code using a SQLite backend. Enables querying configuration structure, code routines, and performing compliance checks via natural language.
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP server for RAG-based search over 1C Enterprise configuration documentation, enabling natural language queries to find objects like справочники, документы, and отчеты.
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/kopyshok/rules-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server