HasData Google Flights MCP Server

Itinerarios de Google Flights con tarifas, tramos, emisiones de carbono e historial de precios, en JSON.

Documentación

Servidor MCP de Google Flights

Un servidor de Protocolo de Contexto de Modelo (MCP) alojado que brinda a Claude, Cursor, Windsurf y cualquier otro cliente MCP una herramienta de Google Flights. Busca itinerarios de ida, ida y vuelta y de múltiples ciudades con tarifas, tramos de vuelo, emisiones de carbono e historial de precios, todo como JSON estructurado, sin necesidad de cuenta de Google ni de lidiar con una API de viajes retirada.

https://mcp.hasdata.com/api/mcp?apis=google_travel_flights

Glama score tool contract MCP Tools npm PyPI License

Contenido

Lo que necesitas

Un cliente MCP y una clave de API de HasData desde el panel de control, que se crea gratis sin tarjeta, y la prueba cubre aproximadamente 66 llamadas a la tarifa de 15 créditos. Este es un servidor remoto, por lo que la ruta más sencilla es una URL y un encabezado x-api-key, sin contenedor que ejecutar y sin cuenta de Google en ningún punto del flujo. Un cliente que solo habla stdio llega a través de un lanzador ligero, publicado como @hasdata/google-flights-mcp en npm y hasdata-google-flights-mcp en PyPI, como se muestra a continuación.

Inicio rápido

La URL del servidor es la misma para todos los clientes. Lo probamos directamente en Claude Code y Claude Desktop. Los demás bloques siguen el formato documentado de cada cliente para un servidor remoto.

CampoValor
URLhttps://mcp.hasdata.com/api/mcp?apis=google_travel_flights
TransporteHTTP, transmisible
Encabezado de autenticaciónx-api-key: HASDATA_API_KEY

Los clientes con soporte OAuth pueden añadir la misma URL como conector e iniciar sesión sin poner una clave en un archivo de configuración.

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

Configuración, luego Conectores, luego Añadir conector personalizado, y pega https://mcp.hasdata.com/api/mcp?apis=google_travel_flights e inicia sesión.

Para la ruta de archivo de configuración, Claude Desktop solo carga servidores locales (stdio), por lo que llega a un servidor remoto a través de un lanzador stdio. El paquete @hasdata/google-flights-mcp es ese lanzador, y lee la clave del entorno. Añade esto a claude_desktop_config.json:

{
  "mcpServers": {
    "google-flights": {
      "command": "npx",
      "args": ["-y", "@hasdata/google-flights-mcp"],
      "env": { "HASDATA_API_KEY": "YOUR_KEY" }
    }
  }
}

Para Python en lugar de Node, cambia el lanzador por el paquete de PyPI, que uvx ejecuta sin instalación manual:

{
  "mcpServers": {
    "google-flights": {
      "command": "uvx",
      "args": ["hasdata-google-flights-mcp"],
      "env": { "HASDATA_API_KEY": "YOUR_KEY" }
    }
  }
}
Cursor

~/.cursor/mcp.json para cada proyecto, o .cursor/mcp.json para uno solo:

