Skip to main content
Glama

Browser Jet Pilot

CI

Proudly announcing!

v1.0.1 — Live & Stable 💅

  • API Key Authentication — secure your HTTP transport with API_KEY and X-API-Key header

  • Constant-time authcrypto.timingSafeEqual keeps the bad actors guessing

  • Full test suite — 127 Vitest tests, zero flakes, CI-green on every push

  • Developer tooling — ESLint, Prettier, Husky, lint-staged all tuned and humming

  • CI/CD pipeline — typecheck → lint → format:check → test across Node 20/22/24

  • Shader control tools — tame those heavy WebGL pages with browser_disable_shaders

  • Bug fixes — SVG/MathML handling, proper browser cleanup, enhanced type safety

The extras that make it ✨

  • browser_disable_shaders — block WebGL, freeze CSS animations, throttle requestAnimationFrame to ~1 FPS. Perfect for those pages that think they're a video game.

  • browser_restore_shaders — bring the sparkle back (WebGL/RAF need a page reload to fully restore, nature of the beast)

Related MCP server: scout-mcp-server

What even is this?

A self-hosted MCP server for browser automation. Connect to your own Chromium via CDP — no subscription, no cloud, no weird per-session pricing. Just your browser, your infra, your rules.

Drop-in alternative to @browserbasehq/mcp. Same MCP protocol, none of the lock-in.

Features

  • Connect to your existing browser via Chrome DevTools Protocol, or launch a fresh one managed by Playwright

  • 19 deterministic tools — no LLM required for basic browser control

  • MCP stdio transport — works with Claude Desktop, Cursor, any MCP client

  • MCP HTTP transport — expose as a service with optional API key auth

  • BrowserAgent — AI-powered autonomous agent (OpenAI, Anthropic, or custom endpoint)

  • BrowserSkill — standardized skill interface for agent frameworks

  • Multi-tab workflows — because one tab is never enough

  • Screenshots — base64 PNG, full-page or single element

  • Comprehensive testing — 127 tests, Vitest, coverage reports

  • Pre-commit hooks — ESLint + Prettier gatekeep every commit

A little notice 🌸

I want you to understand that this repository contains a highly powerful toolset — exceptionally powerful.

It is shared in good faith, with the expectation that you will use these tools responsibly and for educational purposes, without causing harm to others. There are no guardrails, restrictions, or feature flags that would limit or alter their original capabilities.

As the saying goes, a weapon is only as dangerous as the hands that wield it. Power itself is neutral — its consequences are defined entirely by the intent and discipline of the user.

I won't go into detail about what could go wrong or the many ways these tools might be misused. If you found this repository while looking for that, you likely already know what you're doing — and I won't be the one to outline those paths. Instead, below you'll find guidance on how you should use these tools, along with the valuable, practical functionality they were designed to provide.

Keep in mind: these tools possess an extraordinary level of power, and that power is entirely in your hands.

If any damage occurs — whether through data leaks, automated actions, replay mechanisms, or otherwise — responsibility does not lie with the tools or this project. The sole accountable party is you. ¯\_(ツ)_

Quick Start

1. Have a browser running with CDP

# With Xvfb + Chromium:
chromium --no-sandbox --remote-debugging-port=9222 --disable-gpu

# Or point at your existing Chromium (make sure it has --remote-debugging-port=9222)

2. Install & run

npm install
npm run build

# Stdio mode (Claude Desktop, Cursor, etc.)
node dist/index.js

# HTTP mode
node dist/index.js --port 3100

3. Hook it up to Claude Desktop

Drop this into your claude_desktop_config.json:

Platform

Config path

macOS

~/Library/Application Support/Claude/claude_desktop_config.json

Windows

%APPDATA%\Claude\claude_desktop_config.json

Linux

~/.config/Claude/claude_desktop_config.json

{
  "mcpServers": {
    "browser": {
      "command": "node",
      "args": ["/absolute/path/to/dist/index.js"],
      "env": {
        "CDP_URL": "http://localhost:9222"
      }
    }
  }
}

Docs (Mintlify)

Project docs live in docs/ — Mintlify format, cute and functional.

npm install          # includes Mint CLI as dev dependency
npm run docs:validate  # check it builds clean
npm run docs:links     # no dead links allowed
npm run docs:dev       # browse locally

CI/CD

Every push and PR goes through the wringer. The workflow lives at .github/workflows/ci.yml.

npm ci → typecheck → lint → format:check → test

Across Node 20, 22, and 24 — because we don't mess around. (Node 18 was politely asked to leave the party — vitest v4 needs styleText from node:util, which landed in 20.12.0.)

Development

Scripts at your fingertips

Command

What it does

npm run build

Compile TypeScript → dist/

npm run dev

Dev mode with tsx (hot, fast, lovely)

npm start

Run the built server

npm run agent

BrowserAgent CLI

npm run agent:seq

