MCP Playwright Browser
The MCP Playwright Browser Server is a production-grade browser automation server that gives AI assistants full control over a web browser for tasks like web scraping, form filling, job searching, and complex multi-tab workflows.
Browser Control & Navigation
Launch Chromium/Chrome (headless or visible) with stealth/anti-detection modes, or connect via CDP for maximum stealth
Navigate to URLs, go back/forward, reload pages, and wait for selectors or timeouts
Manage multiple tabs: open, list, select, and close pages
Page Interaction
Click, type, fill, hover, and press keys using CSS selectors, visible text, element IDs, Accessibility Tree UIDs, or X/Y coordinates
Upload files and handle Shadow DOM elements via the Accessibility Tree
Page Reading & Data Extraction
Take plain-text snapshots (title, URL, text, links), visual screenshots, or A11y tree snapshots with stable UIDs and element bounding box maps
List interactive elements, extract text/HTML from selectors, and query the DOM
Specialized extractors for Indeed job listings (with pagination) and Google search results (with consent handling)
Scroll Control
Get scroll state for the main page or specific containers, scroll by delta or to absolute positions, and list all scrollable containers
Form Automation
Audit pages for unfilled required fields and intelligently fill forms using label-driven or selector-driven approaches, including Google Forms (dropdowns, checkboxes, radio buttons, grids)
Session Management
Export and import browser storage state (cookies + localStorage) to persist logins across runs
Event Handling
Handle JavaScript dialogs (alert/confirm/prompt), monitor and save file downloads, and wait for pop-up windows
Observability & Debugging
Capture console messages and log network requests for monitoring and debugging
File Operations
Read/write text files (restricted to allowed paths), extract text from PDFs, and list directory contents
Token Efficiency & Security
Configurable Capture Profile System (light/balanced/full) with a hard 280KB payload budget and graceful truncation to minimize token usage
Strict file path allowlist enforcement and optional gating of arbitrary JavaScript execution (
browser.evaluate)
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@MCP Playwright BrowserScrape Indeed for remote Python developer jobs and save the results"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
MCP Playwright Browser Server
A production-grade Model Context Protocol (MCP) server that gives AI assistants full browser control through Playwright — using a hybrid DOM + Accessibility Tree + Visual approach. Built for real-world agentic automation: job applications, web scraping, form filling, and complex multi-tab workflows.
v2.0 is a complete rewrite. The server grew from 680 lines and 23 tools to nearly 5,000 lines and 71 tools, with a modular architecture, token-optimized capture profiles, hard payload budgets, and a full test suite.
Table of Contents
Related MCP server: MCP Macaco Playwright
What's New in v2.0
The Problem v1 Had
v1 was a working proof of concept. It could browse pages and extract jobs. But when used with Gemini CLI for real tasks — filling application forms, navigating multi-tab flows, handling downloads — it hit hard limits:
Token waste: Every tool response dumped everything it found. One
browser.snapshoton a complex page could push 50KB+ into Gemini's context window in a single call, rapidly exhausting the budget.No multi-tab support: If a link opened a new tab (very common in job applications), Gemini was stuck with no way to switch to it.
No form intelligence: Filling a form required manual click-by-click instructions. There was no way to ask "what fields are still empty?" or "fill all required fields."
Brittle DOM-only navigation: Shadow DOM, iframes, and obfuscated element IDs caused failures with no fallback.
No session persistence: Every run started fresh. Logging in again and again wasted time and triggered bot detection.
No safety rails: The AI could write files anywhere on disk, run arbitrary JS, or create its own automation scripts — unguarded.
Monolithic: One 680-line file with no tests.
What v2.0 Solves
Every one of those problems has a specific solution in v2.0:
Problem | v2.0 Solution |
Token waste | Capture Profile System (light/balanced/full) + 280KB hard payload ceiling |
Multi-tab stuck | Page Manager with stable pageIds, |
Dumb form filling |
|
Shadow DOM / obfuscated IDs | A11y tree via CDP |
Session loss | Cookie export/import, |
No safety | Path allowlist in |
Monolithic | 10 focused modules in |
v1 vs v2 Comparison
Dimension | v1.0 | v2.0 |
Total MCP tools | 23 | 71 |
Server size | 680 lines, 1 file | 4,966 lines, 11 modules |
Token efficiency | Uncontrolled dumps | Capture profiles + 280KB hard ceiling |
Multi-tab support | Single tab only | Full page manager (list, select, close) |
Form automation | Manual click-by-click |
|
A11y / Shadow DOM | DOM-only, brittle | CDP Accessibility tree with stable UIDs |
Scroll handling | Saw first viewport only | Scroll awareness + container scrolling |
Session persistence | None | Cookie/storage export-import |
Popup & dialog handling | None | Dialog accept/dismiss, popup pageId capture |
Download management | None | Wait-for-download, save to path |
File reading (CV/PDF) | None |
|
Security | No restrictions | Allowlist-enforced read/write paths |
Observability | None | Console log capture, network request log |
Test coverage | 2 tests | 18 tests |
Profiles | 3 | 5 (+ persistent variants) |
Batch scripts | 5 | 7 |
Error handling | Raw exceptions to AI | Normalized, structured, budgeted |
What stayed the same
Indeed job extractor (production-grade, multi-selector, deduplication)
Google search extractor (consent handling, URL deobfuscation)
Stealth mode (webdriver hiding, user agent spoofing)
CDP connection to real Chrome
Visual snapshot + coordinate-based clicking
How It Works
You / Gemini CLI
│
│ natural language prompt
▼
Gemini CLI ──── loads MCP config ────► playwrightBrowser MCP server
│
┌────────────────┤
│ │
71 MCP Tools Payload Budget
(browser.*) (280KB ceiling)
(forms.*) (capture profiles)
(files.*) (retryWith hints)
(jobs.*)
(search.*)
│
┌─────────┤──────────┐
│ │ │
Playwright CDP API Security
(browser) (A11y, (path
network, allowlist)
clicks)
│
Chrome / ChromiumThe Capture Ladder
Every profile instructs Gemini to try tools in order, cheapest first:
1. browser.snapshot → plain text summary (cheapest, ~6KB in light mode)
2. browser.list → interactive elements (structured, ~8KB)
3. browser.query_dom → targeted selector query (focused, ~10KB)
4. browser.take_snapshot→ A11y tree with UIDs (rich, only when uid-clicking needed)
5. browser.visual_snapshot → screenshot + bbox map (most expensive, last resort)Gemini only escalates to a more expensive tool when the cheaper one doesn't have what it needs. This is the core of why v2.0 uses far fewer tokens than v1.0.
The Payload Budget
Every single tool response passes through enforcePayloadCeiling() before being sent to Gemini:
Measure response size in bytes
If under 280KB → send as-is
If over → progressively truncate: arrays shrink, strings truncate, fields drop
Always include
retryWithhints telling Gemini exactly what parameters to reduce next timeAbsolute floor:
{truncated: true}— Gemini never gets a context-crashing response
Quick Start
# Clone
git clone https://github.com/Mhrnqaruni/mcp-playwright-browser.git
cd mcp-playwright-browser
# Install
npm install
npx playwright install chromium
# Run (interactive mode - chat with Gemini)
scripts\run-dom-headless.bat
# Run (one-shot automation)
scripts\run-dom-headless.bat -p "Go to https://example.com and extract the page title"
# Run with real Chrome (for logged-in sessions)
scripts\run-chrome-profile.bat --kill-chromeInstallation
Prerequisites
Node.js 18+
npm
Gemini CLI:
npm install -g @google/gemini-clithengemini auth loginGoogle Chrome (for CDP and chrome-profile modes)
Setup
1. Install dependencies
npm install
npx playwright install chromium2. Configure the MCP server path
Edit .gemini/settings.json and set cwd to your repo location:
{
"mcpServers": {
"playwrightBrowser": {
"command": "node",
"args": ["src/mcp-browser-server.js"],
"cwd": "C:/path/to/mcp-playwright-browser"
}
}
}3. (Optional) Disable Chrome background apps
Prevents profile locking:
Chrome Settings → Advanced → System →
☐ Continue running background apps when Google Chrome is closed4. Verify
scripts\run-dom-headless.bat -p "Use MCP server playwrightBrowser. Launch browser. Go to https://example.com. Take a snapshot. Close."Profile Launchers
Each .bat file pre-configures everything (browser type, stealth, profile, environment variables) and starts Gemini with the right system instructions. You never need to configure Gemini manually.
Available Profiles
Script | Browser | Mode | Best For |
| Chromium | Headless | ⚡ Bulk scraping, fastest |
| Chromium | Visible + Screenshots | Debugging, visual verification |
| Real Chrome | Your profile | Logged-in sessions, form filling |
| Real Chrome | CDP | Maximum stealth |
| Real Chrome | CDP + Visual | CDP with screenshot analysis |
| Real Chrome | CDP + Persistent | Long sessions, multi-step flows |
| Real Chrome | CDP + Visual + Persistent | Full power mode |
Interactive Mode (Chat)
# Start Gemini and chat with it
scripts\run-chrome-profile.bat --kill-chrome
# Then just type:
# "Fill out the job application at [URL] using my CV"
# "Go to LinkedIn and apply to the first 5 jobs"
# "Extract all AI engineer jobs from Indeed and save them"One-Shot Mode (Automation)
# Run a task and get a log file
scripts\run-dom-headless.bat -p "Your full task here"
# With custom output
scripts\run-dom-headless.bat -p "Extract 50 jobs from Indeed" --output logs\jobs.log
# Chrome profile one-shot
scripts\run-chrome-profile.bat --kill-chrome -p "Submit application at [URL]" --output logs\apply.logLogs are auto-saved to logs/ with timestamps.
Profile Details
run-dom-headless.bat — Fastest
Chromium headless (no GUI)
Best for: bulk extraction, scraping, background tasks
Token usage: lowest (no screenshots)
run-visual-headful.bat — Debugging
Chromium with visible window
Screenshot-based navigation available
Best for: troubleshooting, visual verification
run-chrome-profile.bat — Authenticated Sessions
Real Chrome with your existing logged-in profile
Already signed into Gmail, LinkedIn, job sites
Use
--kill-chrometo free profile before startingBest for: job applications, authenticated scraping
run-cdp-profile.bat — Maximum Stealth
Connects to real Chrome via Chrome DevTools Protocol
Hardest for sites to detect as automation
Best for: sites that block Playwright/Chromium
Auto-closes any existing Chrome using the profile before launch
run-cdp-profile-persist.bat — Long Sessions
CDP mode with persistent browser (doesn't close between tasks)
Best for: multi-step workflows where browser state must survive
All 71 MCP Tools
Capture Profile Control
Tool | Description |
| Set |
| Show current profile settings and payload budget. |
Browser Lifecycle
Tool | Description |
| Launch Chromium with options: headless, stealth, userDataDir, profileDirectory, channel, slowMo, args |
| Launch real Chrome with remote debugging + connect in one step |
| Connect to existing Chrome with |
| Close browser session |
| Reload current page |
Multi-Tab Management
Tool | Description |
| Open new tab, tracked by page manager |
| List all open tabs with pageId, url, title, active/closed state |
| Switch active tab by pageId |
| Close a specific tab by pageId |
| List all iframes on the current page |
Navigation
Tool | Description |
| Navigate to URL with configurable waitUntil and timeout |
| Go back in history |
| Go forward in history |
| Wait for selector or fixed ms |
| Smart wait: selector, text, or uid (A11y) |
Event & Dialog Handling
Tool | Description |
| List pending JS dialogs (alert, confirm, prompt) |
| Accept or dismiss a dialog, optionally with input text |
| Block until a download starts, returns downloadId |
| Save a captured download to a specific path |
| Wait for a new tab/popup to open, returns its pageId |
| Listen for a one-time event: dialog, download, navigation, request, response |
Session & Cookie Management
Tool | Description |
| List cookies, optionally filtered by URL |
| Inject cookies into browser session |
| Clear all or URL-specific cookies |
| Export full session state (cookies + localStorage) to JSON file |
| Restore session from previously exported JSON |
Scroll Control
Tool | Description |
| Returns scrollY, scrollHeight, atTop, atBottom, viewport info |
| Scroll page by delta pixels (vertical + horizontal) |
| Scroll to absolute position |
| Detect all scrollable containers on the page |
| Scroll metrics for a specific container selector |
| Scroll a specific container by selector |
Page Reading & Snapshots
Tool | Description |
| Plain text page summary: title, text, links, optional headings + forms summary |
| A11y tree via CDP: roles, names, UIDs ( |
| Flexible selector query: text, value, bbox, visibility, state, tagName |
| Execute JavaScript (requires |
Element Interaction
Tool | Description |
| List visible interactive elements with elementId, tag, text, href |
| Click by elementId, uid, selector, or text |
| Hover over element (triggers dropdown menus, tooltips) |
| Simulate keypress-by-keypress typing |
| Direct value fill (faster, no keypress simulation) |
| Press keyboard key (Enter, Tab, Escape, etc.) |
| Upload file to input[type=file] |
| Scroll a UID element into view |
Visual Navigation
Tool | Description |
| Save screenshot to path |
| Screenshot + element map with bounding boxes and IDs |
| Click at viewport-relative X/Y coordinates |
| Click at document-absolute X/Y coordinates |
Data Extraction
Tool | Description |
| Extract text from CSS selector (single or all matches) |
| Extract outerHTML from selector |
Form Automation
Tool | Description |
| Scan page for all unfilled required fields: text, select, radio, checkbox, contenteditable |
| Fill a list of |
| Google Forms specialist: list all questions and check |
| Fill a Google Forms text question by question text |
| Select option in Google Forms dropdown |
| Check/uncheck Google Forms checkbox |
| Select option in Google Forms radio group |
| Select option in Google Forms grid question |
Observability
Tool | Description |
| Show captured |
| Show all network requests (URL, method, status, timing) |
| Get full details for a specific request by ID |
File Operations
Tool | Description |
| Read text file (restricted to allowed paths) |
| Extract text from PDF — used to read CV files |
| List directory contents |
| Write text to file (restricted to |
Specialized Extractors (Production Examples)
Tool | Description |
| Extract Indeed job listings with multi-selector fallbacks, deduplication, access detection |
| Navigate to next Indeed page (direct URL, click, or auto mode) |
| Open Google search and extract results with consent handling |
| Extract results from current Google search page |
Architecture
Module Structure
src/
├── mcp-browser-server.js # Main server: tool registration, env config, middleware
├── extractors.js # Indeed + Google specialized extractors
├── browser/
│ ├── pages.js # Multi-tab page manager (stable pageIds)
│ ├── snapshot.js # A11y tree via CDP Accessibility.getFullAXTree
│ ├── capture-profiles.js # light/balanced/full × low/high = 30 preset configs
│ ├── payload-budget.js # Hard 280KB response ceiling with graceful truncation
│ ├── cdp.js # CDP session, click/hover/scroll by backendNodeId
│ ├── dom-version.js # DOM mutation tracking, frame management
│ ├── forms.js # Form audit + intelligent form fill
│ ├── observability.js # Console + network request capture via CDP
│ └── wait.js # Smart wait: selector, text, uid
└── security/
└── paths.js # Read/write path allowlist enforcementTool Registration Middleware
Every tool goes through a wrapper that runs before and after the handler:
AI calls tool
│
▼
assign requestId
│
▼
run handler
│
▼
normalize errors (structured, no stack traces)
│
▼
add envelope (ok, requestId, timestamp, url, domVersion)
│
▼
enforcePayloadCeiling (truncate if > 280KB)
│
▼
send to AIThis means every tool automatically benefits from error safety and payload budgeting without any extra code per tool.
UID System
The A11y snapshot (browser.take_snapshot) assigns every node a stable UID in the format ax-{nodeId}, tied to the CDP backendDOMNodeId. This UID can then be used with:
browser.click({ uid: "ax-123" })— clicks via CDP directly on the backend nodebrowser.scroll_to_uid({ uid: "ax-123" })— scrolls it into view firstbrowser.wait_for({ uid: "ax-123" })— waits until it's visible
CDP-native clicks are more reliable than selector-based clicks because they bypass CSS selector resolution and work even in Shadow DOM.
Token Efficiency: Capture Profiles
This is the most important v2.0 feature for real-world use.
The Problem
AI context windows are finite. Every tool response consumes tokens. A naive implementation that dumps everything on every call quickly exhausts the budget.
The Solution: Three Profiles
Set the profile once at session start, and every subsequent tool call automatically uses appropriate limits:
browser.set_capture_profile({ profile: "light" })Profile | Snapshot chars | List items | A11y nodes | Best For |
light | 6,000–9,000 | 120–180 | 220–320 | Job scraping, bulk tasks |
balanced | 12,000–16,000 | 240–320 | 440–700 | Form filling, research |
full | 20,000 | 500 | 1,200–2,000 | Deep debugging only |
Two Detail Levels Per Profile
Within each profile, tools accept detail: "low" or detail: "high":
browser.snapshot({ detail: "low" }) # minimal, fast
browser.snapshot({ detail: "high" }) # more text, links, headings, form summaryThe Capture Ladder in Practice
The profile system instructions teach Gemini to escalate only when needed:
✅ "I need to find the Apply button"
→ browser.snapshot (low) # did I find it in plain text? usually yes
→ browser.list (low) # still looking? check interactive elements
→ browser.take_snapshot (low) # need uid for reliable click? A11y tree
→ browser.visual_snapshot (low) # shadow DOM / can't find it at all? visual fallbackIn light mode, this entire ladder costs roughly 8x fewer tokens than v1.0's single dump approach.
Hard Payload Budget
Even with capture profiles, some pages are just huge. The payload budget is a safety net:
Default ceiling: 280KB per response
If exceeded: truncate progressively (arrays → strings → object keys)
Include
retryWithfield:{ detail: "low", maxItems: 80, limit: 20 }Gemini reads this and retries with smaller parameters
Absolute fallback:
{ truncated: true, truncationReason: "..." }
The budget is configurable: MCP_MAX_RESPONSE_BYTES=150000 for tighter contexts.
Common Use Cases
Job Application (Chrome Profile)
# Start with your real logged-in Chrome
scripts\run-chrome-profile.bat --kill-chromeIn Gemini:
Set capture profile to light.
Go to [application URL].
Run form_audit to see all required fields.
Fill them using fill_form with my details from Applied Jobs/CODEX/maincv.md.
Before submitting, take a screenshot and ask me to confirm.Bulk Job Scraping (Headless)
scripts\run-dom-headless.bat -p "Use playwrightBrowser. Launch browser headless. Go to https://ae.indeed.com/q-ai-engineer-l-dubai-jobs.html. Extract jobs with jobs.extract_indeed limit 20, save to output/indeed/page-1. Go to next page with jobs.indeed_next_page. Extract again, save to output/indeed/page-2. Close."Session Persistence (Login Once, Reuse)
# First time: login manually and export session
scripts\run-cdp-profile.batIn Gemini:
Go to linkedin.com and wait for me to log in.
After I confirm logged in, run browser.export_storage_state to output/linkedin-session.json.Next time:
Run browser.import_storage_state from output/linkedin-session.json.
Go to linkedin.com — should be logged in already.Google Form Automation
scripts\run-dom-headless.batIn Gemini:
Go to [Google Form URL].
Run forms.google_audit to see all questions.
Fill each question using the appropriate forms.google_set_* tool.
Run forms.google_audit again to verify all answered.
Submit.PDF CV Reading
Gemini can read your CV directly without you pasting it:
Read my CV from Applied Jobs/CODEX/maincv.md using files.read_text.
Or read the PDF version: files.read_pdf_text from Applied Jobs/CODEX/CV.pdf.
Use that information to fill the job application form.Debugging with Visual Mode
scripts\run-visual-headful.batIn Gemini:
Go to [URL].
Take a visual_snapshot and save to output/debug.png.
Tell me what you see and identify any unusual elements.Environment Variables
All variables have dual names for Gemini CLI compatibility. The launchers set both:
Variable | Alias | Description |
|
| true/false — run without GUI |
|
| true/false — enable anti-detection |
|
|
|
|
| Absolute path to chrome.exe |
|
| Chrome profile directory |
|
| Profile name: |
|
| CDP URL: |
|
| CDP port number (default 9222) |
|
| Close Chrome on server exit |
|
| Disable |
|
| Require userDataDir (prevent bare Chromium) |
|
| Enable |
|
| Comma-separated allowed origins for evaluate |
|
| Default profile: |
|
| Override 280KB payload ceiling |
|
| Slow down actions by N ms (debugging) |
Why dual names? Gemini CLI sanitizes environment variables and may strip MCP_* prefixed keys. The GEMINI_CLI_MCP_* variants bypass this filtering. The server reads both and uses whichever is set.
Project Structure
mcp-playwright-browser/
│
├── src/
│ ├── mcp-browser-server.js # Main server (71 tools, middleware, env config)
│ ├── extractors.js # Indeed + Google production extractors
│ ├── browser/
│ │ ├── pages.js # Multi-tab page manager
│ │ ├── snapshot.js # A11y tree (CDP Accessibility API)
│ │ ├── capture-profiles.js # Token budget profiles (light/balanced/full)
│ │ ├── payload-budget.js # Hard response size ceiling
│ │ ├── cdp.js # CDP primitives (click, hover, scroll by nodeId)
│ │ ├── dom-version.js # DOM mutation tracking + frame management
│ │ ├── forms.js # Form audit + intelligent fill
│ │ ├── observability.js # Console + network capture
│ │ └── wait.js # Smart wait (selector, text, uid)
│ ├── security/
│ │ └── paths.js # File read/write path allowlist
│ └── tests/
│ ├── page-manager-test.js
│ ├── security-paths-test.js
│ ├── snapshot-uid-test.js
│ ├── uid-click-fill-test.js
│ ├── elementid-no-stale-test.js
│ ├── wait-for-test.js
│ ├── form-audit-fill-test.js
│ ├── console-network-test.js
│ ├── visual-coords-test.js
│ ├── frame-domversion-test.js
│ ├── cdp-hover-test.js
│ ├── browser-events-test.js
│ ├── storage-state-test.js
│ ├── capture-profiles-test.js
│ ├── payload-budget-test.js
│ ├── google-form-test.js
│ ├── google-test.js
│ └── indeed-test.js
│
├── scripts/
│ ├── run-dom-headless.bat # Fastest: headless Chromium
│ ├── run-visual-headful.bat # Visual: Chromium + screenshots
│ ├── run-chrome-profile.bat # Auth: real Chrome with your profile
│ ├── run-cdp-profile.bat # Stealth: CDP mode
│ ├── run-cdp-profile-screen.bat # Stealth + visual
│ ├── run-cdp-profile-persist.bat # Stealth + persistent session
│ ├── run-cdp-profile-screen-persist.bat # Full power
│ ├── autoconnect.js # CDP auto-connect helper
│ └── .gemini/settings.json # Fallback MCP config
│
├── profiles/
│ ├── dom/
│ │ ├── system.md # Gemini system instructions (DOM mode)
│ │ └── oneshot.md # One-shot variant (closes browser at end)
│ ├── visual/
│ │ ├── system.md
│ │ └── oneshot.md
│ ├── cdp/
│ │ ├── system.md
│ │ ├── oneshot.md
│ │ └── persistent.md
│ └── cdp-visual/
│ ├── system.md
│ ├── oneshot.md
│ └── persistent.md
│
├── .gemini/settings.json # Main MCP config (set your cwd here)
├── GEMINI.md # Project-level Gemini instructions
├── LICENSE # ISC License
└── README.mdRunning Tests
# All tests that don't need network
npm run test:local
# Live network tests (Indeed + Google)
npm run test:remote
# Everything
npm run test:allTroubleshooting
"Chrome is already running" / Profile locked
# Use --kill-chrome
scripts\run-chrome-profile.bat --kill-chrome
# Or manually
taskkill /F /IM chrome.exeChrome 136+ blocks automation on the default User Data directory. Always use a dedicated profile or the ChromeForMCP data dir.
"Gmail says browser is not safe"
You're connected via Chromium, not your real Chrome. Ensure:
Chrome is fully closed before starting (
--kill-chrome)The launch response shows
"persistent": trueand your profile pathIf not, restart Gemini and verify
.batoutputsUsing Chrome executable: ...
MCP tools not found in Gemini
Run any
.batfrom any directory — they auto-fixcwdVerify
.gemini/settings.jsonhas the correctcwdThe
scripts/.gemini/settings.jsonis a fallback if Gemini starts inscripts/
Responses truncated / retryWith hint
This is the payload budget working correctly. Gemini will read the retryWith hint and retry with lower parameters. If it keeps happening, switch to light profile:
browser.set_capture_profile({ profile: "light" })Slow performance
Use
run-dom-headless.batfor bulk operations (no GUI = 3-4x faster)Avoid
browser.extract_html— it returns full HTML and wastes tokensUse
detail: "low"on all tools unless you specifically need more
Browser opens but ignores my profile
Check .bat output for:
Using Chrome executable: C:\Program Files\Google\Chrome\Application\chrome.exe
Using Chrome profile: Profile 3If you see a different profile or "not found", edit the .bat and set MCP_PROFILE explicitly.
Security & Privacy
Path Restrictions
browser.evaluate (arbitrary JS execution) is disabled by default. Enable it only explicitly: MCP_ALLOW_EVALUATE=true
files.read_text and files.write_text are restricted to:
Read:
Applied Jobs/,Auto/output/,Auto/logs/Write:
Auto/output/,Auto/logs/
Any attempt to read or write outside these paths throws immediately. Symlinks are resolved before checking (prevents traversal attacks).
What Is Stored
Data | Location | Git-ignored |
Execution logs |
| ✅ Yes |
Extracted jobs/data |
| ✅ Yes |
Session state exports |
| ✅ Yes |
Gemini CLI state |
| ✅ Yes |
| root | ✅ Yes |
What Is Never Stored
❌ Passwords or credentials
❌ Credit card or payment information
❌ Browser history
❌ Personal documents outside the allowed paths
Ethical Use
This tool is provided for:
Learning browser automation and MCP development
Testing your own web applications
Automating tasks on sites you have permission to access
Legitimate job searching and application workflows
You are responsible for:
Respecting
robots.txtand website Terms of ServiceComplying with data protection regulations (GDPR, CCPA, etc.)
Rate-limiting your requests to avoid service disruption
Not using this to bypass paywalls or access controls without authorization
The authors assume no liability for misuse. Use responsibly.
How This Differs from Microsoft's Official playwright-mcp
Microsoft's playwright-mcp focuses on accessibility-tree based automation for test development in structured environments.
Feature | Microsoft | This project |
Navigation | Accessibility tree | Hybrid: DOM + A11y + Visual |
Philosophy | "Blind" automation (fast, structured) | Human-like automation (robust, adaptive) |
Primary use case | QA testing, defined workflows | Open-web agents, scraping, complex UIs |
Token efficiency | Not optimized | Capture profiles + hard payload budget |
Session persistence | Basic | Cookie/storage export-import |
Form intelligence | Manual |
|
Multi-tab | Basic | Full page manager with stable pageIds |
Setup | Generic | Batteries included (stealth, profiles, launchers) |
Use Microsoft's for: CI/CD test automation, structured accessibility-driven workflows Use this for: Autonomous agents operating on the open web, job application automation, anti-detection scraping
Changelog
v2.0.0 (Current)
Complete architectural rewrite: monolithic → 11 modular files
71 MCP tools (was 23)
Capture profile system (light/balanced/full) for token efficiency
Hard 280KB payload budget with graceful truncation and
retryWithhintsMulti-tab page manager (list, select, close pages)
A11y tree snapshots via CDP with stable
ax-UIDsCDP-native click/hover/scroll by backendDOMNodeId (handles Shadow DOM)
Form audit + intelligent fill + Google Forms specialist (6 tools)
Session export/import (cookie + localStorage persistence)
Popup, dialog, download event handling
Scroll awareness: get state, scroll by delta, scroll containers
Network + console observability via CDP
File reading: text files + PDF extraction
Security: path allowlist enforcement, evaluate guard
18-test suite (was 2)
7 profile launchers (was 5): added persist variants for CDP
GEMINI_CLI_MCP_* dual env var support for Gemini sanitization
v1.1.0
Profile launcher system (.bat files)
Chrome profile integration
--kill-chromeflagOne-shot mode with automatic logging
GEMINI_CLI_MCP_* environment variable aliases
browser.visual_snapshotandbrowser.click_at
v1.0.0
Initial release
Basic MCP server with Playwright
Indeed + Google extractors
DOM and visual navigation
Contributing
Fork the repository
Create a feature branch (
git checkout -b feature/your-feature)Run
npm run test:localto verify nothing breaksCommit (
git commit -m 'Add your feature')Push and open a Pull Request
License
ISC License — see LICENSE file.
Acknowledgments
Playwright — browser automation backbone
Model Context Protocol — AI tool interface
Microsoft playwright-mcp — inspiration for the A11y approach
Support
Issues: GitHub Issues
Discussions: GitHub Discussions
Available Tools
30 toolsbrowser.backC
Go back in history.
| Name | Required | Description | Default |
|---|---|---|---|
| waitUntil | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, and the description lacks any behavioral details. It does not disclose what happens if there is no history (e.g., error, no-op), side effects, or any other behavioral traits beyond the basic 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?
The description is a single short sentence, making it concise but arguably too brief. While it is front-loaded with the core action, it fails to include necessary details about parameters or usage, balancing conciseness and completeness poorly.
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 tool's simplicity and lack of annotations or output schema, the description is incomplete. It does not explain the parameter, behavior in edge cases, or any return values, leaving the agent with insufficient information to use 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?
The only parameter 'waitUntil' is not mentioned in the description, and schema coverage is 0%. The description adds no meaning beyond the schema's existence of the parameter.
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 'Go back in history' clearly states the action (go back) and the resource (history), distinguishing it from siblings like browser.forward. However, it could be more explicit about navigating to the previous page.
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?
No guidance on when to use this tool vs alternatives. It does not mention prerequisites like the existence of history or when browser.forward or browser.goto might be more appropriate, leaving the agent without context for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser.clickC
Click an element by elementId, selector, or text.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | ||
| selector | No | ||
| elementId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, and the description does not disclose behavioral traits like navigation triggers, error handling, or waiting behavior. The simple word 'click' is insufficient for safe invocation.
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 extremely concise (6 words) but at the cost of necessary detail. It is front-loaded but lacks substance, making it minimally acceptable.
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, output schema, and parameter details, the description is far from complete. It does not cover return values, preconditions, or side effects.
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?
With 0% schema description coverage and only parameter names listed, the description adds no semantic value. It fails to explain parameter formats, priority if multiple provided, or what each parameter means in context.
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 clearly states the action is to click an element, and specifies three identification methods (elementId, selector, text). This distinguishes it from similar tools like browser.click_at (click at coordinates) and browser.type (type into element).
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?
No guidance is provided on when to use this tool over alternatives, or under what circumstances to use each parameter. There is no mention of prerequisites such as page load or element visibility.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser.click_atB
Click at specific page coordinates (x, y). Useful for visual workflows.
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | ||
| y | Yes | ||
| button | No | ||
| clickCount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries full burden. It does not disclose side effects, safety, or behavior beyond the basic action, leaving the agent uninformed about potential consequences.
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 extremely concise at one sentence, but it sacrifices necessary details for brevity, making it insufficient for full understanding.
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 tool has 4 parameters and no output schema, the description lacks essential details such as coordinate reference system, return values, and boundary conditions, leaving the tool under-described.
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 0%, and the description adds no information about the parameters (x, y, button, clickCount) beyond the schema definition, failing to clarify coordinate system or allowed values.
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 clearly states the verb 'click' and the resource 'specific page coordinates (x, y)', distinguishing it from sibling tool browser.click which likely clicks on elements.
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 phrase 'Useful for visual workflows' provides context for when to use, but does not explicitly state when not to use or contrast with alternatives like browser.click.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser.closeB
Close the current browser session.
| Name | Required | Description | Default |
|---|---|---|---|
| terminateChrome | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. 'Close' implies the session will be terminated, but no additional details are given about side effects (e.g., whether all pages are closed, if the browser process ends, or if the tool is idempotent).
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 extremely concise (one sentence) with no redundant words. However, it misses the opportunity to briefly explain the parameter, which would improve efficiency.
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 close operation with one optional parameter and no output schema, the description is minimally adequate. However, it lacks context on when to use it (e.g., after finishing browsing or before launching a new session) and does not leverage sibling tool names for disambiguation.
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 input schema includes one boolean parameter ('terminateChrome'), but the description does not explain its purpose or effect. Given 0% schema description coverage, the description should compensate but fails to add any 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 clearly states the action ('Close') and the target ('the current browser session'), which is specific and distinct from sibling tools like browser.launch or browser.goto.
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?
No guidance is provided on when to use this tool versus alternatives (e.g., browser.back or browser.goto), nor are there any prerequisites mentioned (e.g., having an active session).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser.connect_cdpC
Connect to an existing Chrome/Chromium with remote debugging enabled (CDP).
| Name | Required | Description | Default |
|---|---|---|---|
| endpoint | No | ||
| slowMoMs | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden for behavioral disclosure. It only states 'connect', lacking details on authentication, error handling, side effects (e.g., does it open a new page?), return values, or prerequisites beyond remote debugging being enabled.
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 a single short sentence (12 words) with no wasted words, achieving conciseness. However, it sacrifices necessary detail, making it borderline under-specified for a connection tool.
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 tool complexity (CDP connection), no output schema, and no annotations, the description is insufficient. It omits return behavior (e.g., what is returned upon successful connection), prerequisites, and potential errors, leaving the agent underinformed.
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 0%, so the description must compensate. It fails to mention the two parameters 'endpoint' and 'slowMoMs' at all, providing no explanation of their meaning, format, or purpose. The agent is left guessing, especially for the non-obvious 'slowMoMs'.
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 clearly states the verb 'connect' and the resource 'Chrome/Chromium with remote debugging enabled (CDP)'. It effectively distinguishes from sibling tools like 'browser.launch' and 'browser.launch_chrome_cdp', which create new browsers rather than connecting to existing ones.
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 usage when a remote debugging endpoint is available by mentioning 'existing Chrome/Chromium with remote debugging enabled'. However, it does not explicitly state when to use this tool over alternatives, nor does it provide exclusions or when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser.extract_htmlC
Extract outerHTML from a selector.
| Name | Required | Description | Default |
|---|---|---|---|
| selector | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description does not disclose behavior such as what happens if the selector is not found, or any side effects.
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 a single sentence, which is concise, but could benefit from additional details to be more helpful without sacrificing brevity.
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 simple input schema and no output schema, the description is too minimal; it does not explain the return format, error handling, or how to use the extracted HTML.
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 parameter 'selector' has no description in the schema (0% coverage) and the description does not clarify what format the selector should be (e.g., CSS selector, XPath).
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 clearly states the verb 'Extract' and the resource 'outerHTML' with the mechanism 'from a selector'. It distinguishes from sibling tool browser.extract_text which extracts text content.
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?
No guidance is provided on when to use this tool versus alternatives like browser.extract_text, nor any prerequisites or conditions for use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser.extract_textC
Extract text from a selector. Use all=true to get all matches.
| Name | Required | Description | Default |
|---|---|---|---|
| all | No | ||
| selector | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description must fully convey behavior. It lacks details on behavior for multiple matches when all=false, whitespace handling, or possible side effects.
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 short sentences with no fluff, front-loaded with the core action. However, could be slightly longer to include more 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?
Given no output schema and two parameters, the description is incomplete. It does not describe return format, error conditions, or behavior edge cases.
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?
Despite 0% schema coverage, description adds minimal meaning: 'all=true to get all matches' clarifies the boolean parameter, but selector parameter remains unexplained.
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 clearly states the action ('extract text') and the resource ('selector'), distinguishing it from sibling tools like browser.extract_html.
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?
No guidance on when to use this tool versus alternatives like browser.extract_html or browser.snapshot. Does not specify prerequisites or when not to use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser.forwardC
Go forward in history.
| Name | Required | Description | Default |
|---|---|---|---|
| waitUntil | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided. The description does not explain behavior beyond the basic action, such as what happens if no forward history exists or how the 'waitUntil' parameter affects execution.
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 extremely concise with no wasted words. However, it could be structured better to include parameter details without sacrificing brevity.
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 single optional parameter and no output schema, the description should explain the parameter's role and completion behavior. It fails to provide enough context for correct invocation.
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 input schema has one parameter 'waitUntil' with 0% description coverage and no enum. The description does not explain its purpose or valid values, leaving the agent uninformed.
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 'Go forward in history.' clearly states the action and resource, distinguishing from sibling tools like browser.back and browser.goto. It is specific and 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?
No guidance on when to use this tool versus alternatives (e.g., browser.goto). No exclusions or prerequisites mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser.get_container_scroll_stateC
Get scroll metrics for a specific scrollable container.
| Name | Required | Description | Default |
|---|---|---|---|
| selector | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description only states the basic function. It does not disclose potential side effects, error behavior (e.g., invalid selector), or any requirements (e.g., page must have scrollable containers). The behavioral burden is not addressed.
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 a single concise sentence with no unnecessary words. It efficiently conveys the core 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?
Lacking an output schema, the description should explain what metrics are returned (e.g., scroll top, scroll height). It does not. Additionally, no context is provided about prerequisites or usage flow with sibling tools.
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 sole parameter 'selector' lacks any explanation in the schema or description. The description does not define what format the selector expects (e.g., CSS, XPath), leaving ambiguity. With 0% schema description coverage, the tool should compensate but fails to do so.
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 clearly states the action ('Get scroll metrics') and the target ('a specific scrollable container'), distinguishing it from siblings like 'get_scroll_state' (page-level) and 'get_scrollables' (list containers). However, it could be more explicit about the type of metrics returned.
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?
No guidance on when to use this tool versus alternatives like 'get_scroll_state' or 'scroll_container'. The description does not differentiate usage contexts or provide any prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser.get_scrollablesC
List scrollable containers on the page.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description must disclose behavior. It does not explain what constitutes a scrollable container (e.g., overflow property, content size) or whether hidden scrollables are included. For a query tool, more detail is needed.
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 overly brief—only 4 words—and omits critical information. While concise, it sacrifices clarity and completeness.
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, output schema, and parameter descriptions, the tool description is highly incomplete. It does not cover what the returned data looks like, the meaning of 'scrollable', or the effect of the limit parameter.
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 sole parameter 'limit' has no description in the schema, and the tool description does not explain its purpose or default value. With 0% schema coverage, the description fails to compensate.
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 clearly states the tool's action ('List') and resource ('scrollable containers on the page'), distinguishing it from sibling tools like get_scroll_state, get_container_scroll_state, and scroll_by.
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?
No guidance is provided on when to use this tool vs alternatives like get_scroll_state or scroll_container. There is no mention of prerequisites or typical use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser.get_scroll_stateA
Get scroll metrics for the main page (window).
| 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 full burden. It clearly states it's a read operation (get) and non-destructive, but it does not disclose what scroll metrics are returned (e.g., scrollX, scrollY) or the return format. For a simple getter, the behavior is somewhat transparent but lacks completeness.
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 a single sentence with no redundancy. Every word is necessary and contributes to the 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?
Given the tool has no parameters and no output schema, the description is minimal. It adequately conveys the tool's action but does not provide details on the return value's structure, which could aid the agent in using the result. Slightly more detail would improve 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?
There are zero parameters, so schema coverage is 100%. The description does not need to add parameter semantics because none exist. A baseline of 4 is appropriate for no-parameter tools.
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 'Get scroll metrics for the main page (window)' uses a specific verb ('get') and resource ('scroll metrics') and explicitly scopes to the main page, distinguishing it from sibling tools like browser.get_container_scroll_state and browser.get_scrollables.
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 does not explicitly state when or when not to use this tool, nor does it mention alternatives. The usage context is implied by the sibling tool names, but no direct guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser.gotoC
Navigate to a URL.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| timeoutMs | No | ||
| waitUntil | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, and the description does not disclose behavioral traits such as page load wait behavior, error handling, or support for different protocols. For a navigation tool, this is insufficient.
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 a single sentence with no wasted words. It is appropriately concise for a simple action, though it sacrifices parameter details.
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 tool has 3 parameters, no output schema, and no annotations, the description is too minimal. It fails to provide necessary details about parameters, behavior, or usage context.
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 0%, and the description adds no meaning beyond parameter names. The parameters url, timeoutMs, and waitUntil are not explained in the description.
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 'Navigate to a URL' clearly states the tool's action and resource, distinguishing it from sibling navigation tools like browser.back or browser.forward. However, it does not explicitly differentiate from other navigation methods.
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?
No guidance on when to use this tool versus alternatives such as browser.click or browser.type. The description lacks context for usage scenarios like direct URL navigation vs. clicking links.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser.launchC
Launch Chromium with Playwright and open a new page.
| Name | Required | Description | Default |
|---|---|---|---|
| args | No | ||
| channel | No | ||
| stealth | No | ||
| headless | No | ||
| slowMoMs | No | ||
| viewport | No | ||
| userAgent | No | ||
| userDataDir | No | ||
| executablePath | No | ||
| profileDirectory | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, and the description does not disclose side effects like whether it reuses an existing browser instance, what happens to previous pages, or security implications of the executablePath parameter. The agent lacks critical 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?
The description is extremely concise (one sentence) but at the expense of necessary detail. For a tool with 10 parameters, it should provide a bit more structure or hint at common configuration options.
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 complexity (10 parameters, nested viewport, no output schema), the description is grossly inadequate. It does not explain return values, behavior when parameters are omitted, or typical usage patterns.
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?
With 0% schema description coverage and 10 uncommented parameters, the description adds no meaning to the schema. It does not mention any parameters like headless, viewport, or executablePath, leaving the agent guessing about their purpose.
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 clearly states the tool launches Chromium via Playwright and opens a new page. It distinguishes from sibling tools like browser.launch_chrome_cdp (CDP-based) and browser.new_page (which operates on an already launched browser).
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?
No guidance is provided on when to use this tool versus alternatives such as browser.launch_chrome_cdp or browser.connect_cdp. There are no prerequisites or context for use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser.launch_chrome_cdpC
Launch Chrome with remote debugging enabled and connect via CDP.
| Name | Required | Description | Default |
|---|---|---|---|
| args | No | ||
| port | No | ||
| waitMs | No | ||
| stealth | No | ||
| headless | No | ||
| slowMoMs | No | ||
| autoClose | No | ||
| chromePath | No | ||
| userDataDir | No | ||
| profileDirectory | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description should disclose behavioral traits. It only states the basic action but omits details like whether it opens a new instance, default behavior, or permission requirements.
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 excessively terse (one short sentence) and fails to provide necessary details. It is under-specified rather than appropriately concise.
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 10 parameters, no output schema, and no annotations, the description is grossly incomplete. It does not clarify return values, parameter usage, or default behaviors.
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?
With 0% schema description coverage, the description should explain the parameters. However, it does not mention any of the 10 parameters, leaving the agent with only parameter names to infer 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 clearly states it launches Chrome with remote debugging and connects via CDP. However, it does not explicitly differentiate from sibling tools like browser.launch and browser.connect_cdp.
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?
No guidance is provided on when to use this tool versus alternatives such as browser.launch or browser.connect_cdp. The description lacks any context about prerequisites or typical use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser.listC
List visible interactive elements (links, buttons, inputs).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description should disclose behavioral traits. It does not specify whether the list includes disabled elements, whether it scrolls to find elements, or what the response format is. The description is minimal.
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 a single concise sentence, which is efficient, but it omits crucial details about parameters and behavior, making it under-specified.
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 one parameter and no annotations or output schema, the description should at least explain the parameter and the output. It fails to do so, lacking completeness for effective agent invocation.
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 input schema has one parameter (limit) with no description (0% coverage). The description does not mention or explain this parameter, leaving the agent without guidance on its purpose or valid values.
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 clearly states the action (list) and the resource (visible interactive elements like links, buttons, inputs). It distinguishes this tool from siblings such as browser.click (which acts on elements) and browser.extract_html (which extracts full HTML).
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 provides no explicit guidance on when to use this tool versus alternatives, such as browser.snapshot or browser.extract_text. No usage context or exclusions are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser.new_pageA
Open a new page/tab in the current context.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description only says 'in the current context,' which implies an existing browser session. It does not disclose whether the new page opens in a new tab or window, or if the focus shifts to it. Minimal transparency for a simple action, but acceptable.
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?
Single sentence with no extraneous words. Perfectly concise and 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?
Given zero parameters and no output schema, the description is adequate. However, it could mention what the tool returns (e.g., handle to new page) or how the new page is integrated into the browsing context. The sibling tools list is dense, so added context would help.
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?
No parameters exist, so the description adds value by explaining the purpose. Baseline for 0 parameters is 4, and the description is sufficient to understand the tool's function.
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 clearly states it opens a new page/tab in the current context, distinguishing it from siblings like browser.goto (navigate existing page) or browser.close (close tab). The verb 'Open' and resource 'new page/tab' are specific and 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?
No guidance on when to use this tool vs alternatives such as browser.goto or browser.launch. Sibling tools include various navigation and tab management commands, but no explicit when/when-not criteria are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser.pressC
Press a key, optionally focusing selector or elementId.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| selector | No | ||
| elementId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It fails to disclose behavior like whether it triggers keydown/keyup events, if special keys are supported, or how focus changes. The description is too terse.
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 very concise with one sentence. While it's front-loaded, it sacrifices clarity for brevity. It could be improved without adding 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 3 parameters, no annotations, and no output schema, the description is insufficient. It does not explain return values, parameter constraints, or whether selector and elementId are mutually exclusive.
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 0%, and the description adds almost no value: it only mentions 'key' and optional focusing but does not explain valid key values, format, or the relationship between selector and elementId.
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 clearly states it presses a key with optional focusing, distinguishing it from siblings like 'type' which types text. However, it doesn't specify if it's for keyboard events or just key simulation.
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?
No guidance on when to use this tool versus alternatives like 'type', or when to specify selector vs elementId. The description lacks context for appropriate usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser.screenshotC
Save a screenshot to a path.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| fullPage | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description must convey behavior. It only mentions saving to a path, omitting details like default format, overwrite behavior, or synchronization. Minimal 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?
Extremely concise single sentence, but it omits critical information. Conciseness here trades off against completeness, making it only adequate.
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 simple tool but lack of output schema and parameter docs, the description is too sparse. It fails to explain output, side effects, or relationship to similar tools, leaving the agent underinformed.
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 0% and the description adds no explanation for either parameter ('path' or 'fullPage'). The agent cannot infer purpose or accepted values from the description.
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 'Save a screenshot to a path' clearly states the action and resource. It is specific but does not differentiate from sibling tools like browser.snapshot or browser.visual_snapshot, which may have overlapping behavior.
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?
No guidance on when to use this tool versus alternatives (e.g., for full-page vs viewport, or vs snapshot). Missing prerequisites or context of use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser.scroll_byC
Scroll the main page by a delta.
| Name | Required | Description | Default |
|---|---|---|---|
| dx | No | ||
| dy | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description must carry full behavioral transparency. It fails to disclose whether the scroll is relative, what units dx/dy use, behavior at scroll boundaries, or effect on non-main-page elements.
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 a single short sentence, which is concise but lacks structure or front-loading of critical details. It is not verbose but fails to pack information efficiently.
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, output schema, and parameter documentation, the description is insufficient. It does not cover edge cases, units, or differentiation from sibling scroll tools.
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 0%, yet the description adds no clarification on the meaning of dx and dy (e.g., pixels, percentage). The term 'delta' is vague, offering minimal value beyond the parameter names.
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 clearly states the action ('Scroll') and resource ('the main page'). The term 'by a delta' implies relative scrolling, which distinguishes it from absolute scroll tools like 'scroll_to' but does not explicitly differentiate.
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 provides no guidance on when to use this tool versus alternatives such as 'scroll_to' (absolute) or 'scroll_container' (specific element). The agent receives no context for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser.scroll_containerC
Scroll a specific container by selector.
| Name | Required | Description | Default |
|---|---|---|---|
| dx | No | ||
| dy | No | ||
| selector | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It only states the operation (scroll) but does not disclose effects (e.g., whether it mutates the page, requires user interaction, or returns a value). The behavior is underspecified for an action that modifies scroll 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 description is a single short sentence, which is concise but omits critical details about the parameters and behavior. It could be expanded with a brief explanation of dx/dy without becoming verbose.
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 complexity of scrolling operations and multiple sibling tools, the description fails to distinguish this tool's role (e.g., relative vs absolute scrolling). It does not cover return values or effects, leaving the agent underinformed for correct invocation.
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 has 0% description coverage, and the description does not explain the parameters dx and dy. While 'selector' is implied, dx and dy are left to assumption (likely delta scroll amounts). The description adds no value beyond the schema's property names.
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 clearly specifies the action (scroll) and the resource (a specific container) with a selector, which differentiates it from other scroll tools like browser.scroll_by (which likely scrolls by amount without a container target) and browser.get_scroll_state (read-only). However, it lacks details on whether the scrolling is absolute or relative, which would improve clarity.
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 provides no guidance on when to use this tool versus sibling tools like browser.scroll_by or browser.scroll_to. It does not mention prerequisites, alternatives, or conditions for use, leaving the agent without decision context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser.scroll_toC
Scroll the main page to an absolute position.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | ||
| y | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided. Description only states basic action without details on side effects (e.g., smooth vs instant scroll, bounds handling, or rendering waits).
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?
Single sentence is concise and front-loaded with main action. However, it could include important details without much bloat.
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 multiple scroll-related sibling tools and no output schema, the description lacks critical details like coordinate system, units, and behavior when coordinates are out of bounds.
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 has 0% description coverage for parameters. Description does not explain what x and y represent (e.g., pixels, coordinates, origin), leaving the agent to guess.
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?
Description clearly states it scrolls the main page to an absolute position, distinguishing it from relative scroll (browser.scroll_by) and container scroll (browser.scroll_container).
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?
No guidance on when to use this tool versus siblings like scroll_by or scroll_container. No context about prerequisites or use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser.snapshotB
Return a snapshot of the current page (title, url, text, links).
| Name | Required | Description | Default |
|---|---|---|---|
| maxChars | No | ||
| maxLinks | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided. Description only states what is returned, with no mention of side effects, authentication needs, or state changes. For a read-only snapshot tool, the lack of behavioral disclosure is a 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?
Single sentence, front-loaded with key information (what is returned), no unnecessary words. Highly efficient.
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 output schema and parameter documentation, the description is insufficient. The agent needs to know the structure of the returned snapshot and how parameters affect it. Siblings like browser.extract_text have more detailed descriptions.
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 0%; description does not mention the parameters maxChars and maxLinks, leaving their purpose entirely ambiguous. Agent has no guidance on controlling output size.
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?
Description clearly states that the tool returns a snapshot with title, url, text, and links, distinguishing it from browser.screenshot (image) and browser.extract_html (raw HTML).
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?
No explicit when-to-use or when-not-to-use guidance. The description implies usage for structured content, but comparisons with siblings like browser.extract_text or browser.visual_snapshot are not provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser.typeC
Type into an input by selector or cached elementId.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| clear | No | ||
| selector | No | ||
| elementId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, and description does not disclose behavioral traits such as whether it waits for input, validates input, or handles errors. Only states the basic 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?
Extremely concise single sentence. No redundancy. Could benefit from structure (e.g., listing parameters) but not verbose.
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 4 parameters, no output schema, and no annotations, the description is insufficient. It doesn't cover return values, side effects, or prerequisites, making it incomplete for effective use.
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?
With 0% schema description coverage, the description fails to explain parameters like 'clear' or 'text'. It mentions selector/elementId but adds no semantic value beyond the schema types.
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?
Clearly states the action (type) and target (input) with two methods (selector or elementId). Distinguishes from siblings like browser.click and browser.press. Could be more explicit about typing text, but sufficient.
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?
No guidance on when to use this tool vs siblings like browser.press or when not to use it. No context provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser.visual_snapshotC
Take a screenshot and return an element map with bounding boxes for visual navigation.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| limit | No | ||
| fullPage | No | ||
| saveMapPath | No | ||
| interactiveOnly | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries the full burden. It discloses the dual output (screenshot + map) but omits behavioral details like potential performance impact, required page state, or error handling. Basic transparency but not comprehensive.
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 a single sentence, 13 words, and to the point. However, given the lack of parameter info and behavioral context, it may be too concise for effective use.
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 5 undocumented parameters, no output schema, and no annotations, the description fails to provide sufficient context for an agent to use the tool correctly. A minimal description does not compensate for the structured gaps.
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 0%. The description does not explain any of the five parameters (path, limit, fullPage, saveMapPath, interactiveOnly). The agent receives no guidance on parameter usage or semantics.
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 clearly states two specific outputs: a screenshot and an element map with bounding boxes. It distinguishes from siblings like 'browser.screenshot' and 'browser.snapshot' by mentioning both visual and structural data.
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?
No guidance is provided on when to use this tool versus alternatives like 'browser.screenshot' or 'browser.snapshot'. The description does not include when-not-to-use or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser.waitC
Wait for a selector or timeout.
| Name | Required | Description | Default |
|---|---|---|---|
| ms | No | ||
| selector | No | ||
| timeoutMs | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries the burden of behavioral disclosure. It does not specify what happens when both selector and timeout are provided, or what happens if no parameters are given. The return value and error behavior are omitted.
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 very short, which is concise, but it sacrifices necessary detail. It is front-loaded with the core purpose but not informative enough.
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 3 parameters and no output schema, the description is insufficient. It lacks explanation of parameter interactions, success/failure conditions, and typical use cases, making it hard for an agent to invoke 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 0%, meaning no parameter descriptions. The description mentions 'selector' and 'timeout' but does not clarify the role of 'ms' or differentiate between 'ms' and 'timeoutMs'. It adds minimal meaning beyond the parameter names.
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 'Wait for a selector or timeout' conveys the general action of waiting for an element or a duration, but it is vague about what waiting entails (e.g., until element appears, disappears, or a fixed time). It distinguishes from sibling tools like click or goto, but lacks specificity.
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?
No guidance is provided on when to use this tool versus alternatives like using built-in wait options in browser.goto or other timing mechanisms. There is no mention of prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
files.write_textC
Write arbitrary text to a file path.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| text | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits. It does not indicate whether the tool overwrites existing files, creates parent directories, or handles permissions, leaving significant ambiguity.
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 a single sentence, which is concise, but it lacks structural elements like lists or examples. It is not particularly informative, earning an average score.
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 annotations, output schema, and low schema coverage, the description is insufficient. It does not explain return values, error conditions, or side effects, making it incomplete for practical use.
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?
With 0% schema description coverage, the description adds no meaning beyond parameter names. It does not specify that 'path' should be an absolute path or that 'text' is the content to write, missing an opportunity to clarify usage.
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 clearly states the verb 'Write' and the resource 'arbitrary text to a file path'. It is specific and distinguishes from sibling browser and search tools, which are unrelated.
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?
No guidance on when to use this tool vs alternatives. No mention of file permissions, overwrite behavior, or path requirements, which would help an agent decide if this is the right tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jobs.extract_indeedC
Extract jobs from an Indeed search results page. Optionally save each job to a .txt file.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| saveDir | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden. It states the tool extracts jobs and optionally saves to .txt, but lacks details on side effects (e.g., page modification), requirements (e.g., being on Indeed page), or what happens with no results. Insufficient for an agent to predict 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 very short but contains two ideas: extraction and optional saving. It is not overly verbose, but it lacks structure and important details. Could be more concise if it also provided essential context.
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 low schema coverage, no output schema, and no annotations, the description is incomplete. It does not specify the output format, behavior when limit is set, or how the extraction works. The tool seems simple but the description leaves many questions unanswered.
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 0%, so the description should compensate. The 'saveDir' parameter is hinted by 'Optionally save each job to a .txt file', but 'limit' is not explained at all. The description adds minimal meaning 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?
The description uses a specific verb 'Extract' and identifies the resource as 'Indeed search results page', which clearly states the tool's function. However, it does not explicitly differentiate from sibling tools like 'jobs.indeed_next_page', but the purpose is still 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?
No guidance on when to use this tool versus other extraction or job-related tools. The optional saving is mentioned but no context on prerequisites or exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jobs.indeed_next_pageA
Go to the next Indeed results page (direct URL by default, with optional click mode).
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It mentions two modes ('direct URL by default, with optional click mode'), but does not disclose side effects, prerequisites, or behavior when no next page exists. Adequate for a simple navigation tool but could be more transparent.
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 a single sentence that conveys the essential information with no unnecessary words. It is well-structured and easy to read.
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 tool's simplicity (one parameter, no output schema, no annotations), the description covers the basic purpose. However, it lacks details about the return value, behavior on failure, and explicit mode explanations, leaving gaps for an AI agent.
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 has 0% description coverage, and the tool description only briefly mentions 'optional click mode' without explaining the enum values (direct, click, auto). The description does not sufficiently clarify what each mode does or when to use 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?
The description clearly states the tool's function: navigating to the next Indeed results page. It uses a specific verb ('Go to') and resource ('next Indeed results page'), and the context of sibling tools shows it is distinct from generic browser 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?
The description implies usage for pagination within Indeed results but does not explicitly state when to use this tool over alternatives like browser.goto or browser.click. No exclusions or alternative scenarios are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search.extract_googleC
Extract standard Google search results from the current page. Optionally save to .txt files.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| saveDir | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the full burden. It mentions extraction and optional file saving, but fails to disclose whether the operation is read-only, what exact data is extracted, or any side effects beyond saving. Important behavioral traits are 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?
The description is very short (two sentences) but lacks necessary detail like parameter explanations and usage context. It is not appropriately sized for the tool's complexity; it under-specifies rather than being concise.
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 annotations and output schema, plus two undocumented parameters, the description is grossly incomplete. An agent cannot reliably determine how to use this tool correctly without more information.
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 0%, yet the description does not explain the parameters. Only 'saveDir' is implicitly referenced via 'save to .txt files', but 'limit' is completely unexplained. The description adds almost no value 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?
The description clearly states it extracts standard Google search results from the current page, which is specific and actionable. However, it does not differentiate from siblings like browser.extract_text or other extract tools, missing an opportunity to clarify uniqueness.
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 usage on a Google search results page but provides no explicit guidance on when to use this tool versus alternatives, nor any conditions or prerequisites. No exclusions or when-not-to-use information is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search.googleB
Search Google and extract results for a query. Optionally save to .txt files.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| saveDir | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description should disclose behavioral traits. It mentions extraction and optional saving, but does not state whether it is read-only, requires internet, returns raw HTML or text, or any side effects.
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 concise sentences with no unnecessary words. The purpose and optional behavior are front-loaded and clear.
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 3 parameters and no other documentation, the description is minimal and lacks detail on parameter usage and return behavior. It is adequate for a simple search, but not complete given the lack of schema descriptions and annotations.
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 has no parameter descriptions. The description adds meaning for 'query' (implied) and 'saveDir' (saving to .txt files), but does not explain the 'limit' parameter, which is left completely undefined.
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 clearly states it searches Google and extracts results, but does not differentiate from the sibling tool 'search.extract_google' which likely performs a similar function.
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?
No guidance on when to use this tool versus alternatives like search.extract_google or browser tools. The optional save feature is mentioned, but no usage context or prerequisites.
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.
30 tool updates
v1.1.0- First observed
browser.back - First observed
browser.click - First observed
browser.click_at - First observed
browser.close - First observed
browser.connect_cdp - First observed
browser.extract_html - First observed
browser.extract_text - First observed
browser.forward - First observed
browser.get_container_scroll_state - First observed
browser.get_scroll_state - First observed
browser.get_scrollables - First observed
browser.goto - First observed
browser.launch - First observed
browser.launch_chrome_cdp - First observed
browser.list - First observed
browser.new_page - First observed
browser.press - First observed
browser.screenshot - First observed
browser.scroll_by - First observed
browser.scroll_container - First observed
browser.scroll_to - First observed
browser.snapshot - First observed
browser.type - First observed
browser.visual_snapshot - First observed
browser.wait - First observed
files.write_text - First observed
jobs.extract_indeed - First observed
jobs.indeed_next_page - First observed
search.extract_google - First observed
search.google
TDQS
Scored across 30 tools
Each tool has a distinct purpose; even similar tools like scroll_to and scroll_by are differentiated by delta vs absolute positioning. The namespace prefixing (browser, jobs, search) further clarifies intent.
All tools follow a consistent lowercase snake_case pattern, using verb_noun or verb_preposition structures (e.g., extract_html, scroll_to). No mixed conventions or ambiguous abbreviations.
With 30 tools, the server is on the high side for a coherent set. While the browser tools are comprehensive, the inclusion of job and search extraction tools expands the scope beyond core browser automation, making it feel slightly bloated.
The tool set covers essential browser interactions: navigation, clicking, typing, scrolling, extraction, and page management. Minor gaps exist (no network interception, no cookie handling), but for typical automation tasks it is largely complete.
Maintenance
Related MCP Connectors
Stealth web automation for AI agents. Login, signup, navigate, screenshot.
Stealth web automation for AI agents. Login, signup, navigate, screenshot.
Direct access to 60+ scraping and search tools. Extract structured data from Google (Search, Maps, Trends), Amazon, Airbnb, Social Media, and any web page directly into your AI agent.
AI-powered browser automation — navigate, click, fill forms, and extract data from any website.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to automate web browsers through Playwright, providing capabilities for navigation, content extraction, form filling, screenshot capture, and JavaScript execution. Supports multiple browser engines with comprehensive error handling and security features.1-

MCP Macaco Playwrightofficial
AlicenseNot gradedqualityDmaintenanceEnables comprehensive browser automation and web interaction through Playwright with 50+ specialized functions for navigation, form filling, data extraction, and Chrome DevTools Protocol support. Designed specifically for AI agents to perform complex web workflows including scraping, testing, and automated browsing tasks.13 npm1Apache 2.0- FlicenseNot gradedqualityDmaintenanceProvides browser automation capabilities for AI assistants, enabling web navigation, form filling, and data extraction through Playwright.-
- AlicenseAqualityDmaintenanceEnables AI assistants to perform browser automation using Playwright, including navigation, content extraction, screenshot analysis, and custom script execution.510 npmMIT