firefox-devtools-mcp
Automate Firefox browser interactions through Model Context Protocol for web testing, debugging, and automation tasks.
Core Capabilities:
Page Management: List, open, navigate, select (by index, URL, or title), and close browser tabs; navigate browser history backward and forward
Element Interaction: Click, hover, fill forms, drag-and-drop, and upload files using stable UIDs from DOM snapshots that survive minor DOM changes
DOM Inspection: Capture page snapshots with unique element identifiers for reliable automation
Network Monitoring: Always-on capture of all HTTP requests with filtering by URL, method, status code, resource type, XHR, and timing; detailed request inspection with headers and response data
Console Debugging: Capture, filter (by level, time range, source, content), and clear browser console messages
Visual Capture: Screenshot full pages or specific elements by UID as base64 PNGs
Dialog Handling: Accept or dismiss browser alerts, confirms, and prompts with optional text input
Browser Control: Set viewport dimensions, headless mode, custom Firefox profiles, and TLS certificate handling
Multi-format Output: Text (human-readable) and JSON (structured) formats
Cross-platform Support: Works with Firefox 100+ on macOS, Linux, and Windows via WebDriver BiDi
Enables browser automation and web interaction through Firefox via WebDriver BiDi, providing tools for page navigation, element interaction, network monitoring, screenshot capture, and console message access.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@firefox-devtools-mcptake a screenshot of the current page and list recent network requests"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Firefox DevTools MCP
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@latestto 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
basicpreset already includesevaluate_script;--tool-preset slimdrops 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=trueCodex
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@latestOption 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 pathTry it with MCP Inspector
npx @modelcontextprotocol/inspector npx @mozilla/firefox-devtools-mcp@latest --start-url https://example.com --headlessThen call tools like:
list_pages,select_page,navigate_pagetake_snapshotthenclick_by_uid/fill_by_uidlist_network_requests(always‑on capture),get_network_requestlist_downloads(always‑on capture),set_download_behaviorscreenshot_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 viamoz:firefoxOptions(repeatable)--tool-preset— select which tool modules to enable:slim,basic(default),developer,mozilla, orall. See Tool modules and presets. (TOOL_PRESET)--tools— explicit list of tool modules to enable, overriding--tool-presetentirely (e.g.--tools pages network script). See Tool modules and presets.--enable-script— deprecated, use--tool-preset developeror--tools ... script debugging. Selects thedevelopertool preset. (ENABLE_SCRIPT=true)--enable-privileged-context— deprecated, use--tool-preset mozillaor--tools ... privileged prefs. Selects themozillatool preset. RequiresMOZ_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). Runadb devicesto list connected devices. Omit the value or useautoto 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, defaultorg.mozilla.firefox. Other packages:org.mozilla.firefox_betafor Firefox Beta,org.mozilla.fenixfor Firefox Nightly,org.mozilla.fenix.debugfor Firefox Nightly Debug,org.mozilla.geckoview_examplefor geckoview (ANDROID_PACKAGE)--unrestricted-save-paths— let thesaveToparameter 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. SetDEBUG=*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):
slim—pages,snapshot,input,screenshotbasic(default) —slimplusdownloads,script,utilities,management,webextension,screencastdeveloper—basicplusdebugging,network,console,profilermozilla—developerplusprefs,privilegedall— 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 consoleThe 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-devicerequires--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-dataPort 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 2828Both 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 = trueand 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
saveTofor CLI environments)Script: evaluate_script (optional
sandboxfor an isolated realm; optionalsaveTofor 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:devSee 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@latestwith 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 toolsaccept_dialogA
Accept browser dialog. Provide promptText for prompts.
| Name | Required | Description | Default |
|---|---|---|---|
| promptText | No | Text for prompt dialogs |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | Element UID from snapshot | |
| dblClick | No | Double-click (default: false) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| pageIdx | Yes | Tab index to close |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| toUid | Yes | Target element UID | |
| fromUid | Yes | Source element UID |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| args | No | UIDs to pass as function arguments | |
| saveTo | No | Save 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. | |
| preview | No | Number of characters of the saved result to return inline as a preview when saveTo is used. Omit for no preview. | |
| sandbox | No | 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. | |
| timeout | No | Timeout in ms (default: 5000) | |
| function | Yes | JS function string, e.g. () => document.title |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | Input element UID from snapshot | |
| value | Yes | Text to fill |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| elements | Yes | Array of {uid, value} pairs |
TDQS
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.
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.
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.
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.
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.
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_infoARead-only
Get information about the current Firefox instance configuration, including binary path, environment variables, and output file location.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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_outputARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| grep | No | Filter log lines containing this string (case-insensitive) | |
| lines | No | Number of recent log lines to return (default: 100, max: 10000) | |
| since | No | Only show logs written in the last N seconds |
TDQS
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.
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.
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.
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.
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.
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_textARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| saveTo | No | Save 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. | |
| preview | No | Number of characters of the saved text to return inline as a preview when saveTo is used. Omit for no preview. | |
| maxLength | No | Max characters to return inline (default: 20000). Ignored when saveTo is used. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | Element UID from snapshot |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | File path (for archivePath or path types) | |
| type | Yes | Extension data type: "archivePath" for .xpi/.zip, "base64" for encoded data, "path" for unpacked directory | |
| value | No | Base64-encoded extension data (for base64 type) | |
| permanent | No | Firefox-specific: Install permanently (requires signed extension). Default: false (temporary install) |
TDQS
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.
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.
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.
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.
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.
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_downloadsARead-only
List downloads tracked since startup, including status and saved file path.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max downloads (default: 50) | |
| format | No | Output format (default: text) | |
| status | No | Filter by status | |
| urlContains | No | URL filter (case-insensitive) |
TDQS
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.
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.
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.
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.
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.
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_pagesARead-only
List open tabs (index, title, URL). Selected tab is marked.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Target URL |
TDQS
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.
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.
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.
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.
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.
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_selectorARead-only
Resolve UID to CSS selector. Fails if the element is gone.
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | UID from snapshot |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| env | No | New environment variables in KEY=VALUE format (optional, e.g., ["MOZ_LOG=HTMLMediaElement:5", "MOZ_LOG_FILE=/tmp/ff.log"]) | |
| prefs | No | Firefox 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. | |
| headless | No | Run in headless mode (optional, keeps current if not specified) | |
| startUrl | No | URL to navigate to after restart (optional, uses about:blank if not specified) | |
| firefoxPath | No | New Firefox binary path (optional, keeps current if not specified) | |
| profilePath | No | Firefox profile path (optional, keeps current if not specified) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| width | No | Width of the recorded video in pixels. Defaults to the viewport width. | |
| height | No | Height of the recorded video in pixels. Defaults to the viewport height. | |
| context | No | Id of the top-level browsing context to record. Defaults to the currently selected page. | |
| mimeType | No | MIME type of the output file. Defaults to "video/webm". | |
| frameRate | No | Target frame rate of the recording, in frames per second. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| screencast | No | Id of the screencast to stop, as returned by screencast_start. Optional when exactly one recording is active. |
TDQS
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.
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.
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.
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.
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.
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_uidARead-only
Capture element screenshot by UID as base64 PNG.
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | Element UID from snapshot | |
| saveTo | No | 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. |
TDQS
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.
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.
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.
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.
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.
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_pageARead-only
Capture page screenshot as base64 PNG.
| Name | Required | Description | Default |
|---|---|---|---|
| saveTo | No | 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. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | URL substring (case-insensitive) | |
| title | No | Title substring (case-insensitive) | |
| pageIdx | No | Tab index (0-based, most reliable) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| behavior | Yes | 'allowed' saves downloads automatically, 'denied' cancels them, 'default' resets to the browser default |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| width | Yes | Width in pixels | |
| height | Yes | Height in pixels |
TDQS
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.
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.
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.
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.
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.
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_snapshotARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| saveTo | No | 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. | |
| preview | No | Number of characters of the saved output to return inline as a preview when saveTo is used. Omit for no preview. | |
| maxDepth | No | Max tree depth | |
| maxLines | No | Max lines (default: 100) | |
| selector | No | CSS selector to scope snapshot to specific element (e.g., "#app") | |
| includeAll | No | Include all visible elements without relevance filtering. Useful for Vue/Livewire apps (default: false) | |
| includeText | No | Include text (default: true) | |
| includeAttributes | No | Include ARIA attributes (default: false) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Extension ID (e.g., "addon@example.com") |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | File input UID from snapshot | |
| filePath | Yes | Local file path |
TDQS
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.
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.
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.
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.
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.
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 tool update
v0.10.0- Changed
evaluate_script1 field changed- added
Input schema / properties / sandboxAdded 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" +}
1 tool update
v0.9.10- Added
get_page_text
16 tool updates
v0.9.15- Removed
clear_console_messages - Added
clear_downloads - Added
evaluate_script - Removed
get_network_request - Removed
list_console_messages - Added
list_downloads - Removed
list_network_requests - Removed
profiler_is_active - Removed
profiler_start - Removed
profiler_stop - Added
screencast_start - Added
screencast_stop - Changed
screenshot_by_uid2 fields changed- changed
Input schema / properties / saveTo / descriptionPrevious 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." - changed
Input schema / properties / saveTo / typePrevious value: -"string"New value: +[ + "boolean", + "string" +]
- Changed
screenshot_page2 fields changed- changed
Input schema / properties / saveTo / descriptionPrevious 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." - changed
Input schema / properties / saveTo / typePrevious value: -"string"New value: +[ + "boolean", + "string" +]
- Added
set_download_behavior - Changed
take_snapshot2 fields changed- added
Input schema / properties / previewAdded 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" +} - added
Input schema / properties / saveToAdded 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" + ] +}
3 tool updates
v0.9.6- Added
profiler_is_active - Added
profiler_start - Added
profiler_stop
1 tool update
v0.9.5- Changed
restart_firefox1 field changed- changed
Input schema / properties / startUrl / descriptionPrevious 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)"
8 tool updates
v0.9.3- Added
get_firefox_info - Added
get_firefox_output - Added
install_extension - Added
restart_firefox - Changed
screenshot_by_uid1 field changed- added
Input schema / properties / saveToAdded value: +{ + "description": "Optional file path to save the screenshot to instead of returning it as image data in the response.", + "type": "string" +}
- Changed
screenshot_page1 field changed- added
Input schema / properties / saveToAdded value: +{ + "description": "Optional file path to save the screenshot to instead of returning it as image data in the response.", + "type": "string" +}
- Changed
take_snapshot2 fields changed- added
Input schema / properties / includeAllAdded value: +{ + "description": "Include all visible elements without relevance filtering. Useful for Vue/Livewire apps (default: false)", + "type": "boolean" +} - added
Input schema / properties / selectorAdded value: +{ + "description": "CSS selector to scope snapshot to specific element (e.g., \"#app\")", + "type": "string" +}
- Added
uninstall_extension
19 tool updates
v1.0.0- Changed
accept_dialog1 field changed- changed
Input schema / properties / promptText / descriptionPrevious value: -"Text to enter in a prompt dialog (optional, only for prompt dialogs)"New value: +"Text for prompt dialogs"
- Changed
click_by_uid2 fields changed- changed
Input schema / properties / dblClick / descriptionPrevious value: -"If true, performs a double-click (default: false)"New value: +"Double-click (default: false)" - changed
Input schema / properties / uid / descriptionPrevious value: -"The UID of the element to click"New value: +"Element UID from snapshot"
- Changed
close_page1 field changed- changed
Input schema / properties / pageIdx / descriptionPrevious value: -"The index of the page to close"New value: +"Tab index to close"
- Changed
drag_by_uid_to_uid2 fields changed- changed
Input schema / properties / fromUid / descriptionPrevious value: -"The UID of the element to drag"New value: +"Source element UID" - changed
Input schema / properties / toUid / descriptionPrevious value: -"The UID of the target element to drop onto"New value: +"Target element UID"
- Changed
fill_by_uid2 fields changed- changed
Input schema / properties / uid / descriptionPrevious value: -"The UID of the input element"New value: +"Input element UID from snapshot" - changed
Input schema / properties / value / descriptionPrevious value: -"The text value to fill into the input"New value: +"Text to fill"
- Changed
fill_form_by_uid3 fields changed- changed
Input schema / properties / elements / descriptionPrevious value: -"Array of form field UIDs with their values"New value: +"Array of {uid, value} pairs" - changed
Input schema / properties / elements / items / properties / uid / descriptionPrevious value: -"The UID of the form field"New value: +"Field UID" - changed
Input schema / properties / elements / items / properties / value / descriptionPrevious value: -"The value to fill"New value: +"Field value"
- Changed
get_network_request3 fields changed- changed
Input schema / properties / format / descriptionPrevious value: -"Output format: text (default) or json (structured data)"New value: +"Output format (default: text)" - changed
Input schema / properties / id / descriptionPrevious value: -"The request ID from list_network_requests (recommended)"New value: +"Request ID from list_network_requests" - changed
Input schema / properties / url / descriptionPrevious value: -"The URL of the request (fallback, may match multiple requests)"New value: +"URL fallback (may match multiple)"
- Changed
hover_by_uid1 field changed- changed
Input schema / properties / uid / descriptionPrevious value: -"The UID of the element to hover over"New value: +"Element UID from snapshot"
- Changed
list_console_messages6 fields changed- changed
Input schema / properties / format / descriptionPrevious value: -"Output format: text (default, human-readable) or json (structured data)"New value: +"Output format (default: text)" - changed
Input schema / properties / level / descriptionPrevious value: -"Filter by console message level"New value: +"Filter by level" - changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of messages to return (default: 50)"New value: +"Max messages (default: 50)" - changed
Input schema / properties / sinceMs / descriptionPrevious value: -"Only show messages from the last N milliseconds (filters by timestamp)"New value: +"Only last N ms" - changed
Input schema / properties / source / descriptionPrevious value: -"Filter messages by source (e.g., \"console-api\", \"javascript\", \"network\")"New value: +"Filter by source" - changed
Input schema / properties / textContains / descriptionPrevious value: -"Filter messages by text content (case-insensitive substring match)"New value: +"Text filter (case-insensitive)"
- Changed
list_network_requests12 fields changed- changed
Input schema / properties / detail / descriptionPrevious value: -"Output detail level: summary (default), min (compact JSON), full (includes headers)"New value: +"Detail level (default: summary)" - changed
Input schema / properties / format / descriptionPrevious value: -"Output format: text (default, human-readable) or json (structured data)"New value: +"Output format (default: text)" - changed
Input schema / properties / isXHR / descriptionPrevious value: -"Filter by XHR/fetch requests only"New value: +"XHR/fetch only" - changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of requests to return (default: 50)"New value: +"Max requests (default: 50)" - changed
Input schema / properties / method / descriptionPrevious value: -"Filter by HTTP method (GET, POST, etc., case-insensitive)"New value: +"HTTP method filter" - changed
Input schema / properties / resourceType / descriptionPrevious value: -"Filter by resource type (case-insensitive)"New value: +"Resource type filter" - changed
Input schema / properties / sinceMs / descriptionPrevious value: -"Return only requests newer than N milliseconds ago"New value: +"Only last N ms" - changed
Input schema / properties / sortBy / descriptionPrevious value: -"Sort requests by field (default: timestamp descending)"New value: +"Sort field (default: timestamp)" - changed
Input schema / properties / status / descriptionPrevious value: -"Filter by exact HTTP status code"New value: +"Exact status code" - changed
Input schema / properties / statusMax / descriptionPrevious value: -"Filter by maximum HTTP status code"New value: +"Max status code" - changed
Input schema / properties / statusMin / descriptionPrevious value: -"Filter by minimum HTTP status code"New value: +"Min status code" - changed
Input schema / properties / urlContains / descriptionPrevious value: -"Filter requests by URL substring (case-insensitive)"New value: +"URL filter (case-insensitive)"
- Changed
navigate_history1 field changed- changed
Input schema / properties / direction / descriptionPrevious value: -"Direction to navigate in history"New value: +"back or forward"
- Changed
navigate_page1 field changed- changed
Input schema / properties / url / descriptionPrevious value: -"URL to navigate the page to"New value: +"Target URL"
- Changed
new_page1 field changed- changed
Input schema / properties / url / descriptionPrevious value: -"URL to load in a new page"New value: +"Target URL"
- Changed
resolve_uid_to_selector1 field changed- changed
Input schema / properties / uid / descriptionPrevious value: -"The UID from a snapshot to resolve"New value: +"UID from snapshot"
- Changed
screenshot_by_uid1 field changed- changed
Input schema / properties / uid / descriptionPrevious value: -"The UID of the element to screenshot"New value: +"Element UID from snapshot"
- Changed
select_page3 fields changed- changed
Input schema / properties / pageIdx / descriptionPrevious 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)" - changed
Input schema / properties / title / descriptionPrevious value: -"Select page by title (partial match, case-insensitive). Example: \"Google\" will match \"Google Search - About\""New value: +"Title substring (case-insensitive)" - changed
Input schema / properties / url / descriptionPrevious 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)"
- Changed
set_viewport_size2 fields changed- changed
Input schema / properties / height / descriptionPrevious value: -"Viewport height in pixels"New value: +"Height in pixels" - changed
Input schema / properties / width / descriptionPrevious value: -"Viewport width in pixels"New value: +"Width in pixels"
- Changed
take_snapshot4 fields changed- changed
Input schema / properties / includeAttributes / descriptionPrevious value: -"Include detailed ARIA and computed attributes in output (default: false)"New value: +"Include ARIA attributes (default: false)" - changed
Input schema / properties / includeText / descriptionPrevious value: -"Include text content in output (default: true)"New value: +"Include text (default: true)" - changed
Input schema / properties / maxDepth / descriptionPrevious value: -"Maximum depth of tree to include (default: unlimited)"New value: +"Max tree depth" - changed
Input schema / properties / maxLines / descriptionPrevious value: -"Maximum number of lines to return in output (default: 100)"New value: +"Max lines (default: 100)"
- Changed
upload_file_by_uid2 fields changed- changed
Input schema / properties / filePath / descriptionPrevious value: -"Local filesystem path to the file to upload"New value: +"Local file path" - changed
Input schema / properties / uid / descriptionPrevious value: -"The UID of the file input element"New value: +"File input UID from snapshot"
24 tool updates
- First observed
accept_dialog - First observed
clear_console_messages - First observed
clear_snapshot - First observed
click_by_uid - First observed
close_page - First observed
dismiss_dialog - First observed
drag_by_uid_to_uid - First observed
fill_by_uid - First observed
fill_form_by_uid - First observed
get_network_request - First observed
hover_by_uid - First observed
list_console_messages - First observed
list_network_requests - First observed
list_pages - First observed
navigate_history - First observed
navigate_page - First observed
new_page - First observed
resolve_uid_to_selector - First observed
screenshot_by_uid - First observed
screenshot_page - First observed
select_page - First observed
set_viewport_size - First observed
take_snapshot - First observed
upload_file_by_uid
TDQS
Scored across 32 tools
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.
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.
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.
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
Related MCP Connectors
Automate cloud Chrome—navigate, click, type, screenshot, run code, record screen video
Programmatic headless browser sessions: create, interact, browse, and extract - rendered in a real
- TabfleetOAuthcom.tabfleet
Launch, inspect, control, and share isolated cloud browsers for your agents.
Hosted browser for AI agents: screenshots, post-JS DOM, console, WCAG. No install, no API key.
Related MCP Servers
- AlicenseCqualityDmaintenanceProvides Firefox browser automation capabilities through Playwright, allowing control of Firefox from MCP-enabled applications with features for basic automation and advanced multi-tab debugging.2930MIT
- AlicenseAqualityCmaintenanceDrive 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.4143 npm2MIT
- FlicenseNot gradedqualityBmaintenanceLocal-first browser automation for LibreWolf, enabling controlled profile browsing with status, navigation, screenshots, console/network inspection, and more through MCP.-
- FlicenseAqualityBmaintenanceModel Context Protocol server for automating Firefox via WebDriver BiDi, enabling page navigation, snapshots, input, network monitoring, and console debugging for AI agents in MCP clients.311,584 npm-