{
  "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. Windsurf llama al campo serverUrl, no 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 en el espacio de trabajo:

{
  "servers": {
    "google-flights": {
      "type": "http",
      "url": "https://mcp.hasdata.com/api/mcp?apis=google_travel_flights",
      "headers": { "x-api-key": "HASDATA_API_KEY" }
    }
  }
}

Ejemplos de indicaciones

Indicaciones, no código. Pega una y el agente elige la herramienta por sí mismo. Cada una está anotada con las llamadas que requiere, porque cada llamada exitosa cuesta 15 créditos.

Busca vuelos de ida de JFK a Londres Heathrow el 15 de septiembre, ordenados por precio, y dame los tres más baratos con aerolínea y estimación de carbono.

Una llamada, 15 créditos. Las tarifas, los tramos y las emisiones vuelven juntos.

Misma ruta pero solo sin escalas, en clase business, y dime qué opción tiene las menores emisiones.

Una llamada, 15 créditos. La cabina y las escalas son filtros en una sola solicitud.

¿Es $295 un buen precio para JFK a LHR ahora mismo, dado el historial de precios?

Una llamada, 15 créditos. La respuesta incluye priceInsights con un rango típico y un nivel de precio.

Ida y vuelta JFK a LHR, salida el 15 de septiembre y regreso el 22 de septiembre, tarifa más barata.

Dos llamadas, 30 créditos. Google devuelve primero las opciones de ida, luego el tramo de regreso es una segunda llamada claveada por la opción que elijas.

Un viaje de ida y vuelta son dos llamadas por diseño. La primera devuelve itinerarios de ida, cada uno con un departureToken, y pasas ese token de vuelta para obtener los vuelos de regreso correspondientes. La ida y la verificación de precio son una sola llamada cada una.

Herramientas

Una herramienta, de solo lectura. La muestra a continuación está recortada de una llamada real, y las tarifas cambian constantemente. Léela como una forma. El nombre de la herramienta enlaza a su referencia de endpoint, que incluye la lista completa de parámetros.

La muestra es el payload, no la respuesta completa. Un resultado tools/call lleva un bloque de texto, y ese texto es en sí mismo JSON que contiene url, status, text y json, con los datos extraídos bajo json. Desde una respuesta JSON-RPC cruda, la ruta es result.content[0].text, parseada, luego .json. Un cliente de chat desenvuelve eso por ti, y el código que habla directamente con el endpoint no lo hace.

Obtener resultados de Google Flights

hasdata_google_travel_flights_getGoogleFlights

Itinerarios para una ruta y fecha, con tarifas, tramos, emisiones e historial de precios.

ParámetroTipoObligatorioNotas
departureIdstringCódigo IATA como JFK, o un kgmid de ubicación como /m/02_286. Separa varios aeropuertos con comas
arrivalIdstringMismo formato que departureId
outboundDatestringYYYY-MM-DD
typestringroundTrip por defecto, oneWay, o multiCity con multiCityJson
returnDatestringObligatorio cuando type es roundTrip
travelClassstringeconomy, premiumEconomy, business o first
stopsstringnonStop, oneStopOrFewer o twoStopsOrFewer
sortBystringtopFlights por defecto, más price, duration, emissions, departureTime, arrivalTime
adults / children / infantsInSeat / infantsOnLapnumberMezcla de pasajeros
maxPrice / maxDuration / bagsnumberLímites y cantidad de equipaje de mano
includeAirlines / excludeAirlinesstringCódigos IATA de aerolíneas separados por comas, uno u otro, no ambos
departureTokenstringSelecciona una opción de ida y obtén su regreso o siguiente tramo
bookingTokenstringObtén opciones de reserva para un itinerario elegido
currency / gl / hlstringMoneda y el país e idioma de la búsqueda
deepSearchbooleanCoincide con lo que Google muestra en un navegador, más lento de devolver

La referencia también documenta includeConnections, excludeConnections, layoverDuration, outboundTimes, returnTimes, showHidden, lessEmissions y multiCityJson.

Los resultados se dividen en bestFlights y otherFlights. Cada itinerario lleva price, type, totalDuration en minutos, un array flights de tramos, un objeto carbonEmissions y un bookingToken. Cada tramo contiene el departureAirport y el arrivalAirport (cada uno con id, name y time local), duration, airline, flightNumber, airplane, legroom, travelClass, un array extensions y oftenDelayedByOver30Min en los tramos que Google marca. Un itinerario sin escalas tiene un tramo, una conexión tiene varios.

carbonEmissions está en gramos, no en kilogramos. thisFlight: 433000 son 433 kg. differencePercent lo compara con typicalForThisRoute, por lo que un número negativo es un vuelo más ecológico que el promedio.

{
  "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 se sitúa junto a los itinerarios con lowestPrice, un typicalPriceRange, un priceLevel como typical y un priceHistory de [timestamp, price] puntos. airports repite los aeropuertos de salida y llegada resueltos con ciudad y país.

Errores y rutas de fallo

Tu cliente casi nunca ve un código de error HTTP de una llamada de herramienta. La capa MCP responde 200 y pone el fallo dentro del resultado, con isError establecido en true y el motivo como texto. El agente lee un mensaje donde podrías esperar una línea de estado.

Una clave incorrecta aparece como salida de herramienta, no como conexión fallida. tools/list acepta cualquier clave no vacía y devuelve la herramienta, por lo que el cliente completa su handshake y muestra verde. La primera llamada de herramienta vuelve entonces con isError: true y el texto HasData API error: 401 Unauthorized. Vigila esa cadena, porque nada antes en el flujo informa del problema.

Una clave faltante es el único error HTTP real. La autorización se ejecuta antes de cualquier herramienta, y la conexión misma falla con 401. Los encabezados CORS están presentes, y un cliente de navegador lee el estado y no un fallo de red opaco.

Un argumento que rompe el esquema de la herramienta se rechaza antes de convertirse en un scrape. El servidor responde con isError: true y el texto MCP error -32602: Input validation error, nombrando el campo infractor. Un roundTrip sin un returnDate, o includeAirlines junto con excludeAirlines, se detecta aquí.

Una ruta sin vuelos en la fecha devuelve un resultado exitoso con los arrays de itinerarios vacíos, no un error. requestMetadata.status aún lee ok. Comprueba los vuelos antes de clasificarlos.

Un código de aeropuerto incorrecto devuelve 400 con requestMetadata.status establecido en error. Usa códigos IATA o kgmids, no nombres de ciudades.

Los resultados que llevan datos también llevan un requestMetadata.id que vale la pena citar en el soporte.

Precios, nivel gratuito y límites

Cada llamada de Google Flights cuesta 15 créditos por llamada exitosa. El tamaño de la respuesta no cambia el precio, y la búsqueda profunda cuesta lo mismo que una estándar.

La prueba gratuita es de 1,000 créditos durante 30 días sin tarjeta, que son aproximadamente 66 búsquedas de vuelos. Después, una cuenta activa sigue recibiendo 100 créditos recargados cada día cuando su saldo baja de 100, por lo que un agente de bajo volumen funciona en el nivel gratuito indefinidamente.

Los planes de pago comienzan en $49 al mes por 200,000 créditos, que son aproximadamente 13,000 búsquedas. El precio unitario baja con el volumen, desde $3.68 por 1,000 llamadas en el plan inicial hasta $1.49 en Business, $1.25 en Growth y $1.12 en los planes de alto volumen más grandes.

Tu plan también establece la concurrencia. La prueba gratuita permite 1 solicitud a la vez, Startup 15, Business 30, Growth 50, y los planes de alto volumen van de 200 a 1,500. Maneja el caso de desbordamiento de forma defensiva en cualquier cosa desatendida.

Una solicitud que vuelve con un estado distinto de 200 no se factura. Un viaje de ida y vuelta son dos llamadas, así que presupuesta en consecuencia.

Selección de herramientas

El parámetro de consulta apis decide qué herramientas ve tu agente. Menos herramientas significa menos contexto gastado en definiciones de herramientas y menos oportunidades de que el modelo elija la incorrecta.

?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

El parámetro acepta nombres de proveedores como google_travel y nombres de API individuales como google_travel_flights. Los nombres mal escritos se ignoran. Si todos los nombres son incorrectos, la solicitud falla con 400, y el cuerpo lista tanto lo que no reconoció como todos los valores válidos. Elimina el parámetro y el mismo endpoint expone las 57 herramientas de HasData.

Cómo se compara

Google retiró su API de vuelos QPX Express en 2018 y nunca la reemplazó, por lo que no hay una API oficial de Google Flights. Las rutas restantes son hacer scraping de los resultados públicos o licenciar datos de tarifas GDS crudos, lo cual es pesado y costoso. Este servidor lee los mismos resultados que muestra el sitio y los devuelve como JSON.

API oficial de GoogleEste servidor
DisponibilidadNinguna desde que QPX Express cerró en 2018Esquema mantenido sobre los resultados en vivo
Datos de emisionesNo se ofrecenPor itinerario, comparados con el promedio de la ruta
Historial de preciosNo se ofrecepriceInsights con un rango típico
ConfiguraciónNada que configurar, porque no existeUna clave y una URL
CostoNo aplicaDe pago después de la prueba, 15 créditos por llamada

Lo que este servidor no hace. No reserva ni realiza pagos. Lee tarifas, tramos y los tokens que Google usa para pasar a la reserva, y te devuelve el paso de reserva a ti.

Preguntas frecuentes

¿Existe una API oficial de Google Flights?

No. Google cerró QPX Express en 2018 y no ha lanzado un reemplazo. Cada opción lee los mismos resultados públicos que sirve el sitio web. Este está mantenido por HasData y los devuelve como JSON estructurado.

¿Qué es un servidor MCP de Google Flights?

Un servidor que expone Google Flights como una herramienta que un cliente de IA puede llamar. El cliente envía una llamada de herramienta a través del Model Context Protocol, el servidor obtiene los itinerarios y devuelve JSON estructurado, y el modelo trabaja con el resultado. Este expone una sola herramienta y se ejecuta de forma remota.

¿Por qué un viaje de ida y vuelta son dos llamadas?

Google devuelve primero las opciones de ida, cada una con un departureToken. Tú eliges una y pasas su token de vuelta para obtener los vuelos de regreso que se combinan con ella. Eso refleja cómo funciona el sitio, y es por eso que un viaje de ida y vuelta cuesta 30 créditos.

¿Los números de carbono están en kilogramos?

No, en gramos. thisFlight: 433000 significa 433 kg, y differencePercent lo compara con el promedio de la ruta.

¿Qué es la búsqueda profunda?

Un modo más lento que devuelve exactamente lo que Google Flights muestra en un navegador. Déjalo desactivado para mayor velocidad, actívalo cuando necesites paridad con el sitio.

¿Puedo usar esto junto con otras APIs de HasData?

Sí. El parámetro apis acepta una lista, y ?apis=google_travel añade Google Hotels junto a los vuelos. Elimina el parámetro y obtienes todo.

Cumplimiento y datos personales

HasData accede únicamente a datos disponibles públicamente. Los términos de una plataforma pueden restringir el acceso automatizado, y tú eres responsable de tu propio cumplimiento.

Enlaces de HasData

Página del producto y constructor de solicitudesAPI de Google Flights
Documentación del servidorDocumentación del servidor MCP
Las 57 herramientas en un solo servidorHasData/hasdata-mcp
Guías para clientesClientes e integraciones MCP
Todo lo demás que extraemosAPI de Google Flights y 54 más
Planes y costos de créditosPlanes y costos de créditos
Claves y usoPanel de HasData
Lanzador de Node en npm@hasdata/google-flights-mcp
Lanzador de Python en PyPIhasdata-google-flights-mcp

Desarrollo

Este repositorio es configuración y documentación para un servidor remoto. No hay paso de compilación ni nada que contenerizar.

Las pruebas en test/ verifican el contrato de la herramienta, la parte que puede romperse sin un commit aquí. Comprueban que ?apis=google_travel_flights devuelve exactamente una herramienta, que todavía declara sus parámetros requeridos, que el nombre no ha cambiado y que la clave en uso es realmente aceptada. Esa última comprobación llama a la herramienta de verdad y cuesta 15 créditos, que es el precio de un canario que puede fallar por la razón correcta.

# macOS and Linux
HASDATA_API_KEY=your_key_here npm test

# Windows PowerShell
$env:HASDATA_API_KEY="your_key_here"; npm test

La misma suite se ejecuta en CI en cada push y una vez por semana de forma programada, porque la lista de herramientas upstream puede cambiar sin que nadie toque este repositorio. Un fallo significa que la lista de herramientas se movió, la clave dejó de funcionar o el endpoint no era accesible, y el mensaje de la aserción indica cuál.

Contribuciones

Las correcciones a la tabla de parámetros y a la muestra de respuesta son la contribución más útil, porque son las partes que se desvían. Incluye la llamada que hiciste y la respuesta que obtuviste. Las solicitudes de extracción desde forks ejecutan la suite sin clave, y las comprobaciones en vivo se omiten en lugar de ponerse en rojo.

Licencia

MIT. Consulta LICENCIA.