mcp-egrul

io.github.atomno-mcp由 GitHub 账号 atomno-mcp 发布v0.1.10更新于 Oct 25, 2026

EGRUL/EGRIP company registry lookup for Russian legal entities and entrepreneurs.

已验证STDIO仅桌面金融商业与电商

概览

AI 生成的概览

按税号、注册号或名称查询俄罗斯企业与个体经营者登记信息(EGRUL/EGRIP),返回公司卡片、创始人和负责人。

可以做什么
按 INN 税号、OGRN 注册号或模糊公司名称检索登记记录,可限定仅活跃主体并限制结果数量。获取完整公司卡片,或仅获取带持股比例的创始人,或仅获取现任负责人。一次调用可批量查询最多 100 个税号。通过诊断用 ping 检查服务器是否在线。
适用场景
适合需要查询俄罗斯法人或个体经营者官方信息的场景,例如核实交易对手、获取创始人或负责人、批量筛查税号清单。面向处理俄罗斯商业数据并希望在 MCP 客户端内直接查询的用户。
运行要求
通过 stdio 在本机运行,可用 uvx、pipx 或 pip 从 PyPI 安装;源码安装需 Python 3.11 及以上。自托管模式需要本地 SQLite 数据库,由用户手动下载俄罗斯税务局开放数据转储并用自带命令行工具导入。托管模式需要环境变量 ATOMNO_API_KEY。
安装前请注意
托管 Pro 模式为付费订阅(约每月 10 美元,与配套服务打包约 15 美元),查询会发送至第三方 API;免费额度按 IP 每日限制。设置 ATOMNO_API_KEY 后全部七个工具都会改走远程服务而非本地数据库。服务器本身不会下载登记数据转储,查询结果不能替代正式的法律或财务尽职调查。

安装

在 SourceWeft 中

  1. 打开 控制台中的 mcp-egrul,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

mcp-egrul

MCP-сервер ЕГРЮЛ и ЕГРИП: реквизиты российских компаний и ИП по открытым данным налоговой службы. Можно поставить у себя или подключить к Cursor, Claude и любому клиенту MCP.

Russian company registry lookup for AI agents.

[Glama]

[mcp-egrul MCP server]

Статус: v0.1.2 — open-версия (self-host через SQLite) полностью готова + клиентская часть hosted Pro (HTTP-клиент HostedClient для api.atomno-mcp.ru). Опубликована на PyPI, индексирована в Glama и Smithery. Сама hosted Pro-инфра — в активной разработке. Coverage 100.00% (345 тестов, ruff clean, fastmcp 3.2.4, enforced через --cov-fail-under=100).

Парный проект: mcp-fns-check (risk-чек-слой поверх ЕГРЮЛ).


Что это

Семь MCP-тулзов, видимых AI-ассистенту (Cursor, Claude Desktop, Cline, любой MCP-клиент):

ToolОписаниеАргументы
search_by_innПоиск по ИНН (10 цифр — юр.лицо, 12 — ИП)inn: str
search_by_ogrnПоиск по ОГРН (13) или ОГРНИП (15)ogrn: str
search_by_nameFuzzy-поиск по названию (FTS5)query: str, limit?: int, only_active?: bool
get_full_cardПолная карточка со всеми секциямиinn?: str, ogrn?: str
get_foundersТолько учредители с долямиinn: str
get_directorТолько текущий руководительinn: str
bulk_cardsМассовая проверка (до 100 ИНН)inns: list[str]

Плюс диагностический ping для проверки что сервер жив.

Полная спецификация payload'ов — в src/mcp_egrul/schemas.py (Pydantic-модели CompanyCard, IECard, SearchResult, BulkResult).


Установка

Вариант 1 — через PyPI (рекомендуется для пользователей)

bash
# Без локального clone — работает «из коробки»uvx atomno-mcp-egrul
# Или установка глобальноpipx install atomno-mcp-egrulatomno-mcp-egrul
# Или классический pip в venvpip install atomno-mcp-egrulatomno-mcp-egrul

Вариант 2 — dev-режим (для разработчиков)

Требуется Python 3.11+ и uv (быстрая замена pip, опционально).

bash
git clone https://github.com/atomno-mcp/mcp-egrulcd mcp-egruluv venvuv pip install -e ".[dev]"

Альтернативно через pip:

bash
python -m venv .venv.venv/Scripts/activate    # Windows# source .venv/bin/activate  # Linux/macOSpip install -e ".[dev]"

Запуск

bash
atomno-mcp-egrul

Транспорт по умолчанию — stdio (стандартный ввод/вывод JSON-RPC). Подходит для подключения к Cursor / Claude Desktop / Claude Code.

Claude Desktop (claude_desktop_config.json)

