Booksy MCP Server
Booksy MCP Server exposes 28 Booksy Biz tools over MCP, REST, and Python so you can read and change a business’s calendar, clients, time off, services/staff, reviews, Message Blasts, and reports.
Calendar: list/get appointments, find open slots, create/reschedule/cancel appointments, with dry-run checks for bookings.
Clients: list/search/get/add/update/delete client cards, and append private notes.
Time off: list/add/remove staff time off and calendar blocks.
Business setup: list services and staff, get business hours, profile, settings, and notifications.
Reviews: list reviews and post or update public replies.
Message Blasts: list templates/scheduled blasts, estimate reach and SMS cost, send email/SMS/push messages.
Stats & Reports: fetch dashboard and report categories for days, weeks, months, or years.
Interfaces: use MCP over stdio or HTTP, REST at
/api/v1/booksywith OpenAPI docs, or Pythoncall()and example scripts.Safety controls: read-only mode, local binding by default, bearer token for non-local access, and write tools marked for approval.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Booksy MCP Servershow me today's appointments and any open slots this afternoon"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Booksy API and MCP server, self-hosted
A Booksy API and a Booksy MCP server you run on your own computer, in Python, on the session of your own Google Chrome. All 28 Booksy Biz tools we run in production at Cotlet: the calendar, open slots, time off, clients, services and staff, reviews, Message Blasts and Stats & Reports.
Booksy has no self-serve API for business owners and no official MCP server. This repo gives you both:
MCP server for Claude Code, Claude Desktop, Cursor, Codex and any MCP client, over stdio or HTTP. Setup
REST API on
http://127.0.0.1:8787/api/v1/booksy, with OpenAPI docs at/docs. SetupPython:
call("list_appointments", {"from": "2026-10-27", "to": "2026-10-27"}), plus 9 ready scripts inexamples/.
It is for technical people who want to run it themselves, for noncommercial use only (license). If you want it running 24/7 on a server, kept working when Booksy changes its panel, for a team or a business, use the hosted version at cotlet.dev.
git clone https://github.com/cotletdev/booksy-api-mcp-server.git && cd booksy-api-mcp-server
python3 -m venv .venv && . .venv/bin/activate && pip install -e .
booksy-mcp connect # reads your Booksy Biz session from Chrome
booksy-mcp call list_services
claude mcp add booksy -- "$PWD/.venv/bin/booksy-mcp" mcpContents
Related MCP server: YaviControl MCP Server
How it works
AI agent (MCP) / script (REST, Python) ──▶ booksy-mcp on your computer ──your Booksy session──▶ <country>.booksy.com
▲
booksy-mcp connect ───────┘ reads it once from your Chrome (DevTools Protocol)You sign in to Booksy Biz in your own Chrome at booksy.com/pro, the way you always do.
booksy-mcp connectattaches to that Chrome through the Chrome DevTools Protocol and reads your session. Booksy does not keep it in a cookie. The panel stores it in the localStorage of itsweb-gateway.booksy.comframe, soconnectreads that storage, the booksy.com cookies and the panel's country, and saves them to~/.config/booksy-api-mcp/session.json, readable by your user only. It never sees or stores your password.Every tool call is a request to the API the Booksy Biz web panel calls (
<country>.booksy.com/core/v2, sous.booksy.comfor a US business andpl.booksy.comfor a Polish one), sent with curl_cffi, which copies Chrome's TLS fingerprint. No headless browser runs.
When Booksy signs you out, the server reads the session from Chrome again, if Chrome is open with remote debugging on.
Requirements
Python 3.11 or newer.
Google Chrome 144 or newer, signed in to Booksy Biz. Any Chrome or Chromium works with a debugging port.
macOS, Linux or Windows.
A Booksy Biz owner account. Some reports, such as Staff Members, need Booksy Biz Pro. Booksy sends one-time Message Blasts on a paid plan only, not during the free trial.
Install
git clone https://github.com/cotletdev/booksy-api-mcp-server.git
cd booksy-api-mcp-server
python3 -m venv .venv
. .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -e .
booksy-mcp --versionWith uv: uv venv && uv pip install -e ., then uv run booksy-mcp ....
Setting it up with an AI agent (Claude Code, Codex, Cursor)? Open it in this folder and ask it to set up the repo: AGENTS.md tells it every step, and it asks you only for the steps in Chrome.
To update: git pull && pip install -e .. We copy every change of the hosted Booksy tools into this repo.
Connect your Chrome
Option A: your everyday Chrome (recommended)
Open
chrome://inspect/#remote-debuggingin Chrome and switch remote debugging on. Chrome then accepts DevTools connections from programs on this computer, and asks you before each one.Make sure you are signed in to Booksy Biz at booksy.com/pro. Keep a tab of the panel open, because
connectreads the session in it. With no Booksy tab open, it opens one in the background and closes it again.Run:
booksy-mcp connectChrome asks whether to allow the connection. Click Allow.
Saved 41 Booksy cookies and 50 localStorage keys to /Users/you/.config/booksy-api-mcp/session.json
Signed in to Booksy as Maria Lopez (Studio Maria)You can switch remote debugging off again afterwards. Leave it on if you want the server to pick up a new session by itself after Booksy signs you out.
connect looks for Chrome's DevToolsActivePort file in the default profile folder. For Chrome Beta, Canary or a custom profile folder, pass --profile-dir "<folder>".
Option B: a Chrome with a debugging port
Chrome does not open a debugging port on your default profile, so start a separate one, sign in to Booksy Biz there once, and connect to it:
# macOS
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --remote-debugging-port=9222 --user-data-dir="$HOME/.chrome-booksy"
# Linux
google-chrome --remote-debugging-port=9222 --user-data-dir="$HOME/.chrome-booksy"
# Windows
"C:\Program Files\Google\Chrome\Application\chrome.exe" --remote-debugging-port=9222 --user-data-dir="%USERPROFILE%\.chrome-booksy"
booksy-mcp connect --cdp http://127.0.0.1:9222--cdp also takes a ws:// DevTools URL, for example of a Chrome on another machine reached over an SSH tunnel.
There is no option to paste a cookie by hand, since Booksy has no session cookie. A server with no Chrome can use a session.json copied from a machine where connect ran.
Check the session at any time:
booksy-mcp statusMCP server
The MCP server lists every tool with its input schema, a description written for agents, and hints. Read tools are marked read-only, and tools that reach clients (bookings, reschedules, cancellations, review replies, blasts) are marked so your client asks before running them.
Claude Code
claude mcp add booksy -- /path/to/booksy-api-mcp-server/.venv/bin/booksy-mcp mcp
# read only:
claude mcp add booksy -- /path/to/booksy-api-mcp-server/.venv/bin/booksy-mcp mcp --read-onlyClaude Desktop
~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"booksy": {
"command": "/path/to/booksy-api-mcp-server/.venv/bin/booksy-mcp",
"args": ["mcp"]
}
}
}Cursor
~/.cursor/mcp.json, the same block as Claude Desktop. A ready copy is in mcp.json.
Codex
~/.codex/config.toml:
[mcp_servers.booksy]
command = "/path/to/booksy-api-mcp-server/.venv/bin/booksy-mcp"
args = ["mcp"]Over HTTP
booksy-mcp serve also serves MCP over streamable HTTP at http://127.0.0.1:8787/mcp, for clients that take a URL:
booksy-mcp serve
claude mcp add --transport http booksy http://127.0.0.1:8787/mcpThen ask your agent things like:
What does tomorrow look like? List the appointments and any gaps longer than an hour.
Tom is off on Friday. Move his bookings to whoever is free at about the same time, and show me the plan first.
Compare last week's revenue per staff member with the week before.
Which clients have not been in for 60 days and have nothing booked?
REST API
booksy-mcp serve # http://127.0.0.1:8787, MCP at /mcp, docs at /docsEach tool has its own route under /api/v1/booksy, the same paths as the hosted API at cotlet.dev, so code written against one works with the other. Path parts and the query string are arguments, and a JSON body adds the rest.
curl 'http://127.0.0.1:8787/api/v1/booksy/services'
curl 'http://127.0.0.1:8787/api/v1/booksy/appointments?from=2026-10-27&to=2026-10-31'
curl 'http://127.0.0.1:8787/api/v1/booksy/services/8307205/open-slots?date=2026-10-27'
curl -X POST http://127.0.0.1:8787/api/v1/booksy/staffs/882081/time-offs \
-H 'Content-Type: application/json' \
-d '{"start": "2026-11-02", "end": "2026-11-06", "reason": "vacation"}'Any tool by name, body as its arguments:
curl -X POST http://127.0.0.1:8787/api/v1/booksy/tools/find_client -d '{"query": "nowak"}'GET /api/v1/booksy/tools: every tool with its route, input schema and an example answer.GET /docs: interactive OpenAPI docs,GET /openapi.jsonthe schema, for n8n, Postman or a generated client.Answers are JSON.
list_clientsreturnsnext_cursor; pass it back ascursorfor the next page. Reviews and notifications takepage.
The server listens on 127.0.0.1 only. To reach it from another device of yours, set a token, and every request then needs Authorization: Bearer <token>:
BOOKSY_MCP_TOKEN=$(openssl rand -hex 24) booksy-mcp serve --host 0.0.0.0Python and the example scripts
Straight from Python, no server needed:
from booksy_api_mcp import call
from booksy_api_mcp.scripting import paginate, write_rows
services = call("list_services")["services"]
day = call("list_appointments", {"from": "2026-10-27", "to": "2026-10-27"})["appointments"]
clients = list(paginate("list_clients", {"not_visited_days": 60, "limit": 100}, "clients"))
write_rows(clients, "slipping-away.csv")
call("add_time_off", staff_id="882081", start="2026-11-02T13:00", end="2026-11-02T14:00", reason="Lunch")Or one tool from the shell: booksy-mcp call find_open_slots service_id=8307205 date=2026-10-27, or with a JSON object. An ID stays text where the tool takes text.
Times are local to the business. A date-time without a zone is read in the business's time zone, and answers carry its offset.
Ready scripts in examples/. Each prints JSON or a short list, takes --out file.csv or --out file.json where it makes sense, and --help:
Script | What it does |
Tomorrow's appointments, one line each, and the open slots left for a service. | |
Moves one staff member's appointments on a day to colleagues free within an hour of the original time. Prints the plan; | |
Adds whole days off or blocks hours on one day, or removes a time off. | |
Clients to CSV or JSON: contact, note, visits, no-shows, revenue, last visit. | |
Clients not seen for N days, minus anyone booked in the next 30 days. | |
One Message Blast to those lapsed clients, after it shows the reach and SMS cost and asks. | |
Appointments and revenue per staff member, last week against the week before, big moves flagged. | |
Reviews without a reply, lowest rating first; | |
Adds a client card with no invitation, or a note to an existing one. |
python examples/tomorrows_appointments.py --open-slots-for 8307205
python examples/reschedule_day.py --staff-id 882081 --date 2026-10-27
python examples/export_clients.py --not-visited-days 60 --out slipping-away.csvOn a schedule, cron on your own computer works while it is on: 0 19 * * * cd ~/booksy-api-mcp-server && .venv/bin/python examples/tomorrows_appointments.py.
All 28 tools
IDs come from the list tools: service_id from list_services, staff_id from list_staff, client_id from list_clients or find_client, appointment_id from list_appointments. booksy-mcp tools prints this list, booksy-mcp tools --json adds the input schemas.
Calendar
Tool | Access | REST route | What it does |
| read |
| Appointments in a date range with client, service, staff, time and status. |
| read |
| One appointment: services, staff, times, price, client and notes. |
| read |
| Free start times for a service on one day, from working hours, bookings, blocks and time off. |
| write |
| Book a client for one service at a start time; Booksy checks the slot first. |
| write |
| Move an appointment to a new start time, and optionally to another staff member. |
| write |
| Cancel an appointment and free its time in the calendar. |
Time off
Tool | Access | REST route | What it does |
| read |
| Staff time off and blocked hours in a date range. |
| write |
| Block a staff member's calendar so no one can book it: whole days off or a few hours. |
| write |
| Remove time off or a blocked period so the time can be booked again. |
Clients
Tool | Access | REST route | What it does |
| read |
| Clients with contact details, visit counts and last visit, plus Booksy's client groups. |
| read |
| Client cards matching a name, email or phone. |
| read |
| One client card: contact details, private note, counts and visit history. |
| write |
| Add a client card to your client list. Needs a phone or an email. |
| write |
| Change a client card's name, phone, email, birthday or private note. |
| write |
| Add a dated line to a client's private note, keeping what is there. |
| write |
| Remove a client card from your client list. |
Business setup
Tool | Access | REST route | What it does |
| read |
| Your service menu with category, variants, duration, price and the staff who offer each. |
| read |
| Staff members with their working hours for a week and the services they offer. |
| read |
| Weekly opening hours, time zone and booking lead times of the business. |
| read |
| Your business's name, address, contact, opening hours, booking policy, rating and plan status. |
| read |
| Text message allowance and usage, client message channels and your notification settings. |
| read |
| Notifications from the panel's bell: new bookings, changes, cancellations, reviews. |
Reviews
Tool | Access | REST route | What it does |
| read |
| Client reviews of your business with rating, text, services, staff and your reply. |
| write |
| Post or change your public reply to a client's review. |
Message Blasts
Tool | Access | REST route | What it does |
| read |
| Message Blast templates (automated and one-time) and the blasts scheduled to go out. |
| read |
| Count who a Message Blast would reach and its SMS cost, without sending it. |
| write |
| Send one message to chosen clients by email, SMS or push notification. |
Stats & Reports
Tool | Access | REST route | What it does |
| read |
| Numbers from Stats & Reports for a day, week, month or year, as JSON. |
Writes run Booksy's own dry run first, and send the client no notice unless you pass notify_client. New clients get no invitation. send_message_blast refuses an empty client list, because Booksy reads an empty list as every client.
Never built, on purpose: your Booksy sign-in, email, password and account deletion, and anything that moves money (subscription, payments, payouts, billing). Every request passes a guard that refuses those Booksy paths.
Configuration
Variable | Default | What it does |
|
| Folder of |
| Proxy for every request to Booksy, e.g. | |
|
| |
| Bearer token required by | |
|
| Address of |
Security and your Booksy account
Your password never reaches this code. Only the session the panel already keeps is read, and only that of booksy.com.
The session file is yours.
session.jsonis created with mode 0600 and holds your Booksy access token. Anyone who has it can act as you in Booksy Biz, so keep it out of git and shared folders.Local by default.
servebinds to127.0.0.1and refuses another address withoutBOOKSY_MCP_TOKEN.booksy.com only. Requests and redirects outside booksy.com are refused.
Read-only mode.
--read-onlyorBOOKSY_MCP_READ_ONLY=1exposes the 17 read tools only.Actions reach real people. A booking, a move with
notify_client, a cancellation, a review reply and a blast reach your clients. MCP clients ask before running them; a script does not, so try it on a test client of your own first.Do not spam. Blasts to people who did not agree break Booksy's rules and the law in many countries. You are responsible for what runs in your account.
Errors
The REST API answers {"error": "<code>", "message": "..."}. The MCP server returns the same code and message as a tool error.
Status | Code | What to do |
401 |
| No session, or Booksy signed you out. Sign in to Booksy Biz in Chrome and run |
403 |
| Your Booksy plan or role cannot do this, e.g. a Pro report on Booksy Biz Lite. |
403 |
| The server runs read-only, or the request would change your Booksy account itself. |
403 |
| Booksy refused the request or showed a bot check. Open the panel in Chrome once, then retry. |
409 |
| Booksy asks for a CAPTCHA. Solve it in Chrome. |
422 |
| An argument is missing or wrong; the message names it. |
429 |
| Booksy is limiting the account. Wait a few minutes. |
502 |
| Booksy answered with an error, or changed its panel. |
Self-hosted or hosted
This repo | ||
Tools | the same 28 | the same 28 |
Runs | on your computer, while it is on | in the cloud, 24/7 |
Booksy session | your Chrome, saved in a local file | your own Cloud Browser in the EU, profile encrypted with AES-256-GCM |
When Booksy changes its panel |
| fixed for you, every tool tested daily |
Approvals | your MCP client asks per call | bookings, reschedules, replies and blasts wait for your OK, switchable per tool |
Works with | MCP clients on your machine, local scripts | Claude.ai and ChatGPT connectors, n8n, Make, Zapier, any HTTP client |
Who may use it | you, for noncommercial use | teams, businesses, agencies |
Price | free | free 7-day trial with 2,000 credits, no card; then one-time packs from $29 for 5,000 credits |
On the hosted version a successful call uses 20 to 30 credits (25 for most tools), failed calls are free, and the Cloud Browser uses 50 credits a day while it has an app enabled for agents. Full pricing.
FAQ
Does Booksy have an official API? Not one a business owner can use. Booksy runs a partner API whose docs at docs.booksy.com ask for a login, so you cannot get keys for your own account (checked 11 Oct 2026). Stats & Reports and Message Blasts are not among its public areas. Details: cotlet.dev/integrations/booksy-api-mcp-server.
Is there a Booksy MCP server for Claude, ChatGPT or Cursor?
Yes, this one runs on your machine: booksy-mcp mcp for Claude Code, Claude Desktop, Cursor and Codex. ChatGPT and Claude.ai connectors need a public HTTPS URL, which the hosted Booksy MCP server gives you.
Is there a Booksy Zapier app? We could not confirm one. Owners who want bookings elsewhere forward Booksy confirmation emails to a Zapier email parser. That copies new bookings one way and cannot change anything in Booksy.
Can I export my Booksy clients to CSV?
Yes: python examples/export_clients.py --out clients.csv. Every client card with contact details, note, visits, no-shows, revenue and last visit, across all pages.
Can it find free slots and book for me?
find_open_slots gives the free starts for a service on a day, per staff member, each checked with Booksy's own dry run. create_appointment books one of them for a client, and the client hears about it only with notify_client.
Can it send Message Blasts?
Yes, send_message_blast by email, SMS or push, on a paid Booksy plan. Run estimate_message_blast first for the reach and the SMS cost. In the EU only clients who gave marketing consent get it.
Does it work outside the US?
Yes. Booksy runs a separate API per country, and the server picks it from your session: us.booksy.com, pl.booksy.com, es.booksy.com and so on.
Why does it need my Chrome? To read your Booksy session without your password. Chrome is used once per sign-in, not for each call.
What happens when Booksy signs me out?
Calls fail with auth_expired. With Chrome remote debugging on, the server reads the new session on the next call (click Allow when Chrome asks). Otherwise run booksy-mcp connect again.
Can it run on a VPS or in Docker?
Technically yes, with a session.json copied from your computer. Booksy then sees your session from a datacenter IP, which looks less like you. For an always-on setup the hosted version keeps your session in your own Cloud Browser on a fixed IP.
Will my Booksy account get banned? Requests carry Chrome's fingerprint and go out one at a time, as you would click. Nobody can promise a platform never acts. Keep to your normal use and do not blast people who did not agree.
Can I use it for my salon or for my clients? No. The license allows noncommercial use only, and running your own business counts as business use. For a salon, a team or client work, use Cotlet or write to contact@cotlet.dev.
Is it open source? The source is public, the license is not an open source license: noncommercial use only, no business use.
A tool broke or I need another one. Open an issue with the tool name and the error message.
License
PolyForm Noncommercial License 1.0.0. In short:
Allowed: noncommercial use: you, for your own personal purposes with your own Booksy account, or a charity, school, public research or government body. Changing the code, and sharing it under the same license.
Not allowed: any commercial use, your own business included; client work; selling or offering it, or a service built on it.
Maintained by Cotlet (@cotletdev). Booksy is a trademark of its owner. This project is unofficial and not affiliated with, endorsed or sponsored by Booksy.
Available Tools
28 toolsadd_clientAdd clientAInspect
Add a client card to your client list. Needs a phone or an email.
Adds one client card with a name, a phone or an email (Booksy needs one of them), and optionally a private note and a birthday. The client is not invited to the Booksy app and gets no message, so add_client runs without asking first. delete_client removes the card again. A card deleted earlier with the same email or phone comes back with its old visits, note and birthday unless new ones are given.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Full name; the last word is the last name. | |
| note | No | Private note, seen only by the business. | |
| No | Email address. | ||
| phone | No | Mobile phone, best in international format (+48 600 100 200). | |
| birthday | No | YYYY-MM-DD. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing side-effect scope (client is not invited, no message is sent, safe to run without confirmation) and a non-obvious state behavior: a previously deleted card matching the same email/phone is resurrected with its old visits, note and birthday unless new values are supplied. That resurrection/overwrite rule is exactly the kind of hidden behavior annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the hard requirement (phone or email) are front-loaded, and the closure/confirmation facts come next. There is mild redundancy between 'Add a client card to your client list' and 'Adds one client card with a name', and the final sentence packs two distinct ideas (undo path and resurrection) together.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-param mutation with full schema documentation and no output schema, the description covers side effects, confirmation policy and the interesting resurrection rule. The remaining gap is what the call returns (e.g., a new client id), which matters for follow-up calls like add_client_note or get_client and is unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds a real cross-field constraint absent from the schema: at least one of phone or email is required ('Booksy needs one of them') even though only name is marked required. It also flags that birthday and note are optional/private, reinforcing the schema rather than merely repeating it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Add a client card to your client list') and immediately names the counterpart sibling ('delete_client removes the card again'). An agent can distinguish it from find_client/update_client/list_clients without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear usage context — no invite, no message, no confirmation prompt needed before calling — and names delete_client as the inverse operation. It stops short of explicitly contrasting add_client with update_client for an already-existing client, which is the one genuinely ambiguous routing decision among the siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_client_noteAdd client noteAInspect
Add a dated line to a client's private note, keeping what is there.
Booksy keeps one private note per client card, seen only by the business. This adds a new line starting with today's date under the existing text. The client is not told.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | The line to add. | |
| client_id | Yes | From list_clients or find_client. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare a non-destructive, non-idempotent write; the description adds real context beyond that: the write is append-only ('keeping what is there'), the text is auto-prefixed with today's date, the note is business-private, and the client receives no notification. The notification-free and append semantics are exactly the side effects an agent cannot infer from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action and its preservation guarantee, followed by model context and the non-notification fact. No filler or restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter append mutation with annotations and no output schema, the description covers the essentials: what is added, what is kept, who can see it, and that the client isn't notified. It doesn't say what the call returns or what happens at the 1000-character limit, but neither is critical to correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented in the schema, establishing the baseline of 3. The description adds only the implication that the caller supplies the line text while the date prefix is generated, which is marginal beyond what the schema states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Add a dated line to a client's private note') plus the key invariant that existing text is preserved. The second sentence explains the underlying model (one private note per client card), which separates it from update_client and other client mutators.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for when this tool applies: you want to append a timestamped observation to the single private note rather than overwrite client fields. It doesn't explicitly name an alternative (e.g. update_client) or state exclusions, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_time_offAdd time offAInspect
Block a staff member's calendar so no one can book it: whole days off or a few hours.
Two dates (YYYY-MM-DD) add whole days of time off, like Staff > Shifts. Two date-times on the same day block those hours in the calendar, like a time reservation. Booksy refuses a block over existing appointments. It reaches no client; remove_time_off takes it back.
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | Last day off, inclusive (YYYY-MM-DD), or the end of the blocked hours on the same day. | |
| start | Yes | A day (YYYY-MM-DD) for whole days off, or an ISO 8601 date-time to block hours. | |
| reason | No | Whole days: vacation, sick_day, personal_day, training or other (other text is kept as a note). Hours: any label, e.g. Lunch. | |
| staff_id | Yes | Staff ID from list_staff. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, the description discloses that the operation reaches no client, that Booksy rejects blocks over existing appointments, and that remove_time_off reverses it. It does not describe permission requirements or the response shape, but it adds meaningful behavioral context consistent with non-read-only, non-idempotent annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four tight sentences, front-loads the core action, and each sentence contributes distinct information about modes, errors, and reversal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
It covers the mutation's purpose, dual modes, error condition, and inverse operation, which is sufficient for correct invocation. With no output schema, it could say more about the return value, but the essential behavioral context is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds interpretive value by mapping the start/end formats to whole-day versus partial-hour blocking semantics. That clarification complements rather than repeats the schema's per-field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: blocking a staff member's calendar for whole days or hours. It distinguishes the two operating modes and names the inverse sibling, remove_time_off, so the agent can tell it apart from appointment creation and time-off listing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly explains the two usage modes based on parameter formatting (two dates vs. two date-times on the same day) and notes that Booksy refuses blocks over existing appointments. It also points to remove_time_off for reversal, but does not explicitly exclude using create_appointment for bookable slots.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_appointmentCancel appointmentADestructiveInspect
Cancel an appointment and free its time in the calendar.
Cancels one appointment as the business. The client is told only with notify_client. A deposit, if any, follows the business's deposit settings. Booksy refuses appointments it no longer lets you cancel (can in get_appointment). There is no undo; book again with create_appointment.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | No | Why it is cancelled; saved as the appointment's note. | |
| notify_client | No | Tell the client by email and SMS through Booksy. Default: false. | |
| appointment_id | Yes | Appointment ID from list_appointments. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral context beyond the annotations: client notification depends solely on notify_client, deposit handling follows business settings, non-cancellable appointments are refused, and there is no undo. These details are exactly what an agent needs for a destructive, non-idempotent mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action, then efficiently covers side effects, failure conditions, irreversibility, and the rebooking alternative. Every sentence carries operational value with no wasted phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive cancellation tool with no output schema, the description covers the critical gaps: side effects, deposit implications, refusal conditions, irreversibility, and the follow-up path. An agent has enough context to invoke it correctly and understand the consequences.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all three parameters are already documented in the input schema. The description adds useful context for notify_client and appointment_id behavior, but it does not add meaning for reason beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Cancel an appointment and free its time in the calendar.' It also distinguishes the operation from rebooking by naming create_appointment and from cancellability checks by naming get_appointment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use this tool and what alternatives exist, including checking get_appointment for cancellability and using create_appointment to book again after cancellation. It also clarifies that the client is notified only when notify_client is used.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_appointmentCreate appointmentADestructiveInspect
Book a client for one service at a start time; Booksy checks the slot first.
Books one client card for one service. The end follows the service's duration. Booksy's dry run checks the staff member is free first; a busy slot is refused, never double-booked. The client gets Booksy's confirmation only with notify_client. dry_run returns the same answer with saved false and keeps nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | Internal note, only staff see it. | |
| start | Yes | ISO 8601. Without a time zone it is the business's local time. | |
| dry_run | No | Only check the time and price; nothing is saved. Default: false. | |
| staff_id | No | Staff ID from list_staff. Default: the first one who offers the service. | |
| client_id | Yes | Client ID from list_clients or add_client. | |
| service_id | Yes | service_id from list_services (its first variant), or a variant_id. | |
| notify_client | No | Send Booksy's booking confirmation to the client. Default: false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Substantially beyond the annotations: it discloses that the end time is derived from the service duration, that Booksy pre-checks staff availability, and that a busy slot is refused rather than double-booked. It also confirms dry_run saves nothing and returns saved=false. It omits any undo path, though a created appointment is reversible via cancel_appointment, and the destructiveHint=true annotation is not directly explained.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then behaviour, then the dry-run caveat — good ordering with no filler. The opening two sentences overlap ('Book a client for one service at a start time' / 'Books one client card for one service'), which costs a little.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a seven-parameter mutation with no output schema, the description covers what gets created, how availability is enforced, notification behaviour, and the dry-run contract. What is missing is failure/edge handling (invalid client or service, permission requirements) and what the saved result looks like.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all seven parameters are already documented. The description adds only marginal semantic value, mainly the coupling between start and service duration and the cardinality of one client/one service. Baseline 3 is appropriate when the schema carries the parameter burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names a specific verb and resource with tight scope: book one client, for one service, at one start time. An agent can distinguish it from cancel_appointment or reschedule_appointment by name, but the description never explicitly routes against those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives real conditional guidance: use dry_run to check slot and price without saving, and add notify_client only when the client should get a confirmation. It never states exclusions (e.g. that existing bookings should go through reschedule_appointment instead) or prerequisites beyond pointing at list_staff/list_clients via the schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_clientDelete clientADestructiveInspect
Remove a client card from your client list.
Deletes the card the way the panel's Delete button does. The client is not told. Past appointments stay in the calendar.
| Name | Required | Description | Default |
|---|---|---|---|
| client_id | Yes | From list_clients or find_client. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is covered; the description goes further by disclosing blast radius (past appointments preserved) and a real side effect (the client is not notified). It stops short of stating reversibility or what happens on a repeat delete, despite idempotentHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each earning its place: action, fidelity to the UI behavior, and consequence. The core action is front-loaded and nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter destructive tool with rich annotations and no output schema, the description covers consequences and non-effects well. A minor gap remains around what happens when the card is already gone (annotations say non-idempotent) and whether the removal is recoverable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the sole parameter client_id already documents its source (list_clients or find_client). The description adds no further meaning about the identifier, so 3 is the correct baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (remove) and resource (client card from client list) plus an explicit scope boundary: past appointments stay in the calendar. This separates it from related siblings like cancel_appointment or update_client without requiring the schema to be opened.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the clear 'remove a client card' framing, and the note that appointments are untouched implicitly rules out using this to cancel bookings. However, it never states when to prefer this over update_client or what prerequisites (e.g., existing client, permissions) apply.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
estimate_message_blastEstimate Message BlastARead-onlyIdempotentInspect
Count who a Message Blast would reach and its SMS cost, without sending it.
Asks Booksy what send_message_blast would do with the same clients, channel and text: how many clients it reaches, how many emails, texts or push notifications go out and what the texts cost beyond the plan's free allowance. Where the law asks for marketing consent (EU), consented counts only the clients who agreed; send_message_blast sends to those. Nothing is sent.
| Name | Required | Description | Default |
|---|---|---|---|
| channel | Yes | email, sms or push. | |
| message | Yes | Message text; its length sets the SMS parts. | |
| client_ids | Yes | Recipients from list_clients. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds genuine context beyond them: consent semantics in EU jurisdictions ('consented counts only the clients who agreed'), SMS cost beyond the plan's free allowance, and the guarantee that nothing is sent. It could go further on return shape or error behavior, but it meaningfully supplements the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first sentence, followed by a focused second paragraph on consent and cost. Slight redundancy between 'without sending it' and the closing 'Nothing is sent' keeps it from a 5, but every sentence largely earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only estimate tool with no output schema, the description explains what the caller receives (reach counts, per-channel send counts, SMS cost) and the consent nuance that changes the count. Minor gaps remain around invalid client IDs or partial failures, but the core call context is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all three parameters are already documented, including that message length sets SMS parts and client_ids come from list_clients. The description echoes the same facts ('same clients, channel and text') but adds little new parameter-level meaning. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (count/estimate) and resource (who a Message Blast reaches and its SMS cost), and immediately distinguishes itself from send_message_blast ('without sending it'). An agent can tell exactly what this tool produces versus its sibling without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames itself as the dry-run counterpart to send_message_blast: 'Asks Booksy what send_message_blast would do with the same clients, channel and text.' The alternative is named and the condition that selects it (wanting to preview rather than send) is clear, reinforced by 'Nothing is sent.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_clientFind clientARead-onlyIdempotentInspect
Client cards matching a name, email or phone.
Searches the client list the way the Clients page's search box does and returns the matching cards with contact details, note and visit counts. A card added a moment ago can take a few seconds to show up in search; get_client reads it by ID at once.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Most matches to return. Default: 10. | |
| query | Yes | Name, email or phone (or a part of one). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent and non-destructive, so safety is covered. The description adds behavior beyond them: the result set includes contact details plus note and visit counts, and the search index is eventually consistent ("a few seconds" lag), which is exactly the kind of trait an agent needs to avoid wrong conclusions from an empty result.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with what it matches and what it returns. The match fields are repeated from the schema's query description, a minor redundancy, but nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read tool with full schema coverage and no output schema, it covers matching semantics, returned fields, and the indexing-lag caveat with a fallback tool. Only result ordering is unaddressed, which is a small gap for a search tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented, including that query takes a partial name/email/phone and that limit defaults to 10 with a max of 50. The description adds little parameter-level detail beyond restating the match fields, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The definition states the resource (client cards), the match fields (name, email, phone) and the returned payload (contact details, note and visit counts). The second sentence explicitly separates it from get_client, which reads a single card by ID, so an agent can pick between them without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names the alternative (get_client) and the condition that selects it: a just-created card may not be indexed yet, so fetch by ID instead. It does not say when to prefer list_clients over this search, which leaves one sibling relationship implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_open_slotsFind open slotsARead-onlyIdempotentInspect
Free start times for a service on one day, from working hours, bookings, blocks and time off.
Returns free start times for one service on one day, earliest first, for each staff member who offers it (or only staff_id). Starts follow the service's time slot interval and leave room for its duration; past times are left out. Booksy's own booking check confirms every slot returned. Pass start and staff_id to create_appointment.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Day to check. | |
| limit | No | 1 to 30 slots, earliest first. Default: 12. | |
| staff_id | No | Only this staff member. Default: anyone who offers the service. | |
| service_id | Yes | service_id from list_services (its first variant), or a variant_id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive, yet the description adds real behavioral detail: results are earliest-first, respect the service's slot interval and duration, and exclude past times. 'Booksy's own booking check confirms every slot returned' is a useful guarantee, though it is phrased vaguely enough that its exact meaning is unclear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening sentence and the first clause of the second ('Free start times for a service on one day' vs 'Returns free start times for one service on one day') are near-duplicates, wasting space. The content is front-loaded and the remainder earns its place, but the redundant lead-in costs it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing returns and does so: free start times, earliest first, per staff member, capped by limit. It does not describe the concrete response shape (e.g. start timestamps with staff associations), leaving a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all four parameters are already documented in the schema, including the staff_id default and the limit range. The description's 'for each staff member who offers it (or only staff_id)' largely restates the schema's staff_id default rather than adding new semantics, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope: 'free start times for one service on one day', and enumerates the inputs it considers (working hours, bookings, blocks, time off). An agent can distinguish this from list_appointments or get_business_hours without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The closing line 'Pass start and staff_id to create_appointment' establishes the natural follow-on action, implying this is the availability check that precedes booking. However, it never states when this tool should be avoided or how it compares to alternatives such as list_appointments, so the guidance is contextual but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_appointmentGet appointmentARead-onlyIdempotentInspect
One appointment: services, staff, times, price, client and notes.
Returns one appointment with each service's staff member, times and price, the client, the total and the notes. note is the internal note only staff see; client_note is the note shown to the client. can lists what Booksy allows now (cancel, change, confirm, decline, no_show).
| Name | Required | Description | Default |
|---|---|---|---|
| appointment_id | Yes | Appointment ID from list_appointments. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly, idempotent, non-destructive), and the description goes well beyond them by defining the returned semantics: 'note' is staff-only while 'client_note' is client-visible, and 'can' enumerates the currently permitted actions (cancel, change, confirm, decline, no_show). Those are non-obvious behaviors an agent cannot get from annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Field list is front-loaded and the second paragraph adds semantics rather than repeating verbatim, though it does re-list the same return fields (services, staff, times, price, client, notes) at some length. Minor redundancy, no wasted filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description has to describe returns, and it does so adequately for a single-record fetch, including the ambiguous note fields and the 'can' capability list. It stops short of stating failure behavior or whether the appointment must exist or be accessible to the caller.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one parameter with 100% schema description coverage, and the schema already explains that the ID comes from list_appointments. The description adds no format, validation, or lookup guidance beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening line 'One appointment: services, staff, times, price, client and notes' names the resource and its scope (single record) with the fields returned, which implicitly separates it from the sibling list_appointments. It never names that sibling explicitly, so the differentiation is inferable rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent must infer that this is the drill-down call for an appointment_id obtained elsewhere (the schema notes 'Appointment ID from list_appointments'). There is no explicit when-to-use versus list_appointments or when-not clause.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_business_hoursGet business hoursARead-onlyIdempotentInspect
Weekly opening hours, time zone and booking lead times of the business.
Reads the opening hours set in Business details: open ranges for each day (an empty list is closed), the note shown with them, the business's time zone and address, and how early and how late clients may book or change a visit.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent and non-destructive, so the description is free to add semantics: an empty list means closed, and the payload covers address, note, time zone and booking windows. The only omission is any hint of return shape or pagination, which matters little for a single-object read.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the payload front-loaded in the first line and the data-source clarification second. Nothing is padded, though the second sentence runs a bit long by stacking note, time zone, address and booking windows.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description has to carry the return values, and it does: hours per day, closed-day sentinel, note, time zone, address and booking lead times. A 4 rather than 5 because it does not say whether hours are staff-specific or business-wide only.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters, so the baseline is 4. The description correctly explains that the result is implicitly scoped to the caller's business rather than requiring an id, which is the one parameter question an agent could have.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the resource and exactly what it returns: weekly opening hours, time zone, booking lead times, the note and address. This clearly separates it from get_business_profile and get_settings, which an agent might otherwise confuse with it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The framing 'Reads the opening hours set in Business details' implies this is the canonical source for operating hours, but it never says when to pick this over get_business_profile or get_settings, nor that it takes no arguments because it is tenant-scoped. Usage is inferable but not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_business_profileGet business profileARead-onlyIdempotentInspect
Your business's name, address, contact, opening hours, booking policy, rating and plan status.
Reads the business record behind your Booksy profile: name, address and time zone, phone, public email, website, description, weekly opening hours, how far ahead clients can book and change, review rating, whether the profile is visible in the Booksy marketplace, and the plan status with the trial end date.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds substantive context beyond that: it discloses the scope of data exposed (including visibility in the marketplace, booking lead time limits, and trial end date), which helps the agent understand what it will reveal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The summary sentence is front-loaded and the second paragraph enumerates the payload efficiently. There is mild redundancy — name, address and contact details appear in both sentences — but no filler or hedging.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no parameters, the description carries the burden of telling the agent what comes back, and it does so field-by-field. It stops short of formats (time zone representation, hours structure, date format for trial end) and of error/no-profile behavior, which would make it fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. The description correctly makes no claims about inputs and instead spends its words on the return payload, which is the right allocation for a parameterless read.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ("Reads the business record") with a clearly bounded resource and enumerates the exact fields returned. It implicitly distinguishes itself from narrower siblings like get_business_hours and get_settings by stating the profile record is the superset being read.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the phrase "the business record behind your Booksy profile" — an agent can infer this is the entry point for account-level info rather than hours or settings. There is no explicit when-to-use/when-not-to-use guidance nor any named alternative tool, which is a real gap given 28 siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_clientGet clientARead-onlyIdempotentInspect
One client card: contact details, private note, counts and visit history.
Reads one client card of the business by ID: name, email, phone, birthday, private note, tags, whether the client is blocked or uses the Booksy app, visit, no-show and cancellation counts, revenue, and the visits (past and upcoming appointments) with times, services, staff, status and total. A visit's appointment_uid is the appointment_id of get_appointment.
| Name | Required | Description | Default |
|---|---|---|---|
| client_id | Yes | From list_clients or find_client. | |
| visits_limit | No | Visits to return. Default: 20. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/openWorld, so the safety profile is covered; the description adds real value by disclosing the specific data exposed, including a private note and blocked/Booksy-app status. It does not mention error behavior for an unknown ID or any rate/permission constraints, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence is a front-loaded summary and the second supplies the field inventory, which is a sound structure. There is mild redundancy — 'contact details' in the lead is then re-expanded as name, email, phone, birthday — but the length is justified by having to describe return contents with no output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of explaining returns and does so thoroughly, down to the cross-tool mapping that a visit's appointment_uid equals get_appointment's appointment_id. That mapping is exactly the non-obvious connective detail an agent needs to chain these calls.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are already documented there, including the client_id source and the visits_limit default and 0-100 bounds. The description adds no parameter-level detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Reads one client card of the business by ID') and enumerates the returned fields, making it clear this is a single-record fetch rather than a list. The distinction from list_clients and find_client is implied by 'one client card ... by ID' rather than named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the reader infers this is the drill-down after list_clients or find_client (that hint lives in the schema's client_id description, not the tool description). There is no explicit when-to-use/when-not or named-alternative routing to find_client for lookup by name or phone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_reportGet reportARead-onlyIdempotentInspect
Numbers from Stats & Reports for a day, week, month or year, as JSON.
Returns one Stats & Reports category for a period: dashboard gives the totals for appointments, revenue and clients with the change against the previous period; any other category gives its highlight tables and the list of its reports. Pass report with a key from that list for the full report. Booksy counts one day, one Monday-to-Sunday week, one calendar month or one calendar year, so from and to must be such a period. Amounts come formatted in the business's currency. Booksy Biz Lite has the dashboard, revenue, appointments and clients; cash_flow, inventory, staff_members and marketing need Booksy Biz Pro.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Last day, inclusive: the same day, a Monday-to-Sunday week, a calendar month or year. | |
| from | Yes | First day, inclusive. | |
| report | No | Report key from `reports` of the category (e.g. appointments_summary) for its full tables. | |
| category | Yes | dashboard (totals), appointments, clients, revenue, cash_flow, staff_members, marketing, tips or inventory. | |
| staff_id | No | Staff member, only for the report performance_per_staffer. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description layers on real behavioral context: the period-alignment rule for from/to, currency-formatted amounts, and a plan-tier gate. It stops short of saying what happens when a Lite business requests a Pro-only category (error vs. empty), which is the one behavioral edge an agent could still hit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and return shape, then progressively narrower rules (category selection, report key, period alignment, plan availability). Dense but every sentence carries a distinct constraint; the plan-availability clause could be tightened slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing returns and does so per category (dashboard totals plus delta vs. prior period; other categories expose highlight tables and a report list). Adequate for a 5-parameter read tool, with only the plan-restriction failure mode left unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning the schema does not: that `from`/`to` must land on a whole day/week/month/year boundary as Booksy counts it, and how `report` relates to the `reports` list returned by a category. `staff_id` scoping is left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Numbers from Stats & Reports ... as JSON') and immediately scopes it to a period and a single category. No sibling tool overlaps this territory, so an agent can route here without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly explains when to use which category (dashboard for totals, other categories for highlight tables), when to add the `report` key (to get full tables), and when the tool is available at all (dashboard/revenue/appointments/clients on Lite; the rest need Pro). This is genuine routing guidance, not inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_settingsGet settingsARead-onlyIdempotentInspect
Text message allowance and usage, client message channels and your notification settings.
Reads the settings an agent needs before messaging clients: whether SMS and email to clients are on, the free and paid text allowance with this period's usage and price per text part, and which booking events notify you by email or push. Changes stay in the Booksy app.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent safety, and the description adds genuine value on top: the exact scope of what settings are returned (allowance, usage, price per text part, booking-event notification channels) and the fact that the data is read-only with edits made in the Booksy app. Return shape is described more richly than the annotations alone would convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, both front-loaded with the substantive scope; the first sentence is a compressed noun list that reads slightly like a fragment but still earns its place by enumerating the setting categories. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of explaining what comes back, and it does so by enumerating the returned settings categories. An agent knows what it will get and that the state is read-only; only the exact response shape (field names, units) is unspecified, which is acceptable for a settings read.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4; there is nothing for the description to disambiguate and it correctly makes no parameter claims.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource precisely: message allowance/usage, client messaging channels, and notification settings, with a clear read verb ("Reads the settings an agent needs before messaging clients"). It is specific and concrete, but it does not explicitly distinguish itself from the closest sibling, list_notifications, which covers the notification feed rather than the notification preferences.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Reads the settings an agent needs before messaging clients" gives a real usage condition, and "Changes stay in the Booksy app" tells the agent this is not the path for editing. It stops short of naming any alternative or prerequisite for other settings lookups, so it's strong but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_appointmentsList appointmentsARead-onlyIdempotentInspect
Appointments in a date range with client, service, staff, time and status.
Lists the Booksy calendar between two days (31 at most), in start order, including unconfirmed requests. Times carry the business's time zone. A walk-in has an empty client. An appointment with several services is one row listing them all; get_appointment returns prices and notes.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Last day, inclusive. At most 31 days after from. | |
| from | Yes | First day, inclusive. | |
| staff_id | No | Only one staff member, from list_staff. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior, and the description adds substantial context: start order, maximum 31-day span, inclusion of unconfirmed requests, business time zone, empty client for walk-ins, and one row per multi-service appointment. These details help the agent interpret results correctly without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the tool's purpose and then adds only useful behavioral details in a compact sequence. Each sentence contributes either scope, ordering, time zone, edge-case handling, or a sibling-tool distinction.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still explains the returned row shape, ordering, time zone behavior, walk-in edge case, and multi-service representation. Combined with fully documented parameters and safety annotations, it is complete enough for an agent to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so from, to, and staff_id are already documented in the schema. The description restates the 31-day range limit but does not add filtering semantics or usage details for staff_id beyond what the schema provides, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (appointments) and scope (date range with client, service, staff, time, and status). It clearly distinguishes itself from get_appointment by explaining that get_appointment returns prices and notes, which are not returned here.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear context for use: listing the calendar between two days, including unconfirmed requests, and points to get_appointment when price and note details are needed. However, it does not explicitly say when not to use this tool or name alternatives such as find_open_slots for availability checks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_clientsList clientsARead-onlyIdempotentInspect
Clients with contact details, visit counts and last visit, plus Booksy's client groups.
Reads the Clients list of the business, A to Z: name, email, phone, private note, tags, visits, no-shows, cancellations, revenue and the last visit. Search by name, email or phone, or keep only clients who have not visited for a number of days (filtered on each page). groups gives Booksy's smart groups (new, most loyal, slipping away, prospects, upcoming birthdays ..) with their counts.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Page size. Default: 50. | |
| query | No | Name, email or phone to search for. | |
| cursor | No | next_cursor from the previous call. | |
| not_visited_days | No | Only clients whose last visit is older than this many days (or who never visited). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly, idempotent, and non-destructive, so the description's job is to add context. It does add one important nuance ('filtered on each page'), which implies filters apply to page results rather than narrowing the client set globally. It says nothing about pagination termination or whether revenue and visit data can lag, so the added context is limited.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description stays short: two sentences cover what the tool returns and how to filter, and the field list is front-loaded. The dense field enumeration reads as a list rather than prose, so it is a little harder to scan, but it wastes nothing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description should explain the return shape, and it does: fields, visit metrics, and the groups facet with counts. The gaps (how pagination ends, whether groups can be requested per call) are minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description goes beyond the schema by hinting how query and not_visited_days interact with pagination, and it names the groups facet, which no parameter or output schema documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource ('Reads the Clients list of the business, A to Z') and enumerates returned fields, so an agent knows exactly what it returns. It doesn't explicitly contrast with the sibling find_client or get_client, so the boundary between list/search/single-lookup is only implied.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives real usage cues ('Search by name, email or phone, or keep only clients who have not visited...'), which implies when to use the filters. But it never says when to prefer get_client or find_client instead, even though sibling tools cover the same searchable fields.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_message_blastsList Message BlastsARead-onlyIdempotentInspect
Message Blast templates (automated and one-time) and the blasts scheduled to go out.
Reads Promotion > Message Blasts: every automated template with its trigger and whether it is on, every one-time template, and the blasts scheduled for later. send_message_blast sends a one-time message; estimate_message_blast counts recipients and SMS cost first.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so safety is covered; the description adds real content-level context about what the read returns (automated vs one-time templates, trigger state, scheduled blasts) and the navigation path 'Promotion > Message Blasts'. It does not describe ordering, field shape, or whether disabled templates are included, so it stops short of full disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short paragraphs, front-loaded with the resource definition and followed by scope and sibling routing. There is mild redundancy between 'Message Blast templates (automated and one-time)' and the later enumeration of the same two categories, but no filler sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no input parameters and no output schema, the description must convey what comes back, and it does so at the category level. It is nearly complete for a simple list tool; only the returned field detail and pagination behavior are left unstated, which is a minor gap here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline for a 0-param tool applies. The description correctly implies no filtering arguments are needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb (list/read) and resource (Message Blast templates and scheduled blasts), then enumerates the three data classes covered: automated templates with trigger and on/off state, one-time templates, and scheduled blasts. It is clearly distinguishable from send_message_blast and estimate_message_blast, which are named as the write/count siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly routes the agent to the right alternatives: send_message_blast for sending a one-time message and estimate_message_blast for counting recipients and SMS cost first. That effectively implies this tool is the read/browse step before sending, though it never states an explicit 'do not use this to send' exclusion or any preconditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_notificationsList notificationsARead-onlyIdempotentInspect
Notifications from the panel's bell: new bookings, changes, cancellations, reviews.
Reads the notifications Booksy shows under the bell in the panel, newest first. Client chat is not included. Reading does not mark them seen.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page, from 1. Default: 1. | |
| per_page | No | Per page. Default: 20. | |
| unread_only | No | Only the new ones. Default: false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower. The description still adds genuinely useful non-obvious behavior: 'Reading does not mark them seen' and 'newest first' ordering. It says nothing about result limits beyond schema/defaults, but that is covered in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: the source and content are front-loaded, then ordering and two constraints. No filler and nothing redundant with the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-required-param list tool with no output schema, the description covers source, content types, ordering, chat exclusion and unread side-effect. Only the shape of returned notification objects is unspecified, which is a minor gap given no output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so page, per_page and unread_only are fully documented in the schema. The description adds no extra meaning about parameter interaction (e.g., how unread_only combines with paging), so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb+resource ('Notifications from the panel's bell') and enumerates the content types (new bookings, changes, cancellations, reviews), plus ordering ('newest first'). This clearly separates it from siblings like list_reviews or list_appointments, which cover single sources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit exclusion ('Client chat is not included') and a scoping condition for the source panel. However, it doesn't name an alternative tool for chat messages or reviews, so the agent must infer the routing rather than being told.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_reviewsList reviewsARead-onlyIdempotentInspect
Client reviews of your business with rating, text, services, staff and your reply.
Reads the reviews on your Booksy profile, newest first by default: star rating, text, the client's name as Booksy shows it, services, staff, visit date and your reply if you wrote one. Also returns the average rating and the count per star. Reply with reply_to_review.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page, from 1. Default: 1. | |
| sort | No | Order. Default: newest. | |
| per_page | No | Reviews per page. Default: 20. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so the description's added value is in what the read returns: newest-first default, the fields per review, and the per-star average and count. It doesn't mention pagination limits or that results are scoped to the caller's own Booksy profile, which an agent would benefit from knowing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening line front-loads the purpose and the routing hint closes the second paragraph, which is good structure. There is some redundancy between the opening summary ('rating, text, services, staff and your reply') and the second sentence's field list, which repeats the same content nearly verbatim.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description correctly carries the return-shape burden by naming the per-review fields and the aggregate rating summary. Combined with annotations covering the safety profile, an agent has everything needed to call and interpret it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% – page, sort and per_page all carry defaults and bounds in the schema. The description only restates the newest-first default, adding no paging or sort semantics beyond what the schema already provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first line names the specific resource ('Client reviews of your business') and enumerates what each record contains (rating, text, services, staff, reply). This is clearly distinct from reply_to_review and from other list_* siblings, so an agent can pick it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says to use reply_to_review for the write path and states the default ordering ('newest first by default'), which covers the main read-vs-write fork. It doesn't say when this is the wrong read (e.g. per-staff or single-review lookups), but the tool has one obvious job and the alternative is named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_servicesList servicesARead-onlyIdempotentInspect
Your service menu with category, variants, duration, price and the staff who offer each.
Reads the services of the business: name, category, description, whether clients can book it online, and its variants with duration in minutes, price (number and as shown, with currency), price type and the staff IDs who perform it. create_appointment and find_open_slots take service_id (its first variant) or a variant_id for another variant.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral detail beyond the annotations: it explains the return shape, including variants, duration, price representations, currency, price type, online booking status, and staff IDs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the service menu concept and then details the returned fields efficiently. There is minor repetition between 'Your service menu with category, variants...' and 'Reads the services...', but every sentence still contributes useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the full burden of explaining return values, and it does so thoroughly: name, category, description, online booking, variants, duration, price number/display/currency/type, and staff IDs. It also explains how service_id and variant_id relate to downstream tools, leaving no critical gap for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters, so the baseline is 4. The description correctly does not invent parameter semantics and instead focuses on return data and downstream ID usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific read operation ('Reads the services of the business') and enumerates the returned fields, making it clearly distinguishable from sibling list tools like list_staff or list_clients. It also links the output to create_appointment and find_open_slots via service_id and variant_id, clarifying its role in the workflow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use it by explaining that create_appointment and find_open_slots require service_id or variant_id from this data. It does not explicitly state when not to use it or name alternative tools for services, but the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_staffList staffARead-onlyIdempotentInspect
Staff members with their working hours for a week and the services they offer.
Reads the staff of the business: name, position, email, phone, access level, whether clients see them, the services each one performs, and working hours for each day of one week (Monday to Sunday, from Shifts, time off included). Use staff_id in other tools.
| Name | Required | Description | Default |
|---|---|---|---|
| week_start_date | No | Any day of the week to show hours for, YYYY-MM-DD. Default: this week. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive, so the bar is lower, and the description still adds real value: hours are derived from Shifts with time off included, and the window is Monday–Sunday of a single week. It does not, however, say whether inactive/hidden staff are returned or how large the response can get.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The key content is front-loaded in the first sentence and the field inventory follows efficiently in one sentence. There is mild redundancy between the opening noun-phrase fragment and the 'Reads the staff...' sentence, costing it a point but not readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description properly carries the return-value burden by enumerating fields and the week shape, and it hints at the staff_id handoff. It stops short of stating filtering of inactive staff or response size, which for a list tool would be the last missing piece.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter is already well documented, so the baseline is 3. The description adds meaning beyond the schema by clarifying that the returned window is Monday-to-Sunday, complementing the schema's 'any day of the week' input semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (reads) and resource (staff of the business) and enumerates exactly what is returned: name, position, email, phone, access level, visibility, services performed, and per-day hours. The inclusion of services-per-staff and weekly shifts distinguishes it from siblings like list_services and list_clients without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by 'Reads the staff of the business' — there is no explicit when-to-use or when-not-to-use guidance, and no named alternative. The closing note 'Use staff_id in other tools' is helpful downstream routing but is not selection guidance for this tool itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_time_offList time offARead-onlyIdempotentInspect
Staff time off and blocked hours in a date range.
Lists time off from Shifts (kind time_off: dates, hours only when it is part of a day) and blocked hours in the calendar (kind block: date-times) between two days, 31 at most. time_off_id goes to remove_time_off.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Last day, inclusive. At most 31 days after from. | |
| from | Yes | First day, inclusive. | |
| staff_id | No | Only one staff member, from list_staff. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a safe, idempotent, read-only listing. The description adds meaningful data-shape context: time off carries dates and sometimes hours, blocked hours carry date-times, and the maximum range is 31 days. It stops short of describing pagination or the full return shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is two tight sentences with the resource and scope front-loaded. Every clause, including the remove_time_off routing hint, earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, fully described three-parameter listing with no output schema, the description covers the two result kinds and the date-range limit well. It is slightly incomplete only in not giving any sense of the returned item fields or pagination.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so from/to/staff_id are already fully documented, including the 31-day maximum. The description reinforces the date-range semantics but adds little parameter meaning beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ('Lists time off ... and blocked hours') and explains the two kinds it returns. It also distinguishes itself from mutation siblings by noting that time_off_id goes to remove_time_off.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is clear: use it for a date range of at most 31 days, covering both Shifts time off and calendar blocked hours. It points to remove_time_off for deletion, though it does not explicitly state when not to use it versus add_time_off or other list tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_time_offRemove time offADestructiveInspect
Remove time off or a blocked period so the time can be booked again.
Deletes one time off (off-…) or one calendar block (block-…). It reaches no client.
| Name | Required | Description | Default |
|---|---|---|---|
| staff_id | Yes | Staff ID the time off belongs to. | |
| time_off_id | Yes | ID from add_time_off or list_time_off (off-… or block-…). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already declaring destructiveHint=true, idempotentHint=false, and openWorldHint=true, the description adds useful context: it deletes exactly one off-… or block-… item and 'reaches no client.' That no-client-reach detail is meaningful behavioral information beyond the annotations. It does not cover permissions or undo behavior, but the annotations carry much of that burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loads the effect ('so the time can be booked again'), then specifies the deleted object types and the no-client-reach behavior. There is no redundant or filler language.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation with full schema coverage and rich annotations, the description gives enough behavioral context: what is deleted, which ID types are supported, and that no client is reached. It does not explain failure modes or whether the operation returns anything, but no output schema exists and the annotations already flag destructiveness and non-idempotence.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both staff_id and time_off_id are already documented in the input schema. The description restates the accepted ID forms (off-… or block-…) but does not add syntax, constraints, or meaning beyond the schema. This is the expected baseline when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: removing one time off or one calendar block. It also clarifies scope with the ID prefixes (off-… / block-…) and distinguishes behavior from client-facing actions via 'It reaches no client.' An agent can tell this is a deletion of a time-off/block object, not an appointment cancellation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'so the time can be booked again' implies the use case, but the description does not explicitly say when to use this versus list_time_off or add_time_off. The schema mentions that the ID comes from add_time_off or list_time_off, but that guidance is not in the description itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reply_to_reviewReply to reviewADestructiveIdempotentInspect
Post or change your public reply to a client's review.
Writes your reply under one review on your Booksy profile, the way the Reviews page does. A second call replaces the reply. Everyone who sees your profile sees it and the reviewer is told.
| Name | Required | Description | Default |
|---|---|---|---|
| reply | Yes | Reply text, public on your profile. | |
| review_id | Yes | Review ID from list_reviews. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond the annotations by disclosing the real-world consequences: the reply is publicly visible on the profile, the reviewer is notified, and a second call overwrites the prior reply. This adds genuine context to destructiveHint=true and idempotentHint=true, though it says nothing about permissions, moderation, or failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action, then the operational detail and side effects, with no filler. The phrase 'the way the Reviews page does' is the only sentence that contributes little beyond analogy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation with no output schema, the description covers what it does, where it lands, its visibility, and its overwrite behavior. Only permissions and error/edge behavior are unaddressed, which is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are documented there, including the pointer to list_reviews for review_id. The description adds only the notion that the reply attaches to a single review, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb pair (post/change) and resource (public reply to a client's review), plus the target surface (Booksy profile). It is clearly distinguishable from siblings like list_reviews, which the schema also references for obtaining the review_id.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use it (to publish or edit an existing reply) and that a repeat call replaces the previous reply, but it never explicitly routes the agent away from alternatives or states prerequisites such as obtaining review_id first. Usage is inferable rather than guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reschedule_appointmentReschedule appointmentADestructiveInspect
Move an appointment to a new start time, and optionally to another staff member.
Moves every service of the appointment by the same amount, so the first one starts at start. Booksy's dry run checks the new slot first and a busy one is refused. The client hears about it only with notify_client. Booksy refuses appointments it no longer lets you change (can in get_appointment).
| Name | Required | Description | Default |
|---|---|---|---|
| start | Yes | New start, ISO 8601. Without a time zone it is the business's local time. | |
| staff_id | No | New staff member from list_staff. Default: unchanged. | |
| notify_client | No | Tell the client about the new time through Booksy. Default: false. | |
| appointment_id | Yes | Appointment ID from list_appointments. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (destructive, non-idempotent, open-world), it discloses several behaviors an agent could not infer: all services shift by the same amount, a dry-run slot check may refuse the move, the client is silent unless notify_client is set, and the server may reject the appointment outright. These are exactly the mutation-side traits annotations can't express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then the mechanics and caveats. Each sentence carries information (service shifting, dry run, notification, refusal), though the parenthetical about get_appointment is slightly compressed at the cost of readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation with no output schema, the description covers the main risks (busy slot refusal, immutability escapes, silent client) well enough to call it safely. It doesn't say what a successful response contains, but that gap is minor given the tool's shape.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the field docs: 'start' governs the first service and all others shift in lockstep, and notify_client's side effect is characterized behaviorally rather than just 'tell the client'. This exceeds what the schema alone conveys.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a concrete verb+resource ('Move an appointment to a new start time') and adds the optional staff reassignment, which clearly separates it from create_appointment and cancel_appointment. No ambiguity about what the tool achieves.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states real usage conditions: the dry run checks the new slot, a busy slot is refused, the client is only notified via notify_client, and appointments that can no longer be changed are rejected (discoverable via get_appointment). It doesn't explicitly contrast with cancel_appointment or create_appointment as alternatives, keeping it just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_message_blastSend Message BlastADestructiveInspect
Send one message to chosen clients by email, SMS or push notification.
Sends one Message Blast now to the clients you list, by email, SMS or a push notification to the Booksy Client App, as Promotion > Message Blasts > Create your own message does. Where the law asks for marketing consent (EU), only the listed clients who agreed get it; the call fails when none can. SMS comes from an automated number, so clients cannot reply, and uses the plan's text allowance. Run estimate_message_blast first to see the count and cost. Needs a paid Booksy plan: on the free trial Booksy refuses one-time messages.
| Name | Required | Description | Default |
|---|---|---|---|
| channel | Yes | email, sms or push. | |
| message | Yes | Message text. | |
| subject | No | Email subject and push title. Default: the message's start. | |
| client_ids | Yes | Recipients from list_clients. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive/openWorld/non-idempotent, but the description adds real context beyond them: immediate send, EU marketing-consent filtering, failure when no recipient qualifies, SMS from an automated no-reply number, and consumption of the plan's text allowance. It does not describe the response payload or what partial delivery looks like, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then layering consent, SMS limits, the estimate recommendation, and plan requirements in a compact block. Dense but each sentence carries a distinct operational fact; a slightly tighter phrasing of the Booksy UI reference would earn a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description still tells the agent what failure looks like (fails when no client can receive) and steers to estimate_message_blast for counts/cost. It stops short of describing success response shape or partial-send outcomes, leaving a small gap for a destructive bulk-send tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, including the channel enum, subject default, and client_ids source, so the schema does the heavy lifting. The description adds only the indirect constraint that client_ids must be consent-eligible, which is a behavioral rather than a parameter-format clarification.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (send one Message Blast to listed clients via email/SMS/push) and ties it to the concrete product path (Promotion > Message Blasts > Create your own message). It is clearly distinguishable from siblings like estimate_message_blast and list_message_blasts, which are named or implied.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly directs the agent to run estimate_message_blast first for count/cost, states the paid-plan prerequisite (free trial refuses one-time messages), and gives the failure condition (call fails when no listed client can legally receive). That covers when to use, prerequisites, and the adjacent alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_clientUpdate clientAInspect
Change a client card's name, phone, email, birthday or private note.
Changes only the fields given and leaves the rest of the card as it is. The note replaces the card's private note; add_client_note adds a line instead. The client is not told.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Full name; the last word is the last name. | |
| note | No | Private note, replaces the old one; add_client_note appends. | |
| No | Email address; empty string removes it. | ||
| phone | No | Mobile phone; empty string removes it. | |
| birthday | No | YYYY-MM-DD. | |
| client_id | Yes | From list_clients or find_client. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the write/non-idempotent/non-destructive profile, and the description adds two things they cannot: that unspecified fields are preserved, and that the client is not notified of the change. Missing only edge-case behavior such as what an empty string does, which the schema covers.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with what can be changed, then how partial updates behave, then the sibling comparison. The note sentence lightly duplicates the schema's note description, so it is not perfectly waste-free.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter mutation with full schema coverage and no output schema, the description covers scope, partial-update semantics, sibling routing and the notification side effect. Only the response shape and permission requirements are unstated, which is a minor gap here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including removal-via-empty-string and birthday format, so the schema carries parameter meaning. The description restates the editable field list and the note-replacement rule at a high level, adding convenience but no information beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (change) and resource (a client card) plus the exact set of editable fields. It is immediately distinguishable from siblings like add_client, delete_client and add_client_note.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly covers partial-update semantics ('changes only the fields given') and names the alternative add_client_note with the condition that selects it (append a line instead of replacing). It stops short of stating when not to use this tool at all, e.g. versus delete_client or find_client.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
28 tool updates
v0.1.0- First observed
add_client - First observed
add_client_note - First observed
add_time_off - First observed
cancel_appointment - First observed
create_appointment - First observed
delete_client - First observed
estimate_message_blast - First observed
find_client - First observed
find_open_slots - First observed
get_appointment - First observed
get_business_hours - First observed
get_business_profile - First observed
get_client - First observed
get_report - First observed
get_settings - First observed
list_appointments - First observed
list_clients - First observed
list_message_blasts - First observed
list_notifications - First observed
list_reviews - First observed
list_services - First observed
list_staff - First observed
list_time_off - First observed
remove_time_off - First observed
reply_to_review - First observed
reschedule_appointment - First observed
send_message_blast - First observed
update_client
TDQS
Scored across 28 tools
Most tools target a clear resource+action, and descriptions draw sharp lines (e.g. find_client vs get_client vs list_clients). A few read tools overlap: get_business_profile and get_business_hours both return hours/time zone, and find_client and list_clients both search the client list, which could occasionally cause misselection.
The set follows a consistent snake_case verb_noun pattern (get_, list_, add_, create_, delete_, cancel_, reschedule_, send_, estimate_, remove_). Minor deviations exist like reply_to_review (verb_to_noun) and add_client_note, whose append semantics differ from the create-style add_client, but the convention remains readable throughout.
At 28 tools the surface is heavy (25+ by rubric), spread across many resource areas—appointments, clients, services, staff, time off, reviews, messaging, reports. Each tool does appear to earn its place given the broad domain, but the count sits at the borderline-heavy end.
Coverage is broad: full appointment lifecycle (create/get/list/cancel/reschedule), client CRUD plus notes, time off, reviews, messaging, reports and settings. Notable gaps remain—no tools for confirming/declining appointments or marking no-shows (though get_appointment exposes these as 'can' actions), and no write operations for services or staff.
Maintenance
Related MCP Connectors
Manage an EasyWeek business from AI: bookings, availability, customers, services, orders, messaging.
Find real businesses and book appointments. Books via Cal.com; imports 12 platforms.
Operate a nisebookings account: catalogue, staff schedules, free slots, customers, appointments
Connect AI agents to your own Chrome with scoped access, approvals, and verified task results.
Related MCP Servers
- AlicenseCqualityDmaintenanceEnables AI agents to manage spa/wellness operations via Zenoti API, including appointments, guests, services, and billing.42342 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to control your existing Chrome browser via MCP, using your logged-in sessions for automation on authenticated sites. Provides high-level browser tools plus raw CDP and Chrome API access.MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to search for businesses, check availability and pricing, and book appointments after user confirmation through trusted WebMCP tools.3 npmMIT
- AlicenseAqualityCmaintenanceEnables AI agents to look up businesses, find free appointment slots, book, list and cancel appointments at salons, barbershops, nail and brow studios and clinics. Works read-only without a customer login by returning a pre-filled booking link, and can also run against a built-in demo with sample businesses.5MIT