Skip to main content
Glama
Mhrnqaruni

MCP Playwright Browser

by Mhrnqaruni

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.snapshot on 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, browser.list_pages, browser.select_page

Dumb form filling

browser.form_audit + browser.fill_form + Google Forms specialist tools

Shadow DOM / obfuscated IDs

A11y tree via CDP Accessibility.getFullAXTree with stable ax- UIDs

Session loss

Cookie export/import, browser.export_storage_state / browser.import_storage_state

No safety

Path allowlist in src/security/paths.js, MCP_ALLOW_EVALUATE guard

Monolithic

10 focused modules in src/browser/ + src/security/ + 18-test suite


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

form_audit + fill_form + Google Forms specialist

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

files.read_text, files.read_pdf_text

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 .bat launchers

7 .bat launchers

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 / Chromium

The 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:

  1. Measure response size in bytes

  2. If under 280KB → send as-is

  3. If over → progressively truncate: arrays shrink, strings truncate, fields drop

  4. Always include retryWith hints telling Gemini exactly what parameters to reduce next time

  5. Absolute 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-chrome

Installation

Prerequisites

  • Node.js 18+

  • npm

  • Gemini CLI: npm install -g @google/gemini-cli then gemini auth login

  • Google Chrome (for CDP and chrome-profile modes)

Setup

1. Install dependencies

npm install
npx playwright install chromium

2. 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 closed

4. 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

run-dom-headless.bat

Chromium

Headless

⚡ Bulk scraping, fastest

run-visual-headful.bat

Chromium

Visible + Screenshots

Debugging, visual verification

run-chrome-profile.bat

Real Chrome

Your profile

Logged-in sessions, form filling

run-cdp-profile.bat

Real Chrome

CDP

Maximum stealth

run-cdp-profile-screen.bat

Real Chrome

CDP + Visual

CDP with screenshot analysis

run-cdp-profile-persist.bat

Real Chrome

CDP + Persistent

Long sessions, multi-step flows

run-cdp-profile-screen-persist.bat

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.log

Logs 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-chrome to free profile before starting

  • Best 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

browser.set_capture_profile

Set light / balanced / full profile. Controls token usage across all tools. Call this first.

browser.get_capture_profile

Show current profile settings and payload budget.

Browser Lifecycle

Tool

Description

browser.launch

Launch Chromium with options: headless, stealth, userDataDir, profileDirectory, channel, slowMo, args

browser.launch_chrome_cdp

Launch real Chrome with remote debugging + connect in one step

browser.connect_cdp

Connect to existing Chrome with --remote-debugging-port

browser.close

Close browser session

browser.reload

Reload current page

Multi-Tab Management

Tool

Description

browser.new_page

Open new tab, tracked by page manager

browser.list_pages

List all open tabs with pageId, url, title, active/closed state

browser.select_page

Switch active tab by pageId

browser.close_page

Close a specific tab by pageId

browser.list_frames

List all iframes on the current page

Navigation

Tool

Description

browser.goto

Navigate to URL with configurable waitUntil and timeout

browser.back

Go back in history

browser.forward

Go forward in history

browser.wait

Wait for selector or fixed ms

browser.wait_for

Smart wait: selector, text, or uid (A11y)

Event & Dialog Handling

Tool

Description

browser.list_dialogs

List pending JS dialogs (alert, confirm, prompt)

browser.handle_dialog

Accept or dismiss a dialog, optionally with input text

browser.wait_for_download

Block until a download starts, returns downloadId

browser.save_download

Save a captured download to a specific path

browser.wait_for_popup

Wait for a new tab/popup to open, returns its pageId

browser.expect_event

Listen for a one-time event: dialog, download, navigation, request, response

Tool

Description

browser.get_cookies

List cookies, optionally filtered by URL

browser.set_cookies

Inject cookies into browser session

browser.clear_cookies

Clear all or URL-specific cookies

browser.export_storage_state

Export full session state (cookies + localStorage) to JSON file

browser.import_storage_state

Restore session from previously exported JSON

Scroll Control

Tool

Description

browser.get_scroll_state

Returns scrollY, scrollHeight, atTop, atBottom, viewport info

browser.scroll_by

