mcp-egrul
mcp-egrul
MCP 서버(Model Context Protocol — AI 어시스턴트를 외부 도구에 연결하기 위한 오픈 프로토콜)로, EGRUL(러시아 연방 법인 통합 국가 등록부) 및 EGRIP(러시아 연방 개인 사업자 통합 국가 등록부) 작업을 수행합니다. 데이터 소스는 FTS(연방 세무청)의 공식 오픈 데이터 덤프입니다.
상태: v0.1.2 — 오픈 버전(SQLite를 통한 self-host)이 완전히 준비되었으며, hosted Pro 클라이언트 부분( api.atomno.ru용 HTTP 클라이언트 HostedClient)도 포함되어 있습니다. PyPI에 게시되었으며 Glama 및 Smithery에 인덱싱되어 있습니다. hosted 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 (self-host) — 빠른 시작
# 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(Europe/Moscow 기준)에 최신 덤프를 자동으로 가져옵니다. 새로운 데이터가 없으면 작업은 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 / hosted 모드 (api.atomno.ru 프록시)
ATOMNO_API_KEY가 설정되면 7가지 도구 모두가 자동으로 hosted Pro API로 프록시됩니다(SPEC §5.4, §5.4.1). 이 모드에서는 로컬 SQLite가 사용되지 않으며, hosted Pro는 다음을 제공합니다:
오늘 기준 최신 데이터 (오픈 데이터 덤프의 일일 지연 없음):
egrul.nalog.ru직접 스크래핑 + 서버 측 Dadata 폴백.Rate-limit 없는 Bulk 엔드포인트 (
POST /companies/bulk) — N개의 로컬 gather 대신 단일 요청.AI 카드 요약, 변경 이력, 대표자 이름 검색 (Pro 전용 도구 — Phase 2에서 hosted 서버와 함께 제공, §5.4.1 참조).
가격: Pro — 월 $10 또는 mcp-fns-check와 번들 시 월 $15. Free tier: 등록 없이 IP당 일일 30회 요청(SPEC §1).
Cursor 설정 (.cursor/mcp.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을 참조하세요:
hosted 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) hosted 구독 키 — | 설정 안 됨 |
| (Pro) hosted 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-env 변수 파서;7가지 MCP 도구 전체 (happy-path + validation + not_found + bulk partial);
SQLite store + FTS5 +
import_log;EGRUL/EGRIP XML 파서 (zip, xml, 알 수 없는 상태의 레코드 건너뛰기);
OpenDataSource.run_ingest(full/incremental/nothing_to_import);전체 통합 주기
import fixture → search → get_card → bulk;CLI 2종 (
atomno-mcp-egrul-import,atomno-mcp-egrul-scheduler) — cron-job 등록, 인수 파싱,_run_daily_ingest전체 주기,_run_scheduler(mock-edasyncio.Event포함);FastMCP 도구 레이어 — 오류 직렬화,
server.main()환경 변수 검증;HostedClient(hosted Pro API proxy) — 7개 메서드 전체, SPEC §5.4.1의 모든 HTTP 오류, 타임아웃/ConnectError, 잘못된 JSON/페이로드, 클라이언트 측 bulk 검증,async with컨텍스트; hosted 모드에서의 도구 라우팅;XML 파서 엣지 케이스 (75개의 개별 단위 테스트);
SQLite 스토어 프라이빗 헬퍼;
ServiceContext재진입성,atexit정리,Config.from_envValidationError → CLI 종료 코드 2.
외부 API는 테스트에서 직접 호출되지 않으며, respx(HTTP 모킹)와 로컬 XML 픽스처(tests/fixtures/)를 통해서만 수행됩니다.
보안 및 법적 상태
모든 소스는 FTS의 공개 데이터(EGRUL / EGRIP open-datasets)이며, 러시아 연방 법률에 따라 배포가 허용됩니다(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