Skip to main content
Glama

Firefox DevTools MCP

npm version CI codecov License: MIT License: Apache 2.0

Model Context Protocol server for automating Firefox via WebDriver BiDi (through Selenium WebDriver). Works with Claude Code, Claude Desktop, Cursor, Cline and other MCP clients.

Repository: https://github.com/mozilla/firefox-devtools-mcp

Note: This MCP server requires a local Firefox browser installation and cannot run on cloud hosting services like glama.ai. Use npx @mozilla/firefox-devtools-mcp@latest to run locally, or use Docker with the provided Dockerfile.

Security

Browser MCP servers carry inherent risks. A few key practices:

  • Use a dedicated Firefox profile. Never run the server against your regular profile — the agent has access to whatever the browser can reach, including cookies and saved sessions.

  • Be cautious about which sites you visit. Pages can return content designed to manipulate the agent (prompt injection). Stick to sites you control or trust.

  • Enable only the tool modules you need. The default basic preset already includes evaluate_script; --tool-preset slim drops it. Higher presets such as --tool-preset developer (debugging, network, console, profiler) and --tool-preset mozilla (privileged context) expand what the agent can do further.

See SECURITY.md for a full breakdown of risks and how to report vulnerabilities.

Related MCP server: gecko-mcp

Requirements

  • Node.js ≥ 20.19.0

  • Firefox 100+ installed (auto‑detected, or pass --firefox-path)

Install and use with Claude Code or Codex (npx)

Recommended: use npx so you run the latest published version from npm.

Option A — CLI

Claude Code

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

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

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

Codex

codex mcp add firefox-devtools -- npx @mozilla/firefox-devtools-mcp@latest

# Headless + viewport via args
codex mcp add firefox-devtools -- \
  npx @mozilla/firefox-devtools-mcp@latest -- --headless --viewport 1280x720

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

Option B — Edit the configuration file

Claude Code

Add to Claude Code’s mcp_settings.json:

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

Codex

Add to ~/.codex/config.toml:

[mcp_servers.firefox-devtools]
command = "npx"
args = ["-y", "@mozilla/firefox-devtools-mcp@latest", "--headless", "--viewport", "1280x720"]

[mcp_servers.firefox-devtools.env]
START_URL = "about:blank"

Option C — Helper script (local dev build)

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

Try it with MCP Inspector

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

Then call tools like:

  • list_pages, select_page, navigate_page

  • take_snapshot then click_by_uid / fill_by_uid

  • list_network_requests (always‑on capture), get_network_request

  • list_downloads (always‑on capture), set_download_behavior

  • screenshot_page, list_console_messages

CLI options

You can pass flags or environment variables (names on the right):

  • --firefox-path — absolute path to Firefox binary

  • --headless — run without UI (FIREFOX_HEADLESS=true)

  • --viewport 1280x720 — initial window size

  • --profile-path — use a specific Firefox profile

  • --firefox-arg — extra Firefox arguments (repeatable)

  • --start-url — open this URL on start (START_URL)

  • --accept-insecure-certs — ignore TLS errors (ACCEPT_INSECURE_CERTS=true)

  • --connect-existing — attach to an already-running Firefox instead of launching a new one (CONNECT_EXISTING=true)

  • --marionette-port — Marionette port for connect-existing mode, default 2828 (MARIONETTE_PORT)

  • --pref name=value — set Firefox preference at startup via moz:firefoxOptions (repeatable)

  • --tool-preset — select which tool modules to enable: slim, basic (default), developer, mozilla, or all. See Tool modules and presets. (TOOL_PRESET)

  • --tools — explicit list of tool modules to enable, overriding --tool-preset entirely (e.g. --tools pages network script). See Tool modules and presets.

  • --enable-scriptdeprecated, use --tool-preset developer or --tools ... script debugging. Selects the developer tool preset. (ENABLE_SCRIPT=true)

  • --enable-privileged-contextdeprecated, use --tool-preset mozilla or --tools ... privileged prefs. Selects the mozilla tool preset. Requires MOZ_REMOTE_ALLOW_SYSTEM_ACCESS=1 (ENABLE_PRIVILEGED_CONTEXT=true)

  • --android-device — enable Firefox for Android mode; value is the ADB device serial (e.g. emulator-5554). Run adb devices to list connected devices. Omit the value or use auto to select the single connected device automatically.

  • --android-wipe-app-data — confirm that Android mode wipes all data of the target app. Required together with --android-device. (ANDROID_WIPE_APP_DATA=true)

  • --android-package — Android app package name, default org.mozilla.firefox. Other packages: org.mozilla.firefox_beta for Firefox Beta, org.mozilla.fenix for Firefox Nightly, org.mozilla.fenix.debug for Firefox Nightly Debug, org.mozilla.geckoview_example for geckoview (ANDROID_PACKAGE)

  • --unrestricted-save-paths — let the saveTo parameter write anywhere on disk instead of the default roots. See Saving bulky output to disk and the security note in SECURITY.md. (UNRESTRICTED_SAVE_PATHS=true)

  • --log-file — write MCP server logs to a file instead of stderr. Useful for debugging sessions with MCP clients that hide server output. Set DEBUG=* to also include verbose debug logs. Example: --log-file /tmp/firefox-mcp.log

Tool modules and presets

Tools are grouped into modules. You choose which modules to expose either with a named preset (--tool-preset) or with an explicit list (--tools). When both are given, --tools wins and the preset is ignored.

