HasData Airbnb MCP Server
Estancias de Airbnb por ubicación y fechas, además de detalles completos de los anuncios, como JSON estructurado.
Documentación
Servidor MCP de Airbnb
Un servidor de Model Context Protocol (MCP) alojado que brinda a Claude, Cursor, Windsurf y cualquier otro cliente MCP dos herramientas de solo lectura para Airbnb. Busca estancias por ubicación y fechas, y lee un anuncio completo, todo como JSON estructurado, sin cuenta de desarrollador de Airbnb ni aprobación de socio.
Lee páginas públicas de anuncios que un visitante sin sesión puede ver.
https://mcp.hasdata.com/api/mcp?apis=airbnb
Contenido
- Lo que necesitas
- Inicio rápido
- Ejemplos de indicaciones
- Herramientas
- Errores y rutas de fallo
- Precios, plan 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, gratuita de crear sin tarjeta, y la prueba cubre unas 200 llamadas a la tarifa de 5 créditos. Este es un servidor remoto, por lo que la ruta más simple es una URL y un encabezado x-api-key, sin contenedor que ejecutar y sin cuenta de desarrollador de Airbnb en ningún punto del flujo. Un cliente que solo habla stdio lo alcanza mediante un lanzador ligero, publicado como @hasdata/airbnb-mcp en npm y hasdata-airbnb-mcp en PyPI, que 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=airbnb |
| 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 airbnb "https://mcp.hasdata.com/api/mcp?apis=airbnb" \
--header "x-api-key: HASDATA_API_KEY"
Claude Desktop
Configuración, luego Conectores, luego Añadir conector personalizado, luego pega https://mcp.hasdata.com/api/mcp?apis=airbnb e inicia sesión.
Para la ruta de archivo de configuración, Claude Desktop solo carga servidores locales (stdio), por lo que alcanza un servidor remoto mediante un lanzador stdio. El paquete @hasdata/airbnb-mcp es ese lanzador, y lee la clave del entorno. Añade esto a claude_desktop_config.json:
{
"mcpServers": {
"airbnb": {
"command": "npx",
"args": ["-y", "@hasdata/airbnb-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": {
"airbnb": {
"command": "uvx",
"args": ["hasdata-airbnb-mcp"],
"env": { "HASDATA_API_KEY": "YOUR_KEY" }
}
}
}
Cursor
~/.cursor/mcp.json para cada proyecto, o .cursor/mcp.json para uno solo:
{
"mcpServers": {
"airbnb": {
"url": "https://mcp.hasdata.com/api/mcp?apis=airbnb",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}
Windsurf
~/.codeium/windsurf/mcp_config.json. Windsurf llama al campo serverUrl, no url:
{
"mcpServers": {
"airbnb": {
"serverUrl": "https://mcp.hasdata.com/api/mcp?apis=airbnb",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}
VS Code
.vscode/mcp.json en el espacio de trabajo:
{
"servers": {
"airbnb": {
"type": "http",
"url": "https://mcp.hasdata.com/api/mcp?apis=airbnb",
"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 5 créditos.
Busca estancias en Austin para dos adultos del 15 al 18 de septiembre y dame las diez mejor valoradas por menos de $200 la noche.
Una llamada, 5 créditos. La valoración y el precio nocturno vienen en el resultado de búsqueda.
Toma el primer resultado y extrae sus comodidades completas, el número de huéspedes y dormitorios, y los detalles del anfitrión.
Una llamada, 5 créditos. Esos datos están en la página de la propiedad, que la herramienta de detalles lee por URL.
Compara el precio nocturno de una estancia de tres noches para dos huéspedes en Austin frente a Nashville.
Dos llamadas, 10 créditos, una búsqueda por ciudad.
Para esta URL de anuncio, dime cuántas camas y baños tiene y si el anfitrión es un Superhost.
Una llamada, 5 créditos.
Un resultado de búsqueda es deliberadamente ligero, suficiente para clasificar y preseleccionar. Las comodidades, camas, anfitrión y descripción completa provienen de la llamada de propiedad, por lo que una indicación que preselecciona y luego inspecciona tres casas es una búsqueda más tres llamadas de propiedad.
Herramientas
Dos herramientas, de solo lectura. Las muestras a continuación están recortadas de llamadas reales, y los números cambian a medida que Airbnb actualiza. Léelas como formas. Cada nombre de herramienta enlaza a su referencia de endpoint, que incluye la lista completa de campos.
Las muestras son 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, analizada, luego .json. Un cliente de chat lo desenvuelve por ti, y el código que habla directamente con el endpoint no lo hace.
Obtener anuncios de Airbnb
hasdata_airbnb_listing_getAirbnbListings
Una página de resultados de búsqueda por ubicación y fechas.
| Parámetro | Tipo | Obligatorio | Notas |
|---|---|---|---|
location | string | sí | El lugar a buscar, como Austin, Texas |
checkIn | string | sí | Fecha de entrada, YYYY-MM-DD |
checkOut | string | Fecha de salida, YYYY-MM-DD | |
adults / children / infants / pets | number | Composición de huéspedes, cada uno un recuento | |
nextPageToken | string | El pagination.nextPageToken de la respuesta anterior |
Devuelve un array properties y pagination, cuyos nextPageToken y pageTokens recorren el conjunto de resultados. Cada propiedad lleva id, url, title, latitude, longitude, un eslogan corto description, un array photos, rating, reviews, un array badges como Guest favorite o Superhost, y un objeto price. price contiene originalPrice, un discountedPrice opcional cuando la estancia tiene descuento, un qualifier como for 3 nights, y un breakdown.
Un resultado de búsqueda es intencionalmente ligero. Camas, baños, comodidades, el anfitrión y la descripción completa no están aquí; provienen de la herramienta de propiedad a continuación. No esperes un recuento de dormitorios en un resultado de búsqueda.
{
"id": "17545365",
"url": "https://www.airbnb.com/rooms/17545365",
"title": "Home in East Austin",
"latitude": 30.25741,
"longitude": -97.73366,
"description": "Downtown Casa - neighborhood feel, close to it all",
"rating": 4.87,
"reviews": 601,
"badges": ["Guest favorite"],
"price": {
"originalPrice": "$607",
"discountedPrice": "$447",
"qualifier": "for 3 nights",
"breakdown": [{ "description": "3 nights x $149.00", "price": "$447.00" }]
}
}
Obtener detalles de propiedad de Airbnb
hasdata_airbnb_property_getAirbnbPropertyDetails
Un anuncio completo, por su URL.
| Parámetro | Tipo | Obligatorio | Notas |
|---|---|---|---|
url | string | sí | Una URL de anuncio de Airbnb, el campo url de un resultado de búsqueda |
Devuelve title, un array overview como ["4 guests", "2 bedrooms", "2 beds", "2 baths"], el description completo, rating, reviews, address, latitude, longitude, un array photos, guestCapacity, un objeto host, un array amenities, y safetyAndPropertyInfo. El objeto host lleva name, isSuperhost, isVerified, el propio reviews del anfitrión, rating y yearsHosting. Cada comodidad lleva un title, un type, un description opcional y un indicador available, por lo que un filtro lee available, no asume que cada comodidad listada está presente.
{
"id": "17545365",
"title": "Downtown Casa - neighborhood feel, close to it all",
"overview": ["4 guests", "2 bedrooms", "2 beds", "2 baths"],
"rating": 4.87,
"reviews": 601,
"address": "Austin, Texas, United States",
"guestCapacity": 4,
"host": { "name": "Deanna", "isSuperhost": true, "isVerified": true, "reviews": 1273, "rating": 4.86, "yearsHosting": 11 },
"amenities": [
{ "title": "Wifi", "type": "SYSTEM_WI_FI", "available": true },
{ "title": "Free washer – In unit", "type": "SYSTEM_WASHER", "available": true }
]
}
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 coloca 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 ambas herramientas, por lo que el cliente completa su protocolo de enlace y muestra verde. La primera llamada de herramienta luego regresa con isError: true y el texto HasData API error: 401 Unauthorized. Vigila esa cadena, porque nada antes en el flujo informa el 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 una herramienta se rechaza antes de convertirse en un raspado. El servidor responde con isError: true y el texto MCP error -32602: Input validation error, nombrando el campo infractor. No se obtiene nada y no se cobra nada.
Una búsqueda sin disponibilidad devuelve un resultado exitoso con un array properties vacío, no un error. Una ubicación y un rango de fechas sin nada abierto aún regresan con requestMetadata.status establecido en ok. Comprueba la longitud del array antes de iterar.
Un anuncio que ha sido eliminado devuelve 400 con requestMetadata.status establecido en error. Una URL de una búsqueda antigua puede apuntar a una casa que ya no existe.
Los resultados que llevan datos también llevan un requestMetadata.id que vale la pena citar en soporte.
Precios, plan gratuito y límites
Cada herramienta de Airbnb cuesta 5 créditos por llamada exitosa. El tamaño de la respuesta no cambia el precio. Una página de búsqueda con docenas de estancias cuesta lo mismo que una con dos.
La prueba gratuita es de 1,000 créditos durante 30 días sin tarjeta, que son 200 llamadas de Airbnb. 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 plan gratuito indefinidamente.
Los planes de pago comienzan en $49 al mes por 200,000 créditos, que son 40,000 llamadas. El precio unitario baja con el volumen, desde $1.23 por 1,000 llamadas en el plan inicial hasta $0.50 en Business, $0.42 en Growth y $0.37 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 regresa con un código distinto de 200 no se factura. Una llamada exitosa que no encuentra nada sigue siendo una llamada.
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 alcance la incorrecta.
?apis=airbnb the two tools in this repo
?apis=airbnb,booking add Booking.com stays
?apis=airbnb,google_maps add Google Maps places
El parámetro acepta nombres de proveedores como airbnb y nombres de API individuales como airbnb_listing. 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
Airbnb no tiene una API de búsqueda pública. Su programa de API es una integración de socio y coanfitrión para gestionar tus propios anuncios, no una forma de leer el mercado. Para buscar estancias y leer anuncios arbitrarios, el raspado de las páginas públicas es la única ruta, y este servidor lo hace detrás de un esquema estable.
| API de socio de Airbnb | Este servidor | |
|---|---|---|
| Propósito | Gestionar tus propios anuncios | Leer el mercado público |
| Acceso | Aprobación de socio | Una clave y una URL |
| Búsqueda en todo el mercado | No | Sí |
| Configuración | Incorporación empresarial | Ninguna |
| Salida | Payloads de socio | JSON estructurado, precio y valoración preanalizados |
Lo que este servidor no hace. Sin reservas, sin mensajería, sin panel de anfitrión, sin datos de huéspedes. Lee lo que un visitante sin sesión puede ver.
Preguntas frecuentes
¿Existe un servidor MCP oficial de Airbnb?
Airbnb no publica uno. Este está mantenido por HasData y lee páginas públicas, por lo que no necesita cuenta de desarrollador de Airbnb.
¿Qué es un servidor MCP de Airbnb?
Un servidor que expone datos de Airbnb como herramientas que un cliente de IA puede llamar. El cliente envía una llamada de herramienta a través del Protocolo de Contexto de Modelo, el servidor obtiene los datos y devuelve JSON estructurado, y el modelo trabaja con el resultado. Este expone dos herramientas y se ejecuta de forma remota.
¿Necesito una clave de API de Airbnb o una cuenta de socio?
No. La única credencial es tu clave de HasData. No hay incorporación de socios, porque las herramientas leen páginas públicas de Airbnb.
¿Por qué el resultado de búsqueda no muestra camas o comodidades?
Porque Airbnb no las pone en la tarjeta de búsqueda. Están en la página de la propiedad, que la herramienta de detalles lee por URL. Busca para preseleccionar y luego llama a la herramienta de propiedad para obtener profundidad.
¿Puedo filtrar por huéspedes, mascotas o fechas?
Sí. La herramienta de listado toma checkIn, checkOut y los recuentos de adults, children, infants y pets, y devuelve disponibilidad y precios para ese grupo y ventana.
¿Puedo usar esto junto con otras APIs de HasData?
Sí. El parámetro apis toma una lista, y ?apis=airbnb,booking le da a tu agente Airbnb más Booking.com. Elimina el parámetro y obtienes todo.
Cumplimiento y datos personales
HasData accede solo a datos disponibles públicamente. Los términos de una plataforma pueden restringir el acceso automatizado, y tú eres responsable de tu propio cumplimiento. Cuando los datos que recopilas incluyan información personal, asegúrate de tener una base legal para ello bajo GDPR, CCPA o las reglas equivalentes en tu jurisdicción.
Enlaces de HasData
| Página de producto y constructor de solicitudes | Airbnb Scraper API |
| Documentación del servidor | MCP server docs |
| Las 57 herramientas en un solo servidor | HasData/hasdata-mcp |
| Tutoriales para clientes | MCP clients and integrations |
| Todo lo demás que extraemos | Airbnb Scraper API and 54 more |
| Planes y costos de créditos | Plans and credit costs |
| Claves y uso | HasData dashboard |
| Lanzador de Node en npm | @hasdata/airbnb-mcp |
| Lanzador de Python en PyPI | hasdata-airbnb-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=airbnb devuelve exactamente dos herramientas, que cada herramienta aún declara sus parámetros requeridos, que ningún nombre cambió y que la clave en uso realmente se acepta. Esa última verificación llama a una herramienta de verdad y cuesta 5 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 a la semana en un horario, porque la lista de herramientas ascendentes 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 aserción dice cuál.
Contribuciones
Las correcciones a las tablas de herramientas y las muestras de respuesta son la contribución más útil, porque esas son las partes que se desvían. Incluye la llamada que hiciste y la respuesta que obtuviste. Las solicitudes de extracción de bifurcaciones ejecutan la suite sin clave, y las verificaciones en vivo se omiten en lugar de ponerse en rojo.
Licencia
MIT. Ver LICENSE.