json
{  "mcpServers": {    "egrul": {      "command": "uvx",      "args": ["atomno-mcp-egrul"]    }  }}

Cursor (.cursor/mcp.json в проекте или ~/.cursor/mcp.json глобально)

json
{  "mcpServers": {    "egrul": {      "command": "uvx",      "args": ["atomno-mcp-egrul"]    }  }}

Если не используете uv, замените "command": "uvx", "args": ["atomno-mcp-egrul"] на "command": "atomno-mcp-egrul" (требует pip install atomno-mcp-egrul или pipx install atomno-mcp-egrul).


Docker (self-host) — quick start

bash
# 1. Скачайте дампы ФНС (acceptance на сайте ФНС — раз в жизни).#    Источники:#      ЕГРЮЛ — https://www.nalog.gov.ru/opendata/7707329152-egrul/#      ЕГРИП — https://www.nalog.gov.ru/opendata/7707329152-egrip/#    Положите их в структуру:mkdir -p dumps/egrul/2026-04-24 dumps/egrip/2026-04-24cp ~/Downloads/EGRUL_*.zip dumps/egrul/2026-04-24/cp ~/Downloads/EGRIP_*.zip dumps/egrip/2026-04-24/
# 2. Первоначальный полный импорт (однократно, ~30-60 минут):docker compose --profile import run --rm \    mcp-egrul-import atomno-mcp-egrul-import --registry egrul --fulldocker compose --profile import run --rm \    mcp-egrul-import atomno-mcp-egrul-import --registry egrip --full
# 3. Запустите сервер + фоновый cron-демон:docker compose up -ddocker compose logs -f mcp-egrul-scheduler

Через ~10 минут после импорта все тулзы (search_by_inn, search_by_name и пр.) уже отвечают данными из локального слепка ФНС.

Схема тома /data внутри контейнера:

/data/├── mcp_egrul_data.sqlite     # SQLite + FTS5└── dumps/                    # read-only монтируется из ./dumps    ├── egrul/    │   └── YYYY-MM-DD/*.zip    └── egrip/        └── YYYY-MM-DD/*.zip

Cron-демон (atomno-mcp-egrul-scheduler) сам забирает самую свежую выгрузку после того как вы положите её в dumps/<registry>/<YYYY-MM-DD>/ — ночью в 03:00 Europe/Moscow. Если ничего нового нет — job завершится с nothing_to_import и никаких лишних записей в import_log не сделает.


Импорт дампов ФНС (ручной режим)

Источники:

  • ЕГРЮЛ open-data: https://www.nalog.gov.ru/opendata/7707329152-egrul/
  • ЕГРИП open-data: https://www.nalog.gov.ru/opendata/7707329152-egrip/

Формат: суточные архивы XML в ZIP, ~15 ГБ на полный слепок. Юридически их нужно скачать с сайта ФНС после acceptance лицензии — сервер не качает архивы сам (строго).

CLI:

bash
# Полный первоначальный импорт (однократно):atomno-mcp-egrul-import --registry egrul --fullatomno-mcp-egrul-import --registry egrip --full
# Инкремент (cron / ручной): загружается только если появилась более# свежая YYYY-MM-DD-папка, чем последний успешный `import_log.source_dump_date`.# Если новее нет — exit-code 5 и сообщение `nothing_to_import`.atomno-mcp-egrul-import --registry egrul --incremental
# Фоновой cron-демон с ежедневным 03:00 MSK (вызывать вручную редко;# обычно запускается сервисом mcp-egrul-scheduler в docker-compose).atomno-mcp-egrul-scheduler --run-now

Exit-коды atomno-mcp-egrul-import:

КодЗначение
0Импорт прошёл успешно
2Невалидный конфиг / аргумент CLI
4Ошибка ингеста (битый XML, нет каталога дампов, DB error)
5nothing_to_import — самая свежая дата уже в БД (инкремент)

Pro / hosted-режим (прокси на api.atomno-mcp.ru)

Когда пользователь задаёт ATOMNO_API_KEY, все семь тулзов автоматически проксируются на hosted Pro API (SPEC §5.4, §5.4.1). Локальный SQLite в этом режиме не используется — hosted Pro даёт:

  • Актуальные данные на сегодня (без суточной задержки open-data дампа): прямой scrape egrul.nalog.ru + Dadata fallback на стороне сервера.
  • Bulk-эндпойнт без rate-limit (POST /companies/bulk) — один запрос вместо N локальных gather'ов.
  • AI-summary карточки, история изменений, поиск по ФИО директора (Pro-only тулзы — приезжают вместе с hosted-сервером в Phase 2, см. §5.4.1).

Цена: Pro — $10/мес отдельно или $15/мес в паре с mcp-fns-check (bundle-ключ). Free tier: 30 запросов/день/IP без регистрации (SPEC §1).

