Skip to main content
Glama
WhiteNightShadow

camoufox-reverse-mcp

camoufox-reverse-mcp

中文 | English

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.defineProperty for anti-overwrite protection, preventing page scripts from restoring original methods.


Related MCP server: JS Reverse MCP

Quick Start

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-mcp

The 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_browser

Launch the Camoufox anti-fingerprinting browser

close_browser

Close the browser and release resources

navigate

Navigate to a specified URL (supports pre_inject_hooks, redirect_chain tracking)

reload

Refresh the page

take_screenshot

Take a screenshot (supports full page, specific elements)

take_snapshot

Get the page accessibility tree (token efficient)

click / type_text

Click an element / Type text

wait_for

Wait for an element to appear or URL to match

get_page_info

Get current page URL, title, viewport size

JS Execution & Debugging

Tool

Description

evaluate_js

Execute arbitrary JS expressions in the page context (multi-strategy JSON parsing)

Script Analysis

Tool

Description

scripts(action)

Script management: list / get source / save to local

search_code

Search keywords (full search if script_url=None, single-script search if URL specified; auto-detects minified files using character-level context)

Hook & Tracing

Tool

Description

hook_function

Hook or trace functions: mode="intercept" inject code / mode="trace" non-intrusive tracing

inject_hook_preset

One-click injection of preset hooks (xhr / fetch / crypto / websocket / debugger_bypass / cookie / runtime_probe)

remove_hooks

Remove all hooks and restore original objects

get_console_logs

Get page console output

Network Analysis

Tool

Description

network_capture(action)

Network capture control: start / stop / clear / status

list_network_requests

List captured requests (supports filtering by URL / domain / method / type / status code)

get_network_request

Get full request details (max_body_size controls body truncation)

get_request_initiator

Get the JS call stack that initiated the request

intercept_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

hook_jsvmp_interpreter

JSVMP runtime probe (mode="proxy" full coverage / mode="transparent" signature safety)

instrumentation(action)

Source-level instrumentation: install register rewrite / log get logs / stop stop / reload reload / status check status

compare_env

Browser environment fingerprint collection, for comparison with Node.js/jsdom

Tool

Description

cookies(action)

Cookie management: get / set / delete

get_storage

Get localStorage / sessionStorage

export_state / import_state

Export / Import full browser state

Verification & Environment

Tool

Description

verify_signer_offline

Offline verification of signature functions: pass sample list, character-level comparison, locate first deviation point

check_environment

One-stop self-check: MCP version, dependencies, browser status, camoufox-reverse custom version detection

reset_browser_state

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

trace_property_access

C++ engine-level DOM property access tracing (JSVMP undetectable). Supports summary/timeline/sequence/search views. duration=0 reads all events since startup, duration>0 opens a new trace window. collect_values=True automatically reads real values of all properties from the browser (large values saved to files)

list_trace_files

List all local trace files (for post-analysis)

query_trace_file

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_browser added enable_trace parameter.

New Tools

  • trace_property_access — C++ engine-level DOM property access tracing (JSVMP undetectable), supports summary/timeline/sequence/search views

  • list_trace_files — List local trace files

  • query_trace_file — Query historical trace files

Changes

  • launch_browser added enable_trace parameter; when enabled, it automatically injects CAMOU_CONFIG and MOZ_DISABLE_CONTENT_SANDBOX

  • check_environment added camoufox_reverse field 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_capture

  • scripts(action=list/get/save) ← list_scripts / get_script_source / save_script

  • search_code(keyword, script_url=None) ← search_code / search_code_in_script

  • hook_function(path, mode=intercept/trace) ← hook_function / trace_function

  • instrumentation(action=install/log/stop/reload/status) ← instrument_jsvmp_source / get_instrumentation_log / stop_instrumentation / reload_with_hooks / get_instrumentation_status

  • cookies(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 pollution

  • get_network_request: max_body_size parameter 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"): Fixed too much recursion caused by Proxy recursion

  • remove_hooks: Truly restores Proxy objects

  • evaluate_js: BOM / lone surrogate / whitespace auto-cleaning

  • instrument_jsvmp_source: CSP pre-check

  • navigate: Graceful degradation on timeout

v0.5.0 — Signature-based Anti-scraping Compatibility

  • instrument_jsvmp_source default MCP-side AST rewriting

  • hook_jsvmp_interpreter added mode="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 tools
check_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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior4/5

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

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's 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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
selectorYes

TDQS

C2.1/5.0
Behavior2/5

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.

Conciseness2/5

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.

Completeness2/5

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.

Parameters1/5

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.

Purpose3/5

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.

Usage Guidelines2/5

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

No guidance on when to use this tool versus alternatives 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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
propertiesNo

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
max_fieldsNo
request_idsYes
include_bodyNo
include_headersNo
max_value_charsNo

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
actionYes
domainNo
cookies_listNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
worldNoisolated
frame_urlNo
expressionYes
frame_nameNo
frame_indexNo
await_promiseNo
result_formatNoauto

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
save_pathYes
url_filterNo
include_bodyNo
include_sensitiveNo

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
save_pathYes

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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

Given the simplicity of the tool 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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
clearNo
levelNo
keywordNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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

No guidance on when to use this tool 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
request_idYes
include_bodyNo
max_body_sizeNo
include_headersNo

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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

Given no output schema, the description 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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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+):

  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').

  2. 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
