A person's own AI assistant finds a free time at a business on Bookatu and holds it. No key.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Use this when the person has chosen a service and wants to know when it can be done. Returns open times over up to 14 days, each on the business's clock and, when you pass clientTimeZone, on the person's clock too, with the price at that time. A time marked bookVia assistant has a slotId to pass to hold_booking within 30 minutes. Quote times from the display fields as given. Do not use for holding or booking a time: only hold_booking holds one.
The business: its Bookatu name (slug), a bookatu.com link to it, or its own website address.
YYYY-MM-DD.
1 to 40, 12 when not given.
YYYY-MM-DD, at most 14 days in all.
A person, when the client wants one.
The language to answer in (BCP 47).
Whose calendar the dates are on (the business's when not given).
A branch of the business.
The client's IANA time zone, such as America/Toronto. Ask for their city when unsure.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http book https://bookatu.com/api/mcp/book
Use this when the person has chosen a service and wants to know when it can be done. Returns open times over up to 14 days, each on the business's clock and, when you pass clientTimeZone, on the person's clock too, with the price at that time. A time marked bookVia assistant has a slotId to pass to hold_booking within 30 minutes. Quote times from the display fields as given. Do not use for holding or booking a time: only hold_booking holds one.
| Argument | Type | Description |
|---|---|---|
| limit | integer | 1 to 40, 12 when not given. |
| dateTo | string | YYYY-MM-DD, at most 14 days in all. |
| staffId | string | A person, when the client wants one. |
| addOnIds | array | |
| business* | string | The business: its Bookatu name (slug), a bookatu.com link to it, or its own website address. |
| dateFrom* | string | YYYY-MM-DD. |
| language | string | The language to answer in (BCP 47). |
| dateClock | string | Whose calendar the dates are on (the business's when not given). |
| partOfDay | string | |
| partySize | integer | |
| serviceId* | string | |
| locationId | string | A branch of the business. |
| clientTimeZone | string | The client's IANA time zone, such as America/Toronto. Ask for their city when unsure. |
{
"type": "object",
"required": [
"business",
"serviceId",
"dateFrom"
],
"properties": {
"limit": {
"type": "integer",
"maximum": 40,
"minimum": 1,
"description": "1 to 40, 12 when not given."
},
"dateTo": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "YYYY-MM-DD, at most 14 days in all."
},
"staffId": {
"type": "string",
"maxLength": 64,
"description": "A person, when the client wants one."
},
"addOnIds": {
"type": "array",
"items": {
"type": "string",
"maxLength": 64
},
"maxItems": 5
},
"business": {
"type": "string",
"maxLength": 2048,
"minLength": 1,
"description": "The business: its Bookatu name (slug), a bookatu.com link to it, or its own website address."
},
"dateFrom": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "YYYY-MM-DD."
},
"language": {
"type": "string",
"maxLength": 35,
"description": "The language to answer in (BCP 47)."
},
"dateClock": {
"enum": [
"client",
"business"
],
"type": "string",
"description": "Whose calendar the dates are on (the business's when not given)."
},
"partOfDay": {
"enum": [
"morning",
"afternoon",
"evening"
],
"type": "string"
},
"partySize": {
"type": "integer",
"maximum": 10,
"minimum": 1
},
"serviceId": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"locationId": {
"type": "string",
"maxLength": 64,
"description": "A branch of the business."
},
"clientTimeZone": {
"type": "string",
"maxLength": 64,
"description": "The client's IANA time zone, such as America/Toronto. Ask for their city when unsure."
}
},
"additionalProperties": false
}Use this when the person reads you the 6-digit code from the email hold_booking sent them. Books the held time: the answer is confirmed, or requested when the business looks at new bookings before accepting them, with the booking's reference. If someone else took the time first, it offers up to three other times. A wrong code is refused and says how many tries are left. Do not use for a code the person did not give you themselves, or to try codes.
| Argument | Type | Description |
|---|---|---|
| code* | string | The 6-digit code from the email, as the person read it to you. |
| holdId* | string | The holdId hold_booking answered with. |
| language | string | The language to answer in (BCP 47). |
{
"type": "object",
"required": [
"holdId",
"code"
],
"properties": {
"code": {
"type": "string",
"maxLength": 16,
"minLength": 6,
"description": "The 6-digit code from the email, as the person read it to you."
},
"holdId": {
"type": "string",
"maxLength": 64,
"minLength": 1,
"description": "The holdId hold_booking answered with."
},
"language": {
"type": "string",
"maxLength": 35,
"description": "The language to answer in (BCP 47)."
}
},
"additionalProperties": false
}Use this when a person wants to book something on Bookatu and has no business in mind yet. Give the country and at least one of service, name or place (a town, city or area the person named, never their own position). Returns up to 10 businesses that chose to be found here, in name order, each with its city and area (never a street address), the languages it speaks, its lowest price, the services that match and its booking page. No business pays to be listed or placed. Do not use for a business you already know: pass it to get_business.
| Argument | Type | Description |
|---|---|---|
| name | string | The business's name, or part of it. |
| limit | integer | 1 to 10, 10 when not given. |
| place | string | A town, city or area the person named. Never their own position. |
| cursor | string | The nextCursor of the answer before, for the next page. |
| speaks | string | A language the business should speak with the client (BCP 47). |
| country* | string | The country to look in, ISO 3166-1 alpha-2, such as NZ. |
| service | string | What the person wants done, in their words. Matched against service names, categories and descriptions. |
Use this when the person asks whether a held time was confirmed, or where their booking stands now. Pass the holdId hold_booking returned. Returns the status (such as awaiting_client, confirmed, requested, declined, cancelled or moved), the business and service, and the start time. It returns no personal details. Do not use for checking again and again in a loop; ask when the person wants to know.
| Argument | Type | Description |
|---|---|---|
| holdId* | string | The holdId hold_booking answered with. |
| language | string | The language to answer in (BCP 47). |
{
"type": "object",
"required": [
"holdId"
],
"properties": {
"holdId": {
"type": "string",
"maxLength": 64,
"minLength": 1,
"description": "The holdId hold_booking answered with."
},
"language": {
"type": "string",
"maxLength": 35,
"description": "The language to answer in (BCP 47)."
}
},
"additionalProperties": false
}Use this when a person wants to book with a business on Bookatu and you need its details first. Give the business as its Bookatu name, a bookatu.com link to it, or its own website address. Returns its city and area (never a street address), its time zone and the time there now, this week's opening hours, its branches, its booking policies and whether a time can be held here. Do not use for searching for a business by place or by what it offers.
| Argument | Type | Description |
|---|---|---|
| business* | string | The business: its Bookatu name (slug), a bookatu.com link to it, or its own website address. |
| language | string | The language to answer in (BCP 47). |
| locationId | string | A branch of the business. |
| clientTimeZone | string | The client's IANA time zone, such as America/Toronto. Ask for their city when unsure. |
{
"type": "object",
"required": [
"business"
],
"properties": {
"business": {
"type": "string",
"maxLength": 2048,
"minLength": 1,
"description": "The business: its Bookatu name (slug), a bookatu.com link to it, or its own website address."
},
"language": {
"type": "string",
"maxLength": 35,
"description": "The language to answer in (BCP 47)."
},
"locationId": {
"type": "string",
"maxLength": 64,
"description": "A branch of the business."
},
"clientTimeZone": {
"type": "string",
"maxLength": 64,
"description": "The client's IANA time zone, such as America/Toronto. Ask for their city when unsure."
}
},
"additionalProperties": false
}Use this when the person has picked a time from check_availability and said yes to its price and the cancellation policy. Holds that time for up to 15 minutes and emails the person, who confirms it with the link in the email or by reading you the 6-digit code from it. Nothing is booked until they confirm. Pass the person's own name and email address, their time zone and an idempotencyKey: a retry with the same key and details returns the same hold. To change a time you already held, release the earlier hold with release_hold first. Do not use for holding a time for someone who has not given you their own email address, or for taking a payment.
| Argument | Type | Description |
|---|---|---|
| client* | object | |
| slotId* | string | A slotId from check_availability, used within 30 minutes. |
| language | string | The language to answer in (BCP 47). |
| partySize | integer | |
| clientTimeZone* | string | The client's IANA time zone, such as America/Toronto. Ask for their city when unsure. |
| idempotencyKey* | string | The same key and the same details for a retry of one hold; a new key for anything else. |
{
"type": "object",
"required": [
"slotId",
"client",
"clientTimeZone",
"idempotencyKey"
],
"properties": {
"client": {
"type": "object",
"required": [
"name",
"email"
],
"properties": {
"name": {
"type": "string",
"maxLength": 80,
"minLength": 2,
"description": "The person's name, as they gave it."
},
"email": {
"type": "string",
"maxLength": 254,
"description": "The person's own email address. They confirm the time from it."
},
"phone": {
"type": "string",
"maxLength": 30,
"minLength": 6,
"description": "The person's phone, E.164 or national format."
}
},
"additionalProperties": false
},
"slotId": {
"type": "string",
"maxLength": 2048,
"minLength": 1,
"description": "A slotId from check_availability, used within 30 minutes."
},
"language": {
"type": "string",
"maxLength": 35,
"description": "The language to answer in (BCP 47)."
},
"partySize": {
"type": "integer",
"maximum": 10,
"minimum": 1
},
"clientTimeZone": {
"type": "string",
"maxLength": 64,
"description": "The client's IANA time zone, such as America/Toronto. Ask for their city when unsure."
},
"idempotencyKey": {
"type": "string",
"maxLength": 64,
"minLength": 16,
"description": "The same key and the same details for a retry of one hold; a new key for anything else."
}
},
"additionalProperties": false
}Use this when you know the business and the person wants to see what it offers. Returns each service's name, description, length and price, any deposit, and how it is booked: bookVia assistant means a time can be held here, and bookVia website means the person books on the business's own page at bookingPageUrl. Filter with query or category, or pick a branch with locationId. Do not use for health or medical treatments: businesses that offer them are not on this server.
| Argument | Type | Description |
|---|---|---|
| limit | integer | 1 to 50, 20 when not given. |
| query | string | Words to look for in a service's name, category or description. |
| business* | string | The business: its Bookatu name (slug), a bookatu.com link to it, or its own website address. |
| category | string | |
| language | string | The language to answer in (BCP 47). |
| locationId | string | A branch of the business. |
| clientTimeZone | string | The client's IANA time zone, such as America/Toronto. Ask for their city when unsure. |
Use this when the person no longer wants a time you held for them and has not confirmed it. Ends the hold at once, so the time is free again. Do not use for cancelling a confirmed booking: release_hold only ends a hold that is still waiting, and the person cancels a booking with the business.
| Argument | Type | Description |
|---|---|---|
| holdId* | string | The holdId hold_booking answered with. |
| language | string | The language to answer in (BCP 47). |
{
"type": "object",
"required": [
"holdId"
],
"properties": {
"holdId": {
"type": "string",
"maxLength": 64,
"minLength": 1,
"description": "The holdId hold_booking answered with."
},
"language": {
"type": "string",
"maxLength": 35,
"description": "The language to answer in (BCP 47)."
}
},
"additionalProperties": false
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 15, 2026.
| language | string | The language to answer in (BCP 47). |
| clientTimeZone | string | The client's IANA time zone, such as America/Toronto. Ask for their city when unsure. |
{
"type": "object",
"required": [
"country"
],
"properties": {
"name": {
"type": "string",
"maxLength": 80,
"minLength": 2,
"description": "The business's name, or part of it."
},
"limit": {
"type": "integer",
"maximum": 10,
"minimum": 1,
"description": "1 to 10, 10 when not given."
},
"place": {
"type": "string",
"maxLength": 80,
"minLength": 2,
"description": "A town, city or area the person named. Never their own position."
},
"cursor": {
"type": "string",
"maxLength": 64,
"description": "The nextCursor of the answer before, for the next page."
},
"speaks": {
"type": "string",
"maxLength": 35,
"minLength": 2,
"description": "A language the business should speak with the client (BCP 47)."
},
"country": {
"type": "string",
"pattern": "^[A-Za-z]{2}$",
"description": "The country to look in, ISO 3166-1 alpha-2, such as NZ."
},
"service": {
"type": "string",
"maxLength": 80,
"minLength": 2,
"description": "What the person wants done, in their words. Matched against service names, categories and descriptions."
},
"language": {
"type": "string",
"maxLength": 35,
"description": "The language to answer in (BCP 47)."
},
"clientTimeZone": {
"type": "string",
"maxLength": 64,
"description": "The client's IANA time zone, such as America/Toronto. Ask for their city when unsure."
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"business"
],
"properties": {
"limit": {
"type": "integer",
"maximum": 50,
"minimum": 1,
"description": "1 to 50, 20 when not given."
},
"query": {
"type": "string",
"maxLength": 80,
"description": "Words to look for in a service's name, category or description."
},
"business": {
"type": "string",
"maxLength": 2048,
"minLength": 1,
"description": "The business: its Bookatu name (slug), a bookatu.com link to it, or its own website address."
},
"category": {
"type": "string",
"maxLength": 80
},
"language": {
"type": "string",
"maxLength": 35,
"description": "The language to answer in (BCP 47)."
},
"locationId": {
"type": "string",
"maxLength": 64,
"description": "A branch of the business."
},
"clientTimeZone": {
"type": "string",
"maxLength": 64,
"description": "The client's IANA time zone, such as America/Toronto. Ask for their city when unsure."
}
},
"additionalProperties": false
}