Google Flights MCP

Busca de voos em tempo real: tarifas de ida e volta em intervalos de datas, com avaliações de preço.

Documentação

Habilidades do Agente de Viagens

Habilidades do agente para preços de voos e hotéis em tempo real. Oito habilidades (datas mais baratas, monitoramento de tarifas, planejamento de viagens, comparação de destinos, busca de hotéis, monitoramento de paridade de tarifas e mais) que ensinam Claude, Cursor ou qualquer agente compatível com MCP a responder perguntas sobre preços de viagens com tarifas em tempo real do Google Flights e preços do Booking.com. Cada tarifa traz o veredito low | typical | high do próprio Google e um link para reserva, para que o agente possa dizer a alguém se vale a pena pagar aquele preço, não apenas qual é o preço. Funciona via MCP ou REST puro.

Construído pela FlightPowers, uma API de dados de viagens para desenvolvedores e agentes de IA.

Onde obter uma chave: você não precisa de uma para começar; o servidor gratuito abaixo é suportado por anúncios (faça login com o Google, 50 buscas por dia). Sem anúncios com sua própria chave RapidAPI: Google Flights Live API e Booking Live API, um pacote gratuito de 10 buscas por mês, e depois PRO por US$ 10 para 2.500 buscas de voos ou 2.000 buscas de hotéis.

Links Rápidos


Instalação em 60 Segundos

Grátis, sem chave de API, faça login com o Google quando seu cliente solicitar:

claude mcp add --transport http flightpowers https://free-trial.flightpowers.com/mcp

Isso coloca quatro ferramentas no seu agente — voos de ida, voos de ida e volta, busca de hotéis e um hotel específico — e você pode fazer uma pergunta real imediatamente. O servidor gratuito é suportado por anúncios: cada resposta traz um card patrocinado divulgado. Servidores sem anúncios abaixo.

O que retorna

Faça uma pergunta flexível e será uma chamada, não uma por data:

Cheapest way from Berlin to Paris in the middle of September?
$49   Wed Sep 16   easyJet · non-stop · 1 hr 50 min · 6:05 AM → 7:55 AM    low
$49   Thu Sep 17   easyJet · non-stop · 1 hr 50 min · 6:00 AM → 7:50 AM    low
$53   Tue Sep 15   easyJet · non-stop · 1 hr 50 min · 6:15 AM → 8:05 AM    typical

Google's historical band for this route and period: $50–$125
Dates searched: Sep 14, 15, 16, 17, 18  ·  one call, five dates
Every row carries a buy_link into Google Flights for that exact itinerary.

Essa é uma resposta real do servidor gratuito, capturada em 25/08/2026 (BER → CDG, departure_date_from / departure_date_to abrangendo cinco dias). É uma busca real, não um benchmark — as tarifas mudam constantemente, e as suas serão diferentes.

A coluna low / typical é a parte que a maioria das APIs de voos não tem. Ela vem de price_range_in_relation_to_other_periods, junto com price_insights_low e price_insights_high — a faixa de preço do próprio Google para aquela rota e período. É a diferença entre um agente que diz "US$ 49" e um que diz "US$ 49 está barato para esta rota — reserve agora, não espere".


As ferramentas que seu agente recebe

Escritas para o modelo que precisa escolher entre elas. Os nomes dos parâmetros abaixo são os reais dos esquemas das ferramentas.

search_oneway_flights

Use esta para qualquer pergunta de tarifa de ida única, incluindo as de resposta aberta. O destino pode ser uma lista de códigos IATA e as datas podem ser um intervalo (departure_date_from / departure_date_to) — o servidor expande ambos internamente. "Voo mais barato para o Sri Lanka em qualquer data de outubro" é uma chamada, não trinta. Não faça loop desta ferramenta sobre datas.

Não use esta quando o viajante voltar — search_roundtrip_flights precifica o par junto, que não é o mesmo número que duas idas somadas.

Você recebe de volta uma linha por itinerário: price / price_as_number, airline, duration / duration_seconds, stops e stops_info[] (cada aeroporto de conexão e sua duração), departure_description / arrival_description, um buy_link com link direto para aquele itinerário exato e os três campos de insights de preço. Junto a eles, search_coverage nomeia cada data realmente pesquisada.

Leia search_coverage antes de concluir qualquer coisa. No servidor gratuito, uma chamada pesquisa no máximo 15 combinações de data × destino; uma solicitação mais ampla não é rejeitada, é amostrada uniformemente no intervalo e retorna com truncated: true. Uma data ausente de departure_dates_searched nunca foi pesquisada — o que não é o mesmo que não ter voos.

search_roundtrip_flights

Use esta sempre que a viagem tiver retorno, e especialmente quando o usuário souber a duração da viagem, mas não as datas: passe nights (um número, ou uma lista como [5,6,7]) em vez de return_date, com departure_date_from / departure_date_to para a janela de ida. "5 a 7 noites em Roma em algum momento de maio" é uma chamada.