Modules: pages, snapshot, input, network, console, screenshot, downloads, utilities, management, webextension, profiler, screencast, script, debugging, prefs, privileged.

Presets (each is a superset of the previous):

  • slimpages, snapshot, input, screenshot

  • basic (default) — slim plus downloads, script, utilities, management, webextension, screencast

  • developerbasic plus debugging, network, console, profiler

  • mozilladeveloper plus prefs, privileged

  • all — every module

Note that basic, the default, includes script and therefore the evaluate_script tool. See SECURITY.md for what that means for the attack surface, and use --tool-preset slim or an explicit --tools list to drop it.

# Use the developer preset (adds network, console, debugging and profiler tools)
npx @mozilla/firefox-devtools-mcp --tool-preset developer

# Enable only the modules you need
npx @mozilla/firefox-devtools-mcp --tools pages network console

The prefs and privileged modules require MOZ_REMOTE_ALLOW_SYSTEM_ACCESS=1 and are only available in the Mozilla-internal build. The public package skips them even if requested and logs a warning naming the modules it dropped.

Useful preferences (--pref)

  • remote.prefs.recommended=false. When Firefox runs in automation, it applies RecommendedPreferences that modify browser behavior for testing. Set remote.prefs.recommended to false to skip those and have a configuration closer to a regular Firefox instance.

  • remote.log.level=Trace. Enable verbose WebDriver protocol logs in Firefox. The MCP server will automatically pass the matching log level to geckodriver so both sides log at the same verbosity.

  • app.update.disabledForTesting=false. Allow Firefox to automatically download and apply updates. Note that updates may interrupt your session. Requires also setting remote.prefs.recommended=false.

Firefox for Android

Use --android-device to automate Firefox running on an Android device. Requires adb on your PATH and geckodriver, which is managed automatically.

Warning: Android mode wipes all data of the target app before every session. Tabs, history, bookmarks, passwords, cookies and settings are all lost. geckodriver runs adb shell pm clear <package> when creating the session and offers no way to skip it, then runs the session on its own temporary profile which is deleted afterwards. Because of this, --android-device requires --android-wipe-app-data, and you should install a build dedicated to automation rather than automating the browser you use. Bug 2064088 tracks adding an option to geckodriver to keep the existing app data.

# List connected devices
adb devices

# Launch Firefox for Android on the single connected device
npx @mozilla/firefox-devtools-mcp --android-device auto --android-wipe-app-data

# Target a specific device
npx @mozilla/firefox-devtools-mcp --android-device <serial> --android-wipe-app-data

# Use Firefox Nightly instead
npx @mozilla/firefox-devtools-mcp --android-device <serial> --android-package org.mozilla.fenix --android-wipe-app-data

Port forwarding between the host and device is handled automatically by geckodriver.

Connect to existing Firefox

Use --connect-existing to automate your real browsing session, with cookies, logins, and open tabs intact:

# Start Firefox with Marionette and the Remote Agent (BiDi)
firefox --marionette --remote-debugging-port

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

Both flags are required because the MCP uses both WebDriver Classic (--marionette) and WebDriver BiDi (--remote-debugging-port). If Firefox is only started with --marionette, the MCP server fails to connect and asks you to restart Firefox with both flags.

Warning: Do not leave Marionette enabled during normal browsing. It sets navigator.webdriver = true and changes other browser fingerprint signals, which can trigger bot detection on sites protected by Cloudflare, Akamai, etc. Only enable Marionette when you need MCP automation, then restart Firefox normally afterward.

Tool overview

See docs/tools.md for the full list of tools by module, with descriptions and parameters (generated from the source).

  • Pages: list/new/navigate/select/close/get_page_text (get_page_text supports optional saveTo)

  • Snapshot/UID: take/resolve/clear (take supports optional saveTo)

  • Input: click/hover/fill/drag/upload/form fill/press_key/type_text

  • Network: list/get (ID‑first, filters, always‑on capture; both support optional saveTo)

  • Downloads: list_downloads/clear_downloads (always‑on capture), set_download_behavior (allow/deny/default)

  • Console: list/clear (list supports optional saveTo)

  • Screenshot: page/by uid (with optional saveTo for CLI environments)

  • Script: evaluate_script (optional sandbox for an isolated realm; optional saveTo for bulky results)

  • Privileged Context: list/select privileged ("chrome") contexts, evaluate_privileged_script (requires MOZ_REMOTE_ALLOW_SYSTEM_ACCESS=1)

  • WebExtension: install_extension, uninstall_extension, list_extensions (list requires MOZ_REMOTE_ALLOW_SYSTEM_ACCESS=1)

  • Firefox Management: get_firefox_info, get_firefox_output, restart_firefox

  • Firefox Preferences: get_firefox_prefs, set_firefox_prefs (requires MOZ_REMOTE_ALLOW_SYSTEM_ACCESS=1)

  • Profiler: profiler_is_active, profiler_start (preset or explicit config), profiler_stop (saves profile to downloads directory)

  • Screencast: screencast_start (records the page viewport to a video file in the downloads directory), screencast_stop (requires Firefox 154+)

  • Utilities: accept/dismiss dialog, history back/forward, set viewport

Saving bulky output to disk

