Tools
How an agent should use each family of Agora MCP tools (browser, desktop, cursors, board, workspaces, human handoff) and keep token usage low.
agora mcp exposes 52 tools in groups. This page explains how to use each family well. For every tool and argument, see the MCP tools reference.
| Family | Group in AGORA_TOOLS |
Use it for |
|---|---|---|
browser_* |
browser, browserx |
Web pages, through semantic refs over CDP. |
desktop_*, control_surface |
desktop |
Any X11 app, with pixels and your own mouse and keyboard. |
cursor_* (spawn and control) |
spawn |
Subagents: create, wait, message, cancel. |
cursor_status, cursor_report, cursor_complete, cursor_fail, cursor_inbox |
self (always on) |
Your own status, progress and result. |
board_read, board_post |
self |
Coordination with sibling agents. |
human_request, events_wait |
self |
Human handoff and waiting for events. |
workspace_*, system_info |
workspace |
Creating and managing workspaces. |
worktree_create |
process |
A git worktree with its own port range. |
Browser
Prefer browser_* tools for anything on the web. They talk to Chromium per tab over CDP, so they never fight other agents for focus and do not need an input seat.
- Open your own tab.
browser_openwith aurlreturns the tabtargetand what is visible. Keep using that target.isolated: trueopens it in a separate context without the workspace’s logins. - Act by ref. Refs like
[e12]come from the observation or frombrowser_snapshot. Usebrowser_click,browser_fill(submit: truepresses Enter),browser_selectandbrowser_press. Usex,ycoordinates only for canvases, cross-origin iframes and CAPTCHA widgets. - Read the observation.
browser_open,browser_navigate,browser_click,browser_fill,browser_type,browser_press,browser_selectandbrowser_scrollreturndone. now visible:followed by the visible page, diffed against your last view of that tab. Do not callbrowser_snapshotafter them unless you need offscreen content. - Extract data in one call.
browser_evalevaluates a JavaScript expression and returns its JSON value. - Wait, do not sleep.
browser_waitwaits for aselector, visibletextorurl_contains.
For UI work, use browser_audit once instead of many screenshots: it checks overflow, contrast, tap targets, labels, headings, SEO tags, Core Web Vitals, animations and broken internal links. browser_emulate sets a mobile viewport (width: 0 resets it). Take browser_screenshot only when appearance matters; it defaults to a 1024 px JPEG at quality 60, and max_width makes it smaller.
browser_upload sets files on a file input; paths are on the Agora host. browser_action handles back, forward, reload, dialogs and close.
Desktop
Use desktop_* tools for anything that is not a web page. They use your cursor’s own MPX pointer and keyboard, so two agents can type into two windows at the same time.
desktop_launchstarts a program as the unprivileged apps user, withDISPLAYset.restore: truerelaunches it when the workspace resumes.- Take one
desktop_screenshotto orient. Its coordinates match thedesktop_*tools unlessmax_widthscales the image.desktop_windowslists windows with their ids and geometry. - Act with
desktop_click,desktop_type,desktop_key,desktop_scrollanddesktop_drag.desktop_windowraises, moves, resizes or closes a window. desktop_clipboardgets or sets the clipboard.
To keep other cursors out of a window or tab for a while, call control_surface with op: "acquire" and a surface such as win:<id> or tab:<target>, plus a ttl_ms lease. Release it when you are done.
Subagents
An agent with the spawn permission can create children with cursor_spawn. With launch, Agora starts the agent process with its own scoped token and the MCP server already configured:
{
"name": "pricing-check",
"goal": "Open https://example.com/pricing and return the plans as JSON",
"permissions": ["browser"],
"launch": { "adapter": "claude", "model": "claude-haiku-5-5", "effort": "low" }
}
Without launch, you get the child’s token to hand to an agent yourself.
Spawn all independent children first, then call cursor_wait once with every id:
{ "ids": ["cur_..."], "timeout_ms": 600000 }
cursor_wait returns each child with its status, result and, for Claude Code, its usage (tokens, turns, cost and duration). Children run in parallel in the same workspace, each in its own window with its own input seat.
Other controls: cursor_list and cursor_get read status, cursor_message sends JSON to a child’s inbox, and cursor_control can cancel (cascades to the whole subtree), pause, resume or transfer a descendant.
Launch options
| Field | Description |
|---|---|
adapter |
claude, codex or command. |
model |
Model for the agent CLI. |
effort |
low, medium or high (Claude Code). |
prompt |
Overrides the goal as the prompt. |
command |
For command: the argv to run. |
tools |
Tool groups to expose: browser, browserx, desktop, spawn, workspace, process. Default browser, plus groups matching the cursor’s permissions. |
profile |
lean (default) or full. |
Add worktree: {repo, branch, base} to cursor_spawn to give the child its own git worktree and port range for parallel development. A child’s permissions are always the intersection of what it asks for and what you have.
Reporting as a child
If you are a cursor yourself, report with cursor_report (message, percent), set your live status with cursor_status, and finish with cursor_complete (any JSON result) or cursor_fail (error). Finishing releases your seats, locks and tabs. Read messages from your parent with cursor_inbox.
The shared board
Cursors in a workspace share a board so parallel agents do not repeat each other’s work:
board_readbefore starting a work item.board_postwithkind: "claim"and a shorttopic. The claim fails if another live cursor holds the topic or it is already done; skip that item.- Post
findingornotefor your siblings. - Post
donewhen you finish the topic, orreleaseto drop it.
Claims of cursors that ended expire on their own. Subagents launched by Agora are told to use the board.
Human handoff
When a page shows CHALLENGE DETECTED, or a login, MFA or approval needs a person:
- Call
human_requestwith a precisereason. Your status becomesneeds_humanand the browser session stays alive. - Tell the user what to do.
- Call
events_waitwithtypes: "control.returned". Call it again if it times out. - Continue in the same tab.
Never try to defeat a CAPTCHA by brute force or a third-party solver. See human takeover for what the human sees.
Events
events_wait blocks until something happens, so you never poll in a loop. Filter with types (comma-separated, * suffix allowed), for example control.returned, cursor.ended, browser.challenge.detected or browser.dialog.opened. Pass the last since you saw to continue; wait_ms defaults to 30000.
Workspaces
Tools default to your own workspace. With the workspace permission (or the admin token) you can also manage workspaces:
workspace_createmakes a new workspace. It costs nothing until something uses it.workspace_oprunsstart,suspend,resume,freeze,thaw,checkpoint,fork,resize,layoutandbrowser-restart.workspace_info,workspace_listandsystem_inforeport state and resource use.
fork copies the browser profile and home directory into a new workspace, so you can branch a logged-in session without touching the original.
Token efficiency
Agora is designed so agents spend tokens on the task, not on the plumbing. In our benchmark of three browser tasks, the lean launcher brought the cost of six runs from $2.01 to $0.23 with the same 6/6 correct answers, and each subagent’s initial context from 66,700 to 7,500 tokens. See benchmarks.
- Act, then read the observation. Action tools already return what is visible and only what changed.
- Refs over coordinates, snapshots over screenshots. A snapshot takes about 1 ms and a few hundred tokens.
- One audit instead of many screenshots.
browser_auditcovers layout, accessibility, SEO and performance in one call. - Wait for events.
events_waitandcursor_waitblock until something happens. - Lean subagents. The default
leanprofile runs Claude Code with--strict-mcp-config, no slash commands, no built-in tools, no settings files and a short system prompt, and exposes only the tool groups the cursor needs (AGORA_TOOLS) with one-line descriptions (AGORA_LEAN=1). Tool definitions shrink from about 5.7k to 2.9k tokens. - Small models for small jobs. Reading a page or filling a form rarely needs the largest model; pass
modelandeffort: "low". - Coordinate through the board, so two subagents never do the same work.
- Batch independent calls in the same turn.
Apply the same filters to your own setup with AGORA_TOOLS and AGORA_LEAN (see Connect).