Prototype · This site is a prototype showing 100 real servers from the official registry, not all of them yet.
PopNx MCPMCP servers for people who use AI · explained in plain words

HasData Shopify

by HasDataversion 1.0.3i★ 7iComputer or cloud
Registry namecom.hasdata/shopify

Overview

Written by PopNx MCP from the maker’s information

Reads the public product catalogue and collections of any Shopify store as tidy data, handy for watching competitors. Needs a HasData key.

Description from the maker (original English)

The public product catalogue and collections of any Shopify storefront, as structured JSON.

PopNx MCP’s three pillars

These three are never merged into one score: opinions, measurements and popularity are different things.

What you can do with it

Good for: Online sellers who want to compare products and prices with other shops

Try asking your AI

  • Get every product and price from this Shopify store
  • What collections does this shop have?
  • Compare prices of similar products between these two shops

Written by PopNx MCP from the maker’s information

Install

Pick the AI app you use, then copy the settings.

You need

  • Runs in the cloudNothing to install; it connects over the internet
  • npmNode.js installed (for the npx command)

Open Claude Desktop → Settings → Connectors → Add custom connector, and paste this address

https://mcp.hasdata.com/mcp?apis=shopify

Runs on your computer

Open Claude Desktop → Settings → Developer → Edit Config, and paste this into claude_desktop_config.json

{
  "mcpServers": {
    "shopify": {
      "command": "npx",
      "args": [
        "-y",
        "@hasdata/shopify-mcp"
      ],
      "env": {
        "HASDATA_API_KEY": "your-value"
      }
    }
  }
}

Run this in your terminal

claude mcp add --transport http shopify 'https://mcp.hasdata.com/mcp?apis=shopify' --header 'x-api-key: your-value'

Runs on your computer

Run this in your terminal

claude mcp add shopify --env HASDATA_API_KEY=your-value -- npx -y @hasdata/shopify-mcp

Paste into .cursor/mcp.json in your project, or ~/.cursor/mcp.json

{
  "mcpServers": {
    "shopify": {
      "url": "https://mcp.hasdata.com/mcp?apis=shopify",
      "headers": {
        "x-api-key": "your-value"
      }
    }
  }
}

Runs on your computer

Paste into .cursor/mcp.json in your project, or ~/.cursor/mcp.json

{
  "mcpServers": {
    "shopify": {
      "command": "npx",
      "args": [
        "-y",
        "@hasdata/shopify-mcp"
      ],
      "env": {
        "HASDATA_API_KEY": "your-value"
      }
    }
  }
}

Paste into .vscode/mcp.json in your project

{
  "servers": {
    "shopify": {
      "type": "http",
      "url": "https://mcp.hasdata.com/mcp?apis=shopify",
      "headers": {
        "x-api-key": "your-value"
      }
    }
  }
}

Runs on your computer

Paste into .vscode/mcp.json in your project

{
  "servers": {
    "shopify": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "@hasdata/shopify-mcp"
      ],
      "env": {
        "HASDATA_API_KEY": "your-value"
      }
    }
  }
}

Values you fill in

  • HASDATA_API_KEY secret required env
    HasData API key, created at app.hasdata.com. 1,000 free credits every month, no card.
  • x-api-key secret required HTTP header
    HasData API key, created at app.hasdata.com. 1,000 free credits every month, no card.

Values marked secret are keys to your account. Never share them or paste them into a chat.

These settings are generated from the maker’s registry entry. If the README says otherwise, follow the README.

Basic checksi

We check information anyone can see; we have not read the code. Checks that do not apply are left out of the count. · Checked Nov 5, 2026

  • ✓ Pass

    Maker matches the repo

    The registry name was verified against the domain hasdata.com (the registry checks domain ownership)

  • ✓ Pass

    Still maintained

    Code last changed 7 days ago

  • ✓ Pass

    Has a licence

    Uses MIT

  • ✓ Pass

    Endpoint responds

    Responded in 1891 ms (HTTP 200)

  • – Not applicable

    Sign-in with OAuth

    No sign-in needed

  • … Not checked yet

    No hidden instructions in tool descriptions

    Needs the server’s tool list first; this check starts in the next step

Compared with others in Online shops & paymentsi

  • More stars than 0% of the other 6 servers in this category
  • Published to the registry more recently than 50% of the other 6 servers in this category
  • Basic checks equal to or better than 100% of the other 6 servers in this category

Compared only with servers in this prototype, not the whole registry.

Common questions

Is HasData Shopify safe?

