Skip to main content
Glama
camoufox-reverse-mcp

camoufox-reverse-mcp

camoufox-reverse-mcp

中文 | English

基于反指纹浏览器的 MCP Server,专为 JavaScript 逆向工程设计。

一个 MCP(Model Context Protocol)服务器,让 AI 编码助手(Claude Code、Cursor、Cline 等)能够通过 Camoufox 反指纹浏览器对目标网站进行:接口参数分析、JS 文件静态分析、动态断点调试、函数 Hook 追踪、网络流量拦截、JSVMP 字节码分析、Cookie/存储管理等逆向操作。

为什么选择 Camoufox?

能力

实现与边界

浏览器

Firefox / Camoufox

运行时分析

显式执行世界、Frame、Hook 与网络捕获

JSVMP 调查

运行时探针与源码插桩,按具体目标验证

持久 Hook

Context 初始化,明确 pending 与卸载边界

核心优势:

  • Camoufox 在 C++ 层面 修改指纹信息,不依赖页面 JS patch,避免常见的 descriptor/prototype 泄露

  • Juggler 隔离减少部分页面侧自动化痕迹;Hook、环境差异与时序仍可能被观察

  • BrowserForge 按 真实世界流量统计分布 生成指纹,不是随机拼凑

  • 可用于反爬与环境依赖分析;具体站点的可用性必须通过实际样本验证

  • Hook 可选 Object.defineProperty 防覆盖保护;锁定属性可能需要重建 Context 才能恢复


Related MCP server: JS Reverse MCP

v1.8.0:真实源码实操与观测语义修复

  • 真实 KProtect VM、javascript-obfuscator CFF、CryptoJS/FingerprintJS 多轮本地实操;失败反馈进入修复与复验。

  • 插桩保留异常、this 和求值顺序,主世界/Frame 日志可读;本地 Acorn 支持现代语法,保守跳过不安全改写。

  • 精确字符串可选 evaluate_js(result_format="json_ascii");低副作用函数日志可选 hook_function(serialization="preview"),同步异常有明确记录。

  • 动态脚本按当前响应处理,不因改写失败重放请求;原生快照明确当前页面与世界。

详情见 v1.8.0、真实源码与验证。

v1.7.0:经多轮 Agent 实操的证据与诊断

  • 新增 compare_network_requests、save_response_body,保留原始请求语义并明确哈希/字节口径。

  • 环境检查按任务范围提示复用与失效,不默认清理已有证据;导航保留原始失败,快照有界等待与输出。

  • 三轮九个独立任务保留失败并反馈修正,最终一轮签名/WASM/分页全部通过独立验收。

详情见 v1.7.0、公开研究与实操记录。

v1.6.0:通用采集与独立验签

  • 同 URL 并发响应按 Request 对象关联,完整采集 Cookie/Set-Cookie,并明确失败、淘汰、未完成任务和截断状态。

  • list_network_requests(limit=100, after_id=0) 增量读取;export_network_capture 导出有版本号的 JSON,默认掩码,保留旧调用方式。

  • verify_signer_offline(..., runtime="node") 可不启动浏览器验证独立签名函数;默认 browser 路径不变,无有效期望值的样本不会再误通过。

  • Cookie 组合过滤只删除同时匹配的条目,老运行库通过逐条过期兼容;导出不会覆盖旧文件,采集清理不会复用旧请求 ID。

详细行为、限制与示例见 通用采集契约 和 v1.6.0 版本说明。

快速开始

方式一:AI 对话框直接安装(推荐)

在你的 AI 编码工具(Cursor / Claude Code / Codex 等)的对话框中输入:

帮我安装下这个mcp工具:camoufox-reverse-mcp
项目地址:https://github.com/WhiteNightShadow/camoufox-reverse-mcp

AI 会自动完成克隆、安装依赖、配置 MCP Server 的全部流程。

方式二:手动安装

git clone https://github.com/WhiteNightShadow/camoufox-reverse-mcp.git
cd camoufox-reverse-mcp
pip install -e .

