MCP server by wagon3667-cloud
eto-tours-mcp
Минимальный MCP‑сервер и HTTP‑адаптер для поиска туров через Tourvisor (modsearch/modresult). Без Puppeteer, без cookies в коде, только обычные HTTP‑запросы.
Цель: дать нейросети доступ к поиску туров через MCP (stdio или HTTP/SSE) и/или обычный HTTP API.
Что умеет
- Один MCP‑инструмент
search_tours - Цикл:
modsearch → poll modresult → дождаться data.block - Нормализованный результат: цена, дата, ночи, оператор, отель
- Названия отелей подтягиваются из
listdev.php(если есть session/referrer/cookie)
Демо

Структура
api.py— HTTP API (FastAPI) для modsearch/modresult иsearch_toursmcp_server.py— MCP сервер (stdio)mcp_http.py— MCP HTTP/SSE транспорт (если доступен в пакетеmcp)eto_client.py— клиент для modsearch/modresult + нормализацияconfig.py— настройки через envapi-contract.md— фиксированный контракт с Tourvisor
Быстрый старт
- Установка зависимостей
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
-
Настроить
.env(смотри.env.example) -
Запуск HTTP API
.venv/bin/uvicorn api:app --host 0.0.0.0 --port 8080
- Запуск MCP (stdio)
.venv/bin/python mcp_server.py
- Запуск MCP по HTTP (если поддерживается транспорт)
.venv/bin/python mcp_http.py
MCP инструмент
search_tours принимает:
country— id или строка (например,Египет)city_from— id или строка (например,Москва)date_from,date_to—YYYY-MM-DDnights— количество ночейadults— количество взрослыхlimit— максимум туров (по умолчанию 20)unique_hotels— еслиtrue, отдаёт по одному туру на отельrefresh_hotels— еслиtrue, обновляет список отелей изlistdev.phpsession,referrer— если нужно переопределить
Пример запроса:
{
"date_from": "2026-03-01",
"date_to": "2026-03-31",
"nights": 10,
"adults": 2,
"country": "Египет",
"city_from": "Москва",
"limit": 10
}
Пример ответа:
[
{
"hotel_id": 9366,
"hotel_name": "SOME HOTEL",
"operator": 16,
"operator_name": "Sunmar",
"date": "2026-03-02",
"nights": 10,
"price": 105782,
"room": 30,
"room_name": "standard",
"meal": 3,
"meal_name": "BB - Только завтрак"
}
]
HTTP API
POST /modsearch— прокси на modsearchGET /modresult?requestid=...— прокси на modresultPOST /modresult— прокси на modresult (requestid можно в теле)POST /search— алиас modsearchGET /result— алиас modresultPOST /search_tours— полный цикл (modsearch → poll modresult → дождаться data.block)
/search_tours возвращает нормализованный список туров, а не сырой JSON Tourvisor.
Публичные эндпоинты (деплой)
- HTTP API:
http://82.202.138.25:8080 - MCP HTTP/SSE:
http://82.202.138.25:8081
Пример:
curl -X POST http://82.202.138.25:8080/search_tours \
-H 'Content-Type: application/json' \
-d '{"country":"Египет","city_from":"Москва","date_from":"2026-03-01","date_to":"2026-03-31","nights":10,"adults":2,"limit":5}'
Где взять session / cookie / referrer
Чтобы получить названия отелей через listdev.php, нужны актуальные session, referrer и cookie.
- Открой
https://tourvisor.ru/ - DevTools → Network → XHR
- Найди запрос:
listdev.php?type=allhotel&hotcountry=...&format=json&referrer=...&session=...
- Скопируй:
- query параметр
session - query параметр
referrer - cookie из заголовка
Cookie
- query параметр
Эти значения положи в .env:
DEFAULT_SESSIONDEFAULT_REFERRERETO_HEADERS_JSON(внутриCookieиReferer)
Важно:
- Не коммить
.envв git - Сессии со временем устаревают, можно обновлять без перезапуска кода
Клиенты MCP (кроме Claude)
Самые популярные и удобные:
- Cursor — MCP из коробки, удобен для тестов и интеграции
- Cline / Roo Code (VS Code) — MCP поддерживается, много настроек, хорош для автоматизации
- Continue (VS Code/JetBrains) — поддержка MCP, удобно для локальных инструментов
- Zed (если используешь редактор) — MCP в экосистеме, но реже в проде
Если нужен удалённый MCP, запускай mcp_http.py и подключайся через HTTP/SSE клиентом, который это поддерживает.
Если клиент требует HTTPS (например, Cursor в некоторых сборках), поставь reverse‑proxy + TLS.
Что улучшать дальше
- Авто‑обновление
session/cookieбез ручной подстановки - Ссылки на конкретные туры (если удастся стабильно восстановить URL)
- Фильтры по питанию, звёздам, району, бюджету
Деплой
Серверная установка описана в DEPLOY.md.
Смотри контракт: api-contract.md.