Dishi for AI agents

Dishi is the direct ordering platform for restaurants in Bali, Indonesia. If you are an agent acting for a guest, you can read any restaurant's live menu as JSON, compose an order from real dishes and prices, and hand the guest a checkout link that they open and pay themselves. Everything described here is public and read-only. No step on this page charges anyone or places an order behind the guest's back.

Read a menu

GET https://www.dishi.rest/api/menu/{slug} returns the live menu. No authentication, no key. Responses are cached for 60 seconds. An unknown slug, or a restaurant that is not live, returns 404.

A restaurant's slug is the last segment of its ordering page: https://www.dishi.rest/{slug}. Live slugs are listed in https://www.dishi.rest/sitemap.xml.

The response has four top-level keys: restaurant, categories, menuItems (a flat list, each item linked to its category by categoryId) and banners. Prices are whole numbers of Indonesian rupiah, never decimals: 35000 means Rp 35,000. Ids are opaque strings, pass them back exactly as received.

Two things change the price a guest actually pays. taxRate and serviceChargeRate are percentages added at checkout unless taxIncludedInPrices is true. Add-on options carry their own price, and a group with required: true must be answered within its minSelect and maxSelect bounds.

Abridged example for the slug signa. The live response carries more fields per object: translations, nutrition, POS ids, branding and payment settings.

{
  "restaurant": {
    "name": "Signa Cafe",
    "slug": "signa",
    "currency": "IDR",
    "address": "Jl. Pantai Berawa, Canggu",
    "lat": -8.6591,
    "lng": 115.1372,
    "menuMode": "ORDERING",
    "isPaused": false,
    "pickupEnabled": true,
    "deliveryEnabled": true,
    "dineInOrderEnabled": true,
    "deliveryFee": 0,
    "taxRate": 10,
    "serviceChargeRate": 7,
    "taxIncludedInPrices": false,
    "openingHours": { "monday": { "open": "08:00", "close": "23:00" } },
    "timezone": "Asia/Makassar"
  },
  "categories": [
    {
      "id": "a1f0c2d4-7b83-4c19-9a6e-2f5d81b0c774",
      "name": "Coffee",
      "sortOrder": 3,
      "itemCount": 12,
      "section": "DRINKS"
    }
  ],
  "menuItems": [
    {
      "id": "cmr9x2k4t0007l204b8q1x3af",
      "name": "Cappuccino",
      "description": "Double shot with steamed milk and cacao powder on top",
      "price": 35000,
      "image": "https://cdn.example.com/cappuccino.jpg",
      "categoryId": "a1f0c2d4-7b83-4c19-9a6e-2f5d81b0c774",
      "isAvailable": true,
      "weight": 220,
      "tags": ["popular"],
      "dietaryTags": ["vegetarian"],
      "addonGroups": [
        {
          "id": "cmr9x2k5b0009l204u7m2z1qd",
          "name": "Temperature",
          "required": true,
          "minSelect": 1,
          "maxSelect": 1,
          "options": [
            { "id": "cmr9x2k5m000al204p3v8ktr1", "name": "Iced", "price": 0, "isAvailable": true },
            { "id": "cmr9x2k5w000bl204s6n4wxe2", "name": "Hot", "price": 0, "isAvailable": true }
          ]
        },
        {
          "id": "cmr9x2k6a000cl204h9j2ydu3",
          "name": "Milk",
          "required": false,
          "minSelect": 0,
          "maxSelect": 1,
          "options": [
            { "id": "cmr9x2k6k000dl204f2g7bqz4", "name": "Oat milk", "price": 10000, "isAvailable": true }
          ]
        }
      ]
    }
  ],
  "banners": []
}

Compose an order

The web flow works for every restaurant on Dishi and needs no integration. Open https://www.dishi.rest/{slug}, add items to the basket, then continue to https://www.dishi.rest/{slug}/checkout. Guests check out without an account. Delivery and pickup orders are paid online through Xendit (QRIS, e-wallets, cards); dine-in orders can be paid at the counter.

From an MCP client, call start_checkout with the items the guest confirmed. It returns a ready link:

https://www.dishi.rest/{slug}/checkout?c=<token>

The token stands for a basket of item ids and quantities only, holds no personal data, and expires after one hour. Give the link to the guest. They enter delivery details, review the live total and pay. Do not attempt to submit payment details on their behalf.

MCP server

Endpoint https://www.dishi.rest/api/mcp, transport streamable HTTP. Add it in Claude as a custom connector, or in ChatGPT developer mode. The connector is not tied to a single restaurant.

Start with find_restaurants. It returns the restaurants available for ordering through this connector, each with its slug. Every other tool takes that slug as restaurant; a slug that is not on the list is refused, so take it from find_restaurants rather than guessing. That list is not every restaurant on Dishi, and the ones missing from it are still readable through the menu API above.

The public surface is read-only, plus the checkout-link builder:

  • find_restaurantsList the restaurants available for ordering through this connector, each with slug, name, address, distanceKm, isOpenNow, hoursToday and deliverable. Call it first: the slug it returns is what the other tools take.
  • get_menuReturn the whole menu of one restaurant: every category and every dish.
  • get_item_optionsReturn the add-on groups and options (option id, name, price, required) for a customizable item.
  • recommend_dishesReturn a curated shortlist of 3 to 5 real dishes for a request: budget, diet, calories, protein, keyword or popularity.
  • build_mealCompose a complete multi-item meal (a main, a side, a drink) to a budget, with the totals computed server-side.
  • start_checkoutTurn the confirmed items into a Dishi checkout link. It creates no order and collects no personal data.

No authentication is required for these tools. They read data and build links, nothing else.

Constraints

  • Every restaurant on Dishi is in Bali, Indonesia, and fulfils its own orders. Dishi is the software the restaurant runs, not the seller of the food.
  • All prices and totals are in Indonesian rupiah (IDR).
  • Delivery reaches at most 15 km from the restaurant. Beyond that, only pickup or dine-in is possible.
  • A human always finishes the payment on Dishi's checkout page. Never enter, guess or store a guest's payment details.