v1.1.0 将 MCP Python SDK 固定在兼容的 v1 系列,并自动规范化可选参数 schema,可兼容 Moonshot/Kimi 等要求每个工具参数都包含 type 的严格服务。

客户端配置

{
  "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"
      ]
    }
  }
}

可用工具一览

浏览器控制

工具

说明

launch_browser

启动 Camoufox;可用 browser_version 单次选择已安装版本,不修改 active 配置

close_browser

关闭浏览器,释放资源

navigate

导航到指定 URL(支持 pre_inject_hooks、redirect_chain 追踪)

reload

刷新页面

take_screenshot

截图(支持全页面、指定元素)

take_snapshot

获取页面无障碍树(token 高效)

click / type_text

点击元素 / 输入文本

wait_for

等待元素出现或 URL 匹配

get_page_info

获取当前页面 URL、标题、视口尺寸和 Frame 清单

JS 执行与调试

工具

说明

evaluate_js

执行 JS 表达式;默认隔离上下文,可显式选择主世界和目标 Frame

脚本分析

工具

说明

scripts(action)

脚本管理:list 列出 / get 获取源码 / save 保存到本地

search_code

搜索关键词(script_url=None 全量搜索,指定 URL 则单脚本搜索,自动检测压缩文件用字符级上下文)

Hook 与追踪

工具

说明

hook_function

Hook 或追踪函数;支持主世界、Frame、持久化和动态目标等待

get_trace_data

读取/清理函数 Trace,按 world 与 Frame 过滤

inject_hook_preset

一键注入预置 Hook(xhr / fetch / crypto / websocket / debugger_bypass / cookie / runtime_probe)

remove_hooks

移除所有 Hook 并恢复原始对象

get_console_logs

获取页面 console 输出

网络分析

工具

说明

network_capture(action)

网络捕获控制:start / stop / clear / status

list_network_requests

列出已捕获的请求(支持 URL / 域名 / 方法 / 类型 / 状态码过滤)

get_network_request

获取请求完整详情(max_body_size 控制 body 截断)

get_request_initiator

获取请求发起的 JS 调用栈

intercept_request

拦截请求:log / block / modify / mock / stop

JSVMP 逆向分析

反爬类型 → 工具路径对照表

反爬类型

代表

✅ 推荐路径

❌ 禁用

签名型(环境即签名)

RS 5/6、AK sensor_data

instrumentation(action="install")

pre_inject_hooks、hook_jsvmp_interpreter(mode="proxy")

行为型(参数签名)

TK JSVMP、JY gt4

hook_jsvmp_interpreter(mode="proxy")

—

纯混淆

常见 JS 混淆工具

任意组合

—

工具

说明

hook_jsvmp_interpreter

JSVMP 运行时探针(mode="proxy" 全覆盖 / mode="transparent" 签名安全)

instrumentation(action)

源码级插桩:install 注册改写 / log 获取日志 / stop 停止 / reload 重载 / status 查看状态

compare_env

浏览器环境指纹收集,用于与 Node.js/jsdom 对比

需要对齐浏览器与沙箱中的同一执行点时,可在安装时设置 include_source_site=True。事件会增加稳定 site_id 与单调 seq,log 返回 source_sites sidecar,映射到拦截脚本的原始字符区间。该能力默认关闭; 它表示混淆后 JS 的源码位置,不会猜测 VM 的 PC、opcode 或保护前源码位置。 对超过 200KB 且需要全量改写的脚本,需显式设置 on_oversized="force"; 否则应配合属性过滤并按需关闭 rewrite_calls 控制开销。

工具

说明

cookies(action)

Cookie 管理:get / set / delete

get_storage

获取 localStorage / sessionStorage

export_state / import_state

导出 / 导入完整浏览器状态

验证与环境

工具

说明

verify_signer_offline

离线验证签名函数:传入样本列表,逐样本字符级对比,定位首偏差点

check_environment

一站式自检:MCP、依赖、Camoufox Python/active/已安装版本及定制版状态

reset_browser_state

清理残留(hooks / capture / routes / 当前 engine trace),不关浏览器

引擎层属性追踪(v1.1.0 新增)

需要 camoufox-reverse 定制版浏览器。未安装时返回错误提示,不影响其他工具使用。

