body. Nothing is rewritten in between, so what your agent learns here is true of the API and of the SDKs.
Arguments mirror the HTTP call
Takeassign_phone_number. The server describes it to your client as POST /v1/telephony/phone-numbers/{number_id}/assign, and its input schema has two properties: number_id, the path parameter, and body, which keeps the endpoint’s own request shape.
Arguments
list_calls takes agent_id, status, batch_id, start, end, limit and offset at the top level, because that is where the URL carries them.
Every tool’s argument schema is closed at the top level — additionalProperties: false — so a client that validates arguments catches an invented path or query parameter before it is sent. What goes under body is validated by the API itself, which answers with one error envelope naming each field that failed.
Names
A tool name is the API’s operation name, and the SDKs derive their method names from the same map:
So a session that starts in your terminal and ends in your application code uses one vocabulary throughout.
Deferred schemas
Five request types are whole product surfaces: an agent’s config, its all-optional override twin, a team of agents, a task’s config, and a tool’s operation tree. MCP gives no way for tools to share definitions — every tool’s input schema has to stand alone — so a type that appears on six endpoints would be carried six times. Inlined, those five accounted for more of the tool surface than everything else on the server put together, and the result did not fit in a 200k-context client at all. They are deferred instead of duplicated. Wherever one appears as a property, the tool schema carries a placeholder and a pointer, anddescribe_schema serves the real document on demand. The create_agent schema, in full, is:
These documents compose, so one you fetch may itself defer to another:
AgentTeam is small because the two documents it is built from defer out of it exactly as they do out of a tool, and AgentConfig defers its inline tool’s operations to ToolOperations. Fetch what you need, in the order you need it.
The same documents are served over HTTP at GET /v1/schemas/{name}; see schemas.
Read-only and destructive
Every tool is annotated so a client can tell a read from a write before it runs one:
A client that renders approval prompts uses these to decide what to wave through.
readOnlyHint is derived from the HTTP method, not from what the operation feels like, so read it as “this cannot change anything”, not as “this is free”: get_call is read-only and returns a transcript, while run_tool is a POST that calls your endpoints for real. Permissions has the list worth approving by hand.
Everything available
123 operations, by area.What is not a tool, and what to use instead
Server-sent event streams are not tool-shaped: a tool call returns once, and a stream stays open for minutes. Each one has a polling equivalent, so nothing on the API is unreachable from here.
Three more things are absent for their own reasons:
- The CoPilots’ chat endpoints. The agent, tool, task and knowledge CoPilots each have a stream of their own. They are not exposed, because an AI builder must not drive another AI builder — your client is the builder here.
- A call’s recording file.
GET /v1/calls/{session_id}/recordingis a redirect to an audio blob, which a tool call cannot hand to a model.get_callreportsrecording.state, which is the part an agent can reason about; play or download the file from the dashboard. See recordings. - Inbound provider and carrier webhooks. Those are callbacks into Talqing, not operations you call.
Next
Permissions
Roles, what the server cannot do, and what to approve by hand.
Recipes
Prompts that use these operations end to end.