ecommerce-mcp
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., "@ecommerce-mcpget order ORD-001"
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.
ecommerce-mcp
MCP server for commerce-operations self-service. Lets an AI agent look up order details, search orders, and process refunds (with manager-approval escalation) without needing developer or SQL access.
Endpoint: https://mcp.chavanpatil.com/mcp
The server is already hosted. Point an MCP client at the endpoint above and it will discover and call the tools below.
Tools at a glance
Tool | Purpose | Key inputs |
| Full order details, plus payment status, customer risk score, carrier status, order age, and refund eligibility |
|
| Filtered, paginated order search, newest first | optional filters, |
| Auto-refund when the order meets the policy, otherwise create a manager-approval escalation |
|
| Durable before/after trail of every refund/escalation action for an order |
|
Detailed docs for each tool below.
Related MCP server: MCP E-Commerce Agent
Connecting an agent harness
Any MCP client that supports Streamable HTTP can connect. The flow is the same across harnesses (verified with oh-my-pi and Kimi Code):
Open the harness and run its add-MCP-server command (e.g.
/mcp addon oh-my-pi or Kimi Code).Give the server a name, e.g.
ecommerce-mcp.Enter the endpoint URL:
https://mcp.chavanpatil.com/mcp.The harness connects, detects that no authentication is required, and reads the available tools automatically.
Then ask the agent to use the tools, e.g.:
Use the ecommerce-mcp tools to look up order ORD-001 and summarize it.
MCP Tools
All tools return structured JSON (a JSON string in the MCP text content block). Tool results are the parsed JSON; never formatted prose.
Conventions
Null contract: fields are always present. When there is no value (e.g.
tracking,notes), they arenull— never omitted.Errors: every error response is
{ "ok": false, "message": "..." }with the MCPisErrorflag set totrue. On successisErroris unset.Unknown parameters: unrecognized arguments are silently ignored (never an error).
Sort order:
search_ordersresults are sorted bycreateddescending, withiddescending as a tiebreaker — the sort is deterministic and stable for pagination.IDs: order IDs look like
ORD-001(^ORD-\d{3}$); refund IDsREF-<hex>and escalation IDsESC-<hex>are generated per action.
Rate limiting
The MCP endpoint is public, so POST /mcp is rate-limited per client IP to protect against abuse and runaway agent loops.
Default: 300 requests per minute (
RATE_LIMIT_MAX,RATE_LIMIT_WINDOW_MSms).Over the limit returns HTTP 429 with a
Retry-Afterheader and a JSON-RPC error body.Configure via environment variables (e.g. inline
RATE_LIMIT_MAX=120 npm start, orEnvironment=RATE_LIMIT_MAX=120in a systemd unit).GET /healthis intentionally not rate-limited (readiness polling).
get_order(orderId)
Look up a single order by ID.
Param | Type | Required | Notes |
| string | yes | e.g. |
Response — a single order object:
Field | Type |
| string |
| string |
| string |
| string — |
| array of |
| number |
| string (YYYY-MM-DD) |
| string | null |
| string | null |
Example request → response:
{ "orderId": "ORD-004" }{
"id": "ORD-004",
"customer": "Dave Wilson",
"email": "dave@example.com",
"status": "pending",
"items": [{ "name": "Laptop Stand", "qty": 1, "price": 44.99 }],
"total": 44.99,
"created": "2026-07-10",
"tracking": null,
"notes": "Awaiting payment"
}Error example — get_order({ "orderId": "ORD-999" }):
{ "ok": false, "message": "Order ORD-999 not found." }search_orders(filters)
Search orders, newest first. All filters are optional and combined with AND.
Param | Type | Required | Notes |
| string | no | enum: |
| string | no | substring match |
| string | no | substring match |
| string | no |
|
| string | no |
|
| number | no | 1–10, default 10 (silently clamped) |
| number | no | default 0, for pagination |
Response — a JSON array of order objects (list view: no items/notes):
Field | Type |
| string |
| string |
| string |
| string |
| number |
| string |
| string | null |
Example — page 2 of shipped orders:
{ "status": "shipped", "limit": 2, "offset": 2 }[]No matches returns an empty array (not an error).
refund_order(orderId, reason)
Process a refund request against the client's refund policy. Idempotent: retries never issue a duplicate refund or a duplicate escalation.
Param | Type | Required | Notes |
| string | yes | e.g. |
| string | yes | non-empty; recorded in the audit log |
The order is checked against the refund policy automatically. A refund is issued immediately only when all of these hold:
amount ≤ $150
amount ≤ the paid amount (payment captured as
paid)order created within the last 30 days
customer risk score below 70
the carrier exception is verified (
carrier_statusisexception)no refund already exists for the order
Otherwise the request is flagged for manager approval (an escalation is created) with the failing conditions listed as reasons.
Response — mode is one of:
Field | Type | Notes |
| boolean | always |
| string |
|
| string | only for |
| number | only for |
| string | only for |
| string[] | only for |
| string | only for |
| object | only for |
Example — eligible order refunded automatically:
{ "orderId": "ORD-016", "reason": "Damaged on delivery; carrier exception confirmed" }{
"ok": true,
"mode": "automatic",
"orderId": "ORD-016",
"refundId": "REF-3f9a1c2d",
"amount": 49.99,
"refundedAt": "2026-07-31T14:02:11.000Z",
"message": "Refund issued automatically."
}Example — order too old, escalated to a manager:
{ "orderId": "ORD-017", "reason": "Customer requests refund" }{
"ok": true,
"mode": "escalated",
"orderId": "ORD-017",
"escalationId": "ESC-7b4e209a",
"status": "pending_approval",
"reasons": ["Order is older than the 30-day window", "Carrier exception is not verified"],
"message": "Refund requires manager approval."
}Re-running refund_order on the same order returns the existing outcome (mode: "already_refunded" or the same escalation) instead of creating a second record.
get_audit_log(orderId)
Return the durable audit trail for an order — every refund/escalation action with before/after snapshots.
Param | Type | Required | Notes |
| string | yes | e.g. |
Response — a JSON array of audit entries, newest first:
Field | Type |
| string (ISO timestamp) |
| string |
| string — |
| string |
| string |
| JSON string — payment snapshot before the action |
| JSON string — outcome snapshot (e.g. |
| string — |
Example — after refunding ORD-016:
{ "orderId": "ORD-016" }[
{
"ts": "2026-07-31T14:02:11.000Z",
"orderId": "ORD-016",
"action": "refund.automatic",
"actor": "ops_agent",
"reason": "Damaged on delivery; carrier exception confirmed",
"before": "{\"status\":\"paid\",\"amount\":49.99,\"method\":\"credit_card\"}",
"after": "{\"paymentStatus\":\"refunded\",\"refundId\":\"REF-3f9a1c2d\",\"amount\":49.99}",
"outcome": "refunded"
}
]Demo order map
The seed ships several orders that exercise each refund outcome, three per scenario. Use a fresh order each time you want to re-demo a path (no reset needed).
Scenario | Orders |
|
Auto-eligible |
|
|
Over the $150 auto-refund limit |
|
|
Amount exceeds the paid amount |
|
|
Older than 30 days |
|
|
High-risk customer |
|
|
Carrier exception not verified |
|
|
Already refunded |
|
|
Each escalation order fails exactly one rule, so reasons contains a single entry. See DATA.md for the schema, seed rationale, and why certain records look inconsistent.
All data is synthetic. The server is exposed over Streamable HTTP (JSON-RPC POST /mcp).
License
ISC
This server cannot be installed
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 Servers
- AlicenseNot gradedqualityBmaintenanceAI customer support MCP server with order status lookup and RAG-powered knowledge base search for e-commerce stores.1MIT
- FlicenseNot gradedqualityCmaintenanceA proof of concept MCP server that gives AI agents business context for e-commerce operations including orders, inventory, logistics, returns, claims, and payments.
- FlicenseNot gradedqualityBmaintenanceDemo MCP server that exposes order and customer data as read-only tools for AI assistants, simulating a business API or internal data source.
- FlicenseNot gradedqualityBmaintenanceAn MCP server for e-commerce operations that enables AI agents to investigate stuck orders, surface fulfillment anomalies, and create escalation records via natural language queries.
Related MCP Connectors
MCP server for AI access to Swagger by SmartBear.
Hosted Amazon Seller and Vendor MCP server for Claude, ChatGPT, Cursor, Codex, Gemini, Copilot.
Hosted MCP server exposing US hospital procedure cost data to AI assistants
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/ritz541/ecommerce-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server