从 v1.3.0 起,Camoufox Python 0.5+ 用户可让官方版和定制版并存,且不改变 持久化 active 版本:

check_environment()
launch_browser(
  browser_version="whitenightshadow/152.0.4-beta.30-reverse.5",
  enable_trace=True
)

browser_version 必须使用 repo/版本或精确目录,存在同版本多份资产时必须传 精确目录。省略该参数时启动行为与 v1.2.0 完全相同;Camoufox 0.4.x 用户继续 使用原来的平铺缓存。所选版本必须与 active 浏览器具有相同完整 version/build,避免 上游共享资源产生版本混用。MCP 不下载浏览器、不修改 config.json,也不会触发缓存迁移。

工具

说明

trace_property_access

Gecko 原生 DOM/Web API 定点追踪;reverse.5 声明 77 点,旧兼容构建为 75 点,不改写页面 JS 对象/描述符/原型。支持 action=capture/start/stop/query/clear/status、summary/timeline/sequence/search、get/set/call、对象与 native site 过滤。collect_values=True 仅做追踪后的安全快照并列出跳过项,不代表事件发生时的值

list_trace_files

跨独立 run 目录列出 trace 文件(用于事后分析)

query_trace_file

查询 trace 缓存内的历史文件,支持对象、关键词、kind 与 site 过滤

每次 enable_trace=True 启动都会使用独立 run 目录,只控制本次浏览器的 PID,不会清理或开关其他 MCP 实例。开启 engine trace 时会临时关闭 Firefox content sandbox 以允许内容进程写入;普通启动不会改动 sandbox。


使用场景示例

场景 1:逆向登录接口的签名参数

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", world="main", persistent=True)
10. reload() → get_trace_data("window.getSign", world="main") ← 收集追踪数据

场景 2:通用 JSVMP 逆向(RS / AK / 自研 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 补齐

场景 3:验证协议代码

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": "..."}}]
   )

👉 完整的反爬类型识别与工作流见 docs/JSVMP_PLAYBOOK.md

场景 4:引擎层追踪 JSVMP 环境指纹(v1.1.0 新增)

需要 camoufox-reverse 定制版浏览器

1. launch_browser(
     browser_version="whitenightshadow/152.0.4-beta.30-reverse.5",
     enable_trace=True
   )                                           ← 显式启动定制版
2. trace_property_access(action="start")       ← 清空旧窗口并立即返回
3. navigate("https://www.douyin.com/video/xxx") ← 在新窗口内触发 JSVMP
4. # 继续执行 click/evaluate 等目标操作
5. trace_property_access(action="stop", mode="summary", collect_values=True)
   → 返回覆盖范围内命中的属性、频次、get/set/call、进程与 native site
   → snapshot_values 是操作后的安全快照;Cookie、Canvas、WebGL、Audio 等
     敏感或有副作用的路径会进入 values_skipped

# 按时间线查看属性访问节奏
6. trace_property_access(action="query", mode="timeline", bucket_ms=500)

# 按对象过滤
7. trace_property_access(action="query", filter_object="webgl")

# 搜索特定属性
8. trace_property_access(action="query", mode="search", search_query="cookie")

与 compare_env 的区别:

  • trace_property_access:对当前构建声明的固定 Gecko 原生注入点提供强证据; reverse.5 为 77 点,未命中不能证明 覆盖范围外的属性未被读取,也可能有高负载时间侧信道

  • compare_env:采集一组 JS 层环境基线;可通过 properties 或分批 evaluate_js 扩展,不能视为全量枚举

  • 路径 B 环境伪装时,用 trace 命中确定优先调查/补齐对象,再结合 compare_env 与动态验证确认完整范围,避免把覆盖集之外的未命中误作否定证据


技术架构

