camoufox-reverse-mcp
This server provides AI coding assistants with a comprehensive toolkit for JavaScript reverse engineering using the Camoufox anti-fingerprint Firefox browser (via Playwright).
Browser Control
Launch/close the Camoufox anti-detection browser with options for headless mode, OS fingerprint emulation (C++ engine-level), proxy, humanized mouse, and GeoIP
Navigate URLs, reload pages, go back in history, click elements, type text, wait for elements
Take screenshots (full page or element), accessibility tree snapshots, get page info (URL, title, viewport, full HTML)
JavaScript Execution & Debugging
Execute arbitrary JavaScript in page context; inspect variables, call functions, enumerate object properties
Set pseudo-breakpoints via JS hooks; inject persistent init scripts that run before page JS on every navigation
Script Analysis
List all scripts loaded on the page (external and inline), fetch full source, search for keywords, save scripts to local files
Hooking & Tracing
Hook functions with custom code (before/after/replace) with overwrite protection; trace calls (args, return values, call stacks)
Inject preset hooks for XHR, Fetch, Crypto APIs, WebSocket, and debugger bypass
Track property accesses on browser objects (navigator, screen, canvas, etc.); freeze prototypes to prevent hook overwriting
Retrieve/filter console logs; remove all hooks and restore original objects
Network Analysis
Start/stop network capture with URL pattern filtering and optional response body capture
List/filter captured requests (URL, method, resource type, status); get full request/response details and JS call stacks that initiated requests
Intercept requests to log, block, modify headers/body, or mock responses
Search response bodies for keywords; paginate large responses; extract values by JSON path
JSVMP Reverse Engineering
Instrument JSVMP-protected scripts to trace interpreter execution, API calls, and sensitive browser property reads — no bytecode analysis required
Extract and decode obfuscated strings (XOR/shifted string tables); compare browser environment fingerprints against Node.js/jsdom for gap analysis
Engine-Level Property Tracing
Trace DOM property access at the C++ engine level (undetectable by JSVMP) to precisely identify what environment properties a VM reads (e.g.,
navigator.*,screen.*,document.cookie)
Cookie & Storage Management
Get, set, and delete cookies; read/write localStorage and sessionStorage
Export/import complete browser state (cookies + storage) to/from JSON files
Fingerprint & Detection Verification
Get detailed browser fingerprint info (userAgent, WebGL, canvas hash, etc.)
Verify anti-detection by navigating to bot detection sites and screenshotting results
Bypass anti-debugging traps (infinite debugger loops, Function constructor checks)
Session Management
Get full session info (browser state, contexts, pages, hooks, capture status); manage request interception patterns
Enables bypassing Cloudflare's anti-bot detection systems to perform web scraping and JavaScript reverse engineering on protected sites.
Utilizes the Firefox-based Camoufox browser to provide engine-level fingerprint spoofing and stealthy automation capabilities.
Provides a comprehensive suite of tools for JavaScript reverse engineering, including script source analysis, function hooking, dynamic debugging, and execution.
Supports blocking WebRTC to prevent IP leaks and enhance anonymity during automated browser operations.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@camoufox-reverse-mcpintercept fetch requests on example.com and analyze the encryption parameters"
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-reverse-mcp
An MCP Server based on an anti-fingerprinting browser, specifically designed for JavaScript reverse engineering.
An MCP (Model Context Protocol) server that allows AI coding assistants (Claude Code, Cursor, Cline, etc.) to perform reverse engineering operations via the Camoufox anti-fingerprinting browser, including: API parameter analysis, static JS file analysis, dynamic breakpoint debugging, function hook tracing, network traffic interception, JSVMP bytecode analysis, and Cookie/storage management.
Why choose Camoufox?
Feature | chrome-devtools-mcp | camoufox-reverse-mcp |
Browser Engine | Chrome (Puppeteer) | Firefox (Camoufox) |
Anti-detection | None | C++ Engine-level fingerprinting |
Debugging | Limited (no breakpoints) | Playwright + JS Hook |
JSVMP Analysis | None | Interpreter instrumentation + Source-level rewriting |
Hook Persistence | Not supported | Context-level persistence, auto-re-injection after navigation |
Core Advantages:
Camoufox modifies fingerprint information at the C++ level, not via JS-layer patching, making it undetectable at the root.
Juggler protocol sandbox isolation makes Playwright completely undetectable by page JS.
BrowserForge generates fingerprints based on real-world traffic statistical distributions, not random combinations.
Works normally on various strong anti-scraping sites like RS, AK, JY, CF, etc.
Hooks use
Object.definePropertyfor anti-overwrite protection, preventing page scripts from restoring original methods.
Related MCP server: JS Reverse MCP
Quick Start
Method 1: Direct Installation via AI Chat (Recommended)
In the chat box of your AI coding tool (Cursor / Claude Code / Codex, etc.), enter:
帮我安装下这个mcp工具:camoufox-reverse-mcp
项目地址:https://github.com/WhiteNightShadow/camoufox-reverse-mcpThe AI will automatically complete the entire process of cloning, installing dependencies, and configuring the MCP Server.
Method 2: Manual Installation
git clone https://github.com/WhiteNightShadow/camoufox-reverse-mcp.git
cd camoufox-reverse-mcp
pip install -e .Client Configuration
{
"mcpServers": {
"camoufox-reverse": {
"command": "python",
"args": ["-m", "camoufox_reverse_mcp"]
}
}
}{
"mcpServers": {
"camoufox-reverse": {
"command": "python",
"args": ["-m", "camoufox_reverse_mcp", "--headless"]
}
}
}{
"mcpServers": {
"camoufox-reverse": {
"command": "python",
"args": [
"-m", "camoufox_reverse_mcp",
"--proxy", "http://127.0.0.1:7890",
"--geoip",
"--humanize"
]
}
}
}Overview of Available Tools (35 total)
Browser Control
Tool | Description |
| Launch the Camoufox anti-fingerprinting browser |
| Close the browser and release resources |
| Navigate to a specified URL (supports pre_inject_hooks, redirect_chain tracking) |
| Refresh the page |
| Take a screenshot (supports full page, specific elements) |
| Get the page accessibility tree (token efficient) |
| Click an element / Type text |
| Wait for an element to appear or URL to match |
| Get current page URL, title, viewport size |
JS Execution & Debugging
Tool | Description |
| Execute arbitrary JS expressions in the page context (multi-strategy JSON parsing) |
Script Analysis
Tool | Description |
| Script management: |
| Search keywords (full search if |
Hook & Tracing
Tool | Description |
| Hook or trace functions: |
| One-click injection of preset hooks (xhr / fetch / crypto / websocket / debugger_bypass / cookie / runtime_probe) |
| Remove all hooks and restore original objects |
| Get page console output |
Network Analysis
Tool | Description |
| Network capture control: |
| List captured requests (supports filtering by URL / domain / method / type / status code) |
| Get full request details ( |
| Get the JS call stack that initiated the request |
| Intercept requests: log / block / modify / mock / stop |
JSVMP Reverse Analysis
Anti-scraping Type → Tool Path Reference Table
Anti-scraping Type
Representative
✅ Recommended Path
❌ Disable
Signature-based (Environment = Signature)
RS 5/6, AK sensor_data
instrumentation(action="install")
pre_inject_hooks,hook_jsvmp_interpreter(mode="proxy")Behavior-based (Parameter signature)
TK JSVMP, JY gt4
hook_jsvmp_interpreter(mode="proxy")—
Pure Obfuscation
Common JS obfuscators
Any combination
—
Tool | Description |
| JSVMP runtime probe ( |
| Source-level instrumentation: |
| Browser environment fingerprint collection, for comparison with Node.js/jsdom |
Cookie & Storage
Tool | Description |
| Cookie management: |
| Get localStorage / sessionStorage |
| Export / Import full browser state |
Verification & Environment
Tool | Description |
| Offline verification of signature functions: pass sample list, character-level comparison, locate first deviation point |
| One-stop self-check: MCP version, dependencies, browser status, camoufox-reverse custom version detection |
| Clean up residuals (hooks / capture / routes), without closing the browser |
Engine-level Property Tracing (New in v1.1.0)
Requires camoufox-reverse custom browser. Returns an error if not installed, does not affect other tools.
Tool | Description |
| C++ engine-level DOM property access tracing (JSVMP undetectable). Supports summary/timeline/sequence/search views. |
| List all local trace files (for post-analysis) |
| Query specified historical trace files, supports filtering by object/keyword |
Usage Scenarios
Scenario 1: Reverse Engineering Login Interface Signature Parameters
1. launch_browser()
2. inject_hook_preset("xhr")
3. inject_hook_preset("crypto")
4. navigate("https://example.com/login")
5. type_text("#username", "test") → click("#login-btn")
6. list_network_requests(method="POST")
7. get_request_initiator(request_id=3) ← 定位签名函数
8. search_code("sign") ← 搜索签名代码
9. hook_function("window.getSign", mode="trace")
10. reload() → get_console_logs() ← 收集追踪数据Scenario 2: General JSVMP Reverse Engineering (RS / AK / Self-developed VMP)
1. launch_browser()
2. network_capture(action="start")
3. navigate("https://target-site.com/")
4. list_network_requests(resource_type="script") ← 找到 VMP 脚本
5. instrumentation(action="install", url_pattern="**/vmp_target*.js", mode="ast")
6. inject_hook_preset("cookie", persistent=True)
7. instrumentation(action="reload") ← 让插桩生效
8. instrumentation(action="log", type_filter="tap_get") ← 看 VMP 读了什么环境
9. instrumentation(action="log", type_filter="tap_method") ← 看 VMP 调了什么 API
10. compare_env() ← 收集环境用于 Node.js 补齐Scenario 3: Verifying Protocol Code
1. launch_browser() → navigate("https://target.com")
2. network_capture(action="start")
3. # 触发目标操作,收集带签名的请求
4. reqs = list_network_requests(url_filter="api/search")
5. # 提取样本
6. verify_signer_offline(
signer_code="(s) => ({'X-Bogus': mySign(s.url)})",
samples=[{"id": "r1", "input": {...}, "expected": {"X-Bogus": "..."}}]
)👉 For complete anti-scraping type identification and workflows, see docs/JSVMP_PLAYBOOK.md
Scenario 4: Engine-level Tracing of JSVMP Environment Fingerprints (New in v1.1.0)
Requires camoufox-reverse custom browser
1. launch_browser(enable_trace=True) ← 启动带 C++ 追踪的浏览器
2. navigate("https://www.douyin.com/video/xxx") ← JSVMP 执行,事件自动记录
3. trace_property_access(duration=0, mode="summary", collect_values=True)
→ 返回 JSVMP 实际读取的 42 个 DOM 属性、访问频次、以及真实值
→ 小值内联返回,大值(Canvas/WebGL/Cookie 等)自动保存到
~/.cache/camoufox-reverse/values/ 目录
# 按时间线查看属性访问节奏
4. trace_property_access(duration=0, mode="timeline", bucket_ms=500)
# 按对象过滤
5. trace_property_access(duration=0, filter_object="webgl")
# 搜索特定属性
6. trace_property_access(duration=0, mode="search", search_query="cookie")Difference from compare_env:
trace_property_access: Traces properties actually read by JSVMP (precise, C++ level, undetectable)compare_env: Collects all environment properties of the browser (full, JS level)When using Path B for environment spoofing, use trace results to decide "which properties to patch" to avoid introducing new leaks by over-patching
Technical Architecture
┌─────────────────────────────────────────────────┐
│ AI 编码助手 (Cursor / Claude) │
│ ↕ MCP (stdio) │
├─────────────────────────────────────────────────┤
│ camoufox-reverse-mcp (35 tools) │
│ ┌──────────┬──────────┬──────────┬──────────┐ │
│ │Navigation│ Script │Debugging │ Hooking │ │
│ │ │ Analysis │ │ │ │
│ ├──────────┼──────────┼──────────┼──────────┤ │
│ │ Network │ JSVMP │ Cookie │ Verify │ │
│ │ Capture │ Analysis │ Storage │ Signer │ │
│ ├──────────┴──────────┴──────────┴──────────┤ │
│ │ ★ PropertyTracer (trace_property_access) │ │
│ │ C++ 引擎层 DOM 属性追踪(JSVMP 不可检测) │ │
│ └───────────────────────────────────────────┘ │
│ ↕ Playwright API │
├─────────────────────────────────────────────────┤
│ Camoufox (反指纹 Firefox, Juggler 协议) │
│ C++ 引擎级指纹伪造 · BrowserForge 真实指纹分布 │
└─────────────────────────────────────────────────┘Changelog
v1.1.0 (2026-04-22) — Engine-level Property Tracing
Added 3 tools,
launch_browseraddedenable_traceparameter.
New Tools
trace_property_access— C++ engine-level DOM property access tracing (JSVMP undetectable), supports summary/timeline/sequence/search viewslist_trace_files— List local trace filesquery_trace_file— Query historical trace files
Changes
launch_browseraddedenable_traceparameter; when enabled, it automatically injectsCAMOU_CONFIGandMOZ_DISABLE_CONTENT_SANDBOXcheck_environmentaddedcamoufox_reversefield to detect custom browser installation status
Dependencies
Requires camoufox-reverse custom browser (optional, not installing it does not affect the other 32 tools)
v1.0.0 (2026-04-18) — Tool Streamlining + Return to Pure JS Reverse Toolset
Major Version: 80 → 32 tools, schema tokens halved. Removed Session archive/assertion system, returned to pure JS reverse tool positioning.
Tool Merging (v0.9.0)
network_capture(action=start/stop/clear/status)← start/stop_network_capturescripts(action=list/get/save)← list_scripts / get_script_source / save_scriptsearch_code(keyword, script_url=None)← search_code / search_code_in_scripthook_function(path, mode=intercept/trace)← hook_function / trace_functioninstrumentation(action=install/log/stop/reload/status)← instrument_jsvmp_source / get_instrumentation_log / stop_instrumentation / reload_with_hooks / get_instrumentation_statuscookies(action=get/set/delete)← get_cookies / set_cookies / delete_cookies
Removed Tools
Session archive system (7): start/stop_reverse_session, list_sessions, get_session_snapshot, attach_domain_readonly, export/import_session
Assertion system (4): add/verify/list/remove_assertion
Cold tools (37): trace_property_access, freeze_prototype, find_dispatch_loops, get_page_content, bypass_debugger_trap, check_detection, get_fingerprint_info, dump_jsvmp_strings, evaluate_js_handle, add_init_script, set_breakpoint_via_hook, get_breakpoint_data, etc.
New
verify_signer_offline— Stateless signature function verification (replaces verify_against_session)
Bug Fixes (v0.8.1)
evaluate_js: Multi-strategy JSON parsing (control character cleaning, double-encoding unpacking)navigate: Cleans network cache by default to prevent cross-navigation request pollutionget_network_request:max_body_sizeparameter controls body truncation (default 5000)launch_browser: Returns residual state diagnosis when already_running
Removed Dependencies: tldextract (used only by Session)
Design Philosophy: MCP is a pure toolset (stateless) and does not perform workflow management. Memory/accumulation of analysis projects belongs to the skill layer and user workspace.
v0.6.0 — Practical Bug Fixes
hook_jsvmp_interpreter(mode="proxy"): Fixedtoo much recursioncaused by Proxy recursionremove_hooks: Truly restores Proxy objectsevaluate_js: BOM / lone surrogate / whitespace auto-cleaninginstrument_jsvmp_source: CSP pre-checknavigate: Graceful degradation on timeout
v0.5.0 — Signature-based Anti-scraping Compatibility
instrument_jsvmp_sourcedefault MCP-side AST rewritinghook_jsvmp_interpreteraddedmode="transparent"Anti-scraping type decision table + JSVMP Playbook
v0.4.0 — General JSVMP Adaptation
Source-level instrumentation, Cookie attribution, runtime probes
hook_jsvmp_interpreter multi-path coverage rewriting
v0.3.0 — Stability Fixes
v0.2.0 — Hook Persistence + JSVMP Analysis
v0.1.0 — Initial Version (44 tools)
Feedback / Communication
If you encounter bugs during use, want new Hook presets, or want to discuss JS reverse engineering ideas, feel free to add me on WeChat:
WeChat ID:
han8888v8888
Please add a note "camoufox-reverse" when adding me so I can accept your request quickly.
License
MIT
Available Tools
39 toolscheck_environmentA
One-stop self-check of MCP environment, dependencies, and browser state.
v1.0.0: session-related checks removed (session mechanism removed). Checks MCP version, critical dependencies (esprima, playwright), browser state (residuals, captures).
Returns: dict with sections: mcp, deps, browser, overall_ok, recommendations.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the tool's read-like behavior (checking, no side effects implied) and details the return value sections (mcp, deps, browser, overall_ok, recommendations). It also notes version changes (session checks removed). However, it does not explicitly state that it is non-destructive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise: two sentences plus a structured list of return sections. It front-loads the purpose and includes relevant version history. Every sentence contributes value without 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 zero parameters, no output schema, and no annotations, the description provides sufficient context: what is checked, the return structure, and a version note. It is complete for the agent to understand and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the schema coverage is 100% (empty). Per guidelines, the baseline is 4. The description adds value by explaining the output structure but cannot add parameter semantics since there are none.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's verb ('check') and resource ('MCP environment, dependencies, and browser state'). It lists specific components checked (MCP version, dependencies like esprima and playwright, browser state) and distinguishes it from sibling tools like 'compare_env' by focusing on a self-check rather than comparison.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for initial diagnostics but provides no explicit guidance on when to use it versus alternatives like 'reset_browser_state' or 'compare_env'. The context is implicit, lacking when-to-use or when-not-to-use instructions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clickC
Click on a page element.
| Name | Required | Description | Default |
|---|---|---|---|
| selector | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description does not disclose any behavioral traits (e.g., whether it waits for element visibility, throws errors, or triggers navigation). The agent lacks safety information.
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 short but under-specified. It does not earn its place as it provides no additional value beyond the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and 0% schema coverage, the description should cover return values, errors, or prerequisites. It does none of these, leaving the agent underinformed.
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 single parameter 'selector' is not explained in the description. With 0% schema coverage, the description should clarify that it expects a CSS selector or XPath, but it does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb and resource ('Click on a page element'), but it adds no additional context or scope beyond the tool name. It is not a tautology, but it is minimally informative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives like 'type_text' or 'navigate'. No prerequisites or context provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
close_browserA
Close the browser after serializing any native trace transition.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must carry the behavioral burden. It does disclose the side effect of serializing a trace transition before closing, which is useful. However, it does not mention irreversibility, session teardown, or what happens to unsaved trace data, leaving some behavior implicit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no filler. 'Close the brwoser' is front-loaded, and the qualifying serialization behavior is placed at the end, making the core purpose immediately clear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter close action with no output schema, the description covers the action and the key ordering constraint. It is complete enough to call correctly; minor details like return value or failure behavior are absent but not critical for this simple operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema coverage is effectively 100%, so there are no parameter semantics for the description to add. Per the rubric, zero parameters earn a baseline of 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Close') with a clear resource ('the browser') and adds a sequencing detail ('after serializing any native trace transition'), so an agent knows exactly what action occurs. It does not explicitly compare against sibling tools, but no sibling shares the close-browser action, so it is distinguishable.
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 'after serializing any native trace transition' gives a clear procedural condition for when it is safe to call this tool. It does not name exclusions or alternatives, but the action itself (closing the browser) is distinct enough that no alternative routing is needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_envA
Collect browser environment fingerprint data for comparison with Node.js/jsdom.
Args: properties: Optional list of specific properties to check. If omitted, checks navigator, screen, canvas, WebGL, audio, timing.
Returns: dict with categorized environment data and their values.
| Name | Required | Description | Default |
|---|---|---|---|
| properties | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It explains the tool collects fingerprint data and returns categorized environment data, and mentions the optional 'properties' parameter with defaults. It does not contradict any annotations (none present). It adds context beyond 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 very concise with two short paragraphs. The first sentence immediately states the purpose. Every sentence provides value, and there is no superfluous content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has only one optional parameter and no output schema, the description is complete. It explains the argument, default behavior, and return type (dict). Sibling tools are diverse and this description is sufficient for an AI agent to understand when and how to use it.
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 one optional parameter 'properties' with only type info. The description adds significant meaning: it explains the parameter is optional, lists default property categories (navigator, screen, canvas, WebGL, audio, timing). This compensates for the 0% schema description coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool collects browser environment fingerprint data for comparison with Node.js/jsdom. It uses a specific verb ('Collect') and resource ('browser environment fingerprint data'), and distinguishes itself from siblings like 'check_environment' which might check individual properties.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly mentions the use case: comparison with Node.js/jsdom. It implies when to use the tool but does not provide explicit alternatives or when-not-to-use scenarios. Sibling tools like 'check_environment' could be related, but no exclusionary guidance is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_network_requestsA
Compare 2..10 captured requests without issuing requests or launching a browser.
Args: request_ids: Distinct IDs from list_network_requests in this capture. include_headers: Compare available request headers; incompleteness warns. include_body: Compare exact request body text plus top-level JSON fields. max_value_chars: Preview characters per value (0..2000); digests always cover full values in canonical JSON. Each string also includes raw_utf8 byte length/SHA-256; use that for exact body byte checks. Results may contain credentials; keep them private. max_fields: Maximum changed rows and constant field names (1..200).
Returns: Changed fields, constant names and completeness limits. Query duplicates, value order and raw URL encoding are preserved. Missing differs from null. A varying field is evidence, not proof that it participates in signing.
| Name | Required | Description | Default |
|---|---|---|---|
| max_fields | No | ||
| request_ids | Yes | ||
| include_body | No | ||
| include_headers | No | ||
| max_value_chars | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the burden of disclosing side effects and constraints. It explicitly says no requests are issued and no browser is launched, and it warns that results may contain credentials. It does not explicitly state 'read-only' or describe failure modes, but the non-mutating nature is strongly implied by 'compare captured requests.'
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 compact and front-loaded with the core purpose. The Args/Returns structure is readable, though some phrasing is cryptic and dense, such as 'Query duplicates, value order and raw URL encoding are preserved' and 'A varying field is evidence, not proof that it participates in signing.' Still, it avoids unnecessary verbosity.
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?
There is no output schema, so the description must explain the return semantics, and it does partially. It mentions changed fields, constant names, completeness limits, and preserved aspects like query duplicates and URL encoding. However, it lacks a concrete shape or example of the returned structure, and the behavior around partial vs. complete comparisons remains somewhat ambiguous.
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 provides titles and defaults but no descriptions, so the description fully compensates. Every parameter is explained with meaningful details: request_ids are tied to list_network_requests, include flags control comparison scope, and max_value_chars/max_fields clarify truncation and limits. It also adds important nuance about full-value digests and exact byte checks.
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 ('compare'), the resource ('captured requests'), and the valid count range (2..10). It also distinguishes this from live network actions by noting it does not issue requests or launch a browser, which separates it from siblings like intercept_request or launch_browser.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context that this is for comparing previously captured requests and that no live browser/network activity is involved, which implies when it should be used. It does not explicitly name alternatives or list when-not-to-use cases, but the workflow hint of using request_ids from list_network_requests provides enough guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cookiesA
Cookie management (v0.9.0 unified).
Replaces get_cookies / set_cookies / delete_cookies.
Args: action: "get" — return cookies (optionally filtered by domain) "set" — set cookies (requires cookies_list: [{name, value, domain, ...}]) "delete" — delete cookies (filter by name and/or domain; no filter = clear all) domain: Host or parent domain for get/delete (boundary match, includes subdomains). With name, both filters must match. No filters deletes all cookies. cookies_list: List of cookie dicts for "set". name: Cookie name filter for "delete".
Returns: For "get": list of cookie dicts. For "set"/"delete": dict with status and count.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| action | Yes | ||
| domain | No | ||
| cookies_list | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so thoroughly. It discloses the destructive outcome of an unfiltered delete ('no filter = clear all'), the boundary-match/subdomain behavior of domain filtering, the requirement of cookies_list for set, and the return format for each action. This is far beyond minimal transparency.
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 well-structured with clear sections for the replacement note, args, and returns. Every sentence provides useful information—no filler. Despite moderate length, the formatting makes it easy to scan and the critical safety warning is included without bloat.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers all four parameters, all three actions, filter interactions, the destructive edge case, and return values. Even with an output schema present, it includes enough behavioral context for an agent to safely and correctly invoke the tool. Nothing essential is missing 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?
Schema description coverage is 0%, so the description must explain every parameter, and it does. It defines the action values with behaviors, explains domain as a host/parent-domain filter with subdomain matching, specifies cookies_list as cookie dicts for set, and clarifies name as a delete filter. This fully compensates for the bare input schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool manages cookies with three distinct actions (get, set, delete), and explicitly notes it replaces get_cookies / set_cookies / delete_cookies. This makes the tool's scope immediately clear and distinguishes it from the legacy alternatives and unrelated siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit action-level usage guidance, including when to use each action, filter semantics for get/delete, and the requirement of cookies_list for set. The note that it replaces three legacy tools directly tells the agent to prefer this tool over them, and the warning about no filters clearing all cookies gives a specific when-not-to behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
evaluate_jsA
Execute an arbitrary JavaScript expression in the page context and return the result.
v1.0.1 fix: correctly handles undefined/null/void/Symbol return values without triggering JSON.parse crashes.
Default auto mode preserves legacy cleaning and smart JSON parsing; it may strip BOM/whitespace and replace lone surrogates. value_raw is not a code-unit-preserving transport. json_ascii returns explicit JSON text before transport/cleaning, preserving JSON string code units. Evaluation is never replayed after a failure.
Args:
expression: JavaScript expression. Must be a single expression, not
top-level var/let/const/function declarations (Playwright limitation).
Wrap in IIFE if needed: (() => { var x = 1; return x; })()
await_promise: If True, awaits Promise results (default True).
world: "isolated" preserves the existing Playwright execution context.
"main" prefers Camoufox's native mw: channel so page globals
created by site scripts are visible, with an explicit Firefox
window.wrappedJSObject.eval fallback for older/attached servers.
frame_url: Optional exact frame URL or shell-style wildcard.
frame_name: Optional exact frame name or shell-style wildcard.
frame_index: Optional zero-based index from get_page_info().frames.
result_format: "auto" (legacy cleanup) or "json_ascii" (ASCII JSON text
in value, not parsed/trimmed). json_ascii follows JSON.stringify:
tag non-finite numbers/-0/undefined explicitly if their distinction
matters; it is not a lossless arbitrary-object graph serializer.
Returns: dict with keys: value - cleaned value (parsed JSON if applicable) value_raw - raw string before cleaning (only when cleaning applied) type - "primitive" | "json" | "handle_fallback" | "error" world - selected execution world frame - selected frame's current snapshot metadata execution_backend - isolated, Camoufox native, or wrappedJSObject warnings - list of applied cleanups, if any hint - (error only) friendly fix suggestion or None
| Name | Required | Description | Default |
|---|---|---|---|
| world | No | isolated | |
| frame_url | No | ||
| expression | Yes | ||
| frame_name | No | ||
| frame_index | No | ||
| await_promise | No | ||
| result_format | No | auto |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses return format keys, differences between auto and json_ascii modes, execution world behavior (isolated vs main with fallback), failure behavior ('Evaluation is never replayed after a failure'), and specific handling of undefined/null/void/Symbol. This is exceptionally transparent.
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 front-loaded with the core purpose and version note, then organized into Args and Returns sections. It is longer than necessary—the v1.0.1 changelog line and some verbosity could be trimmed—but it is well-structured and every section earns its place given the tool's complexity. The length is justified by the need to explain subtle behaviors.
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 7 parameters, no output schema, and no annotations, this description is remarkably complete. It documents all return keys, error hint behavior, execution backends, and frame selection. The agent receives everything needed to call the tool correctly without additional external knowledge. It also preemptively addresses common pitfalls (e.g., lone surrogates, non-finite numbers).
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 0%, so the description must compensate entirely. It explains every parameter: expression (including the IIFE caveat), await_promise (default True), world (with isolated vs main details and fallback), frame_url/name/index (with wildcard support), and result_format (auto vs json_ascii). Each parameter's purpose and nuances are covered, exceeding what a bare schema would provide.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Execute an arbitrary JavaScript expression in the page context and return the result.' It names the resource (page context) and the specific action. No sibling tool performs the same function (e.g., hook_function injects hooks, not evaluate expressions), so differentiation is inherent.
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 guidance on how to use the tool (e.g., single-expression requirement, IIFE wrapping, world selection, frame targeting) but does not explicitly contrast with alternative tools or state when not to use it. Since it is a general-purpose evaluation tool, the context is clear enough for an agent to infer its appropriate use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_network_captureA
Export a versioned JSON snapshot of this manager's retained capture.
Args: save_path: New local JSON path; existing files are never overwritten. include_body: Include captured request/response bodies only together with include_sensitive=True. Does not fetch or replay requests. include_sensitive: Opt in to original headers, query values and bodies. Default masks all header/query values, removes URL credentials and fragments, and omits bodies. URL paths are retained: this is not full anonymization. Keep original captures out of public repositories. url_filter: Optional URL substring filter.
Returns: Path, count, redaction mode and capture status including pending/dropped work. For a settled snapshot call network_capture(stop, wait_timeout_ms).
| Name | Required | Description | Default |
|---|---|---|---|
| save_path | Yes | ||
| url_filter | No | ||
| include_body | No | ||
| include_sensitive | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does so thoroughly. It discloses that existing files are never overwritten, default masking behavior, retention of URL paths, absence of full anonymization, and the warning to keep original captures out of public repositories. It also describes the return payload including redaction mode and pending/dropped work.
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 structured with Args and Returns sections, and every sentence adds operational value. It front-loads the core purpose and packs important caveats without 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 no output schema and no annotations, the description gives sufficient context for an agent to invoke the tool correctly and interpret the result. It covers all four parameters, return values, and important behavioral constraints. The only minor omission is mention of prerequisites like an active capture, but the reference to network_capture covers the lifecycle adequately.
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 0%, so the description must explain parameters, and it does. Each parameter is given meaningful semantics: save_path is a new local JSON path that never overwrites, include_body is gated by include_sensitive, include_sensitive details the redaction trade-off, and url_filter is an optional substring filter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Export') and resource ('versioned JSON snapshot of this manager's retained capture'), clearly distinguishing it from siblings like network_capture and export_state. The scope is immediately understandable.
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 for when to use this tool and explicitly directs users to network_capture(stop, wait_timeout_ms) for a settled snapshot. It also clarifies that include_body does not fetch or replay requests, preventing misuse. It does not explicitly name export_state as an alternative, but the export-specific context is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_stateA
Export the complete browser state (cookies + storage) to a JSON file.
Args: save_path: Local file path to save the state JSON.
Returns: dict with status and the save path.
| Name | Required | Description | Default |
|---|---|---|---|
| save_path | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden but only mentions it exports state and returns a dict. It does not disclose whether it is a read-only operation, permissions needed, file overwrite behavior, or side effects, leaving gaps in transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and includes both purpose and parameter explanation, but could be better structured with a separate returns section and less informal formatting.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simplicity of the tool and siblings like import_state, the description is mostly complete. It mentions what is exported and what it returns, but lacks details on behavior like overwriting files or error handling.
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 description adds meaningful context to the single parameter save_path by indicating it is a local file path for saving state JSON, compensating for the 0% schema description coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Export', the resource 'complete browser state', and specifies it includes cookies and storage. It differentiates well from sibling tools like import_state (import) and reset_browser_state (reset).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for saving browser state but does not explicitly state when to use it versus alternatives like import_state or reset_browser_state, nor does it provide context for when it is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_console_logsA
Get console output collected from the page.
Args: level: Filter by log level - "log", "warn", "error", or "info". keyword: Filter logs containing this keyword in the text. clear: If True, clear the log buffer after retrieval.
Returns: List of dicts with level, text, timestamp, and location.
| Name | Required | Description | Default |
|---|---|---|---|
| clear | No | ||
| level | No | ||
| keyword | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description covers key behaviors: it returns a list of filtered logs and clears the buffer if the clear parameter is True. It could mention that it only reads existing logs without affecting the page, but it's adequate.
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?
Extremely concise: three sentences for purpose, then list of parameters and return type. No unnecessary words, front-loaded with the 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?
Covers purpose, parameters, behavioral effect of clear, and return structure. With an output schema present, the return description is sufficient. The tool is straightforward and well-documented.
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?
Despite schema description coverage being 0%, the description fully documents all three parameters (level, keyword, clear) to clarify their meaning and effect, compensating completely.
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 gets console output from the page, with a specific verb and resource, and distinguishes from sibling tools like get_storage or take_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?
No guidance on when to use this tool vs alternatives. The description only explains what the tool does, not context for choosing it over other tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_network_requestA
Get full details of a specific captured network request.
Args: request_id: The ID of the request (from list_network_requests). include_body: Include response body (default False). include_headers: Include request/response headers (default True). max_body_size: Max chars of body when include_body=True. Pass -1 for unlimited.
Returns: dict with request and response details.
| Name | Required | Description | Default |
|---|---|---|---|
| request_id | Yes | ||
| include_body | No | ||
| max_body_size | No | ||
| include_headers | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It states the tool is read-only (captured request details) and describes parameters, but does not specify behavior on invalid request_id, rate limits, or performance implications. Decent coverage but lacks edge-case details.
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?
Description is concise (3 sentences and a param list) and front-loaded with the purpose. Each part adds value, though the returns section could be more detailed. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description mentions return as 'dict with request and response details' but lacks specifics on structure. For 4 params, it covers param semantics well but omits error handling and response format details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% (no descriptions in schema), so description must compensate. It explains request_id source, default values for booleans, and the special value -1 for max_body_size. This adds significant meaning beyond schema titles and types.
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 'get full details of a specific captured network request', specifying verb and resource. It distinguishes from sibling 'list_network_requests' (which lists requests) and 'get_request_initiator' (which gets the initiator).
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 by referencing 'from list_network_requests' but does not explicitly state when to use this tool over alternatives, nor does it provide when-not-to-use guidance. No exclusions or prerequisites are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_page_infoB
Get page metadata plus a zero-based frame list for targeted tools.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description must carry behavioral transparency. The verb 'Get' implies a read-only operation with no side effects, but it does not explicitly state that no state changes occur or that it is safe to call at any time. The description provides a basic indication but lacks explicit assurances.
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 efficiently communicates the core function without superfluous details. It is front-loaded with the action and resource, making it immediately clear to the reader.
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 that the tool has no parameters and no output schema, the description is sufficient for an agent to understand what the tool does and when to call it. The phrase 'for targeted tools' hints at a specific use case but does not leave critical gaps in understanding for a simple getter operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has no parameters, and the schema coverage for parameters is 100% (none exist). Per the rubric, the baseline score is 3 when there are no parameters to describe, and the description does not add any parameter-related information since there is nothing to explain.
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 ('Get') and the resources ('page metadata plus a zero-based frame list'), which distinguishes it from sibling tools like 'take_screenshot' or 'reload'. The phrase 'for targeted tools' is slightly vague but does not obscure the primary purpose.
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 does not specify when to use this tool versus alternatives, nor does it mention any prerequisites or contextual conditions. It only states what the tool does, leaving the agent to infer when it is appropriate without explicit guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_request_initiatorA
Get the JS call stack that initiated a network request.
Returns a URL-matched hook stack as an investigation lead, not exact request attribution. Repeated/concurrent URLs can match a different invocation; corroborate with captured inputs. Requires inject_hook_preset("xhr"/"fetch") BEFORE navigating.
KNOWN LIMITATIONS (v0.8.1+):
For requests modified by an interceptor registered BEFORE MCP's hooks (e.g. SDKs loaded via sync ), the initiator will be the interceptor's call, not the original business code. Workaround: use instrumentation(action='reload').
For fetch on Firefox, Playwright-native initiator is often null. Requires inject_hook_preset('fetch', persistent=True).
Args: request_id: The ID of the request.
Returns: dict with url, initiator_stack, source, diagnostics and match_confidence. match_confidence is heuristic or unavailable; it never asserts exact identity.
| Name | Required | Description | Default |
|---|---|---|---|
| request_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries full responsibility. It openly discloses limitations (matching may be incorrect, Firefox fetch returns null, interceptor interference) and provides workarounds. This is highly transparent.
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?
Description is longer than average due to limitations and workarounds, but it is well-structured with paragraphs and bullet points. Every sentence adds value, so it remains 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?
Covered prerequisites, return dict fields, and limitations. Missing some context like how to retrieve request_id, but this is likely covered by sibling tools (e.g., list_network_requests). Overall sufficient for an agent.
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 has no description, but the tool description includes an Args section explaining request_id as 'The ID of the request.' This is minimal but adequate; could benefit from mentioning how to obtain the ID (e.g., from list_network_requests).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action (get the JS call stack) and a specific resource (network request). Clearly distinguishes from siblings like get_network_request, which likely returns request details rather than the initiator stack.
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?
Provides prerequisites (inject_hook_preset before navigating) and contextual guidance (investigation lead, corroborate with captured inputs). Does not explicitly name alternative tools, but the context is sufficient for typical use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_storageA
Get the contents of localStorage or sessionStorage.
Args: storage_type: "local" for localStorage, "session" for sessionStorage.
Returns: dict with all key-value pairs in the storage.
| Name | Required | Description | Default |
|---|---|---|---|
| storage_type | No | local |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries full burden. It conveys a read operation ('Get') and specifies the return format as a dict of key-value pairs, but omits details like error handling, permissions, or idempotency.
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?
Extremely concise: three sentences with no waste. The purpose is front-loaded, and the parameter and return are clearly separated.
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 getter with 0 required parameters and no output schema, the description covers the core behavior and return format. Minor gaps (e.g., error states) but acceptable given low 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?
Schema coverage is 0%, but the description explains the single parameter 'storage_type' with its allowed values ('local' for localStorage, 'session' for sessionStorage), adding significant meaning beyond the schema's bare type declaration.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Get' and the resource 'contents of localStorage or sessionStorage', distinguishing it from sibling tools that handle other aspects like page info or console logs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives (e.g., get_page_info for DOM data). The context of siblings is not leveraged to set exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_trace_dataC
Retrieve in-page traces and BrowserManager's cross-navigation cache.
The Python-side cache is the authoritative source after reload/navigation.
Every new trace entry includes frame metadata (URL, name, best-effort
index, and main-frame flag).
Trace IDs use installation/call counters, without page randomness. They are
local to a realm: frames/reloads may repeat IDs and even complete entries.
Merge the two sinks as multisets of full entries, removing only one cached
copy per matching live copy. Repetitions within either sink are preserved.
| Name | Required | Description | Default |
|---|---|---|---|
| clear | No | ||
| world | No | isolated | |
| frame_url | No | ||
| frame_name | No | ||
| frame_index | No | ||
| function_path | No | ||
| include_persistent | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden. It describes internal merging behavior but does not disclose whether the tool has side effects (e.g., modifying the cache) or if it is read-only. This lack of transparency lowers the score.
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 moderately concise but contains dense technical details that could be clearer. It is not excessively long, but some sentences are convoluted and could be better structured with bullet points or simpler phrasing.
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 absence of an output schema and annotations, the description should explain return values, error conditions, and parameter meanings. It does none of that, focusing on internal caching behavior, so it is incomplete for an agent to use effectively.
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 has 7 parameters with no descriptions and no coverage in the description. The description mentions frame metadata but never explains parameters like clear, world, frame_url, or function_path. Thus the description adds no semantic value to the inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear action (retrieve) and a specific resource (in-page traces and cross-navigation cache). It also distinguishes itself by describing merge semantics, but does not explicitly name a sibling tool, so a 4 is appropriate rather than 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?
Does not provide explicit guidance on when to use this tool versus alternatives like list_trace_files or query_trace_file. Some implicit hints about the authoritative cache exist, but no clear selection criteria are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hook_functionA
Hook or trace a function (v0.9.0 unified).
Replaces hook_function + trace_function.
Args: function_path: Full path like "window.encrypt", "XMLHttpRequest.prototype.open", "JSON.stringify". mode: "intercept" — inject custom JS before/after/replace the function. Requires hook_code. (was: hook_function) "trace" — log synchronous returns/throws and optionally args and call stacks. (was: trace_function) hook_code: JS code for "intercept" mode. Context vars: - arguments: original args - __this: the 'this' context - __result: return value (only in position="after") position: For "intercept": "before", "after", or "replace". non_overridable: For "intercept": use Object.defineProperty to lock. persistent: If True, survives page navigation. log_args: For "trace": record arguments (default True). log_return: For "trace": record return values (default True). log_stack: For "trace": record call stacks (default False). max_captures: For "trace": max calls to record (default 50). world: "isolated" (compatible default) or Firefox page "main" world. wait_timeout_ms: How long to wait for a late-bound target. Defaults to 5000 for persistent hooks and 0 for non-persistent hooks. poll_interval_ms: Late-binding polling interval (10..1000ms). watch_assignments: Install a temporary setter on the first missing path segment so assignment-and-immediate-call in one JS task is captured. Defaults to True for persistent hooks and False otherwise. frame_url: Optional exact frame URL or shell-style wildcard. frame_name: Optional exact frame name or shell-style wildcard. frame_index: Optional zero-based index from get_page_info().frames. serialization: For "trace": "json" (default) retains JSON text fields, but executes getters/toJSON and may fall back to String conversion; this can have side effects. "preview" reads no properties of argument, return, or thrown objects and never coerces them: objects/functions are placeholders, symbols omit their description, and undefined, BigInt, NaN, infinities and -0 have string tags. Only the wrapper's own argument array is traversed. Text is truncated at 2000 characters in both modes and is not necessarily complete/parseable JSON.
Trace semantics: Ordinary synchronous calls keep the original receiver, argument values, return/throw identity and one original invocation. Entries retain traceId, callIndex, timestamp, world, frame, args/returnValue and optional stack; outcome is "return" or "throw", with thrownValue for synchronous throws. completion="sync" always: a returned Promise/thenable is only a synchronous return, never an observed settlement (no await or attached handlers). Logging failures do not replace the original result/exception. Calls made by logging/JSON serialization are not recursively traced; real nested calls are. Clearing logs does not reset max_captures or callIndex. Intrinsics are saved at the first trace installation in each realm, so later hooks cannot redirect the logger. Already modified third-party intrinsics cannot be recovered. Preview limits value inspection, not timing/stack/identity visibility of wrappers or page-controlled sinks; optional stack capture may run custom stack formatting. Constructor/new semantics are outside this ordinary-call trace contract.
Returns: dict with status, target, mode.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | intercept | |
| world | No | isolated | |
| log_args | No | ||
| position | No | before | |
| frame_url | No | ||
| hook_code | No | ||
| log_stack | No | ||
| frame_name | No | ||
| log_return | No | ||
| persistent | No | ||
| frame_index | No | ||
| max_captures | No | ||
| function_path | Yes | ||
| serialization | No | json | |
| non_overridable | No | ||
| wait_timeout_ms | No | ||
| poll_interval_ms | No | ||
| watch_assignments | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and delivers exceptionally. It discloses side effects (json serialization executes getters/toJSON and may coerce via String; preview reads no properties), async semantics (a returned Promise is never awaited or settled-observed; completion is always 'sync'), failure isolation (logging failures don't replace original results), non-reset of counters (clearing logs doesn't reset max_captures or callIndex), intrinsic snapshotting at first install, and limitations (2000-char truncation, third-party modified intrinsics unrecoverable, constructor/new semantics out of contract). The watch_assignments temporary setter installation is explicitly called out.
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?
Densely informative with a clean structure: purpose line, bulleted parameter list, a 'Trace semantics' section, then Returns. Nearly every sentence carries semantic weight. Minor redundancy exists (position='after' and serialization caveats appear in both the parameter list and the trace-semantics section), and the 'Replaces hook_function + trace_function' line is stale filler. Justified length given 18 parameters and the late-binding/serialization complexity, but a few duplicated details could be trimmed.
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?
Parameter and behavioral coverage is superb, but the output contract is thin: with no output schema, the description offers only 'Returns: dict with status, target, mode' — status values, what 'target' contains, and error/timeout outcomes (e.g., when the late-bound target never appears within wait_timeout_ms) are unspecified. For a tool this complex, an agent cannot fully predict success or failure shapes from the description alone.
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 0%, and the description compensates completely: all 18 schema properties are addressed with real semantics beyond names and defaults — examples for function_path, context vars (arguments, __this, __result, and its position='after' restriction) for hook_code, value sets for mode/position/world/serialization, persistence-dependent defaults for wait_timeout_ms and watch_assignments, the polling range for poll_interval_ms, and exact frame targeting semantics for frame_url/frame_name/frame_index. Nothing in the schema is left unexplained.
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 opening line — 'Hook or trace a function (v0.9.0 unified)' — gives a specific verb and resource, and the mode parameter (intercept vs trace) crisply splits the two behaviors. The function_path examples ('window.encrypt', 'XMLHttpRequest.prototype.open', 'JSON.stringify') make the target concrete. Though the 'Replaces hook_function + trace_function' note references tools absent from the sibling list, the core purpose is 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?
In-tool guidance is strong: mode selection, the difference between intercept and trace, frame targeting, and world choice are all explained, and defaults are given by persistence flavor. However, the description never contrasts with current siblings like inject_hook_preset, trace_property_access, or hook_jsvmp_interpreter — an agent has no explicit signal for when to pick this tool over those. The 'Replaces' note targets tools that no longer exist, so that guidance is inert.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hook_jsvmp_interpreterA
Install a JSVMP runtime probe.
Multi-path instrumentation for JSVMP interpreters. Wraps Reflect.get/apply, installs Proxies on globals (navigator, screen, etc.), intercepts timing APIs.
LIMITATIONS: "proxy" mode is DETECTABLE by RS/AK-style signature-based anti-bot. For those, use instrumentation(action='install') (source-level rewrite) or mode='transparent' instead.
IMPORTANT — timing for sync-loaded SDKs (e.g. webmssdk): JSVMP interpreters capture native references at startup via closures. If you install hooks AFTER the SDK has loaded, the SDK's closures already hold the original (un-hooked) references — your hooks will never fire. You MUST install hooks BEFORE navigate(): 1. launch_browser() 2. hook_jsvmp_interpreter(mode='transparent', persistent=True) 3. navigate("https://www.douyin.com/...") If already navigated, call instrumentation(action='reload') after installing hooks to force a page reload with hooks active.
Args: script_url: Target script URL substring for stack filtering. persistent: Survive navigation (default True). mode: "proxy" (full coverage, detectable) or "transparent" (safe, lower coverage). track_calls, track_props, track_reflect: Only for mode="proxy". proxy_objects: Objects to proxy (default: navigator, screen, etc.). max_entries: Log buffer cap (default 10000).
Returns: dict with status, mode, coverage summary.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | proxy | |
| persistent | No | ||
| script_url | No | ||
| max_entries | No | ||
| track_calls | No | ||
| track_props | No | ||
| proxy_objects | No | ||
| track_reflect | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It details behavioral traits: detectability of proxy mode, the need to install hooks before navigation, persistence, and the wrapping of Reflect.get/apply and Proxy installation on globals.
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?
Well-structured with summary, limitations, important notes, and Args section. Slightly lengthy but every sentence adds value. Could be tightened slightly, but overall effective.
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 8 required and optional params, no output schema, and no annotations, the description provides complete coverage: explains return value, usage patterns, edge cases, and limitations. No 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?
Schema coverage is 0%, but description thoroughly explains each of the 8 parameters, including default values, constraints (e.g., track params only for proxy mode), and purpose (e.g., script_url for filtering, max_entries for buffer cap).
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 installs a JSVMP runtime probe and explains multi-path instrumentation. It is distinctly different from sibling tools like hook_function or inject_hook_preset, which target other intercept mechanisms.
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?
Provides explicit when-to-use guidance, including a step-by-step sequence for sync-loaded SDKs. It also warns against using 'proxy' mode for RS/AK-style anti-bot and directs to alternatives like instrumentation or mode='transparent'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_stateA
Import browser state from a JSON file by creating a new context.
Args: state_path: Path to the state JSON file (exported by export_state).
Returns: dict with status and the new context name.
| Name | Required | Description | Default |
|---|---|---|---|
| state_path | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description reveals that a new context is created, but lacks details on side effects (e.g., what happens to existing contexts, whether the import overrides any existing state). No annotations are provided, so the description carries the full burden.
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 brief and covers the essential information: purpose, argument, and return value. It could be slightly more concise, but it is well-structured with clear sections.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simplicity of the tool (one parameter, no output schema), the description provides adequate information to understand basic usage. However, it lacks details on error handling, expected behavior when the file is invalid, or interaction with the current browser state.
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 has one parameter with no description, but the description adds context: state_path is a path to a JSON file exported by export_state. This adds meaning beyond the schema type and title.
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: importing browser state from a JSON file by creating a new context. It distinguishes itself from sibling tools like export_state and reset_browser_state.
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 after export_state to restore state, but does not provide explicit guidance on when to use this tool versus alternatives like reset_browser_state, nor does it mention any prerequisites or context state requirements.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inject_hook_presetA
Inject a pre-built hook template for common reverse engineering tasks.
Available presets: - "xhr": Hook XMLHttpRequest to log all XHR requests. - "fetch": Hook window.fetch to log all fetch requests. - "crypto": Hook btoa/atob/JSON.stringify to capture encryption I/O. - "websocket": Hook WebSocket to log all WS messages. - "debugger_bypass": Bypass anti-debugging traps. - "cookie": Hook document.cookie writes. - "runtime_probe": Full runtime probe.
Args: preset: One of the above preset names. persistent: If True (default), survives page navigation.
Returns: dict with status and the preset name.
| Name | Required | Description | Default |
|---|---|---|---|
| preset | Yes | ||
| persistent | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It mentions persistence and return format, but does not disclose potential side effects, error handling, or impact on the page.
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?
Description is concise, well-structured with a clear header, bulleted preset list, and separate sections for args and returns. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, description adequately explains return value. Lacks error details but is sufficient for a simple tool with 2 parameters.
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 has 0% coverage, so description fully explains parameters: preset names and options, and persistent's behavior (survives navigation). Adds significant meaning beyond raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool injects a pre-built hook template for common reverse engineering tasks, listing specific presets. This distinguishes it from siblings like hook_function, which injects custom hooks.
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 through the listed presets for common tasks, but lacks explicit guidance on when to use this tool versus alternatives like hook_function or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
instrumentationA
JSVMP source-level instrumentation (v0.9.0 unified).
Replaces instrument_jsvmp_source / get_instrumentation_log / stop_instrumentation / reload_with_hooks.
Args: action: "install" — register route + AST/regex rewrite on matched scripts. Requires url_pattern. (was: instrument_jsvmp_source) "log" — fetch accumulated tap events from instrumented code. (was: get_instrumentation_log) "stop" — unregister instrumentation route. (was: stop_instrumentation) "reload" — reload page so persistent hooks fire before page JS. (was: reload_with_hooks) "status" — show active instrumentations and stats. (was: get_instrumentation_status) url_pattern: For "install"/"stop" — glob pattern matching VMP script URLs. mode: For "install" — "ast" (esprima then local bundled Acorn) or "regex" (conservative whole-program subset; unsupported input skipped). tag: For "install"/"log" — group identifier. rewrite_member_access: For "install" — tap obj[key] reads. rewrite_calls: For "install" — tap fn(args) calls. include_source_site: For "install" — attach a stable site_id and monotonic seq to tap events, plus an original-source range map in the log response. Default False. max_rewrites: For "install" — hard cap on rewrites per file. fallback_on_error: For "install" — try conservative regex on AST failure only without property/object filters; otherwise pass through unchanged. ignore_csp: For "install" — skip CSP pre-flight check. clear_log: For "reload" — clear JSVMP logs before reload. wait_until: For "reload" — "load" / "domcontentloaded" / "networkidle". tag_filter: For "log" — filter by tag. type_filter: For "log" — "tap_get", "tap_call", "tap_method", "tap_call_err". key_filter: For "log" — substring match on property/method name. limit: For "log" — max entries to return. clear: For "log" — clear log after retrieval in the selected main world. frame_url: For log; select a target frame by URL pattern. frame_name: For log; select a target frame by name. frame_index: For log; current frame snapshot index, not a persistent identity. Source scripts run in the main world; logs are always read there. filter_property_names: For AST "install" — only rewrite reads/methods of these property names (e.g. ['userAgent', 'platform', 'webdriver']). Dramatically reduces overhead for large files like webmssdk. filter_object_names: For AST "install" — only rewrite when the static base object path matches (e.g. ['navigator', 'this.bytecode']). Dynamic object identity is not inferred. Regex mode rejects nonempty filters. max_file_size: For "install" — files larger than this (bytes) trigger on_oversized behavior. Default 200KB. on_oversized: For "install" — "selective" (require filters), "skip", or "force" (full rewrite anyway). Default "selective".
Returns: dict with action-specific results.
IMPORTANT — timing for sync-loaded scripts (e.g. webmssdk): Route interception only catches requests made AFTER the route is registered. For scripts loaded via during page load, you MUST call instrumentation(action='install') BEFORE navigate(). Pattern: 1. launch_browser() 2. instrumentation(action='install', url_pattern='**/webmssdk*') 3. navigate("https://www.douyin.com/...") If called after navigate, use instrumentation(action='reload') to re-trigger page load with routes active.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | vmp | |
| mode | No | ast | |
| clear | No | ||
| limit | No | ||
| action | Yes | ||
| clear_log | No | ||
| frame_url | No | ||
| frame_name | No | ||
| ignore_csp | No | ||
| key_filter | No | ||
| tag_filter | No | ||
| wait_until | No | load | |
| frame_index | No | ||
| type_filter | No | ||
| url_pattern | No | ||
| max_rewrites | No | ||
| on_oversized | No | selective | |
| max_file_size | No | ||
| rewrite_calls | No | ||
| fallback_on_error | No | ||
| filter_object_names | No | ||
| include_source_site | No | ||
| filter_property_names | No | ||
| rewrite_member_access | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses key behavioral details: route interception only catches post-registration requests, scripts run in the main world, fallback behavior on AST errors, and the meaning of frame_index. However, it omits potential side effects like performance impact or error responses, but given the absence of annotations it still carries a substantial transparency burden.
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 long but well-organized with clear sections (overview, args, returns, important timing note). It front-loads the core purpose and immediately explains the critical timing constraint. While it could be trimmed, the length is justified given the tool's complexity and 24 parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description lacks a detailed output schema specification; it only says 'Returns: dict with action-specific results.' It mentions that logs include tap events and possibly source-site maps, but does not describe the exact event structure, log response format, or error handling. For such a complex tool, this leaves gaps in understanding the expected output.
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?
Every schema parameter (24 total) is described in the Args section, including purpose, defaults, and applicability per action. This goes far beyond the bare parameter names in the schema, adding meaningful context for filter parameters, mode specifics, and the behavior of include_source_site and on_oversized.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose as JSVMP source-level instrumentation, lists the specific actions it performs, and explicitly mentions it replaces four prior tools. This makes the tool's role distinct from siblings like hook_jsvmp_interpreter and trace_property_access.
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 explicit timing guidance with an 'IMPORTANT' section explaining the need to call install before navigate for sync-loaded scripts, and gives a concrete pattern (launch_browser, install, navigate). It also explains when to use reload as an alternative and how filters reduce overhead, making usage conditions clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
intercept_requestB
Intercept network requests matching a pattern.
Args: url_pattern: URL glob pattern (e.g. "**/api/login*"). action: "log", "block", "modify", "mock", or "stop" (unroute). modify_headers: Headers to add/override (action="modify"). modify_body: Request body replacement (action="modify"). mock_response: Dict with "status", "headers", "body" (action="mock").
| Name | Required | Description | Default |
|---|---|---|---|
| action | No | log | |
| modify_body | No | ||
| url_pattern | Yes | ||
| mock_response | No | ||
| modify_headers | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It explains each action (log, block, modify, mock, stop) and associated parameters for modify and mock. However, it omits details like whether interception persists across navigation, how to remove interceptions, or any side effects on the browser state.
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 paragraph that efficiently covers all parameters and their roles. It uses a list-like format with lines starting with parameter names, which aids readability. However, it could be slightly more structured (e.g., bullet points) for easier scanning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description lacks important context: it does not describe the return value, how to see intercepted requests, how to remove interceptions, or the lifecycle of the interception. The tool deals with mutable state, but these aspects are not addressed.
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 has 0% description coverage, so the description must compensate. It does so effectively, explaining url_pattern with a glob example, listing all five action values, and clarifying the conditional use of modify_headers, modify_body, and mock_response. This fully covers the purpose and usage of each parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Intercept network requests matching a pattern.' It uses a specific verb and resource, and the actions (log, block, modify, etc.) further clarify its function. However, it does not explicitly differentiate this tool from siblings like network_capture or list_network_requests, which also deal with network requests.
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 lists the possible actions but provides no guidance on when to use this tool versus alternative network tools such as network_capture or list_network_requests. There is no mention of prerequisites, exclusions, or context for choosing interception over other methods.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
launch_browserA
Launch the Camoufox anti-detection browser, or attach to a running one.
Args:
headless: Run in headless mode (default False).
os_type: OS fingerprint - "auto", "windows", "macos", or "linux".
locale: Browser locale (e.g. "zh-CN"). "auto" detects system locale.
proxy: Proxy server URL (e.g. "http://127.0.0.1:7890").
humanize: Enable humanized mouse movement.
geoip: Auto-infer geolocation from proxy IP.
block_images: Block image loading.
block_webrtc: Block WebRTC to prevent IP leaks.
enable_trace: Enable engine-level property access tracing.
Requires camoufox-reverse custom browser build.
When enabled, use trace_property_access() to capture DOM access.
trace_objects: Optional exact native object-name allowlist (for example
["navigator", "screen", "webgl"]). Empty traces all native sites
declared by the selected reverse build.
trace_max_events: Per Firefox process/session event cap (1..200000).
browser_version: Select one already-installed Camoufox 0.5+ browser
without changing its persistent active version. Use a repo-qualified
selector such as "official/beta.30" or
"whitenightshadow/152.0.4-beta.30-reverse.5". Omit it to preserve the
active/default behavior, including Camoufox 0.4.x installations.
The selected browser must match the active browser's exact
version/build because Camoufox reads shared resources from active.
ws_endpoint: Attach to an already-running Camoufox server instead of
launching a new browser. Start the server with
python -m camoufox server, copy its "Websocket endpoint:
ws://127.0.0.1:/" line, and pass that full URL here.
When set, all other launch args (os_type/locale/proxy/...) are
ignored — fingerprint config is owned by the running server. Start the
server with an os fingerprint matching the host for font-metric parity
(attach mode cannot inject the host/os font-fallback shim that launch
mode does). close_browser() will only disconnect; the server keeps running.
Returns: dict with status, config, and page list.
| Name | Required | Description | Default |
|---|---|---|---|
| geoip | No | ||
| proxy | No | ||
| locale | No | auto | |
| os_type | No | auto | |
| headless | No | ||
| humanize | No | ||
| ws_endpoint | No | ||
| block_images | No | ||
| block_webrtc | No | ||
| enable_trace | No | ||
| trace_objects | No | ||
| browser_version | No | ||
| trace_max_events | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral disclosure burden and does so thoroughly. It reveals that attach mode ignores all other launch arguments, that close_browser() in attach mode only disconnects while the server keeps running, that enable_trace requires a custom camoufox-reverse build, and that browser_version must match the active browser's exact build. These non-obvious side effects and constraints are exactly what an agent needs to avoid misusing the tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but systematically organized with an Args block and a Returns line, one parameter per line, and logical grouping. It front-loads the core purpose and devotes space only where needed for complex behavior. Given 13 parameters and two distinct modes, no sentence feels redundant 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?
The description covers launch and attach modes, parameter interdependencies, operational caveats (server persistence, font-metric parity, shared resources), and the return value shape as a dict with status, config, and page list. Even without an output schema, the agent has enough information to call the tool correctly and interpret the result at a high level. No critical details are missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description fully compensates by documenting all 13 parameters in the Args block. Each parameter gets meaningful context: defaults, allowed values ('auto', 'windows', 'macos', 'linux'), operational effects (block_webrtc prevents IP leaks), mutual exclusion (ws_endpoint ignores other args), and cross-dependencies (enable_trace requires a specific build). This goes far beyond what the bare schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise action: 'Launch the Camoufox anti-detection browser, or attach to a running one.' It identifies the exact resource and clearly distinguishes between the two operational modes. This cannot be confused with sibling tools like navigate or take_screenshot, which presuppose an active browser.
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 ws_endpoint documentation explicitly states when to use attach mode versus launch mode, including the instruction to start a server with `python -m camoufox server` and pass the full websocket URL. It also cautions that in attach mode all other launch args are ignored and that close_browser() will only disconnect, not shut down the server. This gives the agent clear conditional guidance for choosing the right invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_network_requestsA
List captured network requests with optional filters.
Args: url_filter: Substring filter for request URLs. url_contains_domain: Host/subdomain boundary filter (e.g. "example.com"). method: HTTP method filter (e.g. "GET", "POST"). resource_type: Resource type filter (e.g. "xhr", "fetch", "script", "document"). status_code: HTTP status code filter. limit: Optional page size (1..2000); omitted preserves the full list. after_id: Return IDs greater than this cursor, in capture order. Check network_capture(status).dropped_requests for lost history.
Returns: List of request summaries. Legacy size is retained body characters; size_unit is characters and body_bytes is the retained decoded entity byte count when encoding is known. Not compressed wire bytes.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| method | No | ||
| after_id | No | ||
| url_filter | No | ||
| status_code | No | ||
| resource_type | No | ||
| url_contains_domain | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full responsibility for behavioral transparency. It explains what is returned (list of request summaries) and some retuned field semantics, but it does not state side effects, read-only nature, permissions, or potential rate limits. The lack of any mention of safety or side effects leaves uncertainty.
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 well-structured with Args and Returns sections, uses concise wording, and provides necessary detail without unnecessary fluff. It is easy to parse and sufficiently compact for the complexity of the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers all parameters and return format, including nuanced details about size units and after_id semantics. However, it omits potential edge cases like default ordering, empty results, or interaction with pagination beyond after_id. Still, for a list tool with filters, it is largely 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?
Despite the schema having no per-parameter descriptions, the description's Args section explains every parameter: url_filter, url_contains_domain, method, resource_type, status_code, limit, and after_id. It also provides meaningful details like limit's range and after_id's cursor behavior, fully covering the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'List captured network requests with optional filters.' This is a specific verb ('List') and resource ('captured network requests'), and it differentiates from siblings like get_network_request (singular) and intercept_request (modifying).
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 explicit guidance on when to use this tool versus alternatives such as get_network_request, export_network_capture, or compare_network_requests. It only lists parameters and return, but does not clarify the intended 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.
list_trace_filesC
List all trace files on disk (for post-hoc analysis).
Returns: dict with traces_dir, total file count, and file details.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. Only mentions return format but no safety traits (e.g., read-only, requires permissions) or side effects. Lacks basic behavioral disclosure for a file operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Extremely concise: two sentences, front-loaded with purpose in first sentence. No redundant words, every part adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Missing explanation of the 'limit' parameter and context about file location, ordering, or performance. Without output schema, the return format info is helpful but incomplete for a list operation.
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 0%, and the description does not mention the 'limit' parameter at all. Fails to explain its purpose or effect, leaving the agent to infer from the default value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the verb 'list' and resource 'trace files on disk', with context 'for post-hoc analysis'. Distinguishes from sibling 'query_trace_file' by emphasizing listing all files.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool vs alternatives like query_trace_file. Implied usage from 'post-hoc analysis' but no explicit recommendations or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
network_captureA
Unified network capture control (v0.9.0).
Replaces start_network_capture / stop_network_capture.
Args: action: "start" — begin capturing network events "stop" — stop capturing (buffer retained) "clear" — clear the capture buffer "status" — return current capture state url_pattern: Glob pattern for "start" (default "**/*" captures all). capture_body: For "start" only; capture response bodies (more memory). max_body_size: For start; retained characters per response, 0..2000000. Playwright still reads the complete response before truncation. wait_timeout_ms: For stop; wait up to 30000ms for captured responses. New requests stop immediately; unfinished work is reported, not replayed. Clear cancels pending work; IDs remain monotonic until browser close.
Returns: dict with action result + current status snapshot.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | ||
| url_pattern | No | **/* | |
| capture_body | No | ||
| max_body_size | No | ||
| wait_timeout_ms | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses memory implications of capture_body, that Playwright reads full responses before truncation, that wait_timeout affects stop behavior, and that clear cancels pending work with monotonic IDs. This is strong behavioral disclosure.
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 well-structured, compact, and scannable. Each parameter is explained in a single line with relevant caveats, and the action list is clear without unnecessary prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the core tool behavior, parameter semantics, and side effects, which is sufficient for correct invocation. It does not specify the exact shape of the returned status snapshot, but no output schema is required and the description states what the return represents.
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 0%, but the description gives meaningful semantics for every parameter: url_pattern filtering, capture_body memory trade-off, max_body_size truncation behavior, and wait_timeout_ms stop behavior. This fully compensates for the sparse schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states this is a unified control for network capture, enumerates the four action values, and distinguishes it from related sibling tools like list_network_requests and export_network_capture.
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 explains when to use start, stop, clear, and status, and notes that it replaces start_network_capture/stop_network_capture. It does not explicitly contrast with interception or listing tools, but the action enumeration provides enough guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_trace_fileC
Query a specific historical trace file (post-hoc analysis).
Args: file_path: Path to the .jsonl trace file. mode: Same as trace_property_access (summary/timeline/sequence/search). filter_object: Filter by object name. search_query: Filter by search string. limit: Max events for sequence mode. bucket_ms: Bucket size for timeline mode.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | summary | |
| limit | No | ||
| bucket_ms | No | ||
| file_path | Yes | ||
| filter_kind | No | ||
| filter_site | No | ||
| search_query | No | ||
| filter_object | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided and the description does not mention side effects, return format, error behavior, or whether the operation is read-only. As a query tool, read-only behavior is implied but never stated, and there is no output schema to clarify results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured, with a clear one-line purpose followed by a bulleted argument list. Every sentence contributes useful information and there is no redundant or irrelevant content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has eight parameters and no output schema, but the description does not explain the result format, pagination, or behavior across different modes. Missing parameter descriptions and lack of examples make the tool difficult to invoke correctly without additional 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?
The description covers file_path, mode, filter_object, search_query, limit, and bucket_ms, but omits filter_kind and filter_site entirely. It also does not explain default values or valid enumerated values beyond the parenthetical mode list, leaving significant parameter ambiguity.
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 queries a specific historical trace file for post-hoc analysis, identifying both the action and the resource. It is distinguishable from trace-listing tools, though it references trace_property_access for mode semantics without fully defining the distinction.
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 minimal guidance on when to use this tool beyond 'post-hoc analysis' and 'historical trace file.' It does not explicitly mention alternatives or state when not to use this tool, leaving the agent to infer appropriate usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reloadA
Reload the current page, preserving any init scripts.
| Name | Required | Description | Default |
|---|---|---|---|
| wait_until | No | load |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries the burden. It discloses that init scripts are preserved, which is a key behavioral detail. However, it omits other traits like whether the page source is re-fetched, how state is handled, or if there are side effects on network requests.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, no wasted words. Clearly communicates the core action and a special attribute. Front-loaded and 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?
For a simple, one-parameter tool with no output schema, the description is nearly complete. It covers the essential behavior and parameter context. Minor gap: no guidance on the return value or error conditions, but for a reload action the outcome is generally understood.
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 has one parameter ('wait_until') with 0% description coverage. The tool description does not explain the parameter's meaning or accepted values, leaving the agent to infer from the name and default. The schema provides the type but no additional semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Reload') and the resource ('the current page'), and adds a distinctive detail ('preserving any init scripts') that differentiates it from sibling tools like 'navigate' or 'reset_browser_state.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use (when a reload is needed while keeping init scripts) but does not explicitly state when not to use or compare with alternatives. No exclusion criteria or context for choosing this over other tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_hooksA
Remove installed hooks and restore original objects in-place.
Args: keep_persistent: If True, keep persistent init_scripts registered.
Returns: dict with status, restored_objects, cleared counts.
| Name | Required | Description | Default |
|---|---|---|---|
| keep_persistent | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses that the tool modifies state in-place and returns a dict with status, restored_objects, and cleared counts. It does not mention failure conditions or prerequisites, but the information provided is sufficient for a simple tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: two sentences for the main action, followed by a bullet list of arguments and returns. Every word adds value with 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 simple 1-parameter schema and no output schema or annotations, the description covers the tool's purpose, the parameter's effect, and the return structure completely. No additional information is needed for correct usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter 'keep_persistent' is described in detail: 'If True, keep persistent init_scripts registered.' This adds meaning beyond the schema's title 'Keep Persistent' and default value, explaining the effect of the parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'remove' and the resource 'installed hooks', with the specific action of restoring original objects in-place. This distinctly differentiates it from sibling tools like 'hook_function' which installs hooks.
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 after hooks have been installed, as it says 'remove installed hooks' and 'restore original objects'. However, it does not explicitly state when to use vs alternatives or provide when-not scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reset_browser_stateC
Reset browser residual state after serializing trace transitions.
| Name | Required | Description | Default |
|---|---|---|---|
| clear_cookies | No | ||
| clear_storage | No | ||
| stop_engine_trace | No | ||
| clear_active_routes | No | ||
| clear_network_capture | No | ||
| clear_persistent_hooks | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It only says 'reset browser residual state,' which is vague and does not explain the destructive effects implied by the parameters (clearing cookies, storage, hooks, network capture), reversibility, or scope. The input schema hints at side effects, but the description itself does not disclose them.
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, compact sentence with no filler. It is front-loaded with the key verb and resource and earns its place, though it could be more informative without needing to be longer.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with six boolean parameters, no annotations, and no output schema, the description is too sparse to be complete. It does not explain return values, side effects, prerequisites, or the meaning of 'residual state,' making it insufficient for an agent to fully understand when and how to invoke the tool correctly.
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 0% and the description mentions none of the six parameters or their semantics. The tool's parameter names are somewhat self-explanatory, but the description provides no guidance on what each flag does, what the defaults imply, or how they interact. It fails to compensate for the missing schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Reset') and names the resource ('browser residual state') with a situational context ('after serializing trace transitions'). It is not a tautology and gives a clear sense of the action, though 'residual state' is somewhat vague and does not explicitly distinguish it from sibling cleanup tools like remove_hooks or clear_network_capture.
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 'after serializing trace transitions' provides a clear trigger context for when to use the tool. However, it does not mention when not to use it or point to alternatives among the many related sibling tools, leaving usage guidance mostly implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_response_bodyA
Save captured response bytes (JS/WASM/JSON/binary) without refetch/replay.
Args: request_id: A captured ID with a completed body (capture_body=True). save_path: New file path. Never overwrites existing files. allow_partial: Explicitly permit a truncated body; default rejects it.
Returns: Path, saved byte length, SHA-256 and partial flag. Bytes are Playwright's decoded HTTP response body (not original compression/wire bytes). If the body was missing or truncated, increase the capture limit and collect a new sample intentionally; this tool never triggers a new request.
| Name | Required | Description | Default |
|---|---|---|---|
| save_path | Yes | ||
| request_id | Yes | ||
| allow_partial | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and delivers: never overwrites existing files, rejects truncated bodies by default, never triggers a new request, and clarifies that bytes are Playwright's decoded body (not wire/compression bytes). Return format (path, byte length, SHA-256, partial flag) is also disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Tightly organized into summary, Args, and Returns sections. The key differentiator ('without refetch/replay') is front-loaded, and every sentence carries information with zero fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema and no annotations, the description covers behavior, all parameters, return values, and edge cases (missing/truncated body, overwrite policy, decoded vs wire bytes). Nothing essential is missing for an agent to invoke it correctly.
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 0%, so the description fully compensates: request_id (requires a completed body with capture_body=True), save_path (new path, no overwrite), and allow_partial (default rejects truncated bodies) are all semantically enriched beyond the bare schema types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (save), a precise resource (captured response bytes), and content types (JS/WASM/JSON/binary). The qualifier 'without refetch/replay' clearly differentiates it from sibling network tools like get_network_request, export_network_capture, and list_network_requests.
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?
Provides clear preconditions (capture_body=True required) and failure-path guidance ('increase the capture limit and collect a new sample intentionally'). However, it never explicitly names alternative sibling tools, leaving the when-to-use contrast implicit rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scriptsA
Script inspection (v0.9.0 unified).
Replaces list_scripts / get_script_source / save_script.
Args: action: "list" — list all loaded scripts (src, type, inline preview) "get" — get full source of one script (requires url; use "inline:" for inline scripts) "save" — save script source to local file (requires url + save_path) url: Script URL or "inline:" (required for "get" and "save"). save_path: Local file path (required for "save").
Returns: For "list": list of script info dicts. For "get": dict with source string. For "save": dict with status, path, size.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | ||
| action | Yes | ||
| save_path | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description explains actions and outputs, but omits potential side effects such as whether 'save' overwrites files or if there are any destructive behaviors.
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 well-structured with Args and Returns sections, but the opening line could be more concise. Overall efficient and front-loaded.
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 and presence of an output schema, the description covers all actions and parameters. However, it could mention error handling or default behavior for completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description fully compensates for the 0% schema coverage by explaining each action's parameter requirements, including the 'inline:<index>' format for URL.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it is for script inspection with three actions: list, get, save. It explicitly replaces three older tools and distinguishes itself from sibling browser automation tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear context for each action and parameter requirements, but does not explicitly state when not to use this tool or mention alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_codeA
Search keyword in loaded scripts (v0.9.0 unified).
Replaces search_code (all scripts) + search_code_in_script (single script).
Args: keyword: The keyword to search for (case-sensitive substring match). script_url: If None, search across ALL loaded scripts. If given, search within that one script only (supports "inline:" for inline scripts). Single-script mode auto-detects minified files and uses character-based context. context_chars: Context window in char mode (default 200 = +/-200 chars). Used when searching single minified scripts. context_lines: Context window in line mode (default 3). max_results: Maximum matches to return (default 200).
Returns: dict with matches, total_matches, mode ("line" | "char"), etc.
| Name | Required | Description | Default |
|---|---|---|---|
| keyword | Yes | ||
| script_url | No | ||
| max_results | No | ||
| context_chars | No | ||
| context_lines | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses behavioral traits: case-sensitive substring matching, dual modes (line/char) based on minification detection, and return structure. It transparently explains all relevant behaviors.
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 well-structured with a clear first sentence and an Args section. It is slightly verbose due to detailed explanations, but every sentence adds value. Could be slightly more concise, but front-loading is effective.
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 no output schema, the description covers return format (dict with matches, total_matches, mode). All 5 parameters are fully explained, and the behavior is comprehensively described for a search tool. No gaps remain.
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 0%, so the description must carry full parameter meaning. It does so thoroughly: keyword (case-sensitive substring), script_url (None vs specific, inline support), context_chars and context_lines with defaults and mode relevance, max_results with default. No parameter is left ambiguous.
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 searches for a keyword in loaded scripts, and explicitly mentions it replaces two older tools, making its purpose unambiguous and distinct from sibling tools which are all browser automation or scripting actions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use script_url=None (all scripts) versus a specific script_url (single script), and details auto-detection of minified files for mode selection. It also references the two replaced tools, providing clear context for usage without needing sibling comparison.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
take_screenshotC
Take a screenshot of the current page or a specific element.
Args: full_page: Capture the entire scrollable page. selector: CSS selector of a specific element to capture.
| Name | Required | Description | Default |
|---|---|---|---|
| selector | No | ||
| full_page | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, description bears full burden of behavioral disclosure. It fails to mention error behavior (e.g., invalid selector, page not loaded), output format (e.g., base64, file path), or effects on browser state. Only parameter effects are described minimally.
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?
Description is concise with purpose first, then parameter list. No unnecessary words, but could be slightly more structured (e.g., bullet points) for clarity. Still effective.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description lacks critical context such as return value format (e.g., image data, file path), error handling, and how it differs from sibling 'take_snapshot'. Incomplete for an AI agent to reliably invoke.
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 0%, so description must compensate. It explains 'full_page' captures entire scrollable page and 'selector' targets a specific element, adding meaning beyond the schema's type and title. However, it does not clarify behavior when both are specified or format requirements for selector.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool takes a screenshot of the current page or a specific element, covering basic purpose. However, it does not differentiate from sibling 'take_snapshot' which may have similar functionality, leaving 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?
No guidance on when to use this tool versus alternatives like 'take_snapshot'. No mention of prerequisites, scenarios where it should not be used, or when each parameter is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
take_snapshotA
Get a bounded accessibility tree, or a labelled DOM fallback.
Args: timeout_ms: Maximum wait for snapshot collection (1..30000). A hung error-page accessibility query returns an error without restarting the browser or replaying navigation. max_nodes: Maximum retained tree containers (1..5000). Depth is capped at 16 and individual strings at 2000 characters; truncation is explicit.
| Name | Required | Description | Default |
|---|---|---|---|
| max_nodes | No | ||
| timeout_ms | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral disclosure burden. It does add useful context: timeout_ms failure behavior ('A hung error-page accessibility query returns an error without restarting the browser or replaying navigation') and explicit truncation limits. However, it does not state whether the tool is read-only or has side effects, though this is likely a read operation. The provided behavioral details are valuable but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured. It front-loads the core purpose in the first sentence, then lists parameter explanations with clear formatting. No unnecessary words or redundancy. Each sentence 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?
The description covers the tool's purpose, parameter behavior, and error handling, which is sufficient for an agent to call it correctly. It lacks explicit read-only indication and guidance on when to use it, but these are minor gaps given the tool's simplicity and the absence of an output schema. Overall, it is fairly complete for a 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?
Schema coverage is 0%, so the description must compensate. It does so well: timeout_ms is described as 'Maximum wait for snapshot collection' with a range, and max_nodes as 'Maximum retained tree containers' with depth and string truncation details. This adds meaning beyond the schema's simple types and defaults, giving the agent clear operational semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Get a bounded accessibility tree, or a labelled DOM fallback.' This identifies the resource and distinguishes it from sibling tools like take_screenshot (visual capture) and get_page_info (page metadata). The term 'bounded' hints at constraints, but the exact nature is not elaborated here. It is specific and actionable, though not as sharply differentiated as the calibration example.
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 explicit guidance on when to use this tool versus alternatives. The phrase 'or a labelled DOM fallback' implies a fallback but does not explain conditions for choosing this over get_page_info, evaluate_js, or other DOM-related tools. No when-not-to-use or alternative selection criteria are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
trace_property_accessB
Control/query the current Gecko native PropertyTracer run.
action supports capture, start, stop, query, clear, and status. Results can use summary, timeline, sequence, or search views and optional object, kind, site, and keyword filters. collect_values is a safe post-trace snapshot, not an event-time value capture.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | summary | |
| limit | No | ||
| action | No | capture | |
| duration | No | ||
| bucket_ms | No | ||
| filter_kind | No | ||
| filter_site | No | ||
| search_query | No | ||
| filter_object | No | ||
| collect_values | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description includes a useful note that collect_values is a safe post-trace snapshot, implying no side effects for that parameter. However, it does not disclose potential effects of capture, start, stop, clear, or other actions. With no annotations, the description carries full weight but leaves room for ambiguity about state changes.
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 compact—two sentences—and efficiently communicates the core purpose, supported actions, views, filters, and a safety note. It is well-structured and front-loaded, with no extraneous information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description gives a reasonable overview of capabilities and a safety caveat, but it omits output format, return value details, and explicit use-case context. The sibling tool list provides some context, but the description alone is not fully self-sufficient for an agent to invoke it correctly in all scenarios.
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 description adds meaning to several parameters: action's possible values, filter kinds (object, kind, site, keyword), and the collect_values flag. But it leaves duration, limit, bucket_ms, and mode indirectly defined at best. The schema has zero parameter descriptions, so the description covers some but not all parameters.
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 controls or queries a Gecko native PropertyTracer run and lists supported actions and result views, making its purpose evident. It does not explicitly compare with siblings, but the verb-resource pair is specific enough.
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 alternative tracing or network tools. There are no conditions, scenarios, or examples mentioned that would help an agent decide between this and similar sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
type_textC
Type text into an input field with realistic keystroke delays.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| delay | No | ||
| selector | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description mentions 'realistic keystroke delays' but fails to disclose other important behaviors like error handling, whether it clears existing text, or what happens if the selector fails. With no annotations, the description carries full responsibility and is lacking.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with no fluff. However, it is overly terse and could include more useful information without becoming verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of annotations, output schema, and parameter descriptions, the description is insufficient. It does not cover return values, error states, or provide enough context for correct invocation of all three parameters.
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 description does not explain any of the three parameters beyond hinting at the 'delay' effect. The schema has 0% description coverage, and the description adds no semantic details about 'text' format, 'selector' syntax, or 'delay' units (e.g., milliseconds).
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 action ('Type text') and resource ('input field'), with a specific behavioral detail ('realistic keystroke delays'). This distinguishes it from siblings like 'click' or 'evaluate_js', which perform different actions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for typing into input fields with delays but provides no explicit guidance on when to use this tool versus alternatives, such as setting value via JavaScript. No when-not-to-use or alternative references.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_signer_offlineA
Verify a signer against explicit expected values without sending requests.
Args: signer_code: JS expression evaluating to a function receiving sample.input and returning an object. Async functions are supported. Only run code you intend to execute locally; Node vm is not a security boundary. samples: Non-empty list (up to 1000) of {id?, input: object, expected: object}. Each expected object must contain at least one comparison key. compare_params: Optional non-empty list of expected keys. Missing keys are invalid input; missing computed keys fail even if expected is null. runtime: "browser" preserves the current-page default. "node" runs an independent process without launching a browser, supports require of crypto/node:crypto, and needs Node.js on PATH. No runtime fallback. timeout_ms: Node process deadline (1..120000); also the maximum wait for the browser evaluation. A browser timeout does not undo/stop effects.
Returns: total_samples, passed, failed, pass_rate, first_divergence and details. Invalid input returns error before any signer code is executed.
| Name | Required | Description | Default |
|---|---|---|---|
| runtime | No | browser | |
| samples | Yes | ||
| timeout_ms | No | ||
| signer_code | Yes | ||
| compare_params | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully carries the burden of behavioral disclosure. It reveals that code runs locally, Node vm is not a security boundary, browser timeouts do not undo/stop effects, and invalid input fails before signer code executes. This is exceptionally transparent.
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 front-loaded with the core purpose and organized into clear Args/Returns sections. Although lengthy, every sentence earns its place by providing necessary operational or safety detail; there is no fluff 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 no annotations and no output schema, the description covers all required invocation aspects: input structure, constraints, runtime options, error semantics, security caveats, and return fields. The only minor omission is a formal definition of 'signer', but the sample/expected structure makes it clear enough for correct use.
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 0%, so the detailed Args section must and does compensate. Every parameter is explained with constraints, defaults, runtime behavior, and edge cases (e.g., compare_params missing keys, samples limits, timeout range). No parameter meaning is left to inference.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (verify), resource (signer), and completion criterion (against explicit expected values) along with a distinguishing behavior ('without sending requests'). This makes its purpose clear and differentiates it from sibling browser automation and evaluation tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for offline/local verification and detailed runtime selection guidance (browser vs node, no fallback). However, it does not explicitly name an alternative tool or state when not to use this tool, leaving some inference to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_forB
Wait for an element to appear or a network request matching a URL pattern.
| Name | Required | Description | Default |
|---|---|---|---|
| timeout | No | ||
| selector | No | ||
| url_pattern | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so description bears full burden. It fails to disclose timeout behavior (e.g., error on timeout), blocking nature, or return values. Only states what is waited for, not how it behaves.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, no fluff, front-loaded with purpose. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations, output schema, or schema descriptions, the description is too minimal. It lacks return value, error handling, prerequisites (e.g., browser open), and details on behavior differences between element and network wait.
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 has 0% description coverage. Description adds meaning by linking selector to element and url_pattern to network request, but does not explain timeout default/units or clarify that parameters are alternatives. Incomplete beyond parameter names.
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 waits for an element to appear or a network request matching a URL pattern. It uses specific verb 'wait' and resources, distinguishing it from siblings like click or navigate.
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 (waiting for condition before proceeding) but lacks explicit guidance on when to use versus alternatives. No exclusions or when-not-to-use are provided.
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.
6 tool updates
v1.8.0- Added
compare_network_requests - Changed
evaluate_js1 field changed- added
Input schema / properties / result_formatAdded value: +{ + "default": "auto", + "title": "Result Format", + "type": "string" +}
- Changed
hook_function1 field changed- added
Input schema / properties / serializationAdded value: +{ + "default": "json", + "title": "Serialization", + "type": "string" +}
- Changed
instrumentation3 fields changed- added
Input schema / properties / frame_indexAdded value: +{ + "title": "Frame Index", + "type": "integer" +} - added
Input schema / properties / frame_nameAdded value: +{ + "title": "Frame Name", + "type": "string" +} - added
Input schema / properties / frame_urlAdded value: +{ + "title": "Frame Url", + "type": "string" +}
- Added
save_response_body - Changed
take_snapshot2 fields changed- added
Input schema / properties / max_nodesAdded value: +{ + "default": 1000, + "title": "Max Nodes", + "type": "integer" +} - added
Input schema / properties / timeout_msAdded value: +{ + "default": 5000, + "title": "Timeout Ms", + "type": "integer" +}
12 tool updates
v1.6.0- Changed
evaluate_js4 fields changed- added
Input schema / properties / frame_indexAdded value: +{ + "title": "Frame Index", + "type": "integer" +} - added
Input schema / properties / frame_nameAdded value: +{ + "title": "Frame Name", + "type": "string" +} - added
Input schema / properties / frame_urlAdded value: +{ + "title": "Frame Url", + "type": "string" +} - added
Input schema / properties / worldAdded value: +{ + "default": "isolated", + "title": "World", + "type": "string" +}
- Added
export_network_capture - Added
get_trace_data - Changed
hook_function7 fields changed- added
Input schema / properties / frame_indexAdded value: +{ + "title": "Frame Index", + "type": "integer" +} - added
Input schema / properties / frame_nameAdded value: +{ + "title": "Frame Name", + "type": "string" +} - added
Input schema / properties / frame_urlAdded value: +{ + "title": "Frame Url", + "type": "string" +} - added
Input schema / properties / poll_interval_msAdded value: +{ + "default": 50, + "title": "Poll Interval Ms", + "type": "integer" +} - added
Input schema / properties / wait_timeout_msAdded value: +{ + "title": "Wait Timeout Ms", + "type": "integer" +} - added
Input schema / properties / watch_assignmentsAdded value: +{ + "title": "Watch Assignments", + "type": "boolean" +} - added
Input schema / properties / worldAdded value: +{ + "default": "isolated", + "title": "World", + "type": "string" +}
- Changed
instrumentation1 field changed- added
Input schema / properties / include_source_siteAdded value: +{ + "default": false, + "title": "Include Source Site", + "type": "boolean" +}
- Changed
launch_browser3 fields changed- added
Input schema / properties / browser_versionAdded value: +{ + "title": "Browser Version", + "type": "string" +} - added
Input schema / properties / trace_max_eventsAdded value: +{ + "default": 100000, + "title": "Trace Max Events", + "type": "integer" +} - added
Input schema / properties / trace_objectsAdded value: +{ + "items": { + "type": "string" + }, + "title": "Trace Objects", + "type": "array" +}
- Changed
list_network_requests2 fields changed- added
Input schema / properties / after_idAdded value: +{ + "title": "After Id", + "type": "integer" +} - added
Input schema / properties / limitAdded value: +{ + "title": "Limit", + "type": "integer" +}
- Changed
network_capture2 fields changed- added
Input schema / properties / max_body_sizeAdded value: +{ + "default": 200000, + "title": "Max Body Size", + "type": "integer" +} - added
Input schema / properties / wait_timeout_msAdded value: +{ + "default": 0, + "title": "Wait Timeout Ms", + "type": "integer" +}
- Changed
query_trace_file2 fields changed- added
Input schema / properties / filter_kindAdded value: +{ + "title": "Filter Kind", + "type": "string" +} - added
Input schema / properties / filter_siteAdded value: +{ + "title": "Filter Site", + "type": "string" +}
- Changed
reset_browser_state1 field changed- added
Input schema / properties / stop_engine_traceAdded value: +{ + "default": true, + "title": "Stop Engine Trace", + "type": "boolean" +}
- Changed
trace_property_access3 fields changed- added
Input schema / properties / actionAdded value: +{ + "default": "capture", + "title": "Action", + "type": "string" +} - added
Input schema / properties / filter_kindAdded value: +{ + "title": "Filter Kind", + "type": "string" +} - added
Input schema / properties / filter_siteAdded value: +{ + "title": "Filter Site", + "type": "string" +}
- Changed
verify_signer_offline2 fields changed- added
Input schema / properties / runtimeAdded value: +{ + "default": "browser", + "title": "Runtime", + "type": "string" +} - added
Input schema / properties / timeout_msAdded value: +{ + "default": 10000, + "title": "Timeout Ms", + "type": "integer" +}
16 tool updates
v1.1.1- Changed
compare_env4 fields changed- removed
Input schema / properties / properties / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - removed
Input schema / properties / properties / defaultRemoved value: -null - added
Input schema / properties / properties / itemsAdded value: +{ + "type": "string" +} - added
Input schema / properties / properties / typeAdded value: +"array"
- Changed
cookies10 fields changed- removed
Input schema / properties / cookies_list / anyOfRemoved value: -[ - { - "items": { - "additionalProperties": true, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -] - removed
Input schema / properties / cookies_list / defaultRemoved value: -null - added
Input schema / properties / cookies_list / itemsAdded value: +{ + "additionalProperties": true, + "type": "object" +} - added
Input schema / properties / cookies_list / typeAdded value: +"array" - removed
Input schema / properties / domain / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / domain / defaultRemoved value: -null - added
Input schema / properties / domain / typeAdded value: +"string" - removed
Input schema / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / name / defaultRemoved value: -null - added
Input schema / properties / name / typeAdded value: +"string"
- Changed
get_console_logs6 fields changed- removed
Input schema / properties / keyword / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / keyword / defaultRemoved value: -null - added
Input schema / properties / keyword / typeAdded value: +"string" - removed
Input schema / properties / level / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / level / defaultRemoved value: -null - added
Input schema / properties / level / typeAdded value: +"string"
- Changed
hook_jsvmp_interpreter4 fields changed- removed
Input schema / properties / proxy_objects / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - removed
Input schema / properties / proxy_objects / defaultRemoved value: -null - added
Input schema / properties / proxy_objects / itemsAdded value: +{ + "type": "string" +} - added
Input schema / properties / proxy_objects / typeAdded value: +"array"
- Changed
instrumentation17 fields changed- removed
Input schema / properties / filter_object_names / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - removed
Input schema / properties / filter_object_names / defaultRemoved value: -null - added
Input schema / properties / filter_object_names / itemsAdded value: +{ + "type": "string" +} - added
Input schema / properties / filter_object_names / typeAdded value: +"array" - removed
Input schema / properties / filter_property_names / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - removed
Input schema / properties / filter_property_names / defaultRemoved value: -null - added
Input schema / properties / filter_property_names / itemsAdded value: +{ + "type": "string" +} - added
Input schema / properties / filter_property_names / typeAdded value: +"array" - removed
Input schema / properties / key_filter / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / key_filter / defaultRemoved value: -null - added
Input schema / properties / key_filter / typeAdded value: +"string" - removed
Input schema / properties / tag_filter / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / tag_filter / defaultRemoved value: -null - added
Input schema / properties / tag_filter / typeAdded value: +"string" - removed
Input schema / properties / type_filter / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / type_filter / defaultRemoved value: -null - added
Input schema / properties / type_filter / typeAdded value: +"string"
- Changed
intercept_request11 fields changed- added
Input schema / properties / mock_response / additionalPropertiesAdded value: +true - removed
Input schema / properties / mock_response / anyOfRemoved value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -] - removed
Input schema / properties / mock_response / defaultRemoved value: -null - added
Input schema / properties / mock_response / typeAdded value: +"object" - removed
Input schema / properties / modify_body / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / modify_body / defaultRemoved value: -null - added
Input schema / properties / modify_body / typeAdded value: +"string" - added
Input schema / properties / modify_headers / additionalPropertiesAdded value: +true - removed
Input schema / properties / modify_headers / anyOfRemoved value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -] - removed
Input schema / properties / modify_headers / defaultRemoved value: -null - added
Input schema / properties / modify_headers / typeAdded value: +"object"
- Changed
launch_browser4 fields changed- removed
Input schema / properties / proxy / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / proxy / defaultRemoved value: -null - added
Input schema / properties / proxy / typeAdded value: +"string" - added
Input schema / properties / ws_endpointAdded value: +{ + "title": "Ws Endpoint", + "type": "string" +}
- Changed
list_network_requests15 fields changed- removed
Input schema / properties / method / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / method / defaultRemoved value: -null - added
Input schema / properties / method / typeAdded value: +"string" - removed
Input schema / properties / resource_type / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / resource_type / defaultRemoved value: -null - added
Input schema / properties / resource_type / typeAdded value: +"string" - removed
Input schema / properties / status_code / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - removed
Input schema / properties / status_code / defaultRemoved value: -null - added
Input schema / properties / status_code / typeAdded value: +"integer" - removed
Input schema / properties / url_contains_domain / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / url_contains_domain / defaultRemoved value: -null - added
Input schema / properties / url_contains_domain / typeAdded value: +"string" - removed
Input schema / properties / url_filter / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / url_filter / defaultRemoved value: -null - added
Input schema / properties / url_filter / typeAdded value: +"string"
- Changed
navigate4 fields changed- removed
Input schema / properties / pre_inject_hooks / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - removed
Input schema / properties / pre_inject_hooks / defaultRemoved value: -null - added
Input schema / properties / pre_inject_hooks / itemsAdded value: +{ + "type": "string" +} - added
Input schema / properties / pre_inject_hooks / typeAdded value: +"array"
- Changed
query_trace_file6 fields changed- removed
Input schema / properties / filter_object / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / filter_object / defaultRemoved value: -null - added
Input schema / properties / filter_object / typeAdded value: +"string" - removed
Input schema / properties / search_query / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / search_query / defaultRemoved value: -null - added
Input schema / properties / search_query / typeAdded value: +"string"
- Changed
scripts6 fields changed- removed
Input schema / properties / save_path / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / save_path / defaultRemoved value: -null - added
Input schema / properties / save_path / typeAdded value: +"string" - removed
Input schema / properties / url / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / url / defaultRemoved value: -null - added
Input schema / properties / url / typeAdded value: +"string"
- Changed
search_code3 fields changed- removed
Input schema / properties / script_url / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / script_url / defaultRemoved value: -null - added
Input schema / properties / script_url / typeAdded value: +"string"
- Changed
take_screenshot3 fields changed- removed
Input schema / properties / selector / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / selector / defaultRemoved value: -null - added
Input schema / properties / selector / typeAdded value: +"string"
- Changed
trace_property_access6 fields changed- removed
Input schema / properties / filter_object / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / filter_object / defaultRemoved value: -null - added
Input schema / properties / filter_object / typeAdded value: +"string" - removed
Input schema / properties / search_query / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / search_query / defaultRemoved value: -null - added
Input schema / properties / search_query / typeAdded value: +"string"
- Changed
verify_signer_offline4 fields changed- removed
Input schema / properties / compare_params / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - removed
Input schema / properties / compare_params / defaultRemoved value: -null - added
Input schema / properties / compare_params / itemsAdded value: +{ + "type": "string" +} - added
Input schema / properties / compare_params / typeAdded value: +"array"
- Changed
wait_for6 fields changed- removed
Input schema / properties / selector / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / selector / defaultRemoved value: -null - added
Input schema / properties / selector / typeAdded value: +"string" - removed
Input schema / properties / url_pattern / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / url_pattern / defaultRemoved value: -null - added
Input schema / properties / url_pattern / typeAdded value: +"string"
48 tool updates
v1.0.0- Removed
add_init_script - Removed
bypass_debugger_trap - Removed
check_detection - Added
check_environment - Added
cookies - Removed
delete_cookies - Removed
dump_jsvmp_strings - Removed
evaluate_js_handle - Removed
freeze_prototype - Removed
get_breakpoint_data - Removed
get_cookies - Removed
get_fingerprint_info - Removed
get_jsvmp_log - Changed
get_network_request2 fields changed- changed
Input schema / properties / include_body / defaultPrevious value: -trueNew value: +false - added
Input schema / properties / max_body_sizeAdded value: +{ + "default": 5000, + "title": "Max Body Size", + "type": "integer" +}
- Removed
get_page_content - Removed
get_page_html - Removed
get_property_access_log - Removed
get_response_body_page - Removed
get_script_source - Removed
get_session_info - Removed
get_trace_data - Removed
go_back - Changed
hook_function8 fields changed- added
Input schema / properties / hook_code / defaultAdded value: +"" - added
Input schema / properties / log_argsAdded value: +{ + "default": true, + "title": "Log Args", + "type": "boolean" +} - added
Input schema / properties / log_returnAdded value: +{ + "default": true, + "title": "Log Return", + "type": "boolean" +} - added
Input schema / properties / log_stackAdded value: +{ + "default": false, + "title": "Log Stack", + "type": "boolean" +} - added
Input schema / properties / max_capturesAdded value: +{ + "default": 50, + "title": "Max Captures", + "type": "integer" +} - added
Input schema / properties / modeAdded value: +{ + "default": "intercept", + "title": "Mode", + "type": "string" +} - added
Input schema / properties / persistentAdded value: +{ + "default": false, + "title": "Persistent", + "type": "boolean" +} - changed
Input schema / requiredPrevious value: -[ - "function_path", - "hook_code" -]New value: +[ + "function_path" +]
- Changed
hook_jsvmp_interpreter8 fields changed- added
Input schema / properties / max_entriesAdded value: +{ + "default": 10000, + "title": "Max Entries", + "type": "integer" +} - added
Input schema / properties / modeAdded value: +{ + "default": "proxy", + "title": "Mode", + "type": "string" +} - added
Input schema / properties / proxy_objectsAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Proxy Objects" +} - added
Input schema / properties / script_url / defaultAdded value: +"" - added
Input schema / properties / track_callsAdded value: +{ + "default": true, + "title": "Track Calls", + "type": "boolean" +} - added
Input schema / properties / track_propsAdded value: +{ + "default": true, + "title": "Track Props", + "type": "boolean" +} - added
Input schema / properties / track_reflectAdded value: +{ + "default": true, + "title": "Track Reflect", + "type": "boolean" +} - removed
Input schema / requiredRemoved value: -[ - "script_url" -]
- Added
instrumentation - Changed
launch_browser1 field changed- added
Input schema / properties / enable_traceAdded value: +{ + "default": false, + "title": "Enable Trace", + "type": "boolean" +}
- Changed
list_network_requests1 field changed- added
Input schema / properties / url_contains_domainAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Url Contains Domain" +}
- Removed
list_scripts - Added
list_trace_files - Changed
navigate3 fields changed- added
Input schema / properties / clear_network_captureAdded value: +{ + "default": true, + "title": "Clear Network Capture", + "type": "boolean" +} - added
Input schema / properties / collect_response_chainAdded value: +{ + "default": true, + "title": "Collect Response Chain", + "type": "boolean" +} - added
Input schema / properties / pre_inject_hooksAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Pre Inject Hooks" +}
- Added
network_capture - Added
query_trace_file - Added
reset_browser_state - Removed
save_script - Added
scripts - Changed
search_code4 fields changed- added
Input schema / properties / context_charsAdded value: +{ + "default": 200, + "title": "Context Chars", + "type": "integer" +} - added
Input schema / properties / context_linesAdded value: +{ + "default": 3, + "title": "Context Lines", + "type": "integer" +} - changed
Input schema / properties / max_results / defaultPrevious value: -50New value: +200 - added
Input schema / properties / script_urlAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Script Url" +}
- Removed
search_code_in_script - Removed
search_json_path - Removed
search_response_body - Removed
set_breakpoint_via_hook - Removed
set_cookies - Removed
set_storage - Removed
start_network_capture - Removed
stop_intercept - Removed
stop_network_capture - Removed
trace_function - Changed
trace_property_access11 fields changed- added
Input schema / properties / bucket_msAdded value: +{ + "default": 500, + "title": "Bucket Ms", + "type": "integer" +} - added
Input schema / properties / collect_valuesAdded value: +{ + "default": false, + "title": "Collect Values", + "type": "boolean" +} - added
Input schema / properties / durationAdded value: +{ + "default": 10, + "title": "Duration", + "type": "integer" +} - added
Input schema / properties / filter_objectAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Filter Object" +} - added
Input schema / properties / limitAdded value: +{ + "default": 1000, + "title": "Limit", + "type": "integer" +} - removed
Input schema / properties / max_entriesRemoved value: -{ - "default": 2000, - "title": "Max Entries", - "type": "integer" -} - added
Input schema / properties / modeAdded value: +{ + "default": "summary", + "title": "Mode", + "type": "string" +} - removed
Input schema / properties / persistentRemoved value: -{ - "default": false, - "title": "Persistent", - "type": "boolean" -} - added
Input schema / properties / search_queryAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Search Query" +} - removed
Input schema / properties / targetsRemoved value: -{ - "items": { - "type": "string" - }, - "title": "Targets", - "type": "array" -} - removed
Input schema / requiredRemoved value: -[ - "targets" -]
- Added
verify_signer_offline
57 tool updates
v0.3.0- First observed
add_init_script - First observed
bypass_debugger_trap - First observed
check_detection - First observed
click - First observed
close_browser - First observed
compare_env - First observed
delete_cookies - First observed
dump_jsvmp_strings - First observed
evaluate_js - First observed
evaluate_js_handle - First observed
export_state - First observed
freeze_prototype - First observed
get_breakpoint_data - First observed
get_console_logs - First observed
get_cookies - First observed
get_fingerprint_info - First observed
get_jsvmp_log - First observed
get_network_request - First observed
get_page_content - First observed
get_page_html - First observed
get_page_info - First observed
get_property_access_log - First observed
get_request_initiator - First observed
get_response_body_page - First observed
get_script_source - First observed
get_session_info - First observed
get_storage - First observed
get_trace_data - First observed
go_back - First observed
hook_function - First observed
hook_jsvmp_interpreter - First observed
import_state - First observed
inject_hook_preset - First observed
intercept_request - First observed
launch_browser - First observed
list_network_requests - First observed
list_scripts - First observed
navigate - First observed
reload - First observed
remove_hooks - First observed
save_script - First observed
search_code - First observed
search_code_in_script - First observed
search_json_path - First observed
search_response_body - First observed
set_breakpoint_via_hook - First observed
set_cookies - First observed
set_storage - First observed
start_network_capture - First observed
stop_intercept - First observed
stop_network_capture - First observed
take_screenshot - First observed
take_snapshot - First observed
trace_function - First observed
trace_property_access - First observed
type_text - First observed
wait_for
TDQS
Scored across 39 tools
Most tools have clearly distinct purposes (e.g., click vs type_text, get_console_logs vs get_network_request). However, some overlap exists among hooking/tracing tools (inject_hook_preset, hook_function, hook_jsvmp_interpreter, instrumentation) and among network capture tools (network_capture, intercept_request, list_network_requests). Detailed descriptions mitigate confusion, but a few boundaries remain fuzzy.
The majority of tools follow a verb_noun snake_case pattern (e.g., take_snapshot, get_page_info, export_state). Exceptions include bare verbs like 'click' and 'reload', and noun-only names like 'cookies', 'scripts', and 'network_capture' which are unified command families. Overall consistent, with minor deviations.
With 39 tools, the surface is heavy but not excessive given the broad scope of browser automation and reverse engineering. Many tools are specialized and some have been unified to reduce count (e.g., instrumentation, network_capture). While each has a purpose, the number may strain an agent's context and selection accuracy.
The tool surface is remarkably complete for the domain: launching/attaching browser, navigation, interaction, snapshots, screenshots, JS evaluation, storage/cookies, network capture/interception/analysis, multiple hooking mechanisms, source instrumentation, tracing, script inspection, state persistence, environment fingerprinting, and signer verification. No significant dead ends or missing core operations.
Maintenance
Related MCP Connectors
Live browser debugging for AI assistants — DOM, console, network via MCP.
A paid remote MCP for AI agent browser approval MCP, built to return verdicts, receipts, usage logs,
A paid remote MCP for AI agent browser MCP session, built to return verdicts, receipts, usage logs,
Zenrows MCP server — Fetch, Extract, Batch, and Browser Sessions for AI coding assistants
Related MCP Servers
- AlicenseBqualityDmaintenanceAn MCP server for anti-detection browser automation that uses Camoufox to bypass bot detection and spoof digital fingerprints. It enables AI agents to perform human-like web interactions, including realistic cursor movements, humanized click delays, and automatic cookie popup dismissal.3637 npm7MIT
- AlicenseCqualityBmaintenanceAn MCP server for JavaScript reverse engineering that enables AI to perform browser debugging, script analysis, and automated hook injection. It streamlines complex workflows like deobfuscation, network tracing, and risk assessment through direct browser integration.3521 npm1,020Apache 2.0
- AlicenseNot gradedqualityDmaintenanceA Chrome DevTools Protocol-based MCP server that enables AI coding assistants to control browsers for JavaScript debugging, reverse engineering, web scraping, and API debugging.722 npm1Apache 2.0
- AlicenseNot gradedqualityDmaintenanceA powerful MCP server for browser debugging and reverse engineering, providing AI coding assistants with comprehensive browser automation, JavaScript debugging, and network analysis capabilities.17 npm11Apache 2.0