{"_id":"shopify-readonly-mcp","_rev":"2-d8e2818dc4092e4fee3b00e12cd9e1e0","name":"shopify-readonly-mcp","dist-tags":{"latest":"0.1.0"},"versions":{"0.0.0-stage":{"name":"shopify-readonly-mcp","version":"0.0.0-stage","_id":"shopify-readonly-mcp@0.0.0-stage","stub":true,"maintainers":[{"name":"sms-florin","email":"florin@flo-voice.com"}],"dist":{"shasum":"06e8d3e0fbc5a3682c19cee84cfcbccfcaac4fb8","tarball":"https://registry.npmjs.org/shopify-readonly-mcp/-/shopify-readonly-mcp-0.0.0-stage.tgz","fileCount":2,"integrity":"sha512-briTEBDcful77YAxQQPI4eU02oewzQKSTr24dFVCK1iLkJY0bMhHR6JHBMzy7WVronxRGiCz3c9bwTRZZ9sm3Q==","signatures":[{"sig":"MEUCIQCY2p6SWmdq22g5ZMRgLcKlbEbwMEb0C1ohVj7QCzskpQIgf4cFm5DUIyRRV0iJzRjG3jYiYsdIDQIL+CePWm5C8wc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":342},"_npmUser":{"name":"sms-florin","email":"florin@flo-voice.com"},"description":"Temporary package placeholder for staged publishing","directories":{}},"0.1.0":{"_id":"shopify-readonly-mcp@0.1.0","bin":{"shopify-readonly-mcp":"dist/index.js"},"bugs":{"url":"https://gitlab.com/florin-builds/shopify-readonly-mcp/issues"},"dist":{"shasum":"c366173d4dba178c6e8c745b8d00e366efcc77f3","tarball":"https://registry.npmjs.org/shopify-readonly-mcp/-/shopify-readonly-mcp-0.1.0.tgz","fileCount":9,"integrity":"sha512-B3cdvd6OZRY82p39/HU6PjYuzhgGD381LRTLxrX49dWnxumzBMANM+Xp1At2l+2EKVnhu+1ZPYaOMlel8196Ig==","signatures":[{"sig":"MEYCIQCMzA2WYJ/JYK05GS6tkWvm381+lBBL4Mb4UvmgdhiqbAIhAMOUtIhB/5ISAJYEdvSOaN3SqDa0TSHJMATpvpmDWtmB","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIEgpqt3cdtKvebWXjXOdhjc10tE8HycTqrzmqlTzQ2eOAiApWvs+E+WMMPLNi9JTBR6w/R58mksMKbxWaI9LFhD0tg=="}],"unpackedSize":22411},"main":"dist/index.js","name":"shopify-readonly-mcp","type":"module","types":"./dist/index.d.ts","author":{"name":"Florin Arsenie"},"engines":{"node":">=18"},"gitHead":"e17ce1c1a91fcdbcc1599900cd0ba92b4138ab89","license":"MIT","scripts":{"test":"npm run build && node --test dist/*.test.js","build":"tsc -p tsconfig.json"},"version":"0.1.0","_npmUser":{"name":"sms-florin","email":"florin@flo-voice.com"},"homepage":"https://gitlab.com/florin-builds/shopify-readonly-mcp#readme","keywords":["mcp","mcp-server","model-context-protocol","shopify","shopify-admin-api","ai-agent","claude","read-only"],"repository":{"url":"git+https://gitlab.com/florin-builds/shopify-readonly-mcp.git","type":"git"},"_npmVersion":"11.17.0","description":"Read-only MCP server for a Shopify store: lets AI agents look up products, orders and low stock through the Admin GraphQL API, with no write access at all.","directories":{},"maintainers":[{"name":"sms-florin","email":"florin@flo-voice.com"}],"_nodeVersion":"26.5.0","dependencies":{"zod":"^4.6.7","@modelcontextprotocol/sdk":"^1.32.1"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.3","@types/node":"^22.0.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/shopify-readonly-mcp_0.1.0_1792680131047_0.8671387283303928"}}},"time":{"created":"2026-10-22T14:38:59.463Z","modified":"2026-10-22T14:42:11.549Z","0.0.0-stage":"2026-10-22T14:38:59.463Z","0.1.0":"2026-10-22T14:42:11.136Z"},"description":"Read-only MCP server for a Shopify store: lets AI agents look up products, orders and low stock through the Admin GraphQL API, with no write access at all.","maintainers":[{"name":"sms-florin","email":"florin@flo-voice.com"}],"readme":"# shopify-readonly-mcp\n\nA read-only MCP server for one Shopify store. It lets an AI agent (Claude Code or any MCP client) answer questions like \"which orders from this week are still unshipped?\" or \"what is about to go out of stock?\" through the Shopify Admin GraphQL API.\n\nIt is read-only by design, so it is safe to hand to an agent:\n\n- every request is a fixed GraphQL query, and the client refuses to send any `mutation`;\n- the app only needs read scopes;\n- no customer contact details (email, phone, address) are ever requested;\n- requests only go to `<your-store>.myshopify.com`, whatever `SHOPIFY_STORE` contains.\n\n## Tools\n\n| Tool | What it does |\n| --- | --- |\n| `get_shop` | Store name, domain, currency, timezone |\n| `search_products` | Search products with Shopify search syntax (`title:shirt`, `status:active`) |\n| `get_product` | One product with every variant's SKU, price and inventory |\n| `list_orders` | Orders newest first, filterable (`fulfillment_status:unshipped`, `created_at:>2026-10-01`) |\n| `get_order` | One order with line items, by id or by name (`#1001`) |\n| `low_stock` | Variants with inventory at or below a threshold |\n\nList tools return `pageInfo.endCursor`; pass it back as `after` to get the next page.\n\n## Setup\n\nSince January 2026, new Shopify apps are created in the **Dev Dashboard** (not in the store admin).\n\n1. In the [Dev Dashboard](https://dev.shopify.com/dashboard), create an app.\n2. Give it the scopes `read_products`, `read_orders`, `read_inventory` and release a version.\n3. Install the app on your store (the store must be in the same Dev Dashboard organization as the app).\n4. Orders are \"protected customer data\" even without names or emails. In the Partner Dashboard, open the app > **API access requests** > **Protected customer data access**, select **Protected customer data** with a reason and save. No extra fields are needed, and dev stores don't need review. Without this, the order tools fail with \"not approved to access the Order object\".\n5. Copy the app's **Client ID** and **Client secret**.\n\nThe server exchanges these for an access token itself (client credentials grant) and refreshes it before its 24-hour expiry. If you already have an access token, set `SHOPIFY_ACCESS_TOKEN` instead.\n\n### Claude Code\n\n```bash\nclaude mcp add shopify \\\n  -e SHOPIFY_STORE=your-store \\\n  -e SHOPIFY_CLIENT_ID=... \\\n  -e SHOPIFY_CLIENT_SECRET=... \\\n  -- node /path/to/shopify-mcp/dist/index.js\n```\n\n### Environment variables\n\n| Variable | Required | Notes |\n| --- | --- | --- |\n| `SHOPIFY_STORE` | yes | `your-store` or `your-store.myshopify.com` |\n| `SHOPIFY_CLIENT_ID` + `SHOPIFY_CLIENT_SECRET` | one of the two | Dev Dashboard app credentials |\n| `SHOPIFY_ACCESS_TOKEN` | one of the two | An existing Admin API token |\n| `SHOPIFY_API_VERSION` | no | Defaults to `2026-10` |\n\n## Development\n\n```bash\nnpm install\nnpm test                                   # unit tests, no network\nnode --env-file=.env scripts/mcp-test.mjs  # end-to-end against your dev store\n```\n\n## Limits\n\n- Without the `read_all_orders` scope, Shopify only returns orders from the last 60 days.\n- The client credentials grant only works for stores in your own Dev Dashboard organization. To connect a client's store, the app needs the authorization code grant instead.\n\n## License\n\nMIT\n","readmeFilename":"README.md","homepage":"https://gitlab.com/florin-builds/shopify-readonly-mcp#readme","keywords":["mcp","mcp-server","model-context-protocol","shopify","shopify-admin-api","ai-agent","claude","read-only"],"repository":{"url":"git+https://gitlab.com/florin-builds/shopify-readonly-mcp.git","type":"git"},"author":{"name":"Florin Arsenie"},"bugs":{"url":"https://gitlab.com/florin-builds/shopify-readonly-mcp/issues"},"license":"MIT"}