ต้นแบบ · รุ่นทดลอง: มีทุก server ในทะเบียนทางการ อัปเดตทุก 30 นาที รีวิวและบัญชีผู้ใช้จะมาในขั้นถัดไป
PopNx MCPที่รวม MCP สำหรับคนใช้ AI · อธิบายเป็นภาษาคน

shopify-operations-mcp

โดย jpkaรุ่น 0.1.2i★ –iรันบนเครื่อง
ชื่อใน registryio.github.jpka/shopify-operations-mcp

ติดตั้ง

ภาพรวม

คำอธิบายจากผู้ทำ (ภาษาอังกฤษตามต้นฉบับ)

Safe-write Shopify operations: plan-before-execute writes with out-of-band approval and audit.

สามเสาของ PopNx MCP

สามเรื่องนี้ไม่รวมเป็นคะแนนเดียว เพราะความเห็น การวัด และความนิยม เป็นคนละเรื่องกัน

ใช้ทำอะไรได้

ตัวนี้ยังไม่ได้เรียบเรียงเป็นภาษาไทย ด้านล่างคือข้อเท็จจริงที่เราอ่านจาก registry

  • การเชื่อมต่อ: รันบนเครื่อง
  • ช่องทาง (transport): stdio
  • หมวด: ร้านค้าออนไลน์และรับเงิน
  • ต้องใส่ค่าเหล่านี้: SHOPIFY_STORE_DOMAIN, SHOPIFY_ADMIN_TOKEN

ติดตั้ง

เลือกโปรแกรม AI ที่คุณใช้ แล้วคัดลอกค่าตั้งไปวาง

ก่อนติดตั้ง

  • ผลตรวจเบื้องต้น: ผ่าน 1 จาก 1 ข้อ
  • รันในเครื่องคุณด้วยสิทธิ์ของผู้ใช้คุณ (ไฟล์ อินเทอร์เน็ต แอปต่าง ๆ)
  • ค่าที่คุณต้องใส่เอง: 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

ค่าที่ติดป้ายความลับคือกุญแจของบัญชีคุณ อย่าส่งให้ใคร และอย่าวางในแชต

ต้องเตรียมก่อน

  • npmติดตั้ง Node.js (มีคำสั่ง npx) ในเครื่อง

คุณใช้แอปไหน

เลือกแอปด้านบน เราจำไว้ให้ ครั้งหน้าปุ่มจะขึ้นว่า “ติดตั้งลง …”

เปิด Claude Desktop → Settings → Developer → Edit Config แล้ววางค่านี้ในไฟล์ claude_desktop_config.json

{
  "mcpServers": {
    "shopify-operations": {
      "command": "npx",
      "args": [
        "-y",
        "shopify-operations-mcp"
      ],
      "env": {
        "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": "ใส่ค่าของคุณ"
      }
    }
  }
}

พิมพ์คำสั่งนี้ใน Terminal

claude mcp add shopify-operations --env SHOPIFY_STORE_DOMAIN='ใส่ค่าของคุณ' --env SHOPIFY_ADMIN_TOKEN='ใส่ค่าของคุณ' --env SHOPIFY_CONFIG='ใส่ค่าของคุณ' --env SHOPIFY_PLAN_TTL_MS='ใส่ค่าของคุณ' --env SHOPIFY_APPROVAL_SERVER_PORT='ใส่ค่าของคุณ' --env SHOPIFY_PROTECTED_TAGS='ใส่ค่าของคุณ' --env SHOPIFY_CALLER_ID='ใส่ค่าของคุณ' --env SHOPIFY_AUDIT_PATH='ใส่ค่าของคุณ' -- npx -y shopify-operations-mcp

เติมค่าที่เว้นว่างไว้ก่อนรัน

เปิดใน Cursor

หรือคัดลอกค่าตั้งเอง

วางในไฟล์ .cursor/mcp.json ของโปรเจกต์ หรือ ~/.cursor/mcp.json

