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
Contenido
- Lo que necesitas
- Inicio rápido
- Ejemplos de indicaciones
- Herramientas
- Errores y rutas de fallo
- Precios, nivel gratuito y límites
- Selección de herramientas
- Cómo se compara
- Preguntas frecuentes
- Enlaces de HasData
- Desarrollo
- Contribuciones
- Licencia
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.
| Campo | Valor |
|---|---|
| URL | https://mcp.hasdata.com/api/mcp?apis=google_travel_flights |
| Transporte | HTTP, transmisible |
| Encabezado de autenticación | x-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ámetro | Tipo | Obligatorio | Notas |
|---|---|---|---|
departureId | string | sí | Código IATA como JFK, o un kgmid de ubicación como /m/02_286. Separa varios aeropuertos con comas |
arrivalId | string | sí | Mismo formato que departureId |
outboundDate | string | sí | YYYY-MM-DD |
type | string | roundTrip por defecto, oneWay, o multiCity con multiCityJson | |
returnDate | string | Obligatorio cuando type es roundTrip | |
travelClass | string | economy, premiumEconomy, business o first | |
stops | string | nonStop, oneStopOrFewer o twoStopsOrFewer | |
sortBy | string | topFlights por defecto, más price, duration, emissions, departureTime, arrivalTime | |
adults / children / infantsInSeat / infantsOnLap | number | Mezcla de pasajeros | |
maxPrice / maxDuration / bags | number | Límites y cantidad de equipaje de mano | |
includeAirlines / excludeAirlines | string | Códigos IATA de aerolíneas separados por comas, uno u otro, no ambos | |
departureToken | string | Selecciona una opción de ida y obtén su regreso o siguiente tramo | |
bookingToken | string | Obtén opciones de reserva para un itinerario elegido | |
currency / gl / hl | string | Moneda y el país e idioma de la búsqueda | |
deepSearch | boolean | Coincide 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.
carbonEmissionsestá en gramos, no en kilogramos.thisFlight: 433000son 433 kg.differencePercentlo compara contypicalForThisRoute, 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 Google | Este servidor | |
|---|---|---|
| Disponibilidad | Ninguna desde que QPX Express cerró en 2018 | Esquema mantenido sobre los resultados en vivo |
| Datos de emisiones | No se ofrecen | Por itinerario, comparados con el promedio de la ruta |
| Historial de precios | No se ofrece | priceInsights con un rango típico |
| Configuración | Nada que configurar, porque no existe | Una clave y una URL |
| Costo | No aplica | De 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 solicitudes | API de Google Flights |
| Documentación del servidor | Documentación del servidor MCP |
| Las 57 herramientas en un solo servidor | HasData/hasdata-mcp |
| Guías para clientes | Clientes e integraciones MCP |
| Todo lo demás que extraemos | API de Google Flights y 54 más |
| Planes y costos de créditos | Planes y costos de créditos |
| Claves y uso | Panel de HasData |
| Lanzador de Node en npm | @hasdata/google-flights-mcp |
| Lanzador de Python en PyPI | hasdata-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.