Plug your Shopify store into Claude and ChatGPT.
One MCP endpoint per store. Approve the scopes and your assistant reads catalog, orders and themes live, without writing a thing.
OAuth 2.1 with PKCERead-onlyFree on every plan
What it is
A remote MCP server, one per store. Every store you connect to BoostEcom gets its own endpoint, speaking Model Context Protocol over streamable HTTP. Any client that speaks MCP (Claude, ChatGPT, Claude Code, Cursor, or one you wrote yourself) can discover it, authorize against it and call its tools.
Your Shopify credentials never leave our servers. The client holds a BoostEcom token; the short-lived Shopify token the BoostEcom app delegates stays with us, encrypted at rest. Revoke the BoostEcom token and the client is out, without ever having seen a Shopify secret.
- Tools your client can call
- 31
- Scopes on the consent screen
- 12
- Calls a day on the Free plan
- 2,000
Read-only, each behind a scope you approve
Grant one, a few or all of them
The relay runs no model, so it spends no credits
A connect guide for each client
Each guide takes one client from its settings screen to your first question, in that client's own words. These are the clients we test against.
Add a custom connector and paste the URL. The client registers itself and opens the consent screen: no client id, no secret.
https://www.boostecom.app/api/mcp/v1/<STORE_ID>
Works with
Four doors. Only the dashboard writes.
Each surface reads through its own credential and its own limits. A change to your store happens in one place, behind your approval.
- MCP, from your AI clientClaude, ChatGPT, Claude Code and Cursor read the store live, over OAuth or a static key. Read-only.
- The dashboard, with @AtlasThe one place where writes happen, each behind your approval. Same store, same BoostEcom app.
- Intelligence, from your client or your codeThe Shopify store graph has its own MCP server and a read-only REST API with a bei_ key. Market data, never your store's.
- A public UCP profileWhen BoostEcom reads another store's public catalog, it presents this profile: catalog search and lookup only, no cart, no checkout, no secret.
https://www.boostecom.app/api/mcp/v1/<STORE_ID>
https://www.boostecom.app/api/mcp/intelligence
https://www.boostecom.app/.well-known/ucp-agent
You install the BoostEcom app from your Shopify admin and choose in the app what it may access. Your grant is the ceiling: we add no access of our own.
One URL. Your client finds the rest.
Each connected store gets its own MCP endpoint. An OAuth-aware client reads the discovery documents from its first refused call and walks you to the consent screen.
- OAuth 2.1 with PKCE, no client secret to keep
- Each token opens one store and is hashed at rest
- A static key for CI and headless runs
Replace STORE_ID with the id shown in store settings, under connectors.
https://www.boostecom.app/api/mcp/v1/<STORE_ID>
GET https://www.boostecom.app/.well-known/oauth-authorization-server GET https://www.boostecom.app/.well-known/oauth-protected-resource/api/mcp/v1/<STORE_ID> GET https://www.boostecom.app/api/mcp/<STORE_ID>/.well-known/oauth-protected-resource
Standard OAuth, from the first refused call
Nothing proprietary for a client to learn. Every step is a published standard, and every step is visible on the wire.
Your client calls the endpoint without a token and gets a 401 whose WWW-Authenticate header points at our discovery documents (RFC 9728).
It reads the protected-resource document, which names this origin as the authorization server.
It reads the authorization-server metadata (RFC 8414) to find the register, authorize, token and revocation endpoints.
It identifies itself with a Client ID Metadata Document, an https URL we fetch and verify, or through dynamic registration (RFC 7591). No secret is issued and PKCE S256 is mandatory.
You approve a consent screen that lists the permissions in plain words, showing only the ones your grant to the BoostEcom app can satisfy.
The client trades its one-time code for an access token that expires after 60 minutes, and a refresh token that rotates on every use.
A tool outside the grant answers 403 with the exact scope to ask for: the client re-authorizes for that one scope and retries.
Disconnect the client and it calls the revocation endpoint (RFC 7009): the token dies on our side too, not only in the client's memory.
Each token opens one store: a token issued for store A is refused on store B, and organization membership is checked again on every call. Tokens are stored as SHA-256 hashes, never in a form we could read back.
HTTP/1.1 401 Unauthorized WWW-Authenticate: Bearer realm="BoostEcom MCP", resource_metadata="https://www.boostecom.app/.well-known/oauth-protected-resource/api/mcp/v1/<STORE_ID>", scope="boostecom:store.read boostecom:catalog.read …"
{
"access_token": "<ACCESS_TOKEN>",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "<REFRESH_TOKEN>",
"scope": "boostecom:store.read boostecom:catalog.read"
}HTTP/1.1 403 Forbidden WWW-Authenticate: Bearer error="insufficient_scope", scope="boostecom:orders.read", resource_metadata="https://www.boostecom.app/.well-known/oauth-protected-resource/api/mcp/v1/<STORE_ID>"
Your assistant reads. Every write waits for you.
The relay refuses every mutation before it reaches Shopify and logs the attempt. Changes happen in the dashboard, where you approve each one.
- Mutations refused before Shopify sees them
- Every write attempt lands in your audit log
- Changes go through the dashboard approval flow
tools/call shopifyAdminGraphQL
mutation {
productUpdate(product: { id: "gid://shopify/Product/1", title: "New title" }) {
product { id }
}
}{
"isError": true,
"content": [
{
"type": "text",
"text": "Refused: this mutation is classified destructive (product/price updates, discounts, inventory, …). This connector is read-only: every write requires human approval. Run it from the BoostEcom dashboard chat, where the approval flow lives."
}
]
}31 tools, and what to ask each one
Most cover the paths an agent walks every day. One is a passthrough onto the whole Admin API read surface, with Shopify's own cost and throttle figures returned beside the data.
| Tool | Availability | What it returns | Ask it like this |
|---|---|---|---|
getStoreContextScope None | No Shopify scope gate | Plan, currency, timezone, markets, locales, themes, legal policies, catalog counts and your granted scopes, in one call. | “Where am I? Give me the store setup.” |
getShopInfoScope None | No Shopify scope gate | Store name, plan, currency, timezone and primary domain. | “What plan and currency is this store on?” |
runAuditScope read_themes · write_themes · write_theme_code | Scoped | Shop, themes and a product sample in one round trip, so the model reasons over the whole store at once. | “Give me the state of the store.” |
listProductsScope read_products · write_products | Scoped | Products, optionally filtered by status. | “Which products are still in draft?” |
getProductScope read_products · write_products | Scoped | One product by its numeric id. | “Show me every field of this product.” |
listOrdersScope read_orders · write_orders | Scoped | Recent orders, optionally filtered by status. | “Summarize the orders that are still open.” |
listPagesScope read_content · write_content | Scoped | The store's CMS pages. | “List the CMS pages. Do we have a returns policy page?” |
getMetafieldsScope None | No Shopify scope gate | The metafields of one resource, by its Admin GraphQL id, optionally filtered to one namespace. | “What custom data is attached to this product?” |
listMetaobjectDefinitionsScope None | No Shopify scope gate | Every metaobject definition: type, fields and how many entries exist. | “What structured content types does this store define?” |
listMetaobjectsScope None | No Shopify scope gate | The entries of one metaobject type, with Shopify's own pagination cursor. | “List the entries of the FAQ metaobject.” |
listThemesScope read_themes · write_themes · write_theme_code | Scoped | Every theme on the store, the published one included. | “Which theme is published right now?” |
getThemeScope read_themes · write_themes · write_theme_code | Scoped | One theme by its numeric id. | “Which theme is this, and is it the published one?” |
runShopifyQLScope read_analytics · read_reports | Scoped | A ShopifyQL table: sales, sessions, conversion or inventory, over any period you name. | “What were my sales last month?” |
introspectSchemaScope None | No Shopify scope gate | Any Admin GraphQL type, with nested input types and enums resolved inline. | “What fields does ProductInput take?” |
shopifyAdminGraphQLScope Shopify enforces | No Shopify scope gate | Any read the Admin API allows: metafields, markets, translations, inventory. Cost and throttle status come back with the data. | “Pull the metafields on my best-selling variants.” |
getStudioSectionScope None | No Shopify scope gate | One Studio section: concepts, QC or cockpit. Each call checks the caller's own Studio permission for that section. | “Which concepts are waiting on QC?” |
getStudioProductionScope None | No Shopify scope gate | The store's production board: work in flight, renders, concepts and economics. One Studio permission per block. | “What is my brand producing right now?” |
listStudioGenerationsScope None | No Shopify scope gate | Every render this store asked for, with its real status, model and artifact. Costs only with the economics permission. | “Which renders failed this week, and what did they cost?” |
getStudioPricingScope None | No Shopify scope gate | What one generation costs per composer mode, in USD, before you ask for it. No MCP tool starts a generation. | “How much does a short video cost?” |
getStoreIntelligenceScope None | No Shopify scope gate | What BoostEcom has observed about this store's domain: traffic, inferred economics, catalog, stack, ad creatives, reviews, social audience and brand. | “What does BoostEcom know about my store's traffic and stack?” |
listThemeUpdatesScope None | No Shopify scope gate | The store's themes as the BoostEcom app sees them: detected theme and version, the latest approved version, and whether an update is available. | “Is there an update for my theme?” |
getUpdateJobScope None | No Shopify scope gate | One theme update job in the BoostEcom app: status, current step, progress, error and the merge decisions by kind. | “How far along is my theme update, and did it fail?” |
listBackupsScope None | No Shopify scope gate | The store's backups, of themes and of data categories: status, date and size. Metadata only, never the backed-up content. | “When was my theme last backed up?” |
getUptimeScope None | No Shopify scope gate | The latest uptime checks of the storefront, from the BoostEcom app: status, response time and outages. | “Was my store down this week?” |
getAppEmbedStatusScope None | No Shopify scope gate | Whether the BoostEcom Web Vitals app embed is on in the published theme, or in a theme you name, with the link that turns it on. | “Is the Web Vitals embed on in my published theme?” |
getDomainHealthScope None | No Shopify scope gate | The health of the store's custom domain: registration (RDAP, expiry) and DNS resolution, with findings. | “When does my domain expire, and does its DNS resolve?” |
getActionRequestScope None | No Shopify scope gate | The status of an action the merchant was asked to confirm inside the BoostEcom app: pending, confirmed, declined, expired or failed. | “Did the backup restore I was asked to confirm go through?” |
searchDocsScope None | No Shopify scope gate | The documentation pages that cover a topic, each with its title and its link. | “How do I connect my Shopify store?” |
getDocScope None | No Shopify scope gate | The title and link of one documentation page, by slug. | “Show me the credits page in full.” |
helmListModelsScope None | No Shopify scope gate | The models of the Helm theme: section presets, block presets and page templates, each with its id, name, category and what it contains. No Shopify call. | “Which Helm section models can I start a hero from?” |
helmPlanSectionScope None | No Shopify scope gate | The template JSON a Helm section would add, built from one section model and checked against the theme's schema. Nothing is written; an unknown model or setting is refused. | “Plan a Helm hero section with my headline, without writing anything.” |
What people actually ask it
The tool list matters less than this: the assistant you already have open knows your store.
- State of the storeOne runAudit call returns the shop, its themes and a product sample together, so the model reasons over the whole store instead of stitching four requests.
- Catalog questionsWhich products are still drafts, what is out of stock, which handles collide: answered against live data, not a stale export pasted into a chat.
- Anything the Admin API readsMetafields, markets, translations, inventory: one passthrough tool, with Shopify's own cost figures returned so the model paces itself.
- Reporting where you workSummarize the week's orders in the client you already have open, without exporting customer data into a spreadsheet first.
One tool opens the whole read API
Most tools cover the paths an agent walks every day. One more is a passthrough onto the entire Shopify Admin GraphQL API, for every read no dedicated tool covers.
- The scopes you granted the BoostEcom app decide what succeeds, and Shopify enforces them on every query
- Shopify's own cost and throttle figures come back with the data, so the model paces itself
- A mutation sent through it is refused like any other write
tools/call shopifyAdminGraphQL
query {
markets(first: 5) { nodes { name handle } }
shop { metafields(first: 5) { nodes { key value } } }
}{
"data": { "markets": { … }, "shop": { … } },
"cost": { "requestedQueryCost": <n>, "actualQueryCost": <n> },
"throttleStatus": {
"maximumAvailable": <n>,
"currentlyAvailable": <n>,
"restoreRate": <n>
}
}Connected in 4 steps
The same path for every client. Only where you paste the URL changes from one client to the next.
Connect the store
Create your account and install the BoostEcom app from your Shopify admin, in one click. The access you choose in the app caps everything that follows.
Shopify grants that open tools
read_productsread_ordersread_contentread_themesread_analyticsread_reports
Paste the URL in your client
Claude and ChatGPT take it as a custom connector. Claude Code and Cursor take it in their config, then open the same consent screen.
The URL to pasteurlhttps://www.boostecom.app/api/mcp/v1/<STORE_ID>
Approve the scopes
The consent screen names each permission in plain words and offers only what you granted the BoostEcom app.
What your client asks forhttpGET https://www.boostecom.app/oauth/authorize ?response_type=code&client_id=<CLIENT_ID> &resource=https://www.boostecom.app/api/mcp/v1/<STORE_ID> &scope=boostecom:store.read boostecom:catalog.read &code_challenge=<S256>&code_challenge_method=S256
Ask about your store
Your client lists the tools your grant opened and calls them whenever a question needs live data.
What your client can list
getStoreContextgetShopInforunAuditlistProductsgetProductlistOrderslistPagesgetMetafieldslistMetaobjectDefinitionslistMetaobjectslistThemesgetThemerunShopifyQLintrospectSchemashopifyAdminGraphQLgetStudioSectiongetStudioProductionlistStudioGenerationsgetStudioPricinggetStoreIntelligencelistThemeUpdatesgetUpdateJoblistBackupsgetUptimegetAppEmbedStatusgetDomainHealthgetActionRequestsearchDocsgetDochelmListModelshelmPlanSection
12 scopes, one per family of tools
Two gates, and both must pass: the scope you approve for this client, and what you granted the BoostEcom app in Shopify. Narrow either one and the tool list narrows with it.
| Scope | What it opens | Shopify grant required |
|---|---|---|
boostecom:store.readStore identity & setupREAD | Plan, currency, timezone, primary domain, markets, locales, legal policies and the Admin schema.getShopInfo · getStoreContext · introspectSchema | Any connected store |
boostecom:catalog.readCatalogREAD | Products and their variants, including drafts and archived items.listProducts · getProduct | read_products · write_products |
boostecom:orders.readOrdersREAD | Recent orders and their status.listOrders | read_orders · write_orders |
boostecom:content.readPages & contentREAD | The storefront's CMS pages.listPages | read_content · write_content |
boostecom:metadata.readMetafields & metaobjectsREAD | Custom data attached to your resources, and the structured-content shapes your store declares. Read only.getMetafields · listMetaobjectDefinitions · listMetaobjects | Any connected store |
boostecom:themes.readThemesREAD | Themes on the store, published or not, and the audit that reads them.listThemes · getTheme · runAudit | read_themes · write_themes · write_theme_code |
boostecom:analytics.readAnalyticsREAD | ShopifyQL queries: sales, sessions, conversion and inventory over any period.runShopifyQL | read_analytics · read_reports |
boostecom:graphql.readAdmin API passthroughREAD | Any read the Admin API allows. Shopify enforces your scopes on every single query.shopifyAdminGraphQL | Any connected store |
boostecom:studio.readStudioREAD | The production floor: creative concepts, the QC queue and the economics cockpit. Each section still asks for your own Studio permission.getStudioSection · getStudioProduction · listStudioGenerations · getStudioPricing | Any connected store |
boostecom:docs.readDocumentationREAD | Find pages of the public BoostEcom documentation. Grants nothing private: docs.boostecom.app already serves them to anyone.searchDocs · getDoc · helmListModels · helmPlanSection | Any connected store |
boostecom:intelligence.readStore intelligenceREAD | What BoostEcom has observed about this store's domain: traffic, inferred economics, catalog, tech stack, ad creatives, reviews, social audience and brand. Read-only, and only for this store.getStoreIntelligence | Any connected store |
boostecom:app.readBoostEcom Shopify appREAD | What the BoostEcom app records for this store: theme updates, backups, uptime checks, the Web Vitals embed, the health of the domain and the actions the merchant was asked to confirm. Read-only, and only for this store.listThemeUpdates · getUpdateJob · listBackups · getUptime · getAppEmbedStatus · getDomainHealth · getActionRequest | Any connected store |
Tokens issued before this catalog existed carry the legacy mcp grant. It keeps the Shopify read tools it already had and never opens a BoostEcom system: Studio, store intelligence and the docs tools need a scope approved on the consent screen.
Ask about the market in the same conversation
A second, public MCP server reads the Shopify store graph: rank a category, look up a domain, find similar stores. Add it beside your store's endpoint.
- No account, no key: 60 calls a minute per IP
- A bei_ key raises it to 6,000 a minute, per organization
- Public records only
{
"mcpServers": {
"boostecom-intelligence": {
"url": "https://www.boostecom.app/api/mcp/intelligence"
}
}
}curl -s https://www.boostecom.app/api/mcp/intelligence/manifest
Against Shopify's own connector
Both pointed at the same store in one session, read-only. Shopify's connector writes and searches the shopify.dev docs. This one reads further into the store.
| BoostEcom | Shopify's connector | |
|---|---|---|
Scopes granted Measured on the same store through currentAppInstallation. | 183 | 58 |
Scopes the other lacks The official set is a strict subset: it holds nothing ours does not. | 125 | 0 |
Fields on one store-info call getShopInfo against get-shop-info, same store. | 48 | 8 |
Pixels and script tags Tracking and consent surfaces. The official connector has no pixel scope at all. | ✓ | — |
Payouts, disputes, bank accounts The Shopify Payments read surface. | ✓ | — |
GDPR, audit events, consent Privacy settings, audit log, customer events. | ✓ | — |
Storefront and Customer Account APIs The unauthenticated_* and customer_* scope families. | ✓ | — |
Cart Transform and Shopify Functions Bundles, delivery and payment customizations, discount allocators. | ✓ | — |
ShopifyQL analytics Same query, same result: ours runs through the GraphQL passthrough. | ✓ | ✓ |
Schema introspection __type and __schema resolve through the passthrough. | ✓ | ✓ |
Cost and throttle returned to the model Shopify's own figures, so an agent paces itself instead of guessing. | ✓ | — |
Writes to the store Ours is read-only: changes go through the dashboard approval flow. | — | ✓ |
shopify.dev docs search The official connector ships a documentation search, ours does not. | — | ✓ |
Measured on a store connected through a merchant's Custom App: a store that grants fewer scopes gets fewer. With the BoostEcom app, the ceiling is what you grant the app.
Free on every plan, capped against abuse
The relay forwards a Shopify API call and runs no model, so it spends no credits. Limits count per organization: stores in one organization share a budget.
| Free | Pro | Max 5x | Max 20x | |
|---|---|---|---|---|
Calls per minute | 50 | 500 | 1,000 | 5,000 |
Calls per day | 2,000 | 50,000 | 100,000 | No daily cap |
Custom plans run uncapped. A refused call names the plan, the limit it hit and what to do next.
What it does not do
Read these before you connect a store. Each one is deliberate.
- It does not write. Every mutation is refused and logged. A change to your store goes through the dashboard, where you approve it.
- It stays inside what you granted the app. A tool your Shopify grant cannot satisfy is never registered, so your client never sees it.
- A static key stops at 15 tools. A key names a store, never a person. Studio, store intelligence, the BoostEcom app's records and the docs tools need an OAuth sign-in.
- One request, 30 seconds. A tool call that runs longer is cut off. Long work belongs in a dashboard workflow, not in a tool call.
- No API or SDK of our own. The supported surfaces are this endpoint, the Intelligence MCP server and the Intelligence REST API. The GraphQL you reach is Shopify's, through the passthrough.
Questions people ask
Ask @Atlas below, or talk to a human: both land in the same thread.
Which AI clients can connect?Clients
Can my assistant change my store through it?Safety
Does the AI client ever see my Shopify token?Security
What does it cost?Pricing
How do I limit what an agent can reach?Scopes
What happens when a tool needs a scope I did not grant?Consent
Is there a REST API, a GraphQL API or an SDK?Surface
Point it at your store and ask.
Describe what you want your agent to read, and @Atlas tells you which tool and which scope it needs.