Large tool output can consume significant context in CLI clients like Claude Code. The screenshot_page, screenshot_by_uid, take_snapshot, list_console_messages, list_network_requests, get_network_request, get_page_text, evaluate_script, and evaluate_privileged_script tools accept an optional saveTo parameter that writes the result to a file instead of returning it inline. saveTo takes one of three forms:

  • a file path (relative to the current working directory, or absolute within ~/.firefox-devtools-mcp; parent directories are created)

  • an existing directory (a timestamped file is generated inside it)

  • true (a timestamped file is generated under ~/.firefox-devtools-mcp/output/)

The response returns the path and byte size. The saved file always holds the full, untruncated data: the inline size safeguards (console message caps, network header truncation, snapshot line caps) never apply to it.

The text-producing tools (everything except the screenshots) also accept preview, a number of characters of the saved output to echo back inline as a short excerpt. Screenshots have no preview.

screenshot_page({ saveTo: "page.png" })
take_snapshot({ saveTo: true })
list_network_requests({ urlContains: "api", saveTo: "network.json" })
evaluate_script({ function: "() => performance.getEntries()", saveTo: true, preview: 2000 })

By default, save paths are restricted: relative paths resolve against the current working directory, and absolute paths are only allowed within ~/.firefox-devtools-mcp. Paths that escape these locations are rejected. Start the server with --unrestricted-save-paths to write to arbitrary locations, including absolute paths outside that directory.

Saved files can then be viewed for instance with Claude Code's Read tool without impacting context size.

Local development

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

See CONTRIBUTING.md for more details on local development, testing, and CI.

Troubleshooting

  • Firefox not found: pass --firefox-path "/Applications/Firefox.app/Contents/MacOS/firefox" (macOS) or the correct path on your OS.

  • First run is slow: Selenium sets up the BiDi session; subsequent runs are faster.

  • Stale UIDs: a UID stays valid until its element is removed or the page navigates; take a fresh snapshot (take_snapshot) when a UID tool reports one is gone.

  • Windows 10: Error during discovery for MCP server 'firefox-devtools': MCP error -32000: Connection closed

    • Solution 1 Wrap with cmd /c (details):

      "mcpServers": {
        "firefox-devtools": {
          "command": "cmd",
          "args": ["/c", "npx", "-y", "@mozilla/firefox-devtools-mcp@latest"]
        }
      }
    • Solution 2 Use the absolute path to npx (adjust extension — .cmd, .bat, .exe, or .ps1 — to match your setup):

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

Versioning

  • Pre‑1.0 API: versions start at 0.x. Use @latest with npx for the newest release.

Contributing

See CONTRIBUTING.md for how to file issues, run tests, and work on the project locally.

Author

Maintained by Mozilla.

License

Licensed under either of MIT or Apache 2.0 at your option.

Available Tools

32 tools
accept_dialogA

Accept browser dialog. Provide promptText for prompts.

ParametersJSON Schema
NameRequiredDescriptionDefault
promptTextNoText for prompt dialogs

TDQS

A4/5.0
Behavior3/5

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

Annotations provide readOnlyHint=false, indicating a mutating action. The description adds that promptText is for prompt dialogs, but does not disclose other behavioral details such as blocking behavior or what happens if no dialog is present.

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 short sentences, front-loaded with the core purpose and then the parameter guidance. Every word earns its place.

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 provides enough context to operate. It could mention the contrasting dismiss_dialog tool, but the essentials are covered.

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 description's mention of 'provide promptText for prompts' closely mirrors the schema's 'Text for prompt dialogs.' It adds no substantial meaning 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?

The description clearly states 'Accept browser dialog,' which is a specific verb and resource. It effectively distinguishes itself from sibling tools like dismiss_dialog, and the mention of promptText clarifies the dialog type.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

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

The description implies when to use the tool—when you need to accept a dialog—and instructs to provide promptText for prompt dialogs. However, it does not explicitly contrast with dismiss_dialog or state 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.

clear_downloadsA

Clear the tracked downloads buffer.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior2/5

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

No annotations are provided, so the description carries full behavioral disclosure burden. While "buffer" hints at an internal tracking list rather than files, it does not explicitly state whether downloading files are affected, whether the action is irreversible, or what the side effects are. This is a potentially destructive operation.

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

Conciseness5/5

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

The description is a single, front-loaded sentence with no wasted words. It conveys the essential purpose efficiently.

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 is simple with no parameters and no output schema, but given the lack of annotations, the description should provide more behavioral context (e.g., whether it clears the internal buffer only, whether it deletes files). The word "buffer" implies non-destructive-to-files, but this is not explicit, leaving some ambiguity.

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 does not need to add parameter semantics. The baseline for 0 params is 4, and the description adequately covers the no-parameter nature.

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 the specific verb "clear" and identifies the resource as the "tracked downloads buffer," making the tool's function clear. It distinguishes itself from siblings like list_downloads (which lists) and set_download_behavior (which sets 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?

The description implies use when you want to reset the downloads tracking buffer, but it does not explicitly state when to use this tool vs alternatives or mention any exclusions. No alternatives are referenced from the sibling set.

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_uidA

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

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

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already indicate readOnlyHint=false, so the agent knows it's a mutation. The description adds no additional behavioral details such as side effects, failure modes, or timing. It merely restates the dblClick parameter, which is already in the schema.

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

Conciseness5/5

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

The description is two short sentences, front-loaded with the core action and no wasted words. It is appropriately concise for a simple tool.

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 action with two well-documented parameters and no output schema, the description is complete enough. It covers the purpose and the optional double-click behavior without requiring additional detail.

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 uid and dblClick. The description adds minimal extra meaning beyond the schema, only framing dblClick as a double-click toggle, which duplicates the schema description. 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?

