Camoufox MCP Server
The Camoufox MCP Server provides advanced, privacy-focused browser automation with anti-detection capabilities for AI assistants. You can:
Browse and extract content: Navigate to URLs and return page content as text, HTML, or metadata; extract visible links, forms, headings, and landmarks; search for specific text with context.
Perform interactive sequences: Execute multiple actions on a page (click, fill, type, select, hover, scroll, press keys, wait, evaluate JavaScript) and capture the final state.
Capture screenshots: Take full-page or viewport screenshots (PNG/JPEG), optionally targeting specific elements.
Access diagnostics: Retrieve console logs and network request summaries for monitoring.
Manage browser sessions: Start, navigate, act within, snapshot, resume (e.g., after CAPTCHA), and close isolated, persistent sessions.
Check server status: Get live status of server, browser, queue, sessions, and policies.
Apply anti-detection & privacy: Spoof OS, locale, and viewport; humanize cursor movements; block WebGL, WebRTC, and images; use proxies; apply stealth profiles; and enforce SSRF protections.
Handle CAPTCHAs: Detect, pause for human action, fail, or attempt automated resolution.
Customize deeply: Set custom browser arguments, exclude add‑ons, or modify Firefox preferences (requires unsafe options enabled).
Provides stealthy browser automation using a specialized Firefox fork with advanced anti-detection, custom preferences, and fingerprint spoofing capabilities.
Allows for the blocking of WebGL to prevent hardware-based browser fingerprinting and enhance user privacy during automated sessions.
Enables blocking of WebRTC to protect user identity by preventing IP address leaks while browsing.
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., "@Camoufox MCP ServerVisit news.ycombinator.com and summarize the top stories"
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.
Camoufox MCP Server
An MCP (Model Context Protocol) server that provides browser automation capabilities using Camoufox, a privacy-focused Firefox fork with advanced anti-detection features.
Quick Install
Use the published npm package unless you are developing this repository locally.
Tell your LLM
Install camoufox-mcp and the skill using this URL: https://raw.githubusercontent.com/whit3rabbit/camoufox-mcp/refs/heads/main/llms.txtClaude Code CLI
claude mcp add camoufox -- npx -y camoufox-mcp-server@latestFor a shared project-scoped Claude Code config:
claude mcp add --scope project camoufox -- npx -y camoufox-mcp-server@latestVerify with /mcp inside Claude Code.
Codex CLI
codex mcp add camoufox -- npx -y camoufox-mcp-server@latestCodex stores MCP servers in ~/.codex/config.toml by default. Verify with /mcp inside Codex.
Agent Skill and Plugin Bundle
Use these when you want the camoufox skill plus the packaged MCP server config. If you only need the MCP server, use the Claude Code or Codex MCP commands above. Bare npx -y camoufox-mcp-server@latest remains safe by default. The packaged plugin bundle enables CAMOUFOX_MCP_ALLOW_UNSAFE_OPTIONS=1 so the skill can use firefox_user_prefs, args, and exclude_addons for hard-site tuning.
OpenClaw
Register the MCP server directly. This works today with no registry publish (--arg
is singular and repeatable; the --env flag enables the unsafe-option tuning):
openclaw mcp add camoufox --command npx --arg -y --arg camoufox-mcp-server@latest --env CAMOUFOX_MCP_ALLOW_UNSAFE_OPTIONS=1
openclaw mcp listOpenClaw exposes the tools with provider-safe names such as camoufox__browse.
Or install the published ClawHub bundle (skill + MCP config in one step):
openclaw plugins install clawhub:@whit3rabbit/camoufox-mcp
openclaw plugins inspect camoufox
openclaw plugins doctor
openclaw gateway restartClaude Code
Install the plugin from this repo's marketplace:
/plugin marketplace add whit3rabbit/camoufox-mcp
/plugin install camoufox@camoufox-mcpRestart Claude Code or start a new session after installing.
Codex
Install the plugin from this repo's marketplace:
codex plugin marketplace add whit3rabbit/camoufox-mcp
codex plugin add camoufox@camoufox-mcpRestart Codex or start a new thread after installing.
Hermes
Two commands: install the skill, then register the MCP server (Hermes skill installs do not auto-register MCP servers).
hermes skills install whit3rabbit/camoufox-mcp/plugins/camoufox/skills/camoufox
printf "Y\n" | hermes mcp add camoufox --command npx --env CAMOUFOX_MCP_ALLOW_UNSAFE_OPTIONS=1 --args -y camoufox-mcp-server@latestHermes TTY Gotcha:
hermes mcp addinteractively prompts"Enable all 17 tools? [Y/n/select]". On a non-TTY (piped/scripted inputs), the default response is"n"(canceled). PipeY\nas shown above to enable tools automatically.
Do not run hermes plugins install … for this repo. Hermes plugins are Python
packages with a root plugin.yaml; this repo has neither, so it clones but is rejected
as "not a valid plugin." Use the two commands above.
Hermes treats --args as plain argv tokens and it must be the last option. Do not pass a
JSON array string there. In ~/.hermes/config.yaml, env must be a mapping
(KEY: "value"), not a list. Verify with:
hermes mcp list
hermes mcp test camoufoxFirst browse on a fresh machine needs the browser binary once (~780MB); if a call
reports it is missing, run npx -y camoufox-js@0.12.0 fetch and retry (do not omit the @0.12.0 version pin).
Restart Hermes from a separate terminal after changing MCP config. Hermes namespaces MCP
tools as mcp_camoufox_<tool> (single underscore, e.g. mcp_camoufox_browse,
mcp_camoufox_camoufox_status; some setups show the double-underscore form
mcp__camoufox__browse) — use whatever your tool list shows, and confirm
mcp_camoufox_camoufox_status reports unsafeOptionsAllowed: true. browser_navigate is
Hermes' own built-in browser tool, not Camoufox.
For local-clone installs and additional hosts, see Configuration for AI assistants.
opencode
Add this to opencode.json in your project or to ~/.config/opencode/opencode.json:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"camoufox": {
"type": "local",
"command": ["npx", "-y", "camoufox-mcp-server@latest"],
"enabled": true
}
}
}Verify with:
opencode mcp listPi Coding Agent
Install the MCP adapter, then add Camoufox to .mcp.json or ~/.config/mcp/mcp.json:
pi install npm:pi-mcp-adapter{
"mcpServers": {
"camoufox": {
"command": "npx",
"args": ["-y", "camoufox-mcp-server@latest"]
}
}
}Related MCP server: camoufox-mcp
Try Camoufox
Once configured, ask your assistant for browser work in plain language:
Use Camoufox to browse https://example.com and return metadata only.Use Camoufox to inspect the interactive elements on https://example.com.Use Camoufox to open https://example.com, take a screenshot, and summarize the visible page.Use Camoufox to browse https://developer.mozilla.org with images blocked and WebRTC blocked.Features
Advanced anti-detection: rotating OS fingerprints, realistic cursor movements, and browser fingerprint spoofing.
Enhanced parameters: configurable wait strategies, timeouts, viewport dimensions, diagnostics, and screenshots.
Cross-platform: works on Windows, macOS, and Linux, including Docker.
Privacy controls: SSRF protections, WebRTC blocking, WebGL blocking, image blocking, proxy support, and bounded output.
Session tools: short-lived isolated browser sessions with challenge pause/resume support.
Requirements
Node.js 22 or higher
Python 3.x for running tests
Versioning
camoufox-js (0.12.0) and playwright-core (1.59.0) are pinned, fetching the Camoufox 152.0.4-beta.28 browser build. playwright-core is a direct pinned dependency (not just an overrides entry) because npm overrides only bind the root project: without a direct pin, npx/global installs let camoufox-js's peer float playwright-core to the latest, and playwright-core 1.60+ is incompatible with the Camoufox browser (1.60 breaks a navigation guard; 1.61 sends an isMobile viewport option Firefox/Camoufox rejects). The pins are the newest combination that passes the full test suite. Run npm run doctor to check them end-to-end, and do not loosen them without re-running npm run test:all.
Documentation
License
MIT License - see LICENSE file for details.
Contributing
Contributions are welcome. Please submit a pull request or open an issue for bugs and feature requests.
Acknowledgments
Built with Camoufox
Uses the Model Context Protocol
Powered by Playwright
Support
If you encounter issues, check Troubleshooting first, then open an issue on GitHub with logs and environment details.
Available Tools
17 toolsbrowseARead-only
Navigate once and return bounded page content.
| Name | Required | Description | Default |
|---|---|---|---|
| os | No | Optional OS to spoof. Can be 'windows', 'macos', or 'linux'. If not specified, will rotate between all OS types. | |
| url | Yes | The URL to navigate to and retrieve content from. Use this tool when users ask to visit, check, search, navigate, browse, fetch, or scrape websites. Must be a fully qualified URL (e.g., 'https://example.com'). | |
| args | No | Additional browser command-line arguments to pass to the browser. Rejected unless CAMOUFOX_MCP_ALLOW_UNSAFE_OPTIONS=1; denied args are always rejected. | |
| geoip | No | Automatically detect geolocation based on IP address. | |
| proxy | No | Proxy configuration for routing browser traffic through an HTTP(S) proxy. Proxy servers are checked against the same local-network URL policy as page requests. | |
| locale | No | Browser locale (e.g., 'en-US', 'fr-FR'). | |
| window | No | Set fixed window size [width, height] instead of random generation. An empty array [] is accepted and treated as if the window parameter was not specified. | |
| timeout | No | Timeout in milliseconds for page load (5-300 seconds). | |
| headless | No | Run browser in headless mode. Auto-detects best mode for environment if not specified. | |
| humanize | No | Enable realistic cursor movements and human-like behavior for better stealth and anti-detection. | |
| maxChars | No | Maximum text or HTML characters to return. | |
| selector | No | Optional CSS selector to limit extraction to one matching element. | |
| viewport | No | Custom viewport dimensions. | |
| outputMode | No | Response content mode. Defaults to visible text. Use 'html' only when raw HTML is explicitly needed. | text |
| screenshot | No | Capture a screenshot/image of the page after loading. | |
| block_webgl | No | Block WebGL to prevent fingerprinting and tracking. | |
| block_images | No | Block all images for faster loading, reduced bandwidth, and lightweight browsing. | |
| block_webrtc | No | Block WebRTC entirely for enhanced privacy and stealth. | |
| disable_coop | No | Disable Cross-Origin-Opener-Policy for sites that require it. | |
| enable_cache | No | Cache pages, requests, etc. Uses more memory but improves performance when revisiting pages. | |
| waitStrategy | No | Wait strategy for page load. Defaults to 'domcontentloaded'. 'load' waits for all resources, 'networkidle' waits for network activity to finish. | domcontentloaded |
| captchaPolicy | No | Challenge handling policy. 'detect' reports signals, 'pause' returns state for human action, 'fail' returns an error, 'attempt' returns enhanced challenge metadata, interactive elements, a bounded screenshot, and a suggested strategy. When CAPTCHA_AUTONOMOUS=true, responses are marked for LLM-assisted handling and include provider-specific challengePlaybook context when known. | |
| exclude_addons | No | List of default addons to exclude (e.g., ['ublock_origin']). Rejected unless CAMOUFOX_MCP_ALLOW_UNSAFE_OPTIONS=1. | |
| includeConsole | No | Include bounded page console diagnostics in the JSON response. | |
| includeNetwork | No | Include bounded network diagnostics in the JSON response. | |
| stealthProfile | No | Convenience profile for common Camoufox browser settings. Explicit options override profile values. | normal |
| screenshotOptions | No | Optional screenshot capture settings. Used only when screenshot is true. | |
| firefox_user_prefs | No | Custom Firefox user preferences to set. Rejected unless CAMOUFOX_MCP_ALLOW_UNSAFE_OPTIONS=1; denied prefs are always rejected. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| html | No | |
| text | No | |
| title | No | |
| status | No | |
| message | No | |
| maxChars | Yes | |
| selector | No | |
| truncated | Yes | |
| outputMode | Yes | |
| screenshot | No | |
| contentType | No | |
| diagnostics | No | |
| challengeType | No | |
| selectorFound | No | |
| captchaIframes | No | |
| captchaDetected | No | |
| challengeSignals | No | |
| challengeHandling | No | |
| challengePlaybook | No | |
| challengeProvider | No | |
| suggestedStrategy | No | |
| requiresUserAction | No | |
| interactiveElements | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, and the description adds useful context: 'bounded' indicates output limits and 'Navigate once' implies no session persistence. This goes beyond the annotations without contradicting them, giving the agent a clearer expectation of the tool's 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 a single, short sentence (7 words). It is front-loaded with the core action and constraint ('Navigate once', 'bounded'), and every word contributes meaning. No waste 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?
Despite having 28 parameters, the schema and output schema are extremely detailed, so the description does not need to list options. The description gives a concise summary that orients the agent to the tool's primary purpose and its bounded-output nature. It is sufficiently complete for the complexity, though it could note the variety of output modes (text/html/metadata) which are only 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 description coverage is 100%, so every parameter is thoroughly documented. The tool description does not add extra parameter semantics beyond the schema; it only hints at bounded content, which is already captured by maxChars. Baseline 3 is appropriate given full schema 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 'Navigate once and return bounded page content' uses a specific verb ('navigate') and resource ('page content'), and the word 'once' distinguishes it from sibling tools like browse_sequence. It is clear and unambiguous, though it could be more explicit about being a single-page fetch/scrape 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?
Usage context is implied by 'Navigate once', which suggests it is for a single page rather than a sequence or session. However, there are no explicit references to alternatives or when-not-to-use scenarios. The schema's url parameter description does provide some use-case guidance, but the tool description itself lacks clear direction on choosing between browse and its siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browse_consoleBRead-only
Navigate once and return bounded console diagnostics.
| Name | Required | Description | Default |
|---|---|---|---|
| os | No | Optional OS to spoof. Can be 'windows', 'macos', or 'linux'. If not specified, will rotate between all OS types. | |
| url | Yes | The URL to navigate to. Must be a fully qualified http or https URL. | |
| args | No | Additional browser command-line arguments to pass to the browser. Rejected unless CAMOUFOX_MCP_ALLOW_UNSAFE_OPTIONS=1; denied args are always rejected. | |
| geoip | No | Automatically detect geolocation based on IP address. | |
| proxy | No | Proxy configuration for routing browser traffic through an HTTP(S) proxy. Proxy servers are checked against the same local-network URL policy as page requests. | |
| locale | No | Browser locale (e.g., 'en-US', 'fr-FR'). | |
| window | No | Set fixed window size [width, height] instead of random generation. An empty array [] is accepted and treated as if the window parameter was not specified. | |
| timeout | No | Timeout in milliseconds for page load (5-300 seconds). | |
| headless | No | Run browser in headless mode. Auto-detects best mode for environment if not specified. | |
| humanize | No | Enable realistic cursor movements and human-like behavior for better stealth and anti-detection. | |
| viewport | No | Custom viewport dimensions. | |
| block_webgl | No | Block WebGL to prevent fingerprinting and tracking. | |
| block_images | No | Block all images for faster loading, reduced bandwidth, and lightweight browsing. | |
| block_webrtc | No | Block WebRTC entirely for enhanced privacy and stealth. | |
| disable_coop | No | Disable Cross-Origin-Opener-Policy for sites that require it. | |
| enable_cache | No | Cache pages, requests, etc. Uses more memory but improves performance when revisiting pages. | |
| waitStrategy | No | Wait strategy for page load. Defaults to 'domcontentloaded'. 'load' waits for all resources, 'networkidle' waits for network activity to finish. | domcontentloaded |
| captchaPolicy | No | Challenge handling policy. 'detect' reports signals, 'pause' returns state for human action, 'fail' returns an error, 'attempt' returns enhanced challenge metadata, interactive elements, a bounded screenshot, and a suggested strategy. When CAPTCHA_AUTONOMOUS=true, responses are marked for LLM-assisted handling and include provider-specific challengePlaybook context when known. | |
| exclude_addons | No | List of default addons to exclude (e.g., ['ublock_origin']). Rejected unless CAMOUFOX_MCP_ALLOW_UNSAFE_OPTIONS=1. | |
| includeConsole | No | Include bounded page console diagnostics in the JSON response. | |
| includeNetwork | No | Include bounded network diagnostics in the JSON response. | |
| stealthProfile | No | Convenience profile for common Camoufox browser settings. Explicit options override profile values. | normal |
| firefox_user_prefs | No | Custom Firefox user preferences to set. Rejected unless CAMOUFOX_MCP_ALLOW_UNSAFE_OPTIONS=1; denied prefs are always rejected. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| title | No | |
| status | No | |
| console | Yes | |
| message | No | |
| network | No | |
| contentType | No | |
| challengeType | No | |
| captchaIframes | No | |
| captchaDetected | No | |
| challengeSignals | No | |
| consoleTruncated | No | |
| challengeHandling | No | |
| challengePlaybook | No | |
| challengeProvider | No | |
| suggestedStrategy | No | |
| requiresUserAction | No | |
| interactiveElements | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is known. The description adds the 'navigate once' constraint, which is useful, but does not explain what 'bounded' means, how diagnostics are collected, or any side effects such as network requests. With annotations covering the main safety concerns, a score of 3 is appropriate.
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 zero wasted words, front-loaded with the core action and output. It is perfectly concise and easy to parse.
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 23 parameters, nested objects, and an output schema, the description is only one sentence. It leaves ambiguity about what 'bounded console diagnostics' includes, whether it opens a new browser or uses an existing session, and how it interacts with session state. For a tool of this complexity, the description is under-specified.
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 all 23 parameters. The description adds no further parameter-level semantics, and the baseline of 3 is correct given the schema's completeness.
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 identifies the action ('Navigate once') and the output ('bounded console diagnostics'), which is specific and distinguishes it from general browsing or network-oriented sibling tools. However, it doesn't explicitly mention that it returns console logs or messages, leaving some room for interpretation.
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 like browse, browse_network_summary, or browse_snapshot. It only states what the tool does, not when it should be selected or when it should be avoided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browse_findARead-only
Navigate once, search visible text, and return bounded context matches.
| Name | Required | Description | Default |
|---|---|---|---|
| os | No | Optional OS to spoof. Can be 'windows', 'macos', or 'linux'. If not specified, will rotate between all OS types. | |
| url | Yes | The URL to navigate to. Must be a fully qualified http or https URL. | |
| args | No | Additional browser command-line arguments to pass to the browser. Rejected unless CAMOUFOX_MCP_ALLOW_UNSAFE_OPTIONS=1; denied args are always rejected. | |
| geoip | No | Automatically detect geolocation based on IP address. | |
| proxy | No | Proxy configuration for routing browser traffic through an HTTP(S) proxy. Proxy servers are checked against the same local-network URL policy as page requests. | |
| query | Yes | Visible text to search for on the page. | |
| locale | No | Browser locale (e.g., 'en-US', 'fr-FR'). | |
| window | No | Set fixed window size [width, height] instead of random generation. An empty array [] is accepted and treated as if the window parameter was not specified. | |
| timeout | No | Timeout in milliseconds for page load (5-300 seconds). | |
| headless | No | Run browser in headless mode. Auto-detects best mode for environment if not specified. | |
| humanize | No | Enable realistic cursor movements and human-like behavior for better stealth and anti-detection. | |
| selector | No | Optional CSS selector to limit extraction to one matching element. | |
| viewport | No | Custom viewport dimensions. | |
| maxMatches | No | Maximum matches to return. | |
| block_webgl | No | Block WebGL to prevent fingerprinting and tracking. | |
| block_images | No | Block all images for faster loading, reduced bandwidth, and lightweight browsing. | |
| block_webrtc | No | Block WebRTC entirely for enhanced privacy and stealth. | |
| contextChars | No | Characters of surrounding visible text to return per match. | |
| disable_coop | No | Disable Cross-Origin-Opener-Policy for sites that require it. | |
| enable_cache | No | Cache pages, requests, etc. Uses more memory but improves performance when revisiting pages. | |
| waitStrategy | No | Wait strategy for page load. Defaults to 'domcontentloaded'. 'load' waits for all resources, 'networkidle' waits for network activity to finish. | domcontentloaded |
| captchaPolicy | No | Challenge handling policy. 'detect' reports signals, 'pause' returns state for human action, 'fail' returns an error, 'attempt' returns enhanced challenge metadata, interactive elements, a bounded screenshot, and a suggested strategy. When CAPTCHA_AUTONOMOUS=true, responses are marked for LLM-assisted handling and include provider-specific challengePlaybook context when known. | |
| exclude_addons | No | List of default addons to exclude (e.g., ['ublock_origin']). Rejected unless CAMOUFOX_MCP_ALLOW_UNSAFE_OPTIONS=1. | |
| includeConsole | No | Include bounded page console diagnostics in the JSON response. | |
| includeNetwork | No | Include bounded network diagnostics in the JSON response. | |
| stealthProfile | No | Convenience profile for common Camoufox browser settings. Explicit options override profile values. | normal |
| firefox_user_prefs | No | Custom Firefox user preferences to set. Rejected unless CAMOUFOX_MCP_ALLOW_UNSAFE_OPTIONS=1; denied prefs are always rejected. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| query | Yes | |
| title | No | |
| status | No | |
| matches | Yes | |
| message | No | |
| selector | No | |
| truncated | Yes | |
| maxMatches | Yes | |
| contentType | No | |
| diagnostics | No | |
| contextChars | Yes | |
| challengeType | No | |
| selectorFound | Yes | |
| captchaIframes | No | |
| captchaDetected | No | |
| challengeSignals | No | |
| challengeHandling | No | |
| challengePlaybook | No | |
| challengeProvider | No | |
| suggestedStrategy | No | |
| requiresUserAction | No | |
| interactiveElements | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is known. The description adds useful behavioral traits: it navigates once, searches visible text (as opposed to HTML or raw source), and returns bounded context matches (limited by maxMatches and contextChars). This goes beyond the annotations and gives the agent a better understanding of the tool's 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 a single sentence containing three short clauses: 'Navigate once, search visible text, and return bounded context matches.' Every word earns its place, and the structure front-loads the core action. No 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?
Given the tool has 27 parameters, nested objects, and an output schema, the description is minimal but sufficient to convey the essential purpose. The rich schema and output schema handle the detailed parameter semantics and return values, so the description does not need to explain them. However, it could have added a note about when to use it versus browse_links or browse_forms, but the sibling names partially cover that. It is complete enough for an agent to make an initial 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 coverage is 100%, with detailed descriptions for all 27 parameters, including query, maxMatches, contextChars, and others. The description does not add any meaning beyond what the schema already provides; it merely echoes concepts already present in the parameter descriptions. Therefore, a 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 navigates to a URL, searches visible text, and returns bounded context matches. This specific verb-action combination distinguishes it from siblings like browse_links (which finds links) and browse_forms (which finds forms), making the 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 gives clear context: use this tool when you need to search for visible text on a webpage and get surrounding context. It does not explicitly list exclusions or alternatives, but the sibling tool names (browse_links, browse_forms, browse_outline) imply the differentiation, so the agent can infer when to choose this over others.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browse_formsBRead-only
Navigate once and return form fields and submit controls.
| Name | Required | Description | Default |
|---|---|---|---|
| os | No | Optional OS to spoof. Can be 'windows', 'macos', or 'linux'. If not specified, will rotate between all OS types. | |
| url | Yes | The URL to navigate to. Must be a fully qualified http or https URL. | |
| args | No | Additional browser command-line arguments to pass to the browser. Rejected unless CAMOUFOX_MCP_ALLOW_UNSAFE_OPTIONS=1; denied args are always rejected. | |
| geoip | No | Automatically detect geolocation based on IP address. | |
| proxy | No | Proxy configuration for routing browser traffic through an HTTP(S) proxy. Proxy servers are checked against the same local-network URL policy as page requests. | |
| locale | No | Browser locale (e.g., 'en-US', 'fr-FR'). | |
| window | No | Set fixed window size [width, height] instead of random generation. An empty array [] is accepted and treated as if the window parameter was not specified. | |
| timeout | No | Timeout in milliseconds for page load (5-300 seconds). | |
| headless | No | Run browser in headless mode. Auto-detects best mode for environment if not specified. | |
| humanize | No | Enable realistic cursor movements and human-like behavior for better stealth and anti-detection. | |
| maxForms | No | Maximum forms to return. | |
| selector | No | Optional CSS selector to limit extraction to one matching element. | |
| viewport | No | Custom viewport dimensions. | |
| maxFields | No | Maximum fields to return across all forms. | |
| block_webgl | No | Block WebGL to prevent fingerprinting and tracking. | |
| block_images | No | Block all images for faster loading, reduced bandwidth, and lightweight browsing. | |
| block_webrtc | No | Block WebRTC entirely for enhanced privacy and stealth. | |
| disable_coop | No | Disable Cross-Origin-Opener-Policy for sites that require it. | |
| enable_cache | No | Cache pages, requests, etc. Uses more memory but improves performance when revisiting pages. | |
| waitStrategy | No | Wait strategy for page load. Defaults to 'domcontentloaded'. 'load' waits for all resources, 'networkidle' waits for network activity to finish. | domcontentloaded |
| captchaPolicy | No | Challenge handling policy. 'detect' reports signals, 'pause' returns state for human action, 'fail' returns an error, 'attempt' returns enhanced challenge metadata, interactive elements, a bounded screenshot, and a suggested strategy. When CAPTCHA_AUTONOMOUS=true, responses are marked for LLM-assisted handling and include provider-specific challengePlaybook context when known. | |
| exclude_addons | No | List of default addons to exclude (e.g., ['ublock_origin']). Rejected unless CAMOUFOX_MCP_ALLOW_UNSAFE_OPTIONS=1. | |
| includeConsole | No | Include bounded page console diagnostics in the JSON response. | |
| includeNetwork | No | Include bounded network diagnostics in the JSON response. | |
| stealthProfile | No | Convenience profile for common Camoufox browser settings. Explicit options override profile values. | normal |
| firefox_user_prefs | No | Custom Firefox user preferences to set. Rejected unless CAMOUFOX_MCP_ALLOW_UNSAFE_OPTIONS=1; denied prefs are always rejected. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| forms | Yes | |
| title | No | |
| status | No | |
| message | No | |
| maxForms | Yes | |
| selector | No | |
| maxFields | Yes | |
| truncated | Yes | |
| contentType | No | |
| diagnostics | No | |
| challengeType | No | |
| selectorFound | Yes | |
| captchaIframes | No | |
| captchaDetected | No | |
| challengeSignals | No | |
| challengeHandling | No | |
| challengePlaybook | No | |
| challengeProvider | No | |
| suggestedStrategy | No | |
| requiresUserAction | No | |
| interactiveElements | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
'Navigate once' is a mild behavioral constraint, but the description doesn't disclose how navigation is handled, what triggers form extraction, or any side effects. Annotations already mark it as read-only, so the description adds minimal transparency beyond that.
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 sentence effectively captures the core functionality without unnecessary words. It's front-loaded with the key verb 'Navigate' and immediately specifies the return 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?
Despite an extensive schema and output schema, the description is too sparse for a tool with 26 parameters. It doesn't explain relationships to sibling tools, typical workflows, or how this fits into a broader browsing automation session.
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 detailed parameter descriptions, so the baseline is 3. The tool description doesn't add any parameter semantics beyond what the schema provides, but that's acceptable given the schema's completeness.
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 navigates to a URL and returns form fields and submit controls. This specific output distinguishes it from sibling tools like browse_links or browse_snapshot, which handle other aspects of page content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives such as browse_find or browse_snapshot. It only states what it does, without mentioning typical use cases or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browse_linksARead-only
Navigate once and return only visible navigable links.
| Name | Required | Description | Default |
|---|---|---|---|
| os | No | Optional OS to spoof. Can be 'windows', 'macos', or 'linux'. If not specified, will rotate between all OS types. | |
| url | Yes | The URL to navigate to. Must be a fully qualified http or https URL. | |
| args | No | Additional browser command-line arguments to pass to the browser. Rejected unless CAMOUFOX_MCP_ALLOW_UNSAFE_OPTIONS=1; denied args are always rejected. | |
| geoip | No | Automatically detect geolocation based on IP address. | |
| proxy | No | Proxy configuration for routing browser traffic through an HTTP(S) proxy. Proxy servers are checked against the same local-network URL policy as page requests. | |
| locale | No | Browser locale (e.g., 'en-US', 'fr-FR'). | |
| window | No | Set fixed window size [width, height] instead of random generation. An empty array [] is accepted and treated as if the window parameter was not specified. | |
| timeout | No | Timeout in milliseconds for page load (5-300 seconds). | |
| headless | No | Run browser in headless mode. Auto-detects best mode for environment if not specified. | |
| humanize | No | Enable realistic cursor movements and human-like behavior for better stealth and anti-detection. | |
| maxLinks | No | Maximum links to return. | |
| selector | No | Optional CSS selector to limit extraction to one matching element. | |
| viewport | No | Custom viewport dimensions. | |
| block_webgl | No | Block WebGL to prevent fingerprinting and tracking. | |
| block_images | No | Block all images for faster loading, reduced bandwidth, and lightweight browsing. | |
| block_webrtc | No | Block WebRTC entirely for enhanced privacy and stealth. | |
| disable_coop | No | Disable Cross-Origin-Opener-Policy for sites that require it. | |
| enable_cache | No | Cache pages, requests, etc. Uses more memory but improves performance when revisiting pages. | |
| waitStrategy | No | Wait strategy for page load. Defaults to 'domcontentloaded'. 'load' waits for all resources, 'networkidle' waits for network activity to finish. | domcontentloaded |
| captchaPolicy | No | Challenge handling policy. 'detect' reports signals, 'pause' returns state for human action, 'fail' returns an error, 'attempt' returns enhanced challenge metadata, interactive elements, a bounded screenshot, and a suggested strategy. When CAPTCHA_AUTONOMOUS=true, responses are marked for LLM-assisted handling and include provider-specific challengePlaybook context when known. | |
| exclude_addons | No | List of default addons to exclude (e.g., ['ublock_origin']). Rejected unless CAMOUFOX_MCP_ALLOW_UNSAFE_OPTIONS=1. | |
| includeConsole | No | Include bounded page console diagnostics in the JSON response. | |
| includeNetwork | No | Include bounded network diagnostics in the JSON response. | |
| stealthProfile | No | Convenience profile for common Camoufox browser settings. Explicit options override profile values. | normal |
| firefox_user_prefs | No | Custom Firefox user preferences to set. Rejected unless CAMOUFOX_MCP_ALLOW_UNSAFE_OPTIONS=1; denied prefs are always rejected. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| links | Yes | |
| title | No | |
| status | No | |
| message | No | |
| maxLinks | Yes | |
| selector | No | |
| truncated | Yes | |
| contentType | No | |
| diagnostics | No | |
| challengeType | No | |
| selectorFound | Yes | |
| captchaIframes | No | |
| captchaDetected | No | |
| challengeSignals | No | |
| challengeHandling | No | |
| challengePlaybook | No | |
| challengeProvider | No | |
| suggestedStrategy | No | |
| requiresUserAction | No | |
| interactiveElements | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, covering the safety profile. The description adds 'navigate once' and 'visible navigable' as useful behavioral qualifiers, but provides no details about rendering, waiting, or filtering mechanics. No contradiction with 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?
At just eight words, the description is exceptionally concise and front-loaded with the action ('Navigate') and scope ('visible navigable links'). Every word adds value with no redundancy or filler.
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 extremely rich schema (100% parameter coverage), annotations, and an output schema, the one-sentence description is a sufficient high-level summary. It could briefly mention when to use this over sibling tools, but the existing structured data compensates for the brevity.
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% description coverage, so the schema itself provides full parameter semantics. The tool description does not mention any parameters, but since the schema thoroughly documents all 25 parameters, a 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 uses specific language: 'Navigate once' distinguishes it from session-based sibling tools like browse_session_navigate, and 'only visible navigable links' specifies the exact output scope. However, it does not explicitly name alternative tools, so it is clear but not maximally differentiating.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use or alternative guidance is given. The description implies usage for extracting visible links after a single page load, but does not explain when to prefer browse_links over browse_find or browse_outline. This is implied usage at best.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browse_network_summaryBRead-only
Navigate once and return a bounded network diagnostic summary.
| Name | Required | Description | Default |
|---|---|---|---|
| os | No | Optional OS to spoof. Can be 'windows', 'macos', or 'linux'. If not specified, will rotate between all OS types. | |
| url | Yes | The URL to navigate to. Must be a fully qualified http or https URL. | |
| args | No | Additional browser command-line arguments to pass to the browser. Rejected unless CAMOUFOX_MCP_ALLOW_UNSAFE_OPTIONS=1; denied args are always rejected. | |
| geoip | No | Automatically detect geolocation based on IP address. | |
| proxy | No | Proxy configuration for routing browser traffic through an HTTP(S) proxy. Proxy servers are checked against the same local-network URL policy as page requests. | |
| locale | No | Browser locale (e.g., 'en-US', 'fr-FR'). | |
| window | No | Set fixed window size [width, height] instead of random generation. An empty array [] is accepted and treated as if the window parameter was not specified. | |
| timeout | No | Timeout in milliseconds for page load (5-300 seconds). | |
| headless | No | Run browser in headless mode. Auto-detects best mode for environment if not specified. | |
| humanize | No | Enable realistic cursor movements and human-like behavior for better stealth and anti-detection. | |
| viewport | No | Custom viewport dimensions. | |
| block_webgl | No | Block WebGL to prevent fingerprinting and tracking. | |
| maxFailures | No | Maximum failed requests to include in the summary. | |
| block_images | No | Block all images for faster loading, reduced bandwidth, and lightweight browsing. | |
| block_webrtc | No | Block WebRTC entirely for enhanced privacy and stealth. | |
| disable_coop | No | Disable Cross-Origin-Opener-Policy for sites that require it. | |
| enable_cache | No | Cache pages, requests, etc. Uses more memory but improves performance when revisiting pages. | |
| waitStrategy | No | Wait strategy for page load. Defaults to 'domcontentloaded'. 'load' waits for all resources, 'networkidle' waits for network activity to finish. | domcontentloaded |
| captchaPolicy | No | Challenge handling policy. 'detect' reports signals, 'pause' returns state for human action, 'fail' returns an error, 'attempt' returns enhanced challenge metadata, interactive elements, a bounded screenshot, and a suggested strategy. When CAPTCHA_AUTONOMOUS=true, responses are marked for LLM-assisted handling and include provider-specific challengePlaybook context when known. | |
| exclude_addons | No | List of default addons to exclude (e.g., ['ublock_origin']). Rejected unless CAMOUFOX_MCP_ALLOW_UNSAFE_OPTIONS=1. | |
| includeConsole | No | Include bounded page console diagnostics in the JSON response. | |
| includeNetwork | No | Include bounded network diagnostics in the JSON response. | |
| stealthProfile | No | Convenience profile for common Camoufox browser settings. Explicit options override profile values. | normal |
| firefox_user_prefs | No | Custom Firefox user preferences to set. Rejected unless CAMOUFOX_MCP_ALLOW_UNSAFE_OPTIONS=1; denied prefs are always rejected. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| title | No | |
| failed | Yes | |
| status | No | |
| blocked | Yes | |
| message | No | |
| requests | Yes | |
| truncated | Yes | |
| contentType | No | |
| topFailures | Yes | |
| statusCounts | Yes | |
| challengeType | No | |
| captchaIframes | No | |
| captchaDetected | No | |
| challengeSignals | No | |
| challengeHandling | No | |
| challengePlaybook | No | |
| challengeProvider | No | |
| suggestedStrategy | No | |
| requiresUserAction | No | |
| resourceTypeCounts | Yes | |
| interactiveElements | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, covering the safety profile. The description adds 'navigate once' and 'bounded', providing useful context about the tool's behavior, but does not disclose details like error handling or output limits beyond 'bounded'.
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?
One sentence, front-loaded, no redundancy. 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 24 parameters and a rich output schema, a one-sentence description is minimal. The description lacks context on what diagnostics are included (e.g., failures, resource types) and when to use the tool, but the output schema and annotations compensate partially.
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 3. The description adds no parameter-specific information 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 uses a specific verb ('Navigate once') and identifies a distinct resource ('bounded network diagnostic summary'), which distinguishes it from sibling tools like browse_links or browse_console. However, it could be clearer about what the summary contains (e.g., failed requests, performance metrics).
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 mention of when to use this tool vs alternatives or any exclusions. The description implies a single navigation scenario but provides no explicit guidance on selecting it over other browse tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browse_outlineARead-only
Navigate once and return page headings and landmarks.
| Name | Required | Description | Default |
|---|---|---|---|
| os | No | Optional OS to spoof. Can be 'windows', 'macos', or 'linux'. If not specified, will rotate between all OS types. | |
| url | Yes | The URL to navigate to. Must be a fully qualified http or https URL. | |
| args | No | Additional browser command-line arguments to pass to the browser. Rejected unless CAMOUFOX_MCP_ALLOW_UNSAFE_OPTIONS=1; denied args are always rejected. | |
| geoip | No | Automatically detect geolocation based on IP address. | |
| proxy | No | Proxy configuration for routing browser traffic through an HTTP(S) proxy. Proxy servers are checked against the same local-network URL policy as page requests. | |
| locale | No | Browser locale (e.g., 'en-US', 'fr-FR'). | |
| window | No | Set fixed window size [width, height] instead of random generation. An empty array [] is accepted and treated as if the window parameter was not specified. | |
| timeout | No | Timeout in milliseconds for page load (5-300 seconds). | |
| headless | No | Run browser in headless mode. Auto-detects best mode for environment if not specified. | |
| humanize | No | Enable realistic cursor movements and human-like behavior for better stealth and anti-detection. | |
| maxItems | No | Maximum headings and landmarks to return. | |
| selector | No | Optional CSS selector to limit extraction to one matching element. | |
| viewport | No | Custom viewport dimensions. | |
| block_webgl | No | Block WebGL to prevent fingerprinting and tracking. | |
| block_images | No | Block all images for faster loading, reduced bandwidth, and lightweight browsing. | |
| block_webrtc | No | Block WebRTC entirely for enhanced privacy and stealth. | |
| disable_coop | No | Disable Cross-Origin-Opener-Policy for sites that require it. | |
| enable_cache | No | Cache pages, requests, etc. Uses more memory but improves performance when revisiting pages. | |
| waitStrategy | No | Wait strategy for page load. Defaults to 'domcontentloaded'. 'load' waits for all resources, 'networkidle' waits for network activity to finish. | domcontentloaded |
| captchaPolicy | No | Challenge handling policy. 'detect' reports signals, 'pause' returns state for human action, 'fail' returns an error, 'attempt' returns enhanced challenge metadata, interactive elements, a bounded screenshot, and a suggested strategy. When CAPTCHA_AUTONOMOUS=true, responses are marked for LLM-assisted handling and include provider-specific challengePlaybook context when known. | |
| exclude_addons | No | List of default addons to exclude (e.g., ['ublock_origin']). Rejected unless CAMOUFOX_MCP_ALLOW_UNSAFE_OPTIONS=1. | |
| includeConsole | No | Include bounded page console diagnostics in the JSON response. | |
| includeNetwork | No | Include bounded network diagnostics in the JSON response. | |
| stealthProfile | No | Convenience profile for common Camoufox browser settings. Explicit options override profile values. | normal |
| firefox_user_prefs | No | Custom Firefox user preferences to set. Rejected unless CAMOUFOX_MCP_ALLOW_UNSAFE_OPTIONS=1; denied prefs are always rejected. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| title | No | |
| status | No | |
| message | No | |
| headings | Yes | |
| maxItems | Yes | |
| selector | No | |
| landmarks | Yes | |
| truncated | Yes | |
| contentType | No | |
| description | No | |
| diagnostics | No | |
| challengeType | No | |
| selectorFound | Yes | |
| captchaIframes | No | |
| captchaDetected | No | |
| challengeSignals | No | |
| challengeHandling | No | |
| challengePlaybook | No | |
| challengeProvider | No | |
| suggestedStrategy | No | |
| requiresUserAction | No | |
| interactiveElements | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true and destructiveHint=false, so the safety profile is established. The description adds the useful fact that the tool performs a fresh navigation ('Navigate once') rather than reusing a session, which is behavioral context beyond the annotations. However, it does not disclose any other behavioral traits such as network request specifics or potential delays.
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 with no waste. Every word contributes: 'Navigate once' sets the execution model, and 'return page headings and landmarks' specifies the output. It is appropriately sized for an MCP tool description.
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 25 parameters and an output schema, the description is complete enough for a simple outline-extraction tool. The core behavior is clearly stated, and the output schema presumably documents the return structure. It doesn't address edge cases or usage context, but for a read-only outline tool, it suffices.
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%, with all 25 parameters including detailed descriptions and enums. The tool description does not add any parameter-level semantics, so the baseline of 3 is appropriate—the schema carries the full burden and does so effectively.
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 navigates once and returns page headings and landmarks. This is a specific verb+resource combination that distinguishes it from sibling tools like browse_links, browse_forms, and browse_snapshot, which have different extraction targets.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Navigate once' hints at a one-shot operation, but the description does not explicitly state when to use this tool vs alternatives or when not to use it. Given the large sibling set (browse_session_*, browse_find, etc.), this lack of guidance is a notable gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browse_screenshotBRead-only
Navigate once and capture a bounded screenshot.
| Name | Required | Description | Default |
|---|---|---|---|
| os | No | Optional OS to spoof. Can be 'windows', 'macos', or 'linux'. If not specified, will rotate between all OS types. | |
| url | Yes | The URL to navigate to. Must be a fully qualified http or https URL. | |
| args | No | Additional browser command-line arguments to pass to the browser. Rejected unless CAMOUFOX_MCP_ALLOW_UNSAFE_OPTIONS=1; denied args are always rejected. | |
| type | No | Screenshot image type. | png |
| geoip | No | Automatically detect geolocation based on IP address. | |
| proxy | No | Proxy configuration for routing browser traffic through an HTTP(S) proxy. Proxy servers are checked against the same local-network URL policy as page requests. | |
| locale | No | Browser locale (e.g., 'en-US', 'fr-FR'). | |
| window | No | Set fixed window size [width, height] instead of random generation. An empty array [] is accepted and treated as if the window parameter was not specified. | |
| quality | No | JPEG quality from 1-100. Ignored for PNG. | |
| timeout | No | Timeout in milliseconds for page load (5-300 seconds). | |
| fullPage | No | Capture the full page instead of only the viewport. | |
| headless | No | Run browser in headless mode. Auto-detects best mode for environment if not specified. | |
| humanize | No | Enable realistic cursor movements and human-like behavior for better stealth and anti-detection. | |
| selector | No | Optional CSS selector for element-only screenshots. | |
| viewport | No | Custom viewport dimensions. | |
| block_webgl | No | Block WebGL to prevent fingerprinting and tracking. | |
| block_images | No | Block all images for faster loading, reduced bandwidth, and lightweight browsing. | |
| block_webrtc | No | Block WebRTC entirely for enhanced privacy and stealth. | |
| disable_coop | No | Disable Cross-Origin-Opener-Policy for sites that require it. | |
| enable_cache | No | Cache pages, requests, etc. Uses more memory but improves performance when revisiting pages. | |
| waitStrategy | No | Wait strategy for page load. Defaults to 'domcontentloaded'. 'load' waits for all resources, 'networkidle' waits for network activity to finish. | domcontentloaded |
| captchaPolicy | No | Challenge handling policy. 'detect' reports signals, 'pause' returns state for human action, 'fail' returns an error, 'attempt' returns enhanced challenge metadata, interactive elements, a bounded screenshot, and a suggested strategy. When CAPTCHA_AUTONOMOUS=true, responses are marked for LLM-assisted handling and include provider-specific challengePlaybook context when known. | |
| exclude_addons | No | List of default addons to exclude (e.g., ['ublock_origin']). Rejected unless CAMOUFOX_MCP_ALLOW_UNSAFE_OPTIONS=1. | |
| includeConsole | No | Include bounded page console diagnostics in the JSON response. | |
| includeNetwork | No | Include bounded network diagnostics in the JSON response. | |
| stealthProfile | No | Convenience profile for common Camoufox browser settings. Explicit options override profile values. | normal |
| firefox_user_prefs | No | Custom Firefox user preferences to set. Rejected unless CAMOUFOX_MCP_ALLOW_UNSAFE_OPTIONS=1; denied prefs are always rejected. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| title | No | |
| status | No | |
| message | No | |
| screenshot | Yes | |
| contentType | No | |
| challengeType | No | |
| captchaIframes | No | |
| captchaDetected | No | |
| challengeSignals | No | |
| challengeHandling | No | |
| challengePlaybook | No | |
| challengeProvider | No | |
| suggestedStrategy | No | |
| requiresUserAction | No | |
| interactiveElements | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. However, the description adds only the vague term 'bounded' and does not explain what it means, nor does it disclose any behavioral traits such as stealth behavior, captcha handling, or response characteristics. It contributes minimal behavioral context beyond the structured 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 a single, concise sentence: 'Navigate once and capture a bounded screenshot.' It contains no fluff, redundant text, or repetition of schema details. Every word serves a purpose, making it highly efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having rich schema and annotations, the tool is complex (27 parameters, nested objects, output schema). The description is too terse to provide sufficient context for an agent to fully understand the tool's capabilities and limitations. Terms like 'bounded' are undefined, and there is no mention of key behavioral aspects like stealth profiles, wait strategies, or diagnostic options. Given the complexity, the description is under-specified.
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% for all 27 parameters, with each parameter having a detailed description. The tool description itself adds no parameter-specific meaning, but since the schema fully documents parameter semantics, a 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 'Navigate once and capture a bounded screenshot' uses a specific verb ('capture') and resource ('bounded screenshot'), and 'navigate once' clearly distinguishes it from multi-step tools like browse_sequence or persistent-session tools. It precisely states the tool's core function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'navigate once' implies single-shot usage, subtly contrasting with browse_sequence, but there is no explicit statement of when to use this tool versus alternatives, nor any exclusions or prerequisites. The guidance is implied rather than direct.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browse_sequenceA
Navigate once, run bounded selector actions, then return final state.
| Name | Required | Description | Default |
|---|---|---|---|
| os | No | Optional OS to spoof. Can be 'windows', 'macos', or 'linux'. If not specified, will rotate between all OS types. | |
| url | Yes | The URL to navigate to. Must be a fully qualified http or https URL. | |
| args | No | Additional browser command-line arguments to pass to the browser. Rejected unless CAMOUFOX_MCP_ALLOW_UNSAFE_OPTIONS=1; denied args are always rejected. | |
| geoip | No | Automatically detect geolocation based on IP address. | |
| proxy | No | Proxy configuration for routing browser traffic through an HTTP(S) proxy. Proxy servers are checked against the same local-network URL policy as page requests. | |
| locale | No | Browser locale (e.g., 'en-US', 'fr-FR'). | |
| window | No | Set fixed window size [width, height] instead of random generation. An empty array [] is accepted and treated as if the window parameter was not specified. | |
| actions | Yes | Bounded action sequence to run after navigation. | |
| timeout | No | Timeout in milliseconds for page load (5-300 seconds). | |
| headless | No | Run browser in headless mode. Auto-detects best mode for environment if not specified. | |
| humanize | No | Enable realistic cursor movements and human-like behavior for better stealth and anti-detection. | |
| maxChars | No | Maximum final text, HTML, snapshot, or evaluate-result characters to return. | |
| selector | No | Optional CSS selector to limit final content extraction to one matching element. | |
| viewport | No | Custom viewport dimensions. | |
| outputMode | No | Final response content mode. | text |
| screenshot | No | Capture a screenshot/image after all actions finish. | |
| block_webgl | No | Block WebGL to prevent fingerprinting and tracking. | |
| maxElements | No | Maximum final snapshot elements to return. | |
| block_images | No | Block all images for faster loading, reduced bandwidth, and lightweight browsing. | |
| block_webrtc | No | Block WebRTC entirely for enhanced privacy and stealth. | |
| disable_coop | No | Disable Cross-Origin-Opener-Policy for sites that require it. | |
| enable_cache | No | Cache pages, requests, etc. Uses more memory but improves performance when revisiting pages. | |
| waitStrategy | No | Wait strategy for page load. Defaults to 'domcontentloaded'. 'load' waits for all resources, 'networkidle' waits for network activity to finish. | domcontentloaded |
| captchaPolicy | No | Challenge handling policy. 'detect' reports signals, 'pause' returns state for human action, 'fail' returns an error, 'attempt' returns enhanced challenge metadata, interactive elements, a bounded screenshot, and a suggested strategy. When CAPTCHA_AUTONOMOUS=true, responses are marked for LLM-assisted handling and include provider-specific challengePlaybook context when known. | |
| exclude_addons | No | List of default addons to exclude (e.g., ['ublock_origin']). Rejected unless CAMOUFOX_MCP_ALLOW_UNSAFE_OPTIONS=1. | |
| includeConsole | No | Include bounded page console diagnostics in the JSON response. | |
| includeNetwork | No | Include bounded network diagnostics in the JSON response. | |
| stealthProfile | No | Convenience profile for common Camoufox browser settings. Explicit options override profile values. | normal |
| screenshotOptions | No | Optional screenshot capture settings. Used only when screenshot is true. | |
| firefox_user_prefs | No | Custom Firefox user preferences to set. Rejected unless CAMOUFOX_MCP_ALLOW_UNSAFE_OPTIONS=1; denied prefs are always rejected. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| html | No | |
| text | No | |
| title | No | |
| status | No | |
| actions | Yes | |
| message | No | |
| maxChars | Yes | |
| selector | No | |
| snapshot | No | |
| truncated | Yes | |
| outputMode | Yes | |
| screenshot | No | |
| contentType | No | |
| diagnostics | No | |
| challengeType | No | |
| initialStatus | No | |
| selectorFound | No | |
| captchaIframes | No | |
| captchaDetected | No | |
| challengeSignals | No | |
| challengeHandling | No | |
| challengePlaybook | No | |
| challengeProvider | No | |
| suggestedStrategy | No | |
| requiresUserAction | No | |
| interactiveElements | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnly=false, openWorld=true, idempotent=false, destructive=false. The description adds 'bounded' actions and 'final state' but does not disclose side effects like cookies, challenge handling, or failure behavior. It is consistent with annotations but adds limited extra context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence communicates the core workflow without wasted words. Every phrase contributes meaning.
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 very detailed schema and output schema, the high-level description captures the essential workflow. It does not explain every option, but that is handled by the schema. The description could mention session alternatives, but for a bounded one-off sequence it is sufficiently 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% and all parameters have descriptions. The description does not add parameter-level detail beyond the schema, so baseline 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's function: navigate once, execute bounded selector actions, and return final state. It distinguishes itself from sibling tools like browse_session_action and browse by emphasizing a single navigation with a bounded action sequence.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Navigate once' implies a one-shot use case, but it does not explicitly state when to prefer this over browse_session_* or browse. No alternative tools are named or exclusions given, so usage context is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browse_session_actionB
Run one bounded action in an existing browser session.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | One bounded action to run in the existing session. | |
| maxChars | No | Maximum final visible text characters to return in snapshot. | |
| selector | No | Optional CSS selector to limit final snapshot. | |
| sessionId | Yes | Session ID returned by browse_session_start. | |
| maxElements | No | Maximum final snapshot elements to return. | |
| captchaPolicy | No | Challenge handling policy. 'detect' reports signals, 'pause' returns state for human action, 'fail' returns an error, 'attempt' returns enhanced challenge metadata, interactive elements, a bounded screenshot, and a suggested strategy. When CAPTCHA_AUTONOMOUS=true, responses are marked for LLM-assisted handling and include provider-specific challengePlaybook context when known. |
Output Schema
| Name | Required | Description |
|---|---|---|
| action | Yes | |
| message | No | |
| snapshot | Yes | |
| expiresAt | Yes | |
| sessionId | Yes | |
| challengeType | No | |
| captchaIframes | No | |
| captchaDetected | No | |
| challengeSignals | No | |
| challengeHandling | No | |
| challengePlaybook | No | |
| challengeProvider | No | |
| suggestedStrategy | No | |
| requiresUserAction | No | |
| interactiveElements | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false, openWorldHint=true, idempotentHint=false, destructiveHint=false. The description adds almost no behavioral context beyond 'bounded', which is too vague. It does not disclose that actions may navigate, evaluate JavaScript, modify page state, or perform irreversible interactions, leaving significant risk unaddressed.
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 zero wasted words, front-loading the core purpose effectively. However, given the tool's complexity (large action union, many options), a bit more orientation would be appropriate; it is slightly under-sized rather than ideally concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With rich schema, annotations, and an output schema, the description is minimally viable. It states the core function and existing-session requirement. However, it lacks usage context, does not clarify the variety of supported actions, and offers no differentiation from siblings, making it incomplete for a tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 100%, and the input schema provides detailed descriptions for parameters like sessionId, action, captchaPolicy, and snapshot limits. The description adds no parameter-level meaning beyond what the schema already 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 'Run one bounded action in an existing browser session' uses a specific verb ('run'), a clear resource ('bounded action'), and context ('existing browser session'). It effectively distinguishes this from siblings like browse_session_start (create) and browse_sequence (multiple actions) by emphasizing 'one bounded 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 provides no guidance on when to use this tool versus alternatives such as browse_sequence or browse_session_navigate. It implies a precondition (existing session) but does not state exclusions, alternatives, or when a different tool would be more appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browse_session_closeB
Close an existing browser session.
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | Yes | Session ID returned by browse_session_start. |
Output Schema
| Name | Required | Description |
|---|---|---|
| closed | Yes | |
| sessionId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and idempotentHint=false, so the description's job is to add context like side effects or prerequisites. It only says 'close an existing session,' which adds minimal value beyond the tool name. It does not mention what happens if the session is already closed or whether any cleanup occurs.
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, straightforward sentence that conveys the essential information without any superfluous content. It is optimally concise and easy to parse.
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 an output schema present, the description is mostly complete. However, it could benefit from noting that closing a session is non-idempotent or that the session must be active, though the schema partially covers this. Given the low complexity, the description is adequate but not exhaustive.
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 covers 100% of the parameter (sessionId) and describes it as 'Session ID returned by browse_session_start.' The description does not add any additional meaning to the parameter, so with high schema coverage the 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 "Close an existing browser session" uses a specific verb (close) and resource (browser session), clearly distinguishing it from sibling tools like browse_session_start (start) and browse_session_navigate (navigate). It precisely identifies the action without ambiguity.
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, when not to, or what alternatives exist. It only states what the tool does, leaving the agent to infer that it should be used after a session is no longer needed. No exclusions or comparisons with siblings are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browse_session_resumeA
Resume a paused session after human action and return current state.
| Name | Required | Description | Default |
|---|---|---|---|
| timeout | No | Timeout in milliseconds for the resume wait. | |
| maxChars | No | Maximum visible text and ARIA snapshot characters to return. | |
| selector | No | Optional CSS selector to limit snapshot extraction. | |
| sessionId | Yes | Session ID returned by browse_session_start. | |
| maxElements | No | Maximum interactive elements to return. | |
| waitStrategy | No | Optional load state to wait for before reading the session. | |
| captchaPolicy | No | Challenge handling policy. 'detect' reports signals, 'pause' returns state for human action, 'fail' returns an error, 'attempt' returns enhanced challenge metadata, interactive elements, a bounded screenshot, and a suggested strategy. When CAPTCHA_AUTONOMOUS=true, responses are marked for LLM-assisted handling and include provider-specific challengePlaybook context when known. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| text | Yes | |
| title | No | |
| status | No | |
| message | No | |
| elements | Yes | |
| maxChars | Yes | |
| selector | No | |
| expiresAt | Yes | |
| sessionId | Yes | |
| contentType | No | |
| diagnostics | No | |
| maxElements | Yes | |
| ariaSnapshot | No | |
| challengeType | No | |
| selectorFound | Yes | |
| textTruncated | Yes | |
| captchaIframes | No | |
| captchaDetected | No | |
| challengeSignals | No | |
| ariaSnapshotError | No | |
| challengeHandling | No | |
| challengePlaybook | No | |
| challengeProvider | No | |
| elementsTruncated | Yes | |
| suggestedStrategy | No | |
| requiresUserAction | No | |
| interactiveElements | No | |
| ariaSnapshotTruncated | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate openWorldHint=true (the session may change externally) and this description goes beyond the annotations by explicitly mentioning 'after human action' and 'return current state', which signals that the tool waits for and reflects external state changes. It also implies the pause/resume flow, which is crucial behavioral context not apparent from annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence with no wasted words. It front-loads the essential action ('Resume a paused session') and includes the key output expectation ('return current state'), which is exactly what the agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has an output schema, rich parameter descriptions, and annotations, the description is sufficient. The only minor gap is not mentioning any specific return format details, but the output schema covers that. The description is complete for the tool's purpose and context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with thorough parameter descriptions, especially captchaPolicy which details each enum value and the CAPTCHA_AUTONOMOUS behavior. The description says 'return current state' which aligns with the output schema. Although the description does not list parameters, the schema is rich and self-explanatory, so the description adds minimal but sufficient guidance.
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 ('Resume') and resource ('a paused session'), and clarifies the return value ('return current state'). It distinguishes itself from sibling tools like browse_session_start, browse_session_snapshot, and browse_session_close by focusing on resuming a paused session after human 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 clearly states the context of use: after a human action, to resume a paused session. It does not explicitly name alternatives or exclusions, but the context is clear enough given the sibling set and the captchaPolicy pause option which connects to when this tool would be used.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browse_session_snapshotBRead-only
Read the current state of an existing browser session.
| Name | Required | Description | Default |
|---|---|---|---|
| maxChars | No | Maximum visible text and ARIA snapshot characters to return. | |
| selector | No | Optional CSS selector to limit snapshot extraction. | |
| sessionId | Yes | Session ID returned by browse_session_start. | |
| maxElements | No | Maximum interactive elements to return. | |
| captchaPolicy | No | Challenge handling policy. 'detect' reports signals, 'pause' returns state for human action, 'fail' returns an error, 'attempt' returns enhanced challenge metadata, interactive elements, a bounded screenshot, and a suggested strategy. When CAPTCHA_AUTONOMOUS=true, responses are marked for LLM-assisted handling and include provider-specific challengePlaybook context when known. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| text | Yes | |
| title | No | |
| status | No | |
| message | No | |
| elements | Yes | |
| maxChars | Yes | |
| selector | No | |
| expiresAt | Yes | |
| sessionId | Yes | |
| contentType | No | |
| diagnostics | No | |
| maxElements | Yes | |
| ariaSnapshot | No | |
| challengeType | No | |
| selectorFound | Yes | |
| textTruncated | Yes | |
| captchaIframes | No | |
| captchaDetected | No | |
| challengeSignals | No | |
| ariaSnapshotError | No | |
| challengeHandling | No | |
| challengePlaybook | No | |
| challengeProvider | No | |
| elementsTruncated | Yes | |
| suggestedStrategy | No | |
| requiresUserAction | No | |
| interactiveElements | No | |
| ariaSnapshotTruncated | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the 'Read' claim is consistent and safe. However, the description adds no additional behavioral context beyond the annotations, such as session expiration behavior, error conditions, or the meaning of the captchaPolicy parameter.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence that immediately conveys the tool's purpose without any filler or redundant detail. It is front-loaded and every word contributes to understanding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of a full output schema, extensive annotations (readOnly, openWorld), and complete parameter documentation, the description is sufficient for basic understanding. It does not explain non-obvious aspects like CAPTCHA handling, but those are covered in the schema, so this is acceptable for a read-only snapshot 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?
The input schema provides 100% parameter coverage, including descriptions for all five parameters, so the schema carries the full burden. The description adds no extra meaning to the parameters, therefore the baseline 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 the action (read) and the resource (current state of an existing browser session), making it distinct from session creation or navigation tools. It does not explicitly name sibling alternatives, but the phrase 'existing browser session' differentiates it from non-session snapshots like browse_snapshot.
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 is for an already-started session, but it provides no explicit when-to-use guidance or exclusions compared to sibling tools. The context signal that a sessionId is required is present in the schema, not the description, so the guidance remains only implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browse_session_startB
Start an isolated short-lived browser session.
| Name | Required | Description | Default |
|---|---|---|---|
| os | No | Optional OS to spoof. Can be 'windows', 'macos', or 'linux'. If not specified, will rotate between all OS types. | |
| args | No | Additional browser command-line arguments to pass to the browser. Rejected unless CAMOUFOX_MCP_ALLOW_UNSAFE_OPTIONS=1; denied args are always rejected. | |
| geoip | No | Automatically detect geolocation based on IP address. | |
| proxy | No | Proxy configuration for routing browser traffic through an HTTP(S) proxy. Proxy servers are checked against the same local-network URL policy as page requests. | |
| locale | No | Browser locale (e.g., 'en-US', 'fr-FR'). | |
| window | No | Set fixed window size [width, height] instead of random generation. An empty array [] is accepted and treated as if the window parameter was not specified. | |
| timeout | No | Timeout in milliseconds for page load (5-300 seconds). | |
| headless | No | Run browser in headless mode. Auto-detects best mode for environment if not specified. | |
| humanize | No | Enable realistic cursor movements and human-like behavior for better stealth and anti-detection. | |
| viewport | No | Custom viewport dimensions. | |
| block_webgl | No | Block WebGL to prevent fingerprinting and tracking. | |
| block_images | No | Block all images for faster loading, reduced bandwidth, and lightweight browsing. | |
| block_webrtc | No | Block WebRTC entirely for enhanced privacy and stealth. | |
| disable_coop | No | Disable Cross-Origin-Opener-Policy for sites that require it. | |
| enable_cache | No | Cache pages, requests, etc. Uses more memory but improves performance when revisiting pages. | |
| waitStrategy | No | Wait strategy for page load. Defaults to 'domcontentloaded'. 'load' waits for all resources, 'networkidle' waits for network activity to finish. | domcontentloaded |
| captchaPolicy | No | Challenge handling policy. 'detect' reports signals, 'pause' returns state for human action, 'fail' returns an error, 'attempt' returns enhanced challenge metadata, interactive elements, a bounded screenshot, and a suggested strategy. When CAPTCHA_AUTONOMOUS=true, responses are marked for LLM-assisted handling and include provider-specific challengePlaybook context when known. | |
| exclude_addons | No | List of default addons to exclude (e.g., ['ublock_origin']). Rejected unless CAMOUFOX_MCP_ALLOW_UNSAFE_OPTIONS=1. | |
| includeConsole | No | Include bounded page console diagnostics in the JSON response. | |
| includeNetwork | No | Include bounded network diagnostics in the JSON response. | |
| stealthProfile | No | Convenience profile for common Camoufox browser settings. Explicit options override profile values. | normal |
| firefox_user_prefs | No | Custom Firefox user preferences to set. Rejected unless CAMOUFOX_MCP_ALLOW_UNSAFE_OPTIONS=1; denied prefs are always rejected. |
Output Schema
| Name | Required | Description |
|---|---|---|
| browser | Yes | |
| expiresAt | Yes | |
| sessionId | Yes | |
| selectedOS | Yes | |
| headlessMode | Yes | |
| captchaPolicy | Yes | |
| stealthProfile | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and openWorldHint=true. The description adds the novel context that sessions are isolated and short-lived, which is useful. However, it doesn't disclose what 'start' returns or whether sessions require explicit closing, though the output schema covers some of that. Moderate added value beyond 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 a single six-word sentence with zero fluff, making it extremely conciseness and front-loaded. It earns its place but is perhaps too terse, missing the opportunity to add workflow context. Still, it is appropriately concise for a simple action.
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 22 parameters, an output schema, and nested objects, the description is extremely underspecified. It doesn't explain the session lifecycle, how this tool relates to sibling browse_session_* tools, or important defaults. The schema and output schema mitigate but don't eliminate the gap; the description fails to place the tool in the broader workflow.
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 all 22 parameters already have individual descriptions. The tool description adds no parameter semantics, and the baseline for high schema coverage is 3. It doesn't compensate or add any extra meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('start') and names the resource ('browser session'), adding scope with 'isolated short-lived.' This distinguishes it from sibling session tools that navigate or close sessions. However, it remains terse and doesn't elaborate on what a session entails, so it doesn't earn a 5.
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 guidance on when to use this tool versus alternatives like 'browse' or other browse_session_* tools. It doesn't state that this should be called before other session operations or when a one-off 'browse' is more appropriate. There's no mention of exclusions or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browse_snapshotARead-only
Navigate once and return visible text, ARIA snapshot, and interactive metadata.
| Name | Required | Description | Default |
|---|---|---|---|
| os | No | Optional OS to spoof. Can be 'windows', 'macos', or 'linux'. If not specified, will rotate between all OS types. | |
| url | Yes | The URL to navigate to. Must be a fully qualified http or https URL. | |
| args | No | Additional browser command-line arguments to pass to the browser. Rejected unless CAMOUFOX_MCP_ALLOW_UNSAFE_OPTIONS=1; denied args are always rejected. | |
| geoip | No | Automatically detect geolocation based on IP address. | |
| proxy | No | Proxy configuration for routing browser traffic through an HTTP(S) proxy. Proxy servers are checked against the same local-network URL policy as page requests. | |
| locale | No | Browser locale (e.g., 'en-US', 'fr-FR'). | |
| window | No | Set fixed window size [width, height] instead of random generation. An empty array [] is accepted and treated as if the window parameter was not specified. | |
| timeout | No | Timeout in milliseconds for page load (5-300 seconds). | |
| headless | No | Run browser in headless mode. Auto-detects best mode for environment if not specified. | |
| humanize | No | Enable realistic cursor movements and human-like behavior for better stealth and anti-detection. | |
| maxChars | No | Maximum visible text and ARIA snapshot characters to return. | |
| selector | No | Optional CSS selector to limit snapshot extraction to one matching element. | |
| viewport | No | Custom viewport dimensions. | |
| block_webgl | No | Block WebGL to prevent fingerprinting and tracking. | |
| maxElements | No | Maximum interactive elements to return. | |
| block_images | No | Block all images for faster loading, reduced bandwidth, and lightweight browsing. | |
| block_webrtc | No | Block WebRTC entirely for enhanced privacy and stealth. | |
| disable_coop | No | Disable Cross-Origin-Opener-Policy for sites that require it. | |
| enable_cache | No | Cache pages, requests, etc. Uses more memory but improves performance when revisiting pages. | |
| waitStrategy | No | Wait strategy for page load. Defaults to 'domcontentloaded'. 'load' waits for all resources, 'networkidle' waits for network activity to finish. | domcontentloaded |
| captchaPolicy | No | Challenge handling policy. 'detect' reports signals, 'pause' returns state for human action, 'fail' returns an error, 'attempt' returns enhanced challenge metadata, interactive elements, a bounded screenshot, and a suggested strategy. When CAPTCHA_AUTONOMOUS=true, responses are marked for LLM-assisted handling and include provider-specific challengePlaybook context when known. | |
| exclude_addons | No | List of default addons to exclude (e.g., ['ublock_origin']). Rejected unless CAMOUFOX_MCP_ALLOW_UNSAFE_OPTIONS=1. | |
| includeConsole | No | Include bounded page console diagnostics in the JSON response. | |
| includeNetwork | No | Include bounded network diagnostics in the JSON response. | |
| stealthProfile | No | Convenience profile for common Camoufox browser settings. Explicit options override profile values. | normal |
| firefox_user_prefs | No | Custom Firefox user preferences to set. Rejected unless CAMOUFOX_MCP_ALLOW_UNSAFE_OPTIONS=1; denied prefs are always rejected. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| text | Yes | |
| title | No | |
| status | No | |
| message | No | |
| elements | Yes | |
| maxChars | Yes | |
| selector | No | |
| contentType | No | |
| diagnostics | No | |
| maxElements | Yes | |
| ariaSnapshot | No | |
| challengeType | No | |
| selectorFound | Yes | |
| textTruncated | Yes | |
| captchaIframes | No | |
| captchaDetected | No | |
| challengeSignals | No | |
| ariaSnapshotError | No | |
| challengeHandling | No | |
| challengePlaybook | No | |
| challengeProvider | No | |
| elementsTruncated | Yes | |
| suggestedStrategy | No | |
| requiresUserAction | No | |
| interactiveElements | No | |
| ariaSnapshotTruncated | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already specify readOnlyHint=true and destructiveHint=false, so the bar is lower. The description adds 'Navigate once', which conveys a one-time navigation action, but it doesn't disclose other behavioral aspects like bounded output or captcha handling that are present in the schema.
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 a clear action-first structure, listing the output types succinctly. Every word is meaningful and there is no 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?
Given the tool's 26 parameters and output schema, the description is quite minimal. It does convey the core purpose clearly, but it lacks an overview of advanced options like captcha policy or stealth profiles. However, the rich schema and annotations compensate, making the description sufficient for high-level 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 coverage is 100%, so the baseline is 3. The description doesn't elaborate on any parameters, but all parameter details and constraints are already well-documented in the schema, so no additional semantics are necessary.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function with a specific verb ('Navigate') and resource ('snapshot'), and enumerates the exact outputs (visible text, ARIA snapshot, interactive metadata). This distinguishes it from sibling tools like browse_links or browse_screenshot.
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, nor any exclusions. The description is purely functional and doesn't mention use cases or scenarios where other sibling tools would be preferable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
camoufox_statusARead-onlyIdempotent
Return server, browser, queue, session, and policy status without launching a page.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| browser | Yes | |
| version | Yes | |
| maxQueue | Yes | |
| platform | Yes | |
| browserPath | No | |
| maxSessions | Yes | |
| headlessMode | Yes | |
| sessionTtlMs | Yes | |
| activeBrowsers | Yes | |
| activeSessions | Yes | |
| maxConcurrency | Yes | |
| queuedRequests | Yes | |
| evaluateAllowed | Yes | |
| networkSecurity | Yes | |
| browserAvailable | Yes | |
| captchaAutonomous | Yes | |
| unsafeOptionsAllowed | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, and the description adds behavioral context by stating it returns status without launching a page. This goes beyond the annotations and clarifies that no browser session is created, which is valuable for an agent deciding between this and page-launching tools.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that front-loads the verb and resource list. Every word earns its place, with no filler or repetition.
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, no parameters, and an existing output schema, the description is complete. Annotations cover safety, and the description explains the tool's purpose and lack of side effects, leaving no significant gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With zero parameters, the description need not explain parameter behavior. The baseline of 4 applies since there is no ambiguity about inputs, and the description fully covers what the tool does.
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 the specific verb 'Return' and names the exact resources: server, browser, queue, session, and policy status. The phrase 'without launching a page' clearly differentiates it from sibling browsing tools that do launch pages, making its purpose unmistakable.
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 a lightweight status check that does not launch a page, which tells the agent when to use it (for status checks without browser side effects). However, it does not explicitly name alternative tools or state when not to use it, so it stops short of full guidance.
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.
12 tool updates
v2.5.0- Changed
browse26 fields changed- changed
Output schema / additionalPropertiesPrevious value: -{}New value: +false - added
Output schema / properties / captchaDetectedAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / captchaIframesAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "selector": { + "type": "string" + }, + "src": { + "type": "string" + }, + "title": { + "type": "string" + } + }, + "required": [ + "selector", + "src" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / challengeHandlingAdded value: +{ + "enum": [ + "manual", + "llm_assisted" + ], + "type": "string" +} - added
Output schema / properties / challengePlaybookAdded value: +{ + "type": "string" +} - added
Output schema / properties / challengeProviderAdded value: +{ + "enum": [ + "recaptcha", + "hcaptcha", + "turnstile", + "cloudflare", + "text_captcha", + "generic" + ], + "type": "string" +} - added
Output schema / properties / challengeSignalsAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / challengeTypeAdded value: +{ + "const": "captcha_or_bot_check", + "type": "string" +} - added
Output schema / properties / contentTypeAdded value: +{ + "type": "string" +} - added
Output schema / properties / diagnosticsAdded value: +{ + "additionalProperties": false, + "properties": { + "console": { + "items": { + "additionalProperties": false, + "properties": { + "location": { + "additionalProperties": false, + "properties": { + "columnNumber": { + "type": "number" + }, + "lineNumber": { + "type": "number" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "text": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "type", + "text" + ], + "type": "object" + }, + "type": "array" + }, + "consoleTruncated": { + "type": "boolean" + }, + "network": { + "items": { + "additionalProperties": false, + "properties": { + "contentType": { + "type": "string" + }, + "errorText": { + "type": "string" + }, + "failed": { + "type": "boolean" + }, + "method": { + "type": "string" + }, + "resourceType": { + "type": "string" + }, + "status": { + "type": "number" + }, + "url": { + "type": "string" + } + }, + "required": [ + "url", + "method", + "resourceType" + ], + "type": "object" + }, + "type": "array" + }, + "networkTruncated": { + "type": "boolean" + } + }, + "type": "object" +} - added
Output schema / properties / htmlAdded value: +{ + "type": "string" +} - added
Output schema / properties / interactiveElementsAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "frame": { + "type": "string" + }, + "label": { + "type": "string" + }, + "selector": { + "type": "string" + }, + "type": { + "enum": [ + "checkbox", + "input", + "button", + "image" + ], + "type": "string" + } + }, + "required": [ + "selector", + "type" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / maxCharsAdded value: +{ + "type": "number" +} - added
Output schema / properties / messageAdded value: +{ + "type": "string" +} - added
Output schema / properties / outputModeAdded value: +{ + "enum": [ + "text", + "html", + "metadata" + ], + "type": "string" +} - added
Output schema / properties / requiresUserActionAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / screenshotAdded value: +{ + "additionalProperties": false, + "properties": { + "bytes": { + "type": "number" + }, + "error": { + "type": "string" + }, + "fullPage": { + "type": "boolean" + }, + "included": { + "type": "boolean" + }, + "maxBytes": { + "type": "number" + }, + "requested": { + "type": "boolean" + }, + "selector": { + "type": "string" + }, + "selectorFound": { + "type": "boolean" + }, + "type": { + "enum": [ + "png", + "jpeg" + ], + "type": "string" + } + }, + "required": [ + "requested", + "included" + ], + "type": "object" +} - added
Output schema / properties / selectorAdded value: +{ + "type": "string" +} - added
Output schema / properties / selectorFoundAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / statusAdded value: +{ + "type": "number" +} - added
Output schema / properties / suggestedStrategyAdded value: +{ + "type": "string" +} - added
Output schema / properties / textAdded value: +{ + "type": "string" +} - added
Output schema / properties / titleAdded value: +{ + "type": "string" +} - added
Output schema / properties / truncatedAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / urlAdded value: +{ + "type": "string" +} - added
Output schema / requiredAdded value: +[ + "url", + "outputMode", + "truncated", + "maxChars" +]
- Changed
browse_console21 fields changed- added
Input schema / properties / includeConsole / defaultAdded value: +true - changed
Output schema / additionalPropertiesPrevious value: -{}New value: +false - added
Output schema / properties / captchaDetectedAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / captchaIframesAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "selector": { + "type": "string" + }, + "src": { + "type": "string" + }, + "title": { + "type": "string" + } + }, + "required": [ + "selector", + "src" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / challengeHandlingAdded value: +{ + "enum": [ + "manual", + "llm_assisted" + ], + "type": "string" +} - added
Output schema / properties / challengePlaybookAdded value: +{ + "type": "string" +} - added
Output schema / properties / challengeProviderAdded value: +{ + "enum": [ + "recaptcha", + "hcaptcha", + "turnstile", + "cloudflare", + "text_captcha", + "generic" + ], + "type": "string" +} - added
Output schema / properties / challengeSignalsAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / challengeTypeAdded value: +{ + "const": "captcha_or_bot_check", + "type": "string" +} - added
Output schema / properties / consoleAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "location": { + "additionalProperties": false, + "properties": { + "columnNumber": { + "type": "number" + }, + "lineNumber": { + "type": "number" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "text": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "type", + "text" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / consoleTruncatedAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / contentTypeAdded value: +{ + "type": "string" +} - added
Output schema / properties / interactiveElementsAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "frame": { + "type": "string" + }, + "label": { + "type": "string" + }, + "selector": { + "type": "string" + }, + "type": { + "enum": [ + "checkbox", + "input", + "button", + "image" + ], + "type": "string" + } + }, + "required": [ + "selector", + "type" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / messageAdded value: +{ + "type": "string" +} - added
Output schema / properties / networkAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "contentType": { + "type": "string" + }, + "errorText": { + "type": "string" + }, + "failed": { + "type": "boolean" + }, + "method": { + "type": "string" + }, + "resourceType": { + "type": "string" + }, + "status": { + "type": "number" + }, + "url": { + "type": "string" + } + }, + "required": [ + "url", + "method", + "resourceType" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / requiresUserActionAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / statusAdded value: +{ + "type": "number" +} - added
Output schema / properties / suggestedStrategyAdded value: +{ + "type": "string" +} - added
Output schema / properties / titleAdded value: +{ + "type": "string" +} - added
Output schema / properties / urlAdded value: +{ + "type": "string" +} - added
Output schema / requiredAdded value: +[ + "url", + "console" +]
- Changed
browse_network_summary1 field changed- added
Input schema / properties / includeNetwork / defaultAdded value: +true
- Changed
browse_screenshot18 fields changed- changed
Output schema / additionalPropertiesPrevious value: -{}New value: +false - added
Output schema / properties / captchaDetectedAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / captchaIframesAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "selector": { + "type": "string" + }, + "src": { + "type": "string" + }, + "title": { + "type": "string" + } + }, + "required": [ + "selector", + "src" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / challengeHandlingAdded value: +{ + "enum": [ + "manual", + "llm_assisted" + ], + "type": "string" +} - added
Output schema / properties / challengePlaybookAdded value: +{ + "type": "string" +} - added
Output schema / properties / challengeProviderAdded value: +{ + "enum": [ + "recaptcha", + "hcaptcha", + "turnstile", + "cloudflare", + "text_captcha", + "generic" + ], + "type": "string" +} - added
Output schema / properties / challengeSignalsAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / challengeTypeAdded value: +{ + "const": "captcha_or_bot_check", + "type": "string" +} - added
Output schema / properties / contentTypeAdded value: +{ + "type": "string" +} - added
Output schema / properties / interactiveElementsAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "frame": { + "type": "string" + }, + "label": { + "type": "string" + }, + "selector": { + "type": "string" + }, + "type": { + "enum": [ + "checkbox", + "input", + "button", + "image" + ], + "type": "string" + } + }, + "required": [ + "selector", + "type" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / messageAdded value: +{ + "type": "string" +} - added
Output schema / properties / requiresUserActionAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / screenshotAdded value: +{ + "additionalProperties": false, + "properties": { + "bytes": { + "type": "number" + }, + "error": { + "type": "string" + }, + "fullPage": { + "type": "boolean" + }, + "included": { + "type": "boolean" + }, + "maxBytes": { + "type": "number" + }, + "requested": { + "type": "boolean" + }, + "selector": { + "type": "string" + }, + "selectorFound": { + "type": "boolean" + }, + "type": { + "enum": [ + "png", + "jpeg" + ], + "type": "string" + } + }, + "required": [ + "requested", + "included" + ], + "type": "object" +} - added
Output schema / properties / statusAdded value: +{ + "type": "number" +} - added
Output schema / properties / suggestedStrategyAdded value: +{ + "type": "string" +} - added
Output schema / properties / titleAdded value: +{ + "type": "string" +} - added
Output schema / properties / urlAdded value: +{ + "type": "string" +} - added
Output schema / requiredAdded value: +[ + "url", + "screenshot" +]
- Changed
browse_sequence29 fields changed- changed
Output schema / additionalPropertiesPrevious value: -{}New value: +false - added
Output schema / properties / actionsAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "durationMs": { + "type": "number" + }, + "index": { + "type": "number" + }, + "result": { + "type": "string" + }, + "resultTruncated": { + "type": "boolean" + }, + "selector": { + "type": "string" + }, + "status": { + "const": "ok", + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "index", + "type", + "status", + "durationMs" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / captchaDetectedAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / captchaIframesAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "selector": { + "type": "string" + }, + "src": { + "type": "string" + }, + "title": { + "type": "string" + } + }, + "required": [ + "selector", + "src" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / challengeHandlingAdded value: +{ + "enum": [ + "manual", + "llm_assisted" + ], + "type": "string" +} - added
Output schema / properties / challengePlaybookAdded value: +{ + "type": "string" +} - added
Output schema / properties / challengeProviderAdded value: +{ + "enum": [ + "recaptcha", + "hcaptcha", + "turnstile", + "cloudflare", + "text_captcha", + "generic" + ], + "type": "string" +} - added
Output schema / properties / challengeSignalsAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / challengeTypeAdded value: +{ + "const": "captcha_or_bot_check", + "type": "string" +} - added
Output schema / properties / contentTypeAdded value: +{ + "type": "string" +} - added
Output schema / properties / diagnosticsAdded value: +{ + "additionalProperties": false, + "properties": { + "console": { + "items": { + "additionalProperties": false, + "properties": { + "location": { + "additionalProperties": false, + "properties": { + "columnNumber": { + "type": "number" + }, + "lineNumber": { + "type": "number" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "text": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "type", + "text" + ], + "type": "object" + }, + "type": "array" + }, + "consoleTruncated": { + "type": "boolean" + }, + "network": { + "items": { + "additionalProperties": false, + "properties": { + "contentType": { + "type": "string" + }, + "errorText": { + "type": "string" + }, + "failed": { + "type": "boolean" + }, + "method": { + "type": "string" + }, + "resourceType": { + "type": "string" + }, + "status": { + "type": "number" + }, + "url": { + "type": "string" + } + }, + "required": [ + "url", + "method", + "resourceType" + ], + "type": "object" + }, + "type": "array" + }, + "networkTruncated": { + "type": "boolean" + } + }, + "type": "object" +} - added
Output schema / properties / htmlAdded value: +{ + "type": "string" +} - added
Output schema / properties / initialStatusAdded value: +{ + "type": "number" +} - added
Output schema / properties / interactiveElementsAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "frame": { + "type": "string" + }, + "label": { + "type": "string" + }, + "selector": { + "type": "string" + }, + "type": { + "enum": [ + "checkbox", + "input", + "button", + "image" + ], + "type": "string" + } + }, + "required": [ + "selector", + "type" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / maxCharsAdded value: +{ + "type": "number" +} - added
Output schema / properties / messageAdded value: +{ + "type": "string" +} - added
Output schema / properties / outputModeAdded value: +{ + "enum": [ + "text", + "html", + "metadata" + ], + "type": "string" +} - added
Output schema / properties / requiresUserActionAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / screenshotAdded value: +{ + "additionalProperties": false, + "properties": { + "bytes": { + "type": "number" + }, + "error": { + "type": "string" + }, + "fullPage": { + "type": "boolean" + }, + "included": { + "type": "boolean" + }, + "maxBytes": { + "type": "number" + }, + "requested": { + "type": "boolean" + }, + "selector": { + "type": "string" + }, + "selectorFound": { + "type": "boolean" + }, + "type": { + "enum": [ + "png", + "jpeg" + ], + "type": "string" + } + }, + "required": [ + "requested", + "included" + ], + "type": "object" +} - added
Output schema / properties / selectorAdded value: +{ + "type": "string" +} - added
Output schema / properties / selectorFoundAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / snapshotAdded value: +{ + "additionalProperties": false, + "properties": { + "ariaSnapshot": { + "type": "string" + }, + "ariaSnapshotError": { + "type": "string" + }, + "ariaSnapshotTruncated": { + "type": "boolean" + }, + "contentType": { + "type": "string" + }, + "diagnostics": { + "additionalProperties": false, + "properties": { + "console": { + "items": { + "additionalProperties": false, + "properties": { + "location": { + "additionalProperties": false, + "properties": { + "columnNumber": { + "type": "number" + }, + "lineNumber": { + "type": "number" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "text": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "type", + "text" + ], + "type": "object" + }, + "type": "array" + }, + "consoleTruncated": { + "type": "boolean" + }, + "network": { + "items": { + "additionalProperties": false, + "properties": { + "contentType": { + "type": "string" + }, + "errorText": { + "type": "string" + }, + "failed": { + "type": "boolean" + }, + "method": { + "type": "string" + }, + "resourceType": { + "type": "string" + }, + "status": { + "type": "number" + }, + "url": { + "type": "string" + } + }, + "required": [ + "url", + "method", + "resourceType" + ], + "type": "object" + }, + "type": "array" + }, + "networkTruncated": { + "type": "boolean" + } + }, + "type": "object" + }, + "elements": { + "items": { + "additionalProperties": false, + "properties": { + "bounds": { + "additionalProperties": false, + "properties": { + "height": { + "type": "number" + }, + "width": { + "type": "number" + }, + "x": { + "type": "number" + }, + "y": { + "type": "number" + } + }, + "required": [ + "x", + "y", + "width", + "height" + ], + "type": "object" + }, + "name": { + "type": "string" + }, + "role": { + "type": "string" + }, + "selector": { + "type": "string" + }, + "tag": { + "type": "string" + }, + "text": { + "type": "string" + } + }, + "required": [ + "tag", + "selector" + ], + "type": "object" + }, + "type": "array" + }, + "elementsTruncated": { + "type": "boolean" + }, + "maxChars": { + "type": "number" + }, + "maxElements": { + "type": "number" + }, + "selector": { + "type": "string" + }, + "selectorFound": { + "type": "boolean" + }, + "status": { + "type": "number" + }, + "text": { + "type": "string" + }, + "textTruncated": { + "type": "boolean" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "url", + "selectorFound", + "maxChars", + "maxElements", + "text", + "textTruncated", + "elements", + "elementsTruncated" + ], + "type": "object" +} - added
Output schema / properties / statusAdded value: +{ + "type": "number" +} - added
Output schema / properties / suggestedStrategyAdded value: +{ + "type": "string" +} - added
Output schema / properties / textAdded value: +{ + "type": "string" +} - added
Output schema / properties / titleAdded value: +{ + "type": "string" +} - added
Output schema / properties / truncatedAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / urlAdded value: +{ + "type": "string" +} - added
Output schema / requiredAdded value: +[ + "url", + "actions", + "outputMode", + "truncated", + "maxChars" +]
- Changed
browse_session_action17 fields changed- changed
Output schema / additionalPropertiesPrevious value: -{}New value: +false - added
Output schema / properties / actionAdded value: +{ + "additionalProperties": false, + "properties": { + "durationMs": { + "type": "number" + }, + "index": { + "type": "number" + }, + "result": { + "type": "string" + }, + "resultTruncated": { + "type": "boolean" + }, + "selector": { + "type": "string" + }, + "status": { + "const": "ok", + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "index", + "type", + "status", + "durationMs" + ], + "type": "object" +} - added
Output schema / properties / captchaDetectedAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / captchaIframesAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "selector": { + "type": "string" + }, + "src": { + "type": "string" + }, + "title": { + "type": "string" + } + }, + "required": [ + "selector", + "src" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / challengeHandlingAdded value: +{ + "enum": [ + "manual", + "llm_assisted" + ], + "type": "string" +} - added
Output schema / properties / challengePlaybookAdded value: +{ + "type": "string" +} - added
Output schema / properties / challengeProviderAdded value: +{ + "enum": [ + "recaptcha", + "hcaptcha", + "turnstile", + "cloudflare", + "text_captcha", + "generic" + ], + "type": "string" +} - added
Output schema / properties / challengeSignalsAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / challengeTypeAdded value: +{ + "const": "captcha_or_bot_check", + "type": "string" +} - added
Output schema / properties / expiresAtAdded value: +{ + "type": "string" +} - added
Output schema / properties / interactiveElementsAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "frame": { + "type": "string" + }, + "label": { + "type": "string" + }, + "selector": { + "type": "string" + }, + "type": { + "enum": [ + "checkbox", + "input", + "button", + "image" + ], + "type": "string" + } + }, + "required": [ + "selector", + "type" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / messageAdded value: +{ + "type": "string" +} - added
Output schema / properties / requiresUserActionAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / sessionIdAdded value: +{ + "type": "string" +} - added
Output schema / properties / snapshotAdded value: +{ + "additionalProperties": false, + "properties": { + "ariaSnapshot": { + "type": "string" + }, + "ariaSnapshotError": { + "type": "string" + }, + "ariaSnapshotTruncated": { + "type": "boolean" + }, + "contentType": { + "type": "string" + }, + "diagnostics": { + "additionalProperties": false, + "properties": { + "console": { + "items": { + "additionalProperties": false, + "properties": { + "location": { + "additionalProperties": false, + "properties": { + "columnNumber": { + "type": "number" + }, + "lineNumber": { + "type": "number" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "text": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "type", + "text" + ], + "type": "object" + }, + "type": "array" + }, + "consoleTruncated": { + "type": "boolean" + }, + "network": { + "items": { + "additionalProperties": false, + "properties": { + "contentType": { + "type": "string" + }, + "errorText": { + "type": "string" + }, + "failed": { + "type": "boolean" + }, + "method": { + "type": "string" + }, + "resourceType": { + "type": "string" + }, + "status": { + "type": "number" + }, + "url": { + "type": "string" + } + }, + "required": [ + "url", + "method", + "resourceType" + ], + "type": "object" + }, + "type": "array" + }, + "networkTruncated": { + "type": "boolean" + } + }, + "type": "object" + }, + "elements": { + "items": { + "additionalProperties": false, + "properties": { + "bounds": { + "additionalProperties": false, + "properties": { + "height": { + "type": "number" + }, + "width": { + "type": "number" + }, + "x": { + "type": "number" + }, + "y": { + "type": "number" + } + }, + "required": [ + "x", + "y", + "width", + "height" + ], + "type": "object" + }, + "name": { + "type": "string" + }, + "role": { + "type": "string" + }, + "selector": { + "type": "string" + }, + "tag": { + "type": "string" + }, + "text": { + "type": "string" + } + }, + "required": [ + "tag", + "selector" + ], + "type": "object" + }, + "type": "array" + }, + "elementsTruncated": { + "type": "boolean" + }, + "maxChars": { + "type": "number" + }, + "maxElements": { + "type": "number" + }, + "selector": { + "type": "string" + }, + "selectorFound": { + "type": "boolean" + }, + "status": { + "type": "number" + }, + "text": { + "type": "string" + }, + "textTruncated": { + "type": "boolean" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "url", + "selectorFound", + "maxChars", + "maxElements", + "text", + "textTruncated", + "elements", + "elementsTruncated" + ], + "type": "object" +} - added
Output schema / properties / suggestedStrategyAdded value: +{ + "type": "string" +} - added
Output schema / requiredAdded value: +[ + "sessionId", + "expiresAt", + "action", + "snapshot" +]
- Changed
browse_session_close4 fields changed- changed
Output schema / additionalPropertiesPrevious value: -{}New value: +false - added
Output schema / properties / closedAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / sessionIdAdded value: +{ + "type": "string" +} - added
Output schema / requiredAdded value: +[ + "sessionId", + "closed" +]
- Changed
browse_session_navigate27 fields changed- changed
Output schema / additionalPropertiesPrevious value: -{}New value: +false - added
Output schema / properties / captchaDetectedAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / captchaIframesAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "selector": { + "type": "string" + }, + "src": { + "type": "string" + }, + "title": { + "type": "string" + } + }, + "required": [ + "selector", + "src" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / challengeHandlingAdded value: +{ + "enum": [ + "manual", + "llm_assisted" + ], + "type": "string" +} - added
Output schema / properties / challengePlaybookAdded value: +{ + "type": "string" +} - added
Output schema / properties / challengeProviderAdded value: +{ + "enum": [ + "recaptcha", + "hcaptcha", + "turnstile", + "cloudflare", + "text_captcha", + "generic" + ], + "type": "string" +} - added
Output schema / properties / challengeSignalsAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / challengeTypeAdded value: +{ + "const": "captcha_or_bot_check", + "type": "string" +} - added
Output schema / properties / contentTypeAdded value: +{ + "type": "string" +} - added
Output schema / properties / diagnosticsAdded value: +{ + "additionalProperties": false, + "properties": { + "console": { + "items": { + "additionalProperties": false, + "properties": { + "location": { + "additionalProperties": false, + "properties": { + "columnNumber": { + "type": "number" + }, + "lineNumber": { + "type": "number" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "text": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "type", + "text" + ], + "type": "object" + }, + "type": "array" + }, + "consoleTruncated": { + "type": "boolean" + }, + "network": { + "items": { + "additionalProperties": false, + "properties": { + "contentType": { + "type": "string" + }, + "errorText": { + "type": "string" + }, + "failed": { + "type": "boolean" + }, + "method": { + "type": "string" + }, + "resourceType": { + "type": "string" + }, + "status": { + "type": "number" + }, + "url": { + "type": "string" + } + }, + "required": [ + "url", + "method", + "resourceType" + ], + "type": "object" + }, + "type": "array" + }, + "networkTruncated": { + "type": "boolean" + } + }, + "type": "object" +} - added
Output schema / properties / expiresAtAdded value: +{ + "type": "string" +} - added
Output schema / properties / htmlAdded value: +{ + "type": "string" +} - added
Output schema / properties / interactiveElementsAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "frame": { + "type": "string" + }, + "label": { + "type": "string" + }, + "selector": { + "type": "string" + }, + "type": { + "enum": [ + "checkbox", + "input", + "button", + "image" + ], + "type": "string" + } + }, + "required": [ + "selector", + "type" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / maxCharsAdded value: +{ + "type": "number" +} - added
Output schema / properties / messageAdded value: +{ + "type": "string" +} - added
Output schema / properties / outputModeAdded value: +{ + "enum": [ + "text", + "html", + "metadata" + ], + "type": "string" +} - added
Output schema / properties / requiresUserActionAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / selectorAdded value: +{ + "type": "string" +} - added
Output schema / properties / selectorFoundAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / sessionIdAdded value: +{ + "type": "string" +} - added
Output schema / properties / statusAdded value: +{ + "type": "number" +} - added
Output schema / properties / suggestedStrategyAdded value: +{ + "type": "string" +} - added
Output schema / properties / textAdded value: +{ + "type": "string" +} - added
Output schema / properties / titleAdded value: +{ + "type": "string" +} - added
Output schema / properties / truncatedAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / urlAdded value: +{ + "type": "string" +} - added
Output schema / requiredAdded value: +[ + "sessionId", + "expiresAt", + "url", + "outputMode", + "truncated", + "maxChars" +]
- Changed
browse_session_resume31 fields changed- changed
Output schema / additionalPropertiesPrevious value: -{}New value: +false - added
Output schema / properties / ariaSnapshotAdded value: +{ + "type": "string" +} - added
Output schema / properties / ariaSnapshotErrorAdded value: +{ + "type": "string" +} - added
Output schema / properties / ariaSnapshotTruncatedAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / captchaDetectedAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / captchaIframesAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "selector": { + "type": "string" + }, + "src": { + "type": "string" + }, + "title": { + "type": "string" + } + }, + "required": [ + "selector", + "src" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / challengeHandlingAdded value: +{ + "enum": [ + "manual", + "llm_assisted" + ], + "type": "string" +} - added
Output schema / properties / challengePlaybookAdded value: +{ + "type": "string" +} - added
Output schema / properties / challengeProviderAdded value: +{ + "enum": [ + "recaptcha", + "hcaptcha", + "turnstile", + "cloudflare", + "text_captcha", + "generic" + ], + "type": "string" +} - added
Output schema / properties / challengeSignalsAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / challengeTypeAdded value: +{ + "const": "captcha_or_bot_check", + "type": "string" +} - added
Output schema / properties / contentTypeAdded value: +{ + "type": "string" +} - added
Output schema / properties / diagnosticsAdded value: +{ + "additionalProperties": false, + "properties": { + "console": { + "items": { + "additionalProperties": false, + "properties": { + "location": { + "additionalProperties": false, + "properties": { + "columnNumber": { + "type": "number" + }, + "lineNumber": { + "type": "number" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "text": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "type", + "text" + ], + "type": "object" + }, + "type": "array" + }, + "consoleTruncated": { + "type": "boolean" + }, + "network": { + "items": { + "additionalProperties": false, + "properties": { + "contentType": { + "type": "string" + }, + "errorText": { + "type": "string" + }, + "failed": { + "type": "boolean" + }, + "method": { + "type": "string" + }, + "resourceType": { + "type": "string" + }, + "status": { + "type": "number" + }, + "url": { + "type": "string" + } + }, + "required": [ + "url", + "method", + "resourceType" + ], + "type": "object" + }, + "type": "array" + }, + "networkTruncated": { + "type": "boolean" + } + }, + "type": "object" +} - added
Output schema / properties / elementsAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "bounds": { + "additionalProperties": false, + "properties": { + "height": { + "type": "number" + }, + "width": { + "type": "number" + }, + "x": { + "type": "number" + }, + "y": { + "type": "number" + } + }, + "required": [ + "x", + "y", + "width", + "height" + ], + "type": "object" + }, + "name": { + "type": "string" + }, + "role": { + "type": "string" + }, + "selector": { + "type": "string" + }, + "tag": { + "type": "string" + }, + "text": { + "type": "string" + } + }, + "required": [ + "tag", + "selector" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / elementsTruncatedAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / expiresAtAdded value: +{ + "type": "string" +} - added
Output schema / properties / interactiveElementsAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "frame": { + "type": "string" + }, + "label": { + "type": "string" + }, + "selector": { + "type": "string" + }, + "type": { + "enum": [ + "checkbox", + "input", + "button", + "image" + ], + "type": "string" + } + }, + "required": [ + "selector", + "type" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / maxCharsAdded value: +{ + "type": "number" +} - added
Output schema / properties / maxElementsAdded value: +{ + "type": "number" +} - added
Output schema / properties / messageAdded value: +{ + "type": "string" +} - added
Output schema / properties / requiresUserActionAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / selectorAdded value: +{ + "type": "string" +} - added
Output schema / properties / selectorFoundAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / sessionIdAdded value: +{ + "type": "string" +} - added
Output schema / properties / statusAdded value: +{ + "type": "number" +} - added
Output schema / properties / suggestedStrategyAdded value: +{ + "type": "string" +} - added
Output schema / properties / textAdded value: +{ + "type": "string" +} - added
Output schema / properties / textTruncatedAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / titleAdded value: +{ + "type": "string" +} - added
Output schema / properties / urlAdded value: +{ + "type": "string" +} - added
Output schema / requiredAdded value: +[ + "sessionId", + "expiresAt", + "url", + "selectorFound", + "maxChars", + "maxElements", + "text", + "textTruncated", + "elements", + "elementsTruncated" +]
- Changed
browse_session_snapshot31 fields changed- changed
Output schema / additionalPropertiesPrevious value: -{}New value: +false - added
Output schema / properties / ariaSnapshotAdded value: +{ + "type": "string" +} - added
Output schema / properties / ariaSnapshotErrorAdded value: +{ + "type": "string" +} - added
Output schema / properties / ariaSnapshotTruncatedAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / captchaDetectedAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / captchaIframesAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "selector": { + "type": "string" + }, + "src": { + "type": "string" + }, + "title": { + "type": "string" + } + }, + "required": [ + "selector", + "src" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / challengeHandlingAdded value: +{ + "enum": [ + "manual", + "llm_assisted" + ], + "type": "string" +} - added
Output schema / properties / challengePlaybookAdded value: +{ + "type": "string" +} - added
Output schema / properties / challengeProviderAdded value: +{ + "enum": [ + "recaptcha", + "hcaptcha", + "turnstile", + "cloudflare", + "text_captcha", + "generic" + ], + "type": "string" +} - added
Output schema / properties / challengeSignalsAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / challengeTypeAdded value: +{ + "const": "captcha_or_bot_check", + "type": "string" +} - added
Output schema / properties / contentTypeAdded value: +{ + "type": "string" +} - added
Output schema / properties / diagnosticsAdded value: +{ + "additionalProperties": false, + "properties": { + "console": { + "items": { + "additionalProperties": false, + "properties": { + "location": { + "additionalProperties": false, + "properties": { + "columnNumber": { + "type": "number" + }, + "lineNumber": { + "type": "number" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "text": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "type", + "text" + ], + "type": "object" + }, + "type": "array" + }, + "consoleTruncated": { + "type": "boolean" + }, + "network": { + "items": { + "additionalProperties": false, + "properties": { + "contentType": { + "type": "string" + }, + "errorText": { + "type": "string" + }, + "failed": { + "type": "boolean" + }, + "method": { + "type": "string" + }, + "resourceType": { + "type": "string" + }, + "status": { + "type": "number" + }, + "url": { + "type": "string" + } + }, + "required": [ + "url", + "method", + "resourceType" + ], + "type": "object" + }, + "type": "array" + }, + "networkTruncated": { + "type": "boolean" + } + }, + "type": "object" +} - added
Output schema / properties / elementsAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "bounds": { + "additionalProperties": false, + "properties": { + "height": { + "type": "number" + }, + "width": { + "type": "number" + }, + "x": { + "type": "number" + }, + "y": { + "type": "number" + } + }, + "required": [ + "x", + "y", + "width", + "height" + ], + "type": "object" + }, + "name": { + "type": "string" + }, + "role": { + "type": "string" + }, + "selector": { + "type": "string" + }, + "tag": { + "type": "string" + }, + "text": { + "type": "string" + } + }, + "required": [ + "tag", + "selector" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / elementsTruncatedAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / expiresAtAdded value: +{ + "type": "string" +} - added
Output schema / properties / interactiveElementsAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "frame": { + "type": "string" + }, + "label": { + "type": "string" + }, + "selector": { + "type": "string" + }, + "type": { + "enum": [ + "checkbox", + "input", + "button", + "image" + ], + "type": "string" + } + }, + "required": [ + "selector", + "type" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / maxCharsAdded value: +{ + "type": "number" +} - added
Output schema / properties / maxElementsAdded value: +{ + "type": "number" +} - added
Output schema / properties / messageAdded value: +{ + "type": "string" +} - added
Output schema / properties / requiresUserActionAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / selectorAdded value: +{ + "type": "string" +} - added
Output schema / properties / selectorFoundAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / sessionIdAdded value: +{ + "type": "string" +} - added
Output schema / properties / statusAdded value: +{ + "type": "number" +} - added
Output schema / properties / suggestedStrategyAdded value: +{ + "type": "string" +} - added
Output schema / properties / textAdded value: +{ + "type": "string" +} - added
Output schema / properties / textTruncatedAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / titleAdded value: +{ + "type": "string" +} - added
Output schema / properties / urlAdded value: +{ + "type": "string" +} - added
Output schema / requiredAdded value: +[ + "sessionId", + "expiresAt", + "url", + "selectorFound", + "maxChars", + "maxElements", + "text", + "textTruncated", + "elements", + "elementsTruncated" +]
- Changed
browse_session_start9 fields changed- changed
Output schema / additionalPropertiesPrevious value: -{}New value: +false - added
Output schema / properties / browserAdded value: +{ + "const": "camoufox", + "type": "string" +} - added
Output schema / properties / captchaPolicyAdded value: +{ + "enum": [ + "detect", + "pause", + "fail", + "attempt" + ], + "type": "string" +} - added
Output schema / properties / expiresAtAdded value: +{ + "type": "string" +} - added
Output schema / properties / headlessModeAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "const": "virtual", + "type": "string" + } + ] +} - added
Output schema / properties / selectedOSAdded value: +{ + "type": "string" +} - added
Output schema / properties / sessionIdAdded value: +{ + "type": "string" +} - added
Output schema / properties / stealthProfileAdded value: +{ + "enum": [ + "normal", + "privacy", + "human_assisted", + "fast", + "debug" + ], + "type": "string" +} - added
Output schema / requiredAdded value: +[ + "sessionId", + "expiresAt", + "browser", + "selectedOS", + "headlessMode", + "captchaPolicy" +]
- Changed
browse_snapshot29 fields changed- changed
Output schema / additionalPropertiesPrevious value: -{}New value: +false - added
Output schema / properties / ariaSnapshotAdded value: +{ + "type": "string" +} - added
Output schema / properties / ariaSnapshotErrorAdded value: +{ + "type": "string" +} - added
Output schema / properties / ariaSnapshotTruncatedAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / captchaDetectedAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / captchaIframesAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "selector": { + "type": "string" + }, + "src": { + "type": "string" + }, + "title": { + "type": "string" + } + }, + "required": [ + "selector", + "src" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / challengeHandlingAdded value: +{ + "enum": [ + "manual", + "llm_assisted" + ], + "type": "string" +} - added
Output schema / properties / challengePlaybookAdded value: +{ + "type": "string" +} - added
Output schema / properties / challengeProviderAdded value: +{ + "enum": [ + "recaptcha", + "hcaptcha", + "turnstile", + "cloudflare", + "text_captcha", + "generic" + ], + "type": "string" +} - added
Output schema / properties / challengeSignalsAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / challengeTypeAdded value: +{ + "const": "captcha_or_bot_check", + "type": "string" +} - added
Output schema / properties / contentTypeAdded value: +{ + "type": "string" +} - added
Output schema / properties / diagnosticsAdded value: +{ + "additionalProperties": false, + "properties": { + "console": { + "items": { + "additionalProperties": false, + "properties": { + "location": { + "additionalProperties": false, + "properties": { + "columnNumber": { + "type": "number" + }, + "lineNumber": { + "type": "number" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "text": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "type", + "text" + ], + "type": "object" + }, + "type": "array" + }, + "consoleTruncated": { + "type": "boolean" + }, + "network": { + "items": { + "additionalProperties": false, + "properties": { + "contentType": { + "type": "string" + }, + "errorText": { + "type": "string" + }, + "failed": { + "type": "boolean" + }, + "method": { + "type": "string" + }, + "resourceType": { + "type": "string" + }, + "status": { + "type": "number" + }, + "url": { + "type": "string" + } + }, + "required": [ + "url", + "method", + "resourceType" + ], + "type": "object" + }, + "type": "array" + }, + "networkTruncated": { + "type": "boolean" + } + }, + "type": "object" +} - added
Output schema / properties / elementsAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "bounds": { + "additionalProperties": false, + "properties": { + "height": { + "type": "number" + }, + "width": { + "type": "number" + }, + "x": { + "type": "number" + }, + "y": { + "type": "number" + } + }, + "required": [ + "x", + "y", + "width", + "height" + ], + "type": "object" + }, + "name": { + "type": "string" + }, + "role": { + "type": "string" + }, + "selector": { + "type": "string" + }, + "tag": { + "type": "string" + }, + "text": { + "type": "string" + } + }, + "required": [ + "tag", + "selector" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / elementsTruncatedAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / interactiveElementsAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "frame": { + "type": "string" + }, + "label": { + "type": "string" + }, + "selector": { + "type": "string" + }, + "type": { + "enum": [ + "checkbox", + "input", + "button", + "image" + ], + "type": "string" + } + }, + "required": [ + "selector", + "type" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / maxCharsAdded value: +{ + "type": "number" +} - added
Output schema / properties / maxElementsAdded value: +{ + "type": "number" +} - added
Output schema / properties / messageAdded value: +{ + "type": "string" +} - added
Output schema / properties / requiresUserActionAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / selectorAdded value: +{ + "type": "string" +} - added
Output schema / properties / selectorFoundAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / statusAdded value: +{ + "type": "number" +} - added
Output schema / properties / suggestedStrategyAdded value: +{ + "type": "string" +} - added
Output schema / properties / textAdded value: +{ + "type": "string" +} - added
Output schema / properties / textTruncatedAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / titleAdded value: +{ + "type": "string" +} - added
Output schema / properties / urlAdded value: +{ + "type": "string" +} - added
Output schema / requiredAdded value: +[ + "url", + "selectorFound", + "maxChars", + "maxElements", + "text", + "textTruncated", + "elements", + "elementsTruncated" +]
17 tool updates
v2.4.0- First observed
browse - First observed
browse_console - First observed
browse_find - First observed
browse_forms - First observed
browse_links - First observed
browse_network_summary - First observed
browse_outline - First observed
browse_screenshot - First observed
browse_sequence - First observed
browse_session_action - First observed
browse_session_close - First observed
browse_session_navigate - First observed
browse_session_resume - First observed
browse_session_snapshot - First observed
browse_session_start - First observed
browse_snapshot - First observed
camoufox_status
TDQS
Many tools share the 'browse' prefix and differ only in output focus, such as browse, browse_snapshot, browse_outline, and browse_forms. Session-based equivalents like browse_session_navigate and browse_session_snapshot mirror one-shot tools, creating ambiguity about which to use. This overlap makes tool selection challenging.
The server uses snake_case, but the prefix pattern is inconsistent: bare 'browse', 'browse_*', 'browse_session_*', and 'camoufox_status'. While the verb 'browse' is common, the mix of noun and verb forms and the odd 'camoufox_status' break predictability. Overall readable but not uniform.
At 17 tools, the count is on the higher end of the appropriate range for a browser automation server. The breadth covers one-shot browsing, session management, and diagnostics, so it's not excessive, but it's borderline heavy. A few tools could be merged without losing functionality.
The server covers navigation, content extraction, screenshotting, diagnostics, and session lifecycle. It lacks dedicated form-filling or cookie tools, but browse_sequence and browse_session_action provide generic action execution. Core browsing workflows are supported, with only minor gaps.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Stealth web automation for AI agents. Login, signup, navigate, screenshot.
Stealth web automation for AI agents. Login, signup, navigate, screenshot.
AI-powered browser automation — navigate, click, fill forms, and extract data from any website.
Stealth web browser for agents: search, fetch, click, download and type in persistent MCP sessions.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceProvides stealthy browser automation capabilities using a custom Firefox build designed for anti-detection. It enables users to navigate pages, interact with elements, and manage persistent browser sessions through natural language.431MIT
- AlicenseAqualityDmaintenanceEnables browser automation with anti-detection features, including navigation, interaction, form filling, and session management.229MIT
- AlicenseBqualityAmaintenanceEnables LLMs to drive a stealthy, fingerprint-spoofed Firefox browser via MCP tools, supporting navigation, interaction, extraction, and multi-session management.841MIT
- FlicenseNot gradedqualityDmaintenanceProvides stealth web browsing using dual browser engines (Chromium and Firefox) with automatic bot-detection bypass, enabling AI agents to browse, interact, and extract content from websites without being blocked.1-
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/whit3rabbit/camoufox-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server