Настройка в Cursor (.cursor/mcp.json):

json
{  "mcpServers": {    "egrul": {      "command": "uvx",      "args": ["atomno-mcp-egrul"],      "env": {        "ATOMNO_API_KEY": "your-pro-key-here"      }    }  }}

Поведение и ошибки — никакого silent fallback: если hosted API недоступен, клиент поднимает типизированное исключение, а не молча отдаёт данные из устаревшего локального дампа. Сопоставление HTTP ↔ MCP-код ошибки — в SPEC §5.4.1:

HTTP-ответ hosted APIИсключение клиентаerror.code
200——
400ValidationErrorinvalid_input
401HostedAuthErrorauth_required
403ProRequiredErrorpro_required
404 (code=not_found)NotFoundErrornot_found
404 (wrong route)SourceUnavailableErrorsource_unavailable
413BulkTooLargeErrorbulk_too_large
429RateLimitedError (+ Retry-After)rate_limit
5xxSourceUnavailableErrorsource_unavailable
timeout / DNS failSourceUnavailableError (cause=timeout/ConnectError)source_unavailable

Валидация ИНН/ОГРН остаётся клиент-саид (контрольные цифры проверяются до HTTP-запроса — экономия round-trip на битых идентификаторах).


Конфигурация (переменные окружения)