Scroll page by delta pixels (vertical + horizontal)

browser.scroll_to

Scroll to absolute position

browser.get_scrollables

Detect all scrollable containers on the page

browser.get_container_scroll_state

Scroll metrics for a specific container selector

browser.scroll_container

Scroll a specific container by selector

Page Reading & Snapshots

Tool

Description

browser.snapshot

Plain text page summary: title, text, links, optional headings + forms summary

browser.take_snapshot

A11y tree via CDP: roles, names, UIDs (ax-{nodeId}), depth, state

browser.query_dom

Flexible selector query: text, value, bbox, visibility, state, tagName

browser.evaluate

Execute JavaScript (requires MCP_ALLOW_EVALUATE=true, origin-gated)

Element Interaction

Tool

Description

browser.list

List visible interactive elements with elementId, tag, text, href

browser.click

Click by elementId, uid, selector, or text

browser.hover

Hover over element (triggers dropdown menus, tooltips)

browser.type

Simulate keypress-by-keypress typing

browser.fill

Direct value fill (faster, no keypress simulation)

browser.press

Press keyboard key (Enter, Tab, Escape, etc.)

browser.set_input_files

Upload file to input[type=file]

browser.scroll_to_uid

Scroll a UID element into view

Visual Navigation

Tool

Description

browser.screenshot

Save screenshot to path

browser.visual_snapshot

Screenshot + element map with bounding boxes and IDs

browser.click_at

Click at viewport-relative X/Y coordinates

browser.click_at_page

Click at document-absolute X/Y coordinates

Data Extraction

Tool

Description

browser.extract_text

Extract text from CSS selector (single or all matches)

browser.extract_html

Extract outerHTML from selector

Form Automation

Tool

Description

browser.form_audit

Scan page for all unfilled required fields: text, select, radio, checkbox, contenteditable

browser.fill_form

Fill a list of {label, selector, value, kind} fields — label-driven or selector-driven

forms.google_audit

Google Forms specialist: list all questions and check aria-checked for answers

forms.google_set_text

Fill a Google Forms text question by question text

forms.google_set_dropdown

Select option in Google Forms dropdown

forms.google_set_checkbox

Check/uncheck Google Forms checkbox

forms.google_set_radio

Select option in Google Forms radio group

forms.google_set_grid

Select option in Google Forms grid question

Observability

Tool

Description

browser.list_console_messages

Show captured console.log/warn/error from the page

browser.list_network_requests

Show all network requests (URL, method, status, timing)

browser.get_network_request

Get full details for a specific request by ID

File Operations

Tool

Description

files.read_text

Read text file (restricted to allowed paths)

files.read_pdf_text

Extract text from PDF — used to read CV files

files.list_dir

List directory contents

files.write_text

Write text to file (restricted to output/ and logs/)

Specialized Extractors (Production Examples)

Tool

Description

jobs.extract_indeed

Extract Indeed job listings with multi-selector fallbacks, deduplication, access detection

jobs.indeed_next_page

Navigate to next Indeed page (direct URL, click, or auto mode)

search.google

Open Google search and extract results with consent handling

search.extract_google

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 enforcement

Tool 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 AI

This 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 node

  • browser.scroll_to_uid({ uid: "ax-123" }) — scrolls it into view first

  • browser.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 summary

The 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 fallback