Você recebe de volta total_price / total_price_as_number para ambas as pernas juntas, total_duration_seconds, total_stops, as pernas de ida e volta já pareadas — departure_flight_airline, return_flight_airline, paradas, durações e horários por perna — e um único buy_link cobrindo toda a viagem. Mesmo limite do plano gratuito e mesmo search_coverage, contado sobre combinações de data de partida × noites.

search_hotels

Use esta quando o usuário quiser opções em um lugar. destination é texto livre do jeito que uma pessoa fala — "Rome", "Tokyo Shibuya" — não um ID e não uma coordenada, além de checkin_date e checkout_date. budget_per_night filtra antes de você receber a lista.

Não use esta quando já nomearam a propriedade; esse é o caso de find_hotel_by_name.

Você recebe de volta por propriedade: name, price_string e price, review_score e review_count, room_type, location e um link de reserva.

find_hotel_by_name

Use esta quando o usuário nomear uma propriedade — "o Hilton Paris Opera está livre naquela semana" — ou quando você estiver acompanhando o preço de um único hotel ao longo do tempo. hotel_name é o nome que uma pessoa digitaria; adicionar a cidade ajuda quando uma rede tem muitas propriedades. Nenhum ID interno de propriedade é necessário; a resolução é feita para você.

Você recebe de volta o preço daquela propriedade, review_score, room_type e o link de reserva. Uma propriedade sem disponibilidade para aquelas datas retorna como indisponível — isso é uma resposta, não um erro, e chamar novamente não vai mudar isso.

Todas as quatro: tarifas e preços ficam desatualizados em minutos. Nunca reutilize um resultado de antes na conversa; pesquise novamente e carimbe a resposta com o horário em que foi obtida.


As oito habilidades

As ferramentas dão os dados ao seu agente. As habilidades são o que fazem ele usar os dados bem — uma chamada para um intervalo inteiro de datas em vez de trinta, o veredito em vez de um número puro e uma busca nova a cada vez.

Um hub central guarda autenticação, hosts, cada endpoint, cada nome de campo de resposta e as regras de cobrança. Sete habilidades de fluxo de trabalho permanecem enxutas e delegam a ele.

