Your key decides what the assistant sees
tools/listonly returns the tools the key’s scopes allow. With a read-only key the assistant does not even knowcreate_callexists.- Every
tools/callchecks the scope again. A client that calls a tool it was not shown gets aninsufficient_scopeerror, not the result.
Tool catalog
Read tools carry the MCP
readOnlyHint annotation. The three tools that act on real calls carry destructiveHint and openWorldHint, so clients that honor annotations can ask you before running them; update_agent, publish_agent and assign_phone_number carry destructiveHint too, because they change what live calls use. How the confirmation of the three works is in Security and spending.
Ask for summaries, not pages
The tools are built so an assistant gets its answer in few calls:- List tools return 50 items by default, up to 100 per call, accept the filters in the table and return a
next_cursorfor the next page. - Lists leave out heavy fields:
list_callsdoes not include transcripts. Ask for one call withget_callwhen you need what was said. get_call_statsanswers aggregate questions (“how many calls failed yesterday?”, “which agent spent the most this week?”) in one call, instead of paging through hundreds of calls. It counts up to 1,000 calls per range; if there were more, it says so withtruncated: trueand the real total incalls_in_range, so the assistant can narrow the range.
Rate limits
The MCP has no separate limit: it draws from your account’s bucket, the same one the API uses.- Every tool call counts as one request against your plan’s per-minute limit, once, never more.
initialize,tools/listand the rest of the protocol do not count.- For the three tools that ask for confirmation, only the call that runs counts. The confirmation step does not.
- The per-IP check of the API applies to every request, including
initializeandtools/list.
get_call_stats does not.
Errors
When a tool fails, the server does not break the MCP session: it returns a normal tool result withisError: true and the same envelope as the API, both as structuredContent and as text:
error and decide what to do: wait after rate_limit_exceeded, tell you the key needs another scope after insufficient_scope, fix an argument after invalid_body, get a new token after invalid_confirmation, or stop after key_budget_exhausted. The full list of codes is in Errors. If you report a problem, send us the request_id.
A successful result carries its JSON the same way: in structuredContent and as text.
A missing, invalid or revoked key never reaches the tools: the HTTP request itself is refused with 401.