{
  "mcpServers": {
    "shopify-operations": {
      "command": "npx",
      "args": [
        "-y",
        "shopify-operations-mcp"
      ],
      "env": {
        "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": "ใส่ค่าของคุณ"
      }
    }
  }
}

เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง

เปิดใน VS Code

หรือคัดลอกค่าตั้งเอง

วางในไฟล์ .vscode/mcp.json ของโปรเจกต์

{
  "servers": {
    "shopify-operations": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "shopify-operations-mcp"
      ],
      "env": {
        "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": "ใส่ค่าของคุณ"
      }
    }
  }
}

เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง

ตัวนี้รันในเครื่องคุณ แต่ ChatGPT ต่อได้เฉพาะ server บนอินเทอร์เน็ต ลองเลือกแอปอื่น

ตัวเลือกเก็บในคุกกี้บนเครื่องนี้ ไม่ต้องมีบัญชี

ค่าที่ต้องใส่เอง

  • SHOPIFY_STORE_DOMAIN จำเป็น env
    The myshopify.com store domain, e.g. my-store.myshopify.com. Overrides shopify.storeDomain from the config file.
  • SHOPIFY_ADMIN_TOKEN ความลับ จำเป็น env
    Shopify Admin API access token. Required and only ever read from the environment — never from the config file.
  • SHOPIFY_CONFIG env
    Path to a config.json with shopify/plans/approvalServer/protectedTags settings. Defaults to ./config.json in the working directory.
  • SHOPIFY_PLAN_TTL_MS env
    How long a plan token stays valid before it must be executed or expires, in milliseconds. Default 60000.
  • SHOPIFY_APPROVAL_SERVER_PORT env
    Port the localhost human-approval HTTP server binds to (127.0.0.1 only). Default 4319.
  • SHOPIFY_PROTECTED_TAGS env
    Comma-separated tags that plans may never modify; any plan touching an item carrying one is refused. Default do-not-touch.
  • SHOPIFY_CALLER_ID env
    Identity recorded as the caller on every audit log row. Default unknown.
  • SHOPIFY_AUDIT_PATH env
    File path for the tamper-evident JSONL audit log. Default shopify-operations-audit.jsonl in the working directory.

ค่าตั้งนี้สร้างจากข้อมูลใน registry ของผู้ทำ ถ้าไม่ตรงกับ README ให้เชื่อ README

ทำอะไรได้บ้าง

รันในเครื่องคุณ รายการเครื่องมือจะขึ้นในแอป AI หลังติดตั้ง

ผลตรวจเบื้องต้นi

เราตรวจจากข้อมูลที่ใครก็เปิดดูได้ ยังไม่ได้อ่านโค้ด ข้อที่ไม่เกี่ยวกับตัวนี้ไม่นับในตัวหาร · ตรวจเมื่อ 7 พ.ย. 2569

  • ✓ ผ่าน

    ตัวตนผู้ทำตรงกับ repo

    ชื่อใน registry ยืนยันด้วยบัญชี GitHub jpka ซึ่งเป็นเจ้าของ repo

  • … ยังไม่ตรวจ

    ยังมีคนดูแล

    ยังไม่ได้อ่านข้อมูล repo จาก GitHub

  • … ยังไม่ตรวจ

    มีสัญญาอนุญาต (license)

    ยังไม่ได้อ่านข้อมูล repo จาก GitHub

  • – ไม่เกี่ยว

    endpoint ตอบ

    ตัวนี้รันบนเครื่องคุณ ไม่มี endpoint บนอินเทอร์เน็ต

  • – ไม่เกี่ยว

    ล็อกอินแบบ OAuth

    ตัวนี้รันบนเครื่อง ใช้ค่าที่ตั้งในเครื่องแทน

  • … ยังไม่ตรวจ

    คำอธิบายเครื่องมือไม่มีคำสั่งแอบแฝง

    รันในเครื่องคุณ เราอ่านรายการเครื่องมือได้เฉพาะตัวที่มี endpoint บนอินเทอร์เน็ต

