Skip to content

Tool catalog

Every built-in tool an agent can call. These are exactly the names the Governance policy accepts in Allowed tools / Denied tools — the catalog is generated from the runtime’s real tool registry, and unknown names are rejected on save. (execute_code and web_crawl are not tools; the shell entry point is terminal.)

You don’t pick which tool the agent uses for a given turn — the agent does. You decide which tools to expose.

The coordination self-tools (worker_complete, worker_block, worker_context, share_note, read_board, expand_note, unblock_task, cancel_task) are listed below for completeness but are not configurable in the allow/deny lists — denying them could strand blocked work, so the policy API refuses them.

Tool Use for
read_file Read workspace files with line numbers and pagination (offset / limit) — parses documents, describes images
write_file Write a file (sensitive paths denied — SSH keys, shell rc, credentials)
patch Apply a unified diff or V4A patch
search_files Regex across workspace files
list_files Directory listing, optionally recursive

read_file is not text-only. .pdf, Word (.doc / .docx / .docm), Excel (.xls / .xlsx / .xlsm), PowerPoint (.ppt / .pptx / .pptm), OpenDocument (.odt / .ods / .odp) and .rtf are parsed to text by the tool itself, and image files are described by a vision model. Calling read_file on those paths directly is the intended path — no need to shell out to pdftotext or pip-install a parser through terminal. Two limits to plan around: limit defaults to 500 lines and caps at 2000, and a single read over roughly 100K characters is rejected outright (an operator-tunable default) — page through large files with offset / limit.

Tool Use for
terminal Shell command in the sandbox (180s default timeout, 50K-char output cap, optional background=true)
process Manage background processes started with terminal(background=true) — list / poll / log / wait / kill / write / submit
Tool Use for
web_search Public-web search (Tavily / Exa backends)
web_extract Fetch and extract one or more URLs

Session-scoped browser. Supports user-control handoff for login / MFA / CAPTCHA.

Tool Use for
browser_navigate Open a URL
browser_get_state Page as a markdown outline with stable @eN refs (format: "json" for the raw node tree with coordinates)
browser_evaluate Run JavaScript in the page and return its value — a whole table, a hidden input, every option of a <select> in one call
browser_click, browser_type, browser_press_key Interact
browser_scroll, browser_drag, browser_wait Navigate / wait
browser_screenshot Save PNG to workspace
browser_close Close the session’s browser

browser_evaluate runs agent-written JavaScript with the page’s full privileges, against whatever the browser is currently signed in to. It is governed like any other tool, but it is the widest reach in the browser toolset — deny it explicitly on agents where you allow the rest of browser_*. See Agent browser.

Tool Use for
vision_analyze Analyse a workspace image path, HTTPS URL, or data:image base64 (raster only — PNG/JPEG/WEBP/GIF)
Tool Use for
generate_image Generate an image from a text prompt (optional image-to-image); saved to the workspace and shown inline
generate_video Generate a video from a text prompt (optional first-frame image-to-video); blocks until rendered, saved to the workspace

Availability: each tool is dropped from the agent’s toolset entirely when no model is wired for its role (a per-agent pick under Configure → Model, or a platform preset) — the LLM never sees an unusable tool. Platform-model generation bills the project’s media wallet (a flat few cents per image; a video bills its reported provider cost); BYO image/video models are not metered by Surogate. When the wallet is empty the tool returns an actionable media_budget_exhausted error — nothing is generated or charged — and on monetized agents a buyer without media credits gets media_credits_exhausted with their buy link. See Media generation.

Tool Use for
memory add / replace / remove entries in MEMORY.md (agent’s notes) or USER.md (user facts)
Tool Use for
skills_list List skills attached to this agent (the LLM uses this implicitly)
skill_view Read a specific skill’s body
skill_manage Create / update / delete skills from inside a session
consult_expert Delegate to a configured expert (model-backed skill)
Tool Use for
kb_list_pages List all pages in a knowledge base, grouped by page type (index / summary / concept)
kb_read_page Read the full markdown content of a single wiki page
Tool Use for
fetch_channel_messages Read recent messages in this Slack channel — limit (default 50, max 200), since (24h, 7d, or 2026-07-01), user (a Slack user id or <@U…> mention). Returns oldest-to-newest
fetch_channel_file Fetch a file shared in this Slack channel (by name or Slack file id) into the workspace

Both are Slack-only: on a session whose effective channel isn’t Slack (Telegram, WhatsApp, website, web) they return an error rather than a result, so allow-listing them on a non-Slack agent buys nothing. Ambient sessions count as Slack. Inbound attachments on the other channels still reach the workspace through the normal attachment path.

