OpenBrowse

Tools Reference

Complete reference for all browser agent tools.

The agent comes equipped with a comprehensive suite of tools. When you ask it to perform a task, it autonomously selects and chains these tools to get the job done.

Security & Approvals

Sensitive actions (like executeOnPage or modifying memory) prompt for your explicit approval. Choose Allow once, or Always allow on this site to streamline repeat workflows.

Tab handles

Every tab-interacting tool takes an explicit tab argument — a stable handle (t1, t2, ...) that identifies which tab the call should act on. Handles are minted by navigate (when it opens a new tab) and selectTab (when binding an external tab into the conversation). Once minted, a handle keeps referring to the same tab on subsequent turns and across service-worker restarts.

The agent sees the live set of available handles in a ## Tabs in this conversation block injected into its system prompt every turn. Calling listTabs returns the same shape and is the way to discover tabs the user has open elsewhere.

To bootstrap a fresh conversation, the agent calls navigate({ url }) with no tab arg — that opens a new background tab and returns the new handle in the response.

Browsing & Interaction

The agent navigates the web and interacts with elements just like a human user. Each tool below requires tab (except navigate, where omitting tab opens a new tab).

ToolDescription
navigate{ url, tab? }. With tab: navigate that tab. Without tab: open a new background tab and return its handle.
snapshot{ tab, mode?, selector?, diff? }. Capture a structural accessibility-tree snapshot of a tab.
readPage{ tab }. Extract text, links, and metadata from a tab.
screenshot{ tab, annotate?, fullPage? }. Capture a visual screenshot of a tab.
scrollPage{ tab, direction, amount? }. Scroll up or down.
clickElement{ tab, target }. Click a specific element by its @ref (from a snapshot of THAT tab) or CSS selector.
typeInElement{ tab, target, text, clearFirst?, submit? }. Type into an input. submit: true presses Enter and waits for navigation.
read_network_requests{ tab, urlPattern?, limit?, clear? }. Read HTTP requests (XHR, Fetch, documents, images) a tab has made — metadata only (url, method, type, status), no response bodies. Captured continuously while the agent works the tab; cleared on cross-domain navigation. Useful for reverse-engineering the API behind a list/feed.
read_console_messages{ tab, pattern?, onlyErrors?, limit?, clear? }. Read console output (log/info/warn/error) and uncaught exceptions from a tab. Pass a pattern to filter noise. Cleared on cross-domain navigation.

Tab Management

ToolDescription
listTabsList all open tabs across windows and spaces; emits handles.
selectTab{ tab }. Bind an external tab into this conversation so it appears in the legend and can be passed as tab to other tools.

Extraction

ToolDescription
extract{ tab, instruction, selector?, schema? }. Extract structured data from a tab using its accessibility tree. Preferred over raw DOM-scraping via executeOnPage for text-based data like search results, product lists, table rows, or articles. URL fields ({ type: "string", format: "uri" }) are substituted with numeric IDs and rehydrated to prevent hallucination.

Batching

ToolDescription
batch{ description, invocations: [{ name, arguments }, ...] }. Run 2–8 independent read-only tools concurrently in one call. Results come back in results, in the same order as invocations, each as { name, ok, output?, error? }.

Batching collapses several round-trips into one. It is most useful when the agent already knows every argument up front — reading three tabs, grepping two patterns, or firing several webSearch queries.

batch({
  description: "Comparing pricing pages",
  invocations: [
    { name: "snapshot", arguments: { tab: "t1", mode: "viewport" } },
    { name: "readPage", arguments: { tab: "t2" } },
    { name: "webSearch", arguments: { query: "competitor pricing" } }
  ]
})

description is a short present-participle phrase naming the work in the user's terms — it becomes the label on the tool call in chat. The agent writes the phrase; the interface adds progress and outcome. A batch labelled Comparing pricing pages reads as "Comparing pricing pages… 4 reads" while it runs, then "Comparing pricing pages · 4 of 4" when every call succeeds, or "Comparing pricing pages · 3 of 4" with an amber alert when one fails. The phrase never changes tense, so it stays accurate regardless of the language the agent is writing in.

Batchable tools: snapshot, readPage, extract, read_network_requests, read_console_messages, listTabs, webSearch, Read, Glob, Grep, LS, searchMemory, skill, list_artifacts, read_artifact_diagnostics.

Reads only, by design

