MCP Browser
Automatically detects and waits for Cloudflare challenges (Turnstile, interstitial) up to 15 seconds for resolution.
Supports web search via DuckDuckGo as an alternative search engine, with automatic fallback when Google blocks.
Performs web searches using Google through the real browser, with stealth to avoid CAPTCHAs.
Launches and connects to a real Google Chrome instance with full browser fingerprint, cookies, and sessions, enabling AI to browse as a normal user.
Rewrites Reddit URLs to old.reddit.com for a scraping-friendly version.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@MCP Browsersearch for latest AI news on Google"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
MCP Browser
Give your AI a real browser.
MCP server that lets AI assistants browse the web through your real Chrome — with your cookies, sessions, and fingerprint. No bot detection. No CAPTCHAs.
Quick Start (30 seconds)
No installation needed. Just add the config to your MCP client:
Claude Desktop
Add to ~/.config/claude/claude_desktop_config.json (Mac/Linux) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"browser": {
"command": "npx",
"args": ["-y", "@wgarrido/mcp-browser"],
"env": {
"CHROME_HEADLESS": "true"
}
}
}
}Claude Code (CLI)
claude mcp add browser -- npx -y @wgarrido/mcp-browserVS Code / Cursor
Add to .vscode/mcp.json in your project:
{
"servers": {
"browser": {
"command": "npx",
"args": ["-y", "@wgarrido/mcp-browser"],
"env": {
"CHROME_HEADLESS": "true"
}
}
}
}That's it. Chrome launches automatically in the background. Start browsing.
Related MCP server: Chrome MCP Server
Why MCP Browser?
Problem | How MCP Browser solves it |
Sites block bots and scrapers | Uses your real Chrome with your real fingerprint |
Cloudflare challenges, CAPTCHAs | Auto-detects and waits for challenges to resolve |
Content behind login | Your cookies and sessions are already there |
Noisy HTML (ads, nav, popups) | Smart DOM cleaning strips everything but content |
Cookie consent banners | Auto-dismissed (40+ selector patterns) |
SPAs with dynamic content | Runs in a real browser — JavaScript executes naturally |
Available Tools (15)
Core
Tool | What it does |
| Load a URL → clean Markdown |
| Extract main article content (Readability) |
| Search Google/DuckDuckGo through the browser |
| PNG screenshot of a page or CSS element |
| Run arbitrary JS in the page context |
| Extract JSON-LD, OpenGraph, meta, tables, headings, links |
| Fetch up to 5 URLs in parallel |
| Get all links from a page (with regex filter) |
| Crawl a site following links (depth/page limits) |
| Check browser connection status |
Persistent Sessions
Keep tabs open across multiple tool calls for multi-step workflows:
Tool | What it does |
| Open a persistent tab → returns |
| Close a tab by |
| Interact: click, type, select, submit, scroll |
| List all open tabs |
| Track page changes over time (start/check/stop) |
Most tools accept an optional
tab_idto reuse a persistent session instead of opening a new page.
Usage Examples
Just talk naturally to your AI:
"Search for the latest Node.js release notes" →
web_search+fetch_page"Read and summarize this article: https://..." →
fetch_readable"Compare pricing on these two pages" →
multi_fetch"Take a screenshot of https://..." →
screenshot"Log into this site, then scrape my dashboard" →
open_tab+click_and_navigate+fetch_page"Extract all /docs/ links from this page" →
extract_links"Crawl this site 2 levels deep" →
crawl"Watch this page for changes every 30 seconds" →
monitor_page
Advanced: Use Your Own Chrome Sessions
By default, MCP Browser launches Chrome in headless mode (background, no window). This is the simplest setup.
If you want to use your existing cookies and logged-in sessions, launch Chrome manually with CDP enabled, then point MCP Browser to it:
Launch Chrome with CDP
Mac:
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \
--remote-debugging-port=9222 --no-first-runLinux:
google-chrome --remote-debugging-port=9222 --no-first-runWindows (PowerShell):
& "C:\Program Files\Google\Chrome\Application\chrome.exe" `
--remote-debugging-port=9222 --no-first-runOr use the included scripts:
./scripts/launch-chrome.sh # Mac/Linux
.\scripts\launch-chrome.ps1 # WindowsImportant: Chrome must be started fresh. If it's already running, the CDP flag is ignored. Quit Chrome first, or use
--user-data-dir="/tmp/chrome-cdp"for a separate profile.
Config without headless
{
"mcpServers": {
"browser": {
"command": "npx",
"args": ["-y", "@wgarrido/mcp-browser"],
"env": {
"CDP_URL": "http://localhost:9222"
}
}
}
}Configuration
All settings are optional. Pass them via env in your MCP config:
Variable | Default | Description |
|
| Auto-launch Chrome in headless mode (recommended) |
| (auto-detect) | Custom path to Chrome/Chromium executable |
|
| Chrome DevTools Protocol endpoint |
|
| Page load timeout in ms |
|
| Max returned content in characters |
|
| Max simultaneous browser tabs |
|
| Enable in-memory page cache |
|
| Cache time-to-live in seconds |
|
|
|
|
|
|
|
| Auto-close inactive tabs after this duration |
|
| JSON map of profile name → CDP URL |
Example with custom settings:
{
"mcpServers": {
"browser": {
"command": "npx",
"args": ["-y", "@wgarrido/mcp-browser"],
"env": {
"CHROME_HEADLESS": "true",
"SEARCH_ENGINE": "duckduckgo",
"DEFAULT_TIMEOUT": "60000",
"MAX_CONTENT_LENGTH": "100000"
}
}
}
}Features
Headless mode — Chrome runs in the background, auto-launched by the server
Anti-bot stealth — Hides
navigator.webdriver, fakes plugins, languages, and permissionsCloudflare handling — Detects Turnstile/interstitial challenges and waits up to 15s for resolution
Cookie banner dismissal — Auto-clicks consent overlays (GDPR, OneTrust, CookieBot, Reddit, 40+ patterns)
Smart DOM cleaning — Strips nav, sidebars, footers, ads, modals, and action links
URL rewriting — Redirects SPAs to scraping-friendly versions (e.g.
reddit.com→old.reddit.com)Google → DuckDuckGo fallback — If Google shows a CAPTCHA, search falls back automatically
Persistent sessions — Keep tabs open for multi-step workflows (login, forms, navigation chains)
LRU cache — Avoids redundant fetches with configurable TTL
Concurrency control — Semaphore limits concurrent tabs to prevent resource exhaustion
Multi-profile support — Connect to multiple Chrome instances via named profiles
Troubleshooting
"Cannot connect to Chrome"
Chrome must be running with --remote-debugging-port=9222, or set CHROME_HEADLESS=true for auto-launch.
"Port 9222 already in use" Another Chrome instance is using CDP. Close it or use a different port:
./scripts/launch-chrome.sh 9333Then set CDP_URL=http://localhost:9333.
"Page timeout"
Increase the timeout: "DEFAULT_TIMEOUT": "60000"
"Empty results from web_search"
Google may show a CAPTCHA. Switch to DuckDuckGo: "SEARCH_ENGINE": "duckduckgo"
"Cloudflare challenge page"
The server auto-waits up to 15s for Cloudflare challenges. If it needs manual verification, use open_tab to create a persistent session, solve it in Chrome, then use the tab_id with other tools.
"MCP error -32000: Connection closed" This can have two causes:
Chrome is not running with CDP enabled — If you're not using
CHROME_HEADLESS=true, make sure Chrome is launched with--remote-debugging-port=9222before starting the server. Verify with:curl http://localhost:9222/json/versionIf this returns an error, Chrome is not listening. See Launch Chrome with CDP.
Corrupted npx cache — If you see
TypeError: Comparator is not a constructorin the logs, the npx cache is corrupted. Clear it and retry:rm -rf ~/.npm/_npx/* # The next npx -y @wgarrido/mcp-browser call will re-download cleanly
Development
git clone https://github.com/wgarrido/mcp-browser.git
cd mcp-browser
npm install
npm run dev # Run with hot reload
npm run build # Build for productionRequirements
Node.js 18+
Google Chrome or Chromium
License
Available Tools
15 toolsbrowser_statusA
Check if the browser connection is active and return status info
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral disclosure burden. It communicates a read-only checking behavior and that status info is returned, but it does not mention error behavior, side effects, or whether the tool can initiate a connection if none exists. The behavior is implied but not fully detailed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no redundant content. It front-loads the action and resource, and every word contributes to understanding the tool's purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless status-check tool, the description is mostly adequate, but with no output schema, 'return status info' leaves the return-value structure ambiguous. It does not specify what fields the agent should expect, such as connection state, browser version, or error details.
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 the schema already fully covers parameter semantics. The description adds meaningful context by clarifying that the result is status info, satisfying the baseline for a parameterless tool.
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 ('Check') and resource ('browser connection') and states the expected result ('return status info'). It clearly identifies a health/status operation and is distinct from sibling tools that manipulate tabs, fetch pages, or run scripts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool—when needing to verify the browser connection—but it does not explicitly state when to prefer it over alternatives or mention whether it should be called before other browser operations. No exclusions or comparative guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
close_tabA
Close a persistent browser tab by its tab_id. Use this to clean up tabs opened with open_tab.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | Yes | The tab ID returned by open_tab |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It clearly discloses that the operation closes a tab and is intended for cleanup, which implies a mutating action. However, it does not mention side effects, error behavior, or whether the close is irreversible.
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 the core action front-loaded and the usage context in the second sentence. No filler or redundant wording.
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 single-parameter tool with no output schema, the description is largely complete: it states what is closed, what identifier is needed, and when to use it. It could mention return/error behavior, but the simplicity of the operation makes this a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with tab_id already documented as 'The tab ID returned by open_tab'. The description restates this relationship but adds no significant new semantic detail beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Close') and resource ('persistent browser tab') and identifies the exact identifier needed ('by its tab_id'). This is clearly distinguishable from siblings like open_tab and list_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 explicitly states when to use the tool: 'Use this to clean up tabs opened with open_tab.' It does not provide when-not-to-use guidance, but there is no alternative close tool among the siblings, so this is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crawlA
Crawl a website starting from a URL, following links up to a specified depth. Returns a list of discovered pages with titles and optional content summaries. Respects same-domain and link filter constraints.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Starting URL for the crawl | |
| timeout | No | Timeout per page in ms (default: 30000) | |
| max_depth | No | Maximum link depth to follow (default: 2) | |
| max_pages | No | Maximum total pages to crawl (default: 10) | |
| link_filter | No | Regex pattern to filter which links to follow | |
| include_content | No | Include a markdown content summary per page (default: false) | |
| max_length_per_page | No | Max content length per page when include_content is true (default: 5000) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that traversal is depth-limited, output is a list with titles/summaries, and that same-domain/link_filter constraints are respected. However, with no annotations, it leaves side effects unclear (e.g., whether it opens tabs or alters browser state, auth handling, rate limits) and doesn't describe execution mode.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences pack purpose, output, and constraints without filler. Front-loaded with the core action; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description supplies a high-level return shape (pages with titles and optional summaries) and covers core constraints. It doesn't detail the exact returned item structure, error behavior, or side effects, but defaults and parameter meanings are fully documented in the schema.
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 covers 100% of parameters with clear descriptions, so the baseline is 3. The description reinforces the role of link_filter and includes content summaries but adds no new parameter-specific meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the tool's action ('Crawl'), resource ('a website'), and key behavior ('following links up to a specified depth'), plus the output ('list of discovered pages with titles and optional content summaries'). This clearly separates it from single-page siblings like fetch_page and extract_links.
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?
Implies the use case of multi-page link traversal from a URL, and mentions constraints (same-domain, link_filter), but gives no explicit 'when to use vs. alternatives' or exclusions. Siblings such as fetch_page/multi_fetch are not referenced.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
execute_javascriptA
Execute arbitrary JavaScript in the context of a loaded web page. The script runs in the browser and must return a JSON-serializable value. Supports persistent sessions via tab_id — when using a tab_id, the url parameter is optional (executes on the current page).
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | The URL to load before executing the script (optional if tab_id is provided) | |
| script | Yes | JavaScript code to execute. The last expression is returned, or use 'return' explicitly. | |
| tab_id | No | Reuse a persistent tab (from open_tab) instead of opening a new one | |
| timeout | No | Timeout in ms (default: 30000) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the transparency burden. It usefully discloses that the script runs in the browser and must return a JSON-serializable value, but it does not mention error behavior, timeout/async semantics, or the potentially page-mutating side effects of arbitrary JS.
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 with no filler; the primary action and the most important usage caveat are front-loaded. Every clause adds functional information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a four-parameter tool with no output schema or annotations, the description covers execution context, return-type constraint, and tab/session behavior. It leaves minor gaps around error handling and asynchronous behavior, but an agent can reasonably decide how to invoke the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds a little context (persistent sessions and the current-page behavior when tab_id is used), but those details mostly duplicate the existing parameter descriptions rather than substantially expanding them.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Execute arbitrary JavaScript in the context of a loaded web page') and clarifies the return contract. This clearly differentiates it from sibling tools like fetch_page, open_tab, or click_and_navigate, which do not run custom JS.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear invocation context by explaining persistent sessions via tab_id and when the url parameter may be omitted. It does not explicitly compare to sibling tools or state when not to use this tool, so it falls just short of full alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_linksB
Extract all links from a web page. Can filter by regex pattern. Supports persistent sessions via tab_id.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | The URL to extract links from (optional if tab_id is provided) | |
| filter | No | Regex pattern to filter URLs (applied to the full URL) | |
| tab_id | No | Reuse a persistent tab (from open_tab) | |
| timeout | No | Timeout in ms (default: 30000) | |
| max_results | No | Max number of links to return (default: 100) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden. It mentions persistent sessions and regex filtering, but does not explain side effects such as whether a tab is created or kept open, whether redirects are followed, whether results are deduplicated, or how timeout and max_results affect behavior. The claim 'all links' is also undercut by the max_results default, which is not acknowledged.
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 concise and front-loaded: the core action is stated first, followed by two short sentences that add useful capability context. Every sentence earns its place, and there is no redundant restatement of parameter details already present in the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The schema documents all five parameters well, including defaults and the url/tab_id relationship, which covers much of what an agent needs to invoke the tool. However, with no output schema and no annotations, the description leaves some behavioral questions unanswered, such as how persistent sessions are managed and what exactly is returned beyond 'links'.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description's mention of regex filtering and tab_id mostly restates what the schema already documents in more detail, and it does not add meaningful semantic value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Extract all links from a web page') and mentions additional capabilities like regex filtering and tab_id reuse. It is generally distinguishable from siblings like fetch_page or web_search, though it does not explicitly differentiate itself from the similar-sounding crawl tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no explicit guidance on when to use this tool versus alternatives such as crawl, fetch_readable, or fetch_structured_data. The intended use is implied by the name and purpose, but the description does not state exclusions, prerequisites, or conditions that would route an agent to a sibling tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetch_pageB
Load a URL in the browser and return the full page content as Markdown. Supports persistent sessions via tab_id.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | The URL to load (optional if tab_id is provided) | |
| tab_id | No | Reuse a persistent tab (from open_tab) instead of opening a new one | |
| timeout | No | Timeout in ms (default: 30000) | |
| wait_for | No | CSS selector to wait for before extraction | |
| max_length | No | Max content length in characters (default: 50000) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It discloses the primary action and output format, and that tab_id supports persistent sessions. However, it does not clarify side effects such as whether a new tab is opened, whether tabs remain open, or how failures/timeouts behave.
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 filler. The main purpose is stated first, followed by the session capability. Every word 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?
The description plus schema covers parameters and the Markdown output, making simple calls feasible. However, with no annotations, no output schema, and a browser tool that may have side effects, it lacks guidance on tab lifecycle, required input combinations, and when to use alternatives.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all five parameters. The description adds little beyond the schema; 'persistent sessions via tab_id' restates the schema's tab_id description rather than adding new meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Load a URL'), the resource ('URL'), and the result ('full page content as Markdown'). It also mentions persistent sessions via tab_id, which distinguishes it from simpler fetch tools. However, it does not explicitly differentiate itself from sibling tools like fetch_readable or fetch_structured_data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use fetch_page versus alternatives such as fetch_readable, open_tab, or crawl. The mention of persistent sessions via tab_id is a partial usage hint, but it does not explain when to prefer this tool or when to avoid it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetch_readableA
Load a URL and extract the main article content (removes navigation, ads, sidebars). Falls back to full page content if extraction yields too little text. Supports persistent sessions via tab_id.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | The URL to load (optional if tab_id is provided) | |
| tab_id | No | Reuse a persistent tab (from open_tab) instead of opening a new one | |
| timeout | No | Timeout in ms (default: 30000) | |
| wait_for | No | CSS selector to wait for before extraction | |
| max_length | No | Max content length in characters (default: 30000) | |
| fallback_to_full | No | Fall back to full page content if Readability extraction is too short (default: true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden and does a solid job: it reveals that navigation/ads/sidebars are removed, that it falls back to full page content when extraction is too short, and that persistent sessions are supported. It omits details like output format or side effects, but the key behavioral traits are disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences, each earning its place. The core behavior is front-loaded, fallback behavior follows, and the persistent-session capability is stated without fluff.
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?
The description covers the core extraction behavior and fallback, but it does not explain the return format despite there being no output schema, nor does it offer guidance on choosing among related sibling tools. It is adequate for basic invocation but leaves notable gaps around output expectations and alternative tool selection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds only a light conceptual layer about persistent sessions via tab_id, but most parameter meaning is already fully documented in the schema. No compensation needed or provided.
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 a specific verb and resource: 'Load a URL and extract the main article content.' It also differentiates itself from siblings like fetch_page by emphasizing readability extraction that removes navigation, ads, and sidebars, with a fallback behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool—when main article content is needed—but never explicitly contrasts it with alternatives like fetch_page or fetch_structured_data. Mentioning persistent sessions via tab_id gives some contextual guidance, but no when-not-to-use or explicit alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetch_structured_dataB
Extract structured data from a web page: JSON-LD, OpenGraph tags, meta tags, tables, headings, and links. Supports persistent sessions via tab_id.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | The URL to analyze (optional if tab_id is provided) | |
| tab_id | No | Reuse a persistent tab (from open_tab) instead of opening a new one | |
| extract | No | Data types to extract (default: ["json_ld", "opengraph", "meta"]) | |
| timeout | No | Timeout in ms (default: 30000) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral disclosure burden. It only states extraction capabilities and the existence of persistent sessions via tab_id; it does not disclose whether a new tab is opened when tab_id is omitted, whether the tab remains open afterward, whether the operation is read-only, or how sessions are cleaned up. These are material side effects for an agent to invoke the tool safely.
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 short sentences with no filler. The core capability is front-loaded, followed by a scannable list of extractable data types and one sentence about session reuse. Every word 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?
With no annotations and no output schema, the agent learns what can be extracted but not what the return payload looks like, what side effects occur, or when this tool is the right choice among thirteen browser-related siblings. For a tool that can create or reuse persistent browser sessions, this leaves too much to inference.
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 documents all four parameters with 100% coverage, including optionality, defaults, and the relationship between url and tab_id. The description adds little beyond restating the tab_id concept ('Supports persistent sessions via tab_id'), so it does not meaningfully extend the schema's parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Extract structured data') on a precise resource ('a web page') and enumerates the concrete data types it returns: JSON-LD, OpenGraph tags, meta tags, tables, headings, and links. That list clearly distinguishes it from sibling tools like fetch_readable, fetch_page, and extract_links, which have narrower or different extraction scopes.
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 makes the tool's domain clear and mentions the persistent-session tab_id option, so an agent can infer when structured-data extraction is wanted. However, it never explicitly says when to prefer this tool over fetch_readable, fetch_page, or extract_links, nor does it explain when to supply tab_id versus url. 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.
list_tabsA
List all open browser tabs with their URLs and titles
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and 'List all open browser tabs' clearly conveys a read-only enumeration behavior. It also discloses what the result will contain (URLs and titles), which is helpful beyond the tool name.
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, front-loaded sentence that communicates the action, scope, and output fields with 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 zero-argument listing tool, the description provides the essential information an agent needs: what is listed and what fields are returned. No output schema exists, but the description covers the meaningful output content.
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 and the schema reflects that fully, so the baseline applies. The description does not need to explain any parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb and resource: 'List all open browser tabs with their URLs and titles.' It is unambiguous and informative, but it does not explicitly distinguish itself from sibling tools like browser_status or fetch_page.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool versus alternatives such as browser_status, fetch_page, or open_tab. The context is simple, but the description does not state exclusions or preferred conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
monitor_pageA
Monitor a web page for content changes. Use 'start' to begin monitoring, 'check' to retrieve changes, 'stop' to end monitoring, or 'list' to see all active monitors.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | URL to monitor (required for 'start') | |
| action | Yes | Action to perform | |
| selector | No | CSS selector to monitor for changes (default: 'body') | |
| monitor_id | No | Monitor ID (required for 'check' and 'stop') | |
| interval_seconds | No | Polling interval in seconds (default: 30) |
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 reveals that monitors exist and can be listed or stopped, but it does not state whether start launches a background process, whether checks consume or destroy state, whether resources persist, or what side effects monitoring has. A stateful tool needs more explicit lifecycle 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?
Two sentences with no filler, front-loaded with the core purpose. The second sentence compactly maps all four actions without unnecessary elaboration.
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?
The action surface is covered clearly, but the broader behavior is underspecified: there is no output schema, no indication of what 'start' returns, no clarification of whether monitoring is server-side or tied to an open tab, and no cleanup or rate-limit guidance. For a stateful tool with no annotations, this leaves important gaps an agent would have to infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents every parameter, giving a baseline of 3. The description adds some action-to-parameter intent by tying 'start'/'check'/'stop'/'list' to the action enum, but it does not meaningfully explain parameter details beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific function—monitoring a web page for content changes—and enumerates the four supported operations. This clearly distinguishes it from one-shot sibling tools like fetch_page, screenshot, and crawl.
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 the monitoring workflow by listing start/check/stop/list, giving an agent clear operational context. However, it does not explicitly state when to choose this tool over siblings like fetch_page or crawl, and it offers no exclusions or alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
multi_fetchA
Fetch multiple URLs in parallel and return their content as Markdown. Useful for comparing sources or gathering information from several pages at once. Max 5 URLs.
| Name | Required | Description | Default |
|---|---|---|---|
| urls | Yes | List of URLs to fetch (max 5) | |
| timeout | No | Timeout per page in ms (default: 30000) | |
| wait_for | No | CSS selector to wait for on each page | |
| max_length_per_page | No | Max content length per page in characters (default: 15000) |
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 does explain that fetching is parallel, returns Markdown, and caps at 5 URLs. However, it does not disclose what happens on partial failures, per-URL errors, malformed URLs, or whether results are returned in the original order, which is meaningful for a batch fetch 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 two sentences with no filler. The first sentence states the core action and output format, and the second provides use cases and the limit. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple batch-fetch tool with only one required parameter and complete schema descriptions, the description covers the essential selection and invocation information well. The main gap is the lack of explicit failure/partial-response behavior, and since there is no output schema, a bit more detail about return behavior would make it fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents all four parameters. The description adds only the max-5 constraint, which the schema also states, and provides no additional meaning for timeout, wait_for, or max_length_per_page. This aligns with the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Fetch multiple URLs in parallel') and the resource ('multiple URLs'), and identifies the output ('return their content as Markdown'). It also distinguishes itself from sibling tools like fetch_page by emphasizing parallel batch fetching, making its purpose 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 concrete use cases: 'comparing sources or gathering information from several pages at once,' which tells an agent when this tool is appropriate. It does not explicitly name alternatives like fetch_page or crawl, nor does it state when not to use it, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
open_tabA
Open a new persistent browser tab. Returns a tab_id that can be used with other tools for multi-step workflows (login, navigation, form filling). The tab stays open until explicitly closed or the session expires.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | URL to navigate to (optional, opens blank tab if omitted) | |
| timeout | No | Navigation timeout in ms (default: 30000) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description discloses key behaviors: the tab is persistent, returns a tab_id, and remains open until explicitly closed or the session expires. It does not cover failure modes or resource implications, but the core lifecycle behavior is clearly stated.
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 compact sentences with the primary action first, followed by return value and lifecycle semantics. Every sentence earns its place with no filler or redundancy.
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?
The description covers everything needed to invoke the tool correctly: it explains what it does, what it returns, and how long the tab persists. Since there is no output schema, the explicit mention of tab_id is essential and sufficient. The schema handles parameter details, so nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents both parameters. The description adds no extra semantic detail about them, but it doesn't need to; it focuses on the tool's overall behavior.
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 and resource ('Open a new persistent browser tab') and distinguishes itself from siblings like fetch_page by emphasizing persistence and returning a tab_id for multi-step workflows. This makes the tool's role clear and easily differentiated.
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 identifies the intended use case: multi-step workflows such as login, navigation, and form filling. It doesn't name alternative tools or state when not to use it, but the persistent-tab framing and tab_id return value imply the contrast with single-shot tools like fetch_page.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
screenshotA
Take a screenshot of a web page or a specific element. Returns a PNG image. Supports persistent sessions via tab_id — when using tab_id, url is optional (screenshots the current page).
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | The URL to capture (optional if tab_id is provided) | |
| width | No | Viewport width in pixels (default: 1280) | |
| height | No | Viewport height in pixels (default: 720) | |
| tab_id | No | Reuse a persistent tab (from open_tab) instead of opening a new one | |
| timeout | No | Timeout in ms (default: 30000) | |
| selector | No | CSS selector of a specific element to capture | |
| full_page | No | Capture the full scrollable page (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description carries the behavioral disclosure burden. It adds meaningful details beyond the schema: it returns a PNG, reuses persistent tabs via tab_id, and can target the current page when url is omitted. It does not mention tab lifecycle side effects when no tab_id is given, but the disclosed behavior is substantial.
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 with no filler. The core purpose and return type are front-loaded, followed by the key tab_id usage caveat. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 7 optional parameters and no output schema, the description provides sufficient invocation context: what it captures, what it returns, and how tab_id interacts with url. Minor gaps remain around combining url and tab_id simultaneously and what happens when neither is provided, but individual parameter details are covered by the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is met. The description adds cross-parameter meaning by clarifying that url is optional when tab_id is provided and that a selector can target a specific element. This relationship is not fully apparent from the individual schema 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 opens with a specific verb and resource: 'Take a screenshot of a web page or a specific element.' The output format is also stated ('Returns a PNG image'), which clearly differentiates it from sibling content-fetching tools like fetch_page or fetch_readable that return HTML/text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context for the persistent-session mode: when tab_id is provided, url is optional and the current page is captured. It does not explicitly contrast against fetch_page or web_search, but it provides enough operational guidance for when to use a tab_id versus a URL.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
web_searchA
Search the web using Google or DuckDuckGo through the user's real browser. Returns structured results with title, URL, and snippet.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | The search query | |
| engine | No | Search engine to use (default: "google") | |
| max_results | No | Max number of results to return (default: 10) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden. It mentions that search runs through the user's real browser and that results are structured, adding useful context. However, it does not disclose potential side effects such as opening tabs, relying on existing browser state, or any rate-limiting behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. It front-loads the core purpose and then specifies the result structure, making it efficient for an agent to parse quickly.
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 search tool with one required parameter and a stated return format, the description is nearly complete. It lacks only minor behavioral details about browser side effects and limitations, which are not critical for basic invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents query, engine, and max_results. The description adds no parameter-specific details beyond what the schema provides, so the baseline 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 states a specific verb ('Search') and resource ('the web'), identifies the mechanism (Google or DuckDuckGo through the user's real browser), and specifies the return format (title, URL, snippet). This clearly distinguishes web_search from sibling browser tools like fetch_page or crawl.
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 clear context is that this tool should be used when a web search is needed, as opposed to fetching a specific page or crawling a site. It does not explicitly state exclusions or alternatives, but the contrast with the sibling tool set makes the intended use reasonably evident.
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.
15 tool updates
v1.0.0- First observed
browser_status - First observed
click_and_navigate - First observed
close_tab - First observed
crawl - First observed
execute_javascript - First observed
extract_links - First observed
fetch_page - First observed
fetch_readable - First observed
fetch_structured_data - First observed
list_tabs - First observed
monitor_page - First observed
multi_fetch - First observed
open_tab - First observed
screenshot - First observed
web_search
TDQS
Scored across 15 tools
fetch_page, fetch_readable, multi_fetch, fetch_structured_data, extract_links, and crawl all retrieve page content or extracted data, creating a cluster of tools with overlapping outputs. Descriptions clarify some intent, but fetch_readable's fallback to full page content makes it ambiguous with fetch_page, and fetch_structured_data overlaps with extract_links.
Most tools follow a clear verb_noun pattern like open_tab, close_tab, list_tabs, and extract_links. Minor inconsistencies such as browser_status, web_search, screenshot, multi_fetch, and fetch_readable break the pattern but remain readable and predictable.
15 tools is at the upper edge of the well-scoped range and covers browser sessions, search, fetching, extraction, interaction, and monitoring. It feels slightly heavy because several fetch/extract tools could be consolidated, but the count is not unreasonable for the domain.
The set covers the browser lifecycle well: search, navigation, persistent tabs, interaction, screenshots, structured extraction, crawling, and change monitoring. There are no major dead ends for common browser-automation workflows.
Maintenance
Related MCP Connectors
Undetectable cloud browser sessions for AI agents and scrapers. Navigate, extract, click, captcha.
Zenrows MCP server — Fetch, Extract, Batch, and Browser Sessions for AI coding assistants
Live browser debugging for AI assistants — DOM, console, network via MCP.
Web search, browser automation, scraping, crawling and CAPTCHA solving for AI agents.
Related MCP Servers
- AlicenseNot gradedqualityFmaintenanceAn MCP server that provides AI assistants with full control over a real browser session via a Chrome extension, supporting 36 tools for navigation, data extraction, and DOM manipulation. It bypasses bot detection by utilizing the user's active browser session, including cookies, authentication tokens, and installed extensions.183MIT
- AlicenseNot gradedqualityNot gradedmaintenanceAn extension-based MCP server that enables AI assistants to control your existing Chrome browser, leveraging your active login states and settings for automation. It provides over 20 tools for tasks like semantic tab search, screen capture, network monitoring, and direct element interaction.-
- AlicenseBqualityCmaintenanceAn MCP server that provides AI models with full browser automation capabilities through Chrome. It enables navigation, interaction, screenshots, and complete DevTools access by bridging AI clients with a companion Chrome extension.99103Apache 2.0
- AlicenseBqualityCmaintenanceBrowser MCP server that connects to your existing browser, preserving sessions, passwords, and extensions, enabling AI agents to interact with web pages without bot detection.31101MIT