The description clearly states the action ('Click element by UID') with a specific verb and resource, and it distinguishes from sibling tools like hover_by_uid and fill_by_uid. Mentioning 'Set dblClick for double-click' further clarifies the tool's 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?

The description implies usage from the action name but provides no explicit guidance on when to use this tool versus alternatives. It does not mention exclusions or alternatives, so the usage context is only implied.

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

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?

The annotation readOnlyHint=false already signals that this is a mutating operation, and the description's 'Close tab' is consistent with that. However, the description adds no beyond-annotation context about edge cases (e.g., closing the last tab), side effects, or error behavior, so it meets the minimum but doesn't enrich the agent's understanding.

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 immediately states the action and target. There is no redundant information, fluff, or nested structure. It is perfectly front-loaded and appropriate for a tool with one parameter.

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?

While the tool is simple (one parameter, no output schema), the description lacks key contextual details such as how to obtain the tab index (e.g., via list_pages) or what happens if the index is invalid. There is no mention of tie-ins to sibling tools, leaving the agent to infer the workflow. For a minimal one-liner, it's 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?

The input schema already provides a 100% description for pageIdx ('Tab index to close'), and the description's 'by index' adds no additional meaning. Since schema coverage is high, the baseline is 3, and the description does not improve clarity beyond that.

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' has a specific verb (close) and resource (tab), and the method (by index) distinguishes it from sibling tools like select_page or navigate_page. It is immediately clear what the tool does and how it differs from other page-related operations.

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, such as after calling list_pages to obtain the tab index, or in contrast to other tab-manipulation tools. There are no prerequisites, exclusions, or explicit usage context—only a functional statement.

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

dismiss_dialogA

Dismiss browser dialog.

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?

Annotations indicate readOnlyHint=false, so the description doesn't need to state that it performs a mutation. However, the description adds no additional behavioral context, such as what happens to the dialog or whether it only works for certain dialog types.

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?

One sentence with no filler, entirely front-loaded. Every word 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 zero-parameter tool with no output schema, this description provides the core verb and object but lacks context about the difference from accept_dialog or any side effects. It is minimally adequate but not thorough.

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 no parameters and the schema is empty, so the description doesn't need to explain parameters. A baseline of 4 applies for zero-parameter tools.

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 (dismiss) and the target (browser dialog). The verb 'dismiss' distinguishes it from the sibling 'accept_dialog', which implies accepting the dialog instead.

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 about when to use this tool or when to prefer accept_dialog. The description only states what it does, leaving usage context entirely implicit.

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 adds a small implementation detail, but does not disclose side effects, requirements for the source/target elements, or what behavior occurs after the drag. With readOnlyHint=false, the mutation nature is implied but not elaborated.

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 that conveys the core functionality with zero wasted words. Very concise and appropriately sized for the tool's simplicity.

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 is simple with two fully documented parameters, so the description is minimally sufficient. However, it lacks broader context such as usage scenarios, potential side effects, or behavior when the drop target is invalid, making it slightly incomplete.

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 provides 100% coverage with descriptions for both parameters (fromUid and toUid), so the description adds no extra semantic value. Baseline of 3 is appropriate since the schema handles parameter documentation.

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 (drag) and the target (another element), which is specific enough to distinguish from sibling tools like click, hover, and fill. However, 'to another' is slightly vague without referencing the toUid parameter, but the schema resolves 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 is provided on when to use this tool versus alternatives, nor any prerequisites (e.g., element must be draggable or have a valid drop zone). The description does not mention any exclusions or context.

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_uidB

Fill text input/textarea by UID.

ParametersJSON Schema
NameRequiredDescriptionDefault
uidYesInput element UID from snapshot
valueYesText to fill

TDQS

B3.3/5.0
Behavior2/5

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

The only annotation is readOnlyHint=false, which indicates a write operation. The description does not add further behavioral details such as whether existing text is overwritten, whether input events are triggered, or any element requirements. It adds no value 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.

Conciseness5/5

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

The description is a single, efficient sentence that is front-loaded with the action and resource. Every word earns its place, with no unnecessary 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?

For a simple tool with two fully described parameters, the description is minimally viable. However, it lacks important context such as side effects (e.g., whether it clears existing content) and how it differs from fill_form_by_uid, leaving clear gaps for an agent relying solely on this description.

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?

Both parameters are fully described in the input schema, so schema coverage is 100%. The description's 'text input/textarea' and 'by UID' add slight domain context but do not significantly enhance meaning beyond the schema's own 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 states a specific verb ('Fill') and resource ('text input/textarea') with a clear mechanism ('by UID'). It distinguishes from sibling tools like fill_form_by_uid, which fills multiple fields, by targeting a single 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 such as fill_form_by_uid or click_by_uid. The description merely states what it does without any contextual or exclusionary information.

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

fill_form_by_uidA

Fill multiple form fields at once.

ParametersJSON Schema
NameRequiredDescriptionDefault
elementsYesArray of {uid, value} pairs

TDQS

A3.5/5.0
Behavior2/5

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

Annotations already indicate readOnlyHint=false, and the description adds no behavioral detail beyond the purpose. It does not mention side effects, failure behavior, or requirements (e.g., fields must exist), so it provides little extra transparency beyond the structured 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 a single, concise sentence with the verb and object front-loaded. It contains no wasted words, though it could include a brief note about using it for multiple fields. It is appropriately short for a simple tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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

