Skip to main content
Glama
mtnrabi

google-flights-mcp

by mtnrabi

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 — поэтому ключ передаётся вместе с запросом.

  1. Подпишитесь на Google Flights Live API: https://rapidapi.com/mtnrabi/api/google-flights-live-api

  2. Скопируйте свой x-rapidapi-key.

  3. Передайте его серверу любым из трёх способов ниже.

Если ключ отсутствует, инструменты не завершаются с ошибкой молча и ничего не тратят — они возвращают needs_api_key: true вместе с URL для регистрации и этими инструкциями, сформулированными так, чтобы модель могла зачитать их вам.

Три способа передать ключ

Способ

Как

Когда использовать

Заголовок (предпочтительно)

--header "x-rapidapi-key: YOUR_RAPIDAPI_KEY"

Всё, что позволяет задавать заголовки. Ключи не попадают в URL, а значит, не попадают в журналы прокси и журналы доступа.

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

https://google-flights-mcp.flightpowers.com/mcp?rapidapi_key=YOUR_RAPIDAPI_KEY

Хосты, которым можно вставить только URL, — в первую очередь диалог настраиваемого коннектора в claude.ai.

Поле API-ключа клиента

Вставьте ключ в собственное поле «API key» клиента

Хосты, которые отправляют authorization: Bearer <key> или x-api-key. Также принимается форма сохранённой конфигурации Smithery (config.rapidApiKey=).

Приоритет у первого непустого источника, в этом порядке. Ключ никогда не логируется, не повторяется в сообщении об ошибке и не возвращается в ответе инструмента.

Инструменты

Инструмент

Что делает

search_oneway_flights

Тарифы в одну сторону в реальном времени. Исходные данные: IATA-код отправления, IATA-код назначения или список, и либо одна дата вылета, либо диапазон дат. Возвращает цену, авиакомпанию, длительность, стопы, buy_link и ствой исторический диапазон цен Google, чтобы можно было оценить тариф. Используйте для любых вопросов про билет в одну сторону, включая открытые: один вызов с диапазоном, а не один вызов на дату.

search_roundtrip_flights

Тарифы туда и обратно в реальном времени, рассчитанные как парные сегменты, а не два билета в одну сторону. Исходные данные: отправление, назначение(я), дата отправления или диапазон, и либо return_date, либо длина поездки в nights (число или список, например [5,6,7]). Возвращает общую цену, по каждому сегменту авиакомпанию/стопы/длительность и один buy_link для поездки.

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 и note plus. Диапазон выбирается равномерно по всему окну (первая и последняя дата сохраняются), а не обрезается — поэтому выборка репрезентативна, а не просто первые N дней. Увеличьте max_searches или сузьте диапазон для более полного покрытия.

  • Нет ключа / ключ отклонён. needs_api_key: true, нулевой расход и инструкция по исправлению. Чаще всего влияет ключ RapidAPI, который не подписан именно на этот API.

  • Лимит плана исчерпан. quota_exhausted: true с api_usage, плюс напоминание, что сужение диапазона растягивает оставшуюся квоту.

Отчёт о расходах (api_usage)

Деньги ваши, поэтому счётчик виден. Каждый успешный ответ содержит:

Поле

Значение

requests_used_by_this_call

Сколько платных внешних запросов потребился этот вызов инструмента.

plan_requests_remaining

Сколько осталось на вашем плане RapidAPI в этом периоде.

plan_requests_limit

Лимит вашего тарифа на период.

note

То же самое одним предложением, чтобы модель могла пересказать вам это до того, как вы спрось.

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ной с помощью max_searches)

15

Реклама

нет

одна раскрытая спонсорская карточка на результат

Ключ

ваш собственный клю RapidAPI

не нежен

Отчёт о расходах

api_usage в каждом ответе

Возможность из каталога

да

нет

Это не сервер без рекламы вообще — не из-за вкуса, а из-за ограничений: политика каталога коннек торов 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; каждая переменная описанный там. Главные из них:

Переменная

По умолчанию

Почему это важно

MAX_SEARCHES_PER_TOOL_CALL

30

Ограничение на количество поисковых запросов за один вызов. Ограничено жёстким максимумом в 60.

MAX_CONCURRENT_SEARCHES

10

Степень параллелизма при массовой рассылке запросов.

MAX_HTTP_CONNECTIONS

60

Верхний предел пула соединений; бессерверные инстансы используют общий пул файловых дескрипторов.

REQUEST_TIMEOUT_SECONDS

105

Совпадает с верхним пределом на стороне вышестоящего провайдера, поэтому эта сторона никогда не превышает таймаут первой.

DEFAULT_RESULT_LIMIT

10

Количество результатов, запрашиваемых для каждого отдельного поиска на стороне вышестоящего провайдера.

SIGNUP_URL

RapidAPI listing

Сообщается пользователям, которые приходят без ключа.

MCP_PUBLIC_URL

http://localhost:8000/mcp

Указывается в /health.

RAPIDAPI_KEY

(empty)

Оставьте пустым в production. Если значение задано, каждый вызов без ключа обслуживается и оплачивается в счёт этой подписки. Сервер логирует предупреждение при запуске, а /health сообщается server_side_key_configured.

METRICS_TOKEN

(empty)

Когда задан, /metrics требует заголоок x-metrics-token.

LOG_PATH

(empty)

Пустое значение откличает файловый выход; строки MCP_CALL в stdout остаются записью. Корректно для serverless.

Операционные маршруты: 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" используется только для описания общедоступного источника данных. Тарифы предоставляются вышестоящим провайдером, постоянно меняются и не гарантируются — всегда подтверждайте цену на сайте авиакомпании или сервиса бронирования перед поокупкой.

-
license - not tested
Not graded
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

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.

View all MCP Connectors

Latest Blog Posts

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