model → tool → model loop whenever the model decides to call one.
V1 supports native tools (HTTP endpoints you host, plus a small set of platform built-ins). MCP-hosted tools are a planned follow-up.
When to use tools
Tools are useful when the model needs information or actions that live outside the call — live data, writes to your system, or control over the call itself. If a piece of information never changes and fits in the prompt, put it incontext instead.
Reach for a tool when the answer:
- Changes between calls (availability, account balances, order status)
- Requires a write (book an appointment, create a ticket)
- Controls the call (hang up, transfer)
Tool types
HTTP tools
The model calls your HTTPS endpoint with a JSON body matching the parameter schema. You return a small JSON result.
Built-in tools
Platform-owned actions like
end_call. No network hop. Safe to attach when you want the agent to be able to hang up on its own.Defining tools
The SDKs ship with typed authoring helpers so you don’t hand-write JSON schema. Both languages produce identical wire payloads.Tool policies
Every tool has apolicy:
read— the model can invoke the tool whenever it thinks the answer is useful. Use for lookups.confirm_first_write— the model must get a clear affirmative from the caller on the previous turn before CallingBox will execute the tool. Use for writes (bookings, charges, cancellations). If the caller has not confirmed, CallingBox returns aconfirmation_requiredenvelope and the model asks again.
read for lookups and confirm_first_write for anything that mutates state.
Writing good tool descriptions
The model picks tools based on theirname and description. Treat these like API docs written for a junior teammate — a few clear sentences beat a paragraph of adjectives.
Good
- State the purpose and a precondition. “Call only after the caller has confirmed the date and time.”
- Name the output shape in the description when it affects follow-up turns (“Returns an
{ available: boolean, slots: string[] }object.”). - Be explicit about what the tool is not. “Does not cancel existing appointments — use
cancel_appointmentfor that.” - Use snake_case names and keep them under 40 characters.
- Keep parameter schemas tight. Required fields should be truly required; add
additionalProperties: falseon objects.
Writing a prompt that uses tools
The prompt is where you tell the agent when to reach for each tool. A good tool-aware prompt has four parts:- Role + goal — who the agent is and what success looks like.
- Tool cues — when to call each tool in plain English.
- Confirmation rules — when to read something back before acting.
- Failure handling — what to do if a tool errors or returns nothing.
Receptionist example
What you see in the trace
Every tool invocation shows up in the call timeline with:- The tool name and arguments the model produced
- The HTTP status (for
httptools) or the built-in action taken - Latency and whether the call succeeded
- Any error message returned to the model
Limits and behavior
- Up to 16 tools per call.
- Up to 2 tool rounds per user turn — if the model tries to chain more than that, CallingBox falls back to a plain reply so the call stays responsive.
- HTTP tools must use HTTPS and cannot point at private or loopback addresses.
- Tools are disabled on voicemail drops. Built-ins like
end_callstill run; HTTP tools are suppressed when the call is answered by a machine and the voicemail action isleave_message.