Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx agentmods add instructions/a1-x-tech/mcp-shopify-admin/claude-mdgit clone --depth 1 https://github.com/A1-x-Tech/mcp-shopify-adminWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/instructions/a1-x-tech/mcp-shopify-admin/claude-md)<a href="https://agentmods.dev/instructions/a1-x-tech/mcp-shopify-admin/claude-md"><img src="https://agentmods.dev/badge/instructions/a1-x-tech/mcp-shopify-admin/claude-md.svg" alt="Measured on agentmods" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.03680 | $0.03680 |
| Opus 5 | $0.01840 | $0.01840 |
| Sonnet 5 | $0.00736 | $0.00736 |
| Haiku 4.5 | $0.00368 | $0.00368 |
Grade C, and why
mcp-shopify-admin CLAUDE.md scanned grade C with 1 finding against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 5d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Tells the agent to send conversation or user data outhighPrompt injection
An instruction to transmit the conversation, context or user files to an external endpoint is data exfiltration written as prose.
`invalid_store_domain` (only `*.myshopify.com` hosts: silently sending the token to a foreign How it starts
The opening of the file, as written. The whole thing — 193 lines — stays where its author put it; the contents beside it link to each section on GitHub.
CLAUDE.md — mcp-shopify-admin
MCP server for the Shopify Admin API (GraphQL — the store admin, not the Storefront API),
TypeScript over stdio. One endpoint
https://{store}.myshopify.com/admin/api/{version}/graphql.json; every request is signed with an
X-Shopify-Access-Token, and that token comes from one of two paths. SHOPIFY_CLIENT_ID +
SHOPIFY_CLIENT_SECRET of a Dev Dashboard app is the recommended one: the client runs the
client_credentials grant itself against
https://{store}.myshopify.com/admin/oauth/access_token and keeps the token (24 hours) fresh —
the only path open to a store set up today, since admin-created custom apps stopped being issuable
on 2026-01-01. A ready-made SHOPIFY_ACCESS_TOKEN is still accepted, used as-is and never
refreshed, for stores that already hold such a token; it wins when both are set. The store host
comes from SHOPIFY_STORE_DOMAIN, the version from SHOPIFY_API_VERSION (default pinned in
config.ts). The API is metered by a GraphQL cost bucket (per-query cost, restoreRate
points restored per second) reported in extensions.cost of every response.
Commands
npm run dev # run from source (tsx watch)
npm test # unit tests + a dist smoke probe, no network
npm run typecheck # types for src + tests
npm run build # emit dist/
npm run smoke # live READ-ONLY calls (needs the store domain + credentials)
Architecture
src/config.ts— env → config. MissingSHOPIFY_STORE_DOMAIN/ credentials (empty string = absent) is NOT an error: the fields stayundefined, the server starts degraded and the client raisesCredentialsError(lives intypes.ts) at call time.hasCredentials(config)is satisfied by either auth path — a ready-madeSHOPIFY_ACCESS_TOKENor theSHOPIFY_CLIENT_ID+SHOPIFY_CLIENT_SECRETpair the client can mint one with — andauthMode(config)names which one is in play (token/client_credentials/none) for the startup line and telemetry, since the two behave differently when a token goes stale.ConfigError(with areasoncode) is reserved for malformed values —invalid_store_domain(only*.myshopify.comhosts: silently sending the token to a foreign host is how tokens leak; a bare handle or pasted URL normalizes cleanly),invalid_api_versionandinvalid_api_base(must parse as an http/https URL) — and is caught byloadConfigOrDegradedinindex.ts, which keeps the message asconfigProblemon the degraded config.describeTarget(config)is the only shape of the target that may be printed: the store domain, else the endpoint reduced to origin + path, so nothing a URL may carry (auser:password@, a token in the path) reaches stderr. OptionalSHOPIFY_API_VERSION,SHOPIFY_TIMEOUT_MS,SHOPIFY_MAX_RETRIES,SHOPIFY_TOKEN_LEEWAY_SECONDS(how early a minted token is replaced, default 300),SHOPIFY_API_BASE(full endpoint override; also satisfieshasCredentialswithout a domain, for mocks).src/types.ts— config,CostInfo(flattenedextensions.cost),ApiResponse<T> = {data, cost},ConnectionPage<T>({count, items, hasNextPage, endCursor}), the enum tuples (PRODUCT_STATUSES,ORDER_CANCEL_REASONS,INVENTORY_REASONS,GID_TYPES) the tools build zod enums from,ShopifyAdminError,MutationError,ValidationError,CredentialsError.src/client.ts— the GraphQL documents (compact selections: the consumer is an LLM) and one transport. The--- Auth ---section owns the token:authToken()returns a ready-madeSHOPIFY_ACCESS_TOKENuntouched, otherwise the cached minted one while it is still more than the leeway away from expiry, otherwise the in-flight mint — the promise is stored, so a burst of parallel tool calls shares one exchange and a failed mint is never cached.fetchToken()posts theclient_credentialsgrant to/admin/oauth/access_token(derived from the endpoint's origin, which keeps a mock self-consistent) and caches{value, expiresAt}in memory only, never on disk; it never retries, because its characteristic failure —shop_not_permitted, the app and the store sitting in different Shopify organizations — is not transient (tools/util.tsturns it into exactly that hint).forgetToken()drops the cache so the next attempt mints afresh;send()fetches the token per attempt, since a long retry ladder can outlive one.send()first rejects a missing credential withCredentialsError(before retries and fetch — the message is the product: it names the variables and the needed restart, or, whenconfigProblemis set, the malformed variable instead of the credentials), then POSTs with an AbortController timeout that also covers reading the body, retries with backoff, liftsextensions.costinto the envelope and turns GraphQLerrors— and a 200 that carries nodataobject — intoShopifyAdminError.request()also forwards an optionaloperationName.mutate()additionally turns a non-emptyuserErrorsintoMutationError(witherrorsKeyfor renames:orderCancel→orderCancelUserErrors) and drops the empty field from clean results. Also holds the pre-flight validators:toGid(builds gids, refuses cross-type ones),isMutationDocument(retry safety forgraphql_request, overfirstOperationKind— a walk that skips comments, strings and(…)to find the first executable operation past any fragment definitions; unparseable counts as a mutation),throttleWaitSeconds(bucket math),normalizePageSize(clamp into 1..250).src/tools/*.ts—shop,products,orders,customers,inventory,discounts,raw; each exports oneregister*Tools(server, client).tools/util.ts—ok/fail, the annotation presets and the shared zod schema factories.tools/harness.ts— the fake server/client pair the tool tests share (excluded from the build in tsconfig.json).src/index.ts— wires everyregister*into the McpServer.loadConfigOrDegraded()catchesConfigError, pingsstartup_failed(fire-and-forget) and degrades the config to "no credentials" with no endpoint at all; an unconfigured start prependsUNCONFIGURED_PREFIX— plusПроблема конфигурации: <message>when a ConfigError was caught — to the initializeinstructions, andoninitializedsendsserver_startfor a configured install orunconfigured_start(with the reason) otherwise.src/telemetry.ts— anonymous usage pings (ids/names/versions only, never data or arguments; fire-and-forget, must never block or throw; opt-outASKADS_TELEMETRY=0). Reasons are a closed vocabulary (missing_store_domain,missing_credentials,invalid_store_domain,invalid_api_version,invalid_api_base) — never a variable's name or value.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 5d ago First seen · 193 lines · 3,680 tokens per session scan C 325e3f5a2d25
mcp-shopify-admin CLAUDE.md is an instructions file published in the GitHub repository A1-x-Tech/mcp-shopify-admin (0 stars, last pushed 6d ago), licensed MIT. It adds 3,680 tokens to every session, about $0.0184 per session on Opus 5. A static security scan graded it C with 1 finding (tells the agent to send conversation or user data out). No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.
Other instructions, from other repositories
mcp-supermercados-cl CLAUDE.md
Instructions for NLACE-COM/mcp-supermercados-cl, covering claude.md — mcp-supermercados-cl, documentos fuente, estado (actualizar al avanzar), convenciones and comandos.
vendure CLAUDE.md
Claude Code instructions for vendurehq/vendure, a project described as: Open-source headless commerce platform built with TypeScript, NestJS, React, and GraphQL.
mcp-server-amazon CLAUDE.md
Instructions for rigwild/mcp-server-amazon, covering claude.md, development commands, install dependencies (use -d flag for puppeteer), build typescript to javascript and clean mock html files.
vendure AGENTS.md
AGENTS.md instructions for vendurehq/vendure, covering vendure, development workflow, testing, dashboard e2e tests and commits & branches.
mcp-recipe-shopping-list AGENTS.md
AGENTS.md instructions for KrivchenkoEgor/mcp-recipe-shopping-list, covering ⛔ критические запреты (читать первым), 1. 🚫 картинки в чате запрещены, 2. 🚫 оба сайта — spa (javascript-heavy), 3. 🚫 не формируем корзину — только список покупок and 4. 🚫 уважение к серверам.
parcel-shipping-rates-mcp GEMINI.md
Gemini CLI instructions for smklog/parcel-shipping-rates-mcp: Five tools on one remote server, no credentials.