Shopify Admin GraphQL API MCP server by AIWerk - manage products, orders, customers, inventory, and more from your AI agent
Strong foundation with 28 well-named tools covering Shopify's core domains (products, orders, customers, inventory). All tools have descriptions (avg 150 chars) and explicit Zod schemas with types. Naming follows verb_noun convention consistently. However, several critical gaps: (1) output schemas are undocumented, responses are JSON-stringified but structure is not declared; (2) parameter descriptions lack actionable constraints (e.g., 'delta' in adjust_inventory_level says 'non-zero integer' but no validation guidance); (3) error handling is generic (toolError returns raw message, no recovery guidance); (4) confirmation pattern used for destructive ops (archive_product, cancel_order, complete_draft_order) but inconsistently, some WRITE ops lack it; (5) no tool annotations (readOnlyHint, destructiveHint) despite clear risk stratification.
Add a note to a customer. Required: id, note. Optional: mode (append|replace, default append). Returns updated customer + userErrors.
Add a note to an order. Required: id, note. Optional: mode (append|replace, default append). Returns updated order + userErrors.
Add one or more tags to a product. Required: productId, tags (non-empty array). Idempotent server-side. Returns the updated product node + userErrors.
Adjust inventory level for an inventory item at a location. Required: inventoryItemId, locationId, delta (non-zero integer). Optional: reason (default "correction"), name (available|on_hand, default available), referenceDocumentUri. Returns adjustment group + userErrors.
Archive a product (sets status to ARCHIVED, hiding it from sale). Reversible. Destructive: requires confirm=true. Without confirm, returns a structured "would do X" response without firing.
Output schemas undocumented. Tools return JSON-stringified responses via toolSuccess() but no schema is declared for LLMs to understand structure. Agents cannot reliably extract fields for downstream tool chaining.
Confirmation pattern inconsistently applied. archive_product, cancel_order, and complete_draft_order require confirm=true, but other WRITE ops (create_product, update_product, add_product_tag) lack confirmation gates. Agents can accidentally modify data without safeguards.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | 2026-07-28+ | v2 |
Cancel an order. Requires confirm=true. Without confirm, returns a structured "would do X" response. Optional: reason (CUSTOMER|DECLINED|FRAUD|INVENTORY|OTHER|STAFF, default OTHER), refund (default false), restock (default true), notifyCustomer, staffNote. Cancellation runs asynchronously.
Complete a draft order (convert to real order). Required: id, confirm=true. Optional: paymentPending (default false). Without confirm, returns a structured "would do X" response. Returns draft order with order details + userErrors.
Create a new customer. Required: at least one of email or phone. Optional: firstName, lastName, note, tags, locale. Returns customer + userErrors.
Create a draft order. Required: lineItems (non-empty array). Optional: email, customerId, note, tags, shippingAddress, billingAddress, useCustomerDefaultAddress. Returns draft order + userErrors.
Create a new product. Required: title. Optional: descriptionHtml, productType, vendor, tags, status (ACTIVE|ARCHIVED|DRAFT, default ACTIVE), handle. Returns product + userErrors.
Get a customer by GID or numeric ID. Returns full customer detail including addresses, order count, and total spent.
Get inventory level for an inventory item at a specific location. Required: inventoryItemId, locationId. Returns inventory item with quantities (available, on_hand, committed, incoming, reserved).
Get a single order by GID or numeric ID. Returns full detail including line items (with truncation marker), customer, addresses, and financial totals.
Get a product by GID or numeric ID (e.g. "gid://shopify/Product/123" or "123"). Returns full product detail including variants and images, with truncation markers when capped.
Get shop information including name, email, currency, timezone, and other shop-level details.
List collections (product collections) with optional pagination. Default first=50, max=250.
List customers with optional Shopify search query. Optional pagination via cursor. Default first=50, max=250.
List fulfillment locations (warehouses/stores) where inventory is tracked.
List metafields for a given owner type (PRODUCT, PRODUCTVARIANT, CUSTOMER, ORDER, COLLECTION, SHOP, COMPANY, LOCATION). Optional pagination. Default first=50, max=250.
List orders with optional Shopify search query (e.g. "financial_status:paid created_at:>2026-01-01"). Default first=50, max=250.
List products with optional Shopify search query syntax (e.g. "status:active vendor:Acme"). Optional pagination via cursor. Default first=50, max=250.
Mark an order as paid (orderMarkAsPaid). Use for offline payments where the funds were captured outside Shopify. Returns updated order + userErrors.
Remove one or more tags from a product. Required: productId, tags (non-empty array). Returns the updated product node + userErrors.
Search customers by Shopify search query. Required: query. Optional pagination + sort.
Search orders by Shopify search query (e.g. "name:#1001 OR email:[email protected]"). Required: query.
Search products by Shopify search query (full-text + filters like "title:T-Shirt status:active"). Required: query. Optional pagination + sort.
Update fields on an existing customer by GID or numeric ID. Required: id. All other fields are optional and only applied if provided. Returns customer + userErrors.
Update fields on an existing product by GID or numeric ID. Required: id. All other fields are optional and only applied if provided. Returns product + userErrors.
Error handling is generic. toolError() returns raw error messages with no recovery guidance. LLMs cannot determine if an error is retryable, user-fixable, or fatal. No actionable next steps provided.
Tool annotations missing. No readOnlyHint, destructiveHint, or idempotentHint tags despite clear risk stratification (READ_ONLY, WRITE, REVERSIBLE, DESTRUCTIVE). Clients cannot auto-gate dangerous operations.
Parameter constraints lack actionable guidance. E.g., adjust_inventory_level delta says 'non-zero integer' but no validation error message template. create_draft_order lineItems is 'array' with no item schema. LLMs cannot self-correct invalid inputs.