travel-data-api                 hub — auth, hosts, endpoints, response fields, cost per call
  |- cheapest-dates             WHEN to fly: scan a date range, judge the winner
  |- destination-compare        WHERE to go: price many cities from one origin
  |- trip-planner               flights + hotel totalled into one all-in budget
  |- fare-watch                 one pinned route, re-checked over time, book-now-or-wait
  |- hotel-search               find and price places to stay
  |- rate-parity-monitor        same hotel priced as a resident of each country
  `- travel-brief               presentation layer — recommendation, table, links
HabilidadeUse quando quiser…Ela retorna
travel-data-apiescrever código curl ou de cliente, consultar um parâmetro ou campo de resposta, instalar um servidor ou calcular quanto custa uma chamadatabelas de endpoints, curl executável, nomes exatos de campos JSON
cheapest-datesencontrar o dia, semana ou mês mais barato para voar em uma rota conhecida — ou a duração de viagem mais baratatarifa mais barata por data, o departure_date/return_date vencedor, buy_link e o veredito da oferta
destination-comparedecidir para onde ir: "algum lugar quente abaixo de US$ 300 em outubro"uma tabela de cidades classificada por preço, além de uma linha de cobertura nomeando cada destino realmente pesquisado
trip-plannerprecificar uma viagem nomeada de ponta a ponta: "7 noites em Lisboa abaixo de US$ 2000"check-in/check-out alinhados, voos de ida e volta, hotéis correspondentes, total combinado por pessoa vs. o limite
fare-watchacompanhar o preço de uma rota ao longo de verificações repetidas e alertar apenas em uma queda significativapreço ao vivo, veredito low/typical/high, faixa histórica do Google, checked_at, delta vs. seu histórico armazenado
hotel-searchencontrar hotéis por cidade, bairro ou ponto de referência, ou precificar uma propriedade nomeadaname, price_string, review_score, room_type, location, link
rate-parity-monitorver se um hotel nomeado é mais barato reservado de outro paístabela por mercado com o país de onde cada preço foi visto, várias amostras por país, tarifa por noite em uma moeda, diferença vs. o mercado mais barato e um veredito que só conta uma diferença que se sustenta nas amostras
travel-brieftransformar resultados em algo que você possa enviar a um clienterecomendação → tabela → veredito → links de reserva → linha de horário da verificação

As habilidades são nomeadas pelo trabalho, não pelo endpoint. Dois endpoints de voos e dois endpoints de hotéis produzem sete fluxos de trabalho, porque "qual dia é mais barato" e "para onde devo ir" são perguntas diferentes para um usuário e perguntas idênticas para uma API.

Outros prompts para os quais estas foram construídas:

Where can I go from JFK for under $400 in late October? Somewhere warm.
Watch BER→LHR for the 14th and ping me if it drops below $90.
Plan a week in Rome in May for two, £1800 all in, hotel needs free cancellation.
Is the Hotel Gracery Shinjuku cheaper booked from Japan than from Germany, same dates?
Write up the Lisbon options for my client with a table and booking links.

Instale as habilidades

Claude Code (plugin)

claude plugin marketplace add mtnrabi/travel-agent-skills
claude plugin install travel-agent-skills@travel-agent-skills

Reinicie o Claude Code e todas as oito carregam juntas — o agente escolhe a certa pela pergunta, e você também pode invocar uma diretamente pelo nome (cheapest-dates, trip-planner, rate-parity-monitor).

Qualquer agente com um diretório simples de habilidades

git clone https://github.com/mtnrabi/travel-agent-skills.git

# personal, every project:
cp -r travel-agent-skills/skills/* ~/.claude/skills/

# or scoped to one project:
mkdir -p .claude/skills && cp -r travel-agent-skills/skills/* .claude/skills/

Cada habilidade é uma pasta autocontida com um SKILL.md e um descritor de exibição agents/openai.yaml, para que qualquer runtime que leia um diretório de habilidades possa carregá-las — copie o conjunto inteiro ou apenas as pastas que quiser. Nada aqui importa nada; não há etapa de build e nenhuma dependência.


Servidores sem anúncios (sua própria chave)

O servidor gratuito é o caminho mais rápido para começar. Quando você quiser sem anúncios, com maior fan-out e relatórios de gastos próprios, as mesmas ferramentas são hospedadas em dois servidores cobrados na sua própria chave RapidAPI:

# flights
claude mcp add --transport http flights https://flights.flightpowers.com/mcp \
  --header "x-rapidapi-key: YOUR_RAPIDAPI_KEY"

# hotels
claude mcp add --transport http hotels https://hotels.flightpowers.com/mcp \
  --header "x-rapidapi-key: YOUR_RAPIDAPI_KEY"

Se seu cliente não puder enviar cabeçalhos personalizados, ambos também aceitam ?rapidapi_key= na URL, ou um campo de chave de API onde o cliente oferecer um. O servidor de voos também responde no seu hostname original, google-flights-mcp.flightpowers.com/mcp, para que configurações existentes continuem funcionando.

Grátis: free-trialSem anúncios: flights. / hotels.
Anúnciosum card patrocinado divulgado por respostanenhum
Chavenenhuma, faça login com o Googlesua própria chave RapidAPI
Limite de busca por chamada15 combinações de data × destino, amostradas uniformemente além disso30 por padrão, até 60 via max_searches
Orçamento diário50 buscas por dia e 250 por mês por conta conectadaseu próprio plano
Relatórios de gastos—api_usage e cota restante em cada chamada
Hotéisbusca e por nomealém disso, precificação por país e 24 filtros do Booking.com

O servidor de hotéis sem anúncios adiciona duas coisas que o gratuito não tem: price_as_seen_from (um código de país de duas letras que precifica a estadia como um comprador residente lá veria) e filters — free_cancellation, breakfast_included, review_score_8, stars_4, pets_allowed e mais dezenove.

O servidor gratuito carrega anúncios, então deliberadamente não está listado em nenhum diretório MCP — a política de diretório da Anthropic, as diretrizes de plugins da OpenAI e o registro oficial de MCP todos proíbem conteúdo patrocinado. Instale-o por URL, como acima.


Ou chame a API REST diretamente

Ambas as APIs são publicadas no RapidAPI pela mtnrabi e cobradas na sua própria chave. A mesma chave funciona para ambas depois que você assinar cada uma.

APIO que retornaListagem no RapidAPI
Google Flights Live APITarifas de voos em tempo real com o veredito low|typical|high do Google, ida e ida e voltarapidapi.com/mtnrabi/api/google-flights-live-api
Booking Live APIDisponibilidade de hotéis e tarifas por noite em tempo real com precificação por paísrapidapi.com/mtnrabi/api/booking-live-api
cp .env.example .env    # then paste your key into RAPIDAPI_KEY

As habilidades nunca imprimem, registram ou confirmam sua chave, e não pedirão uma a menos que uma chamada ao vivo precise.

Não há endpoint em massa no REST — uma busca flexível é um loop, e cada combinação de data × destino é uma solicitação cobrada. É exatamente isso que os parâmetros de intervalo do MCP existem para colapsar. skills/travel-data-api/SKILL.md tem a referência completa de endpoints, cada parâmetro e curl executável.

Prefere sem código ou execuções em lote agendadas? Os mesmos dados estão disponíveis como atores Apify: voos (US$ 5 / 1 mil) e hotéis (US$ 4 / 1 mil).


O que os dados fazem que um scraper não consegue

  • O veredito do próprio Google, não apenas um número. price_insights_low, price_insights_high e price_range_in_relation_to_other_periods fornecem a faixa histórica para aquela rota e período, além de uma classificação low | typical | high. Toda skill de voo começa com o veredito.
  • Ida e volta é uma busca real de pernas pareadas, não duas viagens de ida unidas: um objeto por itinerário com total combinado, ambas as pernas já correspondidas e um único buy_link para a viagem.
  • Preços de hotéis por país. price_as_seen_from no servidor de hotéis sem anúncios (proxy_country no REST) roteia a solicitação por um proxy residencial naquele país, para que você possa verificar o mesmo quarto nas mesmas datas como um residente de de, jp ou il receberia a cotação. Os preços variam, então amostre cada país algumas vezes antes de considerar uma diferença real, e espere que algumas propriedades retornem com o mesmo preço em todos os lugares. É para isso que o rate-parity-monitor foi construído adequadamente.
  • Um resultado vazio informa qual tipo de vazio é. Veja abaixo — é o modo de falha que envenena silenciosamente todo agente de viagens construído sobre um scraper.

Vazio nem sempre é vazio

Uma busca de voos que recebeu uma página que não conseguia ler — um aviso de consentimento, uma verificação de bot, uma resposta truncada — costumava parecer exatamente como o Google dizendo "não há voos nesta rota". Ambos eram [] com HTTP 200. Um agente interpreta o primeiro como o segundo e informa confiantemente ao usuário que a rota não existe.

A API REST agora informa qual dos dois aconteceu, nos cabeçalhos de resposta:

CabeçalhoSignificado
X-Search-Statusok | empty | partial | degraded
X-Search-Reasono que deu errado em alguma tentativa — blocked_page, unrecognized_page, unreadable_prices, upstream_timeout, search_truncated e outros. Registra a primeira falha, então pode aparecer em uma resposta que uma nova tentativa recuperou; leia X-Search-Status para decidir se você obteve uma resposta
X-Search-Results, X-Search-Attempts, X-Search-Combinationsquanto trabalho a busca realizou
  • empty — a busca foi concluída e o Google genuinamente não tem nada para aquela rota e data. O array vazio é a resposta; tentar novamente é uma solicitação desperdiçada.
  • partial — resultados reais, sabidamente incompletos. Algumas linhas ou algumas combinações não puderam ser entregues.
  • degraded — a busca não foi concluída. O array vazio não diz nada sobre a disponibilidade de voos. Tente novamente; nada foi reservado ou alterado.

Páginas ilegíveis são tentadas novamente automaticamente, e uma página que genuinamente diz "sem voos" nunca é tentada novamente — então um resultado vazio real ainda retorna tão rápido quanto antes. Envie "strict": true e uma busca degradada retorna HTTP 503 com um corpo explicativo em vez de um [] enganoso.

status = r.headers.get("X-Search-Status")
if status == "degraded":
    raise RuntimeError(f"search incomplete ({r.headers.get('X-Search-Reason')}), retry")
flights = r.json()
if not flights:
    print("No flights on this route for these dates")  # status == "empty"

Os servidores MCP leem esses cabeçalhos para você: quando parte de uma busca não foi concluída, o resultado da ferramenta diz isso em palavras, em vez de entregar ao modelo uma lista curta que parece completa.


Regras de design que estas skills seguem

  1. Prefira as ferramentas MCP quando um cliente as tiver; caso contrário, use curl REST como alternativa.
  2. Diga quanto custa uma chamada antes de fazê-la. Cada solicitação cobrada é dinheiro do usuário.
  3. Um resultado vazio só é "sem voos" quando a busca informa que foi concluída. Verifique X-Search-Status (REST) ou a nota de resultado da própria ferramenta (MCP) antes de reportar uma rota como vazia, e nunca tente novamente um empty genuíno em loop.
  4. Nunca armazene em cache ou reutilize uma tarifa de antes na conversa. Sempre carimbe a resposta com quando os dados foram obtidos.
  5. Comece com a resposta, depois a evidência. Nunca apresente um buy_link como uma tarifa garantida, bloqueada ou assegurada.
  6. Nunca imprima, registre em log ou faça commit de uma chave de API.
  7. Sem números inventados. Não há alegação de uptime, latência, contagem de usuários ou receita em nenhum lugar deste repositório, e nenhuma deve ser adicionada.

Estas são APIs independentes que retornam preços de voos e hotéis publicamente disponíveis. Não são afiliadas, endossadas ou patrocinadas pelo Google ou Booking.com.

Licença MIT — veja LICENSE.