Read-only Shopify catalogue and stock for LLM agents. Stdlib only, no dependencies.
MCPpedia last refreshed this data
io.github.hello532/shop-mcp is an MCP server that read-only Shopify catalogue and stock for LLM agents. Stdlib only, no dependencies. Its tool list has not been published yet over stdio and sse, requires no API key, and scores 82/100 on MCPpedia's security, maintenance and efficiency rubric.
Config is the same across clients - only the file and path differ.
{
"mcpServers": {
"shop": {
"env": {
"SHOPIFY_ADMIN_TOKEN": "shpat_...",
"SHOPIFY_SHOP_DOMAIN": "your-shop.myshopify.com"
},
"args": [
"shop-mcp"
],
"command": "uvx"
}
}
}Are you the author?
Add this badge to your README to show your security score and help users find safe servers.
Read-only Shopify catalogue and stock for LLM agents. Stdlib only, no dependencies.
Run this in your terminal to verify the server starts. Then let us know if it worked - your result helps other developers.
uvx 'shop-mcp' 2>&1 | head -1 && echo "✓ Server started successfully"
After testing, let us know if it worked:
Five weighted categories - click any category to see the underlying evidence.
No known CVEs.
Checked shop-mcp against OSV.dev.
Click any tool to inspect its schema.
Be the first to review
Have you used this server?
Share your experience - it helps other developers decide.
Sign in to write a review.
Others in ai-ml / ecommerce
Codebase knowledge graph for AI agents — 162 languages, sub-ms queries, 99% fewer tokens.
An open-source AI agent that brings the power of Gemini directly into your terminal.
🛡️ BLA (Blind LLM Agents) — Adversarial defense shield that protects binaries, Electron apps, JS bundles, Python, and WebAssembly against AI reverse-engineering agents like REA. Poison -> Exhaust -> Hallucinate.
Open source device layer for AI agents: control mobile, web, TV, and desktop apps over MCP
MCP Security Weekly
Get CVE alerts and security updates for io.github.hello532/shop-mcp and similar servers.
Start a conversation
Ask a question, share a tip, or report an issue.
Sign in to join the discussion.
A Model Context Protocol server that lets an LLM agent answer questions about a Shopify store's catalogue and stock — over stdio, from a single file, using only the Python standard library.
No MCP SDK. No requests. No GraphQL client. python3 shop_mcp.py is the whole
install.
$ python3 shop_mcp.py --self-test
all green: 200 assertions
That command needs no credentials and no network. It is the point of the repo: the protocol layer and the tool layer are both exercised for real, because the Shopify transport is replaced at a seam rather than mocked at the boundary.
Installed from PyPI, the same command reports 183, and the seventeen-assertion difference is a packaging fact rather than a weaker check:
$ uvx --from shop-mcp shop-mcp --self-test
all green: 183 assertions
manifest.json (5 assertions), llms-install.md (11) and README.md (1) are
deliberately not shipped into site-packages — the manifest's entry_point
names a bundle path that does not exist in an installed copy, so packaging it
would make a correct install fail. All three groups skip rather than fail when
their file is absent, which is why the count moves and the verdict does not.
Clone the repo to run all 200.
This server is the worked example, not a product line. I build the same shape — a stdio MCP server over data you already have, with a self-test suite and proof that the suite catches injected defects — as a fixed-price job: hello532.github.io/services.html, or coolun.337@gmail.com. Nothing on this page needs paying for; issues and PRs are welcome either way.
Because the failure modes of a stdio MCP server are all invisible locally and all fatal in a host. Each one below is a real defect this file is built to not have, and each has an assertion naming it:
print() corrupts the client's next
parse. Nothing looks wrong when you run the server yourself. Every diagnostic
here goes to stderr, and a test asserts stdout stays byte-empty across a full
session.notifications/initialized has no id, so a
reply to it is a message with no pending request. Strict clients treat that as
a protocol violation and drop the connection.id: 0 read as a notification. if msg.get("id") is falsy for zero, so a
client that numbers requests from zero has its first call silently dropped.
Presence, not truthiness.isError: true and the reason as text — otherwise the model never sees the
message and cannot correct its own arguments.protocolVersion. If a client asks for a revision the
server does not know, agreeing to it leaves both sides believing a spec is in
use that neither implements. This falls back to 2025-03-26, the spec's own
default, and says so.| tool | answers |
|---|---|
search_products | "what do we sell that matches X" — identity and total stock |
get_product | one product in full, every variant with SKU, price, stock |
check_inventory | stock for a SKU per location: available, committed, on-hand |
low_stock_report | variants at or below a threshold, lowest first |
Four tools, chosen because each answers a question a shop owner actually asks. A wider surface would be easy and would make the model worse at picking.
Three of the assertions cover mistakes that produce confidently wrong answers, which are worse than errors:
sku:SH 1 is a different query from sku:"SH 1". The
first silently matches the wrong vari