firefox-devtools-mcp
Firefox DevTools MCP
WebDriver BiDi(Selenium WebDriver 経由)を使用して Firefox を自動化するための Model Context Protocol サーバーです。Claude Code、Claude Desktop、Cursor、Cline などの MCP クライアントで動作します。
リポジトリ: https://github.com/mozilla/firefox-devtools-mcp
注: この MCP サーバーはローカルの Firefox ブラウザのインストールを必要とし、glama.ai のようなクラウドホスティングサービス上では実行できません。ローカルで実行するには
npx firefox-devtools-mcp@latestを使用するか、提供されている Dockerfile を使用して Docker を利用してください。
要件
Node.js ≥ 20.19.0
Firefox 100 以上がインストールされていること(自動検出されます。または
--firefox-pathを渡してください)
Related MCP server: gecko-mcp
Claude Code でのインストールと使用 (npx)
npm から公開されている最新バージョンを常に実行できるように、npx の使用を推奨します。
オプション A — Claude Code CLI
claude mcp add firefox-devtools npx firefox-devtools-mcp@latestオプションは引数または環境変数として渡します。例:
# Headless + viewport via args
claude mcp add firefox-devtools npx firefox-devtools-mcp@latest -- --headless --viewport 1280x720
# Or via environment variables
claude mcp add firefox-devtools npx firefox-devtools-mcp@latest \
--env START_URL=https://example.com \
--env FIREFOX_HEADLESS=trueオプション B — Claude Code 設定 JSON の編集
Claude Code 設定ファイルに追加します:
macOS:
~/Library/Application Support/Claude/Code/mcp_settings.jsonLinux:
~/.config/claude/code/mcp_settings.jsonWindows:
%APPDATA%\Claude\Code\mcp_settings.json
{
"mcpServers": {
"firefox-devtools": {
"command": "npx",
"args": ["-y", "firefox-devtools-mcp@latest", "--headless", "--viewport", "1280x720"],
"env": {
"START_URL": "about:home"
}
}
}
}オプション C — ヘルパースクリプト (ローカル開発ビルド)
npm run setup
# Choose Claude Code; the script saves JSON to the right pathMCP Inspector で試す
npx @modelcontextprotocol/inspector npx firefox-devtools-mcp@latest --start-url https://example.com --headlessその後、以下のようなツールを呼び出します:
list_pages,select_page,navigate_pagetake_snapshotを実行してからclick_by_uid/fill_by_uidlist_network_requests(常時キャプチャ),get_network_requestscreenshot_page,list_console_messages
CLI オプション
フラグまたは環境変数(右側に記載)を渡すことができます:
--firefox-path— Firefox バイナリへの絶対パス--headless— UI なしで実行 (FIREFOX_HEADLESS=true)--viewport 1280x720— 初期ウィンドウサイズ--profile-path— 特定の Firefox プロファイルを使用--firefox-arg— 追加の Firefox 引数(繰り返し可能)--start-url— 開始時にこの URL を開く (START_URL)--accept-insecure-certs— TLS エラーを無視 (ACCEPT_INSECURE_CERTS=true)--connect-existing— 新しく起動する代わりに、既に実行中の Firefox に接続 (CONNECT_EXISTING=true)--marionette-port— 既存接続モード用の Marionette ポート、デフォルト 2828 (MARIONETTE_PORT)--pref name=value—moz:firefoxOptionsを介して起動時に Firefox 設定を設定(繰り返し可能)--enable-script— ページコンテキストで任意の JavaScript を実行するevaluate_scriptツールを有効化 (ENABLE_SCRIPT=true)--enable-privileged-context— 特権コンテキストツールを有効化: 特権コンテキストのリスト/選択、特権スクリプトの評価、Firefox 設定の取得/設定、拡張機能のリスト。MOZ_REMOTE_ALLOW_SYSTEM_ACCESS=1が必要 (ENABLE_PRIVILEGED_CONTEXT=true)
--prefに関する注意: Firefox が自動化で実行される際、テスト用にブラウザの動作を変更する RecommendedPreferences が適用されます。--prefオプションを使用すると、必要に応じてこれらのデフォルトを上書きできます。
既存の Firefox への接続
--connect-existing を使用して、Cookie、ログイン情報、開いているタブを維持したまま、実際のブラウジングセッションを自動化します:
# Start Firefox with Marionette enabled
firefox --marionette
# Run the MCP server
npx firefox-devtools-mcp --connect-existing --marionette-port 2828または、起動のたびに Marionette を有効にするには、about:config (または user.js) で marionette.enabled を true に設定してください。
BiDi 依存機能(コンソールイベント、ネットワークイベント)は既存接続モードでは利用できません。その他の機能はすべて通常通り動作します。
警告: 通常のブラウジング中に Marionette を有効にしたままにしないでください。
navigator.webdriver = trueが設定され、他のブラウザフィンガープリント信号が変更されるため、Cloudflare や Akamai などで保護されたサイトでボット検出がトリガーされる可能性があります。MCP 自動化が必要なときのみ Marionette を有効にし、その後 Firefox を通常通り再起動してください。
ツール概要
ページ: list/new/navigate/select/close
スナップショット/UID: take/resolve/clear
入力: click/hover/fill/drag/upload/form fill
ネットワーク: list/get (ID 優先、フィルタ、常時キャプチャ)
コンソール: list/clear
スクリーンショット: page/by uid (CLI 環境用にオプションで
saveToを指定可能)スクリプト: evaluate_script
特権コンテキスト: 特権("chrome")コンテキストのリスト/選択、evaluate_privileged_script (
MOZ_REMOTE_ALLOW_SYSTEM_ACCESS=1が必要)WebExtension: install_extension, uninstall_extension, list_extensions (リストには
MOZ_REMOTE_ALLOW_SYSTEM_ACCESS=1が必要)Firefox 管理: get_firefox_info, get_firefox_output, restart_firefox, set_firefox_prefs, get_firefox_prefs
ユーティリティ: ダイアログの accept/dismiss、履歴の戻る/進む、ビューポートの設定
Claude Code 用のスクリーンショット最適化
Claude Code CLI でスクリーンショットを使用する場合、base64 画像データがコンテキストを大幅に消費する可能性があります。代わりに saveTo パラメータを使用してスクリーンショットをディスクに保存してください:
screenshot_page({ saveTo: "/tmp/page.png" })
screenshot_by_uid({ uid: "abc123", saveTo: "/tmp/element.png" })保存されたファイルは、コンテキストサイズに影響を与えることなく、Claude Code の Read ツールで表示できます。
ローカル開発
npm install
npm run build
# Run with Inspector against local build
npx @modelcontextprotocol/inspector node dist/index.js --headless --viewport 1280x720
# Or run in dev with hot reload
npm run inspector:devテスト
npm run test:run # all tests once (unit + integration)
npm test # watch mode特定のテストスイートの実行、E2E シナリオの網羅範囲、既知の問題については docs/testing.md を参照してください。
トラブルシューティング
Firefox が見つからない:
--firefox-path "/Applications/Firefox.app/Contents/MacOS/firefox"(macOS) または OS 上の正しいパスを渡してください。初回実行が遅い: Selenium が BiDi セッションをセットアップするためです。2回目以降は高速になります。
ナビゲーション後に UID が古くなる: UID ツールを使用する前に、新しいスナップショット (
take_snapshot) を取得してください。Windows 10: MCP サーバー 'firefox-devtools' の検出中にエラー - MCP error -32000: Connection closed
解決策 1
cmd /cでラップする (詳細):"mcpServers": { "firefox-devtools": { "command": "cmd", "args": ["/c", "npx", "-y", "firefox-devtools-mcp@latest"] } }解決策 2
npxへの絶対パスを使用する(セットアップに合わせて拡張子.cmd,.bat,.exe,.ps1を調整してください):"mcpServers": { "firefox-devtools": { "command": "C:\\nvm4w\\nodejs\\npx.ps1", "args": ["-y", "firefox-devtools-mcp@latest"] } }
バージョニング
1.0 未満の API: バージョンは
0.xから始まります。最新リリースには npx で@latestを使用してください。
CI とリリース
CI、リリース、npm 公開用の GitHub Actions が含まれています。詳細および必要なシークレットについては docs/ci-and-release.md を参照してください。
問題と貢献
問題は Bugzilla の product: Developer Infrastructure, component: AI for Development で追跡されています。
質問や議論については、#firefox-devtools-mcp Matrix ルーム に参加してください。
作者
Mozilla によって保守されています。
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 indicate readOnlyHint=false. The description adds that the tool accepts dialogs and optionally supplies prompt text, but does not detail failure modes (e.g., no dialog present) or other side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with zero wasted words, effectively conveying the core action and key parameter context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one optional parameter and no output schema, the description covers the main use case well, though it lacks mention of error conditions or behavior for non-prompt dialogs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%. The description's mention of 'promptText' is redundant with the schema's own description, adding no new meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it accepts browser dialogs and provides prompt text for prompts, distinguishing it from the sibling 'dismiss_dialog' which cancels dialogs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is implied (use to accept dialogs, provide text for prompts), but no explicit when-to-use or when-not-to-use guidance is given, nor alternatives mentioned beyond the sibling tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clear_downloadsA
Clear the tracked downloads buffer.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided. The description implies a destructive action (clearing) but does not disclose whether it affects ongoing downloads, whether it is reversible, or what happens to in-progress downloads.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, front-loaded with action. No unnecessary words; exceptionally concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with no parameters and no output schema, the description is adequate but lacks behavioral context such as irreversibility or impact on other operations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist (schema coverage 100%). The description is not required to add parameter meaning, baseline 4 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses specific verb 'Clear' and resource 'tracked downloads buffer', clearly stating the action. It distinguishes from siblings like list_downloads and set_download_behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives. No mention of prerequisites, side effects, or typical use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clear_snapshotC
Clear snapshot UIDs. Usually not needed.
| 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_uidC
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 indicate readOnlyHint=false, implying mutation, but the description adds no behavioral context (e.g., whether it triggers navigation, waits for elements, or has side effects). Missing transparency beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with two short sentences. No fluff, but it lacks structure (e.g., bullet points or clear separation of purpose vs. usage). Slightly under-specified for a UI interaction tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and a simple click action, the description should mention post-click behavior or caveats (e.g., waiting, viewport requirements). It is incomplete for an AI agent to use confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for both parameters. The description adds negligible value—'Set dblClick for double-click' repeats the schema's 'Double-click (default: false)'. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Click element by UID') and distinguishes from sibling tools like hover_by_uid or fill_by_uid. However, it is minimal and does not elaborate on scope or behavior beyond the name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives (e.g., hover_by_uid) or prerequisites (e.g., needing a snapshot). The description assumes context that an agent may lack.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
close_pageA
Close tab by index.
| Name | Required | Description | Default |
|---|---|---|---|
| pageIdx | Yes | Tab index to close |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already set readOnlyHint=false, so the description's 'close' action is consistent. However, the description adds no additional behavioral context beyond what the annotation provides, such as consequences of closing a tab (unsaved work, triggering beforeunload events). This is adequate but not exemplary.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, compact sentence that perfectly conveys the tool's purpose. Every word is necessary, and there is no extraneous information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low complexity (single parameter, no output schema) and annotations present, the description is minimally adequate. However, it lacks context about edge cases such as closing the last tab (might close browser) or invalid index, which would help an agent anticipate behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the parameter's description in the schema ('Tab index to close') already explains its role. The tool description 'Close tab by index' redundantly states the same information. No additional meaning is added beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Close tab by index' is a specific verb+resource combination. It clearly states the action (close) and the target (tab) with a method (by index). It distinguishes from sibling tools like 'navigate_page' or 'new_page'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives. It does not specify prerequisites (e.g., tab must exist) or when not to use (e.g., avoid closing active tab unexpectedly). The sibling list includes many page actions, but no explicit comparison.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dismiss_dialogB
Dismiss browser dialog.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate that this is a non-read-only (mutating) action. The description adds no further behavioral details, such as what happens to the dialog, side effects, or required state.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise—two words—with no fluff. Every word is necessary and earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple parameterless tool, the description is minimal but lacks context about which dialogs are targeted, whether dismissal is always possible, or any potential outcomes. More context would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters and schema coverage is 100%. The description adds no unnecessary param information, which is appropriate for a parameterless tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Dismiss') and the resource ('browser dialog'), but fails to differentiate from the sibling tool 'accept_dialog', which performs a similar but distinct action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like 'accept_dialog', or any prerequisites or conditions for dismissal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
drag_by_uid_to_uidB
Drag element to another (HTML5 drag events).
| 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 provides some insight into the behavior, but it does not disclose the specific events dispatched, whether it waits for drop, or any side effects. The annotation readOnlyHint=false already indicates mutation, but the description adds minimal additional behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence of six words, containing no fluff. It efficiently conveys the core action and the event type. Every word is purposeful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple drag tool with two parameters and no output schema, the description is adequate but not exhaustive. It could mention the outcome (e.g., source element is dragged to target) or error conditions (e.g., element not found, not draggable). Nonetheless, the schema and name fill in some gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides full descriptions for both parameters (source UID and target UID). The description adds no further semantic value beyond implying the direction of drag. Baseline of 3 is appropriate given 100% schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it performs a drag action using HTML5 drag events, distinguishing it from sibling tools like click_by_uid or hover_by_uid. However, it could be more explicit about source and target elements, though the parameter names clarify this.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool vs alternatives or when not to use it. It simply describes the action without providing context such as prerequisites (e.g., elements must be draggable) or alternatives (e.g., using keyboard or mouse events).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
evaluate_scriptA
Run a JS function in the page and return its result. Prefer this for targeted reads (a value, text, computed style, whether an element exists) instead of a full take_snapshot. Use the UID interaction tools for clicking, typing, and filling.
| 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_uidC
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?
Annotations indicate it's not read-only, consistent with fill. But no additional disclosure about behavior: e.g., whether it clears existing value, what happens if element is not found, or if it supports only text inputs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Too brief (6 words) and leaves out critical details. Not earning its place; under-specification.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, so description should explain return behavior (success/failure). It does not. Also missing context about element type constraints.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for both parameters. Description adds no extra meaning beyond schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the action (fill) and the resource (text input/textarea by UID). It distinguishes from sibling tools like click_by_uid, hover_by_uid, and fill_form_by_uid.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool over alternatives, such as fill_form_by_uid or upload_file_by_uid. No exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fill_form_by_uidB
Fill multiple form fields at once.
| 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 indicate readOnlyHint=false, so the tool mutates state. The description adds no further behavioral details such as error handling, field validation, or whether the form is submitted. More context would aid safe invocation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, brief sentence that conveys the core purpose without redundancy. While very concise, it could benefit from slightly more detail, but it remains front-loaded and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (1 parameter, no output schema) and annotations present, the description adequately states the purpose but lacks details on execution behavior, side effects, or result expectations, leaving it just barely adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers 100% of the parameter (`elements`), providing full structure and descriptions. The description does not add extra meaning beyond what the schema provides, meeting the baseline for full coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('fill') and resource ('multiple form fields'), and the phrase 'at once' distinguishes it from the sibling tool 'fill_by_uid' which likely handles single fields.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives like 'fill_by_uid' or other form-related tools. The description only implies usage for multiple fields but does not contrast or provide conditions for use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_firefox_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?
Annotations already declare readOnlyHint true, making the safe, non-destructive nature clear. The description adds value by detailing the specific information returned (binary path, env vars, output file location), beyond what annotations alone provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single, well-structured sentence that conveys all necessary information without superfluous words. Information is front-loaded with the verb and resource.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, parameterless tool, the description is complete. It lists typical fields returned and clearly indicates the tool's purpose. No output schema is needed as the description covers the key outputs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist, and schema coverage is 100% (empty schema). Baseline for zero parameters is 4, and the description does not need to add parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves configuration information including binary path, environment variables, and output file location. It uses a specific verb 'Get' and resource 'Firefox instance configuration', distinctly differentiating it from sibling tools that perform actions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use versus alternatives like get_firefox_output. The readOnlyHint annotation implies safe retrieval, but the description does not specify context or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_firefox_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 description states the tool is read-only ('Retrieve', 'Returns'), consistent with the readOnlyHint annotation. It adds that output comes from a 'capture file' and includes stderr, crashes, etc., but lacks details on side effects (e.g., does it clear the file?), resource constraints, or prerequisites.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences that first state the tool's purpose in detail, then give a usage recommendation. No wasted words; front-loaded with key information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the input parameters adequately and mentions return content type. However, with no output schema, the return format is vague ('recent output') – agents may need to know if it's plain text, JSON, etc. Adequate but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with inline descriptions for all three parameters. The description adds a generic tip ('Use filters') but no additional meaning beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description specifies the verb 'Retrieve', the resource 'Firefox output', and details the content type (stdout/stderr including MOZ_LOG, warnings, crashes, stack traces). It clearly distinguishes from sibling tools which are all UI or page actions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Use filters to focus on specific content' implies use of the grep parameter but does not explicitly state when to use this tool versus alternatives or provide exclusion criteria. However, the tool is unique among siblings, making its use case straightforward.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_page_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_uidC
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?
Annotations indicate non-read-only, but description adds no behavioral details (e.g., event triggering, visibility requirements). Minimal value beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single, front-loaded sentence with no waste. However, could be slightly expanded without sacrificing conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequate for a simple action tool with one parameter and no output schema, but lacks context on hover behavior (e.g., simulation vs real mouse event).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. Description adds no new meaning beyond the schema's 'Element UID from snapshot'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the action (hover) and resource (element by UID). It is specific but does not explicitly distinguish from sibling tools like 'click_by_uid'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives (e.g., click_by_uid, fill_by_uid). The agent must infer from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
install_extensionA
Install a Firefox extension using WebDriver BiDi webExtension.install command. Supports installing from archive (.xpi/.zip), base64-encoded data, or unpacked directory.
| 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?
Annotations already indicate the tool is not read-only (readOnlyHint=false), which aligns with the install action. However, the description adds no further behavioral context, such as side effects, required permissions, failure modes, or whether installation modifies browser state permanently.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the primary action, and every phrase adds value. No redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has no output schema, so the description should ideally mention the return value (e.g., extension ID) or error behavior. It does not, but it covers the core functionality adequately. Slightly incomplete for a mutation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema provides 100% parameter descriptions, and the description adds context: it explains the three 'type' options (archivePath, base64, path) with file extensions and clarifies the 'permanent' parameter as Firefox-specific requiring signed extensions. This complements the schema effectively.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (install), the resource (Firefox extension), and the method (WebDriver BiDi webExtension.install). It also lists supported sources (archive, base64, unpacked), making the tool's purpose distinct from siblings like uninstall_extension.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use (for installing extensions) but lacks explicit guidance on when not to use or prerequisites (e.g., Firefox must support BiDi, signed vs. temporary). No mention of alternatives among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_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?
Annotations already indicate readOnlyHint=true; description adds key behavioral details (tracked since startup, includes status and file path) without contradicting annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single, concise sentence with no unnecessary words; every part of the description adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but description mentions status and file path; could mention return format or pagination, but adequate for a straightforward list tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with good parameter descriptions; the description adds no additional semantic value beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it lists downloads tracked since startup, including status and file path, which distinguishes it from siblings like clear_downloads or set_download_behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool vs alternatives; however, the purpose is straightforward and context is implied by sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_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 behavioral context by noting that the selected tab is marked. Together, they provide clear transparency without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that communicates the tool's purpose and output without unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simplicity (no parameters, no output schema), the description fully specifies the tool's behavior and return content (index, title, URL, marked selected tab).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With zero parameters, the baseline is 4. The description does not need to add parameter details, and the schema coverage is 100% (no params).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb (list), resource (open tabs), and the information provided (index, title, URL) with the additional detail that the selected tab is marked. This distinguishes it from sibling tools like 'close_page' or 'navigate_page'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives (e.g., when to use 'select_page' or 'close_page'). It only describes the tool's functionality without usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
new_pageA
Open new tab at URL. Returns tab index.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Target URL |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only provide readOnlyHint=false. Description adds the return behavior ('Returns tab index'), which is behavioral information beyond what annotations provide. However, no details on error handling, loading state, or tab limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, each carrying essential information. No filler, front-loaded with the core action. Perfectly concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with full schema coverage and no output schema, the description adequately covers the return value. The tool's role among siblings is clear from context. No gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema already describes the 'url' parameter as 'Target URL' with 100% coverage. The description does not add additional meaning (e.g., accepted formats, protocols, validation rules). Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'Open new tab at URL' with a specific verb and resource. It unambiguously represents the tool's action and distinguishes it from siblings like navigate_page (navigate current tab) and select_page (switch to existing tab).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Description implies usage is for creating a new tab given a URL, but no explicit guidance on when to use versus alternatives (e.g., when to open a new tab vs navigate existing tab). No exclusions or contextual conditions provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_uid_to_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?
Annotations set readOnlyHint=false, consistent with a mutation. The description adds important behavioral context: 'All current tabs will be closed.' It also mentions the ability to change binary path and environment variables, which are key side effects. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no redundancy. Each sentence provides distinct information: the action, the configurable items, and the consequence (tab closure). It is efficient and front-loaded with the core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 6 parameters fully described in the schema and no output schema, the description covers key context: closing tabs. However, it omits prerequisite info like MOZ_REMOTE_ALLOW_SYSTEM_ACCESS=1 for prefs, which appears only in parameter schema. Still sufficient for most use cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description summarizes parameters ('binary path, environment variables, and other options') but adds no new information beyond the schema's individual field descriptions. It does not enhance understanding of parameter relationships or constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (Restart) and the resource (Firefox) with the purpose of changing configuration. It distinguishes from sibling tools like navigate_page or close_page, which do not restart the browser. The mention of 'All current tabs will be closed' provides a specific behavioral outcome.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not provide explicit guidance on when to use this tool versus alternatives. It implicitly suggests use for restarting with different config, but lacks 'when not to use' or comparisons to siblings. The uniqueness of the tool among siblings makes the purpose clear, but guidelines are minimal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
screencast_startA
Start recording a screencast (video) of the current page viewport, saving the output to a file in the downloads directory. Returns a screencast id to pass to screencast_stop. Multiple recordings can run at once.
| 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?
Beyond annotations (readOnlyHint=false), description adds that recording saves to a file, returns an ID, and supports multiple concurrent recordings. Does not mention potential performance impact or file overwrites.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences, each providing essential information: action, output, ID usage, concurrency. No redundant text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, description adequately states return type. Parameters are fully covered in schema. Could mention file naming or overwrite behavior but not required.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline 3. Description does not add meaning beyond schema; it only implies viewport-related defaults but doesn't elaborate on parameter usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it starts recording a screencast of the viewport, saving to a file, and returns an ID. It distinguishes from sibling tools like screenshot_page (static image) and screencast_stop (stops recording).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly mentions saving to downloads, returning an ID for stopping, and that multiple recordings can run at once. Does not explicitly state when not to use (e.g., for static screenshots), but sibling tools imply alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
screencast_stopA
Stop an in-progress screencast recording started with screencast_start and finalize the video file. Returns the path to the saved file.
| 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?
Annotations declare readOnlyHint=false, so the tool is known to be a write operation. The description adds that it finalizes the video file and returns the path, providing useful behavioral context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is only two sentences, front-loaded with the primary action, and contains no superfluous words. It efficiently conveys the purpose and return value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (no required parameters, clear return value), the description is nearly complete. It covers the action, return value, and conditional parameter usage. It could mention error behavior if no recording is active, but it is not necessary.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the tool description does not add additional meaning to the parameter beyond what the schema already provides. The baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (stop and finalize) and the resource (screencast recording). It distinguishes from the sibling tool screencast_start by specifying that it stops an in-progress recording.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description indicates the tool is used after screencast_start and specifies when the parameter is optional ('when exactly one recording is active'). It does not explicitly mention when not to use it, but the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
screenshot_by_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?
The description is consistent with the readOnlyHint annotation (read operation) and adds the output format (base64 PNG). However, it does not go beyond the annotations or provide additional behavioral context like the tool's effect or limitations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise at one sentence with no fluff, front-loading the core action and output format. It could be improved by adding a brief note on when to use it, but it is well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple two-parameter schema and readOnlyHint annotation, the description is complete enough. It doesn't require output schema because output is described. It could mention that UID comes from snapshot, but the schema already does.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both parameters. The description does not add extra meaning beyond the schema, meeting the baseline for adequate coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Capture', the resource 'element screenshot by UID', and the output format 'base64 PNG'. It effectively distinguishes from sibling tools like 'screenshot_page' which captures the full page, not an element.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives (e.g., screenshot_page for full page screenshots). There is no mention of prerequisites or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
screenshot_pageBRead-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?
Annotations already declare readOnlyHint=true, so the description does not need to state that it's a read operation. The description adds output format (base64 PNG), which is useful. However, it does not describe what the return value looks like or any side effects (e.g., does it capture full page or viewport?). With annotations providing some transparency, a score of 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise and front-loaded: one sentence that captures the essence. No superfluous information. Score 5 for efficient structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simplicity of the tool (one optional parameter, no output schema), the description provides minimal but adequate context: purpose and output format. However, it lacks details like whether it captures the full page or viewport, and does not mention related tools. For a tool with annotations, it is moderately complete but leaves some gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage for the only parameter 'saveTo', with a detailed explanation. The tool description does not add any extra meaning beyond the schema. Thus, baseline 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Capture page screenshot') and the output format ('base64 PNG'), which is specific and informative. However, it does not distinguish from the sibling tool 'screenshot_by_uid', which likely captures a specific element. Score 4 because it is clear but lacks sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool vs. alternatives like 'screenshot_by_uid' or other screenshot-related tools. There is no mention of context, when-not-to-use, or prerequisites. This is a significant gap for an agent to decide between similar tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
select_pageA
Select active tab by index, URL, or title. Index takes precedence.
| 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?
Annotations indicate readOnlyHint=false, but the description does not disclose side effects (e.g., changing active tab), error handling, or what happens if no match is found. More detail on behavioral traits is needed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: one sentence with no fluff. Every word contributes essential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema is provided, and the description does not explain return values or behavior when all parameters are omitted. For a tool with no required parameters, this gap reduces completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema already covers 100% of parameter descriptions. The description adds value by stating 'Index takes precedence,' clarifying priority when multiple parameters are provided.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool selects the active tab using one of three criteria (index, URL, title), which is a specific verb-resource combination. It distinguishes well from sibling tools like navigate_page or list_pages.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use it (to select a tab), but lacks explicit guidance on when not to use it or alternatives. The precedence rule is noted but no context for choosing among criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_download_behaviorA
Control how downloads are handled: allow (save silently to the default download directory), deny (cancel), or reset to default. Avoids the native save-file dialog. Requires a recent Firefox.
| 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. It discloses the effect (avoiding dialog, requiring Firefox) but does not detail whether changes are immediate, persist, or affect in-progress downloads. It is adequate but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: two sentences deliver the purpose, options, side effect (avoiding dialog), and a prerequisite. No superfluous words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter, the description covers the main behavior and a key prerequisite. It could mention that the setting persists until changed, but it is largely complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers the parameter with a description. The tool description adds explanatory context like 'save silently to the default download directory' and 'reset to default', enhancing understanding beyond the schema's brief descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool controls download handling with three modes: allow, deny, or reset to default. It distinguishes itself from sibling download tools like list_downloads and clear_downloads by focusing on behavior control.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description mentions that it avoids the native save-file dialog and requires a recent Firefox, giving context for when to use it. However, it does not explicitly state when not to use it or compare with alternatives beyond the implied contrast with other download tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_viewport_sizeC
Set viewport dimensions in pixels.
| 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?
Although annotations indicate this is a write operation (readOnlyHint: false), the description adds no additional behavioral context. It does not disclose whether the change affects subsequent screenshots, navigation, or other operations, nor does it mention any limitations or side effects. With annotations present, the description could have provided more value but falls short.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise at one sentence (4 words). It contains no unnecessary words and gets straight to the point. However, it is so brief that it sacrifices some helpful context, preventing a perfect score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (two parameters, no output schema), the description is minimally adequate. However, it lacks context about what 'viewport' refers to (e.g., current page or global setting) and does not mention any dependencies or effects. While it satisfies the basic need, it is not fully complete for an agent to use confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage with descriptions for each parameter ('Width in pixels', 'Height in pixels'). The description adds no extra meaning beyond the schema, so a baseline score of 3 is appropriate. No constraints or additional semantics are provided.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (set) and the resource (viewport dimensions) with units (in pixels). It is specific and distinct from sibling tools like screenshot or navigation functions, which don't involve resizing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. There is no mention of prerequisites, side effects, or context such as whether it applies to the current page or all pages. The agent is left to infer usage from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
take_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?
Description matches annotation (readOnlyHint=false) but adds no extra behavioral traits beyond the action itself. Annotations already signal mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no redundant words, efficient and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-param tool, it covers the action, prerequisite, and command. No output schema needed; could mention error possibilities, but adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers parameter fully; description adds an example format, enhancing clarity beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it uninstalls a Firefox extension using WebDriver BiDi command. Distinguishes from siblings like install_extension and list_extensions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States prerequisite: requires extension ID from install_extension or list_extensions. No explicit exclusions or alternatives, but context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_file_by_uidB
Upload file to file input by UID.
| 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?
Annotations only indicate non-readOnly, but description doesn't add behavioral details like what happens on failure, required permissions, or file size limits. Minimal insight beyond the action itself.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single, front-loaded sentence with no unnecessary words. Efficiently conveys core function.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, and description doesn't explain return behavior or error handling. For a file upload tool, additional context (e.g., file type restrictions, success confirmation) would be expected.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers 100% of parameters with descriptions. Description adds no extra meaning; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the action (Upload file), target (file input), and identifier (by UID). It distinguishes from sibling tools like fill_by_uid which handle text inputs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool vs alternatives, no prerequisites mentioned (e.g., need page snapshot with UID, file existence). Sibling tools like fill_by_uid are not referenced.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
1 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
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
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Automate cloud Chrome—navigate, click, type, screenshot, run code, record screen video
Hosted browser for AI agents: screenshots, post-JS DOM, console, WCAG. No install, no API key.
61Stealth web automation for AI agents. Login, signup, navigate, screenshot.
Stealth web automation for AI agents. Login, signup, navigate, screenshot.
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
- AlicenseAqualityAmaintenanceDrive 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.411051MIT
- 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.312,085-
Appeared in Searches
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/mozilla/firefox-devtools-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server