Given the tool's simplicity (one parameter, 100% schema coverage, no output schema), the description adequately conveys what it does. The combination of description and schema provides sufficient context for an agent to invoke it correctly, though it lacks explicit linkage to the single-field sibling.

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 the 'elements' array and its 'uid'/'value' fields fully documented in the schema. The description adds only the notion of 'multiple fields', which is already implied by the array structure, so it does not meaningfully augment the schema.

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

Purpose5/5

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

The description 'Fill multiple form fields at once' clearly identifies the verb ('fill'), resource ('form fields'), and scope ('multiple', 'at once'). It distinguishes from sibling tool fill_by_uid, which likely handles a single field, by emphasizing the batch nature.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

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

The phrase 'at once' implies the tool's use for batch form filling, but there is no explicit guidance on when to choose this over fill_by_uid or any exclusions. The usage context is merely implied, not stated.

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/5.0
Behavior4/5

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

The description adds useful context beyond the readOnlyHint annotation by listing the specific type of configuration data returned. It describes what information is accessible, which helps the agent set expectations about the tool's output, though it does not detail any potential limitations or edge cases.

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, focused sentence that front-loads the main action and includes specific examples. Every word earns its place with no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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

Given the simplicity of the tool (no parameters, no output schema, read-only), the description provides sufficient context for selection and invocation. It names key configuration elements, though a more explicit note about the return format could slightly 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?

With zero parameters, the description has no need to explain parameter semantics. The absence of parameters is clear from the schema, and the description adds no extraneous information, which 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 tool retrieves configuration information about the current Firefox instance, specifying concrete items like binary path, environment variables, and output file location. It distinguishes itself from the sibling tool get_firefox_output by focusing on configuration rather than output content.

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 is given about when to use this tool versus alternatives. While the purpose is clear, there is no mention of similar tools like get_firefox_output or when it would be preferable to use this one over others.

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

A4/5.0
Behavior4/5

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

The annotation already declares readOnlyHint=true, so the safety profile is known. The description adds useful context by specifying what types of output are included (stdout/stderr, MOZ_LOG, warnings, crashes, stack traces) and that it returns recent output from a capture file. This enhances understanding 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?

The description is three concise sentences, front-loaded with the primary purpose. Each sentence earns its place: the first defines the tool, the second explains the source, and the third advises on filtering. No redundancy or unnecessary details.

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 read-only log retrieval tool with fully documented parameters and a readOnly annotation, the description is sufficiently complete. It covers what the tool returns and mentions filtering. It could explicitly state the return format, but that is not critical given the simplicity and existing schema documentation.

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 all three parameters (grep, lines, since). The description adds only generic references to 'filters' and 'recent output', which aligns with the schema but does not provide additional detailed parameter semantics beyond what is already present.

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

Purpose5/5

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

The description clearly states the tool's function: 'Retrieve Firefox output (stdout/stderr including MOZ_LOG, warnings, crashes, stack traces)'. It specifies the resource (Firefox output from a capture file) and distinguishes it from sibling tools like get_firefox_info, which likely retrieves metadata rather than logs.

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 when needing Firefox output logs and provides basic guidance on using filters ('Use filters to focus on specific content'), but it does not explicitly contrast with alternatives or state when not to use the tool. No strong when-to-use vs. when-not-to-use guidance is given beyond the implied purpose.

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_uidB

Hover over element by UID.

ParametersJSON Schema
NameRequiredDescriptionDefault
uidYesElement UID from snapshot

TDQS

B3.2/5.0
Behavior2/5

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

The description adds no behavioral context beyond the annotation readOnlyHint=false. It does not mention that hovering may trigger events, require the element to be visible, or what happens when the UID is invalid. With annotations present, the bar is lower, but this description still fails to disclose any additional operational traits.

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, focused sentence with no extra words or redundancy. It front-loads the core action and is appropriately sized for a simple tool with one parameter.

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?

Despite having a complete schema and a readOnlyHint annotation, the description lacks any guidance on usage context, potential side effects, or behavior on failure. It is a minimal restatement of the tool's purpose and does not fully equip an agent to decide when or how to invoke it.

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 uid parameter fully with the description 'Element UID from snapshot', and the tool description repeats 'by UID' without adding extra meaning. Since schema_description_coverage is 100%, the baseline is 3, and the description does not enhance parameter understanding.

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

Purpose5/5

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

The description clearly states the tool's action: 'Hover over element by UID.' This specifies a concrete verb (hover) and resource (element), and it distinguishes itself from sibling tools like click_by_uid, fill_by_uid, and drag_by_uid_to_uid by the unique action it performs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

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

The description provides no explicit guidance on when to use this tool versus alternatives, nor does it mention any prerequisites or exclusions. It simply states the action, leaving the agent to infer applicability from the tool name and context.

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

A4/5.0
Behavior3/5

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

The annotation readOnlyHint=false already indicates a mutating operation, so the description is not required to restate that. It does add the WebDriver BiDi command and source type support, but it does not disclose side effects such as the temporary-by-default nature of the install or requirements like signed extensions for permanent installs. These are partially covered in the schema, so the description adds moderate 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.

Conciseness5/5

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

The description is concise, consisting of two sentences that front-load the primary purpose and then list the supported input formats. There is no fluff or redundancy, making it highly efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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

