Skip to main content
Glama
futuristclaude

Kontur.Zakupki MCP

README.md
# Kontur.Zakupki — remote MCP (поиск тендеров для Claude)

Remote MCP-сервер поверх API Контур.Закупки (`https://api-zakupki.kontur.ru`).
Транспорт — **streamable-http**, поэтому подключается к Claude (Cowork / Desktop)
как **кастомный коннектор по URL**: `https://<ваш-хост>/mcp`.

Это «удалённый» аналог локального пакета `kontur-zakupki-mcp` (stdio): тот же API,
но крутится на сервере и не требует установки на машину пользователя.

## Инструменты

| Tool | Что делает | Эндпоинт |
|---|---|---|
| `zakupki_search` | поиск тендеров по периоду + фильтрам (текст, законы, способы, статусы, регионы, ИНН, НМЦ, СМП) | POST `/external/v1/search` |
| `zakupki_get(id)` | карточка закупки | GET `/external/v1/purchases/{id}` |
| `zakupki_results(id)` | результаты закупки | GET `/external/v1/results/{id}` |
| `zakupki_limits()` | текущие лимиты API | GET `/external/v1/limitGroups` |
| `zakupki_health()` | задан ли ключ + доступность API | — |

Коды фильтров: **laws** 1=44-ФЗ, 2=223-ФЗ, 3=коммерч.+малые, 5=615-ПП, 8=коммерч., 9=малые ·
**procedures** 0=аукцион, 1=котировки, 2=ед.поставщик, 3=конкурс, 5=запрос цен, 99=другое ·
**statuses** 1=подача, 2=комиссия, 3=завершены, 4=планируются, 5=отменены ·
**smp** 0=не учитывать, 1=СМП, 2=без СМП.

## Авторизация

Заголовок `X-Kontur-Apikey`. Ключ берётся из переменной окружения
`KONTUR_ZAKUPKI_API_KEY`. Активный ключ — в кабинете интегратора
https://integrations.kontur.ru (раздел *Api-ключи*; показывается один раз).

## Деплой на Render (5 минут)

1. Залейте папку `kontur-zakupki-remote/` в репозиторий GitHub.
2. Render → **New → Web Service** → подключите репозиторий.
3. Runtime — **Docker** (Render сам увидит `Dockerfile` / `render.yaml`), план **Free**.
4. **Environment → Add Environment Variable**:
   `KONTUR_ZAKUPKI_API_KEY = <ваш активный ключ>`.
5. **Create Web Service** и дождитесь деплоя.
6. Адрес коннектора: `https://<имя-сервиса>.onrender.com/mcp`.

Проверка после деплоя:
- `https://<host>/` → 404 «Not Found» — это нормально (на корне ничего нет).
- открыть в браузере `https://<host>/mcp` → JSON-ошибка
  «Not Acceptable: Client must accept text/event-stream» — **это значит сервер работает**
  (он ждёт MCP-клиента, а не браузер).

> Free-план Render «засыпает» при простое — первый запрос после паузы идёт ~30–50 сек.

## Подключение к Claude

**Cowork / claude.ai → Settings → Connectors → Add custom connector:**
- URL: `https://<host>/mcp`
- авторизация не требуется (ключ уже на сервере).

**Claude Desktop (`claude_desktop_config.json`)** — через remote MCP:
```json
{
  "mcpServers": {
    "kontur-zakupki": { "url": "https://<host>/mcp" }
  }
}
```

## Примеры запросов в чате

- «Найди тендеры по насосам и центрифугам за июнь 2026, 44-ФЗ, этап подачи заявок» →
  `zakupki_search(date_from="2026-06-01", date_to="2026-06-30", text=["насос","центрифуга"], laws=[1], purchase_statuses=[1])`
- «Покажи карточку закупки <id>» → `zakupki_get`
- «Какие у нас остались лимиты API?» → `zakupki_limits`

## Локальный запуск (для отладки)

```bash
pip install -r requirements.txt
KONTUR_ZAKUPKI_API_KEY=<ключ> python server.py     # поднимет http://localhost:8000/mcp
```

## Что дальше (опционально)

Локальный пакет `kontur-zakupki-mcp` дополнительно умеет матчить тендеры с вашей
**продуктовой матрицей** (44 категории, заводы). Чтобы перенести это в remote-версию,
положите `product_matrix.json` рядом с `server.py` и добавьте инструменты
`search_tenders_by_matrix` / `classify_text` (могу собрать отдельно).