Browser Jet Pilot
Browser Jet Pilot is a self-hosted MCP server for browser automation, letting you control a Chromium browser via CDP using 19 deterministic tools. Key capabilities include:
Session Management: Connect to an existing browser or launch a new one (
browser_start), and close sessions (browser_end).Navigation: Navigate to URLs, open new tabs, list and switch between tabs, and retrieve page metadata (URL, title, viewport).
User Interaction: Click elements, fill/clear inputs, type text character-by-character, select dropdown options, hover over elements, and scroll pages or specific elements.
Content Extraction & Observation: Capture full-page or element-specific screenshots (base64 PNG), extract visible text or raw HTML, execute arbitrary JavaScript in the page context, and wait for elements to reach specific states (attached, visible, hidden).
Performance Optimization: Disable WebGL, freeze CSS animations, and throttle
requestAnimationFramefor GPU-heavy pages (browser_disable_shaders/browser_restore_shaders).AI Agent Integration: Optionally use an AI-powered agent (BrowserAgent/BrowserSkill) for autonomous, natural language-driven browser control.
Flexible Transport: Expose browser control via MCP stdio or HTTP transport, with optional API key authentication.
Allows using OpenAI's API as the AI backend for the BrowserAgent to perform autonomous browser tasks.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Browser Jet PilotNavigate to news.ycombinator.com and extract the top story titles."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Browser Jet Pilot
Proudly announcing!
v1.0.1 — Live & Stable 💅
API Key Authentication — secure your HTTP transport with
API_KEYandX-API-KeyheaderConstant-time auth —
crypto.timingSafeEqualkeeps the bad actors guessingFull 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_shadersBug fixes — SVG/MathML handling, proper browser cleanup, enhanced type safety
The extras that make it ✨
browser_disable_shaders— block WebGL, freeze CSS animations, throttlerequestAnimationFrameto ~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 31003. Hook it up to Claude Desktop
Drop this into your claude_desktop_config.json:
Platform | Config path |
macOS |
|
Windows |
|
Linux |
|
{
"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 locallyCI/CD
Every push and PR goes through the wringer. The workflow lives at .github/workflows/ci.yml.
npm ci → typecheck → lint → format:check → testAcross 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 |
| Compile TypeScript → |
| Dev mode with |
| Run the built server |
| BrowserAgent CLI |
| Deterministic tool sequence (no AI) |
| Run the full 127-test suite |
| Tests + coverage report |
| Vitest UI (pretty!) |
| ESLint check |
| ESLint auto-fix |
| Prettier — make it pretty |
| Prettier — is it pretty? |
|
|
| 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/healthzWhat you get:
MCP endpoint:
http://localhost:3100/mcpHealth check:
http://localhost:3100/healthzBuilt-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_endFirst 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/mcpTeardown
docker compose downPlain 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:localExternal 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:localOn Linux where host.docker.internal doesn't resolve:
--add-host=host.docker.internal:host-gatewayTools
Session
Tool | Description |
| Connect to browser (or launch one). Call this first, always. |
| Close the current session. Bye-bye! |
Navigation
Tool | Parameters | Description |
|
| Go to a URL |
|
| Open a new tab |
| — | List all open tabs |
|
| Switch to tab by index |
| — | Current URL, title, viewport |
Interaction
Tool | Parameters | Description |
|
| Click an element |
|
| Clear and fill an input |
|
| Type character by character |
|
| Select a dropdown option |
|
| Hover over an element |
|
| Scroll page or element |
Observation
Tool | Parameters | Description |
|
| Screenshot (base64 PNG) |
|
| Extract text or HTML |
|
| Run JavaScript in the page |
|
| Wait for an element |
Shader Control
Tool | Parameters | Description |
|
| Block WebGL, freeze CSS animations, throttle RAF to ~1 FPS. Hit this before navigating to heavy shader pages. |
| — | 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 |
|
| (stdio) | Port for HTTP transport |
|
|
| Bind address |
|
|
| CDP endpoint |
|
|
| Launch a new browser instead of connecting |
|
|
| Viewport width |
|
|
| 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 transportAPI Key Auth 🔐
When running in HTTP mode, you can optionally gate the server behind an API key:
export API_KEY=your-secret-api-keyThen clients include it in the X-API-Key header:
curl -H "X-API-Key: your-secret-api-key" http://localhost:3100/mcpThe 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 transportLaunch Mode
No browser lying around? Let Playwright handle it:
node dist/index.js --launch --browser-width 1920 --browser-height 1080How 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) |
| Stagehand + LLM | Use deterministic tools or BrowserAgent |
| Stagehand + LLM |
|
| Stagehand + LLM |
|
Screenshot | Via Stagehand | Native |
Tab management | Single page | Multi-tab ✨ |
Shader control | ❌ |
|
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_endProgrammatic
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 |
| — | — | MCP server HTTP endpoint |
| — |
| MCP server command (stdio) |
| — |
| MCP server args (stdio) |
| — |
|
|
| — |
| LLM model name |
|
| — | Your API key |
| — | provider default | Custom endpoint |
| — |
| 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 toolsbrowser_clickC
Click an element on the page identified by a CSS selector.
| Name | Required | Description | Default |
|---|---|---|---|
| selector | Yes | CSS selector of the element to click |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| webgl | No | Block WebGL context creation (default: true) | |
| animations | No | Freeze CSS animations and transitions (default: true) | |
| raf | No | Throttle requestAnimationFrame to ~1 FPS (default: true) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| script | Yes | JavaScript code to execute. Use arrow function for expressions: () => document.title |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden. It states the 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| selector | Yes | CSS selector of the input field | |
| value | Yes | The value to fill in |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | "text" for visible text, "html" for raw HTML (default: "text") | |
| selector | No | CSS selector to scope extraction (defaults to full page) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| selector | Yes | CSS selector of the element to hover over |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description 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.
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.
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.
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.
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.
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_new_tabB
Open a new browser tab and switch to it.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | URL to navigate to in the new tab |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| fullPage | No | Capture the full scrollable page (default: false, viewport only) | |
| selector | No | CSS selector of a specific element to screenshot |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| direction | Yes | "up", "down", "top" (scroll to top), "bottom" (scroll to bottom) | |
| amount | No | Pixels to scroll (used with "up" or "down", default: 500) | |
| selector | No | CSS selector of element to scroll (defaults to page) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| selector | Yes | CSS selector of the <select> element | |
| value | Yes | Value of the option to select |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| index | Yes | Tab index (0-based, as shown by browser_list_tabs) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| selector | Yes | CSS selector of the element (will be clicked to focus first) | |
| text | Yes | Text to type | |
| delay | No | Delay in ms between keystrokes (default: 50) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| selector | Yes | CSS selector to wait for | |
| state | No | "attached" (in DOM), "visible" (in DOM + visible), "hidden" (hidden or removed). Default: "visible" | |
| timeout | No | Maximum wait time in milliseconds (default: 10000) |
TDQS
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.
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.
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.
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.
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.
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.
19 tool updates
v1.0.0- First observed
browser_click - First observed
browser_disable_shaders - First observed
browser_end - First observed
browser_evaluate - First observed
browser_fill - First observed
browser_get_content - First observed
browser_get_info - First observed
browser_hover - First observed
browser_list_tabs - First observed
browser_navigate - First observed
browser_new_tab - First observed
browser_restore_shaders - First observed
browser_screenshot - First observed
browser_scroll - First observed
browser_select - First observed
browser_start - First observed
browser_switch_tab - First observed
browser_type - First observed
browser_wait_for
TDQS
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.
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.
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.
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
Related MCP Connectors
Live browser debugging for AI assistants — DOM, console, network via MCP.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
MCP server for Mint — AI-powered QA that runs your app in a real browser on every PR.
Stealth web automation for AI agents. Login, signup, navigate, screenshot.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenancesingle-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.11MIT
- AlicenseAqualityBmaintenanceMCP 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.211MIT
- FlicenseNot gradedqualityBmaintenanceMCP server that enables AI agents to automate browser testing via Chromium, providing tools for navigation, interaction, and inspection.-
- FlicenseNot gradedqualityBmaintenanceAn 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
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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