Given the full parameter schema and no output schema, the description sufficiently conveys the operation and options. It could be more complete by mentioning that installs are temporary by default or noting the permanent install requirement, but these details are in the schema. Overall, it is adequate but not exhaustive.

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 provides 100% coverage with descriptions for all four parameters, including an enum for type. The description simply reiterates the three source types without adding new semantic details. Therefore, it meets the baseline but does not go 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?

The description clearly states the specific action (install) and resource (Firefox extension), mentions the underlying WebDriver BiDi command, and distinguishes itself from the sibling uninstall_extension. It also enumerates the three supported source types, leaving no ambiguity about its role.

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 makes clear when to use the tool (to install an extension) and the accepted source formats, but it does not explicitly state when not to use it or mention alternatives. The sibling context provides implicit guidance, but no explicit exclusions or comparisons are given.

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.2/5.0
Behavior4/5

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

The description adds meaningful behavioral context beyond the readOnlyHint annotation: downloads are 'tracked since startup' (not historical), and the output includes status and saved file path. Since annotations already establish read-only safety, the description needs only to add scope and output details, which it does effectively.

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, tightly worded sentence: 'List downloads tracked since startup, including status and saved file path.' No wasted words. Every part contributes essential information, making it highly concise and 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?

The tool has no output schema, so the description must clarify return values; it does so by mentioning status and saved file path. It also defines scope ('since startup'). With four optional parameters already documented in the schema, this is adequately complete. A small gap is that ordering or pagination behavior is not mentioned, but this is minor for a 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 description coverage is 100%, so the parameters (limit, format, status, urlContains) are already fully documented. The description does not add additional semantic meaning about parameters; it only mentions output fields. Since the schema carries the parameter burden, 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 is specific and clear: 'List downloads tracked since startup, including status and saved file path.' It uses a strong verb ('list'), names the resource ('downloads'), and adds scope ('since startup') and key output details. This clearly distinguishes it from sibling tools like clear_downloads, which is a mutation, and navigate_page, which has a different resource.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

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

The description implies usage by stating it lists downloads, which is obviously the intended use. There are no explicit exclusions or alternatives, but there are no direct alternatives for listing downloads among the siblings. The context is clear enough for an agent to know when to invoke this tool.

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.5/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 useful behavioral context by specifying that the selected tab is marked and listing the fields returned. No contradictions with annotations.

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

Conciseness5/5

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

Two concise sentences immediately convey purpose and output details with no filler. Every phrase is useful.

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 zero-parameter read-only list tool, the description is complete: it says what is listed, which fields are included, and how the selected tab is distinguished. No output schema is needed for such a simple result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, and schema description coverage is trivially 100%. Baseline for zero-parameter tools is 4; the description doesn't need to add parameter details.

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 'List open tabs' with specific output fields (index, title, URL) and notes the selected-tab marker. This distinguishes it from sibling tools like navigate_page, close_page, and select_page.

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?

Usage context is clear: use this tool when you need to view open tabs. It doesn't explicitly cite alternatives or exclusions, but the intended use is evident given the simple scope.

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

A3.8/5.0
Behavior3/5

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

The readOnlyHint=false annotation already signals mutation, and the description adds that it returns a tab index. However, it does not disclose side effects such as whether the new tab becomes active, whether the URL is validated, or any failure modes. The description provides the essential behavior but is minimal.

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 short sentences, front-loaded with the core action. No wasted words; every element contributes to understanding the tool's purpose and output.

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 (one parameter, no output schema), the description adequately covers what it does and what it returns. It could mention whether the new tab is activated or if any restrictions apply, but for a basic 'new tab' operation this is nearly complete. The lack of an output schema is partially compensated by the explicit 'Returns tab index'.

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 already documents the single 'url' parameter with 100% coverage. The description's 'at URL' phrase adds no further detail about URL formatting, required scheme, or behavior when omitted. Since schema coverage is high, the baseline of 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?

The description clearly states the tool's function: 'Open new tab at URL. Returns tab index.' This is a specific verb+resource combination that distinguishes it from sibling tools like navigate_page (which likely navigates the current tab) and list_pages. The output is also specified.

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 the tool (when you need to create a new tab at a given URL) but does not explicitly contrast it with alternatives like navigate_page or select_page. It lacks any exclusions or 'instead of' guidance, so usage context is only inferred.

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?

It clearly discloses that all current tabs will be closed, which is a significant side effect. It also flags the requirement for MOZ_REMOTE_ALLOW_SYSTEM_ACCESS=1 when setting prefs. Since annotations only provide readOnlyHint=false, the description adds meaningful behavioral context, though it omits details about restart timing or return values.

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 concise sentences that are front-loaded with the core action. Each sentence contributes essential information: the action, the configurable aspects, and the key side effect. There is no redundancy or filler.

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 restart tool with six parameters and no output schema, the description covers the main purpose, the side effect, and a key operational requirement. However, it lacks details on whether the restart is synchronous/asynchronous, what the return value is, and how it affects the existing Firefox automation session. This leaves some ambiguity but is adequate 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?

The schema description coverage is 100%, so the description does not need to explain each parameter. The text mentions 'binary path, environment variables, and other options,' but this merely echoes the schema. No additional meaning is added beyond the structured definitions.

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 explicitly states 'Restart Firefox with different configuration' and details specific configurable aspects like binary path and environment variables. This clearly distinguishes it from sibling tools which focus on page navigation, screenshots, or extension management, making the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

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