┌─────────────────────────────────────────────────┐
│           AI 编码助手 (Cursor / Claude)          │
│                    ↕ MCP (stdio)                 │
├─────────────────────────────────────────────────┤
│              camoufox-reverse-mcp                │
│  ┌──────────┬──────────┬──────────┬──────────┐  │
│  │Navigation│ Script   │Debugging │ Hooking  │  │
│  │          │ Analysis │          │          │  │
│  ├──────────┼──────────┼──────────┼──────────┤  │
│  │ Network  │ JSVMP    │  Cookie  │  Verify  │  │
│  │ Capture  │ Analysis │ Storage  │  Signer  │  │
│  ├──────────┴──────────┴──────────┴──────────┤  │
│  │ ★ PropertyTracer (trace_property_access)  │  │
│  │   Gecko 原生固定点追踪(不改写页面 JS)       │  │
│  └───────────────────────────────────────────┘  │
│                    ↕ Playwright API               │
├─────────────────────────────────────────────────┤
│      Camoufox (反指纹 Firefox, Juggler 协议)      │
│  C++ 引擎级指纹伪造 · BrowserForge 真实指纹分布     │
└─────────────────────────────────────────────────┘

更新记录

v1.5.2(2026-09-07)— 旧主世界通道兼容性

  • 使用与真实调用相同的 Promise 形式探测主世界通道,识别只能返回同步结果的旧构建

  • 不支持时在执行用户代码前选择 wrappedJSObject 回退,继续避免失败后重复执行

v1.5.1(2026-09-07)— Trace 清理与 Hook 生命周期修复

  • 修复清空 Trace 后再次调用目标函数抛错,保留页面原函数的返回行为

  • 主世界通道先做无副作用探测,执行失败后不再通过另一通道重复运行用户代码

  • 持久 Hook 可预先注册尚未创建的目标 Frame,返回明确的 pending 状态

  • 补齐当前 Frame 各执行世界的 Hook 卸载;不可恢复的锁定属性明确报告,无需重编浏览器

v1.5.0(2026-09-04)— 主世界、Frame 与可靠持久 Hook

  • evaluate_js/hook_function 新增显式 world="main",默认隔离上下文保持不变;Camoufox 原生 mw: 优先,旧版可安全回退

  • 增加 Frame 清单与 frame_url/frame_name/frame_index,多匹配和不稳定持久索引明确拒绝

  • 持久 Hook 增加有界等待和通用赋值监听,可捕获动态函数首次调用;缺失目标返回 pending/target_not_found,不再假报成功

  • 恢复 get_trace_data,Trace 缓存按 world/Frame 隔离且有界;修复 intercept 忽略 persistent 的问题

  • Firefox 135、官方 152、reverse.5 及真实 FeiLin 页面验证通过,无需重新编译浏览器

v1.4.1(2026-09-03)— Firefox 152 LocalStorage 追踪路径对齐

  • 配套 camoufox-reverse reverse.5,将既有 localStorage.getItem/setItem 两点迁移到 Firefox 152 默认 LSNG LSObject 路径

  • PropertyTracer 扩为 77 点、protocol 1 不变,事件 object/property/kind 与 MCP 聚合行为不变;LSObject 与 partitioned 路径由 native site 区分

  • 实时事件解析与聚合无需行为改动;默认 Trace-off、135/reverse.3/reverse.4 兼容路径不变。历史 JSONL 无构建 marker,查询时 hook_count 改为明确未知

v1.4.0(2026-09-03)— PropertyTracer 正确性、隔离与交互追踪

  • 配套正式版 camoufox-reverse reverse.4:75 个原路径不变,正确区分 get/set/call,并解析 native site、进程序列和微秒时间扩展字段

  • trace_property_access 新增兼容的 action=start/stop/query/capture/clear/status;可在 start 后继续执行页面操作,再 stop 聚合

  • 每次浏览器启动分配独立 trace run,控制、清理和历史查询不再影响并发 MCP 实例

  • 修复无浏览器时旧 control 文件被误报为 installed/trace_active;check_environment 现在拆分 installed、trace_capable、trace_active

  • 新窗口严格执行 off → drain → cleanup → on,避免 Windows 开放文件混入旧事件

  • 新增 kind/site 过滤、跨进程确定性排序、cap 提示及 capability 协商

  • collect_values 明确为追踪后的安全快照;Cookie 与可能产生副作用的 API 默认跳过

  • 可由 Camoufox 0.5 元数据识别的官方浏览器请求 enable_trace=True 时,不再注入无效配置或关闭 sandbox;普通启动保持不变

  • Camoufox 0.4 的官方 135 与早期无 marker 的定制 135 无法在启动前区分;为兼容旧定制版,显式请求 Trace 时仍尝试旧握手,默认 enable_trace=False 不受影响

