Shopify Admin API MCP Server — products, orders, customers, inventory, fulfillment, webhooks
Project description
shopify-blade-mcp
Shopify Admin API MCP server for Claude and other LLM agents. Token-efficient, security-first, Sidereal-native.
44 tools covering products, orders, customers, inventory, collections, fulfillment, discounts, metafields, webhooks, and analytics — all via GraphQL Admin API.
Why another Shopify MCP?
Shopify has three official MCPs (Storefront, Customer Accounts, Dev MCP) but none expose the Admin API — the API merchants actually use to manage their stores. Community MCPs fill the gap but lack security fundamentals:
- SecOps -- Write gating, confirm gate for destructive operations (delete product, cancel order), credential scrubbing in all error paths. No community MCP gates writes at the operation level
- Token efficiency -- Pipe-delimited lists, cursor-based pagination hints, human-readable money, null-field omission — not raw GraphQL JSON dumps that burn 10-50x more tokens
- Sidereal ecosystem --
ecommerce-v1contract with 40 operations across 4 tiers, plugin manifest, webhook HMAC verification for future dispatch integration
Comparison
| Capability | shopify-blade-mcp | @anthropic/shopify-dev-mcp | cob-shopify-mcp | Shopify Storefront MCP |
|---|---|---|---|---|
| API surface | Admin GraphQL (full) | Dev tooling only | Admin REST (59 tools) | Storefront only (buyer) |
| Token-efficient responses | Pipe-delimited, null omission | N/A (dev tools) | Raw JSON | Raw JSON |
| Write gating | Per-op env var gate | N/A | None -- all writes open | Read-only |
| Destructive op confirmation | confirm=true required |
N/A | None | N/A |
| Credential scrubbing | shpat_*, shpss_*, Bearer |
Unknown | None | None |
| GraphQL (post-REST deprecation) | Yes (native) | N/A | No (REST, deprecated Oct 2024) | Yes |
| Webhook HMAC verification | Built-in tool | No | No | No |
| Cost tracking | Per-query cost in responses | N/A | No | No |
| GID normalisation | Auto (numeric, string, or full GID) | N/A | Manual | N/A |
| Analytics (ShopifyQL) | Built-in tool | No | No | No |
| Metafield CRUD | Full (namespace filtering) | No | Partial | No |
| Tests | 171 unit tests | Unknown | Unknown | Unknown |
| Sidereal integration | ecommerce-v1 contract | None | None | None |
| Runtime | Python (uv) | Node.js (npx) | Node.js (npx) | Node.js (npx) |
Token efficiency: before and after
Typical community MCP (raw GraphQL JSON, ~1200 tokens):
{"data":{"products":{"edges":[{"node":{"id":"gid://shopify/Product/123","title":"Classic T-Shirt","handle":"classic-t-shirt","status":"ACTIVE","productType":"Shirts","vendor":"TestBrand","tags":["summer","cotton"],"createdAt":"2026-03-15T10:00:00Z","updatedAt":"2026-03-20T14:30:00Z","totalInventory":150,"tracksInventory":true,"priceRangeV2":{"minVariantPrice":{"amount":"29.99","currencyCode":"USD"},"maxVariantPrice":{"amount":"39.99","currencyCode":"USD"}}},"cursor":"abc123"}],"pageInfo":{"hasNextPage":true}}}}
shopify-blade-mcp (pipe-delimited, ~80 tokens):
Classic T-Shirt | classic-t-shirt | ACTIVE | Shirts | TestBrand | $29.99-$39.99 USD | 150 in stock | tags: summer, cotton
... 24 more (pass after="abc123" to continue)
Quick start
# Install
uv tool install shopify-blade-mcp
# Configure (stdio mode -- default)
export SHOPIFY_STORE_DOMAIN="my-store.myshopify.com"
export SHOPIFY_ACCESS_TOKEN="shpat_..."
# Run
shopify-blade-mcp
Claude Desktop / Claude Code
{
"mcpServers": {
"shopify": {
"command": "uvx",
"args": ["shopify-blade-mcp"],
"env": {
"SHOPIFY_STORE_DOMAIN": "my-store.myshopify.com",
"SHOPIFY_ACCESS_TOKEN": "shpat_..."
}
}
}
}
HTTP transport (remote/tunnel access)
export SHOPIFY_MCP_TRANSPORT="http"
export SHOPIFY_MCP_HOST="127.0.0.1"
export SHOPIFY_MCP_PORT="8770"
export SHOPIFY_MCP_API_TOKEN="your-bearer-token" # optional, enables auth
shopify-blade-mcp
Security model
Write gate
All mutating operations require SHOPIFY_WRITE_ENABLED=true. Without it, the server is read-only -- safe for analytics, auditing, and exploration.
Confirm gate
Destructive operations that are difficult or impossible to reverse require confirm=true:
- Delete product
- Cancel order
- Delete discount
- Delete metafield
- Delete webhook
Credential scrubbing
Shopify tokens (shpat_*, shpca_*, shpss_*) and Bearer tokens are scrubbed from all error messages. Credentials never leak through tool responses.
Bearer auth (HTTP transport)
When SHOPIFY_MCP_API_TOKEN is set, every HTTP request must include a matching Authorization: Bearer <token> header. Constant-time comparison via secrets.compare_digest.
GID normalisation
All tools accept flexible resource identifiers -- numeric IDs (123), plain strings, or full Shopify GIDs (gid://shopify/Product/123). Normalised automatically.
Configuration
| Variable | Required | Description |
|---|---|---|
SHOPIFY_STORE_DOMAIN |
Yes | Store domain (my-store.myshopify.com) |
SHOPIFY_ACCESS_TOKEN |
Yes | Admin API access token (shpat_...) |
SHOPIFY_API_VERSION |
No | API version (default 2025-04) |
SHOPIFY_WRITE_ENABLED |
No | Set to true to enable write operations |
SHOPIFY_WEBHOOK_SECRET |
No | Webhook signing secret for HMAC verification |
SHOPIFY_MCP_TRANSPORT |
No | stdio (default) or http |
SHOPIFY_MCP_HOST |
No | HTTP host (default 127.0.0.1) |
SHOPIFY_MCP_PORT |
No | HTTP port (default 8770) |
SHOPIFY_MCP_API_TOKEN |
No | Bearer token for HTTP transport auth |
Tools (44)
Meta (2)
| Tool | R/W | Description |
|---|---|---|
shopify_info |
R | Configuration status, connectivity, API version |
shopify_shop |
R | Store details (name, plan, domain, currency, timezone) |
Locations (1)
| Tool | R/W | Description |
|---|---|---|
shopify_locations |
R | Warehouse and retail locations with fulfillment capabilities |
Products (5)
| Tool | R/W | Description |
|---|---|---|
shopify_products |
R | List/search products (status, type, vendor, query filters) |
shopify_product |
R | Product detail with variants, images, SEO, options |
shopify_create_product |
W | Create product with variants |
shopify_update_product |
W | Update product fields |
shopify_delete_product |
W+C | Delete product (confirm required) |
Orders (7)
| Tool | R/W | Description |
|---|---|---|
shopify_orders |
R | List orders (status, financial/fulfillment status filters) |
shopify_order |
R | Order detail with line items, addresses, transactions |
shopify_search_orders |
R | Search by order name (#1001) or query string |
shopify_update_order_note |
W | Update order note |
shopify_add_order_tags |
W | Add tags to order |
shopify_close_order |
W | Close order |
shopify_cancel_order |
W+C | Cancel order (confirm required) |
Fulfillment (3)
| Tool | R/W | Description |
|---|---|---|
shopify_order_fulfillments |
R | List fulfillment orders for an order |
shopify_create_fulfillment |
W | Create fulfillment with tracking |
shopify_update_tracking |
W | Update tracking info on existing fulfillment |
Customers (5)
| Tool | R/W | Description |
|---|---|---|
shopify_customers |
R | List customers (query filter) |
shopify_customer |
R | Customer detail with addresses, orders, spend |
shopify_search_customers |
R | Search by email, name, or phone |
shopify_create_customer |
W | Create customer |
shopify_update_customer |
W | Update customer fields |
Inventory (3)
| Tool | R/W | Description |
|---|---|---|
shopify_inventory |
R | Inventory levels by location |
shopify_adjust_inventory |
W | Relative inventory adjustment (+/-) |
shopify_set_inventory |
W | Set absolute inventory quantity |
Collections (4)
| Tool | R/W | Description |
|---|---|---|
shopify_collections |
R | List collections (smart + custom) |
shopify_collection |
R | Collection detail with products |
shopify_create_collection |
W | Create custom collection |
shopify_collection_add_products |
W | Add products to collection |
Discounts (3)
| Tool | R/W | Description |
|---|---|---|
shopify_discounts |
R | List discount codes and automatic discounts |
shopify_create_discount |
W | Create basic discount code |
shopify_delete_discount |
W+C | Delete discount (confirm required) |
Metafields (3)
| Tool | R/W | Description |
|---|---|---|
shopify_metafields |
R | List metafields (owner, namespace filters) |
shopify_set_metafield |
W | Set metafield value |
shopify_delete_metafield |
W+C | Delete metafield (confirm required) |
Webhooks (3)
| Tool | R/W | Description |
|---|---|---|
shopify_webhooks |
R | List webhook subscriptions |
shopify_create_webhook |
W | Create webhook subscription |
shopify_delete_webhook |
W+C | Delete webhook (confirm required) |
Analytics (1)
| Tool | R/W | Description |
|---|---|---|
shopify_analytics |
R | Run ShopifyQL queries for sales, traffic, and inventory analytics |
Verification (1)
| Tool | R/W | Description |
|---|---|---|
shopify_verify_webhook |
R | HMAC-SHA256 webhook signature verification |
R/W legend: R = read, W = write (SHOPIFY_WRITE_ENABLED=true), W+C = write + confirm (confirm=true)
Development
make install-dev # Install with dev + test dependencies
make test # Run tests (171 tests)
make check # Lint + format check + type check
make run # Run server (stdio)
Sidereal integration
This MCP implements the ecommerce-v1 service contract with full conformance (8/8 required, 11/11 recommended, 7/7 optional, 14/14 gated operations). Registered in the Sidereal Plugin Registry as a certified plugin.
Licence
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file shopify_blade_mcp-0.2.0.tar.gz.
File metadata
- Download URL: shopify_blade_mcp-0.2.0.tar.gz
- Upload date:
- Size: 43.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
68a854bd52ad2b4f3c799288ca2aedbf5032aaa012803510cc63bec74cb9dc4d
|
|
| MD5 |
97bf137b408b232e31ac4df354c76dd2
|
|
| BLAKE2b-256 |
578adbe1fdc86fc37bc317791c41626bb933ad3b5966062323cf74165eff060d
|
Provenance
The following attestation bundles were made for shopify_blade_mcp-0.2.0.tar.gz:
Publisher:
publish.yml on Groupthink-dev/shopify-blade-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
shopify_blade_mcp-0.2.0.tar.gz -
Subject digest:
68a854bd52ad2b4f3c799288ca2aedbf5032aaa012803510cc63bec74cb9dc4d - Sigstore transparency entry: 1396182905
- Sigstore integration time:
-
Permalink:
Groupthink-dev/shopify-blade-mcp@fe672a614dee8051d0c7da10e2ad58eb4f0c50f2 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/Groupthink-dev
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@fe672a614dee8051d0c7da10e2ad58eb4f0c50f2 -
Trigger Event:
push
-
Statement type:
File details
Details for the file shopify_blade_mcp-0.2.0-py3-none-any.whl.
File metadata
- Download URL: shopify_blade_mcp-0.2.0-py3-none-any.whl
- Upload date:
- Size: 31.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a7d666bf1b9882bf9fd5756da0acf1eaba05d84be89fe177228d0b5cc32a5a28
|
|
| MD5 |
dffbfbc2b2c6b901d773491e88b0e243
|
|
| BLAKE2b-256 |
145eb1cf3cbac105d962f460a5289c423e08318c9232386dcaed6f522cdd151c
|
Provenance
The following attestation bundles were made for shopify_blade_mcp-0.2.0-py3-none-any.whl:
Publisher:
publish.yml on Groupthink-dev/shopify-blade-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
shopify_blade_mcp-0.2.0-py3-none-any.whl -
Subject digest:
a7d666bf1b9882bf9fd5756da0acf1eaba05d84be89fe177228d0b5cc32a5a28 - Sigstore transparency entry: 1396182930
- Sigstore integration time:
-
Permalink:
Groupthink-dev/shopify-blade-mcp@fe672a614dee8051d0c7da10e2ad58eb4f0c50f2 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/Groupthink-dev
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@fe672a614dee8051d0c7da10e2ad58eb4f0c50f2 -
Trigger Event:
push
-
Statement type: