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
- Página inicial: flightpowers.com
- Google Flights Live API: rapidapi.com/mtnrabi/api/google-flights-live-api
- Booking Live API: rapidapi.com/mtnrabi/api/booking-live-api
- GitHub: github.com/mtnrabi/travel-agent-skills
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
| Habilidade | Use quando quiser… | Ela retorna |
|---|---|---|
travel-data-api | escrever código curl ou de cliente, consultar um parâmetro ou campo de resposta, instalar um servidor ou calcular quanto custa uma chamada | tabelas de endpoints, curl executável, nomes exatos de campos JSON |
cheapest-dates | encontrar o dia, semana ou mês mais barato para voar em uma rota conhecida — ou a duração de viagem mais barata | tarifa mais barata por data, o departure_date/return_date vencedor, buy_link e o veredito da oferta |
destination-compare | decidir 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-planner | precificar 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-watch | acompanhar o preço de uma rota ao longo de verificações repetidas e alertar apenas em uma queda significativa | preço ao vivo, veredito low/typical/high, faixa histórica do Google, checked_at, delta vs. seu histórico armazenado |
hotel-search | encontrar hotéis por cidade, bairro ou ponto de referência, ou precificar uma propriedade nomeada | name, price_string, review_score, room_type, location, link |
rate-parity-monitor | ver se um hotel nomeado é mais barato reservado de outro país | tabela 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-brief | transformar resultados em algo que você possa enviar a um cliente | recomendaçã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-trial | Sem anúncios: flights. / hotels. | |
|---|---|---|
| Anúncios | um card patrocinado divulgado por resposta | nenhum |
| Chave | nenhuma, faça login com o Google | sua própria chave RapidAPI |
| Limite de busca por chamada | 15 combinações de data × destino, amostradas uniformemente além disso | 30 por padrão, até 60 via max_searches |
| Orçamento diário | 50 buscas por dia e 250 por mês por conta conectada | seu próprio plano |
| Relatórios de gastos | — | api_usage e cota restante em cada chamada |
| Hotéis | busca e por nome | alé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.
| API | O que retorna | Listagem no RapidAPI |
|---|---|---|
| Google Flights Live API | Tarifas de voos em tempo real com o veredito low|typical|high do Google, ida e ida e volta | rapidapi.com/mtnrabi/api/google-flights-live-api |
| Booking Live API | Disponibilidade de hotéis e tarifas por noite em tempo real com precificação por país | rapidapi.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_higheprice_range_in_relation_to_other_periodsfornecem a faixa histórica para aquela rota e período, além de uma classificaçãolow | 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_linkpara a viagem. - Preços de hotéis por país.
price_as_seen_fromno servidor de hotéis sem anúncios (proxy_countryno 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 dede,jpouilreceberia 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 orate-parity-monitorfoi 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çalho | Significado |
|---|---|
X-Search-Status | ok | empty | partial | degraded |
X-Search-Reason | o 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-Combinations | quanto 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
- Prefira as ferramentas MCP quando um cliente as tiver; caso contrário, use curl REST como alternativa.
- Diga quanto custa uma chamada antes de fazê-la. Cada solicitação cobrada é dinheiro do usuário.
- 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 umemptygenuíno em loop. - Nunca armazene em cache ou reutilize uma tarifa de antes na conversa. Sempre carimbe a resposta com quando os dados foram obtidos.
- Comece com a resposta, depois a evidência. Nunca apresente um
buy_linkcomo uma tarifa garantida, bloqueada ou assegurada. - Nunca imprima, registre em log ou faça commit de uma chave de API.
- 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.