Handoff to your systems: every call ends as a record
A caller asks for something; your system is where it becomes real. Name the action, give the agent a contract it can keep, and have it say only what your system returned.
Book a visit
book_visitPOST /v1/visits
Books a visit once the caller has confirmed the pet, the time and the callback number.
It needs
pet- On the caller’s account, read back by name
slot- One of the openings the agent offered
phone- The callback number the caller confirmed
reasonoptional- In the caller’s own words
| System returns | Caller hears |
|---|---|
| 201 visit_id · starts_at Booked | “You’re booked: Thursday at 2:40. Your confirmation number is V-31872.” |
| 409 slot_taken No retry | “That time was just taken. The next opening is 4:10. Shall I book it?” |
| 422 pet_not_found No retry | “I can’t find Max on this account. Which number is the account under?” |
| 503 busy Retry | Nothing: the agent retries before the caller notices. |
Name the action and the system that owns it
“Integrate with our practice system” isn’t a plan. “Book a visit for this pet, at an opening the caller chose, with the reason in their words” is. Each action has its own details, its own permission and its own consequence, so name them one at a time, starting with the one your callers ask for most.
Then name the system that owns the result.1 The calendar owns the appointment. The practice system owns the patient record. The order system owns the shipment. The conversation explains why something changed; the owning system is where it changed, and it is the one the agent asks.
Separate reading from writing. Looking up a visit needs the right caller and nothing more. Changing it needs a readback and a yes.
- 1Connectors100+ connectors and integrations, organized by the job, plus any API or MCP server.Developer hub
Write the action contract
An action contract is a short agreement between the people who run the calls and the person who owns the system: what the caller wants, which details the action needs, what the system returns when it worked, what it returns when it didn’t, and who owns the exceptions. It fits on one page, like Linden’s book_visit above, and in Zumu it becomes the action itself.
Keep the promise the caller hears no bigger than the response. book_visit returns a visit and a start time, so a visit and a start time are what the agent confirms. “The vet will sort out his ear on Thursday” is a different promise, owned by a different step.
Decide which actions run on their own and which wait for a yes.2 Reading an opening can run freely; booking one waits for the caller’s agreement, asked for in words the caller can’t mistake.
- 2Action permissionsOn an MCP server, set each action to Allow, Ask or Block. A blocked action never reaches the model.MCP server
Say only what the system returned
The order never changes: check, read back, write, tell.
- 00:41
Caller“Can Max come in Thursday afternoon?”
00:43Request: GET /v1/openings?day=thuResponse: 200 · 2:40 PM, 4:10 PM
- 00:45
Agent“Thursday, I have 2:40 or 4:10.”
- 00:49
Caller“Two-forty.”
- 00:50
Agent“Max, Thursday at 2:40 PM, for his booster. Shall I book it?”
- 00:53
Caller“Yes, please.”
00:54Request: POST /v1/visitsResponse: 201 · visit V-31872
- 00:55
Agent“You’re booked: Thursday at 2:40. Your confirmation number is V-31872.”
Bookedvisit V-31872
An opening that was free at 00:43 can be gone by 00:54, given to someone at the front desk in the eleven seconds between.
When a customer asks later what was agreed, open the conversation record.3
- 3Every tool callThe conversation record keeps every tool call, with what it sent and what came back.Conversation records
Plan the no before it happens
Your system will say no: an opening taken a second earlier, a pet it can’t find on the account, a moment when it’s busy. Decide now what each no sounds like to a caller. In the contract above, every error maps to one of two things: try again, or tell the caller plainly and offer the next option, so a lost opening still ends the call booked.
A timeout is the one no that isn’t an answer: the write landed or it didn’t, and nobody knows which yet. Look before writing again: find the booking by the caller and the time, and only book if it isn’t there. If your API accepts a request key, send one with every write, so the same request can never book twice.
Hand over the work, not just the call
Some calls finish with a person: a quote only the practice manager gives, an owner who wants to talk it through with a vet, a question that needs clinical judgement. When that happens, the work goes with it: who called, what they wanted, what was checked, what is already booked and what is left.
Visit V-31872 booked for Max, Thursday at 2:40 PM, for his booster. She asks for a quote to clean his teeth at the same visit. Front desk to call her back before Thursday.
- Post to Slack#front-deskSent
- Update HubSpotContact · Leah Marchetti · note addedSent
- Call your endpointPOST hooks.lindenanimal.example/zumu → 200Sent
Decide for each action whether the handover is live or queued. Live is a warm transfer: the caller holds while the agent briefs your person, and the call connects only when they accept; the after-hours guide has the card that decides who gets woken for one.
Queued is the summary above: the booking and the open question named, so nobody does the first half twice.4
- 4Signed deliveriesDeliveries are signed, and a failed one is retried.Webhooks
Prove the whole path, then widen it
Before a customer calls, run the action end to end, including every no in the contract. A scripted test plays the caller’s side and mocks your system’s response, so the opening that disappears at 00:54 can disappear on purpose, as often as you like.
Caller turns
- “Can Max come in Thursday afternoon?”
- “Two-forty.”
- “Yes, please.”
Mocked tools
- find_openings
- 200 {"openings": ["Thu 14:40", "Thu 16:10"]}
- book_visit
- 409 {"error": "slot_taken"}
Checks
- Sends the visit for Max, on the caller’s own accountPass
- Offers the next opening after the 409Pass
- Never says “booked” before book_visit returns 201Pass
- Asks the caller before it books 4:10 insteadPass
Ran before publish · revision 14Passed
Widen one action at a time. When a tool, a permission or an instruction changes,5 the same tests run again before the change reaches a caller. Once it is live, quality checks read every conversation for the same things; the evaluation guide shows how to score them.
- 5Prompt historyEvery prompt edit is kept, with who made it, when and from where, drafts included.Security
Further reading
- Developers: Platform APIRead every call’s transcript, tool calls and cost as JSON.
- Developers: MCP serverYour own MCP servers become tools the agent calls.
- Developers: WebhooksEach outcome delivered to your endpoint, Slack or CRM, signed.
- Guide: Evaluating an AI receptionistScore the booking, the refusal and the timeout on every provider.
