SoAI drives a real Chromium browser through Playwright. Twenty-four tools cover navigating, clicking, typing, reading the page, and debugging what went wrong. Two more fill in credentials without returning the plaintext in their own arguments or results, and those live on the Secrets vault page.
Reach for these when web_fetch comes back thin: a page that renders client-side, a login wall, a form
to submit, or anything that needs a second click before the content appears.
In the SoAI WebUI, make these tools available by selecting Chat configuration in the chat header, then
Tools. Turn on Tools enabled, choose the required tools under
Chat mode, Plan mode, or Execute mode, and select
Save. The account needs MCP usage (MCP_USE), the selected model must support tool calling,
and both TOOLS.MCP.ENABLED and
TOOLS.MCP.BROWSER.ENABLED must be
on. Chromium must also be installed or available for automatic installation while SoAI is online.
Page representation
In the standard reference-based workflow, browser_snapshot returns an accessibility tree rather than
raw HTML: the elements a screen reader would announce, each with a role, a name, and a short reference string. The
structured action tools use those references instead of CSS selectors, which survives class name churn and minified
markup. browser_eval is the exception. When enabled, it runs JavaScript in the page and can query or
change the DOM directly.
References go stale as soon as the page changes. After a click that navigates or re-renders, the old references
point at elements that no longer exist. Most action tools accept include_snapshot so the agent gets a
fresh tree back in the same call rather than spending a round trip on it. SoAI caps snapshots at
TOOLS.MCP.BROWSER.SNAPSHOT_MAX_CHARS, 20,000 characters by default, and start_char pages
through a longer one.
The tools
| Group | Tools |
|---|---|
| Going somewhere |
browser_navigate handles a URL or moves back and forward through the active tab's history.
It can also carry HTTP basic auth credentials when a site demands them
|
| Acting on the page |
browser_click, browser_type, browser_press_key,
browser_hover, browser_select_option, browser_scroll,
browser_drag, browser_upload_file
|
| Reading the page |
browser_snapshot, browser_screenshot, browser_pdf,
browser_eval
|
| Waiting |
browser_wait_for blocks on elapsed time, text appearing or disappearing, or a URL matching
|
| Session and tabs | browser_tabs, browser_resize, browser_close |
| Debugging |
browser_console, browser_network, browser_dialog,
browser_downloads, browser_status
|
| Profiles | browser_profiles, browser_persistence_reset |
browser_eval runs JavaScript in the page and covers tasks the structured tools cannot express. SoAI
caps scripts at 10,000 characters and 15 seconds. You can switch it off on its own with
TOOLS.MCP.BROWSER.JS_EVAL_ENABLED while leaving the rest of the browser working.
JavaScript evaluation can read values from the page DOM, including a password that an autofill tool has placed in
a field. Disable it and leave browser_eval out of the selected tools when using protected credentials.
See Passwords and credential tools for the full boundary.
The tool catalog classifies browser_persistence_reset as destructive because it wipes a profile's saved
cookies and storage. It needs confirm: true, and Plan mode refuses it. Ordinary clicks, typing, uploads,
and JavaScript evaluation are not classified as destructive even when the target site gives them lasting effects.
Browser failures
Three tools provide the evidence a stuck agent needs. browser_console replays console messages with a
severity filter, which catches the JavaScript error behind a button that does nothing.
browser_network lists requests with status filters and can include response bodies up to 64 KiB, which
catches the API call returning 403. browser_dialog handles a native alert, confirm, or prompt that has
blocked the page: without it, a modal dialog leaves the agent waiting on a page that will never respond.
Both log buffers keep TOOLS.MCP.BROWSER.LOG_MAX_ENTRIES entries, 500 by default, and both accept a
since marker so an agent reads only what happened after its last action.
Sessions and profiles
A browser session is a running Chromium instance with its own cookies and tabs.
TOOLS.MCP.BROWSER.SESSION_SCOPE decides how widely one is shared, and defaults to
conversation, so each chat gets its own browser and two conversations cannot see each other's logins.
Profiles hold the persistent state. The default profile stores cookies and local storage as a Playwright storage
state file, saved automatically after changes and reused next time. Named profiles defined in
TOOLS.MCP.BROWSER.PROFILES can go further and use a full Chromium user data directory, which keeps
extensions and everything else a real browser profile holds. A profile can also point at an existing browser through
a CDP endpoint, which attaches to a Chrome you started yourself instead of launching a new one.
| Setting | Default | What it does |
|---|---|---|
TOOLS.MCP.BROWSER.AUTO_INSTALL |
true |
Download the Chromium runtime on first use |
TOOLS.MCP.BROWSER.BLOCK_ADS |
true |
Filter known advertising requests using EasyList |
TOOLS.MCP.BROWSER.BLOCK_FONTS |
true |
Skip web fonts |
TOOLS.MCP.BROWSER.BLOCK_IMAGES |
false |
Images load, since screenshots need them |
TOOLS.MCP.BROWSER.BLOCK_MEDIA |
true |
Skip audio and video |
TOOLS.MCP.BROWSER.DEFAULT_ACTION_TIMEOUT_SEC |
15 |
How long a click or type may take |
TOOLS.MCP.BROWSER.DEFAULT_NAV_TIMEOUT_SEC |
30 |
How long a navigation may take |
TOOLS.MCP.BROWSER.ENABLED |
true |
Off means every browser tool refuses to run |
TOOLS.MCP.BROWSER.HEADLESS |
true |
Run without a visible window |
TOOLS.MCP.BROWSER.MAX_CONCURRENT_PAGES |
10 |
Ceiling on open pages |
TOOLS.MCP.BROWSER.SESSION_SCOPE |
conversation |
How widely one browser session is shared |
TOOLS.MCP.BROWSER.SNAPSHOT_MAX_CHARS |
20000 |
Cap on one accessibility snapshot |
TOOLS.MCP.BROWSER.STORAGE_STATE_ENABLED |
true |
Keep cookies between sessions |
Ad blocking is a security feature as well as a performance setting. SoAI evaluates Chromium requests against a packaged or refreshed EasyList matcher and keeps the existing matcher if a refresh fails. This reduces contact with known advertising infrastructure and malicious ads, but it does not block every tracker or hostile script and does not replace the private-network navigation policy. See Browser ad blocking for its security role and limits.
An administrator with Configuration changes (CONFIG_PATCH) can edit these keys: select
the Settings button at the right of the header, then Settings, then select
Advanced in the Settings page header. The page becomes Advanced settings and the
control changes to Basic. Search for a key, edit it, and select Save. Blocking
fonts and media by default keeps pages loading quickly; images stay on because a screenshot without them is not much
use.
The Chromium runtime downloads on first use, which can take a while on a slow connection. With offline mode on SoAI will not install it, though a runtime that is already installed keeps working.
Where the browser may go
Browser navigation follows its own rule, separate from the private-network switches the other tool families use. While SoAI is online, the browser navigation policy blocks private and loopback addresses, and no setting relaxes that policy. An agent cannot point the browser at your router or SoAI's own admin interface.
Changing TOOLS.MCP.WEB_FETCH.BLOCK_PRIVATE_NETWORK_EGRESS or
TOOLS.MCP.HTTP_REQUEST.BLOCK_PRIVATE_NETWORK_EGRESS affects only that named HTTP tool. Neither setting
changes browser navigation policy.
Offline mode inverts the rule: SoAI allows only URLs that resolve to the local machine.
Browser authority
A browser session carries real cookies. If you sign a profile in to webmail or an admin panel, an agent with browser tools can act as that account (within the site's own permissions). The tool layer does not distinguish reading a page from clicking Delete.
Give browser tools their own profile rather than one holding your day-to-day logins. The
Require tool approval toggle prompts for credential autofill and persistence reset, but ordinary
navigation, typing, uploads, JavaScript evaluation, and clicks pass without a prompt because their catalog metadata
is nondestructive. Use
browser_persistence_reset when a profile has picked up state you did not intend it to keep.