v1.3.0(2026-09-02)— Camoufox 152 与无侵入多版本选择

  • launch_browser 新增可选 browser_version,单次选择 Camoufox 0.5+ 已安装版本且不修改 active 配置

  • 选择器强制使用 repo 限定并拒绝歧义;active/selected version+build 不一致时明确拒绝

  • check_environment 新增 Camoufox Python、active、installed selectors、能力标记及旧缓存迁移风险诊断

  • 修复主机为 C.UTF-8 时生成无效 locale="C"、导致浏览器无法启动的问题

  • 默认参数保持不变;Camoufox 0.4.x + Firefox 135 用户无需迁移,官方浏览器仍可使用全部非 PropertyTracer 工具

  • 配套可选的 Camoufox Reverse 152 beta.30 预发布构建

  • 感谢 @dsaw1111 报告定制版与官方版本差距

v1.2.0(2026-08-11)— 通用源码执行点映射

  • instrumentation(action="install") 新增默认关闭的 include_source_site

  • AST 与 regex 插桩事件可携带内容寻址的稳定 site_id 和单调 seq

  • instrumentation(action="log") 返回原始脚本 SHA-256、URL、字符区间与 AST 行列 sidecar,并补齐 hot_functions

  • 默认 tap 事件字段保持不变;不执行用户提供的任意 AST 脚本,也不把单个 VM 的变量名猜成通用 PC/opcode

  • 感谢 @Moojing-jianchuan 提出执行点关联需求并提供分析材料

v1.1.2(2026-08-11)— Windows 引擎追踪配置修复

  • 修复 Windows 上 Camoufox 将配置拆为 CAMOU_CONFIG_1..n 后,enable_trace=True 无法注入 propertyTrace、持续返回 engine_trace_not_available 的问题

  • 完整重组原始 JSON 后再合并追踪配置,并按平台限制重新生成任意数量的连续分块;同时清理旧分块,保留全部原始指纹配置

  • 对数字顺序、十块以上配置、Unicode、分块扩缩容、无效配置及调用真实 camoufox.utils.get_env_vars() 模拟 Windows 分块增加回归测试

  • 针对本问题,已安装支持属性追踪的 camoufox-reverse 用户只需升级 MCP,无需重新编译或替换浏览器

  • 感谢 @Code-xy 报告问题、完成 Windows 实机定位并提供修复思路

v1.1.1(2026-07-29)— AST 链式调用插桩修复

  • 修复 new X().m1().m2()、Array.prototype.slice.call(arguments) 等嵌套调用因父子 AST 编辑区间重叠而生成损坏代码的问题

  • 仅在编辑区间重叠时保留外层插桩;普通成员访问和函数调用的现有改写行为保持不变

  • instrumentation(action="status") 新增 last_mode_used,可区分 AST、regex 回退和超大文件跳过路径

v1.1.0(2026-07-29)— 引擎追踪、浏览器接管与 Schema 兼容

稳定版:新增引擎层属性追踪和已运行浏览器接管,并提升严格 JSON Schema 服务及跨平台运行的兼容性。

新增工具

  • trace_property_access — Gecko 原生 DOM/Web API 定点追踪,不改写页面 JS 对象;支持 summary/timeline/sequence/search 四种视图

  • list_trace_files — 列出本地 trace 文件

  • query_trace_file — 查询历史 trace 文件

变更

  • launch_browser 新增 enable_trace 参数,启用后自动注入 CAMOU_CONFIG 和 MOZ_DISABLE_CONTENT_SANDBOX

  • launch_browser 新增 ws_endpoint,可接管已运行的 Camoufox 浏览器

  • check_environment 新增 camoufox_reverse 字段,检测定制版浏览器安装状态

  • 自动规范化顶层可选参数 schema,兼容 Moonshot/Kimi 等严格校验服务(感谢 @tuntun1337 的贡献)