In 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 retryWith field: { 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-chrome

In 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.bat

In 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.bat

In 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.bat

In 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

MCP_HEADLESS

GEMINI_CLI_MCP_HEADLESS

true/false — run without GUI

MCP_STEALTH

GEMINI_CLI_MCP_STEALTH

true/false — enable anti-detection

MCP_CHANNEL

GEMINI_CLI_MCP_CHANNEL

chrome — use real Chrome

MCP_EXECUTABLE_PATH

GEMINI_CLI_MCP_EXECUTABLE_PATH

Absolute path to chrome.exe

MCP_USER_DATA_DIR

GEMINI_CLI_MCP_USER_DATA_DIR

Chrome profile directory

MCP_PROFILE

GEMINI_CLI_MCP_PROFILE

Profile name: Default, Profile 3

MCP_CDP_ENDPOINT

GEMINI_CLI_MCP_CDP_ENDPOINT

CDP URL: http://127.0.0.1:9222

MCP_CDP_PORT

GEMINI_CLI_MCP_CDP_PORT

CDP port number (default 9222)

MCP_CDP_AUTO_CLOSE

GEMINI_CLI_MCP_CDP_AUTO_CLOSE

Close Chrome on server exit

MCP_FORCE_CDP

GEMINI_CLI_MCP_FORCE_CDP

Disable browser.launch (CDP-only mode)

MCP_REQUIRE_PROFILE

GEMINI_CLI_MCP_REQUIRE_PROFILE

Require userDataDir (prevent bare Chromium)

MCP_ALLOW_EVALUATE

GEMINI_CLI_MCP_ALLOW_EVALUATE

Enable browser.evaluate tool

MCP_EVALUATE_ALLOW_ORIGINS

GEMINI_CLI_MCP_EVALUATE_ALLOW_ORIGINS

Comma-separated allowed origins for evaluate

MCP_CAPTURE_PROFILE

GEMINI_CLI_MCP_CAPTURE_PROFILE

Default profile: light, balanced, full

MCP_MAX_RESPONSE_BYTES

GEMINI_CLI_MCP_MAX_RESPONSE_BYTES

Override 280KB payload ceiling

MCP_SLOWMO_MS

GEMINI_CLI_MCP_SLOWMO_MS

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.md

Running 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:all

Troubleshooting

"Chrome is already running" / Profile locked

# Use --kill-chrome
scripts\run-chrome-profile.bat --kill-chrome

# Or manually
taskkill /F /IM chrome.exe

Chrome 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:

  1. Chrome is fully closed before starting (--kill-chrome)

  2. The launch response shows "persistent": true and your profile path

  3. If not, restart Gemini and verify .bat outputs Using Chrome executable: ...

MCP tools not found in Gemini

  • Run any .bat from any directory — they auto-fix cwd

  • Verify .gemini/settings.json has the correct cwd

  • The scripts/.gemini/settings.json is a fallback if Gemini starts in scripts/

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.bat for bulk operations (no GUI = 3-4x faster)

  • Avoid browser.extract_html — it returns full HTML and wastes tokens

  • Use 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 3

If 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

logs/

✅ Yes

Extracted jobs/data

output/

✅ Yes

Session state exports

output/

✅ Yes

Gemini CLI state

scripts/.gemini/state.json

✅ Yes

.gemini/ config

root .gemini/

✅ 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.txt and website Terms of Service

  • Complying 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 playwright-mcp

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

form_audit + fill_form + Google Forms specialist

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 retryWith hints

  • Multi-tab page manager (list, select, close pages)

  • A11y tree snapshots via CDP with stable ax- UIDs

  • CDP-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-chrome flag

  • One-shot mode with automatic logging

  • GEMINI_CLI_MCP_* environment variable aliases

  • browser.visual_snapshot and browser.click_at

v1.0.0

  • Initial release

  • Basic MCP server with Playwright

  • Indeed + Google extractors

  • DOM and visual navigation


Contributing

  1. Fork the repository

  2. Create a feature branch (git checkout -b feature/your-feature)

  3. Run npm run test:local to verify nothing breaks

  4. Commit (git commit -m 'Add your feature')

  5. Push and open a Pull Request


License

ISC License — see LICENSE file.


Acknowledgments


Support

Available Tools

30 tools
browser.backC

Go back in history.

ParametersJSON Schema
NameRequiredDescriptionDefault
waitUntilNo

TDQS

C2.2/5.0
Behavior1/5

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.

Conciseness3/5

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.

Completeness1/5

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.

Parameters1/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
textNo
selectorNo
elementIdNo

TDQS

C2.7/5.0
Behavior2/5

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.

Conciseness3/5

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.

Completeness2/5

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.

Parameters1/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
xYes
yYes
buttonNo
clickCountNo

TDQS

B3.1/5.0
Behavior2/5

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.

Conciseness3/5

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.

Completeness2/5

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.

Parameters1/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
terminateChromeNo

TDQS

B3.1/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters1/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
endpointNo
slowMoMsNo

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness3/5

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.

Completeness2/5

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.

Parameters1/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
selectorYes

TDQS

C2.7/5.0
Behavior2/5

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.

Conciseness3/5

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.

Completeness2/5

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.

Parameters1/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
allNo
selectorYes

TDQS

C2.7/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
waitUntilNo

TDQS

C2.6/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters1/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
selectorYes

TDQS

C2.8/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo

TDQS

C2.5/5.0
Behavior2/5

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.

Conciseness2/5

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.

Completeness1/5

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.

Parameters1/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYes
timeoutMsNo
waitUntilNo

TDQS

C2.6/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters1/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
argsNo
channelNo
stealthNo
headlessNo
slowMoMsNo
viewportNo
userAgentNo
userDataDirNo
executablePathNo
profileDirectoryNo

TDQS

C2.5/5.0
Behavior2/5

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.

Conciseness2/5

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.

Completeness1/5

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.

Parameters1/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
argsNo
portNo
waitMsNo
stealthNo
headlessNo
slowMoMsNo
autoCloseNo
chromePathNo
userDataDirNo
profileDirectoryNo

TDQS

C2.3/5.0
Behavior2/5

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.

Conciseness2/5

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.

Completeness1/5

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.

Parameters1/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo

TDQS

C2.7/5.0
Behavior2/5

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.

Conciseness3/5

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.

Completeness2/5

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.

Parameters1/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYes
selectorNo
elementIdNo

TDQS

C2.4/5.0
Behavior2/5

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.

Conciseness3/5

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.

Completeness2/5

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.

Parameters1/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
fullPageNo

TDQS

C2.4/5.0
Behavior2/5

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.

Conciseness3/5

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.

Completeness1/5

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.

Parameters1/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dxNo
dyNo

TDQS

C2.6/5.0
Behavior2/5

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.

Conciseness3/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dxNo
dyNo
selectorYes

TDQS

C2.6/5.0
Behavior2/5

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.

Conciseness3/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNo
yNo

TDQS

C2.8/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters1/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
maxCharsNo
maxLinksNo

TDQS

B3.1/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters1/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYes
clearNo
selectorNo
elementIdNo

TDQS

C2.6/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters1/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
limitNo
fullPageNo
saveMapPathNo
interactiveOnlyNo

TDQS

C2.9/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness1/5

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.

Parameters1/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
msNo
selectorNo
timeoutMsNo

TDQS

C2.4/5.0
Behavior2/5

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.

Conciseness3/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose3/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
textYes

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness3/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
saveDirNo

TDQS

C2.6/5.0
Behavior2/5

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.

Conciseness3/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNo

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
saveDirNo

TDQS

C2.3/5.0
Behavior2/5

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.

Conciseness2/5

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.

Completeness1/5

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.

Parameters1/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes
saveDirNo

TDQS

B3.1/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

  1. 30 tool updatesv1.1.0
    • First observedbrowser.back
    • First observedbrowser.click
    • First observedbrowser.click_at
    • First observedbrowser.close
    • First observedbrowser.connect_cdp
    • First observedbrowser.extract_html
    • First observedbrowser.extract_text
    • First observedbrowser.forward
    • First observedbrowser.get_container_scroll_state
    • First observedbrowser.get_scroll_state
    • First observedbrowser.get_scrollables
    • First observedbrowser.goto
    • First observedbrowser.launch
    • First observedbrowser.launch_chrome_cdp
    • First observedbrowser.list
    • First observedbrowser.new_page
    • First observedbrowser.press
    • First observedbrowser.screenshot
    • First observedbrowser.scroll_by
    • First observedbrowser.scroll_container
    • First observedbrowser.scroll_to
    • First observedbrowser.snapshot
    • First observedbrowser.type
    • First observedbrowser.visual_snapshot
    • First observedbrowser.wait
    • First observedfiles.write_text
    • First observedjobs.extract_indeed
    • First observedjobs.indeed_next_page
    • First observedsearch.extract_google
    • First observedsearch.google

TDQS

B3.1/5.0

Scored across 30 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count3/5

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.

Completeness4/5

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

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables 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
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables 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 npm
    1
    Apache 2.0