shopify-mcp
The shopify-mcp server provides comprehensive Shopify Admin API management, enabling full CRUD operations across core Shopify resources, plus optional AI-driven product image generation via ComfyUI.
Products & Variants
List, get, create, update, delete products; upload/attach images
Manage variants: bulk create/update/delete, reorder, add options (Size, Color, etc.)
Orders
List and retrieve orders with line items
Draft Orders
List, get, create, update, complete, and delete draft orders
Customers
List customers with query filters
Inventory & Locations
Set absolute on-hand inventory at a specific location; list store locations
Metafields
Upsert, list, and delete metafields on any supported resource (products, variants, collections, customers, orders, shop)
Collections & Tagging
Full CRUD for collections; add/remove products from manual collections; add/remove tags on any taggable resource
Webhooks
List, get, create, update, and delete webhook subscriptions
Metaobjects
Discover metaobject definitions; list, get, create, update, and delete metaobjects
Fulfillment
List/get fulfillment orders and fulfillment records; create fulfillments (partial supported, with tracking and customer notifications); update tracking; cancel fulfillments
Analytics
Run ShopifyQL queries, returning results as ASCII tables or raw JSON
ComfyUI Bridge (requires COMFYUI_URL configured)
Generate an AI image and create a new Shopify product in one call
Generate an AI image and attach it to an existing product
Refine a product's featured image via img2img
Bulk regenerate images for all products matching a query
Provides comprehensive Shopify Admin API integration with tools for product management, inventory control, order fulfillment, customer management, collections, webhooks, metafields, draft orders, and analytics through ShopifyQL queries.
shopify-mcp
MCP server for Shopify. Full Admin GraphQL API tooling plus an AI-driven product creation bridge via ComfyUI image generation.
The pitch
Every other Shopify MCP is a plain Admin API wrapper. This one pairs with @miller-joe/comfyui-mcp so you can say things like:
"Create a product called 'Nebula Dreamer'. Generate a cosmic abstract image for it, description matching the vibe, tagged astrology, status draft."
Claude then runs ComfyUI, gets an image back, creates the Shopify product, and attaches the image, all in one call.
Related MCP server: comfyui-mcp
Install
# npx, no install
npx @miller-joe/shopify-mcp \
--shopify-store your-store.myshopify.com \
--shopify-access-token shpat_xxx
# Docker
docker run -p 9110:9110 \
-e SHOPIFY_STORE=your-store.myshopify.com \
-e SHOPIFY_ACCESS_TOKEN=shpat_xxx \
-e COMFYUI_URL=http://comfyui:8188 \
ghcr.io/miller-joe/shopify-mcp:latestConnect an MCP client
claude mcp add --transport http shopify http://localhost:9110/mcpOr point your MCP gateway at the Streamable HTTP endpoint.
Configuration
CLI flag | Env var | Default | Notes |
|
| (required) |
|
|
| (required) | Admin API token ( |
|
|
| GraphQL Admin API version |
|
|
| Bind host (HTTP mode only) |
|
|
| Bind port (HTTP mode only) |
|
| (unset) | Speak MCP over stdio instead of HTTP. Use when launched as a subprocess by a stdio-first MCP client (Claude Desktop, mcp-inspector). |
|
| (optional) | Enables bridge tools when set |
|
| same as | External URL used for image references passed to Shopify |
(no flag) |
|
| Default checkpoint for bridge tools |
Transports
The server speaks streamable HTTP by default (great for Claude Code, MetaMCP, raw fetch). Pass --stdio (or set MCP_TRANSPORT=stdio) to switch into stdio mode, which is what stdio-first clients like Claude Desktop and the MCP Inspector expect:
// claude_desktop_config.json
{
"mcpServers": {
"shopify": {
"command": "npx",
"args": ["-y", "@miller-joe/shopify-mcp", "--stdio"],
"env": {
"SHOPIFY_STORE": "my-store.myshopify.com",
"SHOPIFY_ACCESS_TOKEN": "shpat_…"
}
}
}
}Getting a Shopify access token
Easy path, existing dev store: Shopify Admin → Apps → Develop apps → Create custom app → enable relevant Admin API scopes (write_products, read_orders, write_inventory, read_customers) → install → copy the admin API access token (starts with shpat_).
For new apps (post-Jan 2026): legacy custom-app tokens are deprecated for freshly-created apps. Use the Dev Dashboard token-exchange flow once to obtain a working token, then supply it here. Multi-tenant OAuth is on the roadmap.
Tools
Core Admin
Tool | Description |
| Paginated product search with Shopify query syntax |
| Fetch one product with variants, images, media |
| Create a product (default DRAFT); optionally attach images |
| Update title, description, tags, status, etc. |
| Attach a public image URL to an existing product |
| List orders, newest first, with query filters |
| Fetch one order with line items |
| Set absolute on-hand inventory at a location |
| List store locations (for inventory ops) |
| List customers with query filters |
Metafields
Tool | Description |
| Upsert a metafield on any |
| List metafields for a resource, optionally filtered by namespace |
| Delete a metafield by (ownerId, namespace, key) |
Draft orders
Tool | Description |
| List draft orders with Shopify query filters |
| Fetch one draft order with its line items |
| Create a draft order. Line items can be variant refs or custom (title + price). |
| Update customer, line items, tags, note, email |
| Convert a draft order to a real order. |
| Delete a non-completed draft order |
Webhooks
Tool | Description |
| List webhook subscriptions; filter by topic(s) |
| Fetch a single subscription |
| Subscribe an HTTPS callback URL to a topic (e.g. |
| Change callback URL, format, or field/metafield filters |
| Delete a subscription |
Metaobjects
Tool | Description |
| Discover metaobject types (schemas) on the store, including field definitions |
| List metaobjects of a given type |
| Fetch one metaobject with all its fields |
| Create a metaobject (type must already exist as a definition). Supports |
| Upsert fields, change handle, toggle publishable status |
| Delete a metaobject |
Fulfillment
Tool | Description |
| List an order's fulfillment orders (one per shipping location), with remaining quantities per line item |
| Fetch a single fulfillment order |
| Fetch a single fulfillment (shipment record) with tracking info |
| Mark fulfillment orders (or specific quantities) as fulfilled. Optionally attach tracking and notify the customer. |
| Update carrier/number/url on an existing fulfillment |
| Cancel a fulfillment by ID |
Partial fulfillment is supported. Pass specific fulfillmentOrderLineItems with quantity per line, or omit the array to fulfill everything on the fulfillment order.
Variants and product options
Tool | Description |
| List all variants of a product with selected options, price, SKU, inventory |
| Bulk-create variants (up to 100) with option values, price, SKU, compareAtPrice, initial inventory |
| Bulk-update variant price, compareAtPrice, SKU, barcode, taxable, inventoryPolicy, option values |
| Bulk-delete variants from a product |
| Set 1-indexed positions for variants |
| Add options (Size / Color / etc.) with their possible values. Up to 3 options per product. |
For an entirely new product, creating the first real variant requires strategy="REMOVE_STANDALONE_VARIANT" to replace the auto-generated "Default Title" variant.
Collections and tagging
Tool | Description |
| List collections with query filters |
| Fetch one collection with its products |
| Create a manual collection, optionally seeded with products |
| Update title, description, or handle |
| Delete a collection |
| Add products to a manual collection (async job on Shopify's side) |
| Remove products from a manual collection |
| Add tags to any taggable resource (Product, Order, Customer, DraftOrder, Collection) |
| Remove tags from a taggable resource |
Analytics (ShopifyQL)
Tool | Description |
| Run a ShopifyQL query and render the result as an ASCII table. Pass |
Examples:
FROM sales SHOW total_sales BY day SINCE -30d TIMESERIESFROM products SHOW product_title, quantity_sold BY product_id SINCE -7d ORDER BY quantity_sold DESC LIMIT 10
ComfyUI bridge (when COMFYUI_URL is configured)
Tool | Description |
| Generate an image and create a product with it, in one call. Title and description derive from the prompt if not given. |
| Generate an image and attach it to an existing product. |
| Run img2img on a product's featured image (or an explicit URL) and attach the refined result. Tune |
| For all products matching a query, run the generator with a templated prompt and attach fresh images. |
Template placeholders for bulk_regenerate_images: {title}, {handle}.
Example: the whole pitch in one call
Claude, use generate_and_create_product:
prompt: "minimalist sunset mountain silhouette, warm gradient, vector style"
title: "Mountain Sunset Poster"
status: DRAFT
tags: ["posters", "nature", "minimalist"]ComfyUI generates the image, Shopify creates the product with the image attached, and you get the product ID and image URL back. One prompt, one call, real listing.
Architecture
┌────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ MCP client │────▶│ shopify-mcp │────▶│ Shopify Admin │
│ (Claude etc.) │◀────│ (this server) │◀────│ GraphQL API │
└────────────────┘ └────────┬─────────┘ └─────────────────┘
│
│ (bridge tools only)
▼
┌──────────────────┐
│ ComfyUI │
│ (txt2img) │
└──────────────────┘Bridge tools call ComfyUI directly over HTTP, get an image URL, and pass it to Shopify's productCreateMedia mutation. Shopify fetches and hosts the image on its CDN.
Development
git clone https://github.com/miller-joe/shopify-mcp
cd shopify-mcp
npm install
npm run dev # hot reload via tsx watch
npm run build
npm run typecheck
npm testRequires Node 20+.
Roadmap
Shipped:
Core products CRUD plus image attach
Orders read, Inventory set + locations, Customers read
ComfyUI bridge:
generate_and_create_product,generate_product_image,bulk_regenerate_imagesMetafields:
set_metafield,list_metafields,delete_metafieldDraft orders: create / update / complete / delete / list / get
Collections and tagging: CRUD, product add/remove,
add_tags/remove_tagsVariants and product options: bulk create / update / delete / reorder plus
add_product_optionsFulfillment: list/get fulfillment orders, create fulfillment (partial supported), update tracking, cancel
Webhooks: list / get / create / update / delete
Metaobjects: definitions list plus metaobject CRUD
ShopifyQL analytics:
run_shopifyql_querywith ASCII-table renderingImage refinement bridge:
refine_product_image(ComfyUI img2img on product images)
Planned:
OAuth token-exchange flow for new-app auth.
License
MIT © Joe Miller
Support
If this saves you time, consider supporting development:
Available Tools
58 toolsadd_product_optionsA
Add new options (like Size, Color, Material) to an existing product, along with their initial possible values. Shopify caps products at 3 options total — passing more is rejected. Adding an option creates new option-values that existing variants must be assigned to (Shopify auto-assigns the first value if not specified). After adding, use create_variants to add SKUs across the new option-value combinations. Cannot remove options via this tool — that requires re-creating the product.
| Name | Required | Description | Default |
|---|---|---|---|
| productId | Yes | Product GID. | |
| options | Yes | Up to 3 options per product (Shopify limit). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description fully covers behavioral traits: Shopify limit of 3 options, auto-assignment of first value to existing variants, and the inability to remove options. This is comprehensive for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each essential: purpose, constraint, side effect, and guidance. No redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description covers purpose, constraints, side effects, and next steps completely. An agent can safely invoke this tool with the provided information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage, baseline is 3. The description adds value by explaining the Shopify cap (maxItems) and the auto-assignment behavior, but the schema already documents name, values, and position adequately.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Add' and the resource 'options (like Size, Color, Material) to an existing product'. It also distinguishes from sibling tool 'create_variants' by noting the appropriate sequence.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use (adding options), when-not-to (cannot remove options, exceeding 3 options rejected), and alternatives (re-create product for removal, use create_variants for SKUs).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_products_to_collectionA
Add one or more products to a manual collection. Runs as an async background job on Shopify's side — the response includes a job ID and done flag, so very large batches may still be queued when the call returns. Smart collections (rule-based) reject manual additions; this tool only works on manual collections. Duplicates are silently ignored.
| Name | Required | Description | Default |
|---|---|---|---|
| collectionId | Yes | GID of a manual collection. Will fail on smart collections (those have rule-based membership). | |
| productIds | Yes | Product GIDs to add. Duplicates are silently ignored by Shopify. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses the async nature (background job on Shopify's side), the response structure (job ID and done flag), and that very large batches may be queued. Duplicates being silently ignored is also transparent. No behavior is hidden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no extraneous words. It is front-loaded with the core purpose and then adds critical behavioral details. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (2 parameters, no output schema), the description is complete. It covers behavior, response structure, constraints, and exceptions. No missing elements.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers both parameters with 100% description, so the baseline is 3. The description adds no new semantic information beyond the schema—it reiterates the manual collection constraint and async behavior, but those are behavioral, not parameter-level semantics. Thus, a score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action 'Add one or more products to a manual collection.' It specifies the resource (products), action (add), and target (collection). It distinguishes from sibling tools like remove_products_from_collection by focusing on adding. The exclusion of smart collections is also explicitly stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context on when to use: for manual collections only, and warns that smart collections reject manual additions. It also notes that duplicates are silently ignored. While no explicit alternative tool is named, the guidance is strong and sufficient for correct usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_tagsA
Add tags to any taggable Shopify resource — Product, Order, Customer, DraftOrder, Collection, Article, Blog. Tags are stored as a unique set per resource; adding a tag that already exists is a no-op. Useful for ad-hoc segmentation, marketing campaigns, or driving smart collection membership rules. Pair with remove_tags to fully manage taxonomy.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | GID of any taggable resource — Product, Order, Customer, DraftOrder, Collection, Article, Blog. The tool name does the verb (add vs remove); pick the right tool for the operation. | |
| tags | Yes | Tag strings to add (or remove). Shopify normalises whitespace and case for matching but preserves the literal strings on display. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses key behavior: tags are a unique set per resource, adding existing tag is a no-op. No annotations, so description carries full burden; it adequately covers idempotency and additive nature.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences plus a note, front-loaded with purpose. Every sentence adds value: resource list, behavior, use cases, sibling reference. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given simple 2-param schema and no output schema, description fully covers purpose, behavior, usage guidelines, and sibling relationship. No gaps for agent decision-making.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 100% description coverage with clear GID and tags explanations. Description adds context about normalization but does not significantly surpass schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Explicitly states 'Add tags to any taggable Shopify resource' and lists examples. Clearly distinguishes from sibling 'remove_tags' by naming it for full taxonomy management.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides use cases: 'ad-hoc segmentation, marketing campaigns, driving smart collection membership rules'. Mentions pairing with remove_tags, implying when to use each. Could be improved by explicitly stating when not to use (e.g., when replacing all tags).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_fulfillmentA
Cancel an existing fulfillment — use when an item that was marked shipped won't actually ship (lost in warehouse, address bounced, customer cancelled). Restores remaining quantity on the underlying fulfillment order so the items can be re-fulfilled later. Does NOT issue a refund — combine with order-level refund tools if money needs to come back to the customer. Returns the new fulfillment status (typically CANCELLED).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Fulfillment GID to cancel. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses behavioral traits: it restores remaining quantity on the underlying fulfillment order, does not issue a refund, and returns the new status. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste. Front-loaded with the core action, followed by usage guidance, side effects, limitations, and return value. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one required parameter, no output schema), the description fully covers purpose, when to use, behavioral effects, and return value. No missing context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds no extra semantic meaning beyond the input schema, which already fully describes the single parameter 'id' as 'Fulfillment GID to cancel.' Schema coverage is 100%, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a clear verb and resource ('Cancel an existing fulfillment') and immediately distinguishes its use case from siblings like cancel_order by specifying when to use (lost in warehouse, address bounced, customer cancelled).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use (item won't ship) and when not (does not issue refund), and provides direction to combine with order-level refund tools. Also describes the effect on the fulfillment order.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_orderA
Cancel a Shopify order. Triggers an async job (the response includes a jobId; cancellation finishes shortly after the call returns). Combine with refund: true to issue a full refund of any captured payment, or refund: false if the order is unpaid or you'll handle refunds separately via refund_order. restock: true restores cancelled line items back to inventory; set false if items were physically lost/damaged. notifyCustomer: true sends the cancellation email. Cannot cancel an already-cancelled order or one with active fulfillments still in flight (cancel those fulfillments first via cancel_fulfillment).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Order GID or numeric ID to cancel. The order must not already be cancelled. | |
| reason | Yes | Why the order is being cancelled. CUSTOMER (customer requested), FRAUD (suspected fraud), INVENTORY (out of stock), DECLINED (payment declined), STAFF (staff decision), OTHER. | |
| refund | No | Whether to refund the customer's payment as part of cancellation. true = refund any captured payment in full; false = cancel without refunding (use for unpaid orders, or when you'll handle the refund separately). | |
| restock | No | Whether to restock cancelled line items back to inventory. true = decrement inventory back; false = leave inventory as-is (use when items were physically lost/damaged). | |
| staffNote | No | Internal note about the cancellation reason. Visible to staff only. | |
| notifyCustomer | No | Send the customer a cancellation email. Default false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even with no annotations, description fully discloses behavioral traits: async job with jobId response, side effects of refund/restock/notify, and preconditions. It does not contradict any structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is a single paragraph but well-structured, front-loading the main purpose then detailing options. Could be slightly more structured (e.g., bullet points) but remains concise and clear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 6 parameters, async nature, and no output schema, description covers all necessary context: preconditions, side effects, relationships with sibling tools, and response shape (jobId). Complete for an agent to use correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. Description adds value by explaining usage context for each boolean flag (e.g., when to set refund false, restock false) and linking to refund_order. Adds moderate additional meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'Cancel a Shopify order.' and specifies verb+resource. It distinguishes from siblings like cancel_fulfillment and refund_order by mentioning them directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use and when-not-to-use guidance, including cannot cancel already-cancelled orders or orders with active fulfillments, and directs to cancel_fulfillment first. Also explains conditions for refund, restock, and notifyCustomer flags.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
complete_draft_orderA
Convert an OPEN draft order into a real Shopify order. With paymentPending=false (default), Shopify attempts to capture payment immediately; the call fails if no payment method is on file. With paymentPending=true, the order is created in payment-pending status — useful when collecting payment offline (cash, bank transfer, manual processing). Once completed, the draft transitions to COMPLETED and the new order's GID is returned. The transition is one-way: completed drafts cannot be re-opened or edited via draft tools (use the order tools, or refund/cancel for the resulting order).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | GID of an OPEN draft order. Already-completed drafts are rejected. | |
| paymentPending | No | If true, the resulting order is marked payment-pending — Shopify creates the order but does NOT capture payment. Use when you'll collect payment offline (cash, bank transfer, manual card auth) or via a separate flow. Default false (attempts to capture immediately). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, description fully discloses behavior: immediate payment capture attempt with potential failure, creation of payment-pending order, one-way transition, and returned GID.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each essential. Main action in first sentence, followed by two payment scenarios and a final constraint. No redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for a conversion tool: covers payment modes, state transition, result, and limitations. No output schema but return value is described.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers 100% of parameters; description adds context about default behavior and failure case for paymentPending, and rejection of non-OPEN drafts, enriching understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'Convert an OPEN draft order into a real Shopify order' with specific verb and resource. Distinguishes from creation tools (create_order) and deletion tools (delete_draft_order).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly describes when to use (for converting drafts), differentiates between paymentPending=true/false scenarios, and notes that completed drafts cannot be reopened, guiding appropriate usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_collectionA
Create a new manual collection (rule-based 'smart' collections aren't supported here — use the Shopify admin for those). Title is required; description, handle, and an initial product list are optional. Returns the new collection's GID, which you'll need for subsequent add_products_to_collection or update_collection calls. Side effect: collection becomes immediately visible in the storefront unless you've configured publication channels separately.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Display title shown to shoppers. Required. | |
| description | No | HTML body for the collection page. Plain text works; HTML tags render. | |
| handle | No | URL slug (e.g. 'summer-sale'). Defaults to a slugified title. Must be unique per shop. | |
| productIds | No | Product GIDs to seed into the new (manual) collection. Smart collections built from rules aren't supported by this tool — use the Shopify admin UI for those. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden. It discloses the side effect that the collection becomes visible in the storefront unless publication channels are configured separately, and notes that the return value is a GID. It does not cover authentication or rate limits, but for a creation tool, the transparency is good.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, each useful: first states purpose and limitation, second lists required vs optional, third explains return value and side effect. No wasted words, perfectly front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 4 parameters, no annotations, and no output schema, the description adequately covers: purpose, required fields, return value (GID), side effect, and a usage pointer to sibling tools. It is complete for an agent to understand and invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description adds value by explaining that handle defaults to slugified title and must be unique, and that productIds are for seeding manual collections (not smart). This goes beyond the schema's definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Create a new manual collection' and explicitly distinguishes from rule-based smart collections, which are unsupported. It provides a specific verb (create) and resource (collection), differentiating it from sibling tools like update_collection or delete_collection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description tells when to use this tool (for manual collections) and when not to (smart collections should use the Shopify admin). It also explains the return value (GID) and how it is needed for subsequent calls like add_products_to_collection, providing clear context for usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_customerA
Create a new customer record. At minimum, supply email or phone (one is required for the customer to be reachable; both is fine). Email and phone must each be unique across the store — duplicates trigger validation errors. Optionally seed addresses (the first becomes the default shipping address), apply tags for segmentation, and set email-marketing consent. Default consent is NOT_SUBSCRIBED — only set SUBSCRIBED when you have documented opt-in (legal requirement in many jurisdictions). Returns the new customer's GID for use as customerId in create_order, create_draft_order, etc.
| Name | Required | Description | Default |
|---|---|---|---|
| No | Customer email. At minimum email or phone is required for the customer to be useful. Must be unique across the store. | ||
| firstName | No | ||
| lastName | No | ||
| phone | No | Phone in E.164 format (+15551234567). Must be unique across the store. | |
| tags | No | Tags to apply to the new customer for segmentation/automation. Used by smart collections, marketing automations, and Flow triggers. | |
| note | No | Internal staff-only note about the customer. | |
| addresses | No | Initial address(es). The first becomes the default shipping address; the rest are additional saved addresses. Customers can be created without addresses. | |
| emailMarketingConsent | No | Email marketing consent state. Set marketingState=SUBSCRIBED only with documented customer opt-in. NOT_SUBSCRIBED is the default and the safe choice when in doubt. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It discloses required fields (email/phone), uniqueness, default consent (NOT_SUBSCRIBED), legal requirement for opt-in, first address becomes default, and return value GID. This is comprehensive behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is well-structured: starts with core purpose, then requirements, optional features, legal note, and return value. It is slightly lengthy but every sentence adds value. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description explains return value (GID) and links to related tools. It covers all essential aspects (required inputs, uniqueness, addresses, consent) for effective usage, handling nested objects and 8 parameters well.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 75% description coverage. Description adds value beyond schema: explains why email/phone required, uniqueness, default shipping address, consent default, and returned GID usage. It also clarifies the consent field's default and legal implications.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Create a new customer record' and details required and optional fields, distinguishing it from update_customer. It specifies the minimum inputs (email or phone) and uniqueness constraints, leaving no ambiguity about the tool's function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit conditions: supply email or phone, uniqueness requirements, default consent, and legal note for opted-in state. It also mentions using the returned GID for other tools. Lacks explicit 'when not to use' but context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_draft_orderA
Create a new draft order — Shopify's term for an editable cart/quote not yet placed as an order. Each line item is EITHER a variant reference (variantId + quantity) for catalog products, OR a custom item (title + originalUnitPrice + quantity) for one-off charges or services not in the catalog. Optionally attach a customer, email, internal note, tags, and choose whether to copy the customer's default address. Returns the new draft's GID and an invoice URL the customer can use to pay. Drafts stay OPEN until you call complete_draft_order or send the invoice.
| Name | Required | Description | Default |
|---|---|---|---|
| lineItems | Yes | At least one line item. Each item is EITHER a variant reference (just variantId + quantity) OR a custom item (title + originalUnitPrice + quantity, no variantId). Mixing both shapes in one item is rejected by the refine() validator. | |
| customerId | No | GID of an existing customer to attach to the draft. Get one from list_customers. Optional — drafts can be customer-less and converted to a guest checkout. | |
| No | Email address for the order. Useful when you don't have a customer record yet but want to email the invoice URL. | ||
| note | No | Internal note visible to staff only (not the customer). | |
| tags | No | Tags to apply to the draft for filtering/segmentation. | |
| useCustomerDefaultAddress | No | If true and customerId is set, copy the customer's default shipping address onto the draft. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite no annotations, the description thoroughly discloses behavior: line item constraints (variant vs custom), optional attachments, draft state (OPEN), and return values (GID, invoice URL). No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is informative but slightly verbose with multiple clauses. However, every sentence adds value and it is well front-loaded with the purpose. Could be slightly tighter but effective.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool with 6 parameters and no output schema, the description provides all necessary context: line item rules, optional fields, draft lifecycle, and return values. High completeness given the schema coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the description adds substantial detail: explains line item shapes, rejection of mixed shapes, purpose of email vs customerId, and distinction between custom and variant items. Exceeds schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it creates a draft order (editable cart/quote), distinguishing it from related tools like complete_draft_order and create_order. It provides specific Shopify terminology and context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use (for editable carts/quotes) and mentions subsequent actions (complete_draft_order or send invoice). It implicitly distinguishes from create_order but lacks explicit 'when not to use' or direct alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_fulfillmentA
Mark items as shipped — creates a fulfillment record covering one or more fulfillment orders. For each fulfillment order in the request, you can either fulfill everything still remaining (omit fulfillmentOrderLineItems) or specify per-line {id, quantity} pairs for partial shipments. Optionally attach tracking info (carrier + number; URL is auto-derived for major carriers like USPS/UPS/FedEx/DHL) and set notifyCustomer=true to send the shipment-confirmation email. The fulfillmentOrderLineItem IDs come from list_fulfillment_orders. Side effects: customer-facing email if notifyCustomer is true; webhook fires; remaining quantities decrement.
| Name | Required | Description | Default |
|---|---|---|---|
| lineItemsByFulfillmentOrder | Yes | One entry per fulfillment order being fulfilled in this shipment. | |
| trackingInfo | No | Tracking info. Company+number is enough; Shopify auto-derives URL for known carriers. | |
| notifyCustomer | No | Send the customer a shipment notification email. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully discloses side effects: 'customer-facing email if notifyCustomer is true; webhook fires; remaining quantities decrement.' This goes beyond basic behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action, each sentence adding value. No unnecessary words. Structure supports quick comprehension.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (nested objects, side effects), the description covers main points well. However, no output schema exists, and the description does not explain the return value (likely the fulfillment record). Minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds critical context: omitting fulfillmentOrderLineItems fulfills everything, tracking URL auto-derives for major carriers, and line item IDs come from list_fulfillment_orders.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description explicitly states 'Mark items as shipped — creates a fulfillment record', clearly identifying the verb (create) and resource (fulfillment record). It distinguishes from siblings like cancel_fulfillment and update_fulfillment_tracking.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Description explains when to use (marking items as shipped) and mentions optional tracking and notification. It also references list_fulfillment_orders for IDs. However, it does not explicitly state when not to use this tool or provide alternatives like cancel_fulfillment.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_metaobjectA
Create a new metaobject (instance) of an existing type. The type must match a registered metaobject definition — call list_metaobject_definitions first if you're unsure. fields is an array of {key, value} pairs; values are always strings (JSON/reference fields take a JSON-encoded string, primitives take literal text). handle is optional; Shopify generates one from the displayName field if present. status only applies to types that have the publishable capability — passing it for non-publishable types is silently ignored. Returns the new metaobject's GID for use in subsequent set_metafield calls (e.g. linking the metaobject to a product via a metaobject_reference metafield).
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | Type handle from a registered metaobject definition. The definition must already exist; this tool does not create new types/schemas. | |
| handle | No | Optional URL-safe handle. If the type has a 'displayName' field, Shopify generates a handle from it; otherwise pass one here. | |
| fields | Yes | Field values. Provide at least the required fields from the type's definition. Required fields without values cause a validation error. | |
| status | No | Publish status. Only applies to types that declared the `publishable` capability — passing this for non-publishable types is silently ignored. ACTIVE = visible on storefront, DRAFT = hidden. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description covers key behaviors: silently ignoring status for non-publishable types, optional handle generation from displayName, and serialization of field values as strings. It also mentions the return value (GID).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise yet comprehensive, front-loaded with the main action, and each sentence adds unique value. No redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 4 parameters, no output schema, and no annotations, the description covers prerequisites, parameter details, edge cases, and return value. It is self-contained for an agent to use correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds significant value: explaining that type must match a registered definition, handle generation logic, field value serialization (JSON-encoded for complex types), and status restrictions. This goes well beyond the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it creates a new metaobject instance of an existing type. It distinguishes from sibling tools like delete_metaobject, update_metaobject, and get_metaobject by specifying creation and referencing list_metaobject_definitions for type verification.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description advises calling list_metaobject_definitions first if unsure of the type, and explains optional handle generation and status applicability. It does not explicitly state when not to use, but provides clear context for usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_orderA
Create a real Shopify order directly, bypassing the draft-order flow. Each line item is either a variant reference (variantId + quantity) or a custom item (title + priceSet + quantity). Use when you need to import historical orders, record a phone/in-person sale, or create an order without involving Shopify's checkout pricing engine. For interactive carts where Shopify should compute taxes/shipping/discounts, use create_draft_order then complete_draft_order instead. Defaults: PENDING financial status, customer not notified, inventory decremented respecting each variant's oversell policy.
| Name | Required | Description | Default |
|---|---|---|---|
| lineItems | Yes | At least one line item. Each is either a variant reference (variantId + quantity) or a custom item (title + priceSet + quantity). Use draft orders (create_draft_order → complete_draft_order) when you want Shopify to handle pricing/taxes automatically; use this tool when you need to create an order directly with explicit line-item pricing. | |
| No | Customer email for the order. Recommended even when customerId is set. | ||
| customerId | No | GID of an existing customer to attach. Get one from list_customers. Optional. | |
| tags | No | Tags applied to the new order. | |
| note | No | Internal staff-only note attached to the order. | |
| financialStatus | No | Initial financial status to record. Defaults to PENDING if omitted. Use PAID when capturing payment outside Shopify (manual offline payment). | |
| sendReceipt | No | Whether to email the customer a receipt for the new order. | |
| inventoryBehaviour | No | How inventory is handled. BYPASS: don't touch inventory. DECREMENT_OBEYING_POLICY (default): decrement and respect each variant's oversell policy. DECREMENT_IGNORING_POLICY: decrement always, even past zero. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite no annotations, the description reveals key behaviors: defaults for financial status, customer notification, and inventory handling. It explains line item types and oversell policy. However, it doesn't mention rate limits, authentication, or error outcomes, holding it back from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and concise: first states purpose, then usage guidelines, then defaults. Every sentence adds critical information with no redundancy. It is appropriately sized for the complexity of the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and 8 parameters (1 required), the description covers essential aspects: line item types, defaults, when to use alternatives. It could mention output format or error scenarios, but the core semantics are well addressed. Falls just short of 5 due to lack of post-execution details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value by explaining the line item structure (variant vs custom), providing usage context for each parameter, and clarifying defaults. It goes beyond the schema's descriptions, especially for lineItems and financialStatus.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Create a real Shopify order directly, bypassing the draft-order flow.' It distinguishes from sibling tools (create_draft_order) and specifies exact use cases (historical orders, phone/in-person sales).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly provides when to use ('import historical orders, record a phone/in-person sale') and when not to ('For interactive carts... use create_draft_order then complete_draft_order instead'). Also includes default behaviors (PENDING financial status, no notification).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_productA
Create a new product. The product is created first, then any image_urls (publicly fetchable) are attached as a follow-up call — Shopify pulls each URL and hosts the image on its CDN. The default status is DRAFT to prevent accidentally publishing half-configured products to the storefront; pass status=ACTIVE only when you're ready to go live. New products start with a single hidden 'Default Title' variant; to add real variants with options, call create_variants with strategy='REMOVE_STANDALONE_VARIANT'. Returns the new product's GID and handle.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | ||
| description | No | Description as HTML | |
| vendor | No | ||
| product_type | No | ||
| tags | No | ||
| status | No | DRAFT | |
| image_urls | No | Image URLs to attach after creation |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses key behaviors: product creation first then image attachment, default DRAFT status to prevent premature publishing, initial hidden 'Default Title' variant, and the need for create_variants to add real options. The return value (GID and handle) is also specified.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: starts with the main action, then discusses image attachment, status, variants, and return value in logical order. Every sentence adds valuable information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the parameter count (7), low schema coverage (29%), no output schema, and no annotations, the description covers essential aspects: return value, process steps, and best practices. It could mention prerequisites or side effects (e.g., authentication needs, rate limits) but is otherwise thorough for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 29%, but the description adds meaning for key parameters: explains image_urls (attached after creation), status (default DRAFT, use ACTIVE when ready), and alludes to title. However, it does not elaborate on vendor, product_type, or tags beyond the schema, missing an opportunity to fully compensate for low coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Create a new product' and details the creation process, distinguishing it from sibling tools like create_variants and update_product. It explains the two-step image attachment, default status, and variant handling, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance: use default status DRAFT to avoid accidental publishing, pass status=ACTIVE when ready to go live, and call create_variants for real variants. It also clarifies the image attachment process as a follow-up, helping the agent decide when and how to use the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_variantsA
Create one or more variants on an existing product. Each variant's optionValues must cover EVERY option declared on the product (Size + Color + Material if there are 3 options) — partial coverage is rejected. New products from create_product start with a single hidden 'Default Title' variant; when adding the first real variants, pass strategy='REMOVE_STANDALONE_VARIANT' so Shopify replaces the placeholder rather than leaving it. inventoryQuantities seeds initial stock per location at create time; for ongoing changes use set_inventory_quantity instead.
| Name | Required | Description | Default |
|---|---|---|---|
| productId | Yes | Product GID. | |
| variants | Yes | ||
| strategy | No | DEFAULT: add to existing variants. REMOVE_STANDALONE_VARIANT: replace the auto-created 'Default Title' variant (use on first real variant create). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description adequately discloses creation behavior, option coverage requirement, strategy effects, and inventory seeding limitations. Could mention side effects like webhook triggers but covers critical operational details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with core action, no redundant information. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers key aspects for successful invocation: constraints, strategy, inventory behavior, and alternative tools. Lacks error handling or response format but acceptable given no output schema and comprehensive parameter guidance.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% but description adds context for strategy parameter and inventoryQuantities usage. Reinforces schema descriptions with practical guidance on when to use each parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'Create one or more variants on an existing product' with specific verb, resource, and context. Distinguishes from sibling tools like update_variants and delete_variants.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly explains when to use strategy='REMOVE_STANDALONE_VARIANT' for first variants and when to prefer set_inventory_quantity for ongoing inventory changes. Also states constraint that optionValues must cover all product options.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_webhookA
Subscribe to a Shopify event topic and have payloads POSTed to your HTTPS endpoint. Common topics: ORDERS_CREATE, ORDERS_PAID, ORDERS_FULFILLED, PRODUCTS_CREATE, PRODUCTS_UPDATE, INVENTORY_LEVELS_UPDATE, CUSTOMERS_CREATE, APP_UNINSTALLED. Use includeFields to receive only specific fields in the payload (reduces bandwidth and avoids leaking unrelated data). metafieldNamespaces opts in to including metafields from the listed namespaces. callbackUrl must be HTTPS in production. Returns the new subscription's GID; verify delivery is working with a few real events before relying on it.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | Yes | WebhookSubscriptionTopic, e.g. 'ORDERS_CREATE', 'ORDERS_PAID', 'PRODUCTS_UPDATE', 'INVENTORY_LEVELS_UPDATE', 'APP_UNINSTALLED'. See Shopify docs for full list. | |
| callbackUrl | Yes | HTTPS endpoint that will receive the webhook POSTs. | |
| format | No | JSON | |
| includeFields | No | Optional: only include these fields in the payload (reduces payload size). | |
| metafieldNamespaces | No | Optional: include metafields from these namespaces in the payload. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided. Description mentions return value (GID) and need to verify delivery. Does not disclose potential side effects, rate limits, or authentication requirements. Partial coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five concise sentences, each serving a purpose. No redundant information. Front-loaded with main action and common topics.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers all essential aspects: topic suggestions, callback requirement, field filtering, metafield opt-in, return value, and verification advice. Lacks mention of overwriting behavior but still sufficiently complete for a creation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80%, description adds value by listing common topics and explaining the benefit of includeFields. However, it mostly echoes schema descriptions. Adequate but not exceptional.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear verb ('Subscribe') and resource ('webhook topic') with specific endpoint mention. Lists common topics to clarify scope. Distinct from sibling tools like update_webhook or list_webhooks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides some context: callbackUrl must be HTTPS in production, and verification is needed. However, no explicit guidance on when to use this vs. sibling tools like update_webhook or list_webhooks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_collectionA
Permanently delete a collection. Products inside it are NOT deleted — only the grouping is removed; products keep all their other associations (other collections, tags, inventory). Irreversible. Confirm the collection ID with get_collection before calling. Returns the deleted collection ID, or a 'nothing deleted' message if the GID didn't match anything.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | GID of the collection to delete. The collection's products are NOT deleted, only the collection grouping. Irreversible. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses irreversibility, no deletion of contained products, and return behavior (deleted ID or not-found message). No annotations are provided, so the description carries the full burden; it covers key behavioral traits but could mention authorization or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no wasted words, front-loaded with action and side effects, then usage hint and return info. Highly efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description explains the return value. It covers purpose, side effects, usage guidance, and return format, making it complete for this simple tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 100% coverage with a parameter description that repeats parts of the tool description. The description adds no new semantic detail beyond what is already in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the verb and resource ('Permanently delete a collection') and specifies that products inside are not deleted, distinguishing it from tools like delete_product or remove_products_from_collection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises confirming the collection ID with get_collection before calling, which is a clear when-to-use guideline and suggests an alternative verification step.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_draft_orderA
Permanently delete a draft order. Only OPEN/INVOICE_SENT drafts can be deleted — completed drafts are real orders and orders cannot be deleted (cancel them instead). Irreversible. Returns the deleted GID, or a no-op message if the GID didn't match anything.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | GID of a draft order to delete. Permanent. Cannot delete drafts that have been completed (those are real orders — orders cannot be deleted, only cancelled or archived). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully covers behavioral traits: irreversibility, state constraints, and return format (deleted GID or no-op). No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, each providing essential information. Front-loaded with the main action. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the single parameter, no output schema, and no annotations, the description provides complete context: purpose, constraints, irreversibility, and return value.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single parameter id, so baseline is 3. The description adds context about return behavior, slightly enhancing understanding beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: 'Permanently delete a draft order.' It specifies constraints on which drafts can be deleted (OPEN/INVOICE_SENT) and distinguishes from siblings like cancel_order for completed drafts/orders.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use (only for OPEN/INVOICE_SENT drafts), what not to use (completed drafts are real orders), and provides an alternative ('cancel them instead'). Also describes return behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_metafieldA
Permanently delete a single metafield by (ownerId, namespace, key). Irreversible — the value is gone after this call. Use list_metafields first to confirm the namespace and key, since typos result in a no-op rather than an error. Other metafields on the same resource are unaffected. To delete every metafield on a resource, you'd need a list+loop pattern; this tool only deletes one at a time.
| Name | Required | Description | Default |
|---|---|---|---|
| ownerId | Yes | GID of the owning resource. | |
| namespace | Yes | Metafield namespace. | |
| key | Yes | Metafield key. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that the deletion is irreversible, that other metafields on the same resource are unaffected, and that the operation is a no-op for invalid keys. With no annotations provided, this fully informs the agent of the tool's behavioral traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, front-loaded with the core purpose, and each sentence adds necessary context without redundancy. It efficiently covers irreversibility, prerequisites, and limitations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no output schema and no annotations, the description adequately covers deletion behavior, safety notes, and usage patterns. Minor gap: no mention of the response (e.g., whether it returns success or the deleted entity), but this is not critical for an agent to use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides descriptions for all three parameters (100% coverage), so the description adds no additional semantic detail beyond restating the parameter names. The baseline of 3 is appropriate as the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with 'Permanently delete a single metafield by (ownerId, namespace, key)', which is a specific verb and resource with the required parameters. It clearly distinguishes this tool from siblings like set_metafield and delete_metaobject by specifying the exact identification triple.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly recommends using list_metafields first to confirm namespace and key, warns that typos cause a no-op rather than an error, and explains that only one metafield is deleted per call (not bulk). This provides clear guidance on when and how to use the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_metaobjectA
Permanently delete a metaobject by GID. Irreversible. Any metafield references pointing at this metaobject will become broken — Shopify does NOT auto-clean references, you have to find and fix them. Use get_metaobject to confirm the right record before deleting. Returns the deleted GID, or a no-op message if nothing matched.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | GID of the metaobject to delete. Irreversible; metafield references to this metaobject become broken (Shopify does not auto-clean referrers). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description fully covers behavioral traits: irreversible, metafield references become broken (Shopify does not auto-clean), and return behavior (deleted GID or no-op message).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, no fluff. Front-loaded with purpose, then consequences, then usage tip, then return info. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but description specifies return values. Covers purpose, side effects, prerequisite action, and result. Complete for a single-parameter delete tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema already covers the parameter with 100% coverage. Description adds value by reiterating the irreversible nature and the consequence of broken references, plus the return behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'Permanently delete a metaobject by GID', specifying the action and resource. Distinguishes from sibling tools like update_metaobject and get_metaobject.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises to use get_metaobject to confirm the record before deleting, and highlights irreversibility and broken references. Provides clear usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_variantsA
Permanently delete one or more variants from a product. Irreversible. Each product must keep at least one variant — Shopify rejects requests that would empty the product (delete the whole product via update_product status:ARCHIVED, or use the admin UI for full deletion). Variants in completed orders are kept-but-hidden by Shopify automatically; the historical record on the order is preserved.
| Name | Required | Description | Default |
|---|---|---|---|
| productId | Yes | Product GID. | |
| variantIds | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden. It discloses irreversibility, the constraint on minimum variants, and how completed order variants are handled (kept-but-hidden). Lacks info on authorization or rate limits, but is otherwise transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each adding critical information: action, irreversibility constraint, and nuance about order preservation. No wasted words; front-loaded with the primary purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description covers the main behavioral aspects of the tool: irreversibility, the constraint on emptying a product, and order preservation. Missing details on error handling or return values, but sufficient for a deletion tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 50% coverage: productId has a basic description ('Product GID.'), variantIds has none. The description implies variantIds by saying 'one or more variants' but adds no detail about format or constraints beyond schema. Does not clarify that productId is a GID or how to obtain it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it 'permanently delete[s] one or more variants from a product', specifying the action, resource, and scope. It distinguishes from siblings like delete_product by mentioning the alternative for whole product deletion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'permanently delete' indicates finality. Provides when-to-use guidance by noting that 'Each product must keep at least one variant' and that 'Shopify rejects requests that would empty the product', advising against deleting the last variant. Also clarifies behavior for completed orders.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_webhookA
Permanently unsubscribe from an event topic by deleting the webhook subscription. Stops all future deliveries to that endpoint for that topic — irreversible (you'd have to re-create with create_webhook). Use when retiring an integration or switching topics. Returns the deleted GID, or a no-op message if nothing matched.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Webhook subscription GID to delete. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries the full burden. It discloses irreversibility and what the tool returns (deleted GID or no-op). Could mention any prerequisites like authentication, but overall sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences: first defines the action, second provides usage context, third describes return. No redundant information; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple deletion tool with one parameter and no output schema, the description covers all necessary aspects: purpose, irreversibility, usage scenarios, and return value.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 100% coverage with a clear description for the single parameter. Description adds no additional parameter details beyond the schema, which is adequate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: 'Permanently unsubscribe from an event topic by deleting the webhook subscription.' It specifies the resource (webhook subscription) and distinguishes from sibling tools like create_webhook, update_webhook, and list_webhooks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use: 'Use when retiring an integration or switching topics.' It also notes that deletion is irreversible and that re-creation requires create_webhook, providing an alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_collectionA
Fetch a single collection by GID with full details — title, handle, sort order, description, and the first N products inside it. Pass productsFirst=0 for metadata-only when you don't need the products array. Returns a friendly text view; pageInfo flags when more products exist beyond the requested page.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Collection GID, e.g. 'gid://shopify/Collection/123456'. Get one from list_collections. | |
| productsFirst | No | How many products to include alongside the collection. Pass 0 to skip products entirely (faster for collection-only metadata). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. States return is a 'friendly text view' and that pageInfo flags product existence. Lacks details on idempotency, authorization needs, or whether it's a pure read operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two clear, well-structured sentences. Front-loads purpose, no fluff. Every sentence provides actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, description adequately covers return fields (title, handle, etc.) and pagination info. Could mention error cases or format details for a higher score.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Both parameters documented in schema (100% coverage). Description adds value by explaining practical use of productsFirst=0 and pageInfo behavior, going beyond schema definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description uses specific verb 'Fetch' and specifies resource 'single collection by GID' with detailed fields (title, handle, etc.). Clearly distinguishes from sibling tools like list_collections or create_collection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance for using productsFirst=0 for metadata-only. Mentions pageInfo for pagination, but could be more explicit about when to prefer this over list_collections or other collection tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_draft_orderA
Fetch a single draft order with full details: status, customer, line items (with quantity, title, and unit price), invoice URL, and the resulting real order if it's already been completed. Use to inspect a draft before calling update_draft_order or complete_draft_order. Returns a friendly text summary.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Draft order GID, e.g. 'gid://shopify/DraftOrder/12345'. Get one from list_draft_orders. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. Describes read-only behavior and details of return value. Lacks information on error handling or permissions, but for a fetch tool this is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, no filler. Front-loaded with purpose and return details. Every sentence contributes meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Simple tool with one param. Description covers what, when, and return format. Missing error conditions, but overall sufficient for agent use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 100% coverage with id description. Description adds value by suggesting source of ID ('Get one from list_draft_orders'), aiding parameter generation beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states verb 'Fetch' and resource 'single draft order', lists specific details returned, and differentiates from siblings like update_draft_order and complete_draft_order.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly recommends using before update_draft_order or complete_draft_order, providing clear context. Does not mention alternatives like list_draft_orders, but the guidance is sufficient for agent decision.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_fulfillmentA
Fetch a single fulfillment (a shipment record produced by create_fulfillment) by GID. Returns its status (SUCCESS/CANCELLED/etc.), tracking entries (carrier, number, URL), the parent order, and timestamps. Use after create_fulfillment to confirm the shipment took, or when a webhook delivers a fulfillment GID and you need the details.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Fulfillment GID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It explicitly lists returned fields (status, tracking entries, parent order, timestamps) and implies a read-only operation. While it doesn't mention authentication or rate limits, for a simple fetch tool this is sufficient and transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no fluff. First sentence states purpose and returns, second provides usage guidance. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 1-parameter retrieval tool with no output schema, the description fully covers what it does, when to use it, and what to expect. No gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter 'id' with schema description 'Fulfillment GID.' The description mentions 'by GID' and 'delivers a fulfillment GID,' reinforcing the parameter's meaning. With 100% schema coverage, the description adds marginal value beyond the schema, so baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Fetch' and identifies the resource 'fulfillment' with clarification that it's a shipment record. It distinguishes from sibling tools like list_fulfillment_orders (list) and cancel_fulfillment (cancel) by specifying a single item retrieval by GID.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states two usage scenarios: after create_fulfillment to confirm the shipment, and when a webhook provides a fulfillment GID needing details. This provides clear when-to-use guidance and context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_fulfillment_orderA
Fetch a single fulfillment order by GID with its full line-item set and remaining quantities. Use this when you have the FulfillmentOrder ID directly (e.g. from a webhook payload) and want detail without having to look up its parent order first. Returns the same shape as list_fulfillment_orders for one record.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | FulfillmentOrder GID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description adequately discloses behavior: it is a read operation ('Fetch'), returns line-item set and remaining quantities, and avoids parent lookup. It does not mention error handling or rate limits, but for a simple fetch tool this is sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler words. Front-loaded with the core action and returns. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with no output schema, the description covers the return values and use case. It could mention potential errors (e.g., invalid GID) but is complete enough for effective tool selection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the parameter 'id' is described as 'FulfillmentOrder GID.' The description repeats this in prose ('by GID') but does not add extra meaning beyond the schema. Baseline score is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Fetch') and resource ('fulfillment order by GID') and specifies what it returns ('full line-item set and remaining quantities'). It distinguishes itself from list_fulfillment_orders by noting it returns a single record.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use this tool ('when you have the FulfillmentOrder ID directly from a webhook payload') and what advantage it offers ('without having to look up its parent order'). Also references a sibling tool ('same shape as list_fulfillment_orders'), providing clear guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_metaobjectA
Fetch a single metaobject by GID and return its display name, handle, type, publishable status, and all of its field values. Field values longer than 120 characters are truncated in the rendered output (full values are still on the underlying record). Use list_metaobjects to discover GIDs first.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Metaobject GID, e.g. 'gid://shopify/Metaobject/123456'. Discover GIDs via list_metaobjects. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses a key behavioral detail: field values longer than 120 characters are truncated in the rendered output (but full values remain on the underlying record). This is critical for an agent to set expectations. It doesn't cover authentication or rate limits, but for a read-only operation, the disclosure is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core purpose, immediately followed by the truncation detail and usage advice. Every part is essential and well-organized, with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Although there is no output schema, the description explicitly lists what is returned (display name, handle, type, publishable status, all field values) and notes the truncation behavior. This gives agents a clear understanding of the response content. It could mention any pagination or sorting, but given the tool fetches a single item by ID, it is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter 'id' has 100% schema description coverage with an example GID and a reference to list_metaobjects. The description adds value by repeating and contextualizing the schema's guidance on discovering GIDs, reinforcing the workflow. This goes beyond what the schema alone provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the exact verb ('Fetch'), the resource ('single metaobject'), the method of identification ('by GID'), and the specific fields returned ('display name, handle, type, publishable status, and all of its field values'). It also notes the truncation behavior, which adds precision. The purpose is distinct from sibling tools like 'list_metaobjects' and 'list_metaobject_definitions'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs the agent to use 'list_metaobjects' first to discover GIDs, providing a clear prerequisite and pointing to the correct sibling tool for discovery. While it doesn't explicitly state when not to use this tool, the guidance is sufficient for an agent to understand the typical workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_orderA
Fetch a single order's full record by GID or numeric ID — includes header fields (email, totals, both status flags, timestamps), full line items (title + quantity), and the customer email if on file. Returned as JSON for downstream tooling. Use list_orders to discover order IDs first. To inspect or act on shipments for this order, follow up with list_fulfillment_orders.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Order GID ('gid://shopify/Order/123') or numeric ID — both forms accepted; numeric IDs are auto-promoted. Get one from list_orders. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It describes the return format (JSON) and accepted ID formats (GID or numeric ID with auto-promotion). It doesn't mention error cases or authentication, but for a simple fetch operation, it is adequately transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no wasted words. The first sentence clearly states the tool's purpose and what it returns. The second provides usage guidance. Structure is front-loaded and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read tool with one required parameter and no output schema, the description covers everything needed: what fields are returned, ID format, and how to discover IDs. It also connects to related tools (list_orders, list_fulfillment_orders).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter 'id' has a schema description that is 100% complete. The description adds extra context about accepting both GID and numeric ID forms, that numeric IDs are auto-promoted, and where to get an ID (list_orders).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Fetch a single order's full record' and lists specific fields (email, totals, status flags, timestamps, line items, customer email). It distinguishes itself from sibling tools like list_orders and list_fulfillment_orders.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises to 'Use list_orders to discover order IDs first' and suggests a follow-up with list_fulfillment_orders for shipments. This provides clear when-to-use and which alternative tools to use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_productA
Fetch a single product's full record by GID or numeric ID. Returns header fields (title, handle, status, vendor, productType, description, tags), inventory totals, the first 10 images and 10 media items, and the first 20 variants with their prices, SKUs, inventory quantities, and inventoryItem GIDs. Returned as JSON for downstream tooling. The variant inventoryItem GIDs are needed by set_inventory_quantity. For more than 20 variants, follow up with list_variants.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Product GID (gid://shopify/Product/123...) or numeric ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It describes the return data in detail (header fields, inventory totals, first 10 images/media, first 20 variants). It does not explicitly confirm it's read-only, but 'fetch' implies safe read. Additional context on downstream usage adds transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the purpose, and efficiently conveys essential information without any extraneous text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description must explain return values. It does so by listing header fields, inventory totals, images, media, and variants with details. It also addresses limitations (first 20 variants) and provides follow-up guidance. Missing error handling or edge cases, but adequate for a simple fetch tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage with a detailed description of the 'id' parameter. The description repeats the ID type (GID or numeric) and adds context on return format (JSON), but does not add meaning beyond what the schema already provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it fetches a single product's full record by GID or numeric ID. It specifies what data is returned and distinguishes itself from other get_* tools for different resources (e.g., get_collection, get_order).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides guidance on follow-up actions: using variant inventoryItem GIDs for set_inventory_quantity and using list_variants for more than 20 variants. It does not explicitly state when not to use this tool or alternatives like list_products, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_webhookA
Fetch a single webhook subscription's full configuration by GID — topic, endpoint, format, API version, includeFields filter, metafield namespaces, and timestamps. Use to verify subscription details before update or delete, or when debugging delivery issues.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Webhook subscription GID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Clearly indicates a read-only operation ('Fetch'), with no annotations to contradict. Discloses that the response includes full configuration details, which is consistent with a read tool. Lacks mention of permissions or rate limits but is acceptable for a simple fetch.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences: first states action and output details, second provides usage guidance. No wasted words, front-loaded with key information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description enumerates the returned fields (topic, endpoint, format, etc.), making the tool's output clear. Usage guidance completes the picture for a simple read tool. No gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers the single parameter 'id' with description 'Webhook subscription GID' at 100% coverage. The description reaffirms 'by GID' and lists returned fields, adding some context but not significantly beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Fetch' and resource 'single webhook subscription's full configuration', listing included fields (topic, endpoint, etc.), clearly distinguishing it from list_webhooks (multi) and create/update/delete siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use: 'Use to verify subscription details before update or delete, or when debugging delivery issues.' Does not mention alternatives explicitly, but context is sufficient for an agent to decide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_collectionsA
List collections in the store, most recently updated first. Returns each collection's title, handle, ID, and product count. Supports Shopify's collection query syntax for filtering by title, type, or update time. Cursor-paginated; pass after from the previous response to advance. Use this to find a collection's GID before calling get_collection, update_collection, or add_products_to_collection.
| Name | Required | Description | Default |
|---|---|---|---|
| first | No | Page size (1-100). Lower this if responses get truncated. | |
| query | No | Shopify collection query syntax. Examples: 'title:summer*' (prefix match), 'collection_type:smart' (filter to smart collections), 'updated_at:>2026-01-01'. | |
| after | No | Cursor from a prior page's pageInfo. Pass to fetch the next page; omit on the first call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description bears full burden. Discloses readonly nature implicitly ('list') and pagination behavior, but does not explicitly state safety or error conditions. Adequate for a simple read operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very concise: three focused sentences covering purpose, return fields, pagination, and usage. No filler, each sentence earns its place. Front-loaded with primary action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but description lists return fields. Covers pagination mechanics and query syntax. Lacks details on error handling or edge cases, but sufficient for a list tool with three simple parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and description adds value beyond schema by explaining cursor usage, query examples, and performance tip for 'first' parameter. Enhances usability without redundancy.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the action: 'List collections in the store, most recently updated first.' Specifies return fields (title, handle, ID, product count) and distinguishes from siblings like get_collection by stating it's used to find a collection's GID before other operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance: 'Use this to find a collection's GID before calling get_collection, update_collection, or add_products_to_collection.' Also explains cursor pagination and query syntax. Lacks explicit 'when not to use' but offers clear context for its role.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_customersA
List customers in the store, newest first by creation date. Returns each customer's display name, email, lifetime order count, and total amount spent (in shop currency). Supports Shopify's customer query syntax for filtering by email, tag, order count, spend, marketing-consent, account state, and more. Cursor-paginated; pass after to advance pages. Use this to find customer GIDs before referencing them in draft orders or to segment for marketing.
| Name | Required | Description | Default |
|---|---|---|---|
| first | No | Page size (1-100). | |
| query | No | Shopify customer query syntax. Examples: 'email:*@gmail.com' (domain match), 'tag:vip' (tagged), 'orders_count:>=5' (repeat customer), 'amount_spent:>=500' (high value), 'state:enabled', 'accepts_marketing:true'. Combine with AND/OR. | |
| after | No | Cursor from the previous page's pageInfo for pagination. Omit on the first call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden. It discloses ordering, filtering syntax, pagination method, and returned fields. However, it doesn't mention rate limits, authentication requirements, or idempotency. Adequate but not comprehensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no waste. It front-loads the primary purpose, then adds filtering/pagination details, and closes with practical use cases. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description is quite complete: it specifies returned fields, ordering, filtering, pagination, and use cases. It could mention potential errors or rate limits, but for a list operation, this is sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage for its 3 parameters. The description adds value by providing examples of query syntax and explaining pagination context, going beyond the schema descriptions. Baseline 3 raised to 4 for this added context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('List customers'), the resource ('customers'), and adds ordering ('newest first by creation date') and returned fields. It distinguishes itself from sibling tools like 'create_customer' and 'update_customer' by focusing on listing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool: 'to find customer GIDs before referencing them in draft orders or to segment for marketing.' It also mentions filtering capabilities. However, it does not explicitly state when NOT to use it or provide alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_draft_ordersA
List draft orders (carts/quotes that haven't yet been completed into real orders), most recently updated first. Returns each draft's name (e.g. 'D1023'), status (OPEN/COMPLETED/INVOICE_SENT), total price, customer name, and whether it's already been converted to an order. Supports Shopify's draft-order query syntax for filtering by status, customer, tag, or update time. Cursor-paginated.
| Name | Required | Description | Default |
|---|---|---|---|
| first | No | Page size (1-100). | |
| query | No | Shopify draft order query syntax. Examples: 'status:OPEN' (not yet completed), 'status:COMPLETED', 'customer_id:1234567890', 'tag:wholesale', 'updated_at:>=2026-01-01'. | |
| after | No | Cursor from the previous page's pageInfo. Omit on the first call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It discloses cursor-based pagination, filtering, and returned data. Does not mention auth or rate limits, but adequately covers key behaviors.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single paragraph well-organized: purpose, return fields, filtering, pagination. No redundant sentences, every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but description enumerates returned fields. Covers pagination, sorting, filtering, and query syntax. Complete for a list tool operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema descriptions cover 100% of parameters. Description adds value through examples for the 'query' parameter, going beyond the schema. Still room for more detail on cursor usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it lists draft orders with definition, ordering, and returned fields. Distinguishes from siblings like get_draft_order and complete_draft_order through context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies usage for listing all draft orders, mentions filtering syntax, but lacks explicit when-to-use vs alternatives like get_draft_order. However, context signals are clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_fulfillment_ordersA
List the fulfillment orders attached to a Shopify order. A fulfillment order groups line items by the location that will ship them — a single order can have multiple fulfillment orders if items split across warehouses. Each one tracks per-line remaining quantity (totalQuantity minus what's already shipped/cancelled). Returns the assigned location, destination address, and line-item progress for each. This is the primary read tool you'll call before create_fulfillment to figure out which fulfillmentOrderLineItem IDs and quantities to mark as shipped.
| Name | Required | Description | Default |
|---|---|---|---|
| orderId | Yes | Order GID to list fulfillment orders for (e.g. gid://shopify/Order/123). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even without annotations, the description discloses key behaviors: multiple fulfillment orders can exist per order, remaining quantity calculation, and returned fields (location, destination, line-item progress).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is detailed yet concise, front-loading the primary action and providing necessary context in a structured manner without unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with one parameter and no output schema, the description adequately explains the purpose, usage flow, and return values, making it complete for the AI agent to select and invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 100% coverage with a clear description and example for orderId. The description adds some context but does not significantly enhance parameter understanding beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists fulfillment orders for a Shopify order, explains what fulfillment orders are, and distinguishes it from related tools like create_fulfillment and get_fulfillment_order.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly positions this as the primary read tool before create_fulfillment, providing clear context for when to use it, though it does not explicitly state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_locationsA
List the store's locations — physical or virtual places where inventory is stocked or fulfilled from (warehouses, retail stores, drop-ship partners). Returns each location's name, active/inactive flag, city + country, and GID. The location GID is required by set_inventory_quantity and create_fulfillment. Inactive locations still exist but cannot accept new inventory or fulfillments.
| Name | Required | Description | Default |
|---|---|---|---|
| first | No | Page size (1-100). Most stores have under a dozen locations. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It discloses return fields, explains inactive location behavior, and implies read-only nature. Lacks mention of authentication, but otherwise transparent for a list tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences pack essential information without redundancy. Front-loaded with purpose, followed by return details, cross-references, and behavior note. Efficient and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, description compensates by listing returned fields and explaining GID usage and inactive location constraints. For a simple list tool with one parameter, it is fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter 'first' with schema coverage 100%. The description adds no additional meaning beyond the schema, which already details min/max/default and a note. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool lists store locations (physical or virtual), specifies types (warehouses, retail stores, drop-ship partners), and lists returned fields (name, active/inactive flag, city+country, GID). It is specific and distinguishes within the context of inventory and fulfillment operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Description explains that location GID is required by set_inventory_quantity and create_fulfillment, and that inactive locations cannot accept new inventory or fulfillments. This provides clear when-to-use context, though no explicit alternatives among siblings are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_metafieldsA
List metafields attached to a single Shopify resource. Returns each metafield's namespace.key, type, current value, and optional description. Pass a namespace to scope the read to one app/integration's metafields (recommended when the resource has many). Empty result is normal for resources without metafields. Use this to inspect existing custom data before calling set_metafield, or to audit which apps have written what to a record.
| Name | Required | Description | Default |
|---|---|---|---|
| ownerId | Yes | GID of the resource to read metafields from. | |
| namespace | No | Filter to a single namespace. Omit to return all. | |
| first | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description carries the full burden. It correctly identifies this as a read operation, describes the output fields, and normalizes empty results. It does not mention pagination beyond the 'first' parameter which is already in schema, but overall behavior is well-conveyed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences: first states purpose, second explains return content, third gives usage guidance. Front-loaded with key information, no fluff, every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a list tool with 3 parameters and no output schema, the description covers purpose, return structure, usage context, and a common scenario (empty results). It could mention pagination behavior (cursor-based) but overall is fairly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds context for the 'namespace' parameter (scope to one app/integration, recommended for many metafields). However, it does not mention the 'first' parameter (pagination) though schema has 67% coverage. The description provides some added value beyond schema but not fully compensates for the missing parameter description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists metafields for a single Shopify resource, specifies what is returned (namespace.key, type, value, description), and distinguishes from siblings like set_metafield and delete_metafield. It is specific with verb and resource.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context: use before set_metafield or for auditing, and recommends passing namespace when resource has many metafields. However, it does not explicitly state when not to use it or name alternative tools beyond set_metafield.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_metaobject_definitionsA
List the metaobject definitions (custom types/schemas) registered on this Shopify store, with their field definitions. Each definition declares a type handle, a set of typed fields, and which fields are required. Use this tool to discover what custom data shapes the store supports before calling list_metaobjects (which queries instances of one type) or create_metaobject (which creates a new instance). Cursor-paginated.
| Name | Required | Description | Default |
|---|---|---|---|
| first | No | Page size (1-100). 25 is usually plenty — most stores have <50 metaobject types total. | |
| after | No | Cursor from a prior page's pageInfo. Omit on the first call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, but description discloses pagination (cursor-paginated) and the returned content (field definitions, type handle, required fields). Could mention access requirements or rate limits, but for a read-only list tool, it is fairly transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences: first states purpose, second explains content, third gives usage guidance and pagination. Front-loaded and concise with no waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, description explains what definitions contain (type handle, field definitions, required fields) and mentions pagination. Adequate for a list tool with two parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the description adds practical guidance: '25 is usually plenty — most stores have <50 metaobject types total' and explains cursor usage for pagination, enhancing understanding beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (list metaobject definitions) and the resource (custom types/schemas on Shopify store). It differentiates from siblings by explicitly mentioning usage before list_metaobjects and create_metaobject.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises when to use the tool: before calling list_metaobjects or create_metaobject. Implicitly excludes using it for querying instances or creating instances, providing clear context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_metaobjectsA
List instances of a single metaobject type — e.g. all 'lookbook' or 'product_feature' entries. Returns each metaobject's display name, handle, GID, and (when the type is publishable) ACTIVE/DRAFT status. The type handle comes from list_metaobject_definitions. Cursor-paginated; pass after to advance pages. To inspect an individual metaobject's full field values, follow up with get_metaobject.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | Metaobject type handle (e.g. 'lookbook', 'product_feature', '$app:landing_page'). Get valid values from list_metaobject_definitions. Custom app namespaces use the '$app:' prefix. | |
| first | No | Page size (1-100). | |
| after | No | Cursor from a prior page's pageInfo. Omit on the first call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes return fields (name, handle, GID, status for publishable types) and cursor pagination with `after` parameter. No annotations exist, so the description carries the burden; it adequately covers read-only behavior and pagination, though could explicitly state non-destructiveness.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four concise sentences, front-loaded with purpose, no redundant information. Every sentence adds necessary context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description sufficiently explains return fields and pagination. It references sibling tools appropriately, making it complete for a listing tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All three parameters are described in schema (100% coverage). Description adds value by explaining the meaning of `type` (from list_metaobject_definitions) and cursor usage for `after`, beyond schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states the tool lists instances of a single metaobject type, with concrete examples ('lookbook', 'product_feature'). It differentiates from siblings like get_metaobject (individual) and list_metaobject_definitions (type list).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context: use for listing instances of a type, obtain type handle from list_metaobject_definitions, and follow up with get_metaobject for full details. Implicitly advises when to use alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_ordersA
List orders in the store, newest first by creation date. Returns each order's name (e.g. '#1042'), total price (in shop currency), financial status (paid/pending/refunded), fulfillment status (fulfilled/unfulfilled/partial), and timestamp. Supports Shopify's order query syntax for filtering by status, date range, customer, tags, and more. Cursor-paginated; the last line shows the next cursor when more pages exist. Use this to find order GIDs before calling get_order or list_fulfillment_orders.
| Name | Required | Description | Default |
|---|---|---|---|
| first | No | Page size (1-100). | |
| query | No | Shopify order query syntax. Common filters: 'financial_status:paid' (paid/pending/refunded/voided), 'fulfillment_status:unfulfilled' (unfulfilled/fulfilled/partial), 'status:open' (open/closed/cancelled), 'created_at:>=2026-01-01', 'tag:wholesale', 'name:#1001'. Combine with AND/OR/NOT. | |
| after | No | Cursor from a prior page's pageInfo for pagination. Omit on the first call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden. It discloses pagination behavior (cursor-based, next cursor shown), ordering (newest first), and query syntax. It does not mention error handling or rate limits, but for a read-only list tool this is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loading the main purpose and returned fields, then adding pagination and usage guidance. Every sentence adds value with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description enumerates the returned fields (name, total price, financial status, fulfillment status, timestamp) and covers pagination, ordering, and filtering. This is complete for a list tool given the context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 100% description coverage for all 3 parameters. The description adds value by explaining the cursor-paginated behavior (relevant to 'after'), providing examples of common query filters (relevant to 'query'), and setting default page size context. This goes beyond the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it lists orders with specific returned fields (name, total price, financial status, fulfillment status, timestamp) and mentions ordering by creation date. It distinguishes itself from siblings like get_order and list_fulfillment_orders by noting it is used to find order GIDs before those calls.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Description explicitly states when to use this tool: to find order GIDs before calling get_order or list_fulfillment_orders. It also describes supported query syntax for filtering. While it doesn't explicitly list when not to use, the context is clear and provides sufficient guidance for an AI agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_productsA
List products in the store with cursor-based pagination. Returns each product's title, status (ACTIVE/DRAFT/ARCHIVED), GID, and total inventory across all variants/locations. Supports Shopify's product query syntax for filtering by status, vendor, type, tag, title (wildcard), and date ranges. The last line of output shows the next cursor when more pages exist — pass it as after on the next call. Use this to find product GIDs before calling get_product, update_product, list_variants, or any product-scoped tool.
| Name | Required | Description | Default |
|---|---|---|---|
| first | No | ||
| query | No | Shopify query syntax, e.g. 'status:active', 'title:*shirt*', 'vendor:MyVendor' | |
| after | No | Cursor from a previous page |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description must disclose behavioral traits. It explains cursor-based pagination, that last line shows next cursor, and that it returns total inventory across all variants/locations. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each serving a distinct purpose: action+returns, query syntax, pagination, usage context. No redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but description explains return fields and pagination. Covers query syntax and usage context thoroughly. Complete for a list tool with 3 parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% (2 of 3 params have descriptions). Description adds value by explaining query syntax with examples and clarifying pagination cursor usage. First parameter lacks explicit description but has default/min/max in schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it lists products with cursor-based pagination, specifies return fields (title, status, GID, total inventory), and mentions Shopify query syntax. This is specific and distinguishes from siblings like get_product (single product) and list_variants (variants).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use: to find product GIDs before calling product-scoped tools. Describes pagination pattern and query filtering capabilities. Does not explicitly state when not to use, but context is clear from sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_variantsA
List all variants of a single product, plus the product's option definitions (Size, Color, etc.) and possible values. For each variant returns: title, GID, price, compareAtPrice, SKU, barcode, current inventory quantity, taxable flag, inventory policy, and the option-value combination that produced it. Use to inspect a product's full SKU matrix before calling create_variants/update_variants/delete_variants.
| Name | Required | Description | Default |
|---|---|---|---|
| productId | Yes | Product GID. | |
| first | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It accurately describes the data returned (read-only) and lists fields, but does not mention pagination behavior or cursor handling despite the 'first' parameter. No destructive side effects are claimed, so no contradiction, but missing pagination details reduces transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences: first sentence defines scope, second enumerates returned fields, third provides usage guidance. No unnecessary words, highly efficient and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 2 parameters and no output schema, the description gives a comprehensive overview of returned data and usage context. However, it lacks explanation of pagination mechanics for the 'first' parameter, which is needed for large product variant lists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 50%: productId is described as 'Product GID' but 'first' lacks any description. The description adds no extra meaning for 'first' beyond its existence, failing to compensate for the missing schema description. For a parameter controlling result count, this is a significant gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it lists all variants of a single product along with option definitions and possible values, specifying the exact fields returned. It explicitly distinguishes from sibling mutation tools (create_variants, update_variants, delete_variants) by advising use before calling them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use it 'to inspect a product's full SKU matrix before calling create_variants/update_variants/delete_variants,' providing clear context. It does not explicitly state when not to use, but the read-only nature is implicit and alternatives are implied by sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_webhooksA
List webhook subscriptions on the store. Each subscription wires a Shopify event topic (ORDERS_CREATE, PRODUCTS_UPDATE, INVENTORY_LEVELS_UPDATE, etc.) to a delivery target — typically an HTTPS callback URL, but Pub/Sub and EventBridge are also supported. Returns each subscription's topic, delivery format (JSON/XML), endpoint, API version, and any field/metafield filters applied. Filter by topic to scope the result. Use this to audit existing automation hooks before creating new ones.
| Name | Required | Description | Default |
|---|---|---|---|
| first | No | ||
| topics | No | Filter by WebhookSubscriptionTopic values, e.g. ['ORDERS_CREATE', 'PRODUCTS_UPDATE']. Use uppercase underscore form. | |
| after | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the returned fields (topic, delivery format, endpoint, etc.) and mentions filtering by topic. However, it does not explain pagination behavior (though schema suggests it via 'first' and 'after' parameters) or potential performance implications of listing many webhooks.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, with no unnecessary words. It front-loads the core action and then adds relevant details in a structured manner, making it easy for an AI agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite lacking an output schema, the description lists key return fields (topic, delivery format, endpoint, API version, filters). It also explains the filtering option. It does not mention pagination or ordering, but overall it provides sufficient context for a list operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only 33% of parameters have schema descriptions. The description adds value by explaining the 'topics' filter and providing example values. It does not elaborate on 'first' (page size) or 'after' (cursor) beyond their schema definitions, which is a gap given low coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'List webhook subscriptions on the store.' It explains what webhooks are and mentions specific event topics, delivery targets, and returned fields. This distinguishes it from siblings like 'create_webhook', 'delete_webhook', and 'get_webhook'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description advises using the tool to 'audit existing automation hooks before creating new ones,' which provides clear context for when to use it. However, it does not explicitly state when not to use it or mention alternatives like 'get_webhook' for individual subscriptions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
refund_orderA
Issue a refund against an order — for specific line items (with quantities and optional restock behaviour), for shipping, or both. Returns the new refund's GID and total amount refunded. To refund a full order use cancel_order with refund=true instead (one-step). Use this tool when refunding partially: just one item, just shipping, an adjustment without item breakdown, or a return that needs explicit restock-to-location handling. The restockType per line item controls inventory behaviour: NO_RESTOCK (default — the items aren't coming back), CANCEL (restock as if cancelled), RETURN (restock with a return record at the given locationId). Pass notify: true to email the customer.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Order GID or numeric ID to refund. | |
| refundLineItems | No | Specific line items to refund with quantities. Omit to do a refund without item-level breakdown (use for shipping-only or adjustment refunds). | |
| shipping | No | Refund part or all of shipping. Pass {fullRefund: true} to refund everything paid in shipping; or {amount: '5.00'} for a specific amount. | |
| currency | No | ISO currency code. Required for multi-currency stores; defaults to the order's currency otherwise. | |
| note | No | Internal note explaining the refund. | |
| notify | No | Email the customer a refund notification. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries the full burden. It explains return values (refund GID and total amount), restockType behaviors, and the notify option. However, it does not mention idempotency, rate limits, or authorization requirements, which are common behavioral concerns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is moderately sized and front-loaded with the core action. It efficiently covers key details without unnecessary repetition. Minor improvement could be made by structuring it into bullet points for quick scanning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the moderate complexity (6 parameters, nested objects) and lack of output schema, the description is complete: it covers what the tool does, when to use it, parameter behaviors, return values, and customer notification. No obvious gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, but the description adds value by clarifying when to omit refundLineItems, explaining the restockType enum in practical terms, and describing shipping options. This goes beyond the schema's basic descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The tool's purpose is clearly stated: it issues a refund for specific line items, shipping, or both. It distinguishes from the sibling tool cancel_order by explicitly noting that refund_order is for partial refunds, while cancel_order with refund=true handles full refunds.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly outlines when to use this tool versus cancel_order, and provides scenarios such as refunding a single item, shipping, or an adjustment. It also explains the restockType controls and the notify parameter.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_products_from_collectionA
Remove one or more products from a manual collection. Like add_products_to_collection, this runs as an async job for larger batches — the response includes job ID and done status. Products not currently in the collection are silently skipped. Removes the membership only; products themselves are not deleted or modified.
| Name | Required | Description | Default |
|---|---|---|---|
| collectionId | Yes | GID of a manual collection. | |
| productIds | Yes | Product GIDs to remove. Products not currently in the collection are silently ignored. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses behavioral traits: async execution for larger batches (response includes job ID and done status), silent skipping of non-members, and that it only removes membership without deleting or modifying products. This is comprehensive for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, each delivering specific value: the action, async note, confirmation that products are not deleted. No unnecessary words, and the core purpose is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers essential aspects: what it does, how it works (async, silent skip), and what it does not do (delete products). The schema fully documents parameters. Without an output schema, the mention of job ID and done status is sufficient context. Sibling references help orientation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers both parameters fully (100% description coverage). The description adds context about the response structure and async behavior but does not add new meaning to the parameters themselves beyond what is in the schema. Thus a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (remove products from a manual collection) and distinguishes it from the sibling tool add_products_to_collection by referencing its similarity. It also mentions async behavior for larger batches, adding specificity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description tells when to use the tool (to remove products from a manual collection) and provides context about silent skipping of products not in the collection. It references the sibling tool add_products_to_collection, giving a comparison, but does not explicitly list when not to use or alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_tagsA
Remove tags from any taggable Shopify resource (Product, Order, Customer, DraftOrder, Collection, Article, Blog). Tags not currently on the resource are silently ignored. To replace the full tag set rather than remove specific ones, use update_product/update_customer/etc. with the new tag list.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | GID of any taggable resource — Product, Order, Customer, DraftOrder, Collection, Article, Blog. The tool name does the verb (add vs remove); pick the right tool for the operation. | |
| tags | Yes | Tag strings to add (or remove). Shopify normalises whitespace and case for matching but preserves the literal strings on display. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite no annotations, the description discloses the behavior of silently ignoring missing tags, implying idempotency. It does not cover auth or error handling, but the operation is simple and the disclosure is sufficient for most use cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no redundancy, and front-loaded with the core action and resource list. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity, no output schema, and two well-documented parameters, the description fully satisfies what an agent needs: what it does, how it behaves on missing tags, and alternatives.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema covers 100% of parameters with detailed descriptions, including the GID format and normalization behavior. The tool description does not add new parameter-level information beyond the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Remove tags') and the scope ('any taggable Shopify resource'), listing specific resource types. It also distinguishes from sibling tools like update_product/update_customer that replace the full tag set, making purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states that absent tags are silently ignored and directs users to alternative tools for replacing the full tag set, providing clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reorder_variantsA
Set the display order of variants on a product. Positions are 1-indexed and must be unique across all variants in the product (you can't have two variants both at position 2). Affects the order variants appear on the product page and in Shopify admin. Only provide the variants whose positions are changing — others stay where they are.
| Name | Required | Description | Default |
|---|---|---|---|
| productId | Yes | Product GID. | |
| positions | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses that positions are 1-indexed and must be unique across variants, and that changes affect display order. It does not mention potential side effects like error handling or permissions, but for a mutation tool, it sufficiently explains the core behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with the purpose, and every sentence adds value. It is concise with no redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (2 required params, no output schema), the description fully covers constraints and usage. It explains position indexing, uniqueness, and partial updates. The agent can confidently invoke this tool without missing context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides minimal descriptions for productId and positions, but the description adds significant meaning: positions are 1-indexed, must be unique, and only changing variants need to be provided. This compensates for schema brevity and gives the agent clear instructions on how to fill the fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Set' and resource 'display order of variants on a product', specifying that it affects order on product page and admin. This distinguishes it from sibling tools like 'update_variants' or 'create_variants' which handle different aspects of variants.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a key guideline: 'Only provide the variants whose positions are changing — others stay where they are.' This tells the agent how to structure input. However, it does not explicitly state when to use this tool over alternatives, though no sibling tool exists for reordering, making the context clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_shopifyql_queryA
Run a ShopifyQL query against the store and return the result as a rendered ASCII table. ShopifyQL is Shopify's SQL-like analytics language. Examples: 'FROM sales SHOW total_sales BY day SINCE -30d TIMESERIES', 'FROM products SHOW product_title, quantity_sold BY product_id SINCE -7d ORDER BY quantity_sold DESC LIMIT 10'.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ShopifyQL query string. Example: 'FROM sales SHOW total_sales, gross_sales BY day SINCE -30d TIMESERIES' | |
| raw | No | Return the raw unformatted JSON payload instead of a rendered table. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It explains the output format (ASCII table or raw JSON) but does not explicitly state the tool is read-only or mention any side effects, auth requirements, or limits. It provides reasonable but not comprehensive behavioral cues.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: a single purpose sentence, a brief explanation of ShopifyQL, and two illustrative examples. Every sentence adds information, no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of output schema, the description adequately describes the return format and provides examples. However, it could mention error handling, query limits, or the read-only nature for completeness. Still, it covers the core functionality well.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides descriptions for both parameters (100% coverage). The description adds value by explaining ShopifyQL and giving concrete examples (e.g., 'FROM sales SHOW total_sales BY day SINCE -30d TIMESERIES'), which clarify the query parameter beyond the schema's brief description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Run a ShopifyQL query against the store and return the result as a rendered ASCII table', using a specific verb ('run'), resource ('ShopifyQL query'), and output format. It distinguishes itself from sibling CRUD tools by being a query/analytics tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not explicitly state when to use this tool versus alternatives, but its purpose as an analytics query tool is implied. No exclusions or alternative suggestions are provided, leaving the agent to infer usage context from the tool's name and examples.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_inventory_quantityA
Set the absolute available inventory for one variant at one location. This is a direct overwrite, not an adjustment — passing 5 sets the count to 5 regardless of what was there before. The pair (inventory_item_id, location_id) uniquely identifies the inventory level: get inventory_item_id from get_product (it's on each variant) and location_id from list_locations. Records a Shopify inventory adjustment with the reason code you provide. Use 'correction' for cycle counts/manual fixes, 'received' when receiving stock, 'cycle_count_available' for systematic counts. Tracks history; the audit log shows who/when via the API user.
| Name | Required | Description | Default |
|---|---|---|---|
| inventory_item_id | Yes | InventoryItem GID ('gid://shopify/InventoryItem/123') or numeric ID. Found on each variant in get_product output as variants[].inventoryItem.id. | |
| location_id | Yes | Location GID or numeric ID. Get from list_locations. Each variant tracks inventory per location. | |
| quantity | Yes | New absolute available quantity. This OVERWRITES the current count, it doesn't increment — pass the desired final number, not a delta. | |
| reason | No | Shopify-defined reason code recorded in the inventory audit history. Common values: 'correction' (manual fix), 'cycle_count_available' (systematic recount), 'received' (receiving new stock), 'damaged', 'shrinkage', 'other'. | correction |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It explains the overwrite behavior, uniqueness constraint, reason code recording, and audit logging. Does not mention side effects, but overall transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is 4 sentences, front-loaded with the main action, and each sentence adds useful information. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with 4 parameters, the description covers the operation, parameter origins, reason codes, and side effects (audit log). No output schema needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% but description adds value by explaining how to obtain inventory_item_id and location_id from other tools, and describes reason codes in detail beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the verb 'Set' and the resource 'absolute available inventory for one variant at one location'. It is specific and distinguishes from siblings as no other tool modifies inventory levels.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context on when to use (direct overwrite) and gives examples of reason codes with their typical use cases. Does not explicitly state when not to use, but no competing sibling tool exists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_metafieldA
Create or update (upsert) a single metafield on any supported Shopify resource — product, variant, collection, customer, order, draft order, shop, or shop policies. The (ownerId, namespace, key) triple is the unique identifier; calling this tool with an existing triple replaces the value, otherwise creates a new metafield. The type must be a Shopify-supported metafield type and the value must serialize per that type — e.g. JSON types take a JSON string, references take a target GID, primitives take literal text. Errors come back as MCP tool errors with the validation messages from Shopify.
| Name | Required | Description | Default |
|---|---|---|---|
| ownerId | Yes | GID of the resource to attach the metafield to (e.g. gid://shopify/Product/123, gid://shopify/Collection/456, gid://shopify/Customer/789, gid://shopify/Order/...) | |
| namespace | Yes | Metafield namespace (2-255 chars). Convention: app-specific prefix. | |
| key | Yes | Metafield key within the namespace (1-64 chars). | |
| type | Yes | Metafield type: 'single_line_text_field', 'multi_line_text_field', 'number_integer', 'number_decimal', 'boolean', 'json', 'url', 'date', 'date_time', 'rating', 'color', 'weight', 'volume', 'dimension', 'money', 'rich_text_field', or reference types like 'product_reference', 'collection_reference', 'file_reference'. | |
| value | Yes | Metafield value, serialized per the type. JSON/reference types take a JSON string; primitives take the literal string. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses upsert logic, type/value serialization, and error format via MCP. No annotations provided, so description carries burden. Covers key behaviors without contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single paragraph with clear logical flow: purpose, uniqueness, value format, error handling. No redundant sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but description omits return value on success. Given complexity, missing return info reduces completeness. Mentions errors but not success response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (baseline 3). The description adds context about the triple as unique identifier and serialization rules per type, adding value beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states the tool upserts a single metafield on supported Shopify resources, listing resource types. It clearly distinguishes from siblings like delete_metafield.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains the upsert behavior and unique triple, implying when to use. Alternative tools like delete_metafield are indirectly suggested through sibling list, but no explicit when-not-to-use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_collectionA
Update an existing collection's title, description (HTML), or URL handle. Only provide fields you want to change; omitted fields are left untouched. Changing the handle changes the storefront URL — Shopify does NOT create automatic redirects from the old slug, so existing links break. To change collection membership use add_products_to_collection / remove_products_from_collection instead.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | GID of the collection to update. | |
| title | No | New display title. Omit to leave unchanged. | |
| description | No | New HTML body for the collection page. Pass an empty string to clear it. | |
| handle | No | New URL slug. Changing a handle breaks any external links pointing at the old URL — Shopify does NOT auto-redirect. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Warns that changing handle breaks existing links without redirects, which is critical behavioral info. No annotations provided, so description carries full burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences covering purpose, usage, and warning. Extremely efficient with no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers all key aspects for an update tool: what fields, how to use, side effects. No return value explanation but acceptable given no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Adds meaning beyond schema: clarifies description is HTML, handle change implications, and that empty string clears description. Schema coverage is 100% so baseline is 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it updates a collection's title, description, or handle, and distinguishes from membership-changing tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly explains when to use (update title/desc/handle), how to use (omit unchanged fields), and points to alternative tools for membership changes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_customerA
Update an existing customer's profile fields — email, name, phone, tags, internal note. Only provide fields you want changed; omitted fields stay as-is. Tags is a full replacement (use add_tags / remove_tags for additive/subtractive changes). Email and phone changes still need to satisfy the per-store uniqueness constraint. To change addresses, use Shopify's address-specific mutations (not yet exposed by this server). To change marketing consent, the dedicated customerEmailMarketingConsentUpdate mutation is preferred.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Customer GID or numeric ID. Get one from list_customers. | |
| No | New email. Must remain unique. | ||
| firstName | No | ||
| lastName | No | ||
| phone | No | New phone in E.164 format. | |
| tags | No | New tag set. REPLACES all existing tags. Use add_tags / remove_tags for additive/subtractive changes that preserve other tags. | |
| note | No | New internal staff note. Replaces prior note. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses patch behavior ('omitted fields stay as-is'), tag replacement semantics, and uniqueness constraints. It does not cover authorization needs or error handling, but the disclosed details are sufficient for a straightforward update tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single paragraph, front-loaded with the main purpose, and every sentence adds value. No redundancy or wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description covers update semantics, constraints, and alternatives for related operations (tags, addresses, marketing consent). It could mention error responses or required permissions, but the provided information is sufficient for typical usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 71% (5 of 7 parameters described). The description adds critical context: 'tags is a full replacement', 'omitted fields stay as-is', and uniqueness constraints for email/phone. The term 'name' in the description could be ambiguous (firstName/lastName), but the schema clarifies. Overall, it adds value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Update an existing customer's profile fields' and lists specific fields (email, name, phone, tags, internal note). It distinguishes from sibling tools like add_tags/remove_tags and address-specific mutations, establishing a clear scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use this tool (for updating profile fields) and when to use alternatives: add_tags/remove_tags for additive/subtractive tag changes, address-specific mutations for addresses, and customerEmailMarketingConsentUpdate for marketing consent. Also notes uniqueness constraints for email/phone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_draft_orderA
Modify an existing OPEN draft order's customer, email, note, tags, or line items. Important: if lineItems is provided, it REPLACES the existing items entirely (not a merge or append) — read the current items first if you need to preserve any. Cannot update completed drafts; those are real orders. To pause and pick up a draft later, leave it OPEN and re-invoke update later; nothing here triggers payment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | GID of the draft order to update. Cannot update completed drafts (those are real orders — use the order tools). | |
| lineItems | No | If provided, REPLACES the entire current line-items array — this is a replace, not a merge. To add or remove specific items you must read the current items first and resubmit the full set. | |
| customerId | No | New customer GID to attach. Pass to swap or set the customer. | |
| No | New email for the order. | ||
| note | No | New internal note. Replaces any prior note. | |
| tags | No | New tag set. Replaces existing tags entirely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses the critical behavioral nuance that lineItems replaces entirely, and states no payment triggering. Lacks permissions/rate limits, but with no annotations, the description carries the burden well.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences with zero fluff. Front-loaded with the main action, then critical behavioral note, then exclusions, then usage tip. Every sentence adds essential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers all key aspects: purpose, constraints (OPEN only), behavioral warning (lineItems replace), exclusion of completed drafts, and guidance on pausing. No output schema needed for this context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 100% description coverage, so baseline is 3. The description adds extra guidance for lineItems (e.g., read current items first) and reiterates constraints, providing value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it modifies existing OPEN draft orders, specifying fields (customer, email, note, tags, line items) and contrasting with completed drafts. This distinctively differentiates from sibling tools like create_draft_order and complete_draft_order.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use (OPEN drafts) and when not to (completed drafts), provides alternatives (use order tools for real orders), and gives guidance on pausing drafts without triggering payment.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_fulfillment_trackingA
Update or add tracking info on an existing fulfillment after the fact. Use this when you've already called create_fulfillment but didn't have the carrier/tracking number yet, or when a tracking number was wrong and needs fixing. company+number is enough; Shopify auto-derives the URL for known carriers (USPS, UPS, FedEx, DHL, etc.). Set notifyCustomer=true to re-send the shipping email with the updated tracking. Omitted fields are left unchanged.
| Name | Required | Description | Default |
|---|---|---|---|
| fulfillmentId | Yes | Fulfillment GID to update tracking on. | |
| company | No | ||
| number | No | ||
| url | No | ||
| notifyCustomer | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description reveals key behaviors: Shopify auto-derives URL for known carriers, omitted fields unchanged, notifyCustomer triggers email. Lacks mention of idempotency or permissions, but covers main traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences: first states purpose, second provides usage and parameter semantics. No filler; every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers all parameters and key behaviors. Does not describe return value or error conditions, but no output schema exists; given complexity, this is mostly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 20%, but description adds meaning: company+number suffice, URL auto-derived, notifyCustomer controls re-sending. This compensates for sparse schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Update or add tracking info on an existing fulfillment') and distinguishes from sibling tools like create_fulfillment and cancel_fulfillment by specifying it is for after-the-fact corrections.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use: after create_fulfillment without tracking, or when fixing a wrong tracking number. Provides guidance on parameters (company+number sufficient) and optional notifyCustomer behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_metaobjectA
Update an existing metaobject's handle, field values, or publishable status. Fields are upserted by key — pass only the fields you want to change; omitted fields keep their current values. To clear a field, pass an empty string or null-ish value matching the field type. If you change the handle, set redirectNewHandle=true to have Shopify redirect from the old handle on the storefront. The type cannot be changed by this tool — delete and recreate to change type.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | GID of the metaobject to update. | |
| handle | No | New handle. Changes the storefront URL slug. Pair with redirectNewHandle=true to keep old links working. | |
| fields | No | Field-level upserts: only the keys present here are written; other fields keep their current values. Pass empty string to clear a field. | |
| status | No | New publishable status (only for publishable types). Omit to leave unchanged. | |
| redirectNewHandle | No | If true and `handle` is being changed, Shopify creates a 301 redirect from the old handle to the new one on the storefront. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries the full transparency burden. It discloses key behaviors: upsert semantics, handle redirection, type immutability, and field clearing. It does not mention permissions, rate limits, or error conditions, but the provided details are sufficient for safe invocation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured. It front-loads the main purpose and then sequentially covers key points (upsert behavior, clearing fields, redirect, type restriction). Every sentence adds necessary information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (5 parameters, upsert logic, handle management) and the absence of an output schema, the description covers essential behavioral and usage details. It could slightly improve by mentioning the return value (e.g., the updated metaobject), but that is not critical for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds significant value: it explains the upsert mechanism for fields, how to clear fields, the condition for redirectNewHandle, and the status constraint. For the fields parameter, it details how to serialize values (primitives as literal strings, JSON types as JSON-encoded), which goes beyond the schema description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Update' and the resource 'metaobject', specifying the modifiable aspects (handle, field values, publishable status). It distinguishes from sibling tools like create_metaobject and delete_metaobject by noting that the type cannot be changed, thereby preventing misuse.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit 'how-to' guidance: fields are upserted by key, pass only changed fields, clear a field with empty string, use redirectNewHandle for handle changes, and note that type requires delete and recreate. However, it does not explicitly state when to avoid using this tool (e.g., when needing to change the type), though that is implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_orderA
Update an existing order's metadata: email, tags, internal note, or custom attributes. Most order fields are immutable post-creation in Shopify (line items, totals, customer-of-record can't be changed via the Admin API after the fact) — for those, use refund_order or cancel_order to back out, then create a corrected order. Tags and customAttributes are full replacements: read the current values first if you want to merge rather than replace. Use when fixing a typo'd email, adding a fulfillment-team note, or attaching internal segmentation tags.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Order GID or numeric ID to update. Most order fields are immutable post-creation; only the metadata fields below can be edited via this tool. | |
| No | New customer email. Pass to update or fix the contact email. | ||
| tags | No | New tag set. REPLACES the existing tags entirely. Read current tags first if you want to merge rather than replace. | |
| note | No | New internal staff note. Replaces any prior note. | |
| customAttributes | No | Custom attributes (cart attributes / order notes). Replaces the entire set if provided. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description fully discloses behavioral traits: it notes that most order fields are immutable, and tags/customAttributes are full replacements. This informs the agent of side effects and limitations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, well-structured, and front-loaded with purpose. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description is complete: it covers updatable fields, immutable fields, replacement semantics, and typical use cases. No additional information is needed for an agent to correctly invoke the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers all 5 parameters with descriptions, achieving 100% coverage. The description adds context beyond the schema (e.g., which fields are immutable, replacement behavior), raising it above the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool updates specific metadata fields (email, tags, note, customAttributes) on an existing order. It differentiates from siblings like refund_order and cancel_order by noting which fields are immutable, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells when to use (fixing email, adding note, attaching tags) and when not (for line items, totals, etc.), suggesting alternatives (refund/cancel then create). It also advises reading current tags before merging, providing complete guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_productA
Update an existing product's core fields — title, description (HTML), vendor, productType, tags, or status. Only provide fields you want changed; omitted fields are left untouched. Setting status=ARCHIVED hides the product from the storefront but preserves order history. To change variants, prices, or inventory use create_variants/update_variants and set_inventory_quantity. To change images use upload_product_image (or one of the bridge tools to generate new ones).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Product GID or numeric ID | |
| title | No | ||
| description | No | ||
| vendor | No | ||
| product_type | No | ||
| tags | No | ||
| status | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. Discloses partial update behavior and that ARCHIVED status hides product but preserves order history. Lacks mention of authorization needs or reversibility, but provides good operational context for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two well-structured sentences. First sentence front-loads purpose and fields. Second sentence covers behavior and alternatives. No redundant words. Highly efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and low schema coverage, description covers the tool's full scope: what it does, how to use it (partial update), effect of status, and pointers to other tools for related operations. Complete enough for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is low (14% only for id and status enum). Description adds value by explaining partial update semantics and 'only send changed fields' pattern. Explicitly describes status options. Does not add details for other params beyond listing, but enough for core fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it updates core fields of an existing product, lists specific fields (title, description, vendor, productType, tags, status). Distinguishes from sibling tools like update_variants, upload_product_image, etc., by specifying what not to use it for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises to only provide fields to change, with omitted fields left untouched. Explains effect of status=ARCHIVED. Directs user to alternative tools for variants, prices, inventory, and images, giving clear when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_variantsA
Update one or more existing variants in a single call. Editable fields: price, compareAtPrice (set to null to clear), SKU, barcode, taxable, inventoryPolicy (DENY blocks oversells, CONTINUE allows backorders), and optionValues (e.g. rename a size). Per-variant only; only the fields you provide are written. For inventory quantity changes use set_inventory_quantity — this tool deliberately doesn't accept quantities to keep that audit trail in one place.
| Name | Required | Description | Default |
|---|---|---|---|
| productId | Yes | Product GID. | |
| variants | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Although no annotations exist, the description explains that updates are per-variant and only specified fields are written, and clarifies the meaning of inventoryPolicy values. It does not cover potential side effects or rate limits, but is still sufficiently transparent for a simple update tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences: first states purpose, second details fields, third gives sibling guidance. It is front-loaded, efficient, and contains no extraneous information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers editable fields, usage constraints, and points to the related tool. It lacks explicit mention of return value (though standard for updates) and does not mention any prerequisites, but overall provides sufficient context for an AI to use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds meaning beyond the schema by listing editable fields (price, compareAtPrice, SKU, etc.), explaining special behavior (compareAtPrice set to null to clear), and providing examples (rename a size for optionValues). This compensates for the schema's 50% description coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool updates one or more existing variants in a single call, lists editable fields, and distinguishes from the sibling tool set_inventory_quantity for inventory changes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when NOT to use this tool (for inventory quantity changes) and directs to the alternative set_inventory_quantity, providing clear usage boundaries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_webhookA
Modify an existing webhook subscription's callback URL, payload format, includeFields filter, or metafield-namespace filter. Topic cannot be changed — to switch event types, delete and recreate the subscription. Use when migrating an endpoint to a new domain, switching from JSON to XML, or tightening payload size by adding includeFields. Omitted parameters are left unchanged.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Webhook subscription GID to update. | |
| callbackUrl | No | ||
| format | No | ||
| includeFields | No | ||
| metafieldNamespaces | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that omitted parameters are unchanged and topic is immutable. Without annotations, covers key constraints but could mention immediate effect or potential disruption.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with what can be modified, followed by use cases. No redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, constraints, and usage scenarios. Lacks return value info but acceptable for an update tool with no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With only 20% schema coverage, description adds meaning for each modifiable field and explains the constraint on topic. Does not fully describe each parameter but compensates well.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool modifies specific fields of a webhook subscription (callbackUrl, format, includeFields, metafieldNamespaces) and explicitly notes that topic cannot be changed, distinguishing it from create_webhook and delete_webhook.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly lists when to use (migrating endpoint, switching format, tightening payload) and when not to (to change topic, delete and recreate). Provides clear alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_product_imageA
Attach an image to an existing product by URL. Shopify fetches the URL server-side and hosts the file on its CDN — the URL must be publicly reachable from Shopify's network. Multiple calls add multiple images; this tool does not replace existing images. Use the bridge tools (generate_product_image, refine_product_image) instead when you want the image generated by ComfyUI rather than provided as a URL.
| Name | Required | Description | Default |
|---|---|---|---|
| product_id | Yes | Product GID or numeric ID | |
| image_url | Yes | Public image URL to attach | |
| alt_text | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It discloses server-side fetch, CDN hosting, public URL requirement, and cumulative nature of image addition. Missing details on error handling or permissions, but still informative.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise, well-structured sentences. First states purpose, second adds behavioral context, third provides alternatives. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 3 params, no output schema, and no annotations, description covers core behavior (URL requirement, multiple calls) and usage. Lacks response details but acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% (alt_text missing description). Description adds no new info about parameters beyond schema, especially missing alt_text. Adequate but not exceptional.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Attach an image to an existing product by URL'), specifying the verb, resource, and method. It distinguishes from sibling bridge tools for ComfyUI-generated images.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly explains when to use (URL-based attachment) and when not to (use bridge tools for ComfyUI). Also notes that multiple calls add multiple images without replacement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
v0.2.0- Added
list_collections - Added
list_orders
7 tool updates
v0.1.2- Added
cancel_order - Added
create_customer - Added
create_order - Removed
list_collections - Added
refund_order - Added
update_customer - Added
update_order
26 tool updates
v0.1.1- Changed
add_products_to_collection2 fields changed- added
Input schema / properties / collectionId / descriptionAdded value: +"GID of a manual collection. Will fail on smart collections (those have rule-based membership)." - added
Input schema / properties / productIds / descriptionAdded value: +"Product GIDs to add. Duplicates are silently ignored by Shopify."
- Changed
add_tags2 fields changed- changed
Input schema / properties / id / descriptionPrevious value: -"GID of a taggable resource (Product, Order, Customer, DraftOrder, Collection, ...)."New value: +"GID of any taggable resource — Product, Order, Customer, DraftOrder, Collection, Article, Blog. The tool name does the verb (add vs remove); pick the right tool for the operation." - changed
Input schema / properties / tags / descriptionPrevious value: -"Tags to add or remove."New value: +"Tag strings to add (or remove). Shopify normalises whitespace and case for matching but preserves the literal strings on display."
- Changed
complete_draft_order2 fields changed- changed
Input schema / properties / id / descriptionPrevious value: -"Draft order GID to complete."New value: +"GID of an OPEN draft order. Already-completed drafts are rejected." - changed
Input schema / properties / paymentPending / descriptionPrevious value: -"If true, complete without capturing payment (mark as pending). Default false."New value: +"If true, the resulting order is marked payment-pending — Shopify creates the order but does NOT capture payment. Use when you'll collect payment offline (cash, bank transfer, manual card auth) or via a separate flow. Default false (attempts to capture immediately)."
- Changed
create_collection4 fields changed- added
Input schema / properties / description / descriptionAdded value: +"HTML body for the collection page. Plain text works; HTML tags render." - added
Input schema / properties / handle / descriptionAdded value: +"URL slug (e.g. 'summer-sale'). Defaults to a slugified title. Must be unique per shop." - changed
Input schema / properties / productIds / descriptionPrevious value: -"Product GIDs to seed into the (manual) collection."New value: +"Product GIDs to seed into the new (manual) collection. Smart collections built from rules aren't supported by this tool — use the Shopify admin UI for those." - added
Input schema / properties / title / descriptionAdded value: +"Display title shown to shoppers. Required."
- Changed
create_draft_order6 fields changed- changed
Input schema / properties / customerId / descriptionPrevious value: -"GID of an existing customer."New value: +"GID of an existing customer to attach to the draft. Get one from list_customers. Optional — drafts can be customer-less and converted to a guest checkout." - added
Input schema / properties / email / descriptionAdded value: +"Email address for the order. Useful when you don't have a customer record yet but want to email the invoice URL." - changed
Input schema / properties / lineItems / descriptionPrevious value: -"At least one line item (variant reference or custom item)."New value: +"At least one line item. Each item is EITHER a variant reference (just variantId + quantity) OR a custom item (title + originalUnitPrice + quantity, no variantId). Mixing both shapes in one item is rejected by the refine() validator." - added
Input schema / properties / note / descriptionAdded value: +"Internal note visible to staff only (not the customer)." - added
Input schema / properties / tags / descriptionAdded value: +"Tags to apply to the draft for filtering/segmentation." - added
Input schema / properties / useCustomerDefaultAddress / descriptionAdded value: +"If true and customerId is set, copy the customer's default shipping address onto the draft."
- Changed
create_metaobject6 fields changed- added
Input schema / properties / fields / descriptionAdded value: +"Field values. Provide at least the required fields from the type's definition. Required fields without values cause a validation error." - changed
Input schema / properties / fields / items / properties / key / descriptionPrevious value: -"Field key as defined in the metaobject definition."New value: +"Field key as declared in the metaobject definition (case-sensitive). Get the list of valid keys from list_metaobject_definitions." - changed
Input schema / properties / fields / items / properties / value / descriptionPrevious value: -"Field value as a string. JSON/reference fields expect a JSON-encoded string."New value: +"Field value, always serialized as a string. Primitive types take literal strings ('hello', '42', 'true'). JSON, list, and reference types take JSON-encoded strings (e.g. '\"gid://shopify/Product/123\"' for a product reference, '[1,2,3]' for a list)." - changed
Input schema / properties / handle / descriptionPrevious value: -"Optional handle. Shopify generates one from displayName if omitted."New value: +"Optional URL-safe handle. If the type has a 'displayName' field, Shopify generates a handle from it; otherwise pass one here." - changed
Input schema / properties / status / descriptionPrevious value: -"Publishable status if the metaobject's type supports the publishable capability."New value: +"Publish status. Only applies to types that declared the `publishable` capability — passing this for non-publishable types is silently ignored. ACTIVE = visible on storefront, DRAFT = hidden." - changed
Input schema / properties / type / descriptionPrevious value: -"Metaobject definition type."New value: +"Type handle from a registered metaobject definition. The definition must already exist; this tool does not create new types/schemas."
- Changed
delete_collection1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"Collection GID to delete."New value: +"GID of the collection to delete. The collection's products are NOT deleted, only the collection grouping. Irreversible."
- Changed
delete_draft_order1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"Draft order GID to delete."New value: +"GID of a draft order to delete. Permanent. Cannot delete drafts that have been completed (those are real orders — orders cannot be deleted, only cancelled or archived)."
- Changed
delete_metaobject1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"Metaobject GID to delete."New value: +"GID of the metaobject to delete. Irreversible; metafield references to this metaobject become broken (Shopify does not auto-clean referrers)."
- Changed
get_collection2 fields changed- changed
Input schema / properties / id / descriptionPrevious value: -"Collection GID, e.g. gid://shopify/Collection/123"New value: +"Collection GID, e.g. 'gid://shopify/Collection/123456'. Get one from list_collections." - added
Input schema / properties / productsFirst / descriptionAdded value: +"How many products to include alongside the collection. Pass 0 to skip products entirely (faster for collection-only metadata)."
- Changed
get_draft_order1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"Draft order GID, e.g. gid://shopify/DraftOrder/12345"New value: +"Draft order GID, e.g. 'gid://shopify/DraftOrder/12345'. Get one from list_draft_orders."
- Changed
get_metaobject1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"Metaobject GID."New value: +"Metaobject GID, e.g. 'gid://shopify/Metaobject/123456'. Discover GIDs via list_metaobjects."
- Changed
get_order1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"Order GID or numeric ID"New value: +"Order GID ('gid://shopify/Order/123') or numeric ID — both forms accepted; numeric IDs are auto-promoted. Get one from list_orders."
- Changed
list_collections3 fields changed- added
Input schema / properties / after / descriptionAdded value: +"Cursor from a prior page's pageInfo. Pass to fetch the next page; omit on the first call." - added
Input schema / properties / first / descriptionAdded value: +"Page size (1-100). Lower this if responses get truncated." - changed
Input schema / properties / query / descriptionPrevious value: -"Shopify collection query, e.g. 'title:summer*', 'collection_type:smart'."New value: +"Shopify collection query syntax. Examples: 'title:summer*' (prefix match), 'collection_type:smart' (filter to smart collections), 'updated_at:>2026-01-01'."
- Changed
list_customers3 fields changed- added
Input schema / properties / after / descriptionAdded value: +"Cursor from the previous page's pageInfo for pagination. Omit on the first call." - added
Input schema / properties / first / descriptionAdded value: +"Page size (1-100)." - changed
Input schema / properties / query / descriptionPrevious value: -"Shopify customer query, e.g. 'email:*@gmail.com', 'tag:vip', 'orders_count:>=5'"New value: +"Shopify customer query syntax. Examples: 'email:*@gmail.com' (domain match), 'tag:vip' (tagged), 'orders_count:>=5' (repeat customer), 'amount_spent:>=500' (high value), 'state:enabled', 'accepts_marketing:true'. Combine with AND/OR."
- Changed
list_draft_orders3 fields changed- added
Input schema / properties / after / descriptionAdded value: +"Cursor from the previous page's pageInfo. Omit on the first call." - added
Input schema / properties / first / descriptionAdded value: +"Page size (1-100)." - changed
Input schema / properties / query / descriptionPrevious value: -"Shopify draft order query, e.g. 'status:OPEN', 'customer_id:123'."New value: +"Shopify draft order query syntax. Examples: 'status:OPEN' (not yet completed), 'status:COMPLETED', 'customer_id:1234567890', 'tag:wholesale', 'updated_at:>=2026-01-01'."
- Changed
list_locations1 field changed- added
Input schema / properties / first / descriptionAdded value: +"Page size (1-100). Most stores have under a dozen locations."
- Changed
list_metaobject_definitions2 fields changed- added
Input schema / properties / after / descriptionAdded value: +"Cursor from a prior page's pageInfo. Omit on the first call." - added
Input schema / properties / first / descriptionAdded value: +"Page size (1-100). 25 is usually plenty — most stores have <50 metaobject types total."
- Changed
list_metaobjects3 fields changed- added
Input schema / properties / after / descriptionAdded value: +"Cursor from a prior page's pageInfo. Omit on the first call." - added
Input schema / properties / first / descriptionAdded value: +"Page size (1-100)." - changed
Input schema / properties / type / descriptionPrevious value: -"Metaobject definition type (e.g. 'lookbook', 'product_feature'). Use list_metaobject_definitions to discover."New value: +"Metaobject type handle (e.g. 'lookbook', 'product_feature', '$app:landing_page'). Get valid values from list_metaobject_definitions. Custom app namespaces use the '$app:' prefix."
- Removed
list_orders - Changed
remove_products_from_collection2 fields changed- added
Input schema / properties / collectionId / descriptionAdded value: +"GID of a manual collection." - added
Input schema / properties / productIds / descriptionAdded value: +"Product GIDs to remove. Products not currently in the collection are silently ignored."
- Changed
remove_tags2 fields changed- changed
Input schema / properties / id / descriptionPrevious value: -"GID of a taggable resource (Product, Order, Customer, DraftOrder, Collection, ...)."New value: +"GID of any taggable resource — Product, Order, Customer, DraftOrder, Collection, Article, Blog. The tool name does the verb (add vs remove); pick the right tool for the operation." - changed
Input schema / properties / tags / descriptionPrevious value: -"Tags to add or remove."New value: +"Tag strings to add (or remove). Shopify normalises whitespace and case for matching but preserves the literal strings on display."
- Changed
set_inventory_quantity4 fields changed- changed
Input schema / properties / inventory_item_id / descriptionPrevious value: -"Inventory item GID or numeric ID"New value: +"InventoryItem GID ('gid://shopify/InventoryItem/123') or numeric ID. Found on each variant in get_product output as variants[].inventoryItem.id." - changed
Input schema / properties / location_id / descriptionPrevious value: -"Location GID or numeric ID"New value: +"Location GID or numeric ID. Get from list_locations. Each variant tracks inventory per location." - changed
Input schema / properties / quantity / descriptionPrevious value: -"New absolute on-hand quantity"New value: +"New absolute available quantity. This OVERWRITES the current count, it doesn't increment — pass the desired final number, not a delta." - changed
Input schema / properties / reason / descriptionPrevious value: -"Shopify reason code (e.g. 'correction', 'cycle_count_available', 'received')"New value: +"Shopify-defined reason code recorded in the inventory audit history. Common values: 'correction' (manual fix), 'cycle_count_available' (systematic recount), 'received' (receiving new stock), 'damaged', 'shrinkage', 'other'."
- Changed
update_collection4 fields changed- added
Input schema / properties / description / descriptionAdded value: +"New HTML body for the collection page. Pass an empty string to clear it." - added
Input schema / properties / handle / descriptionAdded value: +"New URL slug. Changing a handle breaks any external links pointing at the old URL — Shopify does NOT auto-redirect." - changed
Input schema / properties / id / descriptionPrevious value: -"Collection GID to update."New value: +"GID of the collection to update." - added
Input schema / properties / title / descriptionAdded value: +"New display title. Omit to leave unchanged."
- Changed
update_draft_order6 fields changed- added
Input schema / properties / customerId / descriptionAdded value: +"New customer GID to attach. Pass to swap or set the customer." - added
Input schema / properties / email / descriptionAdded value: +"New email for the order." - changed
Input schema / properties / id / descriptionPrevious value: -"Draft order GID to update."New value: +"GID of the draft order to update. Cannot update completed drafts (those are real orders — use the order tools)." - added
Input schema / properties / lineItems / descriptionAdded value: +"If provided, REPLACES the entire current line-items array — this is a replace, not a merge. To add or remove specific items you must read the current items first and resubmit the full set." - added
Input schema / properties / note / descriptionAdded value: +"New internal note. Replaces any prior note." - added
Input schema / properties / tags / descriptionAdded value: +"New tag set. Replaces existing tags entirely."
- Changed
update_metaobject7 fields changed- added
Input schema / properties / fields / descriptionAdded value: +"Field-level upserts: only the keys present here are written; other fields keep their current values. Pass empty string to clear a field." - changed
Input schema / properties / fields / items / properties / key / descriptionPrevious value: -"Field key as defined in the metaobject definition."New value: +"Field key as declared in the metaobject definition (case-sensitive). Get the list of valid keys from list_metaobject_definitions." - changed
Input schema / properties / fields / items / properties / value / descriptionPrevious value: -"Field value as a string. JSON/reference fields expect a JSON-encoded string."New value: +"Field value, always serialized as a string. Primitive types take literal strings ('hello', '42', 'true'). JSON, list, and reference types take JSON-encoded strings (e.g. '\"gid://shopify/Product/123\"' for a product reference, '[1,2,3]' for a list)." - added
Input schema / properties / handle / descriptionAdded value: +"New handle. Changes the storefront URL slug. Pair with redirectNewHandle=true to keep old links working." - changed
Input schema / properties / id / descriptionPrevious value: -"Metaobject GID to update."New value: +"GID of the metaobject to update." - changed
Input schema / properties / redirectNewHandle / descriptionPrevious value: -"If handle changes, redirect from the old handle to the new one."New value: +"If true and `handle` is being changed, Shopify creates a 301 redirect from the old handle to the new one on the storefront." - added
Input schema / properties / status / descriptionAdded value: +"New publishable status (only for publishable types). Omit to leave unchanged."
52 tool updates
v0.1.0- First observed
add_product_options - First observed
add_products_to_collection - First observed
add_tags - First observed
cancel_fulfillment - First observed
complete_draft_order - First observed
create_collection - First observed
create_draft_order - First observed
create_fulfillment - First observed
create_metaobject - First observed
create_product - First observed
create_variants - First observed
create_webhook - First observed
delete_collection - First observed
delete_draft_order - First observed
delete_metafield - First observed
delete_metaobject - First observed
delete_variants - First observed
delete_webhook - First observed
get_collection - First observed
get_draft_order - First observed
get_fulfillment - First observed
get_fulfillment_order - First observed
get_metaobject - First observed
get_order - First observed
get_product - First observed
get_webhook - First observed
list_collections - First observed
list_customers - First observed
list_draft_orders - First observed
list_fulfillment_orders - First observed
list_locations - First observed
list_metafields - First observed
list_metaobject_definitions - First observed
list_metaobjects - First observed
list_orders - First observed
list_products - First observed
list_variants - First observed
list_webhooks - First observed
remove_products_from_collection - First observed
remove_tags - First observed
reorder_variants - First observed
run_shopifyql_query - First observed
set_inventory_quantity - First observed
set_metafield - First observed
update_collection - First observed
update_draft_order - First observed
update_fulfillment_tracking - First observed
update_metaobject - First observed
update_product - First observed
update_variants - First observed
update_webhook - First observed
upload_product_image
TDQS
Scored across 58 tools
Each tool targets a specific resource or action within Shopify's extensive API. Descriptions clearly distinguish overlapping areas like metaobjects vs metafields, and add/remove tags vs update product tags. No two tools appear to do the same thing.
All tools follow a consistent verb_noun pattern in snake_case (e.g., create_product, list_orders, set_inventory_quantity). The only slight deviation is run_shopifyql_query, but it still fits the pattern.
58 tools cover a very broad Shopify surface (products, orders, customers, collections, metaobjects, webhooks, fulfillments, etc.). While high, each tool serves a distinct purpose; the count is somewhat justified by the platform's complexity, though slightly above the typical well-scoped range.
The tool set covers CRUD for all major resources (products, variants, orders, customers, collections, metaobjects, metafields, webhooks) plus inventory management, fulfillments, and analytics queries. Only minor niche operations (e.g., bulk adjustments, advanced discounting) are absent, which is acceptable for an MCP server.
Maintenance
Related MCP Connectors
Shopify MCP Pack — wraps the Shopify Admin REST API (2024-01)
Unified MCP server for 70+ eCommerce platforms: products, orders, customers, and more.
AI commerce for Shopify: product search, comparison, recommendations, and checkout via MCP.
MCP server for Lemon Squeezy — stores, products, orders, subscriptions, license keys.
Related MCP Servers
- AlicenseDqualityFmaintenancefor shopify api interaction including product, customer, order5910 npm238MIT
- AlicenseAqualityDmaintenanceMCP server for ComfyUI — text-to-image, variations, img2img refine, upscale, image proxy, and workflow runner.1584 npm1MIT
- AlicenseCqualityDmaintenanceAn MCP server providing AI agents with full access to the Shopify Admin API via 136 tools for managing products, orders, customers, collections, and more.10021 npmMIT
- AlicenseNot gradedqualityFmaintenanceA comprehensive MCP server for Shopify Admin API integration, enabling AI assistants to manage products, orders, customers, inventory, analytics, and more through natural language.20 npm18MIT