It passed 4 of 4 applicable basic checks. We have not read the code. Before adding a key or token, see what access the server asks for and use a key with only the permissions you need.

What keys or codes does it need?

You need to fill in: HASDATA_API_KEY, x-api-key

Does it run on my computer or in the cloud?

Either way works: install it on your computer or connect to the cloud version.

Is it still maintained?

The GitHub repo last changed 7 days ago, and the latest version (1.0.3) reached the registry 42 days ago.

Which apps can use it?

Apps that support MCP, such as Claude Desktop, Claude Code, Cursor and VS Code. It connects by URL, so apps that accept remote MCP servers work too, such as ChatGPT in developer mode.

What can I use instead?

In the same category: Spree Commerce: open-source B2B and marketplace ecommerce, Stripe MCP, MCP Cn Commerce

Alternatives

Servers in the same category from other makers, sorted by stars.

Reading a card:★ GitHub starsiThree pillars: reviews · checks · usageiUpdated = latest version published to the registryi

Stripe MCP

by stripe

Stripe’s official server lets AI view and manage customers, products, payments and invoices. Connect to Stripe’s cloud and sign in with OAuth.

Runs in the cloud★ 2,043MITUpdated 12 months ago

MCP Cn Commerce

by TonyWang-hub

8 read-only MCP platform entries; support is operation-specific; merchant live acceptance pending

Runs on your computer★ 96MITUpdated 26 days ago

README from the maker

Open the README

Copied from the maker’s repo as written. PopNx MCP has not reviewed or endorsed it. HTML, images and scripts are removed. Links lead off this site.

Shopify MCP Server

A hosted Shopify MCP server that gives Claude, Cursor, Windsurf and any other MCP client two read-only Shopify tools. Pull the product catalogue of any public Shopify storefront by its URL, with variants, SKUs and prices, and list the collections that organise it, all as structured JSON, with no app to install and no merchant token.

It reads the catalogue a signed-out visitor can see, on any classic Shopify storefront, whether it sits on a myshopify.com address or a custom domain. A headless store answers on its myshopify.com domain.

1,000 free credits every month, no card required, which is 100 Shopify calls at the 10-credit rate.

https://mcp.hasdata.com/mcp?apis=shopify

Contents

  • What you need
  • Quick start
  • Example prompts
  • Tools
  • Errors and failure paths
  • Pricing, free tier and limits
  • Tool selection
  • How it compares
  • FAQ
  • HasData links
  • Development
  • Contributing
  • License

What you need

An MCP client and a HasData API key from the dashboard, free to create with no card, and the free tier covers about 100 calls a month at the 10-credit rate. This is a remote server, so the simplest path is a URL and an x-api-key header, with no container to run. A client that only speaks stdio reaches it through a thin launcher, published as @hasdata/shopify-mcp on npm and hasdata-shopify-mcp on PyPI, shown below.

Quick start

The server URL is the same for every client. We run it hands-on in Claude Code and Claude Desktop. The other blocks follow each client's own documented format for a remote server.

FieldValue
URLhttps://mcp.hasdata.com/mcp?apis=shopify
TransportHTTP, streamable
Auth headerx-api-key: HASDATA_API_KEY

Clients with OAuth support can add the same URL as a connector and sign in without putting a key in a config file.

Claude Code

claude mcp add --transport http shopify "https://mcp.hasdata.com/mcp?apis=shopify" \

--header "x-api-key: HASDATA_API_KEY"

Claude Desktop

Settings, then Connectors, then Add custom connector, then paste https://mcp.hasdata.com/mcp?apis=shopify and sign in.

For the config-file route, Claude Desktop loads only local (stdio) servers, so it reaches a remote server through a stdio launcher. The @hasdata/shopify-mcp package is that launcher, and it reads the key from the environment. Add this to claude_desktop_config.json:

{

"mcpServers": { "shopify": { "command": "npx", "args": ["-y", "@hasdata/shopify-mcp"], "env": { "HASDATA_API_KEY": "YOUR_KEY" } } } }

For Python instead of Node, swap the launcher for the PyPI package, which uvx runs without a manual install:

{

"mcpServers": { "shopify": { "command": "uvx", "args": ["hasdata-shopify-mcp"], "env": { "HASDATA_API_KEY": "YOUR_KEY" } } } }

Cursor

~/.cursor/mcp.json for every project, or .cursor/mcp.json for one:

{

"mcpServers": { "shopify": { "url": "https://mcp.hasdata.com/mcp?apis=shopify", "headers": { "x-api-key": "HASDATA_API_KEY" } } } }

