arc-control-mcp
This server lets an AI agent drive the Arc browser on macOS over MCP: manage tabs and spaces, navigate, read page content, interact with the DOM, and run JavaScript.
Tabs: list, inspect current tab, switch to, close individual tabs, close all tabs the agent opened, and check Arc status/ownership.
Navigation: open URLs (new tab or existing, optional Little Arc, wait for load), go back/forward, reload, and poll until a page finishes loading or the URL contains text.
Content reading: get visible page text, get HTML, get structured element details (text, values, hrefs, visibility, attributes), list links, and get a page overview (title, headings, counts).
Interaction: click elements (using CSS or text= selectors), fill inputs/textareas/contenteditable fields, select dropdown options, press keys, scroll pages/elements, and wait for elements to appear/change.
Spaces: list Arc spaces with tab counts and focus a space.
Scripting: run arbitrary JavaScript in a tab (with helper library A) and batch multiple tool calls into one round trip to reduce latency.
Safety & targeting: read-only tools fall back to the active tab, mutating tools require an explicit tab unless it is the agent's own tab, and all actions respect the agent's separate tab ownership/space isolation.
Provides tools to control the Arc browser on macOS, including tab management, navigation, page reading, DOM interaction, and JavaScript scripting.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@arc-control-mcpOpen a new tab, go to arstechnica.com, and read me the headlines"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
arc-control-mcp
An MCP server that drives the Arc browser on macOS: tabs, navigation, page reading, DOM interaction and scripting.
It exists because the bundled "Control Chrome" MCP server cannot be pointed at Arc. Arc's scripting dictionary looks like Chrome's, and differs in exactly the places that matter.
Who it is for: anyone running an agent (Claude Code or another MCP client) on a Mac who wants it to work in Arc, the browser they are already signed in to, instead of a fresh automation profile. It reads pages, fills forms, clicks things, runs JavaScript, and keeps its own tabs separate from yours.
What it is not: a cross-platform or cross-browser tool. It drives one browser on one operating system through Apple Events. There is no screenshot tool, no CDP, and no headless mode. There is also no Docker image, and there cannot be one: Apple Events do not cross a container boundary, so a container has no way to reach the Arc running on your Mac. This is a 0.3.0 personal project, and the known limitations below are real.
Requirements
macOS
Arc installed
Node 20 or newer
One runtime dependency, @modelcontextprotocol/sdk. No build step.
Related MCP server: Arc Browser MCP
Install
Nothing to clone. Any MCP client can start the server with npx, and @latest
is also how it upgrades: the next start picks up a new release.
{
"mcpServers": {
"arc": {
"command": "npx",
"args": ["-y", "arc-control-mcp@latest"]
}
}
}That config is not sufficient on its own. Two macOS permissions still have to be granted, one of them in Arc's own settings where nothing will prompt you for it. Until both are granted, the server starts normally and then every tool fails. This is by far the most likely reason a fresh install looks broken: readthe two macOS permissions, the next section.
package.json declares "os": ["darwin"], so on Linux or Windows the install
stops with EBADPLATFORM instead of succeeding and then failing at the first
Apple Event. Environment variables go in an env object alongside args; see
environment variables.
claude mcp add arc --scope user -- npx -y arc-control-mcp@latestThe -- is required. Without it, claude mcp add reads the -y as one of its
own flags and registers the wrong command. Then check what was registered:
claude mcp get arcEdit ~/Library/Application Support/Claude/claude_desktop_config.json and add
the mcpServers block above, merging it with any servers already listed. Quit
and reopen Claude Desktop: the file is only read at launch.
Add the same mcpServers block to ~/.cursor/mcp.json for every project, or to
.cursor/mcp.json for one project.
VS Code uses servers, not mcpServers, in .vscode/mcp.json for a workspace
or in the file opened by the MCP: Open User Configuration command:
{
"servers": {
"arc": {
"type": "stdio",
"command": "npx",
"args": ["-y", "arc-control-mcp@latest"]
}
}
}Or from the command line:
code --add-mcp '{"name":"arc","command":"npx","args":["-y","arc-control-mcp@latest"]}'git clone https://github.com/DB-25/arc-control-mcp.git
cd arc-control-mcp
npm install
claude mcp add arc-dev --scope user -- node "$PWD/src/index.js"For any other client, the same thing as JSON. The path has to be absolute: the client's working directory is not yours.
{
"mcpServers": {
"arc-dev": {
"command": "node",
"args": ["/absolute/path/to/arc-control-mcp/src/index.js"]
}
}
}Register it under a different name than the published one, so you can tell which copy answered. See CONTRIBUTING.md.
Check the install without an MCP client. Neither call touches Arc, so both work before the permissions below are granted:
npx -y arc-control-mcp@latest --version
npx -y arc-control-mcp@latest --help # tool count and environment variablesThe two macOS permissions
Both are asked for once, and both fail in a way that is confusing if you do not know to look here.
Automation. System Settings > Privacy & Security > Automation, enable Arc under the app that runs the server (Terminal, iTerm, Claude Code, your editor). Without it, nothing works: every tool fails on the first Apple Event.
Allow JavaScript from Apple Events. Arc > Settings > Advanced. Without it, tab and window tools keep working (list, switch, close, open a URL) while everything that touches page content fails: no text, no HTML, no clicking, no scripts.
Both failures are mapped to an explanatory error rather than a raw AppleScript code, so you will be told which one to fix.
Why not just reuse the Chrome server
Arc's scripting dictionary looks like Chrome's but differs in ways that break the Chrome server outright:
Chrome | Arc | |
Tab id | integer | UUID string |
Switch tab |
|
|
Back / forward | works on window or tab | tab only |
New tab |
|
|
Grouping | none | spaces, plus a pinned / unpinned / topApp location |
The Chrome server calls parseInt(tab_id) on every id, so against Arc every
tool taking a tab id fails before reaching AppleScript. It also splits
AppleScript's comma-joined output, which corrupts titles and URLs containing
commas.
Design
Not restrictive by design. Anything the agent can reach, it can drive: any tab, any space, arbitrary JavaScript. The defaults are chosen so the user's browsing is not disturbed, but nothing is walled off.
Implicit target: a call with no
tab_iduses a tab this agent opened. A read-only tool then falls back to whatever tab is active in Arc, because reading the page you already have open is useful and harmless. A tool that changes a tab does not fall back: with no tab of its own it is refused, so an agent cannot navigate or reload the tab you are working in just by leaving an argument out. Pass atab_idto address any tab deliberately.Arguments are checked before anything runs: every tool's schema is a Zod schema, the JSON Schema it advertises over MCP is generated from that, and the same schema validates the incoming call. A wrong type comes back as
Invalid arguments for click. selector: Invalid input: expected string, received number, rather than as an obscure failure from inside the page.Ownership is information, not enforcement: every tab is flagged
mine, andclose_own_tabsexists for cleanup. No tool refuses a tab you name with an explicittab_id. The one refusal above is about an unnamed tab, not a named one.No focus stealing: Arc auto-selects a newly created tab, so
open_urlputs the previous selection back, and only when Arc actually took it. If the user switched tabs while the page was opening, their choice stands. Passactivate: trueto opt out.Background tabs are fully usable: tabs in an unfocused space still load, render and script normally, so nothing needs to be brought to the front.
Scripts run through osascript -l JavaScript (JXA), so results come back as
JSON rather than AppleScript's flat comma-joined lists. Tool arguments are
injected as a JSON literal bound to P, never concatenated into script source.
Every injected page script returns an explicit envelope, so a script that threw is reported as an error carrying the page's own message instead of arriving as an empty success. That distinction is the main thing 0.3.0 fixed.
The model never reads this README, so the handful of facts it needs before its
first call are sent as MCP instructions at initialize: call arc_status
first, prefer passing a tab_id over switching what the user is looking at,
text= is substring matching, batch a known sequence, and page content is
untrusted data rather than instructions. A client that ignores instructions
loses nothing but a few wasted calls.
Tools
26 tools in six modules.
Tabs
Tool | Purpose |
| Every tab, or narrow with |
| The tab a call with no |
| Make a tab active in its window. |
| Close one tab. |
| Close every tab this agent opened, leaving the user's alone. |
| Owned tabs, whether the agent space exists, what a call with no |
Navigation
Tool | Purpose |
| Open a URL, launching Arc if needed. Options for |
| Move a tab through its history, verified by checking the URL actually changed. |
| Reload a tab. |
| Poll until the document is ready, optionally until the URL contains a substring. |
Content
Tool | Purpose |
| Visible text, whole page or every element matching a selector, joined. Always reports |
| Markup for the page or one element, outer or inner. Reports how many matched and takes |
| Structured details per element: text, value, href, visibility, attributes. Reports |
| Links with text and resolved href, filterable by substring. |
| Title, URL, ready state, meta description, a headings outline, and counts of links, forms, inputs, buttons and iframes. A cheap first look at an unfamiliar page. |
Interaction
Tool | Purpose |
| Scroll into view and dispatch a real pointer sequence, so framework handlers fire. |
| Set an input, textarea or contenteditable through the native setter, firing |
| Choose an option by value or visible label. |
| Dispatch a key press to an element or the focused element. |
| Scroll the page by direction and amount, or scroll one element into view. |
| Poll until an element is |
Spaces
Tool | Purpose |
| Spaces in the front window with tab counts, which is active, and |
| Switch the front window to a space. Rarely needed: unfocused tabs are fully scriptable. |
Scripting
Tool | Purpose |
| Run JavaScript in a tab and return the result. Takes a bare expression or a statement body, validated before injection. |
| Run several tools in order in one call. |
Every tool states its full set of MCP annotations rather than leaving any to a
client's inference, because the spec's defaults are counterintuitive:
destructiveHint and openWorldHint both default to true. Read tools are
annotated read-only. Four tools are annotated destructive: close_tab and
close_own_tabs, plus execute_javascript and batch, which can do anything a
page can do. openWorldHint is true for everything that touches page content,
and false only for the tools that read or move Arc's own tab and space
bookkeeping.
Selectors
Every selector argument accepts either:
a CSS selector, passed straight to
querySelectorAll, ortext=Some label, which matches on visible text. This is substring matching, and it is case-insensitive. Exact matches are ranked first, sotext=Saveprefers a button labelled exactly "Save" over one labelled "Save and close". Innermost matches win over their ancestors. Tools that act on a single element report how many matched, so a vague label is visible rather than silent; passexact: trueto require the whole text, ornthto pick a different match.
execute_javascript takes either a bare expression (document.title) or a
statement body (const rows = [...]; return rows.length). Which one it used is
reported as form, either "expression" or "statement". A statement body
yields a value only through return: let n = 2; n * 3 comes back as null
with a note telling you to add one, because producing 6 there would require
eval inside the page and that breaks on any site with a strict
Content-Security-Policy. Broken syntax is rejected in Node with the real parser
message, before Arc is contacted at all.
The form field matters because it is what makes a legitimate null
distinguishable from a script that failed, which used to be impossible. If a value
has no useful JSON representation, for example a DOM node or window, the
response carries a note explaining that rather than a bare {}.
The page helper library
execute_javascript runs with the same helper library the built-in tools use,
bound to A: A.all, A.one, A.click, A.setValue, A.describe,
A.visible, A.key. So A.all('text=Sign in').length works, and anything you
can do in the console you can do here.
batch
Each osascript spawn costs a few hundred milliseconds, so batching matters
more here than it would over CDP:
{"steps": [
{"tool": "fill", "args": {"selector": "#user", "value": "db"}},
{"tool": "fill", "args": {"selector": "#pass", "value": "..."}},
{"tool": "click", "args": {"selector": "text=Sign in"}},
{"tool": "wait_for_selector", "args": {"selector": ".dashboard"}}
]}The tab is reported once for the batch rather than repeated per step, and repeated only when it actually changes mid-batch.
Tab ids are UUID strings and are not stable across a close and reopen, so call
list_tabs rather than reusing an old one.
Environment variables
Variable | Default | Effect |
|
| Names this agent's tab ownership. Two agents with different labels never see each other's owned tabs. |
|
| The Arc space new tabs open into, when a space with that name exists. |
|
| Where tab ownership is recorded, so a restarted agent can clean up the tabs its previous run left behind. |
Isolation, and why not a separate window
An Arc window is not an isolation boundary. Every window showing a space shares that space's whole tab list, so a second window displays the same tabs. Verified: a scripted new window listed the same 27 tabs as the original.
The only real boundary is a space. Create one named Agent (or set
ARC_MCP_SPACE) and every tab this server opens goes there, out of the sidebar
you are working in. Without it, tabs open in the main window alongside yours;
everything still works, they are just visible. arc_status reports which mode
is active.
Agents are separated from each other as well: each runs its own copy of the
server, ownership is tracked per session, and ARC_MCP_LABEL names it. One
agent's list_tabs scope=own and close_own_tabs never see another's tabs,
even when both use the same label. Tabs left behind by a dead earlier run are
reported by arc_status as stale and only closed if you ask, with
close_own_tabs include_stale=true, so a restart can never sweep away a live
sibling's tabs. Agents do still share the one Agent space in the sidebar,
since Arc will not let a script create a space.
Known Arc limitations
Verified in August 2026; worth retesting after an Arc update. These are Arc's behaviour, not decisions made here.
Setting a tab's
location(topApp / pinned / unpinned) is marked writable but always fails with-10000, so there is no pin/unpin tool.Closing a window does nothing, so the server never creates windows.
Creating a space silently no-ops, which is why the space is made by hand.
mode: "incognito"is ignored when creating a window.Little Arc tabs never appear in
Arc.windows, so they cannot be read or closed after creation.Closed windows linger in
Arc.windowsas invisible phantoms whoseactiveTabthrows, so lookups filter onvisible().space.tabsexcludes topApp favourites, so those reportspace: null.list_spacesreportstopAppCountso its numbers reconcile withlist_tabs.A bulk
window.tabs()fetch raises-1700, but bulk property reads (window.tabs.id()) work and are ~10x fewer Apple Events.Arc.executereturns the JSON encoding of the page value, so strings arrive quoted and are unwrapped before being returned.Arc.goBackdoes nothing on a background tab, sogo_backandgo_forwardgo through the page's own history API instead and verify the URL changed.
Limitations of synthetic events
Everything this server does in a page is a synthetic event, dispatched from
injected JavaScript. Widgets gated on trusted events (event.isTrusted) cannot
be driven that way, and there is no workaround inside this design: Arc's
execute javascript gives no CDP access, so there is no way to inject a real
input event.
Verified against Wikipedia's search box. fill sets the value correctly, but
the suggestion dropdown never opens. Hand-dispatching per-character
keydown/input/keyup does not help either.
The workaround does work, and is usually what you wanted anyway:
fillwithsubmit: true, which presses Enter and navigates, ornavigate straight to the search URL with
open_url.
If a widget only reacts to a suggestion list, a hover preview, or a drag, expect it not to react here.
Troubleshooting
The server rewrites Arc's raw AppleScript codes into messages that name the remedy. If you see:
Message | What to do |
| Grant Automation in System Settings, then restart the calling app. The permission is only re-read at launch. |
| Turn on "Allow JavaScript from Apple Events" in Arc > Settings > Advanced. |
| Launch Arc, or just call |
| Arc keeps running with every window closed. Press Cmd-N. |
| The tab was closed, or the id is stale. Ids change across a close and reopen. |
| Run |
| Check the page with |
| Your selector or code is invalid. The message is the page's own, so it says which. |
| Usually the JavaScript-from-Apple-Events permission, sometimes a tab that navigated mid-call. Retry once, then check the permission. |
| Arc is showing a modal dialog (a permission prompt, a save sheet) or is stuck loading. Look at the window. |
| Prefix the URL with |
| A bug here. Please open an issue with the tool, arguments and full error. |
If a tool reports ok: false with timedOut, that is not an error: it is
wait_for_load or wait_for_selector telling you the condition never became
true, with waitedMs and what it did see.
Layout
src/
index.js MCP wiring, --version and --help
registry.js composes tool modules, validates tool/handler parity at load
jxa.js osascript runner, Arc preamble, error mapping
state.js per-session tab ownership
page-lib.js helper library injected into the page as `A`
tools/
shared.js common schemas and run helpers
tabs.js list, switch, close, status
navigation.js open, back, forward, reload, wait for load
content.js text, html, structured queries, links, page info
interact.js click, fill, select, keys, scroll, wait for selector
spaces.js Arc spaces
scripting.js raw JavaScript and batchAdding a module means creating tools/<name>.js exporting tools and
handlers, then listing it in registry.js. The registry throws at startup on
a duplicate name, a tool with no handler, or a handler with no tool. See
CONTRIBUTING.md.
Project docs
CHANGELOG.md, including what 0.3.0 fixed
SECURITY.md, including the threat model: this server runs arbitrary JavaScript in your real logged-in browser by design
docs/agent-review-2026-08-31.md, the review that scoped 0.3.0
LICENSE, MIT
Available Tools
26 toolsarc_statusArc StatusARead-onlyIdempotent
Report Arc state: which tabs this agent owns, whether the agent space exists, what a call with no tab_id resolves to, and how many tabs a previous run of this label left behind.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only, idempotent, and non-destructive, lowering the description's burden. The description adds value by spelling out exactly which state facts are reported, including the no-tab_id default and cross-run tab counts. There is no contradiction with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence states the verb and resource first, then lists the key outputs. Every phrase contributes a distinct piece of information with no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter status tool, the description plus annotations cover the essentials: the agent knows it is safe, idempotent, and what categories of state it will receive. The explicit itemized report list mitigates the lack of an output schema. Exact return formatting is unspecified, but that is not critical for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With zero parameters, the schema fully covers the input surface and there are no parameter semantics to clarify. The baseline of 4 applies because the description does not need to compensate for any schema gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Report') and names a precise resource ('Arc state'), then itemizes four concrete data points. This distinguishes it from sibling tab and space tools that perform actions or list individual resources. The only minor ambiguity is the phrase 'previous run of this label,' but the overall purpose is unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly conveys that this is a status/diagnostic call rather than a tab manipulation operation. The enumerated items imply the triggering situations: checking ownership, default tab resolution, and leftover counts. It does not explicitly name alternatives or exclusions, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
batchBatchADestructive
Run several tools in order in one call, passing the same tab through. Stops at the first failure unless continue_on_error is set. Use this to cut round trips: fill, fill, click, wait. Results are capped at 60000 characters across all steps: past that the batch stops early and reports truncated, so pass max_chars to reading steps or split a read-heavy sequence across calls.
| Name | Required | Description | Default |
|---|---|---|---|
| steps | Yes | Steps to run in order | |
| tab_id | No | Applied to every step that does not set its own | |
| continue_on_error | No | Keep going after a failing step |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses important runtime behavior: execution stops at first failure unless continue_on_error is set, and results are capped at 60000 characters, causing early stopping and truncation reporting. This adds real operational context beyond readOnlyHint, idempotentHint, and destructiveHint. It does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three dense sentences with no filler. It front-loads the core purpose, then covers failure handling, use case, and a concrete limit. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers ordering, tab propagation, error behavior, truncation limits, and practical usage. Because there is no output schema, the description could have said a bit more about the exact result shape, but it does state that results exist and can be truncated. This is nearly complete for a tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters. The description adds useful context by explaining 'passing the same tab through' and by mentioning max_chars for reading steps, but it does not substantially deepen per-parameter semantics beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Run several tools in order in one call, passing the same tab through.' This clearly defines batch orchestration and distinguishes it from the individual browser-action sibling tools. The example 'fill, fill, click, wait' reinforces the intended function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly recommends the tool for cutting round trips and gives a concrete sequence. It also implies when to avoid a single batch by warning that read-heavy sequences should be split or constrained with max_chars. It does not name an alternative tool, but the guidance is clear enough for an agent to decide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clickClickA
Click an element. Accepts a CSS selector or "text=Label". Scrolls it into view and dispatches a real pointer sequence, so framework handlers fire. "text=Label" matches on visible text as a substring, with exact matches ranked first, so a short label also matches longer ones. Check the returned "matches" count, and pass exact when it is above 1. Returns urlBefore, the url as it was immediately before the click: the tab snapshot can be taken before a navigation settles, so follow with wait_for_load when the click navigates.
| Name | Required | Description | Default |
|---|---|---|---|
| nth | No | Which match to click when several exist, 0-based. Order is exact text matches first, then substring matches, each in DOM order. | |
| exact | No | For "text=" selectors, require the whole trimmed text to equal the label instead of containing it. No effect on CSS selectors. | |
| tab_id | No | Arc tab id from list_tabs. Omit to use this agent's current tab, falling back to whatever tab is active in Arc. | |
| verbose | No | Include the bulky element rect and longer attribute values | |
| selector | Yes | CSS selector, or "text=Some label" to match on visible text (substring, exact matches ranked first) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations say readOnlyHint=false, openWorldHint=true, and destructiveHint=false. The description adds meaningful context beyond that: it dispatches a real pointer sequence so framework handlers fire, scrolls the element into view, and warns that urlBefore may be captured before navigation settles, recommending wait_for_load. This is rich behavioral disclosure that complements the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence carries essential information: selector formats, real pointer behavior, matching semantics, matches count guidance, and the urlBefore caveat. It is dense but not bloated, and the essential 'Click an element' is front-loaded, so an agent gets the core purpose immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with five parameters, matching subtleties, and navigation implications, the description covers everything an agent needs to call it correctly: return fields (matches, urlBefore), how to use the returned data, and when to wait for load. The lack of an output schema is compensated by the explicit mention of return values, making it fully self-contained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description goes further by explaining the interaction between parameters: how 'text=' matching ranks exact over substring, how nth order follows that ranking, and how the matches count guides the use of exact. This decision-rule level of explanation is exactly the added value expected beyond raw schema types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with 'Click an element' — a specific verb and resource — and immediately clarifies the two accepted selector formats. It differentiates the tool from siblings like fill and press_key by focusing on the click action and its pointer-sequence behavior, leaving no ambiguity about what it does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete when-to-use guidance: check the returned 'matches' count, set exact when matches exceed 1, and follow with wait_for_load after navigation. It also explains the matching ranking and scrolling, implicitly telling the agent when to rely on this tool versus a simple query or input tool. The explicit follow-up instruction is a strong usage guideline.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
close_own_tabsClose Own TabsADestructive
Close every tab this agent opened, leaving the user's tabs alone. Tabs leaked by a previous run of this label are left alone too unless include_stale is set.
| Name | Required | Description | Default |
|---|---|---|---|
| include_stale | No | Also close tabs left behind by dead sessions of this label (see staleTabCount in arc_status). Never touches a live agent's tabs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this destructive, and the description adds significant scoping context: user tabs are untouched, stale tabs from dead sessions are excluded by default, and live agent tabs are never affected. This clearly defines the boundaries of the destructive action and prevents accidental data loss beyond the agent's own tabs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The main behavior is front-loaded, and the stale-tab exception is placed immediately after. Every sentence earns its place and directly informs invocation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-optional-parameter cleanup tool, the description covers the action, the ownership boundary, the stale-tab behavior, and points to arc_status for relevant status. No output schema exists, but nothing needed to call the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already describes include_stale fully, including its default value and effect. The description mentions include_stale only in passing, matching the schema without adding new meaning. With 100% schema coverage, the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Close every tab this agent opened.' It precisely scopes the tool to tabs owned by this agent and distinguishes it from close_tab and user-tab operations. The mention of 'leaving the user's tabs alone' removes ambiguity about which tabs are affected.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the intended cleanup use clear: close all agent-opened tabs, not user tabs. It also gives explicit guidance for include_stale, noting stale tabs are left alone unless the flag is set. It does not explicitly mention sibling alternatives like close_tab, so it stops short of full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
close_tabClose TabADestructive
Close one tab. With no tab_id this closes whatever a bare call resolves to, which is this agent's current tab or, if it has none yet, the tab the user is actively looking at. Pass an explicit tab_id from list_tabs unless you are certain. Closing cannot be undone and tab ids are not reused. To clean up after yourself, prefer close_own_tabs.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | No | Arc tab id from list_tabs. Omit to use this agent's current tab, falling back to whatever tab is active in Arc. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Destructive behavior is clearly disclosed: 'Closing cannot be undone and tab ids are not reused.' It also explains the fallback resolution behavior for omitted tab_id, adding value beyond the destructiveHint annotation and making side effects explicit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences deliver the action, fallback behavior, safety warning, and alternative tool guidance with no filler. The most important information is front-loaded and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter destructive tool with full schema coverage and relevant annotations, the description covers everything needed to invoke it correctly: what it acts on, what happens without an argument, the irreversible consequence, and when to use the sibling tool instead.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already fully documents tab_id at 100% coverage, including the omit behavior. The description reinforces this but does not add substantially new parameter-level information beyond the 'unless you are certain' caution. A baseline of 3 is appropriate given the complete schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
'Close one tab' is a specific verb and resource, and the description distinguishes this from sibling close_own_tabs by pointing to the cleanup use case. It clearly identifies what the tool does and how it differs from alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells when to pass tab_id ('unless you are certain') and when to prefer close_own_tabs ('To clean up after yourself'). It also explains what happens when tab_id is omitted, covering the main usage decision points.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
execute_javascriptExecute JavaScriptADestructive
Run JavaScript in a tab and return the result. A bare expression, or a statement body that uses return, both work. The helper library is available as A (A.all, A.one, A.click, A.setValue, A.describe, A.visible).
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | JavaScript to evaluate. An expression returns its value; a statement body returns whatever it returns, or null. | |
| tab_id | No | Arc tab id from list_tabs. Omit to use this agent's current tab, falling back to whatever tab is active in Arc. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, openWorldHint=true, and readOnlyHint=false, so the description is not the sole safety signal. It adds value by explaining that results are returned and that both expressions and return-based statements work, but it does not elaborate on side-effect risks of arbitrary JavaScript.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, front-loaded sentences with no filler. The first sentence states the core behavior; the second and third add return semantics and helper availability. Minor redundancy with the schema's code description keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description plus schema covers how to provide code, how to choose a tab, and helper availability, which is enough to invoke the tool. No output schema exists, but the return mechanics are described. It does not address error/async behavior or the scope of side effects, though annotations carry part of that burden.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for both code and tab_id, so the baseline is already strong. The description goes beyond the schema by naming the available helper library A and its methods (A.all, A.one, A.click, etc.), which materially helps an agent construct valid code.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names a specific action and resource: 'Run JavaScript in a tab and return the result.' This clearly distinguishes it from sibling tools such as get_page_content and query_elements, and the following sentences clarify evaluation semantics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no explicit guidance about when to choose execute_javascript over sibling tools, no exclusions, and no prerequisites. The helper-library note and return behaviors are operational details, not selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fillFill FieldA
Set the value of an input, textarea or contenteditable. Uses the native setter and fires input and change, so React and similar frameworks register it. Fails with an error naming the tag when the target cannot be filled: a heading or other non-input, a disabled or readonly field, or a (use select_option for those). "text=Label" matches on visible text as a substring, with exact matches ranked first, so a short label also matches longer ones. Check the returned "matches" count, and pass exact when it is above 1.
| Name | Required | Description | Default |
|---|---|---|---|
| nth | No | Which match to fill, 0-based | |
| exact | No | For "text=" selectors, require the whole trimmed text to equal the label instead of containing it. No effect on CSS selectors. | |
| value | Yes | Value to set | |
| submit | No | Press Enter and request form submit afterwards. The tab usually navigates, so follow with wait_for_load: the returned tab snapshot may predate the navigation, and urlBefore reports the url from just before the key press. | |
| tab_id | No | Arc tab id from list_tabs. Omit to use this agent's current tab, falling back to whatever tab is active in Arc. | |
| verbose | No | Include the bulky element rect and longer attribute values | |
| selector | Yes | CSS selector, or "text=Some label" to match on visible text (substring, exact matches ranked first) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that it uses the native setter, fires input/change events so React registers the change, and fails with an error naming the tag. These behavioral details go well beyond the readOnlyHint/destructiveHint annotations and help the agent predict side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence carries operational weight: the action, the framework-compatibility mechanism, the failure modes, and the selector-matching rule. It is front-loaded with the primary purpose and contains no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter mutation tool with no output schema, the description covers the main edge cases, selector ambiguity, and failure behavior, while the schema covers parameter defaults. Nothing needed for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents all 7 parameters at 100% coverage, so the baseline is 3. The description adds practical matching semantics (substring matching with exact matches ranked first) and a concrete ambiguity-resolution instruction that goes beyond the schema's field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Set the value of an input, textarea or contenteditable') and immediately distinguishes the tool from siblings by listing what it cannot fill, e.g. '<select> (use select_option for those)'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly names the alternative for selects, warns when filling will fail (non-inputs, disabled/readonly fields), and provides a decision rule for ambiguous label matches: check the returned 'matches' count and pass exact when above 1.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
focus_spaceFocus SpaceAIdempotent
Switch the front Arc window to a space. This changes what the user sees, so it is rarely needed: tabs in an unfocused space are still fully readable and scriptable.
| Name | Required | Description | Default |
|---|---|---|---|
| space | Yes | Space id or title from list_spaces |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses a key behavioral trait: switching a space changes what the user sees, and unfocused-space tabs remain fully accessible. This adds meaningful context that the annotations do not capture. No contradiction with annotations found.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with no filler. The core action comes first, and the important behavioral caveat follows without unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity, single-parameter action, the description plus schema covers the target, the source of valid identifiers, and a critical side-effect warning. The lack of output schema is not a material gap for a focus operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already fully documents the only parameter ('Space id or title from list_spaces'), so the description adds no new parameter information. Baseline 3 is appropriate given 100% schema description coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Switch the front Arc window to a space.' This clearly differentiates focusing a space from tab-level operations like switch_to_tab or listing operations like list_spaces.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly frames when the tool is appropriate ('rarely needed') and gives the underlying reason (tabs in unfocused spaces are still readable and scriptable). It does not name explicit alternatives or a hard when-not-to-use condition, but the guidance is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_current_tabGet Current TabARead-onlyIdempotent
Get the tab a call with no tab_id would act on: this agent's current tab, or the active tab if it has none.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | No | Arc tab id from list_tabs. Omit to use this agent's current tab, falling back to whatever tab is active in Arc. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that the tool is read-only, idempotent, and non-destructive, so the bar for extra behavioral disclosure is lower. The description adds the fallback resolution behavior: the agent's current tab, or the active tab if the agent has none. This is useful context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with a colon separating the core action from the fallback explanation. Every word earns its place, and there is no filler or repetition beyond what the schema already conveys.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, read-only, idempotent tool, the description plus annotations cover safety profile, default behavior, and parameter handling. The main unstated detail is the exact shape of the returned tab object, but that is minor given the simple purpose.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already covers the single parameter tab_id fully, including the omit behavior. The description essentially restates the schema's meaning ('a call with no tab_id') rather than adding new parameter-level detail, so it meets the baseline but does not exceed it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Get the tab a call with no tab_id would act on.' It clearly identifies the tool's unique role as resolving the default tab target, distinguishing it from siblings like list_tabs and get_page_content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool: to determine which tab an action would affect when no tab_id is provided. It does not explicitly name alternatives or state when not to use it, but the default-target framing is enough to guide an agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_htmlGet HTMLARead-onlyIdempotent
Get the HTML of a page or element. Use when you need markup, attributes or structure rather than text. Returns one element only: it reports how many matched and takes nth to pick a different one.
| Name | Required | Description | Default |
|---|---|---|---|
| nth | No | Which match to return when several exist, 0-based | |
| outer | No | Include the element tag itself | |
| tab_id | No | Arc tab id from list_tabs. Omit to use this agent's current tab, falling back to whatever tab is active in Arc. | |
| selector | No | CSS selector, or "text=Some label" to match on visible text (substring, exact matches ranked first) | |
| max_chars | No | Truncate at this length |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly, idempotent, and non-destructive behavior. The description adds useful behavioral detail: it returns one element only, reports how many matched, and uses the nth parameter to select a different match. This goes beyond the annotations, though it does not mention truncation behavior covered by max_chars.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The core purpose is front-loaded, and the important selection behavior is stated compactly without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Together with the fully documented schema, the description covers the key selection semantics and parameter usage. The absence of an output schema is mitigated by the description's mention of matched-count reporting and nth selection, though explicit return-shape details are not provided.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 100% parameter coverage, so the baseline is 3. The description adds value by clarifying the nth parameter's purpose ('pick a different one') and the one-element-return behavior, which supplements the schema's more formal definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('get') and identifies the resource ('HTML of a page or element'), and it distinguishes itself from text-oriented retrieval by saying 'rather than text.' However, it does not explicitly name sibling tools such as get_page_content or query_elements, so differentiation is clear but not exhaustive.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit guidance on when to use it: when markup, attributes, or structure are needed rather than text. It does not mention exclusions or alternative tool names, but the stated context is enough for an agent to route correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_linksGet LinksARead-onlyIdempotent
List links on the page with their text and resolved href. Pass unique to collapse repeated href and text pairs, which navigation and footers produce in bulk.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum links to return | |
| query | No | Case-insensitive substring matched against link text and href | |
| tab_id | No | Arc tab id from list_tabs. Omit to use this agent's current tab, falling back to whatever tab is active in Arc. | |
| unique | No | Collapse links with an identical href and text, reporting how many were dropped |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already cover read-only, idempotent, and non-destructive behavior. The description adds meaningful context beyond that: it clarifies that hrefs are 'resolved' and explains why duplicates occur ('navigation and footers produce in bulk'), helping the agent understand output characteristics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences, with the core action front-loaded and the optional deduplication behavior explained immediately after. Every sentence earns its place and no wording is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description, combined with a fully documented schema and safety annotations, covers the essential behavior: what is listed, what link fields are returned, and how deduplication works. It could be slightly stronger by naming sibling tools like query_elements as alternatives, but no critical information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents limit, query, tab_id, and unique. The description repeats the unique parameter's purpose with extra context about duplicate sources, but does not add substantial semantic value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'List links on the page with their text and resolved href.' This clearly distinguishes the tool from siblings like get_page_content or query_elements, which extract general content or elements rather than link-specific data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context that this tool is for extracting links with text and href values, and adds conditional guidance for the unique flag. It does not explicitly name alternatives or state when not to use it, but the specialized purpose makes intended usage apparent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_page_contentGet Page ContentARead-onlyIdempotent
Get the visible text of a page, or of every element matching a selector joined with blank lines. Always reports "matched", so a partial answer is never silent. Nested matches repeat their text, so prefer a leaf-ish selector.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | No | Arc tab id from list_tabs. Omit to use this agent's current tab, falling back to whatever tab is active in Arc. | |
| selector | No | CSS selector, or "text=Some label" to match on visible text (substring, exact matches ranked first) | |
| max_chars | No | Truncate the joined text at this length | |
| first_only | No | Return only the first match instead of joining all of them |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, open-world, and non-destructive behavior. The description adds meaningful behavioral context: the joined-with-blank-lines format, the always-reports-'matched' guarantee, and the nested-match duplication quirk, all beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with no filler. The first sentence delivers the core capability, and each following sentence adds distinct, useful behavioral or selection guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, idempotent tool with 100% parameter documentation and safety annotations, the description covers output format, truncation indirectly, sibling-relevant selector behavior, and the partial-result guarantee. A brief note on when to prefer a sibling tool would make it fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema fully documents tab_id, selector, max_chars, and first_only. The description reinforces selector semantics but does not meaningfully add beyond the schema, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Get the visible text of a page, or of every element matching a selector joined with blank lines.' This clearly conveys what the tool returns, though it does not explicitly differentiate from siblings like get_html or query_elements.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Offers operational guidance such as preferring a leaf-ish selector to avoid nested repetition and noting that a partial answer is never silent. However, it never says when to choose this tool over alternatives like get_html, get_links, or query_elements, leaving routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_page_infoGet Page InfoARead-onlyIdempotent
Page overview: title, url, ready state, meta description, headings, form and frame counts. Cheap orientation before deciding what to do.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | No | Arc tab id from list_tabs. Omit to use this agent's current tab, falling back to whatever tab is active in Arc. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, openWorld, idempotent, and non-destructive behavior. The description adds the useful 'cheap' performance characteristic and clarifies that it returns counts and metadata rather than full content. It does not contradict the annotations, but also adds limited behavioral context beyond them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no filler. The output fields are listed compactly and the usage intent is front-loaded with 'Page overview' and reinforced by 'Cheap orientation before deciding what to do.'
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description lists the main returned fields and gives a clear use case, and the schema covers the only parameter and its fallback behavior. With no output schema, listing fields is helpful, though the exact shape of the response is not specified; overall adequate for a low-complexity tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with tab_id fully documented including fallback behavior when omitted. The tool description adds no parameter-specific information because the schema already carries that burden; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as a page overview that returns orientation data: title, URL, ready state, meta description, headings, and form/frame counts. It distinguishes itself from heavier siblings like get_page_content and get_html by emphasizing 'overview' and 'cheap orientation,' though it lacks a direct verb like 'gets'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Cheap orientation before deciding what to do' explicitly frames when to use it: as a lightweight first step before deeper actions. It does not name alternative tools or state when not to use it, but the orientation context is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
go_backGo BackA
Navigate a tab back in history. Goes through the page, so it works on a background tab, which Arc's own back command does not, and the result is checked against the tab url rather than assumed.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | No | Arc tab id from list_tabs. Omit to use this agent's current tab, falling back to whatever tab is active in Arc. | |
| timeout_ms | No | How long to wait for loading. Capped at 30000ms, because a longer call is killed by the client before it can answer. To wait longer, call wait_for_load again: repeated short waits each hand back a real readyState and url, which one long wait does not. | |
| wait_until_loaded | No | Wait for the page to finish loading before returning |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description reveals important behavioral nuance: it 'goes through the page' rather than issuing a browser-level command, and it verifies the result against the tab URL instead of assuming success. This adds meaningful context that annotations alone do not provide. No contradiction with readOnlyHint=false or destructiveHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler, with the core action front-loaded and the second sentence dedicated to a high-value differentiator. Every phrase contributes to correct invocation or selection.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an optional-parameter navigation tool, the description plus schema and annotations cover the main operational requirements well. The main gap is the absence of any explicit statement about return value or output shape, but this is a minor omission given the simplicity of the operation and the absence of an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the input schema already documents tab_id, timeout_ms, and wait_until_loaded in detail. The tool description itself adds no parameter-level meaning, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Navigate a tab back in history.' It immediately distinguishes the tool from forward navigation and from Arc's native command by noting it works on background tabs. An agent can understand exactly what this tool does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear use case: navigating a background tab back, which it explicitly contrasts with 'Arc's own back command.' It does not explicitly enumerate when not to use this tool or compare it to sibling tools like go_forward, so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
go_forwardGo ForwardA
Navigate a tab forward in history. Goes through the page and confirms the tab really moved before reporting success.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | No | Arc tab id from list_tabs. Omit to use this agent's current tab, falling back to whatever tab is active in Arc. | |
| timeout_ms | No | How long to wait for loading. Capped at 30000ms, because a longer call is killed by the client before it can answer. To wait longer, call wait_for_load again: repeated short waits each hand back a real readyState and url, which one long wait does not. | |
| wait_until_loaded | No | Wait for the page to finish loading before returning |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds a meaningful behavior beyond annotations: 'confirms the tab really moved before reporting success.' This tells the agent the tool verifies navigation rather than blindly returning, which is useful and not redundant with readOnlyHint=false or destructiveHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, both earning their place: the first states the primary action and the second adds the verification behavior. No filler or redundant restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple navigation operation, the description is sufficient: it identifies the action, confirms a verification step, and openWorldHint and destructiveHint=false provide safety context. With no output schema, it would have been stronger to mention the return value, but the success-reporting hint partially covers this.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter's meaning is already documented in the schema. The description does not add parameter-level detail beyond the schema, which makes the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Navigate a tab forward in history.' The word 'forward' clearly separates this tool from the sibling go_back, and the confirmation behavior further clarifies its identity. An agent can distinguish this tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the intended use clear by saying 'forward in history,' but it does not explicitly mention go_back or state when this tool should be preferred over alternatives. Usage is implied rather than directly guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_spacesList SpacesARead-onlyIdempotent
List Arc spaces in the front window, with tab counts and which is active. Tabs pinned to the top of the sidebar (location topApp) belong to no space, so the reported tabsInSpaces plus topAppCount is what reconciles with totalTabs. Counts cover the front window only, while list_tabs covers every window.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint false, covering the safety profile. The description adds front-window scoping, the fact that pinned tabs are excluded from space counts, and the reconciliation formula (tabsInSpaces + topAppCount = totalTabs). This goes beyond annotation coverage, providing useful behavioral context, though it doesn't describe the exact return structure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with the core purpose, followed by two concise clarifying details. No redundant or vague phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given zero parameters and no output schema, the description provides sufficient context: what it returns (tab counts, active indicator), the window scope, reconciliation with pinned tabs, and the relationship to list_tabs. An agent can call it correctly and interpret results without additional information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters (input schema is empty), so there is nothing for the description to add. Baseline of 4 for zero-parameter tools is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (list), resource (Arc spaces), and scope (front window), and adds tab counts and which space is active. It explicitly differentiates from list_tabs by noting the window coverage ('Counts cover the front window only, while list_tabs covers every window'), making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly contrasts with list_tabs ('Counts cover the front window only, while list_tabs covers every window'), giving a clear selection rule. It also explains the reconciliation logic for pinned tabs (topApp), helping the agent decide when this tool's output is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tabsList TabsARead-onlyIdempotent
List Arc tabs. Rows are flagged 'mine' for tabs this agent opened and 'isActive' for the tab the user is on. Defaults to every tab; pass scope 'own' to narrow.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Case-insensitive substring matched against title and url | |
| scope | No | 'all' (default) or only this agent's tabs | all |
| space | No | Only tabs in this space title | |
| window_id | No | Restrict to one window id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, and non-destructive behavior, lowering the burden on the description. The description adds useful behavioral context by explaining row flags and the default scope, which is valuable beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler, front-loading the core purpose before the behavioral details. Every clause earns its place and contributes to correct tool invocation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only listing tool with four optional parameters, the description covers the essential behaviors: default scope, row flags, and narrowing via scope. Minor details like ordering or result limits are not specified, but they are not critical for an agent to call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema is fully documented at 100% coverage, so the schema already carries the parameter meaning. The description adds only a minor clarification about the scope parameter's default and effect, which is otherwise already present in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource ('List Arc tabs') and immediately clarifies the key row semantics ('mine' and 'isActive'), making the tool's purpose unambiguous. This is enough to distinguish it from siblings like get_current_tab or close_tab even without naming them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly states the default behavior ('Defaults to every tab') and the way to narrow it ('pass scope 'own' to narrow'), giving agents concrete context for invocation. It does not explicitly discuss when to prefer this tool over alternatives, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
open_urlOpen URLA
Open a URL in Arc. Launches Arc if needed. New tabs go into the agent space when one exists, otherwise the main window. Arc auto-selects new tabs, so the previous selection is put back unless you pass activate.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL to open | |
| space | No | Space id or title to open into, overriding the agent space | |
| tab_id | No | With new_tab false, the tab to navigate | |
| new_tab | No | Open a new tab. Set false to navigate an existing tab instead. | |
| activate | No | Bring Arc to the front and leave the new tab selected | |
| little_arc | No | Open a Little Arc window. Fire and forget: Arc does not expose these afterwards. | |
| timeout_ms | No | How long to wait for loading. Capped at 30000ms, because a longer call is killed by the client before it can answer. To wait longer, call wait_for_load again: repeated short waits each hand back a real readyState and url, which one long wait does not. | |
| wait_until_loaded | No | Wait for the page to finish loading before returning |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations only say the tool is not read-only and touches the outside world. The description adds meaningful behavioral details: Arc is launched if needed, new tabs target the agent space or main window, and Arc auto-selects new tabs, restoring the previous selection unless activate is passed. These non-obvious behaviors go well beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, front-loaded with the core action, and every sentence adds useful behavioral context. There is no redundancy or filler, making it easy for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 8 parameters, 100% schema documentation, and no output schema, the description covers the main non-obvious runtime behaviors: launching Arc, space routing, and tab selection. Combined with the richly documented input schema, an agent has enough context to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds extra semantic value by explaining the default space behavior and by clarifying why the activate parameter exists: the prior tab selection is restored unless activate is passed. This is more than the schema alone provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Open a URL in Arc.' It also adds important scope details such as launching Arc if needed, so an agent can distinguish this from tab-management and navigation siblings like reload_tab or switch_to_tab.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the core use case clear and gives context about where new tabs land, but it does not explicitly state when to prefer this tool over alternatives like reload_tab or wait_for_load. No when-not conditions or alternative names are given, so guidance is mostly implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
press_keyPress KeyA
Dispatch a key press to an element, or to the focused element when no selector is given. Handles named keys (Enter, Escape, Tab, ArrowDown) and single printable characters. Returns only a minimal identity for the element that received the key (tag plus whichever of id, name, type and aria-label exist); use query_elements when you need the full picture.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Key name, for example Enter, Escape, Tab, ArrowDown, or a single printable character | |
| exact | No | For "text=" selectors, require the whole trimmed text to equal the label instead of containing it. No effect on CSS selectors. | |
| tab_id | No | Arc tab id from list_tabs. Omit to use this agent's current tab, falling back to whatever tab is active in Arc. | |
| selector | No | CSS selector, or "text=Some label" to match on visible text (substring, exact matches ranked first) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses supported key categories, the no-selector fallback, and the exact minimal return shape (tag plus id/name/type/aria-label). The return caveat is valuable because no output schema exists, and it does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the primary action, then capabilities, then the return limitation and alternative. Every sentence earns its place, and there is no filler or redundancy with the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description adequately explains what the tool returns and directs the agent to query_elements for richer data. All four parameters are fully documented in the schema, and the key decision (selector vs focused element) is called out, so the agent can invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaning for selector behavior ('focused element when no selector is given') and reinforces valid key values, which goes slightly beyond what the schema alone states. It does not add detail for exact or tab_id, but the schema already covers those.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Dispatch a key press to an element'), then clarifies the fallback target ('focused element') and supported key forms ('named keys ... and single printable characters'). This clearly separates it from mouse-interaction siblings like click and fill.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when the focused element is used ('when no selector is given') and points to query_elements as the alternative when a full element picture is needed. It does not enumerate exclusions relative to click/fill/select_option, but the guidance is clear enough for correct invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_elementsQuery ElementsARead-onlyIdempotent
Find elements and return structured details: text, value, href, visibility, disabled state and attributes. The main way to see what is on a page before acting on it. "text=" matching is substring, with exact matches ranked first; pass exact to require an exact match.
| Name | Required | Description | Default |
|---|---|---|---|
| exact | No | For a "text=" selector, match the whole text rather than a substring | |
| limit | No | Maximum elements to return | |
| tab_id | No | Arc tab id from list_tabs. Omit to use this agent's current tab, falling back to whatever tab is active in Arc. | |
| verbose | No | Include the bulky element rect and longer attribute values | |
| selector | Yes | CSS selector, or "text=Some label" to match on visible text (substring, exact matches ranked first) | |
| visible_only | No | Skip hidden elements |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint, idempotentHint, and non-destructive behavior, so the description correctly focuses on semantics beyond safety: text matching is substring, exact matches are ranked first, and passing exact requires a full match. This is valuable behavioral information that prevents incorrect assumptions about selector matching.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: the first defines the tool and return format, the second establishes its role, and the third explains the matching behavior. Purpose is front-loaded and there is no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by listing the returned fields and the core matching behavior. It covers the tool's primary use, key return semantics, and the exact-match special case. It does not describe shape of results or enumeration behavior, but these are reasonably standard for an element-query tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents all six parameters at 100% coverage. The description's note about text= matching and exact matches is useful but largely restates what the schema's selector and exact fields already say, adding no new parameter-level meaning. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Begins with a specific verb and resource: 'Find elements and return structured details,' and lists the exact fields returned (text, value, href, visibility, disabled state, attributes). It also positions itself as 'the main way to see what is on a page before acting on it,' which gives it a distinct role among read-oriented siblings like get_html and get_page_content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for when to use the tool: it is the primary way to inspect a page before taking action. It does not explicitly name alternatives or provide exclusions, but 'main way' signals preferred usage over sibling tools. Missing explicit when-not-to-use keeps it from a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reload_tabReload TabAIdempotent
Reload a tab, then confirm the document really was replaced rather than assume it. Works on a background tab. Takes wait_until_loaded and timeout_ms like the other navigating tools, and returns from, to and the tab. Fails with ok false when the tab is still showing the document that was there before, which is what a slow server or a page holding on to unload looks like from outside.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | No | Arc tab id from list_tabs. Omit to use this agent's current tab, falling back to whatever tab is active in Arc. | |
| timeout_ms | No | How long to wait for loading. Capped at 30000ms, because a longer call is killed by the client before it can answer. To wait longer, call wait_for_load again: repeated short waits each hand back a real readyState and url, which one long wait does not. | |
| wait_until_loaded | No | Wait for the page to finish loading before returning |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since annotations are present, the description goes well beyond them by revealing the tool verifies the document was replaced, returns from/to/tab, and fails with ok false when the old document persists. This gives the agent insight into slow-server and unload-handler behavior without contradicting the readOnly=false, destructive=false, idempotent=true, openWorld=true annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the core action and verification intent come first, followed by background-tab support, parameter compatibility, return values, and failure semantics. Every sentence adds information without padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there is no output schema, the description properly explains what is returned (from, to, tab) and the failure condition (ok false). Combined with the fully documented parameters and annotations, this is enough for an agent to select and call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents tab_id, timeout_ms, and wait_until_loaded. The description adds little beyond saying these are 'like the other navigating tools,' which is contextually useful but not substantial new parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Reload a tab') and a resource, then adds the distinct verification purpose: 'confirm the document really was replaced rather than assume it.' This distinguishes reload_tab from siblings like go_back/go_forward/wait_for_load by making its unique behavioral contract explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context by noting it works on a background tab, shares parameters with other navigating tools, and returns from/to/tab. It does not explicitly name alternatives or say 'use this instead of X,' but the verification-focused language and failure semantics make the intended context reasonably clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scrollScrollAIdempotent
Scroll the page, or scroll an element into view. Page scrolls report scrollY, pageHeight and viewport, so you can tell how much is left.
| Name | Required | Description | Default |
|---|---|---|---|
| exact | No | For "text=" selectors, require the whole trimmed text to equal the label instead of containing it. No effect on CSS selectors. | |
| amount | No | Pixels to scroll for up and down | |
| tab_id | No | Arc tab id from list_tabs. Omit to use this agent's current tab, falling back to whatever tab is active in Arc. | |
| verbose | No | Include the bulky element rect and longer attribute values | |
| selector | No | Scroll this element into view instead of scrolling the page. CSS selector, or "text=Label" (substring, exact matches ranked first). | |
| direction | No | Page scroll direction | down |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide idempotentHint and destructiveHint, so the bar is lower. The description adds useful behavioral context by stating that page scrolls report scrollY, pageHeight, and viewport, letting the agent know how much scroll remains. No contradiction with annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. It front-loads the main purpose and follows with a useful behavioral detail about returned metrics, making every sentence earn its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With six parameters, full schema coverage, and no output schema, the description covers the core page-scroll return value but does not describe the return shape for element scrolls or the verbose output mode. This leaves a minor gap, but overall the definition is sufficiently complete for an agent to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema describes all six parameters in full, so the description does not need to explain them. The description adds no parameter-level meaning beyond what the schema already provides, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool scrolls the page or scrolls an element into view, with a specific verb and resource. It is unambiguous and readable, but it does not explicitly distinguish it from sibling tools that could also scroll (e.g., press_key or execute_javascript), so it misses full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance about when to use this tool versus alternatives, nor any exclusions or preferred conditions. The description simply describes what it does, leaving the agent to infer when it should be selected over other sibling navigation or input tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
select_optionSelect OptionA
Choose an option in a select element, by exact option value or exact visible label. When nothing matches, the failure lists the options that do exist, so the next call can pick a real one.
| Name | Required | Description | Default |
|---|---|---|---|
| option | Yes | Option value or visible text, matched exactly after trimming | |
| tab_id | No | Arc tab id from list_tabs. Omit to use this agent's current tab, falling back to whatever tab is active in Arc. | |
| selector | Yes | CSS selector for the <select>. "text=" cannot reach a select element, so use a CSS selector here. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
It discloses a useful behavioral trait beyond the annotations: on a failed match, the error lists existing options so the next call can succeed. Annotations already cover read-only, idempotence, and destructiveness, and the description does not contradict them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler: the first states the operation and matching semantics, the second adds actionable failure behavior. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple select tool with no output schema, the description covers the element type, matching behavior, and failure feedback. It does not describe a successful return value, but the failure behavior is the most decision-relevant outcome for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description repeats the matching mode and adds the failure-list behavior, but it does not materially extend the schema's parameter documentation for option, selector, or tab_id.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Choose an option in a select element'. It further specifies matching by exact option value or visible label, which clearly distinguishes it from siblings like click, fill, or press_key.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context by restricting use to select elements, which implies when this tool applies rather than generic click/fill. It does not explicitly name alternatives or exclusion conditions, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
switch_to_tabSwitch To TabAIdempotent
Make a tab the active tab in its window. Changes what the user sees, so prefer reading a tab by id when you only need its content.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | Yes | Arc tab id from list_tabs | |
| activate | No | Also bring Arc to the front |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds useful behavioral context beyond annotations by explicitly stating that the operation changes what the user sees. This complements readOnlyHint=false and gives the agent a strong reason to avoid calling it unnecessarily, even though it does not detail return behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two focused sentences with no waste. The first states the core action and outcome; the second adds important usage guidance. Critical information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter UI mutation with no output schema, the description covers the core action, user-visible side effect, and a usage caveat. Minor gaps include not naming the exact preferred reading tool and not describing the return value, but these are not significant for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already fully documents both parameters, including tab_id's source ('from list_tabs') and activate's default and meaning. The description adds no additional parameter-level meaning, so the schema carries the burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Make a tab the active tab in its window.' It also differentiates from read-only tab operations by noting it changes what the user sees, so an agent can distinguish it from list_tabs, get_current_tab, and content-reading siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a clear when-not condition: prefer reading a tab by id when only content is needed. It does not name the exact alternative tool, but the guidance points toward content-reading siblings like get_page_content or get_html rather than switching UI state.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_for_loadWait For LoadARead-onlyIdempotent
Poll until a tab has finished loading and the document is ready. Use after an action that triggers navigation.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | No | Arc tab id from list_tabs. Omit to use this agent's current tab, falling back to whatever tab is active in Arc. | |
| timeout_ms | No | Give up after this long. Capped at 30000ms, because a longer call is killed by the client before it can answer. To wait longer, call wait_for_load again: repeated short waits each hand back a real readyState and url, which one long wait does not. | |
| url_contains | No | Also wait until the url contains this substring |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as readOnly, idempotent, and non-destructive. The description adds behavioral detail beyond that: it polls, waits for document readiness, and is meant to follow navigation. It does not mention timeout failure behavior, but that is already covered thoroughly in the timeout_ms parameter description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, both essential: the first defines behavior and the second defines when to use it. There is no filler, and the key fact is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple wait/poll tool with full schema coverage and safety annotations, the description is nearly complete. It could be stronger by contrasting with wait_for_selector, and there is no output schema, but the timeout_ms description already communicates what a call hands back (readyState and url).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. All three parameters already have clear descriptions, defaults, and constraints in the schema. The main description adds no parameter-level meaning beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Poll until a tab has finished loading and the document is ready.' This clearly distinguishes it from element-based waiting (wait_for_selector) and navigation-triggering actions (reload_tab, go_back). It is not a tautology of the tool name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second sentence gives explicit placement guidance: 'Use after an action that triggers navigation.' This tells an agent when to invoke the tool. However, it does not explicitly state when not to use it or name alternatives like wait_for_selector, so it stops short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_for_selectorWait For SelectorARead-onlyIdempotent
Poll until an element appears, becomes visible, or disappears. Use after a click that loads content. On timeout it says so explicitly with waitedMs and the last counts, and a broken selector or page error fails straight away instead of burning the whole timeout. The visible state ignores screen-reader clipping (boxes under 2x2 px, inset clip-path), which nothing can actually click.
| Name | Required | Description | Default |
|---|---|---|---|
| exact | No | For "text=" selectors, require the whole trimmed text to equal the label instead of containing it. No effect on CSS selectors. | |
| state | No | Condition to wait for | visible |
| tab_id | No | Arc tab id from list_tabs. Omit to use this agent's current tab, falling back to whatever tab is active in Arc. | |
| verbose | No | Include the bulky element rect and longer attribute values | |
| selector | Yes | CSS selector, or "text=Some label" to match on visible text (substring, exact matches ranked first) | |
| timeout_ms | No | Give up after this long, capped at 30000ms because a longer call is killed by the client before it can answer. To wait longer, call wait_for_selector again: every call returns the current counts, so repeated short waits tell you more than one long one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the readOnly/openWorld/idempotent annotations by explaining timeout behavior (waitedMs and last counts), fast-failure on broken selectors/page errors, and the subtle visible-state handling of screen-reader clipping. These are valuable behavioral details an agent needs to interpret results correctly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded, with the purpose stated in the first sentence. Each subsequent sentence adds meaningful behavioral or edge-case information, with no filler or redundant restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 6 parameters, no output schema, and rich annotations, the description is complete. It covers purpose, when to use it, failure modes, timeout semantics, and a subtle visibility edge case. The schema covers the remaining parameter-level details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaning beyond the schema by clarifying what 'visible' means in practice (clipping behavior) and how timeout_ms failure reporting works. This enriches the parameter semantics without repeating schema content.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb and resource: 'Poll until an element appears, becomes visible, or disappears.' This clearly differentiates it from sibling tools like wait_for_load or query_elements by focusing on selector-based state polling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear usage context: 'Use after a click that loads content.' It doesn't explicitly name alternatives or exclusions, but the guidance is specific enough for an agent to know when this polling tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Every tool targets a clearly distinct action or output: tab lifecycle, navigation, page inspection, element interaction, spaces, and scripting are cleanly separated. Even similar-sounding tools like get_page_content, get_html, query_elements, and get_links are differentiated by what they return.
The vast majority follow a clear verb_noun snake_case pattern (list_tabs, close_tab, get_links, select_option). Minor outliers like arc_status, go_back, go_forward, and batch break the strict verb_noun pattern but remain predictable and readable.
26 tools is above the typical well-scoped range, but the breadth is justified by the server's purpose: full Arc browser control spanning tabs, navigation, DOM inspection, interaction, spaces, JavaScript execution, and batching. Each tool has a distinct role, so it feels dense rather than bloated.
The surface covers the full automation lifecycle for Arc: tab discovery and management, navigation, page state inspection, element querying and interaction, waiting, spaces, and escape hatches via JavaScript and batch. No obvious dead ends or missing core operations stand out.
Maintenance
Related MCP Connectors
Stealth web automation for AI agents. Login, signup, navigate, screenshot.
Stealth web automation for AI agents. Login, signup, navigate, screenshot.
Headless browser primitives for AI agents when sites need real JS rendering.
AI-powered web automation. Navigate websites using AI agents for one page or a thousand
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceEnables semantic browser automation for the Arc browser, allowing users to perform web tasks like searching, shopping, and data extraction through natural language commands.1
- AlicenseAqualityCmaintenanceEnables inspection and control of Arc Browser spaces and tabs on macOS, including reading sidebar/history data and performing actions like focusing spaces, creating and closing tabs.131MIT
- FlicenseBqualityCmaintenanceMCP server to control Arc Browser on macOS via AppleScript, enabling tab, window, space, and page operations along with frontend/backend development tools like network monitoring, console capture, and API testing.76
- AlicenseAqualityDmaintenanceEnables AI agents to control macOS desktop apps via screenshots, mouse clicks, keyboard input, accessibility queries, and AppleScript.1115MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/DB-25/arc-control-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server