Open-source B2B and marketplace ecommerce; new stores include an MCP server for AI agents.
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.
- User voiceiNo reviews yetReviews open together with accounts in a later step
- Our basic checksi4 of 4 passedChecked from public information; code not scanned yet
- UsageiVery new★ 7
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=shopifyRuns 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-mcpPaste 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, created at app.hasdata.com. 1,000 free credits every month, no card.
x-api-keysecret required HTTP headerHasData 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
Stripe’s official server lets AI view and manage customers, products, payments and invoices. Connect to Stripe’s cloud and sign in with OAuth.
MCP Cn Commerce
8 read-only MCP platform entries; support is operation-specific; merchant live acceptance pending
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.
| Field | Value |
|---|---|
| URL | https://mcp.hasdata.com/mcp?apis=shopify |
| Transport | HTTP, streamable |
| Auth header | x-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
priceagainstcompare_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
| Tool | What it returns |
|---|---|
hasdata_shopify_collections_getCollections | Each collection's id, title, handle, body_html description, image, and timestamps. 10 credits a call |
hasdata_shopify_products_getProducts | Product 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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
url | string | yes | The storefront, such as https://www.allbirds.com |
limit | number | Products per page, 1 to 250 | |
page | number | Page number, starting at 1 | |
collection | string | Restrict 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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
url | string | yes | The storefront, such as https://www.allbirds.com |
limit | number | Collections per page, 1 to 250 | |
page | number | Page 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