Shopify Admin GraphQL Gateway MCP
Provides a secure GraphQL gateway to the Shopify Admin API, allowing read-only queries and controlled mutations with a preview-and-confirm workflow. Supports product, inventory, order, customer, discount, file, and metaobject operations, plus product count queries.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Shopify Admin GraphQL Gateway MCPShow me the 5 most recent orders"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Shopify Admin GraphQL Gateway MCP
A security-focused MCP stdio server for a restricted LibreChat agent. It obtains short-lived Shopify Admin API tokens internally, permits read-only GraphQL by default, and puts mutations behind a preview plus one-time confirmation flow.
The gateway does not search documentation itself. Configure Shopify's separate Dev MCP beside it so the agent can search current docs and introspect the selected Admin API schema before sending a query to this gateway:
LibreChat agent
├─ Shopify Dev MCP (documentation and schema; no store credentials)
└─ Shopify Admin Gateway (fixed store and API version; credentials stay server-side)Security model
The store origin is always
https://<shop>.myshopify.com. The model cannot provide a domain, URL, API version, client credential, or access token.Shopify client credentials and cached access tokens exist only in the gateway process. They are never tool inputs or outputs.
shopify_admin_graphql_queryparses the GraphQL document and only accepts a selectedqueryoperation. It rejects mutations and subscriptions.Tool schemas are strict. There is no generic HTTP, REST, shell, filesystem, or environment-reading tool.
Token scopes must exactly match
SHOPIFY_ALLOWED_SCOPES. This prevents a broader app token from silently widening the gateway's authority.Mutation execution defaults off. A preview is bound server-side to the authenticated LibreChat user, normalized query hash, canonical variables hash, configured store, and expiry. Tokens are HMAC-authenticated, one-time, and held only in memory. LibreChat's native human-in-the-loop policy requires approval before it invokes the execute tool.
Audit logs contain operation/resource identifiers and outcome, not mutation variables, secrets, or full customer data.
Cursor pagination is opt-in, bounded by page size, page count, and an overall timeout. Rate-limit extensions are preserved.
Product counts use
productsCount; they are never inferred from a paginated product connection.
The process never loads .env or /opt/data/.env. Supply environment variables through the process supervisor or container orchestrator.
Related MCP server: Shopify MCP
Shopify app setup
The OAuth client-credentials grant works only for an app developed by the same Shopify organization that owns the store and installed on that store. Public and externally owned custom apps must use a different OAuth flow; this gateway intentionally does not implement those flows.
In Shopify's Dev Dashboard, create an app owned by your organization.
Configure only the Admin API scopes the gateway needs.
Release/install that app on the target store.
Copy the app's client ID and client secret into the server-side deployment environment.
For the read-only example configuration, grant exactly:
read_products,read_inventory,read_ordersThe token endpoint's returned scope set must exactly match SHOPIFY_ALLOWED_SCOPES. If you later enable a mutation, add only its documented write scope to both the app and the allowlist. Preview uses an exact-name catalog and rejects every mutation name it does not recognize; it does not infer scope from a broad prefix. The initial catalog covers productCreate, productUpdate, productDelete, productSet, inventoryAdjustQuantities, inventorySetQuantities, orderUpdate, draftOrderCreate, customerUpdate, discountCodeBasicCreate, fileCreate, and metaobjectCreate. Verify each catalog result against Shopify Dev MCP/current documentation whenever the API version changes.
Environment variables
Variable | Required/default | Purpose |
| Required | Accepts |
| Required | Server-side Shopify app client ID. |
| Required | Server-side Shopify app secret. Never expose it to LibreChat's model or Code Interpreter. |
|
| Fixed quarterly Admin API version. Must use |
| Required | Comma-separated exact scope allowlist. |
|
| Mutation execution kill switch. Preview remains available. |
|
| Refresh before token expiry. |
|
| Overall request/pagination deadline, from 1–120 seconds. |
|
| Maximum |
|
| Maximum pages in one tool call, capped at 100. |
|
| Mutation confirmation lifetime, from 30–900 seconds. |
| Empty | Trusted authenticated user identity. Required for mutation preview/execution. |
| Empty | Trusted active-agent identity. Required for mutation preview/execution and recorded in audits. |
See .env.example. It is a template only; the application does not load it.
Local development
Node.js 20 or newer is required. Every build dependency is pinned and the lockfile fixes the transitive dependency graph. The published CLI is a single bundled executable with no runtime package dependencies.
npm ci --ignore-scripts
npm run checkFor a local stdio run, export the variables in your shell and run:
npm run build
npm startDo not type protocol messages into the stdio process manually. Use an MCP client or Inspector. Logs go only to stderr because stdout is reserved for MCP.
Tools
shopify_admin_graphql_query
Required input: query. Optional inputs: variables, operationName, and bounded pagination.
For automatic pagination, the query must use variable-backed first and after arguments and select pageInfo { hasNextPage endCursor }. Tell the gateway where the connection appears below data:
{
"query": "query Products($first: Int!, $after: String) { products(first: $first, after: $after) { nodes { id title } pageInfo { hasNextPage endCursor } } }",
"operationName": "Products",
"variables": {},
"pagination": {
"connectionPath": ["products"],
"pageSize": 50,
"maxPages": 3
}
}The response includes data, errors, extensions, httpStatus, apiVersion, operationName, and Shopify's request ID when present. Preserving httpStatus ensures a non-2xx GraphQL envelope cannot be audited as a successful mutation. Paginated results also include pagesFetched, partial, limitReached, hasNextPage, and rate-limit snapshots. The gateway concatenates nodes and/or edges at the specified connection path.
Do not paginate for counts. Use Shopify count fields or shopify_admin_product_counts.
shopify_admin_product_counts
Runs five aliased productsCount(limit: null, ...) fields for total, active, draft, archived, and unlisted products. Explicit limit: null avoids Shopify's default 10,000-count cap. It returns each count and Shopify's precision.
Mutation approval flow
The agent searches Shopify Dev MCP and prepares exactly one top-level mutation.
Call
shopify_admin_graphql_preview_mutation. Nothing is sent to Shopify.The user reviews the mutation name, complete requested variables, required scope catalog result, resource IDs, and change summary.
Call
shopify_admin_graphql_execute_mutationwith only the confirmation token. LibreChat interrupts the agent before invoking the tool and shows its native approve/reject UI.After explicit approval, the gateway checks the kill switch, authenticated user/agent, token MAC, expiry, store binding, query hash, variables hash, and one-time preview record before sending the stored mutation.
Direct execution is impossible because the execute tool accepts no query or variables. A token is consumed before execution and cannot be replayed, including after a failed Shopify request.
The supplied LibreChat configuration enables its durable human-in-the-loop toolApproval policy, allows the read/preview tools, and places only shopify_admin_graphql_execute_mutation on the ask list. It uses the exact normalized runtime name LibreChat assigns to that MCP tool. In @librechat/agents 3.4.x, an explicit ask rule wins over allow and every mode except deny, including bypass. MongoDB checkpoints allow a paused approval to resume. Pin and retest LibreChat before enabling mutations or upgrading it.
LibreChat configuration
The complete configuration is in config/librechat.yaml. The gateway block is:
mcpServers:
shopify-admin-gateway:
type: stdio
command: npx
args:
- -y
- 'shopify-admin-graphql-gateway-mcp@1.0.0'
env:
SHOPIFY_STORE_DOMAIN: '${SHOPIFY_STORE_DOMAIN}'
SHOPIFY_CLIENT_ID: '${SHOPIFY_CLIENT_ID}'
SHOPIFY_CLIENT_SECRET: '${SHOPIFY_CLIENT_SECRET}'
SHOPIFY_API_VERSION: '${SHOPIFY_API_VERSION}'
SHOPIFY_ALLOWED_SCOPES: '${SHOPIFY_ALLOWED_SCOPES}'
SHOPIFY_ENABLE_MUTATIONS: '${SHOPIFY_ENABLE_MUTATIONS}'
SHOPIFY_TOKEN_REFRESH_BUFFER_SECONDS: '${SHOPIFY_TOKEN_REFRESH_BUFFER_SECONDS}'
SHOPIFY_LIBRECHAT_USER_ID: '{{LIBRECHAT_USER_ID}}'
SHOPIFY_LIBRECHAT_AGENT_ID: '${SHOPIFY_LIBRECHAT_AGENT_ID}'
chatMenu: false
timeout: 60000
initTimeout: 30000
serverInstructions: |
Use Shopify documentation tools first when available.
Use read-only Shopify queries by default.
Never execute mutations without preview and explicit confirmation.
Never expose credentials or tokens.The companion Shopify Dev MCP is pinned in the supplied configuration as @shopify/dev-mcp@1.14.4. It has no store credentials and cannot execute against the store.
LibreChat exposes MCP tools to its policy layer as <tool>_mcp_<normalized-server>. Therefore the protected execute name is shopify_admin_graphql_execute_mutation_mcp_shopify-admin-gateway; a policy string in the form mcp:<server>:<tool> does not match. The supplied exact ask rule enforces the correct name.
{{LIBRECHAT_USER_ID}} causes LibreChat to create a user-scoped stdio process, allowing that user's in-memory preview record to remain available during approval. Set SHOPIFY_LIBRECHAT_AGENT_ID to the immutable ID of the one restricted agent receiving these tools, and enforce that assignment with LibreChat ACLs. Treat both generated values as trusted identity assertions: users and models must not be able to edit the MCP definition. Mutations fail closed if either identity is absent or unresolved.
Keep chatMenu: false, assign both MCP servers only to the restricted agent through LibreChat's role/resource ACLs, prevent normal users from adding arbitrary MCP servers, and keep Code Interpreter credentials/filesystem separate from the LibreChat API process.
Publish and install with npx
The repository is publish-ready under the currently available unscoped name shopify-admin-graphql-gateway-mcp. Publishing is deliberately not automated because it changes external state:
npm login
npm run check
npm publishAn unscoped npm package is public. The package contains executable code and documentation only—never Shopify credentials—but review your organization's policy before publishing. Its UNLICENSED declaration is intentional until the owner chooses a source license; make that choice explicitly before a public release. For a private package, first change name in package.json to a scope your organization owns, such as @your-company/shopify-admin-gateway, set publishConfig.access to restricted, update the exact package name in config/librechat.yaml, and configure registry authentication only in the LibreChat API container.
The prepack lifecycle rebuilds and type-checks the package. npm run package:check creates the real tarball, verifies that source, tests, configuration, and environment files are excluded, installs it without lifecycle scripts or network dependencies, and executes the installed CLI through its generated npm binary.
After publishing, the supplied configuration needs no custom LibreChat image: npx -y shopify-admin-graphql-gateway-mcp@1.0.0 downloads and runs the exact package version inside the LibreChat API process. Keep the package version pinned and review upgrades before changing it. This convenience depends on npm registry availability and gives the credential-holding LibreChat API container outbound registry access; use a controlled registry/cache or the preinstalled Docker alternative below when production policy requires a smaller supply-chain surface.
Docker deployment
Build the pinned, non-root runtime image:
docker build -t shopify-admin-gateway:1.0.0 .Docker remains an alternative for environments that do not permit runtime npm downloads. Because stdio MCP servers are child processes, the gateway must be present inside the LibreChat API container that launches it. Do not mount the Docker socket or a host source directory. In your controlled LibreChat API Dockerfile, use this repository's build stage and copy the immutable runtime tree into /app/shopify-admin-gateway, then change the gateway MCP command from npx back to node /app/shopify-admin-gateway/dist/index.js:
FROM shopify-admin-gateway:1.0.0 AS shopify_gateway
# Replace this line with your pinned LibreChat API image.
FROM your-pinned-librechat-api-image
USER root
COPY --from=shopify_gateway --chown=node:node /app/shopify-admin-gateway /app/shopify-admin-gateway
USER nodeInject Shopify variables through your secret manager/orchestrator into the LibreChat API container. Do not bake them into either image, place them in librechat.yaml, mount a host .env, or expose them to the Code Interpreter container.
Read-only validation
Start with SHOPIFY_ENABLE_MUTATIONS=false, then verify:
shopify_admin_product_countsreturns plausible values and precision.A small query such as
query ShopName { shop { name } }succeeds.A mutation sent to
shopify_admin_graphql_queryreturnsMUTATION_REJECTED.Mutation preview returns a token but execute returns
MUTATIONS_DISABLED.Logs and tool responses contain neither the client secret nor the access token.
Run the automated suite with npm test. It covers token acquisition/caching/refresh, invalid credentials/domain, query responses/errors, mutation rejection/preview/confirmation/execution, scope enforcement, product statuses, pagination limits, rate-limit retry/preservation, and secret redaction.
Audit logs
Each mutation attempt that passes confirmation validation writes one JSON line to stderr:
{"level":"audit","event":"shopify_mutation","timestamp":"2026-08-07T16:00:00.000Z","userId":"...","agentId":"...","operationName":"UpdateProduct","mutationName":"productUpdate","resourceIds":["gid://shopify/Product/123"],"success":true}Send stderr to your centralized log collector with access controls and retention appropriate for operational audit data. Query payloads, mutation variables, response bodies, secrets, and customer records are deliberately excluded.
Security limitations
Scope control is the primary authorization boundary. A valid read query can access any field allowed by the app's scopes; this version does not implement a per-field or per-resource policy engine.
read_ordersand similar scopes can expose personal data. Give the LibreChat agent only the scopes and audience it genuinely needs, and apply data retention controls to chat histories.Stdio MCP has no standard end-user authentication of its own. Mutation identity relies on LibreChat's trusted user-scoped environment substitution and locked administrator configuration.
A confirmation token proves preview continuity, not human intent by itself. Human intent is enforced by LibreChat's native HITL
askrule before the MCP call. Do not expose the mutation execute tool through a host that lacks an equivalent approval boundary.Confirmation state and Shopify tokens are in memory. A restart safely invalidates confirmations and causes a fresh Shopify token exchange.
Required scopes come from a deliberately small exact-mutation-name catalog; unsupported names fail closed. Verify catalog entries through Shopify Dev MCP/current Shopify documentation whenever the API version changes.
Automatic pagination supports one explicitly identified connection and merges its
nodes/edges. Complex multi-connection queries should be split into smaller operations.Rate-limit responses can still occur. Read queries retry one HTTP 429 within the total timeout; mutations are never automatically retried because doing so could duplicate a write.
This version intentionally has no arbitrary REST facility. Add a narrowly scoped REST operation only for a documented GraphQL gap.
References
Available Tools
4 toolsshopify_admin_graphql_execute_mutationExecute confirmed Shopify Admin GraphQL mutationADestructive
Executes a previously previewed mutation using its one-time confirmation token. Disabled unless SHOPIFY_ENABLE_MUTATIONS=true.
| Name | Required | Description | Default |
|---|---|---|---|
| confirmationToken | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the mutation behavior is known. The description adds useful context about the one-time token and environment gating, but does not elaborate on side effects or error behavior beyond what annotations imply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences that front-load the core purpose and immediately follow with the critical prerequisite. Every part is necessary and no irrelevant details are included.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the single parameter, sibling tools, and annotations, the description covers the essential workflow and gating requirement. It does not explain response payloads, but this is acceptable given the execution-oriented nature and lack of output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema only provides format constraints for confirmationToken, but the description explains its meaning as a one-time token from a previously previewed mutation. This adds semantic clarity that compensates for the 0% schema description coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb-resource pair: 'Executes a previously previewed mutation' and identifies the one-time confirmation token as the key input. This clearly distinguishes it from the sibling preview mutation and query tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly states that this tool is for executing a mutation that was already previewed, implying that preview_mutation should be used first. It also mentions the SHOPIFY_ENABLE_MUTATIONS=true prerequisite, giving clear context for when the tool is available.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
shopify_admin_graphql_preview_mutationPreview Shopify Admin GraphQL mutationA
Validates but does not execute exactly one Shopify mutation. Returns the variables, estimated scopes, affected resource IDs, change summary, and a short-lived user-bound confirmation token.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| variables | No | ||
| operationName | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states the key non-execution behavior and lists the output (variables, scopes, IDs, change summary, confirmation token). This goes beyond a simple 'validates' by explaining what the user can expect, though it omits details like error handling or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, tightly worded sentence. It front-loads the most critical information (validates, does not execute) and lists the key return values efficiently. There is no wasted verbiage.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity and absence of output schema or annotations, the description covers the essential aspects: what it does, what it returns, and the confirmation token. It does not explain how the token should be used for a subsequent execution, but that is outside the immediate scope of a preview tool. Overall, it provides enough context for an agent to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has zero description coverage for its three parameters. The description does not explain the query, variables, or operationName parameters beyond the tool's overall purpose. It does not add syntax, format, or usage details for these inputs, leaving the agent to infer from the parameter names alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool validates but does not execute a Shopify mutation, using a specific verb ('validates') and resource ('Shopify mutation'). It also differentiates from the sibling execute_mutation by explicitly noting it does not execute, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool: when you need to validate or preview a mutation without executing it. The contrast with execute_mutation is implicit rather than explicit, but the context is clear enough that an agent would know to use this for dry-run validation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
shopify_admin_graphql_queryShopify Admin GraphQL queryA
Executes one read-only Shopify Admin GraphQL query against the configured store. The store and API version cannot be overridden. Optional bounded cursor pagination requires explicit connection metadata.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | A Shopify Admin GraphQL operation. URLs and credentials are not accepted. | |
| variables | No | Optional GraphQL variables as a JSON object. | |
| pagination | No | ||
| operationName | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that the operation is read-only, cannot override the store/API version, and that pagination is bounded and requires explicit connection metadata. These are meaningful behavioral constraints. However, it omits response format, error handling, and authentication expectations, which would have made it more transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action and scope. Every sentence provides useful information: the first states what and how, the second adds limitations and pagination requirements. No fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (4 parameters, nested objects, no output schema) and lack of annotations, the description covers the key constraints: read-only, single query, store/API fixed, pagination boundary. It falls slightly short by not mentioning expected return shape or error behavior, but for a raw GraphQL execution tool the most critical contexts are addressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 50%, so the description must compensate. It explicitly associates 'query' with the GraphQL operation and adds the crucial constraint that pagination requires explicit connection metadata. However, it does not clarify the 'variables' or 'operationName' parameters, leaving them to the schema. Thus it adds some value but does not fully compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Executes'), a clear resource ('Shopify Admin GraphQL query'), and a key scope ('read-only', 'against the configured store'). It clearly distinguishes itself from sibling mutation tools by emphasizing read-only, and from product_counts by being a general query tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: it is read-only, executes a single query, and the store/API version cannot be overridden. While it doesn't explicitly name alternative tools, the read-only label implicitly tells the agent not to use this for mutations, and the mention of 'one query' sets expectations. No exclusions are stated, but the context is useful.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
shopify_admin_product_countsShopify product counts by statusA
Uses productsCount—not paginated products—to return total, active, draft, archived, and unlisted product counts.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the underlying method (productsCount) and the output categories, which helps. However, with no annotations, it does not mention whether this is read-only, any rate limits, or how counts are calculated. It leaves some behavioral aspects unstated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that efficiently conveys the method and the list of counts returned. It contains no filler and is easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, no-parameter tool, the description is complete: it specifies what it does, how it does it, and what the output includes. The absence of an output schema is offset by the explicit enumeration of counts, and no further context seems necessary.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the schema reflects that. Baseline for zero parameters is 4; the description does not need to add parameter semantics, and it doesn't, which is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: returning total, active, draft, archived, and unlisted product counts using the productsCount method. It explicitly distinguishes itself from paginated product queries and from generic GraphQL operations, making it unique among siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Uses productsCount—not paginated products' implies that for product count needs, this tool should be used instead of paginating through products via GraphQL. This gives clear context, though it stops short of explicitly naming when-not-to-use or listing alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
4 tool updates
v1.0.0- First observed
shopify_admin_graphql_execute_mutation - First observed
shopify_admin_graphql_preview_mutation - First observed
shopify_admin_graphql_query - First observed
shopify_admin_product_counts
TDQS
Each tool has a clearly distinct purpose: product counts, read-only queries, mutation preview, and mutation execution. There is no overlap or ambiguity between them.
All tools share the consistent 'shopify_admin' prefix and use snake_case. The three GraphQL tools follow a clear 'graphql_<action>' pattern, but 'product_counts' deviates as a noun phrase rather than a verb_noun structure.
With only 4 tools, the server is tightly scoped to its purpose as a GraphQL gateway. Each tool is necessary and covers a distinct aspect of the interaction model.
The set provides complete lifecycle coverage for the gateway domain: read operations via query, mutation handling via preview and execute, and a convenience count tool. No obvious missing operations within the stated scope.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
MCP server for mandates, delegation, policy-gated execution, credential grants, and audit.
111MCP server for secureFlows: token-free URL builders and integration-linting tools for AI agents.
The Grafbase MCP server sits in front of a GraphQL API and exposes an MCP protocol-compliant interface that allows AI agents and LLMs to explore and query GraphQL APIs using natural language. It provides tools to search schemas, introspect types and fields, and execute GraphQL queries while minimizing context bloat by returning only relevant schema subsets, with built-in support for authentication, authorization, and configurable access control.
Guarded MCP server for agent-readable business truth, provenance, readiness, and discovery.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceProduction-grade MCP server for the Shopify Admin GraphQL API, exposing typed tools for AI agents to manage products, orders, customers, and more.31MIT
- AlicenseNot gradedqualityBmaintenanceA read-only MCP server that exposes the full Shopify Admin GraphQL API through 6 universal tools, with multi-store support and mutation rejection at the parser level for safety.MIT
- FlicenseNot gradedqualityBmaintenanceEnables management of Shopify store via GraphQL, including products, orders, inventory, and discounts with security features like preview mode and write protection.-
- AlicenseNot gradedqualityBmaintenanceSafe-write Shopify operations MCP server with plan-before-execute writes, out-of-band approval, and tamper-evident audit trail.71MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/samson10504/shopify-admin-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server