Open-source B2B and marketplace ecommerce; new stores include an MCP server for AI agents.
shopify-operations-mcp
Überblick
Beschreibung vom Entwickler (englisches Original)
Safe-write Shopify operations: plan-before-execute writes with out-of-band approval and audit.
Die drei Säulen von PopNx MCP
Diese drei werden nie zu einer Punktzahl zusammengefasst: Meinungen, Messungen und Beliebtheit sind verschiedene Dinge.
- Stimmen der NutzeriNoch keine BewertungenBewertungen starten in einem späteren Schritt zusammen mit Benutzerkonten
- Unsere Basischecksi1 von 1 bestandenAnhand öffentlicher Informationen geprüft; Code noch nicht gescannt
- NutzungiNoch nicht gemessen★ –
Was du damit machen kannst
Für diesen Server haben wir noch keine Zusammenfassung in einfacher Sprache geschrieben. Unten stehen die Fakten, die wir aus der Registry gelesen haben.
- Verbindung: Läuft auf deinem Computer
- Transport: stdio
- Kategorie: Onlineshops & Zahlungen
- Das musst du eintragen: SHOPIFY_STORE_DOMAIN, SHOPIFY_ADMIN_TOKEN
Installation
Wähle die KI-App, die du nutzt, und kopiere die Einstellungen.
Bevor du installierst
- Basischecks: 1 von 1 bestanden
- Läuft auf deinem Computer mit den Rechten deines Benutzerkontos (Dateien, Netzwerk, Apps).
- Das trägst du selbst ein:
SHOPIFY_STORE_DOMAIN,SHOPIFY_ADMIN_TOKEN,SHOPIFY_CONFIG,SHOPIFY_PLAN_TTL_MS,SHOPIFY_APPROVAL_SERVER_PORT,SHOPIFY_PROTECTED_TAGS,SHOPIFY_CALLER_ID,SHOPIFY_AUDIT_PATH
Als geheim markierte Werte sind Schlüssel zu deinem Konto. Gib sie nie weiter und füge sie nie in einen Chat ein.
Du brauchst
- npmNode.js installiert (für den Befehl npx)
Welche App nutzt du?
Wähle oben deine App. Wir merken sie uns, damit der Button beim nächsten Mal „In … installieren“ anzeigt.
Öffne Claude Desktop → Settings → Developer → Edit Config und füge dies in claude_desktop_config.json ein
{
"mcpServers": {
"shopify-operations": {
"command": "npx",
"args": [
"-y",
"shopify-operations-mcp"
],
"env": {
"SHOPIFY_STORE_DOMAIN": "your-value",
"SHOPIFY_ADMIN_TOKEN": "your-value",
"SHOPIFY_CONFIG": "your-value",
"SHOPIFY_PLAN_TTL_MS": "your-value",
"SHOPIFY_APPROVAL_SERVER_PORT": "your-value",
"SHOPIFY_PROTECTED_TAGS": "your-value",
"SHOPIFY_CALLER_ID": "your-value",
"SHOPIFY_AUDIT_PATH": "your-value"
}
}
}
}Führe das in deinem Terminal aus
claude mcp add shopify-operations --env SHOPIFY_STORE_DOMAIN=your-value --env SHOPIFY_ADMIN_TOKEN=your-value --env SHOPIFY_CONFIG=your-value --env SHOPIFY_PLAN_TTL_MS=your-value --env SHOPIFY_APPROVAL_SERVER_PORT=your-value --env SHOPIFY_PROTECTED_TAGS=your-value --env SHOPIFY_CALLER_ID=your-value --env SHOPIFY_AUDIT_PATH=your-value -- npx -y shopify-operations-mcpTrag die leeren Werte ein, bevor du ihn startest.
Oder kopier die Einstellungen selbst
In .cursor/mcp.json in deinem Projekt oder in ~/.cursor/mcp.json einfügen
{
"mcpServers": {
"shopify-operations": {
"command": "npx",
"args": [
"-y",
"shopify-operations-mcp"
],
"env": {
"SHOPIFY_STORE_DOMAIN": "your-value",
"SHOPIFY_ADMIN_TOKEN": "your-value",
"SHOPIFY_CONFIG": "your-value",
"SHOPIFY_PLAN_TTL_MS": "your-value",
"SHOPIFY_APPROVAL_SERVER_PORT": "your-value",
"SHOPIFY_PROTECTED_TAGS": "your-value",
"SHOPIFY_CALLER_ID": "your-value",
"SHOPIFY_AUDIT_PATH": "your-value"
}
}
}
}Dein Browser fragt, ob er die App öffnen darf, dann zeigt die App die Einstellungen und bittet dich um Bestätigung. Schlüsselwerte bleiben leer, damit du sie selbst einträgst.
Oder kopier die Einstellungen selbst
In .vscode/mcp.json in deinem Projekt einfügen
{
"servers": {
"shopify-operations": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"shopify-operations-mcp"
],
"env": {
"SHOPIFY_STORE_DOMAIN": "your-value",
"SHOPIFY_ADMIN_TOKEN": "your-value",
"SHOPIFY_CONFIG": "your-value",
"SHOPIFY_PLAN_TTL_MS": "your-value",
"SHOPIFY_APPROVAL_SERVER_PORT": "your-value",
"SHOPIFY_PROTECTED_TAGS": "your-value",
"SHOPIFY_CALLER_ID": "your-value",
"SHOPIFY_AUDIT_PATH": "your-value"
}
}
}
}Dein Browser fragt, ob er die App öffnen darf, dann zeigt die App die Einstellungen und bittet dich um Bestätigung. Schlüsselwerte bleiben leer, damit du sie selbst einträgst.
Dieser Server läuft auf deinem Computer, und ChatGPT kann sich nur mit Servern im Internet verbinden. Wähle eine andere App.
Deine Auswahl bleibt in einem Cookie auf diesem Gerät; kein Konto nötig.
Werte, die du selbst einträgst
- The myshopify.com store domain, e.g. my-store.myshopify.com. Overrides shopify.storeDomain from the config file.
- Shopify Admin API access token. Required and only ever read from the environment — never from the config file.
SHOPIFY_CONFIGenvPath to a config.json with shopify/plans/approvalServer/protectedTags settings. Defaults to ./config.json in the working directory.SHOPIFY_PLAN_TTL_MSenvHow long a plan token stays valid before it must be executed or expires, in milliseconds. Default 60000.SHOPIFY_APPROVAL_SERVER_PORTenvPort the localhost human-approval HTTP server binds to (127.0.0.1 only). Default 4319.SHOPIFY_PROTECTED_TAGSenvComma-separated tags that plans may never modify; any plan touching an item carrying one is refused. Default do-not-touch.SHOPIFY_CALLER_IDenvIdentity recorded as the caller on every audit log row. Default unknown.SHOPIFY_AUDIT_PATHenvFile path for the tamper-evident JSONL audit log. Default shopify-operations-audit.jsonl in the working directory.
Diese Einstellungen werden aus dem Registry-Eintrag des Entwicklers erzeugt. Wenn in der README etwas anderes steht, folge der README.
Was er kann
Läuft auf deinem Computer; die Tool-Liste erscheint nach der Installation in deiner KI-App.
Basischecksi
Wir prüfen Informationen, die jeder sehen kann; den Code haben wir nicht gelesen. Checks, die nicht zutreffen, werden nicht mitgezählt. · Geprüft am 7. Nov. 2026
- ✓ Bestanden
Entwickler passt zum Repo
Der Registry-Name wurde mit dem GitHub-Konto jpka bestätigt, dem das Repo gehört
- … Noch nicht geprüft
Wird noch gepflegt
Dieses Repo haben wir noch nicht von GitHub gelesen
- … Noch nicht geprüft
Hat eine Lizenz
Dieses Repo haben wir noch nicht von GitHub gelesen
- – Nicht zutreffend
Endpunkt antwortet
Dieser Server läuft auf deinem Computer; es gibt keinen Endpunkt im Internet
- – Nicht zutreffend
Anmeldung mit OAuth
Läuft auf deinem Computer und nutzt stattdessen lokale Einstellungen
- … Noch nicht geprüft
Keine versteckten Anweisungen in Tool-Beschreibungen
Läuft auf deinem Computer; Tool-Listen können wir nur von Endpunkten im Internet lesen
Im Vergleich mit anderen in Onlineshops & Zahlungeni
- Mehr Sterne als 0 % der anderen 1753 Server in dieser Kategorie
- Neuer in der Registry veröffentlicht als 28 % der anderen 1753 Server in dieser Kategorie
- Basischecks gleich gut wie oder besser als bei 100 % der anderen 1753 Server in dieser Kategorie
Verglichen mit allen aktiven Servern dieser Kategorie in der Registry. Sterne zählen nur, wenn dem Herausgeber das Repo gehört.
Häufige Fragen
Ist shopify-operations-mcp sicher?
Er hat 1 von 1 zutreffenden Basischecks bestanden. Den Code haben wir nicht gelesen. Bevor du einen Schlüssel oder Token hinzufügst, sieh nach, welche Zugriffe der Server verlangt, und nutze einen Schlüssel, der nur die Berechtigungen hat, die du brauchst.
Welche Schlüssel oder Codes braucht er?
Das musst du eintragen: SHOPIFY_STORE_DOMAIN, SHOPIFY_ADMIN_TOKEN
Läuft er auf meinem Computer oder in der Cloud?
Er läuft auf deinem Computer. Deine KI-App startet ihn bei Bedarf, und die Daten laufen nicht über die Server des Entwicklers (außer der Server ruft selbst einen Onlinedienst auf).
Wird er noch gepflegt?
Das GitHub-Repo wurde zuletzt – geändert, und die neueste Version (0.1.2) kam vor 3 Monaten in die Registry.
Welche Apps können ihn nutzen?
Apps, die MCP unterstützen, etwa Claude Desktop, Claude Code, Cursor und VS Code. Außerdem brauchst du Node.js auf deinem Computer.
Was kann ich stattdessen nutzen?
In derselben Kategorie: Spree Commerce: open-source B2B and marketplace ecommerce, Stripe MCP, MCP Cn Commerce
Alternativen
Server derselben Kategorie von anderen Entwicklern, sortiert nach Sternen.
So liest du eine Karte:★ GitHub-SterneiDrei Säulen: Bewertungen · Checks · NutzungiAktualisiert = neueste Version in der Registry veröffentlichti
Stripe MCP
MCP server integrating with Stripe - tools for customers, products, payments, and more.
MCP Cn Commerce
8 read-only MCP platform entries; support is operation-specific; merchant live acceptance pending
README vom Entwickler
README öffnen
Unverändert aus dem Repo des Entwicklers übernommen. PopNx MCP hat den Inhalt weder geprüft noch empfiehlt es ihn. HTML, Bilder und Skripte wurden entfernt. Links führen von dieser Website weg.
Safe-write MCP server for Shopify Admin API operations
An agent can read and modify a Shopify store without being able to cause an unrecoverable accident. The safety layer is the differentiator: every write previews before it commits, large or irreversible changes require out-of-band human approval, and every action is recorded to a tamper-evident hash-chained audit file.
Architecture
flowchart TB
subgraph agent["Agent"] A[Claude] end
subgraph mcp["MCP stdio transport"] T[tools/call] end
subgraph core["safe-write-mcp-core"] PS[PlanStore] AS[ApprovalServer] end
subgraph shopify["Shopify Admin API"] GQL[GraphQL endpoint /admin/api/2026-04/graphql.json] end
subgraph audit["Audit"] LF[JSONL audit file hash-chained] end
A -->|"MCP stdio"| T T -->|create plan| PS T -->|preview| PS T -->|execute plan| PS PS -->|awaiting_approval| AS AS -->|approve/reject| PS PS -->|execute| GQL PS -->|record| LF
style PS fill:#e1f5fe style AS fill:#fff3e0 style LF fill:#f3e5f5 style GQL fill:#e8f5e9
The two-phase pattern (preview → token → execute) is the core discipline. Every write tool:
- Preview — reads current state and computes what would change, performing zero mutation calls
- Token — issues a plan token bound to the exact previewed manifest via a SHA-256 fingerprint
- Approval — plans exceeding
approvalRequiredAboveItems(default 25) or containing always-gated operations wait for human approval at the token-bearing URL the server prints on startup (e.g.http://127.0.0.1:4319/?token=) - Execute — re-reads current values, refuses if they drifted from the preview (
STATE_CHANGED), then applies mutations per-item with a full success/failure ledger
A plan whose manifest exceeds hardMaxItems (default 250) is refused outright — no token, no approval path.
Irreversible operations (cancel_order, refund_order) always require approval regardless of item count and cannot be rolled back. Reversible operations (price changes, inventory adjustments) support rollback within a configurable window (default 24 hours).
Threat model
The risk is not a malicious agent — the agent is trusted to author correct GraphQL. The risk is a trusted-but-fallible agent: syntactically perfect, well-formed operations whose *scope* is the problem.
The killer scenario — a syntactically perfect bulk reprice with a misplaced decimal:
update_prices([...], newPrice: 1.5) ← meant 15.00, typed 1.5
A 500-product bulk update that runs without preview-and-approve, or where the agent's price calculation contains a typo, produces exactly the wrong result at scale. Approval would catch it: a human sees "change 500 prices from $X to $1.50" and flags the不对劲. Without approval, or without the preview that makes the damage visible *before* it happens, the error lands silently in Shopify.
Three mechanisms carry the safety guarantee:
1. Preview-first, computed-diff. Every write tool reads current state and computes the manifest ({ref, before, after} pairs) without calling any mutation. A STATE_CHANGED re-read at execute time refuses the write if the world moved since preview. The blast radius is visible *before* anything changes.
2. Approval gating above the threshold. Plans touching >= approvalRequiredAboveItems items (default 25) require human approval. The threshold is sized for "is this large enough to warrant a human eye?" — meaningful for bulk value changes; irrelevant for one-item operations (which get unconditional approval for irreversible ops instead).
3. Plan token bound to exact manifest. The token is a SHA-256 fingerprint of the exact previewed manifest — not an opaque ID. Swapping in a wider set of items or a different price at execute time produces a different fingerprint and is refused as STATEMENT_MISMATCH.
Rollback provides recovery for reversible mistakes (wrong price, wrong inventory level) within the rollback window. It does *not* recover from the irreversible operations: a cancelled order stays cancelled, a refunded payment stays refunded.
Quick start
npm install
npm test npm run build
Set the required environment variable and point Claude Desktop at the server (see Configuration below). node dist/index.js starts the localhost approval UI alongside the MCP stdio server.
Demo: the step-by-step walkthrough script (store-wide reprice refused → approval-gated reprice → one-call rollback → hash-chained audit) is in docs/demo-runbook.md.
Configuration
Configuration file (default config.json in the working directory, or path via SHOPIFY_CONFIG):
{
"shopify": { "storeDomain": "my-store.myshopify.com", "apiVersion": "2026-04" }, "plans": { "planTtlMs": 60000, "approvalRequiredAboveItems": 25, "hardMaxItems": 250, "maxPriceChangePct": 30, "rollbackTtlMs": 86400000 }, "approvalServer": { "enabled": true, "port": 4319, "requireAuth": true }, "protectedTags": ["do-not-touch"], "callerId": "shopify-operations-mcp" }
Config reference
| Field | Type | Default | Description |
|---|---|---|---|
shopify.storeDomain | string | *(required)* | MyShopify domain, e.g. "my-store.myshopify.com" |
shopify.apiVersion | string | "2026-04" | Pinned quarterly Admin API version |
shopify.adminToken | string | *(env only)* | Admin API token — never in config file, only SHOPIFY_ADMIN_TOKEN env var |
plans.planTtlMs | positive int | 60000 | How long a plan token stays valid (ms). Overridable: SHOPIFY_PLAN_TTL_MS |
plans.approvalRequiredAboveItems | positive int | 25 | Plans touching this many items require human approval. Overridable: SHOPIFY_APPROVAL_REQUIRED_ABOVE_ITEMS |
plans.hardMaxItems | positive int | 250 | Plans exceeding this item count are refused outright. Overridable: SHOPIFY_HARD_MAX_ITEMS |
plans.maxPriceChangePct | positive int | 30 | Price changes exceeding this % require approval. Overridable: SHOPIFY_MAX_PRICE_CHANGE_PCT |
plans.rollbackTtlMs | positive int | 86400000 | Rollback window (ms, default 24h). Overridable: SHOPIFY_ROLLBACK_TTL_MS |
approvalServer.enabled | boolean | true | Start localhost approval UI alongside MCP server. Overridable: SHOPIFY_APPROVAL_SERVER_ENABLED |
approvalServer.port | positive int | 4319 | Port for localhost approval UI (127.0.0.1 only). Overridable: SHOPIFY_APPROVAL_SERVER_PORT |
approvalServer.requireAuth | boolean | true | Require the per-session bearer token on every approval-server route. Set false to fall back to pre-0.4.0 behavior (not recommended). Overridable: SHOPIFY_APPROVAL_SERVER_REQUIRE_AUTH |
approvalServer.authToken | string? | *(env only)* | Explicit bearer token for the approval server — never in config file, only SHOPIFY_APPROVAL_SERVER_AUTH_TOKEN env var. Unset means a random token is generated per start and printed once on stderr. |
protectedTags | string[] | ["do-not-touch"] | Tags that plans may never modify. Overridable: SHOPIFY_PROTECTED_TAGS (comma-separated) |
callerId | string | "unknown" | Identity recorded on every audit row. Overridable: SHOPIFY_CALLER_ID |
Invariant: plans.hardMaxItems must be >= plans.approvalRequiredAboveItems. The loader throws if violated.
Environment variables
All config fields are overridable by environment variables (precedence: env > config file > default). SHOPIFY_ADMIN_TOKEN is required and only ever read from the environment.
Tools
Read tools
search_products
Search products by title, SKU, vendor, or tag. Returns products with variants, current prices, and per-location inventory levels.
Arguments:
| Field | Type | Description |
|---|---|---|
title | string? | Matches products whose title contains the term (Shopify fuzzy search) |
sku | string? | Matches products with a variant whose SKU equals the term |
vendor | string? | Matches products from this vendor |
tag | string? | Matches products carrying this tag |
first | positive int? | Page size passed to Admin API (default 50) |
Returns: products[] with id, title, vendor, tags, variants (each with id, sku, price, inventoryItemId, inventoryLevels), plus flags.protected / flags.protectedTags indicating whether the product carries a protected tag.
Safety properties: Pure read — zero mutation calls. Protected-tagged products are returned (never filtered out) so a later write plan that touches them is refused.
list_orders
List orders filtered by financial status, fulfillment status, and date range.
Arguments:
| Field | Type | Description | ||||||
|---|---|---|---|---|---|---|---|---|
financialStatus | FinancialStatus? | `"pending" \ | "authorized" \ | "partially_paid" \ | "paid" \ | "partially_refunded" \ | "refunded" \ | "voided"` |
fulfillmentStatus | FulfillmentStatus? | `"fulfilled" \ | "partial" \ | "unfulfilled"` | ||||
createdAfter | ISO-8601 string? | Orders created at or after this datetime | ||||||
createdBefore | ISO-8601 string? | Orders created at or before this datetime | ||||||
first | positive int? | Page size (default 250) |
Returns: orders[] with id, name, financialStatus, fulfillmentStatus, totalPrice, lineItems[].
Safety properties: Pure read — zero mutation calls.
Write tools (two-phase)
All write tools go through preview → token → (approval) → execute.
update_inventory
Set absolute inventory quantities at a named location for multiple inventory items. Preview reads current levels; execute calls inventorySetQuantities.
Arguments:
| Field | Type | Description |
|---|---|---|
locationId | string | gid://shopify/Location/… id |
adjustments | InventoryAdjustment[] | Each {inventoryItemId, quantity} sets the available quantity at locationId |
Safety properties:
- Threshold gating: requires approval when
adjustments.length >= approvalRequiredAboveItems(default 25); refused outright when> hardMaxItems(default 250) - Protected-tag enforcement: plans touching a product with a protected tag throw
PROTECTED_RESOURCEbefore a token is issued — no approval path - Per-item ledger: partial failure is recorded, never hidden
- Rollback: supported — restores
before.availablequantities via the snapshot
cancel_order
Cancel a Shopify order. Always requires approval regardless of item count. Cannot be rolled back.
Arguments:
| Field | Type | Description | |||
|---|---|---|---|---|---|
orderId | string | gid://shopify/Order/… id | |||
reason | string | `"customer" \ | "inventory" \ | "fraud" \ | "other"` |
restock | boolean | Return items to inventory | |||
notifyCustomer | boolean | Send cancellation email |
Safety properties:
- Always approval:
alwaysRequireApproval: trueis hardcoded in the tool — approval thresholds are never consulted - No snapshot: no
snapshotStore.capture()call — rollback is not opened for this operation - Rollback: refused with
ROLLBACK_UNSUPPORTED— cancellation is a state transition, not a value change
refund_order
Refund a Shopify order. Always requires approval regardless of item count. Cannot be rolled back.
Arguments:
| Field | Type | Description |
|---|---|---|
orderId | string | gid://shopify/Order/… id |
refundLineItems | RefundLineItem[]? | Line items and quantities to refund; absent = full refund of all fulfilled items |
reason | string | Human-readable reason recorded in audit |
Each RefundLineItem: {lineItemId, quantity, restockType?} where restockType is "RETURN" \| "NO_RESTOCK" \| "CANCEL".
Safety properties:
- **A
Nur der Anfang wird gezeigt; den Rest findest du im Repo