{"name":"io.github.jpka/shopify-operations-mcp","slug":"jpka-shopify-operations-mcp","title":"shopify-operations-mcp","description":"Safe-write Shopify operations: plan-before-execute writes with out-of-band approval and audit.","url":"https://mcp.market/server/jpka-shopify-operations-mcp","rating":null,"grade":"B","score":78,"certified":false,"status":"active","category":"ecommerce","tags":["ecommerce"],"presence":{"score":18,"stars":0,"forks":0,"downloads_week":49,"last_push_at":"2026-09-04T21:16:44.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"npm","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/jpka/shopify-operations-mcp","website":null,"version":"0.1.2","remotes":[],"packages":[{"registryType":"npm","identifier":"shopify-operations-mcp","version":"0.1.2","transport":{"type":"stdio"},"environmentVariables":[{"description":"The myshopify.com store domain, e.g. my-store.myshopify.com. Overrides shopify.storeDomain from the config file.","isRequired":true,"format":"string","name":"SHOPIFY_STORE_DOMAIN"},{"description":"Shopify Admin API access token. Required and only ever read from the environment — never from the config file.","isRequired":true,"format":"string","isSecret":true,"name":"SHOPIFY_ADMIN_TOKEN"},{"description":"Path to a config.json with shopify/plans/approvalServer/protectedTags settings. Defaults to ./config.json in the working directory.","format":"string","name":"SHOPIFY_CONFIG"},{"description":"How long a plan token stays valid before it must be executed or expires, in milliseconds. Default 60000.","format":"string","name":"SHOPIFY_PLAN_TTL_MS"},{"description":"Port the localhost human-approval HTTP server binds to (127.0.0.1 only). Default 4319.","format":"string","name":"SHOPIFY_APPROVAL_SERVER_PORT"},{"description":"Comma-separated tags that plans may never modify; any plan touching an item carrying one is refused. Default do-not-touch.","format":"string","name":"SHOPIFY_PROTECTED_TAGS"},{"description":"Identity recorded as the caller on every audit log row. Default unknown.","format":"string","name":"SHOPIFY_CALLER_ID"},{"description":"File path for the tamper-evident JSONL audit log. Default shopify-operations-audit.jsonl in the working directory.","format":"string","name":"SHOPIFY_AUDIT_PATH"}]}],"tools":[{"name":"cancel_order","description":"Preview and execute order cancellation (two-phase). Cancellation is permanent — an order cannot be uncancelled — so every cancel plan ALWAYS requires human approval through the localhost approval UI, regardless of item count, and cancel_order can never be rolled back. The preview is a zero-write call that returns the refund implication and flags the human sees before granting or denying; execute a","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_discount","description":"Preview and execute the creation of a discount code (two-phase). Previews the planned discount (pure reads, zero mutation) and returns a plan_token; nothing changes until execute_plan runs with that token. A plan touching at least plans.approvalRequiredAboveItems items requires human approval through the localhost approval UI before it executes. Discount creation is reversible via rollback_plan, w","write_action":true,"price_micros":0,"input_schema":null},{"name":"execute_plan","description":"Execute a previously previewed write (update_prices, update_inventory, create_discount, refund_order, or cancel_order). Pass back the exact plan_token and the exact manifest from the preview response. The token is single-use, expires, and refuses any manifest that does not fingerprint-match the preview; write plans also refuse when the current data drifted since the preview (STATE_CHANGED). Plans ","write_action":true,"price_micros":0,"input_schema":null},{"name":"list_orders","description":"List cancellable and refundable orders (id, name, financial and fulfillment status, total price, line items), optionally filtered by financial status, fulfillment status, and created-date range. Read-only: a single GraphQL query over the orders connection with no mutation.","write_action":false,"price_micros":0,"input_schema":null},{"name":"refund_order","description":"Preview and execute an order refund (two-phase). Previews via Shopify's refundCalculate (zero writes) to obtain exact suggested refund amounts, then — only after a human approves through the localhost approval UI — executes via refundCreate. ALWAYS requires human approval regardless of item count, because a refund is irreversible and unwinds a payment. Refunds cannot be rolled back (refund_order i","write_action":true,"price_micros":0,"input_schema":null},{"name":"rollback_plan","description":"Undo a previously executed reversible plan (update_prices, update_inventory, or create_discount) in one call: restores each item to its previewed before-state by re-applying inverse mutations. Requires no approval — restoring prior state is the safe direction. Refused with ROLLBACK_UNSUPPORTED for non-reversible kinds (cancel_order, refund_order) or unknown tokens, and ROLLBACK_WINDOW_EXPIRED once","write_action":false,"price_micros":0,"input_schema":null},{"name":"search_products","description":"Search products by title, sku, vendor, or tag and return variant pricing and per-location inventory references. Read-only: composes a Shopify search string, walks the cursor-paginated products connection to completion, and flags any product carrying a configured protected tag so a later write plan touching it is refused at preview time.","write_action":false,"price_micros":0,"input_schema":null},{"name":"update_inventory","description":"Preview and execute bulk inventory quantity changes at one location (two-phase). Sets the available quantity of each inventory item at the location to the absolute value supplied (not a delta). Previews planned changes (pure reads, zero mutation) and returns a plan_token; nothing changes until execute_plan runs with that token. A plan touching at least plans.approvalRequiredAboveItems items requir","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_prices","description":"Preview and execute bulk variant price changes (two-phase). Previews the exact price change for every matched variant (pure reads, zero mutation) and returns a plan_token; nothing changes until execute_plan runs with that token. A plan that changes any single variant's price by more than plans.maxPriceChangePct (default 30%), or that touches at least plans.approvalRequiredAboveItems variants, requ","write_action":true,"price_micros":0,"input_schema":null}],"scan":{"score":78,"grade":"B","scanned_at":"2026-11-03T14:21:22.970Z","report":{"scannerVersion":"0.1.10","scannedAt":"2026-11-03T14:21:22.898Z","components":{"code":{"score":25,"max":25,"notes":["42 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":6,"max":15,"notes":["static API keys via environment variables"]},"maintenance":{"score":12,"max":15,"notes":["last push 60 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[],"inputs":{"packages":[{"registryType":"npm","identifier":"shopify-operations-mcp","version":"0.1.2","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":3,"publishedAt":"2026-08-17T01:23:53.711Z","repositoryUrl":"git+https://github.com/jpka/shopify-operations-mcp.git","weeklyDownloads":49}],"repo":{"found":true,"owner":"jpka","repo":"shopify-operations-mcp","archived":false,"pushedAt":"2026-09-04T21:16:44Z","stars":0,"forks":0,"openIssues":2,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/509540?v=4","ownerCreatedAt":"2010-12-04T19:42:17Z","license":"MIT"},"icon":{"url":"https://avatars.githubusercontent.com/u/509540?v=4&s=128","source":"registry","width":128,"height":128},"presence":{"stars":0,"forks":0,"downloadsWeek":49,"license":"MIT","lastPushAt":"2026-09-04T21:16:44.000Z","score":18}}}},"grade_history":[],"reviews":[]}