# Shopify features and coverage

ShopMCP provides a limited catalogue of MCP tools. It covers selected Shopify Admin workflows, not the entire Shopify Admin API. The tools a client can see and use also depend on Shopify app scopes, the signed-in person's permissions, connection permissions, and connection policy. A missing tool cannot be made available with a prompt, skill, or manually constructed request.

## Areas

- Products and variants: Read, create, update, and delete products; manage variants, options, media, and publication targets. Price and media changes have additional connection-policy gates. Available fields vary by tool.
- Orders and fulfillment: Read and update orders, request fulfillment, cancel orders, and create explicitly bounded refunds. `cancel_order` cannot issue a refund. Use `create_refund` with explicit transaction amounts and an idempotency key. Shopify can only perform fulfillment actions and quantities that are available.
- Customer data: Read customers and update supported fields. Structured customer, contact, and address fields can be redacted in responses. Free-text values can still contain personal data.
- Inventory and locations: Read quantities and locations, set inventory with a comparison value, and update selected inventory and location data. Resolve conflicts by reading the current state again.
- Collections: Read lists and details, create, update, and delete collections, and associate products. Shopify permissions for collections and products still apply.
- Metafields and metaobjects: Read metafields and definitions and read, create, or update metaobjects. A namespace allowlist can restrict writes; not every Shopify type and definition is available.
- Themes: Read themes and theme files. ShopMCP cannot write, delete, or restore theme files. Existing archives are for export only. This does not disable supported Shopify translation APIs; those remain available through their normal tools and Shopify permissions.
- Pages, blogs, and navigation: Read pages, blogs, and articles and make supported updates; read and update menus. This is not a general theme or content editor.
- Store and settings: Read store information and policies, locales, checkout branding, and delivery profiles. Changes require the relevant Shopify scopes and connection permissions. Legacy delivery profiles are a different data model from Market-driven Shipping.
- Markets, shipping, and translations: Read and update markets and use supported shipping and translation workflows. The path depends on `shop.features.marketDrivenShipping`; Shopify feature previews and scopes can limit it.
- Discounts, draft orders, and gift cards: Use selected discount-code, draft-order, and gift-card workflows. Not every discount type, order action, or Shopify Admin feature is implemented. One offer stays one discount: add more redeem codes to an existing discount with `add_discount_codes` instead of creating another discount with the same value. Draft orders cannot carry a custom discount (Built for Shopify 5.5.2); use an existing code discount or `create_discount` instead.
- Files and redirects: Read files and redirects and perform supported file and redirect updates. Upload and file-type support depend on the specific tool.

## Safely retrying inventory changes

`set_inventory` uses an expected starting value (`changeFromQuantity`) and a stable idempotency key. Shopify can reject an identical replay after a successful quantity change with `CHANGE_FROM_QUANTITY_STALE`. In a limited Partner development-shop probe, inventory was set from 0 to 3; the replay with the same UUID key returned this conflict and the quantity remained 3. The test product was then deleted.

After this conflict or an unclear transport timeout, read the current quantity first and compare it with the desired value. Do not reuse the old `changeFromQuantity` or submit another change with a new key until the state is clear. The same key is for retrying the same logical operation, not for a new requested change. This probe does not establish behavior for every inventory or location case.

Orders can contain several deliveries, for example split shipping or ship and pickup in one order. `get_order` lists each fulfillment order with its delivery method (SHIPPING, PICK_UP, LOCAL and others) and assigned location. `fulfill_order` always needs the exact `fulfillmentOrderId` and never guesses between deliveries.

## Market-driven Shipping and pagination

ShopMCP distinguishes the existing Delivery Profile model from the newer Market-driven Shipping model. If `shop.features.marketDrivenShipping` is inactive, the legacy Delivery Profile path applies. If the feature is active, use market shipping data and the required Market scopes. A successful response or empty `userErrors` list alone does not prove Shopify will offer the requested shipping at checkout. Verify changes on an eligible preview shop, then compare them with test checkout rates.

Every new shipping rate group needs at least one origin location: pass shipping location IDs (from `get_locations`) in `conditions.originLocationsToAdd`. Shopify does not offer an option without an origin location at checkout, so ShopMCP refuses such a change before writing it. Weight tiers use inclusive bounds; start the next tier just above the previous maximum (for example 1.0001 lb after 1 lb).

Cursor-paginated lists can require multiple responses. Nested Market shipping data has separate cursors for market pages, parent markets, regions, market locations, options, groups, rates, option collections and locations, and group-condition collections and origin locations. Use `after`, `parentsAfter`, `regionsAfter`, `marketLocationsAfter`, `optionsAfter`, `groupsAfter`, `ratesAfter`, `optionCollectionsAfter`, `optionLocationsAfter`, `conditionCollectionsAfter`, and `originLocationsAfter`. Follow each cursor until `hasNextPage` is false, and reset child cursors when moving to a different parent object. `locationsAfter` remains an alias for `marketLocationsAfter`, and `collectionsAfter` remains an alias for `optionCollectionsAfter`. One tool call or first page is not proof of completeness for a large store.

## Permissions and limits

The table below is generated from the shared server-side permission registry. It lists the connection resource and operation assigned to each tool. Shopify app scopes, staff access, policy, and object-level limits can restrict access further. General workflow and documentation tools do not need a separate resource grant, but still require an authenticated ShopMCP connection.

## Registered tool catalogue

