Shopify MCP Server
O catálogo público de produtos e coleções de qualquer loja Shopify, como JSON estruturado.
Documentação
Shopify MCP Server
Um servidor de Model Context Protocol (MCP) hospedado que oferece ao Claude, Cursor, Windsurf e qualquer outro cliente MCP duas ferramentas somente leitura do Shopify. Obtenha o catálogo de produtos de qualquer loja pública Shopify pela URL, com variantes, SKUs e preços, e liste as coleções que o organizam, tudo como JSON estruturado, sem precisar instalar aplicativo e sem token do lojista.
Ele lê o catálogo que um visitante desconectado pode ver, em qualquer loja Shopify clássica, esteja ela em um endereço myshopify.com ou em um domínio personalizado. Uma loja headless responde em seu domínio myshopify.com.
1.000 créditos grátis todo mês, sem cartão de crédito, o que equivale a 200 chamadas ao Shopify na taxa de 5 créditos.
https://mcp.hasdata.com/api/mcp?apis=shopify
Conteúdo
- O que você precisa
- Início rápido
- Exemplos de prompts
- Ferramentas
- Erros e caminhos de falha
- Preços, plano gratuito e limites
- Seleção de ferramentas
- Comparação
- FAQ
- Links HasData
- Desenvolvimento
- Contribuição
- Licença
O que você precisa
Um cliente MCP e uma chave de API HasData do painel, gratuita para criar sem cartão, e o plano gratuito cobre cerca de 200 chamadas por mês na taxa de 5 créditos. Este é um servidor remoto, então o caminho mais simples é uma URL e um cabeçalho x-api-key, sem container para executar. Um cliente que só fala stdio o acessa por meio de um launcher leve, publicado como @hasdata/shopify-mcp no npm e hasdata-shopify-mcp no PyPI, mostrado abaixo.
Início rápido
A URL do servidor é a mesma para todos os clientes. Nós o executamos na prática no Claude Code e no Claude Desktop. Os outros blocos seguem o formato documentado de cada cliente para um servidor remoto.
| Campo | Valor |
|---|---|
| URL | https://mcp.hasdata.com/api/mcp?apis=shopify |
| Transporte | HTTP, transmissível |
| Cabeçalho de autenticação | x-api-key: HASDATA_API_KEY |
Clientes com suporte a OAuth podem adicionar a mesma URL como conector e entrar sem colocar uma chave em um arquivo de configuração.
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
Configurações, depois Conectores, depois Adicionar conector personalizado, depois cole https://mcp.hasdata.com/api/mcp?apis=shopify e entre.
Para o caminho do arquivo de configuração, o Claude Desktop carrega apenas servidores locais (stdio), então ele acessa um servidor remoto por meio de um launcher stdio. O pacote @hasdata/shopify-mcp é esse launcher, e ele lê a chave do ambiente. Adicione isto ao claude_desktop_config.json:
{
"mcpServers": {
"shopify": {
"command": "npx",
"args": ["-y", "@hasdata/shopify-mcp"],
"env": { "HASDATA_API_KEY": "YOUR_KEY" }
}
}
}
Para Python em vez de Node, troque o launcher pelo pacote PyPI, que o uvx executa sem instalação manual:
{
"mcpServers": {
"shopify": {
"command": "uvx",
"args": ["hasdata-shopify-mcp"],
"env": { "HASDATA_API_KEY": "YOUR_KEY" }
}
}
}
Cursor
~/.cursor/mcp.json para todos os projetos, ou .cursor/mcp.json para um único:
{
"mcpServers": {
"shopify": {
"url": "https://mcp.hasdata.com/api/mcp?apis=shopify",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}
Windsurf
~/.codeium/windsurf/mcp_config.json. O Windsurf chama o campo de serverUrl, não de url:
{
"mcpServers": {
"shopify": {
"serverUrl": "https://mcp.hasdata.com/api/mcp?apis=shopify",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}
VS Code
.vscode/mcp.json no workspace:
{
"servers": {
"shopify": {
"type": "http",
"url": "https://mcp.hasdata.com/api/mcp?apis=shopify",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}
Exemplos de prompts
Cada um destes usa uma ferramenta, ou duas em sequência quando a segunda precisa de um identificador que a primeira retorna.
- Liste as coleções em allbirds.com e me diga quais têm mais produtos.
- Obtenha os primeiros 250 produtos desta loja e agrupe-os por
product_type. - Quais variantes desta loja estão sem estoque agora?
- Encontre todos os produtos desta loja que estão com desconto, comparando
pricecomcompare_at_price. - Navegue pelas páginas da coleção de sapatos desta loja e me dê a faixa de preço por tamanho.
- Compare os preços de meias nestas duas lojas Shopify.
Um prompt que nomeia uma categoria em vez de um identificador faz duas chamadas: uma para listar as coleções e outra para obter os produtos do identificador correspondente. A ferramenta de coleções retorna handle, e esse valor vai direto para o argumento collection da ferramenta de produtos.
Ferramentas
Duas ferramentas, 5 créditos por chamada bem-sucedida. Ambas aceitam uma URL de loja e navegam pelos resultados com limit e page, onde limit aceita até 250.
Obter produtos da loja Shopify
hasdata_shopify_products_getProducts
Uma página de produtos de uma loja.
| Parâmetro | Tipo | Obrigatório | Observações |
|---|---|---|---|
url | string | sim | A loja, como https://www.allbirds.com |
limit | number | Produtos por página, de 1 a 250 | |
page | number | Número da página, começando em 1 | |
collection | string | Restringir a uma coleção, pelo identificador dela |
Retorna um array products. Cada produto carrega id, title, handle, body_html, vendor, product_type, tags, published_at, created_at, updated_at, um array options nomeando os eixos em que as variantes variam, um array images e um array variants.
O preço fica na variante, nunca no produto. Uma variante carrega id, title, sku, price, compare_at_price, available, grams, position, requires_shipping, taxable, os valores de option1 a option3 e seus próprios carimbos de data/hora.
{
"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
}
]
}
Obter coleções da loja Shopify
hasdata_shopify_collections_getCollections
As coleções que organizam uma loja.
| Parâmetro | Tipo | Obrigatório | Observações |
|---|---|---|---|
url | string | sim | A loja, como https://www.allbirds.com |
limit | number | Coleções por página, de 1 a 250 | |
page | number | Número da página, começando em 1 |
Retorna um array collections. Cada entrada carrega id, title, handle, description, image, products_count, published_at e updated_at.
Esta é a taxonomia de merchandising como a loja a publica, o que a torna o caminho mais barato para ver como um concorrente agrupa um catálogo antes de obter qualquer produto. O handle é a chave de junção para a ferramenta de produtos.
{
"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
}
Erros e caminhos de falha
Planeje estes cenários em vez de assumir um caminho feliz.
price e compare_at_price são strings, não números. Eles chegam como "16.00", exatamente como a loja os publica. Converta antes de comparar ou somar, porque a ordenação de strings coloca "9.00" acima de "16.00".
Um produto não tem preço próprio. Qualquer coisa sobre custo tem que passar pelo array variants, e um produto com eixo de tamanho ou cor geralmente tem vários preços. Ler a primeira variante e chamá-la de preço é o erro mais comum aqui.
compare_at_price é nulo quando nada está com desconto, então uma verificação de desconto é primeiro um teste de nulo e depois uma comparação.
available é por variante e reflete o momento da chamada. Um produto não está sem estoque; uma variante está, e o estoque muda. Duas chamadas com minutos de diferença podem discordar, o que é o objetivo quando você está monitorando, e uma armadilha quando você está comparando catálogos.
Uma coleção pode reportar products_count de zero. Lojas deixam coleções vazias, em fase e sazonais publicadas, então uma coleção vazia é normal, não uma chamada com falha.
Lojas publicam coisas que não estão à venda. Itens internos, descontinuados e de teste ficam no catálogo público de muitas lojas, às vezes sinalizados no título e às vezes não. Filtre o que você precisa em vez de confiar que cada linha é um produto ativo.
tags são o que o lojista escreveu. Algumas lojas os usam como palavras-chave simples; outras empurram strings de metafields com namespace para eles. Trate o array como texto livre.
body_html é HTML. Remova a marcação antes de indexar ou incorporar a descrição.
collection.image geralmente é nulo, e featured_image também é em uma variante. Recorra ao array images do produto.
Uma URL que não é uma loja Shopify clássica ainda responde 200 e ainda cobra. Não há array products nessa resposta e uma string error em seu lugar, enquanto requestMetadata.status permanece ok. Teste o array antes de lê-lo, porque a forma muda, não o status.
Uma loja Shopify headless falha em seu domínio personalizado e funciona no domínio myshopify.com. Lojas headless servem a loja a partir do próprio front end, então o catálogo não é publicado sob o domínio público. Quando uma loja que você sabe que usa Shopify retorna com a string error, tente novamente como https://<shop>.myshopify.com.
Resultados que trazem dados também trazem um requestMetadata.id que vale citar no suporte.
Preços, plano gratuito e limites
Cada ferramenta Shopify custa 5 créditos por chamada bem-sucedida. O tamanho da resposta não muda o preço, então uma página de 250 produtos e uma de 3 produtos custam o mesmo, o que torna a maior página o caminho mais barato para espelhar um catálogo.
O plano gratuito é 1.000 créditos todo mês sem cartão, o que equivale a 200 chamadas Shopify na taxa base. Ele renova com o ciclo de cobrança, então um agente de baixo volume funciona no plano gratuito indefinidamente.
Os planos pagos começam em US$ 49 por mês para 200.000 créditos, o que equivale a 40.000 chamadas. O preço unitário cai com o volume, de US$ 1,23 por 1.000 chamadas no plano inicial para US$ 0,50 no Business, US$ 0,42 no Growth e US$ 0,37 nos maiores planos de alto volume.
Seu plano também define a concorrência. O plano gratuito permite 1 requisição por vez, o Startup 15, o Business 30, o Growth 50, e os planos de alto volume vão de 200 a 1.500. Repita na resposta 429 com backoff em qualquer coisa não supervisionada, porque um agente que se espalha por várias lojas atingirá o teto antes de você.
Uma requisição que retorna não-200 não é cobrada. Uma chamada bem-sucedida que não encontra nada ainda é uma chamada.
Seleção de ferramentas
Comece pelo que o prompt oferece. Uma pergunta sobre o catálogo em si vai para a ferramenta de produtos. Uma pergunta sobre como a loja é organizada, ou um prompt que nomeia uma categoria pelo nome voltado ao cliente, vai para a ferramenta de coleções primeiro.
Depois pense no tamanho da página. Ambas as ferramentas aceitam limit até 250 e custam o mesmo em qualquer tamanho, então um catálogo de 900 produtos são quatro chamadas, não noventa. Deixar limit no padrão é o hábito mais caro que você pode adquirir aqui.
Filtre no servidor quando puder. Passar collection para a ferramenta de produtos custa uma chamada e retorna o subconjunto, enquanto obter o catálogo inteiro e filtrar localmente custa uma chamada por página de tudo o que você não queria.
Comparação
A API Admin do Shopify é o caminho oficial para o catálogo de uma loja, e ela responde a uma pergunta diferente.
| API Admin do Shopify | Este servidor | |
|---|---|---|
| Quais lojas | As que você possui ou recebeu acesso | Qualquer loja pública |
| Configuração | Criar um app, solicitar escopos, manter um token por loja | Um cabeçalho |
| Credencial por loja | Sim | Não |
| Níveis de estoque | Contagens exatas | Um sinalizador available por variante |
| Produtos rascunho e ocultos | Retornados | Não retornados, não são públicos |
| Pedidos e clientes | Retornados | Não retornados |
| Custo | Grátis dentro dos limites de taxa | Pago além do plano gratuito, 5 créditos por chamada |
| A linha que decide isso é quais lojas. A Admin API é feita para um comerciante trabalhando na própria loja, e ela precisa de um token que somente esse comerciante pode emitir, o que a descarta para comparar você com dez concorrentes. Quando a loja é sua, a Admin API é mais completa e gratuita, e você deve usá-la. |
FAQ
A Shopify tem seu próprio servidor MCP?
Sim, e ele faz outra coisa. Toda loja virtual elegível expõe um no próprio domínio, e suas ferramentas são feitas para um agente que está comprando, como pesquisar o catálogo, montar um carrinho e finalizar uma compra. Ele é por loja, então um agente comparando trinta lojas precisa de trinta conexões. Este servidor é para ler catálogos em massa em lojas arbitrárias, então os dois não se sobrepõem. Se o seu agente está comprando de uma única loja, use o da Shopify.
O que é um servidor MCP da Shopify?
Um servidor MCP expõe ferramentas que um cliente de IA pode chamar. Este transforma o catálogo público de qualquer loja virtual Shopify em JSON sobre o qual um agente pode raciocinar, sem um navegador ou uma biblioteca de scraping na sua stack.
Preciso de uma conta Shopify, um aplicativo ou um token de comerciante?
Não. A única credencial é a sua chave HasData.
Funciona em domínios personalizados?
Para uma loja virtual clássica, sim, e uma loja no próprio domínio é igual a uma em myshopify.com. Uma loja headless é a exceção. O front end dela é servido por algo que não é a Shopify, então o catálogo não é publicado sob o domínio personalizado e a chamada retorna vazia. Tente novamente essas como https://<shop>.myshopify.com.
Como saber se um site usa Shopify?
Chame a ferramenta de produto nele e observe a forma em vez do status. Uma loja virtual clássica da Shopify responde com um array products. Qualquer outra coisa responde 200 com uma string error e sem array, e essa resposta é cobrada como qualquer outra chamada bem-sucedida.
Posso obter contagens de estoque?
Não, apenas o sinalizador available que cada variante publica. Níveis exatos de estoque não são públicos, e eles vêm da Admin API em uma loja que você controla.
Como puxo um catálogo inteiro?
Paginação com limit em 250 e passo page até que uma página retorne curta ou vazia. O custo escala com páginas, não com produtos, então o maior tamanho de página é sempre a rota mais barata.
Posso usar isso junto com outras APIs HasData?
Sim. Uma chave cobre tudo, e um endpoint atende a todos através do parâmetro apis. Aponte um cliente para ?apis=shopify,amazon para obter ambos os conjuntos de ferramentas em uma conexão, ou para mcp.hasdata.com/api/mcp para o catálogo completo.
A HasData é afiliada à Shopify?
Não. A HasData é um serviço independente e não é afiliada, endossada ou patrocinada pela Shopify. Shopify é uma marca registrada do seu respectivo proprietário. As ferramentas trabalham apenas com dados publicamente disponíveis, e você é responsável por usar os resultados de acordo com os termos das lojas que lê e a lei que se aplica a você.
Conformidade e dados pessoais
Um catálogo de produtos é dado comercial, e estas ferramentas não retornam informações de clientes, pedidos ou contatos. O campo vendor pode carregar o nome de um profissional autônomo em uma loja pequena, que é o único lugar onde uma pessoa pode aparecer. Armazenar o catálogo de um concorrente é uma decisão comercial em vez de uma questão de privacidade, então leia os termos da loja da qual você está puxando e verifique suas próprias obrigações.
Links HasData
- Shopify Scraper API, os endpoints REST por trás destas ferramentas
- Documentação da API
- Documentação do servidor MCP
- Preços
- Painel
Outros servidores MCP HasData: Google Search, Google Maps, Google Trends, Google Flights, DuckDuckGo, YouTube, TikTok, Instagram, Amazon, Yelp, Zillow, Airbnb, Booking.com, Indeed.
Desenvolvimento
O lançador é uma ponte stdio fina para o servidor remoto, então não há nada para compilar.
npm install
HASDATA_API_KEY=your_key_here npm test
Os testes em test/ verificam o contrato da ferramenta, a parte que pode quebrar sem um commit aqui. Eles verificam que ?apis=shopify retorna a contagem esperada de ferramentas, que nenhum nome mudou, que toda ferramenta ainda declara seu parâmetro obrigatório e carrega uma descrição, e que a chave em uso é realmente aceita. Essa última verificação chama uma ferramenta de verdade e custa 5 créditos, que é o preço de um canário que pode falhar pelo motivo certo.
A suíte de contrato também roda semanalmente em um agendamento, porque a lista de ferramentas upstream pode mudar sem que ninguém toque neste repositório.
Contribuindo
Uma tabela de ferramentas, uma amostra de resposta ou um comportamento documentado que não corresponde à realidade vale uma issue. Há um modelo exatamente para isso. Pull requests são bem-vindos para o mesmo e para qualquer coisa no lançador.
Licença
MIT, veja LICENSE.