เทียบกับตัวอื่นในหมวด ร้านค้าออนไลน์และรับเงินi

  • ดาวมากกว่า 0% ของอีก 1753 ตัวในหมวดนี้
  • ส่งรุ่นใหม่เข้า registry ล่าสุดกว่า 28% ของอีก 1753 ตัวในหมวดนี้
  • ผลตรวจเบื้องต้นดีกว่าหรือเท่ากับ 100% ของอีก 1753 ตัวในหมวดนี้

เทียบกับทุก server ที่ยังใช้งานในหมวดนี้ทั้งทะเบียน ดาวนับเฉพาะเมื่อผู้ลงทะเบียนเป็นเจ้าของ repo

คำถามที่พบบ่อย

shopify-operations-mcp ปลอดภัยไหม?

จากการตรวจเบื้องต้นของเรา ผ่าน 1 จาก 1 ข้อที่ตรวจได้ เรายังไม่ได้อ่านโค้ด ก่อนใส่กุญแจหรือ token ให้ดูว่า server ขอสิทธิ์อะไร และเลือกกุญแจที่ทำได้เท่าที่จำเป็น

ต้องใช้กุญแจหรือรหัสอะไรบ้าง?

ต้องใส่ค่าเหล่านี้: SHOPIFY_STORE_DOMAIN, SHOPIFY_ADMIN_TOKEN

ตัวนี้รันบนเครื่องหรือบนคลาวด์?

รันบนเครื่องของคุณ โปรแกรม AI จะเปิด server ขึ้นมาเองเมื่อใช้ ข้อมูลไม่ต้องผ่านเซิร์ฟเวอร์ของผู้ทำ (ยกเว้นตัวที่ไปเรียกบริการออนไลน์ต่อ)

ยังมีคนดูแลอยู่ไหม?

repo บน GitHub มีการแก้โค้ดล่าสุด – และส่งรุ่นล่าสุด (0.1.2) เข้า registry 3 เดือนที่ผ่านมา

ใช้กับโปรแกรมไหนได้บ้าง?

โปรแกรมที่รองรับ MCP เช่น Claude Desktop, Claude Code, Cursor และ VS Code ตัวนี้ต้องมี Node.js ในเครื่องด้วย

มีตัวไหนใช้แทนได้บ้าง?

ในหมวดเดียวกันมี Spree Commerce: open-source B2B and marketplace ecommerce, Stripe MCP, MCP Cn Commerce

ตัวที่ใช้แทนได้

server หมวดเดียวกันจากผู้ทำคนอื่น เรียงตามดาว

อ่านการ์ด:★ ดาว GitHubiสามเสา: รีวิว · ผลตรวจ · การใช้งานiอัปเดต = วันที่ส่งรุ่นล่าสุดเข้า registryi

Stripe MCP

โดย stripe

server ทางการของ Stripe ให้ AI ดูและจัดการลูกค้า สินค้า การชำระเงิน และใบแจ้งหนี้ ต่อผ่านคลาวด์ของ Stripe และล็อกอินแบบ OAuth

รันบนคลาวด์★ 2,043MITอัปเดต 12 เดือนที่ผ่านมา
ติดตั้ง

MCP Cn Commerce

โดย TonyWang-hub

8 read-only MCP platform entries; support is operation-specific; merchant live acceptance pending

รันบนเครื่อง★ 96MITอัปเดต 28 วันที่ผ่านมา
ติดตั้ง

README จากผู้ทำ

เปิดอ่าน README

