Документация

Справочник API

Эндпойнты, параметры, режимы работы и обработка ошибок MCP-сервера

Обзор

Что такое MCP

MCP (Model Context Protocol) — открытый протокол для подключения AI-ассистентов к внешним источникам данных и инструментам. Он стандартизирует способ, которым большие языковые модели взаимодействуют с внешними сервисами.

Этот сервер реализует MCP с транспортом Streamable HTTP для поиска туров на eto.travel. Клиент (AI-ассистент или приложение) отправляет JSON-RPC запросы, а сервер возвращает структурированные результаты поиска туров.

API

Эндпойнты

POST /mcp

Основной эндпойнт для JSON-RPC запросов. Поддерживает методы: initialize, tools/list, tools/call.

POST /mcp
Content-Type: application/json
Accept: application/json, text/event-stream

GET /mcp

SSE поток для получения серверных уведомлений. Требует заголовок Mcp-Session-Id, полученный после инициализации.

DELETE /mcp

Закрытие сессии. Передайте Mcp-Session-Id для завершения активной сессии и освобождения ресурсов.

GET /health

Статус сервера. Возвращает информацию о текущем режиме работы, состоянии upstream, кэша и circuit breaker.

{
  "status": "ok",
  "mode": "live",
  "upstream": "reachable",
  "cache_size": 12,
  "circuit_breaker": "closed"
}
Инструмент

Tool: search_tours

Инструмент для поиска туров. Принимает человекочитаемые параметры и возвращает структурированные результаты.

Параметр Тип Обязательный Описание
to_country string да Название страны (Turkey, Egypt, Thailand, UAE, и др.)
from_city string нет Город вылета (по умолчанию Moscow)
date_from string нет Дата от в формате YYYY-MM-DD
date_to string нет Дата до в формате YYYY-MM-DD
nights_min number нет Мин. ночей (по умолчанию 7)
nights_max number нет Макс. ночей (по умолчанию 10)
adults number нет Взрослые (по умолчанию 2)
children number нет Дети (по умолчанию 0)
budget_max number нет Макс. бюджет в RUB
stars_min number нет Мин. звёзд отеля (1–5)
meal string нет Тип питания: BB, HB, FB, AI, UAI
limit number нет Макс. результатов, до 50 (по умолчанию 10)

Пример запроса

tools/call
{
  "jsonrpc": "2.0",
  "id": 3,
  "method": "tools/call",
  "params": {
    "name": "search_tours",
    "arguments": {
      "to_country": "Turkey",
      "from_city": "Moscow",
      "date_from": "2026-03-01",
      "nights_min": 7,
      "nights_max": 10,
      "adults": 2,
      "limit": 5
    }
  }
}

Пример ответа

response
{
  "jsonrpc": "2.0",
  "id": 3,
  "result": {
    "content": [
      {
        "type": "text",
        "text": "{\"meta\":{\"source\":\"live\",\"live_available\":true,\"cached\":false,\"total\":5,\"query\":{\"to_country\":\"Turkey\",\"from_city\":\"Moscow\",\"date_from\":\"2026-03-01\",\"nights_min\":7,\"nights_max\":10,\"adults\":2,\"limit\":5}},\"tours\":[{\"hotel\":\"Rixos Premium Belek\",\"stars\":5,\"country\":\"Turkey\",\"resort\":\"Belek\",\"meal\":\"UAI\",\"nights\":7,\"date\":\"2026-03-05\",\"price_rub\":185000,\"operator\":\"Anex Tour\",\"link\":\"https://eto.travel/search/?hotel=#tvtourid=\"}]}"
      }
    ]
  }
}
Режимы

Режимы работы

Сервер работает в live+fallback, с опциональным demo-режимом для отладки.

Live

Результаты в реальном времени из веб-поиска eto.travel. Данные актуальны и отражают текущие цены и наличие.

meta.source = "live-eto-web"
meta.live_available = true

Demo

Принудительный режим через ETO_MODE=demo. Возвращает фиксированные демо-данные без обращения к upstream.

meta.source = "demo"

Fallback

Резервный режим при сетевых ошибках upstream. В штатном прод-режиме ожидается live-ответ.

meta.source = "fallback-demo"
meta.live_available = false
meta.upstream_error = "ECONNREFUSED"
Ошибки

Обработка ошибок

Типичные ошибки и способы их решения.

Ошибка Причина Решение
Not Acceptable Забыли заголовок Accept Добавьте Accept: application/json, text/event-stream
Session not found Сессия не инициализирована Сначала вызовите метод initialize
Rate limit exceeded Превышен лимит запросов Не более 30 запросов/мин на клиента
Upstream blocked Cloud провайдеры блокируют IP Сервер автоматически переходит на fallback-demo