Approval gating (per-site allowlists, plan/act modes, the executeOnPage static read check) lives in the tool-call wrapper, not in the tools themselves — so anything reached through batch would skip it. Rather than duplicate that logic, batch only accepts tools that need none of it: no clicking, typing, navigating, writing, or code execution, and no screenshot (nesting images would defeat screenshot pruning during compaction). Batching an unsupported tool returns an error for that one invocation and leaves the others untouched.

Invocations run concurrently and cannot see each other’s output, so calls whose arguments depend on a previous result — an @ref from a snapshot, a URL from a search — must be issued separately. Subagents get a batch scoped to their own allowed tools, so batching can never widen a subagent’s reach.

Code Execution

The agent can execute code in three sandboxed environments depending on what it's doing.

ToolDescriptionSecurity
executeCodeRun JavaScript in an isolated worker (no DOM access). Best for data processing.Safe (Isolated)
executeOnPage{ tab, code, args? }. Run JavaScript directly in a tab's page context. Use when you need DOM access.Requires Approval
executePythonRun CPython 3 in Pyodide, bundled in a sandboxed iframe. The conversation's workspace is mounted at /workspace; /skills is mounted read-only. Optional network access via pyfetch.Safe (Sandboxed)

For Python specifically, the agent loads the bundled python-env skill on demand to pick up Pyodide-specific gotchas (no subprocess, mismatched import names like import fitz for pymupdf, top-level await, latin-1 PDF unicode pitfalls, etc.).

Filesystem

These tools operate on the conversation's per-conversation virtual Workspace, backed by OPFS.

ToolDescription
ReadRead a file. Returns lines prefixed with line numbers; supports offset + limit. Can also read skill bundle files via a /skills/<name>/… path.
WriteCreate or overwrite a file. Auto-creates parent directories.
EditExact string replacement in an existing file.
GlobFind files matching a glob pattern (e.g. src/**/*.ts).
GrepRegex search across file contents. Returns path:line:content.
LSList files and directories in a folder.

Skills

Skills let the agent load curated, on-demand instructions instead of carrying everything in its system prompt. See Skills for the full picture.

ToolDescription
skillLoad a specific skill's SKILL.md into the conversation.
install_skillInstall a skill from a GitHub repository or URL.
create_skillAuthor and persist a new skill into the local registry.

To read a supporting file bundled with a skill (reference docs, scripts), the agent uses the Read tool with the skill's path, e.g. Read({ file_path: "/skills/<name>/references/<file>" }).

Task Planning

For complex, multi-step operations, the agent maintains a structured plan visible in the side panel's Cowork → Progress card.

ToolDescription
todoWriteCreate or update the conversation's persistent task list. Status changes (pending → in_progress → completed) drive the Progress UI.

Asking You

The agent works autonomously and picks a reasonable default rather than checking in. askUser is the narrow exception: when a decision is genuinely yours and getting it wrong is expensive or irreversible — which flight to book, which saved card to pay with, which account to post from — it pauses and asks.

ToolDescription
askUserAsk 1-4 multiple-choice questions and wait. Each question has a short header, 2-4 labelled options, and optional multi-select.

The question replaces the chat composer, so answering is the only thing in front of you. Questions are shown one at a time — move between them with the arrow keys, the back/forward arrows, or the progress dots in the header. Pick options with the number keys, type a custom answer in the always-present free-text box (which takes multiple lines; Shift+Enter for a newline, Esc to hand the arrow keys back), or choose Skip all questions to hand the whole call back to the agent — that discards anything you'd already answered and it proceeds on its best interpretation, telling you what it assumed. To skip just one question, leave it blank and move on: a blank question is reported as unanswered rather than as an empty answer.

The agent is genuinely stopped while a question is open: askUser runs in your browser rather than in the agent loop, so the turn ends and a new one starts when you answer. That means a question survives a reload, a side-panel close, and a browser restart — and there's no deadline to answer it. Nothing is held open while it waits, so you can leave a question sitting and answer it tomorrow; the agent picks up from your answer whenever it arrives.

Questions are unavailable where there's nobody to ask: scheduled tasks, runs driven by an external MCP host, and subagents never get the tool.

Memory

Persistent memory across conversations. See Memory for details.

ToolDescription
saveMemoryStore a new piece of information.
recallMemorySearch previously saved memories.
updateMemoryUpdate an existing memory entry.
deleteMemoryRemove a memory entry.

Connectors (MCP)

Any Connector you enable adds its own MCP tools to the agent's toolset dynamically. Names are namespaced by connector (e.g. github_search_issues, linear_create_issue).

On this page