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 ファイルを参照してください。
Available Tools
8 toolsbulk_cardsA
Массовая выгрузка до 100 карточек за один вызов.
Вернёт объект с полями cards (успешные) и errors (точечные ошибки
по отдельным ИНН) — один плохой ИНН не ломает весь bulk.
| Name | Required | Description | Default |
|---|---|---|---|
| inns | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses important behavioral aspects like returning both successful cards and per-TIN errors, and that one bad TIN doesn't break the whole call. However, it omits whether the operation is read-only or has side effects, and no mention of authorization or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences with no fluff. The first sentence front-loads the core purpose and capacity, and the second explains the return structure and error handling. Every word contributes value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple input schema (one parameter) and the existence of an output schema (not provided but implied), the description sufficiently covers maximum batch size, return format (cards/errors), and partial failure behavior. It is complete for its complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the schema has no description for the 'inns' parameter, the description mentions 'отдельным ИНН' (individual TINs), clarifying that the array contains Russian tax identifiers. With 0% schema coverage, the description adds meaning beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool performs a massive upload of up to 100 cards per call, specifying the action (выгрузка) and resource (карточек). It distinguishes itself from siblings like search_by_inn by handling multiple INNs and returning partial errors.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description indicates usage for batch card retrieval with a capacity limit of 100, but does not explicitly state when not to use it or list alternatives. However, the context of sibling tools and the capacity hint provide implicit guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_directorB
Текущий руководитель юр.лица по ИНН (только 10-значный ИНН).
| Name | Required | Description | Default |
|---|---|---|---|
| inn | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits. It only states it returns the current director, but fails to mention aspects like error handling, data freshness, auth requirements, or side effects. This is insufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence, very concise and front-loaded with the key action and constraint. Every word earns its place, though it could be slightly expanded for additional clarity without losing brevity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple single-parameter tool and the existence of an output schema, the description is minimally adequate but lacks details on edge cases or error responses. It covers the basic purpose but not the full context of usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage. The tool description adds value by specifying that the INN must be exactly 10 digits. However, it doesn't fully compensate for missing schema descriptions, e.g., no mention of format beyond digit count.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves the current director of a legal entity by INN. It specifies the exact resource (director), action (get), and constraint (10-digit INN for legal entities). This distinguishes it from siblings like get_founders or search_by_inn.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not provide any guidance on when to use this tool versus alternatives such as get_founders or search_by_inn. It only describes what it does without contextual or comparative usage advice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_foundersB
Учредители юр.лица по ИНН (только 10-значный ИНН).
| Name | Required | Description | Default |
|---|---|---|---|
| inn | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden for behavioral disclosure. It only mentions the TIN length constraint but does not disclose whether this is a read-only operation, error handling, or any side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that conveys the core purpose and a key constraint without any unnecessary words. It is efficiently structured and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema (not shown), the description does not need to detail return values. However, it lacks information on error handling, input validation details, or the structure of the founders data, which could be incomplete for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, leaving the 'inn' property undocumented. The description adds the crucial constraint that only a 10-digit TIN is accepted, which is valuable beyond the schema definition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves founders of a legal entity by TIN and specifies the requirement of a 10-digit TIN. This distinguishes it from siblings like get_director which targets a different role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool over alternatives like search_by_inn or get_director. It does not state prerequisites or exclusions, leaving the agent to infer usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_full_cardA
Полная карточка (все секции: реквизиты, ОКВЭД, учредители, директор).
Хотя бы один из inn / ogrn обязателен. Если переданы оба — используется inn.
| Name | Required | Description | Default |
|---|---|---|---|
| inn | No | ||
| ogrn | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses that at least one of inn/ogrn is required and inn takes precedence, but does not mention read-only nature, authentication needs, or error handling for missing parameters.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences and front-loads the purpose. It is concise with no unnecessary words, though structure could be improved with bullet points for clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema and only two parameters, the description covers the primary requirements: purpose and parameter constraints. It lacks mention of error cases or usage limitations, but is largely complete for a simple tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, but the description adds meaning by clarifying that inn and ogrn are alternative identifiers, at least one is mandatory, and inn is used if both are provided. This significantly compensates for the schema's lack of parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states 'Full card (all sections: details, OKVED, founders, director)', clearly indicating it retrieves a complete company card. This distinguishes it from sibling tools like get_director and get_founders, which target specific sections.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for retrieving full card data, but does not explicitly contrast with siblings or state when to use this tool over alternatives like search_by_inn or get_director. No exclusion criteria or context is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pingA
Диагностика: сервер жив, сообщает версию и размер локального слепка.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description takes full burden. It discloses that the tool reports version and snapshot size, which is useful. However, it does not mention read-only nature, safety, or potential side effects, though for a ping tool these are minimal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, focused sentence that front-loads the main purpose ('Диагностика') and immediately specifies what the tool reports. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given zero parameters, an output schema exists (not shown but referenced), and a set of sibling tools, the description is complete for this simple tool: it tells the agent exactly what the tool returns and its role as a health check.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so the description need not add parameter info. Baseline for zero parameters is 4, and the description appropriately focuses on the tool's output rather than parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool is for diagnostics: checking server liveness, version, and snapshot size. It uses a specific verb ('диагностика') and resource ('сервер'), and is distinct from sibling tools that handle cards, directors, or searches.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for health checks but does not explicitly state when to use this tool vs alternatives, nor does it mention exclusions or prerequisites. Given the clear purpose, usage is implied but not guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_by_innA
Карточка юр.лица или ИП по ИНН (10 цифр — ООО/АО, 12 — ИП/физлицо).
| Name | Required | Description | Default |
|---|---|---|---|
| inn | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description must cover behavioral traits. It only states the searchby TIN and format, omitting any details on error handling, rate limits, or return behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise (one short phrase) and front-loaded with the core purpose, containing no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple lookup tool with an output schema, the description is minimally complete but lacks details on error cases and what the card contains, leaving some gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has no parameter descriptions (0% coverage), but the description adds critical semantic meaning by explaining the TIN length and entity mapping, significantly aiding correct usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns a card of a legal entity or individual entrepreneur by TIN, and distinguishes it from siblings by specifying TIN format (10/12 digits) and entity types.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this tool is for TIN-based lookup, distinct from siblings like search_by_name or search_by_ogrn, but provides no explicit when-to-use or when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_by_nameB
Fuzzy-поиск юр.лиц по названию через FTS5.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | максимум результатов (1..50). | |
| query | Yes | строка запроса (минимум 2 символа). | |
| only_active | No | фильтровать только записи со статусом 'active'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It mentions fuzzy search via FTS5 but omits details like matching behavior, result ordering, or handling of misspellings.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is a single sentence, concise but lacking structure. It could benefit from additional context without being lengthy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations and only input schema provided, the description omits important behavioral traits and result format expectations. Even with an output schema, more context would be helpful.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for all parameters. The description adds no new meaning beyond 'fuzzy', so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it is a fuzzy search of legal entities by name using FTS5, which is specific and distinguishes from siblings like search_by_inn and search_by_ogrn.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives. It implicitly targets name-based searches, but without stating exclusions or context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_by_ogrnB
Карточка по ОГРН (13 цифр) или ОГРНИП (15 цифр).
| Name | Required | Description | Default |
|---|---|---|---|
| ogrn | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must fully disclose behavior. It only states what the tool does (retrieve a card) but omits details about error handling, side effects, or what happens for invalid inputs. This is insufficient for an agent to fully anticipate behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence, which is highly concise and front-loaded. However, it could be structured with separate sentences for clarity, but for a simple tool it is appropriately sized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the existence of an output schema (not shown), the description may not need to detail return values. It provides the parameter format but lacks any mention of error handling or usage context. For a simple lookup tool, it is minimally adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage, so the description must compensate. It adds meaningful format constraints: 13 digits for OGRN and 15 digits for OGRNIP, which is valuable beyond the plain string type in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool retrieves a card by OGRN (13 digits) or OGRNIP (15 digits), making the purpose and resource specific. It distinguishes itself from sibling tools like search_by_inn and search_by_name by indicating the identifier type.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description offers no explicit guidance on when to use this tool versus alternatives or when not to use it. The context is only implied by the tool name and description, with no mention of prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
8 tool updates
v0.1.2- First observed
bulk_cards - First observed
get_director - First observed
get_founders - First observed
get_full_card - First observed
ping - First observed
search_by_inn - First observed
search_by_name - First observed
search_by_ogrn
TDQS
Scored across 8 tools
Each tool targets a distinct query type: bulk export, specific fields (director, founders), full card, health check, and three search methods (INN, name, OGRN). No overlapping purposes.
Most tools use a verb_noun pattern (get_director, get_founders, search_by_inn, etc.). Ping and bulk_cards are minor deviations but still clear.
Eight tools cover a complete set of operations for a business registry: multiple search methods, specific field lookups, bulk export, and health check. No extraneous tools.
Covers essential read operations for a registry: search by various identifiers, retrieval of full cards and specific fields, bulk export. Missing filtering or advanced search (e.g., by region) but acceptable for a focused server.
Maintenance
Related MCP Connectors
MCP server for US nursing facility search and ownership lookup (NursingHomeDatabase).
MCP server for Russian books search, details, and recommendation candidates.
MCP server for medicaid-intelligence
Agent-native MCP server over 49M+ US public and government records, privacy-first, always current.
Related MCP Servers
- AlicenseAqualityAmaintenanceMCP 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).877 PyPI14MIT
- FlicenseNot gradedqualityBmaintenanceMCP 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.-
- AlicenseAqualityBmaintenanceMCP server for Russian court practice (Sudact): full-text case search by law article, court, instance and dates, with access to full decision texts.254 PyPI2MIT
- AlicenseAqualityBmaintenanceMCP 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.549 PyPIMIT