Windsurf

~/.codeium/windsurf/mcp_config.json. Windsurf calls the field serverUrl, not url:

{

"mcpServers": { "shopify": { "serverUrl": "https://mcp.hasdata.com/mcp?apis=shopify", "headers": { "x-api-key": "HASDATA_API_KEY" } } } }

VS Code

.vscode/mcp.json in the workspace:

{

"servers": { "shopify": { "type": "http", "url": "https://mcp.hasdata.com/mcp?apis=shopify", "headers": { "x-api-key": "HASDATA_API_KEY" } } } }

Example prompts

Each of these lands on one tool, or on two in sequence when the second needs a handle the first returns.

  • List the collections on allbirds.com and tell me which ones hold the most products.
  • Pull the first 250 products from this store and group them by product_type.
  • Which variants in this store are out of stock right now?
  • Find every product on this store that is discounted, comparing price against compare_at_price.
  • Page through the shoes collection on this storefront and give me the price range per size.
  • Compare the sock prices on these two Shopify stores.

A prompt that names a category rather than a handle takes two calls, one to list the collections and one to pull the products in the matching handle. The collection tool returns handle, and that value goes straight into the collection argument of the product tool.

Tools

ToolWhat it returns
hasdata_shopify_collections_getCollectionsEach collection's id, title, handle, body_html description, image, and timestamps. 10 credits a call
hasdata_shopify_products_getProductsProduct id, title, handle, vendor, product_type, tags, body_html, images, variants with prices/SKUs/inventory status, and timestamps. 10 credits a call

Two tools, 10 credits per successful call. Both take a storefront URL and page through the results with limit and page, where limit accepts up to 250.

Get Shopify store products

hasdata_shopify_products_getProducts

A page of products from one storefront.

ParameterTypeRequiredNotes
urlstringyesThe storefront, such as https://www.allbirds.com
limitnumberProducts per page, 1 to 250
pagenumberPage number, starting at 1
collectionstringRestrict to one collection, by its handle

Returns a products array. Each product carries id, title, handle, body_html, vendor, product_type, tags, published_at, created_at, updated_at, an options array naming the axes the variants vary on, an images array, and a variants array.

The price lives on the variant, never on the product. A variant carries id, title, sku, price, compare_at_price, available, grams, position, requires_shipping, taxable, the option1 through option3 values and its own timestamps.

{

"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 } ] }

Get Shopify store collections

hasdata_shopify_collections_getCollections

The collections that organise one storefront.

ParameterTypeRequiredNotes
urlstringyesThe storefront, such as https://www.allbirds.com
limitnumberCollections per page, 1 to 250
pagenumberPage number, starting at 1

Returns a collections array. Each entry carries id, title, handle, description, image, products_count, published_at and updated_at.

This is the merchandising taxonomy as the store publishes it, which makes it the cheapest way to see how a competitor groups a catalogue before pulling any products. The handle is the join key into the product tool.

{

"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 }

Errors and failure paths

Plan for these rather than assuming a happy path.

`price` and `compare_at_price` are strings, not numbers. They arrive as "16.00", exactly as the storefront publishes them. Convert before you compare or sum, because string ordering puts "9.00" above "16.00".

A product has no price of its own. Anything about cost has to go through the variants array, and a product with a size or colour axis usually has several prices. Reading the first variant and calling it the price is the most common mistake here.

`compare_at_price` is null when nothing is discounted, so a discount check is a null test first and a comparison second.

`available` is per variant and reflects the moment of the call. A product is not out of stock, a variant is, and stock moves. Two calls minutes apart can disagree, which is the point when you are monitoring, and a trap when you are diffing catalogues.

A collection can report `products_count` of zero. Stores leave empty, staged and seasonal collections published, so an empty collection is normal rather than a failed call.

Stores publish things that are not for sale. Internal, retired and staging items sit in the public catalogue on plenty of stores, sometimes flagged in the title and sometimes not. Filter on what you need instead of trusting that every row is a live product.

`tags` are whatever the merchant wrote. Some stores use them as plain keywords, others push namespaced metafield strings into them. Treat the array as free text.

`body_html` is HTML. Strip it before you index or embed the description.

`collection.image` is often null, and so is featured_image on a variant. Fall back to the product images array.

A URL that is not a classic Shopify storefront still answers 200 and still bills. There is no products array in that response and an error string in its place, while requestMetadata.status stays ok. Test for the array before you read it, because the shape changes rather than the status.

**A

Only the beginning is shown; read the rest in the repo

Ask PopNx