Deterministic tool sequence (no AI)

npm test

Run the full 127-test suite

npm run test:coverage

Tests + coverage report

npm run test:ui

Vitest UI (pretty!)

npm run lint

ESLint check

npm run lint:fix

ESLint auto-fix

npm run format

Prettier — make it pretty

npm run format:check

Prettier — is it pretty?

npm run typecheck

tsc --noEmit type safety check

npm run reliability:check

Full reliability test suite

Pre-commit magic

Husky + lint-staged keep the repo pristine:

  • .ts, .tsx → ESLint + Prettier

  • .json, .md, .yml → Prettier

npm install   # hooks set up automatically via the prepare script ✨

Docker

Compose (the easy way)

docker compose up -d --build
docker compose ps              # should say healthy 💚
curl http://localhost:3100/healthz

What you get:

  • MCP endpoint: http://localhost:3100/mcp

  • Health check: http://localhost:3100/healthz

  • Built-in container healthcheck against /healthz

Quick smoke test:

npm run agent -- --server-url http://localhost:3100/mcp --sequence \
  browser_start "browser_navigate?url=https://example.com" \
  "browser_get_content?selector=body&type=text" browser_end

First build takes a bit — Playwright Chromium binaries install inside the container. Worth the wait.

Full reliability pass (health + lifecycle + extraction + multi-tab, 5x repeat):

npm run reliability:check
# or against a custom endpoint:
npm run reliability:check -- http://localhost:3100/mcp

Teardown

docker compose down

Plain Docker (no Compose)

docker build -t browser-jet-pilot:local .
docker run --rm -p 3100:3100 --shm-size=1g \
  -e PORT=3100 -e HOST=0.0.0.0 -e LAUNCH=true \
  browser-jet-pilot:local

External Chromium (CDP mode)

docker run --rm -p 3100:3100 --shm-size=1g \
  -e PORT=3100 -e HOST=0.0.0.0 -e LAUNCH=false \
  -e CDP_URL=http://host.docker.internal:9222 \
  browser-jet-pilot:local

On Linux where host.docker.internal doesn't resolve:

--add-host=host.docker.internal:host-gateway

Tools

Session

Tool

Description

browser_start

Connect to browser (or launch one). Call this first, always.

browser_end

Close the current session. Bye-bye!

Navigation

Tool

Parameters

Description

browser_navigate

url

Go to a URL

browser_new_tab

url?

Open a new tab

browser_list_tabs

List all open tabs

browser_switch_tab

index

Switch to tab by index

browser_get_info

Current URL, title, viewport

Interaction

Tool

Parameters

Description

browser_click

selector

Click an element

browser_fill

selector, value

Clear and fill an input

browser_type

selector, text, delay?

Type character by character

browser_select

selector, value

Select a dropdown option

browser_hover

selector

Hover over an element

browser_scroll

direction, amount?, selector?

Scroll page or element

Observation

Tool

Parameters

Description

browser_screenshot

fullPage?, selector?

Screenshot (base64 PNG)

browser_get_content

type?, selector?

Extract text or HTML

browser_evaluate

script

Run JavaScript in the page

browser_wait_for

selector, state?, timeout?

Wait for an element

Shader Control

Tool

Parameters

Description

browser_disable_shaders

webgl?, animations?, raf?

Block WebGL, freeze CSS animations, throttle RAF to ~1 FPS. Hit this before navigating to heavy shader pages.

browser_restore_shaders

Remove injected style overrides. WebGL/RAF need a page reload to fully come back — that's just how the browser works.

Configuration

CLI Flags

Flag

Env Var

Default

What it does

--port <n>

PORT

(stdio)

Port for HTTP transport

--host <host>

HOST

localhost

Bind address

--cdp-url <url>

CDP_URL

http://localhost:9222

CDP endpoint

--launch

LAUNCH=true

false

Launch a new browser instead of connecting

--browser-width <n>

BROWSER_WIDTH

1280

Viewport width

--browser-height <n>

BROWSER_HEIGHT

720

Viewport height

Environment

# .env file
CDP_URL=http://localhost:9222
LAUNCH=false
BROWSER_WIDTH=1280
BROWSER_HEIGHT=720
API_KEY=your-secret-api-key  # optional — locks down HTTP transport

API Key Auth 🔐

When running in HTTP mode, you can optionally gate the server behind an API key:

export API_KEY=your-secret-api-key

Then clients include it in the X-API-Key header:

curl -H "X-API-Key: your-secret-api-key" http://localhost:3100/mcp

The server uses crypto.timingSafeEqual for constant-time comparison — no timing attacks on our watch.

Examples

HTTP Transport

node dist/index.js --port 3100 --host 0.0.0.0
# → http://0.0.0.0:3100/mcp
# Connect any MCP client via Streamable HTTP transport

Launch Mode

No browser lying around? Let Playwright handle it:

