Yelp MCP Server
Búsqueda de negocios en Yelp, detalles de lugares y el feed completo de reseñas, como JSON estructurado.
Documentación
Servidor MCP de Yelp
Un servidor de Protocolo de Contexto de Modelo (MCP) alojado que brinda a Claude, Cursor, Windsurf y cualquier otro cliente MCP tres herramientas de solo lectura de Yelp. Busca negocios por palabra clave y ubicación, lee un negocio completo y recorre su feed de reseñas completo, todo como JSON estructurado, sin clave de Yelp Fusion y sin nada que alojar.
Lee páginas públicas de Yelp que un visitante sin sesión puede ver, en cualquiera de los 41 dominios regionales.
1,000 créditos gratis cada mes, sin tarjeta requerida, lo que equivale a 100 llamadas a Yelp a la tarifa de 10 créditos.
https://mcp.hasdata.com/api/mcp?apis=yelp
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, gratis de crear sin tarjeta, y el nivel gratuito cubre alrededor de 100 llamadas al mes a la tarifa de 10 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. Un cliente que solo habla stdio lo alcanza a través de un lanzador ligero, publicado como @hasdata/yelp-mcp en npm y hasdata-yelp-mcp en PyPI, que se muestra a continuación.
Inicio rápido
La URL del servidor es la misma para cada cliente. Lo ejecutamos de forma práctica en Claude Code y Claude Desktop. Los otros bloques siguen el formato documentado de cada cliente para un servidor remoto.
| Campo | Valor |
|---|---|
| URL | https://mcp.hasdata.com/api/mcp?apis=yelp |
| Transporte | HTTP, transmisible |
| Encabezado de autenticación | x-api-key: HASDATA_API_KEY |
Los clientes con soporte OAuth pueden agregar 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 yelp "https://mcp.hasdata.com/api/mcp?apis=yelp" \
--header "x-api-key: HASDATA_API_KEY"
Claude Desktop
Configuración, luego Conectores, luego Agregar conector personalizado, luego pega https://mcp.hasdata.com/api/mcp?apis=yelp e inicia sesión.
Para la ruta de archivo de configuración, Claude Desktop carga solo servidores locales (stdio), por lo que alcanza un servidor remoto a través de un lanzador stdio. El paquete @hasdata/yelp-mcp es ese lanzador, y lee la clave del entorno. Agrega esto a claude_desktop_config.json:
{
"mcpServers": {
"yelp": {
"command": "npx",
"args": ["-y", "@hasdata/yelp-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": {
"yelp": {
"command": "uvx",
"args": ["hasdata-yelp-mcp"],
"env": { "HASDATA_API_KEY": "YOUR_KEY" }
}
}
}
Cursor
~/.cursor/mcp.json para cada proyecto, o .cursor/mcp.json para uno:
{
"mcpServers": {
"yelp": {
"url": "https://mcp.hasdata.com/api/mcp?apis=yelp",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}
Windsurf
~/.codeium/windsurf/mcp_config.json. Windsurf llama al campo serverUrl, no url:
{
"mcpServers": {
"yelp": {
"serverUrl": "https://mcp.hasdata.com/api/mcp?apis=yelp",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}
VS Code
.vscode/mcp.json en el espacio de trabajo:
{
"servers": {
"yelp": {
"type": "http",
"url": "https://mcp.hasdata.com/api/mcp?apis=yelp",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}
Ejemplos de indicaciones
Cada una de estas aterriza en una herramienta, o en dos en secuencia cuando la segunda necesita un identificador que la primera devuelve.
- Encuentra tostadores de café en Austin, TX y clasifícalos por calificación frente al número de reseñas.
- Obtén el horario, el teléfono y el sitio web del negocio de Yelp
desnudo-coffee-austin. - Lee cada reseña de una y dos estrellas de este negocio y agrupa las quejas por tema.
- ¿Qué platos lista Yelp como populares para este lugar, y qué dicen los reseñadores sobre ellos?
- Compara la distribución de calificaciones de estos tres competidores en el mismo vecindario.
- Muéstrame las reseñas que Yelp no recomienda para este negocio y cómo difieren de las recomendadas.
Una indicación que nombra un negocio en lugar de un ID de Yelp requiere dos llamadas: una búsqueda para resolver el ID y una consulta de lugar o reseñas para leerlo. La herramienta de búsqueda devuelve tanto placeId como placeAlias, y cualquiera de los dos funciona como el argumento placeId para la herramienta de lugar.
Herramientas
Tres herramientas, 10 créditos por llamada exitosa. Cada herramienta acepta domain para cambiar de país, uno de 41 valores, desde www.yelp.com hasta los sitios europeos, asiáticos y latinoamericanos, incluidas las variantes específicas de idioma como fr.yelp.ca y zh.yelp.com.hk.
Obtener resultados de búsqueda de Yelp
hasdata_yelp_search_getSearchResults
Una página de negocios para una palabra clave en un lugar.
| Parámetro | Tipo | Requerido | Notas |
|---|---|---|---|
keyword | string | sí | Qué buscar, como coffee |
location | string | sí | Dónde buscar, como Austin, TX |
l | string | Cuadro delimitador del mapa en lugar de un radio, como g:lon1,lat1,lon2,lat2 | |
domain | string | Sitio de Yelp, por defecto www.yelp.com | |
start | number | Desplazamiento de resultados, avanzando de 10 en 10 |
Devuelve searchInformation con el keyword repetido, location y totalResults, un array ads de ubicaciones pagadas, un array organicResults, y pagination con currentPage, perPage, totalPages, nextPageUrl y otherPagesUrls.
Los dos arrays de resultados no tienen la misma forma. Un resultado orgánico lleva position y streetAddress, mientras que un anuncio no lleva ninguno y agrega phone y un array highlights de las insignias que Yelp muestra a los anunciantes. Fusionar los arrays sin verificar de cuál proviene un negocio convierte la ubicación pagada en rango.
{
"position": 2,
"placeId": "oiJ7QuhhpsEpe9zFTZF0bA",
"placeAlias": "desnudo-coffee-austin",
"url": "https://www.yelp.com/biz/desnudo-coffee-austin",
"title": "Desnudo Coffee",
"streetAddress": "2505 Webberville Rd, Austin",
"price": "$$",
"categories": [{ "title": "Coffee Roasteries", "url": "https://www.yelp.com/search?find_desc=Coffee+Roasteries&find_loc=Austin%2C+TX" }],
"snippet": "My favorite coffee shop to go to ever! Everyone must go. [[HIGHLIGHT]]Great coffee[[ENDHIGHLIGHT]], great vibes,great customer...",
"rating": 4.7,
"reviews": 347,
"thumbnail": "https://s3-media0.fl.yelpcdn.com/bphoto/0nE_IcbRiyxrw3kk2z6owg/ls.jpg",
"allImagesUrl": "https://www.yelp.com/biz_photos/oiJ7QuhhpsEpe9zFTZF0bA"
}
Obtener detalles del lugar de Yelp
hasdata_yelp_place_getPlaceDetails
Un negocio completo.
| Parámetro | Tipo | Requerido | Notas |
|---|---|---|---|
placeId | string | sí | Un ID de Yelp como oiJ7QuhhpsEpe9zFTZF0bA, o un alias como desnudo-coffee-austin |
domain | string | Sitio de Yelp, por defecto www.yelp.com |
Devuelve un objeto placeResult con name, url, address, neighborhoods, country, phone, website, price, categories, rating, reviews, isClaimed y isClaimable, un objeto operationHours que contiene una semana de hours más today, un array features, un objeto menu con popularDishes, un array faqs de preguntas que los lectores de Yelp hicieron y respondieron, un array reviewHighlights de las frases que Yelp fija en la parte superior de la página, un array images, y businessMap, una URL de imagen de mapa estático.
features es el bloque de comodidades, y cada entrada lleva un title y un indicador isActive, por lo que una entrada falsa significa que Yelp declara que la comodidad está ausente en lugar de desconocida. Esa diferencia importa al filtrar, porque eliminar las entradas falsas y eliminar las faltantes no son la misma consulta.
{
"name": "Desnudo Coffee",
"url": "https://www.yelp.com/biz/desnudo-coffee-austin",
"address": "2505 Webberville Rd Austin, TX 78702",
"neighborhoods": "East Austin",
"country": "US",
"phone": "(424) 400-1857",
"website": "http://www.desnudocoffee.com",
"price": "$$",
"categories": ["Coffee Roasteries"],
"rating": 4.7,
"reviews": 347,
"isClaimed": true,
"isClaimable": false,
"operationHours": { "hours": [{ "day": "Mon", "hours": ["7:00 AM - 2:00 PM"] }] },
"features": [
{ "title": "Offers delivery", "isActive": true },
{ "title": "ADA-compliant restroom", "isActive": false }
],
"menu": {
"section": "Popular Drinks",
"popularDishes": [{ "name": "Brown Sugar Miso Latte", "rating": 4.7, "reviews": 113, "photos": 71 }]
}
}
Obtener reseñas del lugar de Yelp
hasdata_yelp_reviews_getPlaceReviews
El feed de reseñas de un negocio, en texto completo, con ordenamiento, filtrado y paginación.
| Parámetro | Tipo | Requerido | Notas |
|---|---|---|---|
placeId | string | sí | El ID de Yelp del negocio |
domain | string | Sitio de Yelp, por defecto www.yelp.com | |
sortBy | string | relevanceDesc (por defecto), dateDesc, dateAsc, ratingDesc, ratingAsc o elitesDesc | |
rating | string | Conserva solo estas calificaciones de estrellas, como 5 o 1,2 | |
query | string | Búsqueda de texto libre dentro de las reseñas | |
languageCode | string | Idioma de dos letras de las reseñas, por defecto en | |
notRecommended | boolean | Devuelve el feed que Yelp filtra en lugar del recomendado | |
start | number | Desplazamiento, avanzando de num | |
num | number | Tamaño de página, 49 como máximo, y 49 por defecto | |
nextPageToken | string | Cursor tomado textualmente de la respuesta anterior |
Devuelve searchInformation con el nombre del negocio, alias, URL, totalResults, rating, un array reviewCountsByRating y un desglose reviewCountsByLanguage, un objeto pagination, y un array reviews.
Cada reseña lleva position, id, link, un objeto user, un objeto comment que contiene text y su language detectado, date, rating, y, cuando el reseñador los adjuntó, photos, videos y reactions. El objeto user informa name, userId, address, reviews de por vida, recuentos de friends y photos, y eliteYear para un miembro de Yelp Elite.
Una reseña que el autor reescribió más tarde también lleva previousReviews, que contiene la versión anterior con su propio texto, calificación y fecha. Ese es el campo a leer cuando la pregunta es si una calificación cambió, porque la reseña actual por sí sola no puede responderla.
{
"position": 1,
"id": "7zLIm3c2v2hRBVmgaKkR7w",
"link": "https://www.yelp.com/biz/desnudo-coffee-austin?hrid=7zLIm3c2v2hRBVmgaKkR7w",
"user": {
"name": "Karson S.",
"userId": "3LxSs_dQ37-LBRz07EDbyg",
"address": "Austin, TX",
"reviews": 374,
"friends": 61,
"photos": 875,
"eliteYear": "26"
},
"comment": { "text": "Coming back to Desnudo to update my old review...", "language": "en" },
"date": "2026-08-20T17:33:47-05:00",
"rating": 5,
"photos": [{ "link": "https://s3-media0.fl.yelpcdn.com/bphoto/YbjFKmRf7j0ejQQSaqtqVw/o.jpg", "caption": "Matcha latte", "width": 1126, "height": 2000 }],
"reactions": [{ "type": "HELPFUL", "label": "Helpful", "count": 1 }],
"previousReviews": [{ "id": "0WNI2IG7K1_Dg9zdXm03SA", "rating": 4, "comment": { "text": "..." } }]
}
Errores y rutas de fallo
Planifica estos en lugar de asumir un camino feliz.
Una búsqueda sin coincidencias devuelve un resultado exitoso con un array organicResults vacío, no un error. requestMetadata.status sigue siendo ok. Prueba la longitud del array antes de iterar.
snippet es texto marcado, no texto limpio. Yelp envuelve las palabras coincidentes en [[HIGHLIGHT]] y [[ENDHIGHLIGHT]], y esos marcadores llegan textualmente. Elimínalos antes de indexar, incrustar o mostrar el fragmento.
Las URL de categorías llegan con escape HTML. El url dentro de una entrada categories contiene & en lugar de un ampersand simple, porque así está en la página. Deshaz el escape antes de seguir el enlace.
rating y query no se combinan en la herramienta de reseñas. Yelp ignora el filtro de estrellas mientras se ejecuta una consulta de texto libre, por lo que una búsqueda filtrada regresa con reseñas de cada calificación. Filtra el resultado tú mismo cuando necesites ambos.
start y nextPageToken son dos formas diferentes de paginar, y no se mezclan. Pasa uno u otro. El token lleva tanto el desplazamiento como el tamaño de página, por lo que reenviarlo solo continúa el feed, mientras que start necesita que num permanezca constante entre llamadas.
El feed no recomendado es un feed diferente con límites diferentes. Establecer notRecommended devuelve reseñas que Yelp filtró de la lista principal, y esas vienen de diez en diez en lugar de 49, sin fotos, videos o reacciones adjuntas.
Un negocio puede no estar reclamado, y una página no reclamada es escasa. isClaimed falso generalmente significa sin sitio web, sin horario y sin comodidades, porque nadie los completó. Lee el indicador antes de tratar un campo faltante como un fallo de scraping.
Los resultados que llevan datos también llevan un requestMetadata.id que vale la pena citar en soporte.
Precios, nivel gratuito y límites
Cada herramienta de Yelp cuesta 10 créditos por llamada exitosa. El tamaño de la respuesta no cambia el precio, por lo que una página de 49 reseñas y una de 5 reseñas cuestan lo mismo, lo que hace que la página más grande sea la forma más barata de leer un feed.
El nivel gratuito es 1,000 créditos cada mes sin tarjeta, lo que equivale a 100 llamadas a Yelp a la tarifa base. Se renueva con el ciclo de facturación, por lo que un agente de bajo volumen se ejecuta en el nivel gratuito indefinidamente. Los planes de pago comienzan en $49 al mes por 200,000 créditos, lo que equivale a 20,000 llamadas. El precio unitario baja con el volumen, desde $2.45 por cada 1,000 llamadas en el plan inicial hasta $1.00 en Business, $0.84 en Growth y $0.74 en los planes de alto volumen más grandes.
Tu plan también define la concurrencia. El nivel gratuito permite 1 solicitud a la vez, Startup 15, Business 30, Growth 50, y los planes de alto volumen van de 200 a 1,500. Reintenta con retroceso en el error 429 en cualquier proceso desatendido, porque un agente que se despliega sobre una lista de negocios alcanzará el límite antes que tú.
Una solicitud que devuelve un código distinto de 200 no se factura. Una llamada exitosa que no encuentra nada sigue siendo una llamada.
Selección de herramientas
Empieza por lo que te da el prompt. Una palabra clave y un lugar van a la herramienta de búsqueda, un ID o alias de Yelp va directamente a la herramienta de lugar, y una pregunta sobre lo que dijeron los clientes va a la herramienta de reseñas. Gastar una llamada de búsqueda para llegar a un ID que ya tienes es el desperdicio más común.
Luego elige según lo que pregunta la pregunta. La herramienta de lugar responde preguntas sobre el negocio en sí, sus horarios, servicios, nivel de precio y calificación principal. La herramienta de reseñas responde preguntas sobre sus clientes, y es la única que devuelve el texto de las reseñas, los autores y la distribución de calificaciones. El bloque reviewHighlights en la herramienta de lugar es una muestra que Yelp selecciona, no un sustituto del feed.
Lee el feed con la página más grande. num ya tiene como valor predeterminado su máximo de 49, así que déjalo solo a menos que estés muestreando deliberadamente.
Cómo se compara
La propia API Fusion de Yelp es la ruta oficial a estos datos, y es un instrumento diferente.
| API Fusion de Yelp | Este servidor | |
|---|---|---|
| Elegibilidad | Una aplicación de desarrollador aprobada | Una clave de API |
| Texto de reseñas | Hasta tres por negocio, truncadas | El feed completo, texto completo, paginado |
| Autores de reseñas | Nombre y foto | Nombre, ubicación, conteos de por vida, año Elite |
| Distribución de calificaciones | No se devuelve | reviewCountsByRating en cada llamada |
| Reseñas filtradas | No se devuelven | El feed de no recomendadas |
| Historial de ediciones | No se devuelve | previousReviews cuando una reseña fue reescrita |
| Servicios y horarios | Un conjunto de atributos limitado | El bloque de servicios tal como lo muestra la página |
La fila que lo decide es el texto de las reseñas. Fusion devuelve tres extractos por negocio, lo que responde una pregunta de visualización en un escaparate y no puede responder una pregunta de análisis sobre sentimiento, quejas o cómo cambió una calificación. Cuando tres extractos y un contrato oficial son lo que necesitas, Fusion es la mejor opción.
Preguntas frecuentes
¿Existe un servidor MCP oficial de Yelp?
Yelp no publica uno. Este es mantenido por HasData y lee páginas públicas de Yelp.
¿Qué es un servidor MCP de Yelp?
Un servidor MCP expone herramientas que un cliente de IA puede llamar. Este convierte los resultados de búsqueda de Yelp, las páginas de negocios y los feeds de reseñas en JSON sobre el que un agente puede razonar, sin un navegador ni una biblioteca de scraping en tu stack.
¿Necesito una cuenta de Yelp o una clave de Fusion?
No. La única credencial es tu clave de HasData.
¿Qué sitios de Yelp están cubiertos?
Los 41 dominios que acepta la API, desde www.yelp.com hasta los sitios europeos, asiáticos y latinoamericanos. Varios países tienen más de uno, divididos por idioma, como fr.yelp.ca junto a www.yelp.ca. Pasa domain para cambiar.
¿Puedo obtener todas las reseñas de un negocio?
Sí, paginando. El feed devuelve 49 a la vez, y pagination.hasNextPage te dice cuándo detenerte. Leer un negocio con 347 reseñas toma ocho llamadas.
¿Cuál es la diferencia entre reseñas recomendadas y no recomendadas?
Yelp ejecuta software que oculta algunas reseñas del feed principal. La respuesta predeterminada es el feed recomendado, el que ve un visitante. Configurar notRecommended devuelve el oculto en su lugar, que es más pequeño, paginado de diez en diez, y sin fotos ni reacciones.
¿Por qué mi filtro de calificación devolvió todas las calificaciones?
Porque se configuró un query al mismo tiempo. Yelp elimina el filtro de estrellas cuando ejecuta una búsqueda de texto, por lo que no se pueden combinar en el lado del servidor.
¿Puedo usar esto junto con otras APIs de HasData?
Sí. Una clave cubre todo, y un endpoint las sirve todas a través del parámetro apis. Apunta un cliente a ?apis=yelp,google_maps para obtener ambos conjuntos de herramientas en una conexión, o a mcp.hasdata.com/api/mcp para el catálogo completo.
¿HasData está afiliado a Yelp?
No. HasData es un servicio independiente y no está afiliado, respaldado ni patrocinado por Yelp. Yelp es una marca comercial de su respectivo propietario. Las herramientas trabajan solo con datos disponibles públicamente, y eres responsable de usar los resultados de acuerdo con los términos de Yelp y la ley que te aplica.
Cumplimiento y datos personales
Las herramientas de reseñas devuelven datos personales. Una reseña lleva el nombre visible del autor, foto de perfil, ubicación declarada, ID de usuario y un enlace a su perfil, y los reseñadores son individuos privados en lugar de negocios. Eso pone la respuesta en el ámbito del GDPR y la CCPA de una manera que un listado de negocio no lo está. Decide qué necesitas antes de almacenarlo, consérvalo no más tiempo del que requiere el propósito, y verifica tus propias obligaciones. El análisis agregado rara vez necesita los campos de autor.
Enlaces de HasData
- API de Yelp Scraper, los endpoints REST detrás de estas herramientas
- Documentación de la API
- Documentación del servidor MCP
- Precios
- Panel de control
Otros servidores MCP de HasData: Google Search, Google Maps, Google Trends, Google Flights, DuckDuckGo, YouTube, TikTok, Instagram, Amazon, Zillow, Airbnb, Booking.com, Indeed.
Desarrollo
El lanzador es un puente stdio delgado hacia el servidor remoto, así que no hay nada que compilar.
npm install
HASDATA_API_KEY=your_key_here npm test
Las pruebas en test/ verifican el contrato de las herramientas, la parte que puede romperse sin un commit aquí. Comprueban que ?apis=yelp devuelve el número esperado de herramientas, que ningún nombre cambió, que cada herramienta todavía declara sus parámetros requeridos y lleva una descripción, y que la clave en uso es realmente aceptada. Esa última verificación llama a una herramienta de verdad y cuesta 10 créditos, que es el precio de un canario que puede fallar por la razón correcta.
La suite de contrato también se ejecuta semanalmente en un horario, porque la lista de herramientas upstream puede cambiar sin que nadie toque este repositorio.
Contribuciones
Una tabla de herramientas, una muestra de respuesta o un comportamiento documentado que no coincide con la realidad merece un issue. Hay una plantilla exactamente para eso. Las solicitudes de extracción son bienvenidas para lo mismo, y para cualquier cosa en el lanzador.
Licencia
MIT, ver LICENCIA.