Attaching a tool integration to an agent puts its tools in front of the model next to your own tools. Three settings control it, and they change a live agent at different times:

Attaching

Each mcps entry names an active tool integration:
mcps is replaced whole on update, so send the current list with the new entry appended, then publish:
Refused at save: a channel integration (is not MCP-capable and cannot be attached as a tool), an id that does not exist, and the same integration twice. Agent tasks take the same field. An entry may instead define a server inline ({"mcp": {...}}); it is created as a custom_mcp integration and the entry is stored as its id. See custom MCP servers.

Listing a server’s tools

GET /v1/integrations/{integration_id}/mcp-tools connects to the server and lists every tool it exposes, approved or not. It is also the connectivity test.
  • name is the server’s own name. allowed_tools matches this.
  • exposed_name is what the model sees. Your prompt must use this.
A non-active integration returns 400; a server that cannot be reached or fails after connect returns 502 failed to list MCP tools: ….

Approving tools

allowed_tools on the integration is the set of tools every attached agent may call.
  • null (the default for a new connection) exposes every tool.
  • A PATCH replaces the list wholesale. To go back to everything, send the full list from mcp-tools; there is no reset value.
  • It cannot be empty. To approve nothing, disable the integration.
  • Entries are the tools’ own names, not exposed_names, so changing the namespace never invalidates an approval.
Every approved tool’s schema is sent to the model on every turn, which costs input tokens and makes tool choice less accurate. Approve only what the agent’s job needs. In the dashboard, clicking an integration’s row opens the approval modal: the live tool list under exposed names, the namespace field with a preview, and Save. It will not save an empty selection.

Namespacing

The model sees each tool as <tools_namespace>_<name>.
  • Default: the provider key for hosted providers (asana, google_calendar), "" for custom_mcp.
  • "" means “use the server’s own names”. On a PATCH, omitting the field keeps the current value and "" clears it.
  • A tool whose name already starts with the prefix is not prefixed again: Tavily’s tavily_search stays tavily_search.
  • Pattern: ^$|^[a-z][a-z0-9_]{0,23}$.
Two attached integrations with the same non-empty namespace are refused at save, because every tool name they share would reach the model twice:
Two servers with blank namespaces are not checked. If their tool names collide, the call fails at start (agent_start_failed) with the duplicate named on the call detail page.

What happens on a call

  • Servers connect when the session starts, in parallel. The connect, the tool listing and each tool call have a five-second timeout.
  • A server that fails to connect does not fail the call. The agent starts without its tools, and the model will improvise around a prompt that mentions them. Tell the prompt what to do when a lookup is unavailable.
  • A tool call that times out or errors returns to the model as a failed tool call.
  • OAuth providers: a 401 triggers one token refresh and retry; a second failure moves the integration to needs_reconnect.
  • Native Google Calendar tools call Google directly with their own retries.

Field reference

Next

Custom MCP servers

Point an agent at a server you run.

Google Calendar

The nine native calendar tools.