FSB (Full Self-Browsing)
OfficialFSB v0.9.92 Full Self Browsing
AI-powered browser automation through natural language. Tell it what to do, and watch it browse for you.
Pure structural intelligence. Zero vision. Zero guessing.
Benchmark · What's New · Quick Start · MCP Server · Architecture · Providers · Development
Benchmark
Average success rates on Online-Mind2Web, with FSB included.
# | Agent | Average success rate |
01 | Hark | 97.7% |
02 | Navigator (n1.5) | 97.3% |
03 | ACT-2 | 92.7% |
04 | FSB | 92.3% |
05 | Navigator (n1-preview) | 78.7% |
06 | Google Computer Use | 69.0% |
07 | Operator | 61.3% |
08 | ACT-1 (Aug 2025) | 57.3% |
09 | Claude Computer Use | 56.3% |
10 | ACT-1 (Jul 2025) | 45.7% |
FSB: AI-reviewed result (277/300).
Related MCP server: byob
Overview
FSB (Full Self Browsing) is an open source Chrome extension for AI powered browser automation. Describe a task in plain English; FSB reads the live DOM, builds a plan, executes browser actions, verifies results, and reports progress through the popup, side panel, or MCP.
FSB v0.9.92 is functional and production ready for supervised automation. Browser automation can still behave unpredictably on complex or sensitive sites, so monitor actions and test on non critical pages first.
Why DOM First
Project Mariner, Claude Computer Use, and OpenAI Operator rely heavily on visual page understanding. FSB uses page structure directly.
Metric | Vision based agents | FSB |
Page understanding | Screenshots | DOM, selectors, ARIA, forms |
Hidden elements | Often invisible | Available in structure |
Typical per step latency | 1 to 3 seconds | 50 to 200 ms |
Token/cost profile | Image heavy | Text/structure heavy |
Quick Start TL;DR
FSB shines when your AI client drives it directly. Install the MCP server for your client of choice — one command, no manual config edits, and no FSB API key needed (your MCP client's model handles the reasoning):
Client | One-command install |
Claude Code |
|
Claude Desktop |
|
Cursor |
|
VS Code |
|
Windsurf |
|
Codex |
|
All at once |
|
Preview before writing: append --dry-run. Sanity check with npx -y fsb-mcp-server@latest doctor. Restart the client so the new MCP server appears.
Then install the browser side (the MCP bridge talks to the extension):
Get FSB from the Chrome Web Store.
From your MCP client, try:
Search for cats on GoogleorRead this page and summarize it.
Want to run FSB standalone from the extension popup/side panel? Open settings, paste an API key (xAI, Gemini, OpenAI, Anthropic, OpenRouter, LM Studio, or custom), and start there — no MCP needed.
On OpenClaw? Install FSB directly from ClawHub. That is the fastest onboarding route. If you need the manual fallback, the FSB skill in skills/fsb/ still prints the canonical OpenClaw stdio config block and runs the doctor flow. The bare --openclaw install flag stays manual because OpenClaw's MCP config schema is unstable across builds.
On Hermes? Use the same skill at skills/fsb/. Run node skills/fsb/scripts/print-hermes-yaml.mjs to print the canonical ~/.hermes/config.yaml mcp_servers.fsb block, or run node skills/fsb/scripts/install-host.mjs to detect a local Hermes config and gate the install on consent.
On Grok Bot? The marketplace wrapper lives in plugins/grok-bot/, with a pinned npm MCP server and one FSB skill. It uses Chrome on Bot's own computer; see its setup and privacy disclosures. Marketplace listing is pending publisher review.
What It Does
Runs natural language browser tasks from the popup or side panel.
Supports xAI, Gemini, OpenAI, Anthropic, OpenRouter, LM Studio, and custom OpenAI-compatible endpoints.
Discovers live provider model lists and falls back to bundled defaults.
Uses 57 shared definitions (53 browser tools plus 4 trigger tools) and 69 registered MCP tools for external clients.
Provides DOM snapshots, action verification, smart waiting, stuck detection, visual feedback, and session logs.
Searches a 128-app capability catalog and invokes verified signed, audited, denylist-gated first-party API capabilities through the MCP capability surface.
Uploads real local files to file inputs through the supervised
upload_filetool with sensitive-path safeguards.Maintains long term memory for past sites, workflows, selectors, and task outcomes.
Includes secure credential and payment vault flows for supervised autofill.
Exposes a local MCP server so Claude Code, Codex, Cursor, VS Code, Windsurf, and other MCP clients can drive the browser.
Background agents are retired. Existing chrome.storage.local['bgAgents'] data is preserved for users who had old agents, but scheduled or recurring automation is no longer an active FSB feature.
Common Use Cases
QA and regression checks: repeat page flows, click through states, fill forms, and collect action logs.
Research: navigate pages, extract visible information, and summarize results without relying on screenshots.
Data entry: move through structured forms with validation, dropdowns, custom controls, and table inputs.
Ecommerce: compare product pages, inspect prices, monitor availability manually, and prepare carts under supervision.
Finance and dashboards: read charts, tables, and current page state when a human remains in control.
Trigger watchers: watch one page element for changes, threshold crossings, or availability while Chrome and the extension stay open.
Developer workflows: drive GitHub, issue trackers, documentation sites, coding platforms, and browser-based tools.
Accessibility and DOM inspection: expose structure, labels, selectors, forms, and hidden controls for debugging.
FSB is most reliable when the task can be expressed as page structure and user actions. It is intentionally not a stealth browser, scraper farm, or unsupervised account operator.
Feature Detail
Area | Current behavior |
DOM analysis | Captures visible and structural page data, element refs, selectors, forms, ARIA labels, and DOM deltas. |
Action execution | Supports clicks, typing, keys, scrolling, navigation, tabs, spreadsheet ranges, coordinate tools, direct JavaScript, and real file uploads. |
Capability catalog | Searches the 128-app catalog and invokes verified signed, audited, denylist-gated T1/T1b first-party API capabilities through |
Verification | Checks post-action state, loading behavior, DOM stability, and stuck-action repetition. |
UI surfaces | Popup chat, persistent side panel, options/control panel, logs, analytics, memory, vault, and sync controls. |
Model support | Hosted providers, OpenRouter routing, LM Studio local models, custom endpoints, and live model discovery. |
Output rendering | Markdown, sanitized HTML, Mermaid diagrams, Chart.js charts, and task progress messages. |
Observability | Session history, action logs, token/cost accounting, diagnostics ring buffer, and MCP status probes. |
Security | Encrypted keys, vault unlock flows, redaction helpers, DOMPurify, capability signature/audit gates, origin denylisting, upload-path denylisting, and restricted-tab recovery messaging. |
Trigger watchers | MCP callers can arm one-element watches with blocking or detached reporting, plus status/list/stop companions. |
DOM live preview | PhantomStream-backed capture, renderer, protocol, media mirroring, and relay compatibility with FSB-owned pairing, task status, overlays, and remote-control ownership. |
The core design goal is to keep the browser as the source of truth. The model receives structured page context, makes a tool decision, and the extension verifies what changed before moving to the next step.
What's New
Native Capability Catalog: first-party API execution. Beyond DOM automation, FSB can search a capability catalog covering 128 apps and invoke verified API capabilities with search_capabilities and invoke_capability. Verified capabilities run through a router that checks the origin, verifies the recipe signature, checks the denylist, serializes the action, and logs an audit record that never includes secrets. Capabilities that are not yet verified are clearly labeled instead of being presented as ready to use. Every origin is allowed by default unless it is on the denylist, and denylisted origins stay blocked. Sensitive origins are flagged in the interface and the audit trail, and reading data through network capture on a sensitive origin still asks for extra confirmation. The API integration model is inspired by OpenTabs (see Acknowledgements). Capability execution is fully supported and has been tested, including live browser testing. The automated test suite is green.
upload_file: real file input uploads. MCP clients and FSB autopilot can now call upload_file(selector, file_path, tab_id?) to set an absolute local disk path on a real <input type="file"> through CDP DOM.setFileInputFiles, including inputs hidden behind styled dropzones. Uploads pass through one shared background chokepoint with a sensitive-path denylist and audit logging that does not persist disk paths. drop_file remains for synthetic drag/drop cases and pure drag-only zones.
PhantomStream 0.2.1 media mirroring. Dashboard DOM live preview now consumes the published PhantomStream media side channel in reference mode, so progressive <video> and <audio> nodes can mirror alongside DOM snapshots. Adaptive HLS/DASH discovery remains deferred because it would require a new webRequest permission; MCP tool schemas, pairing, auth, and dashboard ownership behavior are unchanged.
Engineering milestone 0.11.0 — Trigger Tool (reactive DOM monitoring). MCP callers can arm a watch on one page element with trigger and manage it with stop_trigger, get_trigger_status, and list_triggers. Watches support live-observe and refresh-poll modes, threshold/delta/regex/compound conditions, blocking or detached reporting, and a configurable concurrency cap. See Trigger Watchers for the full contract.
Showcase and ecosystem pages. full-selfbrowsing.com added pages for Lattice (capability runtime SDK), PhantomStream (DOM-native browser mirroring), Prometheus (the autonomous browser build behind FSB), and a community Site Maps hub, plus a live stats page with an anonymized active-regions globe, a legal posture page, and an interactive knowledge-graph viewer on About.
Full history is in CHANGELOG.md; the MCP package keeps its own log in mcp/CHANGELOG.md.
Repository Layout
Path | Purpose |
Chrome extension package. Load this directory as an unpacked MV3 extension. | |
npm package | |
OpenClaw + Hermes skill: doctor + stdio/YAML printers + consent gated install for multiple hosts. | |
Marketing and dashboard site for full-selfbrowsing.com. Angular 20 static prerender + Express relay. | |
| Node/Express deploy backend for pairing, PhantomStream-compatible relay, auth, and dashboard data. |
| Legacy Python/FastAPI-style backend prototype retained for reference. |
| Node tests for extension modules, MCP contracts, bridge behavior, and regression coverage. |
| Repo maintenance and validation scripts. |
Top level deploy and validation files:
package.json- root commands for validation, tests, packaging, and showcase helpers.Dockerfile,fly.toml- production deploy for the showcase server on fly.io..github/workflows/ci.yml- validates extension, MCP smoke tests, and showcase build..github/workflows/deploy.yml- deploys the production site onmainpushes.
Screenshots
Dashboard and Analytics
API Configuration
Passwords Manager
Memory and Site Explorer
Intelligence Knowledge Graph
Quick Start
Prerequisites
Chromium 116+ in a supported stable desktop browser: Chrome, Edge, Brave, or Chromium.
One AI provider setup:
xAI API key: https://x.ai/api
Gemini API key: https://aistudio.google.com/app/apikey
OpenAI API key: https://platform.openai.com/api-keys
Anthropic API key: https://console.anthropic.com/account/keys
OpenRouter API key: https://openrouter.ai/keys
LM Studio local server running at
http://localhost:1234A custom OpenAI-compatible chat completions endpoint
Install The Extension
git clone https://github.com/fullselfbrowsing/FSB.git
cd FSBOpen
chrome://extensions/.Enable Developer mode.
Click Load unpacked.
Select the
extension/directory.Click the FSB toolbar icon, open settings, configure a provider, and test the API connection.
Start with simple tasks such as:
Scroll downSearch for cats on GoogleClick the first search resultRead this page and summarize it
Reload the extension from chrome://extensions/ after local code changes. Reload open tabs after the extension reloads so content scripts re-inject.
For an unpacked build, record the ID on chrome://extensions/. A different install path or profile can produce a different ID; if doctor reports ORIGIN_PIN_MISMATCH, run npx -y fsb-mcp-server@latest pair --reset and pair the new installation. One browser profile attaches to the local bridge at a time. doctor and status show the attached extension ID, version, install instance, connection time, and normal-window count. The MCP server and extension have independent versions. Branded Chrome 137 removed the --load-extension flag; use Load unpacked in Chrome, or use Chrome for Testing or Chromium when a command-line flag is required.
First Run Checklist
Open the FSB control panel from the extension.
Select a provider and model.
Enter the matching API key or local endpoint.
Use Test API to confirm the model can answer.
Open a normal webpage, not a browser-internal page.
Try a read-only task first, then a simple click or type task.
Keep the visual overlay enabled while evaluating behavior.
If a site uses heavy client rendering, custom canvas controls, or unusual shadow DOM, start by asking FSB to read the page and identify available controls. That gives the model a better first snapshot and makes failures easier to debug.
Quick Troubleshooting
Problem | Check |
Extension does not appear | Confirm Chrome loaded |
API test fails | Confirm the selected provider, key, endpoint, and model belong together. |
Page reads fail | Move away from browser-internal pages such as |
Clicks miss targets | Refresh the DOM snapshot, scroll the target into view, or use coordinate tools. |
Typed text does not stick | Prefer |
MCP tools are missing | Restart the host client and run |
MCP tools time out | Check |
Most failures are recoverable by inspecting the current page, refreshing selectors, or restarting the local MCP bridge. Reinstalling the MCP config should be the last step, not the first.
Local Development Setup
You do not need a build step to load the extension in Chrome. You only need npm dependencies when running tests, building MCP, or building the showcase site.
npm install
npm --prefix mcp install
npm --prefix showcase/angular installThe extension reads bundled scripts directly from extension/. The MCP package is TypeScript and must be built before smoke tests or npm publishing. The showcase is a normal Angular app with static prerender output served by the production Express backend.
MCP Server
FSB ships fsb-mcp-server, a local MCP server that lets external AI clients control the same browser extension. It exposes 69 registered tools across visual sessions, trigger watchers, manual browser control, Developer/UAT capture, capability search/invoke, read-only page inspection, autopilot, vault, and observability.
The extension connects to the MCP bridge on:
ws://localhost:7225Optional Streamable HTTP mode exposes:
http://127.0.0.1:7226/mcpThe HTTP endpoint binds to loopback only and rejects requests with an Origin header or a foreign Host. Use the printed local endpoint from an MCP client. If a tab stops responding, page reads return PAGE_UNRESPONSIVE; navigate and close_tab remain available. Inspect page state before repeating any action reported as outcome: "unknown" and mayHaveExecuted: true.
One Command Install
npx -y fsb-mcp-server@latest install --claude-desktop
npx -y fsb-mcp-server@latest install --claude-code
npx -y fsb-mcp-server@latest install --cursor
npx -y fsb-mcp-server@latest install --vscode
npx -y fsb-mcp-server@latest install --windsurf
npx -y fsb-mcp-server@latest install --codex
npx -y fsb-mcp-server@latest install --allPreview without writing:
npx -y fsb-mcp-server@latest install --all --dry-run
npx -y fsb-mcp-server@latest install --listManual Examples
Claude Code:
claude mcp add --scope user fsb -- npx -y fsb-mcp-server@latestCodex (~/.codex/config.toml):
[mcp_servers.fsb]
command = "npx"
args = ["-y", "fsb-mcp-server@latest"]VS Code (mcp.json):
{
"servers": {
"fsb": {
"type": "stdio",
"command": "npx",
"args": ["-y", "fsb-mcp-server@latest"]
}
}
}Diagnostics:
npx -y fsb-mcp-server@latest doctor
npx -y fsb-mcp-server@latest status --watch
npx -y fsb-mcp-server@latest wait-for-extensionSee mcp/README.md for the full tool reference and client-specific setup notes.
OpenCode and OpenClaw are supported through manual or unsupported fallback setup paths; after editing host configuration, refresh or reload the client if FSB tools do not appear.
MCP Usage Guidance
Manual tools are the default path for most external clients. They let the caller inspect the page, pick a selector, act, and verify. run_task is useful when the user explicitly wants FSB to run its own automation loop, but manual control is easier to audit and recover.
Use Trigger Watchers when a caller wants to watch one selector for a future value change instead of polling manually. They are local to the open browser session: Chrome and the FSB extension must remain running, results are reported back to the MCP caller, and FSB does not provide server-side monitoring or push delivery.
Recommended manual pattern:
Add
visual_reasonandclienton action calls when you want the trusted overlay.read_pageorget_dom_snapshotto understand the current page.Use
execute_jsfor safe DOM reads and simple DOM-triggered clicks.Use native tools such as
click,type_text,press_key, anddragwhen real browser events matter.Verify with
read_page,get_page_snapshot, orget_dom_snapshot.Set
is_final:trueon the last action to clear the overlay immediately.
Use doctor and status --watch before changing client configs. Most MCP failures are connection, extension wake, active-tab, or content-script readiness issues, not install problems.
Architecture
graph TB
UI["Popup / Side Panel / Options"] --> BG["MV3 Background Worker"]
BG --> AI["Universal Provider"]
BG --> CS["Content Scripts"]
BG --> MEM["Memory + Analytics"]
BG --> MCP["MCP Bridge"]
AI --> APIs["xAI / Gemini / OpenAI / Anthropic / OpenRouter / Local"]
CS --> PAGE["Web Page DOM"]
MCP --> CLIENTS["Claude Code / Codex / Cursor / VS Code / Others"]Main Runtime Pieces
Background worker (
extension/background.js): owns sessions, model calls, tool execution, MCP routing, and storage orchestration.Content scripts (
extension/content/): analyze the DOM, create element references, execute actions, stream DOM state through the PhantomStream capture adapter, wait for stable state, and render visual feedback.AI layer (
extension/ai/): universal OpenAI-compatible request engine, provider settings, model discovery, tool definitions, transcripts, and action history.Memory (
extension/lib/memory/): stores episodic, semantic, and procedural records, then retrieves relevant prior context for later tasks.Visualization (
extension/lib/visualization/): D3/site graph views for guide and memory exploration.Vault (
extension/config/secure-config.jsplus UI flows): encrypts API keys and saved user data in Chrome storage.MCP package (
mcp/): TypeScript server that translates MCP calls into extension bridge messages.
Automation Flow
User or MCP client submits a task.
FSB captures the active page structure.
Relevant site guides and memory are retrieved.
The selected model plans the next tool call.
Content scripts execute browser actions and wait for visible change.
FSB verifies the result, records analytics, and either continues or finishes.
State And Data Flow
FSB stores configuration and runtime data in Chrome storage. API keys and saved sensitive values go through the secure configuration layer. Session logs, analytics, and memory records are kept locally unless a user explicitly enables server sync or uses the showcase dashboard pairing flow.
During a task, the background worker owns the session state and talks to three main collaborators:
content scripts for page reads and browser actions
the selected provider for planning and response generation
local storage for config, analytics, memory, and logs
The MCP server does not replace the extension runtime. It is a local bridge that translates MCP requests into the same background-worker routes used by FSB's own UI.
Browser Action Surface
The extension's canonical tool registry covers navigation, search, clicking, typing, keyboard events, scrolling, waiting, tabs, spreadsheets, coordinate interactions, real file uploads, DOM mutation helpers, read-only inspection, site guide lookup, memory search, and task finalization signals.
The MCP server exposes a curated public surface around that registry plus direct server-registered companion tools:
Surface | Count | Examples |
Visual sessions | 2 |
|
Autopilot and agent navigation | 4 |
|
Trigger watchers | 4 |
|
Manual control | 37 |
|
Read-only inspection | 8 |
|
Developer / UAT | 1 |
|
Capabilities | 2 |
|
Observability and replay | 7 |
|
Vault | 4 |
|
Read-only tools bypass the mutation queue where safe. capture_screenshot is semantically read-only but remains serialized because it consumes Chromium's exclusive debugger resource. Mutation tools are serialized so two clients do not click, type, upload, invoke, or navigate at the same time. Capability tools remain outside the canonical extension registry by design; search_capabilities bypasses the queue, while invoke_capability serializes like other side-effecting tools. Search results include readiness labels so callers can distinguish t1-ready direct execution from t1-guarded-fail-closed, learn-pending, and discovery-pending catalog-tail hits.
capture_screenshot captures Chromium's actual composited page, not reconstructed HTML. MCP returns a native PNG image plus a private managed file in ~/.fsb/screenshots; matching files expire after seven days. Autopilot does not create a file: screenshot bytes live only in service-worker memory until the next model request and are excluded from transcripts, history, logs, metrics, and persistence. A screenshot can contain sensitive visible page data, so share or upload the returned path only when the destination is trusted.
Recorded MCP tasks can span multiple tabs while remaining one logical history session. The task lifecycle (complete_task, partial_task, or fail_task) closes that history record; is_final only clears the visual overlay, with idle expiry as a recording fallback. get_session_replay exposes the verified, receipt-free replay structure; replay_session requests one exact-manifest approval in the FSB side panel, after which FSB opens and maps the recorded tabs automatically.
AI Providers
FSB uses one universal provider path for hosted, routed, local, and custom OpenAI-compatible models.
Provider | Default or fallback model | Notes |
xAI |
| Default provider, fast automation profile. |
Google Gemini |
| Includes free/low cost model options depending on Google availability. |
OpenAI |
| Strong general automation and structured output. |
Anthropic |
| Strong reasoning and form-heavy workflows. |
OpenRouter |
| Single key for routed models; live discovery supported. |
LM Studio | Live local model list | No API key; reads |
Custom | User supplied model | Any compatible chat completions endpoint. |
The extension includes 30 fallback model entries and live model discovery for supported hosted providers. Pricing and model availability change frequently, so use the provider dashboard as the source of truth for billing.
Provider Configuration Notes
xAI, Gemini, OpenAI, Anthropic, and OpenRouter use API keys saved in Chrome storage.
LM Studio requires the local server to be enabled and reachable from Chrome.
Custom endpoints should point to a chat completions-compatible URL.
The saved model is preserved even when it is not in the bundled fallback list, so newly discovered models are not silently overwritten after a service worker restart.
If discovery fails, the options page falls back to bundled models and shows the discovery status inline.
Provider-specific prompt formatting lives in the AI layer, but the execution loop is intentionally shared. That keeps action planning, tool validation, transcript storage, cost tracking, and error handling consistent across models.
Model Discovery And Fallbacks
Model discovery queries provider model endpoints where available, filters non-text models, normalizes the list, and caches successful results. If a provider is offline, the key is missing, or discovery fails, FSB keeps the UI usable with bundled fallback models.
The fallback table currently includes:
6 xAI models
5 Gemini models
4 OpenAI models
9 Anthropic models
6 OpenRouter presets
live-only LM Studio models
Custom providers are intentionally open-ended. The model name and endpoint come from user settings, and the universal provider handles OpenAI-compatible request/response behavior.
Site Intelligence And Memory
FSB ships site guides for 17 categories, including ecommerce, finance, social, travel, coding, email, career, gaming, productivity, media, design, news, utilities, sports, reference, music, and games. Guides provide selectors, navigation patterns, workflow hints, and known site quirks.
Long term memory records:
Episodic: what happened in a specific session.
Semantic: facts learned about a domain or UI.
Procedural: repeatable workflows and selectors that worked.
Memory operations are tracked separately from normal automation costs. The options dashboard exposes usage charts, memory detail panels, logs, and export controls.
Guide Categories
Category | Examples |
Ecommerce | Amazon, eBay, Walmart, Best Buy, Target |
Finance | Yahoo Finance, TradingView, Google Finance, Coinbase |
Social | YouTube, Reddit, LinkedIn, Instagram, TikTok |
Travel | Booking, Kayak, Google Travel, Airbnb, airlines |
Coding | GitHub, Stack Overflow, LeetCode, Codeforces |
Email and productivity | Gmail, Outlook, Google Workspace, Notion, Jira, Trello |
Career | Workday, Greenhouse, Lever, major employer job portals |
Media and design | Video players, voice recorders, Photopea, Miro, Excalidraw |
Edge cases | CAPTCHA-like sliders, file upload, cookie opt-out, buried login links |
Site guides are helpers, not hard-coded scripts. FSB still reads the current DOM each turn and uses guides as context for better selectors and fewer repeated mistakes.
Memory Lifecycle
After a task, FSB can extract memories from the session transcript and action history. Memories are scored, tagged, consolidated, and later retrieved by domain, task type, recency, and keyword relevance. This lets FSB reuse what it learned without stuffing every previous session into every prompt.
Memory and site maps are especially useful for:
repeated workflows on the same domain
pages with custom controls or unstable selectors
identifying successful login, search, checkout, or form-fill patterns
avoiding known bad selectors or repeated failed actions
visualizing learned site structure from the options dashboard
Security And Safety
API keys are encrypted with AES-GCM and stored in Chrome storage.
Credential and payment vault flows avoid sending raw secrets over the MCP bridge.
Rendered chat output is sanitized with DOMPurify.
Automation is scoped to the active session tab where possible.
Logs can be reviewed or disabled for sensitive use cases.
Use separate API keys for development and production, rotate keys regularly, respect website terms of service, and supervise automation on anything account, finance, shopping, or data-entry related.
Current Boundaries
FSB does not bypass browser restrictions on internal pages.
CAPTCHA solving support is a framework and optional service integration, not a guarantee.
The extension can interact with the active page, tabs, and debugger-backed coordinate tools because those permissions are declared in the MV3 manifest.
upload_filerequires an absolute local path, blocks known sensitive path patterns, and records audit metadata without persisting the disk path.Capability invokes allow every non-denied origin under Auto and run through denylist, mutation, signature, and audit gates. Only verified T1/T1b capabilities execute directly; guarded or catalog-tail capabilities return typed pending/fallback responses. Sensitive origins are flagged for review; network-capture discovery on sensitive origins still requires extra confirmation.
Saved credentials and payment methods require explicit user configuration and unlock flows.
Automation should be treated like a fast assistant operating your browser, not like an unattended production worker.
Data Handling
Provider calls receive the page/task context needed to complete the requested automation. That can include visible page text, form labels, selectors, and user-supplied task instructions. Avoid running automation on sensitive pages unless you are comfortable sending that task context to the selected model provider.
FSB does not require a hosted FSB account for local extension use. The showcase backend and dashboard pairing server are separate from normal local extension operation.
Development
Install root dependencies when running validation or tests:
npm install
npm --prefix mcp install
npm --prefix showcase/angular installCommon checks:
npm run validate:extension
npm test
npm run test:mcp-smoke
npm --prefix showcase/angular run buildThe CI workflow runs these checks in separate jobs:
extension validation and Node tests
MCP TypeScript build and smoke tests
Angular showcase build
Other useful commands:
npm run showcase:serve
npm run showcase:smoke
npm --prefix mcp run build
npm --prefix mcp run devDebugging:
Inspect the service worker from
chrome://extensions/.Check the browser console on the active tab for content script logs.
Use the options page log viewer for session and action history.
For MCP issues, run
npm run test:mcp-smoke, thennpx -y fsb-mcp-server@latest doctor, thennpx -y fsb-mcp-server@latest status --watch.
Change Guidelines
Keep behavior-specific docs close to the package that owns the behavior.
Update the root README only for public setup, architecture, or feature changes.
Update
mcp/README.mdwhen tool names, counts, transports, diagnostics, or installer platforms change.Update
extension/README.mdwhen manifest entry points, extension loading, packaging, or validation changes.Update
showcase/README.mdwhen Angular, deploy, crawler, or site build behavior changes.Prefer tests for any shared contract between the extension and MCP server; stale docs are usually symptoms of missing contract checks.
Release Sanity Checks
Before changing a release version, author its release entry in the owning changelog, then run npm run version:set:extension -- X.Y.Z or npm run version:set:mcp -- X.Y.Z. Release notes remain human-authored and the setters do not rewrite changelog history. Before cutting either release, run npm run version:check and verify:
extension-owned metadata matches
extension/manifest.json, while MCP-owned metadata matchesmcp/package.jsonextension-vX.Y.Zandmcp-vX.Y.Ztags match their independently versioned artifactsREADME version badges and "what's new" sections match package metadata
screenshots and logos resolve from tracked paths
MCP README tool counts match the registered runtime surface
showcase README matches Angular major version and build output path
no retired background-agent behavior is advertised as active functionality
Documentation Ownership
The root README should describe what a new user needs to understand before installing, testing, or choosing an integration path. Detailed package behavior belongs in the package README that owns it. This split keeps the public overview useful while still giving maintainers a clear place to update tool surfaces, extension entry points, or showcase deploy instructions.
Acknowledgements
OpenTabs inspired FSB's Native Capability Catalog (first-party API execution: turning authenticated browser sessions into reusable, signed, audited API capabilities). Thanks for the direction on this approach.
License
This project is licensed under the MIT License. See LICENSE.
Support And Contributing
Report bugs and feature requests in GitHub Issues.
Include the task prompt, target site, provider/model, logs, and reproduction steps where possible.
Pull requests should update tests and docs when behavior, setup, or public interfaces change.
Made by Lakshman Turlapati
FSB Full Self Browsing: AI powered automation, accessible to everyone.
Available Tools
72 toolsbackA
Navigate one step back in browser history on the agent's active tab. Single-step only (no back(n)); no companion forward tool in v0.9.60. Agent-scoped: targets the agent's active tab unless tab_id is supplied. Ownership-enforced via the Phase 240 dispatch gate -- cross-agent calls reject with TAB_NOT_OWNED. Returns a structured result of shape { status, resultingUrl, historyDepth } where status is one of: ok (back navigation settled cleanly), no_history (history depth <= 1, nothing to go back to), cross_origin (target page is on a different origin from the source), bf_cache (back was served from the back/forward cache and the pageshow listener observed event.persisted=true), fragment_only (only the URL fragment changed via history navigation). Background-tab compatible: does not steal focus or call chrome.tabs.update({active: true}). Multi-agent contract: agent_id is FSB-issued and required (the server captures it via agent:register on first tool call -- callers do not provide it). tab_id is agent-scoped: only tabs owned by the calling agent can be addressed. The concurrency cap is configurable (default 8, range 1-64); the (N+1)th agent claim is rejected with AGENT_CAP_REACHED { cap, active }. Ownership enforcement: cross-agent calls reject with TAB_NOT_OWNED; incognito tabs reject with TAB_INCOGNITO_NOT_SUPPORTED; cross-window tabs reject with TAB_OUT_OF_SCOPE. Tool-specific typed error codes returnable by this tool: NO_BACK_HISTORY, CROSS_ORIGIN, BF_CACHE, FRAGMENT_ONLY. RETURNS change_report: the response includes a change_report field with a compact diff of what the back navigation mutated (URL, dialogs_opened, nodes_added, nodes_removed, attrs_changed, inputs_changed, focus_shift). Cross-origin transitions emit a URL-only report with cross_origin:true. Use this to learn the consequence without calling read_page next; if change_report.truncated:true is set, call read_page for the full state.
Inputs: tab_id.
capture_screenshotA
Capture the live Chromium-composited web page as a lossless PNG for visual inspection and UAT. Supports the current viewport, the full rendered document, an exact page/viewport region, or an element selected by CSS or an FSB element ref. Includes CSS, web fonts, SVG, canvas, images, open shadow DOM, and runtime state; browser chrome and the desktop are not included. FSB overlays are hidden by default and restored after capture. MCP returns a native image and private managed file; autopilot attaches the image transiently to the model without creating a file. Responsive desktop/mobile emulation is temporary and never spoofs the user agent or reloads the page. Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED. Pass tab_id only to disambiguate an owned tab.
Inputs: x, y, mode, width, +11 more.
check_boxA
Toggle a checkbox element. Returns the new checked state. When to use: to check or uncheck form checkboxes or toggle switches. Related: get_dom_snapshot (find checkbox selectors), click (alternative for custom checkbox UI components). Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED; cap configurable (default 8, 1-64). Pass tab_id only when this agent owns multiple tabs; auto-resolves otherwise. RETURNS change_report: when this tool runs, the response includes a change_report field with a compact diff of what the action mutated (URL, dialogs_opened, nodes_added, nodes_removed, attrs_changed, inputs_changed, focus_shift). Use this to learn the consequence without calling read_page next. If the report exceeds the size cap, change_report.truncated:true and change_report_hint are set; call read_page for the full state.
Inputs: client (required), selector (required), visual_reason (required), tab_id, +1 more.
clear_inputA
Clear the contents of an input field. Returns clear confirmation. When to use: before typing new text into an already-filled field to remove existing content. Related: type_text (type new text after clearing), get_dom_snapshot (find input selectors). Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED; cap configurable (default 8, 1-64). Pass tab_id only when this agent owns multiple tabs; auto-resolves otherwise. RETURNS change_report: when this tool runs, the response includes a change_report field with a compact diff of what the action mutated (URL, dialogs_opened, nodes_added, nodes_removed, attrs_changed, inputs_changed, focus_shift). Use this to learn the consequence without calling read_page next. If the report exceeds the size cap, change_report.truncated:true and change_report_hint are set; call read_page for the full state.
Inputs: client (required), selector (required), visual_reason (required), tab_id, +1 more.
clickA
Click an element on the page. When to use: to press buttons, follow links, activate controls, or select items. Get selectors from get_dom_snapshot first. If click fails, try refreshing selectors with get_dom_snapshot or use click_at with viewport coordinates. Supports text-based targeting: pass "text" instead of "selector" to click the first visible element containing that text (useful for dynamic apps like LinkedIn where element IDs change). CUSTOM DROPDOWN PATTERN: custom (non-native) dropdowns require TWO clicks -- (1) click the dropdown control to open the listbox, (2) click the option element. Example: react-select / Material-UI Select / Headless UI -- click e5 opens, click e23 picks "Green". select_option only works on native elements. Returns whether the click succeeded. Related: get_dom_snapshot (find element selectors/refs), click_at (coordinate-based fallback for canvas/overlay elements), hover (for menus that need hover before click), select_option (for native only). Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED; cap configurable (default 8, 1-64). Pass tab_id only when this agent owns multiple tabs; auto-resolves otherwise. RETURNS change_report: when this tool runs, the response includes a change_report field with a compact diff of what the action mutated (URL, dialogs_opened, nodes_added, nodes_removed, attrs_changed, inputs_changed, focus_shift). Use this to learn the consequence without calling read_page next. If the report exceeds the size cap, change_report.truncated:true and change_report_hint are set; call read_page for the full state.
Inputs: client (required), visual_reason (required), text, tab_id, +2 more.
click_and_holdA
Click and hold at specific viewport coordinates for a specified duration using CDP trusted events. Dispatches mousePressed, waits holdMs milliseconds, then dispatches mouseReleased at the same position. Coordinates are CSS pixels relative to the browser viewport. When to use: for record buttons, long-press menus, or any UI that requires sustained mouse press. Related: click_at (simple click without hold), drag (click, move, and release for dragging interactions). Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED; cap configurable (default 8, 1-64). Pass tab_id only when this agent owns multiple tabs; auto-resolves otherwise. RETURNS change_report: when this tool runs, the response includes a change_report field with a compact diff of what the action mutated (URL, dialogs_opened, nodes_added, nodes_removed, attrs_changed, inputs_changed, focus_shift). Use this to learn the consequence without calling read_page next. If the report exceeds the size cap, change_report.truncated:true and change_report_hint are set; call read_page for the full state.
Inputs: x (required), y (required), client (required), visual_reason (required), +3 more.
click_atA
Click at specific viewport coordinates using CDP trusted events. Supports modifier keys for shift+click (multi-select), ctrl+click, alt+click. Coordinates are CSS pixels relative to the browser viewport (use getBoundingClientRect() values). Returns success/failure with method used. When to use: for canvas elements, SVG graphics, overlays, or any element where DOM-based click (click tool) does not work. Fallback for click failures. Related: click (preferred for DOM elements -- use click_at only when click fails), get_dom_snapshot (check element coordinates via position data), drag (for click-and-drag interactions). Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED; cap configurable (default 8, 1-64). Pass tab_id only when this agent owns multiple tabs; auto-resolves otherwise. RETURNS change_report: when this tool runs, the response includes a change_report field with a compact diff of what the action mutated (URL, dialogs_opened, nodes_added, nodes_removed, attrs_changed, inputs_changed, focus_shift). Use this to learn the consequence without calling read_page next. If the report exceeds the size cap, change_report.truncated:true and change_report_hint are set; call read_page for the full state.
Inputs: x (required), y (required), client (required), visual_reason (required), +5 more.
close_tabA
Close an agent-owned browser tab without changing the foreground tab. When to use: clean up background tabs opened by this agent after work is complete. By default, refuses to close the current active foreground tab; pass allow_active:true only when the user explicitly wants the active tab closed. Related: open_tab (create a new tab), list_tabs (find tab IDs), switch_tab (select an agent tab). Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED; cap configurable (default 8, 1-64). Pass tab_id only when this agent owns multiple tabs; auto-resolves otherwise. RETURNS change_report: when this tool runs, the response includes a change_report field with a compact diff of what the action mutated (URL, dialogs_opened, nodes_added, nodes_removed, attrs_changed, inputs_changed, focus_shift). Use this to learn the consequence without calling read_page next. If the report exceeds the size cap, change_report.truncated:true and change_report_hint are set; call read_page for the full state.
Inputs: client (required), visual_reason (required), tab_id, is_final, +1 more.
complete_taskA
Signal that the task is fully complete. ONLY call this when the user's requested task has been fully achieved -- all data collected, all entries made, all actions performed. Include a summary of what was accomplished, but never include passwords, tokens, API keys, or sensitive form values. Provide tab_id when more than one tab/session could be active so the local task memory is associated exactly. Provide session_token only when completing a client-owned visual session created by start_visual_session; otherwise omit it and keep the normal task-lifecycle semantics. Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED; cap configurable (default 8, 1-64).
Inputs: summary (required), tab_id, session_token.
double_clickA
Double-click an element. Returns click confirmation. When to use: for actions requiring double-click such as selecting a word, opening items in file managers, or activating edit mode. Related: click (single click), select_text_range (precise text selection by offsets), get_dom_snapshot (find element selectors). Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED; cap configurable (default 8, 1-64). Pass tab_id only when this agent owns multiple tabs; auto-resolves otherwise. RETURNS change_report: when this tool runs, the response includes a change_report field with a compact diff of what the action mutated (URL, dialogs_opened, nodes_added, nodes_removed, attrs_changed, inputs_changed, focus_shift). Use this to learn the consequence without calling read_page next. If the report exceeds the size cap, change_report.truncated:true and change_report_hint are set; call read_page for the full state.
Inputs: client (required), selector (required), visual_reason (required), tab_id, +1 more.
double_click_atA
Double-click at specific viewport coordinates using CDP trusted events. Dispatches two rapid mousePressed/mouseReleased cycles with clickCount=2 on the second pair. Supports modifier keys. Coordinates are CSS pixels relative to the browser viewport. When to use: for entering edit mode in canvas-based editors (Excalidraw text boxes, Google Sheets cells), selecting words in contenteditable elements, or any double-click on coordinate-targeted elements. Related: click_at (single click at coordinates), double_click (double-click DOM elements by selector), insert_text (type text after entering edit mode via double-click). Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED; cap configurable (default 8, 1-64). Pass tab_id only when this agent owns multiple tabs; auto-resolves otherwise. RETURNS change_report: when this tool runs, the response includes a change_report field with a compact diff of what the action mutated (URL, dialogs_opened, nodes_added, nodes_removed, attrs_changed, inputs_changed, focus_shift). Use this to learn the consequence without calling read_page next. If the report exceeds the size cap, change_report.truncated:true and change_report_hint are set; call read_page for the full state.
Inputs: x (required), y (required), client (required), visual_reason (required), +5 more.
dragA
Drag from one viewport coordinate to another using CDP trusted events. Produces mousePressed at start, N intermediate mouseMoved events, then mouseReleased at end. Essential for canvas drawing tools, sliders, and map interactions where DOM drag events are ignored. Supports modifier keys for constrained drawing (shift+drag). Coordinates are CSS pixels relative to the browser viewport. Related: drag_drop (DOM element-to-element drag using selectors), drag_variable_speed (human-like variable-speed drag for CAPTCHAs), click_at (simple click at coordinates), click_and_hold (press and hold without moving). Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED; cap configurable (default 8, 1-64). Pass tab_id only when this agent owns multiple tabs; auto-resolves otherwise. RETURNS change_report: when this tool runs, the response includes a change_report field with a compact diff of what the action mutated (URL, dialogs_opened, nodes_added, nodes_removed, attrs_changed, inputs_changed, focus_shift). Use this to learn the consequence without calling read_page next. If the report exceeds the size cap, change_report.truncated:true and change_report_hint are set; call read_page for the full state.
Inputs: endX (required), endY (required), client (required), startX (required), +9 more.
drag_dropA
Drag and drop one DOM element onto another using element references. Tries three methods in order: HTML5 DragEvent (dragstart/drop), PointerEvent sequence (for react-beautiful-dnd and similar libraries), and MouseEvent sequence (basic fallback). Use for Kanban card reordering, sortable lists, file drag targets, or any drag-and-drop interaction between two identifiable DOM elements. Returns which method succeeded. For canvas/coordinate-based drag, use the drag tool instead. Related: drag (coordinate-based drag for canvas/map), drop_file (drop files onto upload zones), get_dom_snapshot (find source and target element refs). Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED; cap configurable (default 8, 1-64). Pass tab_id only when this agent owns multiple tabs; auto-resolves otherwise. RETURNS change_report: when this tool runs, the response includes a change_report field with a compact diff of what the action mutated (URL, dialogs_opened, nodes_added, nodes_removed, attrs_changed, inputs_changed, focus_shift). Use this to learn the consequence without calling read_page next. If the report exceeds the size cap, change_report.truncated:true and change_report_hint are set; call read_page for the full state.
Inputs: client (required), visual_reason (required), sourceSelector (required), targetSelector (required), +5 more.
drag_variable_speedA
Drag from one viewport coordinate to another at variable speed using an ease-in-out timing curve. Produces mousePressed at start, N intermediate mouseMoved events with varying delays (slow-fast-slow), then mouseReleased at end. The speed curve mimics human drag behavior: slow acceleration at start, peak speed in the middle, slow deceleration at end. Essential for slider CAPTCHAs and puzzle CAPTCHAs where constant-speed drag is detected as bot behavior. For uniform-speed drag (canvas drawing, map panning), use the regular drag tool instead. Related: drag (uniform-speed drag for canvas/maps), drag_drop (DOM element-to-element drag). Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED; cap configurable (default 8, 1-64). Pass tab_id only when this agent owns multiple tabs; auto-resolves otherwise. RETURNS change_report: when this tool runs, the response includes a change_report field with a compact diff of what the action mutated (URL, dialogs_opened, nodes_added, nodes_removed, attrs_changed, inputs_changed, focus_shift). Use this to learn the consequence without calling read_page next. If the report exceeds the size cap, change_report.truncated:true and change_report_hint are set; call read_page for the full state.
Inputs: endX (required), endY (required), client (required), startX (required), +7 more.
drop_fileA
Simulate dropping a file onto a dropzone element. Creates a synthetic File with the given name, content, and MIME type, then dispatches HTML5 DragEvent sequence (dragenter, dragover, drop) on the target element. Use for file upload dropzones (Dropzone.js, react-dropzone, native HTML5 drop handlers). For drag-and-drop of DOM elements (not files), use drag_drop instead. Related: drag_drop (drag DOM elements between containers), get_dom_snapshot (find dropzone selectors). Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED; cap configurable (default 8, 1-64). Pass tab_id only when this agent owns multiple tabs; auto-resolves otherwise. RETURNS change_report: when this tool runs, the response includes a change_report field with a compact diff of what the action mutated (URL, dialogs_opened, nodes_added, nodes_removed, attrs_changed, inputs_changed, focus_shift). Use this to learn the consequence without calling read_page next. If the report exceeds the size cap, change_report.truncated:true and change_report_hint are set; call read_page for the full state.
Inputs: client (required), selector (required), visual_reason (required), tab_id, +4 more.
end_visual_sessionA
[REMOVED in v0.9.0] This tool was removed in fsb-mcp-server v0.9.0 (FSB v0.9.62 implicit visual-session contract). Calling it returns the typed TOOL_REMOVED error with a migration recipe pointer. The visual session now clears either automatically after 60 seconds of silence (sliding window) or immediately when an action tool is called with is_final: true -- there is no longer a separate end call. See CHANGELOG.md#v0.9.0 and the Visual Session Lifecycle section of mcp/README.md for the migration recipe.
Inputs: session_token (required), reason.
execute_jsA
Run JavaScript directly in the active page. PRIMARY INTERACTION TOOL: try execute_js FIRST for clicks, scrolls, reads, attribute lookups, and most other DOM work -- it bypasses overlay/obscured-element issues, viewport constraints, and CDP timeouts that block native click/scroll. Typical patterns: return document.querySelector('#add-to-cart-button').click(), true; for clicks; return Array.from(document.querySelectorAll('a')).map(a=>a.href); for extraction; window.scrollTo(0, document.body.scrollHeight); return true; for scroll. After a JS click, verify with read_page or get_page_snapshot (a true click should produce observable DOM change). FALLBACK TO NATIVE TOOLS WHEN: (1) JS click reports success but the page state did not change (framework swallowed the synthetic event -- use native click which fires real CDP events that React/Angular/Vue listen to); (2) typing into controlled text inputs (use native type so React onChange fires correctly -- element.value = ... will NOT update component state); (3) real drag operations on react-beautiful-dnd / Sortable.js / Trello-style widgets (use drag_drop / drag for real pointer events); (4) form submission that depends on validated input state (use native click on submit). Code runs as a function body -- use return to send values back (results are stringified). Async work: Promises are not awaited, so fire-and-forget then poll on window.__yourKey. Related: read_page (verify result), get_dom_snapshot (debug after JS click), click / type / drag_drop (fallbacks when JS doesn't take effect). Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED; cap configurable (default 8, 1-64). Pass tab_id only when this agent owns multiple tabs; auto-resolves otherwise. RETURNS change_report: when this tool runs, the response includes a change_report field with a compact diff of what the action mutated (URL, dialogs_opened, nodes_added, nodes_removed, attrs_changed, inputs_changed, focus_shift). Use this to learn the consequence without calling read_page next. If the report exceeds the size cap, change_report.truncated:true and change_report_hint are set; call read_page for the full state.
Inputs: code (required), client (required), visual_reason (required), tab_id, +1 more.
fail_taskA
Signal that the task cannot be completed. Include the reason why, but never include passwords, tokens, API keys, or sensitive form values. Call this instead of just stopping when you encounter an unrecoverable problem. Provide tab_id when more than one tab/session could be active. Provide session_token only when ending a client-owned visual session created by start_visual_session; otherwise omit it and keep the normal task-failure semantics. Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED; cap configurable (default 8, 1-64).
Inputs: reason (required), tab_id, session_token.
fill_credentialA
Auto-fill login form on the active tab with a saved credential. The password is resolved inside the extension and injected directly into the page -- it never crosses the WebSocket bridge. The domain parameter is accepted for backward compatibility but the actual lookup domain is derived from the tab URL for security. Requires the credential vault to be unlocked. Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED. Pass tab_id only when this agent owns multiple tabs; auto-resolves otherwise.
Inputs: domain, tab_id.
fill_sheetA
Fill cells in a spreadsheet starting from a given cell with CSV data. Returns fill confirmation. When to use: for bulk data entry into Google Sheets. Related: read_sheet (read existing data before filling), navigate (go to the spreadsheet first). Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED; cap configurable (default 8, 1-64). Pass tab_id only when this agent owns multiple tabs; auto-resolves otherwise. RETURNS change_report: when this tool runs, the response includes a change_report field with a compact diff of what the action mutated (URL, dialogs_opened, nodes_added, nodes_removed, attrs_changed, inputs_changed, focus_shift). Use this to learn the consequence without calling read_page next. If the report exceeds the size cap, change_report.truncated:true and change_report_hint are set; call read_page for the full state.
Inputs: client (required), csvData (required), startCell (required), visual_reason (required), +3 more.
focusA
Move keyboard focus to an element. Returns focus confirmation. When to use: to prepare an element for keyboard input, or to bring an element into the accessibility focus ring. Related: type_text (type into a focused input), press_key (send keystrokes to focused element), click (also focuses the clicked element). Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED; cap configurable (default 8, 1-64). Pass tab_id only when this agent owns multiple tabs; auto-resolves otherwise.
Inputs: client (required), selector (required), visual_reason (required), tab_id, +1 more.
get_attributeA
Get an HTML attribute value from an element. Returns the attribute value. When to use: to read href, src, value, data attributes, or ARIA properties from an element. Related: get_text (read element text content), get_dom_snapshot (find element selectors). Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED; cap configurable (default 8, 1-64). Pass tab_id only when this agent owns multiple tabs; auto-resolves otherwise.
Inputs: selector (required), attribute (required), tab_id.
get_dom_snapshotA
Get a structured DOM snapshot with element references (e.g., e1, e2, e3). When to use: BEFORE any interaction tool (click, type_text, etc.) to find the right selector or element ref. Returns elements with tag, text, attributes, and position data. Element refs like 'e5' can be passed directly to click, type_text, hover, and other tools. Related: read_page (quick text content), click/type_text/hover (use refs from this snapshot). Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED; cap configurable (default 8, 1-64). Pass tab_id only when this agent owns multiple tabs; auto-resolves otherwise.
Inputs: tab_id, maxElements.
get_logsA
Get recent automation logs or logs for a specific session. Includes error/warning summary report. Use to debug issues or understand what FSB has been doing.
Inputs: count, sessionId.
get_memory_statsA
Get FSB memory system statistics including total count, type breakdown, and storage usage. Use to understand how much FSB has learned from past sessions.
Inputs: no named parameters.
get_page_snapshotA
Get a markdown snapshot of the current page DOM. Returns interactive elements with ref IDs for targeting. When to use: BEFORE any click/type/interaction to see current page state. Call this at the start of each new page or when you need to find elements. Related: read_page (plain text content), get_text (single element text). Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED; cap configurable (default 8, 1-64). Pass tab_id only when this agent owns multiple tabs; auto-resolves otherwise.
Inputs: tab_id.
get_session_detailA
Get full detail for an automation session including logs, action history, and timing. Use after list_sessions to inspect what happened. For an in-flight session id (one that get_task_status reports as currentSessionId), returns a partial snapshot with final: false and the latest known action; the full payload becomes available once the session finishes. Returns structured JSON or human-readable text report. Related: list_sessions (find session IDs first), get_logs (get raw log entries), get_task_status (check if a session is still in flight).
Inputs: sessionId (required), format.
get_session_replayA
Get the verified, structurally redacted replay manifest for a recorded session. Returns exact executable step structure, logical tab targets, risk classifications, and the manifest hash without returning signing receipts. Use this instead of reconstructing a replay from logs. Related: list_sessions (find a session), replay_session (request a consent-gated replay).
Inputs: sessionId (required).
get_site_guideA
Get site-specific automation guidance for a domain. Returns selectors, navigation patterns, and tips for automating the site. When to use: when starting work on a new site or when standard selectors fail. Related: get_page_snapshot (see current elements), get_dom_snapshot (raw DOM). Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED; cap configurable (default 8, 1-64).
Inputs: domain (required).
get_task_statusA
Check whether a task is currently running and its progress. Use to poll status when not receiving progress notifications. Returns percent complete, current phase, and ETA. Related: run_task (the task being monitored), stop_task (cancel if needed). Agent-scoped: returns the calling agent's task status only.
Inputs: no named parameters.
get_textA
Get the text content of a specific element. Returns the element's text. When to use: to read a specific element's text without reading the whole page. Related: read_page (read full page), get_attribute (read element attributes like href, src). Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED; cap configurable (default 8, 1-64). Pass tab_id only when this agent owns multiple tabs; auto-resolves otherwise.
Inputs: selector (required), tab_id.
get_trigger_statusA
Read the persisted status for one trigger by id. Returns storage-of-truth trigger state including status, watch mode, condition, target tab, owner, current value, timing, and attention details when available.
Inputs: trigger_id (required), tab_id.
go_backA
Navigate back one page in browser history. Returns the new URL. When to use: to return to the previous page after following a link or navigating away. Related: go_forward (undo a go_back), navigate (go to a specific URL instead). Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED; cap configurable (default 8, 1-64). Pass tab_id only when this agent owns multiple tabs; auto-resolves otherwise. RETURNS change_report: when this tool runs, the response includes a change_report field with a compact diff of what the action mutated (URL, dialogs_opened, nodes_added, nodes_removed, attrs_changed, inputs_changed, focus_shift). Use this to learn the consequence without calling read_page next. If the report exceeds the size cap, change_report.truncated:true and change_report_hint are set; call read_page for the full state.
Inputs: client (required), visual_reason (required), tab_id, is_final.
go_forwardA
Navigate forward one page in browser history. Returns the new URL. When to use: after using go_back, to move forward again. Related: go_back (go back in history), navigate (go to a specific URL instead). Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED; cap configurable (default 8, 1-64). Pass tab_id only when this agent owns multiple tabs; auto-resolves otherwise. RETURNS change_report: when this tool runs, the response includes a change_report field with a compact diff of what the action mutated (URL, dialogs_opened, nodes_added, nodes_removed, attrs_changed, inputs_changed, focus_shift). Use this to learn the consequence without calling read_page next. If the report exceeds the size cap, change_report.truncated:true and change_report_hint are set; call read_page for the full state.
Inputs: client (required), visual_reason (required), tab_id, is_final.
hoverA
Move the mouse over an element. Returns hover confirmation. When to use: to reveal dropdown menus, tooltips, or hover-activated content before clicking. Related: click (click revealed menu item after hover), get_dom_snapshot (find element selectors). Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED; cap configurable (default 8, 1-64). Pass tab_id only when this agent owns multiple tabs; auto-resolves otherwise.
Inputs: client (required), selector (required), visual_reason (required), tab_id, +1 more.
insert_textA
Insert text through CDP at the caret by default. Use position end to append or replace_all to replace an editable field; selector can identify that field. Canvas editors require focus first. Related: type_text, double_click_at, click_at. Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED; cap configurable (default 8, 1-64). RETURNS change_report: when this tool runs, the response includes a change_report field with a compact diff of what the action mutated (URL, dialogs_opened, nodes_added, nodes_removed, attrs_changed, inputs_changed, focus_shift). Use this to learn the consequence without calling read_page next. If the report exceeds the size cap, change_report.truncated:true and change_report_hint are set; call read_page for the full state.
Inputs: text (required), client (required), visual_reason (required), tab_id, +3 more.
invoke_capabilityA
Invoke a capability by slug (from a search_capabilities hit) with validated params. Verified T1/T1b capabilities execute the service's real web API in your authenticated session and return a structured result; guarded or catalog-tail hits return typed pending/fallback responses. Mutating ready capabilities perform real side effects -- check the side-effect class first. If it returns RECIPE_DOM_FALLBACK_PENDING, RECIPE_LEARN_PENDING, or RECIPE_EXPIRED, continue the same task with DOM tools.
Inputs: slug (required), params, tab_id.
list_credentialsA
List saved credentials. Returns domain and username pairs only -- passwords are never included in the response. Use fill_credential to autofill a login form.
Inputs: no named parameters.
list_payment_methodsA
List saved payment methods. Returns card brand, last 4 digits, and cardholder name only -- full card numbers and CVV are never included. Use use_payment_method to fill a checkout form.
Inputs: no named parameters.
list_sessionsA
List all past FSB automation sessions with summary info (task, status, duration, action count, cost). Use to find session IDs for deeper inspection with get_session_detail. Related: get_session_detail (inspect a specific session), get_logs (get raw logs).
Inputs: limit.
list_tabsA
List all open browser tabs with title, URL, and active status. Returns array of tab objects. When to use: to see all open tabs before switching. Related: switch_tab (switch to a tab by ID), open_tab (open a new tab). Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED; cap configurable (default 8, 1-64).
Inputs: no named parameters.
list_triggersA
List persisted trigger snapshots. By default, returns active and attention-state watchers; include_terminal can include fired and stopped triggers for audit or cleanup workflows.
Inputs: status, tab_id, include_terminal.
open_tabA
Open a new browser tab with the given URL. Returns the new tab ID. When to use: when you need to work on a different site without losing the current page. Related: switch_tab (switch between open tabs), list_tabs (see all open tabs), navigate (change URL in current tab instead). Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED; cap configurable (default 8, 1-64). Active behavior: defaults to background (active=false); pass active:true to steal focus. RETURNS change_report: when this tool runs, the response includes a change_report field with a compact diff of what the action mutated (URL, dialogs_opened, nodes_added, nodes_removed, attrs_changed, inputs_changed, focus_shift). Use this to learn the consequence without calling read_page next. If the report exceeds the size cap, change_report.truncated:true and change_report_hint are set; call read_page for the full state.
Inputs: url (required), client (required), visual_reason (required), active, +1 more.
partial_taskA
Signal that the task is partially complete because useful work was completed but an external blocker prevents the final step. Use this instead of fail_task when the user can still benefit from the completed work, especially for auth/manual handoff blockers after research, drafting, or data entry is already done. Auth/manual blockers include login required, no saved credentials, user skipped login, credentials failed, and manual approval, MFA, or external verification. Preserve three things clearly: what you completed, the exact blocker, and the manual next step the user should take, but never include passwords, tokens, API keys, or sensitive form values. If the runtime offers one saved-credential or operator-prompt attempt, let that single attempt happen first; call partial_task only after that attempt is unavailable, skipped, exhausted, or fails. Provide tab_id when more than one tab/session could be active. Provide session_token only when finalizing a client-owned visual session created by start_visual_session. Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED; cap configurable (default 8, 1-64).
Inputs: blocker (required), summary (required), reason, tab_id, +2 more.
press_enterA
Press the Enter key to submit a form or confirm input. When to use: after typing into a search box or form field. Automatically falls back to clicking the submit button if Enter has no effect. Returns key press confirmation. Related: type_text (type before pressing Enter), click (click submit button directly). Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED; cap configurable (default 8, 1-64). Pass tab_id only when this agent owns multiple tabs; auto-resolves otherwise. RETURNS change_report: when this tool runs, the response includes a change_report field with a compact diff of what the action mutated (URL, dialogs_opened, nodes_added, nodes_removed, attrs_changed, inputs_changed, focus_shift). Use this to learn the consequence without calling read_page next. If the report exceeds the size cap, change_report.truncated:true and change_report_hint are set; call read_page for the full state.
Inputs: client (required), visual_reason (required), tab_id, is_final, +1 more.
press_keyA
Press a keyboard key with optional modifiers (ctrl, shift, alt). Returns key press confirmation. When to use: for keyboard shortcuts (Ctrl+C, Ctrl+V), special keys (Escape, Tab, ArrowDown), or key combinations. Related: press_enter (dedicated Enter key tool), type_text (type full strings), focus (focus element before sending keys). Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED; cap configurable (default 8, 1-64). Pass tab_id only when this agent owns multiple tabs; auto-resolves otherwise. RETURNS change_report: when this tool runs, the response includes a change_report field with a compact diff of what the action mutated (URL, dialogs_opened, nodes_added, nodes_removed, attrs_changed, inputs_changed, focus_shift). Use this to learn the consequence without calling read_page next. If the report exceeds the size cap, change_report.truncated:true and change_report_hint are set; call read_page for the full state.
Inputs: key (required), client (required), visual_reason (required), alt, +4 more.
read_pageA
Read the text content of the current page. When to use: as the FIRST step after navigating to understand what is on the page. Automatically waits for DOM stability on JS-heavy sites. Returns main content prioritized over sidebars/nav/footer, capped at ~8K chars. Related: get_dom_snapshot (get structured element data with selectors for interaction), navigate (go to a page first), scroll (scroll to load more content before reading). Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED; cap configurable (default 8, 1-64). Pass tab_id only when this agent owns multiple tabs; auto-resolves otherwise.
Inputs: full, tab_id.
read_sheetA
Read cell values from a spreadsheet range. Returns cell values as array. When to use: to extract tabular data from a spreadsheet. Related: fill_sheet (write data), navigate (go to the spreadsheet first). Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED; cap configurable (default 8, 1-64). Pass tab_id only when this agent owns multiple tabs; auto-resolves otherwise.
Inputs: range (required), tab_id.
refreshA
Reload the current page. Returns the refreshed URL. When to use: when page content may be stale, after errors, or to reset page state. Related: navigate (go to a different URL), wait_for_stable (wait for page to settle after refresh). Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED; cap configurable (default 8, 1-64). Pass tab_id only when this agent owns multiple tabs; auto-resolves otherwise. RETURNS change_report: when this tool runs, the response includes a change_report field with a compact diff of what the action mutated (URL, dialogs_opened, nodes_added, nodes_removed, attrs_changed, inputs_changed, focus_shift). Use this to learn the consequence without calling read_page next. If the report exceeds the size cap, change_report.truncated:true and change_report_hint are set; call read_page for the full state.
Inputs: client (required), visual_reason (required), tab_id, is_final.
replay_sessionA
Request replay of a recorded session. FSB verifies the signed manifest and shows one approval card in the extension side panel; browser execution starts automatically only after the user approves that exact manifest hash. FSB creates the recorded tabs itself, so never ask the user to open target pages manually. Related: get_session_replay (inspect first), list_sessions (find a session).
Inputs: sessionId (required).
right_clickA
Open context menu on an element. Returns context menu confirmation. When to use: to access right-click context menu options on an element. Related: click (standard left-click), get_dom_snapshot (find element selectors). Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED; cap configurable (default 8, 1-64). Pass tab_id only when this agent owns multiple tabs; auto-resolves otherwise. RETURNS change_report: when this tool runs, the response includes a change_report field with a compact diff of what the action mutated (URL, dialogs_opened, nodes_added, nodes_removed, attrs_changed, inputs_changed, focus_shift). Use this to learn the consequence without calling read_page next. If the report exceeds the size cap, change_report.truncated:true and change_report_hint are set; call read_page for the full state.
Inputs: client (required), selector (required), visual_reason (required), tab_id, +1 more.
run_taskA
IMPORTANT: Only use this tool if the user explicitly requests autopilot, asks to "run a task", or says "let FSB handle it". For all other browser tasks, use the manual tools (navigate, read_page, get_dom_snapshot, click, type_text, execute_js, etc.) to accomplish the task step by step -- they are more reliable and give you full control. This tool hands control to FSB's built-in AI which decides the steps autonomously. Returns a completion summary with success status and action log. Multi-agent contract: agent_id is FSB-issued and required (the server captures it via agent:register on first tool call -- callers do not provide it). The concurrency cap is configurable (default 8, range 1-64); the (N+1)th agent claim is rejected with AGENT_CAP_REACHED { cap, active }. Ownership enforcement: cross-agent calls reject with TAB_NOT_OWNED; incognito tabs reject with TAB_INCOGNITO_NOT_SUPPORTED; cross-window tabs reject with TAB_OUT_OF_SCOPE.
Inputs: task (required).
scrollA
Scroll the page up or down by a specified amount. Returns new scroll position. When to use: to bring off-screen content into view, load lazy-loaded content, or navigate long pages. Related: scroll_to_top, scroll_to_bottom (quick jumps), read_page (read content after scrolling). Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED; cap configurable (default 8, 1-64). Pass tab_id only when this agent owns multiple tabs; auto-resolves otherwise.
Inputs: client (required), direction (required), visual_reason (required), amount, +2 more.
scroll_atA
Scroll (mouse wheel) at specific viewport coordinates using CDP trusted events. Negative deltaY = zoom in / scroll up, positive deltaY = zoom out / scroll down. Each call dispatches one wheel tick; call multiple times for more zoom. Coordinates are CSS pixels relative to the browser viewport. When to use: for map zoom (Google Maps, Leaflet), canvas zoom, or any element where page-level scrolling does not trigger the desired zoom/scroll behavior. Related: scroll (page-level scroll up/down), scroll_to_top/scroll_to_bottom (quick page jumps). Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED; cap configurable (default 8, 1-64). Pass tab_id only when this agent owns multiple tabs; auto-resolves otherwise.
Inputs: x (required), y (required), client (required), visual_reason (required), +4 more.
scroll_to_bottomA
Scroll to the bottom of the page. Returns confirmation. When to use: to reach the end of the page, load lazy content, or trigger infinite scroll. Related: scroll_to_top (jump to beginning), scroll (scroll by specific amount), read_page (read content after scrolling). Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED; cap configurable (default 8, 1-64). Pass tab_id only when this agent owns multiple tabs; auto-resolves otherwise. RETURNS change_report: when this tool runs, the response includes a change_report field with a compact diff of what the action mutated (URL, dialogs_opened, nodes_added, nodes_removed, attrs_changed, inputs_changed, focus_shift). Use this to learn the consequence without calling read_page next. If the report exceeds the size cap, change_report.truncated:true and change_report_hint are set; call read_page for the full state.
Inputs: client (required), visual_reason (required), tab_id, is_final.
scroll_to_elementA
Scroll a specific element into the visible viewport. Returns confirmation with element position. When to use: when you need to bring a particular element into view before interacting with it, especially on long pages where the element is off-screen. Related: scroll (scroll by pixel amount), click (interact after scrolling into view), get_dom_snapshot (find element selectors). Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED; cap configurable (default 8, 1-64). Pass tab_id only when this agent owns multiple tabs; auto-resolves otherwise. RETURNS change_report: when this tool runs, the response includes a change_report field with a compact diff of what the action mutated (URL, dialogs_opened, nodes_added, nodes_removed, attrs_changed, inputs_changed, focus_shift). Use this to learn the consequence without calling read_page next. If the report exceeds the size cap, change_report.truncated:true and change_report_hint are set; call read_page for the full state.
Inputs: client (required), selector (required), visual_reason (required), tab_id, +1 more.
scroll_to_topA
Scroll to the top of the page. Returns confirmation. When to use: to return to the beginning of the page or reset scroll position. Related: scroll_to_bottom (jump to end), scroll (scroll by specific amount), read_page (read content after scrolling). Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED; cap configurable (default 8, 1-64). Pass tab_id only when this agent owns multiple tabs; auto-resolves otherwise. RETURNS change_report: when this tool runs, the response includes a change_report field with a compact diff of what the action mutated (URL, dialogs_opened, nodes_added, nodes_removed, attrs_changed, inputs_changed, focus_shift). Use this to learn the consequence without calling read_page next. If the report exceeds the size cap, change_report.truncated:true and change_report_hint are set; call read_page for the full state.
Inputs: client (required), visual_reason (required), tab_id, is_final.
searchA
Search for content on the current site or web. When to use: to find content on the current site or web. Automatically detects the site's search input (Amazon, YouTube, GitHub, etc.) via DOM heuristics -- only falls back to Google when no site search exists. Returns search results status. Related: read_page (read search results after searching), click (click a specific search result). Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED; cap configurable (default 8, 1-64). Pass tab_id only when this agent owns multiple tabs; auto-resolves otherwise.
Inputs: query (required), client (required), visual_reason (required), tab_id, +1 more.
search_capabilitiesA
Search the FSB capability catalog by intent. Use before DOM tools for first-party actions on the current site. Returns up to topN ranked capabilities with slug, service, side-effect class (read/mutate/destructive), readiness status, description, and params JSON-Schema (schema-on-hit). Results are biased toward the resolved tab origin; only t1-ready hits are direct API executable.
Inputs: query (required), topN, origin, tab_id.
search_memoryA
Search FSB's memory system for relevant past experiences. Returns memories ranked by relevance with keyword matching and recency scoring. Use to find what FSB learned from previous tasks on similar sites or domains. When to use: before automating a site to check if FSB has learned relevant patterns from past sessions. Related: get_memory_stats (check memory size), list_sessions (find specific sessions).
Inputs: query (required), topN, type, domain.
select_optionA
Select an option from a NATIVE dropdown by value or visible text. NATIVE-ONLY: this tool only works on real elements -- it has no effect on custom (div-based) dropdowns like react-select, Material-UI Select, Headless UI Listbox, or any non- picker. For CUSTOM DROPDOWNS, use the two-click pattern instead: (1) click the dropdown control to open the listbox, (2) click the desired option element. Example: react-select on react-select.com -- click e5 to open, then click e23 on the "Green" option. If select_option returns no error but the dropdown value does not change, you are on a custom dropdown -- switch to the two-click pattern. Returns the selected value. Related: get_dom_snapshot (find select element selectors), click (the correct tool for custom non-native dropdowns). Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED; cap configurable (default 8, 1-64). Pass tab_id only when this agent owns multiple tabs; auto-resolves otherwise. RETURNS change_report: when this tool runs, the response includes a change_report field with a compact diff of what the action mutated (URL, dialogs_opened, nodes_added, nodes_removed, attrs_changed, inputs_changed, focus_shift). Use this to learn the consequence without calling read_page next. If the report exceeds the size cap, change_report.truncated:true and change_report_hint are set; call read_page for the full state.
Inputs: value (required), client (required), selector (required), visual_reason (required), +2 more.
select_text_rangeA
Select a specific substring within a DOM element by character offsets. Uses the Range API to highlight text from startOffset to endOffset within the element's text content. Essential for precise text selection like highlighting a specific sentence in a paragraph. Returns the selected text for verification. For selecting an entire element's text, use double-click instead. Related: double_click (select entire word/element text), get_text (read element text to determine offsets), get_dom_snapshot (find container selectors). Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED; cap configurable (default 8, 1-64). Pass tab_id only when this agent owns multiple tabs; auto-resolves otherwise. RETURNS change_report: when this tool runs, the response includes a change_report field with a compact diff of what the action mutated (URL, dialogs_opened, nodes_added, nodes_removed, attrs_changed, inputs_changed, focus_shift). Use this to learn the consequence without calling read_page next. If the report exceeds the size cap, change_report.truncated:true and change_report_hint are set; call read_page for the full state.
Inputs: client (required), selector (required), endOffset (required), startOffset (required), +3 more.
set_attributeA
Set an HTML attribute value on an element. Returns confirmation. When to use: to modify element attributes for form manipulation, changing hidden field values, toggling ARIA states, or setting data attributes. Related: get_attribute (read attribute value first), get_dom_snapshot (find element selectors). Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED; cap configurable (default 8, 1-64). Pass tab_id only when this agent owns multiple tabs; auto-resolves otherwise. RETURNS change_report: when this tool runs, the response includes a change_report field with a compact diff of what the action mutated (URL, dialogs_opened, nodes_added, nodes_removed, attrs_changed, inputs_changed, focus_shift). Use this to learn the consequence without calling read_page next. If the report exceeds the size cap, change_report.truncated:true and change_report_hint are set; call read_page for the full state.
Inputs: value (required), client (required), selector (required), attribute (required), +3 more.
start_visual_sessionA
[REMOVED in v0.9.0] This tool was removed in fsb-mcp-server v0.9.0 (FSB v0.9.62 implicit visual-session contract). Calling it returns the typed TOOL_REMOVED error with a migration recipe pointer. The visual session is now implicit on every action tool call via the required visual_reason + client field bundle -- there is no longer a separate start call. See CHANGELOG.md#v0.9.0 and the Visual Session Lifecycle section of mcp/README.md for the migration recipe.
Inputs: task (required), client (required), detail, tab_id.
stop_taskA
Cancel the currently running automation task. Returns confirmation of cancellation. When to use: when run_task is taking too long, heading in the wrong direction, or you need to regain manual control. Related: get_task_status (check progress before deciding to stop), run_task (the task being cancelled). Agent-scoped: only the calling agent's task is cancelled; cross-agent calls reject with TAB_NOT_OWNED.
Inputs: no named parameters.
stop_triggerA
Cancel a trigger by id. This is cancellation-critical and bypass-class: it must be callable promptly even if a trigger or another mutation is pending. Missing or already terminal triggers are handled idempotently by the background trigger runtime.
Inputs: trigger_id (required), tab_id.
switch_tabA
Select an agent-owned browser tab by tab ID without changing the foreground tab by default. Returns confirmation with the selected tab info. When to use: to move between tabs for multi-tab workflows while keeping the user foreground undisturbed. Pass active:true only when the user explicitly wants this tab foregrounded. Related: list_tabs (get available tab IDs first), open_tab (open a new tab). Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED; cap configurable (default 8, 1-64). RETURNS change_report: when this tool runs, the response includes a change_report field with a compact diff of what the action mutated (URL, dialogs_opened, nodes_added, nodes_removed, attrs_changed, inputs_changed, focus_shift). Use this to learn the consequence without calling read_page next. If the report exceeds the size cap, change_report.truncated:true and change_report_hint are set; call read_page for the full state.
Inputs: tabId (required), client (required), visual_reason (required), active, +1 more.
triggerA
Arm a reactive DOM trigger on one selector. Use this when the user wants to watch an element until it changes, crosses a threshold, equals or matches a value, or contains text. The watch is owned by the background trigger runtime and persisted across service-worker eviction. Pass one selector and one condition object; runtime validation checks the nested condition details before arming. Use stop_trigger to cancel, get_trigger_status to inspect one watcher, and list_triggers to enumerate watchers.
Inputs: selector (required), watch, locale, tab_id, +12 more.
type_textA
Type text into an editable field by selector. Normal fields replace existing text by default; set clear_first to false to append. Google Docs inserts at the cursor by default; explicitly set clear_first to true to replace the document. Returns the rendered text after insertion. Related: clear_input, press_enter, get_dom_snapshot. Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED; cap configurable (default 8, 1-64). RETURNS change_report: when this tool runs, the response includes a change_report field with a compact diff of what the action mutated (URL, dialogs_opened, nodes_added, nodes_removed, attrs_changed, inputs_changed, focus_shift). Use this to learn the consequence without calling read_page next. If the report exceeds the size cap, change_report.truncated:true and change_report_hint are set; call read_page for the full state.
Inputs: text (required), client (required), selector (required), visual_reason (required), +3 more.
upload_fileA
Upload a real file from a local disk path to a file input on the page. Sets the file directly on the target via the browser DevTools protocol (DOM.setFileInputFiles), so it works for real binaries -- images, PDFs, documents -- that page JavaScript cannot upload. This is different from drop_file, which only fakes inline text content onto a dropzone; prefer upload_file whenever you know the file path on disk. Provide a CSS selector for the (or a container/dropzone that wraps a hidden one) and an ABSOLUTE file path. The browser reads the file and fires the input/change events natively. When to use: any web form upload where the file already exists on disk. For pure drag-only dropzones with no underlying file input, fall back to drop_file. Security: a sensitive-path denylist blocks secrets (~/.ssh, ~/.aws, .env, private keys, the FSB vault) and every upload is audit-logged. Related: drop_file (synthetic dropzone content), get_dom_snapshot (find the input[type=file] selector), read_page (verify the upload took). Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED; cap configurable (default 8, 1-64). Pass tab_id only when this agent owns multiple tabs; auto-resolves otherwise. RETURNS change_report: when this tool runs, the response includes a change_report field with a compact diff of what the action mutated (URL, dialogs_opened, nodes_added, nodes_removed, attrs_changed, inputs_changed, focus_shift). Use this to learn the consequence without calling read_page next. If the report exceeds the size cap, change_report.truncated:true and change_report_hint are set; call read_page for the full state.
Inputs: client (required), selector (required), file_path (required), visual_reason (required), +2 more.
use_payment_methodA
Fill checkout form on the active tab with a saved payment method. Shows a confirmation prompt with card brand, last 4 digits, and merchant domain before any fill occurs. The fill domain is derived from the resolved tab URL inside the extension, not from this request. Requires both credential vault and payment access to be unlocked. Multi-agent: agent-scoped tabs; cross-agent reject with TAB_NOT_OWNED. Pass tab_id only when this agent owns multiple tabs; auto-resolves otherwise.
Inputs: payment_method_id (required), tab_id.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 72 tools
Most tools target distinct actions, but there are real overlaps: go_back and back both perform browser back navigation (with the latter even documenting conflicting history semantics), and get_page_snapshot vs get_dom_snapshot both promise 'structured refs before interaction.' The very verbose descriptions largely disambiguate these (e.g. click vs click_at, drag vs drag_drop vs drag_variable_speed), but an agent still faces genuine misselection risk among the snapshot and history tools.
The set is overwhelmingly snake_case verb_noun (navigate, list_tabs, get_dom_snapshot, fill_credential), which is predictable and readable. Minor deviations exist—bare verbs like trigger, back, refresh, hover, search, and the slightly irregular check_box—but nothing crosses into mixed-convention chaos.
72 tools is far beyond a comfortable surface for a single server, even a broad browser-automation one, and it also carries two dead tools (start_visual_session, end_visual_session marked REMOVED). The breadth is partly justified by spanning navigation, DOM, tabs, triggers, sessions, memory, credentials, payments, and capabilities, but the count is excessive and increases selection overhead.
Coverage is unusually thorough—navigation, interaction, DOM reading/manipulation, tabs, triggers, session/replay/log inspection, memory, credentials, payments, spreadsheets, and a capability catalog are all present with lifecycle signal tools (complete_task/partial_task/fail_task). The main blemish is the pair of removed visual-session tools still lingering in the surface rather than a true functional gap.
Maintenance
Related MCP Connectors
Let AI agents use your real, signed-in Chrome: tabs, clicks, forms, screenshots and video.
Live browser debugging for AI assistants — DOM, console, network via MCP.
Control a real browser from AI agents: navigate, click, type, screenshot, read the page.
Give AI agents a real cloud Chrome: open sessions, navigate, read pages, click, type and screenshot.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceA local MCP server that enables AI coding assistants to drive the real, already-logged-in Chrome browser — navigating pages, clicking, typing, reading content, taking screenshots, and inspecting tabs, cookies, and network traffic through natural language. It works as a Chrome extension, so no remote-debugging port needs to be opened and pages the user is already signed into are fully usable.1 npmISC
- AlicenseNot gradedqualityAmaintenanceA local MCP server that lets AI agents drive the real, already-logged-in Chrome browser through a companion extension, navigating tabs, clicking, typing, reading pages, filling forms, taking screenshots, and inspecting cookies, storage, console and network traffic. It keeps all communication on the local machine, with no remote-debugging port to expose and no separate headless browser or manual cookie copying to set up.1 npmISC
- AlicenseNot gradedqualityAmaintenanceA local MCP server that lets AI assistants drive your real, already-logged-in Chrome through a browser extension, so agents can read, click, type, navigate, screenshot, inspect network traffic, and manage cookies or storage on pages that require existing sessions. It works without opening a remote-debugging port and keeps all communication on your machine.1 npmISC
- AlicenseNot gradedqualityAmaintenanceA local MCP server that lets AI coding tools drive your own already-logged-in Chrome through a browser extension, rather than a headless or cookie-copied instance. It exposes 25 tools for snapshotting pages, clicking, typing, reading content, taking screenshots, recording network traffic, and reading cookies or storage, so agents can act on authenticated sites without triggering bot detection.1 npmISC