稳定性修复

  • 修复 Windows 环境下 Camoufox/Playwright 导入死锁

  • 修复 Playwright Firefox driver 的 pageError 崩溃

  • 修复插桩改写响应后因 Content-Encoding 导致的内容丢失

依赖

  • MCP Python SDK 固定为 mcp>=1.29,<2;v2 迁移将在后续版本单独进行

  • 需要 camoufox-reverse 定制版浏览器(可选,不装不影响其他工具)

v1.0.0(2026-04-18)— 工具精简 + 回归纯 JS 逆向工具集

重大版本:80 → 32 工具,schema tokens 减半。移除 Session 档案/断言系统,回归纯 JS 逆向工具定位。

工具合并(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

移除的工具

  • Session 档案系统(7 个):start/stop_reverse_session、list_sessions、get_session_snapshot、attach_domain_readonly、export/import_session

  • 断言系统(4 个):add/verify/list/remove_assertion

  • 冷工具(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 等

新增

  • verify_signer_offline — 无状态签名函数验证(替代 verify_against_session)

Bug 修复(v0.8.1)

  • evaluate_js:多策略 JSON 解析(控制字符清理、双重编码解包)

  • navigate:默认清理网络缓存,防止跨导航请求污染

  • get_network_request:max_body_size 参数控制 body 截断(默认 5000)

  • launch_browser:already_running 时返回残留状态诊断

移除的依赖:tldextract(仅 Session 使用)

设计理念:MCP 是纯工具集(stateless),不做工作流管理。分析项目的记忆/累积属于 skill 层和用户工作区。

v0.6.0 — 实战 Bug 修复

  • hook_jsvmp_interpreter(mode="proxy"):修复 Proxy 递归导致 too much recursion

  • remove_hooks:真正恢复 Proxy 对象

  • evaluate_js:BOM / lone surrogate / whitespace 自动清理

  • instrument_jsvmp_source:CSP 预检

  • navigate:超时优雅降级

v0.5.0 — 签名型反爬兼容

  • instrument_jsvmp_source 默认 MCP 侧 AST 改写

  • hook_jsvmp_interpreter 新增 mode="transparent"

  • 反爬类型决策表 + JSVMP Playbook

v0.4.0 — 通用 JSVMP 适配

  • 源码级插桩、Cookie 归因、运行时探针

  • hook_jsvmp_interpreter 多路径覆盖重写

v0.3.0 — 稳定性修复

v0.2.0 — Hook 持久化 + JSVMP 分析

v0.1.0 — 初始版本(44 工具)


社区贡献者

  • @tuntun1337 — 严格 JSON Schema 兼容性

  • @Code-xy — Windows 引擎追踪问题定位与验证

  • @Moojing-jianchuan — JSVMP 执行点关联需求与分析材料

  • @dsaw1111 — Camoufox 152 版本差距与 PropertyTracer 升级需求

反馈 / 交流

使用过程中遇到 bug、想要新的 Hook 预设、或者想交流 JS 逆向思路,欢迎加微信:

  • 微信号:han8888v8888

加好友时烦请备注「camoufox-reverse」,方便快速通过。

许可证

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.

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.

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.

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.

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.

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.

NameRequiredDescriptionDefault
nameNo
actionYes
domainNo
cookies_listNo

Output 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

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

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.

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.

NameRequiredDescriptionDefault
clearNo
levelNo
keywordNo

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

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.

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.

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.

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.

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.

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.

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.

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.

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.

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

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.

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.

NameRequiredDescriptionDefault
limitNo
methodNo
after_idNo
url_filterNo
status_codeNo
resource_typeNo
url_contains_domainNo

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

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.

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.

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.

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.

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.

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.

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.

NameRequiredDescriptionDefault
urlNo
actionYes
save_pathNo

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

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.

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.

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.

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.

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.

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.

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

ActivityInactive
ResponsivenessSyncing

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
    166 npm
    7
    MIT
  • A
    license
    C
    quality
    D
    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
    47 npm
    1,048
    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.
    1,224 npm
    1
    Apache 2.0