Mario's Slice Shop (demo)
AI agents can now order pizza, message the shop. Point any MCP-capable agent (Muse, Claude, ChatGPT) at the endpoints below, or submit the manifest to Meta's Muse connector directory.
Endpoints
MCP server (agents connect here)
https://unamused.app/a/deadbeef0002/mcp
OpenAPI 3.1 spec
https://unamused.app/a/deadbeef0002/openapi.json
Connector manifest
https://unamused.app/a/deadbeef0002/manifest.json
Your actions
| Action | Runs via | Approval |
|---|---|---|
Order pizzaplace_order — Place a pickup order at Mario's Slice Shop. Demo: no real order is placed. |
webhook | required |
Message the shopcontact_business — Send a message to Mario's Slice Shop. Demo: goes to the echo service. |
webhook | no |
Try it
Call an action right from your terminal:
curl example
curl -X POST https://unamused.app/a/deadbeef0002/actions/place_order \
-H 'Content-Type: application/json' \
-d '{"name": "Jane Doe"}'
Actions marked approval required are gated server-side: the first call
validates your parameters and returns approval_required plus a single-use
approval_token (valid 10 minutes). Call again with
{"approval_token": "..."} after the human approves to execute.
Webhook deliveries are signed — verify X-Unamused-Signature (HMAC-SHA256 of
<timestamp>.<body>) and reject old X-Unamused-Timestamp
values to stop replays.
OpenAPI spec
openapi.json
{
"openapi": "3.1.0",
"info": {
"title": "Mario's Slice Shop (demo) \u2014 Agent API",
"version": "1.0.0",
"description": "Machine-usable actions for Mario's Slice Shop (demo) (https://example.com/marios-slice), generated free by Unamused. Submit this spec to an agent connector directory (e.g. Meta's Muse connector platform) to let AI agents act on behalf of customers."
},
"servers": [
{
"url": "https://unamused.app"
}
],
"paths": {
"/a/deadbeef0002/actions/place_order": {
"post": {
"summary": "Order pizza",
"description": "Place a pickup order at Mario's Slice Shop. Demo: no real order is placed. NOTE: this action commits the business (booking/order) and approval is enforced server-side. The first call only validates and returns approval_required + a single-use approval_token (10 min). Call again with {\"approval_token\": \"...\"} after the human approves to execute.",
"operationId": "place_order",
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Customer's full name"
},
"phone_or_email": {
"type": "string",
"description": "Customer's phone or email"
},
"items": {
"type": "string",
"description": "Pizzas and sides to order"
}
},
"additionalProperties": false,
"required": [
"name",
"phone_or_email",
"items"
]
}
}
}
},
"responses": {
"200": {
"description": "Action result"
}
},
"x-unamused-requires-approval": true
}
},
"/a/deadbeef0002/actions/contact_business": {
"post": {
"summary": "Message the shop",
"description": "Send a message to Mario's Slice Shop. Demo: goes to the echo service.",
"operationId": "contact_business",
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Your name"
},
"message": {
"type": "string",
"description": "Your message"
}
},
"additionalProperties": false,
"required": [
"name",
"message"
]
}
}
}
},
"responses": {
"200": {
"description": "Action result"
}
}
}
},
"/a/deadbeef0002/status": {
"get": {
"summary": "Pollable status for this business",
"operationId": "get_business_status",
"description": "Lightweight status: current status, per-action last-execution info. Poll no more often than every 5 minutes.",
"responses": {
"200": {
"description": "Business status"
}
}
}
},
"/a/deadbeef0002/changes": {
"get": {
"summary": "Delta poll for this business",
"operationId": "get_changes",
"description": "Changes after 'since' (ISO-8601): executed actions, deletion. Poll no more often than every 5 minutes.",
"parameters": [
{
"name": "since",
"in": "query",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Change list"
}
}
}
},
"/a/deadbeef0002/deletion/request": {
"post": {
"summary": "Start deleting this business's data",
"operationId": "request_deletion",
"description": "'Forget me', step 1: returns a single-use deletion_token (10 min) plus what will be deleted. Nothing is deleted by this call.",
"x-unamused-requires-approval": true,
"responses": {
"200": {
"description": "Deletion token"
}
}
}
},
"/a/deadbeef0002/deletion/confirm": {
"post": {
"summary": "Confirm deletion",
"operationId": "confirm_deletion",
"description": "Step 2: permanently deletes the business record, action-log entries, and pending approval tokens; returns a deletion receipt. Cannot be undone.",
"x-unamused-requires-approval": true,
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"deletion_token": {
"type": "string"
}
},
"required": [
"deletion_token"
]
}
}
}
},
"responses": {
"200": {
"description": "Deletion receipt"
}
}
}
}
}
}
Next: submit https://unamused.app/a/deadbeef0002/manifest.json to Meta's
Muse connector directory so customers reach you just by asking their agent.
Methodology and source: GitHub.