Tool Use for
github GitHub REST API over the agent’s configured repos, without a checkout — read (default) or write issues/PRs/files/labels
run_coding_agent Run Claude Code or Codex on a configured repo — checks out a branch, implements, commits, pushes, and opens a PR (the /code tool)
Tool Use for
spawn_worker Fire-and-forget async worker session. Returns the worker’s ID immediately; results arrive as events next turn.
send_worker_message Send a message to a running worker
stop_worker Stop a running worker
delegate_task Synchronous child session — parent blocks for the result. Supports parallel fan-out via goals=[...].
spawn_task Durable child task — survives parent crash, supports fan-in dependencies, retries, and block/unblock.
worker_complete Worker self-tool: mark your own task attempt done with a structured handoff to the parent
worker_block Worker self-tool: pause your own attempt and wait for parent/human context
worker_context Worker self-tool: read your own goal, parent context, parent-task results, and prior attempts
unblock_task Coordinator-side: resume a blocked child task (optional additional context)
cancel_task Coordinator-side: cancel a non-terminal child task

Coordination board (parallel workers in a group share verified notes):

Tool Use for
share_note Post a verified FACT / FAIL / CLAIM / RESULT note to the group’s board
read_board Read the group’s consolidated current board state
expand_note Expand a board note (by n<ID>) into its underlying source content or artifact

Ambient channel:

Tool Use for
mate_ambient_post Post a proactive, confidence-gated message into the channel during an ambient review (Surogate Mate)

Hard depth limit: 2 levels of orchestration beneath the root coordinator.

Tool Use for
idea_tree Read and mutate a research run’s Idea Tree (view / add / update / prune / set_meta)
dispatch_experiments Dispatch 1–4 pending leaf hypotheses to executor workers in isolated git worktrees
merge_experiment Re-run the held-out test eval in a detached worktree, then merge a done experiment into trunk
research_memory Curated evidence bank for deep research — add / retrieve / list cited sources
research_outline The living research outline (markdown) — set / get
Tool Use for
cron_create Create a recurring scheduled prompt (5-field cron expression)
cron_delete, cron_list Manage schedules
loop_wait (Dynamic-loop only) set the next delay in 60–3600s, or signal completion
loop_complete (Fixed-cron loop only) mark loop finished from inside a run
Tool Use for
ask_user_question Ask the user up to 5 questions (each up to 4 labeled choices + optional “Other”) in a tabbed chat widget, and wait for the batched answers. 30-min wait cap.

How answers arrive depends on the channel:

Channel Widget Typed reply
Web Yes Yes — a plain text message while the question is pending is consumed as the answer
Telegram Yes Yes — same rule
Slack Modal No — a typed reply gets a nudge toward the modal
API service accounts Respond route only Never converted

Typed-reply mapping: text that exactly matches a choice label (case-insensitive) selects that choice; anything else is recorded as an “Other” answer; a multi-question prompt receives the whole reply against each question. Messages with images or attachments are never converted, and the conversion stops working shortly before the 30-minute cap. Once a response exists for the tool call, later messages are ordinary messages.

Tool Use for
create_artifact Render a markdown / table / chart / HTML / SVG artifact inline in the chat (500KB max per artifact, 200 per session)
Tool Use for
todo Per-session multi-step task tracker
session_search Full-text search the session’s event history
user_reports Operator-only: read the agent’s per-user and cohort reports (overview / get / list)

Any tool an MCP server registers becomes available to attached agents. The MCP proxy injects credentials from the Vault — the agent’s sandbox never sees secrets. See MCP & Vault for setup.

MCP tools (mcp__*) are outside the built-in allow/deny lists: an allowlist doesn’t reject them, and a denylist won’t accept an mcp__* name either. They’re governed by which servers you attach (and, on monetized agents, by the buyer’s package); egress and sandbox checks still apply, and the approval list below is the one place a single MCP tool can be gated by name.

Three lists govern a tool call. Allowlist and denylist are configured per-agent in CONFIG → Tool Access:

  • Allowlist — only these built-in tools pass the governance gate. Empty allowlist = all tools (subject to denylist). Note: a tool outside the allowlist is still advertised to the LLM — it’s blocked at call time with a Blocked: <reason> result, not hidden from the schema.
  • Denylist — always blocked. Deny beats allow, and the two lists can’t overlap.
  • Approval-required (require_approval on the agent policy) — the call is held and raised to a human as a governance_gate inbox item; approving lets the agent’s retry of that exact call through. Evaluation order is deny → approval → allow, so a denied tool is never approvable, and this is the only list that accepts mcp__* names. Set it through the agents API: the tool-access form doesn’t render it, and saving that form drops it. See Tools that need approval first.

Lists take exact tool names — there is no prefix or wildcard matching. Common patterns:

Agent type Suggested
Customer support Allow: kb_list_pages, kb_read_page, web_search, ask_user_question, create_artifact, memory. Deny: terminal, write_file, patch
Code assistant Allow: read tools + web_search + github. Deny: write_file, patch, terminal
Data analyst Allow everything. Deny: cron_create, cron_delete, cron_list if no scheduling
Internal automation bot Start with denylist only, gate the dangerous ones explicitly