HasData Google Flights MCP Server
Itinerários do Google Flights com tarifas, trechos, emissões de carbono e histórico de preços, em JSON.
Documentação
Servidor MCP do Google Flights
Um servidor de Model Context Protocol (MCP) hospedado que oferece ao Claude, Cursor, Windsurf e qualquer outro cliente MCP uma ferramenta do Google Flights. Pesquise itinerários de ida, ida e volta e multi-cidades com tarifas, trechos de voo, emissões de carbono e histórico de preços, tudo como JSON estruturado, sem conta Google e sem API de viagens aposentada para contornar.
https://mcp.hasdata.com/api/mcp?apis=google_travel_flights
Conteúdo
- O que você precisa
- Início rápido
- Exemplos de prompts
- Ferramentas
- Erros e caminhos de falha
- Preços, plano gratuito e limites
- Seleção de ferramentas
- Comparação
- FAQ
- Links da HasData
- Desenvolvimento
- Contribuição
- Licença
O que você precisa
Um cliente MCP e uma chave de API da HasData do painel, gratuita para criar sem cartão, e o teste cobre cerca de 66 chamadas na taxa de 15 créditos. Este é um servidor remoto, então o caminho mais simples é uma URL e um cabeçalho x-api-key, sem contêiner para executar e sem conta Google em nenhum lugar do fluxo. Um cliente que só fala stdio o acessa por meio de um lançador leve, publicado como @hasdata/google-flights-mcp no npm e hasdata-google-flights-mcp no PyPI, mostrado abaixo.
Início rápido
A URL do servidor é a mesma para todos os clientes. Nós o executamos na prática no Claude Code e no Claude Desktop. Os outros blocos seguem o formato documentado de cada cliente para um servidor remoto.
| Campo | Valor |
|---|---|
| URL | https://mcp.hasdata.com/api/mcp?apis=google_travel_flights |
| Transporte | HTTP, streamable |
| Cabeçalho de autenticação | x-api-key: HASDATA_API_KEY |
Clientes com suporte a OAuth podem adicionar a mesma URL como conector e entrar sem colocar uma chave em um arquivo de configuração.
Claude Code
claude mcp add --transport http google-flights "https://mcp.hasdata.com/api/mcp?apis=google_travel_flights" \
--header "x-api-key: HASDATA_API_KEY"
Claude Desktop
Configurações, depois Conectores, depois Adicionar conector personalizado, depois cole https://mcp.hasdata.com/api/mcp?apis=google_travel_flights e entre.
Para o caminho do arquivo de configuração, o Claude Desktop carrega apenas servidores locais (stdio), então ele acessa um servidor remoto por meio de um lançador stdio. O pacote @hasdata/google-flights-mcp é esse lançador, e ele lê a chave do ambiente. Adicione isto ao claude_desktop_config.json:
{
"mcpServers": {
"google-flights": {
"command": "npx",
"args": ["-y", "@hasdata/google-flights-mcp"],
"env": { "HASDATA_API_KEY": "YOUR_KEY" }
}
}
}
Para Python em vez de Node, troque o lançador pelo pacote PyPI, que o uvx executa sem instalação manual:
{
"mcpServers": {
"google-flights": {
"command": "uvx",
"args": ["hasdata-google-flights-mcp"],
"env": { "HASDATA_API_KEY": "YOUR_KEY" }
}
}
}
Cursor
~/.cursor/mcp.json para cada projeto, ou .cursor/mcp.json para um:
{
"mcpServers": {
"google-flights": {
"url": "https://mcp.hasdata.com/api/mcp?apis=google_travel_flights",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}
Windsurf
~/.codeium/windsurf/mcp_config.json. O Windsurf chama o campo serverUrl, não url:
{
"mcpServers": {
"google-flights": {
"serverUrl": "https://mcp.hasdata.com/api/mcp?apis=google_travel_flights",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}
VS Code
.vscode/mcp.json no workspace:
{
"servers": {
"google-flights": {
"type": "http",
"url": "https://mcp.hasdata.com/api/mcp?apis=google_travel_flights",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}
Exemplos de prompts
Prompts, não código. Cole um e o agente escolhe a ferramenta sozinho. Cada um é anotado com as chamadas que faz, porque cada chamada bem-sucedida custa 15 créditos.
Encontre voos de ida de JFK para Londres Heathrow em 15 de setembro, ordenados por preço, e me dê os três mais baratos com companhia aérea e estimativa de carbono.
Uma chamada, 15 créditos. Tarifas, trechos e emissões vêm todos juntos.
Mesma rota, mas somente sem escalas, na classe executiva, e me diga qual opção tem as menores emissões.
Uma chamada, 15 créditos. Cabine e paradas são filtros em uma única solicitação.
$295 é um bom preço para JFK para LHR agora, considerando o histórico de preços?
Uma chamada, 15 créditos. A resposta traz priceInsights com uma faixa típica e um nível de preço.
Ida e volta JFK para LHR, ida em 15 de setembro e volta em 22 de setembro, tarifa mais barata.
Duas chamadas, 30 créditos. O Google retorna primeiro as opções de ida, depois o trecho de volta é uma segunda chamada baseada na opção que você escolher.
Uma ida e volta são duas chamadas por design. A primeira retorna itinerários de ida, cada um com um departureToken, e você passa esse token de volta para obter os voos de volta correspondentes. Ida e a verificação de preço são uma chamada cada.
Ferramentas
Uma ferramenta, somente leitura. O exemplo abaixo é extraído de uma chamada real, e as tarifas mudam constantemente. Leia-o como uma forma. O nome da ferramenta leva à referência do endpoint, que traz a lista completa de parâmetros.
O exemplo é o payload, não a resposta inteira. Um resultado tools/call carrega um bloco de texto, e esse texto é ele próprio JSON contendo url, status, text e json, com os dados extraídos sob json. De uma resposta JSON-RPC bruta, o caminho é result.content[0].text, analisado, depois .json. Um cliente de chat desembrulha isso para você, e código que fala diretamente com o endpoint não.
Obter resultados do Google Flights
hasdata_google_travel_flights_getGoogleFlights
Itinerários para uma rota e data, com tarifas, trechos, emissões e histórico de preços.
| Parâmetro | Tipo | Obrigatório | Observações |
|---|---|---|---|
departureId | string | sim | Código IATA como JFK, ou um kgmid de local como /m/02_286. Separe vários aeroportos por vírgula |
arrivalId | string | sim | Mesmo formato que departureId |
outboundDate | string | sim | YYYY-MM-DD |
type | string | roundTrip por padrão, oneWay, ou multiCity com multiCityJson | |
returnDate | string | Obrigatório quando type é roundTrip | |
travelClass | string | economy, premiumEconomy, business ou first | |
stops | string | nonStop, oneStopOrFewer ou twoStopsOrFewer | |
sortBy | string | topFlights padrão, mais price, duration, emissions, departureTime, arrivalTime | |
adults / children / infantsInSeat / infantsOnLap | number | Composição de passageiros | |
maxPrice / maxDuration / bags | number | Limites e quantidade de bagagem de mão | |
includeAirlines / excludeAirlines | string | Códigos IATA de companhias aéreas separados por vírgula, um ou outro, não ambos | |
departureToken | string | Selecione uma opção de ida e busque sua volta ou próximo trecho | |
bookingToken | string | Busque opções de reserva para um itinerário escolhido | |
currency / gl / hl | string | Moeda e o país e idioma da busca | |
deepSearch | boolean | Corresponder ao que o Google mostra no navegador, mais lento para retornar |
A referência também documenta includeConnections, excludeConnections, layoverDuration, outboundTimes, returnTimes, showHidden, lessEmissions e multiCityJson.
Os resultados são divididos em bestFlights e otherFlights. Cada itinerário carrega price, type, totalDuration em minutos, um array flights de trechos, um objeto carbonEmissions e um bookingToken. Cada trecho contém o departureAirport e o arrivalAirport (cada um com id, name e time local), duration, airline, flightNumber, airplane, legroom, travelClass, um array extensions e oftenDelayedByOver30Min em trechos que o Google sinaliza. Um itinerário sem escalas tem um trecho, uma conexão tem vários.
carbonEmissionsestá em gramas, não em quilogramas.thisFlight: 433000é 433 kg.differencePercentcompara comtypicalForThisRoute, então um número negativo é um voo mais verde que a média.
{
"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 fica ao lado dos itinerários com lowestPrice, um typicalPriceRange, um priceLevel como typical e um priceHistory de [timestamp, price] pontos. airports ecoa os aeroportos de partida e chegada resolvidos, com cidade e país.
Erros e caminhos de falha
Seu cliente quase nunca vê um código de erro HTTP de uma chamada de ferramenta. A camada MCP responde 200 e coloca a falha dentro do resultado, com isError definido como true e o motivo como texto. O agente lê uma mensagem onde você poderia esperar uma linha de status.
Uma chave errada aparece como saída de ferramenta, não como conexão falha. tools/list aceita qualquer chave não vazia e retorna a ferramenta, então o cliente completa o handshake e mostra verde. A primeira chamada de ferramenta então volta com isError: true e o texto HasData API error: 401 Unauthorized. Fique atento a essa string, porque nada antes no fluxo relata o problema.
Uma chave ausente é o único erro HTTP real. A autorização roda antes de qualquer ferramenta, e a própria conexão falha com 401. Os cabeçalhos CORS estão presentes, e um cliente de navegador lê o status e não uma falha de rede opaca.
Um argumento que quebra o esquema da ferramenta é rejeitado antes de virar uma extração. O servidor responde com isError: true e o texto MCP error -32602: Input validation error, nomeando o campo problemático. Um roundTrip sem um returnDate, ou includeAirlines junto com excludeAirlines, é capturado aqui.
Uma rota sem voos na data retorna um resultado bem-sucedido com os arrays de itinerários vazios, não um erro. requestMetadata.status ainda lê ok. Teste os voos antes de classificá-los.
Um código de aeroporto inválido retorna 400 com requestMetadata.status definido como error. Use códigos IATA ou kgmids, não nomes de cidades.
Resultados que carregam dados também carregam um requestMetadata.id que vale citar no suporte.
Preços, plano gratuito e limites
Cada chamada do Google Flights custa 15 créditos por chamada bem-sucedida. O tamanho da resposta não muda o preço, e a busca profunda custa o mesmo que uma padrão.
O teste gratuito é 1.000 créditos por 30 dias sem cartão, o que dá cerca de 66 buscas de voos. Depois disso, uma conta ativa continua recebendo 100 créditos recarregados diariamente sempre que o saldo cair abaixo de 100, então um agente de baixo volume roda no plano gratuito indefinidamente.
Os planos pagos começam em US$ 49 por mês por 200.000 créditos, o que dá cerca de 13.000 buscas. O preço unitário cai com o volume, de US$ 3,68 por 1.000 chamadas no plano inicial para US$ 1,49 no Business, US$ 1,25 no Growth e US$ 1,12 nos maiores planos de alto volume.
Seu plano também define a concorrência. O teste gratuito permite 1 solicitação por vez, Startup 15, Business 30, Growth 50, e os planos de alto volume vão de 200 a 1.500. Trate o caso de estouro defensivamente em qualquer coisa não supervisionada.
Uma solicitação que volta com status diferente de 200 não é cobrada. Uma ida e volta são duas chamadas, então faça o orçamento para isso.
Seleção de ferramentas
O parâmetro de consulta apis decide quais ferramentas seu agente vê. Menos ferramentas significa menos contexto gasto em definições de ferramentas e menos chances de o modelo alcançar a errada.
?apis=google_travel_flights the one tool in this repo
?apis=google_travel add Google Hotels
?apis=google_travel_flights,airbnb flights plus Airbnb stays
O parâmetro aceita nomes de provedores como google_travel e nomes individuais de APIs como google_travel_flights. Nomes com erro de digitação são ignorados. Se todos os nomes estiverem errados, a solicitação falha com 400, e o corpo lista tanto o que não foi reconhecido quanto todos os valores válidos. Remova o parâmetro e o mesmo endpoint expõe todas as 57 ferramentas da HasData.
Comparação
O Google aposentou sua API de voos QPX Express em 2018 e nunca a substituiu, então não há uma API oficial do Google Flights. Os caminhos restantes são extrair os resultados públicos ou licenciar dados brutos de tarifas GDS, o que é pesado e caro. Este servidor lê os mesmos resultados que o site mostra e os retorna como JSON.
| API oficial do Google | Este servidor | |
|---|---|---|
| Disponibilidade | Nenhuma desde que o QPX Express foi encerrado em 2018 | Schema mantido sobre os resultados ao vivo |
| Dados de emissões | Não oferecidos | Por itinerário, comparados à média da rota |
| Histórico de preços | Não oferecido | priceInsights com uma faixa típica |
| Configuração | Nada para configurar, porque não existe | Uma chave e uma URL |
| Custo | Não aplicável | Pago após o teste, 15 créditos por chamada |
O que este servidor não faz. Não faz reservas e não processa pagamentos. Ele lê tarifas, trechos e os tokens que o próprio Google usa para avançar para a reserva, e devolve a etapa de reserva para você.
FAQ
Existe uma API oficial do Google Flights?
Não. O Google encerrou o QPX Express em 2018 e não lançou um substituto. Toda opção lê os mesmos resultados públicos que o site exibe. Este é mantido pela HasData e os retorna como JSON estruturado.
O que é um servidor MCP do Google Flights?
Um servidor que expõe o Google Flights como uma ferramenta que um cliente de IA pode chamar. O cliente envia uma chamada de ferramenta pelo Model Context Protocol, o servidor busca os itinerários e retorna JSON estruturado, e o modelo trabalha com o resultado. Este expõe uma única ferramenta e roda remotamente.
Por que uma viagem de ida e volta exige duas chamadas?
O Google retorna primeiro as opções de ida, cada uma com um departureToken. Você escolhe uma e passa o token de volta para obter os voos de volta que combinam com ela. Isso espelha como o site funciona, e é por isso que uma viagem de ida e volta custa 30 créditos.
Os números de carbono estão em quilogramas?
Não, em gramas. thisFlight: 433000 significa 433 kg, e differencePercent compara isso à média da rota.
O que é busca profunda?
Um modo mais lento que retorna exatamente o que o Google Flights mostra em um navegador. Deixe desativado para velocidade, ative quando precisar de paridade com o site.
Posso usar isso junto com outras APIs da HasData?
Sim. O parâmetro apis aceita uma lista, e ?apis=google_travel adiciona o Google Hotels junto com os voos. Remova o parâmetro e você obtém tudo.
Conformidade e dados pessoais
A HasData acessa apenas dados publicamente disponíveis. Os termos de uma plataforma podem restringir o acesso automatizado, e você é responsável pela sua própria conformidade.
Links da HasData
| Página do produto e construtor de solicitações | API do Google Flights |
| Documentação do servidor | Docs do servidor MCP |
| Todas as 57 ferramentas em um servidor | HasData/hasdata-mcp |
| Tutoriais de clientes | Clientes e integrações MCP |
| Tudo o mais que extraímos | API do Google Flights e mais 54 |
| Planos e custos de créditos | Planos e custos de créditos |
| Chaves e uso | Painel da HasData |
| Lançador Node no npm | @hasdata/google-flights-mcp |
| Lançador Python no PyPI | hasdata-google-flights-mcp |
Desenvolvimento
Este repositório é configuração e documentação para um servidor remoto. Não há etapa de build e nada para containerizar.
Os testes em test/ verificam o contrato da ferramenta, a parte que pode quebrar sem um commit aqui. Eles verificam que ?apis=google_travel_flights retorna exatamente uma ferramenta, que ela ainda declara seus parâmetros obrigatórios, que o nome não mudou e que a chave em uso é realmente aceita. Essa última verificação chama a ferramenta de verdade e custa 15 créditos, que é o preço de um canário que pode falhar pelo motivo certo.
# macOS and Linux
HASDATA_API_KEY=your_key_here npm test
# Windows PowerShell
$env:HASDATA_API_KEY="your_key_here"; npm test
A mesma suíte roda no CI a cada push e uma vez por semana em um agendamento, porque a lista de ferramentas upstream pode mudar sem que ninguém toque neste repositório. Uma falha significa que a lista de ferramentas mudou, a chave parou de funcionar ou o endpoint ficou inacessível, e a mensagem de asserção diz qual.
Contribuindo
Correções na tabela de parâmetros e na amostra de resposta são a contribuição mais útil, porque são as partes que se desatualizam. Inclua a chamada que você fez e a resposta que obteve. Pull requests de forks rodam a suíte sem chave, e as verificações ao vivo são puladas em vez de ficarem vermelhas.
Licença
MIT. Veja LICENSE.