MCPify

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

ResourceKeyActions
Store & settingsstoreread, write
Products & variantsproductsread, write, delete
Collectionscollectionsread, write, delete
Inventory & locationsinventoryread, write
Orders & fulfillmentordersread, write
Draft ordersdraft_ordersread, write, delete
Customerscustomersread, write
Discountsdiscountsread, write, delete
Gift cardsgift_cardsread, write, delete
Metafields & metaobjectsmetafieldsread, write, delete
Translationstranslationsread, write, delete
Markets & shippingmarketsread, write, delete
Pages & blogscontentread, write, delete
Navigationnavigationread, write
URL redirectsredirectsread, write, delete
Filesfilesread, write, delete
Themesthemesread, 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.

ToolResourceNeedsDescription
add_discount_codesdiscountswriteAdd 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_mediaproductswriteAdd images, videos or 3D models to a product from public URLs.
add_products_to_collectioncollectionswriteAdd products to a manual collection.
assign_variant_mediaproductswriteAttach existing product media to variants (one image per variant).
cancel_orderorderswriteCancel an order, optionally restocking. This never refunds money; use create_refund for that.
complete_draft_orderdraft_orderswriteTurn a draft order into an order. Without a payment gateway the order is marked as paid.
create_articlecontentwriteCreate a blog article (hidden unless isPublished is true).
create_blogcontentwriteCreate a blog.
create_collectioncollectionswriteCreate a collection. Pass productIds for a manual collection, or sources (CollectionCreateSourceTargetInput, see get_shopify_type) for automated conditions.
create_discountdiscountswriteCreate 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_orderdraft_orderswriteCreate a draft order from variants and/or custom line items.
create_filefileswriteAdd a file to Content › Files from a public URL.
create_gift_cardgift_cardswriteIssue a gift card. The full code is returned once in the response.
create_marketmarketswriteCreate a market. conditions takes MarketConditionsInput (e.g. regionsCondition with country codes); see get_shopify_type.
create_metafield_definitionmetafieldswriteDefine a metafield (name, type, validations) so it appears in the admin and can be used in themes.
create_metaobjectmetafieldswriteCreate a metaobject entry of an existing type.
create_metaobject_definitionmetafieldswriteCreate a metaobject type with its fields.
create_pagecontentwriteCreate an online store page (hidden unless isPublished is true).
create_productproductswriteCreate a product (draft by default), optionally with options such as Size and Color. Add variants afterwards with create_product_variant.
create_product_optionproductswriteAdd options (e.g. Material) with their values to a product. Existing variants get the first value.
create_product_variantproductswriteAdd one or more variants to a product. Each variant needs a value for every product option.
create_redirectredirectswriteRedirect an old path (e.g. /products/old-name) to a new path or URL.
create_refundorderswriteRefund 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_articlecontentdeletePermanently delete a blog article.
delete_blogcontentdeleteDelete a blog and all its articles.
delete_collectioncollectionsdeleteDelete a collection. Its products are kept.
delete_discountdiscountsdeleteDelete a code discount (gid://shopify/DiscountCodeNode/…) or automatic discount (gid://shopify/DiscountAutomaticNode/…).
delete_draft_orderdraft_ordersdeleteDelete a draft order.
delete_filefilesdeletePermanently delete files. Products using them lose the media.
delete_marketmarketsdeleteDelete a market.
delete_metafieldmetafieldsdeleteDelete metafields identified by owner, namespace and key.
delete_metafield_definitionmetafieldsdeleteDelete a metafield definition. Optionally delete all metafields using it.
delete_metaobjectmetafieldsdeleteDelete a metaobject entry.
delete_pagecontentdeletePermanently delete an online store page.
delete_productproductsdeletePermanently delete a product and all its variants. This cannot be undone.
delete_product_mediaproductsdeleteDelete media from a product. The files are removed from the store.
delete_product_variantproductsdeleteDelete variants from a product.
delete_redirectredirectsdeleteDelete a URL redirect.
delete_theme_filethemesdeleteDelete a single theme file. MCPify archives it first. Deleting from the live theme needs confirmLiveTheme: true.
disable_gift_cardgift_cardsdeleteDeactivate a gift card permanently. It cannot be used or re-enabled afterwards.
disable_localestorewriteDisable a language. Its translations stay stored but are no longer shown.
enable_localestorewriteEnable a language (unpublished until you publish it with update_locale).
fulfill_orderorderswriteCreate a fulfillment for one fulfillment order (take fulfillmentOrderId from get_order; never guess between deliveries). Omit lineItems to fulfill everything remaining.
get_articlescontentreadList blog articles. Filter with query, e.g. `blog_id:123` or `tag:news`.
get_blogscontentreadList blogs with article counts.
get_collectioncollectionsreadCollection details, its sources (smart conditions) and products.
get_collectionscollectionsreadList collections with product counts.
get_customercustomersreadCustomer details. Recent orders only when the connection may read orders.
get_customerscustomersreadList customers with order counts and amount spent.
get_delivery_profilesstorereadShipping profiles (legacy model) with location groups, zones and rates. Use this when marketDrivenShipping is off; otherwise use get_market_shipping.
get_discount_code_creationdiscountsreadProgress and failures of an add_discount_codes job.
get_discountsdiscountsreadList code and automatic discounts with status, dates and codes.
get_documentationgeneralalwaysMCPify 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_orderdraft_ordersreadA draft order with line items, totals and invoice URL.
get_draft_ordersdraft_ordersreadList draft orders, newest first.
get_filesfilesreadList files from Content › Files with alt text and URLs. Useful for finding images without alt text (query `media_type:IMAGE`).
get_gift_cardgift_cardsreadA gift card with balance, note and recent transactions.
get_gift_cardsgift_cardsreadList gift cards with balance and status. Codes are masked.
get_instructionsgeneralalwaysHow to work safely with this store through MCPify. Read once at the start of a session.
get_inventoryinventoryreadQuantities (available, on hand, committed, incoming, reserved) per location for every variant of a product, or for one inventory item.
get_localesstorereadLanguages enabled in the store, which is primary and which are published.
get_locationsinventoryreadStore locations with address and whether they fulfill online orders.
get_market_shippingmarketsreadMarket-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_marketsmarketsreadMarkets with status, type, regions, currency, web presences and parent markets.
get_menusnavigationreadOnline store menus with their items (three levels).
get_metafield_definitionsmetafieldsreadMetafield definitions for an owner type, e.g. PRODUCT.
get_metafieldsmetafieldsreadRead metafields of a product, variant, collection, customer, order, draft order, page, article, blog, location, market or the shop.
get_metaobject_definitionsmetafieldsreadMetaobject definitions with their field definitions and counts.
get_metaobjectsmetafieldsreadMetaobjects of one type with their field values.
get_orderordersreadOrder 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_ordersordersreadList orders, newest first. Customer names only appear when customer data is switched on.
get_pagecontentreadA page with its full HTML body.
get_pagescontentreadList online store pages.
get_productproductsreadFull product details by ID or handle: description, SEO, options, media, variants (price, SKU, barcodes, stock), collections and metafields where permitted.
get_productsproductsreadList products with an optional Shopify search query. Returns summary fields and a cursor for paging.
get_publicationsproductsreadSales channels and catalogs (publications) products and collections can be published to.
get_redirectsredirectsreadList URL redirects. Filter with query, e.g. `path:/old*`.
get_shop_infostorereadStore name, domains, currency, timezone, units, plan and features (including marketDrivenShipping). Call this first to know which store you are working on.
get_shop_policiesstorereadRefund, privacy, shipping, terms of service and other legal policies.
get_shopify_capabilitiesgeneralalways
get_shopify_operationgeneralalways
get_shopify_typegeneralalways
get_skillgeneralalways
get_support_reporting_instructionsgeneralalwaysHow to report a bug or missing feature to MCPify support. Reading this sends nothing.
get_theme_filethemesreadThe content of one theme file.
get_theme_filesthemesreadFile names, sizes and checksums of a theme, optionally filtered by filename patterns such as `sections/*.liquid`.
get_themesthemesreadThemes of the online store with their role (MAIN = live, UNPUBLISHED, DEVELOPMENT, …).
get_translationstranslationsreadSource 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_skillsgeneralalways
publish_resourceproductswritePublish a product or collection to sales channels, or unpublish it.
register_translationstranslationswriteCreate or update translations for one resource. Each entry needs the digest of the source content from get_translations.
remove_products_from_collectioncollectionswriteRemove products from a manual collection. The products themselves are kept.
remove_translationstranslationsdeleteDelete translations of the given keys and locales for one resource.
rename_filefileswriteChange a file's filename (keeps the extension).
reorder_product_mediaproductswriteMove product media to new positions (0 = first).
search_shopify_operationsgeneralalways
set_inventoryinventorywriteSet 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_trackinginventorywriteSwitch whether Shopify tracks stock for an inventory item.
set_metafieldmetafieldswriteCreate or update up to 25 metafields on any owner in one call.
shopify_batchapi_operationswrite (Pro)
shopify_mutationapi_operationswrite (Pro)
shopify_queryapi_operationsread
submit_support_reportgeneralalwaysSend an issue report to MCPify support. Only call this after the user approved the exact report (see get_support_reporting_instructions).
update_articlecontentwriteUpdate an article's title, body, summary, tags, image or visibility.
update_blogcontentwriteRename a blog or change its handle or comment policy.
update_collectioncollectionswriteUpdate a collection's title, description, handle, sort order or SEO fields.
update_customercustomerswriteUpdate a customer's name, email, phone, note, tags or locale. Tags replace the existing tags.
update_delivery_profilestorewriteChange a shipping profile (legacy model). profile takes DeliveryProfileInput (zones, method definitions, location groups); see get_shopify_type. New location groups need locations.
update_draft_orderdraft_orderswriteUpdate a draft order. Passing lineItems replaces all line items.
update_inventory_iteminventorywriteUpdate SKU, cost, shipping requirement, country of origin or HS code of an inventory item.
update_localestorewritePublish or unpublish a store language, optionally for specific web presences.
update_locationinventorywriteRename a location, change its address or whether it fulfills online orders.
update_marketmarketswriteRename a market, change its status, conditions (conditionsToAdd / conditionsToDelete) or currency settings.
update_market_shippingmarketswriteChange 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_menunavigationwriteReplace 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_metaobjectmetafieldswriteChange field values or the handle of a metaobject.
update_metaobject_definitionmetafieldswriteRename a metaobject definition or change its fields. fieldDefinitions takes MetaobjectFieldDefinitionOperationInput entries ({ create }, { update } or { delete }); see get_shopify_type.
update_orderorderswriteChange an order's note, tags or PO number. Tags replace the existing tags.
update_pagecontentwriteUpdate a page's title, HTML body, handle or visibility.
update_productproductswriteUpdate product fields. Only the fields you pass change. Tags replace the existing tags.
update_product_media_altfileswriteSet the alt text of images and other media (product media or files). Up to 50 per call.
update_product_option_valuesproductswriteRename an option, reorder it, or add, rename and delete its values.
update_product_variantproductswriteUpdate 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_redirectredirectswriteChange a redirect's path or target.
update_shop_policystorewriteReplace the HTML body of a legal policy. Have it reviewed; this is legal text.
update_theme_filethemeswriteCreate 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_previewfileswriteReplace 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