node dist/index.js --launch --browser-width 1920 --browser-height 1080

How it stacks up to Browserbase MCP

Feature

Browserbase MCP

Browser Jet Pilot

Browser hosting

Browserbase cloud

Your container 💕

Cost

Per-session pricing

Free (your infra)

act (natural language)

Stagehand + LLM

Use deterministic tools or BrowserAgent

observe

Stagehand + LLM

browser_get_content + browser_screenshot

extract

Stagehand + LLM

browser_evaluate + browser_get_content

Screenshot

Via Stagehand

Native browser_screenshot

Tab management

Single page

Multi-tab ✨

Shader control

browser_disable_shaders / browser_restore_shaders

Data residency

Browserbase servers

Your server, your data

Architecture

flowchart LR
  subgraph App["Your Application"]
    BS["BrowserSkill"]
    BA["BrowserAgent (AI)"]
    MC["MCP Client<br/>(Claude Desktop, Cursor, etc.)"]
  end

  BS -->|MCP JSON-RPC| MB["Browser Jet Pilot<br/>(stdio or HTTP)"]
  BA -->|MCP JSON-RPC| MB
  MC -->|MCP JSON-RPC| MB

  MB --> PW["Playwright"]
  PW -->|CDP| CH["Your Chromium / Chrome"]

BrowserAgent (AI-Powered) 🤖

An autonomous agent that hooks into the MCP server and uses an LLM to figure out what tools to call, in what order, to accomplish your natural language task.

CLI

# AI-powered (needs OPENAI_API_KEY or ANTHROPIC_API_KEY)
npm run agent -- --server-url http://localhost:3100/mcp \
  "Go to start.gg and find the latest Tekken 7 tournament"

# Anthropic flavor
npm run agent -- --server-url http://localhost:3100/mcp \
  --ai-provider anthropic --ai-model claude-sonnet-4-20250514 \
  "Navigate to example.com and extract all links"

# Deterministic mode (no AI, straight tool sequence)
npm run agent -- --server-url http://localhost:3100/mcp --sequence \
  browser_start \
  "browser_navigate?url=https://example.com" \
  browser_screenshot \
  browser_end

Programmatic

import { BrowserAgent } from 'browser-jet-pilot/agent'

const agent = new BrowserAgent({
  serverUrl: 'http://localhost:3100/mcp',
  aiProvider: 'openai',
  aiModel: 'gpt-4o',
  // aiApiKey: 'sk-...',  // or set OPENAI_API_KEY
  maxSteps: 20,
})

// AI-powered task
const result = await agent.run(
  'Go to start.gg/tournament/12345 and get the bracket'
)
console.log(result.summary)
console.log(
  `Steps: ${result.steps.length}, Screenshots: ${result.screenshots.length}`
)

// Deterministic sequence
const result2 = await agent.executeSequence([
  { tool: 'browser_start' },
  { tool: 'browser_navigate', args: { url: 'https://example.com' } },
  { tool: 'browser_screenshot' },
])

await agent.disconnect()

Agent Config

Option

Env Var

Default

What it does

serverUrl

MCP server HTTP endpoint

serverCommand

node

MCP server command (stdio)

serverArgs

['./dist/index.js']

MCP server args (stdio)

aiProvider

openai

openai or anthropic

aiModel

gpt-4o

LLM model name

aiApiKey

OPENAI_API_KEY

Your API key

aiBaseUrl

provider default

Custom endpoint

maxSteps

30

Safety limit per task

BrowserSkill (Agent Framework Integration) 🧩

A standardized skill wrapper ready to drop into any agent framework. Comes with quick helper methods and automatic screenshot saving.

Programmatic

import { BrowserSkill } from 'browser-jet-pilot/skill'

const skill = new BrowserSkill({
  serverUrl: 'http://localhost:3100/mcp',
  saveScreenshots: true,
  screenshotDir: './screenshots',
})

await skill.init()

// AI-powered browser task
const result = await skill.execute(
  'Go to start.gg and extract tournament data',
  { workDir: './workspace' }
)
console.log(result.summary) // "Found 3 tournaments..."
console.log(result.files) // ['./screenshots/step-3-1712...png']
console.log(result.metadata) // steps, duration, tool calls

// Quick helpers (deterministic, no AI needed)
const page = await skill.goto('https://example.com')
const content = await skill.read('https://example.com', '#main-content')
const { base64, file } = await skill.capture('https://example.com', true)
const links = await skill.extract(
  'https://example.com',
  'Array.from(document.querySelectorAll("a")).map(a => ({text: a.innerText, href: a.href}))'
)

await skill.destroy()

Skill Interface

interface SkillResult {
  success: boolean
  summary: string
  files: string[] // saved screenshot paths
  data?: any // parsed JSON from last step
  metadata: {
    steps: number
    screenshots: number
    totalDuration: number
    toolCalls: Array<{ tool: string; args: Record<string, unknown> }>
  }
}

