shopify-mcp
MCP server for Shopify Admin API with a ComfyUI bridge for AI product image generation. Covers products, orders, inventory, and customers.
README
shopify-mcp
MCP server for Shopify — Admin API tooling plus AI-driven product creation via ComfyUI image generation.
Part of the MCP Server Series.
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."
...and Claude runs ComfyUI → gets an image → creates the Shopify product → attaches the image, in one call.
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:latest
Connect an MCP client
claude mcp add --transport http shopify http://localhost:9110/mcp
Or point your MCP gateway at the Streamable HTTP endpoint.
Configuration
| 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 |
--port |
MCP_PORT |
9110 |
Bind port |
--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 |
| — | COMFYUI_DEFAULT_CKPT |
sd_xl_base_1.0.safetensors |
Default checkpoint for bridge tools |
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 (v0.2).
Tools
Core Admin
| 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 |
Metafields
| Tool | Description |
|---|---|
set_metafield |
Upsert a metafield on any HasMetafields resource (product, variant, collection, customer, order, shop, …) |
list_metafields |
List metafields for a resource, optionally filtered by namespace |
delete_metafield |
Delete a metafield by (ownerId, namespace, key) |
Draft orders
| 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 |
Webhooks
| 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 |
Metaobjects
| 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 |
Fulfillment
| 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 + notify 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; omit the array to fulfill everything on the fulfillment order.
Variants & product options
| Tool | Description |
|---|---|
list_variants |
List all variants of a product with their 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/…) 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 & tagging
| 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 |
Analytics (ShopifyQL)
| 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 10
ComfyUI bridge (when COMFYUI_URL is configured)
| Tool | Description |
|---|---|
generate_and_create_product |
Generate an image and create a product with it, in one call. Title/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}.
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"]
Result: ComfyUI generates the image → Shopify product created with image attached → you get back the product ID and image URL. 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 test
Requires Node 20+.
Roadmap
- [x] Core products CRUD + image attach
- [x] Orders read
- [x] Inventory set + locations
- [x] Customers read
- [x] ComfyUI bridge:
generate_and_create_product,generate_product_image,bulk_regenerate_images - [x] Metafields:
set_metafield,list_metafields,delete_metafield - [x] Draft orders: create/update/complete/delete + list/get
- [x] Collections + tagging: CRUD, product add/remove,
add_tags/remove_tags - [x] Variants + product options: bulk create/update/delete/reorder +
add_product_options - [x] Fulfillment: list/get fulfillment orders, create fulfillment (partial supported), update tracking, cancel
- [x] Webhooks: list/get/create/update/delete subscriptions
- [x] Metaobjects: definitions list + metaobject CRUD (create, update, delete)
- [x] ShopifyQL analytics:
run_shopifyql_querywith ASCII-table rendering - [x] Image refinement bridge:
refine_product_image(ComfyUI img2img on product images) - [ ] OAuth token-exchange flow for new-app auth
License
MIT © Joe Miller
Support
If this saves you time, consider supporting development:
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。