Эндпойнты, параметры, режимы работы и обработка ошибок MCP-сервера
MCP (Model Context Protocol) — открытый протокол для подключения AI-ассистентов к внешним источникам данных и инструментам. Он стандартизирует способ, которым большие языковые модели взаимодействуют с внешними сервисами.
Этот сервер реализует MCP с транспортом Streamable HTTP для поиска туров на eto.travel. Клиент (AI-ассистент или приложение) отправляет JSON-RPC запросы, а сервер возвращает структурированные результаты поиска туров.
POST /mcpОсновной эндпойнт для JSON-RPC запросов. Поддерживает методы: initialize, tools/list, tools/call.
POST /mcp
Content-Type: application/json
Accept: application/json, text/event-stream
GET /mcpSSE поток для получения серверных уведомлений. Требует заголовок 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"
}
Инструмент для поиска туров. Принимает человекочитаемые параметры и возвращает структурированные результаты.
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
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) |
{
"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
}
}
}
{
"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-режимом для отладки.
Результаты в реальном времени из веб-поиска eto.travel. Данные актуальны и отражают текущие цены и наличие.
meta.source = "live-eto-web"
meta.live_available = true
Принудительный режим через ETO_MODE=demo. Возвращает фиксированные демо-данные без обращения к upstream.
meta.source = "demo"
Резервный режим при сетевых ошибках 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 |