Requirements

  • Node.js >= 20.12.0

  • Chromium with --remote-debugging-port=9222 (or launch mode)

  • For Playwright browser launch: npx playwright install chromium

License

MIT

designed, written and coded solely by head and from 💜 for you 0xabadbabe (Sudo Qt — jet'aime)

Available Tools

19 tools
browser_clickC

Click an element on the page identified by a CSS selector.

ParametersJSON Schema
NameRequiredDescriptionDefault
selectorYesCSS selector of the element to click

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description bears full responsibility for behavioral disclosure. It only states 'Click an element' without mentioning what happens after the click, whether scrolling occurs, or how errors (e.g., missing element) are handled.

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, efficient sentence that immediately conveys the tool's purpose. No unnecessary words.

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 simplicity of the tool (one required parameter, no output schema), the description is minimally adequate but omits important context such as prerequisites (e.g., page must be loaded) and behavior when the selector is invalid. It lacks completeness for reliable agent usage.

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 input schema has 100% coverage for the single parameter, but the description merely repeats the schema's description ('CSS selector of the element to click'). It adds no new semantic meaning beyond what the schema already provides.

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 ('Click') and the target ('an element on the page identified by a CSS selector'). It distinguishes the tool from siblings like browser_hover or browser_fill, but does not explicitly differentiate beyond the basic action.

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_hover or browser_select. The description simply states what it does, not when it is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_disable_shadersA

Inject a script that blocks WebGL, throttles requestAnimationFrame, and freezes CSS animations/transitions. Use on heavy shader-rendered pages (Three.js, WebGL dashboards) to make them readable without GPU strain. Call BEFORE navigating to the target page for best results.

ParametersJSON Schema
NameRequiredDescriptionDefault
webglNoBlock WebGL context creation (default: true)
animationsNoFreeze CSS animations and transitions (default: true)
rafNoThrottle requestAnimationFrame to ~1 FPS (default: true)

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Without annotations, the description carries full burden. It clearly states the script injection and three effects (WebGL block, rAF throttle, CSS freeze). It also gives timing advice (call before navigation). However, it does not disclose persistence across pages or side effects on other browser functions.

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 extremely concise with two sentences: the first defines what the tool does, the second provides usage context and timing. No redundant words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (3 boolean params, no output schema), the description covers the essential: what, when, and how. Missing details like return value or error handling are minor. The 'call before navigation' advice is critical and included.

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?

Schema coverage is 100% with each parameter described. The description adds value by specifying the rAF throttle rate as '~1 FPS' and emphasizing the use case, which goes beyond the schema's standard descriptions.

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 injects a script that blocks WebGL, throttles requestAnimationFrame, and freezes CSS animations/transitions. It specifies exact use cases like Three.js and WebGL dashboards, distinguishing it from siblings like browser_restore_shaders.

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 description explicitly advises using the tool on heavy shader-rendered pages and calling before navigation for best results. It does not explicitly mention when not to use or compare to alternatives, but the context is clear and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_endA

Close the current browser session and release resources.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must disclose behavior. It mentions releasing resources but does not specify idempotency, error handling, or consequences of calling multiple times. This is insufficient for a tool that ends a session.

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, front-loading the key action. It is concise but could add more detail 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?

Despite having no parameters, the tool is complex as it ends a session. No output schema and no annotations mean the description should cover return values and side effects. It only states 'release resources', leaving completeness lacking.

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 schema coverage is 100%. The description does not need to add parameter information, and the baseline of 4 is appropriate.

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 uses a specific verb ('Close') and resource ('browser session'), and clearly distinguishes this from sibling tools like browser_start or browser_navigate by stating it ends the session.

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?

It implies use after finishing browsing tasks, but provides no explicit guidance on when to use versus when not to, nor mentions alternatives. The context with sibling tools helps, but description lacks direct usage instructions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_evaluateB

Execute JavaScript code in the browser page. The code runs in the page context. Return a JSON-serializable value.

ParametersJSON Schema
NameRequiredDescriptionDefault
scriptYesJavaScript code to execute. Use arrow function for expressions: () => document.title

TDQS

B3.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 must carry the full burden. It states the code runs in page context but does not disclose potential side effects like DOM modification, navigation, or security implications, which is insufficient for a code execution tool.

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 extremely concise with two short sentences, each adding essential information without any redundant or extraneous content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (1 parameter, no output schema) and the presence of sibling tools with clear roles, the description is largely complete. It specifies the return type as 'JSON-serializable value', though it could mention error behavior.

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?

The input schema already describes the 'script' parameter with instructions for arrow functions, providing 100% coverage. The description adds no further meaning, earning the baseline score.

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 that the tool executes JavaScript code in the browser page and returns a JSON-serializable value, distinguishing it from sibling tools like browser_click or browser_navigate which perform different actions.

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 browser_get_content or browser_fill. It lacks context about when JavaScript evaluation is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_fillA

Clear and fill an input field or textarea. Does not trigger change events; use browser_type for character-by-character input.

ParametersJSON Schema
NameRequiredDescriptionDefault
selectorYesCSS selector of the input field
valueYesThe value to fill in

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It reveals that the tool does not trigger change events, a key behavioral trait. However, it does not mention other behavioral aspects like scroll-into-view, event ordering, or error handling.

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 sentences, front-loaded with purpose, followed by a critical caveat and alternative. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple 2-parameter tool with no output schema, the description covers the essential behavior, key caveat, and sibling relationship. It does not cover edge cases or error states, but is sufficient for basic usage.

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 coverage is 100% with descriptions for both parameters. The description does not add additional meaning beyond what the schema already provides, so baseline score of 3 is appropriate.

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 clears and fills an input field or textarea. It distinguishes this tool from sibling 'browser_type' by noting that it does not trigger change events and suggests the alternative for character-by-character input.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells when to use this tool (for filling fields quickly) and when not to (when change events are needed, use browser_type). This provides clear guidance compared to sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_get_contentB

Extract text content or HTML from the page. Useful for reading what is currently displayed.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNo"text" for visible text, "html" for raw HTML (default: "text")
selectorNoCSS selector to scope extraction (defaults to full page)

TDQS

B3.3/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 fully disclose behavior. It lacks details about read-only nature, error handling (e.g., missing selector), output format, or performance implications. The description is too minimal for a tool with zero annotations.

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 extremely concise at 14 words, with no filler. It wastes no words and clearly communicates the core function.

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 (2 optional params, no output schema), the description hints at the return value (extracted text/HTML) but lacks specifics on format or size limits. It doesn't address edge cases like empty results, which is acceptable for a simple tool, but could be more complete.

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 coverage is 100% with both parameters described in the schema. The description adds no additional meaning beyond what's in the schema. Baseline 3 applies because the schema already does the heavy lifting.

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 verb 'extract' and the resource 'text content or HTML from the page,' making the purpose unambiguous. It does not explicitly distinguish from sibling tools like browser_get_info, but the purpose is well-understood.

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 provides a typical use case ('useful for reading what is currently displayed') but does not explicitly guide when to use this tool versus alternatives like browser_get_info or browser_screenshot. The guidance is implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_get_infoA

Get current page metadata: URL, title, viewport size.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries burden. Describes what is retrieved (metadata) and implies read-only behavior via 'Get'. Does not mention side effects, though none expected. Good but could explicitly state no state change.

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, no wasted words. Every part earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema, but description lists return values (URL, title, viewport size). Tool complexity is low (no params, no nested objects). Complete for its purpose.

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 in schema, so description doesn't need to add param info. Schema coverage is 100% vacuously. Baseline for 0 params is 4.

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 states specific verb 'Get' and resource 'current page metadata', listing exact items: URL, title, viewport size. Clearly distinguishes from siblings like browser_get_content (content) and browser_screenshot (image).

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?

Implied usage for retrieving metadata, but no explicit when-to-use or alternatives. Could mention it's not for page content or screenshots, but it's still clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_hoverB

Hover the mouse over an element.

ParametersJSON Schema
NameRequiredDescriptionDefault
selectorYesCSS selector of the element to hover over

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must disclose behavioral traits. It only states the basic action; missing details on whether it triggers events, waits for animations, or has side effects. This 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, focused sentence with no extraneous words. It is perfectly concise for the simple action it describes.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter tool with no output schema, the description covers the core action. However, it lacks usage guidance relative to the numerous sibling tools, slightly reducing completeness.

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 coverage is 100% with the parameter description already explaining 'CSS selector'. The description adds no new meaning beyond the schema, so baseline score of 3 is appropriate.

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 ('Hover') and the target ('element'). It is unambiguous and specific, effectively distinguishing it as a hover action among browser tools.

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_click or browser_scroll. There is no mention of prerequisites, limitations, 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_list_tabsB

List all open tabs in the current browser session.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.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 bears full responsibility for behavioral disclosure. It only says 'list', which implies a read-only operation, but does not explicitly state that it is non-destructive, has no side effects, or what the output format is. This lack of detail leaves potential side effects ambiguous.

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 of 10 words, with the verb placed first. It is highly concise and front-loaded, containing no unnecessary information.

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?

Despite its simplicity, the description lacks completeness because it does not specify what information is returned (e.g., tab IDs, titles, URLs). Since there is no output schema, the agent must infer the return format, which could lead to incorrect usage when chaining with other browser tools.

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?

The tool has zero parameters, so schema coverage is 100%. Per the rubric, 0 parameters default to a baseline of 4. The description does not need to add parameter information since there are none.

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 'list' and the resource 'all open tabs', making the tool's purpose unambiguous. It distinguishes itself from sibling tools like browser_switch_tab and browser_new_tab by focusing solely on listing existing tabs.

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 when a specific tab index is needed or when to use browser_get_content. It simply states what it does without any contextual usage advice.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_navigateA

Navigate the browser to a URL. Waits for the page to reach domcontentloaded state.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesThe URL to navigate to

TDQS

A3.8/5.0
Behavior3/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 mentions waiting for 'domcontentloaded', which adds behavioral insight beyond just 'navigate'. However, it does not disclose error handling (e.g., invalid URLs), timeout behavior, or whether redirects are followed. These gaps reduce transparency.

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 sentences, 14 words total. The first sentence states the core purpose, the second adds critical behavioral context. No redundant information. Highly efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given one parameter, no output schema, and a clear action, the description covers the essential: what it does and a key wait condition. It is missing details on error handling and timeouts, but for a navigation tool this is acceptable. Almost complete.

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 coverage is 100%: the only parameter 'url' has a description in the schema ('The URL to navigate to'). The tool description does not add further meaning to this parameter (the behavioral note is about the operation, not the parameter). Baseline 3 is appropriate.

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 'Navigate the browser to a URL' - a specific verb and resource. It adds a behavioral detail about waiting for DOMContentLoaded, which helps distinguish it from other browser tools like browser_get_content or browser_click. This is very clear.

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 navigating to a URL in the current tab, but it does not explicitly compare to sibling tools like browser_new_tab (for new tab) or browser_switch_tab (for switching existing tabs). There is no guidance on when to prefer this tool over alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_new_tabB

Open a new browser tab and switch to it.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoURL to navigate to in the new tab

TDQS

B3.2/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 of behavioral disclosure. It only states it opens and switches, but fails to mention what happens if no URL is provided (e.g., opens a blank tab), whether the operation can fail, or any side effects like closing existing tabs. The description is too sparse to inform the agent of behavioral traits.

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 very concise at one sentence, which is appropriate for a simple tool. However, it could be slightly more informative without adding significant length, e.g., by mentioning the optional nature of the URL or the effect of omitting it.

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 optional parameter, no output schema), the description provides the basic functionality but lacks completeness. It omits details like the behavior when url is omitted, whether the tab is focused, and how it relates to sibling tools like browser_switch_tab. With zero annotations, more behavioral context would improve completeness.

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 description coverage is 100% (the 'url' parameter has a description: 'URL to navigate to in the new tab'). The tool description adds no additional meaning beyond the schema, so a baseline score of 3 is appropriate. It does not clarify whether the parameter is optional or required, but the schema implies optional via absence of required array.

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 purpose: 'Open a new browser tab and switch to it.' It specifies the action (open and switch) and the resource (browser tab), effectively distinguishing it from sibling tools like browser_switch_tab (which switches to an existing tab) and browser_navigate (which navigates the current tab).

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. With 18 sibling tools, including browser_switch_tab and browser_navigate, there is no mention of when to choose this over them, nor any indication of prerequisites or conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_restore_shadersA

