mcp-egrul
mcp-egrul
用于处理 EGRUL(俄罗斯联邦法人统一国家登记处)和 EGRIP(俄罗斯联邦个体经营者统一国家登记处)的 MCP 服务器(Model Context Protocol — AI 助手连接外部工具的开放协议)。数据源来自俄罗斯联邦税务局(FTS)的官方开放数据转储。
状态: v0.1.2 — 开源版本(通过 SQLite 自托管)已完全就绪 + 托管版 Pro 客户端(用于 api.atomno.ru 的 HTTP 客户端 HostedClient)。已发布至 PyPI,并被 Glama 和 Smithery 收录。托管版 Pro 基础设施正在积极开发中。覆盖率 100.00%(345 个测试,ruff clean,fastmcp 3.2.4,通过 --cov-fail-under=100 强制执行)。
配套项目: mcp-fns-check(基于 EGRUL 的风险检查层)。
简介
AI 助手(Cursor、Claude Desktop、Cline 或任何 MCP 客户端)可见的七个 MCP 工具:
工具 | 描述 | 参数 |
| 按 INN 搜索(10 位数字为法人,12 位为个体经营者) |
|
| 按 OGRN (13) 或 OGRNIP (15) 搜索 |
|
| 按名称进行模糊搜索 (FTS5) |
|
| 包含所有部分的完整卡片 |
|
| 仅获取带有股份的创始人 |
|
| 仅获取当前负责人 |
|
| 批量检查(最多 100 个 INN) |
|
此外还有一个用于检查服务器是否存活的 ping 工具。
Payload 的完整规范请参考 src/mcp_egrul/schemas.py(Pydantic 模型 CompanyCard、IECard、SearchResult、BulkResult)。
Related MCP server: onec-meta-mcp
安装
方案 1 — 通过 PyPI(推荐用户使用)
# Без локального clone — работает «из коробки»
uvx atomno-mcp-egrul
# Или установка глобально
pipx install atomno-mcp-egrul
atomno-mcp-egrul
# Или классический pip в venv
pip install atomno-mcp-egrul
atomno-mcp-egrul方案 2 — 开发模式(开发者使用)
需要 Python 3.11+ 和 uv(pip 的快速替代品,可选)。
git clone https://github.com/atomno-labs/mcp-egrul
cd mcp-egrul
uv venv
uv pip install -e ".[dev]"或者通过 pip 安装:
python -m venv .venv
.venv/Scripts/activate # Windows
# source .venv/bin/activate # Linux/macOS
pip install -e ".[dev]"运行
atomno-mcp-egrul默认传输协议为 stdio(标准输入/输出 JSON-RPC)。适用于连接 Cursor / Claude Desktop / Claude Code。
Claude Desktop (claude_desktop_config.json)
{
"mcpServers": {
"egrul": {
"command": "uvx",
"args": ["atomno-mcp-egrul"]
}
}
}Cursor(项目中的 .cursor/mcp.json 或全局 ~/.cursor/mcp.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 (自托管) — 快速入门
# 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-24
cp ~/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 --full
docker compose --profile import run --rm \
mcp-egrul-import atomno-mcp-egrul-import --registry egrip --full
# 3. Запустите сервер + фоновый cron-демон:
docker compose up -d
docker compose logs -f mcp-egrul-scheduler导入后约 10 分钟,所有工具(search_by_inn、search_by_name 等)即可响应来自本地 FTS 快照的数据。
容器内 /data 卷的结构:
/data/
├── mcp_egrul_data.sqlite # SQLite + FTS5
└── dumps/ # read-only монтируется из ./dumps
├── egrul/
│ └── YYYY-MM-DD/*.zip
└── egrip/
└── YYYY-MM-DD/*.zipCron 守护进程 (atomno-mcp-egrul-scheduler) 会在您将最新转储放入 dumps/<registry>/<YYYY-MM-DD>/ 后自动获取,时间为莫斯科时间凌晨 03:00。如果没有新数据,任务将以 nothing_to_import 结束,且不会在 import_log 中产生多余记录。
导入 FTS 转储(手动模式)
来源:
EGRUL open-data:
https://www.nalog.gov.ru/opendata/7707329152-egrul/EGRIP open-data:
https://www.nalog.gov.ru/opendata/7707329152-egrip/
格式:ZIP 压缩的每日 XML 存档,完整快照约 15 GB。法律上,您必须在接受许可协议后从 FTS 网站下载它们——服务器本身不会自动下载存档(严格限制)。
CLI:
# Полный первоначальный импорт (однократно):
atomno-mcp-egrul-import --registry egrul --full
atomno-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-nowatomno-mcp-egrul-import 的退出代码:
代码 | 含义 |
0 | 导入成功 |
2 | 无效的配置 / CLI 参数 |
4 | 摄取错误(XML 损坏、缺少转储目录、数据库错误) |
5 |
|
Pro / 托管模式(api.atomno.ru 代理)
当用户设置 ATOMNO_API_KEY 时,所有七个工具将自动代理到托管的 Pro API(SPEC §5.4, §5.4.1)。此模式下不使用本地 SQLite,托管 Pro 提供:
今日最新数据(无开放数据转储的每日延迟):直接抓取
egrul.nalog.ru+ 服务器端的 Dadata 回退。无速率限制的批量端点 (
POST /companies/bulk) — 一个请求代替 N 个本地 gather。AI 卡片摘要、变更历史、按负责人姓名搜索(Pro 专属工具 — 将随 Phase 2 的托管服务器一同发布,见 §5.4.1)。
价格:Pro 版每月 10 美元,或与 mcp-fns-check 捆绑每月 15 美元(捆绑密钥)。免费层级:无需注册即可每天每 IP 30 次请求(SPEC §1)。
Cursor 中的配置 (.cursor/mcp.json):
{
"mcpServers": {
"egrul": {
"command": "uvx",
"args": ["atomno-mcp-egrul"],
"env": {
"ATOMNO_API_KEY": "your-pro-key-here"
}
}
}
}行为与错误 — 没有静默回退:如果托管 API 不可用,客户端会抛出类型化异常,而不是静默返回过期的本地转储数据。HTTP ↔ MCP 错误代码映射见 SPEC §5.4.1:
托管 API HTTP 响应 | 客户端异常 |
|
200 | — | — |
400 |
|
|
401 |
|
|
403 |
|
|
404 (code=not_found) |
|
|
404 (wrong route) |
|
|
413 |
|
|
429 |
|
|
5xx |
|
|
timeout / DNS fail |
|
|
INN/OGRN 验证保留在客户端(在 HTTP 请求前检查校验位 — 避免对无效标识符进行往返请求)。
配置(环境变量)
变量 | 描述 | 默认值 |
| EGRUL/EGRIP 快照的 SQLite 文件路径 |
|
| HTTP 客户端的 User-Agent |
|
| HTTP 超时(秒) |
|
| FTS 转储目录,结构 |
|
| 日志级别 |
|
| 调度程序时区 (cron 03:00) |
|
| (Pro) 托管订阅密钥 — 启用对 | 未设置 |
| (Pro) 托管 API 的基础 URL |
|
示例请参考 .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-моки)测试
pytest -v --cov=src/mcp_egrul当前覆盖率:100.00%(345 tests passed,ruff clean,1529 条语句 + 382 个分支,0 遗漏)。通过 --cov-fail-under=100 策略强制执行 — 任何回归都会破坏 CI。测试涵盖:
INN/OGRN/OGRNIP 验证器(校验位);
Config.from_env+ float-env 变量解析器(验证而非静默回退);所有 7 个 MCP 工具(happy-path + 验证 + not_found + 批量部分);
SQLite 存储 + FTS5 +
import_log;EGRUL/EGRIP XML 解析器(zip, xml, 跳过状态未知的记录);
OpenDataSource.run_ingest(完整/增量/nothing_to_import);完整的集成周期
import fixture → search → get_card → bulk;两个 CLI(
atomno-mcp-egrul-import,atomno-mcp-egrul-scheduler)— cron 任务注册、参数解析、_run_daily_ingest在 all-happy/nothing_to_import/McpEgrulError情况下的表现、带有 mock-edasyncio.Event的_run_scheduler完整周期;通过
mcp.call_tool()的 FastMCP 工具层 — 错误序列化为结构化字典,带有有效和无效 env 的server.main();HostedClient(托管 Pro API 代理)— 所有 7 个方法的 happy-path,SPEC §5.4.1 中的所有 HTTP 错误(401/403/404/413/429/5xx),超时/ConnectError,服务器返回的无效 JSON/payload,批量客户端验证,async with上下文;以及托管模式下的工具路由(设置ATOMNO_API_KEY时 — 请求发送到api.atomno.ru而非 SQLite,HTTP 前的 INN 验证);XML 解析器的边缘情况(75 个针对
_parse_company/_parse_ie/_parse_share/_parse_director/_parse_founders/地址回退/遗留属性/无效 INN/OGRN/KPP 长度的独立单元测试);SQLite 存储的私有辅助函数(
_wrap,_prepare_row,_row_to_dict,_normalize_bm25, 通过_ensure自动初始化,拒绝无效的finish_import状态);ServiceContext重入幂等性,atexit-cleanup,Config.from_envValidationError →atomno-mcp-egrul-importCLI 的退出代码 2。
测试中从不直接调用外部 API — 仅通过 respx(HTTP 模拟)和本地 XML 固定数据(tests/fixtures/)。
安全与法律地位
所有来源均为 FTS 公开数据(EGRUL / EGRIP 开放数据集),其传播受《信息法》及 EGRUL 特定规范许可(见 SPEC §8)。
法人实体不属于 152-FZ(个人数据法)范畴。
负责人和创始人的姓名由 FTS 本身在公开登记处发布 — 转发这些数据是合法的。
不对任何外部 API 进行写操作。
密钥仅通过环境变量处理,仓库中仅包含不含值的
.env.example。
免责声明
本服务是针对 FTS 公开数据的聚合器和便捷接口。与 FTS 无关联。使用风险自负。本服务回答中的信息不能替代完整的法律或财务评估。
许可证
MIT。根目录下的 LICENSE 文件。
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseAqualityBmaintenanceMCP server for verifying Russian counterparties (legal entities and individual entrepreneurs) via public Federal Tax Service data: EGRUL/EGRIP, bankruptcy registry (EFRSB), Transparent Business, bailiff service (FSSP), and arbitration courts (KAD).815MIT
- FlicenseNot gradedqualityCmaintenanceMCP server for searching and analyzing 1C enterprise metadata and BSL code using a SQLite backend. Enables querying configuration structure, code routines, and performing compliance checks via natural language.
- AlicenseAqualityAmaintenanceMCP server for Russian court practice (Sudact): full-text case search by law article, court, instance and dates, with access to full decision texts.22MIT
- AlicenseAqualityAmaintenanceMCP server for checking Russian FSSP (Federal Bailiff Service) debts, enabling AI agents to look up enforcement proceedings for individuals and legal entities through MCP clients like Cursor and Claude Desktop.4MIT
Related MCP Connectors
MCP server for nonprofit financials via ProPublica — IRS Form 990 data for 1.8M+ nonprofits.
MCP server for Brazilian Federal Senate open data (legislative, administrative, e-Cidadania).
Hosted MCP server for Mini Accountant: invoices, expenses, customers, analytics, tax estimates.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/atomno-mcp/mcp-egrul'
If you have feedback or need assistance with the MCP directory API, please join our Discord server