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:
- A restaurant serves all of its
menusas siblings, not as versions of each other. Each has its ownavailabilityWindows(empty/absent = always available). Render one menu at a time. - Sort by
menuSortOrderbeforecategorySortOrderbeforesortOrder. Two menus can each send a category withsortOrder: 0, so category order is only meaningful within a menu. - Items with no
menuIdare legacy rows imported before menus were tracked — treat them as belonging to the restaurant’s only/first menu. - An item’s
availabilityWindowsare the effective windows (menu opening hours, unless the category or the product overrides them). Combined with the restaurant’sopeningHours, 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
childModifierGroupIdspointing back into the same flat top-level collections.defaultQuantity >= 1means it comes pre-selected. Groups withisBundleSection: truebelong to a meal deal (isComboitems);maxPerModifiercaps 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:
- The tool returns
restaurant,location,menus,categoriesonly. Timing fields are mirrored ontorestaurantso they survive that trim. categoriesare 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.selfDeliversEnabledis already reflected infulfillmentTypesSupported(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: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).