The description implies usage for restarting Firefox with new settings but does not explicitly state when to use this tool over alternatives, nor does it mention any exclusions. For example, it doesn't clarify that to change a single preference without restart, one might use other tools. This leaves the agent to infer from context rather than providing direct guidance.

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?

With only readOnlyHint:false in annotations, the description adds important behavioral context: output is saved to downloads directory, the tool returns an ID for later use, and recordings can run concurrently. It also implies side effects (file creation) beyond the annotation. It lacks details like audio capture or cleanup, but the core behavior is transparent.

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

Conciseness5/5

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

The description is three concise sentences, each adding valuable information: action and output, return value and usage, concurrency capability. It is front-loaded with the primary purpose and has no fluff or repetition.

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 5 optional parameters, no output schema, and minimal annotations, the description covers the essential workflow: start recording, save to downloads, get ID for stop. It doesn't explain return format or recording format, but those are implied by the schema and sibling stop tool. The description is complete enough for an agent to select and invoke the 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%, so parameters already have descriptions. The tool description adds context like 'current page viewport' which aligns with width/height defaults, but doesn't elaborate on individual parameters. For high schema coverage, a baseline 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 ('Start recording a screencast (video)') and the resource ('current page viewport'), with output details ('saving to a file in the downloads directory'). It distinguishes itself from sibling tools like screenshot_page (still image) and screencast_stop (stop action).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

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

The description implies when to use this tool (when a video recording of the viewport is needed) and provides workflow guidance: 'Returns a screencast id to pass to screencast_stop' and 'Multiple recordings can run at once.' It doesn't explicitly mention alternatives, but the 'video' keyword differentiates from screenshot tools well enough.

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?

The annotation readOnlyHint=false already signals a mutation operation. The description adds that it finalizes the video file and returns the saved file path, providing useful behavioral context beyond the annotation and clarifying 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 two concise sentences, front-loaded with the action and followed by the return value. No redundant or extraneous information exists.

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, the description covers purpose, return value, and relation to screencast_start. It lacks explicit error handling (e.g., no active recording), but the schema mitigates ambiguity, making it sufficiently 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?

The schema already provides a complete description of the single parameter, including its source from screencast_start and optionality. The tool description adds no new parameter details, so 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 resource (an in-progress screencast recording), and distinguishes it from siblings by referencing screencast_start and finalizing the video file. This leaves no ambiguity about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

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

It establishes clear context by naming screencast_start as the originating tool, indicating this is its termination counterpart. The parameter schema further clarifies when the optional id is needed. However, it doesn't explicitly mention alternatives or when not to use this tool.

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

A4/5.0
Behavior4/5

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

Annotations indicate readOnlyHint=true, and the description adds the crucial behavioral detail that the output is base64 PNG. This complements the annotation by specifying the return format, which is beyond what the annotation provides. No contradictions found.

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 concise single sentence that fully conveys the tool's purpose and output format. There is no redundancy or unnecessary detail, making it highly scannable for an agent.

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 two well-documented parameters and a read-only annotation, the description plus schema provide sufficient context. The return format (base64 PNG) is stated, and the saveTo behavior is explained in the parameter schema. Slight gap: the description does not define the exact response structure, but that's minor for a screenshot function.

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 complete descriptions for both parameters (uid and saveTo), achieving 100% coverage. The outer description adds no additional parameter semantics, so it relies on the schema as expected.

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 (Capture), the target (element screenshot by UID), and the output format (base64 PNG). It distinguishes from sibling screenshot_page by specifying 'element' and 'by UID', making the tool's unique scope unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

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

The description implies the tool is for element-level screenshots, but it does not explicitly state when to prefer this over screenshot_page or other alternatives. There are no explicit exclusions or references to sibling tools, leaving usage context partially implied.

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

screenshot_pageA
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

A3.5/5.0
Behavior3/5

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

The annotation readOnlyHint=true already signals a safe read operation. The description adds the specific return format (base64 PNG), which is helpful context. However, it does not disclose behavior when saveTo is set, such as whether a file path is returned or whether the output is no longer base64 in that mode.

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 that states verb, resource, and format with no filler or redundant content. Every word 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?

The tool is simple, but there is no output schema and the description only covers the default base64 return. It does not clarify what the response contains when saveTo is provided, even though the parameter schema explains the file-saving side. With no output schema, the description should have compensated for this gap.

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%, with the single saveTo parameter fully described in the input schema. The description adds no additional parameter detail, but the schema carries the burden, so the 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 uses the specific verb 'Capture' with resource 'page screenshot' and output format 'base64 PNG'. It clearly distinguishes from sibling tools like screenshot_by_uid, which targets an element (UID) rather than the whole 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 is provided about when to use this tool versus siblings like screenshot_by_uid or take_snapshot. It does not mention prerequisites, exclusions, or preferred contexts, so the agent is left to infer usage from the name and schema.

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

A4.2/5.0
Behavior4/5

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

Discloses the key behavior of selecting the active tab and the precedence rule for index. The annotation readOnlyHint=false already signals mutation, and the description adds valuable context about how criteria resolve conflicts, going beyond what the annotation provides.

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?

A single sentence that clearly conveys the purpose and a key rule. No superfluous words, front-loaded with the action and selection criteria.

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 selection tool, the description covers the mechanism and the precedence rule. It does not mention return values or error cases, but given the absence of an output schema and the clarity of the function, this is sufficient for an agent to understand expected 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?

