io.github.alex-brecher/shopify-multi-store
NPM · SHOPIFY-MULTI-STORE-MCP-SERVER
Connect AI agents to multiple Shopify Admin stores for reports, comparisons, and guarded updates.
Available components
Last scanned (21 hours ago)
Scores higher than 94% of npm servers
Category E-commerce
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security100
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- No install/post-install scripts declared.Pass
- 3 of 53 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency100
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Cryptographically verified build provenance (signed, bound to alex-brecher/shopify-multi-store). View diagnostics → Pass
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 12 days ago).Pass
- Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability61
- AI-judged instruction clarity (good).Pass
- Context-footprint check failed: tool/resource definitions use about 5331 tokens (~183/item across 29 items; 29 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
- No destabilizing schema changes in the last 30 days.Pass
Tool Coverage80
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 41% of tool parameters carry a description.Partial
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 29 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 29 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 4 Nov 26 0
- Stability: 0.97 → pass security
- 3 Nov 26 0
- Stability: pass → 0.97 functional
- 31 Oct 26 0
- Security disclosure: unverified → pass ▲ functional
- 29 Oct 26 0
- Security disclosure: pass → unverified ▼ functional
- 28 Oct 26 +11
- Stability: fail → pass ▲ security
- 24 Oct 26 +15
- Malware scan: unverified → pass ▲ security
- 23 Oct 26 −15
- Malware scan: pass → unverified ▼ security
- Package version: 1.6.0 → 2.0.3 functional
- 21 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 14 to 18.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 4 Nov 2026 · Analysed npm/shopify-multi-store-mcp-server@2.0.3
Provenance Verified
A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.
| Result | Verified |
|---|---|
| Ecosystem | npm |
| Reason | Verified |
| Discovered via | Registry attestation endpoint |
| Source repo | alex-brecher/shopify-multi-store |
| Certificate issuer | https://token.actions.githubusercontent.com |
| Certificate SAN | https://github.com/alex-brecher/shopify-multi-store/.github/workflows/publish.yml@refs/tags/v2.0.3 |
| Rekor log index | 3411825223 |
| Predicate type | SLSA build provenance https://slsa.dev/provenance/v1 |
| Subject digest | sha512:313b0267e61be8cf54ebb11e066a215511a56d3c4c05ba5a1a30b1b29ca07e120a7fff4de2c75104140ee51deb90f1c129a251a370fb47d71f4f10421 |
Background: How many MCP packages publish verified provenance →
Dependencies 53 packages
| Packages resolved | 53 |
|---|---|
| Stale | 3 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
shopify_check_access ~83
For one or many stores, report the shop identity and granted Admin API access scopes, compare them against every tool's requirement (see src/scope-requirements.ts; tools with several resources or reports are listed as tool:resource), and report missing scopes and which tools would fail. Omit stores to check every configured store.
| Name | Type | Req | Description |
|---|---|---|---|
| stores | array | – | – |
No output schema declared.
No examples provided.
shopify_create_collection ~162
Create a manual collection (optional productIds) or a smart collection (ruleSet). Pass publicationIds to publish to explicitly selected channels. Defaults to dryRun:true, which previews the input without creating anything.
| Name | Type | Req | Description |
|---|---|---|---|
| descriptionHtml | string | – | – |
| dryRun | boolean | – | True (the default) returns a before/after preview without changing anything in Shopify. Pass false, after the user authorizes this store and exact change, to apply it; the tool then reads the result… |
| image | object | – | – |
| productIds | array | – | – |
| publicationIds | array | – | – |
| ruleSet | object | – | – |
| sortOrder | string | – | – |
| store | string | yes | – |
| title | string | yes | – |
No output schema declared.
No examples provided.
shopify_create_discount ~202
Create a percentage discount code with an explicit start date and customer audience. Defaults to dryRun:true, which resolves segments and previews the discount without creating it.
| Name | Type | Req | Description |
|---|---|---|---|
| appliesOncePerCustomer | boolean | – | – |
| code | string | yes | – |
| collectionId | string | – | – |
| customerEligibility | string | – | – |
| customerSegments | array | – | – |
| dryRun | boolean | – | True (the default) returns a before/after preview without changing anything in Shopify. Pass false, after the user authorizes this store and exact change, to apply it; the tool then reads the result… |
| endsAt | string | – | – |
| minimumPurchaseAmount | number | – | – |
| minimumQuantity | integer | – | – |
| percentage | number | yes | – |
| productIds | array | – | – |
| startsAt | string | yes | – |
| store | string | yes | – |
| title | string | yes | – |
| usageLimit | integer | – | – |
No output schema declared.
No examples provided.
shopify_create_fulfillment ~169
Fulfill the remaining quantities of an order's OPEN and IN_PROGRESS fulfillment orders with optional tracking. notifyCustomer defaults to false. Requires read_merchant_managed_fulfillment_orders and write_merchant_managed_fulfillment_orders (Shopify reports any other missing scope, such as for fulfillment orders assigned to a fulfillment service). Defaults to dryRun:true.
| Name | Type | Req | Description |
|---|---|---|---|
| dryRun | boolean | – | True (the default) returns a before/after preview without changing anything in Shopify. Pass false to apply the change; the tool then reads the result back. |
| notifyCustomer | boolean | – | – |
| orderId | string | yes | – |
| store | string | yes | – |
| trackingCompany | string | – | – |
| trackingNumber | string | – | – |
| trackingUrl | string | – | – |
No output schema declared.
No examples provided.
shopify_create_product ~185
Create a product with options, variants and images, and optionally add it to a manual collection. Defaults to status DRAFT and to dryRun:true, which previews the input without creating anything.
| Name | Type | Req | Description |
|---|---|---|---|
| collectionId | string | – | – |
| descriptionHtml | string | – | – |
| dryRun | boolean | – | True (the default) returns a before/after preview without changing anything in Shopify. Pass false, after the user authorizes this store and exact change, to apply it; the tool then reads the result… |
| images | array | – | – |
| options | array | – | – |
| price | string | – | – |
| productType | string | – | – |
| status | string | – | – |
| store | string | yes | – |
| tags | array | – | – |
| title | string | yes | – |
| variants | array | – | – |
| vendor | string | – | – |
No output schema declared.
No examples provided.
shopify_describe_action Describe a Shopify Admin Action ~158
Full signature of one Admin API mutation: arguments with types, the expanded input object fields (required markers, enum values, descriptions), the payload fields, a ready-to-edit GraphQL document with a default selection, a variables template with the required fields, a scope hint, and whether it is destructive (then shopify_run_action needs confirm set to the mutation name).
| Name | Type | Req | Description |
|---|---|---|---|
| apiVersion | string | – | Admin API version, such as 2026-07. Defaults to the store's version, or the server default. |
| depth | integer | – | How many levels of nested input objects to expand |
| mutation | string | yes | Mutation name, such as orderCancel |
| store | string | – | Use this store's API version. |
No output schema declared.
No examples provided.
shopify_find_actions Find Shopify Admin Actions ~181
Search every Shopify Admin API mutation (hundreds of write actions, most without a dedicated tool) by keyword and optional category. Returns each action's name, one-line description, category, whether it is destructive, which dedicated tools already cover it, and a scope hint. Next: shopify_describe_action for the full signature, then shopify_run_action.
| Name | Type | Req | Description |
|---|---|---|---|
| apiVersion | string | – | Admin API version, such as 2026-07. Defaults to the store's version, or the server default. |
| category | string | – | – |
| includeDeprecated | boolean | – | – |
| limit | integer | – | – |
| offset | integer | – | – |
| query | string | – | Keywords, such as "cancel order" or "gift card". Omit to list a category. |
| store | string | – | Use this store's API version. |
No output schema declared.
No examples provided.
shopify_get Get a Shopify Record ~331
Read one record by GID from one store. Follow each returned cursor independently. Resources: - product: Product details, variants (first/after) and media (mediaAfter). id: Product GID. - collection: Collection details, rules and a page of products. id: Collection GID. - order: Order, shipping, fulfillment, tracking and a page of line items. id: Order GID. - inventory: Inventory by product (id: Product GID) or inventory item (id: InventoryItem GID, pages through locations). - metafields: Metafields of any owner (id: owner GID); optional namespace and key. - theme_files: Theme file contents. id: OnlineStoreTheme GID; optional filenames, else pages through every file. - blog_articles: A blog's articles. id: Blog GID. - uploaded_image: Image processing status and CDN URL. id: MediaImage GID. - bulk_operation: A bulk operation's status and result URLs. id: BulkOperation GID. Partial exports stay marked incomplete.
| Name | Type | Req | Description |
|---|---|---|---|
| after | string | – | – |
| filenames | array | – | theme_files: only these files. |
| first | integer | – | – |
| id | string | yes | The record's GID, such as gid://shopify/Product/123. |
| key | string | – | metafields: only this key. |
| mediaAfter | string | – | product: cursor for the media page. |
| namespace | string | – | metafields: only this namespace. |
| resource | string | yes | – |
| store | string | yes | – |
No output schema declared.
No examples provided.
shopify_get_shop_info Get Shopify Store Information ~59
Get identity and account information from one named Shopify Admin store. Use this tool before a sensitive change to make sure that the selected store is correct.
| Name | Type | Req | Description |
|---|---|---|---|
| store | string | yes | Configured store alias, such as main-store or wholesale-store |
No output schema declared.
No examples provided.
shopify_graphql_mutation Change a Shopify Store ~220
Run one GraphQL Admin API mutation against one named store. Set confirm to true only after the user authorizes the exact store and change. Destructive mutations (see shopify_describe_action; some are destructive only with certain arguments, such as a product status of ARCHIVED or notifyCustomer true) need confirm set to the mutation name instead, and denylisted mutations are refused, exactly as in shopify_run_action. The result reports each top-level mutation field as applied, rejected, or unknown, and the store as applied, rejected, partial, or unknown; after partial or unknown, retry only the rejected fields in a new document.
| Name | Type | Req | Description |
|---|---|---|---|
| confirm | – | yes | True after the user authorizes the exact change and store. Destructive mutations need the mutation name instead (several: comma-separated, in document order). |
| mutation | string | yes | A GraphQL mutation document. |
| store | string | yes | Configured store alias, such as main-store or wholesale-store |
| variables | object | – | GraphQL variables as a JSON object |
No output schema declared.
No examples provided.
shopify_graphql_query Query a Shopify Store ~84
Run one read-only GraphQL Admin API query against one named store. Use cursor pagination and request only necessary fields.
| Name | Type | Req | Description |
|---|---|---|---|
| query | string | yes | A GraphQL query document. Mutations are rejected. |
| store | string | yes | Configured store alias, such as main-store or wholesale-store |
| variables | object | – | GraphQL variables as a JSON object |
No output schema declared.
No examples provided.
shopify_graphql_query_many Query Multiple Shopify Stores ~86
Run the same read-only GraphQL Admin API query across multiple named stores in parallel. Each store returns its own success or error result.
| Name | Type | Req | Description |
|---|---|---|---|
| query | string | yes | A read-only GraphQL query document. Mutations are rejected. |
| stores | array | yes | One to one hundred configured store aliases |
| variables | object | – | GraphQL variables as a JSON object |
No output schema declared.
No examples provided.
shopify_graphql_schema ~39
Explore the Admin GraphQL schema for this store's API version.
| Name | Type | Req | Description |
|---|---|---|---|
| store | string | yes | – |
| type_name | string | yes | – |
No output schema declared.
No examples provided.
shopify_list_stores List Shopify Stores ~63
List every Shopify Admin store that remains connected to this plugin. On a hosted server in per-user mode, lists only the stores you have connected with your own Shopify account and names the others with a link to connect them. This tool does not expose access tokens.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
shopify_metafields ~117
Set (metafieldsSet) and/or delete (metafieldsDelete) up to 25 metafields each, for any owner GID. Read them with shopify_get resource metafields. Defaults to dryRun:true.
| Name | Type | Req | Description |
|---|---|---|---|
| delete | array | – | – |
| dryRun | boolean | – | True (the default) returns a before/after preview without changing anything in Shopify. Pass false to apply the change; the tool then reads the result back. |
| set | array | – | – |
| store | string | yes | – |
No output schema declared.
No examples provided.
shopify_redirects ~126
Create and/or delete up to 100 URL redirects each, with a per-redirect outcome (applied, rejected or unknown) and a store status. List them with shopify_search resource redirects. Requires write_online_store_navigation. Defaults to dryRun:true.
| Name | Type | Req | Description |
|---|---|---|---|
| create | array | – | – |
| delete | array | – | Redirect IDs to delete. |
| dryRun | boolean | – | True (the default) returns a before/after preview without changing anything in Shopify. Pass false to apply the change; the tool then reads the result back. |
| store | string | yes | – |
No output schema declared.
No examples provided.
shopify_report Run a Shopify Report ~690
Run one read-only report across selected stores; each store returns its own result and completeness indicators. Reports: - portfolio_snapshot: Shop identity and product, order, customer and location counts. stores optional (all stores). - store_locations: Active, inactive, legacy, fulfillment, inventory and address status of locations. stores optional (all stores). - compare_inventory: Inventory, price, status and catalog details for exact SKUs. Needs skus (1-50). - compare_prices: Price and compare-at price for exact SKUs, with mismatches and missing variants. Needs skus (1-50). - get_product_everywhere: One exact SKU or handle across stores. Needs identifier and matchBy (sku or handle). - compare_catalog: Titles, status, vendor, type and inventory for exact product handles. Needs handles (1-50). - compare_collections: Titles, sort order, product counts, SEO and images for exact collection handles. Needs handles (1-50). - catalog_gap_report: Products missing or with different status across stores. first: products scanned per store (default 250). - catalog_health: Missing vendor, type, SEO, media, alt text, and active products without inventory. first (default 100). - duplicate_sku_report: SKUs repeated inside a store and shared across stores. first: variants scanned per store (default 250). - low_stock_report: Active variants at or below threshold (default 10), separating low, zero and negative. - recent_product_changes: Products updated in the last days (default 7). first (default 100). - list_unfulfilled_orders: Recent open unfulfilled orders. days (default 7), first (default 25). - fulfillment_sla_report: Open unfulfilled orders by age bucket and SLA breaches. lookbackDays (default 90), slaDays (default 2), first (default 100). - order_summary: Order values, discounts, shipping, tax, cancellations and statuses; currencies separate. days (default 30), first (default 100). - customer_growth: New customers in the current and previous period of days (default 30). -…
| Name | Type | Req | Description |
|---|---|---|---|
| days | integer | – | Lookback or period length in days. |
| first | integer | – | Rows per store; each report has its own default and maximum. |
| handles | array | – | compare_catalog, compare_collections: exact handles. |
| identifier | string | – | get_product_everywhere: the exact SKU or product handle. |
| lookbackDays | integer | – | fulfillment_sla_report: how far back to look. |
| matchBy | string | – | get_product_everywhere: whether identifier is a SKU or a handle. |
| query | string | – | analytics: a ShopifyQL query. |
| report | string | yes | Which report to run. See the tool description for each report's inputs. |
| skus | array | – | compare_inventory, compare_prices: exact SKUs. |
| slaDays | integer | – | fulfillment_sla_report: age after which the SLA is breached. |
| stores | array | – | Store aliases. Optional only for portfolio_snapshot and store_locations (then every store). |
| threshold | integer | – | low_stock_report: maximum aggregate quantity to include. |
No output schema declared.
No examples provided.
shopify_run_action Run a Shopify Admin Action ~405
Run any Shopify Admin API mutation on one to one hundred stores. Give a mutation name (a default document is built) or a full single-mutation document, plus variables shared by every store and/or variablesByStore (IDs differ per store). dryRun (the default) validates the document and variables against each store's API version and looks up every record ID in the variables and the document; nothing is changed. The preview says whether it is complete: targets chosen by a search, saved search, filter, or "all" flag, more than 250 IDs, or IDs that do not resolve make it incomplete, and then applying also needs acknowledgeIncompletePreview: true. dryRun false applies it; every ID is looked up again first, and IDs that do not resolve refuse the apply unless acknowledgeIncompletePreview is true. Destructive actions (delete, cancel, refund and similar) need confirm set to the mutation name. Mutations are never retried automatically. On a hosted server in per-user mode, Shopify limits this to what your own staff account may do.
| Name | Type | Req | Description |
|---|---|---|---|
| acknowledgeIncompletePreview | boolean | – | Required, with dryRun false, when the targets cannot all be listed in advance (search, saved search, filter, or "all" style arguments, or more than 250 IDs) or when a named ID does not resolve at app… |
| confirm | string | – | For destructive actions: the mutation name (several destructive mutations: comma-separated, in document order). |
| document | string | – | A full GraphQL document with exactly one mutation operation. |
| dryRun | boolean | – | – |
| mutation | string | – | Mutation name. Required unless document is given; if both are given, the document must call it. |
| stores | array | yes | – |
| variables | object | – | Variables used for every store. |
| variablesByStore | object | – | Per-store variables by alias, merged over variables. |
No output schema declared.
No examples provided.
shopify_search Search a Shopify Resource ~276
List or search one kind of record with cursor pagination, on one store (store) or several in parallel (stores; each store returns its own result and cursor). Resources: - products: Products (query: Shopify product search syntax). - collections: Manual and smart collections. - orders: Orders, newest first (query: Shopify order search syntax). - customers: Customers. Protected customer data permissions apply. - publications: Sales channel publication IDs (no query; 100 per page). - redirects: URL redirects. - pages: Online Store pages. - files: Files (images, videos, generic files). - metaobjects: Metaobjects of one type (type required). - markets: Markets (no query). - themes: Themes with their role; MAIN is live (no query). - delivery_profiles: Delivery profiles with zones, methods and flat rates (no query).
| Name | Type | Req | Description |
|---|---|---|---|
| after | string | – | Cursor from pageInfo.endCursor (single store only). |
| first | integer | – | – |
| query | string | – | Shopify search syntax for the resource, where it takes one. |
| resource | string | yes | – |
| store | string | – | One store alias. Give store or stores. |
| stores | array | – | Several store aliases, searched in parallel. |
| type | string | – | metaobjects: the metaobject type. |
No output schema declared.
No examples provided.
shopify_search_docs_chunks ~49
Search Shopify documentation and return source links. No store credentials are sent.
| Name | Type | Req | Description |
|---|---|---|---|
| api_name | string | – | – |
| max_num_results | integer | – | – |
| prompt | string | yes | – |
No output schema declared.
No examples provided.
shopify_set_inventory ~161
Set available inventory at one location using compare-and-set protection: compareQuantity must equal the current available quantity. Read inventory first (shopify_get resource inventory). dryRun:true (the default) checks and previews without changing anything.
| Name | Type | Req | Description |
|---|---|---|---|
| compareQuantity | integer | yes | – |
| dryRun | boolean | – | True (the default) returns a before/after preview without changing anything in Shopify. Pass false, after the user authorizes this store and exact change, to apply it; the tool then reads the result… |
| idempotencyKey | string | – | – |
| inventoryItemId | string | yes | – |
| locationId | string | yes | – |
| quantity | integer | yes | – |
| reason | string | – | – |
| store | string | yes | – |
No output schema declared.
No examples provided.
shopify_tags ~108
Add and/or remove tags on a product, order, customer or draft order by GID (tagsAdd/tagsRemove). Defaults to dryRun:true.
| Name | Type | Req | Description |
|---|---|---|---|
| add | array | – | – |
| dryRun | boolean | – | True (the default) returns a before/after preview without changing anything in Shopify. Pass false to apply the change; the tool then reads the result back. |
| ownerId | string | yes | – |
| remove | array | – | – |
| store | string | yes | – |
No output schema declared.
No examples provided.
shopify_update_collection ~184
Update collection fields, rules or image, and add products to a manual collection (addProductIds). dryRun:true (the default) returns the current collection and the change without applying it; dryRun:false applies it and returns before and after.
| Name | Type | Req | Description |
|---|---|---|---|
| addProductIds | array | – | Products to add to a manual collection. Smart collection membership follows its rules. |
| descriptionHtml | string | – | – |
| dryRun | boolean | – | True (the default) returns a before/after preview without changing anything in Shopify. Pass false, after the user authorizes this store and exact change, to apply it; the tool then reads the result… |
| id | string | yes | – |
| image | object | – | – |
| ruleSet | object | – | – |
| sortOrder | string | – | – |
| store | string | yes | – |
| title | string | – | – |
No output schema declared.
No examples provided.
shopify_update_customer ~216
Update customer note, email and tags (customerUpdate). dryRun:true (the default) returns the current customer and the change without applying it; dryRun:false applies it and returns before and after. Tags: addTags and removeTags change only the named tags; replaceTags replaces all tags. Email marketing consent is out of scope. Requires write_customers.
| Name | Type | Req | Description |
|---|---|---|---|
| addTags | array | – | Tags to add (tagsAdd). Other tags are kept. |
| dryRun | boolean | – | True (the default) returns a before/after preview without changing anything in Shopify. Pass false to apply the change; the tool then reads the result back. |
| string | – | – | |
| id | string | yes | – |
| note | string | – | – |
| removeTags | array | – | Tags to remove (tagsRemove). Other tags are kept. |
| replaceTags | array | – | Replaces all tags: every current tag not in this list is removed. Prefer addTags or removeTags. |
| store | string | yes | – |
No output schema declared.
No examples provided.
shopify_update_order ~216
Update order note, email, shipping address and tags (orderUpdate). dryRun:true (the default) returns the current order and the change without applying it; dryRun:false applies it and returns before and after. Tags: addTags and removeTags change only the named tags; replaceTags replaces all tags. Requires write_orders.
| Name | Type | Req | Description |
|---|---|---|---|
| addTags | array | – | Tags to add (tagsAdd). Other tags are kept. |
| dryRun | boolean | – | True (the default) returns a before/after preview without changing anything in Shopify. Pass false to apply the change; the tool then reads the result back. |
| string | – | – | |
| id | string | yes | – |
| note | – | – | – |
| removeTags | array | – | Tags to remove (tagsRemove). Other tags are kept. |
| replaceTags | array | – | Replaces all tags: every current tag not in this list is removed. Prefer addTags or removeTags. |
| shippingAddress | object | – | – |
| store | string | yes | – |
No output schema declared.
No examples provided.
shopify_update_prices ~298
Set price, compareAtPrice and/or unit cost for up to 250 SKUs on one store (store) or the same list on several stores in parallel (stores). Resolves each SKU to the variants whose SKU matches exactly (Shopify search is a prefix match) and groups writes by product. A SKU shared by several variants is skipped unless allowDuplicates:true. Duplicate SKU rows with conflicting values are rejected before any write; identical duplicates are collapsed. After a write, verifies each variant with a separate read-back query and reports per-item outcome (applied, applied_unverified, rejected, not_found, ambiguous, unknown, skipped, mismatch) and a store status (ok, unverified, partial, failed, unknown). Large results are trimmed, never dropped: status, counts and every item that did not apply are always returned. Defaults to dryRun:true.
| Name | Type | Req | Description |
|---|---|---|---|
| allowDuplicates | boolean | – | When a SKU exactly matches more than one variant it is reported in ambiguousSkus and skipped. Pass true to update every exact match instead. |
| dryRun | boolean | – | True (the default) returns a before/after preview without changing anything in Shopify. Pass false to apply the change; the tool then reads the result back. |
| skus | array | yes | – |
| store | string | – | One store alias. Give store or stores. |
| stores | array | – | Several store aliases; each store gets its own outcome. |
No output schema declared.
No examples provided.
shopify_update_product ~275
Update product fields, variants, media and tags. dryRun:true (the default) returns the current product and the change without applying it; dryRun:false applies it and returns before and after. Tags: addTags and removeTags change only the named tags; replaceTags replaces all tags. A status of ARCHIVED or DRAFT takes the product off every sales channel.
| Name | Type | Req | Description |
|---|---|---|---|
| addTags | array | – | Tags to add (tagsAdd). Other tags are kept. |
| descriptionHtml | string | – | – |
| dryRun | boolean | – | True (the default) returns a before/after preview without changing anything in Shopify. Pass false, after the user authorizes this store and exact change, to apply it; the tool then reads the result… |
| id | string | yes | – |
| images | array | – | – |
| productType | string | – | – |
| removeMediaIds | array | – | – |
| removeTags | array | – | Tags to remove (tagsRemove). Other tags are kept. |
| replaceTags | array | – | Replaces all tags: every current tag not in this list is removed. Prefer addTags or removeTags. |
| status | string | – | – |
| store | string | yes | – |
| title | string | – | – |
| variants | array | – | – |
| vendor | string | – | – |
No output schema declared.
No examples provided.
shopify_upload_image ~145
Upload a local image file or an HTTPS image to Shopify Files, wait for processing, and return its CDN URL (check it later with shopify_get resource uploaded_image). Defaults to dryRun:true, which previews the upload without sending anything.
| Name | Type | Req | Description |
|---|---|---|---|
| alt | string | – | – |
| dryRun | boolean | – | True (the default) returns a before/after preview without changing anything in Shopify. Pass false, after the user authorizes this store and exact change, to apply it; the tool then reads the result… |
| filename | string | – | – |
| imageFile | string | – | – |
| sourceUrl | string | – | – |
| store | string | yes | – |
No output schema declared.
No examples provided.
shopify_validate_graphql_codeblocks ~43
Validate Admin GraphQL operations against this store's API version without executing them.
| Name | Type | Req | Description |
|---|---|---|---|
| codeblocks | array | yes | – |
| store | string | yes | – |
No output schema declared.
No examples provided.
How do I install the io.github.alex-brecher/shopify-multi-store MCP server?
io.github.alex-brecher/shopify-multi-store runs locally as an npm package, launched with npx -y shopify-multi-store-mcp-server. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
npm · shopify-multi-store-mcp-server
claude mcp add alex-brecher-shopify-multi-store -- npx -y shopify-multi-store-mcp-server
What is the io.github.alex-brecher/shopify-multi-store MCP server?
io.github.alex-brecher/shopify-multi-store is an MCP server listed in the public MCP registry as io.github.alex-brecher/shopify-multi-store. Connect AI agents to multiple Shopify Admin stores for reports, comparisons, and guarded updates. This page covers its npm package (shopify-multi-store-mcp-server).
Is the io.github.alex-brecher/shopify-multi-store MCP server safe to use?
io.github.alex-brecher/shopify-multi-store scores 91 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 4 November 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the io.github.alex-brecher/shopify-multi-store MCP server expose?
io.github.alex-brecher/shopify-multi-store exposes 29 tools: shopify_graphql_schema, shopify_validate_graphql_codeblocks, shopify_create_product, shopify_update_product, shopify_create_collection, and 24 more. Their descriptions and schemas cost roughly 5,331 tokens of context every time the server is loaded.
Is the io.github.alex-brecher/shopify-multi-store MCP server still maintained?
io.github.alex-brecher/shopify-multi-store is still listed as active in the MCP registry. We last reached this channel on 4 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the io.github.alex-brecher/shopify-multi-store MCP server under?
io.github.alex-brecher/shopify-multi-store declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.