tools/call over
POST /shopify/mcp. The connector talks only to Shopify’s Admin GraphQL API
(version 2026-04) and is connected through OAuth on your own store (see
Forbind Shopify).
Endpoint:
https://mcp.consile.ai/shopify/mcp. Shopify is its own named
connector with only its own tools. Tool names are namespaced shopify__<tool>
in Claude/ChatGPT; the bare names are used here for readability.Read tools are listed with readOnlyHint: true, destructiveHint: false,
openWorldHint: false; every write tool with readOnlyHint: false,
destructiveHint: true, openWorldHint: true. The endpoint also lists one
unprefixed system tool, connect_account.Until a store is connected, a tool call returns a message with a connect link, and
connect_account returns one too. Neither link can complete a Shopify
connection, because the shop domain has to be entered in the portal. Connect
Shopify from app.consile.ai.Write safety: guardrail model
The ten write tools share one guardrail.- New products are created
DRAFT. A draft product is not visible in any sales channel until explicitly published/activated. confirm: trueis required for:publish_productandunpublish_product; statusACTIVEorARCHIVEDoncreate_product,update_productandset_product_status; anyupdate_product_variantcall that includespriceorcompareAtPrice;delete_product_variant; and both inventory tools.- Without confirmation you get a dry-run preview and no Shopify call
is made. Re-run the identical call with
confirm: trueto apply. - Failed mutations never look like success: a mutation that Shopify rejects returns a tool error, not a result.
update_product edits that do
not set ACTIVE/ARCHIVED (title, description, vendor, type, tags), status
DRAFT on update_product or set_product_status (this takes a live product off
sale), create_product_variant (including the price of new variants), and
update_product_variant without price fields (SKU, barcode, taxable,
inventoryPolicy).
Orders, draft orders, customers, and discounts are structurally read-only:
there are no write tools and no write scopes for them. There is no tool that
deletes a product. The graphql_query escape hatch only forwards a single
read-only query (see GraphQL query rules).
This is a designed-in safety default, not an absolute guarantee. See
Write tools & guardrails for the
cross-connector policy.
Preview shape
When a write requires confirmation butconfirm is omitted or false, the tool
returns this instead of calling Shopify. The preview is a normal tool result, not
an error:
Shared parameters
Ids
All id arguments accept either a bare numeric id or a full GID (gid://shopify/<Type>/<n>). The connector normalises before calling the API:
non-digits are stripped from a bare id.
An id is not the order number shown in Shopify admin. get_order with 1001
reads gid://shopify/Order/1001, not order #1001. To find an order by its
number, call list_orders with query: "name:#1001".
Money
Money is ShopifyMoneyV2 ({ amount, currencyCode }); amounts are decimal
strings in the shop currency.
Pagination
integer
default:"50"
Maximum rows to return,
1-250. Rows are fetched in pages of up to 100.string
Shopify search-query syntax, e.g.
status:active, vendor:Acme, sku:ABC-1,
financial_status:paid, email:a@b.com, country:DK.pageInfo.hasNextPage is true, narrow the
result with query (for example a date range) instead of paging.
Return shapes
Get tools return the GraphQLdata object keyed by its root field, for example
{ "order": { ... } }. An id that does not exist returns { "order": null },
not an error. list_order_transactions and list_order_fulfillments take no
limit and return at most 50 entries.
Read tools (40)
All read tools are annotatedreadOnlyHint: true.
Shop & policies
Products & variants
Collections
Publications (sales channels)
Inventory
Orders & fulfillment
Draft orders
Customers & B2B companies
Customer and order records can carry personal data (name, email, phone, address).
Accessing real-merchant PII requires Shopify’s Protected Customer Data
approval for the app; the platform is read-through and never persists it. If
Shopify returns an access error for any selected field, the whole call fails
(no partial data). Without approval this affects every tool whose result
includes customer data:
list_orders, get_order, list_draft_orders,
get_draft_order, list_customers, get_customer, get_company and
list_abandoned_checkouts.Discounts
Checkouts, shipping & analytics
GraphQL query rules
graphql_query parses the document before sending it and only forwards a single
read-only query:
- exactly one operation, which must be a
query(the anonymous{ ... }shorthand counts as a query), so two queries in one document are refused; - fragment definitions are allowed;
mutationandsubscriptionoperations, schema or type definitions, and documents that do not parse are refused;- the document may be at most 65,536 characters and 20,000 tokens.
variables is an optional JSON object. The result is the raw GraphQL data
object. A refused document returns a tool error and Shopify is never called.
Write tools (10 guardrailed)
create_product
Create a product. CreatedDRAFT by default. There is no price parameter: set
the price on the product’s variant with update_product_variant.
string
required
string
default:"DRAFT"
ACTIVE (live) or ARCHIVED requires confirm: true; DRAFT is free.string
string
string
string[]
boolean
status is ACTIVE or ARCHIVED.
update_product
Update a product’s fields.string
required
string
string
string
string
string[]
string
boolean
status → ACTIVE or ARCHIVED. Other
field changes, and status DRAFT, apply immediately, also on a live product.
set_product_status
Set a product’s status.string
required
string
required
ACTIVE, DRAFT, or ARCHIVED.boolean
ACTIVE (live) and ARCHIVED. DRAFT is applied
without confirmation, also on a live product (it takes the product off sale).
create_product_variant
Add variants to an existing product.string
required
object[]
required
At least one. Each variant:
optionValues? (array of
{ "optionName": "Size", "name": "Large" }), price? and compareAtPrice?
(decimal strings in the shop currency, e.g. "199.00"), sku? (stored on the
inventory item), barcode?, taxable? (boolean), inventoryPolicy? (DENY or
CONTINUE; CONTINUE allows selling when out of stock).boolean
Accepted but ignored.
confirm is ignored. The variant is added
to the product as it is: on a product that is already ACTIVE and published, the
new variant and its price are live immediately.
update_product_variant
Update existing variants (each entry needs anid).
string
required
object[]
required
At least one. Each must include
id; may set the same fields as
create_product_variant (price, compareAtPrice, sku, barcode,
taxable, inventoryPolicy, optionValues).boolean
price or
compareAtPrice, even if the value is unchanged. Changes to SKU, barcode,
taxable and inventoryPolicy alone apply immediately.
delete_product_variant
Delete variants from a product.string
required
string[]
required
boolean
Set
true to apply. Omit it (or false) to get a dry-run preview first.publish_product
Publish a product to one or more sales channels (makes it live).string
required
string[]
required
Publication ids from
list_publications.boolean
Set
true to apply. Omit it (or false) to get a dry-run preview first.unpublish_product
Remove a product from one or more sales channels.string
required
string[]
required
boolean
Set
true to apply. Omit it (or false) to get a dry-run preview first.set_inventory_quantity
Set an absolute stock quantity at a location. The current value is overwritten without a compare check.string
required
string
required
integer
required
string
default:"available"
available or on_hand.string
default:"correction"
boolean
Set
true to apply. Omit it (or false) to get a dry-run preview first.adjust_inventory_quantity
Adjust stock by a relative delta at a location.string
required
string
required
integer
required
Positive or negative.
string
default:"available"
available or on_hand.string
default:"correction"
boolean
Set
true to apply. Omit it (or false) to get a dry-run preview first.Return values
An applied write returns Shopify’s mutation payload with an emptyuserErrors
array:
Code examples
Shopify rate limits are cost-based (a leaky bucket). A throttled call is
retried up to two times, waiting for the bucket to refill; if it is still
throttled, the client gets
Tool invocation failed. The per-request timeout
is 20 s. Some tools (list_inventory_transfers, get_inventory_transfer,
get_inventory_shipment, run_analytics_query) read parts of the Admin API
that have changed between Shopify API versions and are best-effort against
2026-04; the graphql_query escape hatch covers any gap. See
Errors & limits.