ส่วนนี้คัดจาก repo ของผู้ทำตามต้นฉบับ PopNx MCP ไม่ได้ตรวจหรือรับรองเนื้อหา ตัด HTML รูปภาพ และสคริปต์ออกแล้ว ลิงก์จะพาออกนอกเว็บ

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:

  1. Preview — reads current state and computes what would change, performing zero mutation calls
  2. Token — issues a plan token bound to the exact previewed manifest via a SHA-256 fingerprint
  3. 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= )
  4. 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
FieldTypeDefaultDescription
shopify.storeDomainstring*(required)*MyShopify domain, e.g. "my-store.myshopify.com"
shopify.apiVersionstring"2026-04"Pinned quarterly Admin API version
shopify.adminTokenstring*(env only)*Admin API token — never in config file, only SHOPIFY_ADMIN_TOKEN env var
plans.planTtlMspositive int60000How long a plan token stays valid (ms). Overridable: SHOPIFY_PLAN_TTL_MS
plans.approvalRequiredAboveItemspositive int25Plans touching this many items require human approval. Overridable: SHOPIFY_APPROVAL_REQUIRED_ABOVE_ITEMS
plans.hardMaxItemspositive int250Plans exceeding this item count are refused outright. Overridable: SHOPIFY_HARD_MAX_ITEMS
plans.maxPriceChangePctpositive int30Price changes exceeding this % require approval. Overridable: SHOPIFY_MAX_PRICE_CHANGE_PCT
plans.rollbackTtlMspositive int86400000Rollback window (ms, default 24h). Overridable: SHOPIFY_ROLLBACK_TTL_MS
approvalServer.enabledbooleantrueStart localhost approval UI alongside MCP server. Overridable: SHOPIFY_APPROVAL_SERVER_ENABLED
approvalServer.portpositive int4319Port for localhost approval UI (127.0.0.1 only). Overridable: SHOPIFY_APPROVAL_SERVER_PORT
approvalServer.requireAuthbooleantrueRequire 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.authTokenstring?*(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.
protectedTagsstring[]["do-not-touch"]Tags that plans may never modify. Overridable: SHOPIFY_PROTECTED_TAGS (comma-separated)
callerIdstring"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:

FieldTypeDescription
titlestring?Matches products whose title contains the term (Shopify fuzzy search)
skustring?Matches products with a variant whose SKU equals the term
vendorstring?Matches products from this vendor
tagstring?Matches products carrying this tag
firstpositive 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:

FieldTypeDescription
financialStatusFinancialStatus?`"pending" \"authorized" \"partially_paid" \"paid" \"partially_refunded" \"refunded" \"voided"`
fulfillmentStatusFulfillmentStatus?`"fulfilled" \"partial" \"unfulfilled"`
createdAfterISO-8601 string?Orders created at or after this datetime
createdBeforeISO-8601 string?Orders created at or before this datetime
firstpositive 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:

FieldTypeDescription
locationIdstringgid://shopify/Location/… id
adjustmentsInventoryAdjustment[]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_RESOURCE before a token is issued — no approval path
  • Per-item ledger: partial failure is recorded, never hidden
  • Rollback: supported — restores before.available quantities via the snapshot
cancel_order

Cancel a Shopify order. Always requires approval regardless of item count. Cannot be rolled back.

Arguments:

FieldTypeDescription
orderIdstringgid://shopify/Order/… id
reasonstring`"customer" \"inventory" \"fraud" \"other"`
restockbooleanReturn items to inventory
notifyCustomerbooleanSend cancellation email

Safety properties:

  • Always approval: alwaysRequireApproval: true is 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:

FieldTypeDescription
orderIdstringgid://shopify/Order/… id
refundLineItemsRefundLineItem[]?Line items and quantities to refund; absent = full refund of all fulfilled items
reasonstringHuman-readable reason recorded in audit

Each RefundLineItem: {lineItemId, quantity, restockType?} where restockType is "RETURN" \| "NO_RESTOCK" \| "CANCEL".

Safety properties:

  • **A

ตัดมาแค่ช่วงต้น อ่านต่อใน repo

ถาม PopNx