DTC Outsourcing Playbook

Read-only Shopify catalogue and stock for Claude

Updated 15 September 2026

shop-mcp is a single-file Model Context Protocol server that answers catalogue and stock questions about a Shopify store. It uses the Python standard library and nothing else. It cannot write. You can run the test suite before you give it a token.

uvx --from shop-mcp shop-mcp --self-test

That is the whole claim, and it runs before you hand over a token: no clone, no credentials, no network. What the count should be, and why it differs from a clone, is spelled out below.

Key takeaways

Run it before you trust it

uvx --from shop-mcp shop-mcp --self-test needs no clone and no credentials, and reports 183 assertions rather than 200: manifest.json (5 assertions), llms-install.md (11) and README.md (1) are deliberately not shipped into site-packages, and every one of those checks skips rather than fails when its file is absent. The count moves, the verdict does not.

Those numbers are not typed onto this page by hand. They come from evidence.json, which is rewritten by running the suites in github.com/hello532/shop-mcp. If the suite moves, this page has to move with it or the site gate goes red.

What it will not do

The Admin token it wants is read_products and read_inventory. A write scope is unused. That is the blast-radius argument against a 55-tool server on a live store: feature count is the wrong axis when a bad prompt can edit the catalogue.

The four tools

Four is a choice. A wider surface is easy and makes the model worse at picking.

Defects the suite is built to catch

A stdio MCP server fails invisibly when you run it yourself and fatally inside a host. Each of these has a named assertion:

What is not verified

This has never been run against a live Shopify store. There is no credential in the repository and no recorded API session. The queries are written to the documented Admin GraphQL schema, and every path around them is tested against a transport double — but the doubles are a model of Shopify's behaviour, not Shopify. A README that blurs that line is asking to be trusted on the wrong thing.

The listing in the official MCP Registry is a different kind of fact: it validated that the io.github.hello532 namespace is mine before it would accept the entry. That record answers for itself — one record, status: active — rather than being a badge drawn here.

Install

On PyPI as shop-mcp 1.0.1. Source at github.com/hello532/shop-mcp. MIT licence.

export SHOPIFY_SHOP_DOMAIN=your-shop.myshopify.com
export SHOPIFY_ADMIN_TOKEN=shpat_...          # read_products, read_inventory
uvx shop-mcp                                  # or: pip install shop-mcp && shop-mcp

Claude Desktop, or any MCP host:

{
  "mcpServers": {
    "shop": {
      "command": "uvx",
      "args": ["shop-mcp"],
      "env": {
        "SHOPIFY_SHOP_DOMAIN": "your-shop.myshopify.com",
        "SHOPIFY_ADMIN_TOKEN": "shpat_..."
      }
    }
  }
}

With no credentials set it still completes a handshake and serves tools/list, then returns isError with the missing variable named. A host that cannot read tools/list reports a broken server and sends you looking in the wrong place.

If you want the same shape over your own data

This file is the worked example, not a product line. The same discipline — a stdio MCP server over data you already have, with a self-test suite and proof the suite catches injected defects — is a fixed-price job on the services page. Email coolun337@gmail.com. Nothing on this page needs paying for; issues and PRs are welcome either way.

Start with the command, not the pitch. uvx --from shop-mcp shop-mcp --self-test is the whole claim. If that is not green on your machine, nothing else on this page matters.