ПеременнаяОписаниеПо умолчанию
MCP_EGRUL_DBПуть к SQLite-файлу со слепком ЕГРЮЛ/ЕГРИП./mcp_egrul_data.sqlite
MCP_EGRUL_USER_AGENTUser-Agent HTTP-клиентаmcp-egrul/0.1 (+https://github.com/atomno-mcp/mcp-egrul)
MCP_EGRUL_HTTP_TIMEOUTТаймаут HTTP в секундах30
MCP_EGRUL_DUMPS_DIRКаталог с дампами ФНС, структура <dir>/<registry>/<YYYY-MM-DD>/*.zip./dumps
MCP_EGRUL_LOG_LEVELУровень логированияINFO
TZТаймзона для scheduler (cron 03:00)Europe/Moscow
ATOMNO_API_KEY(Pro) ключ hosted-подписки — включает проксирование на api.atomno-mcp.ruне задан
ATOMNO_API_BASE(Pro) базовый URL hosted-APIhttps://api.atomno-mcp.ru/mcp-egrul/v1

Пример — см. .env.example.


Структура

apps/mcp-egrul/├── pyproject.toml├── LICENSE                             # MIT├── README.md                           # ЭТОТ ФАЙЛ├── Dockerfile├── docker-compose.yml├── .env.example├── .gitignore├── src/mcp_egrul/│   ├── __init__.py│   ├── server.py                       # FastMCP entrypoint, регистрация 7 тулзов + ping│   ├── context.py                      # ServiceContext (DI: SQLiteStore + HTTP-клиент)│   ├── config.py                       # Чтение env-vars в типизированные поля│   ├── constants.py                    # Все магические числа и enum'ы│   ├── validators.py                   # Контрольные цифры ИНН (10/12) и ОГРН (13/15)│   ├── schemas.py                      # Pydantic-модели CompanyCard/IECard/SearchResult/...│   ├── errors.py                       # McpEgrulError и подклассы│   ├── db/│   │   ├── __init__.py│   │   └── sqlite.py                   # Async-клиент (aiosqlite), init/query/upsert/search + import_log│   ├── sources/│   │   ├── __init__.py│   │   ├── base.py                     # Абстрактный интерфейс Source│   │   ├── opendata.py                 # ФНС open-data адаптер (read-local → SQLite upsert)│   │   ├── opendata_parser.py          # Потоковый lxml.iterparse парсер ЕГРЮЛ/ЕГРИП XML│   │   └── hosted_adapter.py           # HTTP-клиент hosted Pro API (SPEC §5.4.1)│   ├── tools/│   │   ├── __init__.py│   │   ├── search_by_inn.py│   │   ├── search_by_ogrn.py│   │   ├── search_by_name.py│   │   ├── get_full_card.py│   │   ├── get_founders.py│   │   ├── get_director.py│   │   └── bulk_cards.py│   └── scripts/│       ├── __init__.py│       ├── import_opendata.py          # CLI `atomno-mcp-egrul-import` (ручной / одноразовый)│       └── scheduler.py                # CLI `atomno-mcp-egrul-scheduler` (apscheduler cron 03:00 MSK)└── tests/    ├── __init__.py    ├── conftest.py    ├── fixtures/    │   ├── egrul_sample.xml            # Мини-ЕГРЮЛ (2 валидных + 1 skip на неизвестный статус)    │   └── egrip_sample.xml            # Мини-ЕГРИП (active + closed)    ├── test_validators.py    ├── test_schemas.py    ├── test_config.py                  # Config.from_env + _parse_float_env (валидация env)    ├── test_sqlite_store.py    ├── test_cards.py                   # _cards.py: parse_iso_date/datetime + build_*card    ├── test_server_ping.py             # FastMCP tool-layer + server.main()    ├── test_tools.py                   # 7 тулзов: happy-path + validation + not_found    ├── test_opendata_parser.py         # XML-парсер (zip, xml, skip-на-неизвестный-статус)    ├── test_opendata_source.py         # OpenDataSource.run_ingest (full/incremental)    ├── test_integration_import.py      # Полный цикл import → search → get_card    ├── test_import_cli.py              # CLI `atomno-mcp-egrul-import`    ├── test_scheduler_cli.py           # CLI `atomno-mcp-egrul-scheduler` + _run_scheduler    └── test_hosted_adapter.py          # HostedClient + маршрутизация тулзов (respx-моки)

Тесты

bash
pytest -v --cov=src/mcp_egrul

Текущий coverage: 100.00% (345 tests passed, ruff clean, 1529 statements + 382 branches, 0 misses). Enforced политикой --cov-fail-under=100 — любая регрессия сломает CI. Тесты покрывают:

  • валидаторы ИНН/ОГРН/ОГРНИП (контрольные цифры);
  • Config.from_env + парсер float-env-переменных (валидация, а не silent fallback);
  • все 7 MCP-тулзов (happy-path + validation + not_found + bulk partial);
  • SQLite store + FTS5 + import_log;
  • XML-парсер ЕГРЮЛ/ЕГРИП (zip, xml, skip-запись с неизвестным статусом);
  • OpenDataSource.run_ingest (full/incremental/nothing_to_import);
  • полный интеграционный цикл import fixture → search → get_card → bulk;
  • обе CLI (atomno-mcp-egrul-import, atomno-mcp-egrul-scheduler) — регистрация cron-job'ов, парсинг аргументов, _run_daily_ingest на all-happy/nothing_to_import/McpEgrulError, полный цикл _run_scheduler с mock-ed asyncio.Event;
  • FastMCP tool-layer через mcp.call_tool() — сериализация ошибок в структурированные dict'ы, server.main() с валидным и невалидным env;
  • HostedClient (hosted Pro API proxy) — happy-path всех 7 методов, все HTTP-ошибки из SPEC §5.4.1 (401/403/404/413/429/5xx), timeout/ConnectError, невалидный JSON/payload от сервера, клиентская валидация bulk, async with-контекст; плюс маршрутизация из тулзов в hosted-режиме (при задан ATOMNO_API_KEY — запрос идёт в api.atomno-mcp.ru, не в SQLite, валидация ИНН до HTTP);
  • edge-case'ы XML-парсера (75 отдельных unit-тестов на _parse_company/_parse_ie/ _parse_share/_parse_director/_parse_founders/address fallback'ы/legacy-атрибуты/ невалидные длины ИНН/ОГРН/КПП);
  • приватные helper'ы SQLite-стора (_wrap, _prepare_row, _row_to_dict, _normalize_bm25, auto-init через _ensure, rejecting invalid finish_import статусов);
  • ServiceContext reentry-идемпотентность, atexit-cleanup, Config.from_env ValidationError → exit-code 2 из atomno-mcp-egrul-import CLI.

Внешние API никогда не вызываются напрямую из тестов — только через respx (HTTP-мокинг) и локальные XML-фикстуры (tests/fixtures/).


Безопасность и юридический статус

  • Все источники — публично открытые данные ФНС (ЕГРЮЛ / ЕГРИП open-datasets), распространение которых разрешено ФЗ «Об информации…» и ЕГРЮЛ-специфичными нормами (см. SPEC §8).
  • Юридические лица не подпадают под 152-ФЗ (О персональных данных).
  • ФИО физлиц-руководителей и учредителей публикуются самой ФНС в открытом реестре — пересылка этих данных легальна.
  • Никаких write-операций ни в один внешний API.
  • Секреты — только через переменные окружения, в репозитории — .env.example без значений.

Дисклеймер

Сервис — агрегатор и удобный интерфейс над публичными данными ФНС. Не аффилирован с ФНС. Используется на ваш риск. Информация в ответах сервиса не является заменой полноценной юридической или финансовой оценки.


Лицензия

MIT. Файл LICENSE в корне папки.

来源:README.md,提交 212aecc

工具

0
SourceWeft 尚未在沙箱中启动过该软件包,因此其工具未知。

版本历史

1
  1. v0.1.10最新Sep 16, 2026

评分

已满足适用检查项的 50%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分

    请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。

  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分