Restore WebGL, requestAnimationFrame, and CSS animations that were disabled by browser_disable_shaders. Removes the injected style element and restores original browser functions.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It explains the restoration mechanism (removing style, restoring functions) but omits potential issues like calling without prior disable or checking state. Adequate but not exhaustive.

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 sentences, front-loaded with purpose and mechanism, no unnecessary words. Efficient and clear.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple undo tool with no parameters or output schema, the description covers the key aspects: what is restored and how. Could mention return behavior or logging, but overall complete.

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; schema coverage is 100%. The description adds no parameter info, but none is needed. Baseline score of 4 for zero-parameter tools is appropriate.

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 restores WebGL, requestAnimationFrame, and CSS animations that were disabled by a specific sibling tool (browser_disable_shaders). It distinguishes itself by specifying the exact resources and the inverse action.

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 description implies usage should follow browser_disable_shaders, providing clear context. However, it lacks explicit guidance on when not to use or prerequisites, though the sibling pairing makes it evident.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_screenshotA

Take a screenshot of the current page. Returns a base64-encoded PNG image.

ParametersJSON Schema
NameRequiredDescriptionDefault
fullPageNoCapture the full scrollable page (default: false, viewport only)
selectorNoCSS selector of a specific element to screenshot

TDQS

A3.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description must disclose behavioral traits. It mentions returning base64-encoded PNG, but does not state if the operation is read-only, has side effects (e.g., page modification), or any prerequisites. This is insufficient for a tool with no annotations.

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 two sentences with no wasted words, front-loading the verb and resource. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with two optional parameters and no output schema, the description is mostly complete. It covers the basic action and output format. A brief note on default behavior (viewport vs full page) would improve it, but it is adequate.

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?

