legitAgent
Provides a reusable GitHub Action to run the scanner in CI, producing SARIF output and uploading it to GitHub code scanning.
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., "@legitAgentscan this repository for 152-FZ compliance"
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.

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-артефактов.
Лицензия
This server cannot be deployed
Maintenance
Related MCP Connectors
Cookie consent scanner: GDPR, CCPA, GCMv2. PASS/FAIL compliance checklists with fix recommendations.
MCP 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 gradedqualityDmaintenanceMCP server for children's privacy compliance, enabling checks under COPPA, FERPA, UK Age Appropriate Design Code, and EU AI Act provisions for minors.29 PyPI1MIT
- AlicenseAqualityDmaintenanceMCP server for EU AI Act compliance, providing risk classification of AI features and Article 50 transparency notices.220 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.63 npmMIT

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