The input schema covers all three parameters with concise descriptions (e.g., 'Tab index (0-based, most reliable)'), so the description adds little beyond the schema. The precedence rule is already implied by 'most reliable' in the schema, offering minimal additional semantic value.

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

Purpose5/5

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

Clearly states the tool selects the active tab using three criteria (index, URL, or title). This distinguishes it from sibling tools like navigate_page or close_page, which have different actions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

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

Provides clear context that selection is by index, URL, or title, and explicitly states index takes precedence when multiple criteria are given. It does not explicitly mention alternatives or when not to use, but the context is unambiguous and the precedence rule offers practical guidance.

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

A3.8/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It explains the effect of each behavior (silent save, cancel, reset) and mentions the requirement of a recent Firefox, adding transparency about the tool's operation. It doesn't state persistence or effects on existing downloads, but the core traits are disclosed.

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

Conciseness5/5

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

Two concise sentences front-load the purpose and then provide key details. Every sentence earns its place with no fluff.

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 single-parameter tool without output schema, the description explains the modes, the dialog effect, and a prerequisite. It lacks persistence semantics and potential side effects, but overall it is sufficient for straightforward usage.

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%, with the enum values already explained in the parameter description. The tool description adds marginal detail like 'save silently to the default download directory' and dialog avoidance, but the parameter semantics are largely redundant with 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 the tool controls download handling with three explicit modes (allow, deny, reset) and notes it avoids the native save-file dialog. This verb+resource framing is specific and differentiates from download-list tools like list_downloads, though it doesn't name alternative tools explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

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

The description implies usage for setting download policy but does not explicitly state when to prefer this over sibling tools like accept_dialog. 'Requires a recent Firefox' gives a prerequisite, and 'Avoids the native save-file dialog' provides context, but no exclusions or alternatives are mentioned.

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

set_viewport_sizeA

Set viewport dimensions in pixels.

ParametersJSON Schema
NameRequiredDescriptionDefault
widthYesWidth in pixels
heightYesHeight in pixels

TDQS

A4.1/5.0
Behavior3/5

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

The annotation readOnlyHint=false already discloses that this is a mutating operation. The description adds no further behavioral context (e.g., side effects on screenshots or layout). It is a simple setter, so the lack of extra detail is acceptable, but no additional value 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.

Conciseness5/5

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

The description is a single, efficient sentence that immediately conveys the tool's purpose. No filler or redundant information.

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 setter with two well-described parameters, no output schema, and a mutating annotation, the description is complete. It provides the essential information (action, target, unit) without unnecessary elaboration.

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 100% of parameters with descriptions ('Width in pixels', 'Height in pixels'), so the description adds no new semantic meaning. The description only states the purpose, and the schema already handles parameter details.

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 'Set viewport dimensions in pixels' uses a specific verb ('Set') and resource ('viewport dimensions'), with units specified. It clearly distinguishes from sibling tools by focusing on viewport sizing, which no other tool addresses.

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 usage is clear: use when needing to adjust viewport size. No explicit exclusions or alternatives are mentioned, but there is no overlapping sibling tool, so the context is sufficient. Minor gap: no mention of whether this affects the current page or future navigations.

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?

Annotations declare readOnlyHint=false, indicating a mutating operation. The description adds the requirement of a valid extension ID but does not disclose side effects (e.g., removal of extension data) or error behavior. No contradiction with annotations.

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

Conciseness5/5

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

Two concise sentences: the first states the purpose and underlying command, the second provides a prerequisite. No filler or redundant information.

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 single-parameter tool, the description covers purpose and parameter provenance adequately. No output schema exists, but the description does not mention potential errors or return values, which is a minor gap.

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 input schema fully describes the 'id' parameter with example. The description goes beyond schema by specifying how to retrieve the ID (from install_extension or list_extensions), which aids correct invocation.

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 the specific verb 'Uninstall' with the resource 'Firefox extension', clearly stating the action. It distinguishes from sibling tools like install_extension and list_extensions by its unique purpose.

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 second sentence provides explicit guidance on how to obtain the required extension ID via install_extension or list_extensions. It doesn't explicitly state when not to use it, but the action is unique among siblings and the 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.4/5.0
Behavior2/5

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

The annotations already indicate readOnlyHint=false, and the description merely restates the mutating nature of the action ('Upload file'). Beyond this, it discloses no additional behavioral traits such as whether the file must exist, whether change events are triggered, or what happens on failure. It adds no value 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.

Conciseness5/5

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

The description is a single sentence of seven words, front-loaded with the verb and object. It contains no filler or redundant information, earning every word.

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 interface, the absence of an output schema, and the existing parameter descriptions, the terse description is largely sufficient. However, it lacks any mention of potential error conditions or prerequisites (e.g., file existence), which a safety-conscious agent might expect. Still, for a straightforward upload action, it is almost 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 both uid and filePath described (one as 'File input UID from snapshot', the other as 'Local file path'). The description itself does not add any semantic detail beyond the schema, so the 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 uses a specific verb ('Upload') and resource ('file input by UID'), clearly distinguishing it from sibling tools like fill_by_uid or click_by_uid. It conveys exactly what the tool does without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

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

No explicit guidance is provided about when to use this tool versus alternatives. The description does not mention situations where it should be preferred over fill_by_uid or fill_form_by_uid, nor does it mention any prerequisites or exclusions. The only implicit hint is the term 'file input' in the schema, but the description itself offers no usage direction.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

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

Scored across 32 tools

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

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    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
    43 npm
    2
    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.
    -