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クライアント)から見える7つのMCPツール:
ツール | 説明 | 引数 |
| INNによる検索(10桁:法人、12桁:個人事業主) |
|
| OGRN(13桁)またはOGRNIP(15桁)による検索 |
|
| 名称によるファジー検索(FTS5) |
|
| 全セクションを含む完全なカード情報 |
|
| 持ち分を含む創業者情報のみ |
|
| 現在の代表者のみ |
|
| 一括チェック(最大100件のINN) |
|
加えて、サーバーの稼働確認用の ping ツールがあります。
ペイロードの完全な仕様は 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アーカイブ、フルスナップショットで約15GB。法的に、これらはライセンスに同意した上で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、ダンプディレクトリ不在、DBエラー) |
5 |
|
Pro / ホスト型モード(api.atomno.ru へのプロキシ)
ユーザーが ATOMNO_API_KEY を設定すると、7つのツールすべてが自動的にホスト型Pro APIにプロキシされます(SPEC §5.4, §5.4.1)。このモードではローカルのSQLiteは使用されません。ホスト型Proの利点:
最新のデータ(オープンデータダンプの1日遅延なし):
egrul.nalog.ruの直接スクレイピング + サーバー側でのDadataフォールバック。レート制限なしのBulkエンドポイント (
POST /companies/bulk) — ローカルでのN回のgatherの代わりに1回のリクエストで完了。AIによるカード要約、変更履歴、代表者氏名による検索(Pro専用ツール — フェーズ2でホスト型サーバーと共に提供、§5.4.1参照)。
価格: Proは月額10ドル、または mcp-fns-check とのセットで月額15ドル(バンドルキー)。Free tier:登録なしで1日30リクエスト/IP(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 statements + 382 branches, 0 misses)。--cov-fail-under=100 ポリシーにより強制されており、リグレッションが発生するとCIが失敗します。テスト範囲:
INN/OGRN/OGRNIPバリデーター(チェックディジット);
Config.from_env+ float環境変数のパーサー(サイレントフォールバックではなく検証);7つのMCPツールすべて(ハッピーパス + 検証 + not_found + bulk partial);
SQLiteストア + FTS5 +
import_log;EGRUL/EGRIP XMLパーサー(zip, xml, 不明なステータスのレコードスキップ);
OpenDataSource.run_ingest(full/incremental/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されたasyncio.Eventを使用した_run_schedulerの完全サイクル;mcp.call_tool()を介したFastMCPツールレイヤー — エラーの構造化辞書へのシリアライズ、有効/無効なenvでのserver.main();HostedClient(ホスト型Pro APIプロキシ) — 7つのメソッドすべてのハッピーパス、SPEC §5.4.1のすべてのHTTPエラー(401/403/404/413/429/5xx)、タイムアウト/ConnectError、サーバーからの無効なJSON/ペイロード、クライアント側のbulk検証、async withコンテキスト;さらにホストモードでのツールからのルーティング(ATOMNO_API_KEY設定時 — SQLiteではなくapi.atomno.ruへリクエスト、HTTP前のINN検証);XMLパーサーのエッジケース(
_parse_company/_parse_ie/_parse_share/_parse_director/_parse_founders/addressフォールバック/レガシー属性/無効なINN/OGRN/KPP長に関する75の個別ユニットテスト);SQLiteストアのプライベートヘルパー(
_wrap,_prepare_row,_row_to_dict,_normalize_bm25,_ensureによる自動初期化、無効なfinish_importステータスの拒否);ServiceContextの再入可能性、atexitクリーンアップ、Config.from_envの ValidationError →atomno-mcp-egrul-importCLIからの終了コード2。
外部APIはテストから直接呼び出されることはありません。respx(HTTPモッキング)とローカルのXMLフィクスチャ(tests/fixtures/)のみを使用します。
セキュリティと法的ステータス
すべてのソースは FTSの公開オープンデータ(EGRUL / EGRIP open-datasets)であり、その配布は「情報に関する法律」および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