TL;DR: Написал open-source MCP-сервер для каталогпо.рф. Теперь Claude Code/Claude Desktop умеет искать российское ПО прямо в диалоге: «найди антивирус для Linux с ФСТЭК-сертификатом», «покажи SIEM от отечественных производителей», «что заменит Veeam из реестра». Репо: velvetway/minreestr-mcp.

Зачем

Делаю диплом — платформу управления киберрисками под 152-ФЗ и 187-ФЗ. Одна из страниц — справочник ПО из реестра Минцифры с сертификатами ФСТЭК/ФСБ. Когда понадобилось наполнить БД реальными данными, уткнулся в проблему:

  • Официальный реестр на reestr.digital.gov.ru не имеет API, дампы не публикуются, а сам сайт геоблокирован от зарубежных IP.

  • Публичных MCP для работы с реестром тоже нет — проверил awesome-mcp-servers и GitHub-поиск, ноль проектов.

При этом в MCP-экосистеме Claude сейчас бум: любой простой инструмент получает аудиторию. Решил попробовать закрыть нишу.

Что за каталогпо.рф

Случайно нашёл сайт каталогпо.рф — агрегатор российского ПО с 26 000+ продуктов. Не аффилирован с Минцифры, но данные свежие, описания подробные, часто с упоминанием ФСТЭК-классов, совместимости с Astra Linux/РЕД ОС, соответствия 152-ФЗ.

Главное — сайт не блокирует зарубежные IP и у него нашёлся неофициальный публичный API. Обнаружил, когда reverse-инженерил JS-бандл (main.25bead19.js):

GET /api/products/search?query={q}&limit={n}
GET /api/manufacturers?page={p}&limit={n}
GET /images/main-product.json   ← featured products

Эндпоинт /api/categories отдаёт 404, страницы продуктов — SPA, данные подгружаются по id через тот же search. Для большинства задач трёх открытых эндпоинтов достаточно.

Архитектура MCP

Три инструмента, стандартный stdio transport, Python + mcp SDK + httpx:

@server.list_tools()
async def list_tools() -> list[Tool]:
    return [
        Tool(name="search_russian_software",
             description="Full-text search over Russian software catalog..."),
        Tool(name="list_russian_manufacturers",
             description="Paginated list of vendors with preview products..."),
        Tool(name="get_featured_russian_software",
             description="Featured products from the homepage..."),
    ]

Клиент — тонкая обёртка над тремя HTTP-эндпоинтами с нормализацией (id → строка, добавление url, клэмп limit в [1, 100]):

async def search_products(self, query: str, limit: int = 10) -> list[dict]:
    r = await self._client.get("/api/products/search",
                               params={"query": query, "limit": limit})
    r.raise_for_status()
    return [{
        "id": str(it.get("id", "")),
        "name": it.get("name", ""),
        "description": it.get("description", ""),
        "url": PRODUCT_PAGE_URL.format(id=it["id"]) if it.get("id") else None,
    } for it in r.json().get("items", [])]

Ответы формируются в читаемом для LLM виде, не raw JSON — Claude такое переваривает лучше и может цитировать.

Пример использования

В ~/.claude/settings.json:

{
  "mcpServers": {
    "minreestr": { "command": "minreestr-mcp" }
  }
}

Диалог:

Я: Нужен российский SIEM с ФСТЭК-сертификатом. Что есть?

Claude (вызывает search_russian_software("SIEM", limit=5)): Нашёл 5 продуктов. Наиболее подходящие:

  • MaxPatrol SIEM (Positive Technologies) — ФСТЭК УД-4, СЗИ, рекомендован для объектов КИИ

  • Kaspersky Unified Monitoring and Analysis Platform — ФСТЭК УД-4

  • Ankey SIEM NG (Газинформсервис) — ФСТЭК УД-4, в реестре Минцифры № 3348

Все три могут работать с Astra Linux и поддерживают интеграцию с БДУ ФСТЭК.

Технические мелочи

Тесты. Через respx мокаются HTTP-вызовы, 6 юнит-тестов покрывают нормализацию, клэмп, пустой ответ, HTTP-ошибки, обработку «промо»-записей без id. CI на Python 3.10/3.11/3.12.

Entry point. В pyproject.toml:

[project.scripts]
minreestr-mcp = "minreestr_mcp.server:main"

После pip install команда minreestr-mcp запускает stdio-сервер.

Trusted publishing. PyPI настроен через GitHub OIDC — при публикации GitHub Release воркфлоу автоматически билдит wheel и заливает на PyPI без токенов.

Правовая сторона

API неофициальный. Данные публичные (ПО из реестра Минцифры), MIT-лицензия на мою обёртку, но не на данные. В README явно указано, что проект не аффилирован с каталогпо.рф и пользователи должны соблюдать ToS сайта-источника. Связался с владельцами через их Telegram-бота из бандла (@CatalogPO_bot), жду ответа — если откажут, переключусь на альтернативные источники или перейду к CSV-дампу по запросу.

Что дальше

  • Больше эндпоинтов. Есть подозрение, что скрытые /api/category/{id} / /api/product/{id} существуют на бэкенде (или SSR-роуты с JSON-LD). Не успел дореверсить.

  • Fallback через сторонние зеркала (reestr-po.1c.ru, soware.ru) для устойчивости.

  • Интеграция в мой CyberRisk. Сейчас наш /api/software тянет свой сид; логичный next-step — опция «подтянуть из внешнего реестра» на стороне бэкенда.

Ссылки

Буду рад звёздам, PR и фидбеку. Если сайт-донор что-то сломает — в issues. Если есть идеи других open API для РФ-специфики (БДУ ФСТЭК, НКЦКИ, реестр Минпромторга) — предлагайте, писать такие обёртки оказалось неожиданно быстро.