MCP-сервер Google Flights
Размещённый сервер Model Context Protocol (MCP), который предоставляет Claude, Cursor, Windsurf и любому другому MCP-клиенту один инструмент Google Flights. Ищите билеты в одну сторону, туда и обратно, а также маршруты с несколькими городами. Результаты включают тарифы, сегменты перелётов, выбросы углекислого газа и историю цен в структурированном формате JSON. Аккаунт Google не требуется, а обходиться с устаревшим API для путешествий не нужно.
1 000 бесплатных кредитов каждый месяц, без привязки карты — этого хватит примерно на 66 поисков авиабилетов.
https://mcp.hasdata.com/mcp?apis=google_travel_flights
Содержание
-
Что потребуется
-
Быстрый запуск
-
Примеры запросов
-
Инструменты
-
Ошибки и сценарии сбоев
-
Стоимость, бесплатный тариф и ограничения
-
Выбор инструмента
-
Сравнение с аналогами
-
Часто задаваемые вопросы
-
Ссылки HasData
-
Разработка
-
Участие в проекте
-
Лицензия
Что потребуется
MCP-клиент и API-ключ HasData из панели управления. Регистрация бесплатна и не требует привязки карты. Бесплатного тарифа хватит примерно на 66 вызовов в месяц при стоимости 15 кредитов за вызов. Это удалённый сервер: для подключения достаточно URL и заголовка x-api-key. Запускать контейнер не нужно, аккаунт Google не потребуется. Клиенты, которые поддерживают только stdio, могут подключаться через небольшой лаунчер: пакет @hasdata/google-flights-mcp опубликован в npm, а hasdata-google-flights-mcp — в PyPI. Примеры приведены ниже.
Быстрый запуск
URL сервера одинаков для всех клиентов. Мы проверили подключение в Claude Code и Claude Desktop. Примеры для остальных клиентов составлены в соответствии с их документацией по подключению удалённых серверов.
| Поле | Значение |
|---|---|
| URL | https://mcp.hasdata.com/mcp?apis=google_travel_flights |
| Транспорт | HTTP, streamable |
| Заголовок авторизации | x-api-key: HASDATA_API_KEY |
Клиенты с поддержкой OAuth можно подключить по тому же URL и выполнить вход, не указывая ключ в конфигурационном файле.
Claude Code
claude mcp add --transport http google-flights "https://mcp.hasdata.com/mcp?apis=google_travel_flights" \
--header "x-api-key: HASDATA_API_KEY"
Claude Desktop
Откройте Settings, выберите Connectors, затем Add custom connector. Вставьте https://mcp.hasdata.com/mcp?apis=google_travel_flights и выполните вход.
Если вы настраиваете подключение через конфигурационный файл, учтите, что Claude Desktop поддерживает в нём только локальные серверы (stdio). Для подключения к удалённому серверу потребуется лаунчер stdio. Эту функцию выполняет пакет @hasdata/google-flights-mcp, который получает ключ из переменной окружения. Добавьте следующий фрагмент в claude_desktop_config.json:
{
"mcpServers": {
"google-flights": {
"command": "npx",
"args": ["-y", "@hasdata/google-flights-mcp"],
"env": { "HASDATA_API_KEY": "YOUR_KEY" }
}
}
}
Если вместо Node вы используете Python, замените лаунчер пакетом из PyPI. uvx запускает его без предварительной установки:
{
"mcpServers": {
"google-flights": {
"command": "uvx",
"args": ["hasdata-google-flights-mcp"],
"env": { "HASDATA_API_KEY": "YOUR_KEY" }
}
}
}
Cursor
Файл ~/.cursor/mcp.json используется для всех проектов, а .cursor/mcp.json — для одного проекта:
{
"mcpServers": {
"google-flights": {
"url": "https://mcp.hasdata.com/mcp?apis=google_travel_flights",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}
Windsurf
Файл ~/.codeium/windsurf/mcp_config.json. В Windsurf поле называется serverUrl, а не url:
{
"mcpServers": {
"google-flights": {
"serverUrl": "https://mcp.hasdata.com/mcp?apis=google_travel_flights",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}
VS Code
Файл .vscode/mcp.json в рабочей области:
{
"servers": {
"google-flights": {
"type": "http",
"url": "https://mcp.hasdata.com/mcp?apis=google_travel_flights",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}
Примеры запросов
Это запросы, а не код. Вставьте любой из них — агент сам выберет нужный инструмент. Для каждого примера указано количество вызовов: успешный вызов стоит 15 кредитов.
Найди билеты в одну сторону из JFK в лондонский аэропорт Хитроу на 15 сентября, отсортируй по цене и покажи три самых дешёвых варианта с авиакомпаниями и оценкой выбросов углекислого газа.
Один вызов — 15 кредитов. Тарифы, сегменты перелёта и данные о выбросах возвращаются вместе.
Найди варианты по тому же маршруту, но только без пересадок и бизнес-классом. Укажи, у какого варианта самые низкие выбросы.
Один вызов — 15 кредитов. Класс обслуживания и количество пересадок задаются как фильтры в одном запросе.
Хорошая ли сейчас цена — $295 за перелёт из JFK в LHR, если учитывать историю цен?
Один вызов — 15 кредитов. Ответ содержит priceInsights с типичным диапазоном цен и оценкой уровня цены.
Найди самый дешёвый билет туда и обратно из JFK в LHR: вылет 15 сентября, возвращение 22 сентября.
Два вызова — 30 кредитов. Сначала Google возвращает варианты перелёта туда, затем отдельный вызов получает обратные рейсы для выбранного варианта.
Перелёт туда и обратно по своей схеме требует двух вызовов. В первом вызове возвращаются варианты перелёта туда, каждый с собственным departureToken. Чтобы получить соответствующие обратные рейсы, передайте этот токен в следующем запросе. Для билета в одну сторону и проверки цены достаточно одного вызова на каждый запрос.
Инструменты
| Инструмент | Что возвращает |
|---|---|
hasdata_google_travel_flights_getGoogleFlights | Данные для каждого маршрута: цена и валюта, общая продолжительность, количество пересадок, сегменты перелёта с указанием авиакомпании, номера рейса, самолёта, аэропортов и времени вылета и прибытия, выбросы CO2 и многое другое. 15 кредитов за вызов |
Инструмент только один, он предназначен только для чтения. Ниже приведён сокращённый пример реального вызова; цены постоянно меняются, поэтому воспринимайте его как образец структуры данных. Название инструмента ведёт на справочную страницу его конечной точки с полным перечнем параметров.
Пример показывает только полезную нагрузку, а не весь ответ. Результат tools/call содержит один текстовый блок, в котором находится JSON с полями url, status, text и json; собранные данные находятся в json. В необработанном ответе JSON-RPC путь к этим данным выглядит так: result.content[0].text. Сначала разберите его как JSON, затем обратитесь к .json. Чат-клиент выполнит это преобразование автоматически, а при прямом обращении к конечной точке из кода потребуется сделать это самостоятельно.
Результаты поиска Google Flights
hasdata_google_travel_flights_getGoogleFlights
Маршруты на выбранную дату с ценами, сегментами перелёта, данными о выбросах и историей цен.
| Параметр | Тип | Обязательный | Примечания |
|---|---|---|---|
departureId | string | да | Код IATA, например JFK, или идентификатор местоположения kgmid, например /m/02_286. Чтобы указать несколько аэропортов, разделите их запятыми |
arrivalId | string | да | Формат такой же, как у departureId |
outboundDate | string | да | YYYY-MM-DD |
type | string | По умолчанию roundTrip; также доступны oneWay и multiCity с параметром multiCityJson | |
returnDate | string | Обязателен, если type имеет значение roundTrip | |
travelClass | string | economy, premiumEconomy, business или first | |
stops | string | nonStop, oneStopOrFewer или twoStopsOrFewer | |
sortBy | string | По умолчанию topFlights; также доступны price, duration, emissions, departureTime, arrivalTime | |
adults / children / infantsInSeat / infantsOnLap | number | Состав пассажиров | |
maxPrice / maxDuration / bags | number | Максимальная цена, длительность и количество мест ручной клади | |
includeAirlines / excludeAirlines | string | Коды авиакомпаний IATA, разделённые запятыми. Можно использовать один из параметров, но не оба одновременно | |
departureToken | string | Выберите вариант вылета, чтобы получить обратный рейс или следующий сегмент | |
bookingToken | string | Получите варианты бронирования для выбранного маршрута | |
currency / gl / hl | string | Валюта, страна и язык поиска | |
deepSearch | boolean | Результаты соответствуют тому, что Google показывает в браузере; ответ формируется медленнее |
В документации также описаны параметры includeConnections, excludeConnections, layoverDuration, outboundTimes, returnTimes, showHidden, lessEmissions и multiCityJson.
Результаты разделены на bestFlights и otherFlights. Для каждого маршрута указаны price, type, totalDuration в минутах, массив сегментов flights, объект carbonEmissions и bookingToken. Каждый сегмент содержит departureAirport и arrivalAirport (с полями id, name и местным временем time), а также duration, airline, flightNumber, airplane, legroom, travelClass и массив extensions. Для сегментов, которые Google помечает как часто задерживающиеся, также указывается oftenDelayedByOver30Min. Маршрут без пересадок состоит из одного сегмента, маршрут с пересадками — из нескольких.
Значения
carbonEmissionsуказаны в граммах, а не в килограммах.thisFlight: 433000означает 433 кг.differencePercentпоказывает разницу с типичным значением для маршрутаtypicalForThisRoute, поэтому отрицательное число означает, что выбросы ниже среднего.
{
"price": 295,
"type": "One way",
"totalDuration": 415,
"flights": [
{
"departureAirport": { "id": "JFK", "name": "John F. Kennedy International Airport", "time": "2026-09-15 8:15" },
"arrivalAirport": { "id": "LHR", "name": "Heathrow Airport", "time": "2026-09-15 20:10" },
"duration": 415,
"airline": "Virgin Atlantic",
"flightNumber": "VS 26",
"airplane": "Boeing 787",
"travelClass": "Economy"
}
],
"carbonEmissions": { "thisFlight": 367000, "typicalForThisRoute": 419000, "differencePercent": -12 },
"bookingToken": "W1t7..."
}
Помимо данных о маршрутах, в ответе содержится priceInsights с полями lowestPrice, typicalPriceRange и priceLevel (например, typical), а также priceHistory — список точек [timestamp, price]. В поле airports возвращаются найденные аэропорты вылета и прибытия с указанием города и страны.
Ошибки и сценарии сбоя
При вызове инструмента клиент почти никогда не получает HTTP-ошибку. Уровень MCP отвечает с кодом 200, а сведения об ошибке помещает в результат: isError получает значение true, а причина передаётся в виде текста. Вместо строки со статусом агент получает сообщение.
Неверный ключ отображается в результате работы инструмента, а не как ошибка соединения. Метод tools/list принимает любой непустой ключ и возвращает инструмент, поэтому клиент успешно завершает рукопожатие и показывает зелёный статус. При первом вызове инструмента возвращается isError: true и текст HasData API error: 401 Unauthorized. Обратите внимание на эту строку: на предыдущих этапах проблема никак не проявляется.
Отсутствующий ключ — единственный случай настоящей HTTP-ошибки. Проверка авторизации выполняется до вызова любого инструмента, поэтому соединение завершается с ошибкой 401. Заголовки CORS передаются, и браузерный клиент видит код ответа, а не непрозрачную сетевую ошибку.
Аргумент, не соответствующий схеме инструмента, отклоняется до начала скрейпинга. Сервер возвращает isError: true и текст MCP error -32602: Input validation error, в котором указано проблемное поле. Например, здесь будут отклонены запрос roundTrip без returnDate или одновременное использование includeAirlines и excludeAirlines.
Если на указанную дату рейсов по маршруту нет, сервер возвращает успешный результат с пустыми массивами маршрутов, а не ошибку. При этом requestMetadata.status по-прежнему имеет значение ok. Прежде чем ранжировать результаты, проверьте, есть ли в них рейсы.
Неверный код аэропорта приводит к ошибке 400, а requestMetadata.status получает значение error. Используйте коды IATA или kgmid, а не названия городов.
В результатах с данными также содержится requestMetadata.id. Его стоит указывать при обращении в службу поддержки.
Стоимость, бесплатный тариф и ограничения
Каждый успешный вызов Google Flights стоит 15 кредитов. Размер ответа не влияет на стоимость; глубокий поиск стоит столько же, сколько стандартный.
Бесплатный тариф предоставляет 1 000 кредитов в месяц без привязки карты — этого примерно хватит на 66 поисков авиабилетов. Кредиты обновляются с началом нового платёжного периода, поэтому агент с небольшим объёмом запросов может бессрочно пользоваться бесплатным тарифом.
Платные тарифы начинаются от $59 в месяц за 200 000 кредитов — примерно 13 000 поисков. При увеличении объёма стоимость единицы снижается: с $4.42 за 1 000 вызовов на начальном тарифе до $1.79 на Basic и $1.25 на тарифах Growth. Актуальные цены указаны на странице тарифов.
Тариф также определяет допустимое количество параллельных запросов. Бесплатный тариф допускает 1 запрос одновременно, Startup — 5, Basic — 15, а тарифы Growth — от 50 до 500. Если запросы выполняются без постоянного контроля, обязательно предусмотрите обработку превышения лимита.
Запросы, завершившиеся с кодом, отличным от 200, не тарифицируются. Перелёт туда и обратно требует двух вызовов — учитывайте это при расчёте расходов.
Выбор инструментов
Параметр запроса apis определяет, какие инструменты будут доступны агенту. Чем меньше инструментов, тем меньше контекста расходуется на их описания и тем ниже вероятность, что модель выберет неподходящий инструмент.
?apis=google_travel_flights единственный инструмент в этом репозитории
?apis=google_travel добавить Google Hotels
?apis=google_travel_flights,airbnb авиабилеты и жильё Airbnb
В параметре можно указывать названия провайдеров, например google_travel, и отдельных API, например google_travel_flights. Названия с опечатками игнорируются. Если все указанные значения неверны, запрос завершится с ошибкой 400, а в теле ответа будут перечислены нераспознанные значения и все допустимые варианты. Если не указывать параметр, та же конечная точка предоставит доступ ко всем 57 инструментам HasData.
Сравнение с альтернативами
В 2018 году Google прекратила поддержку API авиабилетов QPX Express и не выпустила ему замену, поэтому официального API Google Flights не существует. Оставшиеся варианты либо собирают данные из публичных результатов поиска, либо используют лицензированные данные о тарифах из GDS — это сложный и дорогостоящий подход. Этот сервер получает те же результаты, что и сайт, и возвращает их в формате JSON.
| Официальный API Google | Этот сервер | |
|---|---|---|
| Доступность | Не существует с момента закрытия QPX Express в 2018 году | Поддерживаемая схема, основанная на актуальных результатах поиска |
| Данные о выбросах | Не предоставляются | Для каждого маршрута, в сравнении со средним значением по направлению |
| История цен | Не предоставляется | priceInsights с типичным диапазоном цен |
| Настройка | Настраивать нечего, поскольку API не существует | Один ключ и один URL |
| Стоимость | Не применимо | После исчерпания бесплатного тарифа — 15 кредитов за вызов |
Чего этот сервер не делает. Он не оформляет бронирование и не принимает оплату. Сервер получает цены, сегменты перелёта и токены, которые сам Google использует для перехода к бронированию, а оформление передаёт вам.
Часто задаваемые вопросы
Существует ли официальный API Google Flights?
Нет. Google закрыла QPX Express в 2018 году и не выпустила ему замену. Все доступные варианты получают те же публичные результаты, которые показывает сайт. Этот сервер поддерживается HasData и возвращает данные в структурированном формате JSON.
Что такое MCP-сервер Google Flights?
Это сервер, который предоставляет Google Flights в виде инструмента, доступного для вызова AI-клиентом. Клиент отправляет вызов инструмента через Model Context Protocol, сервер получает данные о маршрутах и возвращает структурированный JSON, а модель обрабатывает результат. Этот сервер предоставляет один инструмент и работает удалённо.
Почему перелёт туда и обратно требует двух вызовов?
Сначала Google возвращает варианты вылета, каждый из которых содержит departureToken. Выберите подходящий вариант и передайте его токен обратно, чтобы получить соответствующие ему обратные рейсы. Так же работает сайт, поэтому перелёт туда и обратно стоит 30 кредитов.
Значения выбросов указаны в килограммах?
Нет, в граммах. thisFlight: 433000 означает 433 кг, а differencePercent показывает разницу со средним значением для маршрута.
Что такое глубокий поиск?
Это более медленный режим, который возвращает данные в точности в том виде, в каком их показывает Google Flights в браузере. Для скорости оставьте этот режим выключенным; включайте его, когда нужно получить результаты, соответствующие сайту.
Можно ли использовать это вместе с другими API HasData?
Да. Параметр apis принимает список, а ?apis=google_travel добавляет Google Hotels к авиаперелётам. Если убрать параметр, будут доступны все данные.
Соблюдение требований и персональные данные
HasData получает только общедоступные данные. Условия использования платформы могут ограничивать автоматизированный доступ, поэтому за соблюдение требований отвечаете вы.
Ссылки HasData
| Страница продукта и конструктор запросов | Google Flights API |
| Документация сервера | Документация MCP-сервера |
| Все 57 инструментов на одном сервере | HasData/hasdata-mcp |
| Руководства по клиентам | Клиенты и интеграции MCP |
| Все остальные источники данных | Google Flights API и ещё 54 источника |
| Тарифы и стоимость кредитов | Тарифы и стоимость кредитов |
| Ключи и статистика использования | Панель управления HasData |
| Запуск Node из npm | @hasdata/google-flights-mcp |
| Запуск Python из PyPI | hasdata-google-flights-mcp |
Разработка
Этот репозиторий содержит конфигурацию и документацию для удалённого сервера. Сборка не требуется, и контейнеризировать здесь нечего.
Тесты в test/ проверяют контракт инструмента — ту часть, которая может измениться без коммитов в этот репозиторий. Они проверяют, что ?apis=google_travel_flights возвращает ровно один инструмент, в его описании по-прежнему указаны обязательные параметры, имя не изменилось, а используемый ключ действительно принимается. Последняя проверка вызывает инструмент по-настоящему и стоит 15 кредитов — такова цена контрольного теста, который должен завершиться ошибкой, если для этого есть основания.
# macOS and Linux
HASDATA_API_KEY=your_key_here npm test
# Windows PowerShell
$env:HASDATA_API_KEY="your_key_here"; npm test
Этот же набор тестов запускается в CI при каждом отправлении изменений и раз в неделю по расписанию: список инструментов во внешнем источнике может измениться, даже если в этом репозитории никто ничего не менял. Ошибка означает, что изменился список инструментов, ключ перестал работать или конечная точка недоступна. Сообщение проверки указывает, что именно произошло.
Участие в разработке
Наиболее полезны исправления таблицы параметров и примера ответа — именно эти части чаще всего устаревают. Укажите выполненный вызов и полученный ответ. Для pull request из форков тесты запускаются без ключа, а проверки доступности пропускаются, чтобы сборка не завершалась ошибкой.
Лицензия
MIT. См. LICENSE.