All parameters are already described in the input schema with full coverage (100%). The description adds no additional meaning beyond the schema, so baseline score of 3 applies.

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 'Take a screenshot of the current page' with a specific verb and resource, and distinguishes from sibling tools (e.g., browser_click, browser_navigate) by specifying the screenshot output format (base64-encoded PNG).

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 guidance on when to use this tool versus alternatives, or when not to use it. The usage is implied by the name and description, but lacks exclusions or context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_scrollB

Scroll the page or a specific element.

ParametersJSON Schema
NameRequiredDescriptionDefault
directionYes"up", "down", "top" (scroll to top), "bottom" (scroll to bottom)
amountNoPixels to scroll (used with "up" or "down", default: 500)
selectorNoCSS selector of element to scroll (defaults to page)

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description bears full responsibility. It adds no behavioral details beyond the basic action, such as smoothness, return value, or side effects. The agent gains little insight into the tool's operation.

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 highly concise (7 words) and front-loaded with the core action. While effective, a slightly richer sentence could add value without sacrificing brevity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple scroll tool with full parameter descriptions in the schema, the description is fairly complete. It covers the main use case, though it could mention that scrolling a specific element requires the selector parameter.

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 description coverage is 100%, so baseline is 3. The description adds no additional parameter meaning beyond what the schema already provides for direction, amount, and selector.

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 'Scroll the page or a specific element' clearly states the verb (scroll), the resource (page or element), and distinguishes from sibling tools like browser_click or browser_navigate. 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?

