MCP server
Let an AI assistant work your restaurant. OrderRestro speaks the Model Context Protocol, so Claude and other MCP clients can look up orders, assign drivers, book tables, edit the menu and run reports — with exactly the permissions of the person who made the key.
Overview
The server exposes 40 tools over the Model Context Protocol (Streamable HTTP, stateless). It is not a separate service — it is built into OrderRestro at one URL:
https://<your-orderrestro-domain>/api/v1/mcpIt is separate from the REST API: the REST API is for your website’s backend and uses an integration key; the MCP server is for AI clients and uses a personal key that acts as you.
Get a key
- Sign in and open Settings > API Keys > Personal API keys & MCP.
- Choose New key and name it after the assistant or device.
- Copy the key (it starts with
ordr_staff_). It is shown once.
Every request sends Authorization: Bearer <key>. The key acts as you, with your exact role permissions: every tool re-checks the permission the matching screen in the app would need, so an assistant can never do more than you could yourself. Revoke a key and it stops working immediately.
Connect a client
Claude Code
claude mcp add --transport http orderrestro \
https://your-domain/api/v1/mcp \
--header "Authorization: Bearer ordr_staff_..."Clients that only run local (stdio) servers
Bridge the remote server with mcp-remote:
{
"mcpServers": {
"orderrestro": {
"command": "npx",
"args": [
"-y", "mcp-remote",
"https://your-domain/api/v1/mcp",
"--header", "Authorization: Bearer ordr_staff_..."
]
}
}
}Any other MCP client
Point it at the URL with the Authorization header. The server is stateless: each request is authenticated on its own, only POST is accepted, and GET/DELETE return 405.
Try it with curl
curl -X POST https://your-domain/api/v1/mcp \
-H "Authorization: Bearer ordr_staff_..." \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'-d '{"jsonrpc":"2.0","id":2,"method":"tools/call",
"params":{"name":"create_order","arguments":{
"branchId":"<branchId>","type":"TAKEAWAY","guestName":"Asha",
"items":[{"menuItemId":"<itemId>","quantity":2}]}}}'Results come back as text content holding JSON:
{"result":{"content":[{"type":"text","text":"[{\"id\":\"…\",\"name\":\"Main Branch\",\"address\":null,\"phone\":null}]"}]},"jsonrpc":"2.0","id":3}Problems are returned as a tool result with isError: true, not as an HTTP failure:
{"result":{"content":[{"type":"text","text":"Error: Missing permission: refunds.process"}],"isError":true},"jsonrpc":"2.0","id":1}
{"result":{"content":[{"type":"text","text":"Error: \"branchId\" is required and must be a string"}],"isError":true},"jsonrpc":"2.0","id":8}A missing, wrong or revoked key is an HTTP 401.
What you can ask
- “How were sales yesterday, and which dishes sold best this week?” —
dashboard_summary,run_report - “Which deliveries are still without a driver? Assign Ravi to the first one.” —
list_deliveries,assign_driver - “Book a table for four tomorrow at 8pm under Mehta.” —
create_reservation - “Add a Paneer Tikka at ₹240 to Starters.” —
create_menu_item - “Approve Priya’s leave request for Friday.” —
list_leave_requests,decide_leave_request - “What was our profit this month, and what do we owe in tax by rate?” —
profit_and_loss,gst_report
What it will not do
Some actions are deliberately not available over MCP, whatever the role: taking payment at checkout (it needs a real payment terminal), creating or changing staff accounts and roles, and restoring backups. Read-only tools are marked as such so a client can approve them automatically while asking before it runs a write.
Tool reference (40)
Generated from the server's own tool definitions, so it always matches what your assistant sees.
Locations & dashboard
| Tool | What it does | Needs | Arguments |
|---|---|---|---|
list_locationsread-only | List the caller's restaurant's active locations (branches) — id, name, address, phone. | Any signed-in staff member | none |
dashboard_summaryread-only | Today's sales/orders summary for one location. | Any signed-in staff member |
|
Orders
| Tool | What it does | Needs | Arguments |
|---|---|---|---|
list_open_ordersread-only | List currently open orders for one location, optionally filtered to one table. | Create Orders |
|
get_orderread-only | Get full detail (items, KOTs, payments) for one order. | Create Orders |
|
create_orderchanges data | Create a new takeaway/delivery/dine-in order at one location. | Create Orders |
|
cancel_orderchanges data | Cancel an OPEN order the kitchen has not started yet. Fails if the kitchen already began preparing it, or if it is already paid (use refund_order instead). | Cancel Orders |
|
refund_orderchanges data | Refund some or all of a PAID order. Amount cannot exceed what remains refundable. | Process Refunds |
|
Delivery
| Tool | What it does | Needs | Arguments |
|---|---|---|---|
list_deliveriesread-only | List delivery orders for one location — active ones by default, or finished/failed ones with history=true. Each shows address, zone, fee, driver and delivery status. | Manage Deliveries |
|
list_delivery_zonesread-only | List a location's delivery zones (fee, minimum order, ETA, pincodes). | Manage Deliveries |
|
assign_driverchanges data | Assign a staff member as the driver for a delivery order. | Manage Deliveries |
|
update_delivery_statuschanges data | Move a delivery along: ASSIGNED -> PICKED_UP -> DELIVERED (or FAILED). | Manage Deliveries |
|
Reservations
| Tool | What it does | Needs | Arguments |
|---|---|---|---|
list_reservationsread-only | List reservations for one location, optionally on one date (YYYY-MM-DD). | Manage Reservations |
|
create_reservationchanges data | Create a new table reservation at one location. | Manage Reservations |
|
update_reservation_statuschanges data | Transition a reservation to a new status: one of ${RESERVATION_STATUS_VALUES.join(', ')}. | Manage Reservations |
|
Menu
| Tool | What it does | Needs | Arguments |
|---|---|---|---|
create_menu_categorychanges data | Create a new menu category (e.g. "Chicken", "Cocktail") at one location. | Manage Menu |
|
update_menu_categorychanges data | Rename, reorder, or activate/deactivate an existing menu category. | Manage Menu |
|
delete_menu_categorychanges data | Permanently delete a menu category. Fails if it still has items — delete or move those first. | Manage Menu |
|
create_menu_itemchanges data | Create a new menu item (dish) inside an existing category, with price and optional image URL. | Manage Menu |
|
update_menu_itemchanges data | Change any fields (price, name, description, image, availability, veg flag, spice level) on an existing menu item. | Manage Menu |
|
delete_menu_itemchanges data | Permanently delete a menu item. | Manage Menu |
|
Floors & tables
| Tool | What it does | Needs | Arguments |
|---|---|---|---|
create_floorchanges data | Create a new floor or dining section (e.g. "Main Hall", "Bar") at one location. | Manage Tables |
|
update_floorchanges data | Rename or reorder an existing floor/section. | Manage Tables |
|
create_tables_bulkchanges data | Create multiple tables at once on one floor/section, given a list of table numbers. | Manage Tables |
|
update_tablechanges data | Change a table's number, name, capacity, shape or notes. | Manage Tables |
|
update_table_statuschanges data | Change a table's status: one of ${TABLE_STATUS_VALUES.join(', ')}. | Manage Tables |
|
delete_tablechanges data | Permanently delete a table. | Manage Tables |
|
Staff
| Tool | What it does | Needs | Arguments |
|---|---|---|---|
clock_inchanges data | Clock the calling staff member in at a location. | Any signed-in staff member |
|
clock_outchanges data | Clock the calling staff member out of their open shift. | Any signed-in staff member | none |
list_attendanceread-only | List staff clock-in/clock-out records for one location, optionally on one date (YYYY-MM-DD) or for one staff member. A null clockOutAt means the person is still on shift. | Manage Staff Attendance |
|
list_shiftsread-only | List scheduled staff shifts for one location, optionally between two dates (YYYY-MM-DD). | Manage Staff Schedules, Leave & Payroll |
|
list_leave_requestsread-only | List staff leave requests for one location, optionally only PENDING, APPROVED or REJECTED. | Manage Staff Schedules, Leave & Payroll |
|
decide_leave_requestchanges data | Approve or reject a pending leave request. | Manage Staff Schedules, Leave & Payroll |
|
staff_performanceread-only | Per-staff orders, sales, tips, hours worked and sales per hour between two dates (YYYY-MM-DD). | Manage Staff Schedules, Leave & Payroll |
|
Accounting & reports
| Tool | What it does | Needs | Arguments |
|---|---|---|---|
profit_and_lossread-only | Net sales, expenses by category, payroll cost and net profit for a location between two dates (YYYY-MM-DD). | Manage Accounting |
|
gst_reportread-only | Taxable value and tax collected, grouped by tax rate, between two dates (YYYY-MM-DD). | Manage Accounting |
|
list_expensesread-only | List recorded expenses for a location between two dates (YYYY-MM-DD). | Manage Accounting |
|
run_reportread-only | Run a catalog report (sales-daily, sales-by-item, popular-items, slow-movers, payment-methods, discounts, tax, peak-hours, food-cost, customers, retention, staff-sales, table-turnover, reservations, delivery, waste, inventory-valuation) for a location between two dates (YYYY-MM-DD). Returns columns and rows. | Access Reports |
|
Marketing & operations
| Tool | What it does | Needs | Arguments |
|---|---|---|---|
list_couponsread-only | List coupon codes for a location with usage counts. | Manage Coupons, Promotions & Campaigns |
|
list_promotionsread-only | List automatic time-window discounts for a location. | Manage Coupons, Promotions & Campaigns |
|
list_equipmentread-only | List kitchen/restaurant equipment with next service due dates and overdue flags. | Manage Equipment & Documents |
|