shopify
# @aiwerk/mcp-server-shopify
Shopify Admin GraphQL API MCP server. Lets an AI agent read and write to a Shopify store: products, orders, customers, inventory, draft orders, collections, locations, metafields.
Built and signed by [AIWerk](https://aiwerkmcp.com). MIT licensed.
## Status
`v0.1.0` — under active development. Tool surface and credential flow may change before `v1.0`.
## Install
```bash
npx -y @aiwerk/mcp-server-shopify
```
## Authentication
This server uses the **modern OAuth client_credentials grant** (Shopify Dev Dashboard apps). Legacy `shpat_*` custom-app tokens are not supported.
Three environment variables:
| Env var | What |
|---|---|
| `SHOPIFY_STORE_DOMAIN` | Your store domain, e.g. `your-store.myshopify.com` |
| `SHOPIFY_CLIENT_ID` | Client ID from your Shopify Dev Dashboard app |
| `SHOPIFY_CLIENT_SECRET` | Client Secret from your Shopify Dev Dashboard app |
The server automatically exchanges the client credentials for an Admin API access token and refreshes the token before its 24h expiry. No manual token rotation.
### Creating the Dev Dashboard app
1. Sign in to [Shopify Partner Dashboard](https://partners.shopify.com), then open the [Dev Dashboard](https://dev.shopify.com/dashboard/).
2. **Apps → Create app → Start from Dev Dashboard**. Name it (e.g. `my-mcp-app`).
3. **Versions** tab → set the scopes you need (see below) → **Release**.
4. **Home** tab → **Install app** → choose your store → **Install**.
5. **Settings** tab → copy **Client ID** and **Client Secret**.
### Scopes
The 12 scopes below cover the full v0.1 tool surface. Trim to a smaller set if you want a more restricted token (e.g. read-only orders).
```
read_products, write_products,
read_customers, write_customers,
read_orders, write_orders,
read_draft_orders, write_draft_orders,
read_inventory, write_inventory,
read_locations,
read_publications
```
## Tools
`v0.1` ships 28 tools across the Shopify Admin GraphQL API. See `src/tools/` for the implementation; tool names are shown in `tools/list` after the server starts.
### Protected customer data
Shopify gates access to customer-bearing objects (`Customer`, `DraftOrder`, plus `customer { ... }` selections inside `Order`) behind a separate approval. Apps not approved for protected customer data will see this error from the affected tools:
```
GraphQL error: This app is not approved to access the Customer object.
See https://shopify.dev/docs/apps/launch/protected-customer-data
```
The server returns this error verbatim to the AI client. Apply for protected-data approval at the link above if you need:
- `shopify_list_customers`, `_get_customer`, `_search_customers`, `_create_customer`, `_update_customer`, `_add_customer_note`
- `shopify_create_draft_order`, `_complete_draft_order`
- `shopify_get_order`, `_list_orders`, `_search_orders`, `_mark_order_paid`, `_cancel_order`, `_add_order_note` (these may also be affected when the response includes customer fields)
Product, inventory, location, collection, metafield, and shop-info tools are unaffected.
## API version
The server pins the Shopify GraphQL Admin API to `2026-04`. Bumped quarterly per the Shopify release schedule.
## Local development
```bash
npm install
npm run build
export SHOPIFY_STORE_DOMAIN=your-store.myshopify.com
export SHOPIFY_CLIENT_ID=YOUR_CLIENT_ID
export SHOPIFY_CLIENT_SECRET=YOUR_CLIENT_SECRET
node dist/src/server.js
```
Pull the secrets from your preferred secret store however you like. For example, with `pass(1)`:
```bash
SHOPIFY_CLIENT_ID=$(pass show aiwerk/shopify-dev-client-id)
SHOPIFY_CLIENT_SECRET=$(pass show aiwerk/shopify-dev-client-secret)
export SHOPIFY_CLIENT_ID SHOPIFY_CLIENT_SECRET
```
## Tests
```bash
npm test
```
Unit tests use mocked GraphQL responses and run with no external dependencies. There is no live integration harness in this repo — for now we smoke-test against an internal AIWerk dev store before publish.
## Security
See [SECURITY.md](SECURITY.md) for credential handling, scope minimization, and disclosure policy.
## License
MIT, see [LICENSE](LICENSE).
TDQS
Scored across 28 tools
Tools are mostly distinct, but list vs search variants for customers, orders, and products could cause confusion. Descriptions clarify differences, but an agent might still select the wrong one in some cases.
All tools follow a consistent 'shopify_verb_noun' pattern with lowercase snake_case. Verbs are clear (add, adjust, archive, cancel, complete, create, get, list, mark, remove, search, update). Excellent naming consistency.
28 tools is slightly above the typical well-scoped range, but justified by Shopify's broad API covering customers, orders, products, inventory, and more. No tools feel redundant.
Covers basic CRUD for customers and products, but missing delete operations entirely. Orders have no direct create or update; only draft order creation and completion. No metafields CRUD (only list), no collection management beyond list, no refund or fulfillment tools.