Skip to main content
Glama

Firefox DevTools MCP

npm version CI codecov License: MIT

用于通过 WebDriver BiDi(经由 Selenium WebDriver)自动化 Firefox 的模型上下文协议 (MCP) 服务器。适用于 Claude Code、Claude Desktop、Cursor、Cline 及其他 MCP 客户端。

仓库地址:https://github.com/mozilla/firefox-devtools-mcp

注意:此 MCP 服务器需要本地安装 Firefox 浏览器,无法在 glama.ai 等云托管服务上运行。请使用 npx firefox-devtools-mcp@latest 在本地运行,或使用提供的 Dockerfile 通过 Docker 运行。

要求

  • Node.js ≥ 20.19.0

  • 已安装 Firefox 100+(自动检测,或通过 --firefox-path 指定)

Related MCP server: gecko-mcp

安装并与 Claude Code (npx) 一起使用

推荐:使用 npx,以便始终运行 npm 上发布的最新版本。

选项 A — Claude Code CLI

claude mcp add firefox-devtools npx firefox-devtools-mcp@latest

通过参数或环境变量传递选项。示例:

# Headless + viewport via args
claude mcp add firefox-devtools npx firefox-devtools-mcp@latest -- --headless --viewport 1280x720

# Or via environment variables
claude mcp add firefox-devtools npx firefox-devtools-mcp@latest \
  --env START_URL=https://example.com \
  --env FIREFOX_HEADLESS=true

选项 B — 编辑 Claude Code 设置 JSON

添加到您的 Claude Code 配置文件中:

  • macOS: ~/Library/Application Support/Claude/Code/mcp_settings.json

  • Linux: ~/.config/claude/code/mcp_settings.json

  • Windows: %APPDATA%\Claude\Code\mcp_settings.json

{
  "mcpServers": {
    "firefox-devtools": {
      "command": "npx",
      "args": ["-y", "firefox-devtools-mcp@latest", "--headless", "--viewport", "1280x720"],
      "env": {
        "START_URL": "about:home"
      }
    }
  }
}

选项 C — 辅助脚本(本地开发构建)

npm run setup
# Choose Claude Code; the script saves JSON to the right path

使用 MCP Inspector 进行尝试

npx @modelcontextprotocol/inspector npx firefox-devtools-mcp@latest --start-url https://example.com --headless

然后调用如下工具:

  • list_pages, select_page, navigate_page

  • take_snapshot 然后 click_by_uid / fill_by_uid

  • list_network_requests(常驻捕获), get_network_request

  • screenshot_page, list_console_messages

CLI 选项

您可以传递标志或环境变量(右侧为名称):

  • --firefox-path — Firefox 二进制文件的绝对路径

  • --headless — 在无界面模式下运行 (FIREFOX_HEADLESS=true)

  • --viewport 1280x720 — 初始窗口大小

  • --profile-path — 使用特定的 Firefox 配置文件

  • --firefox-arg — 额外的 Firefox 参数(可重复)

  • --start-url — 启动时打开此 URL (START_URL)

  • --accept-insecure-certs — 忽略 TLS 错误 (ACCEPT_INSECURE_CERTS=true)

  • --connect-existing — 连接到已运行的 Firefox 而不是启动新实例 (CONNECT_EXISTING=true)

  • --marionette-port — 用于连接现有模式的 Marionette 端口,默认为 2828 (MARIONETTE_PORT)

  • --pref name=value — 通过 moz:firefoxOptions 在启动时设置 Firefox 首选项(可重复)

  • --enable-script — 启用 evaluate_script 工具,在页面上下文中执行任意 JavaScript (ENABLE_SCRIPT=true)

  • --enable-privileged-context — 启用特权上下文工具:列出/选择特权上下文、评估特权脚本、获取/设置 Firefox 首选项以及列出扩展。需要 MOZ_REMOTE_ALLOW_SYSTEM_ACCESS=1 (ENABLE_PRIVILEGED_CONTEXT=true)

关于 --pref 的说明:当 Firefox 在自动化模式下运行时,它会应用 RecommendedPreferences,这些首选项会修改浏览器行为以进行测试。--pref 选项允许在需要时覆盖这些默认值。

连接到现有的 Firefox

使用 --connect-existing 来自动化您真实的浏览会话——保持 Cookie、登录状态和打开的标签页不变:

# Start Firefox with Marionette enabled
firefox --marionette

# Run the MCP server
npx firefox-devtools-mcp --connect-existing --marionette-port 2828

或者在 about:config(或 user.js)中将 marionette.enabled 设置为 true,以便在每次启动时启用 Marionette。

依赖 BiDi 的功能(控制台事件、网络事件)在连接现有模式下不可用;所有其他功能均正常工作。

警告:请勿在正常浏览时保持 Marionette 启用。它会将 navigator.webdriver = true 并更改其他浏览器指纹信号,这可能会触发受 Cloudflare、Akamai 等保护的网站的机器人检测。仅在需要 MCP 自动化时启用 Marionette,之后请正常重启 Firefox。

