usable-browser-agent-free
Summary: This MCP server lets an AI agent drive your real, logged-in browser through 53 tools that perceive pages by accessibility/DOM refs and act on the active tab.
Perceive pages:
browser_snapshot(accessibility/DOM tree with[ref=eN]handles),browser_read_text,browser_get_value,browser_screenshot(vision fallback),browser_wait/browser_wait_for_text.Navigate:
browser_navigate/back/forward/reload, plus tab management (browser_list_tabs,select_tab,new_tab,close_tab).Interact in-page:
browser_click(right/middle, double-click, modifiers),browser_drag,browser_type,browser_fill_form,browser_select,browser_hover,browser_press_key,browser_scroll(windows or containers, infinite scroll),browser_paste.Clipboard: read/write text and images (
browser_clipboard_*).Credentials without exposing secrets:
browser_login,browser_fill_secret,browser_http_auth/clear_http_auth— alias-only, domain-locked, redacted from snapshots and results.Files & downloads:
browser_upload_file(no OS picker),browser_download,browser_downloads_list,browser_save_pdf.Diagnostics:
browser_network_log,browser_status,browser_info,browser_dialogs,browser_set_dialog_policy,browser_mock_geolocation.OS-level last mile (macOS):
browser_os_type/os_key/os_click/os_click_ref,browser_native_dialog,browser_focus_browser,browser_native_statusfor trusted input and native chrome.Workflow memory:
browser_workflow_recall/remember/forgetto save and reuse durable steps for changing sites.Human handoff:
browser_request_human_helpfor CAPTCHAs, anti-bot walls, and 2FA (never auto-bypassed).Escape hatch:
browser_evalfor arbitrary JS — disabled by default under hardened mode.
Provides an MCP server and Firefox extension that lets an AI agent drive the user's real Firefox browser, using existing logged-in sessions. The agent can perceive pages through accessibility/DOM snapshots with stable element refs and act via browser_* tools for navigation, clicking, typing, form filling, tab management, downloads, clipboard, network logs, workflow memory, credential brokering, and more.
The commercial build includes a Chrome extension, allowing the agent to drive the user's real Chrome browser with the same browser_* tools. Chrome support has some limitations for OS-level clicks (approximate coordinates and no iframe support).
Click on "Deploy 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., "@usable-browser-agent-free Check my Gmail for unread emails"
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.
Usable Browser Agent (free personal / evaluation tier)
An MCP server plus a browser extension that lets your AI agent (Claude Code, Codex, or any MCP client) drive your real browser, with all your logged-in sessions, instead of a throwaway automated browser. You log in once, by hand, and the agent operates as you.
This repository is the free tier: the same single-session MCP server as the commercial build, licensed for personal, non-commercial use and for evaluating the product before buying. The Firefox extension for it is published on Firefox Add-ons. Commercial use (in or for a business, in paid client work, or inside a commercial product or service) needs the commercial license, a one-time $39 purchase at https://savvytechsphere.com/usable-browser-agent, which also includes the Chrome build. It comes with a 14-day, no-questions refund. There is no license key in either tier and nothing checks for one; the tiers differ only in the license grant and the extension identity.
Your passwords stay out of the agent. When the agent logs you in, it passes only a secret alias, never the value. Credentials live in a local vault, are domain-locked (refused on the wrong site), and are redacted from everything the agent reads or screenshots. See docs/CREDENTIAL-SAFETY.md.
How it works
Claude Code / Codex / any MCP client
| MCP over stdio
v
MCP server (Node, this repo) --hosts--> WebSocket ws://127.0.0.1:8876
^ ^
| 53 browser_* tools | (extension connects out)
+------------------------------------------+
Firefox extension (from Firefox Add-ons)
your real profile, your logins -> DOM actions on the active tabThe agent perceives pages through an accessibility/DOM snapshot where every interactive element
has a stable [ref=eN] handle, then clicks and types by ref. No coordinate guessing, no vision
model required. Everything runs on your machine: MCP over stdio, and the extension talks to the
server over a WebSocket bound to 127.0.0.1. Nothing leaves your computer.
The agent always acts on the currently active tab. Keep the tab you want it to use focused.
Related MCP server: stealth-agent-browser-mcp
Get started (about 2 minutes)
Two pieces: this MCP server, which your agent launches, and the Firefox extension, which you install once from Firefox Add-ons.
1. Get the server and run the installer
Needs Node.js 18 or newer and Firefox 142 or newer (macOS first; see docs/INSTALL.md).
npm install -g usable-browser-agent
uba-installOr from a checkout of this repository:
git clone https://github.com/Savvy-Tech-Sphere/usable-browser-agent-free.git
cd usable-browser-agent-free
node bin/uba-install.mjs # or: npm run setup(Prefer a download? Grab the zip from the Releases page, unpack it, and run the same command inside the folder.)
The installer checks Node and the port, installs dependencies, registers the MCP server with
Claude Code and/or Codex using this copy's absolute path, runs the smoke test, optionally
stores your first login, and prints the macOS permission steps. It is idempotent; re-running it
never clobbers an existing config. Pass --non-interactive to accept every default.
2. Install the Firefox extension (one time)
Install Usable Browser Agent (free) from Firefox Add-ons: https://addons.mozilla.org/firefox/addon/usable-browser-agent-free/
The toolbar badge shows off, then ON once the extension connects to the MCP server your
agent launched. (The installer also prints these steps, plus the .xpi and Chrome steps that
apply to the commercial bundle; for the free tier the Add-ons listing is all you need.)
3. Log in and go
Log into the site(s) you want the agent to use, then ask your agent to run a browser task, for example: "On the active tab, open my notifications and list the pull requests waiting on me." It will snapshot the page, then act by ref.
Wiring by hand instead of the installer:
# Claude Code (user scope, works from anywhere afterward):
claude mcp add browser --scope user -e UBA_PORT=8876 -- node "$PWD/server/index.js"# Codex: add to ~/.codex/config.toml (use the absolute path to your copy):
[mcp_servers.browser]
command = "node"
args = ["/ABSOLUTE/PATH/TO/usable-browser-agent-free/server/index.js"]
[mcp_servers.browser.env]
UBA_PORT = "8876"Help: docs/INSTALL.md, docs/TROUBLESHOOTING.md, docs/UNINSTALL.md.
Hardened mode is the default
browser_eval (arbitrary JavaScript in the page) is off unless you opt in, and screenshots are
blocked near password fields. CAPTCHAs, anti-bot walls and two-factor prompts are deliberately not
automated: the agent asks you to step in, since it is your browser on your screen. One active tab
at a time.
Usage
Open Firefox or Chrome, log into the site(s) you want the agent to use.
Make sure the extension badge shows ON.
Ask Claude Code / Codex to do something — e.g. "On the active tab, search for X and add the first result to the cart." It will snapshot the page, then act by ref.
Workflow memory
Usable Browser Agent keeps a local workflow memory so agents do not rediscover the same changing website flow every time. This is for reusable task knowledge such as "how to create a new app in Google Play Console", including current page names, visible button labels, gotchas, and successful step order.
Default file:
~/.local/state/usable-browser-agent/workflow-memory.jsonlOverride with UBA_MEMORY_FILE=/path/to/workflow-memory.jsonl. The file is append-only JSONL,
created with mode 0600. Normal recall ignores records that have been superseded or forgotten.
This memory is local to the machine and file path you configure; it is not synced unless you point
multiple agents at the same controlled file.
Expected agent loop:
Before a repeated or multi-step site task, call
browser_workflow_recallwith the task and/or site.Use any matching memory as a starting point, then verify against the live page with
browser_snapshot.After a new or changed path succeeds, call
browser_workflow_rememberwith the durable steps.If an old memory is wrong, save a replacement with
supersedes: ["old_id"], or callbrowser_workflow_forgetif it should disappear from recall.
browser_status, browser_info, browser_navigate, and browser_snapshot also return short
workflow-memory hints when the active tab's domain already has saved memories. Hints are
intentionally brief; call browser_workflow_recall for the full steps.
Do not save passwords, one-time codes, raw account identifiers that are not needed for the workflow,
or transient [ref=eN] handles. The memory store rejects saved steps containing transient refs and
sanitizes stored URLs by dropping query strings and replacing likely account/app/developer id path
segments. Save visible labels and page/section names instead, because refs are rebuilt after every
snapshot.
Credential broker
browser_login and browser_fill_secret let an agent trigger a login without ever receiving the
credential value. The MCP client passes only a secret alias and element refs. Plaintext flows only:
secrets file -> MCP server -> local WebSocket -> browser extension -> DOM fieldThe default vault file is ~/.config/usable-browser-agent/secrets.json; override it with
UBA_SECRETS_FILE=/path/to/secrets.json. The server creates the parent directory if needed and
warns if the secrets file is readable by group/other users; keep it at mode 0600.
The file is a JSON array:
[
{
"alias": "github",
"domains": ["github.com"],
"username": "octo@example.com",
"password": "replace-with-real-secret"
}
]domains are allowed hostnames. Exact and subdomain matches are allowed, so github.com matches
gist.github.com but not evilgithub.com.
For logins, prefer the atomic fill-and-submit tool after taking a snapshot:
browser_login({
"secret": "github",
"username_ref": "e12",
"password_ref": "e13",
"submit_ref": "e14"
})browser_login fills the username when username_ref is provided and the secret has a username,
fills the password, then submits in one extension action. If submit_ref is omitted, it submits the
password field's enclosing form, with Enter as a fallback. The tool returns only a status string such
as logged in via [e14] or submitted form.
browser_fill_secret remains available for non-login flows:
browser_fill_secret({ "ref": "e12", "secret": "github", "field": "username" })
browser_fill_secret({ "ref": "e13", "secret": "github", "field": "password" })There is intentionally no value argument. If the active tab host is not allowed for the alias,
the server refuses the fill and does not send the value to the browser.
Read-back and screenshots are protected in layers:
Password fields and fields filled by the credential broker are redacted in snapshots and
browser_get_value.browser_screenshotis blocked while a broker fill/login is in progress, while a populated password field is present, or while any field is marked as secret-filled. After login navigation removes the credential fields, screenshots are allowed again.The server lazily loads the vault for redaction and scrubs configured secret values from every outbound tool result, including
browser_read_textandbrowser_evalresults.
Hardened mode is on by default: browser_eval (the arbitrary-JS escape hatch) is disabled and
screenshots are blocked whenever any password field exists, even if empty. If you need the
browser_eval escape hatch, opt out by setting UBA_STRICT_SECRETS=0 in the server's environment.
For Claude Code, browser is already registered, and claude mcp add refuses an existing name, so
remove and re-add it, keeping UBA_PORT at the port you installed with (run from your install
folder):
claude mcp remove browser --scope user && \
claude mcp add browser --scope user -e UBA_PORT=8876 -e UBA_STRICT_SECRETS=0 -- node "$PWD/server/index.js"If you installed with UBA_SECRETS_FILE set, add -e UBA_SECRETS_FILE=<absolute path> to that command as well, or the server falls back to the default vault and your stored logins stop resolving. Re-running the installer prints the exact command for your copy.
For Codex, add UBA_STRICT_SECRETS = "0" under [mcp_servers.browser.env]. Restart the agent so
the server picks it up.
Screenshot blocking is a temporal/state guard. Region-masking credential fields within an otherwise returned image is a possible v2 and is not implemented yet.
Tools (53)
Tool | Purpose |
| Search local workflow memory before starting a repeated/changing-site task |
| Save verified reusable workflow steps, pitfalls, and durable UI cues |
| Tombstone stale, sensitive, or incorrect workflow memory |
| Accessibility/DOM tree with |
| Navigation |
| Click by ref — supports right/middle button, double-click, and ctrl/shift/alt/meta modifiers |
| Drag one element onto another (kanban, sortable lists, sliders) |
| Type into a field by ref (optional |
| Fill many fields |
| Fill a username/password from a server-side secret alias |
| Atomically fill username/password from a server-side secret alias and submit |
| Choose a |
| Pointer & keyboard (scroll the window or a specific container; |
| Attach local files to a file input or dropzone — no OS file picker involved |
| Deliver a real paste event to an element (rich editors), from text or the clipboard |
| Read/write clipboard text |
| Read/write clipboard images |
| Auto-answer |
| Make |
| Download a URL to disk (no save dialog) and get its local path |
| Save the current tab as a PDF to the downloads folder |
| Inspect recent network requests (method, URL, status, errors) |
| Answer native HTTP basic-auth prompts from a secret alias |
| Read page/element content |
| Waiting |
| Tabs |
| Diagnostics & vision fallback |
| Report OS-level input availability and any setup needed |
| Real OS-trusted keystrokes (for |
| Real OS-trusted mouse clicks (screen coords or by element ref); macOS + cliclick |
| Inspect/operate native browser dialogs (file picker, print, basic-auth, "Leave page?"); macOS |
| Bring Firefox to the foreground for OS-level input; macOS |
| Hand off to the human for CAPTCHAs / anti-bot walls / 2FA |
| Run JS in the page sandbox; disabled in hardened mode (the default), opt in with |
Coverage tiers
The tool set is designed so an agent can complete any browser task a human could:
In-page interactions (clicks incl. right/double/modifier, drag-and-drop, typing, dialogs, container scrolling, clipboard) — handled entirely in the page.
Browser-level capabilities (downloads without the save dialog, save-as-PDF, HTTP basic-auth, network inspection, geolocation) — handled via WebExtension APIs.
The last mile — native chrome (file pickers, print/auth dialogs) and pages that demand OS-trusted input (
event.isTrusted). The MCP server runs on your Mac, sobrowser_os_*andbrowser_native_dialogdrive the real keyboard/mouse and native dialogs. See OS-level input.Human handoff — CAPTCHAs and anti-bot walls are intentionally not automated;
browser_request_human_helpnotifies you to step in, since it's your real browser on your screen.
Notes & limits
Cross-origin iframes are supported when Firefox can inject the extension content script into the frame; refs from child frames are prefixed internally and route back to that frame. Open Shadow DOM is also supported in snapshots and actions.
Privileged pages (
about:,addons.mozilla.org, the PDF viewer, view-source) can't be scripted by the extension — Firefox blocks extensions there by design. The OS-level sidecar (below) can still type/click in them when needed.Native OS dialogs (file picker, print, basic-auth prompts) are handled three ways: the file picker never needs to open (
browser_upload_filesets the input directly, andbrowser_clickrefuses file inputs); basic-auth is answered bybrowser_http_auth; anything else can be driven withbrowser_native_dialogon macOS.CAPTCHAs / anti-bot walls are intentionally not automated. Use
browser_request_human_helpto hand off to yourself — it's your real browser on your screen.Port is
8876(UBA_PORT). The published extension connects to that port, so keep the default in the free tier.Only one browser/extension connects at a time; the newest extension hello wins (handles reloads). Bare sockets on the port are ignored until they identify as the extension.
UBA_BROWSER_APP_NAME(macOS, optional): overrides which application the OS-level input tools focus before a trusted click. Defaults toFirefoxorGoogle Chromebased on which extension build is connected; set it for nonstandard installs (Chromium, Chrome for Testing). If an explicit override cannot be focused, OS-level clicks fail loudly instead of clicking whatever is frontmost.The MCP server never touches cookies or the network itself — it only relays structured commands to the extension, which acts inside your browser.
OS-level input (macOS)
For the last mile — native browser chrome and pages that reject synthetic input by checking
event.isTrusted — the MCP server can drive the real keyboard and mouse, because it runs on your
Mac (not inside the extension sandbox). These tools are browser_os_type, browser_os_key,
browser_os_click, browser_os_click_ref, browser_native_dialog, and browser_focus_browser.
Prefer the in-page tools (browser_click, browser_type, …) — they're faster and more reliable.
Reach for the OS-level tools only when those genuinely don't work.
One-time setup:
Accessibility permission (needed for trusted keystrokes and native-dialog control): System Settings → Privacy & Security → Accessibility → enable the app that runs the MCP server (your terminal, iTerm, or IDE). Without it,
System Eventskeystrokes silently do nothing.cliclick (needed only for raw coordinate clicks —
browser_os_click*):brew install cliclick
Run browser_native_status (or npm run native) to see what's available. Trusted keystrokes and
native-dialog control work with just the Accessibility grant; raw clicks additionally need cliclick.
Verify it works
npm run smoke # MCP server boots, lists tools, bridge listens (no Firefox needed)
npm test # credential-safety claims + workflow-memory unit tests (no Firefox needed)Security
This tool lets an AI agent take real actions as you on whatever you are logged into. Only log into low-risk sites you have approved for this use. Treat the active tab as live: anything the agent can do there, it may do. Log out of (or do not open) anything sensitive while using it.
For how credentials are kept out of the agent (alias-only logins, domain-locking, redaction, hardened mode) and what that does not protect against, see docs/CREDENTIAL-SAFETY.md.
License and legal
Usable Browser Agent is proprietary software from Savvy Tech Sphere, LLC. This free tier is governed by LICENSE.txt (personal, non-commercial use and evaluation). The commercial license is a one-time $39 purchase at https://savvytechsphere.com/usable-browser-agent (seller of record: Lemon Squeezy), sold as is and self-serve, with a 14-day refund window and no individual support. Details of what each tier includes: docs/FREE-TIER.md.
legal/ACCEPTABLE-USE.md: automate only your own accounts; follow each site's terms
legal/PRIVACY.md: the software collects nothing; it runs entirely on your machine
Questions go through the contact form at https://savvytechsphere.com/#contact.
Available Tools
53 toolsbrowser_backA
Go back in the active tab's history.
Inputs: no named parameters.
browser_clear_http_authA
Disarm previously-armed HTTP basic-auth answers (all domains, or specific ones).
Inputs: domains.
browser_clickA
Click an element by its ref from the latest snapshot. Supports right/middle button, double-click, and modifier keys (ctrl/shift/alt/meta) for context menus, multi-select, and open-in-new-tab.
Inputs: ref (required), count, button, modifiers.
browser_clipboard_readA
Read text from the system clipboard. Use after the page put something on the clipboard (e.g. a 'Copy' button) or to move data between pages and apps.
Inputs: no named parameters.
browser_clipboard_read_imageA
Read an image from the system clipboard (e.g. after a 'Copy image' action) and return it as a PNG/JPEG. Errors if the clipboard holds no image.
Inputs: no named parameters.
browser_clipboard_writeC
Write text to the system clipboard.
Inputs: text (required).
browser_clipboard_write_imageA
Put a local image file onto the system clipboard so it can be pasted into a page.
Inputs: path (required).
browser_close_tabB
Close a tab by id (defaults to the active tab).
Inputs: tabId.
browser_dialogsA
List native JS dialogs (alert/confirm/prompt) the page tried to open and how they were auto-answered. Use this to see if the page asked something.
Inputs: no named parameters.
browser_downloadA
Download a file to disk WITHOUT the OS save dialog, and return its local path so you can read it. Use for PDFs, exports, attachments — the file lands in the browser's downloads folder.
Inputs: url (required), timeout, filename.
browser_downloads_listC
List recent downloads with their on-disk paths and state.
Inputs: limit.
browser_dragA
Drag one element onto another (kanban cards, sortable lists, file tiles, sliders). Fires both HTML5 drag-and-drop and a pointer-drag sequence so native and JS-library targets both respond.
Inputs: toRef (required), fromRef (required).
browser_evalA
Run JavaScript in the page and return the result. Disabled under hardened mode, which is the default; the operator enables it by setting UBA_STRICT_SECRETS=0 in the server environment. On Firefox the code runs in the content-script sandbox; on Chrome it runs in the page's own realm, where the page can observe it and its CSP applies. Use only when no dedicated tool fits.
Inputs: code (required).
browser_fill_formA
Fill multiple fields in one call. Pass fields as an array of {ref, text}. Faster and more reliable than many browser_type calls for forms.
Inputs: fields (required).
browser_fill_secretA
Fill a username or password field from the server-side credential broker. Pass only a secret alias; secret values are never accepted as tool input or returned.
Inputs: ref (required), secret (required), field.
browser_focus_browserA
Bring the connected browser (Firefox or Chrome, per the bridge connection) to the foreground so OS-level input lands in it. macOS only.
Inputs: no named parameters.
browser_forwardB
Go forward in the active tab's history.
Inputs: no named parameters.
browser_get_valueB
Get the current value/text of a field or element by ref.
Inputs: ref (required).
browser_hoverC
Hover the pointer over an element by ref.
Inputs: ref (required).
browser_http_authA
Arm answers for HTTP basic-auth prompts (the native username/password dialog) from a server-side secret alias, scoped to that secret's domains. Pass only the alias; the credential value is never accepted as input or returned. Call before navigating to the protected URL.
Inputs: secret (required), once.
browser_infoA
Get the active tab's url, title, load state, scroll position, and short workflow-memory hints when available.
Inputs: no named parameters.
browser_list_tabsA
List all open tabs with their ids, urls, and titles.
Inputs: no named parameters.
browser_loginA
Atomically fill username/password fields from a server-side secret alias and submit the login form. Pass only refs and the secret alias; secret values are never accepted as tool input or returned.
Inputs: secret (required), password_ref (required), submit_ref, username_ref.
browser_mock_geolocationA
Make navigator.geolocation return a fixed position (so location-gated tasks proceed without the native permission prompt). Pass clear=true to stop mocking. Applies to the current page; re-set after navigation.
Inputs: clear, accuracy, latitude, longitude.
browser_native_dialogA
Inspect or operate a NATIVE browser dialog that no extension can touch — the file picker, print dialog, basic-auth popup, or 'Leave page?'. action='list' shows the dialog's buttons; 'click_button' presses one by name (e.g. 'Open', 'Save', 'Don't Save'); 'set_text' types into the focused dialog field. macOS only; needs Accessibility permission.
Inputs: text, action, button, process.
browser_native_statusA
Report which OS-level input capabilities are available (trusted keystrokes, native-dialog control, raw clicks) and any setup needed. Check this before relying on the browser_os_* / browser_native_dialog tools.
Inputs: no named parameters.
browser_network_logA
Inspect recent network requests (method, URL, status, type, errors) the browser made. Use to diagnose why a button 'did nothing', find an API endpoint, or confirm a request succeeded.
Inputs: type, limit, filter, onlyErrors.
browser_new_tabB
Open a new tab, optionally at a URL, and make it active.
Inputs: url.
browser_os_clickA
Click at absolute screen coordinates with a REAL OS mouse event. Prefer browser_click; use this only for trusted clicks or native chrome. macOS only; raw clicks need brew install cliclick.
Inputs: x (required), y (required), count, button.
browser_os_click_refA
Click a page element by ref with a REAL, OS-trusted mouse event (for elements that ignore synthetic clicks). Computes the element's on-screen position via the connected browser, raises its window, then clicks. On Firefox coordinates are exact; on Chrome they are approximate (refused unless allowApproximate is set) and iframe elements are not supported. macOS only; needs cliclick + Accessibility permission.
Inputs: ref (required), count, button, allowApproximate.
browser_os_keyA
Press a REAL OS key (Enter, Tab, Escape, ArrowDown, F1-F8, or a single char), optionally with modifiers. For native UI and isTrusted-checking pages. macOS only.
Inputs: key (required), modifiers.
browser_os_typeA
Type text using REAL OS keystrokes into whatever currently has focus. Use only when in-page typing fails because the element checks event.isTrusted (some payment fields, editors, games). Focus the field first (e.g. browser_click), then call this. macOS only; needs Accessibility permission.
Inputs: text (required), modifiers.
browser_pasteA
Paste into an element by ref as a real paste event — rich editors (Google Docs, Notion, contenteditable) handle this better than typing. Pastes the given text, or the current clipboard contents when text is omitted.
Inputs: ref (required), text.
browser_press_keyA
Press a key (Enter, Tab, Escape, ArrowDown, etc.). Optionally target an element by ref; otherwise the focused element receives it.
Inputs: key (required), ref.
browser_read_textA
Get the visible text of the page (or of one element by ref). Use for reading article/content; use browser_snapshot for interactive structure.
Inputs: ref, maxChars.
browser_reloadA
Reload the active tab.
Inputs: no named parameters.
browser_request_human_helpA
Hand control to the human for something automation must not or cannot do — CAPTCHAs, anti-bot 'verify you're human' walls, 2FA approvals, or a deliberate judgment call. Sends a desktop notification and returns a message you should relay to the user, then STOP and wait for them to act before continuing. Do not attempt to bypass CAPTCHAs yourself.
Inputs: message (required), reason.
browser_save_pdfA
Save the current tab as a PDF to the downloads folder (dialog-free). Useful to capture a rendered page. If your Firefox build still shows a save dialog, use browser_native_dialog to confirm it.
Inputs: filename.
browser_screenshotA
Capture a PNG screenshot of the visible part of the active tab. Use only when the snapshot is insufficient (e.g. canvas, charts, visual layout).
Inputs: no named parameters.
browser_scrollA
Scroll the page or a specific scrollable container. Pass a ref to scroll that container (inner panes, virtualized/infinite lists); omit it to scroll the window. Use to='bottom' to jump to the end (e.g. trigger infinite-scroll loading).
Inputs: to, ref, amount, direction.
browser_selectA
Choose an option in a dropdown by visible label or value.
Inputs: ref (required), value (required).
browser_select_tabC
Make a tab active by id (the agent acts on the active tab).
Inputs: tabId (required).
browser_set_dialog_policyA
Set how native JS dialogs are auto-answered so they never block the agent. accept=true confirms (default), promptText sets what prompt() returns, suppress=true neutralizes 'Leave page?' beforeunload guards. Applies to the current page; re-set after navigation if needed.
Inputs: accept, suppress, promptText.
browser_snapshotA
Capture an accessibility/DOM snapshot of the active Firefox tab as a structured tree. Each interactive element gets a stable [ref=eN] handle. USE THIS to understand the page before acting, and re-run it after the page changes — refs become stale after navigation or DOM updates. If workflow-memory hints appear, call browser_workflow_recall before continuing.
Inputs: maxNodes.
browser_statusA
Check the bridge connection and the current active tab. If the active tab has workflow memories, this returns short hints.
Inputs: no named parameters.
browser_typeC
Focus a text field by ref and type text into it. Set submit=true to press Enter afterward (e.g. to submit a search).
Inputs: ref (required), text (required), clear, submit.
browser_upload_fileA
Attach local file(s) to the page WITHOUT opening the OS file picker (the picker cannot be automated — never click elements that open it). Pass the ref of a file input (hidden ones appear in snapshots as 'file-input ... [hidden]'), or of an upload button/dropzone near it, plus absolute local file paths. Sets the input's files directly, or simulates a drag-and-drop when no file input is found.
Inputs: ref (required), paths (required), mode.
browser_waitA
Wait a fixed number of milliseconds (use sparingly).
Inputs: ms (required).
browser_wait_for_textB
Wait until the given text appears anywhere on the page (or timeout).
Inputs: text (required), timeout.
browser_workflow_forgetA
Remove a stale, sensitive, or incorrect workflow memory by id. This appends a local tombstone; normal recall will stop returning that memory.
Inputs: id (required), reason.
browser_workflow_recallA
Search local workflow memory BEFORE starting any multi-step or repeated browser task. Use this first for changing sites like app stores, admin consoles, checkout flows, dashboards, or any task you may have done before.
Inputs: site, tags, limit, query.
browser_workflow_rememberA
Save the verified reusable workflow after discovering or completing a browser task. Store durable UI labels, decisions, and pitfalls; do not store passwords, one-time codes, or transient [ref=eN] handles.
Inputs: task (required), steps (required), url, site, +10 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 53 tools
Most tools target distinct actions and resources with detailed descriptions, and overlapping pairs like browser_type vs browser_paste vs browser_os_type are clearly differentiated. A few similar-sounding tools (browser_status vs browser_info, browser_snapshot vs browser_screenshot) still require careful reading, so it is not perfect.
All tools share the browser_ prefix and most follow a clear verb_noun pattern (browser_list_tabs, browser_close_tab, browser_upload_file). There are minor deviations like noun-only names (browser_status, browser_snapshot) and noun-verb ordering (browser_workflow_recall), but the overall pattern remains predictable.
53 tools is far beyond the typical well-scoped 3-15 range and exceeds the 50+ threshold for an extreme mismatch. Even for a broad browser-automation domain, the surface is bloated with many variants (OS-level clicks, clipboard image handling, workflow memory) that could likely be consolidated.
The tool set covers the full browser lifecycle: tabs, navigation, interaction, forms, secrets, clipboard, downloads/uploads, dialogs, screenshots, network inspection, and OS-level fallbacks. Minor gaps like cookie management and console-log inspection exist but can be worked around via browser_eval or browser_network_log.
Maintenance
Related MCP Connectors
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
MCP server for secureFlows: token-free URL builders and integration-linting tools for AI agents.
Hosted Web Crawler MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceSecurity-hardened MCP server that gives AI assistants full control over your real browser session, supporting 36 tools for navigation, data extraction, monitoring, and more.MIT
- AlicenseAqualityDmaintenanceAn MCP server providing AI agents with a stealth Chromium browser that uses hybrid accessibility-object-model and set-of-mark vision for token-lean snapshots and reliable action via ref ids.1397 npm1Apache 2.0
- AlicenseNot gradedqualityCmaintenanceMCP server that gives AI agents a durable identity, persistent browser, memory, and coordination tools, enabling them to maintain state across sessions and act on the live web.3MIT
- AlicenseAqualityBmaintenanceMCP server that lets AI agents drive your real Chromium browser with your existing signed-in sessions, providing visible, local, and inspectable automation for tasks like navigation, clicking, typing, and form filling.251Apache 2.0