The description provides no guidance on when to use this tool versus alternatives such as browser_navigate or browser_evaluate. No explicit context 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.

browser_selectB

Select an option in a dropdown element.

ParametersJSON Schema
NameRequiredDescriptionDefault
selectorYesCSS selector of the <select> element
valueYesValue of the option to select

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description must provide behavioral context. It lacks information on side effects, scrolling, waiting, error handling, or any post-selection behavior.

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?

A single, front-loaded sentence with no wasted words. Every word adds value.

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 no output schema, the description omits return value or error behavior. However, for a simple single-purpose tool, the description is minimally adequate.

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 coverage is 100% with both parameters described in the schema. The description adds no additional meaning beyond what the schema already provides, meeting the baseline for high coverage.

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 'Select' and the specific resource 'option in a <select> dropdown element'. It effectively distinguishes this tool from siblings like browser_click or browser_fill.

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, no conditions, prerequisites, or exclusions provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_startA

Connect to the browser (or launch a new one). Must be called before any other browser tool. Reuses existing session if still alive.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses key behavior: connects or launches browser, reuses existing session. No annotations provided, but description covers essential behavioral traits for a simple initialization tool.

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, front-loaded with core action and prerequisite instruction. No unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, no-output-schema tool, the description covers purpose, usage order, and session behavior completely.

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 defined, so description doesn't need to elaborate. Baseline score of 4 applies for zero-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?

Clearly states it connects/launches a browser and must be called first. Distinguishes itself from sibling browser tools by being the initialization step.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Must be called before any other browser tool', providing clear when-to-use guidance. Also mentions session reuse to avoid unnecessary launches.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_switch_tabC

Switch to a different tab by index.

ParametersJSON Schema
NameRequiredDescriptionDefault
indexYesTab index (0-based, as shown by browser_list_tabs)

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 must fully convey behavioral traits. It only states the action without detailing side effects (e.g., does it close current tab? is it reversible?), authorization needs, or constraints (e.g., index must be within range). The only extra info is in the schema parameter description, which notes the index is 0-based and from 'browser_list_tabs', but that is part of the schema, not the main description.

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—a single short sentence. It is front-loaded and wastes no words. However, it may be too minimal for an effective tool description, but for conciseness alone it is efficient. No structural issues.

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 low complexity (single required parameter, no output schema, no nested objects), the description is minimally adequate. It covers the basic action and the parameter is explained in the schema. However, it lacks any mention of preconditions, error states, or complementary tools (e.g., 'use browser_list_tabs to get indices'), which would improve completeness.

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?

The input schema has 100% coverage for its single parameter, with a clear description in the schema. The tool description adds no further meaning beyond what the schema already provides; it merely repeats the concept. Thus, the baseline score of 3 is appropriate as the schema does the heavy lifting.

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 'Switch to a different tab by index' clearly states the action (switch tab) and the required resource (tab by index). It is specific and matches the tool name. However, it does not differentiate from sibling tools like 'browser_new_tab' or 'browser_list_tabs', which are conceptually distinct, but still it conveys the core purpose effectively.

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. It does not mention prerequisites (e.g., browser must be started, tabs must exist), nor does it specify when not to use it. The context is entirely implicit, relying on the user to infer from the name and sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_typeA

Type text character by character into a focused element. Triggers keydown/keyup events. Clicks the element first to focus.

