find_bookable_restaurant
Use this tool when the user wants to discover restaurants with availability in a given city and time window (e.g. 'find me a brunch tomorrow in Lille for 4'). Searches the Koulis restaurant catalog and returns matching venues whose slots fall within a ±3-hour window around the requested datetime, along with their available booking slots.
Each result includes an `available_slots` array of LocalizedDateTime objects. When presenting times to the user, always use `slot.human_readable_fr` (e.g. 'jeudi 14 mai à 21h00') — never display `slot.iso_utc` as it shows raw UTC which confuses users. When passing a slot to `propose_reservation`, use `slot.iso_utc`.
Optionally filter results by cuisine or dietary requirements. If the user already knows which restaurant they want, skip this tool and use `discover_slots` directly with that restaurant's id.
discover_slots
Use this tool when the user wants to see all available time slots at a specific restaurant (e.g. 'what times are free at Le Petit Brunch on Saturday?'). Requires a `restaurant_id` from a prior `find_bookable_restaurant` result.
Returns all bookable slots within a ±2-hour window around the requested datetime. Slots are live inventory — they may be taken by another customer at any time. When presenting options to the user, use `slot.human_readable_fr` (e.g. 'jeudi 14 mai à 21h00'). When the user picks a slot, pass its `slot.iso_utc` to `propose_reservation`.
If no slots are returned, suggest the user try a different time or another restaurant. Do not call `propose_reservation` without a valid slot from this tool or from `find_bookable_restaurant`.
propose_reservation
Use this tool when the user has chosen a specific slot and wants to proceed with booking (step 1 of the 2-step reservation flow). Creates a temporary 5-minute hold on the selected slot so no one else can take it while the user confirms.
This action is REVERSIBLE — the hold expires automatically after 5 minutes if not confirmed. After calling this tool, you MUST present the hold details to the user and ask for explicit confirmation before proceeding to `confirm_reservation`. Never call `confirm_reservation` without the user saying yes.
The returned `hold_id` is required for `confirm_reservation` and is only valid for the duration shown in `expires_in_seconds`. The `datetime` parameter MUST be a `slot.iso_utc` value from a prior tool result — never pass local times or human-readable strings.
confirm_reservation
Use this tool when the user has explicitly confirmed they want to finalize a reservation (step 2 of the 2-step reservation flow). This action is IRREVERSIBLE — it creates a confirmed booking that the restaurant will honor.
Only call this after the user has reviewed the hold from `propose_reservation` and given explicit consent (e.g. 'yes, book it'). The tool is idempotent: calling it twice with the same `hold_id` returns the same confirmation without creating a duplicate reservation.
Requires the customer's name, phone number, and email address. The customer will receive a confirmation email with reservation details and a cancellation link. When presenting the confirmation to the user, use the `human_readable_summary` or `slot.human_readable_fr` — never display `slot.iso_utc`.