Connects Claude to the Shopify Admin GraphQL API with full product, order, inventory, customer, webhook, metafield, and fulfillment tooling. The ComfyUI bridge is the standout: prompt Claude to generate product images on the fly and auto-attach them during product creation, so "create a cosmic candle product with AI art" completes end to end. Supports both stdio and streamable HTTP transports. Includes draft orders, metaobjects, variant bulk ops, and webhook management. Requires a Shopify admin access token; custom app tokens work for existing dev stores, though newer apps need the token exchange flow. Pair it with the comfyui-mcp server to unlock the generative workflow.
Public tool metadata for what this MCP can expose to an agent.
SHOPIFY_ADD_PRODUCT_TO_COLLECTIONAdds a product to an existing *custom collection*, optionally specifying its `position` if the collection is manually sorted.3 paramsAdds a product to an existing *custom collection*, optionally specifying its `position` if the collection is manually sorted.
positionintegerproduct_idintegercollection_idintegerSHOPIFY_COUNT_PRODUCT_IMAGESRetrieves the total count of images for a Shopify product, useful for inventory management or display logic; the provided `product_id` must exist in the store.1 paramsRetrieves the total count of images for a Shopify product, useful for inventory management or display logic; the provided `product_id` must exist in the store.
product_idstringSHOPIFY_CREATE_CUSTOM_COLLECTIONCreates a new custom collection in a Shopify store, requiring a unique title for manually curated product groupings (e.g., 'New Arrivals', 'Seasonal Specials').1 paramsCreates a new custom collection in a Shopify store, requiring a unique title for manually curated product groupings (e.g., 'New Arrivals', 'Seasonal Specials').
titlestringSHOPIFY_CREATE_CUSTOMERTool to create a new customer in Shopify. Use when you need to add a new customer record to the store.12 paramsTool to create a new customer in Shopify. Use when you need to add a new customer record to the store.
notestringtagsstringemailstringphonestringpasswordstringaddressesarraylast_namestringfirst_namestringverified_emailbooleansend_email_invitebooleansend_email_welcomebooleanpassword_confirmationstringSHOPIFY_CREATE_ORDERCreates a new order in Shopify, typically requiring line items; if `customer_id` is provided, it must correspond to an existing customer.5 paramsCreates a new order in Shopify, typically requiring line items; if `customer_id` is provided, it must correspond to an existing customer.
currencystringtotal_taxnumberline_itemsarraycustomer_idstringtransactionsarraySHOPIFY_CREATE_PRODUCTCreates a new product in a Shopify store; a product title is generally required.5 paramsCreates a new product in a Shopify store; a product title is generally required.
titlestringvendorstringvariantsarraybody_htmlstringproduct_typestringSHOPIFY_CREATE_PRODUCT_IMAGETool to create a new product image for a given product. Use when you need to add an image to a product by providing the image source URL or attachment.2 paramsTool to create a new product image for a given product. Use when you need to add an image to a product by providing the image source URL or attachment.
imageobjectproduct_idstringSHOPIFY_CREATE_PRODUCT_METAFIELDCreates a new metafield for a specific Shopify product.6 paramsCreates a new metafield for a specific Shopify product.
keystringtypestringvaluestringnamespacestringproduct_idstringdescriptionstringSHOPIFY_DELETE_CUSTOM_COLLECTIONPermanently deletes a custom collection from a Shopify store using its `collection_id`; this action is irreversible and requires a valid, existing `collection_id`.1 paramsPermanently deletes a custom collection from a Shopify store using its `collection_id`; this action is irreversible and requires a valid, existing `collection_id`.
collection_idstringSHOPIFY_DELETE_PRODUCTDeletes a specific, existing product from a Shopify store using its unique product ID; this action is irreversible.1 paramsDeletes a specific, existing product from a Shopify store using its unique product ID; this action is irreversible.
idstringSHOPIFY_DELETE_PRODUCT_IMAGEDeletes a specific image from a product in Shopify, requiring the `product_id` of an existing product and the `image_id` of an image currently associated with that product.2 paramsDeletes a specific image from a product in Shopify, requiring the `product_id` of an existing product and the `image_id` of an image currently associated with that product.
image_idstringproduct_idstringSHOPIFY_DELETE_PRODUCT_METAFIELDDeletes a specific metafield from a Shopify product using the product ID and metafield ID.2 paramsDeletes a specific metafield from a Shopify product using the product ID and metafield ID.
product_idstringmetafield_idstringSHOPIFY_GET_ALL_CUSTOMERSRetrieves customer records from a Shopify store, with options for filtering, selecting specific fields, and paginating through the results.8 paramsRetrieves customer records from a Shopify store, with options for filtering, selecting specific fields, and paginating through the results.
idsarraylimitintegerfieldsstringsince_idstringcreated_at_maxstringcreated_at_minstringupdated_at_maxstringupdated_at_minstringSHOPIFY_GET_COLLECTION_BY_IDRetrieves a specific Shopify collection by its `collection_id`, optionally filtering returned data to specified `fields`.2 paramsRetrieves a specific Shopify collection by its `collection_id`, optionally filtering returned data to specified `fields`.
fieldsstringcollection_idstringSHOPIFY_GET_COLLECTSRetrieves a list of collects from a Shopify store, where a collect links a product to a custom collection.3 paramsRetrieves a list of collects from a Shopify store, where a collect links a product to a custom collection.
limitintegerfieldsstringsince_idintegerSHOPIFY_GET_COLLECTS_COUNTRetrieves the total count of collects (product-to-collection associations) in a Shopify store.Retrieves the total count of collects (product-to-collection associations) in a Shopify store.
No parameter schema in public metadata yet.
SHOPIFY_GET_CUSTOM_COLLECTIONSRetrieves a list of custom collections from a Shopify store, optionally filtered by IDs, product ID, or handle.4 paramsRetrieves a list of custom collections from a Shopify store, optionally filtered by IDs, product ID, or handle.
idsstringlimitintegerhandlestringproduct_idintegerSHOPIFY_GET_CUSTOM_COLLECTIONS_COUNTRetrieves the total number of custom collections in a Shopify store.Retrieves the total number of custom collections in a Shopify store.
No parameter schema in public metadata yet.
SHOPIFY_GET_CUSTOMERRetrieves detailed information for a specific customer from a Shopify store, provided their valid and existing `customer_id`.1 paramsRetrieves detailed information for a specific customer from a Shopify store, provided their valid and existing `customer_id`.
customer_idstringSHOPIFY_GET_CUSTOMER_ORDERSRetrieves all orders for a specific, existing customer in Shopify using their unique customer ID.1 paramsRetrieves all orders for a specific, existing customer in Shopify using their unique customer ID.
customer_idstringSHOPIFY_GET_ORDER_LISTRetrieves a list of orders from Shopify with optional filters and pagination.16 paramsRetrieves a list of orders from Shopify with optional filters and pagination.
idsstringnamestringlimitintegerfieldsstringstatusstringsince_idintegerpage_infostringcreated_at_maxstringcreated_at_minstringupdated_at_maxstringupdated_at_minstringfinancial_statusstringprocessed_at_maxstringprocessed_at_minstringattribution_app_idstringfulfillment_statusstringSHOPIFY_GET_ORDERSBY_IDRetrieves a specific Shopify order by its unique ID, which must correspond to an existing order.2 paramsRetrieves a specific Shopify order by its unique ID, which must correspond to an existing order.
fieldsstringorder_idstringSHOPIFY_GET_ORDERS_WITH_FILTERSRetrieves Shopify orders filtered by dates and other filters. Uses server-side filtering.16 paramsRetrieves Shopify orders filtered by dates and other filters. Uses server-side filtering.
idsstringnamestringlimitintegerfieldsstringstatusstringsince_idintegerpage_infostringcreated_at_maxstringcreated_at_minstringupdated_at_maxstringupdated_at_minstringfinancial_statusstringprocessed_at_maxstringprocessed_at_minstringattribution_app_idstringfulfillment_statusstringSHOPIFY_GET_PRODUCTRetrieves details for an existing Shopify product using its unique product ID.1 paramsRetrieves details for an existing Shopify product using its unique product ID.
product_idstringSHOPIFY_GET_PRODUCT_IMAGERetrieves detailed information for a specific product image, identified by its ID and its associated product ID, from a Shopify store.2 paramsRetrieves detailed information for a specific product image, identified by its ID and its associated product ID, from a Shopify store.
image_idstringproduct_idstringSHOPIFY_GET_PRODUCT_IMAGESRetrieves all images for a Shopify product, specified by its `product_id` which must correspond to an existing product.3 paramsRetrieves all images for a Shopify product, specified by its `product_id` which must correspond to an existing product.
fieldsstringsince_idstringproduct_idstringSHOPIFY_GET_PRODUCT_METAFIELDRetrieves a specific metafield for a Shopify product using the product ID and metafield ID.2 paramsRetrieves a specific metafield for a Shopify product using the product ID and metafield ID.
product_idstringmetafield_idstringSHOPIFY_GET_PRODUCT_METAFIELDSRetrieves all metafields for a specific Shopify product. Metafields can be filtered by namespace and/or key.3 paramsRetrieves all metafields for a specific Shopify product. Metafields can be filtered by namespace and/or key.
keystringnamespacestringproduct_idstringSHOPIFY_GET_PRODUCTSRetrieves a list of products from a Shopify store.1 paramsRetrieves a list of products from a Shopify store.
idsstringSHOPIFY_GET_PRODUCTS_COUNTRetrieves the total, unfiltered count of all products in a Shopify store.Retrieves the total, unfiltered count of all products in a Shopify store.
No parameter schema in public metadata yet.
SHOPIFY_GET_PRODUCTS_IN_COLLECTIONRetrieves all products within a specified Shopify collection, requiring a valid `collection_id`.2 paramsRetrieves all products within a specified Shopify collection, requiring a valid `collection_id`.
limitintegercollection_idstringSHOPIFY_GET_PRODUCTS_PAGINATEDTool to list products with Shopify cursor-based pagination. Use when iterating over large product catalogs via the Link header.3 paramsTool to list products with Shopify cursor-based pagination. Use when iterating over large product catalogs via the Link header.
limitintegerfieldsstringpage_infostringSHOPIFY_GET_SHOP_DETAILSRetrieves comprehensive administrative information about the authenticated Shopify store, as defined by the Shopify API.Retrieves comprehensive administrative information about the authenticated Shopify store, as defined by the Shopify API.
No parameter schema in public metadata yet.
SHOPIFY_GRAPH_QL_QUERYExecutes a GraphQL query against the Shopify Admin API. This allows for flexible data retrieval and mutations including metafields operations.2 paramsExecutes a GraphQL query against the Shopify Admin API. This allows for flexible data retrieval and mutations including metafields operations.
querystringvariablesobjectSHOPIFY_UPDATE_ORDERUpdates the phone number for an existing Shopify order, identified by its ID; pass `phone=None` to remove the current phone number.2 paramsUpdates the phone number for an existing Shopify order, identified by its ID; pass `phone=None` to remove the current phone number.
idintegerphonestringSHOPIFY_UPDATE_PRODUCT_METAFIELDUpdates an existing metafield for a specific Shopify product.5 paramsUpdates an existing metafield for a specific Shopify product.
typestringvaluestringproduct_idstringdescriptionstringmetafield_idstringMCP server for Shopify. Full Admin GraphQL API tooling plus an AI-driven product creation bridge via ComfyUI image generation.
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.
# 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:latest
claude mcp add --transport http shopify http://localhost:9110/mcp
Or point your MCP gateway at the Streamable HTTP endpoint.
| CLI flag | Env var | Default | Notes |
|---|---|---|---|
--shopify-store | SHOPIFY_STORE | (required) | my-store or my-store.myshopify.com |
--shopify-access-token | SHOPIFY_ACCESS_TOKEN | (required) | Admin API token (shpat_…) |
--shopify-api-version | SHOPIFY_API_VERSION | 2026-04 | GraphQL Admin API version |
--host | MCP_HOST | 0.0.0.0 | Bind host (HTTP mode only) |
--port | MCP_PORT | 9110 | Bind port (HTTP mode only) |
--stdio | MCP_TRANSPORT=stdio | (unset) | Speak MCP over stdio instead of HTTP. Use when launched as a subprocess by a stdio-first MCP client (Claude Desktop, mcp-inspector). |
--comfyui-url | COMFYUI_URL | (optional) | Enables bridge tools when set |
--comfyui-public-url | COMFYUI_PUBLIC_URL | same as --comfyui-url | External URL used for image references passed to Shopify |
| (no flag) | COMFYUI_DEFAULT_CKPT | sd_xl_base_1.0.safetensors | Default checkpoint for bridge tools |
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_…"
}
}
}
}
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.
| Tool | Description |
|---|---|
list_products | Paginated product search with Shopify query syntax |
get_product | Fetch one product with variants, images, media |
create_product | Create a product (default DRAFT); optionally attach images |
update_product | Update title, description, tags, status, etc. |
upload_product_image | Attach a public image URL to an existing product |
list_orders | List orders, newest first, with query filters |
get_order | Fetch one order with line items |
set_inventory_quantity | Set absolute on-hand inventory at a location |
list_locations | List store locations (for inventory ops) |
list_customers | List customers with query filters |
| Tool | Description |
|---|---|
set_metafield | Upsert a metafield on any HasMetafields resource (product, variant, collection, customer, order, shop, etc.) |
list_metafields | List metafields for a resource, optionally filtered by namespace |
delete_metafield | Delete a metafield by (ownerId, namespace, key) |
| Tool | Description |
|---|---|
list_draft_orders | List draft orders with Shopify query filters |
get_draft_order | Fetch one draft order with its line items |
create_draft_order | Create a draft order. Line items can be variant refs or custom (title + price). |
update_draft_order | Update customer, line items, tags, note, email |
complete_draft_order | Convert a draft order to a real order. paymentPending skips capture. |
delete_draft_order | Delete a non-completed draft order |
| Tool | Description |
|---|---|
list_webhooks | List webhook subscriptions; filter by topic(s) |
get_webhook | Fetch a single subscription |
create_webhook | Subscribe an HTTPS callback URL to a topic (e.g. ORDERS_CREATE) |
update_webhook | Change callback URL, format, or field/metafield filters |
delete_webhook | Delete a subscription |
| Tool | Description |
|---|---|
list_metaobject_definitions | Discover metaobject types (schemas) on the store, including field definitions |
list_metaobjects | List metaobjects of a given type |
get_metaobject | Fetch one metaobject with all its fields |
create_metaobject | Create a metaobject (type must already exist as a definition). Supports ACTIVE/DRAFT status. |
update_metaobject | Upsert fields, change handle, toggle publishable status |
delete_metaobject | Delete a metaobject |
| Tool | Description |
|---|---|
list_fulfillment_orders | List an order's fulfillment orders (one per shipping location), with remaining quantities per line item |
get_fulfillment_order | Fetch a single fulfillment order |
get_fulfillment | Fetch a single fulfillment (shipment record) with tracking info |
create_fulfillment | Mark fulfillment orders (or specific quantities) as fulfilled. Optionally attach tracking and notify the customer. |
update_fulfillment_tracking | Update carrier/number/url on an existing fulfillment |
cancel_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.
| Tool | Description |
|---|---|
list_variants | List all variants of a product with selected options, price, SKU, inventory |
create_variants | Bulk-create variants (up to 100) with option values, price, SKU, compareAtPrice, initial inventory |
update_variants | Bulk-update variant price, compareAtPrice, SKU, barcode, taxable, inventoryPolicy, option values |
delete_variants | Bulk-delete variants from a product |
reorder_variants | Set 1-indexed positions for variants |
add_product_options | 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.
| Tool | Description |
|---|---|
list_collections | List collections with query filters |
get_collection | Fetch one collection with its products |
create_collection | Create a manual collection, optionally seeded with products |
update_collection | Update title, description, or handle |
delete_collection | Delete a collection |
add_products_to_collection | Add products to a manual collection (async job on Shopify's side) |
remove_products_from_collection | Remove products from a manual collection |
add_tags | Add tags to any taggable resource (Product, Order, Customer, DraftOrder, Collection) |
remove_tags | Remove tags from a taggable resource |
| Tool | Description |
|---|---|
run_shopifyql_query | Run a ShopifyQL query and render the result as an ASCII table. Pass raw=true for the raw JSON payload. |
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 10COMFYUI_URL is configured)| Tool | Description |
|---|---|
generate_and_create_product | Generate an image and create a product with it, in one call. Title and description derive from the prompt if not given. |
generate_product_image | Generate an image and attach it to an existing product. |
refine_product_image | Run img2img on a product's featured image (or an explicit URL) and attach the refined result. Tune denoise (0–1) for how far the result drifts from the source. |
bulk_regenerate_images | 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}.
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.
┌────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ 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.
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 test
Requires Node 20+.
Shipped:
generate_and_create_product, generate_product_image, bulk_regenerate_imagesset_metafield, list_metafields, delete_metafieldadd_tags / remove_tagsadd_product_optionsrun_shopifyql_query with ASCII-table renderingrefine_product_image (ComfyUI img2img on product images)Planned:
MIT © Joe Miller
If this saves you time, consider supporting development:
SHOPIFY_STORE*Store domain, e.g. 'my-store' or 'my-store.myshopify.com'
SHOPIFY_ACCESS_TOKEN*secretAdmin API access token (shpat_...). See README for how to create a custom app on a dev store.
SHOPIFY_API_VERSIONShopify GraphQL Admin API version (default: 2026-04)
COMFYUI_URLComfyUI HTTP URL for bridge tools. When unset, generate_* bridge tools are disabled.
COMFYUI_PUBLIC_URLExternally-reachable ComfyUI URL (defaults to COMFYUI_URL)
COMFYUI_DEFAULT_CKPTDefault ComfyUI checkpoint filename for bridge tools (default: sd_xl_base_1.0.safetensors)
io.github.shelvick/shopify-subscription-reconciliation
zleventer/google-ads-mcp
csoai-org/meok-stripe-acp-checkout-mcp
io.github.mharnett/google-ads
csoai-org/stripe-billing-mcp
co.pipeboard/google-ads-mcp