MCP server for the Shopify Admin API: products, orders, customers, inventory, discounts.
English | Русский
A1 Shopify Admin MCP connects AI applications to one Shopify store through the Admin GraphQL API. Ask in plain language about products, orders, customers, inventory, discounts, and shop data; the assistant uses the server's ready-made tools and shows the result.
userErrors and rejects empty or malformed GraphQL responses.Start with a read-only request:
Show the latest orders and the products that currently have inventory.
Connect the server · Explore use cases · Open technical documentation
You: Show the latest orders and the products that currently have inventory.
Assistant: Shows recent orders with their statuses and totals, then products with prices and inventory. Nothing changes.
You: Prepare a 20% discount code called
SUMMERfor two weeks.Assistant: Shows the proposed code, percentage, dates, and limits, then asks for confirmation before creating it.
You: Confirm.
You need Node.js 20+, a store domain such as my-store.myshopify.com, and Admin API credentials. The recommended set is the client ID and secret of a Shopify Dev Dashboard app: the server exchanges them for an access token itself and keeps that token fresh, which matters because the token Shopify issues for this grant expires after 24 hours. The app and the store must belong to the same Shopify organization.
The server runs locally over stdio through npx. Browser-only ChatGPT and Claude web sessions cannot start a local stdio process directly.
Every snippet below uses that pair. If your store still holds a ready-made token from an admin-created custom app, replace SHOPIFY_CLIENT_ID and SHOPIFY_CLIENT_SECRET with a single SHOPIFY_ACCESS_TOKEN — see Getting access.
Through the app:
Open Settings → MCP servers.
Select Add server.
Choose STDIO, then enter npx -y mcp-shopify-admin@latest and set SHOPIFY_STORE_DOMAIN, SHOPIFY_CLIENT_ID, and SHOPIFY_CLIENT_SECRET.
Select Save, then Restart.
Through the CLI:
codex mcp add shopify-admin \
--env SHOPIFY_STORE_DOMAIN=my-store.myshopify.com \
--env SHOPIFY_CLIENT_ID=your_client_id \
--env SHOPIFY_CLIENT_SECRET=your_client_secret \
-- npx -y mcp-shopify-admin@latest
codex mcp list
claude mcp add \
--env SHOPIFY_STORE_DOMAIN=my-store.myshopify.com \
--env SHOPIFY_CLIENT_ID=your_client_id \
--env SHOPIFY_CLIENT_SECRET=your_client_secret \
--transport stdio --scope user shopify-admin \
-- npx -y mcp-shopify-admin@latest
claude mcp list
The current official path is Settings → Extensions. For a custom desktop extension, open Advanced settings → Extension Developer → Install Extension…, select a .mcpb file and follow the prompts.
This repository currently publishes an npm stdio package and does not contain a .mcpb bundle. For Claude Desktop builds that still support local configuration, use the following JSON stdio configuration as a fallback:
{
"mcpServers": {
"shopify-admin": {
"command": "npx",
"args": ["-y", "mcp-shopify-admin@latest"],
"env": {
"SHOPIFY_STORE_DOMAIN": "my-store.myshopify.com",
"SHOPIFY_CLIENT_ID": "your_client_id",
"SHOPIFY_CLIENT_SECRET": "your_client_secret"
}
}
}
}
In those builds, save it to ~/Library/Application Support/Claude/claude_desktop_config.json on macOS or %APPDATA%\Claude\claude_desktop_config.json on Windows.
Add this server to ~/.cursor/mcp.json on macOS/Linux or %USERPROFILE%\.cursor\mcp.json on Windows:
{
"mcpServers": {
"shopify-admin": {
"type": "stdio",
"command": "npx",
"args": ["-y", "mcp-shopify-admin@latest"],
"env": {
"SHOPIFY_STORE_DOMAIN": "my-store.myshopify.com",
"SHOPIFY_CLIENT_ID": "your_client_id",
"SHOPIFY_CLIENT_SECRET": "your_client_secret"
}
}
}
}
Run MCP: Open User Configuration and add:
{
"inputs": [
{
"type": "promptString",
"id": "shopify_store_domain",
"description": "Shopify store domain, for example my-store.myshopify.com"
},
{
"type": "promptString",
"id": "shopify_client_id",
"description": "Client ID of the Shopify Dev Dashboard app"
},
{
"type": "promptString",
"id": "shopify_client_secret",
"description": "Client secret of that app",
"password": true
}
],
"servers": {
"shopify-admin": {
"type": "stdio",
"command": "npx",
"args": ["-y", "mcp-shopify-admin@latest"],
"env": {
"SHOPIFY_STORE_DOMAIN": "${input:shopify_store_domain}",
"SHOPIFY_CLIENT_ID": "${input:shopify_client_id}",
"SHOPIFY_CLIENT_SECRET": "${input:shopify_client_secret}"
}
}
}
}
Check the server with MCP: List Servers.
| Operation | What happens | Data boundary |
|---|---|---|
| Shop, products, orders, customers, locations, discounts | Reads store data | Read-only |
| Product fields or variant prices | Replaces the fields supplied in the request | Changes the storefront data |
| Inventory quantities | Sets the absolute available quantity | Changes product availability |
| Product or discount creation | Creates a new Shopify object | Creates data and cannot be undone automatically |
| Order cancellation | Cancels an order and can refund and/or restock | Destructive and irreversible |
graphql_request | Can run any Admin API query or mutation | Potentially destructive |
This server does not provide dedicated tools for creating orders, fulfillment, customer writes, variant creation, media, targeted discounts, or publishing products to sales channels. Use graphql_request only when you understand the document and its userErrors response.
The AI client may ask for confirmation before a write, but confirmation behavior belongs to that client. A clear request to create, update, set, or cancel authorizes the corresponding server operation.
The server authenticates in one of two ways: with the client ID and secret of a Dev Dashboard app, which it exchanges for an access token itself, or with a ready-to-use Admin API access token that it sends as-is. If both are configured, the ready-made token wins.
Shopify stopped allowing new admin-created custom apps on 2026-01-01, so this is the path for any store being set up today.
read_products, write_products, read_orders, read_customers, read_locations, write_inventory, read_discounts, and write_discounts.SHOPIFY_CLIENT_ID and SHOPIFY_CLIENT_SECRET.From there the server runs the client credentials grant against https://{store}.myshopify.com/admin/oauth/access_token on its own. The token Shopify returns lives 24 hours; the server keeps it in memory only — never on disk — re-mints it shortly before it expires, lets parallel tool calls share one exchange, and mints a fresh one if the API answers 401. Nothing to renew by hand.
The grant works only when the app and the store belong to the same Shopify organization. Otherwise Shopify refuses with shop_not_permitted, and the server relays that as a hint naming the organization mismatch. Re-issuing the credentials does not help: move the app into the store's organization, or use a store from it.
Apps created in the Shopify admin before 2026-01-01 keep working, and their token is still accepted. If you already maintain one:
read_products, write_products, read_orders, read_customers, read_locations, write_inventory, read_discounts, and write_discounts.SHOPIFY_ACCESS_TOKEN.The server sends this token as-is and never refreshes it, so replacing it when it stops working is yours to do. See Shopify's legacy admin-created custom app documentation.
Treat the access token and the client secret as passwords and never commit them to Git. For safe testing, use a Shopify development store.
| Variable | Required | Description |
|---|---|---|
SHOPIFY_STORE_DOMAIN | Yes* | Permanent store host such as my-store.myshopify.com; a bare store name also works. |
SHOPIFY_CLIENT_ID | Yes** | Client ID of a Dev Dashboard app. Together with the secret, the server mints its own 24-hour access token and keeps it fresh. |
SHOPIFY_CLIENT_SECRET | Yes** | Client secret of that app. Sent only to the store's /admin/oauth/access_token; the minted token stays in memory. |
SHOPIFY_ACCESS_TOKEN | Yes** | Legacy alternative: a ready-to-use Admin API access token from a pre-2026 custom app. The server sends it in X-Shopify-Access-Token and never refreshes it; it wins if the client pair is set too. |
SHOPIFY_API_VERSION | No | Quarterly YYYY-MM release or unstable; default: 2026-01. |
SHOPIFY_API_BASE | No | Full http/https GraphQL endpoint override, useful for a local mock. |
SHOPIFY_TIMEOUT_MS | No | Per-request timeout; default: 30000 ms. |
SHOPIFY_MAX_RETRIES | No | Retries for THROTTLED/429 and for 5xx/network errors on reads; default: 4. |
SHOPIFY_TOKEN_LEEWAY_SECONDS | No | How early a minted token is replaced; default: 300 s. Has no effect with a ready-made token. |
* SHOPIFY_API_BASE can replace the store domain for local tests, but a real Shopify request still needs credentials.
** One of the two authentication paths is required: SHOPIFY_CLIENT_ID + SHOPIFY_CLIENT_SECRET, or SHOPIFY_ACCESS_TOKEN. With neither, the server still starts and answers initialize, but every tool call returns an error naming both options. Variables are read at startup, so restart the server after changing them.
actualQueryCost, currentlyAvailable, maximumAvailable, and restoreRate when Shopify provides them. A page with first up to 250 is usually cheaper than many small pages.THROTTLED and HTTP 429 are retried with the wait Shopify reports. 5xx and network errors are retried only for reads; mutations are not replayed after those failures.read_all_orders scope; without it, Shopify does not return them.ASKADS_TELEMETRY=0.Found a bug or missing scenario? Create an issue or contact us on Telegram.
Source-derived launch command. Check the maintainer’s required arguments and credentials before running:
npx -y mcp-shopify-adminMerge this template into ~/Library/Application Support/Claude/claude_desktop_config.json. Keep existing servers. Add any arguments, credentials, and permissions required by the maintainer; this template has not been install-tested.
{
"mcpServers": {
"io-github-a1-x-tech-mcp-shopify-admin": {
"command": "npx",
"args": [
"-y",
"mcp-shopify-admin"
]
}
}
}Restart Claude Desktop completely for changes to take effect. Confirm the server appears connected in the client’s tool list, then try a read-only example from its documentation.
Claude Desktop setup referenceShopify Admin MCP works with any MCP-compatible client. Copy the config snippet from the Configuration section above and add it to the file shown for your client, then restart the application.
~/Library/Application Support/Claude/claude_desktop_config.jsonRestart Claude Desktop completely for changes to take effect.~/.cursor/mcp.jsonRestart Cursor for changes to take effect..vscode/mcp.jsonReload VS Code window for changes to take effect.~/.codeium/windsurf/mcp_config.jsonRestart Windsurf for changes to take effect..mcp.jsonSave at the project root, then start Claude Code in that project and review the MCP server approval prompt. Keep real credentials out of shared files.