Skip to main content
Glama
README.md
# 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

A4.2/5.0

Scored across 8 tools

Disambiguation5/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness4/5

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.

Maintenance

ActivityMaintained
ResponsivenessNo issues