This table is generated during each documentation build from the server-side `TOOL_REGISTRY` and `ALWAYS_ALLOWED`. `always` means that no separate resource grant is needed in the connection permission matrix. Authentication, an active connection, staff permissions, and other server-side checks still apply.

- `add_discount_codes` — `discounts` / write
- `add_product_media` — `products` / write
- `add_products_to_collection` — `collections` / write
- `assign_variant_media` — `products` / write
- `cancel_order` — `orders` / write
- `complete_draft_order` — `draft_orders` / write
- `create_article` — `pages` / write
- `create_blog` — `pages` / write
- `create_collection` — `collections` / write
- `create_discount` — `discounts` / write
- `create_draft_order` — `draft_orders` / write
- `create_file` — `files` / write
- `create_gift_card` — `gift_cards` / write
- `create_market` — `markets` / write
- `create_metafield_definition` — `metafields` / write
- `create_metaobject` — `metafields` / write
- `create_metaobject_definition` — `metafields` / write
- `create_page` — `pages` / write
- `create_product` — `products` / write
- `create_product_option` — `products` / write
- `create_product_variant` — `products` / write
- `create_redirect` — `redirects` / write
- `create_refund` — `orders` / write
- `delete_article` — `pages` / delete
- `delete_blog` — `pages` / delete
- `delete_collection` — `collections` / delete
- `delete_discount` — `discounts` / delete
- `delete_draft_order` — `draft_orders` / delete
- `delete_file` — `files` / delete
- `delete_market` — `markets` / delete
- `delete_metafield` — `metafields` / delete
- `delete_metafield_definition` — `metafields` / delete
- `delete_metaobject` — `metafields` / delete
- `delete_page` — `pages` / delete
- `delete_product` — `products` / delete
- `delete_product_media` — `products` / delete
- `delete_product_variant` — `products` / delete
- `delete_redirect` — `redirects` / delete
- `disable_gift_card` — `gift_cards` / delete
- `disable_locale` — `shop` / write
- `enable_locale` — `shop` / write
- `fulfill_order` — `orders` / write
- `get_articles` — `pages` / read
- `get_blogs` — `pages` / read
- `get_checkout_branding` — `shop` / read
- `get_collection` — `collections` / read
- `get_collections` — `collections` / read
- `get_customer` — `customers` / read
- `get_customers` — `customers` / read
- `get_delivery_profiles` — `shop` / read
- `get_discount_code_creation` — `discounts` / read
- `get_discounts` — `discounts` / read
- `get_documentation` — `general` / always
- `get_draft_order` — `draft_orders` / read
- `get_draft_orders` — `draft_orders` / read
- `get_files` — `files` / read
- `get_gift_card` — `gift_cards` / read
- `get_gift_cards` — `gift_cards` / read
- `get_instructions` — `general` / always
- `get_inventory` — `inventory` / read
- `get_locales` — `shop` / read
- `get_locations` — `inventory` / read
- `get_market_shipping` — `markets` / read
- `get_markets` — `markets` / read
- `get_menus` — `navigation` / read
- `get_metafield_definitions` — `metafields` / read
- `get_metafields` — `metafields` / read
- `get_metaobject_definitions` — `metafields` / read
- `get_metaobjects` — `metafields` / read
- `get_order` — `orders` / read
- `get_orders` — `orders` / read
- `get_page` — `pages` / read
- `get_pages` — `pages` / read
- `get_product` — `products` / read
- `get_products` — `products` / read
- `get_publications` — `products` / read
- `get_redirects` — `redirects` / read
- `get_shop_info` — `shop` / read
- `get_shop_policies` — `shop` / read
- `get_shopify_capabilities` — `general` / always
- `get_shopify_operation` — `general` / always
- `get_shopify_type` — `general` / always
- `get_skill` — `general` / always
- `get_support_reporting_instructions` — `general` / always
- `get_theme_file` — `themes` / read
- `get_theme_files` — `themes` / read
- `get_themes` — `themes` / read
- `get_translations` — `markets` / read
- `list_skills` — `general` / always
- `publish_resource` — `products` / write
- `register_translations` — `markets` / write
- `remove_products_from_collection` — `collections` / write
- `remove_translations` — `markets` / delete
- `rename_file` — `files` / write
- `reorder_product_media` — `products` / write
- `search_shopify_operations` — `general` / always
- `set_inventory` — `inventory` / write
- `set_inventory_tracking` — `inventory` / write
- `set_metafield` — `metafields` / write
- `shopify_batch` — `api_operations` / write
- `shopify_mutation` — `api_operations` / write
- `shopify_query` — `api_operations` / read
- `submit_support_report` — `general` / always
- `update_article` — `pages` / write
- `update_blog` — `pages` / write
- `update_checkout_branding` — `shop` / write
- `update_collection` — `collections` / write
- `update_customer` — `customers` / write
- `update_delivery_profile` — `shop` / write
- `update_draft_order` — `draft_orders` / write
- `update_inventory_item` — `inventory` / write
- `update_locale` — `shop` / write
- `update_location` — `inventory` / write
- `update_market` — `markets` / write
- `update_market_shipping` — `markets` / write
- `update_menu` — `navigation` / write
- `update_metaobject` — `metafields` / write
- `update_metaobject_definition` — `metafields` / write
- `update_order` — `orders` / write
- `update_page` — `pages` / write
- `update_product` — `products` / write
- `update_product_media_alt` — `files` / write
- `update_product_option_values` — `products` / write
- `update_product_variant` — `products` / write
- `update_redirect` — `redirects` / write
- `update_shop_policy` — `shop` / write
- `update_video_preview` — `files` / write
