Most commerce AI demos are a chat box over a product catalogue. The useful version connects an agent to the systems your operations team already uses, through a typed tool interface with real permissions. That is what MCP is for.
The AI demo everyone has seen is a chat widget that recommends products. It is easy to build, it impresses in a meeting, and it changes almost nothing operationally — because product discovery was rarely the bottleneck.
The bottleneck is the queue of questions your operations team answers by hand every day. Where is this order. Why was this line short-shipped. What is this account’s available credit. When is the Henderson range back in stock. Each requires looking across the storefront, the ERP and the carrier — which is exactly the kind of multi-system lookup an agent is good at, provided it can reach those systems safely.
What MCP actually gives you
The Model Context Protocol is a standard way to expose tools and data to an AI model. Rather than embedding system access inside a bespoke prompt, you publish a server that declares typed tools — each with a schema, a description and an implementation — and the model calls them.
The advantage is architectural rather than intellectual. Your integration is a normal service with types, tests, logging and access control. It is reviewable. It can be denied permissions. And the same server works with any MCP-capable client, so you are not rebuilding the integration per assistant.
Architecture for an MCP server over commerce operations. An operations user or a customer service agent interfaces with an MCP-capable client. The client calls a typed tool on the MCP server. The server enforces an authorisation layer scoped to the caller, applies rate limits, and calls downstream systems: the Shopify Admin API for orders, NetSuite for inventory and credit, and the carrier API for tracking. Every call is written to an audit log. Write operations are separated behind an explicit approval step.
Design tools around questions, not endpoints
The most common mistake is mirroring your REST API as tools — getOrder, getCustomer, getInventoryItem — and expecting the model to compose them. It can, but it takes several round trips and each one is a chance to go wrong.
Design tools around the questions people actually ask. One tool that answers "what is the status of this order, including fulfilment and tracking" is better than four that must be chained to get there.
server.tool(
'get_order_status',
{
description:
'Full status for a single order: line items, fulfilment state, ' +
'tracking numbers, and any short-shipped lines with the reason. ' +
'Use this for any "where is my order" question. Read-only.',
inputSchema: {
type: 'object',
properties: {
orderNumber: { type: 'string', description: 'Order number, e.g. "88214"' },
accountId: { type: 'string', description: 'Company account id — scopes the lookup' }
},
required: ['orderNumber', 'accountId']
}
},
async ({ orderNumber, accountId }, { caller }) => {
// Authorisation happens here, in code — never in the prompt.
await assertCanReadAccount(caller, accountId);
const [order, fulfilments, erpLines] = await Promise.all([
shopify.order(orderNumber, accountId),
shopify.fulfilments(orderNumber),
netsuite.salesOrderLines(orderNumber)
]);
if (!order) {
return { content: [{ type: 'text', text: `No order ${orderNumber} on this account.` }] };
}
audit.record({ caller, tool: 'get_order_status', orderNumber, accountId });
return {
content: [{
type: 'text',
text: formatOrderStatus({ order, fulfilments, erpLines })
}]
};
}
);Separate reads from writes, permanently
Read tools are low-risk and where nearly all the value is in the first phase. Write tools — cancel an order, issue a refund, adjust stock, release a credit hold — change state in systems that feed your accounts.
Keep them on separate servers with separate credentials, and put every write behind an explicit human approval that shows exactly what is about to happen. An agent that drafts a refund for a human to approve is genuinely useful and entirely safe. An agent that issues refunds autonomously is a liability nobody asked you to accept.
Four operational results from a read-only MCP deployment over commerce and ERP systems. Order status questions resolved without a human: about 70 percent. Median time to answer falling from four minutes to under thirty seconds. Zero write operations executed without approval. One hundred percent of tool calls captured in an audit log.
- ~70%
- status questions resolved without a human
- < 30s
- median time to answer, from ~4 min
- 0
- unapproved write operations
- 100%
- of tool calls audited
Where to start
Instrument the questions
Spend two weeks logging what operations and support are actually asked. The top five will account for most of the volume, and they are rarely what leadership expects.
Build read-only tools for the top three
Task-shaped, not endpoint-shaped. Ship to a small internal group before anyone external sees it.
Measure deflection, not sentiment
How many of those questions never reached a human? That is the number that justifies phase two.
Add writes last, gated
Draft-and-approve only. The approval UI is part of the feature, not an afterthought.
Key takeaways
- The value is in operational lookups across systems, not in another product-recommendation chat box.
- MCP makes the integration a normal, reviewable service with types, tests and access control.
- Design tools around the questions people ask, not around your REST endpoints.
- Enforce scope in code against an identity the caller cannot change — prompts are not a security boundary.
- Ship read-only first, gate every write behind human approval, and fix your data before layering AI over it.
360 Expert Solutions
E-commerce & ERP Integration Team
We build and scale B2B and DTC commerce on Shopify Plus, BigCommerce and WooCommerce, wired into NetSuite and Oracle. These articles are written by the engineers and architects who deliver those projects.
Building something like this?
We architect B2B commerce and ERP integrations end to end.