Tool tree
gradeNot graded
ask_conciergeAction
Ask this business's concierge a question in natural language — hours, policies, recommendations, anything a guest would ask at the desk. Replies come from the same knowledge and conversation engine the human-facing chat on this page uses, and context is kept across calls so follow-ups work. Use this for judgement and nuance. Do NOT use it for facts the free lookup tools already return — prefer get_business_info for contact details and list_offerings for services, which are instant and cost nothing. Returns { ok, answer, conversation_id }.
View tool JSON
{
"name": "ask_concierge",
"kind": "act",
"impl": "imperative",
"description": "Ask this business's concierge a question in natural language — hours, policies, recommendations, anything a guest would ask at the desk. Replies come from the same knowledge and conversation engine the human-facing chat on this page uses, and context is kept across calls so follow-ups work. Use this for judgement and nuance. Do NOT use it for facts the free lookup tools already return — prefer get_business_info for contact details and list_offerings for services, which are instant and cost nothing. Returns { ok, answer, conversation_id }.",
"inputSchema": {
"type": "object",
"properties": {
"question": {
"type": "string",
"minLength": 2,
"maxLength": 2000,
"description": "The visitor's question, in natural language. One question per call; the concierge answers conversationally."
}
},
"required": [
"question"
]
},
"page": "/"
}get_business_infoAnswer
Verified public facts about this business: name, how it introduces itself, published contact details, the topics it invites questions about, and whether it can take a booking. Free and instant, no conversation started. Call this FIRST for anything factual — it is cheaper and more reliable than asking the concierge. Returns { ok, name, introduction, contact { email, phone, url }, suggested_topics[], booking_available }. Every Lobby tool returns that same envelope: `ok`, plus `error` with `code` and `message` when `ok` is false, alongside its own payload.
View tool JSON
{
"name": "get_business_info",
"kind": "answer",
"impl": "imperative",
"description": "Verified public facts about this business: name, how it introduces itself, published contact details, the topics it invites questions about, and whether it can take a booking. Free and instant, no conversation started. Call this FIRST for anything factual — it is cheaper and more reliable than asking the concierge. Returns { ok, name, introduction, contact { email, phone, url }, suggested_topics[], booking_available }. Every Lobby tool returns that same envelope: `ok`, plus `error` with `code` and `message` when `ok` is false, alongside its own payload.",
"inputSchema": {
"type": "object",
"properties": {}
},
"page": "/"
}list_offeringsAnswer
The services this business offers, as structured data an agent can compare, filter or present. Each offering carries an explicit `bookable` flag — check it before attempting to schedule anything. Free and instant. Returns { ok, offerings[] of { id, name, description, price, currency, bookable, action_url, contact_required }, total, booking_available }.
View tool JSON
{
"name": "list_offerings",
"kind": "answer",
"impl": "imperative",
"description": "The services this business offers, as structured data an agent can compare, filter or present. Each offering carries an explicit `bookable` flag — check it before attempting to schedule anything. Free and instant. Returns { ok, offerings[] of { id, name, description, price, currency, bookable, action_url, contact_required }, total, booking_available }.",
"inputSchema": {
"type": "object",
"properties": {
"bookable_only": {
"type": "boolean",
"description": "When true, return only offerings that can be scheduled through the booking tools. Default false (return all)."
}
}
},
"page": "/"
}get_booking_optionsAnswer
What can be booked with this business, and for how long. Returns the bookable appointment types with their durations. Call this before check_availability — availability is always relative to one booking type, because duration determines which slots fit. Returns { ok, booking_types[] of { id, name, description, duration_minutes, price, currency, location_kind }, timezone }.
View tool JSON
{
"name": "get_booking_options",
"kind": "answer",
"impl": "imperative",
"description": "What can be booked with this business, and for how long. Returns the bookable appointment types with their durations. Call this before check_availability — availability is always relative to one booking type, because duration determines which slots fit. Returns { ok, booking_types[] of { id, name, description, duration_minutes, price, currency, location_kind }, timezone }.",
"inputSchema": {
"type": "object",
"properties": {}
},
"page": "/"
}check_availabilityAnswer
Free times for one booking type in a date range. Every slot is a real opening: the business’s published hours minus anything already on its calendar. An empty list is a definite "nothing free in that range", not an error — widen the range or offer to take a message. Returns { ok, slots[] of { start_utc, end_utc, start_local }, total, timezone, searched { from_date, to_date } }.
View tool JSON
{
"name": "check_availability",
"kind": "answer",
"impl": "imperative",
"description": "Free times for one booking type in a date range. Every slot is a real opening: the business’s published hours minus anything already on its calendar. An empty list is a definite \"nothing free in that range\", not an error — widen the range or offer to take a message. Returns { ok, slots[] of { start_utc, end_utc, start_local }, total, timezone, searched { from_date, to_date } }.",
"inputSchema": {
"type": "object",
"properties": {
"booking_type_id": {
"type": "string",
"description": "From get_booking_options."
},
"from_date": {
"type": "string",
"format": "date",
"description": "First date to consider, YYYY-MM-DD."
},
"to_date": {
"type": "string",
"format": "date",
"description": "Last date to consider, YYYY-MM-DD, INCLUSIVE. Omit for a single day. At most 60 days after from_date."
},
"visitor_timezone": {
"type": "string",
"description": "The visitor's IANA timezone, if known (e.g. 'Europe/Berlin'). Slot times are echoed in it for display. Omit and the business’s own zone is used."
}
},
"required": [
"booking_type_id",
"from_date"
]
},
"page": "/"
}start_bookingSensitive Action
Book one of the free slots from check_availability. THIS COMMITS the visitor to an appointment and emails the business, so it is deliberately two-step: call it first WITHOUT `confirmed`, show the returned summary to the visitor in their own words, and only call it again with `confirmed: true` once they have explicitly agreed. Never set `confirmed: true` on the first call, and never infer agreement from the visitor merely having asked about times. Returns { ok, status, summary { what, when_utc, duration_minutes, guest_name, guest_email, business }, booking_id }. The visitor is emailed a confirmation with a calendar invitation attached and their own cancellation link. `cancel_url` is null here and stays null on purpose: that link is the visitor’s only credential for their appointment and it is not handed to a tool caller. If the visitor later wants to cancel, ask them for the token in that email and use cancel_booking — do not send them to the business, and do not try their booking_id.
View tool JSON
{
"name": "start_booking",
"kind": "transact",
"impl": "imperative",
"description": "Book one of the free slots from check_availability. THIS COMMITS the visitor to an appointment and emails the business, so it is deliberately two-step: call it first WITHOUT `confirmed`, show the returned summary to the visitor in their own words, and only call it again with `confirmed: true` once they have explicitly agreed. Never set `confirmed: true` on the first call, and never infer agreement from the visitor merely having asked about times. Returns { ok, status, summary { what, when_utc, duration_minutes, guest_name, guest_email, business }, booking_id }. The visitor is emailed a confirmation with a calendar invitation attached and their own cancellation link. `cancel_url` is null here and stays null on purpose: that link is the visitor’s only credential for their appointment and it is not handed to a tool caller. If the visitor later wants to cancel, ask them for the token in that email and use cancel_booking — do not send them to the business, and do not try their booking_id.",
"inputSchema": {
"type": "object",
"properties": {
"booking_type_id": {
"type": "string",
"description": "From get_booking_options."
},
"start_utc": {
"type": "string",
"format": "date-time",
"description": "Exactly as returned by check_availability. Do not construct or round this yourself."
},
"guest_name": {
"type": "string",
"minLength": 1,
"maxLength": 120,
"description": "The name the visitor gave you, as they gave it. This is what the business will see on the appointment."
},
"guest_email": {
"type": "string",
"format": "email",
"maxLength": 320,
"description": "Where the confirmation goes. Ask the visitor; never invent, guess or reuse an address from elsewhere on the page."
},
"notes": {
"type": "string",
"maxLength": 1000,
"description": "Anything the business should know beforehand."
},
"confirmed": {
"type": "boolean",
"description": "The visitor has seen the summary and explicitly agreed. Omit or false on the first call."
}
},
"required": [
"booking_type_id",
"start_utc",
"guest_name",
"guest_email"
]
},
"page": "/"
}cancel_bookingSensitive Action
Cancel an appointment the visitor already has, using the cancellation token from their own confirmation email. THIS RELEASES the slot, tells the business, and cannot be undone, so it is two-step exactly like start_booking: call it first WITHOUT `confirmed`, read the returned summary back to the visitor, and only call it again with `confirmed: true` once they have explicitly agreed. Ask the visitor for the cancellation link or token from their confirmation email — that token is the ONLY thing that authorises this, and a booking id will not work and must not be tried. Never guess, construct, or reuse a token, and never take one from anywhere but the visitor you are speaking to. Returns { ok, status, summary { business, cancels, when_utc } }.
View tool JSON
{
"name": "cancel_booking",
"kind": "transact",
"impl": "imperative",
"description": "Cancel an appointment the visitor already has, using the cancellation token from their own confirmation email. THIS RELEASES the slot, tells the business, and cannot be undone, so it is two-step exactly like start_booking: call it first WITHOUT `confirmed`, read the returned summary back to the visitor, and only call it again with `confirmed: true` once they have explicitly agreed. Ask the visitor for the cancellation link or token from their confirmation email — that token is the ONLY thing that authorises this, and a booking id will not work and must not be tried. Never guess, construct, or reuse a token, and never take one from anywhere but the visitor you are speaking to. Returns { ok, status, summary { business, cancels, when_utc } }.",
"inputSchema": {
"type": "object",
"properties": {
"cancel_token": {
"type": "string",
"minLength": 32,
"maxLength": 64,
"description": "The token from the visitor’s confirmation email — either the token itself or the last path segment before /cancel in their cancellation link. This is a secret belonging to that one appointment. It is NOT the booking_id that start_booking returns, and passing an id here is refused."
},
"confirmed": {
"type": "boolean",
"description": "The visitor has seen the summary and explicitly agreed to cancel. Omit or false on the first call."
}
},
"required": [
"cancel_token"
]
},
"page": "/"
}