garant-mcp
# garant-mcp
**Ассистент, который цитирует закон по базе «Гарант», а не по памяти.**
garant-mcp создан для одной задачи: чтобы Claude или Codex при подготовке
юридических документов работали с действующим текстом нормы, нужной
редакцией и реальной практикой — и каждую ссылку отдавали с реквизитами,
по которым её можно сверить.
## Для чего он создан
Языковая модель, отвечающая по памяти, ошибается в праве не грубо,
а правдоподобно, и именно поэтому опасно. Искажения типовые:
* **сдвиг квантора** — частный случай выдаётся за общее правило и наоборот:
«никогда не вправе» там, где закон говорит «в случаях, предусмотренных…»;
* **смешение полномочий субъектов** — права следователя, дознавателя, органа
дознания и оперативного сотрудника сливаются в одно «правоохранительный
орган может»;
* **потеря ограничительной оговорки** — норма приводится без условия,
которое делает её применимой;
* **устаревшая или несуществующая редакция** — статья цитируется в том виде,
в каком её запомнила модель, а не в том, какой действовал на дату события;
* **правдоподобные реквизиты** — номер, дата и название акта выглядят верно
и не существуют.
В исковом заявлении, жалобе или заключении каждое такое искажение — не
погрешность стиля, а довод, который отклонят суд и противная сторона, и повод
усомниться во всём документе.
garant-mcp убирает причину: ассистент перестаёт отвечать по памяти. Норма,
редакция и практика извлекаются из базы «Гарант» в момент запроса, и ответ
строится на извлечённом тексте. Модель рассуждает — база отвечает за факт.
**Пример.** На вопрос о полномочиях оперативного сотрудника при проведении
оперативно-розыскных мероприятий ассистент без базы уверенно ответил, что
назначать исследования и экспертизы он не вправе, — сдвиг квантора: общий
запрет там, где закон разграничивает процессуальную экспертизу
и исследование в рамках оперативно-розыскной деятельности. С подключённым
garant-mcp тот же вопрос привёл ассистента к тексту Федерального закона
«Об оперативно-розыскной деятельности» и УПК РФ в действующих редакциях,
и ответ был построен на нормах — со статьями, редакцией и изменяющими
актами. В практике автора после подключения базы ошибки такого рода
в подготовке процессуальных документов перестали возникать.
## Как меняется работа
Раньше: открыть «Гарант», найти документ, пролистать до статьи, проверить
редакцию, скопировать, вставить, сверить — и так с каждой ссылкой. Теперь
один вопрос ассистенту своими словами: он сам находит документ, открывает
нужную статью, определяет, какая редакция действовала на дату события,
поднимает практику Верховного и Конституционного судов — и текст с редакцией,
датой начала её действия и изменяющим актом уже стоит в вашем документе.
Так готовятся иск, жалоба, заключение, претензия, договор; так же — смета
с обоснованием по нормативам, закупочная документация, кадровый приказ,
ответ контролирующему органу. Везде, где нужна точная ссылка на норму,
ассистент делает её сам и показывает, откуда взял. Сверка цитаты перед
подачей занимает минуту: реквизиты и отпечаток текста приходят вместе
с ответом.
## Что умеет
Восемь инструментов, которыми пользуется ассистент:
| инструмент | что делает |
|---|---|
| `garant_search` | поиск по всей базе — акты, судебные решения, комментарии, формы |
| `garant_document` | текст документа; у длинных актов — первые страницы, о чём ответ предупреждает сам |
| `garant_article` | дословный текст конкретной статьи или пункта |
| `garant_toc` | оглавление документа |
| `garant_revisions` | все редакции акта: периоды действия, изменяющие акты |
| `garant_revision_on_date` | какая редакция действовала на нужную дату |
| `garant_practice` | судебная практика высших судов с фильтрами по виду и периоду |
| `garant_kinds` | дерево видов информации базы |
Текст статьи в нужной редакции берётся по её `id_редакции` из
`garant_revision_on_date` или `garant_revisions` — ассистент делает это сам,
когда речь идёт о событии в прошлом.
## Почему этому можно доверять
К тексту статьи прикладывается блок `provenance`: редакция, дата начала её
действия, изменяющий акт, дата проверки и отпечаток ровно того текста, который
отдан. Цитату с таким блоком **сверяют, а не принимают на веру** — это главное
отличие от «спросить у ИИ про закон». Там, где выдача неполна или требует
сверки, инструмент сообщает об этом сам — в полях `_предупреждение`
и `_нормализация`.
| ключ `provenance` | что означает |
|---|---|
| `doc_id` | идентификатор, по которому взят текст: документа или его редакции |
| `редакция`, `действует_с` | в какой редакции взят текст и с какой даты она действует |
| `изменяющий_акт` | каким актом введена |
| `источник`, `дата_проверки` | откуда и когда получено |
| `hash_текста`, `правило_отпечатка` | отпечаток отданного текста и версия правила его вычисления |
| `оговорки_о_редакции` | появляется только когда есть повод уточнить редакцию — и называет его |
## Доступ — ваша подписка
Работает через **вашу собственную подписку «Гаранта»**: вы один раз входите
в своём браузере, сессия живёт в профиле браузера на вашем компьютере
и продлевается автоматически. Репозиторий не содержит базы, не хранит
и не передаёт учётные данные, ничего не проксирует. Без действующей подписки
сервер работать не будет.
## Что нужно
* Действующая подписка «Гаранта» — логин и пароль от `internet.garant.ru`.
* Один из клиентов: **Claude Desktop**, **Claude Code** или **Codex** (агент
OpenAI по подписке ChatGPT). Чат ChatGPT локальные MCP-серверы не запускает —
для подписки ChatGPT нужен Codex, см. [ниже](#codex-подписка-chatgpt).
* **git** — пакет ставится из репозитория. Windows: `winget install --id Git.Git -e`;
macOS: `brew install git`; Debian/Ubuntu: `sudo apt install git`. После
установки откройте новое окно консоли.
Python ставить не нужно — установщик поставит сам. Права администратора
не требуются; единственное исключение — включение длинных путей на Windows,
см. «Если не работает».
---
## Установка: три шага
### 1. Одна команда
**Windows** — Win, набрать «PowerShell», открыть, вставить строку целиком:
```
powershell -NoProfile -ExecutionPolicy Bypass -Command "& ([scriptblock]::Create((irm https://raw.githubusercontent.com/semenboss95-design/garant-mcp/main/install.ps1).TrimStart([char]0xFEFF)))"
```
**macOS и Linux** — в Терминале:
```
curl -LsSf https://raw.githubusercontent.com/semenboss95-design/garant-mcp/main/install.sh -o install.sh && sh install.sh
```
Установщик ставит менеджер пакетов `uv`, сам пакет и браузер Chromium,
прописывает сервер в Claude Desktop и Claude Code, открывает окно входа
и заканчивает диагностикой. Каждый шаг печатает результат; в конце — сводка.
Повторный запуск безопасен: ничего не дублируется, вход не сбрасывается.
### 2. Вход в подписку
В открывшемся окне браузера введите логин и пароль «Гаранта», дождитесь
личного кабинета и закройте окно. Если окно закрыли раньше или оно
не открылось — вход делается отдельно:
```
garant login
```
Проверка, что подписка отвечает:
```
garant doctor --живой
```
### 3. Перезапуск клиента
Claude и Codex читают список серверов при старте. Закройте клиент полностью
(на macOS — Cmd+Q) и откройте снова. Спросите: «найди в Гаранте статью 108
УПК РФ» — при первом обращении клиент попросит разрешение на инструмент,
разрешите.
---
## Codex (подписка ChatGPT)
Codex — агент OpenAI (приложение, командная строка и расширение для
редактора), доступный по подписке ChatGPT. В отличие от чата ChatGPT он
запускает локальные MCP-серверы. Регистрация — одной командой после
установки:
```
garant register --codex
```
Команда дописывает в `~/.codex/config.toml` таблицу `[mcp_servers.garant]`
с полным путём к серверу и таймаутом запуска, не трогая остальные настройки
(если файл уже был, рядом остаётся его копия `.bak`). Каталог настроек
переопределяется переменной `CODEX_HOME`. После регистрации перезапустите
Codex. Снять запись — `garant unregister --codex`. Сервер проверен в живом
Codex 09.09.2026 по записи такого вида, вписанной руками.
Другие MCP-клиенты, умеющие запускать локальную программу, работают с записью
вида `{"command": "garant-mcp"}` — её вписывают в конфигурацию клиента руками;
если клиент не видит каталог команд `uv`, вместо имени ставится полный путь
к `garant-mcp`.
---
## Управление: команда `garant`
Одна команда на всех системах:
```
garant doctor диагностика; --живой добавляет запрос к «Гаранту»
garant status коротко: демон, сессия, версия, каталог состояния
garant login войти в подписку
garant setup повторить установочные шаги
garant start | stop | restart
garant logs [N] последние N строк журнала демона
garant register прописать сервер у Claude Desktop и Claude Code;
--codex — у Codex; --project ПУТЬ — в .mcp.json проекта
garant unregister снять запись
garant autostart on поднимать демона при входе в систему
garant update обновить пакет и перезапустить демона — вход сохраняется
garant uninstall снять регистрации, автозапуск и демона; профиль подписки —
только с --purge; сам пакет — uv tool uninstall garant-mcp
garant migrate ПУТЬ перенести профиль из прежней установки
```
`garant` без аргументов печатает полный список. Каждый красный пункт
`garant doctor` сопровождается командой, которой он чинится.
---
## Если не работает
**`garant` не находится как команда.** Откройте новое окно консоли. Если
не помогло — `uv tool update-shell`, затем снова новое окно.
**Claude или Codex не видят инструменты.** `garant register` (для Codex —
`garant register --codex`), затем `garant doctor` и полный перезапуск клиента.
**«Сессия подписки недействительна» (сервер ответил 401 или 403).** Вход
истёк: `garant login`.
**Windows: установка пакета упала с «WinError 206» или установка Chromium —
с ошибкой Python.** Выключены длинные пути. В PowerShell от администратора
один раз:
```
New-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem' -Name LongPathsEnabled -Value 1 -PropertyType DWord -Force
```
Затем повторите установку в обычном окне.
### Ключи установщика
Для проверки установки без подписки и без записи в конфигурации клиентов
установщик запускается из файла с ключами:
```
irm https://raw.githubusercontent.com/semenboss95-design/garant-mcp/main/install.ps1 -OutFile install.ps1
powershell -NoProfile -ExecutionPolicy Bypass -File .\install.ps1 -БезРегистрации -БезВхода
```
```
curl -LsSf https://raw.githubusercontent.com/semenboss95-design/garant-mcp/main/install.sh -o install.sh
sh install.sh --no-register --no-login
```
| ключ | Windows | macOS и Linux |
|---|---|---|
| ставить из своего каталога или адреса | `-Источник ПУТЬ` (`-Source`) | `--source ПУТЬ` |
| не открывать окно входа | `-БезВхода` (`-NoLogin`) | `--no-login` |
| не трогать конфигурации клиентов | `-БезРегистрации` (`-NoRegister`) | `--no-register` |
| сверить, что автозапуск не появился | `-БезАвтозапуска` (`-NoAutostart`) | `--no-autostart` |
| справка | `-Справка` (`-Help`, `-h`) | `--help`, `-h` |
`--source` принимает git-адрес, имя пакета, файл `.whl` или корень
распакованного репозитория. С `--no-register` шаг `garant setup` пропускается
целиком: пакет ставится, но Chromium, регистрация и вход выполняются потом
командами `garant setup` и `garant login`.
---
## Границы
Текст статьи — нормализованный HTML страницы «Гаранта», поэтому редакционные
врезки («Статья … дополнена … с … г.») могут оказаться внутри цитаты; каждый
ответ с текстом несёт оговорку `_нормализация`, и перед подачей документа
цитату сверяют с окном подписки. Судебная практика отдаётся первой страницей
отфильтрованного списка — фильтры «Гаранта» по виду и периоду серверные,
остальные страницы не запрашиваются; уточнение по конкретному суду
делается по заголовку и объявляется в `_предупреждение`; акты кассационных
судов общей юрисдикции лежат в другой базе «Гаранта» и через подписку
недоступны. У `garant_toc`, `garant_kinds`, `garant_revisions`
и `garant_revision_on_date` блока `provenance` нет: они возвращают структуру
и сведения о редакциях, а не текст нормы. Клиент построен по записанному
трафику «Гаранта», публичного API у сервиса нет; при изменении API сервиса
ответы инструментов проверяются и карта эндпоинтов обновляется.
---
## Как устроено
```
Claude / Codex → garant-mcp → HTTP на 127.0.0.1 → garant-daemon → браузер → «Гарант»
```
Демон — единственный владелец профиля браузера; он продлевает сессию
по таймеру независимо от того, открыт ли клиент, слушает только `127.0.0.1`
и поднимается автоматически при первом вызове инструмента. Отпечаток браузера
(User-Agent, локаль и часовой пояс вашей машины плюс фиксированный размер
окна) снимается при первом входе и сохраняется — к нему привязана сессия.
Карта эндпоинтов лежит
в `src/garant_mcp/endpoints.json` отдельно от кода.
Устройство — [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md); журнал решений
с обоснованиями — [`docs/DECISIONS.md`](docs/DECISIONS.md).
---
## Разработчикам
Первым делом в свежем клоне включите защиту от утечки секретов:
```
git config core.hooksPath hooks
```
`hooks/pre-commit` проверяет содержимое индекса и не пропустит живую сессию,
токен или путь машины. Что именно проверяется — [`hooks/README.md`](hooks/README.md).
Протокол работы — [`docs/TEAM.md`](docs/TEAM.md), живая приёмка —
[`docs/ACCEPTANCE.md`](docs/ACCEPTANCE.md). CI прогоняет `ruff`, тесты,
сборку пакета и дымовой тест MCP по stdio на Windows и Linux.
---
## Лицензия
[Apache License 2.0](LICENSE); обязательные уведомления — в [`NOTICE`](NOTICE),
при распространении и в форках сохраняются. Лицензия не даёт прав на товарный
знак «Гарант» и описывает права на этот код; допустимость автоматизированного
обращения к сервису определяется его правилами и вашей подпиской.
---
## About `tools/` (English)
`tools/` is a small, service-agnostic pipeline for building an API client for
a web application that has no public API:
```
record_api.py → record the XHR/fetch traffic of a live session with Playwright (analytics noise filtered out)
build_endpoints.py → derive an endpoint map from those recordings
```
The result is a JSON map — request steps, placeholders, extraction paths — that
a thin client reads at runtime instead of hardcoding URLs. `src/garant_mcp/`
is the reference consumer of such a map (`src/garant_mcp/endpoints.json`).
Recordings are truncated on capture and never committed: they contain a live
authenticated session.
TDQS
Scored across 8 tools
Each tool maps to a distinct resource or action: general search, table of contents, full document, single article, revision list, revision-on-date, practice search, and information-type tree. The only potentially overlapping pair (garant_document vs garant_article) is explicitly differentiated by scope and cost, while garant_search vs garant_practice is clearly separated by normative documents vs court practice.
All tools share a consistent garant_ prefix and snake_case style, and most names are resource nouns such as document, article, revisions, kinds, toc, and practice. Minor deviations are garant_search as a verb, garant_toc as an abbreviation, and garant_revision_on_date as a noun phrase rather than a verb_noun pattern, so the scheme is predictable but not perfectly uniform.
Eight tools is well-scoped for a specialized legal-research server: there are no redundant tools, and the set covers search, retrieval, navigation, revision history, and court-practice search without bloat. Each tool has a clear role, and the count matches the stated purpose.
The set covers the core workflow: search, TOC navigation, full-document retrieval, article-level citation, revision history, and revision-on-date lookup. The main gap is that no tool can return the verbatim text of a historical revision, which the description explicitly calls out, and practice search is deliberately limited to first-page results with client-side court filtering. These are documented limitations but can be worked around for most monitoring and citation tasks.