Spree Commerce: open-source B2B and marketplace ecommerce
Open-source B2B and marketplace ecommerce; new stores include an MCP server for AI agents.
作者による説明(英語の原文)
The public product catalogue and collections of any Shopify storefront, as structured JSON.
この3つを1つのスコアにまとめることはしません。意見、測定、人気はそれぞれ別のものだからです。
このサーバーのやさしい解説はまだ書いていません。以下はレジストリから読み取った事実です。
使っているAIアプリを選んで、設定をコピーしてください。
HASDATA_API_KEY, x-api-key「秘密」と表示された値は、あなたのアカウントの鍵です。絶対に人に教えたり、チャットに貼り付けたりしないでください。
必要なもの
どのアプリを使っていますか?
上でアプリを選んでください。選んだアプリを覚えておくので、次からはボタンに「…にインストール」と表示されます。
このアドレスはリクエストの header にキーが必要ですが、コネクタを追加するメニューでは設定できません。代わりにClaude Code、Cursor、VS Codeを使ってください。
Claude Desktop → Settings → Developer → Edit Config を開き、claude_desktop_config.json にこれを貼り付けます
{
"mcpServers": {
"shopify": {
"command": "npx",
"args": [
"-y",
"@hasdata/shopify-mcp"
],
"env": {
"HASDATA_API_KEY": "your-value"
}
}
}
}ターミナルでこれを実行します
claude mcp add --transport http shopify 'https://mcp.hasdata.com/mcp?apis=shopify' --header 'x-api-key: your-value'claude mcp add shopify --env HASDATA_API_KEY=your-value -- npx -y @hasdata/shopify-mcp動かす前に、空欄の値を入力してください。
プロジェクトの .cursor/mcp.json、または ~/.cursor/mcp.json に貼り付けます
{
"mcpServers": {
"shopify": {
"url": "https://mcp.hasdata.com/mcp?apis=shopify",
"headers": {
"x-api-key": "your-value"
}
}
}
}プロジェクトの .cursor/mcp.json、または ~/.cursor/mcp.json に貼り付けます
{
"mcpServers": {
"shopify": {
"command": "npx",
"args": [
"-y",
"@hasdata/shopify-mcp"
],
"env": {
"HASDATA_API_KEY": "your-value"
}
}
}
}ブラウザがアプリを開いてよいか確認し、そのあとアプリが設定を表示して確認を求めます。キーの値は空欄のままなので、自分で入力してください。
プロジェクトの .vscode/mcp.json に貼り付けます
{
"servers": {
"shopify": {
"type": "http",
"url": "https://mcp.hasdata.com/mcp?apis=shopify",
"headers": {
"x-api-key": "your-value"
}
}
}
}プロジェクトの .vscode/mcp.json に貼り付けます
{
"servers": {
"shopify": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@hasdata/shopify-mcp"
],
"env": {
"HASDATA_API_KEY": "your-value"
}
}
}
}ブラウザがアプリを開いてよいか確認し、そのあとアプリが設定を表示して確認を求めます。キーの値は空欄のままなので、自分で入力してください。
このアドレスはリクエストの header にキーが必要ですが、コネクタを追加するメニューでは設定できません。代わりにClaude Code、Cursor、VS Codeを使ってください。
選んだアプリは、この端末のCookieに保存されます。アカウントは不要です。
x-api-key 秘密 必須 HTTP headerこの設定は、作者のレジストリ登録情報から作成しています。READMEと違う場合は、READMEに従ってください。
ツールの名前と説明は、サーバーが2026年11月8日に返したそのままの内容です。書いたのは作者で、私たちではありません。プレーンテキストとして表示しています。
hasdata_shopify_collections_getCollectionsGet Shopify Store Collections Lists collections from any public Shopify storefront URL with limit (up to 250) and page pagination. Returns each collection's id, title, handle, description, image, and timestamps. Use the returned handles as input to the Shopify Products endpoint t
hasdata_shopify_products_getProductsGet Shopify Store Products Pulls products from any public Shopify storefront URL, optionally filtered by a collection handle, with limit (up to 250) and page pagination. Returns product id, title, handle, vendor, product_type, tags, body_html, images, variants with prices/SKUs/in
誰でも見られる情報をチェックしており、コードは読んでいません。当てはまらない項目は数に入れていません。 · 2026年11月9日にチェック
レジストリ名はドメイン hasdata.com で確認済みです(レジストリがドメインの所有を確認しています)
コードの最終更新:10 日前
MITを使用
882ミリ秒で応答(HTTP 200)
サインイン不要
2件のツールの説明を読み、AIへの隠れた指示は見つかりませんでした
レジストリでこのカテゴリにある有効なすべてのサーバーと比較しています。スターは、公開者がリポジトリの所有者である場合だけ数えます。
当てはまる基本チェック5項目のうち5項目に合格しました。コードは読んでいません。キーやトークンを追加する前に、サーバーがどんなアクセスを求めているかを確認し、必要な権限だけを持つキーを使ってください。
入力が必要なもの:HASDATA_API_KEY, x-api-key
どちらでも使えます。パソコンにインストールしても、クラウド版につないでもかまいません。
GitHubリポジトリの最終更新は10 日前、最新バージョン(1.0.3)がレジストリに届いたのは先月です。
Claude Desktop、Claude Code、Cursor、VS CodeなどのMCP対応アプリで使えます。URLでつながるので、リモートMCPサーバーに対応したアプリ(開発者モードのChatGPTなど)でも使えます。
同じカテゴリには:Spree Commerce: open-source B2B and marketplace ecommerce, Stripe MCP, MCP Cn Commerce
同じカテゴリで、ほかの作者が作ったサーバー。スターの多い順。
カードの見方:↓ 週あたりのダウンロードi★ GitHubスターi3つの柱:レビュー · チェック · 利用状況i更新=最新バージョンをレジストリに公開した日i
Open-source B2B and marketplace ecommerce; new stores include an MCP server for AI agents.
MCP server integrating with Stripe - tools for customers, products, payments, and more.
8 read-only MCP platform entries; support is operation-specific; merchant live acceptance pending
作者のリポジトリから書かれたとおりにコピーしたものです。PopNx MCPは内容を確認・推奨していません。HTML、画像、スクリプトは取り除いています。リンクはこのサイトの外へ移動します。
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
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.
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" } } } }
Each of these lands on one tool, or on two in sequence when the second needs a handle the first returns.
product_type.price against compare_at_price.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.
| 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.
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 } ] }
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 }
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