google-flights-mcp
Google Flights MCP — тарифы в реальном времени, которые ваш агент может искать по всему диапазону дат, без рекламы
claude mcp add --transport http google-flights https://google-flights-mcp.flightpowers.com/mcp --header "x-rapidapi-key: YOUR_RAPIDAPI_KEY"Хостится. Ничего клонировать не нужно, ничего собирать не нужно. Включён в официальный реестр MCP Registry как com.flightpowers/google-flights-mcp. Проверка состояния: /health.
Нужен ключ? Подпишитесь на Google Flights Live API на RapidAPI — доступен бесплатный тариф — и скопируйте свой x-rapidapi-key: https://rapidapi.com/mtnrabi/api/google-flights-live-api
Пока нет ключа? Начните с бесплатного сервера — тот же поиск, без регистрации:
claude mcp add --transport http google-flights-free https://google-flights-lulu.flightpowers.com/mcp
(на рекламе: одна раскрытая спонсорская карточка на результат, разветвление ограничено 15, а клиенты, которые не могут отображать спонсорскую карточку, могут быть ограничены дополнительно.) Возвращайтесь сюда, когда реклама, лимит в 15 поисков или ограничения клиента начнут вам мешать.
Что получает ваш агент
Два инструмента отвечают на вопрос о цене, а не на поиск по дате.
Задавайте открытые вопросы. «Самый дешёвый билет в одну сторону до Шри-Ланки в любой день октября», «от 5 до 7 ночей в Риме когда-нибудь в мае, из Тель-Авива или Ларнаки» — каждый такой запрос — это один вызов инструмента. Оба инструмента принимают диапазон дат вылета, список аэропортов назначения и (для перелёта туда и обратно) значение
nightsвместо фиксированной даты возвращения и разворачивают их внутренне.Сообщайте, действительно ли цена хорошая. Каждый результат содержит собственный исторический диапазон цен Google для этого маршрута и периода —
price_insights_low,price_insights_highи вердиктprice_range_in_relation_to_other_periodsсо значениемlow/typical/high. Это позволяет агенту ответить «$209 — это обычная цена, не торопитесь», а не просто назвать число.Бронируйте, а не только смотрите. Каждый результат содержит
buy_linkна Google Flights.Отслеживайте расходы. Каждый ответ содержит
api_usage— запросы, использованные этим вызовом, и что осталось на плане вызывающего. См. Отчёт о расходах.Отслеживайте результаты поиска. Каждый ответ содержит
search_coverage, чтобы модель могла честно сказать, на каких датах и направлениях основан ответ.
Результаты — это тарифы в реальном времени. Они устаревают в течение минут — никогда не кэшируйте тариф и не переиспользуйте более ранний результат; ищите заново и указывайте, когда были получены данные.
Получение ключа (доступен бесплатный тариф)
Сервер не хранит собственных внешних учётных данных. Каждый поиск оплачивается из вашей подписки RapidAPI — поэтому ключ передаётся вместе с запросом.
Подпишитесь на Google Flights Live API: https://rapidapi.com/mtnrabi/api/google-flights-live-api
Скопируйте свой
x-rapidapi-key.Передайте его серверу любым из трёх способов ниже.
Если ключ отсутствует, инструменты не завершаются с ошибкой молча и ничего не тратят — они возвращают needs_api_key: true вместе с URL для регистрации и этими инструкциями, сформулированными так, чтобы модель могла зачитать их вам.
Три способа передать ключ
Способ | Как | Когда использовать |
Заголовок (предпочтительно) |
| Всё, что позволяет задавать заголовки. Ключи не попадают в URL, а значит, не попадают в журналы прокси и журналы доступа. |
Параметр запроса |
| Хосты, которым можно вставить только URL, — в первую очередь диалог настраиваемого коннектора в claude.ai. |
Поле API-ключа клиента | Вставьте ключ в собственное поле «API key» клиента | Хосты, которые отправляют |
Приоритет у первого непустого источника, в этом порядке. Ключ никогда не логируется, не повторяется в сообщении об ошибке и не возвращается в ответе инструмента.
Инструменты
Инструмент | Что делает |
| Тарифы в одну сторону в реальном времени. Исходные данные: IATA-код отправления, IATA-код назначения или список, и либо одна дата вылета, либо диапазон дат. Возвращает цену, авиакомпанию, длительность, стопы, |
| Тарифы туда и обратно в реальном времени, рассчитанные как парные сегменты, а не два билета в одну сторону. Исходные данные: отправление, назначение(я), дата отправления или диапазон, и либо |
search_oneway_flights
search_oneway_flights(
from_airport: str, # origin IATA, e.g. "TLV"
to_airport: str | list[str], # destination IATA, or a list to compare
departure_date: str | None = None, # "YYYY-MM-DD"
departure_date_from: str | None = None,# first date of a range
departure_date_to: str | None = None, # last date of a range
max_stops: int | None = None, # 0 = non-stop only
airline_codes: list[str] | None = None,
exclude_airline_codes: list[str] | None = None,
departure_time_min: int | None = None, # hour, 0-23
departure_time_max: int | None = None,
arrival_time_min: int | None = None,
arrival_time_max: int | None = None,
currency: str = "usd",
max_price: int | None = None,
seat_type: int | None = None, # 1 economy, 2 premium economy, 3 business, 4 first
passengers: list[int] | None = None, # [adults, children, infants]
sort_by: str = "best", # "best" | "price" | "duration"
limit: int = 10, # results returned after merge + sort
max_searches: int | None = None, # cap the billed requests this call may make
use_fallback: bool = False, # slower, fewer empty results on hard routes
)search_roundtrip_flights
search_roundtrip_flights(
from_airport: str,
to_airport: str | list[str],
departure_date: str | None = None,
departure_date_from: str | None = None,
departure_date_to: str | None = None,
return_date: str | None = None, # use this OR nights, not both
nights: int | list[int] | None = None, # e.g. 7, or [5, 6, 7]
max_departure_stops: int | None = None,
max_return_stops: int | None = None,
departure_airline_codes: list[str] | None = None,
return_airline_codes: list[str] | None = None,
currency: str = "usd",
max_price: int | None = None,
seat_type: int | None = None,
passengers: list[int] | None = None,
sort_by: str = "best",
limit: int = 10,
max_searches: int | None = None,
use_fallback: bool = False,
)sort_by применяется этим сервером к объединённому набору результатов из всех выполненных поисков, поэтому остановка происходит предсказуемо независимо от того, сколько комбинаций было развёрнуто.
Рабочий пример
Пользователь: «Я в Тель-Авиве. Самый дешёвый недельный тур Рим или Афины, вылет в любой день первой половину мая».
Один вызов:
{
"name": "search_roundtrip_flights",
"arguments": {
"from_airport": "TLV",
"to_airport": ["FCO", "ATH"],
"departure_date_from": "2026-05-01",
"departure_date_to": "2026-05-15",
"nights": 7,
"sort_by": "price",
"limit": 5
}
}Это разворачивается в 15 дат × 2 направления = 30 комбинаций, что точно равно лимиту на один вызов. Формат ответа (имена полей настоящие; значения ниже приведены для иллюстрации, это не реальный тариф — выполните вызов, чтобы получить живые тарифы):
{
"results": [
{
"from_airport": "Tel Aviv (TLV)",
"to_airport": "Rome (FCO)",
"departure_date": "2026-05-05",
"return_date": "2026-05-12",
"total_price": "$XXX",
"total_price_as_number": 0,
"total_duration_seconds": 0,
"total_stops": 0,
"price_range_in_relation_to_other_periods": "low",
"price_insights_low": 0,
"price_insights_high": 0,
"departure_flight_airline": "...",
"departure_flight_departure_description": "...",
"departure_flight_arrival_description": "...",
"departure_flight_duration": "...",
"departure_flight_stops": 0,
"departure_stops_info": [],
"return_flight_airline": "...",
"return_flight_departure_description": "...",
"return_flight_arrival_description": "...",
"return_flight_duration": "...",
"return_flight_stops": 0,
"return_stops_info": [],
"buy_link": "https://www.google.com/travel/flights?tfs=..."
}
],
"result_count": 5,
"search_coverage": {
"requested_combinations": 30,
"searched_combinations": 30,
"truncated": false,
"max_searches_per_request": 30,
"departure_dates_searched": ["2026-05-01", "..."],
"destinations_searched": ["ATH", "FCO"]
},
"api_usage": {
"requests_used_by_this_call": 30,
"plan_requests_remaining": 0,
"plan_requests_limit": 0,
"note": "This search used 30 of your RapidAPI plan's requests; ... remain in the current period. Each date and destination combination is one billed request."
}
}Другие варианты формы ответа, которые могут встретят за все нормы:
На эти даты рейсов нет.
results: []сmessage— Google Flights действительно не возвращает ничего для некоторых комбинаций маршрута и даты. Это не ошибка. Попробуйте соседние даты, близлежащий аэропорт илиuse_fallback: true.Часть поисков завершилась ошибкой. Поле
partialуказывает, сколько из выполненных поисков не прошло, а результаты покрывают остальные.Диапазон слишком широкий.
search_coverage.truncated: trueиnoteplus. Диапазон выбирается равномерно по всему окну (первая и последняя дата сохраняются), а не обрезается — поэтому выборка репрезентативна, а не просто первые N дней. Увеличьтеmax_searchesили сузьте диапазон для более полного покрытия.Нет ключа / ключ отклонён.
needs_api_key: true, нулевой расход и инструкция по исправлению. Чаще всего влияет ключ RapidAPI, который не подписан именно на этот API.Лимит плана исчерпан.
quota_exhausted: trueсapi_usage, плюс напоминание, что сужение диапазона растягивает оставшуюся квоту.
Отчёт о расходах (api_usage)
Деньги ваши, поэтому счётчик виден. Каждый успешный ответ содержит:
Поле | Значение |
| Сколько платных внешних запросов потребился этот вызов инструмента. |
| Сколько осталось на вашем плане RapidAPI в этом периоде. |
| Лимит вашего тарифа на период. |
| То же самое одним предложением, чтобы модель могла пересказать вам это до того, как вы спрось. |
plan_requests_remaining и plan_requests_limit приходят из ответа вышестоящего сервиса и опускаются, если он их не сообщает; note адаптируется соответственно. Правило, которое модель должна проговорить вслух: одна дата × одно направление = один платный запрос.
Рычаги управления расходованием, в порядке грубости: max_searches на вызов (меньше значение — меньше расход на широкий вопрос), более узкий диапазон дат, более короткий список направлений.
Один вызов вместо тридцати
Базовый REST API принимает ровно один кортеж (origin, destination, date) за вызов. При сквозной передаче один вызов на дату «самый дешёвый билет в Шри-Ланку в любой день октября» — это 31 отдельных вызовов инструмента: 31 цикл через модель, 31 шанс потерять ход мысли и счёт, о котором пользователь журнал узнаé после.
Здесь это один вызов инструмента. Развёр поход происходит на стороне сервера, параллельно, с ограничением, равномерной выборкой, дедупликацией на buy_link, объединением и сортировкой по вашему sort_by, и она честно отражается в search_coverage и api_usage.
Этот сервер (платный) | Бесплатный сервер | |
Разветвление на вызов | 30 (жёсткий максимум 60; менять в до callной с помощью | 15 |
Реклама | нет | одна раскрытая спонсорская карточка на результат |
Ключ | ваш собственный клю RapidAPI | не нежен |
Отчёт о расходах |
| — |
Возможность из каталога | да | нет |
Это не сервер без рекламы вообще — не из-за вкуса, а из-за ограничений: политика каталога коннек торов Anthropic и правила OpenAI для приложений запрещают рекламу и рекламный контент в результатах работы инструментов, поэтому сервер с рекламой никогда не может быть включён в каталоги, а этот — может.
Локальная разработка
git clone <this repo> && cd mcp_server_paid
python3 -m venv .venv && .venv/bin/pip install -r requirements.txt
cp example.env .env # fill it in; leave RAPIDAPI_KEY empty
set -a && . .env && set +a
.venv/bin/python -m src # streamable HTTP on http://localhost:8000/mcpПодключиёте клиент к локальному процессу так же:
claude mcp add --transport http google-flights-local http://localhost:8000/mcp --header "x-rapidapi-key: YOUR_RAPIDAPI_KEY"Тесты (124 — проходят, проверено):
.venv/bin/python -m pytest -qКонфигурация находится в example.env; каждая переменная описанный там. Главные из них:
Переменная | По умолчанию | Почему это важно |
|
| Ограничение на количество поисковых запросов за один вызов. Ограничено жёстким максимумом в 60. |
|
| Степень параллелизма при массовой рассылке запросов. |
|
| Верхний предел пула соединений; бессерверные инстансы используют общий пул файловых дескрипторов. |
|
| Совпадает с верхним пределом на стороне вышестоящего провайдера, поэтому эта сторона никогда не превышает таймаут первой. |
|
| Количество результатов, запрашиваемых для каждого отдельного поиска на стороне вышестоящего провайдера. |
| RapidAPI listing | Сообщается пользователям, которые приходят без ключа. |
|
| Указывается в |
| (empty) | Оставьте пустым в production. Если значение задано, каждый вызов без ключа обслуживается и оплачивается в счёт этой подписки. Сервер логирует предупреждение при запуске, а |
| (empty) | Когда задан, |
| (empty) | Пустое значение откличает файловый выход; строки |
Операционные маршруты: GET /health (публичный, без аутентификации — реестры опрашивают его),
GET /metrics, GET /metrics/calls?hours=24.
Целевая платформа развертывания — Vercel через api/index.py (FastAPI-обертка, передающая FastMCP
его время жизни (lifespan), stateless_http=True). Канонический путь MCP — /mcp,
без завершающего слеша.
Никогда не сохраняйте в репозитории настоящий ключ. example.env поставляется с заполнителями;
сохраните это положение.
Отсутствие аффилированности
Это независимый API, который возвращает общедоступные цены на авиабилеты. Он не является аффилированным с Google, не одобрен и не спонсируется Google. "Google Flights" используется только для описания общедоступного источника данных. Тарифы предоставляются вышестоящим провайдером, постоянно меняются и не гарантируются — всегда подтверждайте цену на сайте авиакомпании или сервиса бронирования перед поокупкой.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Flight Intelligence MCP — search, cheapest dates, multi-city, airline compare via Google Flights
Live flight prices and working booking links for AI agents and travel apps.
Free, no-login flight search with real-time pricing from multiple airlines.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/mtnrabi/google-flights-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server