legitAgent
Provides a reusable GitHub Action to run the scanner in CI, producing SARIF output and uploading it to GitHub code scanning.
This server does not currently have a deployable release on Glama. Follow the repository's setup instructions to install and configure it for your MCP client, including any required credentials and local dependencies.

legitAgent
Проверка сайта на типичные риски 152-ФЗ, 38-ФЗ и ЗоЗПП прямо в Cursor, Claude, Kimi и в терминале.
Сайт: kiruxich.github.io/legitAgent. Каталог правил: docs/RULES.md.
Подключите MCP — агент локально просканирует HTML/JS/TS/JSX/TSX/Vue/Svelte/Astro, покажет находки со статьёй закона, confidence, evidence и подскажет, как исправить. В Cursor после установки плагина те же действия доступны через /check, /scan, /scan-url. Либо одна команда в CI, GitHub Action с выгрузкой SARIF, либо scan-url для живой страницы: тот же каталог по DOM плюс cookie/storage/network до и после Reject и Accept.
npx @legit-agent/cli scanЭто эвристическая проверка кода, а не юридическое заключение. legitAgent не заменяет юриста и не гарантирует соответствие закону. Решение принимает человек.
🛡 Нужен Enterprise-аудит? Разрабатываем кастомные высоконагруженные системы и проводим юридический и технический аудит кода. Получите бесплатный отчет по нагрузке и соответствию 152-ФЗ для вашей инфраструктуры: Свяжитесь со мной в Telegram: @kirillsklemin
Быстрый старт
Нужен Node.js 20+. Пакеты ставить не обязательно — достаточно npx.
MCP (Cursor, Claude, Kimi и другие)
Один и тот же сервер. @latest и --prefer-online: при каждом запуске Cursor, Claude, Kimi и других IDE npx берёт текущий релиз с npm, а не кэш. Уже открытый чат сам не обновится — нужен перезапуск окна / MCP.
В Cursor одной кнопкой: Add to Cursor.
{
"mcpServers": {
"legitagent": {
"command": "npx",
"args": ["-y", "--prefer-online", "@legit-agent/mcp@latest"]
}
}
}Клиент | Куда вставить |
Cursor | User (все проекты): |
Claude Code |
|
Claude Desktop | тот же JSON в |
Kimi Code |
|
Kimi CLI |
|
Windsurf, Cline, Continue, Copilot | тот же |
После подключения: «проверь этот репозиторий на 152-ФЗ», «покажи каталог правил», «объясни PDN.FORM.NO_CONSENT».
В Cursor те же действия вызываются через / (скиллы плагина, карточка при наведении берётся из description). Локально: ~/.cursor/plugins/local/legitagent. В каталоге у всех — после публикации на Marketplace. В ChatGPT и Kimi слэша Cursor нет: там работают MCP-инструменты, не /check.
Команда | MCP |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Slash-команда не заменяет MCP: она говорит агенту вызвать инструмент. Без включённого сервера legitagent скана не будет.
CLI
npx @legit-agent/cli scan
npx @legit-agent/cli scan ./my-site
npx @legit-agent/cli scan ./my-site --json
npx @legit-agent/cli scan ./my-site --sarif
npx @legit-agent/cli scan ./my-site --sarif findings.sarif
npx @legit-agent/cli scan ./my-site --lang en
npx @legit-agent/cli scan ./my-site --review --json
npx @legit-agent/cli scan ./my-site --changed-files src/Form.tsx,src/Cookie.tsx
npx @legit-agent/cli scan ./my-site --write-baseline
npx @legit-agent/cli scan ./my-site --baseline .legitagent-baseline.json
npx @legit-agent/cli scan ./my-site --fail-on-confidence medium
npx @legit-agent/cli scan ./my-site --cache
npx @legit-agent/cli fix ./my-site --json
npx @legit-agent/cli fix ./my-site --write
npx @legit-agent/cli scan-url https://example.com --json
npx @legit-agent/cli scan-url https://example.com --review --evidence legitagent-evidence
npx @legit-agent/cli scan-url https://example.com --review --evidence --notify-telegram
npx @legit-agent/cli scan-url https://example.com --sarif legitagent.sarif
npx @legit-agent/cli init-policy --operator "ООО Ромашка" --inn 123 --email privacy@site.ru --out privacy.md--review добавляет второй проход. По умолчанию он не вызывает LLM и не отправляет данные в сеть: обычные находки получают not_reviewed, а неоднозначные проверки — ask_human. Код выхода и SARIF считаются по детерминированным findings, поэтому результат CI не зависит от LLM.
scan-url --evidence [dir] пишет evidence pack: скриншоты баннера, раздельные состояния до/после Reject и Accept, метаданные cookie без значений, имена ключей local/session storage, network resource type и инициатор без query string, evidence.json, evidence.sarif, evidence.pdf. Скриншоты могут визуально содержать персональные, секретные или иные чувствительные данные — храните и передавайте evidence pack с соответствующими ограничениями доступа и не публикуйте его без проверки. В пачку попадают все находки, кроме отклонённых LLM (reject). Локальные/private URL по умолчанию запрещены; для доверенной внутренней цели нужен явный --allow-private-network.
Telegram (опционально): LEGITAGENT_TELEGRAM_BOT_TOKEN, LEGITAGENT_TELEGRAM_CHAT_ID + флаг --notify-telegram. Без credentials — код выхода 2.
Review, OpenRouter и приватность
У legitAgent нет собственного облака. Source scan, live scan, baseline, suppressions, SARIF и evidence pack выполняются на машине пользователя или runner-е CI. LLM необязателен:
Режим | Настройка | Куда уходят данные |
| режим по умолчанию | Никуда; LLM не вызывается |
|
| На loopback endpoint с |
|
| В OpenRouter и к выбранному им/model-провайдеру |
Для OpenRouter модель по умолчанию — openrouter/auto; её можно зафиксировать через LEGITAGENT_LLM_MODEL. Если ключ LEGITAGENT_OPENROUTER_API_KEY задан, а режим не указан, выбирается openrouter; иначе — offline. Явно заданный неизвестный или пустой LEGITAGENT_REVIEW_MODE вызывает ошибку конфигурации: опечатка не включает внешнюю отправку. Режим local принимает только HTTP(S) loopback endpoint и запрещает redirects. Старое имя LEGITAGENT_LLM_API_KEY временно поддерживается как alias ключа OpenRouter.
OpenRouter review использует строгий JSON Schema, batches, timeout/retry и process-local cache по fingerprint+snippet. Защитные лимиты: LEGITAGENT_LLM_BATCH_SIZE (10), LEGITAGENT_LLM_MAX_FINDINGS (100), LEGITAGENT_LLM_MAX_PROMPT_CHARS (48000), LEGITAGENT_LLM_MAX_OUTPUT_TOKENS (2000), LEGITAGENT_LLM_MAX_COST_USD (0.25), LEGITAGENT_LLM_TIMEOUT_MS (30000), LEGITAGENT_LLM_RETRIES (1). LEGITAGENT_LLM_MAX_COST_USD — это post-response budget для batch review: после достижения суммарного usage.cost новые batches не отправляются, но последний уже отправленный batch может превысить порог. Это не hard provider spend cap. Ответ показывает фактически выбранную модель в reviewModel.
По умолчанию запрос просит маршрутизатор OpenRouter выбирать провайдера с Zero Data Retention и запрещённым provider data collection; это preference маршрутизации, а не абсолютная гарантия хранения. Ограничить маршрутизацию можно через LEGITAGENT_OPENROUTER_ONLY_PROVIDERS, исключить провайдеров — через LEGITAGENT_OPENROUTER_IGNORE_PROVIDERS; списки разделяются запятыми. Ценовые ограничения провайдера задаются LEGITAGENT_OPENROUTER_MAX_PROMPT_PRICE и LEGITAGENT_OPENROUTER_MAX_COMPLETION_PRICE. Отключение ZDR требует явного LEGITAGENT_OPENROUTER_ZDR=false.
При openrouter отправляются только поля находок, выдержки норм и связанные фрагменты исходников — не весь репозиторий. Очевидные значения key/token/secret/password/authorization маскируются, фрагменты ограничиваются по размеру. Это best-effort защита: перед включением внешнего review проверьте политику обработки данных OpenRouter и выбранного model-провайдера.
User rule для Cursor always-on: скопируйте текст из [docs/cursor-user-rule.md](docs/cursor-user-rule.md) в User rules.
Конфиг
В корне проекта можно положить legitagent.config.json:
{
"$schema": "https://raw.githubusercontent.com/kiruxich/legitAgent/main/packages/core/config.schema.json",
"ignore": ["**/vendor/**"],
"disabled": ["PDN.COOKIE.NO_REJECT"],
"severity": { "PDN.TRANSFER.FOREIGN_TRACKER": "low" },
"baseline": ".legitagent-baseline.json",
"cache": true,
"suppress": [
{
"ruleId": "PDN.COOKIE.NO_REJECT",
"file": "src/legacy/**",
"reason": "Принято владельцем риска до миграции CMP",
"expires": "2026-12-31"
}
]
}Подавление требует причину и может быть ограничено rule/file/fingerprint и сроком. Для точечного исключения рядом с кодом: legitagent-ignore-next-line RULE_ID -- причина. Создать baseline текущих находок: --write-baseline; в последующих запусках передать --baseline или указать файл в конфиге. Baseline и suppressions не удаляют находки из модели данных — они переходят в suppressedFindings вместе с источником и причиной подавления.
Нет файла — используются безопасные значения по умолчанию. Невалидный JSON: код выхода 2.
cache: true сохраняет только hash, диапазоны строк и структурные сигналы в .legitagent/cache-v1.json; фрагменты исходного кода в cache не записываются. Cache можно включить CLI-флагом --cache или задать путь через --cache-file. Неизвестные поля конфига попадают в warnings; JSON Schema поставляется с @legit-agent/core.
legitagent fix всегда работает как dry-run. Только --write применяет allowlist безопасных механических рецептов ко всем соответствующим находкам свежего scan; сейчас автоматически снимается статическое prechecked-состояние consent checkbox. Это не LLM-gated patching: перед --write проверьте preview. Добавление юридического текста, URL политики и consent-flow остаётся manual recipe.
Вывод по-русски по умолчанию; --lang en — английские сообщения. Каждая находка содержит стабильный fingerprint, диапазон строк, kind (violation, risk, manual_check), confidence, наблюдаемые сигналы, правовое основание и способ исправления.
init-policy печатает черновик политики обработки ПДн (не юридический документ). Корпус 152-ФЗ / 38-ФЗ / ЗоЗПП лежит в packages/core/legal/corpus/; обновить с pravo.gov.ru: pnpm fetch-law.
--sarif без пути пишет legitagent.sarif (SARIF 2.1.0). scan-url открывает страницу в Chromium в изолированных контекстах: ждёт гидрацию SPA, отдельно проверяет состояния до/после Reject и Accept, сравнивает cookie/storage/network и прогоняет тот же каталог правил по HTML страницы. scan_url в MCP при evidenceDir сохраняет только скриншоты; полный evidence pack (JSON/SARIF/PDF) создаёт CLI.
Автоматические клики выполняются только в распознанном cookie-интерфейсе; обычный диалог с кнопкой Accept не считается баннером согласия. HTTP 4xx/5xx при загрузке страницы или повторном заходе для Accept завершают проверку технической ошибкой. Изображения в PDF встраиваются в документ и проверяются перед сохранением.
Код выхода | Значение |
| Нет серьёзных находок (в том числе нечего сканировать) |
| Есть хотя бы одна находка |
| Ошибка команды или конфигурации, включая невалидный режим review и отсутствующие обязательные credentials |
| Технический сбой: загрузка страницы, браузер, LLM API или запись отчёта |
В GitHub Action fail-on-high=false допускает только код 1 после успешного создания SARIF. Ошибки конфигурации, выполнения и отсутствующий отчёт продолжают блокировать job.
В CI достаточно npx @legit-agent/cli@1.1.1 scan --json: ненулевой код — стоп пайплайна. Source-scan без --review не запускает второй проход; даже с --review сеть не используется в режиме offline. Для code scanning скопируйте [examples/github-scan.yml](examples/github-scan.yml) в .github/workflows/legitagent.yml — он вызывает композитное действие [.github/actions/legitagent-scan](.github/actions/legitagent-scan/action.yml) с пином @v1.1.1: пишет SARIF, загружает его в GitHub, поддерживает baseline/changed-files/confidence threshold, комментирует PR и создаёт issue при новых находках high. Для мониторинга живого сайта после деплоя — [examples/github-watch.yml](examples/github-watch.yml) (scan-url --review --evidence, опционально Telegram и OpenRouter).
Related MCP server: ActTrace
Возможности
Один движок [@legit-agent/core](https://www.npmjs.com/package/@legit-agent/core), живой сканер [@legit-agent/live](https://www.npmjs.com/package/@legit-agent/live), оболочки [@legit-agent/mcp](https://www.npmjs.com/package/@legit-agent/mcp) и [@legit-agent/cli](https://www.npmjs.com/package/@legit-agent/cli).
Инструменты MCP
Инструмент | Что делает |
| Сканирует проект. Необязательные |
| Второй проход по findings. Offline по умолчанию; локальная LLM или OpenRouter включаются только пользовательской env-настройкой (для OpenRouter достаточно ключа, если режим не переопределён). Необязательные |
| Создаёт baseline текущих fingerprints внутри |
| Возвращает safe/manual fix-рецепты; dry-run по умолчанию, запись только при |
| Проверяет живой URL: cookie, баннер, формы, политика, ERID, витрина, иностранные трекеры; ждёт гидрацию SPA и отдельно проверяет Reject/Accept внутри баннера. Опционально |
| Полный каталог правил. |
| Правило, выдержка статьи, как исправить, дисклеймер. Нужен |
| Черновик политики обработки ПДн. Нужен |
| Текст из корпуса ( |
scan и review принимают changedFiles, baseline, cache и minimumConfidence; ответ содержит единый confidence gate. При changed-files весь проект остаётся контекстом для project-wide правил, но локальные findings фильтруются по изменённым файлам. autofix принимает отдельный write и по умолчанию ничего не меняет.
Ответ scan: findings, suppressedFindings, warnings, scannedFileCount. У находки есть fingerprint, файл и диапазон строк, severity, confidence, kind, evidence, legalBasis, сообщение и фикс. Если путь нечитаем: Укажите корень проекта.
Что проверяется в коде
Сканер читает .html, .js, .jsx, .ts, .tsx, .mjs, .cjs, .vue, .svelte, .astro. Пропускает node_modules, .next, dist, build, coverage, .git. Для JS/TS анализируется путь от consent-condition/event handler до функции запуска tracker. Синтаксически сломанный файл не роняет проверку — он уходит в предупреждение.
id | Что находит | Норма |
| Форма с именем, email или телефоном без чекбокса согласия | 152-ФЗ ст. 9 |
| Предзаполненный чекбокс согласия | 152-ФЗ ст. 9 |
| Согласие без ссылки на политику | 152-ФЗ ст. 9 |
| В проекте нет ссылки на политику обработки ПДн | 152-ФЗ ст. 18.1 |
| Политика без оператора, целей, сроков или порядка отзыва | 152-ФЗ ст. 18.1 |
| Яндекс.Метрика, gtag, GA, Meta Pixel, VK.Retargeting без проверки согласия | 152-ФЗ ст. 6 |
| Cookie-баннер без возможности отказа | 152-ФЗ ст. 9 |
| Иностранный трекер / возможная трансграничная передача | 152-ФЗ ст. 12 |
| Форма с ПДн и иностранный трекер без указания локализации баз в РФ ( | 152-ФЗ ст. 18 |
| Форма с ПДн без следов уведомления РКН ( | 152-ФЗ ст. 22 |
| Пометка «Реклама» без erid | 38-ФЗ ст. 18.1 |
| Витрина без доступных условий дистанционной продажи | ЗоЗПП ст. 26.1 |
| Витрина без реквизитов продавца | ЗоЗПП ст. 9 |
| Витрина без условий возврата | ЗоЗПП ст. 26.1 |
Полный чек-лист
Помимо автопоиска агент знает весь каталог и по explain_rule разбирает каждый пункт: зачем правило, какая статья, что сделать.
Формы и согласие — PDN.FORM.NO_CONSENT, предзаполненный чекбокс (PDN.FORM.PRECHECKED_CONSENT), ссылка на политику рядом с согласием (PDN.FORM.NO_POLICY_LINK).
Политика ПДн — ссылка в проекте (PDN.POLICY.NO_LINK), состав документа: оператор, цели, сроки, отзыв (PDN.POLICY.INCOMPLETE).
Метрики и cookie — трекер без opt-in (PDN.TRACKER.NO_CONSENT), cookie до согласия (PDN.COOKIE.BEFORE_CONSENT, живой scan-url), баннер без отказа (PDN.COOKIE.NO_REJECT), иностранный трекер / трансграничная передача (PDN.TRANSFER.FOREIGN_TRACKER).
Организация — локализация баз в РФ (PDN.LOCALIZATION.UNCLEAR) и уведомление Роскомнадзора (PDN.ORG.RKN_NOTICE): только если есть форма с ПДн, серьёзность low. CMP вроде Cookiebot не считается «метрикой без согласия».
Реклама — пометка «Реклама» без идентификатора (ADV.ERID.MISSING).
Витрина — условия дистанционной продажи, реквизиты продавца, возврат (CONSUMER.*). Отдельный документ с названием «оферта» не считается безусловно обязательным автоматически — правило просит проверить доступность обязательной информации до заказа.
У каждого правила в репозитории есть короткая выдержка статьи. Без выдержки правило в каталог не попадает.
Полный каталог с выдержками закона: docs/RULES.md. На сайте — страница правил.
Разработка
git clone https://github.com/kiruxich/legitAgent.git
cd legitAgent
pnpm install
pnpm test
pnpm build
pnpm benchmark
pnpm legal:check
pnpm release:checkМонорепозиторий pnpm:
packages/core— каталог YAML, выдержки закона, парсеры, детекторы,scanProjectpackages/cli— командыlegitagent scan,scan-url,init-policy, вывод--json/--sarif/--langpackages/live— Playwright-сканер живой страницыpackages/mcp— stdio-сервер для агентов
Правила: packages/core/rules/*.yaml. Выдержки: packages/core/legal/*.yaml. Корпус законов: packages/core/legal/corpus/ (pnpm fetch-law). Каталог для людей: pnpm catalog → docs/RULES.md и website/rules.html.
pnpm benchmark проверяет 140 исходных случаев: 40 synthetic regression seeds и 100 закреплённых source groups из открытых проектов. Пять форматных вариантов дают 700 parser-stability сценариев; повторные представления одного источника не увеличивают независимый счётчик. Отчёт отдельно считает TP/FP/FN/TN и precision/recall по исходным кейсам (seedRules, seedFrameworks) и всем вариантам (rules, frameworks). Реальные случаи дополнительно проверяются строго: любая ошибка ожидаемого правила или технического признака завершает прогон с ошибкой. Источники, SHA, лицензии и обоснования разметки сохранены в benchmarks/real-world; разбор покрытия указывает границы статической проверки. Порог v1 в 100 независимых групп источников закрыт; покрытие отдельных правил и отложенная оценка всё ещё требуют ревью.
pnpm legal:check проверяет integrity hash локальных snapshot-ов и свежесть verifiedAt. Еженедельный workflow legal-drift.yml сравнивает snapshot с источником; изменение закона блокирует задачу до ручной ревизии и обновления hash.
Релиз
Пакеты живут на npmjs.com/org/legit-agent, не в GitHub Packages.
Новая версия: одинаковый version в packages/*/package.json (core, cli, live, mcp), pnpm release:check, коммит в main, тег vX.Y.Z, git push origin vX.Y.Z. Workflow использует commit-SHA pins для сторонних Actions, npm Trusted Publishing с provenance, генерирует SPDX SBOM, создаёт build attestation и прикладывает tarballs/SBOM к GitHub Release.
Для 1.x release-check дополнительно требует минимум 100 entries с provenance: "independent-real-world" в benchmarks/corpus.json. Synthetic seeds и их пять мутаций в этот gate не засчитываются. Сейчас в корпусе ровно 100 независимых групп, поэтому количественный gate закрыт; перед публикацией v1.1.1 остаются полный CI и ручная проверка release-артефактов.
Лицензия
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
This server cannot be deployed
Maintenance
Related MCP Connectors
Cookie consent scanner: GDPR, CCPA, GCMv2. PASS/FAIL compliance checklists with fix recommendations.
Checks websites for Russian personal-data law 152-FZ; fix plans paid by a person in RUB
31MCP server for detecting and redacting PII (Personally Identifiable Information) in PDF documents.
GDPR/CCPA cookie consent: scan sites for cookies, track consent rates, generate privacy policies.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceMCP server for children's privacy compliance, enabling checks under COPPA, FERPA, UK Age Appropriate Design Code, and EU AI Act provisions for minors.1MIT
- AlicenseAqualityDmaintenanceMCP server for EU AI Act compliance, providing risk classification of AI features and Article 50 transparency notices.245 PyPI1Apache 2.0
- AlicenseAqualityDmaintenanceMCP server for querying compliance regulations including GDPR, EU AI Act, and CCPA through natural language questions, keyword search, and compliance checks.64 npmMIT

gridwork-privacyofficial
AlicenseAqualityDmaintenanceMCP server that audits websites for GDPR, CCPA, and ePrivacy compliance.445 npm1MIT