ParametersJSON Schema
NameRequiredDescriptionDefault
selectorYesCSS selector of the element (will be clicked to focus first)
textYesText to type
delayNoDelay in ms between keystrokes (default: 50)

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses key behaviors: character-by-character input, triggering keydown/keyup events, and auto-clicking to focus. This is sufficient for understanding what the tool does, though error handling or special character behavior is not mentioned.

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 that are front-loaded and contain no filler. Every sentence adds necessary information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (3 parameters, no output schema), the description provides enough context about behavior and parameter interactions. Could mention return value or concurrency, but overall adequate.

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 coverage is 100%, so baseline is 3. The description adds nuance (character-by-character, key events, pre-click) beyond schema descriptions but does not significantly enhance understanding of parameters beyond what is already in the schema.

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 types text character by character, triggers keyboard events, and clicks the element first. This distinguishes it from siblings like browser_fill (which likely fills instantly) and browser_click (which just clicks).

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 typing text that requires key events (character-by-character, keydown/keyup) but does not explicitly state when to use or when to avoid this tool nor mention alternatives among siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_wait_forB

Wait for a condition before proceeding. Waits for an element to appear, be visible, or be hidden.

ParametersJSON Schema
NameRequiredDescriptionDefault
selectorYesCSS selector to wait for
stateNo"attached" (in DOM), "visible" (in DOM + visible), "hidden" (hidden or removed). Default: "visible"
timeoutNoMaximum wait time in milliseconds (default: 10000)

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must disclose behavior. It explains the waiting states but omits details like timeout handling (e.g., does it throw an error on timeout?) and return value. This leaves ambiguity.

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 concise sentences with no wasted words. The first sentence is slightly generic, but overall efficient.

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 no output schema and simple functionality, the description is adequate but lacks details on timeout behavior and how this tool fits among siblings (e.g., versus waiting in browser_navigate).

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 coverage is 100% with descriptions for all three parameters, so the description adds little new meaning beyond restating the state options. Baseline score of 3 is appropriate.

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 waits for a condition involving an element to appear, be visible, or be hidden. This differentiates it from sibling tools that perform actions (click, fill, navigate) rather than waiting.

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?

Usage is implied: use this tool when you need to wait for an element to reach a specific state before proceeding. However, there is no explicit guidance on when not to use it or alternatives (e.g., browser_navigate's built-in wait).

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. Dates show when Glama detected each change.

  1. 19 tool updatesv1.0.0
    • First observedbrowser_click
    • First observedbrowser_disable_shaders
    • First observedbrowser_end
    • First observedbrowser_evaluate
    • First observedbrowser_fill
    • First observedbrowser_get_content
    • First observedbrowser_get_info
    • First observedbrowser_hover
    • First observedbrowser_list_tabs
    • First observedbrowser_navigate
    • First observedbrowser_new_tab
    • First observedbrowser_restore_shaders
    • First observedbrowser_screenshot
    • First observedbrowser_scroll
    • First observedbrowser_select
    • First observedbrowser_start
    • First observedbrowser_switch_tab
    • First observedbrowser_type
    • First observedbrowser_wait_for

TDQS

A3.7/5.0
Disambiguation5/5

Each tool targets a distinct action or purpose: clicking, filling, typing, evaluating scripts, managing tabs, etc. The only potential overlap is between 'browser_fill' and 'browser_type', but their descriptions clearly differentiate them (bulk fill vs. character-by-character typing with events). No confusion between tools.

Naming Consistency5/5

All tools follow a consistent 'browser_verb' or 'browser_verb_noun' pattern in snake_case (e.g., browser_click, browser_list_tabs, browser_disable_shaders). No mixing of conventions or verb styles.

Tool Count5/5

With 19 tools, the server covers a wide range of browser automation tasks without being bloated. Each tool serves a clear purpose, from basic navigation and interaction to advanced features like shader control. The count feels appropriate for a comprehensive browser automation MCP server.

Completeness4/5

The tool set covers core browser operations: navigation, clicks, typing, filling, scrolling, select, tab management, screenshots, JavaScript execution, and waiting. Minor gaps exist such as file upload, cookie management, or form submission utilities, but these can often be worked around via JavaScript or clicking. Overall, it's robust for typical use cases.

Maintenance

ActivitySlowing
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    single-binary MCP server that gives AI agents a browser. 66 tools for navigation, form filling, data extraction, screenshots, and DOM diffing — built on pure Chrome DevTools Protocol.
    11
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    MCP server for browser automation with anti-detection. Scout pages, find elements, interact with websites, and monitor network traffic from any AI client that supports the Model Context Protocol.
    21
    1
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    An MCP server that lets AI assistants drive real Chromium browsers — navigate, click, type, read pages, run OCR, and record network traffic. 43 tools, credentials stay local, zero telemetry.
    -

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/0xABADBABE-ops/browser-jet-pilot'

If you have feedback or need assistance with the MCP directory API, please join our Discord server