Sample shop MCP server: paginated search, idempotent orders, guarded cancellation. Four languages.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Cancel an order that has not shipped. This cannot be undone. Call it first with confirm=false to get the order details, show them to the user, and only after the user explicitly agrees call again with confirm=true.
The order id, for example o-5001.
Set true only after the user has explicitly confirmed the cancellation.
The server marks this tool as destructive. Running it may delete or overwrite data on the server or in any account you connected with your headers.
Cancel an order that has not shipped. This cannot be undone. Call it first with confirm=false to get the order details, show them to the user, and only after the user explicitly agrees call again with confirm=true.
| Argument | Type | Description |
|---|---|---|
| confirm | boolean | Set true only after the user has explicitly confirmed the cancellation. |
| orderId* | string | The order id, for example o-5001. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"orderId"
],
"properties": {
"confirm": {
"type": "boolean",
"default": false,
"description": "Set true only after the user has explicitly confirmed the cancellation."
},
"orderId": {
"type": "string",
"description": "The order id, for example o-5001."
}
}
}Place an order for one product. Generate one random idempotencyKey per user request and reuse the same key if you retry after an error or timeout; the shop returns the original order instead of creating a duplicate. Confirm product and quantity with the user before calling. Returns the order with its id, status and total.
| Argument | Type | Description |
|---|---|---|
| quantity* | integer | Units to order, 1 to 10. |
| productId* | string | Product id from search_products or get_product. |
| idempotencyKey* | string | A unique key you generate for this order attempt and reuse on retry. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"productId",
"quantity",
"idempotencyKey"
],
"properties": {
"quantity": {
"type": "integer",
"maximum": 10,
"minimum": 1,
"description": "Units to order, 1 to 10."
},
"productId": {
"type": "string",
"description": "Product id from search_products or get_product."
},
"idempotencyKey": {
"type": "string",
"maxLength": 128,
"minLength": 8,
"description": "A unique key you generate for this order attempt and reuse on retry."
}
}
}Return the full details of one product by its id (for example p-1001). Use search_products first if you only know a name.
| Argument | Type | Description |
|---|---|---|
| productId* | string | The product id from search_products. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"productId"
],
"properties": {
"productId": {
"type": "string",
"description": "The product id from search_products."
}
}
}Search the shop catalogue by phrase and optional category. Returns one page of up to `limit` products and a `nextCursor`; when nextCursor is not null, more results exist and you must say so rather than claiming the list is complete. Use get_product for full details of one item. This tool does not place orders.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Page size. |
| query | string | Words to match against product names and descriptions. |
| cursor | string | Opaque token from a previous page's nextCursor. Never invent one. |
| category | string | Restrict results to one category. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"limit": {
"type": "integer",
"default": 5,
"maximum": 20,
"minimum": 1,
"description": "Page size."
},
"query": {
"type": "string",
"maxLength": 100,
"description": "Words to match against product names and descriptions."
},
"cursor": {
"type": "string",
"description": "Opaque token from a previous page's nextCursor. Never invent one."
},
"category": {
"enum": [
"lighting",
"furniture",
"kitchen"
],
"type": "string",
"description": "Restrict results to one category."
}
}
}