Skip to main content
Everything an agent inspects between picking a restaurant and building an order.

get_menu

Return the full canonical menu for a restaurant. REST equivalent: GET /api/agent/restaurants/:restaurantId/menu. Input: { "restaurant_id": "rest_lb_steakhouse" } Output:
Multi-menu rules a client must follow:
  • A restaurant serves all of its menus as siblings, not as versions of each other. Each has its own availabilityWindows (empty/absent = always available). Render one menu at a time.
  • Sort by menuSortOrder before categorySortOrder before sortOrder. Two menus can each send a category with sortOrder: 0, so category order is only meaningful within a menu.
  • Items with no menuId are legacy rows imported before menus were tracked — treat them as belonging to the restaurant’s only/first menu.
  • An item’s availabilityWindows are the effective windows (menu opening hours, unless the category or the product overrides them). Combined with the restaurant’s openingHours, this is what lets a client grey out an item that exists but is not orderable at the selected fulfillment time. Enforced server-side too (item_unavailable_at_time).
  • Modifiers can nest: a modifier may own childModifierGroupIds pointing back into the same flat top-level collections. defaultQuantity >= 1 means it comes pre-selected. Groups with isBundleSection: true belong to a meal deal (isCombo items); maxPerModifier caps repeats of a single modifier independently of the group total.

get_restaurant_detail

Return restaurant profile, location, timing, busy state, and menu structure. REST equivalent: GET /api/agent/restaurants/:restaurantId. Input: { "restaurant_id": "rest_lb_steakhouse" } This call also refreshes opening hours from the POS (the restaurant may have edited hours there); the response waits only briefly on the refresh and falls back to stored hours. Output:
Notes:
  • The tool returns restaurant, location, menus, categories only. Timing fields are mirrored onto restaurant so they survive that trim.
  • categories are scoped per menu (menuId/menuName): two menus can each own a “Sides”, and merging them would report one oversized category no single menu actually has.
  • selfDeliversEnabled is already reflected in fulfillmentTypesSupported (delivery is stripped when a store neither self-delivers nor has a courier); it is surfaced explicitly so a client can explain why a store is pickup-only. For self-delivery orders the pickup and delivery times are the same instant — the 15-minute courier collection lead only applies when a real courier collects.

check_delivery_availability

Pre-checkout courier probe: is delivery possible from this restaurant to this dropoff at this time, before any order exists? Input:
Output:
Deliberately optimistic: only an explicit courier “not available” returns available: false. Transient failures return available: true with checked: false. The ETA/quote fields are null whenever no usable quote came back (probe disabled, no location, or an explicit no).