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.
What's New · Quick Start · MCP Server · Architecture · Providers · Development
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.
Related MCP server: byob
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.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | No | Target tab in agent pool. If omitted, defaults to the agent's active tab. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses the ownership gate (TAB_NOT_OWNED, TAB_INCOGNITO_NOT_SUPPORTED, TAB_OUT_OF_SCOPE), the concurrency cap and AGENT_CAP_REACHED payload, agent-scoped tab addressing, and that it is background-tab compatible and does not steal focus. It also enumerates status outcomes (ok, no_history, cross_origin, bf_cache, fragment_only) and typed error codes, which is exactly the kind of behavioral context an agent otherwise cannot infer.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded correctly, but the middle is bloated with duplicated content: cross-agent rejection/TAB_NOT_OWNED appears twice, and the typed error codes are enumerated once in prose (NO_BACK_HISTORY, CROSS_ORIGIN, BF_CACHE, FRAGMENT_ONLY) and again inside the status list. Tightening would remove roughly a third of the text without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations and no output schema, the description is complete enough to invoke safely: it documents targeting scope, ownership rules, the return shape { status, resultingUrl, historyDepth }, the change_report payload, its truncation behavior, and the error codes. An agent has everything needed to call it and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter, and schema coverage is 100% (including the 'defaults to the agent's active tab' semantics), so the schema baseline is 3. The description adds genuine meaning on top: tab_id is agent-scoped and only tabs owned by the calling agent are addressable, with named rejection codes for incognito and cross-window tabs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource plus scope: 'Navigate one step back in browser history on the agent's active tab,' and immediately constrains it ('Single-step only (no back(n))'). However, it never addresses the near-identical sibling `go_back` (nor `go_forward`), so an agent cannot fully disambiguate this tool from its own siblings from the description alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives useful conditional context: targets the agent's active tab 'unless tab_id is supplied,' and recommends using change_report 'without calling read_page next.' But there is no explicit when-to-use/when-not guidance and no routing to the obvious alternative (`go_back`), which is the single most important selection question here.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | Region left edge in CSS pixels. Region mode only. | |
| y | No | Region top edge in CSS pixels. Region mode only. | |
| mode | No | Capture mode. Defaults to viewport. | |
| width | No | Region width in CSS pixels. Region mode only. | |
| height | No | Region height in CSS pixels. Region mode only. | |
| tab_id | No | Optional owned tab id. Omit when the calling agent owns exactly one tab. | |
| wait_ms | No | Additional settle delay from 0 through 5000 ms after font readiness and two animation frames. Defaults to 250. | |
| selector | No | CSS selector or FSB element ref. Element mode only. | |
| device_mode | No | Use current metrics or temporary responsive emulation. Viewport dimensions without this field imply desktop. | |
| orientation | No | Mobile screen orientation. Mobile mode only; defaults to auto. | |
| viewport_width | No | Temporary viewport width in integer CSS pixels. Desktop/mobile require both dimensions. | |
| viewport_height | No | Temporary viewport height in integer CSS pixels. Desktop/mobile require both dimensions. | |
| coordinate_space | No | Region coordinate space. Valid only for region mode; defaults to viewport. | |
| device_scale_factor | No | Temporary emulated device scale factor from 1 through 4; defaults to 1 while emulating. | |
| include_fsb_overlays | No | Capture FSB overlays instead of temporarily hiding them. Defaults to false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: it discloses the output channel (native image plus private managed file, or transient attach under autopilot with no file created), overlay hiding and restoration, temporary emulation that never spoofs the user agent or reloads, and multi-agent tab scoping with the TAB_NOT_OWNED rejection. These are non-obvious behavioral traits an agent could not get from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded: purpose and modes come first, then inclusions/exclusions, then output and multi-agent behavior. Most sentences earn their place, though the run of behavioral clauses (emulation, overlays, multi-agent) is packed tightly and slightly increases cognitive load.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 15-parameter tool with no annotations and no output schema, the description covers capture content, exclusions, output form, and multi-agent constraints well. It leaves minor gaps around parameter interactions (e.g., which params are valid per mode beyond the schema's own notes), but nothing critical for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond it: tab_id should only be passed to disambiguate an owned tab, FSB overlays are hidden by default and restored, and responsive emulation is temporary and non-spoofing. It still does not explain coordinate_space or device_scale_factor semantics in prose, so it stops short of full compensation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (capture) and resource (live Chromium-composited page as lossless PNG) and enumerates the four capture scopes (viewport, full document, region, element). It also draws the boundary of what is included versus excluded (browser chrome, desktop), so an agent knows exactly what this tool produces.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Positions the tool for 'visual inspection and UAT' and explains how the mode/device_mode choices select behavior, which gives clear usage context. However, it never contrasts itself with close siblings like get_page_snapshot, get_dom_snapshot, or read_page, so the agent must infer when a screenshot is preferable to a DOM/page snapshot.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| client | Yes | Allowlisted client label. Validated against the shared v0.9.36 server/extension allowlist (see mcp/src/tools/visual-session.ts -- MCP_VISUAL_CLIENT_LABELS). Required. | |
| tab_id | No | Optional. Tab id this action targets. Omit when the calling agent owns exactly one tab; pass to disambiguate when the agent owns multiple. Single-tab agents and legacy popup/sidepanel/autopilot do not need to pass this. | |
| is_final | No | When true, the visual session clears immediately after this tool resolves. Optional (default false). | |
| selector | Yes | CSS selector or element reference for the checkbox | |
| visual_reason | Yes | Short human-readable reason shown in the overlay (for example, "Logging in to GitHub"). Required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and delivers: agent-scoped tab ownership, the TAB_NOT_OWNED cross-agent rejection, a configurable concurrency cap (default 8, range 1-64), and a detailed change_report return contract including truncation signaling. This is unusually rich behavioral disclosure for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and return value, then organized into labeled blocks (When to use / Related / Multi-agent / RETURNS). It is dense and slightly repetitive on tab_id ownership, but nearly every sentence carries actionable information, especially the change_report contract that no output schema covers.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description fully specifies the return value (new checked state plus change_report fields) and its truncation escape hatch. Combined with the multi-agent and cap behavior, an agent has everything needed to invoke this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all five parameters, including tab_id's single-vs-multi-tab rule. The description restates the tab_id guidance rather than adding new syntax or format detail, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Toggle a checkbox element') and immediately names the return ('Returns the new checked state'). It also distinguishes itself from siblings by naming get_dom_snapshot for selector discovery and click as the alternative for custom checkbox UI.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'When to use' clause covers both checkboxes and toggle switches, and the 'Related' section names two alternatives with the condition that selects each (get_dom_snapshot to find selectors, click for custom components). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| client | Yes | Allowlisted client label. Validated against the shared v0.9.36 server/extension allowlist (see mcp/src/tools/visual-session.ts -- MCP_VISUAL_CLIENT_LABELS). Required. | |
| tab_id | No | Optional. Tab id this action targets. Omit when the calling agent owns exactly one tab; pass to disambiguate when the agent owns multiple. Single-tab agents and legacy popup/sidepanel/autopilot do not need to pass this. | |
| is_final | No | When true, the visual session clears immediately after this tool resolves. Optional (default false). | |
| selector | Yes | CSS selector or element reference for the input to clear | |
| visual_reason | Yes | Short human-readable reason shown in the overlay (for example, "Logging in to GitHub"). Required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: it discloses multi-agent tab ownership, the cross-agent rejection code TAB_NOT_OWNED, the configurable cap and its range, and the change_report return shape including truncation flags and the read_page fallback. That is substantially more than the name or schema conveys.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and when-to-use, then layered into Related, multi-agent, and RETURNS blocks that each carry weight. It is dense and slightly bloated, and the orphaned cap sentence is wasted space, but nothing else is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must describe the return value, and it does in detail: change_report fields, the truncated flag, and the read_page escape hatch. Combined with multi-agent and error-code coverage, an agent has everything needed to invoke and interpret this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the description's tab_id guidance largely restates the schema text, so there is little added meaning. The "cap configurable (default 8, 1-64)" clause is not anchored to any declared parameter, which adds ambiguity rather than clarity, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Clear the contents of an input field") plus the immediate outcome ("Returns clear confirmation"). The Related line separates it from type_text and get_dom_snapshot, so an agent can route without opening sibling schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger condition ("before typing new text into an already-filled field to remove existing content") and names the adjacent tools with their roles. The relationship to type_text in particular makes the when-to-use decision unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Text content to find and click. Case-insensitive substring match. Clicks the first visible element containing this text. Use when CSS selectors are unstable (e.g., LinkedIn, Facebook). Example: "Latha Pulipati" or "Send message". | |
| client | Yes | Allowlisted client label. Validated against the shared v0.9.36 server/extension allowlist (see mcp/src/tools/visual-session.ts -- MCP_VISUAL_CLIENT_LABELS). Required. | |
| tab_id | No | Optional. Tab id this action targets. Omit when the calling agent owns exactly one tab; pass to disambiguate when the agent owns multiple. Single-tab agents and legacy popup/sidepanel/autopilot do not need to pass this. | |
| is_final | No | When true, the visual session clears immediately after this tool resolves. Optional (default false). | |
| selector | No | CSS selector or element reference from get_dom_snapshot (e.g., "#submit-btn", ".nav-link", or element ref "e5") | |
| visual_reason | Yes | Short human-readable reason shown in the overlay (for example, "Logging in to GitHub"). Required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does so well: it states that the tool returns whether the click succeeded, documents the change_report field and its subfields, notes truncation behavior and the follow-up read_page path, and discloses multi-agent tab ownership rules and the TAB_NOT_OWNED rejection.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded and well-sectioned with labels for usage, dropdown pattern, related tools, multi-agent behavior, and return format. It is longer than typical for a click tool, but most detail is justified by the edge cases it covers.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the absence of annotations and output schema, the description is complete enough for correct invocation: it covers purpose, prerequisites, failure recovery, custom dropdown handling, tab scoping, and the shape of the returned change_report.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents all six parameters in detail. The description adds some workflow context for text versus selector and tab_id ownership, but largely duplicates what the schema already provides, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource immediately: "Click an element on the page." It then explicitly distinguishes usage contexts (buttons, links, controls, selections) and names related alternatives such as click_at, hover, and select_option, so an agent can tell it apart from siblings without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance, a prerequisite (get selectors from get_dom_snapshot first), fallback behavior if the click fails, text-based targeting, a full custom dropdown pattern, and named alternatives for native selects and hover menus. The routing is unusually complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | X coordinate in viewport CSS pixels | |
| y | Yes | Y coordinate in viewport CSS pixels | |
| client | Yes | Allowlisted client label. Validated against the shared v0.9.36 server/extension allowlist (see mcp/src/tools/visual-session.ts -- MCP_VISUAL_CLIENT_LABELS). Required. | |
| holdMs | No | Duration to hold the mouse button in milliseconds (default 5000 = 5 seconds) | |
| tab_id | No | Optional. Tab id this action targets. Omit when the calling agent owns exactly one tab; pass to disambiguate when the agent owns multiple. Single-tab agents and legacy popup/sidepanel/autopilot do not need to pass this. | |
| is_final | No | When true, the visual session clears immediately after this tool resolves. Optional (default false). | |
| visual_reason | Yes | Short human-readable reason shown in the overlay (for example, "Logging in to GitHub"). Required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden and does so well: it discloses the CDP trusted-event mechanism and exact dispatch order, multi-agent tab scoping with TAB_NOT_OWNED rejection, the configurable agent cap (default 8, range 1-64), and the change_report return including the truncated/hint fallback. This is far beyond what bare structured fields provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and organizes the rest into labeled segments (When to use, Related, Multi-agent, RETURNS). It is dense and slightly long, but each sentence maps to a distinct decision (invocation, alternative selection, ownership, return handling), so little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations and no output schema, the description compensates fully: it explains the mechanic, the coordination model, error behavior, and the change_report contents plus the truncation escape hatch (call read_page). Nothing an agent needs to invoke or interpret this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine context: it reinforces that coordinates are CSS pixels relative to the viewport and clarifies when tab_id should be passed versus auto-resolved. Required fields (visual_reason, client) are not elaborated, keeping it above baseline but not exhaustive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+mechanism: 'Click and hold at specific viewport coordinates for a specified duration using CDP trusted events.' It then names the exact sequence (mousePressed, wait, mouseReleased) and explicitly distinguishes itself from siblings click_at and drag. An agent can pick it out of the ~70-tool list without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit 'When to use' clause (record buttons, long-press menus, sustained press UIs) plus a 'Related' line contrasting click_at ('without hold') and drag ('click, move, and release'). It also gives the tab_id selection rule (pass only when owning multiple tabs) and the cross-agent rejection behavior, so both invocation and routing conditions are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | X coordinate in viewport CSS pixels | |
| y | Yes | Y coordinate in viewport CSS pixels | |
| alt | No | Hold Alt key during click | |
| ctrl | No | Hold Ctrl key during click | |
| shift | No | Hold Shift key during click (for multi-select) | |
| client | Yes | Allowlisted client label. Validated against the shared v0.9.36 server/extension allowlist (see mcp/src/tools/visual-session.ts -- MCP_VISUAL_CLIENT_LABELS). Required. | |
| tab_id | No | Optional. Tab id this action targets. Omit when the calling agent owns exactly one tab; pass to disambiguate when the agent owns multiple. Single-tab agents and legacy popup/sidepanel/autopilot do not need to pass this. | |
| is_final | No | When true, the visual session clears immediately after this tool resolves. Optional (default false). | |
| visual_reason | Yes | Short human-readable reason shown in the overlay (for example, "Logging in to GitHub"). Required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries full behavioral burden and does so: CDP trusted events, multi-agent tab ownership with TAB_NOT_OWNED rejection, a configurable concurrency cap (default 8, 1-64), tab_id auto-resolution semantics, and a detailed change_report return contract including truncation handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Long but front-loaded and sectioned (purpose, when-to-use, related, multi-agent, returns), with each block serving a distinct decision. It is verbose in places—the change_report paragraph could be tighter—but almost nothing is pure filler for a tool with this much surface area.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description explains the return value (change_report fields, truncation flag, read_page fallback) and covers multi-agent ownership and tab targeting. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond it: shift+click is explained as multi-select, coordinates are pinned to CSS pixels relative to the viewport with getBoundingClientRect() as the source, and tab_id's omit-vs-pass behavior is spelled out.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Click at specific viewport coordinates using CDP trusted events') and immediately scopes it against the sibling click tool. An agent can distinguish it from click, double_click_at, and drag without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'When to use' clause names the target cases (canvas, SVG, overlays) and positions it as a fallback for click failures. The 'Related' section names the preferred alternative (click) and the exact condition for switching ('use click_at only when click fails'), plus get_dom_snapshot and drag.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| client | Yes | Allowlisted client label. Validated against the shared v0.9.36 server/extension allowlist (see mcp/src/tools/visual-session.ts -- MCP_VISUAL_CLIENT_LABELS). Required. | |
| tab_id | No | Optional. Tab id to close. Omit when the calling agent owns exactly one tab; required to disambiguate when the agent owns multiple. | |
| is_final | No | When true, the visual session clears immediately after this tool resolves. Optional (default false). | |
| allow_active | No | When true, allow closing the active foreground tab. Default false protects the user-visible active tab. | |
| visual_reason | Yes | Short human-readable reason shown in the overlay (for example, "Logging in to GitHub"). Required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full behavioral burden and does so thoroughly: active-tab protection, agent-scoped ownership, cross-agent rejection with TAB_NOT_OWNED, configurable tab cap, tab_id auto-resolution, and a detailed change_report return contract including truncation behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and scope, then proceeds through usage, related tools, multi-agent constraints, and return behavior. Each section earns its place given the tool's complexity and the absence of annotations or an output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description is complete enough: it covers safety, multi-agent ownership, error conditions, parameter disambiguation, and the shape of the returned change_report.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds useful nuance beyond the schema for allow_active and tab_id, explaining when active tabs may be closed and when tab_id must be supplied, though it does not further clarify visual_reason, client, or is_final.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: "Close an agent-owned browser tab without changing the foreground tab." It immediately distinguishes the tool from siblings like open_tab, list_tabs, and switch_tab by naming them in a Related section.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance: clean up background tabs after work is complete. It also states the default refusal to close the active tab and the narrow condition for allow_active:true, plus related alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | No | Optional target tab id used to associate this outcome with the correct local MCP replay session. | |
| summary | Yes | Summary of what was accomplished (e.g. "Found 50 Tesla internships and added them to Google Sheet with title, department, location columns") | |
| session_token | No | Optional token returned by start_visual_session. Provide this only when finalizing a client-owned visual session. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and delivers: a hard security constraint (never include passwords, tokens, API keys, or sensitive form values), multi-agent scoping semantics with a named rejection error (TAB_NOT_OWNED), and a configurable cap (default 8, 1-64). This is unusually rich behavioral context for a completion tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and completion condition, then layers constraints in descending priority. Dense and slightly run-on in the multi-agent clause, but essentially every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No annotations and no output schema, so the description must carry the full load, and it does: trigger condition, safety rules, multi-tab and multi-agent semantics, and session-token scoping. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema: tab_id is scoped to multi-tab/session disambiguation and session_token is restricted to sessions started by start_visual_session. It does not, however, clarify summary formatting or length limits.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and terminal state ('Signal that the task is fully complete') and clearly distinguishes itself from siblings like partial_task, fail_task, and stop_task by defining the exact completion condition. An agent can route correctly without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit ONLY-call-when condition ('all data collected, all entries made, all actions performed') and conditional guidance for both optional params: tab_id when multiple tabs could be active, session_token only for client-owned visual sessions created by start_visual_session. Alternatives and exclusions are spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| client | Yes | Allowlisted client label. Validated against the shared v0.9.36 server/extension allowlist (see mcp/src/tools/visual-session.ts -- MCP_VISUAL_CLIENT_LABELS). Required. | |
| tab_id | No | Optional. Tab id this action targets. Omit when the calling agent owns exactly one tab; pass to disambiguate when the agent owns multiple. Single-tab agents and legacy popup/sidepanel/autopilot do not need to pass this. | |
| is_final | No | When true, the visual session clears immediately after this tool resolves. Optional (default false). | |
| selector | Yes | CSS selector or element reference to double-click | |
| visual_reason | Yes | Short human-readable reason shown in the overlay (for example, "Logging in to GitHub"). Required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden and does so well: it discloses cross-agent rejection with TAB_NOT_OWNED, tab ownership semantics, a configurable concurrency cap (default 8, range 1-64), and detailed return behavior including the change_report structure and truncation handling. This is exactly the behavioral context an agent needs for an unannotated mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and usage before the denser multi-agent and return sections, which is the right ordering. It is somewhat verbose and the 'Returns click confirmation' line is redundant with the later RETURNS block, but each section is purposeful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex, unannotated, no-output-schema tool, the description covers purpose, usage, ownership/error semantics, and return shape (change_report plus truncation fallback). Nothing an agent needs in order to call it correctly appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all five parameters. The description's note that tab_id should only be passed when the agent owns multiple tabs largely restates the schema's own tab_id description rather than adding new format or syntax meaning. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (double-click) and resource (element), and immediately distinguishes itself from siblings by naming click, select_text_range, and get_dom_snapshot as related-but-different tools. An agent can route between double_click and click without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'When to use' clause with concrete scenarios (selecting a word, opening items in file managers, activating edit mode) plus a 'Related' clause naming the alternatives and their distinct roles. When-to-use and when-to-use-something-else are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | X coordinate in viewport CSS pixels | |
| y | Yes | Y coordinate in viewport CSS pixels | |
| alt | No | Hold Alt key during double-click | |
| ctrl | No | Hold Ctrl key during double-click | |
| shift | No | Hold Shift key during double-click | |
| client | Yes | Allowlisted client label. Validated against the shared v0.9.36 server/extension allowlist (see mcp/src/tools/visual-session.ts -- MCP_VISUAL_CLIENT_LABELS). Required. | |
| tab_id | No | Optional. Tab id this action targets. Omit when the calling agent owns exactly one tab; pass to disambiguate when the agent owns multiple. Single-tab agents and legacy popup/sidepanel/autopilot do not need to pass this. | |
| is_final | No | When true, the visual session clears immediately after this tool resolves. Optional (default false). | |
| visual_reason | Yes | Short human-readable reason shown in the overlay (for example, "Logging in to GitHub"). Required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden and does so well: it discloses CDP trusted events, the exact event sequence (two mousePressed/mouseReleased cycles, clickCount=2 on the second), modifier support, coordinate semantics, multi-agent tab ownership behavior with TAB_NOT_OWNED and a configurable cap (default 8, 1-64), and the change_report return including truncation handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then usage, related tools, multi-agent notes, and return behavior in a logical order. Dense but nearly every sentence earns its place; the multi-agent and change_report paragraphs are long and slightly overlap with what the schema says about tab_id.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a coordinate-action tool with no output schema, the description is complete: it covers invocation semantics, coordinate system, modifiers, concurrency/ownership rules, and even describes the change_report payload and truncation escape hatch so the agent need not call read_page reflexively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, but the description adds real meaning beyond the schema: it clarifies that coordinates are viewport-relative CSS pixels, that modifiers are applied during the double-click, and gives guidance on when to pass tab_id (only when the agent owns multiple tabs; auto-resolves otherwise).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Double-click at specific viewport coordinates') and immediately distinguishes itself from siblings by naming click_at (single click), double_click (DOM by selector), and insert_text. An agent can route correctly without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'When to use' section names concrete scenarios (Excalidraw text boxes, Google Sheets cells, contenteditable word selection) and a 'Related' section contrasts each alternative. When-to-use and alternatives are both spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| alt | No | Hold Alt key during drag | |
| ctrl | No | Hold Ctrl key during drag | |
| endX | Yes | End X coordinate in viewport CSS pixels | |
| endY | Yes | End Y coordinate in viewport CSS pixels | |
| shift | No | Hold Shift key during drag (for constrained movement) | |
| steps | No | Number of intermediate mouseMoved events (default 10, increase for smoother drag) | |
| client | Yes | Allowlisted client label. Validated against the shared v0.9.36 server/extension allowlist (see mcp/src/tools/visual-session.ts -- MCP_VISUAL_CLIENT_LABELS). Required. | |
| startX | Yes | Start X coordinate in viewport CSS pixels | |
| startY | Yes | Start Y coordinate in viewport CSS pixels | |
| tab_id | No | Optional. Tab id this action targets. Omit when the calling agent owns exactly one tab; pass to disambiguate when the agent owns multiple. Single-tab agents and legacy popup/sidepanel/autopilot do not need to pass this. | |
| is_final | No | When true, the visual session clears immediately after this tool resolves. Optional (default false). | |
| stepDelayMs | No | Delay in ms between each mouseMoved step (default 20) | |
| visual_reason | Yes | Short human-readable reason shown in the overlay (for example, "Logging in to GitHub"). Required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the emitted event sequence (mousePressed, N mouseMoved, mouseReleased), modifier-key support, coordinate semantics, multi-agent tab scoping, and the change_report shape. These are genuine behavioral disclosures. However, it does not explain what happens when coordinates fall outside the viewport, how failures surface, or whether steps affect reliability, leaving some behavioral ground uncovered for a trusted-event CDP action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and its event mechanics, then alternatives, then multi-agent rules, then the return contract. The change_report paragraph is long but justified because no output schema exists. Minor redundancy between the description's modifier note and the schema's shift description keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 13 parameters, no output schema, and no annotations, the description covers everything an agent needs: coordinate basis, event sequence, sibling disambiguation, tab ownership behavior, and the full change_report return contract including truncation and the read_page fallback.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 13 parameters, including modifiers, steps, stepDelayMs, tab_id, and visual_reason. The description restates coordinate semantics ('CSS pixels relative to the browser viewport') and the shift constraint without adding format or edge-case guidance beyond the schema. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Drag from one viewport coordinate to another using CDP trusted events') and immediately differentiates itself from drag_drop, drag_variable_speed, click_at, and click_and_hold by naming each sibling and its distinct mechanism.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names when to use it ('canvas drawing tools, sliders, and map interactions where DOM drag events are ignored') and routes the agent elsewhere for element-to-element drag, CAPTCHA drags, and simple clicks. Also gives the tab_id ownership rule and the cross-agent TAB_NOT_OWNED failure mode.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| steps | No | Number of intermediate move events during drag (default 10) | |
| client | Yes | Allowlisted client label. Validated against the shared v0.9.36 server/extension allowlist (see mcp/src/tools/visual-session.ts -- MCP_VISUAL_CLIENT_LABELS). Required. | |
| holdMs | No | Milliseconds to hold before starting drag motion (default 150, increase for libraries that need longer press) | |
| tab_id | No | Optional. Tab id this action targets. Omit when the calling agent owns exactly one tab; pass to disambiguate when the agent owns multiple. Single-tab agents and legacy popup/sidepanel/autopilot do not need to pass this. | |
| is_final | No | When true, the visual session clears immediately after this tool resolves. Optional (default false). | |
| stepDelayMs | No | Delay in ms between each move step (default 20) | |
| visual_reason | Yes | Short human-readable reason shown in the overlay (for example, "Logging in to GitHub"). Required. | |
| sourceSelector | Yes | CSS selector or element reference (e.g., "e5", "#card-1") for the element to drag | |
| targetSelector | Yes | CSS selector or element reference (e.g., "e12", "#column-2") for the drop target element |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: it discloses the three-method fallback order (HTML5 DragEvent, PointerEvent for react-beautiful-dnd, MouseEvent), that it reports which method succeeded, the multi-agent tab ownership rule (cross-agent reject with TAB_NOT_OWNED, cap default 8 range 1-64), and tab auto-resolution behavior. These are non-obvious operational traits an agent could not infer from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then use cases, alternative, related tools, multi-agent constraints, and return behavior in a logical order. It is long, but the length is justified by the tool's complexity; the only mild redundancy is re-explaining the change_report after already covering returns.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description must explain returns, and it does so thoroughly: the change_report field contents (URL, dialogs_opened, nodes_added/removed, attrs_changed, inputs_changed, focus_shift), its truncation flag/hint, and the read_page fallback. Combined with the method fallback and tab constraints, an agent has everything needed to call and interpret this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all nine parameters including tab_id semantics and the steps/holdMs/stepDelayMs timing knobs. The description restates tab_id usage ('pass only when this agent owns multiple tabs; auto-resolves otherwise') and frames source/target as element references, but adds little beyond what the schema states, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Drag and drop one DOM element onto another using element references,' and immediately scopes it as interaction between two identifiable DOM elements. It explicitly distinguishes itself from the coordinate-based sibling ('For canvas/coordinate-based drag, use the drag tool instead') and from drop_file, so an agent can route correctly without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use cases (Kanban reordering, sortable lists, file drag targets) plus the explicit when-not-and-use-instead rule pointing to the drag tool. It also lists related tools (drag, drop_file, get_dom_snapshot) with one-line disambiguation for each, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| endX | Yes | End X coordinate in viewport CSS pixels (target/gap position) | |
| endY | Yes | End Y coordinate in viewport CSS pixels (usually same as startY for horizontal slider) | |
| steps | No | Number of intermediate mouseMoved events (default 20, more = smoother curve) | |
| client | Yes | Allowlisted client label. Validated against the shared v0.9.36 server/extension allowlist (see mcp/src/tools/visual-session.ts -- MCP_VISUAL_CLIENT_LABELS). Required. | |
| startX | Yes | Start X coordinate in viewport CSS pixels (slider thumb position) | |
| startY | Yes | Start Y coordinate in viewport CSS pixels (slider thumb position) | |
| tab_id | No | Optional. Tab id this action targets. Omit when the calling agent owns exactly one tab; pass to disambiguate when the agent owns multiple. Single-tab agents and legacy popup/sidepanel/autopilot do not need to pass this. | |
| is_final | No | When true, the visual session clears immediately after this tool resolves. Optional (default false). | |
| maxDelayMs | No | Maximum delay in ms between steps at start/end (default 40, edges of drag) | |
| minDelayMs | No | Minimum delay in ms between steps at peak speed (default 5, center of drag) | |
| visual_reason | Yes | Short human-readable reason shown in the overlay (for example, "Logging in to GitHub"). Required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and largely meets it: it discloses the emitted event sequence (mousePressed / N mouseMoved / mouseReleased), the slow-fast-slow delay behavior, the multi-agent ownership constraint with the TAB_NOT_OWNED rejection, and the configurable cap (default 8, 1-64). It omits any statement of safety/reversibility for what is an input-simulating action, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded correctly: purpose, event sequence, use case, and the sibling alternative all come before the ancillary notes. It is on the long side — the multi-agent and change_report paragraphs are verbose — but each section is scoped and none is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must describe returns, and it does: the change_report fields (URL, dialogs_opened, nodes_added, nodes_removed, attrs_changed, inputs_changed, focus_shift), the truncation flag/hint, and the escalation to read_page. Combined with purpose, exclusion criteria, error case, and tab scoping, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description supplies conceptual context for the timing parameters (the slow-fast-slow curve explains what steps/minDelayMs/maxDelayMs are doing) and repeats tab_id ownership semantics, but adds no syntax, ranges, or defaults beyond what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource with precise scope: 'Drag from one viewport coordinate to another at variable speed using an ease-in-out timing curve.' It names and differentiates its siblings — 'drag (uniform-speed drag for canvas/maps)' and 'drag_drop (DOM element-to-element drag)' — so an agent can disambiguate without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use with an alternative: '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.' It also lists related tools and their distinct scopes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| client | Yes | Allowlisted client label. Validated against the shared v0.9.36 server/extension allowlist (see mcp/src/tools/visual-session.ts -- MCP_VISUAL_CLIENT_LABELS). Required. | |
| tab_id | No | Optional. Tab id this action targets. Omit when the calling agent owns exactly one tab; pass to disambiguate when the agent owns multiple. Single-tab agents and legacy popup/sidepanel/autopilot do not need to pass this. | |
| fileName | No | Name of the synthetic file to drop (e.g., "photo.jpg", "document.pdf") | |
| is_final | No | When true, the visual session clears immediately after this tool resolves. Optional (default false). | |
| mimeType | No | MIME type of the file (e.g., "text/plain", "image/png", "application/pdf") | |
| selector | Yes | CSS selector for the dropzone element (the area where files are dropped) | |
| fileContent | No | Text content of the file (for text-based files) | |
| visual_reason | Yes | Short human-readable reason shown in the overlay (for example, "Logging in to GitHub"). Required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: it discloses the synthetic File construction, the exact event sequence dispatched, multi-agent tab ownership rules with the TAB_NOT_OWNED cross-agent rejection, the configurable concurrency cap (default 8, range 1-64), and when tab_id is required. It also documents the change_report return, its fields, and the truncation behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and mechanism, then alternatives, then the operational notes and return shape. Nearly every sentence earns its place, though the multi-agent/tab-ownership and cap paragraph is dense enough to slightly dilute the main guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter tool with no output schema, it covers execution mechanics, concurrency semantics, and the return payload including the truncated/hint fallback to read_page. The one notable gap is that the sibling upload_file is never mentioned, so the distinction between dropping a file onto a dropzone and uploading via a file input is left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all eight parameters and the baseline is 3. The description adds genuine context for tab_id (ownership-based resolution) and clarifies how fileName/fileContent/mimeType combine into the synthetic File, but it adds nothing for selector, client, visual_reason, or is_final beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Simulate dropping a file onto a dropzone element") and explains the mechanism: a synthetic File plus an HTML5 DragEvent sequence (dragenter, dragover, drop). It explicitly distinguishes itself from drag_drop for DOM-element dragging, so an agent can route correctly without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the target use cases concretely (Dropzone.js, react-dropzone, native HTML5 drop handlers) and gives an explicit exclusion with the alternative: "For drag-and-drop of DOM elements (not files), use drag_drop instead." It also points to get_dom_snapshot for finding dropzone selectors.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | No | Optional end reason for analytics/debugging. | |
| session_token | Yes | Session token returned by start_visual_session. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: it discloses the exact return behavior (typed TOOL_REMOVED error plus a migration recipe pointer) and the lifecycle semantics that replaced it. An agent knows calling this is a no-op that yields a structured error, not a state mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The removal notice is front-loaded in brackets before any explanation, and each subsequent sentence earns its place by naming the error type, the two replacement mechanisms, and the migration docs. No padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a deprecated stub with no output schema, the description covers everything an agent needs: don't call it, what happens if you do, and exactly what to do instead, including doc pointers.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the enum on reason is documented in-schema, so the baseline is 3. The description adds no parameter-level detail beyond what the schema already states, which is acceptable given the tool is a removed stub.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description immediately and unambiguously states the tool's current status and behavior: it was removed in v0.9.0 and calling it returns a typed TOOL_REMOVED error. This is a specific, actionable purpose that an agent can distinguish from start_visual_session and every action tool without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when NOT to use this tool and names the alternatives: sessions now clear automatically after 60s of silence or immediately when an action tool is called with is_final: true. That is a complete routing instruction with no inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | JavaScript code to execute in the page (use `return` to send a value back, e.g., "return document.title;" or "document.querySelector('button').click()") | |
| client | Yes | Allowlisted client label. Validated against the shared v0.9.36 server/extension allowlist (see mcp/src/tools/visual-session.ts -- MCP_VISUAL_CLIENT_LABELS). Required. | |
| tab_id | No | Optional. Tab id this action targets. Omit when the calling agent owns exactly one tab; pass to disambiguate when the agent owns multiple. Single-tab agents and legacy popup/sidepanel/autopilot do not need to pass this. | |
| is_final | No | When true, the visual session clears immediately after this tool resolves. Optional (default false). | |
| visual_reason | Yes | Short human-readable reason shown in the overlay (for example, "Logging in to GitHub"). Required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so thoroughly: code runs as a function body, `return` is required, results are stringified, Promises are NOT awaited (poll on window.__yourKey), multi-agent tab scoping with TAB_NOT_OWNED rejection, a configurable cap of 8 (1-64), and a returned change_report with truncation behavior. This is behavior an agent could not infer from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and clearly sectioned ('Typical patterns:', 'FALLBACK TO NATIVE TOOLS WHEN:', 'RETURNS change_report:'), with concrete code snippets the agent can adapt. Dense but nearly every sentence earns its place; the repeated advise-to-verify-with-read_page/get_page_snapshot is slightly redundant but purposeful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Although there is no output schema and no annotations, the description documents the return payload (change_report fields: URL, dialogs_opened, nodes_added/removed, attrs_changed, inputs_changed, focus_shift) and its truncation flag, plus execution semantics and fallback policy. Nothing needed to invoke or interpret the call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema: tab_id should only be passed when the agent owns multiple tabs (auto-resolves otherwise), is_final clears the visual session on resolution, and `code` semantics (no awaited Promises, stringified returns) extend the schema's terse 'use return to send a value back'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('Run JavaScript directly in the active page') with an explicit statement that it is the PRIMARY INTERACTION TOOL for DOM work. It is immediately distinguishable from siblings like click, type_text, and drag_drop, which it deliberately enumerates as fallbacks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Exceptional routing guidance: 'try execute_js FIRST' plus a numbered FALLBACK TO NATIVE TOOLS WHEN list specifying exactly when native click/type/drag must be used (swallowed synthetic events, React controlled inputs, drag libraries, validated form submission). Both when-to-use and when-not-to-use are explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | Why the task cannot be completed (e.g. "Page requires login", "Data not found on page") | |
| tab_id | No | Optional target tab id used to associate this outcome with the correct local MCP replay session. | |
| session_token | No | Optional token returned by start_visual_session. Provide this only when failing a client-owned visual session. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and delivers unusual value: a hard prohibition on including secrets/tokens/form values, cross-agent rejection semantics with the TAB_NOT_OWNED error code, and agent-scoped tab ownership. It still doesn't say what happens to the session/task afterward (does it terminate the run?) or what the outcome looks like, and the trailing 'cap (default 8, 1-64)' is never explained.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and the safety constraint, and every sentence is purposeful. The final 'Multi-agent: ... cap configurable (default 8, 1-64)' is telegraphic and ambiguous about what is being capped, which slightly hurts readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation/terminal-state tool with no annotations and no output schema, it covers safety, ownership, error behavior, and parameter conditions well. Missing are the post-call consequences (task/session state after failure) and the meaning of the mentioned cap, so it is not fully self-contained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds conditional semantics the schema lacks: tab_id is for disambiguating when multiple tabs/sessions are active, and session_token applies only to a client-owned visual session created by start_visual_session. That materially improves correct invocation of the optional params.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and outcome: 'Signal that the task cannot be completed,' which is unambiguous against siblings like complete_task, partial_task, and stop_task. It also clarifies the alternative behavior it replaces ('instead of just stopping'), so an agent can pick it without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear triggering condition ('unrecoverable problem') and a when-not for session_token ('otherwise omit it and keep the normal task-failure semantics'), plus conditional guidance for tab_id when multiple tabs are active. It stops short of naming the nearest alternative tools (partial_task vs. fail_task) explicitly, so it is strong but not a full routing instruction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | No | Hint for which credential to fill. Ignored for security -- the actual domain is derived from the resolved tab URL. Kept for backward compatibility. | |
| tab_id | No | Optional. Tab id this action targets. Omit when the calling agent owns exactly one tab; pass to disambiguate when the agent owns multiple. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so richly: the password never crosses the WebSocket bridge, the domain is resolved internally for security, the vault must be unlocked, and cross-agent access is rejected with TAB_NOT_OWNED. These are exactly the security and failure-mode details an agent needs before invoking.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what the tool does, then security model, then multi-agent/tab behavior. Five dense sentences each carry information, though the domain backward-compatibility point is stated twice (description and schema).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a sensitive 2-param mutation of a login form with no output schema and no annotations, the description covers prerequisites (unlocked vault), security (credential never leaves extension), multi-agent ownership, and the error code — everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents that domain is ignored/derived and how tab_id resolves. The description largely restates this, so beyond the baseline 3 it adds little new parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (auto-fill login form) with the exact target (saved credential on the active tab). This is clearly distinguishable from siblings like list_credentials (which only lists) and use_payment_method (different resource).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains when to pass tab_id (only when the agent owns multiple tabs) versus omitting it (auto-resolves otherwise), and flags the prerequisite that the vault must be unlocked. It doesn't explicitly name alternatives, but the use case is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| client | Yes | Allowlisted client label. Validated against the shared v0.9.36 server/extension allowlist (see mcp/src/tools/visual-session.ts -- MCP_VISUAL_CLIENT_LABELS). Required. | |
| tab_id | No | Optional. Tab id this action targets. Omit when the calling agent owns exactly one tab; pass to disambiguate when the agent owns multiple. Single-tab agents and legacy popup/sidepanel/autopilot do not need to pass this. | |
| csvData | Yes | CSV data with \n for row breaks | |
| is_final | No | When true, the visual session clears immediately after this tool resolves. Optional (default false). | |
| sheetName | No | Optional sheet name to set | |
| startCell | Yes | Starting cell reference (e.g., "A1", "B5", "D10") | |
| visual_reason | Yes | Short human-readable reason shown in the overlay (for example, "Logging in to GitHub"). Required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, and it does disclose agent-scoped tabs, cross-agent rejection with a specific error code, and a configurable cap (default 8, 1-64). It also explains the change_report return and truncation behavior. It stops short of stating permission/auth requirements or reversibility, so not a full 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, and the when-to-use and related-tool guidance follows logically. The RETURNS change_report block is somewhat verbose but earns its place since there is no output schema; overall tight despite the length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by detailing the change_report fields and truncation/hint behavior. Combined with ownership rules, error code, and cap limits for a 7-parameter mutation tool, an agent has enough to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all seven parameters including tab_id disambiguation, csvData format, and is_final semantics. The description's note on tab_id ('only when this agent owns multiple tabs; auto-resolves otherwise') largely restates the schema, so it adds little beyond the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope: 'Fill cells in a spreadsheet starting from a given cell with CSV data.' It names the sibling read_sheet and navigate as related, so an agent can position this tool among many sheet/page tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('for bulk data entry into Google Sheets') plus related-tool routing (read_sheet to read before filling, navigate to go to the spreadsheet first). Multi-agent ownership rules and the TAB_NOT_OWNED rejection condition are also spelled out, leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| client | Yes | Allowlisted client label. Validated against the shared v0.9.36 server/extension allowlist (see mcp/src/tools/visual-session.ts -- MCP_VISUAL_CLIENT_LABELS). Required. | |
| tab_id | No | Optional. Tab id this action targets. Omit when the calling agent owns exactly one tab; pass to disambiguate when the agent owns multiple. Single-tab agents and legacy popup/sidepanel/autopilot do not need to pass this. | |
| is_final | No | When true, the visual session clears immediately after this tool resolves. Optional (default false). | |
| selector | Yes | CSS selector or element reference to focus | |
| visual_reason | Yes | Short human-readable reason shown in the overlay (for example, "Logging in to GitHub"). Required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden and does well: it discloses the return value ('focus confirmation'), multi-agent tab scoping, the TAB_NOT_OWNED cross-agent rejection, and a configurable cap (default 8, 1-64). It omits any permission/auth prerequisites or failure modes beyond tab ownership, but the behavioral coverage is unusually strong for a focus tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action, then segments 'When to use', 'Related', and 'Multi-agent' into scannable clauses. Dense but every sentence adds distinct, actionable information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a focus tool with no output schema and no annotations, the description supplies the return value, the related-tool map, and the multi-agent/tab-ownership model. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all five parameters including client, tab_id, is_final, selector, and visual_reason. The description reiterates tab_id resolution semantics ('pass only when this agent owns multiple tabs; auto-resolves otherwise'), which is minor added value; baseline 3 is correct when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Move keyboard focus to an element') and separates itself from siblings by naming type_text, press_key, and click with their relationships. An agent can distinguish this tool from the many click/type tools without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'When to use' clause covers both the input-preparation and accessibility-focus-ring cases, and 'Related' names alternatives with the condition that selects each. Nothing about when-to-use-vs-alternatives is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | No | Optional. Tab id this read targets. Omit when the calling agent owns exactly one tab; required to disambiguate when the agent owns multiple. Single-tab agents and legacy popup/sidepanel/autopilot do not need to pass this. | |
| selector | Yes | CSS selector or element ref (e.g., "#link", "a.nav-item", or "e7" from get_dom_snapshot) | |
| attribute | Yes | HTML attribute name (e.g., 'href', 'src', 'value') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does add real behavior: agent-scoped tabs, cross-agent rejection with the TAB_NOT_OWNED error code, and tab auto-resolution. It omits edge cases such as what is returned when the attribute is absent, and the stray "cap configurable (default 8, 1-64)" reads like it belongs to a tab-listing tool and is confusing here.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and the description is organized into clear When-to-use, Related, and Multi-agent segments. The multi-agent segment is dense and the tab-cap clause is likely irrelevant noise for a single-attribute read, slightly diluting an otherwise tight definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read tool with no output schema or annotations, the description covers usage, alternatives, and multi-agent ownership adequately. It stops short of describing the return when the attribute is missing, but nothing critical for correct invocation is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters are already documented, and the description's attribute examples (href, src, value) largely restate them. It does reinforce the tab_id auto-resolution rule, but adds little beyond the schema, warranting the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("Get an HTML attribute value from an element") and the return ("Returns the attribute value"). It explicitly names the sibling reads it is distinct from (get_text, get_dom_snapshot), so an agent can route without opening other schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit "When to use" clause enumerating the exact cases (href, src, value, data attributes, ARIA properties) and a "Related" line disambiguating get_text and get_dom_snapshot. Both the when and the alternatives are stated rather than inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | No | Optional. Tab id this read targets. Omit when the calling agent owns exactly one tab; required to disambiguate when the agent owns multiple. Single-tab agents and legacy popup/sidepanel/autopilot do not need to pass this. | |
| maxElements | No | Maximum elements to include (default: 2000) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does substantial work: it discloses the return shape (tag, text, attributes, position), the error code TAB_NOT_OWNED for cross-agent access, agent-scoped tab ownership, and the tab cap. It stops short of explicitly stating read-only semantics and the cap's relation to maxElements is ambiguous, keeping it out of 5 territory.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The critical 'When to use' guidance is front-loaded and every clause carries information, but the trailing multi-agent/cap sentence is dense and introduces a number that conflicts with the schema default, mildly muddying an otherwise tight structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-annotation, no-output-schema read tool, the description covers purpose, usage trigger, return shape, and multi-agent behavior, so an agent has what it needs. The unresolved cap-vs-maxElements discrepancy is the only material gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description restates the tab_id ownership rule ('pass tab_id only when this agent owns multiple tabs') which the schema already documents, and it never explains maxElements, instead referencing a differently-scaled 'cap (default 8, 1-64)' against a schema default of 2000, so it adds no clarifying value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get a structured DOM snapshot with element references') and immediately differentiates itself from siblings by naming read_page as the quick-text alternative. An agent can tell it apart from get_page_snapshot and get_text without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'BEFORE any interaction tool (click, type_text, etc.)' as the trigger condition, and the 'Related' line routes the agent to read_page for plain text and to click/type_text/hover as consumers of the refs. Both when-to-use and the alternative are stated, not implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | Number of recent logs to return (default: 50, max: 200). Ignored when sessionId is provided. | |
| sessionId | No | If provided, get logs only for this session. Otherwise get most recent logs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It does add valuable behavioral context by disclosing that results include an error/warning summary report, which is not in the schema. However, it says nothing about ordering, retention window for 'recent', truncation behavior, or that the call is a non-mutating read.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with what it returns and follow-up with when to use it; every sentence carries information. Minor waste in the slightly generic 'understand what FSB has been doing' phrasing, and 'FSB' is an unexplained acronym.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-optional-parameter read tool with no output schema, the description covers the retrieval modes and hints at the return content (error/warning summary), which is enough to call it correctly. Missing only ranking/retention specifics and sibling disambiguation, neither of which is essential here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%: the schema already documents 'count' (default 50, max 200, ignored when sessionId is provided) and 'sessionId' (filter to one session). The description only restates the session-scoping idea and adds no syntax or interaction detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (get automation logs) and names both retrieval modes: recent logs or logs for a specific session. It also discloses the payload ('error/warning summary report'), so the agent knows what it gets. It stops short of differentiating itself from adjacent siblings like get_session_replay or get_session_detail.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use to debug issues or understand what FSB has been doing' gives a clear purpose context for when to reach for this tool. There are no exclusions or explicit alternatives (e.g., when to prefer get_session_detail or replay_session instead), so it lands at clear-context-without-routing rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It is implicitly a read-only aggregate query and discloses what is returned, which is helpful, but it says nothing about cost, permissions, or whether the counts are scoped/filtered — thin disclosure for a tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with what the tool returns before the usage note. Tight and waste-free, though the second sentence is more soft framing than load-bearing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by naming the returned fields (total count, type breakdown, storage usage), which is what an agent needs to decide whether to call it. The remaining gap is the absence of any sibling routing against search_memory.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the rubric the baseline is 4; there are no parameter semantics the description could add or omit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Get) and resource (FSB memory system statistics) and enumerates the return content: total count, type breakdown, storage usage. It does not distinguish itself from the sibling search_memory, which is the nearest related tool, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use to understand how much FSB has learned from past sessions" gives an implied context for when the tool is useful, but there is no explicit when-not guidance and no mention of the alternative search_memory for inspecting actual memory contents rather than aggregate stats.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | No | Optional. Tab id this read targets. Omit when the calling agent owns exactly one tab; required to disambiguate when the agent owns multiple. Single-tab agents and legacy popup/sidepanel/autopilot do not need to pass this. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does well: it discloses multi-agent tab scoping, the cross-agent rejection error (TAB_NOT_OWNED), and a configurable cap (default 8, range 1-64). It stops short of describing output shape/pagination or auth nuances, but the error and limit disclosure is genuinely useful context not present anywhere else.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose then layers usage, related tools, and multi-agent constraints in a scannable order. It is dense and repeats the schema's tab_id guidance, which is mild redundancy, but every sentence carries operational value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates by stating what is returned (markdown DOM snapshot with interactable elements and ref IDs). Combined with usage triggers and the tab-ownership error path, an agent has everything needed to call this correctly for a single-parameter read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the tab_id schema text already explains the single-tab vs multi-tab rule in detail. The description restates the same rule ('pass tab_id only when this agent owns multiple tabs; auto-resolves otherwise'), adding confirmation but no new syntax or format detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Get) and resource (markdown snapshot of the current page DOM), then specifies what the return contains (interactive elements with ref IDs for targeting). It explicitly distinguishes itself from siblings read_page and get_text by their differing outputs, so an agent can choose without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit trigger conditions: 'BEFORE any click/type/interaction' and 'call this at the start of each new page or when you need to find elements.' It also names the alternatives (read_page for plain text, get_text for single element) so the routing decision is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | Output format: json (structured, default) or text (human-readable report) | |
| sessionId | Yes | Session ID from list_sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden and does disclose a non-obvious behavior: in-flight sessions return a partial snapshot with `final: false`, and the full payload only arrives after completion. It also discloses the read-vs-write nature implicitly and output format options. It does not mention permissions or rate limits, but for a read tool the disclosed partial-payload semantics are the key risk and are covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and usage before the in-flight caveat and related-tools list. Every sentence carries information, though the 'Related:' enumeration is slightly verbose relative to the rest.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates by describing what the payload contains, the two output formats, and the partial-vs-full return behavior. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (sessionId, format enum) are already fully documented in the schema. The description's mention of 'structured JSON or human-readable text report' restates the format parameter rather than adding new semantics. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get full detail for an automation session') and enumerates the payload contents (logs, action history, timing). This clearly separates it from siblings like get_logs, get_session_replay, and list_sessions without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('Use after list_sessions to inspect what happened') and names three alternatives with their distinct roles: list_sessions (find IDs), get_logs (raw entries), get_task_status (in-flight check). An agent can route between these siblings directly from the text.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | Yes | Session ID from list_sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does well: it discloses that the manifest is verified and structurally redacted, enumerates what the return contains (step structure, logical tab targets, risk classifications, manifest hash), and explicitly states what is withheld (signing receipts). It stops short of stating required auth or permissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with zero filler; the core capability is front-loaded and the routing guidance and return contents follow in order of usefulness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations, the description adequately compensates by enumerating the manifest's contents and the withheld signing receipts. It is complete enough to call correctly, missing only incidental detail such as permissions or size/format of the manifest.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter, and schema description coverage is 100%, so the schema already documents sessionId with its source (list_sessions). The description adds no format or constraint detail beyond that, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Get) plus a precisely qualified resource (the verified, structurally redacted replay manifest for a recorded session). It even names the sibling alternatives it is not (list_sessions, replay_session), so an agent can route without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use this instead of reconstructing a replay from logs' and then maps the two related siblings to their distinct roles (find a session vs request a consent-gated replay). Both the when and the when-not are supplied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Domain name to get guide for (e.g. "google.com", "github.com") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose output content plus multi-agent constraints (agent-scoped tabs, TAB_NOT_OWNED cross-agent rejection, cap default 8 max 1-64). However, the tab/cap details are tangential to a guidance-lookup tool and add noise rather than clearly describing freshness, caching, or side-effect-freedom.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then use-cases, then related tools, so the most important content comes first. The trailing multi-agent cap sentence is somewhat disconnected boilerplate that dilutes the otherwise tight structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter lookup with no output schema, the description adequately explains what is returned and when to call it. It stops short of clarifying whether guidance is cached/versioned, which matters for repeated calls.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single 'domain' parameter already documents format and examples, so the schema does the heavy lifting. The description adds no syntax or constraint detail beyond what the schema provides; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get site-specific automation guidance for a domain') and enumerates the return content ('selectors, navigation patterns, and tips'). It is clearly distinguishable from the snapshot/text-reading siblings it names.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit triggering conditions: 'when starting work on a new site or when standard selectors fail.' It also names related tools (get_page_snapshot, get_dom_snapshot) as contrasts, though it does not state when NOT to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does reasonably well: it discloses the returned fields (percent complete, current phase, ETA) and a key behavioral constraint, 'Agent-scoped: returns the calling agent's task status only'. It does not explicitly confirm read-only semantics or permission requirements, leaving a small gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, all front-loaded with the core action first, then usage condition, return values, and scope restriction. Every sentence adds information an agent can act on; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A simple zero-parameter read tool with no output schema, and the description compensates by naming the returned fields and the agent-scoping rule. Nothing an agent needs to invoke it correctly appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema declares zero properties, so there is nothing for the description to disambiguate; baseline is 4. The description correctly implies the call needs no arguments, matching the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Check') and resource ('task status') plus scope ('whether a task is currently running and its progress'). It explicitly distinguishes itself from run_task (the monitored task) and stop_task (cancellation), so an agent can route without opening sibling schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete trigger condition: 'Use to poll status when not receiving progress notifications'. It also names the related tools and their relationship. It stops short of stating when not to use it (e.g., vs. get_trigger_status or session tools), so it is clear context without explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | No | Optional. Tab id this read targets. Omit when the calling agent owns exactly one tab; required to disambiguate when the agent owns multiple. Single-tab agents and legacy popup/sidepanel/autopilot do not need to pass this. | |
| selector | Yes | CSS selector or element ref (e.g., "#price", ".title", or "e3" from get_dom_snapshot) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does substantial work: it discloses multi-agent tab scoping, the TAB_NOT_OWNED cross-agent rejection, and a configurable tab cap (default 8, range 1-64). What it omits is what happens when the selector matches nothing or multiple elements, which is a relevant failure mode for a read-by-selector tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and return value are front-loaded in two short sentences, and the guidance blocks are compact. The 'cap configurable (default 8, 1-64)' fragment is terse to the point of ambiguity about what is capped, costing it a point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read tool with no output schema, the description covers purpose, return type, alternatives, and the tab-ownership constraint, which is most of what an agent needs. It stops short of describing empty/no-match behavior or whether the read waits for the element to appear.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented in the schema, making 3 the baseline. The description restates the tab_id rule ('Pass tab_id only when this agent owns multiple tabs; auto-resolves otherwise') without adding format or edge-case detail beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb+resource ('Get the text content of a specific element') and explicitly states the return ('Returns the element's text'). It also names the sibling tools it must be distinguished from (read_page, get_attribute) and the scope difference, so an agent can select it without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It has an explicit 'When to use' clause ('to read a specific element's text without reading the whole page') plus a 'Related' block that routes the agent to read_page for full-page reads and get_attribute for attribute reads. When-to-use, alternatives, and the selecting condition are all present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | No | Optional. Tab id used to disambiguate scoped trigger access. | |
| trigger_id | Yes | Trigger id returned by trigger. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. 'Read' and 'persisted status'/'storage-of-truth' clearly signal a non-mutating authoritative read, and the return-field enumeration adds useful context, but it says nothing about permissions, side effects, or freshness/rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core purpose and followed by the returned fields. Efficient with no filler, though the second sentence is a somewhat long enumeration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully enumerates what the response contains (status, watch mode, condition, target tab, owner, value, timing, attention), which is the main thing an agent needs. Given a simple read tool, it is largely complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented in the schema. The description reinforces the 'by id' selector but adds no syntax, format, or scoping detail beyond what the schema states, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (read the persisted status) scoped to a single trigger by id, which naturally distinguishes it from the plural list_triggers and the mutating trigger/stop_trigger siblings. It does not explicitly name those siblings, but the 'one trigger by id' scope makes the boundary clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: you call it when you already hold a trigger id and want its state. There is no explicit when-to-use guidance and no exclusion or comparison against alternatives like list_triggers or get_task_status.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| client | Yes | Allowlisted client label. Validated against the shared v0.9.36 server/extension allowlist (see mcp/src/tools/visual-session.ts -- MCP_VISUAL_CLIENT_LABELS). Required. | |
| tab_id | No | Optional. Tab id this action targets. Omit when the calling agent owns exactly one tab; pass to disambiguate when the agent owns multiple. Single-tab agents and legacy popup/sidepanel/autopilot do not need to pass this. | |
| is_final | No | When true, the visual session clears immediately after this tool resolves. Optional (default false). | |
| visual_reason | Yes | Short human-readable reason shown in the overlay (for example, "Logging in to GitHub"). Required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does so thoroughly. It discloses multi-agent scoping, the TAB_NOT_OWNED rejection, tab cap behavior, tab_id auto-resolution, and the change_report return format including truncation behavior and fallback to read_page.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but front-loaded and organized: purpose, return, when-to-use, related tools, multi-agent behavior, and the change_report contract. Every section adds information the agent needs, especially since no output schema exists to explain the return value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of output schema and annotations, the description provides the missing operational context: routing guidance, multi-agent constraints, error behavior, and return shape. An agent can call this tool correctly and interpret its outcome without needing additional documentation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all four parameters. The description restates tab_id ownership guidance that is also present in the schema and adds no material meaning beyond it, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Navigate back one page in browser history.' It explicitly distinguishes this from go_forward and navigate, so an agent can select it without opening schemas. It does not mention the sibling 'back', but the core purpose and primary sibling separation are unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance: 'to return to the previous page after following a link or navigating away.' It also names alternatives and their purposes: go_forward undoes a go_back, and navigate goes to a specific URL instead. This is actionable routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| client | Yes | Allowlisted client label. Validated against the shared v0.9.36 server/extension allowlist (see mcp/src/tools/visual-session.ts -- MCP_VISUAL_CLIENT_LABELS). Required. | |
| tab_id | No | Optional. Tab id this action targets. Omit when the calling agent owns exactly one tab; pass to disambiguate when the agent owns multiple. Single-tab agents and legacy popup/sidepanel/autopilot do not need to pass this. | |
| is_final | No | When true, the visual session clears immediately after this tool resolves. Optional (default false). | |
| visual_reason | Yes | Short human-readable reason shown in the overlay (for example, "Logging in to GitHub"). Required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does so thoroughly: it discloses agent-scoped tab ownership, cross-agent rejection with TAB_NOT_OWNED, the configurable cap default and range, and the mutation-diff change_report behavior including truncation. These are meaningful behavioral traits beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and usage, then organizes related tools, multi-agent behavior, and return details clearly. It is lengthy for a simple navigation action, but most sentences add actionable context, especially since no output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations and no output schema, the description covers the essential call context: purpose, alternatives, multi-agent ownership rules, tab_id resolution, and the shape of the returned change_report. An agent has enough information to invoke it correctly without additional schema explanation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters are already documented in the input schema, and the description's tab_id note largely overlaps the schema's own guidance. It adds minor context about auto-resolution, but the schema remains the primary source of parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: navigate forward one page in browser history, and returns the new URL. It explicitly distinguishes the tool from siblings go_back and navigate, so an agent can identify its role without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit when-to-use condition ('after using go_back, to move forward again') and names alternative tools (go_back, navigate) with their differing purposes. The tab_id guidance also clarifies when to supply that parameter versus relying on auto-resolution.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| client | Yes | Allowlisted client label. Validated against the shared v0.9.36 server/extension allowlist (see mcp/src/tools/visual-session.ts -- MCP_VISUAL_CLIENT_LABELS). Required. | |
| tab_id | No | Optional. Tab id this action targets. Omit when the calling agent owns exactly one tab; pass to disambiguate when the agent owns multiple. Single-tab agents and legacy popup/sidepanel/autopilot do not need to pass this. | |
| is_final | No | When true, the visual session clears immediately after this tool resolves. Optional (default false). | |
| selector | Yes | CSS selector or element reference to hover over | |
| visual_reason | Yes | Short human-readable reason shown in the overlay (for example, "Logging in to GitHub"). Required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the return confirmation, multi-agent tab ownership rules, the TAB_NOT_OWNED rejection, a configurable cap (default 8, 1-64), and tab_id auto-resolution. It omits failure/timeout behavior, but covers substantially more than the minimum.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action, then layers usage, related tools, and multi-agent rules in a compact block. The dense multi-agent sentence is information-rich but slightly crams several distinct behaviors together.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A hover tool with no output schema and no annotations needs to explain return value and session semantics, and it does ('Returns hover confirmation', tab ownership, cap). Minor gaps around error/timeout handling keep it short of full completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all five parameters thoroughly. The description restates the tab_id ownership/auto-resolve rule, which is largely redundant with the schema, but adds the concurrency-cap context; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Move the mouse over an element') and immediately names the siblings it relates to (click, get_dom_snapshot), so an agent can disambiguate without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'When to use' clause gives the exact scenario (reveal dropdown menus, tooltips, hover-activated content before clicking) plus the follow-up pattern via the related click tool, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Text to insert at current cursor position via CDP | |
| client | Yes | Allowlisted client label. Validated against the shared v0.9.36 server/extension allowlist (see mcp/src/tools/visual-session.ts -- MCP_VISUAL_CLIENT_LABELS). Required. | |
| tab_id | No | Optional. Tab id this action targets. Omit when the calling agent owns exactly one tab; pass to disambiguate when the agent owns multiple. Single-tab agents and legacy popup/sidepanel/autopilot do not need to pass this. | |
| is_final | No | When true, the visual session clears immediately after this tool resolves. Optional (default false). | |
| position | No | Insertion position; defaults to caret. | |
| selector | No | Optional CSS selector identifying exactly one editable field. | |
| visual_reason | Yes | Short human-readable reason shown in the overlay (for example, "Logging in to GitHub"). Required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses multi-agent tab scoping, the cross-agent rejection error (TAB_NOT_OWNED), a configurable cap (default 8, range 1-64), and a detailed change_report return contract including truncation behavior. This is unusually rich behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then usage variants, then related tools, then multi-agent and return-value detail. Dense but every sentence is relevant; the change_report block is verbose but serves a real purpose since no output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description must explain what comes back, and it does via the change_report field list and truncation fallback. Combined with usage, prerequisites, and multi-agent constraints, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameters are already documented. The description adds some meaning to position values (caret default, end appends, replace_all replaces) and the selector's role, but most parameter detail is redundant with the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Insert text through CDP') and clarifies the default target (caret). It hints at the difference from siblings by listing related tools (type_text, double_click_at, click_at), but does not sharply draw the boundary between itself and type_text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear usage context: default caret insertion, position=end to append, replace_all to replace a field, and the prerequisite that canvas editors require focus first. It names related tools but never explicitly says when to prefer insert_text over type_text, leaving that distinction implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Capability slug from a search_capabilities hit | |
| params | No | Parameters matching the hit's params JSON-Schema | |
| tab_id | No | Optional tab id; omit to use the active/owned tab |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full load and does so well: it discloses that verified T1/T1b capabilities hit the service's real web API inside the authenticated session, that guarded/catalog-tail hits return typed pending/fallback responses, and that mutating capabilities produce real side effects. It omits reversibility/idempotency and rate-limit behavior, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly packed sentences, front-loaded with the core action and followed by behavior and error handling; every sentence earns its place. The density of T1/T1b and RECIPE_* jargon slightly taxes readability but does not waste space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates by explaining the kinds of results returned (structured result vs typed pending/fallback) and the exact recovery action for each fallback code. For a dispatch tool with zero annotations, nothing essential to a correct call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents slug, params, and tab_id. The description only restates that the slug comes from a search_capabilities hit and params must match the hit's JSON-Schema, adding no syntax or format detail beyond structured data. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('invoke a capability by slug') and ties the input source to a named sibling ('from a search_capabilities hit'). An agent can immediately distinguish this from the DOM/action siblings because it names both the operation and the feeder tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Routing is explicit: get the slug from search_capabilities, check the side-effect class before mutating calls, and switch to DOM tools when RECIPE_DOM_FALLBACK_PENDING / RECIPE_LEARN_PENDING / RECIPE_EXPIRED are returned. It lacks a crisp when-not-to-use statement (e.g., prefer direct click/type for one-off actions), so it falls short of the top band.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does useful work: it discloses that passwords are never returned, which is the key behavioral/security expectation for this tool. It stops short of noting auth requirements or whether any filtering/pagination applies.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with zero waste; the capability and the return-content caveat are front-loaded before the cross-reference to fill_credential.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by describing the return shape (domain/username pairs, no passwords). For a zero-parameter read tool in a large browser-automation toolset, nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. The description adds the meaningful detail that output is limited to domain/username pairs, though there are no parameters whose semantics need explaining.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (saved credentials) and immediately bounds the result set to domain/username pairs. It is clearly distinguishable from fill_credential, which it names as the action sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to fill_credential when the goal is autofilling a login form, which is a clear when-to-use-other signal. It does not, however, state the reverse condition or any prerequisites for calling list_credentials itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does disclose a meaningful trait: only masked fields (brand, last 4, cardholder name) are returned and full numbers/CVV are never included. It does not mention auth requirements, session scoping, or behavior when no methods are saved, so it falls short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each earning its place: purpose, return contract, and next-step routing. The most important information (what is listed and what is masked) is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description must and does describe the return fields. For a zero-parameter read tool with no annotations, this covers everything an agent needs to call it correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no parameter semantics to convey; the baseline for a no-parameter tool is 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List saved payment methods') and immediately specifies what the result contains, which distinguishes it from the adjacent use_payment_method tool. An agent can tell exactly what this tool returns without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to the sibling tool for the downstream action: 'Use use_payment_method to fill a checkout form.' This gives clear context for where this tool fits, though it does not state exclusions (e.g., when not to call it) or prerequisites such as an active session or authenticated context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max sessions to return (default: all, max 50) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It discloses the shape of the returned summary (task, status, duration, action count, cost), which is genuinely useful, but says nothing about read-only safety, result ordering, or scope (all users? all time?). Adequate but leaves notable gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler: purpose and return fields first, then routing guidance. Nothing is redundant with the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema or annotation coverage, but the description compensates by naming the summary fields returned, and the lone parameter is documented in the schema. What remains missing is scope and ordering behavior, which is a minor gap for a simple list tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single `limit` parameter is fully documented there (default all, max 50). The description adds no parameter-level meaning beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List all past FSB automation sessions') and enumerates the summary fields returned (task, status, duration, action count, cost). It explicitly differentiates itself from get_session_detail and get_logs, so an agent can place it among the ~60 siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete use case ('find session IDs for deeper inspection with get_session_detail') and names two related tools with their distinct roles. There is no explicit 'when not to use', but the alternative routing is clear enough that selection is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the burden and does real work: it discloses agent-scoped visibility, the TAB_NOT_OWNED rejection for cross-agent access, and a configurable cap of 8 (range 1-64). It does not say whether exceeding the cap truncates results or errors, which is the one behavioral gap for a listing tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and return shape, then usage, then related tools, then multi-agent constraints — a good information ordering. The telegraphic semicolon-dense final sentence ('agent-scoped tabs; cross-agent reject...') is efficient but slightly terse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters and no output schema, the description supplies the return fields, the usage trigger, sibling routing, and multi-agent constraints. Nearly complete; the only omission is what happens at the tab cap boundary (error vs. truncation).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. The schema is empty and consistent with the description's no-argument framing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List all open browser tabs') plus the exact fields returned (title, URL, active status) and the return shape (array of tab objects). Clearly separable from open_tab/switch_tab/close_tab siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'When to use: to see all open tabs before switching' plus a Related list naming switch_tab and open_tab with their roles. The agent gets both the trigger condition and the alternatives in one place.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Optional status filter. | |
| tab_id | No | Optional. Limit results to a target tab when supported by the background route. | |
| include_terminal | No | Optional. When true, include terminal fired or stopped triggers in the listing. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully discloses the default filtering behavior (only active/attention-state watchers unless include_terminal is set), which is genuine behavioral context. However, it omits permissions, ordering/pagination, and any explicit statement that this is a read-only operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences with no filler. The default behavior is front-loaded, followed immediately by the flag that modifies it and its purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with no output schema, the description conveys the return content (trigger snapshots) and the default scope. It lacks detail on ordering, pagination, or the shape of each snapshot, but nothing essential to invoking it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaning beyond the schema by documenting the default result set that the optional status filter and include_terminal flag operate against, and it gives a use case for include_terminal that the schema's terse description lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('List persisted trigger snapshots'), which clearly separates it from get_trigger_status (single status) and trigger/stop_trigger (mutations). It does not explicitly name sibling alternatives, so it stops short of a 5, but an agent can identify the tool's role without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains the default scope (active and attention-state watchers) and the condition that changes it (include_terminal for 'audit or cleanup workflows'). That gives clear context for when the flag is appropriate, though it never explicitly contrasts with sibling list/status tools or states exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL to open in new tab | |
| active | No | When true, the new tab is foregrounded (steals focus). Multi-agent default is FALSE (background) so this agent does not steal focus from the user or another agent. Set true ONLY when the new tab needs immediate user visibility. | |
| client | Yes | Allowlisted client label. Validated against the shared v0.9.36 server/extension allowlist (see mcp/src/tools/visual-session.ts -- MCP_VISUAL_CLIENT_LABELS). Required. | |
| is_final | No | When true, the visual session clears immediately after this tool resolves. Optional (default false). | |
| visual_reason | Yes | Short human-readable reason shown in the overlay (for example, "Logging in to GitHub"). Required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden and does so thoroughly: agent-scoped tabs with TAB_NOT_OWNED rejection, configurable cap (default 8, 1-64), default background vs active:true focus-stealing, and the change_report return semantics including truncation handling. This is exactly the operational context an agent needs for a state-mutating UI action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and return, then organized into labeled subsections (When to use, Related, Multi-agent, Active behavior, RETURNS). Dense but every section is functional; the change_report paragraph is slightly verbose but earns its place given no output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description properly documents the return (change_report fields, truncation, read_page fallback), plus multi-agent constraints and focus semantics. Nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents url, active, client, is_final, and visual_reason. The description reiterates active's default and adds the change_report return behavior, but adds little parameter-level meaning beyond what the schema provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Open a new browser tab with the given URL') and immediately differentiates from siblings by name (switch_tab, list_tabs, navigate). An agent can tell exactly what this does and how it differs from adjacent tab/navigation tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'When to use' condition ('work on a different site without losing the current page') plus a Related list that names the alternatives and their distinguishing behavior (navigate changes URL in current tab instead). No inference required to choose between them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| reason | No | Optional machine-readable blocker category. Keep it narrow and stable for blocked/manual-handoff outcomes. | |
| tab_id | No | Optional target tab id used to associate this outcome with the correct local MCP replay session. | |
| blocker | Yes | What prevented the final step from being completed (e.g. "Messaging requires login", "Manual approval required") | |
| summary | Yes | Summary of the useful work that was completed before the blocker was hit | |
| next_step | No | Manual next step the user can take to finish manually or resume later. Include this for auth or approval blockers. | |
| session_token | No | Optional token returned by start_visual_session. Provide this only when finalizing a client-owned visual session. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: it forbids embedding secrets, defines the exact retry ordering relative to credential attempts, discloses multi-agent scoping and the TAB_NOT_OWNED rejection, and states a configurable cap (default 8, 1-64). That is substantial behavioral context beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and the alternative tool, and nearly every sentence adds a rule. Slight redundancy in listing the five auth/manual blocker examples already present as a schema enum, and the paragraph is dense, but nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter, annotation-free mutation of task state, the description covers blockers, secret hygiene, retry ordering, tab/session scoping, and caps. It stops short of stating what happens to the task/session after the call (terminated vs. resumable), which is the one remaining behavior an agent would want.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds conditional usage rules the schema lacks: when tab_id is warranted (multiple tabs/sessions) and when session_token applies (only finalizing a client-owned visual session). It also specifies the three content elements to preserve in the payload.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource outcome: signaling partial completion when useful work is done but an external blocker stops the final step. It explicitly contrasts itself with fail_task, so an agent can distinguish the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use rule ('use this instead of fail_task when the user can still benefit from the completed work'), enumerates the blocker classes that qualify, and adds a sequencing rule to let a single saved-credential/operator-prompt attempt happen first. Both the selection condition and the exclusion are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| client | Yes | Allowlisted client label. Validated against the shared v0.9.36 server/extension allowlist (see mcp/src/tools/visual-session.ts -- MCP_VISUAL_CLIENT_LABELS). Required. | |
| tab_id | No | Optional. Tab id this action targets. Omit when the calling agent owns exactly one tab; pass to disambiguate when the agent owns multiple. Single-tab agents and legacy popup/sidepanel/autopilot do not need to pass this. | |
| is_final | No | When true, the visual session clears immediately after this tool resolves. Optional (default false). | |
| selector | No | Optional CSS selector or element reference to press Enter on | |
| visual_reason | Yes | Short human-readable reason shown in the overlay (for example, "Logging in to GitHub"). Required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden and does so: it discloses the automatic fallback to clicking the submit button, the cross-agent TAB_NOT_OWNED rejection, the tab cap (default 8, 1-64), and the return payload including change_report fields and truncation signaling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose then when-to-use, followed by behavior, related tools, multi-agent rules, and returns. The change_report paragraph is long but justified since there is no output schema; a small amount of overlap with the schema's tab_id text keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations, the description covers the return shape (change_report and its diff fields, truncated flag, change_report_hint), error behavior, tab-ownership rules, and the fallback path. An agent has everything needed to call and interpret it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description's tab_id guidance ('pass only when this agent owns multiple tabs; auto-resolves otherwise') largely restates the schema text, and the 'cap configurable' note refers to no actual parameter, so it adds little beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Press the Enter key') plus the intent (submit a form / confirm input), which immediately separates it from press_key, type_text, and click. The 'Related' line explicitly routes to the nearest siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('after typing into a search box or form field') and names the alternatives with their selecting conditions (type_text first, click to press the submit button directly). Nothing about when to prefer this over siblings is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| alt | No | Hold Alt | |
| key | Yes | Key to press (e.g., 'Escape', 'Tab', 'ArrowDown') | |
| ctrl | No | Hold Ctrl | |
| shift | No | Hold Shift | |
| client | Yes | Allowlisted client label. Validated against the shared v0.9.36 server/extension allowlist (see mcp/src/tools/visual-session.ts -- MCP_VISUAL_CLIENT_LABELS). Required. | |
| tab_id | No | Optional. Tab id this action targets. Omit when the calling agent owns exactly one tab; pass to disambiguate when the agent owns multiple. Single-tab agents and legacy popup/sidepanel/autopilot do not need to pass this. | |
| is_final | No | When true, the visual session clears immediately after this tool resolves. Optional (default false). | |
| visual_reason | Yes | Short human-readable reason shown in the overlay (for example, "Logging in to GitHub"). Required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so: multi-agent tab ownership rules, rejection code TAB_NOT_OWNED, a configurable session cap (default 8, range 1-64), tab_id auto-resolution, and the change_report payload inclurating truncation hints. This is unusually rich disclosure for a zero-annotation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, followed by terse labeled sections (When to use, Related, Multi-agent, RETURNS). It is longer than average, but every block carries distinct operational information and no sentence is pure filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema and no annotations, the description supplies the missing pieces: return shape (change_report fields), truncation behavior with a follow-up pointer to read_page, cross-agent error semantics, and tab ownership rules. An agent has what it needs to call it correctly and interpret the response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the schema already documents modifiers and key format, giving a baseline of 3. The description edges above baseline by adding usage context for tab_id (pass only when the agent owns multiple tabs; auto-resolves otherwise) and the session cap, which the schema wording does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (press a keyboard key) plus scope (optional ctrl/shift/alt modifiers) and explicitly routes to siblings press_enter, type_text, and focus. An agent can distinguish this from all nearby keyboard/input tools without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Includes an explicit 'When to use' section covering shortcuts, special keys, and key combinations, and names the related alternatives with their differing intent (press_enter for Enter, type_text for full strings, focus to pre-focus). Both the use case and the routing are stated, not inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| full | No | If true, read entire page; if false (default), read visible viewport only | |
| tab_id | No | Optional. Tab id this read targets. Omit when the calling agent owns exactly one tab; required to disambiguate when the agent owns multiple. Single-tab agents and legacy popup/sidepanel/autopilot do not need to pass this. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses that the tool waits for DOM stability on JS-heavy sites, prioritizes main content over sidebars/nav/footer, caps output at ~8K chars, enforces agent-scoped tab ownership with a TAB_NOT_OWNED rejection, and supports a configurable cap (default 8, range 1-64).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and usage, then proceeds through behavior, related tools, and multi-agent details. Every clause adds information an agent needs; there is no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations and no output schema, the description compensates well by explaining the return content (main content prioritized, capped at ~8K chars), DOM-stability waiting, tab scoping, and error behavior. It gives an agent enough context to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters. The description's tab_id guidance ('Pass tab_id only when this agent owns multiple tabs; auto-resolves otherwise') largely restates what the schema says, adding no new syntax or format detail beyond the structured field.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource: 'Read the text content of the current page.' The Related section explicitly differentiates this tool from get_dom_snapshot (structured element data), navigate (navigation), and scroll (loading more content), so an agent can distinguish it from key siblings without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit usage rule: 'When to use: as the FIRST step after navigating to understand what is on the page.' It also names alternatives with their conditions (get_dom_snapshot for interaction, navigate to go to a page, scroll to load more before reading), leaving little inference for an agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| range | Yes | Cell range to read (e.g., 'A1:C5') | |
| tab_id | No | Optional. Tab id this read targets. Omit when the calling agent owns exactly one tab; required to disambiguate when the agent owns multiple. Single-tab agents and legacy popup/sidepanel/autopilot do not need to pass this. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden and does substantial work: it discloses return shape ('array'), multi-agent scoping ('agent-scoped tabs'), a concrete failure mode ('cross-agent reject with TAB_NOT_OWNED'), and a configurable cap ('default 8, 1-64'). It omits auth requirements and other error behaviors, but the multi-agent failure semantics are unusually well surfaced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then usage, then multi-agent behavior. Dense but every clause is informative; the 'Returns cell values as array' line is marginally redundant with the purpose sentence but still useful given no output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-parameter read tool with no output schema and no annotations, the definition covers purpose, return shape, alternatives, prerequisites, and multi-agent constraints. The main gap is error/edge behavior beyond TAB_NOT_OWNED, which is minor for a read operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema already documents range format and the full tab_id resolution rule, so the baseline is 3. The description's 'Pass tab_id only when this agent owns multiple tabs; auto-resolves otherwise' largely restates the schema rather than adding new syntax or format detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read cell values from a spreadsheet range') and immediately distinguishes itself from the sibling that does the opposite operation ('fill_sheet (write data)'). An agent can select this over fill_sheet without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly gives a when-to-use condition ('to extract tabular data from a spreadsheet') and names related tools including the prerequisite step ('navigate to go to the spreadsheet first') and the write counterpart fill_sheet. No explicit when-NOT-to-use exclusion, but the routing context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| client | Yes | Allowlisted client label. Validated against the shared v0.9.36 server/extension allowlist (see mcp/src/tools/visual-session.ts -- MCP_VISUAL_CLIENT_LABELS). Required. | |
| tab_id | No | Optional. Tab id this action targets. Omit when the calling agent owns exactly one tab; pass to disambiguate when the agent owns multiple. Single-tab agents and legacy popup/sidepanel/autopilot do not need to pass this. | |
| is_final | No | When true, the visual session clears immediately after this tool resolves. Optional (default false). | |
| visual_reason | Yes | Short human-readable reason shown in the overlay (for example, "Logging in to GitHub"). Required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: it discloses agent-scoped tab ownership, the TAB_NOT_OWNED cross-agent rejection, a configurable concurrency cap (default 8, range 1-64), and tab_id auto-resolution. It also documents the change_report return payload, its truncation flag, and the fallback to read_page.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action, then usage, then constraints, then return semantics. Dense but nearly every clause adds a distinct fact; the change_report paragraph is long but justified because no output schema exists to carry that information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter tool with no annotations and no output schema, the description still covers purpose, alternatives, multi-agent ownership rules, capacity limits, and the exact returned fields including truncation behavior. Nothing needed to invoke or interpret the call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds operational meaning beyond the schema: it explains that tab_id should only be passed when the agent owns multiple tabs and auto-resolves otherwise, and ties client validation to the shared allowlist. It adds context rather than merely restating field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource: 'Reload the current page.' It explicitly contrasts itself with the two most confusable siblings, navigate and wait_for_stable, so an agent can route correctly without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Contains an explicit 'When to use' clause covering three triggering conditions (stale content, post-error recovery, state reset) plus a 'Related' clause naming the alternative tools and their distinct purposes. When-to-use and alternatives are both stated outright.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | Yes | Session ID from list_sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses the signed-manifest verification, the single approval card in the side panel, and that execution is gated on user approval of that exact manifest hash, plus that FSB opens the tabs itself. The remaining gap is what the call returns and whether it blocks until approval, which an agent would want to know.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three front-loaded sentences, each carrying distinct load: purpose, approval mechanism, and operational constraint, with sibling routing last. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter tool with no output schema and no annotations, the description covers the critical unknowns: the human approval gate and tab creation behavior. It stops short of describing the response shape or the outcome of a rejected approval, a minor but real omission.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single sessionId parameter is already documented as coming from list_sessions. The description's 'Related: list_sessions (find a session)' merely restates that, adding no syntax or format detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Request replay of a recorded session') and immediately differentiates itself from siblings by naming get_session_replay and list_sessions with their distinct roles. An agent can distinguish this from the inspection-only sibling without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly orders the workflow: inspect with get_session_replay first, locate the session with list_sessions, then replay. It also gives a clear negative instruction ('never ask the user to open target pages manually'), removing a likely agent misstep.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| client | Yes | Allowlisted client label. Validated against the shared v0.9.36 server/extension allowlist (see mcp/src/tools/visual-session.ts -- MCP_VISUAL_CLIENT_LABELS). Required. | |
| tab_id | No | Optional. Tab id this action targets. Omit when the calling agent owns exactly one tab; pass to disambiguate when the agent owns multiple. Single-tab agents and legacy popup/sidepanel/autopilot do not need to pass this. | |
| is_final | No | When true, the visual session clears immediately after this tool resolves. Optional (default false). | |
| selector | Yes | CSS selector or element reference to right-click | |
| visual_reason | Yes | Short human-readable reason shown in the overlay (for example, "Logging in to GitHub"). Required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full load and does so well: it discloses the change_report payload fields (URL, dialogs_opened, nodes_added, attrs_changed, etc.), the truncation path with change_report_hint, and the cross-agent TAB_NOT_OWNED error. It does not say what state the page is left in after the menu opens (whether it must be dismissed) or what happens if the selector is missing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and usage are front-loaded, then mechanics, then return behavior — a sensible order. Slight waste in "Returns context menu confirmation" followed by a much longer change_report paragraph covering the same return topic.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Five parameters, three required, no output schema and no annotations — the description covers the missing pieces by explaining the return payload, its truncation escape hatch, and tab/agent ownership rules. An agent has enough to call it and interpret the result without a follow-up read_page.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description reinforces tab_id ownership semantics and the cap, but that repeats what the schema already says; it adds nothing about client allowlisting or visual_reason beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource ("Open context menu on an element") and lists related siblings (click as standard left-click, get_dom_snapshot for selectors). It does not explicitly contrast the two, but an agent can still distinguish right_click from click without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit "When to use" line and clear tab-scoping guidance: "Pass tab_id only when this agent owns multiple tabs; auto-resolves otherwise." Cross-agent rejection is named (TAB_NOT_OWNED) and the concurrent cap is stated (default 8, 1-64). It lacks a when-not-to-use case, and the usage line largely restates the purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| task | Yes | Natural language description of the task to perform |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: it warns that control is handed off to an autonomous AI, describes the return value (completion summary with success status and action log), explains the multi-agent contract (FSB-issued agent_id captured server-side), states the concurrency cap and its default/range, and enumerates specific failure codes (AGENT_CAP_REACHED, TAB_NOT_OWNED, TAB_INCORNITO_NOT_SUPPORTED, TAB_OUT_OF_SCOPE). This is unusually rich behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the critical gating rule and the alternative routing before the contract details, which is the right ordering. It is dense and long, but every clause (cap, ownership errors, return shape) is decision-relevant rather than padding, so it stops short of a 5 only on sheer volume.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by describing the return (completion summary, success status, action log). Combined with the auth model, concurrency limits, and error taxonomy, an agent has everything needed to decide whether to call it and to interpret a rejection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter and schema coverage is 100%, so the schema already fully documents `task` as a natural-language description. The description's parameter-adjacent content (agent_id, cap) concerns invocation/environment rather than the `task` argument itself, so this sits at the baseline for a fully-covered schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action and scope: it hands control to FSB's built-in AI which autonomously decides the steps. It explicitly separates itself from the large set of manual browser siblings (navigate, click, type_text, execute_js, etc.), so an agent can route correctly without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit gating condition ('Only use this tool if the user explicitly requests autopilot, asks to "run a task", or says "let FSB handle it"') and names the alternative for every other case, plus the rationale (manual tools are more reliable and give full control). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | No | Scroll amount in pixels (default: one viewport) | |
| client | Yes | Allowlisted client label. Validated against the shared v0.9.36 server/extension allowlist (see mcp/src/tools/visual-session.ts -- MCP_VISUAL_CLIENT_LABELS). Required. | |
| tab_id | No | Optional. Tab id this action targets. Omit when the calling agent owns exactly one tab; pass to disambiguate when the agent owns multiple. Single-tab agents and legacy popup/sidepanel/autopilot do not need to pass this. | |
| is_final | No | When true, the visual session clears immediately after this tool resolves. Optional (default false). | |
| direction | Yes | Scroll direction | |
| visual_reason | Yes | Short human-readable reason shown in the overlay (for example, "Logging in to GitHub"). Required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and mostly succeeds: it discloses the multi-agent scoping model, the cross-agent rejection error (TAB_NOT_OWNED), a configurable cap with default and range, and the is_final session-clearing side effect. Gaps remain on edge behavior (e.g. scrolling past the end of a page, whether the operation is purely read-only) and the 'cap' is named without saying exactly what is capped.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and return value, then organized under 'When to use', 'Related', and 'Multi-agent' labels, so the dense information is scannable. It is on the long side and the multi-agent sentence crams four separate facts together, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter tool with no output schema, the description covers purpose, return value, usage, alternatives, error behavior, and session lifecycle. The only shortfall is that 'cap configurable (default 8, 1-64)' is unexplained, leaving the agent unsure what resource is being capped.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description's only parameter-adjacent content — tab_id usage and the default one-viewport amount — largely restates what the schema already documents, so it adds little semantic value beyond the structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Scroll the page up or down by a specified amount') plus the return value ('Returns new scroll position'). It also names the sibling tools it is NOT (scroll_to_top, scroll_to_bottom as 'quick jumps'), so an agent can distinguish it from the jump-style scrollers without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'When to use' clause gives three concrete triggers (bring off-screen content into view, load lazy-loaded content, navigate long pages), and the 'Related' clause routes to alternatives with their distinguishing trait. Nothing about tool selection is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | X coordinate in viewport CSS pixels (center of zoom target) | |
| y | Yes | Y coordinate in viewport CSS pixels (center of zoom target) | |
| client | Yes | Allowlisted client label. Validated against the shared v0.9.36 server/extension allowlist (see mcp/src/tools/visual-session.ts -- MCP_VISUAL_CLIENT_LABELS). Required. | |
| deltaX | No | Horizontal scroll delta (usually 0) | |
| deltaY | No | Vertical scroll delta (-120 = one tick zoom in, 120 = one tick zoom out) | |
| tab_id | No | Optional. Tab id this action targets. Omit when the calling agent owns exactly one tab; pass to disambiguate when the agent owns multiple. Single-tab agents and legacy popup/sidepanel/autopilot do not need to pass this. | |
| is_final | No | When true, the visual session clears immediately after this tool resolves. Optional (default false). | |
| visual_reason | Yes | Short human-readable reason shown in the overlay (for example, "Logging in to GitHub"). Required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so the description must carry the behavioral load, and it does a lot: CDP trusted-event dispatch, one wheel tick per call, multi-agent tab scoping, cross-agent rejection with TAB_NOT_OWNED, and a configurable cap (default 8, range 1-64). It stops short of explaining what the cap limits (rate vs concurrency) or what a successful call returns, leaving a real gap for a 8-param mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, followed by semantics, usage, related tools, and edge-case scoping in a tight sequence. No sentence is filler; even the multi-agent tail is compressed into one line with concrete constants.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 8 parameters, no annotations, and no output schema, the description covers purpose, direction semantics, usage scenarios, sibling routing, and multi-agent ownership well. It is only mildly incomplete on cap semantics and response behavior, which is defensible given the constraints.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3. The description adds genuine value beyond the schema by defining the deltaY sign convention (negative = zoom in/scroll up) and the repeat-call semantics ('call multiple times for more zoom') that the schema only implies via '-120 = one tick'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Starts with a precise verb+resource ('Scroll (mouse wheel) at specific viewport coordinates using CDP trusted events') and immediately distinguishes itself from page-level scrolling by naming the exact use cases (map/canvas zoom). An agent can tell it apart from scroll, scroll_to_top, and scroll_to_bottom without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Contains an explicit 'When to use' clause (map zoom, canvas zoom, elements where page-level scroll does not trigger desired behavior) and a 'Related' clause routing to the correct sibling alternatives. It even states when to pass tab_id, which is a selection condition rather than a parameter spec.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| client | Yes | Allowlisted client label. Validated against the shared v0.9.36 server/extension allowlist (see mcp/src/tools/visual-session.ts -- MCP_VISUAL_CLIENT_LABELS). Required. | |
| tab_id | No | Optional. Tab id this action targets. Omit when the calling agent owns exactly one tab; pass to disambiguate when the agent owns multiple. Single-tab agents and legacy popup/sidepanel/autopilot do not need to pass this. | |
| is_final | No | When true, the visual session clears immediately after this tool resolves. Optional (default false). | |
| visual_reason | Yes | Short human-readable reason shown in the overlay (for example, "Logging in to GitHub"). Required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden and does so: it discloses multi-agent tab scoping (agent-scoped tabs, cross-agent TAB_NOT_OWNED reject), the concurrency cap (default 8, range 1-64), tab_id ownership rules, and a detailed change_report return with truncation behavior. This is unusually rich behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and return, then usage, then related tools. The change_report paragraph is somewhat verbose, but each detail (field list, truncation, hint) is actionable rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still explains what is returned (confirmation plus a change_report with named fields) and how to handle truncation. Nothing an agent needs to call the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters are already documented in the schema. The description restates the tab_id ownership rule (pass only when owning multiple tabs, auto-resolves otherwise) but adds little beyond what the schema states. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Scroll to the bottom of the page") and immediately distinguishes it from scroll and scroll_to_top by naming them as related tools. An agent can tell it apart from siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit "When to use" list (reach end of page, load lazy content, trigger infinite scroll) and names concrete alternatives (scroll_to_top, scroll, read_page) with their roles. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| client | Yes | Allowlisted client label. Validated against the shared v0.9.36 server/extension allowlist (see mcp/src/tools/visual-session.ts -- MCP_VISUAL_CLIENT_LABELS). Required. | |
| tab_id | No | Optional. Tab id this action targets. Omit when the calling agent owns exactly one tab; pass to disambiguate when the agent owns multiple. Single-tab agents and legacy popup/sidepanel/autopilot do not need to pass this. | |
| is_final | No | When true, the visual session clears immediately after this tool resolves. Optional (default false). | |
| selector | Yes | CSS selector or element reference to scroll into view | |
| visual_reason | Yes | Short human-readable reason shown in the overlay (for example, "Logging in to GitHub"). Required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and delivers: agent-scoped tab ownership with a named cross-agent error (TAB_NOT_OWNED), a configurable cap (default 8, range 1-64), tab_id auto-resolution rules, and a detailed description of the change_report return payload including truncation behavior and the read_page fallback. This is unusually rich behavioral disclosure for a mutation-adjacent tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then organized under explicit labels (When to use, Related, Multi-agent, RETURNS), which makes it skimmable despite its length. Some sentences, particularly the tab_id paragraph, duplicate the schema and could be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates fully by documenting the change_report structure and truncation semantics. Combined with multi-agent ownership rules and the usage/alternative guidance, an agent has everything needed to invoke and interpret this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents selector, visual_reason, client, tab_id, and is_final. The description's tab_id guidance ('pass only when this agent owns multiple tabs; auto-resolves otherwise') largely restates what the schema already says, and it adds nothing about selector syntax or visual_reason. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Scroll a specific element into the visible viewport') and immediately disambiguates from the closest sibling by naming it and its differing behavior ('scroll (scroll by pixel amount)'). An agent can distinguish this from scroll, scroll_at, scroll_to_top, and scroll_to_bottom without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use condition ('bring a particular element into view before interacting with it, especially on long pages where the element is off-screen') and routes to alternatives for other needs (scroll, click, get_dom_snapshot). It does not state when-not to use it or contrast with scroll_to_top/scroll_to_bottom, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| client | Yes | Allowlisted client label. Validated against the shared v0.9.36 server/extension allowlist (see mcp/src/tools/visual-session.ts -- MCP_VISUAL_CLIENT_LABELS). Required. | |
| tab_id | No | Optional. Tab id this action targets. Omit when the calling agent owns exactly one tab; pass to disambiguate when the agent owns multiple. Single-tab agents and legacy popup/sidepanel/autopilot do not need to pass this. | |
| is_final | No | When true, the visual session clears immediately after this tool resolves. Optional (default false). | |
| visual_reason | Yes | Short human-readable reason shown in the overlay (for example, "Logging in to GitHub"). Required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: it discloses multi-agent tab scoping, the TAB_NOT_OWNED rejection, the configurable tab cap (default 8, range 1-64), and the change_report return payload with its exact fields and truncation behavior. This is unusually rich for a scroll tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and the when-to-use guidance before the longer multi-agent and change_report details. The change_report paragraph is verbose but each clause (truncation flag, hint field, fallback to read_page) conveys distinct actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema and no annotations, the description fully covers return values (change_report fields, truncation) and the cross-agent authorization model. Nothing an agent needs to invoke or interpret the result is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all four parameters are already documented in the schema, which sets the baseline at 3. The description restates tab_id resolution logic ('pass only when this agent owns multiple tabs; auto-resolves otherwise') but adds no syntax or format detail beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Scroll to the top of the page') and immediately names the related siblings it must not be confused with (scroll_to_bottom, scroll, read_page). An agent can select it correctly without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'When to use' clause ('return to the beginning of the page or reset scroll position') plus a Related list that distinguishes each alternative by its behavior. No inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query text | |
| client | Yes | Allowlisted client label. Validated against the shared v0.9.36 server/extension allowlist (see mcp/src/tools/visual-session.ts -- MCP_VISUAL_CLIENT_LABELS). Required. | |
| tab_id | No | Optional. Tab id this action targets. Omit when the calling agent owns exactly one tab; pass to disambiguate when the agent owns multiple. Single-tab agents and legacy popup/sidepanel/autopilot do not need to pass this. | |
| is_final | No | When true, the visual session clears immediately after this tool resolves. Optional (default false). | |
| visual_reason | Yes | Short human-readable reason shown in the overlay (for example, "Logging in to GitHub"). Required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and mostly succeeds: it discloses automatic site-search detection vs. Google fallback, that it returns a results status, multi-agent tab scoping, the TAB_NOT_OWNED cross-agent rejection, and a concurrency cap (default 8, range 1-64). It does not cover permissions/auth or whether the search mutates page state.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening two sentences are redundant, with the "When to use" clause re-stating the purpose verbatim. The remaining content (detection heuristics, related tools, multi-agent semantics) is dense and earns its place, but the front-loaded duplication wastes the most prominent position.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description gives only "Returns search results status" as a return-value hint, which is thin. However, it compensates with rich operational context: detection behavior, sibling tool routing, and multi-agent tab ownership rules. For a 5-param browser-automation tool with zero annotations, this is close to complete but leaves return format and failure modes underspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents query, client, tab_id, is_final, and visual_reason in detail. The description's tab_id guidance (pass only when the agent owns multiple tabs; auto-resolves otherwise) largely duplicates the schema text. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Search for content on the current site or web") and adds mechanism detail (DOM heuristic detection of site search inputs, Google fallback). An agent can distinguish this from sibling search tools like search_memory and search_capabilities, though that differentiation is left implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The "When to use" clause merely restates the purpose ("to find content on the current site or web"), which is circular rather than directive. It does, however, name follow-on tools (read_page, click) and describe the search-then-read-then-click flow, giving implied sequencing. No explicit when-not or alternative selection criteria are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| topN | No | Max results (default 5, max 5) | |
| query | Yes | Natural-language intent, e.g. "show my github notifications" | |
| origin | No | Optional expected-origin hint (e.g. "https://github.com"). For agent-scoped calls, omit to use the resolved owned tab origin; if supplied, it must match that tab origin. Legacy callers may still use it as an origin override. | |
| tab_id | No | Optional tab id; omit to use the active/owned tab |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the return shape (slug, service, side-effect class, readiness, description, params schema-on-hit), the origin-biasing behavior, and the critical execution gate that "only t1-ready hits are direct API executable." It stops short of stating auth requirements or whether the search itself has side effects, leaving minor gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then supporting detail in a logical order. It is dense but every clause is informative (return fields, readiness gate, origin bias); a slightly tighter phrasing of the return-field list would improve it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search tool with no output schema and no annotations, the description covers the return contract, ranking limit, and execution-readiness semantics well. It omits what "FSB" scope entails and any auth or rate considerations, but nothing essential to calling it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters are already documented in the schema, and the baseline is 3. The description reinforces topN ranking and origin biasing ("Results are biased toward the resolved tab origin") but adds no syntax or semantics beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Search the FSB capability catalog") scoped by "intent", and positions itself relative to siblings by telling the agent to use it "before DOM tools for first-party actions on the current site." An agent can distinguish this discovery step from the DOM-interaction tools and from the sibling invoke_capability executor without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use context ("before DOM tools for first-party actions on the current site") and a positive trigger. It does not state when-not to use it, nor does it name invoke_capability as the follow-on execution step, so routing is clear but not fully closed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| topN | No | Max results to return (default: 5) | |
| type | No | Filter by memory type | |
| query | Yes | Natural language search query | |
| domain | No | Filter by domain (e.g., "amazon.com") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses the ranking mechanism (keyword matching plus recency scoring), but does not cover permissions, behavior on empty results, or result size limits — meaningful gaps for a tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then return behavior, then usage, then related tools — a logical order with little waste. Slightly longer than strictly needed, but each sentence carries useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema or annotations exist, so the description does the heavy lifting: it explains purpose, when-to-use, related tools, and the ranking logic. It is close to complete for a 4-param search tool, missing only edge-case behavior and result-format specifics.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters (query, topN, type, domain) are already documented in the schema. The description adds no syntax, format, or filtering detail beyond what the schema provides, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Search FSB's memory system') and specifies scope ('relevant past experiences', 'similar sites or domains'), with a return summary ('memories ranked by relevance with keyword matching and recency scoring'). It differentiates itself from siblings by naming get_memory_stats and list_sessions as related tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit 'When to use' clause ('before automating a site to check if FSB has learned relevant patterns from past sessions') and points to related tools. It stops short of stating when NOT to use it or how it differs from a competing sibling, since the named related tools serve different purposes rather than being alternatives for the same task.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| value | Yes | Option value attribute or visible text (e.g., "US", "Large", "Option 3") | |
| client | Yes | Allowlisted client label. Validated against the shared v0.9.36 server/extension allowlist (see mcp/src/tools/visual-session.ts -- MCP_VISUAL_CLIENT_LABELS). Required. | |
| tab_id | No | Optional. Tab id this action targets. Omit when the calling agent owns exactly one tab; pass to disambiguate when the agent owns multiple. Single-tab agents and legacy popup/sidepanel/autopilot do not need to pass this. | |
| is_final | No | When true, the visual session clears immediately after this tool resolves. Optional (default false). | |
| selector | Yes | CSS selector or element ref for the <select> dropdown (e.g., "#country", "select[name=size]", or "e8") | |
| visual_reason | Yes | Short human-readable reason shown in the overlay (for example, "Logging in to GitHub"). Required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does: it discloses the native-only no-op behavior on custom dropdowns, the return value, the change_report contents (URL, dialogs_opened, nodes_added/removed, attrs_changed, inputs_changed, focus_shift, truncation flag), and multi-agent tab ownership semantics (TAB_NOT_OWNED, cap default 8/1-64). This is unusually rich behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and the NATIVE-ONLY constraint before the fallback pattern, example, and return/agent details. It is long but nearly every sentence carries actionable info; the workspace/server-path reference in the `client` schema is the only mildly noisy element, and that lives in the schema, not the prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema and no annotations, everything an agent needs is present: selection semantics, native vs custom routing, silent-failure detection, tab scoping, and the change_report return contract including truncation handling. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all six params (baseline 3). The description still adds meaning: it clarifies `value` accepts value attribute or visible text, and gives concrete `tab_id` routing guidance ('pass only when this agent owns multiple tabs; auto-resolves otherwise').
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (select) and resource (an option from a NATIVE <select> dropdown) by value or visible text. It explicitly delimits scope against custom dropdowns and names the sibling tool (`click`) used for them, so an agent can tell exactly what this does and does not cover.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Uses explicit when/when-not guidance: NATIVE-ONLY, with the two-click `click` pattern spelled out for react-select, Material-UI, Headless UI and other div-based pickers. It even supplies a silent-failure heuristic ('returns no error but value does not change -> switch patterns') and lists related tools (get_dom_snapshot, click).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| client | Yes | Allowlisted client label. Validated against the shared v0.9.36 server/extension allowlist (see mcp/src/tools/visual-session.ts -- MCP_VISUAL_CLIENT_LABELS). Required. | |
| tab_id | No | Optional. Tab id this action targets. Omit when the calling agent owns exactly one tab; pass to disambiguate when the agent owns multiple. Single-tab agents and legacy popup/sidepanel/autopilot do not need to pass this. | |
| is_final | No | When true, the visual session clears immediately after this tool resolves. Optional (default false). | |
| selector | Yes | CSS selector or element reference for the container element (e.g., "#mw-content-text p:nth-of-type(3)" for third paragraph) | |
| endOffset | Yes | Character offset where selection ends (exclusive, like string.substring) | |
| startOffset | Yes | Character offset where selection starts (0-based, counting from start of element text content) | |
| visual_reason | Yes | Short human-readable reason shown in the overlay (for example, "Logging in to GitHub"). Required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden and does so: it discloses agent-scoped tab ownership, the TAB_NOT_OWNED rejection path, a configurable concurrent-session cap (default 8, range 1-64), when tab_id must be passed, and that the result includes a change_report diff with truncation flags. That is unusually rich behavioral disclosure for an unannotated tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence and the alternative routing follows immediately, but the trailing multi-agent and change_report blocks are verbose boilerplate that inflates the definition relative to the simplicity of the action. Still organized and skimmable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the return information itself (selected text for verification, change_report contents and truncation behavior) plus scoping, error and cap behavior. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description restates offset semantics (startOffset/endOffset within the element's text content) and the multi-tab tab_id rule, but this largely duplicates the schema descriptions rather than adding new syntax or constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (select a substring by character offsets within a DOM element) and immediately distinguishes itself from the sibling double_click for whole-element selection. An agent can tell it apart from get_text and double_click without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('precise text selection like highlighting a specific sentence') paired with a named alternative and its condition ('For selecting an entire element's text, use double-click instead'). It also lists prerequisite siblings (get_text to determine offsets, get_dom_snapshot to find selectors), leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| value | Yes | Value to set the attribute to | |
| client | Yes | Allowlisted client label. Validated against the shared v0.9.36 server/extension allowlist (see mcp/src/tools/visual-session.ts -- MCP_VISUAL_CLIENT_LABELS). Required. | |
| tab_id | No | Optional. Tab id this action targets. Omit when the calling agent owns exactly one tab; pass to disambiguate when the agent owns multiple. Single-tab agents and legacy popup/sidepanel/autopilot do not need to pass this. | |
| is_final | No | When true, the visual session clears immediately after this tool resolves. Optional (default false). | |
| selector | Yes | CSS selector or element ref for the target element | |
| attribute | Yes | HTML attribute name to set | |
| visual_reason | Yes | Short human-readable reason shown in the overlay (for example, "Logging in to GitHub"). Required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so the description carries the full burden, and it delivers unusual depth: cross-agent rejection with TAB_NOT_OWNED, a configurable action cap with default and range, and a declared change_report payload naming the exact mutated fields (URL, dialogs_opened, nodes_added/removed, attrs_changed, inputs_changed, focus_shift) plus truncation behavior and fallback. It stops short of stating permission/auth requirements or whether the attribute is created when absent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose, then when-to-use, related tools, multi-agent caveats, and returns in a logical order. The RETURNS paragraph is long but justified because there is no output schema; a sentence or two of it could still be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-param mutation tool with no annotations and no output schema, the description supplies the return shape, the error path (TAB_NOT_OWNED), the cap, and tab ownership rules. Remaining gaps are minor: no statement of failure behavior for a non-matching selector or whether a missing attribute is created.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all seven parameters are already documented, including tab_id auto-resolution and the client allowlist. The description's tab_id sentence largely restates the schema, adding no syntax or format detail beyond it; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ("Set an HTML attribute value on an element") and immediately names the complementary siblings get_attribute and get_dom_snapshot, so an agent can place it against the many DOM/input siblings without reading schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use list (form manipulation, hidden field values, ARIA state toggling, data attributes) plus named alternatives with their conditions: get_attribute to read first, get_dom_snapshot to find selectors. Also gives the tab_id selection rule explicitly (pass only when owning multiple tabs).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| task | Yes | Short task title shown in the visible automation surface. | |
| client | Yes | Trusted MCP client label, for example Codex, ChatGPT, Claude, or Gemini. Must be on the approved allowlist. | |
| detail | No | Optional initial detail line for the overlay, such as "Preparing checkout flow". | |
| tab_id | No | Optional. Tab id the visual session attaches to. Omit when this agent owns exactly one tab; required to disambiguate when this agent owns multiple. Legacy popup/sidepanel/autopilot do not need to pass this. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and meets it: it discloses the exact failure mode (typed TOOL_REMOVED error), the reason (v0.9.62 implicit contract), and where to find the migration path. This is behavioural disclosure well beyond what the schema conveys.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The removal status is front-loaded in the very first token, which is the right priority. It is dense but each clause adds actionable information (error type, replacement mechanism, doc pointers); only slight redundancy between the version tags and the closing references.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tombstoned tool with no output schema, everything an agent needs is present: the deprecation, the runtime error, the replacement contract, and the documentation anchors. Nothing about selection or invocation remains ambiguous.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all four parameters (task, client, detail, tab_id) in detail. The description adds no parameter-level meaning, which is the baseline-3 case when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific, unambiguous status: the tool was removed in v0.9.0 and no longer performs a start operation. It distinguishes itself from siblings by explaining that the visual session is now implicit on every action tool rather than a separate call, so an agent knows not to look for a counterpart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says what happens if called (typed TOOL_REMOVED error), what to do instead (pass the required visual_reason + client bundle on action tool calls), and where the migration recipe lives. When-to-use / when-not-to-use is fully resolved: never call this; use the implicit contract.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the return value (confirmation of cancellation), the ownership scoping rule (only the calling agent's task), and the failure mode and error code (cross-agent calls reject with TAB_NOT_OWNED). What is missing is what happens to partial/in-flight work and whether cancellation is idempotent if no task is running.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action, then return value, then usage triggers, then related tools, then the scoping caveat. Four short sentences, each carrying distinct information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter control tool with no output schema, the description covers everything an agent needs: what is cancelled, that confirmation is returned, when to use it, the alternative to check first, and the authorization boundary. No critical gap remains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the baseline the schema fully covers the input contract and there is nothing for the description to clarify. The description correctly adds no invented parameter language, though it also has no opportunity to add value here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("Cancel the currently running automation task") with an explicit scope qualifier ("currently running"). This cleanly separates it from the sibling run_task (which starts a task) and get_task_status (which inspects one) without needing the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit "When to use" trigger list (run_task taking too long, wrong direction, need manual control) and names the related alternatives with their roles: get_task_status should be checked first, run_task is the target being cancelled. Nothing is left to inference about when this tool is the right choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | No | Optional. Tab id associated with the trigger when needed for scoped cleanup. | |
| trigger_id | Yes | Trigger id returned by trigger. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full disclosure burden and does meaningful work: it declares idempotency for missing/already-terminal triggers and states the tool is "bypass-class," i.e. it bypasses pending-mutation queueing. It omits return shape and any permission/auth expectations, but the priority and idempotency traits are exactly the non-obvious behaviors an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the action, then the priority constraint, then the idempotency guarantee. "Bypass-class" is internal jargon that costs a little clarity but is explained by the clause that follows it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter cancellation tool with no output schema and no annotations, the description covers the two things that actually matter: urgency/priority bypass and idempotent handling of stale ids. Only the return/confirmation semantics are left unstated, which is a minor gap for a fire-and-forget cancel.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so `trigger_id` and the optional `tab_id` ("scoped cleanup") are already documented in the schema. The description only restates that cancellation is keyed by id and adds no syntax, format, or guidance on when to supply `tab_id`.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Cancel a trigger by id" pairs a specific verb with a specific resource and clearly positions the tool as the inverse of the sibling `trigger`. It stops short of naming sibling tools like `get_trigger_status` or `list_triggers`, so an agent must infer the boundary rather than being told.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to call it (when a pending trigger must be cancelled promptly) and notes it should not be blocked behind pending mutations, which is real usage guidance. However it never states whether an agent should check status first, nor does it name alternatives for inspecting or listing triggers.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| tabId | Yes | Tab ID to select (get IDs from list_tabs tool) | |
| active | No | When true, foreground this tab. Default false selects the tab for this agent without stealing focus. | |
| client | Yes | Allowlisted client label. Validated against the shared v0.9.36 server/extension allowlist (see mcp/src/tools/visual-session.ts -- MCP_VISUAL_CLIENT_LABELS). Required. | |
| is_final | No | When true, the visual session clears immediately after this tool resolves. Optional (default false). | |
| visual_reason | Yes | Short human-readable reason shown in the overlay (for example, "Logging in to GitHub"). Required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: agent-scoped ownership, cross-agent rejection with TAB_NOT_OWNED, a configurable cap (default 8, range 1-64), and a detailed account of the change_report return (fields, truncation flag, and the read_page fallback). This is behavioral context an agent cannot get from the schema alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, when-to-use, relations, and return behavior in a logical order, so the reader can stop early. The RETURNS paragraph is somewhat wordy and restates the field list, keeping it short of maximally tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by explaining the change_report return shape, the truncation signal, and the fallback call. Combined with usage routing and multi-agent scoping, an agent has everything needed to invoke and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds real meaning on top by qualifying active ('only when the user explicitly wants this tab foregrounded') and pointing tabId at list_tabs. It does not, however, add anything for client, is_final, or visual_reason beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Select an agent-owned browser tab by tab ID') plus the default behavior (no foreground change), which is the key distinction from navigation tools. It explicitly names related siblings list_tabs and open_tab, so an agent can place it in the tab-management family without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit 'When to use' clause (multi-tab workflows while keeping user foreground undisturbed) and a clear when-not/exception ('Pass active:true only when the user explicitly wants this tab foregrounded'). It also names prerequisites via the 'Related: list_tabs (get available tab IDs first)' routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| watch | No | Optional watch mechanism. live-observe uses in-page mutation observation; refresh-poll periodically reloads the trigger-owned tab and reads the selector. | |
| locale | No | Optional locale hint for numeric parsing, such as en-US or de-DE. | |
| tab_id | No | Optional. Tab id to arm the trigger against. Alias of target_tab_id for callers that use ordinary tool tab targeting. | |
| extract | No | Optional value extraction mode. Defaults are selected by the trigger runtime from the condition. | |
| attrName | No | Optional alias for attribute when content-side trigger readers use attrName. | |
| detached | No | When true, arm and return trigger_id immediately instead of blocking. | |
| selector | Yes | CSS selector or stable element selector to watch. | |
| attribute | No | Optional attribute name when extract is attribute. | |
| condition | No | Trigger condition object validated by the trigger manager. Supported kinds include changed, threshold, delta_percent, equals, contains, regex, and compound AND/OR conditions. | |
| timeout_ms | No | Blocking wait timeout in ms. Default 120000. Timeout returns timed_out. | |
| trigger_id | No | Optional caller-supplied trigger correlation id. MCP callers may omit it; the server generates one before arming. | |
| rearm_on_fire | No | When true, keep watching after a fire and expose fire_count/last_event through status. | |
| target_tab_id | No | Optional. Explicit target tab id for the watched page. | |
| poll_interval_ms | No | Optional refresh-poll interval in milliseconds. The background runtime enforces its minimum floor. | |
| decimal_separator | No | Optional decimal separator override for numeric parsing. | |
| safety_ceiling_ms | No | Maximum blocking wait before auto-detach. Default/max 240000. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and delivers real value: it discloses that the watch is owned by a background runtime and persisted across service-worker eviction, and that nested condition details are runtime-validated before arming. It does not state the default blocking behavior (implied only by the detached parameter) or the lifecycle of fired events, which is a meaningful omission for a 16-parameter stateful tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five sentences, all front-loaded with the purpose first, then usage, then behavioral context, then routing. Every sentence carries information, though the runtime-validation sentence is somewhat redundant with the schema's condition description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 16-parameter, stateful, annotation-free tool with no output schema, the description covers ownership, persistence, validation and sibling routing well. It stops short of explaining default blocking vs. detached return semantics and what a fire delivers to the caller, which an agent arming a long-lived watcher would benefit from.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 16 parameters including enums, aliases, defaults and the condition kinds. The description only echoes 'one selector and one condition object', which understates the parameter surface but adds nothing beyond the schema. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (arm) and resource (a reactive DOM trigger on one selector), and immediately scopes it to a single element. An agent can distinguish it from stop_trigger, get_trigger_status and list_triggers purely from the opening sentence.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the trigger conditions that should select this tool (change, threshold, equals/match, contains) and routes the agent to the three sibling tools for cancel, inspect and enumerate. When-to-use and alternatives are both stated outright.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Text to type into the field | |
| client | Yes | Allowlisted client label. Validated against the shared v0.9.36 server/extension allowlist (see mcp/src/tools/visual-session.ts -- MCP_VISUAL_CLIENT_LABELS). Required. | |
| tab_id | No | Optional. Tab id this action targets. Omit when the calling agent owns exactly one tab; pass to disambiguate when the agent owns multiple. Single-tab agents and legacy popup/sidepanel/autopilot do not need to pass this. | |
| is_final | No | When true, the visual session clears immediately after this tool resolves. Optional (default false). | |
| selector | Yes | CSS selector or element ref for the input field (e.g., "#email", "input[name=search]", or "e12" from get_dom_snapshot) | |
| clear_first | No | Replace existing text (default true for normal fields, false for Google Docs document editing). False appends to normal fields or inserts at the Docs cursor. | |
| visual_reason | Yes | Short human-readable reason shown in the overlay (for example, "Logging in to GitHub"). Required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does substantial work: it discloses default replace-vs-append semantics per field type, the Google Docs cursor-insertion default, tab ownership rules with an explicit TAB_NOT_OWNED rejection, a configurable tab cap (1-64, default 8), and the shape/truncation behavior of the change_report. It does not cover permission/auth requirements beyond the client allowlist, or whether real keyboard/input events are synthesized — a real gap for a typing tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose and the highest-risk behavioral nuance (clear_first/Docs), then supporting detail. Slightly repetitive — clear_first is explained in both the prose and the schema, and the change_report paragraph is long — but every block carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by describing what comes back (rendered text plus change_report with its fields and truncation flag). Combined with the multi-agent tab rules and the related-tool list, it is nearly complete for a 7-parameter tool; only permissions/event-firing questions remain open.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The prose largely restates clear_first behavior already documented in the schema, adding only the Docs-vs-normal-field framing; no additional syntax or format detail for selector, client, or tab_id beyond what the schema states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a concrete verb+resource+mechanism: 'Type text into an editable field by selector'. It is clear what the tool does and names related tools. However, it never distinguishes itself from the sibling 'insert_text', which sounds like it addresses the same job, so sibling differentiation is incomplete.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains the operational distinction between normal fields (replace by default) and Google Docs (insert at cursor, set clear_first=true to replace), which implies when each mode applies. But it gives no explicit when-to-use/when-not-to-use guidance relative to alternatives like insert_text, click + press_key, or clear_input — those appear only as a bare 'Related:' list with no conditions attached.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| client | Yes | Allowlisted client label. Validated against the shared v0.9.36 server/extension allowlist (see mcp/src/tools/visual-session.ts -- MCP_VISUAL_CLIENT_LABELS). Required. | |
| tab_id | No | Optional. Tab id this action targets. Omit when the calling agent owns exactly one tab; pass to disambiguate when the agent owns multiple. Single-tab agents and legacy popup/sidepanel/autopilot do not need to pass this. | |
| is_final | No | When true, the visual session clears immediately after this tool resolves. Optional (default false). | |
| selector | Yes | CSS selector for the <input type="file"> element, or a container/dropzone that holds a hidden one (e.g. "#avatar", "input[type=file]", ".dropzone") | |
| file_path | Yes | Absolute path to the file on disk (e.g. "/Users/me/Documents/resume.pdf"). Relative or ~ paths are rejected; the file must be readable by the browser. | |
| visual_reason | Yes | Short human-readable reason shown in the overlay (for example, "Logging in to GitHub"). Required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so extensively: mechanism (DOM.setFileInputFiles via DevTools), native event firing, a sensitive-path denylist (~/.ssh, ~/.aws, .env, vault), mandatory audit logging, multi-agent tab ownership with TAB_NOT_OWNED, and a configurable cap (default 8, 1-64).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and the ordering (purpose → mechanism → when-to-use → security → related → returns) is logical, though the multi-agent and change_report passages make it noticeably long. Most sentences earn their place given the complexity, but it edges toward over-long.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description takes responsibility for explaining the return (change_report fields, truncation behavior with change_report_hint). Combined with security, tab, and fallback guidance, nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description reinforces the critical constraint that the path must be ABSOLUTE and that the selector may target a container/dropzone wrapping a hidden input — nuances that matter at call time even though the schema states them.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Upload a real file from a local disk path to a file input on the page') and immediately distinguishes itself from the sibling drop_file. An agent can tell upload_file apart from drop_file without reading either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('any web form upload where the file already exists on disk') and when-not ('For pure drag-only dropzones with no underlying file input, fall back to drop_file'), naming the alternative. Also notes it should be preferred over drop_file whenever the path is known.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | No | Optional. Tab id this action targets. Omit when the calling agent owns exactly one tab; pass to disambiguate when the agent owns multiple. | |
| payment_method_id | Yes | ID of the payment method to use (from list_payment_methods) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden and does so well: it discloses the confirmation prompt with card brand/last 4/merchant domain before filling, that the fill domain comes from the resolved tab URL rather than the request, the dual unlock prerequisite, and the TAB_NOT_OWNED cross-agent rejection.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with the action and confirmation behavior, then prerequisites and multi-agent routing. No filler, though the multi-agent clause is fairly dense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers prerequisites, confirmation step, security derivation, and error behavior for a no-output-schema tool. Leaves slightly unclear what the tool returns on success or whether the form is submitted versus only filled.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the description's tab_id guidance essentially restates the schema's own 'omit when exactly one tab, pass to disambiguate' wording. No parameter detail is added beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Fill checkout form on the active tab with a saved payment method.' This is clearly distinguishable from list_payment_methods and fill_credential by resource, though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear precondition context ('Requires both credential vault and payment access to be unlocked') and a rule for tab_id usage ('Pass tab_id only when this agent owns multiple tabs; auto-resolves otherwise'). No explicit when-not or named alternative, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
72 tool updates
v0.1.0- First observed
back - First observed
capture_screenshot - First observed
check_box - First observed
clear_input - First observed
click - First observed
click_and_hold - First observed
click_at - First observed
close_tab - First observed
complete_task - First observed
double_click - First observed
double_click_at - First observed
drag - First observed
drag_drop - First observed
drag_variable_speed - First observed
drop_file - First observed
end_visual_session - First observed
execute_js - First observed
fail_task - First observed
fill_credential - First observed
fill_sheet - First observed
focus - First observed
get_attribute - First observed
get_dom_snapshot - First observed
get_logs - First observed
get_memory_stats - First observed
get_page_snapshot - First observed
get_session_detail - First observed
get_session_replay - First observed
get_site_guide - First observed
get_task_status - First observed
get_text - First observed
get_trigger_status - First observed
go_back - First observed
go_forward - First observed
hover - First observed
insert_text - First observed
invoke_capability - First observed
list_credentials - First observed
list_payment_methods - First observed
list_sessions - First observed
list_tabs - First observed
list_triggers - First observed
navigate - First observed
open_tab - First observed
partial_task - First observed
press_enter - First observed
press_key - First observed
read_page - First observed
read_sheet - First observed
refresh - First observed
replay_session - First observed
right_click - First observed
run_task - First observed
scroll - First observed
scroll_at - First observed
scroll_to_bottom - First observed
scroll_to_element - First observed
scroll_to_top - First observed
search - First observed
search_capabilities - First observed
search_memory - First observed
select_option - First observed
select_text_range - First observed
set_attribute - First observed
start_visual_session - First observed
stop_task - First observed
stop_trigger - First observed
switch_tab - First observed
trigger - First observed
type_text - First observed
upload_file - First observed
use_payment_method
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.
Related MCP Connectors
Live browser debugging for AI assistants — DOM, console, network via MCP.
Hosted browser for AI agents: screenshots, post-JS DOM, console, WCAG. No install, no API key.
Browser MCP for logged-in tasks. Uses your Chrome — credentials stay local. Zero-token replay.
Official Browserless MCP server: browser automation, scraping, screenshots and PDFs for AI agents.
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.3 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.3 npmISC
- AlicenseNot gradedqualityAmaintenanceA local MCP server that lets AI coding assistants drive the user's own already-signed-in Chrome, so agents can read logged-in pages, click, fill forms, navigate, screenshot, inspect network traffic and storage, and run multi-step browser workflows without a separate headless browser or remote debugging port. All communication stays on the user's machine and agent-opened tabs are grouped so they never steal focus.3 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.3 npmISC