Shopify MCP Server
El catálogo público de productos y colecciones de cualquier tienda Shopify, como JSON estructurado.
Documentación
Servidor MCP de Shopify
Un servidor de Protocolo de Contexto de Modelo (MCP) alojado que ofrece a Claude, Cursor, Windsurf y cualquier otro cliente MCP dos herramientas de solo lectura para Shopify. Obtén el catálogo de productos de cualquier tienda pública de Shopify mediante su URL, con variantes, SKU y precios, y lista las colecciones que lo organizan, todo como JSON estructurado, sin necesidad de instalar una aplicación ni de token de comerciante.
Lee el catálogo que un visitante sin sesión puede ver, en cualquier tienda clásica de Shopify, ya sea que esté en una dirección myshopify.com o en un dominio personalizado. Una tienda headless responde en su dominio myshopify.com.
1,000 créditos gratuitos cada mes, sin necesidad de tarjeta, lo que equivale a 200 llamadas a Shopify a la tarifa de 5 créditos.
https://mcp.hasdata.com/api/mcp?apis=shopify
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 gratuitamente sin tarjeta, y el nivel gratuito cubre unas 200 llamadas al mes a la tarifa de 5 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. Un cliente que solo hable stdio lo alcanza mediante un lanzador ligero, publicado como @hasdata/shopify-mcp en npm y hasdata-shopify-mcp en PyPI, como se muestra a continuación.
Inicio rápido
La URL del servidor es la misma para todos los clientes. Lo ejecutamos de forma práctica 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=shopify |
| 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 shopify "https://mcp.hasdata.com/api/mcp?apis=shopify" \
--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=shopify 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/shopify-mcp es ese lanzador, y lee la clave del entorno. Añade esto a claude_desktop_config.json:
{
"mcpServers": {
"shopify": {
"command": "npx",
"args": ["-y", "@hasdata/shopify-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": {
"shopify": {
"command": "uvx",
"args": ["hasdata-shopify-mcp"],
"env": { "HASDATA_API_KEY": "YOUR_KEY" }
}
}
}
Cursor
~/.cursor/mcp.json para cada proyecto, o .cursor/mcp.json para uno solo:
{
"mcpServers": {
"shopify": {
"url": "https://mcp.hasdata.com/api/mcp?apis=shopify",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}
Windsurf
~/.codeium/windsurf/mcp_config.json. Windsurf llama al campo serverUrl, no url:
{
"mcpServers": {
"shopify": {
"serverUrl": "https://mcp.hasdata.com/api/mcp?apis=shopify",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}
VS Code
.vscode/mcp.json en el espacio de trabajo:
{
"servers": {
"shopify": {
"type": "http",
"url": "https://mcp.hasdata.com/api/mcp?apis=shopify",
"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.
- Lista las colecciones en allbirds.com y dime cuáles tienen más productos.
- Obtén los primeros 250 productos de esta tienda y agrúpalos por
product_type. - ¿Qué variantes de esta tienda están agotadas ahora mismo?
- Encuentra todos los productos de esta tienda que tengan descuento, comparando
pricecontracompare_at_price. - Recorre la colección de zapatos de esta tienda y dame el rango de precios por talla.
- Compara los precios de los calcetines en estas dos tiendas de Shopify.
Una indicación que nombre una categoría en lugar de un identificador requiere dos llamadas, una para listar las colecciones y otra para obtener los productos del identificador coincidente. La herramienta de colecciones devuelve handle, y ese valor va directamente al argumento collection de la herramienta de productos.
Herramientas
Dos herramientas, 5 créditos por llamada exitosa. Ambas toman una URL de tienda y recorren los resultados con limit y page, donde limit acepta hasta 250.
Obtener productos de tienda Shopify
hasdata_shopify_products_getProducts
Una página de productos de una tienda.
| Parámetro | Tipo | Obligatorio | Notas |
|---|---|---|---|
url | string | sí | La tienda, como https://www.allbirds.com |
limit | number | Productos por página, de 1 a 250 | |
page | number | Número de página, empezando en 1 | |
collection | string | Restringir a una colección, por su identificador |
Devuelve un array products. Cada producto lleva id, title, handle, body_html, vendor, product_type, tags, published_at, created_at, updated_at, un array options que nombra los ejes en los que varían las variantes, un array images y un array variants.
El precio vive en la variante, nunca en el producto. Una variante lleva id, title, sku, price, compare_at_price, available, grams, position, requires_shipping, taxable, los valores de option1 a option3 y sus propias marcas de tiempo.
{
"id": 6889962537040,
"title": "Anytime Ankle Sock - Basin Blue",
"handle": "anytime-ankle-sock-basin-blue",
"vendor": "Allbirds",
"product_type": "Socks",
"updated_at": "2026-09-09T05:25:09-07:00",
"options": [{ "name": "Size", "position": 1, "values": ["S (W5-7)", "M (W8-10 / M8)", "L (W11 / M9-12)", "XL (M13-14)"] }],
"variants": [
{
"id": 40356485202000,
"title": "S (W5-7)",
"sku": "A10842U001",
"price": "16.00",
"compare_at_price": null,
"available": false,
"grams": 59,
"position": 1
}
],
"images": [
{
"id": 36355227844688,
"position": 1,
"src": "https://cdn.shopify.com/s/files/1/1104/4168/files/A10842_S24Q1_Anytime_Ankle_Sock_Basin_Blue_A-1400x1400.png?v=1776183348",
"width": 1400,
"height": 1400
}
]
}
Obtener colecciones de tienda Shopify
hasdata_shopify_collections_getCollections
Las colecciones que organizan una tienda.
| Parámetro | Tipo | Obligatorio | Notas |
|---|---|---|---|
url | string | sí | La tienda, como https://www.allbirds.com |
limit | number | Colecciones por página, de 1 a 250 | |
page | number | Número de página, empezando en 1 |
Devuelve un array collections. Cada entrada lleva id, title, handle, description, image, products_count, published_at y updated_at.
Esta es la taxonomía de merchandising tal como la publica la tienda, lo que la convierte en la forma más barata de ver cómo un competidor agrupa un catálogo antes de obtener cualquier producto. El handle es la clave de unión con la herramienta de productos.
{
"id": 135995326544,
"title": "Accessories",
"handle": "womens-accessories",
"description": "You know what they say: It's all in the details. Customize your look with planet-friendly face masks, hats, and more. ",
"published_at": "2019-08-05T14:01:17-07:00",
"updated_at": "2026-07-08T13:39:17-07:00",
"image": null,
"products_count": 28
}
Errores y rutas de fallo
Planifica estos en lugar de asumir un camino feliz.
price y compare_at_price son strings, no números. Llegan como "16.00", exactamente como los publica la tienda. Convierte antes de comparar o sumar, porque el orden de strings pone "9.00" por encima de "16.00".
Un producto no tiene precio propio. Cualquier cosa sobre costos tiene que pasar por el array variants, y un producto con un eje de talla o color suele tener varios precios. Leer la primera variante y llamarla el precio es el error más común aquí.
compare_at_price es null cuando no hay descuento, por lo que una comprobación de descuento es primero una prueba de null y luego una comparación.
available es por variante y refleja el momento de la llamada. Un producto no está agotado, una variante lo está, y el stock se mueve. Dos llamadas con minutos de diferencia pueden discrepar, lo cual es el punto cuando estás monitoreando, y una trampa cuando estás comparando catálogos.
Una colección puede reportar products_count de cero. Las tiendas dejan publicadas colecciones vacías, en etapas y de temporada, por lo que una colección vacía es normal en lugar de una llamada fallida.
Las tiendas publican cosas que no están a la venta. Artículos internos, retirados y en etapas están en el catálogo público de muchas tiendas, a veces marcados en el título y a veces no. Filtra lo que necesites en lugar de confiar en que cada fila es un producto activo.
Los tags son lo que el comerciante escribió. Algunas tiendas los usan como palabras clave simples, otras empujan strings de metafields con espacios de nombres. Trata el array como texto libre.
body_html es HTML. Elimínalo antes de indexar o incrustar la descripción.
collection.image suele ser null, y también lo es featured_image en una variante. Recurre al array images del producto.
Una URL que no es una tienda clásica de Shopify aún responde 200 y aún factura. No hay array products en esa respuesta y un string error en su lugar, mientras que requestMetadata.status permanece ok. Prueba el array antes de leerlo, porque la forma cambia en lugar del estado.
Una tienda headless de Shopify falla en su dominio personalizado y funciona en su dominio myshopify.com. Las tiendas headless sirven la tienda desde su propio frontend, por lo que el catálogo no se publica bajo el dominio público. Cuando una tienda que sabes que usa Shopify devuelve el string error, reinténtala como https://<shop>.myshopify.com.
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 Shopify cuesta 5 créditos por llamada exitosa. El tamaño de la respuesta no cambia el precio, por lo que una página de 250 productos y una de 3 productos cuestan lo mismo, lo que hace que la página más grande sea la forma más barata de reflejar un catálogo.
El nivel gratuito es 1,000 créditos cada mes sin tarjeta, lo que equivale a 200 llamadas a Shopify a la tarifa base. Se renueva con el ciclo de facturación, 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, lo que equivale a 40,000 llamadas. El precio unitario baja con el volumen, desde $1.23 por 1,000 llamadas en el plan de entrada 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. 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 el 429 con retroceso en cualquier cosa desatendida, porque un agente que se expande entre tiendas alcanzará el techo antes que tú.
Una solicitud que devuelve un estado 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 la indicación. Una pregunta sobre el catálogo en sí va a la herramienta de productos. Una pregunta sobre cómo está organizada la tienda, o una indicación que nombre una categoría por su nombre visible para la tienda, va primero a la herramienta de colecciones.
Luego piensa en el tamaño de página. Ambas herramientas aceptan limit hasta 250 y cuestan lo mismo en cualquier tamaño, por lo que un catálogo de 900 productos son cuatro llamadas, no noventa. Dejar limit en su valor predeterminado es el hábito más caro que puedes adquirir aquí.
Filtra del lado del servidor cuando puedas. Pasar collection a la herramienta de productos cuesta una llamada y devuelve el subconjunto, mientras que obtener todo el catálogo y filtrar localmente cuesta una llamada por página de todo lo que no querías.
Cómo se compara
La API de Administración de Shopify es la ruta oficial al catálogo de una tienda, y responde a una pregunta diferente.
| API de Administración de Shopify | Este servidor | |
|---|---|---|
| Qué tiendas | Las que posees o a las que te dieron acceso | Cualquier tienda pública |
| Configuración | Crear una aplicación, solicitar alcances, mantener un token por tienda | Un encabezado |
| Credencial por tienda | Sí | No |
| Niveles de inventario | Conteos exactos | Un indicador available por variante |
| Productos en borrador y ocultos | Devueltos | No devueltos, no son públicos |
| Pedidos y clientes | Devueltos | No devueltos |
| Costo | Gratis dentro de los límites de tarifa | De pago más allá del nivel gratuito, 5 créditos por llamada |
| La fila que lo decide todo es qué tiendas. La Admin API está diseñada para un comerciante que trabaja en su propia tienda, y necesita un token que solo ese comerciante puede emitir, lo que la descarta para compararte con diez competidores. Cuando la tienda es tuya, la Admin API es más completa y gratuita, y deberías usarla. |
FAQ
¿Shopify tiene su propio servidor MCP?
Sí, y hace algo diferente. Cada tienda elegible expone uno en su propio dominio, y sus herramientas están diseñadas para un agente que está comprando, como buscar en el catálogo, construir un carrito y realizar el pago. Es por tienda, así que un agente que compara treinta tiendas necesita treinta conexiones. Este servidor es para leer catálogos en masa a través de tiendas arbitrarias, así que los dos no se superponen. Si tu agente está comprando en una sola tienda, usa el de Shopify.
¿Qué es un servidor MCP de Shopify?
Un servidor MCP expone herramientas que un cliente de IA puede llamar. Este convierte el catálogo público de cualquier tienda Shopify en JSON sobre el que un agente puede razonar, sin un navegador o una librería de scraping en tu stack.
¿Necesito una cuenta de Shopify, una aplicación o un token de comerciante?
No. La única credencial es tu clave de HasData.
¿Funciona en dominios personalizados?
Para una tienda clásica, sí, y una tienda en su propio dominio es lo mismo que una en myshopify.com. Una tienda headless es la excepción. Su frontend es servido por algo distinto a Shopify, así que el catálogo no se publica bajo el dominio personalizado y la llamada vuelve vacía. Reintenta esas como https://<shop>.myshopify.com.
¿Cómo sé si un sitio usa Shopify?
Llama a la herramienta de productos sobre él, luego mira la forma en lugar del estado. Una tienda clásica de Shopify responde con un array products. Cualquier otra cosa responde 200 con una cadena error y sin array, y esa respuesta se factura como cualquier otra llamada exitosa.
¿Puedo obtener conteos de inventario?
No, solo el flag available que cada variante publica. Los niveles exactos de stock no son públicos, y provienen de la Admin API en una tienda que controlas.
¿Cómo extraigo un catálogo completo?
Pagina con limit a 250 y avanza page hasta que una página vuelva corta o vacía. El costo escala con las páginas, no con los productos, así que el tamaño de página más grande es siempre la ruta más barata.
¿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=shopify,amazon 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 Shopify?
No. HasData es un servicio independiente y no está afiliado, respaldado ni patrocinado por Shopify. Shopify 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 las tiendas que lees y la ley que te aplica.
Cumplimiento y datos personales
Un catálogo de productos es datos comerciales, y estas herramientas no devuelven información de clientes, pedidos o contactos. El campo vendor puede llevar el nombre propio de un autónomo en una tienda pequeña, que es el único lugar donde puede aparecer una persona. Almacenar el catálogo de un competidor es una decisión comercial más que de privacidad, así que lee los términos de la tienda de la que extraes y revisa tus propias obligaciones.
Enlaces de HasData
- Shopify Scraper API, 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, Yelp, 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=shopify devuelve el número esperado de herramientas, que ningún nombre cambió, que cada herramienta todavía declara su parámetro requerido y lleva una descripción, y que la clave en uso es realmente aceptada. Esa última comprobació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.
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 pull requests son bienvenidas para lo mismo, y para cualquier cosa en el lanzador.
Licencia
MIT, ver LICENSE.