工具概览

  • 页面:列出/新建/导航/选择/关闭

  • 快照/UID:获取/解析/清除

  • 输入:点击/悬停/填充/拖拽/上传/表单填充

  • 网络:列出/获取(ID 优先,过滤器,常驻捕获)

  • 控制台:列出/清除

  • 屏幕截图:页面/按 UID(对于 CLI 环境,可选 saveTo

  • 脚本:evaluate_script

  • 特权上下文:列出/选择特权(“chrome”)上下文,evaluate_privileged_script(需要 MOZ_REMOTE_ALLOW_SYSTEM_ACCESS=1

  • WebExtension:install_extension, uninstall_extension, list_extensions(列出需要 MOZ_REMOTE_ALLOW_SYSTEM_ACCESS=1

  • Firefox 管理:get_firefox_info, get_firefox_output, restart_firefox, set_firefox_prefs, get_firefox_prefs

  • 实用工具:接受/关闭对话框,历史记录后退/前进,设置视口

针对 Claude Code 的屏幕截图优化

在 Claude Code CLI 中使用屏幕截图时,base64 图像数据可能会占用大量上下文。请使用 saveTo 参数将屏幕截图保存到磁盘:

screenshot_page({ saveTo: "/tmp/page.png" })
screenshot_by_uid({ uid: "abc123", saveTo: "/tmp/element.png" })

然后可以使用 Claude Code 的 Read 工具查看该文件,而不会影响上下文大小。

本地开发

npm install
npm run build

# Run with Inspector against local build
npx @modelcontextprotocol/inspector node dist/index.js --headless --viewport 1280x720

# Or run in dev with hot reload
npm run inspector:dev

测试

npm run test:run          # all tests once (unit + integration)
npm test                  # watch mode

有关运行特定测试套件、端到端场景覆盖范围和已知问题的完整详细信息,请参阅 docs/testing.md

故障排除

  • 未找到 Firefox:请传递 --firefox-path "/Applications/Firefox.app/Contents/MacOS/firefox"(macOS)或您操作系统上的正确路径。

  • 首次运行缓慢:Selenium 会设置 BiDi 会话;后续运行会更快。

  • 导航后 UID 过期:在使用 UID 工具之前,请获取新的快照 (take_snapshot)。

  • Windows 10:MCP 服务器 'firefox-devtools' 发现期间出错:MCP error -32000: Connection closed

    • 解决方案 1 使用 cmd /c 包装 (详细信息):

      "mcpServers": {
        "firefox-devtools": {
          "command": "cmd",
          "args": ["/c", "npx", "-y", "firefox-devtools-mcp@latest"]
        }
      }
    • 解决方案 2 使用 npx 的绝对路径(调整扩展名 — .cmd, .bat, .exe.ps1 — 以匹配您的设置):

      "mcpServers": {
        "firefox-devtools": {
          "command": "C:\\nvm4w\\nodejs\\npx.ps1",
          "args": ["-y", "firefox-devtools-mcp@latest"]
        }
      }

版本控制

  • 1.0 之前的 API:版本从 0.x 开始。请在 npx 中使用 @latest 以获取最新版本。

CI 和发布

  • 包含用于 CI、发布和 npm 发布 GitHub Actions。有关详细信息和所需密钥,请参阅 docs/ci-and-release.md。

问题与贡献

问题在 Bugzilla 上进行跟踪,产品为 Developer Infrastructure,组件为 AI for Development

如有疑问和讨论,请加入 #firefox-devtools-mcp Matrix 房间

作者

Mozilla 维护。

Available Tools

32 tools
accept_dialogA

Accept browser dialog. Provide promptText for prompts.

ParametersJSON Schema
NameRequiredDescriptionDefault
promptTextNoText for prompt dialogs

TDQS

A3.6/5.0
Behavior3/5

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

Annotations indicate readOnlyHint=false. The description adds that the tool accepts dialogs and optionally supplies prompt text, but does not detail failure modes (e.g., no dialog present) or other side effects.

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, front-loaded sentence with zero wasted words, effectively conveying the core action and key parameter context.

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 tool with one optional parameter and no output schema, the description covers the main use case well, though it lacks mention of error conditions or behavior for non-prompt dialogs.

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 100%. The description's mention of 'promptText' is redundant with the schema's own description, adding no new meaning beyond the schema.

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 it accepts browser dialogs and provides prompt text for prompts, distinguishing it from the sibling 'dismiss_dialog' which cancels dialogs.

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?

Usage context is implied (use to accept dialogs, provide text for prompts), but no explicit when-to-use or when-not-to-use guidance is given, nor alternatives mentioned beyond the sibling tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clear_downloadsA

Clear the tracked downloads buffer.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior2/5

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

No annotations provided. The description implies a destructive action (clearing) but does not disclose whether it affects ongoing downloads, whether it is reversible, or what happens to in-progress downloads.

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, front-loaded with action. No unnecessary words; exceptionally concise.

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?

For a simple tool with no parameters and no output schema, the description is adequate but lacks behavioral context such as irreversibility or impact on other operations.

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?

No parameters exist (schema coverage 100%). The description is not required to add parameter meaning, baseline 4 is appropriate.

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 uses specific verb 'Clear' and resource 'tracked downloads buffer', clearly stating the action. It distinguishes from siblings like list_downloads and set_download_behavior.

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. No mention of prerequisites, side effects, or typical use cases.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clear_snapshotC

Clear snapshot UIDs. Usually not needed.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

C2.8/5.0
Behavior2/5

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

The annotation readOnlyHint=false implies this is a mutating operation, but the description doesn't disclose what side effects occur (e.g., does it invalidate all snapshots? Does it affect other tools?). No additional behavioral context is provided beyond the annotation.

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 extremely concise at 5 words, which is appropriate for a tool with no parameters. However, it's so brief that it borders on under-specification rather than efficient conciseness. The structure is fine but could benefit from one more sentence of context.

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 tool has no parameters and no output schema, the description is the only source of information. It fails to explain what snapshot UIDs are, when clearing them is necessary, or what the consequences are. For a tool that seems to be a cleanup utility, this is insufficient context for an agent to decide when to invoke it.

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, so the description doesn't need to explain parameter semantics. The schema coverage is 100% (vacuously), and the description adds the context that this is a cleanup operation. Baseline 4 is appropriate for a no-parameter tool.

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 states the tool clears snapshot UIDs, which is a specific action on a specific resource. However, it doesn't explain what snapshot UIDs are or why they might need clearing, and it doesn't distinguish from siblings like take_snapshot or resolve_uid_to_selector.

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 phrase 'Usually not needed' gives a hint about when not to use it, but there's no guidance on when it IS needed, no alternatives mentioned, and no context about typical workflows. The description is too terse to guide an agent on appropriate usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

click_by_uidC

Click element by UID. Set dblClick for double-click.

ParametersJSON Schema
NameRequiredDescriptionDefault
uidYesElement UID from snapshot
dblClickNoDouble-click (default: false)

TDQS

C2.9/5.0
Behavior2/5

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

Annotations indicate readOnlyHint=false, implying mutation, but the description adds no behavioral context (e.g., whether it triggers navigation, waits for elements, or has side effects). Missing transparency beyond the annotation.

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 with two short sentences. No fluff, but it lacks structure (e.g., bullet points or clear separation of purpose vs. usage). Slightly under-specified for a UI interaction tool.

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 a simple click action, the description should mention post-click behavior or caveats (e.g., waiting, viewport requirements). It is incomplete for an AI agent to use confidently.

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 100% with descriptions for both parameters. The description adds negligible value—'Set dblClick for double-click' repeats the schema's 'Double-click (default: false)'. Baseline 3 is appropriate.

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 ('Click element by UID') and distinguishes from sibling tools like hover_by_uid or fill_by_uid. However, it is minimal and does not elaborate on scope or behavior beyond the name.

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 (e.g., hover_by_uid) or prerequisites (e.g., needing a snapshot). The description assumes context that an agent may lack.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

close_pageA

Close tab by index.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageIdxYesTab index to close

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already set readOnlyHint=false, so the description's 'close' action is consistent. However, the description adds no additional behavioral context beyond what the annotation provides, such as consequences of closing a tab (unsaved work, triggering beforeunload events). This is adequate but not exemplary.

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 that perfectly conveys the tool's purpose. Every word is necessary, and there is 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?

Given the low complexity (single parameter, no output schema) and annotations present, the description is minimally adequate. However, it lacks context about edge cases such as closing the last tab (might close browser) or invalid index, which would help an agent anticipate behavior.

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 description coverage is 100%, and the parameter's description in the schema ('Tab index to close') already explains its role. The tool description 'Close tab by index' redundantly states the same information. No additional meaning is added beyond what the 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 'Close tab by index' is a specific verb+resource combination. It clearly states the action (close) and the target (tab) with a method (by index). It distinguishes from sibling tools like 'navigate_page' or 'new_page'.

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. It does not specify prerequisites (e.g., tab must exist) or when not to use (e.g., avoid closing active tab unexpectedly). The sibling list includes many page actions, but no explicit comparison.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

dismiss_dialogB

Dismiss browser dialog.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.2/5.0
Behavior2/5

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

Annotations already indicate that this is a non-read-only (mutating) action. The description adds no further behavioral details, such as what happens to the dialog, side effects, or required state.

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 words—with no fluff. Every word is necessary and earns its place.

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?

For a simple parameterless tool, the description is minimal but lacks context about which dialogs are targeted, whether dismissal is always possible, or any potential outcomes. More context would improve completeness.

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?

There are zero parameters and schema coverage is 100%. The description adds no unnecessary param information, which is appropriate for a parameterless tool.

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 ('Dismiss') and the resource ('browser dialog'), but fails to differentiate from the sibling tool 'accept_dialog', which performs a similar but distinct action.

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 is provided on when to use this tool versus alternatives like 'accept_dialog', or any prerequisites or conditions for dismissal.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

drag_by_uid_to_uidB

Drag element to another (HTML5 drag events).

ParametersJSON Schema
NameRequiredDescriptionDefault
toUidYesTarget element UID
fromUidYesSource element UID

TDQS

B3.1/5.0
Behavior2/5

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

The description mentions 'HTML5 drag events' which provides some insight into the behavior, but it does not disclose the specific events dispatched, whether it waits for drop, or any side effects. The annotation readOnlyHint=false already indicates mutation, but the description adds minimal additional behavioral context.

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 of six words, containing no fluff. It efficiently conveys the core action and the event type. Every word is purposeful.

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?

For a simple drag tool with two parameters and no output schema, the description is adequate but not exhaustive. It could mention the outcome (e.g., source element is dragged to target) or error conditions (e.g., element not found, not draggable). Nonetheless, the schema and name fill in some gaps.

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 input schema already provides full descriptions for both parameters (source UID and target UID). The description adds no further semantic value beyond implying the direction of drag. Baseline of 3 is appropriate given 100% schema coverage.

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 it performs a drag action using HTML5 drag events, distinguishing it from sibling tools like click_by_uid or hover_by_uid. However, it could be more explicit about source and target elements, though the parameter names clarify this.

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 or when not to use it. It simply describes the action without providing context such as prerequisites (e.g., elements must be draggable) or alternatives (e.g., using keyboard or mouse events).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

evaluate_scriptA

Run a JS function in the page and return its result. Prefer this for targeted reads (a value, text, computed style, whether an element exists) instead of a full take_snapshot. Use the UID interaction tools for clicking, typing, and filling.

ParametersJSON Schema
NameRequiredDescriptionDefault
argsNoUIDs to pass as function arguments
saveToNoSave the result to a file as JSON instead of returning it inline. Pass a file path, an existing directory (generated file inside), or true (generated file under ~/.firefox-devtools-mcp/output/). Relative paths resolve against the current working directory.
previewNoNumber of characters of the saved result to return inline as a preview when saveTo is used. Omit for no preview.
sandboxNoEvaluate in an isolated sandbox realm with this name instead of the page realm. The sandbox shares the page DOM and keeps the native built-ins even where the page overrode them. Page-defined globals and expandos are invisible from the sandbox, and vice-versa. The same name reuses the same sandbox across calls; omit to evaluate in the page realm.
timeoutNoTimeout in ms (default: 5000)
functionYesJS function string, e.g. () => document.title

TDQS

A4.2/5.0
Behavior3/5

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

The annotations declare readOnlyHint: false, and the description doesn't contradict this — no annotation contradiction. However, the description adds minimal behavioral disclosure beyond the schema; the rich details (sandbox realm semantics, saveTo path resolution) live in the parameter docs, not the description. For a tool that executes arbitrary JS, a note about side-effect potential or that results may not be serializable would have elevated this further.

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?

Three sentences, each earning its place: what it does, when to prefer it, what to use instead. Front-loaded with the core purpose and zero filler. This is a model of concise, high-information density.

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 complex JS execution tool with 6 parameters and no output schema, the description plus annotations plus rich schema documentation provide a complete picture. The only gap is that it doesn't address error behavior or serialization limits of return values, but these are minor given the strength of the supporting schema docs.

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 description coverage is 100%, and the schema's parameter docs are genuinely rich (saveTo explains string/directory/true behavior, sandbox explains realm isolation and persistence, timeout documents its 5000ms default). Per the calibration baseline, when the schema handles the documentation burden, a 3 is appropriate. The description wisely avoids restating what the schema covers.

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 'Run a JS function in the page and return its result' — a specific verb+resource+outcome statement. It also distinguishes itself from siblings by naming take_snapshot and the UID interaction tools. The tool's purpose is instantly clear.

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?

Explicit when-to-use guidance: 'Prefer this for targeted reads (a value, text, computed style, whether an element exists) instead of a full take_snapshot.' It also tells the agent what NOT to use it for: 'Use the UID interaction tools for clicking, typing, and filling.' This is textbook usage guidance with named alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fill_by_uidC

Fill text input/textarea by UID.

ParametersJSON Schema
NameRequiredDescriptionDefault
uidYesInput element UID from snapshot
valueYesText to fill

TDQS

C2.9/5.0
Behavior2/5

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

Annotations indicate it's not read-only, consistent with fill. But no additional disclosure about behavior: e.g., whether it clears existing value, what happens if element is not found, or if it supports only text inputs.

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?

Too brief (6 words) and leaves out critical details. Not earning its place; under-specification.

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?

No output schema, so description should explain return behavior (success/failure). It does not. Also missing context about element type constraints.

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 100% with descriptions for both parameters. Description adds no extra meaning beyond schema, so baseline 3 applies.

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?

Description clearly states the action (fill) and the resource (text input/textarea by UID). It distinguishes from sibling tools like click_by_uid, hover_by_uid, and fill_form_by_uid.

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 over alternatives, such as fill_form_by_uid or upload_file_by_uid. No exclusions or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fill_form_by_uidB

Fill multiple form fields at once.

ParametersJSON Schema
NameRequiredDescriptionDefault
elementsYesArray of {uid, value} pairs

TDQS

B3.2/5.0
Behavior2/5

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

Annotations indicate readOnlyHint=false, so the tool mutates state. The description adds no further behavioral details such as error handling, field validation, or whether the form is submitted. More context would aid safe invocation.

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, brief sentence that conveys the core purpose without redundancy. While very concise, it could benefit from slightly more detail, but it remains front-loaded and efficient.

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 tool's simplicity (1 parameter, no output schema) and annotations present, the description adequately states the purpose but lacks details on execution behavior, side effects, or result expectations, leaving it just barely adequate.

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 input schema covers 100% of the parameter (`elements`), providing full structure and descriptions. The description does not add extra meaning beyond what the schema provides, meeting the baseline for full 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 action ('fill') and resource ('multiple form fields'), and the phrase 'at once' distinguishes it from the sibling tool 'fill_by_uid' which likely handles single fields.

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 like 'fill_by_uid' or other form-related tools. The description only implies usage for multiple fields but does not contrast or provide conditions for use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_firefox_infoA
Read-only

Get information about the current Firefox instance configuration, including binary path, environment variables, and output file location.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint true, making the safe, non-destructive nature clear. The description adds value by detailing the specific information returned (binary path, env vars, output file location), beyond what annotations alone provide.

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, well-structured sentence that conveys all necessary information without superfluous words. Information is front-loaded with the verb and resource.

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?

For a simple, parameterless tool, the description is complete. It lists typical fields returned and clearly indicates the tool's purpose. No output schema is needed as the description covers the key outputs.

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?

No parameters exist, and schema coverage is 100% (empty schema). Baseline for zero parameters is 4, and the description does not need to add parameter 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 tool retrieves configuration information including binary path, environment variables, and output file location. It uses a specific verb 'Get' and resource 'Firefox instance configuration', distinctly differentiating it from sibling tools that perform actions.

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?

No explicit guidance on when to use versus alternatives like get_firefox_output. The readOnlyHint annotation implies safe retrieval, but the description does not specify context or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_firefox_outputA
Read-only

Retrieve Firefox output (stdout/stderr including MOZ_LOG, warnings, crashes, stack traces). Returns recent output from the capture file. Use filters to focus on specific content.

ParametersJSON Schema
NameRequiredDescriptionDefault
grepNoFilter log lines containing this string (case-insensitive)
linesNoNumber of recent log lines to return (default: 100, max: 10000)
sinceNoOnly show logs written in the last N seconds

TDQS

A3.7/5.0
Behavior2/5

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

The description states the tool is read-only ('Retrieve', 'Returns'), consistent with the readOnlyHint annotation. It adds that output comes from a 'capture file' and includes stderr, crashes, etc., but lacks details on side effects (e.g., does it clear the file?), resource constraints, or prerequisites.

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?

Two concise sentences that first state the tool's purpose in detail, then give a usage recommendation. No wasted words; front-loaded with key 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 covers the input parameters adequately and mentions return content type. However, with no output schema, the return format is vague ('recent output') – agents may need to know if it's plain text, JSON, etc. Adequate but not complete.

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 100% with inline descriptions for all three parameters. The description adds a generic tip ('Use filters') but no additional meaning beyond the schema. Baseline 3 is appropriate.

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 specifies the verb 'Retrieve', the resource 'Firefox output', and details the content type (stdout/stderr including MOZ_LOG, warnings, crashes, stack traces). It clearly distinguishes from sibling tools which are all UI or page actions.

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 'Use filters to focus on specific content' implies use of the grep parameter but does not explicitly state when to use this tool versus alternatives or provide exclusion criteria. However, the tool is unique among siblings, making its use case straightforward.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_page_textA
Read-only

Get the visible text of the page (document.body.innerText). Caps at maxLength (default 20000 chars); saveTo saves the full text to a file.

ParametersJSON Schema
NameRequiredDescriptionDefault
saveToNoSave the full untruncated text to a file instead of returning it inline. Pass a file path, an existing directory (generated file inside), or true (generated file under ~/.firefox-devtools-mcp/output/). Relative paths resolve against the current working directory.
previewNoNumber of characters of the saved text to return inline as a preview when saveTo is used. Omit for no preview.
maxLengthNoMax characters to return inline (default: 20000). Ignored when saveTo is used.

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description adds crucial behavioral details: maxLength truncation (default 20000 chars) and the saveTo option to write the full text to a file. This discloses side effects (file saving) and limitations not captured by the annotation.

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, well-structured sentence that front-loads the purpose and then summarizes key behaviors. Every word earns its place, with no redundancy or 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?

Given the simple nature of this read-only tool, the description covers purpose, truncation behavior, and file-saving option. With no output schema, the description still tells users what to expect (visible text, limited by maxLength). It is complete and self-sufficient.

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 already provides 100% coverage for parameters, so baseline is 3. The description adds semantic context by explaining the default maxLength and the relationship between saveTo and inline truncation, which enhances understanding 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 identifies the action ('Get'), the resource ('visible text of the page'), and specifies implementation via document.body.innerText. This distinguishes it from sibling tools like screenshot_page (visual) and evaluate_script (general JS execution).

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 context (retrieving visible text) but does not explicitly mention when to use this tool over alternatives or provide exclusions. Sibling tools like take_snapshot or evaluate_script could also retrieve text, but no comparison is given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

hover_by_uidC

Hover over element by UID.

ParametersJSON Schema
NameRequiredDescriptionDefault
uidYesElement UID from snapshot

TDQS

C2.9/5.0
Behavior2/5

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

Annotations indicate non-read-only, but description adds no behavioral details (e.g., event triggering, visibility requirements). Minimal value beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single, front-loaded sentence with no waste. However, could be slightly expanded without sacrificing conciseness.

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?

Adequate for a simple action tool with one parameter and no output schema, but lacks context on hover behavior (e.g., simulation vs real mouse event).

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 100%, so baseline is 3. Description adds no new meaning beyond the schema's 'Element UID from snapshot'.

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 action (hover) and resource (element by UID). It is specific but does not explicitly distinguish from sibling tools like 'click_by_uid'.

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 (e.g., click_by_uid, fill_by_uid). The agent must infer from the name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

install_extensionA

Install a Firefox extension using WebDriver BiDi webExtension.install command. Supports installing from archive (.xpi/.zip), base64-encoded data, or unpacked directory.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNoFile path (for archivePath or path types)
typeYesExtension data type: "archivePath" for .xpi/.zip, "base64" for encoded data, "path" for unpacked directory
valueNoBase64-encoded extension data (for base64 type)
permanentNoFirefox-specific: Install permanently (requires signed extension). Default: false (temporary install)

TDQS

A3.7/5.0
Behavior2/5

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

Annotations already indicate the tool is not read-only (readOnlyHint=false), which aligns with the install action. However, the description adds no further behavioral context, such as side effects, required permissions, failure modes, or whether installation modifies browser state permanently.

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 two sentences, front-loaded with the primary action, and every phrase adds value. No redundancy or fluff.

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 tool has no output schema, so the description should ideally mention the return value (e.g., extension ID) or error behavior. It does not, but it covers the core functionality adequately. Slightly incomplete for a mutation 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 provides 100% parameter descriptions, and the description adds context: it explains the three 'type' options (archivePath, base64, path) with file extensions and clarifies the 'permanent' parameter as Firefox-specific requiring signed extensions. This complements the schema effectively.

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 (install), the resource (Firefox extension), and the method (WebDriver BiDi webExtension.install). It also lists supported sources (archive, base64, unpacked), making the tool's purpose distinct from siblings like uninstall_extension.

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 (for installing extensions) but lacks explicit guidance on when not to use or prerequisites (e.g., Firefox must support BiDi, signed vs. temporary). No mention of alternatives among siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_downloadsA
Read-only

List downloads tracked since startup, including status and saved file path.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax downloads (default: 50)
formatNoOutput format (default: text)
statusNoFilter by status
urlContainsNoURL filter (case-insensitive)

TDQS

A4/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=true; description adds key behavioral details (tracked since startup, includes status and file path) without contradicting annotations.

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, concise sentence with no unnecessary words; every part of the description adds value.

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?

No output schema, but description mentions status and file path; could mention return format or pagination, but adequate for a straightforward list tool.

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 100% with good parameter descriptions; the description adds no additional semantic value beyond what the schema already 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 clearly states it lists downloads tracked since startup, including status and file path, which distinguishes it from siblings like clear_downloads or set_download_behavior.

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?

No explicit guidance on when to use this tool vs alternatives; however, the purpose is straightforward and context is implied by sibling names.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_pagesA
Read-only

List open tabs (index, title, URL). Selected tab is marked.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, and the description adds behavioral context by noting that the selected tab is marked. Together, they provide clear transparency without contradiction.

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, efficient sentence that communicates the tool's purpose and output without unnecessary words.

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 simplicity (no parameters, no output schema), the description fully specifies the tool's behavior and return content (index, title, URL, marked selected tab).

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?

With zero parameters, the baseline is 4. The description does not need to add parameter details, and the schema coverage is 100% (no params).

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 (list), resource (open tabs), and the information provided (index, title, URL) with the additional detail that the selected tab is marked. This distinguishes it from sibling tools like 'close_page' or 'navigate_page'.

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 alternatives (e.g., when to use 'select_page' or 'close_page'). It only describes the tool's functionality without usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

new_pageA

Open new tab at URL. Returns tab index.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesTarget URL

TDQS

A4.1/5.0
Behavior4/5

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

Annotations only provide readOnlyHint=false. Description adds the return behavior ('Returns tab index'), which is behavioral information beyond what annotations provide. However, no details on error handling, loading state, or tab limits.

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?

Two sentences, each carrying essential information. No filler, front-loaded with the core action. Perfectly concise.

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?

For a simple tool with full schema coverage and no output schema, the description adequately covers the return value. The tool's role among siblings is clear from context. No gaps remain.

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 already describes the 'url' parameter as 'Target URL' with 100% coverage. The description does not add additional meaning (e.g., accepted formats, protocols, validation rules). Baseline 3 is appropriate.

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?

Description clearly states 'Open new tab at URL' with a specific verb and resource. It unambiguously represents the tool's action and distinguishes it from siblings like navigate_page (navigate current tab) and select_page (switch to existing tab).

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?

Description implies usage is for creating a new tab given a URL, but no explicit guidance on when to use versus alternatives (e.g., when to open a new tab vs navigate existing tab). No exclusions or contextual conditions provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

resolve_uid_to_selectorA
Read-only

Resolve UID to CSS selector. Fails if the element is gone.

ParametersJSON Schema
NameRequiredDescriptionDefault
uidYesUID from snapshot

TDQS

A4/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true, and the description adds meaningful behavioral context by stating that the operation fails if the element is gone. This goes beyond the annotation and helps the agent anticipate error conditions without contradicting the read-only nature.

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 one concise sentence with two clauses, conveying the core purpose and a key failure mode without any filler. Every word earns its place, making it highly 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?

For a tool with one parameter, a read-only annotation, and no output schema, the description is sufficient: it clearly states the return (a CSS selector) and a failure condition. It does not need to explain more given the simplicity, though it could mention potential error types, but that is not essential here.

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 schema covers the single parameter 'uid' with 100% coverage, and the description does not add further semantic detail beyond what the schema already states (UID from snapshot). Since the schema does the heavy lifting, a baseline 3 is appropriate; the description adds no extra parameter insight.

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 'Resolve' and the resource 'UID' with the output 'CSS selector', distinguishing it from sibling tools that act on UIDs directly (e.g., click_by_uid, fill_by_uid). It specifies exactly what the tool does and its scope.

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 gives a useful condition ('Fails if the element is gone') but does not explicitly indicate when to use this tool versus alternatives or mention any exclusions. The intended usage is implied from the name and purpose, but there is no direct comparison to other tools that might also produce selectors.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

restart_firefoxA

Restart Firefox with different configuration. Allows changing binary path, environment variables, and other options. All current tabs will be closed.

ParametersJSON Schema
NameRequiredDescriptionDefault
envNoNew environment variables in KEY=VALUE format (optional, e.g., ["MOZ_LOG=HTMLMediaElement:5", "MOZ_LOG_FILE=/tmp/ff.log"])
prefsNoFirefox preferences to set at startup. Values are auto-typed: true/false become booleans, integers become numbers, everything else is a string. Requires MOZ_REMOTE_ALLOW_SYSTEM_ACCESS=1.
headlessNoRun in headless mode (optional, keeps current if not specified)
startUrlNoURL to navigate to after restart (optional, uses about:blank if not specified)
firefoxPathNoNew Firefox binary path (optional, keeps current if not specified)
profilePathNoFirefox profile path (optional, keeps current if not specified)

TDQS

A4/5.0
Behavior4/5

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

Annotations set readOnlyHint=false, consistent with a mutation. The description adds important behavioral context: 'All current tabs will be closed.' It also mentions the ability to change binary path and environment variables, which are key side effects. No contradictions.

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 three sentences with no redundancy. Each sentence provides distinct information: the action, the configurable items, and the consequence (tab closure). It is efficient and front-loaded with the core purpose.

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 6 parameters fully described in the schema and no output schema, the description covers key context: closing tabs. However, it omits prerequisite info like MOZ_REMOTE_ALLOW_SYSTEM_ACCESS=1 for prefs, which appears only in parameter schema. Still sufficient for most use cases.

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 description coverage is 100%, so the baseline is 3. The description summarizes parameters ('binary path, environment variables, and other options') but adds no new information beyond the schema's individual field descriptions. It does not enhance understanding of parameter relationships or constraints.

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 (Restart) and the resource (Firefox) with the purpose of changing configuration. It distinguishes from sibling tools like navigate_page or close_page, which do not restart the browser. The mention of 'All current tabs will be closed' provides a specific behavioral outcome.

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 does not provide explicit guidance on when to use this tool versus alternatives. It implicitly suggests use for restarting with different config, but lacks 'when not to use' or comparisons to siblings. The uniqueness of the tool among siblings makes the purpose clear, but guidelines are minimal.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

screencast_startA

Start recording a screencast (video) of the current page viewport, saving the output to a file in the downloads directory. Returns a screencast id to pass to screencast_stop. Multiple recordings can run at once.

ParametersJSON Schema
NameRequiredDescriptionDefault
widthNoWidth of the recorded video in pixels. Defaults to the viewport width.
heightNoHeight of the recorded video in pixels. Defaults to the viewport height.
contextNoId of the top-level browsing context to record. Defaults to the currently selected page.
mimeTypeNoMIME type of the output file. Defaults to "video/webm".
frameRateNoTarget frame rate of the recording, in frames per second.

TDQS

A4.2/5.0
Behavior4/5

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

Beyond annotations (readOnlyHint=false), description adds that recording saves to a file, returns an ID, and supports multiple concurrent recordings. Does not mention potential performance impact or file overwrites.

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?

Three concise sentences, each providing essential information: action, output, ID usage, concurrency. No redundant text.

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 states return type. Parameters are fully covered in schema. Could mention file naming or overwrite behavior but not required.

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 100%, so baseline 3. Description does not add meaning beyond schema; it only implies viewport-related defaults but doesn't elaborate on parameter usage.

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 starts recording a screencast of the viewport, saving to a file, and returns an ID. It distinguishes from sibling tools like screenshot_page (static image) and screencast_stop (stops recording).

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?

Explicitly mentions saving to downloads, returning an ID for stopping, and that multiple recordings can run at once. Does not explicitly state when not to use (e.g., for static screenshots), but sibling tools imply alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

screencast_stopA

Stop an in-progress screencast recording started with screencast_start and finalize the video file. Returns the path to the saved file.

ParametersJSON Schema
NameRequiredDescriptionDefault
screencastNoId of the screencast to stop, as returned by screencast_start. Optional when exactly one recording is active.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations declare readOnlyHint=false, so the tool is known to be a write operation. The description adds that it finalizes the video file and returns the path, providing useful behavioral context beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is only two sentences, front-loaded with the primary action, and contains no superfluous words. It efficiently conveys the purpose and return value.

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 (no required parameters, clear return value), the description is nearly complete. It covers the action, return value, and conditional parameter usage. It could mention error behavior if no recording is active, but it is not necessary.

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 description coverage is 100%, and the tool description does not add additional meaning to the parameter beyond what the schema already provides. The baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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

The description clearly states the action (stop and finalize) and the resource (screencast recording). It distinguishes from the sibling tool screencast_start by specifying that it stops an in-progress recording.

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 indicates the tool is used after screencast_start and specifies when the parameter is optional ('when exactly one recording is active'). It does not explicitly mention when not to use it, but the context is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

screenshot_by_uidA
Read-only

Capture element screenshot by UID as base64 PNG.

ParametersJSON Schema
NameRequiredDescriptionDefault
uidYesElement UID from snapshot
saveToNoSave the screenshot to a file instead of returning it as image data in the response. Pass a file path, an existing directory (generated file inside), or true (generated file under ~/.firefox-devtools-mcp/output/). Relative paths resolve against the current working directory.

TDQS

A3.5/5.0
Behavior3/5

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

The description is consistent with the readOnlyHint annotation (read operation) and adds the output format (base64 PNG). However, it does not go beyond the annotations or provide additional behavioral context like the tool's effect or limitations.

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 very concise at one sentence with no fluff, front-loading the core action and output format. It could be improved by adding a brief note on when to use it, but it is well-structured.

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 simple two-parameter schema and readOnlyHint annotation, the description is complete enough. It doesn't require output schema because output is described. It could mention that UID comes from snapshot, but the schema already does.

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 100%, so the schema already documents both parameters. The description does not add extra meaning beyond the schema, meeting the baseline for adequate 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 'Capture', the resource 'element screenshot by UID', and the output format 'base64 PNG'. It effectively distinguishes from sibling tools like 'screenshot_page' which captures the full page, not an element.

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 is provided on when to use this tool versus alternatives (e.g., screenshot_page for full page screenshots). There is no mention of prerequisites 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.

screenshot_pageB
Read-only

Capture page screenshot as base64 PNG.

ParametersJSON Schema
NameRequiredDescriptionDefault
saveToNoSave the screenshot to a file instead of returning it as image data in the response. Pass a file path, an existing directory (generated file inside), or true (generated file under ~/.firefox-devtools-mcp/output/). Relative paths resolve against the current working directory.

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so the description does not need to state that it's a read operation. The description adds output format (base64 PNG), which is useful. However, it does not describe what the return value looks like or any side effects (e.g., does it capture full page or viewport?). With annotations providing some transparency, a score of 3 is appropriate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise and front-loaded: one sentence that captures the essence. No superfluous information. Score 5 for efficient structure.

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 optional parameter, no output schema), the description provides minimal but adequate context: purpose and output format. However, it lacks details like whether it captures the full page or viewport, and does not mention related tools. For a tool with annotations, it is moderately complete but leaves some gaps.

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 input schema has 100% description coverage for the only parameter 'saveTo', with a detailed explanation. The tool description does not add any extra meaning beyond the schema. Thus, baseline 3 is correct.

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 ('Capture page screenshot') and the output format ('base64 PNG'), which is specific and informative. However, it does not distinguish from the sibling tool 'screenshot_by_uid', which likely captures a specific element. Score 4 because it is clear but lacks sibling differentiation.

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 vs. alternatives like 'screenshot_by_uid' or other screenshot-related tools. There is no mention of context, when-not-to-use, or prerequisites. This is a significant gap for an agent to decide between similar tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

select_pageA

Select active tab by index, URL, or title. Index takes precedence.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoURL substring (case-insensitive)
titleNoTitle substring (case-insensitive)
pageIdxNoTab index (0-based, most reliable)

TDQS

A3.7/5.0
Behavior2/5

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

Annotations indicate readOnlyHint=false, but the description does not disclose side effects (e.g., changing active tab), error handling, or what happens if no match is found. More detail on behavioral traits is needed.

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: one sentence with no fluff. Every word contributes essential 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?

No output schema is provided, and the description does not explain return values or behavior when all parameters are omitted. For a tool with no required parameters, this gap reduces completeness.

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 already covers 100% of parameter descriptions. The description adds value by stating 'Index takes precedence,' clarifying priority when multiple parameters are provided.

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 selects the active tab using one of three criteria (index, URL, title), which is a specific verb-resource combination. It distinguishes well from sibling tools like navigate_page or list_pages.

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 it (to select a tab), but lacks explicit guidance on when not to use it or alternatives. The precedence rule is noted but no context for choosing among criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_download_behaviorA

Control how downloads are handled: allow (save silently to the default download directory), deny (cancel), or reset to default. Avoids the native save-file dialog. Requires a recent Firefox.

ParametersJSON Schema
NameRequiredDescriptionDefault
behaviorYes'allowed' saves downloads automatically, 'denied' cancels them, 'default' resets to the browser default

TDQS

A4.2/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 discloses the effect (avoiding dialog, requiring Firefox) but does not detail whether changes are immediate, persist, or affect in-progress downloads. It is adequate 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 extremely concise: two sentences deliver the purpose, options, side effect (avoiding dialog), and a prerequisite. No superfluous 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?

For a simple tool with one parameter, the description covers the main behavior and a key prerequisite. It could mention that the setting persists until changed, but it is largely complete.

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 already covers the parameter with a description. The tool description adds explanatory context like 'save silently to the default download directory' and 'reset to default', enhancing understanding beyond the schema's brief descriptions.

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 that the tool controls download handling with three modes: allow, deny, or reset to default. It distinguishes itself from sibling download tools like list_downloads and clear_downloads by focusing on behavior control.

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 mentions that it avoids the native save-file dialog and requires a recent Firefox, giving context for when to use it. However, it does not explicitly state when not to use it or compare with alternatives beyond the implied contrast with other download tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_viewport_sizeC

Set viewport dimensions in pixels.

ParametersJSON Schema
NameRequiredDescriptionDefault
widthYesWidth in pixels
heightYesHeight in pixels

TDQS

C2.9/5.0
Behavior2/5

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

Although annotations indicate this is a write operation (readOnlyHint: false), the description adds no additional behavioral context. It does not disclose whether the change affects subsequent screenshots, navigation, or other operations, nor does it mention any limitations or side effects. With annotations present, the description could have provided more value but falls short.

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 extremely concise at one sentence (4 words). It contains no unnecessary words and gets straight to the point. However, it is so brief that it sacrifices some helpful context, preventing a perfect score.

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 tool's simplicity (two parameters, no output schema), the description is minimally adequate. However, it lacks context about what 'viewport' refers to (e.g., current page or global setting) and does not mention any dependencies or effects. While it satisfies the basic need, it is not fully complete for an agent to use confidently.

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 input schema has 100% coverage with descriptions for each parameter ('Width in pixels', 'Height in pixels'). The description adds no extra meaning beyond the schema, so a baseline score of 3 is appropriate. No constraints or additional semantics are provided.

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 (set) and the resource (viewport dimensions) with units (in pixels). It is specific and distinct from sibling tools like screenshot or navigation functions, which don't involve resizing.

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 is provided on when to use this tool versus alternatives. There is no mention of prerequisites, side effects, or context such as whether it applies to the current page or all pages. The agent is left to infer usage from the name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

take_snapshotA
Read-only

Capture DOM snapshot with stable UIDs. A UID stays valid across snapshots until its element is removed or the page navigates. Output caps at maxLines (default 100); scope with selector or dump the full tree with saveTo.

ParametersJSON Schema
NameRequiredDescriptionDefault
saveToNoSave the complete snapshot text to a file (ignores maxLines) instead of returning it inline. Pass a file path, an existing directory (generated file inside), or true (generated file under ~/.firefox-devtools-mcp/output/). Relative paths resolve against the current working directory.
previewNoNumber of characters of the saved output to return inline as a preview when saveTo is used. Omit for no preview.
maxDepthNoMax tree depth
maxLinesNoMax lines (default: 100)
selectorNoCSS selector to scope snapshot to specific element (e.g., "#app")
includeAllNoInclude all visible elements without relevance filtering. Useful for Vue/Livewire apps (default: false)
includeTextNoInclude text (default: true)
includeAttributesNoInclude ARIA attributes (default: false)

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses important behavioral details: UIDs remain valid until element removal or navigation, output is capped at maxLines, selector scoping is available, and saveTo dumps the full tree. This provides a meaningful behavioral contract without contradicting the annotation.

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?

Two compact sentences, front-loaded with the core action, and every clause carries unique information. There is no filler or repetition of schema content beyond what is useful for orientation.

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 tool with no output schema and 8 optional parameters, the description covers purpose, UID semantics, output-limiting behavior, scoping, and full-tree handling. It could be slightly more explicit about the exact return shape (e.g., whether output is a text tree containing UIDs), but the core contract is sufficiently clear.

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 already documents all 8 parameters with detailed descriptions. The tool description adds extra value by connecting maxLines default, selector scoping, and saveTo as a way to get the full tree, which helps the agent choose between inline and file output.

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?

Description uses a specific verb ('Capture') with a clear resource ('DOM snapshot') and defines the key outcome ('stable UIDs'). This distinguishes it from visual captures like screenshot_page and UID-using sibling actions like click_by_uid or fill_by_uid.

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 clearly implies this tool produces UIDs used by sibling UID-based tools and explains UID stability across snapshots. It does not, however, explicitly state when to prefer this over alternatives like screenshot_page or resolve_uid_to_selector, nor does it mention exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

uninstall_extensionA

Uninstall a Firefox extension using WebDriver BiDi webExtension.uninstall command. Requires the extension ID returned by install_extension or obtained from list_extensions.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesExtension ID (e.g., "addon@example.com")

TDQS

A4.2/5.0
Behavior3/5

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

Description matches annotation (readOnlyHint=false) but adds no extra behavioral traits beyond the action itself. Annotations already signal mutation.

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?

Two sentences, no redundant words, 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?

For a simple single-param tool, it covers the action, prerequisite, and command. No output schema needed; could mention error possibilities, but adequate.

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 covers parameter fully; description adds an example format, enhancing clarity beyond 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?

Clearly states it uninstalls a Firefox extension using WebDriver BiDi command. Distinguishes from siblings like install_extension and list_extensions.

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?

States prerequisite: requires extension ID from install_extension or list_extensions. No explicit exclusions or alternatives, but context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upload_file_by_uidB

Upload file to file input by UID.

ParametersJSON Schema
NameRequiredDescriptionDefault
uidYesFile input UID from snapshot
filePathYesLocal file path

TDQS

B3.2/5.0
Behavior2/5

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

Annotations only indicate non-readOnly, but description doesn't add behavioral details like what happens on failure, required permissions, or file size limits. Minimal insight beyond the action itself.

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, front-loaded sentence with no unnecessary words. Efficiently conveys core function.

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?

No output schema, and description doesn't explain return behavior or error handling. For a file upload tool, additional context (e.g., file type restrictions, success confirmation) would be expected.

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 covers 100% of parameters with descriptions. Description adds no extra meaning; baseline 3 is appropriate.

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?

Description clearly states the action (Upload file), target (file input), and identifier (by UID). It distinguishes from sibling tools like fill_by_uid which handle text inputs.

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, no prerequisites mentioned (e.g., need page snapshot with UID, file existence). Sibling tools like fill_by_uid are not referenced.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 1 tool updatev0.10.0
    • Changedevaluate_script1 field changed
      • addedInput schema / properties / sandbox
        Added value: +{
        +  "description": "Evaluate in an isolated sandbox realm with this name instead of the page realm. The sandbox shares the page DOM and keeps the native built-ins even where the page overrode them. Page-defined globals and expandos are invisible from the sandbox, and vice-versa. The same name reuses the same sandbox across calls; omit to evaluate in the page realm.",
        +  "type": "string"
        +}
  2. 1 tool updatev0.9.10
    • Addedget_page_text
  3. 16 tool updatesv0.9.15
    • Removedclear_console_messages
    • Addedclear_downloads
    • Addedevaluate_script
    • Removedget_network_request
    • Removedlist_console_messages
    • Addedlist_downloads
    • Removedlist_network_requests
    • Removedprofiler_is_active
    • Removedprofiler_start
    • Removedprofiler_stop
    • Addedscreencast_start
    • Addedscreencast_stop
    • Changedscreenshot_by_uid2 fields changed
      • changedInput schema / properties / saveTo / description
        Previous value: -"Optional file path to save the screenshot to instead of returning it as image data in the response."New value: +"Save the screenshot to a file instead of returning it as image data in the response. Pass a file path, an existing directory (generated file inside), or true (generated file under ~/.firefox-devtools-mcp/output/). Relative paths resolve against the current working directory."
      • changedInput schema / properties / saveTo / type
        Previous value: -"string"New value: +[
        +  "boolean",
        +  "string"
        +]
    • Changedscreenshot_page2 fields changed
      • changedInput schema / properties / saveTo / description
        Previous value: -"Optional file path to save the screenshot to instead of returning it as image data in the response."New value: +"Save the screenshot to a file instead of returning it as image data in the response. Pass a file path, an existing directory (generated file inside), or true (generated file under ~/.firefox-devtools-mcp/output/). Relative paths resolve against the current working directory."
      • changedInput schema / properties / saveTo / type
        Previous value: -"string"New value: +[
        +  "boolean",
        +  "string"
        +]
    • Addedset_download_behavior
    • Changedtake_snapshot2 fields changed
      • addedInput schema / properties / preview
        Added value: +{
        +  "description": "Number of characters of the saved output to return inline as a preview when saveTo is used. Omit for no preview.",
        +  "type": "number"
        +}
      • addedInput schema / properties / saveTo
        Added value: +{
        +  "description": "Save the complete snapshot text to a file (ignores maxLines) instead of returning it inline. Pass a file path, an existing directory (generated file inside), or true (generated file under ~/.firefox-devtools-mcp/output/). Relative paths resolve against the current working directory.",
        +  "type": [
        +    "boolean",
        +    "string"
        +  ]
        +}
  4. 3 tool updatesv0.9.6
    • Addedprofiler_is_active
    • Addedprofiler_start
    • Addedprofiler_stop
  5. 1 tool updatev0.9.5
    • Changedrestart_firefox1 field changed
      • changedInput schema / properties / startUrl / description
        Previous value: -"URL to navigate to after restart (optional, uses about:home if not specified)"New value: +"URL to navigate to after restart (optional, uses about:blank if not specified)"
  6. 8 tool updatesv0.9.3
    • Addedget_firefox_info
    • Addedget_firefox_output
    • Addedinstall_extension
    • Addedrestart_firefox
    • Changedscreenshot_by_uid1 field changed
      • addedInput schema / properties / saveTo
        Added value: +{
        +  "description": "Optional file path to save the screenshot to instead of returning it as image data in the response.",
        +  "type": "string"
        +}
    • Changedscreenshot_page1 field changed
      • addedInput schema / properties / saveTo
        Added value: +{
        +  "description": "Optional file path to save the screenshot to instead of returning it as image data in the response.",
        +  "type": "string"
        +}
    • Changedtake_snapshot2 fields changed
      • addedInput schema / properties / includeAll
        Added value: +{
        +  "description": "Include all visible elements without relevance filtering. Useful for Vue/Livewire apps (default: false)",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / selector
        Added value: +{
        +  "description": "CSS selector to scope snapshot to specific element (e.g., \"#app\")",
        +  "type": "string"
        +}
    • Addeduninstall_extension
  7. 19 tool updatesv1.0.0
    • Changedaccept_dialog1 field changed
      • changedInput schema / properties / promptText / description
        Previous value: -"Text to enter in a prompt dialog (optional, only for prompt dialogs)"New value: +"Text for prompt dialogs"
    • Changedclick_by_uid2 fields changed
      • changedInput schema / properties / dblClick / description
        Previous value: -"If true, performs a double-click (default: false)"New value: +"Double-click (default: false)"
      • changedInput schema / properties / uid / description
        Previous value: -"The UID of the element to click"New value: +"Element UID from snapshot"
    • Changedclose_page1 field changed
      • changedInput schema / properties / pageIdx / description
        Previous value: -"The index of the page to close"New value: +"Tab index to close"
    • Changeddrag_by_uid_to_uid2 fields changed
      • changedInput schema / properties / fromUid / description
        Previous value: -"The UID of the element to drag"New value: +"Source element UID"
      • changedInput schema / properties / toUid / description
        Previous value: -"The UID of the target element to drop onto"New value: +"Target element UID"
    • Changedfill_by_uid2 fields changed
      • changedInput schema / properties / uid / description
        Previous value: -"The UID of the input element"New value: +"Input element UID from snapshot"
      • changedInput schema / properties / value / description
        Previous value: -"The text value to fill into the input"New value: +"Text to fill"
    • Changedfill_form_by_uid3 fields changed
      • changedInput schema / properties / elements / description
        Previous value: -"Array of form field UIDs with their values"New value: +"Array of {uid, value} pairs"
      • changedInput schema / properties / elements / items / properties / uid / description
        Previous value: -"The UID of the form field"New value: +"Field UID"
      • changedInput schema / properties / elements / items / properties / value / description
        Previous value: -"The value to fill"New value: +"Field value"
    • Changedget_network_request3 fields changed
      • changedInput schema / properties / format / description
        Previous value: -"Output format: text (default) or json (structured data)"New value: +"Output format (default: text)"
      • changedInput schema / properties / id / description
        Previous value: -"The request ID from list_network_requests (recommended)"New value: +"Request ID from list_network_requests"
      • changedInput schema / properties / url / description
        Previous value: -"The URL of the request (fallback, may match multiple requests)"New value: +"URL fallback (may match multiple)"
    • Changedhover_by_uid1 field changed
      • changedInput schema / properties / uid / description
        Previous value: -"The UID of the element to hover over"New value: +"Element UID from snapshot"
    • Changedlist_console_messages6 fields changed
      • changedInput schema / properties / format / description
        Previous value: -"Output format: text (default, human-readable) or json (structured data)"New value: +"Output format (default: text)"
      • changedInput schema / properties / level / description
        Previous value: -"Filter by console message level"New value: +"Filter by level"
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of messages to return (default: 50)"New value: +"Max messages (default: 50)"
      • changedInput schema / properties / sinceMs / description
        Previous value: -"Only show messages from the last N milliseconds (filters by timestamp)"New value: +"Only last N ms"
      • changedInput schema / properties / source / description
        Previous value: -"Filter messages by source (e.g., \"console-api\", \"javascript\", \"network\")"New value: +"Filter by source"
      • changedInput schema / properties / textContains / description
        Previous value: -"Filter messages by text content (case-insensitive substring match)"New value: +"Text filter (case-insensitive)"
    • Changedlist_network_requests12 fields changed
      • changedInput schema / properties / detail / description
        Previous value: -"Output detail level: summary (default), min (compact JSON), full (includes headers)"New value: +"Detail level (default: summary)"
      • changedInput schema / properties / format / description
        Previous value: -"Output format: text (default, human-readable) or json (structured data)"New value: +"Output format (default: text)"
      • changedInput schema / properties / isXHR / description
        Previous value: -"Filter by XHR/fetch requests only"New value: +"XHR/fetch only"
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of requests to return (default: 50)"New value: +"Max requests (default: 50)"
      • changedInput schema / properties / method / description
        Previous value: -"Filter by HTTP method (GET, POST, etc., case-insensitive)"New value: +"HTTP method filter"
      • changedInput schema / properties / resourceType / description
        Previous value: -"Filter by resource type (case-insensitive)"New value: +"Resource type filter"
      • changedInput schema / properties / sinceMs / description
        Previous value: -"Return only requests newer than N milliseconds ago"New value: +"Only last N ms"
      • changedInput schema / properties / sortBy / description
        Previous value: -"Sort requests by field (default: timestamp descending)"New value: +"Sort field (default: timestamp)"
      • changedInput schema / properties / status / description
        Previous value: -"Filter by exact HTTP status code"New value: +"Exact status code"
      • changedInput schema / properties / statusMax / description
        Previous value: -"Filter by maximum HTTP status code"New value: +"Max status code"
      • changedInput schema / properties / statusMin / description
        Previous value: -"Filter by minimum HTTP status code"New value: +"Min status code"
      • changedInput schema / properties / urlContains / description
        Previous value: -"Filter requests by URL substring (case-insensitive)"New value: +"URL filter (case-insensitive)"
    • Changednavigate_history1 field changed
      • changedInput schema / properties / direction / description
        Previous value: -"Direction to navigate in history"New value: +"back or forward"
    • Changednavigate_page1 field changed
      • changedInput schema / properties / url / description
        Previous value: -"URL to navigate the page to"New value: +"Target URL"
    • Changednew_page1 field changed
      • changedInput schema / properties / url / description
        Previous value: -"URL to load in a new page"New value: +"Target URL"
    • Changedresolve_uid_to_selector1 field changed
      • changedInput schema / properties / uid / description
        Previous value: -"The UID from a snapshot to resolve"New value: +"UID from snapshot"
    • Changedscreenshot_by_uid1 field changed
      • changedInput schema / properties / uid / description
        Previous value: -"The UID of the element to screenshot"New value: +"Element UID from snapshot"
    • Changedselect_page3 fields changed
      • changedInput schema / properties / pageIdx / description
        Previous value: -"The index of the page to select (e.g., 0, 1, 2). Use list_pages first to see all available page indices. Most reliable method."New value: +"Tab index (0-based, most reliable)"
      • changedInput schema / properties / title / description
        Previous value: -"Select page by title (partial match, case-insensitive). Example: \"Google\" will match \"Google Search - About\""New value: +"Title substring (case-insensitive)"
      • changedInput schema / properties / url / description
        Previous value: -"Select page by URL (partial match, case-insensitive). Example: \"github.com\" will match \"https://github.com/user/repo\""New value: +"URL substring (case-insensitive)"
    • Changedset_viewport_size2 fields changed
      • changedInput schema / properties / height / description
        Previous value: -"Viewport height in pixels"New value: +"Height in pixels"
      • changedInput schema / properties / width / description
        Previous value: -"Viewport width in pixels"New value: +"Width in pixels"
    • Changedtake_snapshot4 fields changed
      • changedInput schema / properties / includeAttributes / description
        Previous value: -"Include detailed ARIA and computed attributes in output (default: false)"New value: +"Include ARIA attributes (default: false)"
      • changedInput schema / properties / includeText / description
        Previous value: -"Include text content in output (default: true)"New value: +"Include text (default: true)"
      • changedInput schema / properties / maxDepth / description
        Previous value: -"Maximum depth of tree to include (default: unlimited)"New value: +"Max tree depth"
      • changedInput schema / properties / maxLines / description
        Previous value: -"Maximum number of lines to return in output (default: 100)"New value: +"Max lines (default: 100)"
    • Changedupload_file_by_uid2 fields changed
      • changedInput schema / properties / filePath / description
        Previous value: -"Local filesystem path to the file to upload"New value: +"Local file path"
      • changedInput schema / properties / uid / description
        Previous value: -"The UID of the file input element"New value: +"File input UID from snapshot"
  8. 24 tool updates
    • First observedaccept_dialog
    • First observedclear_console_messages
    • First observedclear_snapshot
    • First observedclick_by_uid
    • First observedclose_page
    • First observeddismiss_dialog
    • First observeddrag_by_uid_to_uid
    • First observedfill_by_uid
    • First observedfill_form_by_uid
    • First observedget_network_request
    • First observedhover_by_uid
    • First observedlist_console_messages
    • First observedlist_network_requests
    • First observedlist_pages
    • First observednavigate_history
    • First observednavigate_page
    • First observednew_page
    • First observedresolve_uid_to_selector
    • First observedscreenshot_by_uid
    • First observedscreenshot_page
    • First observedselect_page
    • First observedset_viewport_size
    • First observedtake_snapshot
    • First observedupload_file_by_uid

TDQS

B3.4/5.0
Disambiguation4/5

Most tools have crystal-clear distinct purposes (each _by_uid tool targets a different interaction, tab management is cleanly split into list/new/navigate/select/close). Minor ambiguity exists between navigate_history (through history) vs navigate_page (to URL) and between get_page_text (visible text) vs take_snapshot (DOM structure), which could cause occasional misselection.

Naming Consistency4/5

The snake_case verb_noun pattern is followed consistently with a strong _by_uid convention across interactions. However, there are deviations: 'screenshot_page' and 'screenshot_by_uid' use a verb-phrase style unlike the get_/take_/list_ verbs used elsewhere, and the naming mixes verb-first conventions inconsistently, though each pattern is internally predictable.

Tool Count3/5

32 tools is on the heavier end, reflecting the broad surface area a DevTools server must cover (snapshots, tabs, downloads, dialogs, extensions, screencast, config). While each tool serves a purpose, some could be consolidated (e.g., the three download tools or the snapshot trio), making the set feel slightly bloated rather than lean.

Completeness3/5

Coverage of the stated interactions domain is strong - element interactions, snapshots, tabs, dialogs, downloads, extensions, and screencasting are all represented. However, obvious gaps exist for a devtools-oriented server: no keyboard input tool, no cookie/storage management, no wait/assert-pattern utilities, and no scroll-into-view helper, which would require agents to fall back to evaluate_script workarounds. The evaluate_script escape hatch fills these gaps but at the cost of structured support.

Maintenance

ActivityActive
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    Drive Firefox-based browsers (Floorp, LibreWolf, Zen, Waterfox, Mullvad, Firefox) from any MCP client — read pages, screenshot, click, fill forms and manage tabs in your real session, over Marionette/WebDriver. OS input & JS eval locked by default.
    41
    105
    1
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    Local-first browser automation for LibreWolf, enabling controlled profile browsing with status, navigation, screenshots, console/network inspection, and more through MCP.
    -

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/mozilla/firefox-devtools-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server