For AI developers

Order food with an AI assistant

Restaurants hosted on lokal.business are orderable by any MCP-compatible client — ChatGPT, Claude, or your own agent. Structured tools, live prices, a real cart, an explicit confirmation step, and a safe test mode. No HTML scraping.

Connect

Endpointhttps://lokal.business/api/mcp/ordering
TransportStreamable HTTP (JSON-RPC 2.0). SSE at /api/mcp/ordering/sse.
SDKOfficial @modelcontextprotocol/sdk — protocol 2025-06-18.
AuthNone for menu, cart, and test orders. Live orders need a Bearer token (contact us).

Client configuration

{
  "mcpServers": {
    "lokal-ordering": {
      "type": "streamable-http",
      "url": "https://lokal.business/api/mcp/ordering"
    }
  }
}

In Claude Desktop / Code add it as a remote MCP server. In the OpenAI Agents SDK, register it as a Streamable-HTTP MCP tool provider.

The 18 tools

search_restaurantsFind restaurants that take online orders.
search_businessesFind any local business — not just restaurants — by need, city, or payment and fulfilment options.
get_restaurantHours, open/closed now, fulfilment + payment options.
get_menuLive menu: categories, item_ids, prices, availability, add-ons.
search_menu_itemsNatural-language item search ('chicken momo') → item_ids + confidence.
get_menu_itemEverything about one item by item_id.
create_cartOpen a server-side cart (test-mode by default).
add_cart_itemAdd an item by item_id — the server prices it.
update_cart_itemChange quantity / add-ons / instructions.
remove_cart_itemRemove a line.
get_cartThe current server-validated cart + totals.
set_fulfillmentPickup or delivery, requested time, address.
set_customerName + phone (responses only echo a masked phone).
get_payment_methodsWhat the restaurant actually accepts.
validate_orderFinal check → confirmation_summary + confirmation_token. Does NOT place.
place_orderPlace it — needs the token + explicit customer yes. Idempotent.
get_order_statusStatus of an order.
cancel_orderCancel while still new.

Read-only resources: lokal://restaurants/{slug}, …/menu, …/payment-methods, …/orders/{orderId}.

Example ordering workflow

1.  search_restaurants { "query": "kathmandu" }
2.  search_menu_items { "restaurant_slug": "kathmandu-curry-and-bar",
                        "query": "one plate of chicken momo" }
       → pick the item_id  (this menu has TWO "Chicken Momo" — ask the
         customer which if more than one matches; never guess by name)
3.  create_cart   { "restaurant_slug": "kathmandu-curry-and-bar",
                    "fulfillment_type": "pickup" }            → cart_id
4.  add_cart_item { "cart_id": "...", "item_id": "...", "quantity": 1 }
5.  set_fulfillment { "cart_id": "...", "fulfillment_type": "pickup",
                      "requested_time": "ASAP" }
6.  set_customer  { "cart_id": "...", "name": "...", "phone": "..." }
7.  validate_order { "cart_id": "...", "payment_method": "cash_pickup" }
       → read confirmation_summary to the customer, keep confirmation_token
8.  ── ASK THE CUSTOMER TO CONFIRM. Only if they say yes: ──
9.  place_order   { "cart_id": "...", "payment_method": "cash_pickup",
                    "confirmation_token": "...",
                    "idempotency_key": "unique-per-order" }
       → order_id, total, tracking_url
10. get_order_status { "order_id": "...", "restaurant_slug": "..." }

Confirmation & safety

Test mode

Every order is a test order by default. Test orders are flagged is_test_order: true, prefixed [TEST], noted “do not prepare,” and send no SMS and no kitchen ticket. Cash pickup stays selectable; no real payment is ever taken.

Demo restaurant: Kathmandu Curry & Bar — kathmandu-curry-and-bar. Its stored order metadata carries source: "mcp", ai_client, session_id and idempotency_key so test orders are easy to find and remove. Live ordering (mode "live") requires an authorized token.

Discovery

Machine-readable manifest: /.well-known/mcp. Also linked from /llms.txt. Restaurant directory + product feed: /api/feeds/restaurants.