shopify-admin-mcp-server
Provides tools for interacting with the Shopify Admin GraphQL API, enabling management of orders, products, variants, media, inventory and per-location fulfilment by SKU, customers, collections, discounts, abandoned checkouts, blog content, pages, metafields, bulk variant updates, and analytics.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@shopify-admin-mcp-servercheck where SKU TSHIRT-BLK-M is stocked"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Shopify MCP Server v4.0.1
Shopify Admin GraphQL API 2026-01 MCP server. 54 tools aligned to the OAuth scopes actually granted on the token — orders, products, variants, media, inventory & per-location fulfilment, customers, collections, discounts, abandoned checkouts, blog content, pages, metafields, bulk variant updates, and analytics.
Every GraphQL operation is validated against the 2026-01 schema, and all 24 read tools plus the inventory write tools are verified against a live store.
npx -y shopify-admin-mcp-serverRequires SHOPIFY_STORE_DOMAIN and SHOPIFY_ACCESS_TOKEN. Full setup in Setup.
Location fulfilment by SKU
The headline capability: turn a location's ability to stock and fulfil a variant on or off, addressed by SKU rather than by GID.
shopify_get_variant_locations { sku: "TSHIRT-BLK-M" }
→ active_locations: where it IS stocked, with available/on_hand/committed/incoming,
plus can_deactivate and any deactivation_blocked_reason
→ inactive_locations: where it is NOT stocked
→ inventory_item_id: for the stock tools below
shopify_set_variant_locations {
sku: "TSHIRT-BLK-M",
locations: [
{ location: "Melbourne Warehouse", activate: true }, // by name or GID
{ location: "Pop-up Store", activate: false }
]
}Backed by inventoryBulkToggleActivation, so multiple locations are applied in one call. Activating starts the location at 0 available — follow with shopify_set_inventory.
Deactivation is destructive: it discards that location's stock for the variant. Shopify refuses when the variant has committed stock or pending fulfilments there. Check can_deactivate first.
Guardrails: a SKU that matches zero or more than one variant is rejected rather than guessed at, and an unknown location name lists the valid ones.
Related MCP server: Shopify MCP Server
Tools (54)
Shop & Orders
Tool | Scopes | Description |
| — | Store info: name, domain, plan, currency, timezone |
|
| List orders in a date range with financials and line items |
|
| Single order by GID: addresses, fulfillments, refunds |
|
| Auto-paginated aggregate: revenue, AOV, product breakdown |
|
| Lightweight count for a date range |
Inventory & Locations
Tool | Scopes | Description |
|
| All store locations with addresses |
|
| By SKU: which locations stock/fulfil a variant, and which don't |
|
| By SKU: activate/deactivate fulfilment at locations |
|
| Quantities per location for a variant GID |
|
| Change stock by a delta ("we sold 3") |
|
| Set stock to an exact value, with compare-and-set |
|
| Move stock between locations transactionally |
|
| Per-SKU settings: tracked, unit cost, HS/HTS code, country of origin |
Customs / HTS data
shopify_update_inventory_item sets the customs fields Shopify needs before it will generate international
shipping labels — harmonizedSystemCode (6–13 digits; 6110.20.20 and 61102020 are both accepted),
countryCodeOfOrigin, provinceCodeOfOrigin, and per-destination countryHarmonizedSystemCodes overrides.
Country codes are case-insensitive. Read the current values back under customs in
shopify_get_variant_locations.
shopify_set_inventory defaults to compare-and-set: pass compareQuantity and Shopify rejects the write if
someone changed the value underneath you. ignoreCompareQuantity: true forces it, at the risk of clobbering a
concurrent update.
Bulk variant updates
Tool | Scope | What it does |
|
| Apply customs, cost, pricing, identifier and weight changes to many variants at once |
|
| Report which variants are missing HS codes or country of origin |
Select variants with skus, productIds, query, onlyMissingHsCode or onlyMissingOrigin,
combined with AND. The common customs backfill is one call:
onlyMissingHsCode: true, harmonizedSystemCode: "611030", countryCodeOfOrigin: "AU"dryRun defaults to true when price or compareAtPrice is set and false otherwise, so
pricing changes need an explicit dryRun: false. maxVariants (default 500) refuses rather than
truncating. sku cannot be changed in bulk.
Analytics & marketing
Tool | Scope | What it does |
|
| Run a ShopifyQL query and get a table back |
|
| Campaign/post events with UTM parameters |
|
| One customer's activity timeline |
Marketing events are only populated when a marketing integration publishes to Shopify; an empty list means none is connected.
Products, Variants & Media
Tool | Scopes | Description |
|
| List/search products with variants, inventory, pricing (paginated) |
|
| Add tags to every product matching a search query, paging server-side; skips already-tagged products, supports |
|
| Full detail: variants, options, media, collections, SEO |
|
| Create a product, with options and images |
|
| Update fields and variant prices/SKUs |
|
| Permanent delete (requires |
|
| Copy a product; the copy defaults to DRAFT |
|
| Attach images/video from public URLs |
|
| Add variants against the product's options |
|
| Permanent delete (requires |
Customers
Tool | Scopes | Description |
|
| Search by name, email, or any Shopify filter |
|
| Full profile with addresses and recent orders |
|
| Add tags to any Shopify resource |
|
| Remove tags from any Shopify resource |
Collections
Tool | Scopes | Description |
|
| List/search collections with SEO |
|
| Create a manual or smart (rule-based) collection |
|
| Update title, description, and SEO |
|
| Add products to a manual collection (async) |
|
| Remove products from a manual collection (async) |
Pages, Blogs & Articles
Tool | Scopes | Description |
|
| List/search store pages |
|
| Full page content and publish status |
|
| Update title, HTML body, handle, publish status |
|
| List/search blogs |
|
| Blog with 10 most recent articles |
|
| Update title, handle, comment policy |
|
| Articles for a blog |
|
| Full article with HTML, author, tags |
|
| Create a blog article |
|
| Update content, tags, author, publish status |
Search, Metafields & Commerce
Tool | Scopes | Description |
|
| Unified search across products, articles, blogs, pages |
| varies by resource | Get metafields for any resource |
| varies by resource | Create or update a metafield |
| varies by resource | Delete a metafield by GID |
|
| List draft orders with line items and totals |
|
| List all discounts (code + automatic) via |
|
| Abandoned checkouts with recovery URL and line items |
Not included (scopes not granted)
These are deliberately absent — the tools would 403 at runtime. Add the scopes to the custom app and reinstall to get a new token, then they can be built:
Capability | Scopes needed |
Create/cancel fulfilments, tracking numbers, move fulfilment between locations |
|
Order edits, refunds, cancellations, order tagging |
|
Returns |
|
Create/complete draft orders |
|
Create discount codes |
|
Publish products to sales channels |
|
Create/edit locations |
|
Architecture
src/
index.ts # entry point — wires the tool modules together
shopify-client.ts # config, GraphQL client (429 retry), errors, MCP response helpers
resolvers.ts # SKU → variant, location name → GID
variant-fields.ts # shared variant field validation/normalisation (HS codes, weight, etc.)
variant-select.ts # selector (skus/productIds/query/missing-customs) → concrete variant list
bulk.ts # field-agnostic bulk variant writer: grouping, chunking, per-product results
tools/
orders.ts # shop, orders, summary, count
products.ts # products, variants, media
inventory.ts # locations, variant⇄location activation, stock
customers.ts # customers, resource tagging
content.ts # pages, blogs, articles, metafields, search
commerce.ts # collections, draft orders, discounts, abandoned checkouts
bulk-variants.ts # bulk variant field updates, customs coverage audit
analytics.ts # ShopifyQL query tool
marketing.ts # marketing events, customer event timelines
tests/
*.test.ts # Vitest unit tests — one file per module under testEach module exports a single registerXTools(server) function. No file exceeds 800 lines.
Setup
1. Create a Shopify Custom App
Shopify Admin → Settings → Apps and sales channels → Develop apps
Click Create an app
Under Configure Admin API scopes, enable:
read_all_orders,read_ordersread_analytics,read_reports,read_customer_eventsread_checkoutsread_customersread_price_rules,read_discountsread_draft_ordersread_inventory,write_inventory,read_inventory_transfers,write_inventory_transfersread_locationsread_marketing_integrated_campaigns,read_marketing_eventsread_online_store_pages,write_online_store_pagesread_content,write_contentread_products,write_products
Click Install app
Copy the Admin API access token
To confirm what a token actually has, query { currentAppInstallation { accessScopes { handle } } }.
2. Install
Run straight from npm — no clone, no build:
npx -y shopify-admin-mcp-serverOr install it globally:
npm install -g shopify-admin-mcp-servergit clone <repo> shopify-admin-mcp-server
cd shopify-admin-mcp-server
npm install
npm run build3. Configure the MCP client
{
"mcpServers": {
"shopify": {
"command": "npx",
"args": ["-y", "shopify-admin-mcp-server"],
"env": {
"SHOPIFY_STORE_DOMAIN": "mystore.myshopify.com",
"SHOPIFY_ACCESS_TOKEN": "shpat_xxxxxxxxxxxxxxxxxxxxx"
}
}
}
}{
"mcpServers": {
"shopify": {
"command": "node",
"args": ["/full/path/to/shopify-admin-mcp-server/dist/index.js"],
"env": {
"SHOPIFY_STORE_DOMAIN": "mystore.myshopify.com",
"SHOPIFY_ACCESS_TOKEN": "shpat_xxxxxxxxxxxxxxxxxxxxx"
}
}
}
}4. Restart the client
Environment Variables
Variable | Required | Example |
| Yes |
|
| Yes |
|
Notes
All GIDs use the format
gid://shopify/ResourceType/12345Rate limits are handled automatically with retry-after backoff (up to 3 retries)
Responses over 100,000 characters are truncated with a notice
API version: 2026-01
discountNodesreplacescodeDiscountNodes(removed in 2026-01)Destructive tools (
shopify_delete_product,shopify_delete_variants) require an explicitconfirm: trueinventoryAdjustQuantities/inventorySetQuantitiesidempotency keys are optional until 2026-04, when they become required
Fixed in v4.0.0
Five tools were silently broken against 2026-01 and failed on every call. All are now fixed and verified live:
Tool | Bug |
| Used non-existent |
| Selected |
| Selected |
| Selected |
| Used four money fields that don't exist on |
productCreate / productUpdate were also migrated off the deprecated input: ProductInput! argument to product: ProductCreateInput / ProductUpdateInput.
Related MCP Connectors
Shopify MCP Pack — wraps the Shopify Admin REST API (2024-01)
Connect AI to store orders, products and inventory with scoped access and human approvals.
200+ read/write tools for GA4, Search Console, Google Ads, Shopify, WooCommerce, Shopware & more.
The public product catalogue and collections of any Shopify storefront, as structured JSON.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables interaction with Shopify stores through GraphQL API, providing tools for managing products, customers, orders, and more.78 npm10MIT
- AlicenseCqualityDmaintenanceEnables interaction with Shopify store data through GraphQL API, providing tools for managing products, customers, orders, blogs, and articles.151,353 npm4MIT
- AlicenseNot gradedqualityDmaintenanceProvides full access to the Shopify Admin GraphQL API through 75 tools for managing products, orders, customers, inventory, and analytics. It supports both static token and OAuth authentication while featuring cost-aware rate limiting for efficient store management.1,353 npmMIT
- AlicenseDqualityDmaintenanceEnables interaction with Shopify store data through the GraphQL API, providing tools for managing products, customers, orders, and collections.211,353 npm9MIT