request_idYes

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
storage_typeNolocal

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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

No explicit guidance on when to use this tool versus alternatives (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.

ParametersJSON Schema
NameRequiredDescriptionDefault
clearNo
worldNoisolated
frame_urlNo
frame_nameNo
frame_indexNo
function_pathNo
include_persistentNo

TDQS

C2.4/5.0
Behavior2/5

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.

Conciseness3/5

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.

Completeness2/5

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.

Parameters1/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNointercept
worldNoisolated
log_argsNo
positionNobefore
frame_urlNo
hook_codeNo
log_stackNo
frame_nameNo
log_returnNo
persistentNo
frame_indexNo
max_capturesNo
function_pathYes
serializationNojson
non_overridableNo
wait_timeout_msNo
poll_interval_msNo
watch_assignmentsNo

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoproxy
persistentNo
script_urlNo
max_entriesNo
track_callsNo
track_propsNo
proxy_objectsNo
track_reflectNo

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
state_pathYes

TDQS

A3.6/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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

Given the simplicity of the tool (one 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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
presetYes
persistentNo

TDQS

A4.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool injects a 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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNovmp
modeNoast
clearNo
limitNo
actionYes
clear_logNo
frame_urlNo
frame_nameNo
ignore_cspNo
key_filterNo
tag_filterNo
wait_untilNoload
frame_indexNo
type_filterNo
url_patternNo
max_rewritesNo
on_oversizedNoselective
max_file_sizeNo
rewrite_callsNo
fallback_on_errorNo
filter_object_namesNo
include_source_siteNo
filter_property_namesNo
rewrite_member_accessNo

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters5/5

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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose 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.

Usage Guidelines5/5

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").

ParametersJSON Schema
NameRequiredDescriptionDefault
actionNolog
modify_bodyNo
url_patternYes
mock_responseNo
modify_headersNo

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters5/5

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.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: '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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
geoipNo
proxyNo
localeNoauto
os_typeNoauto
headlessNo
humanizeNo
ws_endpointNo
block_imagesNo
block_webrtcNo
enable_traceNo
trace_objectsNo
browser_versionNo
trace_max_eventsNo

TDQS

A5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
methodNo
after_idNo
url_filterNo
status_codeNo
resource_typeNo
url_contains_domainNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's 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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters1/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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

No guidance on when to use this tool 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYes
url_patternNo**/*
capture_bodyNo
max_body_sizeNo
wait_timeout_msNo

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNosummary
limitNo
bucket_msNo
file_pathYes
filter_kindNo
filter_siteNo
search_queryNo
filter_objectNo

TDQS

C2.5/5.0
Behavior1/5

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.

Conciseness5/5

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.

Completeness1/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
wait_untilNoload

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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

For a simple, one-parameter tool with no output schema, the description 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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
keep_persistentNo

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
clear_cookiesNo
clear_storageNo
stop_engine_traceNo
clear_active_routesNo
clear_network_captureNo
clear_persistent_hooksNo

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters1/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
save_pathYes
request_idYes
allow_partialNo

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNo
actionYes
save_pathNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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

Given the tool's simplicity 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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
keywordYes
script_urlNo
max_resultsNo
context_charsNo
context_linesNo

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
selectorNo
full_pageNo

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

No guidance on when to use this tool versus alternatives 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
max_nodesNo
timeout_msNo

TDQS

A3.5/5.0
Behavior3/5

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

No annotations are provided, so the description carries 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNosummary
limitNo
actionNocapture
durationNo
bucket_msNo
filter_kindNo
filter_siteNo
search_queryNo
filter_objectNo
collect_valuesNo

TDQS

B3.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYes
delayNo
selectorYes

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's 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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
runtimeNobrowser
samplesYes
timeout_msNo
signer_codeYes
compare_paramsNo

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
timeoutNo
selectorNo
url_patternNo

TDQS

B3.3/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

  1. 6 tool updatesv1.8.0
    • Addedcompare_network_requests
    • Changedevaluate_js1 field changed
      • addedInput schema / properties / result_format
        Added value: +{
        +  "default": "auto",
        +  "title": "Result Format",
        +  "type": "string"
        +}
    • Changedhook_function1 field changed
      • addedInput schema / properties / serialization
        Added value: +{
        +  "default": "json",
        +  "title": "Serialization",
        +  "type": "string"
        +}
    • Changedinstrumentation3 fields changed
      • addedInput schema / properties / frame_index
        Added value: +{
        +  "title": "Frame Index",
        +  "type": "integer"
        +}
      • addedInput schema / properties / frame_name
        Added value: +{
        +  "title": "Frame Name",
        +  "type": "string"
        +}
      • addedInput schema / properties / frame_url
        Added value: +{
        +  "title": "Frame Url",
        +  "type": "string"
        +}
    • Addedsave_response_body
    • Changedtake_snapshot2 fields changed
      • addedInput schema / properties / max_nodes
        Added value: +{
        +  "default": 1000,
        +  "title": "Max Nodes",
        +  "type": "integer"
        +}
      • addedInput schema / properties / timeout_ms
        Added value: +{
        +  "default": 5000,
        +  "title": "Timeout Ms",
        +  "type": "integer"
        +}
  2. 12 tool updatesv1.6.0
    • Changedevaluate_js4 fields changed
      • addedInput schema / properties / frame_index
        Added value: +{
        +  "title": "Frame Index",
        +  "type": "integer"
        +}
      • addedInput schema / properties / frame_name
        Added value: +{
        +  "title": "Frame Name",
        +  "type": "string"
        +}
      • addedInput schema / properties / frame_url
        Added value: +{
        +  "title": "Frame Url",
        +  "type": "string"
        +}
      • addedInput schema / properties / world
        Added value: +{
        +  "default": "isolated",
        +  "title": "World",
        +  "type": "string"
        +}
    • Addedexport_network_capture
    • Addedget_trace_data
    • Changedhook_function7 fields changed
      • addedInput schema / properties / frame_index
        Added value: +{
        +  "title": "Frame Index",
        +  "type": "integer"
        +}
      • addedInput schema / properties / frame_name
        Added value: +{
        +  "title": "Frame Name",
        +  "type": "string"
        +}
      • addedInput schema / properties / frame_url
        Added value: +{
        +  "title": "Frame Url",
        +  "type": "string"
        +}
      • addedInput schema / properties / poll_interval_ms
        Added value: +{
        +  "default": 50,
        +  "title": "Poll Interval Ms",
        +  "type": "integer"
        +}
      • addedInput schema / properties / wait_timeout_ms
        Added value: +{
        +  "title": "Wait Timeout Ms",
        +  "type": "integer"
        +}
      • addedInput schema / properties / watch_assignments
        Added value: +{
        +  "title": "Watch Assignments",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / world
        Added value: +{
        +  "default": "isolated",
        +  "title": "World",
        +  "type": "string"
        +}
    • Changedinstrumentation1 field changed
      • addedInput schema / properties / include_source_site
        Added value: +{
        +  "default": false,
        +  "title": "Include Source Site",
        +  "type": "boolean"
        +}
    • Changedlaunch_browser3 fields changed
      • addedInput schema / properties / browser_version
        Added value: +{
        +  "title": "Browser Version",
        +  "type": "string"
        +}
      • addedInput schema / properties / trace_max_events
        Added value: +{
        +  "default": 100000,
        +  "title": "Trace Max Events",
        +  "type": "integer"
        +}
      • addedInput schema / properties / trace_objects
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "title": "Trace Objects",
        +  "type": "array"
        +}
    • Changedlist_network_requests2 fields changed
      • addedInput schema / properties / after_id
        Added value: +{
        +  "title": "After Id",
        +  "type": "integer"
        +}
      • addedInput schema / properties / limit
        Added value: +{
        +  "title": "Limit",
        +  "type": "integer"
        +}
    • Changednetwork_capture2 fields changed
      • addedInput schema / properties / max_body_size
        Added value: +{
        +  "default": 200000,
        +  "title": "Max Body Size",
        +  "type": "integer"
        +}
      • addedInput schema / properties / wait_timeout_ms
        Added value: +{
        +  "default": 0,
        +  "title": "Wait Timeout Ms",
        +  "type": "integer"
        +}
    • Changedquery_trace_file2 fields changed
      • addedInput schema / properties / filter_kind
        Added value: +{
        +  "title": "Filter Kind",
        +  "type": "string"
        +}
      • addedInput schema / properties / filter_site
        Added value: +{
        +  "title": "Filter Site",
        +  "type": "string"
        +}
    • Changedreset_browser_state1 field changed
      • addedInput schema / properties / stop_engine_trace
        Added value: +{
        +  "default": true,
        +  "title": "Stop Engine Trace",
        +  "type": "boolean"
        +}
    • Changedtrace_property_access3 fields changed
      • addedInput schema / properties / action
        Added value: +{
        +  "default": "capture",
        +  "title": "Action",
        +  "type": "string"
        +}
      • addedInput schema / properties / filter_kind
        Added value: +{
        +  "title": "Filter Kind",
        +  "type": "string"
        +}
      • addedInput schema / properties / filter_site
        Added value: +{
        +  "title": "Filter Site",
        +  "type": "string"
        +}
    • Changedverify_signer_offline2 fields changed
      • addedInput schema / properties / runtime
        Added value: +{
        +  "default": "browser",
        +  "title": "Runtime",
        +  "type": "string"
        +}
      • addedInput schema / properties / timeout_ms
        Added value: +{
        +  "default": 10000,
        +  "title": "Timeout Ms",
        +  "type": "integer"
        +}
  3. 16 tool updatesv1.1.1
    • Changedcompare_env4 fields changed
      • removedInput schema / properties / properties / anyOf
        Removed value: -[
        -  {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / properties / default
        Removed value: -null
      • addedInput schema / properties / properties / items
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / properties / type
        Added value: +"array"
    • Changedcookies10 fields changed
      • removedInput schema / properties / cookies_list / anyOf
        Removed value: -[
        -  {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / cookies_list / default
        Removed value: -null
      • addedInput schema / properties / cookies_list / items
        Added value: +{
        +  "additionalProperties": true,
        +  "type": "object"
        +}
      • addedInput schema / properties / cookies_list / type
        Added value: +"array"
      • removedInput schema / properties / domain / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / domain / default
        Removed value: -null
      • addedInput schema / properties / domain / type
        Added value: +"string"
      • removedInput schema / properties / name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / name / default
        Removed value: -null
      • addedInput schema / properties / name / type
        Added value: +"string"
    • Changedget_console_logs6 fields changed
      • removedInput schema / properties / keyword / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / keyword / default
        Removed value: -null
      • addedInput schema / properties / keyword / type
        Added value: +"string"
      • removedInput schema / properties / level / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / level / default
        Removed value: -null
      • addedInput schema / properties / level / type
        Added value: +"string"
    • Changedhook_jsvmp_interpreter4 fields changed
      • removedInput schema / properties / proxy_objects / anyOf
        Removed value: -[
        -  {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / proxy_objects / default
        Removed value: -null
      • addedInput schema / properties / proxy_objects / items
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / proxy_objects / type
        Added value: +"array"
    • Changedinstrumentation17 fields changed
      • removedInput schema / properties / filter_object_names / anyOf
        Removed value: -[
        -  {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / filter_object_names / default
        Removed value: -null
      • addedInput schema / properties / filter_object_names / items
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / filter_object_names / type
        Added value: +"array"
      • removedInput schema / properties / filter_property_names / anyOf
        Removed value: -[
        -  {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / filter_property_names / default
        Removed value: -null
      • addedInput schema / properties / filter_property_names / items
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / filter_property_names / type
        Added value: +"array"
      • removedInput schema / properties / key_filter / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / key_filter / default
        Removed value: -null
      • addedInput schema / properties / key_filter / type
        Added value: +"string"
      • removedInput schema / properties / tag_filter / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / tag_filter / default
        Removed value: -null
      • addedInput schema / properties / tag_filter / type
        Added value: +"string"
      • removedInput schema / properties / type_filter / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / type_filter / default
        Removed value: -null
      • addedInput schema / properties / type_filter / type
        Added value: +"string"
    • Changedintercept_request11 fields changed
      • addedInput schema / properties / mock_response / additionalProperties
        Added value: +true
      • removedInput schema / properties / mock_response / anyOf
        Removed value: -[
        -  {
        -    "additionalProperties": true,
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / mock_response / default
        Removed value: -null
      • addedInput schema / properties / mock_response / type
        Added value: +"object"
      • removedInput schema / properties / modify_body / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / modify_body / default
        Removed value: -null
      • addedInput schema / properties / modify_body / type
        Added value: +"string"
      • addedInput schema / properties / modify_headers / additionalProperties
        Added value: +true
      • removedInput schema / properties / modify_headers / anyOf
        Removed value: -[
        -  {
        -    "additionalProperties": true,
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / modify_headers / default
        Removed value: -null
      • addedInput schema / properties / modify_headers / type
        Added value: +"object"
    • Changedlaunch_browser4 fields changed
      • removedInput schema / properties / proxy / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / proxy / default
        Removed value: -null
      • addedInput schema / properties / proxy / type
        Added value: +"string"
      • addedInput schema / properties / ws_endpoint
        Added value: +{
        +  "title": "Ws Endpoint",
        +  "type": "string"
        +}
    • Changedlist_network_requests15 fields changed
      • removedInput schema / properties / method / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / method / default
        Removed value: -null
      • addedInput schema / properties / method / type
        Added value: +"string"
      • removedInput schema / properties / resource_type / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / resource_type / default
        Removed value: -null
      • addedInput schema / properties / resource_type / type
        Added value: +"string"
      • removedInput schema / properties / status_code / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / status_code / default
        Removed value: -null
      • addedInput schema / properties / status_code / type
        Added value: +"integer"
      • removedInput schema / properties / url_contains_domain / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / url_contains_domain / default
        Removed value: -null
      • addedInput schema / properties / url_contains_domain / type
        Added value: +"string"
      • removedInput schema / properties / url_filter / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / url_filter / default
        Removed value: -null
      • addedInput schema / properties / url_filter / type
        Added value: +"string"
    • Changednavigate4 fields changed
      • removedInput schema / properties / pre_inject_hooks / anyOf
        Removed value: -[
        -  {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / pre_inject_hooks / default
        Removed value: -null
      • addedInput schema / properties / pre_inject_hooks / items
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / pre_inject_hooks / type
        Added value: +"array"
    • Changedquery_trace_file6 fields changed
      • removedInput schema / properties / filter_object / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / filter_object / default
        Removed value: -null
      • addedInput schema / properties / filter_object / type
        Added value: +"string"
      • removedInput schema / properties / search_query / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / search_query / default
        Removed value: -null
      • addedInput schema / properties / search_query / type
        Added value: +"string"
    • Changedscripts6 fields changed
      • removedInput schema / properties / save_path / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / save_path / default
        Removed value: -null
      • addedInput schema / properties / save_path / type
        Added value: +"string"
      • removedInput schema / properties / url / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / url / default
        Removed value: -null
      • addedInput schema / properties / url / type
        Added value: +"string"
    • Changedsearch_code3 fields changed
      • removedInput schema / properties / script_url / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / script_url / default
        Removed value: -null
      • addedInput schema / properties / script_url / type
        Added value: +"string"
    • Changedtake_screenshot3 fields changed
      • removedInput schema / properties / selector / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / selector / default
        Removed value: -null
      • addedInput schema / properties / selector / type
        Added value: +"string"
    • Changedtrace_property_access6 fields changed
      • removedInput schema / properties / filter_object / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / filter_object / default
        Removed value: -null
      • addedInput schema / properties / filter_object / type
        Added value: +"string"
      • removedInput schema / properties / search_query / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / search_query / default
        Removed value: -null
      • addedInput schema / properties / search_query / type
        Added value: +"string"
    • Changedverify_signer_offline4 fields changed
      • removedInput schema / properties / compare_params / anyOf
        Removed value: -[
        -  {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / compare_params / default
        Removed value: -null
      • addedInput schema / properties / compare_params / items
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / compare_params / type
        Added value: +"array"
    • Changedwait_for6 fields changed
      • removedInput schema / properties / selector / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / selector / default
        Removed value: -null
      • addedInput schema / properties / selector / type
        Added value: +"string"
      • removedInput schema / properties / url_pattern / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / url_pattern / default
        Removed value: -null
      • addedInput schema / properties / url_pattern / type
        Added value: +"string"
  4. 48 tool updatesv1.0.0
    • Removedadd_init_script
    • Removedbypass_debugger_trap
    • Removedcheck_detection
    • Addedcheck_environment
    • Addedcookies
    • Removeddelete_cookies
    • Removeddump_jsvmp_strings
    • Removedevaluate_js_handle
    • Removedfreeze_prototype
    • Removedget_breakpoint_data
    • Removedget_cookies
    • Removedget_fingerprint_info
    • Removedget_jsvmp_log
    • Changedget_network_request2 fields changed
      • changedInput schema / properties / include_body / default
        Previous value: -trueNew value: +false
      • addedInput schema / properties / max_body_size
        Added value: +{
        +  "default": 5000,
        +  "title": "Max Body Size",
        +  "type": "integer"
        +}
    • Removedget_page_content
    • Removedget_page_html
    • Removedget_property_access_log
    • Removedget_response_body_page
    • Removedget_script_source
    • Removedget_session_info
    • Removedget_trace_data
    • Removedgo_back
    • Changedhook_function8 fields changed
      • addedInput schema / properties / hook_code / default
        Added value: +""
      • addedInput schema / properties / log_args
        Added value: +{
        +  "default": true,
        +  "title": "Log Args",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / log_return
        Added value: +{
        +  "default": true,
        +  "title": "Log Return",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / log_stack
        Added value: +{
        +  "default": false,
        +  "title": "Log Stack",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / max_captures
        Added value: +{
        +  "default": 50,
        +  "title": "Max Captures",
        +  "type": "integer"
        +}
      • addedInput schema / properties / mode
        Added value: +{
        +  "default": "intercept",
        +  "title": "Mode",
        +  "type": "string"
        +}
      • addedInput schema / properties / persistent
        Added value: +{
        +  "default": false,
        +  "title": "Persistent",
        +  "type": "boolean"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "function_path",
        -  "hook_code"
        -]New value: +[
        +  "function_path"
        +]
    • Changedhook_jsvmp_interpreter8 fields changed
      • addedInput schema / properties / max_entries
        Added value: +{
        +  "default": 10000,
        +  "title": "Max Entries",
        +  "type": "integer"
        +}
      • addedInput schema / properties / mode
        Added value: +{
        +  "default": "proxy",
        +  "title": "Mode",
        +  "type": "string"
        +}
      • addedInput schema / properties / proxy_objects
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Proxy Objects"
        +}
      • addedInput schema / properties / script_url / default
        Added value: +""
      • addedInput schema / properties / track_calls
        Added value: +{
        +  "default": true,
        +  "title": "Track Calls",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / track_props
        Added value: +{
        +  "default": true,
        +  "title": "Track Props",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / track_reflect
        Added value: +{
        +  "default": true,
        +  "title": "Track Reflect",
        +  "type": "boolean"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "script_url"
        -]
    • Addedinstrumentation
    • Changedlaunch_browser1 field changed
      • addedInput schema / properties / enable_trace
        Added value: +{
        +  "default": false,
        +  "title": "Enable Trace",
        +  "type": "boolean"
        +}
    • Changedlist_network_requests1 field changed
      • addedInput schema / properties / url_contains_domain
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Url Contains Domain"
        +}
    • Removedlist_scripts
    • Addedlist_trace_files
    • Changednavigate3 fields changed
      • addedInput schema / properties / clear_network_capture
        Added value: +{
        +  "default": true,
        +  "title": "Clear Network Capture",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / collect_response_chain
        Added value: +{
        +  "default": true,
        +  "title": "Collect Response Chain",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / pre_inject_hooks
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Pre Inject Hooks"
        +}
    • Addednetwork_capture
    • Addedquery_trace_file
    • Addedreset_browser_state
    • Removedsave_script
    • Addedscripts
    • Changedsearch_code4 fields changed
      • addedInput schema / properties / context_chars
        Added value: +{
        +  "default": 200,
        +  "title": "Context Chars",
        +  "type": "integer"
        +}
      • addedInput schema / properties / context_lines
        Added value: +{
        +  "default": 3,
        +  "title": "Context Lines",
        +  "type": "integer"
        +}
      • changedInput schema / properties / max_results / default
        Previous value: -50New value: +200
      • addedInput schema / properties / script_url
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Script Url"
        +}
    • Removedsearch_code_in_script
    • Removedsearch_json_path
    • Removedsearch_response_body
    • Removedset_breakpoint_via_hook
    • Removedset_cookies
    • Removedset_storage
    • Removedstart_network_capture
    • Removedstop_intercept
    • Removedstop_network_capture
    • Removedtrace_function
    • Changedtrace_property_access11 fields changed
      • addedInput schema / properties / bucket_ms
        Added value: +{
        +  "default": 500,
        +  "title": "Bucket Ms",
        +  "type": "integer"
        +}
      • addedInput schema / properties / collect_values
        Added value: +{
        +  "default": false,
        +  "title": "Collect Values",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / duration
        Added value: +{
        +  "default": 10,
        +  "title": "Duration",
        +  "type": "integer"
        +}
      • addedInput schema / properties / filter_object
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Filter Object"
        +}
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 1000,
        +  "title": "Limit",
        +  "type": "integer"
        +}
      • removedInput schema / properties / max_entries
        Removed value: -{
        -  "default": 2000,
        -  "title": "Max Entries",
        -  "type": "integer"
        -}
      • addedInput schema / properties / mode
        Added value: +{
        +  "default": "summary",
        +  "title": "Mode",
        +  "type": "string"
        +}
      • removedInput schema / properties / persistent
        Removed value: -{
        -  "default": false,
        -  "title": "Persistent",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / search_query
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Search Query"
        +}
      • removedInput schema / properties / targets
        Removed value: -{
        -  "items": {
        -    "type": "string"
        -  },
        -  "title": "Targets",
        -  "type": "array"
        -}
      • removedInput schema / required
        Removed value: -[
        -  "targets"
        -]
    • Addedverify_signer_offline
  5. 57 tool updatesv0.3.0
    • First observedadd_init_script
    • First observedbypass_debugger_trap
    • First observedcheck_detection
    • First observedclick
    • First observedclose_browser
    • First observedcompare_env
    • First observeddelete_cookies
    • First observeddump_jsvmp_strings
    • First observedevaluate_js
    • First observedevaluate_js_handle
    • First observedexport_state
    • First observedfreeze_prototype
    • First observedget_breakpoint_data
    • First observedget_console_logs
    • First observedget_cookies
    • First observedget_fingerprint_info
    • First observedget_jsvmp_log
    • First observedget_network_request
    • First observedget_page_content
    • First observedget_page_html
    • First observedget_page_info
    • First observedget_property_access_log
    • First observedget_request_initiator
    • First observedget_response_body_page
    • First observedget_script_source
    • First observedget_session_info
    • First observedget_storage
    • First observedget_trace_data
    • First observedgo_back
    • First observedhook_function
    • First observedhook_jsvmp_interpreter
    • First observedimport_state
    • First observedinject_hook_preset
    • First observedintercept_request
    • First observedlaunch_browser
    • First observedlist_network_requests
    • First observedlist_scripts
    • First observednavigate
    • First observedreload
    • First observedremove_hooks
    • First observedsave_script
    • First observedsearch_code
    • First observedsearch_code_in_script
    • First observedsearch_json_path
    • First observedsearch_response_body
    • First observedset_breakpoint_via_hook
    • First observedset_cookies
    • First observedset_storage
    • First observedstart_network_capture
    • First observedstop_intercept
    • First observedstop_network_capture
    • First observedtake_screenshot
    • First observedtake_snapshot
    • First observedtrace_function
    • First observedtrace_property_access
    • First observedtype_text
    • First observedwait_for

TDQS

B3.4/5.0

Scored across 39 tools

Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count3/5

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.

Completeness5/5

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

ActivitySlowing
ResponsivenessWithin a week

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    An 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.
    36
    37 npm
    7
    MIT
  • A
    license
    C
    quality
    B
    maintenance
    An 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.
    35
    21 npm
    1,020
    Apache 2.0
  • A
    license
    Not graded
    quality
    D
    maintenance
    A 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 npm
    1
    Apache 2.0