MCPify documentation
Server URL for OAuth clients: https://getmcpify.app/mcp. API keys use https://getmcpify.app/mcp/<connection-id>. Shopify Admin API version 2026-10.
What MCPify is
MCPify connects one Shopify store to an AI client through the Model Context Protocol. A connection decides what the client may do: read, write or delete per resource, which raw Admin API operations it may run, and advanced limits such as prices, refunds or customer data. Every call is checked before it reaches Shopify and written to the store's audit log. MCPify has no chat of its own; the AI client handles prompts and models.
Connecting a client
OAuth (Claude connectors, Claude Code, Cursor, Codex with OAuth): add the server URL ending in /mcp. The client opens MCPify's sign-in page; sign in with Shopify and pick the connection, or enter a pairing code from the connection's page. API key (any client that sends headers): use the per-connection URL /mcp/<connection-id> with the header "Authorization: Bearer <key>". Keys are shown once; treat them like passwords.
Permissions and limits
Resource permissions (read / write / delete) unlock the curated tools. Admin API operations (shopify_query, shopify_mutation, shopify_batch) are separate: each operation must be granted explicitly, resource permissions never extend to them. Advanced limits: product content, prices (needs product content too), media, customer data (off = customer tools hidden and structured customer, contact and address fields redacted; free text can still contain personal data), refunds with an optional cap, batch size, allowed locations, allowed metafield namespaces. A deny list blocks operations everywhere. Shopify app scopes and, for staff sign-ins, the person's own Shopify permissions limit every call as well. Skills never grant permissions.
Admin API operations
The pinned Admin GraphQL API (2026-10) is available as named operations. Find them with search_shopify_operations, inspect arguments and default output with get_shopify_operation, and nested types with get_shopify_type. Run one with shopify_query or shopify_mutation: pass arguments as JSON and optionally a selection set such as { id title }. Selections are validated against the schema; deprecated fields, fragments, extra root fields and very deep selections are rejected. Mutations always return userErrors: check them. Bulk operations and theme mutations are not available here (use update_theme_file / delete_theme_file). Pro connections can run shopify_batch for up to 25 independent mutation rows per call; follow nextOffset to continue. Mutations are never retried automatically.
Pagination
Lists are cursor-paginated. Pass pageInfo.endCursor as after and continue until hasNextPage is false. Nested lists have their own cursors (e.g. groupsAfter in get_market_shipping); reset child cursors when moving to another parent. One page is never proof that a list is complete.
Safe retries
Pass an idempotencyKey (UUID) to changes that accept it. Retrying with the same key and the same arguments returns the stored result instead of changing the store again; the same key with different arguments is rejected. For set_inventory also pass changeFromQuantity, the quantity you last read. If Shopify answers CHANGE_FROM_QUANTITY_STALE or a call timed out, read the current state first. If the target value is already set, stop; otherwise plan a new change with a new key based on what you just read.
Orders, fulfillment and refunds
get_order lists every fulfillment order with its delivery method and location. fulfill_order needs the exact fulfillmentOrderId and never guesses between deliveries. cancel_order never refunds; create_refund needs explicit transactions, a declaredTotal equal to their sum and an idempotency key, and respects the connection's refund cap. Draft orders cannot carry custom discounts: use an existing discount code.
Discounts
One offer is one discount. To give out more codes for the same offer, use add_discount_codes on the existing discount and check progress with get_discount_code_creation, instead of creating several discounts with the same value.
Shipping
Check get_shop_info features.marketDrivenShipping. When it is off, shipping lives in delivery profiles (get_delivery_profiles, update_delivery_profile). When it is on, use get_market_shipping and update_market_shipping. Every new rate group needs at least one origin location in conditions.originLocationsToAdd. Weight tiers use inclusive bounds. A successful response does not prove a rate appears at checkout: verify with a test checkout.
Themes
update_theme_file and delete_theme_file change one file at a time. MCPify stores the previous version in the theme archive (time, connection, checksum) before every change; the merchant can export it. The live theme only changes with confirmLiveTheme: true, which you should only send after the user agreed. Prefer an unpublished copy. MCPify never publishes or restores themes.
Skills
Skills are step-by-step workflows (catalog audit, product copy, translation review and the store's own skills). Load them with list_skills and get_skill or as MCP prompts. They read data and propose changes; apply changes only after the user approves.
Troubleshooting
401: the key, token or URL is wrong, expired or revoked. A blocked call names the missing permission or limit; the store owner can change the connection in MCPify. A missing tool means the connection, plan or Shopify scopes do not allow it; a prompt cannot unlock it. Use get_shopify_capabilities to see what this connection can do. To report a bug or missing feature, read get_support_reporting_instructions.
Working rules for AI clients
Working rules for this MCPify connection: 1. Call get_shop_info first so you know which store you are working on. 2. Read before you write. Show the user every planned change and get an explicit yes before calling a write or delete tool. 3. Follow pagination until hasNextPage is false; say so when you stop early. 4. Check userErrors of every mutation. A missing error is not proof the storefront shows the change; verify by reading it back. 5. Use idempotency keys for changes and never resubmit a timed-out change before reading the current state. 6. When a call is blocked, tell the user which permission or limit is missing. Do not try to work around it. 7. Customer data may be redacted; do not ask the user to paste personal data into the chat to get around it.
Resources
| Resource | Key | Actions |
|---|---|---|
| Store & settings | store | read, write |
| Products & variants | products | read, write, delete |
| Collections | collections | read, write, delete |
| Inventory & locations | inventory | read, write |
| Orders & fulfillment | orders | read, write |
| Draft orders | draft_orders | read, write, delete |
| Customers | customers | read, write |
| Discounts | discounts | read, write, delete |
| Gift cards | gift_cards | read, write, delete |
| Metafields & metaobjects | metafields | read, write, delete |
| Translations | translations | read, write, delete |
| Markets & shipping | markets | read, write, delete |
| Pages & blogs | content | read, write, delete |
| Navigation | navigation | read, write |
| URL redirects | redirects | read, write, delete |
| Files | files | read, write, delete |
| Themes | themes | read, write, delete |
Tool registry (127)
Generated from the server's tool registry. "always" means no resource grant is needed; authentication and every other check still apply.
| Tool | Resource | Needs | Description |
|---|---|---|---|
add_discount_codes | discounts | write | Add more redeem codes to an existing code discount (up to 250 per call). Shopify creates them asynchronously; check progress with get_discount_code_creation. |
add_product_media | products | write | Add images, videos or 3D models to a product from public URLs. |
add_products_to_collection | collections | write | Add products to a manual collection. |
assign_variant_media | products | write | Attach existing product media to variants (one image per variant). |
cancel_order | orders | write | Cancel an order, optionally restocking. This never refunds money; use create_refund for that. |
complete_draft_order | draft_orders | write | Turn a draft order into an order. Without a payment gateway the order is marked as paid. |
create_article | content | write | Create a blog article (hidden unless isPublished is true). |
create_blog | content | write | Create a blog. |
create_collection | collections | write | Create a collection. Pass productIds for a manual collection, or sources (CollectionCreateSourceTargetInput, see get_shopify_type) for automated conditions. |
create_discount | discounts | write | Create one discount: a percentage or fixed amount off (code or automatic), or free shipping (code). One offer stays one discount: to hand out more codes for the same offer use add_discount_codes. |
create_draft_order | draft_orders | write | Create a draft order from variants and/or custom line items. |
create_file | files | write | Add a file to Content › Files from a public URL. |
create_gift_card | gift_cards | write | Issue a gift card. The full code is returned once in the response. |
create_market | markets | write | Create a market. conditions takes MarketConditionsInput (e.g. regionsCondition with country codes); see get_shopify_type. |
create_metafield_definition | metafields | write | Define a metafield (name, type, validations) so it appears in the admin and can be used in themes. |
create_metaobject | metafields | write | Create a metaobject entry of an existing type. |
create_metaobject_definition | metafields | write | Create a metaobject type with its fields. |
create_page | content | write | Create an online store page (hidden unless isPublished is true). |
create_product | products | write | Create a product (draft by default), optionally with options such as Size and Color. Add variants afterwards with create_product_variant. |
create_product_option | products | write | Add options (e.g. Material) with their values to a product. Existing variants get the first value. |
create_product_variant | products | write | Add one or more variants to a product. Each variant needs a value for every product option. |
create_redirect | redirects | write | Redirect an old path (e.g. /products/old-name) to a new path or URL. |
create_refund | orders | write | Refund money on an order with explicit transactions. declaredTotal must equal the sum of the transaction amounts, and the connection's refund cap applies. Get parent transaction IDs and gateways from get_order. Always pass an idempotency key. |
delete_article | content | delete | Permanently delete a blog article. |
delete_blog | content | delete | Delete a blog and all its articles. |
delete_collection | collections | delete | Delete a collection. Its products are kept. |
delete_discount | discounts | delete | Delete a code discount (gid://shopify/DiscountCodeNode/…) or automatic discount (gid://shopify/DiscountAutomaticNode/…). |
delete_draft_order | draft_orders | delete | Delete a draft order. |
delete_file | files | delete | Permanently delete files. Products using them lose the media. |
delete_market | markets | delete | Delete a market. |
delete_metafield | metafields | delete | Delete metafields identified by owner, namespace and key. |
delete_metafield_definition | metafields | delete | Delete a metafield definition. Optionally delete all metafields using it. |
delete_metaobject | metafields | delete | Delete a metaobject entry. |
delete_page | content | delete | Permanently delete an online store page. |
delete_product | products | delete | Permanently delete a product and all its variants. This cannot be undone. |
delete_product_media | products | delete | Delete media from a product. The files are removed from the store. |
delete_product_variant | products | delete | Delete variants from a product. |
delete_redirect | redirects | delete | Delete a URL redirect. |
delete_theme_file | themes | delete | Delete a single theme file. MCPify archives it first. Deleting from the live theme needs confirmLiveTheme: true. |
disable_gift_card | gift_cards | delete | Deactivate a gift card permanently. It cannot be used or re-enabled afterwards. |
disable_locale | store | write | Disable a language. Its translations stay stored but are no longer shown. |
enable_locale | store | write | Enable a language (unpublished until you publish it with update_locale). |
fulfill_order | orders | write | Create a fulfillment for one fulfillment order (take fulfillmentOrderId from get_order; never guess between deliveries). Omit lineItems to fulfill everything remaining. |
get_articles | content | read | List blog articles. Filter with query, e.g. `blog_id:123` or `tag:news`. |
get_blogs | content | read | List blogs with article counts. |
get_collection | collections | read | Collection details, its sources (smart conditions) and products. |
get_collections | collections | read | List collections with product counts. |
get_customer | customers | read | Customer details. Recent orders only when the connection may read orders. |
get_customers | customers | read | List customers with order counts and amount spent. |
get_delivery_profiles | store | read | Shipping profiles (legacy model) with location groups, zones and rates. Use this when marketDrivenShipping is off; otherwise use get_market_shipping. |
get_discount_code_creation | discounts | read | Progress and failures of an add_discount_codes job. |
get_discounts | discounts | read | List code and automatic discounts with status, dates and codes. |
get_documentation | general | always | MCPify documentation by topic: overview, connecting, permissions, api_operations, pagination, retries, orders, discounts, shipping, themes, skills, troubleshooting. Without a topic, returns the list of topics. |
get_draft_order | draft_orders | read | A draft order with line items, totals and invoice URL. |
get_draft_orders | draft_orders | read | List draft orders, newest first. |
get_files | files | read | List files from Content › Files with alt text and URLs. Useful for finding images without alt text (query `media_type:IMAGE`). |
get_gift_card | gift_cards | read | A gift card with balance, note and recent transactions. |
get_gift_cards | gift_cards | read | List gift cards with balance and status. Codes are masked. |
get_instructions | general | always | How to work safely with this store through MCPify. Read once at the start of a session. |
get_inventory | inventory | read | Quantities (available, on hand, committed, incoming, reserved) per location for every variant of a product, or for one inventory item. |
get_locales | store | read | Languages enabled in the store, which is primary and which are published. |
get_locations | inventory | read | Store locations with address and whether they fulfill online orders. |
get_market_shipping | markets | read | Market-driven shipping of one market: shipping options, rate groups, rates, origin locations and collections. Check get_shop_info features.marketDrivenShipping first; without it use get_delivery_profiles. Follow every cursor (optionsAfter, groupsAfter, ratesAfter, optionLocationsAfter, optionCollectionsAfter) until hasNextPage is false and reset child cursors when moving to another parent. |
get_markets | markets | read | Markets with status, type, regions, currency, web presences and parent markets. |
get_menus | navigation | read | Online store menus with their items (three levels). |
get_metafield_definitions | metafields | read | Metafield definitions for an owner type, e.g. PRODUCT. |
get_metafields | metafields | read | Read metafields of a product, variant, collection, customer, order, draft order, page, article, blog, location, market or the shop. |
get_metaobject_definitions | metafields | read | Metaobject definitions with their field definitions and counts. |
get_metaobjects | metafields | read | Metaobjects of one type with their field values. |
get_order | orders | read | Order details: line items, totals, transactions, refunds and every fulfillment order with its delivery method (SHIPPING, PICK_UP, LOCAL, …) and assigned location. Use the fulfillmentOrderId from here for fulfill_order. |
get_orders | orders | read | List orders, newest first. Customer names only appear when customer data is switched on. |
get_page | content | read | A page with its full HTML body. |
get_pages | content | read | List online store pages. |
get_product | products | read | Full product details by ID or handle: description, SEO, options, media, variants (price, SKU, barcodes, stock), collections and metafields where permitted. |
get_products | products | read | List products with an optional Shopify search query. Returns summary fields and a cursor for paging. |
get_publications | products | read | Sales channels and catalogs (publications) products and collections can be published to. |
get_redirects | redirects | read | List URL redirects. Filter with query, e.g. `path:/old*`. |
get_shop_info | store | read | Store name, domains, currency, timezone, units, plan and features (including marketDrivenShipping). Call this first to know which store you are working on. |
get_shop_policies | store | read | Refund, privacy, shipping, terms of service and other legal policies. |
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 | How to report a bug or missing feature to MCPify support. Reading this sends nothing. |
get_theme_file | themes | read | The content of one theme file. |
get_theme_files | themes | read | File names, sizes and checksums of a theme, optionally filtered by filename patterns such as `sections/*.liquid`. |
get_themes | themes | read | Themes of the online store with their role (MAIN = live, UNPUBLISHED, DEVELOPMENT, …). |
get_translations | translations | read | Source content (with digests) and translations for one locale, for a page of resources of one type or a single resource. Optionally for one market. |
list_skills | general | always | |
publish_resource | products | write | Publish a product or collection to sales channels, or unpublish it. |
register_translations | translations | write | Create or update translations for one resource. Each entry needs the digest of the source content from get_translations. |
remove_products_from_collection | collections | write | Remove products from a manual collection. The products themselves are kept. |
remove_translations | translations | delete | Delete translations of the given keys and locales for one resource. |
rename_file | files | write | Change a file's filename (keeps the extension). |
reorder_product_media | products | write | Move product media to new positions (0 = first). |
search_shopify_operations | general | always | |
set_inventory | inventory | write | Set the available quantity of inventory items at a location. Pass changeFromQuantity (the quantity you last read) and an idempotency key; if Shopify reports CHANGE_FROM_QUANTITY_STALE, read the current quantity again before deciding on a new change. |
set_inventory_tracking | inventory | write | Switch whether Shopify tracks stock for an inventory item. |
set_metafield | metafields | write | Create or update up to 25 metafields on any owner in one call. |
shopify_batch | api_operations | write (Pro) | |
shopify_mutation | api_operations | write (Pro) | |
shopify_query | api_operations | read | |
submit_support_report | general | always | Send an issue report to MCPify support. Only call this after the user approved the exact report (see get_support_reporting_instructions). |
update_article | content | write | Update an article's title, body, summary, tags, image or visibility. |
update_blog | content | write | Rename a blog or change its handle or comment policy. |
update_collection | collections | write | Update a collection's title, description, handle, sort order or SEO fields. |
update_customer | customers | write | Update a customer's name, email, phone, note, tags or locale. Tags replace the existing tags. |
update_delivery_profile | store | write | Change a shipping profile (legacy model). profile takes DeliveryProfileInput (zones, method definitions, location groups); see get_shopify_type. New location groups need locations. |
update_draft_order | draft_orders | write | Update a draft order. Passing lineItems replaces all line items. |
update_inventory_item | inventory | write | Update SKU, cost, shipping requirement, country of origin or HS code of an inventory item. |
update_locale | store | write | Publish or unpublish a store language, optionally for specific web presences. |
update_location | inventory | write | Rename a location, change its address or whether it fulfills online orders. |
update_market | markets | write | Rename a market, change its status, conditions (conditionsToAdd / conditionsToDelete) or currency settings. |
update_market_shipping | markets | write | Change market-driven shipping of one market. shipping takes ShippingConfigurationUpdateInput (isEnabled, optionDefinitionsToCreate / ToUpdate / ToDelete). Every new rate group needs conditions.originLocationsToAdd. Weight tiers use inclusive bounds: start the next tier just above the previous maximum. A successful response does not prove the rate appears at checkout; verify with a test checkout. |
update_menu | navigation | write | Replace a menu's title and complete item tree. Read the menu with get_menus first and send back every item you want to keep (with its id). |
update_metaobject | metafields | write | Change field values or the handle of a metaobject. |
update_metaobject_definition | metafields | write | Rename a metaobject definition or change its fields. fieldDefinitions takes MetaobjectFieldDefinitionOperationInput entries ({ create }, { update } or { delete }); see get_shopify_type. |
update_order | orders | write | Change an order's note, tags or PO number. Tags replace the existing tags. |
update_page | content | write | Update a page's title, HTML body, handle or visibility. |
update_product | products | write | Update product fields. Only the fields you pass change. Tags replace the existing tags. |
update_product_media_alt | files | write | Set the alt text of images and other media (product media or files). Up to 50 per call. |
update_product_option_values | products | write | Rename an option, reorder it, or add, rename and delete its values. |
update_product_variant | products | write | Update price, compare-at price, SKU, barcode, cost, tax, inventory policy or option values of one or more variants of a product. Price changes need the connection's price permission. |
update_redirect | redirects | write | Change a redirect's path or target. |
update_shop_policy | store | write | Replace the HTML body of a legal policy. Have it reviewed; this is legal text. |
update_theme_file | themes | write | Create or overwrite a single text theme file. MCPify archives the previous version first. Changing the live theme needs confirmLiveTheme: true after asking the user. Themes are never published automatically. |
update_video_preview | files | write | Replace the preview (poster) image of a video from a public image URL. |
Operations never available through the API tools
bulkOperation*: Shopify bulk operations are not available: MCPify cannot control who reads their results.theme*: Theme changes only run through update_theme_file and delete_theme_file, which archive the previous version first.app*: App billing and installation cannot be changed by an AI client.webhookSubscription*: Webhook subscriptions belong to the app's infrastructure.eventBridge*: App infrastructure.pubSub*: App infrastructure.storefrontAccessToken*: Creating or deleting access tokens is not allowed.delegateAccessToken*: Creating or deleting access tokens is not allowed.flowTriggerReceive: App infrastructure.
Plans
Free · $0
- 1 connection
- Read only
- 150 requests per month
- Audit log for 7 days
Starter · $9.99 / month or $99.90 / year
- 1 connection
- Write and delete
- Custom permissions and limits
- Audit log for 30 days
- 1,000 requests per month
Pro · $29 / month or $290 / year
- Unlimited connections and requests
- Everything in Starter
- Skills
- Admin API operation grants
- Audit log for 12 months
Agency · $79 / month or $790 / year
- Everything in Pro
- Several stores managed centrally
- Team access
- Audit log export
- Priority support