firefox-bidi-mcp
Controls a real Firefox instance over WebDriver BiDi, providing browser automation and management tools across 17 domains, including page interaction, tabs and windows, bookmarks and history, settings, extensions, DevTools, translations, certificates, networking, and browser chrome contexts.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@firefox-bidi-mcpopen example.com and take a screenshot"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
firefox-bidi-mcp
通过 WebDriver BiDi 控制真实 Firefox 的 MCP server —— 177 个 browser_* 工具,覆盖网页、标签页、窗口、书签历史、设置、扩展、DevTools、翻译、证书等 17 个域。
An MCP server that drives a real Firefox over WebDriver BiDi.
特点
只有一条通道:一条 BiDi WebSocket 同时服务页面操作与浏览器内核层(chrome 上下文),不需要自研浏览器扩展
覆盖面广:从点击输入、截图、网络,到改 prefs、装扩展、读书签历史与证书
写操作有标记:每个工具带 MCP
annotations,客户端可据此对写操作/破坏性操作要求确认不劫持你的浏览器:启动脚本永远另起实例,不会接管正在运行的 Firefox
Related MCP server: mcp-server-webdriver
前置条件
Node.js ≥ 20
Firefox(Developer Edition,或任何支持 WebDriver BiDi 的版本)
需要访问浏览器内核层时,Firefox 必须以
MOZ_REMOTE_ALLOW_SYSTEM_ACCESS=1启动
安装
git clone https://github.com/XuanZhiYouXuan2025/firefox-bidi-mcp.git
cd firefox-bidi-mcp
npm install
npm run build启动 Firefox
仓库自带启动脚本,它只负责「起一个新实例」,不会连接已在运行的浏览器:
node scripts/launch-firefox.mjs --profile <profile目录> --port 9222--profile必填;脚本从不猜档案路径(跑错档案比直接报错更糟)默认带
MOZ_REMOTE_ALLOW_SYSTEM_ACCESS=1;加--no-system-access可关闭(届时只能用页面层工具)已经在跑的 Firefox 不要再用它启动,直接连它的 BiDi 端口
接入 MCP 客户端
任何支持 stdio 传输的客户端都行:
{
"mcpServers": {
"browser": {
"command": "node",
"args": ["<绝对路径>/firefox-bidi-mcp/dist/index.js"],
"env": { "DSH_BROWSER_BIDI_PORT": "9222" }
}
}
}端口是怎么定的
按顺序取第一个可用的:DSH_BROWSER_BIDI_PORT → ~/.firefox-devtools-mcp/instances/<pid>.port(取最新)→ 9222。
环境变量沿用
DSH_前缀,但它们与 DeepSeek Harness 没有强绑定,任何客户端都能用。
其他可选变量:DSH_BROWSER_MAX_OUTPUT_CHARS(默认 1000000)、DSH_BROWSER_OUTPUT_DIR(默认系统临时目录,用于放超大结果)。
工具
177 个 browser_* 工具的分组速查见 skills/firefox-bidi-mcp/references/tools.md。
⚠️ 该文件由 npm run gen-docs 从 src/index.ts 生成,不要手改;要加工具请改源码后重跑。
Firefox 内部 API 的反直觉行为、工具实现层面的坑、会话泄漏的处置,见 docs/gotchas.md —— 按需查,不是必读。
安全模型
工具用 MCP
annotations标注:readOnlyHint: false表示会改变状态,destructiveHint: true表示影响超出当前会话(改 prefs、导航等)是否要求确认由客户端决定,浏览器侧不强制
本 server 能读写 profile 数据(书签、历史、登录库、cookie)—— 请自行评估运行环境与目标档案
已知限制
一个 Firefox 实例同时只能有一个 BiDi 会话;客户端异常退出会泄漏会话,此时只能重启 Firefox
browsing-contextid 每次session.new后都会变,不要缓存用
Stop-Process -Force这类硬杀会跳过优雅退出,照样泄漏会话;优先关 stdin /SIGINT/SIGTERM
给 DSH 用户(可选)
仓库内的 skills/firefox-bidi-mcp/ 是一个 DeepSeek Harness 技能,记录了这个 server 的使用纪律。非 DSH 用户不需要它;DSH 专属内容(技能安装、实例占着浏览器时的处置、与 Cua 配合做「真人输入」)见 docs/dsh-integration.md。
# Windows:把技能以 junction 挂进 DSH 的 skills 目录
./scripts/install-skill.ps1 -DshHome <你的 DSH_HOME>开发
npm run build # tsc 编译到 dist/
npm run gen-docs # 从源码重新生成 tools.md许可证
Available Tools
178 toolsbrowser_a11y_treeRead the accessibility tree of a pageARead-only
Walk the accessibility tree through the DevTools accessibility front and return a bounded outline of roles and names. MEASURED: getRoot() does NOT exist on the front — the path is target.getFront("accessibility") then getWalker() (the front also offers getTraits/getSimulator/bootstrap). Useful for checking labels, roles and whether controls are exposed to assistive tech.
| Name | Required | Description | Default |
|---|---|---|---|
| maxDepth | No | How deep to walk (default 4) | |
| maxNodes | No | Node budget (default 100) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
It provides significant behavioral transparency by specifying the technical path to the accessibility front, which is not covered by annotations. It also explicitly defines the output as a 'bounded outline,' managing expectations about the return value.
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 well-structured and concise, front-loading the core functional description. It uses technical detail where necessary but remains highly focused on the tool's unique capabilities.
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 that the tool interacts with a complex, internal DevTools accessibility front, the description is extremely complete by including the exact chain of commands required to access the required data.
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 coverage is 100% for both `maxDepth` and `maxNodes`, meaning the schema provides all necessary semantic information. The description does not add additional semantic value beyond clarifying that these parameters manage the bounds of the accessibility walk.
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?
While the description is clear, it does not explicitly name alternative tools like `browser_dom_tree` to help the agent decide when *not* to use this specific accessibility walker. The usage guidance is implied rather than prescriptive.
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 highly valuable context for correct usage by detailing the required implementation path: `target.getFront("accessibility") then getWalker()`. This technical guidance is crucial for the agent's success in the execution environment.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_about_page_infoRead the text content of an opened about: pageARead-only
Report the title and visible text of an already-open about: page, so a caller can confirm the internal page actually rendered instead of assuming it did. MEASURED: about:processes starts with an empty table skeleton and fills in asynchronously, so this may need calling again after a short wait.
| Name | Required | Description | Default |
|---|---|---|---|
| page | Yes | about: page name, e.g. processes | |
| maxChars | No | How much text to return (default 600) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds genuinely useful measured behavior beyond readOnlyHint: about:processes renders asynchronously and may need a repeat call. It does not describe what happens when no matching about: page is open or how maxChars truncation manifests, which would round out the picture.
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 tight sentences: the purpose first, then the empirically measured caveat. Nothing is repeated from the annotations or schema, and every clause carries 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?
With no output schema, the description does name the return content (title and visible text), and the async caveat covers the main failure mode. Edge cases such as an unopened or non-matching about: page are left unaddressed.
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 both page and maxChars are already documented with examples and bounds. The description's "visible text" wording mildly reinforces what maxChars controls but adds no format or syntax detail 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?
States a concrete verb and resource (report the title and visible text of an about: page) and the qualifier "already-open" implicitly separates it from browser_open_about_page. An agent can immediately tell this reads an existing page rather than creating one.
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?
Gives a clear usage motive (confirm the internal page actually rendered rather than assuming) plus retry guidance after a short wait. It lacks an explicit "do not use for" clause or a naming of alternatives, but the context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_accept_popup_notificationPress a popup notification buttonA
Press the main action of a doorhanger notification by id — for example accepting "Save password?". Get ids from browser_list_popup_notifications. This is the programmatic equivalent of the human clicking the button in the browser UI.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Notification id from browser_list_popup_notifications |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=false already flags a mutating call; the description goes further by explaining that only the main/primary action is triggered, that this is equivalent to a human click, and that the effect is a real decision such as accepting a password save. It doesn't cover failure behavior for stale/unknown ids or what the call returns, but it adds meaningful context 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?
Three short sentences: action, id source, and a behavioral analogy, with the core action front-loaded. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter mutating tool with no output schema, the description covers what it does, where the id comes from, and what the effect is. Nothing essential for correct invocation is missing.
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% and the single parameter's own description already points to browser_list_popup_notifications, so the description adds no new syntax or format detail. Baseline 3 applies since the schema does all the work.
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 gives a specific verb+resource ("press the main action of a doorhanger notification by id") and an example use case (accepting "Save password?"). It clearly distinguishes itself from browser_list_popup_notifications, but not from the adjacent browser_handle_prompt sibling, which an agent might confuse with 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?
It explicitly tells the agent where the required id comes from (browser_list_popup_notifications), which is the key selection prerequisite. It does not, however, state when-not to use it or how it relates to browser_handle_prompt for generic dialogs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_activate_tabSwitch to a tabA
Make a tab the active one (browsingContext.activate). Pass its context id from browser_list_tabs, or an index among the tabs. Useful before typing or clicking, since input goes to the active tab.
| Name | Required | Description | Default |
|---|---|---|---|
| index | No | 0-based tab index instead of a context id | |
| context | No | Context id of the tab to activate |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The only annotation is readOnlyHint=false, which the description is consistent with, and it adds the important behavioral fact that subsequent input is routed to the active tab. However, it does not say what happens to the previously active tab, whether the window is raised/focused, or how an out-of-range index or stale context id is handled.
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 tight sentences: the action and identifier sources come first, followed by the practical rationale. Nothing is redundant or buried.
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 two-optional-parameter state-change tool with no output schema, this covers what it does, how to identify the tab, and why it matters. Minor gaps around error/failure behavior and focus side effects keep it just short of 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% and both parameters are already documented, including that index is an alternative to a context id. The description adds only provenance ('from browser_list_tabs'), so the baseline of 3 applies rather than a higher score.
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?
States a specific verb and resource ('Make a tab the active one') and even names the underlying API (browsingContext.activate). It is clearly distinguishable from siblings like browser_list_tabs, browser_new_tab, or browser_close_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?
Gives a concrete use condition — call it before typing or clicking because input goes to the active tab — and points to browser_list_tabs as the source of the context id. It stops short of stating exclusions (e.g. when activation is unnecessary or fails), so it is strong but not fully complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_add_bookmarkAdd a bookmarkADestructive
Insert a bookmark (PlacesUtils.bookmarks.insert) and return its guid, which is what browser_remove_bookmark needs. Defaults to the bookmarks menu; pass the toolbar or unfiled guid to target those instead.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL to bookmark | |
| title | Yes | Bookmark title | |
| parentGuid | No | Parent folder guid (default: the bookmarks menu, "menu________") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true; the description adds value beyond that by naming the underlying PlacesUtils call, disclosing the default parent folder, and stating that a guid is returned. It does not cover edge behavior such as what happens when the URL is already bookmarked or on invalid guids, so it is not fully transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, both load-bearing: the first establishes action and return value, the second establishes default and alternative targeting. No filler or restated title 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?
For a three-parameter, fully documented write tool with no output schema, the description covers action, default parent, targeting options, and the return contract (guid). It leaves duplicate-handling and failure behavior unstated, which is the only meaningful gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is a 3; the description earns above that by explaining the semantic effect of parentGuid (defaults to the bookmarks menu, alternate targets are toolbar and unfiled) rather than just restating its name. It omits the literal guid strings for toolbar/unfiled, leaving the agent to discover them from browser_bookmark_folder.
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?
States a specific verb and resource ("Insert a bookmark") plus the underlying API call, and distinguishes itself from the removal counterpart by noting the returned guid is what browser_remove_bookmark needs. An agent can tell this apart from browser_remove_bookmark, browser_list_bookmarks, and browser_bookmark_folder without opening schemas.
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 gives the default targeting behavior (bookmarks menu) and the condition for choosing otherwise (pass toolbar or unfiled guid), and explains the downstream use of the returned guid. It stops short of routing against other bookmark-management siblings such as browser_bookmark_manage or browser_bookmark_folder.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_add_loginSave a loginADestructive
Save a username/password pair in the Firefox password manager. MEASURED: nsILoginInfo.init needs a formActionOrigin (or an httpRealm) — adding without one fails with "Can't add a login without a httpRealm or formActionOrigin"; this tool defaults formActionOrigin to the origin. The password is written to the browser, never echoed back.
| Name | Required | Description | Default |
|---|---|---|---|
| origin | Yes | Origin the login belongs to (e.g. https://example.com) | |
| password | Yes | Password (written to the browser, not echoed) | |
| username | Yes | Username | |
| formActionOrigin | No | Form action origin (defaults to origin) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag this as non-read-only and destructive, so the description adds genuine value by disclosing the failure mode ('Can't add a login without a httpRealm or formActionOrigin'), the defaulting behavior, and that the password is written to the browser and never echoed back.
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 compact sentences, front-loaded with the purpose, then the constraint. The 'MEASURED:' framing is a slightly internal tic but each sentence carries real information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a four-parameter mutation with annotations and no output schema, the description covers the operation, the likely failure condition, and credential handling. It stops short of stating the return behavior (e.g., whether a login ID comes back) or duplicate-handling, which would make it 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%, so baseline is 3; the description goes beyond it by explaining why formActionOrigin matters (the nsILoginInfo.init requirement and the httpRealm alternative) and by reinforcing that password is write-only, which the schema only states tersely.
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?
Specific verb plus resource: 'Save a username/password pair in the Firefox password manager.' An agent can tell this persists credentials rather than filling a page (browser_fill_login) or listing existing entries (browser_list_logins), though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description never says when to choose this over browser_fill_login, browser_import_logins, or browser_import_logins_from_file, nor what prerequisites exist (e.g., profile unlocked, existing duplicate logins). Only an internal init constraint is mentioned, which is not usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_add_search_engineAdd a custom search engineBDestructive
Install a user-defined search engine. MEASURED: SearchService from moz-src:///toolkit/components/search/SearchService.sys.mjs exposes addUserEngine(formInfo) — the simplest of the four add paths (addOpenSearchEngine needs a full OpenSearch URL, addSearchEngine needs an engine object, addEngineFromExtension needs an add-on). formInfo takes name plus a URL template containing {searchTerms}.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL template containing {searchTerms} | |
| name | Yes | Engine display name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true, so the agent knows this mutates persistent state; the description adds nothing about what gets persisted, whether the engine becomes default, or how to remove it. The 'MEASURED:' provenance and internal API details describe implementation rather than observable behavior, which is of limited value at selection time.
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 core definition is correctly front-loaded in the first sentence, but the remaining text spends its budget on internal source-file paths and a taxonomy of unused SearchService methods that do not help an agent invoke this tool. That is padding relative to the two parameters involved.
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 two-parameter tool with full schema coverage, no output schema, and annotations covering the mutation safety profile, the description covers what is needed to call it. The main remaining gap is the absence of any note on persistence, default-engine interaction, or reversibility for a destructive operation.
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 both params are already documented in the schema, including the {searchTerms} requirement. The description restates that formInfo takes a name plus a URL template containing {searchTerms}, confirming no additional fields are needed, but adds no syntax or format detail beyond the schema — baseline 3.
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 opening sentence gives a specific verb and resource ('Install a user-defined search engine'), which is unambiguous. It differentiates itself against internal SearchService add paths (addOpenSearchEngine, addSearchEngine, addEngineFromExtension) but never distinguishes itself from MCP siblings such as browser_search_engine or browser_get_search_engine, which is what an agent actually chooses between.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains why this path is the simplest of four implementation options, which implies the use case (a plain name + URL-template engine), but gives no explicit when-to-use or when-not-to-use guidance against sibling tools that also touch search engines. Usage must be inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_autofill_dataList or edit saved form-autofill addressesADestructive
Read and write the saved form-autofill ADDRESSES (not passwords). MEASURED: resource://autofill/FormAutofillStorage.sys.mjs exports formAutofillStorage, a FormAutofillStorage instance with .addresses and .creditCards; the addresses store exposes add/update/removeMany/getAll-style methods, so this is writable (contrary to an earlier note that only status was reachable). NOTE: the profile may serve addresses from the Rust store depending on extensions.formautofill.addresses.storage.rust.* prefs.
| Name | Required | Description | Default |
|---|---|---|---|
| guid | No | Address guid, for remove | |
| action | Yes | What to do | |
| fields | No | Address fields for add, e.g. {"given-name":"Ada","organization":"DSH"} |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true, and the description goes beyond them by documenting the actual backing module, confirming writability, and warning that storage may be served from the Rust store depending on extensions.formautofill.addresses.storage.rust.* prefs. It still does not say what remove does to existing data or whether it is recoverable.
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 purpose is front-loaded in the first sentence, but the 'MEASURED:' investigative narration and the aside about 'an earlier note' are meta-commentary that costs the agent reading time without helping it select or invoke the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, multi-action mutation tool with no output schema, the description covers writability and a backend caveat but omits what list returns, whether remove is irreversible, and whether add fails without required fields. Just enough to call it, not enough to call it 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 description coverage is 100% and already explains guid (for remove), the action enum, and the fields object with an example, so baseline is 3. The description adds no parameter-level detail 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?
States a specific verb pair (read/write) and a precise resource (saved form-autofill addresses), and explicitly excludes passwords, which distinguishes it from browser_list_logins and browser_autofill_status. It does not name any sibling tool outright, so it stops short of full sibling routing.
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 first sentence implies the use case (viewing or editing saved autofill addresses) but never says when to choose this over browser_autofill_status or the login tools, nor what prerequisites exist. The Rust-store note is context, not selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_autofill_statusReport whether form autofill is available and enabledARead-only
Report the address / credit-card autofill state. MEASURED: resource://autofill/FormAutofill.sys.mjs loads and exposes isAutofillEnabled, and FormAutofillStorage.sys.mjs also loads. This only reports status — the stored address and card records live behind the autofill storage API, which this build does not expose for remote write, so treat editing saved autofill entries as out of scope.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it read-only, and the description adds useful context about what is actually measured: the autofill module loading and exposing isAutofillEnabled. It also discloses the significant limitation that stored records are not writable through this build, though it does not describe the exact return shape.
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 core purpose is front-loaded in the first sentence, followed by measurement and scope caveats. It is reasonably concise, though the specific module paths are somewhat implementation-heavy for an agent-facing description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read-only status tool, the description covers purpose, measurement basis, and scope limitations. It does not fully specify the returned status fields, which matters slightly more because no output schema exists.
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 takes zero parameters, so parameter semantics are minimal. The baseline for a parameterless tool is 4, and there is no parameter-related misinformation.
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?
States a specific verb and resource: report the address/credit-card autofill state. It clarifies this is status-only and explicitly rules out editing saved autofill entries, which helps separate it from data-manipulation siblings, though it does not name an alternative tool.
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 clear boundary: this tool only reports status, and editing saved autofill entries is out of scope because remote write is not exposed. It does not explicitly route the agent to a named sibling alternative, but the exclusion is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_bookmark_backupList or create bookmark backupsADestructive
List the JSON bookmark backups in the profile and optionally create a new one. MEASURED: the module is resource://gre/modules/PlacesBackups.sys.mjs and exports PlacesBackups with getBackupFiles / getMostRecentBackup / saveBookmarksToJSONFile / create / getBookmarkCountForFile. Note PlacesUtils.importFromHTML / exportToHTML do NOT exist in this build, so HTML import/export is unavailable — JSON backup is the supported path.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | list = show existing backups; create = write a new one |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true, and the description correctly signals that 'create' writes a new file, so there is no contradiction. However it never explains what the destructive flag means in practice — whether an existing backup is overwritten, where files are written, or whether the operation is reversible — and the export-symbol listing is implementation detail rather than agent-facing behavior.
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 purpose is front-loaded in a single clear sentence, which is good structure. The remainder is a module path plus an export-symbol inventory ('getBackupFiles / getMostRecentBackup / saveBookmarksToJSONFile / create / getBookmarkCountForFile') that costs tokens without changing how an agent would call the 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?
With no output schema, the description is the only source for what 'list' returns, and it never says (file paths? names? timestamps?). For a simple one-parameter tool this is a modest but real gap; the note ruling out HTML export is the main value added.
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 is a single parameter with 100% schema description coverage and an inline enum explanation ('list = show existing backups; create = write a new one'). The description merely restates those two actions, adding no format, naming, or scope detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a concrete verb+resource ('List the JSON bookmark backups in the profile and optionally create a new one'), which is unambiguous. The closing note that HTML import/export is unavailable implicitly separates this tool from the bookmarks_export/import siblings, though it never names them directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear operational context: use list to inspect existing backups, create to write a new one, and it steers the agent away from an HTML path that does not exist in this build. It stops short of explicitly naming sibling tools (browser_bookmarks_export, browser_bookmarks_import) or stating when a backup should be taken.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_bookmark_folderCreate, rename or remove a bookmark folderADestructive
Manage bookmark FOLDERS (the existing bookmark tools only handle individual bookmarks). MEASURED: PlacesUtils.bookmarks exposes insert/update/remove/search/fetch, and the root folders are addressed by the well-known guids (toolbar____, menu________, unfiled_____, root________). Removing a folder removes its contents, so check the child count first with action:"list".
| Name | Required | Description | Default |
|---|---|---|---|
| guid | No | Folder guid, for rename / remove | |
| title | No | Folder title, for create / rename | |
| action | Yes | What to do | |
| parent | No | Where to create it (default: menu) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, but the description adds genuinely additive context beyond them: the blast radius of removal (children are deleted too), the well-known root GUIDs used to address toolbar/menu/unfiled/root, and the backing API surface. It does not cover permissions or what the list action returns, so not a 5.
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 tight sentences, front-loaded with the resource and the sibling differentiation, then the safety caveat. The 'MEASURED:' prefix is terse internal jargon that costs a little readability but every sentence carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter mutation tool with full schema coverage, no output schema, and annotations already flagging destructiveness, the description supplies the missing pieces: scope vs siblings, destruction of children, and root GUID addressing. Only the shape of the 'list' response is left unstated, which is a minor gap given there is no output schema.
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 earns above that by explaining that root folders are addressed by fixed GUIDs (toolbar____, menu________, etc.), which materially changes how an agent supplies the `guid` and `parent` parameters, and by tying `action:"list"` to the child-count check.
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?
States the resource precisely ('bookmark FOLDERS') and explicitly distinguishes itself from the sibling bookmark tools that 'only handle individual bookmarks', which is the key disambiguation an agent needs. The verb is generic ('Manage') and the concrete actions (create/rename/remove/list) live in the title and the action enum rather than the description body, keeping it just short of a 5.
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?
Gives a concrete pre-condition for destructive use: 'Removing a folder removes its contents, so check the child count first with action:"list"' — that is real when-to-do-what guidance including a recommended tool sequence. It also implicitly scopes the tool against the individual-bookmark siblings, though it does not address the other folder-capable sibling (browser_bookmark_manage).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_bookmark_manageMove, edit, search or tag bookmarksADestructive
The management half of bookmarks that browser_add_bookmark / remove_bookmark / bookmark_folder do not cover. MEASURED: PlacesUtils.bookmarks.update(info) accepts guid plus parentGuid/index for a move, or title/url for an edit; bookmarks.search({query}) finds by title or URL; PlacesUtils.tagging.tagURI/untagURI/getTagsForURI handle tags. NOTE: fetchTree is NOT implemented in this build, so listing stays on search({parentGuid}).
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | New URL, for update; or the URL to tag/untag | |
| guid | No | Bookmark guid, for move / update / tag / untag | |
| tags | No | Tags to apply or remove | |
| index | No | Destination index for move | |
| query | No | Search text, for search | |
| title | No | New title, for update | |
| action | Yes | What to do | |
| parentGuid | No | Destination folder guid for move ("toolbar_____", "menu________", "unfiled_____") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is covered; the description adds useful build-level context (fetchTree unimplemented, so listing must use search). It still does not say what each action affects (e.g. that untag strips tags irreversibly or that update overwrites the existing title/url), which is the most valuable disclosure for a destructive multi-action tool.
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, front-loaded with the purpose and sibling boundary before implementation detail. The "MEASURED:" framing and API call signatures are slightly heavier than an agent needs, but nothing is padding.
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 an 8-parameter, action-dispatching mutation tool with no output schema and thin annotations, the description covers the underlying API semantics, the action-parameter relationships, and a notable capability limitation. What is missing is per-action guidance on required parameter combinations and what search returns.
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 each parameter already states which action it serves ("for move", "for update", "for tag/untag"), so the description's mapping of guid+parentGuid/index to move and title/url to edit largely restates the schema. Baseline 3 is appropriate given the schema carries the load.
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 names the concrete operations (move via parentGuid/index, edit via title/url, search, tag/untag) and frames itself as "the management half of bookmarks," which is a specific verb+resource statement. It explicitly distinguishes itself from browser_add_bookmark, browser_remove_bookmark, and browser_bookmark_folder, so an agent can route correctly without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the boundary against the sibling bookmark tools (add/remove/folder) and adds a routing hint that listing should go through search({parentGuid}) because fetchTree is unavailable. It does not explicitly say when to prefer update versus move beyond the parameter mapping, but the context for use is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_bookmarks_exportExport bookmarks as Netscape HTMLADestructive
Write the bookmark tree to a Netscape Bookmark HTML file. That is the format Chrome, Edge and Safari also export, so it is how bookmarks move between browsers. MEASURED: Firefox has no usable exportToHTML in this build, so this walks PlacesUtils.bookmarks.search({parentGuid}) recursively and builds the HTML itself. TWO TRAPS: item.url is a URI object (read .spec), and search({parentGuid}) also returns the parent folder itself which must be skipped or the walk never ends.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute .html file path to write | |
| maxNodes | No | Node budget (default 2000) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true. The description adds implementation context such as the recursive walk and lack of usable exportToHTML, but never states whether an existing file is overwritten, what permissions are needed, or what the call returns.
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 purpose is front-loaded and the opening sentence is efficient. However, the "MEASURED" note and "TWO TRAPS" section consume substantial space on internal implementation details that do not help an agent select or invoke the tool, so the description is less concise than it could be.
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 annotations and complete input schema, the description is mostly sufficient: it establishes what the tool writes and why. It still omits caller-facing details such as overwrite behavior and return value, keeping it below fully 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%, so path and maxNodes are already documented in the input schema. The description mentions parentGuid and item.url only as internal implementation details, not as caller-facing parameter semantics, making baseline 3 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 names a specific action and target: "Write the bookmark tree to a Netscape Bookmark HTML file," and adds the output format. It does not explicitly contrast with bookmark-related siblings like browser_bookmark_backup or browser_bookmarks_import, so it falls short of full 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?
It gives a clear use case: cross-browser bookmark movement via the same format Chrome, Edge and Safari export. It does not state exclusions or name alternative tools, so it lacks the explicit when-not and alternative routing of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_bookmarks_importImport a Netscape HTML bookmark fileADestructive
Read a Netscape Bookmark HTML file and recreate its folders and links under a chosen bookmark folder. MEASURED: Firefox has no importFromHTML in this build, so this parses the file with DOMParser and calls PlacesUtils.bookmarks.insert per item. Import is one level of grouping: each opens a folder and the following entries land inside it, which matches how browsers export a single grouping level.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute .html file to read | |
| parentGuid | No | Destination folder guid (default: bookmarks menu) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag this as a non-read-only, destructive write, and the description adds real context beyond that: the build has no importFromHTML, so it parses with DOMParser and calls PlacesUtils.bookmarks.insert per item, and only one level of grouping is recreated. That grouping limitation is exactly the kind of behavioral trait an agent needs. It omits what happens on re-import of duplicates or on malformed files, which keeps it off a 5.
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, front-loaded with the action and then the two behavioral facts that matter. The DOMParser/PlacesUtils implementation detail is borderline trivia but is framed as measured evidence of a capability gap, so it earns most of its space.
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 exists, and the description never says what the call returns, how partial failures are reported, or whether existing bookmarks in the target folder are preserved. For a destructive multi-item write tool, that leaves meaningful gaps even though the parsing and grouping behavior is well covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters are documented in the schema. The description restates the destination concept ('under a chosen bookmark folder') and that the file is read, but adds no format, default, or validation detail 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 names a specific verb plus resource — read a Netscape Bookmark HTML file and recreate its folders and links under a chosen folder — which distinguishes it from single-item siblings like browser_add_bookmark and inverse operations like browser_bookmarks_export. It stops short of explicitly naming those siblings as alternatives, so it lands at a strong 4 rather than 5.
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 is implied by the input format: you use this when you have a Netscape Bookmark HTML file to bring in. The description never states when to prefer it over browser_add_bookmark or browser_bookmark_backup, nor any prerequisites or exclusions, leaving the agent to infer the scenario.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_certificate_manageInspect certificates and manage certificate exceptionsCRead-only
Read the certificate database and manage per-host certificate exceptions. MEASURED: nsIX509CertDB offers addCert / getCerts / importCertsFromFile (removeCert is absent in this build), and nsICertOverrideService offers rememberValidityOverride / clearValidityOverride / clearAllOverrides. Clearing all overrides is irreversible, so it requires confirm:true.
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | Host for remember/clear override | |
| port | No | Port (default 443) | |
| action | Yes | What to do | |
| confirm | No | Required true for clear-all-overrides |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, yet the description describes mutation of browser state: adding overrides, clearing overrides, and an explicitly irreversible 'clear-all-overrides' operation. This directly contradicts the annotation. The incidental facts (removeCert absent in this build) are useful but cannot offset a false read-only claim.
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 purpose is front-loaded in the first clause. The second sentence is a dense 'MEASURED:' block of internal API names (addCert/getCerts/importCertsFromFile, rememberValidityOverride/clearValidityOverride) whose value to an agent choosing an action is marginal, though the note that removeCert is absent 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?
With no output schema, the description never indicates what 'list' or 'list-overrides' return, which matters for a read-heavy tool. It does cover the destructive-action precondition, but a mutation tool with a contradictory read-only annotation leaves an agent unable to form a correct safety model.
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 host/port/action/confirm are already documented, including the confirm requirement. The description restates the confirm:true precondition and names the nsI APIs behind each action but adds no syntax or default detail beyond the 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?
States a concrete verb pair and resource: read the certificate database and manage per-host certificate exceptions, with the underlying APIs enumerated. It never differentiates from siblings like browser_list_cert_overrides or browser_relax_certificate_checks, so an agent cannot tell which one is the intended entry point from the description alone.
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 statement of when to pick this tool over browser_list_cert_overrides, browser_list_certificates-style siblings, or browser_relax_certificate_checks. The only conditional ('clearing all overrides ... requires confirm:true') is a parameter rule, not usage guidance relative to alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_clear_cacheClear the HTTP cacheADestructive
Clear the on-disk HTTP cache (Services.cache2.clear). Pass origin to clear just that site, or domain to clear a base domain. Without arguments the whole HTTP cache is cleared, which is a separate operation from browser_clear_data (that one goes through ClearDataService and can also clear cookies/storage).
| Name | Required | Description | Default |
|---|---|---|---|
| domain | No | Only clear this base domain (example.com) | |
| origin | No | Only clear this origin (https://example.com) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive/mutating behavior, and the description adds useful context: the operation targets the on-disk cache and is a different mechanism from ClearDataService. It stops short of stating irreversibility or whether in-memory cache or active tabs are affected.
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, front-loaded with the core action and scoping rules. Dense but every clause carries information; the parenthetical API names are mildly noisy but justify the sibling distinction.
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?
With only two optional params, no output schema, and annotations covering the safety profile, the description supplies nearly everything needed: defaults, per-scope behavior, and sibling routing. Missing only confirmation of what persists after the clear and how it relates to browser_clear_site_cache.
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, but the description adds real semantics beyond the schema: it explains the domain-vs-origin distinction in prose and, critically, what omitting both parameters does (whole-cache clear). That default behavior is not obvious from the schema alone.
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?
States a specific verb and resource ('Clear the on-disk HTTP cache'), names the underlying API, and explicitly separates itself from browser_clear_data by describing the different service path. An agent can identify exactly what this does without opening the schema.
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?
Gives clear conditional routing: use origin for a single site, domain for a base domain, no args for the whole cache, plus an explicit exclusion against browser_clear_data. The one gap is that browser_clear_site_cache, the semantically closest sibling in the list, is never mentioned or distinguished.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_clear_dataClear stored data for one siteADestructive
Delete stored data for ONE host or origin (ClearDataService). Requires host or origin — there is no "clear everything" path here on purpose, because that is not something to trigger by accident. Clears cookies, storage and caches belonging to that site.
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | Host to clear, e.g. "127.0.0.1" | |
| origin | No | Origin to clear, e.g. "http://127.0.0.1:8099" | |
| dataTypes | No | Space separated data types to clear (default: cookies, storage and cache) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, so the safety profile is covered; the description adds real value by specifying the exact data categories destroyed (cookies, storage, caches) and the deliberate single-site scoping. It stops short of stating irreversibility, whether open tabs need reloading, or container/context interaction.
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, front-loaded with the verb and the scope constraint, then the safety rationale. The design-rationale clause is slightly chatty but earns its place by deterring accidental global deletion.
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?
A destructive tool with annotations, fully documented params, and no output schema needs scope, destruction set, and safety framing — all present. Missing: whether the call is irreversible, and its effect on a currently loaded page versus persisted profile data.
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 baseline is 3, but the description adds a constraint absent from the schema: one of host or origin must be supplied. Note this conflicts with the schema's required: 0, leaving ambiguity about enforcement.
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?
Specific verb+resource ("Delete stored data") with an explicit scope qualifier ("ONE host or origin") and an enumeration of what is removed (cookies, storage, caches). It does not, however, distinguish itself from near-identical siblings such as browser_clear_site_cache or browser_delete_cookies, so the agent must infer the difference.
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?
"There is no 'clear everything' path here on purpose" is a useful when-not signal, but it never names the alternative (browser_clear_cache) or the narrower cookie-only sibling. Usage context is implied rather than routed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_clear_site_cacheClear cached data for one site (not the whole cache)ADestructive
Clear cached data for a SINGLE site instead of the whole cache. MEASURED: this needs ClearDataService from resource://gre/modules/ClearDataService.sys.mjs, constructed with new, then deleteDataFromSite(site, {}, isUserRequest, flags, callback). Two traps: the site argument is a SCHEMELESS site (example.com, not https://example.com/), and the callback must be an object with onDataDeleted(resultFlags) — passing a plain function hangs forever. resultFlags 0 means every cleaner succeeded.
| Name | Required | Description | Default |
|---|---|---|---|
| site | Yes | Schemeless site, e.g. example.com | |
| kinds | No | What to clear (default: all caches) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false; the description adds real behavior beyond that — the schemeless-site trap, the callback-object requirement that otherwise 'hangs forever,' and the meaning of resultFlags 0. Some of this (ClearDataService, new, the exact method signature) is developer-facing internals rather than agent-actionable behavior, which keeps it from a 5.
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 key point is front-loaded well and the 'two traps' are genuinely useful, but the middle chunk detailing ClearDataService, `new`, and the full deleteDataFromSite signature is implementation detail an agent calling this tool cannot act on. That material dilutes an otherwise tight description.
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 destructive single-site clear with annotations carrying the safety profile and no output schema, the description covers scope, the critical schemeless input requirement, and success signaling (resultFlags 0). It omits details about the 'kinds' selector behavior and effects on currently loaded pages, but is otherwise sufficient to invoke correctly.
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% and the 'site' schema entry already documents the schemeless format, so the description largely restates that trap for emphasis rather than adding new semantics. The 'kinds' parameter is not elaborated beyond the schema's 'default: all caches,' so it does not compensate further.
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 opening sentence states a specific verb and resource ('Clear cached data') and explicitly scopes it to 'a SINGLE site instead of the whole cache,' which distinguishes it from the whole-cache sibling (browser_clear_cache). An agent can identify the operation and its scope without opening the schema.
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 'instead of the whole cache' implies the alternative tool and the condition that selects this one (targeted, per-site clearing). It gives clear context but never names browser_clear_cache or browser_clear_data explicitly, so there is mild inference left to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_clickClick an elementA
Click the first element matching a CSS selector with a real mouse action (pointer move, down, up) at its centre.
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Tab context id (default: the active tab) | |
| selector | Yes | CSS selector |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=false already marks this as a write-ish interaction, and the description adds genuine behavioral context the annotations do not: it dispatches a real trusted pointer sequence (move, down, up) at the element's centre, which matters for pages that distinguish trusted events. It omits failure behavior (no match, hidden element), auto-scroll, and waiting, keeping it out of 5 territory.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the action and resource, with the mechanism qualifier immediately after. Nothing is padded and nothing is buried.
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 two-parameter interaction tool with an annotation and full schema coverage, the definition covers what the tool does and how it acts on the page. It does not cover what happens when the selector matches nothing or the element is obscured, which is the main remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented in the schema. The description reinforces that the selector resolves to the first match only, but says nothing about the `context` tab-id parameter or selector syntax; 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?
States a specific verb and resource ("Click the first element matching a CSS selector") plus the mechanism ("real mouse action... at its centre"), which separates it from coordinate-based browser_mouse_action and synthetic clicks via browser_evaluate. It never names a sibling or says what it does not do (e.g. no hovering, no typing), so it falls short of a 5.
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 is only implied by the tool's obvious semantics; the description gives no when-to-use/when-not, no mention of alternatives such as browser_mouse_action for coordinate clicks or browser_hover for non-clicking pointer moves, and no prerequisites such as the element needing to be visible.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_close_extension_popupClose an open extension popupA
Close the tool-panel popup that browser_open_extension_popup opened, by hiding the widget panel. Firefox has no public "close popup" API, so this hides the panel element the popup lives in. Reports what it found and closed.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the single readOnlyHint=false annotation by disclosing the actual mechanism: there is no Firefox close-popup API, so the panel element is merely hidden. That is important context, since the popup may persist in the DOM rather than truly being destroyed, and it notes the tool reports what it found and closed.
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 short sentences, front-loaded with the action and its target, followed by the implementation caveat and the result behavior. No sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, non-destructive cleanup tool with no output schema, the description covers purpose, mechanism, the API limitation, and a hint at the return value. Nothing an agent needs in order to call it correctly is missing.
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 takes zero parameters, so there is nothing for the description to disambiguate and the baseline of 4 applies. The description correctly avoids inventing parameters.
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?
States a specific verb (close) and resource (the tool-panel popup opened by browser_open_extension_popup), and explicitly names the sibling it pairs with. An agent can distinguish this from browser_close_tab or browser_quit without opening any schema.
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 pairing with browser_open_extension_popup makes the when-to-use condition clear: close what that tool opened. It does not state a when-not-to-use case or what happens if no popup is open, but the implied context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_close_other_tabsClose every tab except oneA
Close all tabs in the window except the given one ("close other tabs" in the tab context menu). Pinned tabs are left alone, the same way the menu behaves. Use it to clean up after a series of agent tabs.
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Tab context id to keep (default: the active tab) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond the simple `readOnlyHint: false` annotation by detailing crucial operational behavior. It explicitly states that 'Pinned tabs are left alone' and that the action mimics the built-in menu, adding essential constraints that the API structure alone cannot convey.
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 definition is perfectly sized. The first sentence defines the core function and mechanism, and the second sentence adds critical constraints (pinned tabs) and use case, with zero wasted 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 complexity of the operation (closing multiple tabs based on an exclusion list), the description is completely sufficient. It covers the mechanism, the constraints (pinned tabs), and the intended use case, leaving the agent with all necessary operational information.
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 100% schema coverage, the parameter semantics are well-covered by the input schema itself. The description clarifies that the 'context' is the ID to keep, which reinforces the schema but adds minimal semantic value beyond the structured definition. Baseline score applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The purpose is perfectly clear: to close tabs while preserving a specified tab. The use of the phrase 'Close all tabs in the window except the given one' is highly specific, and mentioning the 'close other tabs' context menu reinforces its precise function.
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?
While it doesn't explicitly contrast itself against every sibling, it provides a strong 'when' context: 'Use it to clean up after a series of agent tabs.' This practical guideline helps the agent determine the appropriate operational scenario for this complex close action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_close_tabClose a tabA
Close one tab (browsingContext.close). MEASURED: this closes only that tab; the browser keeps running. Pick the tab by context id (from browser_list_tabs), by 0-based index among the tabs of the active window, or default to the active tab. The reply states how many tabs remain, and warns when none are left — at that point Firefox itself may exit.
| Name | Required | Description | Default |
|---|---|---|---|
| index | No | 0-based index among the active tabs of the active window | |
| active | No | Close the active tab (default when neither context nor index is given) | |
| context | No | BiDi context id of the tab to close (preferred) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only readOnlyHint=false available, the description carries real weight: it discloses that only the tab closes, that the browser survives, that the reply reports remaining tab count, and that Firefox itself may exit when zero tabs remain. That last point is a genuinely useful non-obvious side effect; return-format detail is the only remaining gap.
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 tight sentences with zero filler; the scoping claim comes first, then target selection, then the reply/warning behavior. Every sentence adds a distinct fact.
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 exists, yet the description describes what the reply contains (remaining tab count, warning at zero), which is exactly the missing piece. Precedence between the three optional parameters is the only thing an agent might still want spelled out.
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, but the description adds precedence and defaulting semantics ('default to the active tab') and tells the agent where context ids come from. It stops short of elaborating conflict cases such as context supplied together with index.
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?
States a specific verb and resource ('Close one tab') plus the underlying API call (browsingContext.close). The clause 'this closes only that tab; the browser keeps running' immediately separates it from browser_quit, browser_close_window, and the bulk-close siblings (browser_close_other_tabs, browser_close_tabs_by_url).
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?
Explains exactly how to select the target: context id (sourced from browser_list_tabs), 0-based index in the active window, or default to the active tab. It does not explicitly name when to prefer a bulk-close sibling instead, but the single-tab scoping makes that inference direct.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_close_tabs_by_urlClose every tab showing a URLA
Close all tabs whose URL contains the given text. MEASURED: gBrowser.closeTabsByURI takes nsIURI objects and matches them EXACTLY, so it cannot do substrings — this walks the tabs and calls removeTab instead. The value is matched as a substring against the tab URL, so "example.com" catches all of that site. Useful to clean up after a batch run without touching unrelated tabs.
| Name | Required | Description | Default |
|---|---|---|---|
| pattern | Yes | Text or regex matched against tab URLs |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only readOnlyHint=false available, the description adds meaningful behavioral context by explaining substring matching and noting that the implementation walks tabs and calls removeTab. It does not cover edge cases like pinned tabs or undo behavior, but it is substantially more informative than the annotation alone.
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 first sentence front-loads the core action, and the remaining sentences provide relevant matching and usage context. It is appropriately sized, though the internal gBrowser API detail is slightly heavier than necessary for tool selection.
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 one-parameter destructive tool with no output schema, the description covers what it does, how matching works, and a primary use case. Minor gaps remain around pinned tabs, grouped tabs, and no-match behavior, but the essential information is present.
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 baseline is 3, but the description adds important meaning: the pattern is matched as a substring, not as an exact URI or necessarily as a regex. The 'example.com' example clarifies the matching behavior well, despite a mild tension with the schema's 'text or regex' wording.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: closing all tabs whose URL contains the given text. It distinguishes itself by matching URL substrings rather than closing a single tab, though it does not explicitly name sibling tools like browser_close_tab or browser_close_other_tabs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear use case: cleaning up after a batch run without affecting unrelated tabs. It does not explicitly state when not to use it versus browser_close_tab or browser_close_other_tabs, but the context is strong enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_close_tabs_to_rightClose the tabs to the rightA
Close every tab to the right of the given one ("close tabs to the right" in the tab context menu). Pinned tabs at the end are kept, matching the menu behaviour.
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Tab context id acting as the left boundary (default: the active tab) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false; the description adds the non-obvious behavioral detail that trailing pinned tabs are preserved, matching the menu. It does not say whether closed tabs land in the recently-closed list or are otherwise recoverable, which for a bulk-close mutation would be valuable.
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 short sentences with zero waste, the scope front-loaded and the exception second. Nothing is repeated and nothing is padded.
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?
Covers scope, boundary default, and the pinned-tab exception with no output schema to explain. The one meaningful gap is recoverability of the closed tabs, which an agent deciding to call a bulk-close operation would want to know.
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% and the single optional `context` parameter already documents the left-boundary semantics and its default. The description's 'the given one' merely agrees with the schema rather than adding format or selection guidance, 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?
States a specific verb and resource ('Close every tab to the right of the given one') and anchors it to a known UI affordance in the tab context menu. This cleanly separates it from siblings like browser_close_tab, browser_close_other_tabs, and browser_close_tabs_by_url without needing to open their schemas.
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 parenthetical naming the context-menu equivalent implies the use case, and the boundary semantics are clear. However, it never explicitly contrasts itself with the nearest alternatives (browser_close_tab, browser_close_other_tabs, browser_close_tabs_by_url), leaving the routing decision to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_close_windowClose a browser windowA
Close a whole window — every tab in it (BiDi browsingContext.close on a top-level context). Without a context it acts on the active tab is NOT what happens here: it closes the window that tab belongs to, so check first. browser_close_tab closes a single tab instead.
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | A tab or window context id; the top-level window it belongs to is closed (default: active tab window) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=false only marks this as a mutation; the description carries the real weight by spelling out the blast radius — every tab in the window dies, not just the current one — and that the default target is the active tab's window. It does not say whether closed windows can be reopened or whether prompting/unload handlers intervene.
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 core fact is front-loaded, but the middle clause is garbled — 'it acts on the active tab is NOT what happens here' reads as a leftover edit and forces the reader to parse twice. A tighter phrasing would have made the same warning in half the 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 one-optional-param destructive tool with no output schema and minimal annotations, the description covers target resolution, default behavior, and the sibling boundary. Only the irreversibility/undo story is missing.
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 single context parameter is already documented, including that any tab id in the window resolves to its top-level window. The description restates the same default but adds no format or id-source details beyond the schema, so this sits at the baseline.
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?
States a specific verb and resource (close a whole window, all tabs) and grounds it in the underlying primitive (BiDi browsingContext.close on a top-level context). It explicitly separates this from browser_close_tab, so an agent can pick between them without opening schemas.
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?
Names the alternative browser_close_tab and the condition that selects it (single tab), plus a caution to 'check first' before invoking since the target is the whole window the tab belongs to. It stops short of covering other nearby destructive siblings like browser_quit or browser_close_other_tabs, so not a full routing map.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_collect_response_bodyStart capturing response bodies (experimental)A
Turn on BiDi response-body collection (network.addDataCollector). It must be switched on BEFORE the request you care about happens — a request that already completed has no body to collect. Then read it with browser_get_response_body. Measured: Firefox clones the body while handling the response-started phase, so this tool also intercepts that phase; browser_get_response_body releases the response and only then reads the body only after network.responseCompleted for that request — asking earlier blocks, and asking with no hold at all can come back as "no such network data". Clear the interception with browser_network_intercept stop when finished.
| Name | Required | Description | Default |
|---|---|---|---|
| maxSize | No | Upper bound on captured bytes per response (default 1 MB) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond readOnlyHint=false, disclosing a non-obvious side effect (it also intercepts the response-started phase because Firefox clones the body there), the blocking behavior of premature reads, and a concrete failure string ("no such network data") with its cause. It also documents the lifecycle: who holds the response, who releases it, and how to clear interception.
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 core instruction (turn it on first) is front-loaded, and every sentence carries real operational content. One clause is garbled/duplicated ("releases the response and only then reads the body only after network.responseCompleted"), which slightly hurts scannability.
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?
Covers activation, timing, reading, error modes, and teardown for a tool with no output schema, which is nearly everything needed. The notable gap is scope: it never says whether collection applies browser-wide, per-tab, or per-request-filter, and there is no tab/target parameter to infer it from.
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 maxSize is already documented there with its default of 1 MB, so a baseline 3 applies. The description says nothing about maxSize or what happens when a body exceeds the bound, adding no 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?
Names the specific action ("Turn on BiDi response-body collection") and cites the underlying primitive network.addDataCollector. It clearly separates itself from the sibling that reads the data (browser_get_response_body) and the sibling that tears down interception (browser_network_intercept stop).
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 states the ordering precondition ("must be switched on BEFORE the request you care about happens") and explains why a completed request cannot be collected. It routes the agent to browser_get_response_body for reading and to browser_network_intercept stop for cleanup, so both the when and the when-not are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_consoleOpen or close the Browser ConsoleB
Open or close the Browser Console (the Ctrl+Shift+J window that logs browser-wide messages). MEASURED: call BrowserConsoleManager.openWindow() with NO arguments — its openBrowserConsole(win) variant throws "can't access property windowRoot, win is undefined" because the manager has no commands bound outside a real DevTools context. openWindow() spawns the standalone devtools:webconsole window, which is what the menu item does.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | What to do |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false, so the description does add real context: the tool spawns a standalone devtools:webconsole window, the same thing the menu item does, and it names a known failure mode. That is useful behavioral disclosure beyond the annotation. It still says nothing about what happens when closing a console that isn't open, whether toggle is idempotent, or what the tool returns.
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 purpose is front-loaded in the first sentence, which is good. But the following two sentences are an internal API post-mortem and a verbatim thrown-error string, which do not help an agent decide to call this tool or how to fill in action, and they push the definition from a one-liner into an essay.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple: one required enum parameter, no output schema, minimal annotations. The description covers what the window is and where it appears, which is enough to call it. The remaining gap is behavioural edge cases (close when not open, toggle semantics), which is minor at this complexity.
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% (the action enum with open/close/toggle), so the baseline is 3 and the description adds no meaning about the enum values beyond the title. The 'call ... with NO arguments' note refers to an internal manager method, not the tool, and risks being misread as licence to omit the required action parameter.
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?
States a specific verb pair (open/close) and a specific resource (the Browser Console window, described as the Ctrl+Shift+J window that logs browser-wide messages). That distinguishes it from most siblings, but the nearest neighbour, browser_console_logs, is never named or contrasted, so an agent must infer the split between 'open the console window' and 'read console logs'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance at all: no statement of when an agent should open vs. close vs. toggle, no prerequisites, and no mention of the sibling that returns log content. The only 'usage' content is about an internal manager API (openWindow() vs. openBrowserConsole(win)), which is implementation trivia rather than agent-facing selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_console_logsConsole log entriesARead-only
Report console messages the page produced since this server connected (BiDi log.entryAdded). Each entry keeps the level, text and source. Buffered in memory (most recent 500) and only covers this connection, so open the page and act first, then read.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max entries, newest first (default 20) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond readOnlyHint=true: it discloses in-memory buffering, a 500-entry cap, connection-only scope, and the consequence that nothing before connect is visible. That last point is the kind of non-obvious constraint that would silently produce empty results otherwise.
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 short sentences: what it reports, what each entry contains, then the constraints and sequencing advice. Front-loaded and every sentence carries distinct 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?
With no output schema, the description compensates by naming the entry fields (level, text, source) and the retention/scope limits. Nothing an agent needs to call it correctly, or to interpret an empty result, is missing.
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 single 'limit' param already documents 'newest first, default 20'. The description adds nothing about the limit or ordering, which is fine given the schema, but it also doesn't reinforce default-vs-max behavior. Baseline 3.
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?
States a specific verb and resource ('Report console messages the page produced') and even names the underlying protocol event (BiDi log.entryAdded), so an agent knows exactly what it gets back. It doesn't explicitly contrast with the sibling browser_console, which is the one place an agent could confuse the two, so it stops short of a 5.
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?
Gives concrete operational sequencing – 'open the page and act first, then read' – which is exactly the guidance needed for a connection-scoped buffer. It's clear about context but never names an alternative tool or states when not to use it, so no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_create_containerCreate a container (user context)A
Create a new container / user context (BiDi browser.createUserContext) and return its id. The id can be passed to browser_create_container style workflows and is what isolates cookies and storage. Remove it again with browser_remove_container; containers are not the same thing as Firefox account tabs.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply readOnlyHint=false; the description carries the behavioral load and does so usefully by disclosing that the operation creates persistent state, that the new context isolates cookies and storage, and that cleanup requires a separate call. It stops short of saying whether creation is idempotent or what happens on failure, but the key mutation semantics are covered.
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?
Purpose and return value are front-loaded, but the phrase 'The id can be passed to browser_create_container style workflows' is self-referential and confusing inside browser_create_container's own description, and the trailing Firefox-account-tabs clarification is only loosely connected. One wasted/unclear clause in a short description costs it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter creation tool with no output schema, the description covers what the agent needs: what gets created, what the return value is (an id), what the id is good for, and how to undo it. A brief note on context lifetime or limits would make it fully 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 tool takes zero parameters, so there is no parameter semantics to add and the baseline applies. The description correctly implies no configuration is needed to create the context.
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?
States a specific verb and resource ('Create a new container / user context'), names the underlying BiDi primitive (browser.createUserContext), and notes the return value (its id). It also explicitly distinguishes the tool from browser_remove_container and from Firefox account tabs, so an agent can tell it apart from related siblings.
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?
Gives clear context: the returned id is what isolates cookies and storage and can be fed into follow-on workflows, and removal is routed to browser_remove_container. It doesn't mention browser_list_user_contexts or state when a container is preferable to, say, a fresh window/profile, so alternatives aren't fully enumerated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_delete_cookiesDelete cookiesADestructive
Delete cookies matching a filter (BiDi storage.deleteCookies). Give name and/or domain; with no filter it clears every cookie the session can see, which is destructive — pass at least one of them unless you mean it.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Only this cookie name | |
| domain | No | Only cookies whose domain matches |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true, and the description earns credit beyond them by spelling out exactly what gets destroyed: with no filter it clears every cookie the session can see. That is the single most important behavioral fact for this tool and it is stated plainly.
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, front-loaded with the action and its filter semantics, ending on the destructive default. No filler and no repetition of schema content.
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 two-optional-param mutation with no output schema and full annotation coverage, the description supplies the action, the filter model, and the destructive default. Nothing an agent needs to call it safely is missing.
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% and documents both optional params, so the baseline is 3. The description adds real meaning on top: the params are combinable filters and the zero-param case has a distinct, dangerous semantic (delete all) that the schema's empty required list alone would not convey.
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?
States a specific verb + resource ("Delete cookies") plus the underlying BiDi call (storage.deleteCookies), and the filter scoping immediately separates it from browser_get_cookies, browser_set_cookie, and bulk browser_clear_data. An agent can identify the operation without opening the schema.
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?
Gives explicit operational guidance: supply name and/or domain, and only omit both if you intend to wipe every visible cookie. The when-not condition is stated as a warning rather than an alternative-tool routing (e.g. vs browser_clear_site_cache), so it stops just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_devtools_closeClose the Developer Tools toolboxB
Close the DevTools toolbox for a tab, or all of them. MEASURED: gDevTools.closeToolboxForTab(tab, {destroy}) and gDevTools.closeAllToolboxes() are the entry points.
| Name | Required | Description | Default |
|---|---|---|---|
| all | No | Close every toolbox instead | |
| context | No | Tab whose toolbox to close (default: the active tab) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false, so the burden is mostly on the description, and it does convey that 'all' clobbers every toolbox rather than one. However it never says what is lost when a toolbox is closed (inspector state, unsaved console/element selections) or whether the call fails when no toolbox exists. The cited entry points add a note of implementation grounding but no behavioral consequence.
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 opening sentence is front-loaded and efficient. The second sentence spends roughly half the description quoting internal Firefox entry points, which is meta-commentary an agent cannot act on and crowds out more useful guidance such as prerequisites or the closed-state outcome.
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 two-optional-parameter tool with no output schema and only a single annotation, the description covers both call modes and the default-tab behavior. The remaining gap is what happens on success/failure and whether the tab's DevTools state is recoverable, which is a moderate rather than severe omission.
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 both `all` and `context` are already documented (including the active-tab default), and the description's phrase 'for a tab, or all of them' only restates them. The `{destroy}` token in the second sentence references an option that is not a parameter, which adds confusion rather than semantics. Baseline 3.
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?
States a specific verb and resource: 'Close the DevTools toolbox for a tab, or all of them.' An agent can distinguish this from browser_devtools_open and browser_devtools_tools by the close/open contrast. It stops short of naming those siblings explicitly, so it lands at 4 rather than 5.
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 'for a tab, or all of them' implies the two modes but never states when to use which, nor any prerequisite such as DevTools having been opened on that tab first. There is no mention of the complementary reopen path (browser_devtools_open) after closing, leaving the agent to infer the lifecycle.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_devtools_openOpen a Developer Tools panel for a tabA
Open the Firefox DevTools toolbox on a tab and select one tool panel. MEASURED: the entry point is gDevTools.showToolboxForTab(tab, {toolId}) — there is no gDevTools.openToolbox in this build. Tool ids come from browser_devtools_tools. The toolbox may open in a separate window, which is why its markup is not visible in the browser document.
| Name | Required | Description | Default |
|---|---|---|---|
| tool | Yes | Which panel to select | |
| context | No | Tab to inspect (default: the active tab) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false, so the description carries most of the burden and does add real context: the toolbox may open in a separate window, which explains why its markup isn't in the page document. That prevents a costly wrong assumption, though it doesn't say how to verify the toolbox opened or how to shut it (the close sibling handles that).
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 short sentences, front-loaded with the action. The MEASURED note about gDevTools.showToolboxForTab is somewhat implementation-facing and less actionable for an agent, but the rest is tight and earns its space.
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 two-parameter tool with no output schema, the description covers the key behavioral surprise (separate window) and the source of valid ids. The absence of return-value detail is acceptable since there is no output schema to rely on, but a hint about confirming the panel opened would complete 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?
Schema coverage is 100% with an enumerated tool id and described context parameter, so the schema already does the heavy lifting. The description's note that ids come from browser_devtools_tools is mildly useful but largely redundant since the enum is already listed.
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?
States a specific verb and resource: open the Firefox DevTools toolbox on a tab and select one panel. It also names the sibling that supplies tool ids (browser_devtools_tools), so an agent can distinguish this from the list-tools and close-toolbox siblings without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It routes the agent to browser_devtools_tools for valid tool ids and explains the default tab behavior via the schema. It doesn't state when to prefer this over browser_devtools_tools or browser_devtools_close, but the context for use is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_devtools_toolsList the DevTools panels available for a tabARead-only
List the Developer Tools panels this Firefox exposes (inspector, webconsole, jsdebugger, netmonitor, styleeditor, performance, memory, storage, accessibility, application, options) together with the id you can pass to browser_devtools_open. MEASURED: these modules live behind their own loader, not the normal ESM one — the module id is "devtools/client/framework/devtools" (no leading g) and it exports gDevTools.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already establishes the safety profile, and the description usefully confirms that the output pairs panel names with ids. However, the second sentence is internal implementation trivia (loader path, module id, exported symbol) that discloses nothing an agent needs about the tool's runtime behavior, and there is no mention of return shape or failure modes.
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 first sentence is well-structured and front-loaded with the actionable content. The trailing 'MEASURED:' note on loader internals is off-topic for a caller and adds length without helping selection or invocation.
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?
With no output schema, the description has to say what comes back, and it does: the list of panel identifiers together with the id usable with browser_devtools_open. Only the exact return structure (field names, ordering) is left unspecified.
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 takes zero parameters, so parameter semantics is trivially satisfied and the baseline of 4 applies. Nothing about arguments needs documenting beyond the empty 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?
Specific verb ('List') plus specific resource ('Developer Tools panels this Firefox exposes'), and it enumerates the panel names so the agent knows the output domain. It also distinguishes itself from siblings by naming browser_devtools_open as the consumer of the returned ids.
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 ties usage to a concrete next step: the returned ids are 'the id you can pass to browser_devtools_open', which tells the agent when to reach for this tool before opening a panel. It stops short of explicit when-not conditions or naming browser_devtools_close as an alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_dom_treeRead the DOM tree of a page through DevToolsARead-only
Walk a real DOM tree through the DevTools inspector walker and return a bounded outline. MEASURED: the path is CommandsFactory.forTab -> targetCommand.startListening -> target.getFront("inspector") -> inspector.getWalker() -> walker.getRootNode(), and the root reports nodeName "#document" with numChildren. This is the structured counterpart to browser_page_source (which returns raw HTML text) and is far cheaper for large pages.
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Tab URL fragment or context id (default: active tab) | |
| maxDepth | No | How deep to walk (default 4) | |
| maxNodes | No | Node budget (default 120) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds real context beyond that: the walk is bounded by depth/node budgets, the root is '#document' with numChildren, and the underlying inspector walker is disclosed, giving confidence about what the call actually does. It stops short of describing node payload fields or truncation behavior when budgets are hit.
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, front-loaded with the action and the output shape, then the sibling contrast. The 'MEASURED: ... -> ... -> ...' call chain is somewhat implementation trivia that consumes space, but it is compact and does convey the mechanism.
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?
There is no output schema, and the description conveys the essential return shape (outline rooted at #document with numChildren) and that it is budget-limited. It does not explain the node record fields or what happens on truncation, which is the main remaining gap for a tool with no output schema.
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 context, maxDepth and maxNodes are already fully documented with defaults and ranges in the schema. The description only reinforces the notion of a 'bounded outline' without adding per-parameter semantics, 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?
States a specific verb ('Walk a real DOM tree through the DevTools inspector walker') and a specific output ('bounded outline'), and explicitly contrasts itself with sibling browser_page_source. An agent can distinguish this from browser_page_source or browser_a11y_tree without opening any schema.
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?
Names the alternative browser_page_source and the condition that favors this tool ('far cheaper for large pages'). It does not address other plausible alternatives such as browser_evaluate or browser_a11y_tree, so it stops short of full exclusion guidance, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_download_addStart a new downloadADestructive
Begin a download of a URL to a local file. MEASURED: Downloads.createDownload exists on the module from resource://gre/modules/Downloads.sys.mjs (Downloads.getDataItem does NOT). This is the write half that browser_download_manage does not cover. Pass an absolute target path; the parent directory must exist.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | http(s) URL to download | |
| target | Yes | Absolute local file path to save to |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true, and the description is consistent with that by framing the tool as a write. It adds a real operational detail (parent directory must exist), but leaves key behaviors unexplained: whether an existing file at the target is overwritten, what the tool returns so the download can be tracked or later cancelled, and whether authentication or permissions are involved.
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 opening sentence and the path precondition both earn their place, but the middle sentence ('MEASURED: Downloads.createDownload exists on the module from resource://gre/modules/Downloads.sys.mjs ...') is internal implementation trivia that helps neither selection nor invocation and consumes roughly a third of the 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?
With no output schema, the description should tell the agent what comes back (a download handle/id) so a subsequent manage, pause, or cancel call is possible; it does not. It also omits failure modes such as invalid URLs or existing targets, leaving a mutation tool only partially specified despite the sound path precondition.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Both parameters are already fully documented in the schema at 100% coverage, so the baseline applies. The description does add one non-obvious constraint not in the schema — the parent directory must pre-exist — but offers no format details, size limits, or destination-conflict behavior beyond that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Begin a download of a URL to a local file') and explicitly distinguishes itself from the sibling browser_download_manage by calling itself 'the write half that browser_download_manage does not cover.' An agent can separate it from browser_list_downloads, browser_list_download_events, and browser_set_download_dir without opening any schema.
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?
Names the complementary alternative (browser_download_manage) and gives a concrete precondition: 'Pass an absolute target path; the parent directory must exist.' It stops short of stating the inverse condition (use browser_download_manage to list, pause, or cancel a download), so usage is strongly implied but not exhaustively framed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_download_manageRemove, clear or open entries in the download listADestructive
The management half of downloads that browser_list_downloads and set_download_state do not cover. MEASURED: the service comes from resource://gre/modules/Downloads.sys.mjs as Downloads.getList(Downloads.ALL), and that list has remove(item) / removeFinished(filter) / getAll() / add(). NOTE: Services.downloads does not exist in this build, so always go through Downloads.getList.
| Name | Required | Description | Default |
|---|---|---|---|
| index | No | 0-based index into browser_list_downloads | |
| action | Yes | What to do |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description provides deep technical context by citing the underlying source code module (`resource://gre/modules/Downloads.sys.mjs`) and specific methods like `remove(item)` and `removeFinished(filter)`. This technical insight helps an agent understand the constraints of the operation, even though annotations already flag it as destructive.
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 efficient and highly focused on its functional scope. While the technical meta-commentary ('MEASURED', 'NOTE') adds bulk, it is all necessary to prevent confusion with other tools and defines the boundaries accurately.
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 annotations (destructive/non-read-only) and high schema coverage, the description is maximally complete. It addresses the 'why' and 'how it fits' for this tool, providing essential context for an agent deciding between several related download management tools.
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?
Since schema description coverage is 100%, the schema already provides complete semantic information for the parameters (action and index). The description does not offer any additional meaningful context beyond the general usage defined in the title.
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 tool title and description clearly define its purpose as managing (removing, clearing, or opening) download entries. It excels by explicitly stating that it covers the 'management half' of downloads, a concept that immediately differentiates it from listing or setting states.
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 is exceptionally clear. The description provides explicit boundaries by referencing and contrasting itself with specific sibling tools: `browser_list_downloads` and `browser_set_download_state`. This tells the agent exactly 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.
browser_dragDrag from one place to anotherA
Perform a real mouse drag: press on the source, move in steps, release on the target. Source and target may each be a CSS selector or viewport coordinates. Step count matters for pages that track dragging (sliders, canvas) — raise steps if a plain move is not picked up. COLOR: for HTML5 drag-and-drop this will NOT produce a drop event. That is upstream bug 1515879 ("HTML5 drag and drop does not work", Remote Protocol / Marionette, filed 2018-12-21, still NEW) — EventUtils.js ends the drag session without synthesizing drop. Use browser_drag_html5 for HTML5 targets.
| Name | Required | Description | Default |
|---|---|---|---|
| toX | No | Target viewport x | |
| toY | No | Target viewport y | |
| fromX | No | Source viewport x | |
| fromY | No | Source viewport y | |
| steps | No | Intermediate move steps (default 12) | |
| context | No | Tab context id (default: the active tab) | |
| toSelector | No | Target element selector | |
| fromSelector | No | Source element selector |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false, so the description does the heavy lifting by disclosing a significant behavioral limitation: this tool does not synthesize a drop event for HTML5 drag-and-drop, and the upstream bug is identified. It also explains step-count behavior for drag-tracking pages. It does not address permissions or failure behavior, which keeps it just short of a 5.
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?
Front-loaded with the action, then the step-tuning advice, then the critical HTML5 limitation and alternative. The bug citation is verbose (includes filing date and status) but is directly relevant to the routing decision, so every sentence earns its place, albeit with some excess detail.
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 an eight-parameter mutation tool with no output schema, the description covers the mechanism, the tuning knob, the compatibility limitation, and the alternative. It does not explain selector-versus-coordinate precedence or defaults (context tab, steps), but those are fully covered by the schema at 100% coverage.
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 baseline is 3. The description adds real semantic value for `steps` by explaining why step count matters and when to raise it, beyond the schema's 'Intermediate move steps (default 12)'. Source/target selector versus coordinate duality is left to 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?
States a specific verb and mechanism: 'Perform a real mouse drag: press on the source, move in steps, release on the target.' It also explicitly distinguishes itself from the sibling browser_drag_html5, so an agent can choose between the two without opening either schema.
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?
Gives explicit when-to-use guidance (raising `steps` for pages that track dragging) and an explicit when-not-to-use rule: HTML5 drag-and-drop will not produce a drop event, so use browser_drag_html5 instead. The alternative and the condition that selects it are both named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_drag_html5Drag and drop for HTML5 drag-and-drop targetsA
Perform an HTML5 drag-and-drop by dispatching the DOM events (dragstart/dragenter/dragover/drop/dragend) with a real DataTransfer. WHY THIS EXISTS: MEASURED — the pointer-based browser_drag triggers dragstart and dragover but never drop or dragend, because BiDi only synthesizes mouse/wheel/touch (there is no Input.dispatchDragEvent as in CDP) and Firefox cancels a drag on pointer-up. This tool therefore SIMULATES the drop in page script: it works on pages that listen for the standard drag events, but it is NOT a real drag — pages that check event.isTrusted, or that require genuine OS drag semantics, will still refuse. This exists because of upstream bug 1515879: WebDriver-driven HTML5 DnD never gets a drop event.
| Name | Required | Description | Default |
|---|---|---|---|
| data | No | Payload to carry in the DataTransfer (default: the text content of the source element) | |
| mimeType | No | MIME type for the payload (default text/plain) | |
| toSelector | Yes | Element to drop onto | |
| fromSelector | Yes | Element to drag from |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond readOnlyHint=false: it discloses the exact events synthesized, that the drop is simulated in page script rather than a real drag, the underlying BiDi/Firefox limitation and upstream bug, and the resulting failure modes. This is exactly the side-effect context an agent needs before attempting a drag.
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?
Front-loads the action, then the rationale and caveats in clearly labeled clauses; dense but every part is relevant. Mild redundancy in restating the upstream-bug rationale at the end costs it a point.
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 exists, but the description makes clear what the tool does and does not achieve, and what kinds of pages it will fail on — everything an agent needs to decide whether to call it or fall back to browser_drag.
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 fromSelector, toSelector, data and mimeType (including defaults) are already documented in the schema. The description adds no per-parameter meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Perform an HTML5 drag-and-drop by dispatching the DOM events ... with a real DataTransfer') and explicitly contrasts it with the sibling pointer-based browser_drag, so an agent can pick between them without opening the schema.
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?
Gives explicit when-to-use ('works on pages that listen for the standard drag events') and when-not ('pages that check event.isTrusted, or that require genuine OS drag semantics, will still refuse'), plus the named alternative browser_drag and why it fails.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_duplicate_tabClone a tabA
Duplicate a tab, keeping its history and state (Firefox tab cloning, gBrowser.duplicateTab). The clone opens next to the original. Duplicating is the cheapest way to keep "where I was" while the agent continues in the new copy — close the extra tab when you are done.
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Tab context id to clone (default: the active tab) | |
| background | No | Open the clone in the background (default false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=false is consistent with a tool that creates a tab, and the description adds real context the annotation cannot: the clone inherits history and state and is inserted adjacent to the source tab. It also warns about leaving stray tabs open. It stops short of saying whether the source tab or the clone becomes active, which is the main behavioral unknown for an agent.
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, front-loaded with what the tool does, with the key behavioral property (history/state retained) before the operational advice. The gBrowser.duplicateTab reference earns its place by disambiguating against a plain new tab.
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 the description never says what the call returns — most importantly whether the new tab's context id is handed back so the agent can act in the clone, which its own advice ('continue in the new copy') depends on. It also leaves focus/activation behavior unstated.
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 both parameters (context, background) are already documented in structured form; baseline 3 applies. The description implies default targeting ('the active tab') and background opening only indirectly, adding little 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?
States a specific verb and resource ('Duplicate a tab') plus the defining property that separates it from browser_new_tab: it keeps history and state. The parenthetical naming gBrowser.duplicateTab anchors the exact semantics, and 'opens next to the original' pins the placement 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?
Gives a clear use case ('cheapest way to keep where I was while the agent continues in the new copy') and a follow-up instruction to close the extra tab when done. It does not explicitly name browser_new_tab as the alternative for a fresh tab, so the exclusion is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_element_screen_coordsGet the screen coordinates of an element so a native click can target itARead-only
Return the on-screen pixel centre of an element, for handing to a native input driver (Cua, SendInput). MEASURED: compute it as mozInnerScreenX/Y + getBoundingClientRect() centre, WITHOUT multiplying by devicePixelRatio — mozInnerScreen* is already in screen pixels, and scaling it again puts the cursor far off target. This exists because some browser features only react to genuine OS-level input — the DevTools eyedropper and HTML5 drag-and-drop both ignore synthesised DOM/WebDriver events, but respond normally to a real SendInput click or drag.
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Tab: a browsing context id, or any fragment of the tab URL (default: the active tab) | |
| offsetX | No | Pixels added to the centre X | |
| offsetY | No | Pixels added to the centre Y | |
| selector | Yes | CSS selector of the element |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true is consistent with a pure measurement operation, so the description correctly adds value elsewhere: it discloses the exact measurement method (mozInnerScreenX/Y + getBoundingClientRect centre) and warns against a specific failure mode (double-applying devicePixelRatio). It stops short of describing the return shape, which matters since there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, purpose first, rationale second — well front-loaded with no filler. The MEASURED clause is longer than typical but earns its length by preventing a concrete off-target-cursor bug.
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 4-param read-only geometry helper this covers the why and the how thoroughly. The remaining gap is the return value's shape (coordinate object vs. pair of numbers), which the description gestures at with 'pixel centre' but never specifies, and there is no output schema to fall back on.
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 selector, context, offsetX and offsetY. The description only reinforces the 'centre' concept and says nothing about how offsets shift the target or how the tab context is resolved, 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?
States a specific verb and resource: 'Return the on-screen pixel centre of an element', plus the consumer ('handing to a native input driver'). The clause explaining that this exists for features that ignore synthesised DOM/WebDriver events implicitly separates it from browser_click / browser_mouse_action, which are the obvious siblings an agent might otherwise reach for.
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?
Gives a concrete trigger condition: use this when a feature reacts only to genuine OS-level input, naming the DevTools eyedropper and HTML5 drag-and-drop as cases where DOM events fail. It never explicitly says 'use browser_click for ordinary clicks', so the exclusion is inferential rather than stated, but the context is clear enough to route correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_evaluateEvaluate JS in the pageA
Run an expression in the page and return its value (JSON). Promises are awaited. It can change the page, so treat it as a write.
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Tab context id (default: the active tab) | |
| expression | Yes | JavaScript expression to evaluate |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond the readOnlyHint=false annotation by explaining the mutation risk in plain terms ('it can change the page, so treat it as a write') and by disclosing that promises are awaited and the result is returned as JSON. Missing details like execution world, CSP behavior, or whether navigation can occur, but it adds genuine context on top of 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?
Three short sentences, front-loaded with the verb and return value, then mutation risk. Nothing redundant and no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description covers the critical unknowns – return shape (JSON) and async handling (promises awaited) – plus the write-risk caveat. A note on execution context or failure modes would make it complete for a high-power arbitrary-code tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both 'expression' and 'context' (default active tab) are already documented in the schema. The description adds no parameter-level meaning, 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?
States a specific verb ('Run an expression') and resource ('in the page') plus the return contract (its value, JSON). It's clearly distinguishable from siblings like browser_page_source or browser_dom_tree, though it never explicitly names an alternative to disambiguate against browser_console or browser_run_in_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?
Implied usage only – an agent infers this is the escape hatch for arbitrary JS when no dedicated tool exists. There is no explicit when-to-use statement and no named sibling as an alternative, which matters in a 150-tool namespace with browser_console and browser_run_in_extension nearby.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_extension_detailsExtension details: options page, popup, sidebarARead-only
Report what UI entry points an extension actually exposes: its options page URL, browser action popup, and sidebar panel. Read from the live manifest, because AddonManager.optionsURL is null for MV3 extensions that declare options_ui instead of options_page — a trap worth knowing.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Extension id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so safety is covered; the description adds real behavioral value by stating the data is read from the live manifest and warning that AddonManager.optionsURL is null for MV3 extensions using options_ui. It does not cover failure behavior for an unknown/invalid id, which keeps it short of a 5.
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, front-loaded with the outcome and followed by the implementation caveat. Every clause carries information; nothing is redundant with the title or annotations.
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?
With no output schema, the description usefully enumerates the three reported fields, and the manifest-source note explains where values come from. It stops short of describing return shape (e.g., nulls when no popup/sidebar exists) or error behavior, which would fully close the gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter is documented ('Extension id'), so the schema does the work. The description adds no extra meaning about the id format (GUID vs slug) or how to obtain it, which is the baseline expectation when coverage is high.
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?
States a specific verb and resource ('Report what UI entry points an extension actually exposes') and enumerates exactly what is returned: options page URL, browser action popup, sidebar panel. This clearly distinguishes it from siblings like browser_open_extension_options (which opens rather than reports) and browser_list_sidebars (which lists sidebars globally, not per-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 a discovery/inspection use case and hints at why you'd want it (MV3 options_ui cases), but never says when to use it versus browser_open_extension_options, browser_list_addons, or browser_extension_permissions. No explicit exclusions or alternative routing are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_extension_permissionsRead the permissions an extension has been grantedARead-only
Report the user-granted permissions and origin patterns of installed extensions. MEASURED: AddonWrapper exposes userPermissions.permissions (string array) and userPermissions.origins (string array), so the permission surface is readable without opening about:addons. Note this reads what is granted; it does not grant or revoke — those prompts are extension-owned UI.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Only this extension id (default: every extension) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint already declared, the description adds strong context beyond annotations: it identifies the readable permission and origin string arrays, explains that the surface is available without opening about:addons, and clarifies that granting/revoking is extension-owned UI.
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 short, front-loaded with the core action, and each sentence adds useful information: purpose, readable output shape, and the read-only limitation. There is no wasted framing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with full schema coverage and no output schema, the description is complete enough: it explains what is returned, what is not done, and why the read is possible. No important agent-facing gap is apparent.
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 single optional id parameter is already documented in the schema. The description does not add parameter-specific meaning beyond that, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: reporting user-granted permissions and origin patterns of installed extensions. It also distinguishes the read-only permission surface from granting/revoking permissions, so the agent can tell it apart from mutation-oriented permission tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly explains the context: use this to inspect granted permissions and origins, and it explicitly notes that this tool does not grant or revoke permissions. It does not name specific alternative sibling tools, so it falls short of full when-to-use/when-not/alternatives guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_extension_storageRead or write an extension private storageA
Read or write the private key/value storage of an extension (browser.storage.local) — where an extension keeps its own settings and lists. It works by opening one of the extension own pages in a background tab, running the storage call in that page context (the only place where the extension APIs exist), then closing the tab. MEASURED limitation: a page of the extension is required, so extensions without an options page cannot be reached this way.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Extension id | |
| data | No | Object to write | |
| keys | No | Keys to read or remove (read defaults to all) | |
| action | Yes | What to do |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only readOnlyHint=false available, the description earns credit by disclosing the mechanism: a background tab is opened on an extension page, the call runs in that page context, and the tab is closed. It also flags a measured reachability limitation. It stops short of saying what mutating actions destroy or what read returns.
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 dense sentences: the first defines the resource and scope, the second explains the mechanism and its limitation. No filler, and the identifying information is 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 four-parameter tool with no output schema, the description covers the mechanism, the prerequisite, and the failure mode well. The main remaining gap is what a read returns (shape of the key/value result), which would help an agent plan the follow-up call.
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 id, keys, data, and the action enum are already documented in the schema. The description adds context for the storage namespace but no parameter-level meaning (e.g., which actions require data or keys, or key semantics). 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?
States a specific verb pair (read/write) and resource (extension private key/value storage, browser.storage.local) with the added clarification that it holds settings and lists. It is distinguishable from siblings like browser_extension_details or browser_run_in_extension, though it never names those alternatives explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the resource description, and a hard constraint is given (extensions without an options page cannot be reached). However, there is no explicit when-to-use versus browser_run_in_extension or browser_extension_details, and no guidance on which action to pick for a given goal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_eyedropperStart, poll or cancel the DevTools colour picker (eyedropper)A
Drive the DevTools eyedropper / colour picker on a tab. MEASURED, and this is the whole trick: Firefox deliberately supports the eyedropper WITHOUT a toolbox (bug 1701004), so it is reachable through a standalone commands instance — CommandsFactory.forTab(tab), targetCommand.startListening(), target.getFront("inspector"), then inspectorFront.pickColorFromPage({copyOnSelect, fromMenu}). That call returns immediately and the colour arrives later as a "color-picked" event carrying color:Arg(0,"string") (see devtools/shared/specs/inspector.js); "color-pick-canceled" fires on escape. Because picking requires a real pointer press on the page, this tool starts the picker and then polls: action:"start" arms it, action:"result" reports the colour once the user has clicked, action:"cancel" aborts. The picker instance is cached on the chrome window so polling reaches the same session.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | start = arm the picker, result = read the colour, cancel = abort | |
| context | No | Tab (default: the active tab) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only readOnlyHint=false supplied, the description carries most of the burden and does it well: it discloses that the call returns immediately, that the colour arrives later as an event, that a human click on the page is required, and that the picker session is cached on the chrome window so 'result'/'cancel' reach the same instance. It does not say what 'result' returns before any click, or what happens if 'start' is called twice.
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 actionable content is buried under internal implementation trivia (CommandsFactory.forTab, targetCommand.startListening, getFront("inspector"), spec file paths, bug 1701004) that an agent can never act on. Roughly half the text is Firefox-internals archaeology rather than decision-relevant guidance, and the 'MEASURED, and this is the whole trick' framing is noise.
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?
There is no output schema, and the description does cover the return value indirectly ('reports the colour', carried as a string). For a two-parameter tool with one enum this is close to complete; the missing pieces are timeout/error behaviour rather than core capability.
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 both parameters are already documented and the enum description duplicates the schema. The description adds timing semantics to 'result' ('reports the colour once the user has clicked'), which is worth something, but adds nothing at all about the 'context' tab parameter. 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?
Opens with a specific verb+resource ('Drive the DevTools eyedropper / colour picker on a tab') and the three-action model is spelled out. It never differentiates itself from the obvious sibling browser_pick_color_at, so an agent cannot tell the two apart from the description alone.
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 start/result/cancel lifecycle is explained well, including why polling is required ('picking requires a real pointer press'). However, there is no statement of when to choose this interactive picker versus browser_pick_color_at or how to recover if the user never clicks (timeout/abandon), which is exactly the failure mode of a poll-based tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_fill_loginType credentials into a login formA
Type a username and password into a form using real keystroke input (not a scripted value assignment), then optionally submit. This is the "you give me credentials, I fill them" path — the agent types what it was given. It does NOT use the browser password manager: MEASURED, Firefox native autofill only fills after a human picks an entry from its own dropdown, which is native UI no automation can click.
| Name | Required | Description | Default |
|---|---|---|---|
| submit | No | Submit the form afterwards (default false — fill only) | |
| context | No | Tab context id (default: the active tab) | |
| password | Yes | Password to type | |
| username | Yes | Username to type | |
| passwordSelector | No | CSS selector for the password field (default: form autocomplete=current-password, else first password input) | |
| usernameSelector | No | CSS selector for the username field (default: form autocomplete=username, else first text input in the form) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only carry readOnlyHint=false, so the description adds real value: it discloses that input is real keystroke synthesis rather than value assignment (matters for JS-validated forms) and explains why the Firefox password manager is not used, with observed evidence. It does not cover failure modes (field not found, selector mismatch) or whether credentials appear in logs.
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?
Front-loads the action and the keystroke distinction in one sentence, with the submit behavior appended. The final sentence about MEASURED Firefox autofill is longer than needed for invocation decisions, but it does preempt a plausible wrong approach.
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 6-parameter mutation tool with full schema coverage and no output schema, the description covers what the tool does, how it types, and what it deliberately does not do. Only error/verification behavior (what happens when selectors don't match, how success is observable) is left unaddressed.
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 defaults for submit, context and the CSS selector fallbacks are already documented. The description only echoes the optional-submit behavior ('then optionally submit') and adds nothing about selector resolution beyond the schema. 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?
Specific verb+resource ('Type a username and password into a form') with the scope narrowed further by 'real keystroke input (not a scripted value assignment), then optionally submit'. It also positions itself against browser_type and the password-manager siblings (browser_list_logins / autofill) via the 'you give me credentials, I fill them' framing.
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?
Clear usage context: it is for the case where the agent already holds credentials and should type them, and it explicitly rules out the native-autofill path. It does not name generic siblings like browser_type or browser_find_login_form as alternatives, so the routing is implied rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_find_login_formFind login and registration formsARead-only
Inspect the page for login/registration forms: each form id and action, plus its input fields with name, type and autocomplete hint. Use this before filling a form so the field names are known instead of guessed.
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Tab context id (default: the active tab) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds real value by disclosing the shape of what is inspected (form id, action, field name/type/autocomplete), which compensates for the absence of an output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste, with the return contents front-loaded and the usage rule following. Nothing is repeated from the title or schema.
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 read-only inspection tool with no output schema, the description supplies the essential return structure and the workflow context. Minor gaps remain — no mention of behavior when no form exists or whether it inspects iframes/shadow DOM — but the agent has enough to call it correctly.
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 single 'context' parameter is fully documented in the schema (100% coverage), so the schema does the heavy lifting. The description says nothing about tab targeting or what happens if the context is omitted, so it adds no value over the structured field.
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 a specific verb and resource ('Inspect the page for login/registration forms') and enumerates exactly what is returned: form id, action, and input fields with name/type/autocomplete. It is clearly distinct from data-oriented siblings like browser_list_logins, though it never names an alternative explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use this before filling a form so the field names are known instead of guessed' gives a concrete when-to-use condition and implicitly points toward the fill step. It stops short of naming the sibling tool (browser_fill_login) or stating 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.
browser_get_cache_usageHow much disk the HTTP cache usesARead-only
Report the size of the on-disk HTTP cache (Services.cache2.asyncGetDiskConsumption). Note: this is only the network cache — it does not include IndexedDB, Service Worker caches or storage, which live elsewhere.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read, so the description doesn't need to restate that. It adds real value beyond the annotation by naming the API used and explicitly bounding what is measured (network cache only, not IndexedDB/Service Worker), which prevents misinterpreting the returned number.
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 tight sentences: the action and scope come first, the caveat second. Nothing is repeated from the title or annotations and every clause carries useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-param read-only tool with no output schema, the description is essentially complete: it tells the agent what is measured and what is excluded. It stops short of saying what the return value looks like (number, units), which is a minor gap given there is no output schema to cover 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 input schema is empty and has no parameters, so there is nothing for the description to disambiguate. Baseline 4 applies for a zero-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?
States a specific verb and resource — report the size of the on-disk HTTP cache — and cites the underlying API (Services.cache2.asyncGetDiskConsumption). It explicitly distinguishes this measurement from IndexedDB, Service Worker caches and storage, which an agent could reasonably confuse it with.
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 scope note makes clear when this tool is the right one: for network-cache disk consumption rather than broader storage. It doesn't explicitly point to siblings such as browser_clear_cache or browser_memory_usage, but the exclusion language covers the main ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_get_cookiesRead cookiesARead-only
List cookies visible to the browser (BiDi storage.getCookies). Filter by name and/or domain to narrow it down. Values are returned as stored; treat them as secrets and do not paste them into shared logs.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Only this cookie name | |
| domain | No | Only cookies whose domain matches |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so safety of the operation is covered; the description adds genuinely new context by naming the BiDi storage.getCookies call, noting values are returned as stored, and warning they should be treated as secrets. It stops short of describing result size or pagination behavior.
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 short sentences, front-loaded with the action, then scoping, then the security caveat. Nothing is wasted and each sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-required-parameter read tool with full schema coverage and annotations, this is nearly complete: it explains what is listed, how to narrow, and how to handle the returned values. The only omission is any hint about result volume or handling of large cookie sets.
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 both parameters are already documented in the schema; the description's 'filter by name and/or domain' adds meaningful framing (they compose as optional narrowing filters) but no syntax or matching rules beyond that. 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?
States a specific verb and resource ('List cookies visible to the browser') and grounds it in the underlying BiDi call. The 'List' verb distinguishes it from siblings like browser_set_cookie and browser_delete_cookies, though it never names them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description covers scoping ('Filter by name and/or domain to narrow it down') but gives no guidance on when to reach for this tool versus alternatives such as browser_import_cookies or browser_search_prefs, and no prerequisites or constraints are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_get_faviconFavicon URL for a pageARead-only
Ask Places which favicon URL it has stored for a page (PlacesUtils.favicons.getFaviconForPage). Returns the URL only — it does not download the image. Empty result means no icon has been recorded for that page yet.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Page URL to look up |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description is consistent with that ('which favicon URL it has stored'). It adds real value beyond the annotations by defining the empty-result case as 'no icon has been recorded for that page yet' and clarifying that no image is downloaded — exactly the kind of context annotations can't carry.
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 short sentences, each doing distinct work: what it does, what it returns, and how to interpret an empty result. The return-value constraint is front-loaded rather than buried.
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?
With one required param, no output schema, and readOnlyHint already covering safety, the description fills the remaining gaps an agent needs: return shape ('the URL only'), the non-download caveat, and empty-result semantics.
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% and the single parameter is documented as 'Page URL to look up'. The description implies the lookup is per-page but adds no format guidance (absolute vs relative, internal URLs, etc.) beyond the schema — the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Ask Places which favicon URL it has stored for a page') and immediately bounds it ('Returns the URL only — it does not download the image'), so an agent knows exactly what it gets. No sibling tool covers favicons, so differentiation is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the use case clear (look up the stored favicon URL for a page) and draws the key boundary against a plausible alternative behavior — fetching the icon bytes — which it explicitly disclaims. It stops short of naming a when-not-to-use condition, but no such alternative sibling exists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_get_gpcGlobal Privacy Control stateARead-only
Read whether the browser sends the Global Privacy Control signal (Sec-GPC header). NOTE: this command only exists in Marionette, not BiDi — so the browser must have been started with --marionette (scripts/launch-firefox.mjs takes care of it; port from DSH_BROWSER_MARIONETTE_PORT, default 2828).
| 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, so the safety profile is covered. The description adds meaningful behavioral context beyond that: this command exists only in Marionette, not BiDi, and requires the browser to be launched with --marionette, including the port source and default. It does not state the exact return format, keeping it from a 5.
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 tight sentences: the first states what is read, the second gives the essential Marionette prerequisite. It is front-loaded and every sentence 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?
This is a zero-parameter read-only tool with no output schema, so the description does not need to explain parameters or return structure. It covers the purpose and the key environmental prerequisite, which is sufficient for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so the baseline is 4. The schema is empty and fully described; no parameter semantics are needed or expected.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: read whether the browser sends the Global Privacy Control signal. It names the concrete header (Sec-GPC) and clearly distinguishes this getter from the sibling browser_set_gpc without needing to reference the sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The purpose makes clear this is a read-only check, and the NOTE gives an important usage condition: the browser must have been started with --marionette. It does not explicitly route agents to browser_set_gpc for mutation or mention when not to use it, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_get_login_passwordRead one saved passwordARead-only
SECURITY SENSITIVE — returns a saved password in clear text. It is a separate, explicitly named tool so that reading a password is always a deliberate act, never a side effect of listing. Never paste the value into chat output, logs or screenshots. Requires both origin and username.
| Name | Required | Description | Default |
|---|---|---|---|
| origin | Yes | Origin of the login | |
| username | Yes | Username of the login |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true, and the description goes well beyond that: it discloses that the return value is a clear-text secret, that both parameters are mandatory, and it gives handling constraints (no chat output, logs, screenshots). This is exactly the kind of context annotations cannot convey for a sensitive read.
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 security warning is front-loaded in the first clause, followed by rationale, then handling rules and prerequisites. Every sentence earns its place and nothing is buried.
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?
Two required parameters, a read-only annotation, and no output schema — the description fills the gaps that matter by characterizing the return value (clear text secret) and the caller's obligations. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Both parameters are documented at 100% schema coverage, so the schema already does the heavy lifting. The description reinforces that both origin and username are required for lookup, but adds no format, matching, or disambiguation guidance beyond that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — returns a saved password in clear text — and explicitly contrasts itself with listing operations, which is the nearest sibling behavior (browser_list_logins). An agent can tell immediately that this is the deliberate single-credential read, not an enumerator.
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 framing 'always a deliberate act, never a side effect of listing' tells the agent when to invoke it and implicitly routes enumeration to the list tool. It stops short of naming browser_list_logins or stating exclusions explicitly, but the usage context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_get_prefRead a Firefox preferenceARead-only
Read a preference by name (privileged context). Returns type and value.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Preference name, e.g. browser.tabs.inTitlebar |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already establishes the safety profile. The description adds useful context by noting the privileged context and that the result includes type and value, though it omits error or not-found behavior.
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?
It uses two short, front-loaded sentences with no filler. Both sentences carry operational information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with no output schema, the description gives the essential context: privileged read by name and a basic return shape of type and value. It could say more about missing preferences or exact return structure, 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?
Schema description coverage is 100% and the only parameter is already documented with an example. The description's 'by name' adds no syntax or format detail beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: read a preference by name. It does not explicitly distinguish this getter from the sibling browser_search_prefs, but the by-name scope is clear enough for selection.
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 'by name' implies when to use this tool, but there is no explicit guidance about when to use it instead of browser_search_prefs or other preference tools. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_get_proxyCurrent proxy configurationARead-only
Read the proxy settings (network.proxy.* preferences): the mode, the manual HTTP/HTTPS/SOCKS host and port, the "no proxy for" list, and the PAC URL. Mode values are the Firefox values: 0 none, 1 manual, 2 PAC, 4 auto-detect, 5 use system settings. Note a proxy change may need a restart to affect existing connections.
| 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, so the safety profile is covered; the description adds real behavioral context beyond that by enumerating the returned fields and warning that a proxy change may need a restart to affect existing connections. That restart caveat is non-obvious and directly actionable, though it does not discuss failure modes or unset values.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with what is read, then the mode legend and the restart caveat. Every clause carries information; nothing is repeated from the title or annotations.
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 exists, yet the description enumerates the returned fields and their value encoding, plus the one operational caveat (restart). For a zero-argument read tool this is as complete as an agent needs.
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?
Zero parameters, so the baseline is 4. The description goes further by decoding the returned mode field (0 none, 1 manual, 2 PAC, 4 auto-detect, 5 use system settings), which an agent would otherwise have to guess since there is no output 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?
Specific verb (read) plus resource (proxy settings) with the exact preference namespace (network.proxy.*) and the fields returned. It is unambiguously the read counterpart to browser_set_proxy and cannot be confused with any other sibling.
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 is only implied: the tool reads the current config, so an agent infers it should call this before/instead of mutating. It never names browser_set_proxy as the alternative for changes, nor states any precondition, leaving the read-vs-write routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_get_response_bodyRead a captured response bodyARead-only
Read the stored body of one request (network.getData, dataType response). The request must have happened AFTER browser_collect_response_body ran. Returns the base64 the protocol gives plus a decoded preview. "no such network data" means nothing was stored for that request id — check that collection was started first and that the id comes from browser_network_requests.
| Name | Required | Description | Default |
|---|---|---|---|
| requestId | Yes | Request id from browser_network_requests (beforeRequestSent / responseStarted) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered; the description adds real context beyond that: the ordering dependency on collection, the return shape (base64 plus decoded preview), and the meaning of the 'no such network data' error. It stops short of covering limits such as large/truncated bodies or how long stored bodies survive.
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 short sentences, front-loaded with the action and return shape, then the ordering constraint, then the error diagnosis. Nothing is redundant with the title or the schema.
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 exists, and the description compensates by stating exactly what comes back (raw base64 plus decoded preview) and how to interpret the main error. Minor gaps remain around body size/truncation and storage lifetime, which an agent might need for large or binary responses.
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?
Only one parameter and schema description coverage is 100%, so the schema already documents requestId and its origin. The description reinforces the id source and adds the temporal constraint (id must be from a request that occurred after collection started), which is marginal added value over 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?
Uses a specific verb and resource ('Read the stored body of one request') and even names the underlying protocol call (network.getData, dataType response). It is clearly distinguished from the sibling that stores bodies (browser_collect_response_body) and the sibling that supplies ids (browser_network_requests).
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 the precondition explicitly ('The request must have happened AFTER browser_collect_response_body ran') and routes id lookup to browser_network_requests. It also names the failure mode and what to check, which effectively covers when-not-to-use / what to fix.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_get_search_engineRead the default search engineARead-only
Report the default search engine name as configured (browser.search.defaultenginename) plus the list of engine names found in the profile search settings file (search.json.mozlz4). LIMITATION: changing the default engine needs the internal SearchService, whose ES module is not reachable from a remote script in this build (every resource:// path fails to load), so this tool is read-only.
| 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 corroborates that with the reason (the SearchService ES module is unreachable, every resource:// path fails), which is genuinely additive context an agent cannot get elsewhere. It also discloses the underlying data sources, though it does not describe the return shape, ordering, or what happens if search.json.mozlz4 is missing or unreadable.
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, front-loaded with what is returned and followed by the read-only caveat; the pref key and file name are concrete rather than padded. It is slightly dense but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no parameters, the description does the necessary work by naming the two returned pieces of information and explaining the read-only constraint. Only the failure behavior for a missing or unparseable search settings file is left unaddressed.
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 takes zero parameters, so the schema carries no semantics burden and the baseline applies. Nothing in the description needs to explain inputs, and it correctly does not invent any.
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 names a specific verb (report) and specific resources (the default search engine pref and the engine list from search.json.mozlz4), so its function is unambiguous. It stops short of distinguishing itself from the nearby siblings browser_search_engine, browser_search_prefs, or browser_add_search_engine, which a reader must resolve by inference.
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 only implied: the LIMITATION sentence tells the agent that changing the default engine is out of scope, which hints that a different route is needed for mutation. It never explicitly says 'use browser_search_engine (or browser_set_pref) to change it' or otherwise routes the agent to an alternative, and there are no stated preconditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_get_tab_processesWhich process hosts which tabARead-only
Report the OS process id behind each tab (browsingContext.currentWindowGlobal.osPid). MEASURED: there is no gBrowser.getTabPids — that name does not exist in Tabbrowser.sys.mjs. Useful to see how many content processes Firefox spun up, or whether two tabs share one.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already declares the safety profile, and the description adds useful depth by naming the exact data source (osPid), implying one entry per tab. However, with no output schema it does not say what the response shape is, whether all windows or only the current one are covered, or how discarded/unloaded tabs appear.
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 core purpose is front-loaded in the first clause, followed by the implementation detail and then the use case. Three sentences, all short. The 'that name does not exist in Tabbrowser.sys.mjs' sentence is defensive filler for an agent, though it does prevent a bad API assumption.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only introspection tool with no output schema, the description covers what it returns conceptually and why it matters. The remaining gap is scope (all windows vs. current window) and the exact return structure, which an agent would need before consuming the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters and the input schema is an empty object, so there is nothing for the description to disambiguate. Baseline 4 applies; nothing is misrepresented.
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?
States a specific verb and resource: report the OS process id behind each tab, with the exact underlying property (browsingContext.currentWindowGlobal.osPid). It is clearly distinct from siblings like browser_list_tabs (tab enumeration) and browser_memory_usage (aggregate memory), so an agent can pick it without opening the schema.
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?
Gives concrete motivation: see how many content processes Firefox spun up, or whether two tabs share one. That is a clear usage context, but there are no explicit exclusions or named alternative tools (e.g. use browser_memory_usage for totals). The 'MEASURED: no gBrowser.getTabPids' note is anti-hallucination guidance rather than selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_get_toolbar_layoutCurrent toolbar layoutARead-only
List which widgets sit in each toolbar area (nav-bar, TabsToolbar, PersonalToolbar, ...), read from browser.uiCustomization.state. Widget ids are exactly what browser_set_toolbar_widget expects. Read this before changing the layout, and use it to put things back afterwards.
| Name | Required | Description | Default |
|---|---|---|---|
| area | No | Only this area, e.g. "nav-bar" (default: every area) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint already declares the safety profile, so the bar is lower. The description nonetheless adds real context: the data is sourced from browser.uiCustomization.state and the returned widget ids are exactly the format browser_set_toolbar_widget accepts, which prevents an id-mismatch failure during a restore.
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 tight sentences: scope first, source and id semantics second, workflow third. Nothing is repeated and nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-param read tool with annotations and no output schema, this covers scope, source, id compatibility and workflow. It stops just short of saying anything about the return shape (per-area arrays of ids), which would have made it fully 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?
Only one optional parameter and schema description coverage is 100%, so the schema already documents 'area' with an example and the default of every area. The description's mention of areas matches but does not extend the schema, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'List which widgets sit in each toolbar area' — and names the underlying source (browser.uiCustomization.state) plus concrete area examples (nav-bar, TabsToolbar, PersonalToolbar). It is clearly the read counterpart to browser_set_toolbar_widget, so an agent can separate it from siblings without opening the schema.
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 sequencing guidance: 'Read this before changing the layout, and use it to put things back afterwards.' This tells the agent both the pre-condition and the restore workflow, and implicitly points at the mutation sibling that motivated it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_get_window_geometryRead window state and geometryARead-only
Report the window state (normal/maximized/minimized/fullscreen), its screen position and its outer size. This is the readable counterpart of browser_set_window_state / browser_set_window_position / browser_set_window_size.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true is consistent with the description's read-only framing, so no contradiction. Beyond the annotation it discloses the concrete return payload (state enum, position, outer bounds), which is real added value. It omits which window is targeted — presumably the active one given zero parameters — and whether prompts/permissions are involved.
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 filler. The returned data is front-loaded and the sibling routing follows immediately after.
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?
With no output schema, the description must carry return-value semantics, and it does name all three returned values and the state enum. A small gap remains around window scoping (which window is measured) and whether coordinates are screen- or viewport-relative.
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 takes zero parameters, so the baseline is 4. There is nothing for the description to clarify, though it leaves implicit that the call always operates on the current/active window.
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?
Specific verb (report) plus the exact fields returned: window state with its enum values, screen position, and outer size. It also names the three writer siblings it complements, so an agent can distinguish it from browser_set_window_state / _position / _size without opening a schema.
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 'readable counterpart of browser_set_window_state / browser_set_window_position / browser_set_window_size' effectively tells the agent to pick this for inspection and those for mutation. It does not, however, address when to prefer it over adjacent readers such as browser_list_windows or browser_screen_info.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_group_tabsPut tabs into a tab groupA
Create a tab group from the given tabs (Firefox tab groups, gBrowser.addTabGroup). Give the tab context ids; label and color are optional. This is the same grouping the tab strip offers, so a human can collapse or reopen the group from the UI afterwards.
| Name | Required | Description | Default |
|---|---|---|---|
| color | No | Group color | |
| label | No | Group label | |
| contexts | Yes | Tab context ids to group (at least one) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation only says readOnlyHint=false; the description goes beyond that by identifying the native Firefox tab-group mechanism and, importantly, disclosing that the result is a real tab-strip group a human can collapse or reopen later — a persistent, user-visible side effect. It omits edge behavior such as what happens to tabs already in another group and what the call returns.
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 short sentences, front-loaded with the action and its resource, with the implementation reference and the UI consequence following. No filler, though the parenthetical API name is marginally more useful to implementers than to an agent choosing the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with only readOnlyHint=false, no output schema, and no destructive hint, the description covers intent and persistence well but leaves gaps: whether grouping removes tabs from prior groups, whether the created group's identity is returned (relevant since browser_remove_tab_group exists), and any failure conditions.
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% and each of the three parameters is documented with descriptions plus an enum for color, so the schema carries the load. The description's "contexts required, label and color optional" restates the schema's required array rather than adding new semantics, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: "Create a tab group from the given tabs," naming the underlying implementation (gBrowser.addTabGroup). An agent can tell this makes a new group rather than mutating an existing one, though it never explicitly contrasts with the nearby browser_move_tab_to_group or browser_list_tab_groups siblings.
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?
"Give the tab context ids; label and color are optional" implies the calling convention, but there is no explicit when-to-use guidance, no statement of prerequisites (must the tabs be in the same window? must they be ungrouped?), and no named alternative for putting tabs into an existing group.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_handle_promptAccept or dismiss a page promptA
Answer the alert / confirm / prompt that a page is waiting on (BiDi browsingContext.handleUserPrompt). accept: true clicks OK, false cancels. userText supplies the answer for a prompt() dialog. Without this the page stays blocked; "no such alert" means nothing is waiting, which is a normal answer.
| Name | Required | Description | Default |
|---|---|---|---|
| accept | Yes | true = OK, false = Cancel | |
| context | No | Tab context id (default: the active tab) | |
| userText | No | Text to enter for a prompt() dialog |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only give readOnlyHint=false; the description adds the real behavioral payload — that the page remains blocked until this is called, that accept maps to OK/Cancel, and that a "no such alert" error is a normal, non-failure outcome. That last point meaningfully prevents the agent from treating a benign error as a fault. It doesn't say what the tool returns or whether dismissing a confirm discards unsaved 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?
A single tight block: purpose first, then parameter meaning, then the failure/blocking consequence. Every clause carries information and nothing is redundant.
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 three-parameter dialog tool with no output schema, the description covers purpose, both meaningful parameter behaviors, and the blocking/error semantics. Only the return value and any post-dismiss state effects are left implicit, which is a minor gap 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?
Schema description coverage is 100%, so accept, context and userText are already documented in the schema. The description restates accept and userText semantics without adding new detail and never mentions the context parameter. Baseline 3 applies when the schema carries the parameter burden.
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?
States a specific verb (answer/accept/dismiss) and a specific resource (a page prompt: alert/confirm/prompt), and even names the underlying BiDi command. It is clearly distinguishable from the other browser tools, though it never names its closest sibling browser_list_prompts, which an agent might otherwise reach for to inspect pending dialogs first.
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?
"Without this the page stays blocked" gives a clear condition for when the tool is required, which is exactly the decision an agent needs. It stops short of naming alternatives (e.g. browser_list_prompts to see what is waiting) or of saying when not to call it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_hide_automation_flagsHide automation markers from pagesADestructive
Make pages stop seeing the automation marker: registers a BiDi preload script that reports navigator.webdriver as false in every new document. MEASURED: with a plain WebDriver-driven session navigator.webdriver is true, which is exactly what anti-bot checks look for; after this preload it reads false. It is a document-level patch, not a promise of undetectability — other signals (missing plugins, synthetic event timing, CDP-style fingerprints) can still give automation away. Pass remove:true to undo.
| Name | Required | Description | Default |
|---|---|---|---|
| remove | No | Remove the preload script again (default false = install) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing the mechanism (document-level preload), the measured before/after behavior, and honest limits — it is not an undetectability promise, and other signals can still expose automation. Reversibility is stated via remove:true. The one gap is it never frames the destructiveHint=true implication (that the patch persists for all future documents until undone).
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 core effect is front-loaded in the first sentence, followed by the measured rationale and the caveat. It is on the denser side, but every sentence — including the 'MEASURED' evidence and the limits clause — carries useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter toggle with annotations and no output schema, the description supplies everything an agent needs: what changes, why, how to reverse it, and what it does not guarantee.
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% and the single parameter already documents 'default false = install'. The description reinforces this with 'Pass remove:true to undo', adding the undo framing but no syntax or default detail beyond the schema. Baseline 3 applies when the schema does the heavy lifting.
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?
States a specific verb and mechanism: it registers a BiDi preload script that reports navigator.webdriver as false in every new document. The title-plus-description pairing makes the effect unambiguous, and no sibling tool overlaps this capability.
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?
Gives clear context for use (anti-bot checks reading navigator.webdriver) and explicitly documents the inverse operation via remove:true to undo. It doesn't name an alternative tool, but no sibling offers equivalent functionality, so there is nothing to route against.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_history_manageSearch, remove or clear browsing historyADestructive
The management half of history that browser_list_history does not cover. MEASURED: PlacesUtils.history exposes clear() and remove() and removeVisitsByFilter(); the query-style methods (getNewQuery/executeQuery) are also present if you need raw querying. Use action:"search" to find entries, action:"remove" with a url to drop one page, or action:"clear" to wipe everything.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Exact URL to remove | |
| limit | No | Max results for search (default 20) | |
| query | No | Search text, for search | |
| action | Yes | What to do |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the bar is lower; the description still adds value by spelling out that clear "wipes everything" versus remove dropping a single page. The PlacesUtils internals sentence reads as justification rather than agent-relevant behavior, and irreversibility of clear is implied rather than stated.
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?
Front-loaded with the key distinction and the action mapping, but the "MEASURED: PlacesUtils.history exposes clear() and remove()..." sentence is implementation trivia that consumes roughly a third of the text without changing how an agent calls the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, four-parameter tool with full schema coverage and no output schema, the description covers the actions, the destructive scope of clear, and the read-side sibling. A sentence on what search returns (shape/count) and on error behavior for a missing URL would close the remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning by tying each enum value to an operation and noting that remove expects a url. Remaining gap: it never states that query/limit only apply to search or that remove needs the exact URL from 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?
States a specific verb set (search, remove, clear) on a specific resource (browsing history) and explicitly positions itself as "the management half of history that browser_list_history does not cover." An agent can distinguish it from the read-only sibling without opening the schema.
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?
Gives explicit action-to-intent mapping: search to find entries, remove with a url to drop one page, clear to wipe everything. It names browser_list_history as the read-side alternative, but does not clarify when to use its own "search" action versus other history readers such as browser_traverse_history.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_hoverMove the mouse over an elementA
Move the real mouse pointer onto an element (or a viewport coordinate) so hover-only UI appears: menus, tooltips, :hover styles, "show on hover" controls. Uses BiDi input.performActions pointerMove, so the page sees a genuine pointer position, not a synthetic event. Give selector OR x/y.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | Viewport x (when no selector) | |
| y | No | Viewport y (when no selector) | |
| context | No | Tab context id (default: the active tab) | |
| selector | No | CSS selector of the element to hover | |
| settleMs | No | Wait this long after moving, so hover UI can appear (default 150) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real behavioral context beyond the single readOnlyHint annotation: it discloses the underlying mechanism (BiDi input.performActions pointerMove) and that the page receives a genuine pointer position rather than a synthetic event, which matters for pages that gate on trusted events. Nothing here contradicts readOnlyHint=false, since hover can trigger menus and stateful UI.
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 tight sentences: purpose first, mechanism second, input rule last. Every clause carries information an agent would otherwise have to infer.
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 five-parameter tool with no output schema, the description covers purpose, mechanism, input modes, and the hover-settling behavior implied by settleMs. It could additionally note what happens on a missing/unmatched selector or whether the pointer position persists, but nothing essential to invoking it is missing.
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 already 100%, so the baseline is 3; the description earns a point by making the selector-vs-coordinate exclusivity explicit and reframing the two modes as a single either/or decision rather than two independent optional fields.
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?
States a specific verb and resource ("Move the real mouse pointer onto an element") plus the outcome it enables ("hover-only UI appears: menus, tooltips, :hover styles"). This clearly distinguishes it from siblings like browser_click, browser_mouse_action, and browser_drag.
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?
Gives the triggering conditions well ("hover-only UI," "show on hover" controls) and specifies the input choice: "Give selector OR x/y." It does not, however, contrast itself with near-neighbors such as browser_mouse_action or explain when a hover is insufficient and a click is needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_import_cookiesImport many cookies at onceADestructive
Set a batch of cookies in one call instead of one browser_set_cookie per cookie. Needed because Firefox allows only ONE active BiDi session, so an external script cannot open its own connection while this server holds the session — the batch has to run inside the shared session. Pass an array of {name, value, domain, path, expirySeconds, secure, httpOnly, sameSite}. Reports per-item failures instead of stopping on the first error.
| Name | Required | Description | Default |
|---|---|---|---|
| cookies | Yes | Cookies to set |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare this as a non-read-only, destructive mutation, and the description adds useful behavioral context: it runs inside the shared BiDi session and reports per-item failures rather than aborting on the first error. It does not explain whether existing cookies are overwritten, which is a meaningful gap for a destructive cookie-setting tool.
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 front-loaded with the purpose and sibling comparison, followed by the operational rationale and error behavior. The parameter list largely duplicates the schema, which is a minor waste, but the overall structure is 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 annotations that flag this as destructive and a complete input schema, the description covers the key operational details an agent needs: batch shape, the BiDi session reason, and per-item failure behavior. It is slightly incomplete on cookie overwrite/duplication semantics, but sufficient for correct invocation.
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 schema already documents the array and item fields. The description repeats the field list but adds no further semantics such as expiry interpretation, sameSite behavior, or which fields are required 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 states a specific action and resource: setting a batch of cookies in one call, explicitly contrasted with browser_set_cookie. An agent can distinguish it from the single-cookie sibling and the file-import sibling without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly names browser_set_cookie as the per-cookie alternative and explains why batching is necessary under Firefox's single active BiDi session. It does not mention browser_import_cookies_from_file, which is another plausible alternative, and gives no explicit when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_import_cookies_from_fileImport cookies from a JSON fileADestructive
Read a JSON file containing an array of cookie objects and set them all inside the existing shared BiDi session. Each object may have {name, value, domain, path, expirySeconds, secure, httpOnly, sameSite}. This exists because an external script cannot open its own BiDi session while this server holds the only one, and hand-typing hundreds of cookies through browser_import_cookies is impractical.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute path to the JSON file |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=false and destructiveHint=true, so the agent knows this is a mutating, destructive operation. The description adds useful context that cookies are set inside the existing shared BiDi session and that an external script cannot own a session here. However, it does not clarify overwrite semantics for existing cookies, error handling, or whether any existing session state is replaced.
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, front-loaded with the action and mechanism, followed by file format and then rationale. Every sentence earns its place with no redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter mutating tool with annotations and no output schema, the description covers purpose, file format, session mechanism, and differentiation from a sibling. The only notable omissions are overwrite semantics and failure behavior, which are minor but relevant for a destructive operation.
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 for the single path parameter is 100%, so the schema already explains the file path. The description adds meaningful value by specifying the expected file contents: an array of cookie objects with fields such as name, value, domain, path, expirySeconds, secure, httpOnly, and sameSite.
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?
States a specific verb and resource ('Read a JSON file... and set them all inside the existing shared BiDi session'), and explicitly contrasts this bulk mechanism with browser_import_cookies. An agent can distinguish it from sibling cookie tools like browser_set_cookie and browser_import_cookies without opening any schema.
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?
Explains why the tool exists: external scripts cannot open their own BiDi session while the server holds the only one, and hand-typing hundreds of cookies through browser_import_cookies is impractical. This implies the right context (bulk import from file), but it does not explicitly state when to prefer browser_import_cookies or browser_set_cookie instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_import_historyImport browsing history from a JSON fileADestructive
Read a JSON file holding an array of {url, title, lastVisit, visitCount} and insert each into Places via PlacesUtils.history.insert, so migrated history keeps its original timestamps instead of looking like fresh visits. Entries whose url already exists are still inserted (Places merges visits for a known url).
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute path to a JSON file: array of {url, title, lastVisit, visitCount} |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true, so the safety profile is known. The description adds genuinely non-obvious behavior beyond that: original timestamps are preserved rather than treated as fresh visits, and entries with an existing url are still inserted because Places merges visits. It does not say what happens on malformed input or partial failure, which keeps it below a 5.
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 dense sentences with zero waste: the action and mechanism come first, then the two non-obvious behavioral facts (timestamp preservation, duplicate-url merging). Every clause 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 one-parameter import tool with no output schema, the description covers source, destination, and duplicate handling. It stops short of describing error behavior or whether a result/count is returned, which an agent would want before calling it on a large file.
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% and the single 'path' parameter is fully documented in the schema. The description restates the expected file shape ({url, title, lastVisit, visitCount}) but adds no format details beyond what the schema already carries, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read a JSON file ... and insert each into Places via PlacesUtils.history.insert') and even names the underlying API used. The scope — bulk history migration from a file — is clearly distinct from siblings like browser_list_history or browser_history_manage.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the use case (migrating history so timestamps are preserved) but never states when to prefer this over browser_history_manage, browser_bookmarks_import, or browser_import_cookies_from_file. No explicit when-not or prerequisite guidance is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_import_loginsImport logins from a CSV fileBDestructive
Import saved logins from a CSV (the format Chrome and Firefox both export). MEASURED: the module is resource://gre/modules/LoginCSVImport.sys.mjs and its static entry point is LoginCSVImport.importFromCSV (the class instance has no prototype methods). Column names are mapped by the browser itself, so pass a file already in the standard url/username/password layout.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute path to the .csv file |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true, so the safety profile is covered. The description adds useful context that the browser itself maps column names and that only the standard layout is supported, but it never explains what the destructive aspect actually means here — whether existing saved logins are merged, duplicated, or overwritten — which is the one thing an agent most needs before calling it.
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 purpose is correctly front-loaded in the first clause, but the second sentence is largely internal trivia (resource:// module URI, class name, absence of prototype methods) that does not help an agent select or invoke the tool. Roughly half the text is noise against a one-parameter operation.
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 destructive mutation with no output schema, the description says nothing about what happens to pre-existing logins, whether the import is idempotent, or what is returned on success/failure. The implementation trivia crowds out the behavioral information that would actually complete the picture.
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 a single parameter at 100% schema coverage, the schema already documents "Absolute path to the .csv file." The description adds only a constraint on the file's internal layout (url/username/password columns), which is mildly useful but does not extend the meaning of the `path` parameter itself. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ("Import saved logins from a CSV") and even pins the exact export format, so the operation is unambiguous. It does not, however, distinguish itself from the near-identical sibling browser_import_logins_from_file (or browser_import_cookies_from_file), which an agent would have to disambiguate on its own.
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 through a constraint ("pass a file already in the standard url/username/password layout"), which tells the agent what input is acceptable. It gives no explicit when-to-use/when-not-to-use guidance and never routes the agent to the obvious alternative tool for the same job.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_import_logins_from_fileImport logins from a JSON fileADestructive
Read a JSON file holding an array of {origin, user, password} and insert each one through nsILoginManager directly, bypassing LoginCSVImport (which fails with FILE_PERMISSIONS_ERROR in this build). Tell the truth about duplicates: Firefox silently merges or rejects entries whose origin+username already exist.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute path to a JSON file: array of {origin, user, password} |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, and the description adds genuinely new context: the implementation bypasses LoginCSVImport because that path throws FILE_PERMISSIONS_ERROR in this build, and Firefox silently merges or rejects entries with an existing origin+username. That duplicate behavior is important for an agent to know. It stops short of saying whether the import is atomic or what happens to already-existing entries beyond 'merges or rejects'.
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 tight sentences with no filler; the input format and the insertion mechanism come first, and the duplicate caveat follows. The aside about LoginCSVImport is implementation detail but earns its place because it explains why this tool exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter mutation tool with no output schema, the description covers the input shape, the write mechanism, the failure mode of the naive alternative, and the duplicate-handling caveat, while annotations carry the destructive flag. An agent has enough to call it correctly and to warn about duplicates.
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% for the single path parameter, and the schema already spells out 'Absolute path to a JSON file: array of {origin, user, password}'. The description restates the same format without adding constraints such as encoding, size limits, or handling of malformed rows, so the schema does the heavy lifting.
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?
States a specific verb and resource: reads a JSON array of {origin, user, password} and inserts each entry via nsILoginManager, explicitly noting it bypasses LoginCSVImport. The mechanism is precise, but the description never mentions the sibling tool browser_import_logins, so the agent must infer the distinction between file-based and other import paths from the name alone.
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 is implied rather than stated: the array-of-credentials input format signals a batch import, contrasting implicitly with the single-entry browser_add_login. There is no explicit 'use this when X, use browser_import_logins when Y' routing, and no prerequisites (file must exist, absolute path, profile unlocked) are called out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_infoBrowser infoARead-only
Report the connected Firefox: version, window count and whether the privileged (chrome) context is reachable.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already declares the safety profile, so the description only needs to add context. It usefully signals that the call probes privileged chrome-context reachability, which hints at the environment's automation capability, but says nothing about failure modes when no browser is connected.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler, naming the target and the three reported values in the order an agent would care about them.
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?
With no output schema, the description carries the burden of describing return values, and it does so for all three fields. Only the error/absent-browser behavior is unstated, a minor gap for a trivial diagnostics call.
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 takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. The enumerated return fields compensate slightly by clarifying what the no-arg call yields.
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?
States a specific verb ('Report') and resource ('the connected Firefox') and enumerates exactly what is returned: version, window count, and privileged chrome-context reachability. This is clearly distinct from mutation siblings, though the description does not explicitly differentiate it from near-neighbors like browser_selfcheck or browser_profile_info.
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 call this versus alternatives such as browser_selfcheck, browser_profile_info, or browser_screen_info, all of which could plausibly answer adjacent questions. The agent must infer the use case from the field list alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_install_addonInstall an add-on from a fileADestructive
Install an extension from a local .xpi file or an unpacked extension directory (AddonManager.getInstallForFile). The path must exist and be readable by Firefox. Most add-ons work immediately; some need a restart. Confirm with browser_list_addons, then use browser_set_addon_state to enable or disable it, or browser_uninstall_addon to remove it.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute path of the .xpi, or of an unpacked extension directory |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds genuine behavior beyond the annotations: 'most add-ons work immediately; some need a restart' and the precondition that the path must exist and be readable by Firefox. The destructiveHint=true annotation is not explained (that installing grants the extension broad capabilities and that uninstall is the reversal path), which is the one material gap.
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 tight sentences, front-loaded with the action and accepted formats. The parenthetical AddonManager API reference earns its place only marginally but does not disrupt the flow.
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?
Covers input forms, preconditions, restart caveat, and the verification/enable/remove follow-up, which is sufficient for a one-parameter tool with no output schema. Missing are failure modes (unsigned/incompatible add-on errors, permission prompts), which an agent would still want.
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% and the single 'path' parameter already documents the .xpi/directory distinction and that it must be absolute. The description adds only the 'must exist and be readable' precondition, so the schema still carries most of the load.
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?
States a specific verb+resource ('Install an extension') and explicitly enumerates the two accepted input forms (.xpi file or unpacked directory), which distinguishes it from the userscript-oriented browser_tampermonkey_install sibling. An agent can tell immediately what this does without opening the schema.
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?
Gives a concrete post-install workflow: verify with browser_list_addons, then branch to browser_set_addon_state or browser_uninstall_addon. That is real routing guidance. It stops short of saying when NOT to use it (e.g. signed-store installs or userscripts, which belong to browser_tampermonkey_install).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_key_holdHold a key down for a durationA
Press and HOLD a key for N milliseconds, then release — what you need for games (walk right, keep accelerating) and for drag-modifier workflows (hold Shift while clicking). A real keyDown is sent, the wait happens, then keyUp. Do not hold for very long; the page may repeat the key itself.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Key to hold (e.g. "ArrowRight", "w") | |
| context | No | Tab context id (default: the active tab) | |
| modifiers | No | Modifiers held at the same time | |
| durationMs | Yes | How long to hold, in milliseconds |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only readOnlyHint=false in annotations, the description carries most of the load and does it well: it discloses the actual event sequence (keyDown, wait, keyUp) and the key-repeat side effect of long holds. It doesn't mention focus requirements or what happens if the page navigates mid-hold, but the core behavior is transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action and followed by use cases then a safety caveat. The parenthetical game examples are slightly chatty but serve as genuine usage guidance rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description covers mechanics, typical use cases, and the long-hold risk, which is enough for an agent to call it correctly. A note on focus/target element requirements would make it 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% and each parameter is documented in-schema, so the baseline is 3. The description reinforces duration semantics and hints at the modifiers use case ('hold Shift while clicking') but adds no syntax or format detail 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?
States a specific verb+resource with the exact semantics that distinguish it: press, hold for N ms, then release. The keyDown/wait/keyUp sequence makes it clearly different from a plain key press or type action. It doesn't explicitly name browser_press_key as the non-holding alternative, so it falls short of full 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?
Gives concrete when-to-use contexts (game movement, drag-modifier workflows) plus a 'do not hold for very long' caveat. Missing an explicit statement of when to prefer browser_press_key or browser_type instead, which is the main remaining inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_list_addonsList add-onsBRead-only
List installed extensions (privileged context).
| 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, so safety is covered. 'Privileged context' hints at a permission requirement worth knowing but is left undefined, and nothing is said about return shape or ordering of results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with the operation front-loaded and no filler. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequate for a trivial zero-param read, and annotations cover safety. However, with no output schema, the description never indicates what a listed add-on looks like (name, id, enabled state), and 'privileged context' remains unexplained.
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?
Zero parameters, so baseline applies. The description adds the domain ('installed extensions') and context note, requiring nothing more from a no-arg 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?
States a specific verb+resource: 'List installed extensions'. The 'privileged context' qualifier adds a meaningful nuance but the description doesn't differentiate from siblings like browser_extension_details or browser_tampermonkey_list, which also surface extension info.
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 versus browser_extension_details, browser_extension_permissions, or browser_tampermonkey_list, and no exclusions or prerequisites spelled out beyond the vague 'privileged context' phrasing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_list_bookmarksList bookmarksARead-only
Read bookmarks from a folder (privileged context), each entry with the guid that browser_remove_bookmark needs. Defaults to the toolbar; the bookmarks menu and Other Bookmarks are reachable through parentGuid.
| Name | Required | Description | Default |
|---|---|---|---|
| parentGuid | No | Folder guid (default: the toolbar, "toolbar_____"). Also useful: "menu________" (bookmarks menu) and "unfiled_____" (Other Bookmarks). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true already covering the safety profile, the description adds useful context: it reads from a privileged context, defaults to the toolbar, and exposes the guid needed by browser_remove_bookmark. It does not explain the full return shape or any pagination behavior, but it goes beyond the 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 compact and front-loaded: it states the action, the default folder behavior, and the key output field. There is no redundant or filler 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?
For a simple one-parameter read tool with annotations and no output schema, the description covers the essentials: folder targeting, default behavior, and the important guid field. It could say more about what other bookmark fields are returned, which is the only notable gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parentGuid parameter and its special values are already documented in the schema. The description repeats the same defaults and folder-guid guidance without adding syntax or format details beyond the schema, so 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 states a specific verb and resource: read bookmarks from a folder. It also distinguishes the tool's output from related operations by noting each entry carries the guid that browser_remove_bookmark needs, so an agent can identify this as the listing step in a bookmark workflow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains the default folder and how to reach the bookmarks menu and Other Bookmarks via parentGuid, which gives clear usage context. It does not explicitly compare against sibling tools like browser_bookmark_folder or browser_bookmark_manage, so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_list_cert_overridesCertificate exceptionsARead-only
List the TLS certificate exceptions the user has accepted (nsICertOverrideService.getOverrides), with host, port, flags and whether each is temporary. Useful to confirm a test site was trusted, or to check nothing unexpected was accepted. Temporary exceptions disappear when Firefox exits.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only safety profile, and the description adds genuinely new context: the exact fields returned (host, port, flags, temporary flag) and the fact that temporary exceptions vanish when Firefox exits. It does not mention enumeration limits or whether expired/revoked entries are excluded, which keeps it off a 5.
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, front-loaded with what is listed and what fields come back; the usage scenarios follow and the ephemerality note last. Every sentence carries information, though the parenthetical API name is slightly redundant detail for an agent caller.
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?
There is no output schema, so the description's inline field list (host, port, flags, temporary) usefully stands in for one, and the 'disappear on exit' note tells the agent how to interpret the temporary flag. Adequate for a simple read-only enumerator.
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 takes zero parameters, so there is nothing for the description to disambiguate; baseline for a no-arg tool is 4. The description correctly implies the result is unfiltered and account-wide rather than scoped to a tab or host.
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?
Uses a specific verb ('List') plus a precise resource ('TLS certificate exceptions the user has accepted') and even names the underlying API (nsICertOverrideService.getOverrides), so there is no ambiguity about what is returned. It does not name the most confusable sibling (browser_relax_certificate_checks, browser_certificate_manage), which is the only thing separating it from a 5.
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?
Gives two concrete situations that select this tool: confirming a test site was trusted, and auditing that nothing unexpected was accepted. It stops short of naming alternatives or stating when not to use it (e.g. use browser_relax_certificate_checks to add an exception rather than read one).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_list_closed_tabsRecently closed tabsARead-only
List tabs that were closed in this session (SessionStore.getClosedTabData), newest first, with the index that browser_reopen_closed_tab takes. The list lives in memory for the session, so it is empty after a restart. This is the counterpart of browser_close_tab.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max entries (default 10) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnlyHint annotation: it discloses the backing API (SessionStore.getClosedTabData), the return ordering, the ephemeral lifetime ('empty after a restart'), and that the returned index is the handle for reopen. These are exactly the traits an agent would otherwise have to guess.
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 short sentences, front-loaded with what the tool returns and its ordering, then lifetime constraint, then sibling relation. No filler and nothing repeated from annotations.
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 read-only, no-output-schema list tool this is nearly complete: ordering, lifetime, and the semantic meaning of the index are covered. It doesn't sketch the other fields per entry (title, URL, timestamp), which would fully close the gap given there is no output schema.
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% and the single 'limit' parameter is fully documented in the schema (default 10, max 50, exclusive minimum 0). The description adds nothing about it, so the schema does the work — the baseline 3 for a fully covered single-param 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?
States a specific verb and resource ('List tabs that were closed in this session') plus the scope (session-only, in-memory) and ordering (newest first). It also names the sibling that consumes its output (browser_reopen_closed_tab) and the sibling it complements (browser_close_tab), so it is distinguishable from browser_list_tabs at a glance.
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 links the returned index to browser_reopen_closed_tab and labels itself the counterpart of browser_close_tab, which gives clear guidance on the follow-up action. It stops short of stating an explicit when-not-use condition or naming a competing alternative directly, but the usage path is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_list_download_eventsList observed download eventsARead-only
Report the download events the browser pushed since this server connected (browsingContext.downloadWillBegin / downloadEnd). Complements browser_list_downloads: the directory shows the RESULT, these events show WHEN a download started, finished, or failed. Events are buffered in memory (most recent 500) and only cover the lifetime of this connection.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max entries, newest first (default 20) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true, but the description adds critical operational constraints the agent could not otherwise know: events are buffered in memory, capped at the most recent 500, and only cover the lifetime of this connection. That retention/lifetime scoping materially changes how the agent should interpret empty or partial results.
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 tight sentences: what it reports first, then the sibling contrast, then the buffering caveat. No filler, and the most decision-relevant information is 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?
With no output schema, the description should ideally hint at the shape of returned entries (fields of a downloadWillBegin/downloadEnd record) beyond the event names. Otherwise it is complete: source, scope, limits, and sibling distinction are all covered for a simple one-parameter read 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% and the limit parameter already documents 'max entries, newest first (default 20)' with a max of 200. The description mentions the 500-entry buffer but does not tie it to the limit parameter or clarify ordering semantics beyond what the schema states, 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?
States a specific verb and resource ('Report the download events the browser pushed since this server connected') and even names the underlying protocol events (downloadWillBegin / downloadEnd). It explicitly distinguishes itself from the nearest sibling, browser_list_downloads, so an agent can pick correctly without opening either schema.
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?
Names the alternative and the exact condition that selects it: 'the directory shows the RESULT, these events show WHEN a download started, finished, or failed.' That is a concrete routing rule, not an implied one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_list_downloadsList downloaded filesARead-only
List the files sitting in the configured download directory of Firefox (read via the browser.download.dir preference; no path guessing). Newest first, with sizes. Returns an empty list when nothing has been downloaded yet or the directory is unset.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max entries (default 20) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds real behavioral context above that: sorted newest first, sizes included, and an empty list when nothing has been downloaded or the directory pref is unset. That empty-state and sorting behavior is exactly what an agent needs and is not derivable from annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action and resource, then the sourcing mechanism, then the return shape. No redundancy and no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and a single optional parameter, the description carries the return-shape burden and does so reasonably: ordering, size inclusion, and empty-list semantics are all covered. It stops short of describing entry fields (name, path, timestamp) or how limit truncates.
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% and the single 'limit' parameter is fully documented in the schema, so the baseline is 3. The description adds only the implicit ordering ('newest first'), which gives some meaning to what limit truncates, but it does not state that the limit applies to that ordering.
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?
States a specific verb and resource (list files in the configured Firefox download directory) and pins down the mechanism (read via browser.download.dir, no path guessing). It does not explicitly differentiate itself from the nearby browser_list_download_events / browser_download_manage siblings, which is the main naming ambiguity an agent faces.
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 parenthetical 'read via the browser.download.dir preference; no path guessing' implicitly scopes usage to the on-disk directory rather than download history, but there is no explicit when-to-use or when-not-to-use statement pointing at browser_list_download_events or browser_download_manage. Usage must be inferred from the suffix contrast.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_list_historyList history entriesBRead-only
Read recent history entries (privileged context). PlacesUtils.history.executeQuery is synchronous and returns a result whose root must be container-opened.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max entries (default 20) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint already declares the safety profile, so the bar is lower. The description adds that this is privileged and that the underlying call is synchronous with a container-opened root, which is useful consumption context, but it is framed as internal API detail rather than agent-facing behavior (ordering, recency window, what 'recent' means).
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 tight sentences with the purpose front-loaded and no filler. The second sentence is somewhat jargon-heavy ('container-opened') but is not wasted, since no output schema exists to explain the result shape.
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?
With no output schema, the description should clarify what is returned and in what order; instead it gestures at an internal result object ('root must be container-opened') that most agents cannot act on without further knowledge. It is adequate for a one-parameter read tool but leaves the return contract murky.
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% for the single 'limit' parameter, including default and maximum, so the schema does the heavy lifting. The description contributes nothing about the limit parameter, making baseline 3 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?
States a specific verb and resource ('Read recent history entries') and adds a scope qualifier ('privileged context'). It does not, however, differentiate itself from close siblings like browser_traverse_history or browser_history_manage, so an agent cannot tell purely from the text which history tool to pick.
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?
There is no when-to-use guidance and no named alternative, despite browser_traverse_history and browser_history_manage being obvious confusable siblings. The only contextual hint is the parenthetical 'privileged context', which implies a permission requirement but does not route the agent anywhere.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_list_loginsList saved logins (no passwords)ARead-only
List saved logins from the Firefox password manager, with origin, form action origin and username — but NEVER the password itself. Filter with origin to look at one site. Passwords are only readable through browser_get_login_password, which is a separate, explicitly named tool on purpose. Requires signon.rememberSignons=true for new logins to be saved.
| Name | Required | Description | Default |
|---|---|---|---|
| origin | No | Only logins for this origin (e.g. https://example.com) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, but the description adds a substantive safety guarantee the annotations don't carry: the password is NEVER returned, and password retrieval requires a separate explicit tool. It also notes the signon.rememberSignons prerequisite for new logins being persisted — real behavioral context beyond the structured fields.
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?
Front-loads what the tool returns and the no-password constraint before the routing note. Mostly tight, though 'which is a separate, explicitly named tool on purpose' is a design rationale rather than operational information and could be trimmed.
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?
There's no output schema, so describing the returned fields (origin, form action origin, username) is genuinely load-bearing. Combined with the security boundary and the pref prerequisite, an agent has what it needs; only minor items like result ordering or volume are unstated.
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 single 'origin' parameter is already fully documented with an example. The description only says 'Filter with origin to look at one site', which adds a marginal usage hint but no syntax or format details beyond the schema. 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?
States a specific verb and resource ('List saved logins from the Firefox password manager') and enumerates the returned fields: origin, form action origin, username. It also explicitly contrasts with browser_get_login_password, so the agent can distinguish it from its closest sibling without opening either schema.
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?
Gives a concrete usage condition ('Filter with origin to look at one site') and routes the agent to browser_get_login_password when passwords are needed. It doesn't spell out exclusions for the rest of the login-management family (add_login, remove_login, fill_login), but the main alternative is covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_list_permissionsList per-site permissionsARead-only
List the per-site permission grants Firefox has stored (camera, microphone, notifications, geolocation, popups, cookie behaviour …), read through Services.perms. Filter by origin to look at one site, or by type. Use browser_set_permission to change one.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Only this permission type, e.g. geolocation | |
| origin | No | Only this origin (https://example.com) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already declares the safety profile, so the description's main added value is the 'read through Services.perms' provenance and the enumeration of permission kinds — useful but not behavioral in the sense of permissions required, result shape, or ordering. It does not describe what the returned entries contain, which matters since no output schema exists.
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 tight sentences, front-loaded with what is listed and followed by filtering and alternative guidance. Minor cost: the trailing '…' enumeration is slightly loose, but nothing is genuinely wasted.
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 2-param read-only listing with no output schema, the description covers what is returned (permission grants by type), how to narrow it, and the counterpoint tool. A brief note on the result item shape (e.g., origin/type/state triplets) would make it fully 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% and both parameter descriptions already say 'Only this permission type' and 'Only this origin'. The description restates those semantics rather than adding format, case-sensitivity, or wildcard guidance, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the per-site permission grants Firefox has stored'), enumerates concrete permission types, and contrasts implicitly with the mutation sibling browser_set_permission. An agent can distinguish this from other browser_* list tools at a glance.
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 gives the two filtering modes ('Filter by origin to look at one site, or by type') and names the alternative tool for the write path ('Use browser_set_permission to change one'). The when-to-use boundary is fully stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_list_popup_notificationsList browser popup notificationsARead-only
List the browser doorhanger notifications currently offered (the "Save password?" / "Remember this site" kind). These are the prompts Firefox itself shows after a form submit. Use browser_accept_popup_notification to press one — this is how "let the browser remember the password" is done programmatically.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true is consistent with a "List" verb and is not contradicted. The description adds useful domain context (these are browser-native prompts, not page dialogs) but says nothing about the returned items — whether they carry identifiers, expire, or are per-tab — which is exactly what an agent needs before handing off to the accept tool.
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 short sentences, front-loaded with the verb+resource, then gloss, then follow-up action. The parenthetical examples earn their place; nothing is redundant.
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?
There is no output schema, so the description should hint at the shape of the result — an agent cannot tell how to reference a specific notification when calling browser_accept_popup_notification. Annotation and parameter coverage are otherwise sufficient for a no-arg read 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?
Zero parameters and 100% schema coverage, so there is nothing for the description to compensate for. Baseline 4 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?
States a specific verb and resource (list browser doorhanger notifications) and disambiguates with a concrete gloss — the "Save password?" / "Remember this site" prompts Firefox shows after a form submit. The one gap is that it never distinguishes itself from the sibling browser_list_prompts / browser_handle_prompt, which an agent could plausibly confuse with 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?
Explicitly pairs the tool with its action counterpart ("use browser_accept_popup_notification to press one") and frames the real-world goal (programmatic "remember the password"). It gives no exclusions, though — nothing says when to prefer browser_list_prompts or what to do if the list is empty.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_list_promptsAlerts and prompts seen so farARead-only
List page prompts (alert / confirm / prompt / beforeunload) that opened since this server connected, as reported by BiDi browsingContext.userPromptOpened, newest first. A page that shows one of these blocks its script until it is answered — use browser_handle_prompt to accept or dismiss. If a page seems stuck, check here first.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max entries (default 10) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered, but the description adds real behavioral context: the data source (BiDi browsingContext.userPromptOpened), the connection-scoped window, newest-first ordering, and the blocking nature of the listed prompts. It stops short of saying whether already-handled prompts remain in the list or how many entries accumulate.
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, front-loaded with the scope and contents, then the blocking consequence, then the routing advice. The BiDi event name is the only technical detail and it earns its place by explaining where the data comes from.
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?
With no output schema, the description still conveys ordering and entry type (the four prompt kinds), which is the minimum an agent needs. It does not describe what fields each entry carries (e.g. message text, tab identity), which would be needed to consume the result without probing.
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 single 'limit' param already documents default 10 and max 50, so the schema does the heavy lifting. The description adds no meaning about limit — e.g. whether it truncates newest or oldest entries — so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (List) plus a precisely enumerated resource (alert / confirm / prompt / beforeunload page prompts) with an explicit scope ('since this server connected') and ordering ('newest first'). An agent can immediately distinguish this read-only inventory tool from browser_handle_prompt, which acts on a prompt.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the mechanism that makes the tool relevant ('a page that shows one of these blocks its script until it is answered'), names the alternative explicitly ('use browser_handle_prompt to accept or dismiss'), and gives a concrete trigger condition ('If a page seems stuck, check here first').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_list_sidebarsList sidebars and their stateARead-only
List every sidebar this Firefox can show (history, bookmarks, passwords, tabs, AI chat, resource monitor, extension panels …) with its id and title, plus which one is currently open. Use the id with browser_set_sidebar.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already declares the safe-read profile, so the bar is lower; the description still adds substance by declaring the return fields and the fact that it is exhaustive across all sidebar types. It does not mention ordering of results or whether sidebars unavailable in the current window are omitted, which is the only remaining behavioral gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One main clause carries the resource, the returned fields, and the exhaustive scope, followed by a single short sentence on the id's downstream use. Front-loaded, no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters and no output schema, the description supplies the return shape (id, title, open state) that would otherwise be undocumented, which is exactly what is needed to call it confidently. Minor omission: nothing about result ordering or behavior when no sidebar is open.
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?
Zero-parameter tool, so the baseline is 4 by rule. The description correctly implies no input is needed and instead spends its words on the output contract, which is the right allocation.
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?
Specific verb (list) + resource (sidebars) with an inline enumeration of the sidebar categories and an explicit statement of what is returned (id, title, currently-open one). It is unmistakably distinct from browser_set_sidebar, which is the mutation counterpart.
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?
"Use the id with browser_set_sidebar" establishes the discover-then-mutate workflow and points at the correct alternative tool. It stops short of stating when not to call it (e.g., if the id is already known, listing is unnecessary), so it is clear context rather than full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_list_tab_groupsList tab groupsARead-only
List the tab groups (collapsible groups in the tab strip) with their id, label, colour, collapsed state and the tabs inside (gBrowser.getAllTabGroups). Use the id with browser_remove_tab_group or browser_ungroup_tabs.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already declares the safety profile, so the description only needs to add context — and it does, by disclosing exactly what is enumerated (id, label, colour, collapsed state, contained tabs). It adds no cost, rate-limit, or ordering caveats, but for a local read-only enumerator there is little to disclose.
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 front-loaded sentences with the return shape first and the follow-up routing second — no waste. The parenthetical internal API name (gBrowser.getAllTabGroups) is trivia an agent cannot act on and is the only removable content.
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?
With no output schema, the description carries the return-value burden and does so by naming every field plus the nested tabs. Combined with annotations covering read-only safety and a parameterless schema, nothing needed to call it correctly is missing.
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 takes zero parameters, so there is nothing for the description to disambiguate; the baseline of 4 applies. The description correctly implies an unscoped 'list all groups' call rather than suggesting any filter exists.
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?
States a specific verb (List) and resource (tab groups), then defines the resource in-domain ('collapsible groups in the tab strip') and enumerates the returned fields. An agent can distinguish this from browser_list_tabs without opening the schema.
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?
Gives concrete downstream usage: 'Use the id with browser_remove_tab_group or browser_ungroup_tabs', which tells the agent why to call this first. It does not explicitly exclude browser_list_tabs or state that this is the only source of group ids, so it falls short of full when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_list_tabsList tabsARead-only
List open tabs with their context id, URL and title.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe, non-mutating read, so the description's main added value is the promise that each tab entry carries context id, URL and title. It does not disclose ordering, scope (all windows vs current window), or behavior with very large tab counts.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the action and then the payload fields. Nothing is redundant and nothing could be trimmed without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read-only tool with no output schema, the description covers the essentials by naming the three returned fields. It stops short of clarifying scope (all windows? current window?) or ordering, which would matter for a listing tool used to pick a 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?
The tool takes zero parameters, which is the baseline-4 case; there is nothing for the description to disambiguate. It correctly does not invent arguments, which reinforces that the call is argument-free.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a clear verb (List) with a specific resource (open tabs) and even names what each entry contains: context id, URL and title. That makes it distinguishable from browser_list_windows and browser_list_closed_tabs, though the description never explicitly names those siblings.
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 is only implied: the mention of 'context id' hints that this is the tool used to discover tab identifiers before calling browser_activate_tab or browser_close_tab. There is no explicit when-to-use statement and no named alternative for listing closed tabs, windows or tab groups.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_list_themesInstalled themesARead-only
List installed themes and which one is active (AddonManager, type "theme"). Switch with browser_set_addon_state on a theme id — enabling a theme disables the previously active one, so the change is reversible.
| 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 real behavioral context beyond that: the mutual-exclusion semantics of theme activation and the resulting reversibility. It does not describe the exact return fields (id, name, active flag), which is the only missing behavioral detail for a listing tool.
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 what is returned and followed by the actionable switch path. No filler or repetition of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read-only listing tool with no output schema, the description covers what is listed, what the key state is (active theme), and how to act on the result. Only the exact shape of returned entries is unspecified, which is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate and the schema is trivially complete. Baseline 4 applies; no parameter guidance is needed.
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?
States a specific verb and resource ('List installed themes') plus the added dimension of which one is active, and scopes it to AddonManager type 'theme', which separates it from the generic browser_list_addons. It does not acknowledge the equally relevant sibling browser_set_theme, so differentiation is clear in intent but slightly incomplete.
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?
Gives concrete next-step guidance: use browser_set_addon_state on a theme id to switch, and explains that enabling a theme disables the previously active one so the change is reversible. It offers no explicit when-not-to-use or comparison against browser_list_addons, and oddly omits the existing browser_set_theme sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_list_user_contextsList user contexts (containers)ARead-only
List BiDi user contexts. The "default" one always exists; others are containers created via browser.createUserContext.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already establishes the safety profile, so the description only needs to add context. It usefully discloses the invariant that a "default" context always exists, which is real behavioral information, but says nothing about ordering, whether ids or names are returned, or whether the list can be empty.
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 short sentences, zero waste, with the identity of the resource front-loaded and the existence invariant second. Nothing repeats the title verbatim beyond what is needed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read-only list with no output schema, the description covers what the tool enumerates and the one non-obvious invariant (the default context). A brief note on return shape (ids vs. names) would close the remaining gap, but nothing an agent needs in order to call it is missing.
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 takes zero parameters, so the baseline is 4; there is nothing for the description to disambiguate. The description adds no spurious parameter-like guidance.
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?
States a specific verb and resource ("List BiDi user contexts") and the parenthetical in the title plus the "containers" framing makes clear this is not tab/window enumeration. It is clearly distinct from browser_list_tabs and browser_list_windows, though the description itself never names those siblings to make the contrast explicit.
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 note that "the default one always exists; others are containers created via browser.createUserContext" implies when this list is useful and where entries come from, but there is no explicit when-to-use / when-not-to-use guidance. It also references a BiDi command name rather than the sibling tool browser_create_container, which an agent may not connect to the actual callable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_list_windowsList browser windowsARead-only
List Firefox windows with their state and geometry (privileged context).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already establishes this as a safe read. The description adds real value with '(privileged context)', warning the agent that an elevated permission context is required, and it names the returned fields (state, geometry). It does not cover ordering, whether all windows or only some are returned, or the shape of the geometry data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that covers resource, returned data, and the key constraint with zero filler. Every clause 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?
There is no output schema, and the description names the salient return data (state and geometry), which is adequate for a zero-parameter list tool. Minor gap: it does not say what 'state' values are possible (e.g. minimized, maximized) or how many windows typically come back.
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 takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. Schema coverage is 100% on an empty object, so no parameter explanation is needed.
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?
States a specific verb and resource ('List Firefox windows') plus what each entry contains ('state and geometry'). It implicitly separates itself from browser_list_tabs and browser_get_window_geometry, though it never names those siblings to make the boundary explicit.
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 parenthetical '(privileged context)' hints that this requires elevated permission, but there is no explicit guidance on when to call this versus browser_get_window_geometry, browser_info, or browser_list_tabs. Usage is only implied by the resource name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_memory_usageReport process memory usageARead-only
Read live memory figures from nsIMemoryReporterManager. MEASURED: resident / residentUnique / heapAllocated are properties (not methods) and getReports() also exists for the full breakdown. Use this when a page feels heavy and you want numbers rather than guesses.
| 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, so safety is covered. The description adds real value beyond that by disclosing the shape of the data ('resident / residentUnique / heapAllocated are properties (not methods)' and that getReports() exists for a fuller breakdown), which is exactly the kind of implementation detail that prevents misuse.
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 tight sentences with the core action front-loaded and the usage cue second. The 'MEASURED:' label is slightly jargon-heavy but it efficiently flags the property-vs-method caveat.
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?
With no output schema, the description carries the burden of indicating what comes back, and it names the three key properties plus getReports(). It doesn't describe units (bytes vs MB) or the overall response envelope, so it is strong but not exhaustive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters and the empty schema is fully described, so there is nothing for the description to compensate for. Baseline 4 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?
States a specific verb and resource ('Read live memory figures from nsIMemoryReporterManager') and names the concrete values exposed, which separates it cleanly from siblings like browser_get_cache_usage or browser_get_tab_processes. It stops short of explicitly contrasting those siblings, so it lands just under a 5.
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?
"Use this when a page feels heavy and you want numbers rather than guesses" gives a clear situational trigger. It does not mention when-not-to-use or point at alternative memory/diagnostic tools, which keeps it at 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_mouse_actionRight-click, double-click, middle-click or holdA
Perform a mouse action other than a plain left click: right button (context menu), middle button, double-click, or press-and-hold for N ms. Target by selector or viewport coordinates. The page sees the matching mousedown/mouseup/contextmenu events with the right button number. NOTE: a site that blocks the context menu in JavaScript (preventDefault on contextmenu) will still block it — that is the page deciding, not the input layer.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | Viewport x (when no selector) | |
| y | No | Viewport y (when no selector) | |
| count | No | Click count: 1 single, 2 double (default 1) | |
| button | No | Mouse button (default left) | |
| holdMs | No | Hold the button this long before releasing (default 0) | |
| context | No | Tab context id (default: the active tab) | |
| selector | No | Element to act on | |
| modifiers | No | Modifiers held during the click |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds critical behavioral guarantees not found in the schema, specifically that the page receives standard mousedown/mouseup events. Most importantly, it transparently warns that JavaScript preventDefault actions (like context menu blocking) will override the tool's action, which is vital for agent reliability.
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, efficiently packing the tool's core capabilities, target scope, and critical failure modes into a dense but readable format without unnecessary filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-level browser interaction tool, the description provides essential context regarding event propagation and environmental limitations (JS blocking). Combined with the detailed schema, this makes the definition highly complete for selection and correct invocation.
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 coverage is 100%, establishing a high baseline. The description complements this by clarifying the functional meaning of complex parameters, such as using the 'count' parameter for double-clicking or 'holdMs' for press-and-hold.
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 title and description clearly differentiate this tool from simpler clicking functions (like browser_click) by specifying it handles right-clicks, middle clicks, double-clicks, and press-and-holds. It focuses precisely on non-standard mouse interactions.
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 defines its scope as performing actions 'other than a plain left click.' This implies usage context: use this when a standard click isn't enough, which is a clear operational guide for the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_move_tabReorder a tabA
Move a tab to a new position in the tab strip. target is one of: start, end, before, after, index. For before/after give the reference tab context; for index give a 0-based position. This is drag-and-drop on the tab strip, done without the mouse (gBrowser.moveTabTo / moveTabToStart / moveTabToEnd).
| Name | Required | Description | Default |
|---|---|---|---|
| index | No | 0-based position for target=index | |
| target | Yes | Where to move it | |
| context | No | Tab to move (default: the active tab) | |
| reference | No | Reference tab context for before/after |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is not read-only, and the description is consistent with a mutation operation. It adds useful behavioral context by describing the operation as tab-strip drag-and-drop performed without the mouse and naming the underlying tab-move mechanisms, though it does not discuss failure modes or side effects such as active-tab changes.
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?
Front-loads the core action and then explains target modes efficiently in three short sentences. The final parenthetical API names are slightly implementation-heavy, but they still reinforce that this is a low-level tab-strip reorder.
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 relatively simple reorder tool with a fully described schema and no output schema, the description covers what the tool does and how target modes work. It could be more complete by explicitly contrasting sibling tab-move tools, but no essential calling information is missing.
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 schema already documents all four parameters. The description mirrors the same conditional guidance for target modes and 0-based indexing rather than adding syntax, validation, or edge-case behavior 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?
States a specific verb and resource: moving a tab to a new position in the tab strip. The 'tab strip' scope distinguishes it from siblings like browser_move_tab_to_window or browser_move_tab_to_group, though it does not explicitly name those alternatives.
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?
Explains how to use each target mode, especially before/after with a reference and index with a 0-based position. However, it does not explicitly say when to choose this tool over related sibling tools for moving tabs between windows, groups, or containers, leaving that inference to the reader.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_move_tab_to_containerReopen a tab inside a containerA
Reopen the current page in a tab belonging to a container/user context, then close the original (ContextualIdentityService). This is how the tab context menu moves a tab into a container. Get container ids from browser_list_user_contexts; the page reloads, so in-page state is lost.
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Tab context id to move (default: the active tab) | |
| userContext | Yes | Container id from browser_list_user_contexts |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses important behavior beyond the readOnlyHint=false annotation: the original tab is closed after reopening, the page reloads, and in-page state is lost. These are exactly the side effects an agent needs to know before invoking a mutation that changes tab context. The behavior is consistent with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences and front-loads the core action and side effect. Each sentence contributes: what happens, how it relates to the context menu, where to get ids, and the state-loss warning.
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 two-parameter mutation with no output schema, the description covers the essential operational facts: container id source, original tab closure, and page reload/state loss. No critical information needed to call it correctly appears to be missing.
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 both parameters are already documented in the schema. The description reinforces that userContext ids come from browser_list_user_contexts, but it adds no additional syntax or semantics beyond what the schema provides. With high schema coverage, 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 states a specific action and resource: reopening the current page in a tab belonging to a container/user context and closing the original. It distinguishes this from generic tab moves by tying it to container contexts and the Firefox ContextualIdentityService behavior. An agent can identify this as the container-specific tab move operation without opening the schema.
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 clear usage context by explaining that this mirrors the tab context menu move and by pointing to browser_list_user_contexts for container ids. It does not explicitly name alternatives such as browser_move_tab or state when not to use this tool, so it falls short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_move_tab_to_groupMove a tab into an existing tab groupA
Move a tab into a group that already exists (gBrowser.moveTabToExistingGroup). Unlike browser_group_tabs, which creates a new group, this joins one. Get the group id from browser_list_tab_groups.
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Tab to move (default: the active tab) | |
| groupId | Yes | Target group id from browser_list_tab_groups |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only readOnlyHint=false, the description carries most of the burden and correctly frames this as a mutation that joins an existing group, including the underlying gBrowser.moveTabToExistingGroup call. It does not cover edge behavior such as what happens with an invalid group id, a tab in another window, or whether tab ordering within the group is preserved, so it falls short of full disclosure.
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 short sentences, front-loaded with the core action and differentiation before the provenance hint. The inline API name (gBrowser.moveTabToExistingGroup) is marginal value for an agent but does not bloat the 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?
No output schema exists, but this is a small two-parameter mutation whose core semantics and id source are covered, and the annotation flags it as non-read-only. Missing only failure-mode and cross-window behavior, which keeps it from a 5.
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 already documents both context (default: active tab) and groupId (from browser_list_tab_groups). The description repeats the groupId provenance but adds no syntax, format, or default details beyond the schema; 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?
States a specific verb and resource ('Move a tab into a group that already exists') and immediately contrasts it with browser_group_tabs, which creates a new group. An agent can distinguish it from siblings like browser_group_tabs and browser_move_tab without opening the schema.
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 names the alternative ('Unlike browser_group_tabs, which creates a new group, this joins one') and gives the prerequisite step of obtaining the group id from browser_list_tab_groups. The when-to-use condition is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_move_tab_to_split_viewMove a tab into the current split viewA
Move a tab into the split view that is already open in this window (gBrowser.moveTabToSplitView). Requires an existing split view — create one first with browser_split_view. Complements browser_split_view, which builds a new split view from two tabs.
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Tab to move (default: the active tab) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply readOnlyHint=false; the description adds real behavioral context beyond that: the same-window constraint ('in this window') and the hard prerequisite that a split view must already exist, which is the main failure mode. It stops short of saying what happens on failure or that a split view holds limited tabs, so it is 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?
Front-loaded with the action and its prerequisite; three short sentences with no filler. The final sentence partially restates the create-first guidance, a minor redundancy, though it usefully frames the sibling relationship. The parenthetical API name is low-value for an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-optional-parameter mutation tool with no output schema, the description covers purpose, precondition, window scope and the sibling alternative — enough to call it correctly. Missing only edge behavior such as what error occurs with no split view or capacity limits.
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% — the single context parameter is already documented as 'Tab to move (default: the active tab)'. The description adds nothing about the parameter, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (move a tab into the already-open split view) with a window scope, and explicitly distinguishes itself from browser_split_view, which creates a new split view from two tabs. An agent can select between the two without opening either schema.
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?
Gives an explicit precondition ('Requires an existing split view — create one first with browser_split_view') and names the complementary alternative with the condition that separates them. This is when-to-use and when-to-use-something-else in two sentences.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_move_tab_to_windowMove a tab into its own windowA
Take a tab out of its window and put it in a new window (gBrowser.replaceTabWithWindow). Handy to park a page on a second monitor — or to keep one page visible while the agent works in another window.
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Tab context id to move (default: the active tab) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false, so the description must carry the rest, and it does disclose the actual state change: the tab is removed from its current window and a new window is created to hold it. It stops short of saying whether the new window is focused, whether the tab becomes active there, or what happens to the source window if it empties.
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 with the core action front-loaded in the first; the API name in parentheses is useful grounding. The second sentence is slightly conversational but earns its place by supplying usage rationale.
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 one-optional-parameter mutation with no output schema, the definition covers what the tool does, the mechanism, and typical motivation. Remaining gaps (focus behavior, empty source-window handling, return value) are minor for an agent deciding whether to call 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?
Schema coverage is 100% and the single optional 'context' parameter is documented in the schema, including the default-to-active-tab behavior. The description adds no extra semantics about the parameter, so the schema does the work and 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?
States a specific verb and resource: take a tab out of its window and put it in a new window, backed by the named underlying API (gBrowser.replaceTabWithWindow). It clearly implies a distinct outcome from browser_move_tab (move within a window) and browser_split_view, but never names those siblings explicitly, so differentiation is left partly to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second sentence supplies motivating scenarios (park a page on a second monitor, keep one page visible while working elsewhere), which implies when to reach for it. However, there is no explicit guidance on when NOT to use it and no named alternative for cases like moving a tab between existing windows or splitting a view.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_multi_select_tabsSelect several tabs at onceA
Multi-select tabs so batch operations apply to all of them (gBrowser.addToMultiSelectedTabs / selectAllTabs / clearMultiSelectedTabs). Reports how many are selected. This is Ctrl+click on the tab strip, done programmatically.
| Name | Required | Description | Default |
|---|---|---|---|
| all | No | Select every tab instead of a list | |
| clear | No | Clear the selection instead of selecting | |
| contexts | No | Tab context ids to select |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply readOnlyHint=false; the description adds meaningful context by disclosing the three selection modes and that the call reports a selection count. It still doesn't say whether selection interacts with the currently active tab or whether existing selections are preserved when adding.
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 short sentences, front-loaded with the purpose before the API-name parenthetical and the analogy. The raw method names add some noise but the analogy sentence earns its place by concretizing the behavior.
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 3-optional-parameter UI-state tool with full schema coverage and no output schema, the description covers purpose, modes, and the returned count. Only the interaction between new and existing selections is left unexplained.
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 three parameters are already self-documenting; the description only loosely maps the API names to the all/select/clear behaviors. Baseline 3 is appropriate since the schema carries the 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?
States a specific verb and resource ('Multi-select tabs') plus the downstream effect ('batch operations apply to all of them'), and the Ctrl+click analogy makes the model concrete. It doesn't name a sibling such as browser_activate_tab or browser_group_tabs, so the differentiation is implicit rather than explicit.
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 'so batch operations apply to all of them' implies the use case, and naming addToMultiSelectedTabs / selectAllTabs / clearMultiSelectedTabs hints at the three modes. There is no explicit when-not guidance and no mention of alternative tools for related selection tasks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_mute_tabMute or unmute a tabA
Mute a tab so it stays silent in the background, or unmute it. Mirrors the "mute tab" item in the tab context menu. Reports whether the tab is now muted.
| Name | Required | Description | Default |
|---|---|---|---|
| muted | Yes | true to mute, false to unmute | |
| context | No | Tab context id (default: the active tab) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation readOnlyHint=false already signals a mutating operation, so the description's main added value is explaining that it toggles mute state and reports the resulting state. It does not disclose permissions, idempotency, behavior when the tab is already muted, or persistence, so it adds only moderate 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 three short sentences with the primary action front-loaded, followed by useful context and return-state information. Every sentence contributes without repetition or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter tab mutation with 100% schema coverage and a readOnlyHint=false annotation, the description gives enough context: what it does, that it mirrors the context menu, and that it reports the resulting muted state. It is nearly complete, though it lacks details such as permission requirements or failure 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%, so both the 'muted' boolean and optional 'context' parameter are already documented. The description does not add syntax, default behavior for the context parameter, or edge-case semantics beyond what the schema provides, making the baseline score 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 states a specific verb and resource ('Mute a tab ... or unmute it') and clearly identifies the operation as mirroring the tab context menu's mute item. It is readily distinguishable from sibling tab-management tools such as browser_pin_tab or browser_duplicate_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?
The description gives contextual usage ('so it stays silent in the background') and notes it mirrors the context-menu item, which implies when to use it. However, it does not explicitly state when to prefer this over alternatives or mention any exclusions or prerequisites, leaving selection guidance only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_network_continue_allRelease all held requestsA
Continue every request currently held by interception (network.continueRequest for each). This is the safety valve: call it whenever a page seems stuck while interception is on. Returns how many were released.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds useful behavior beyond the readOnlyHint=false annotation: it acts on every currently held request, maps to network.continueRequest, and returns the number released. It does not discuss whether any held requests are skipped or what happens to interception state afterward, which keeps it from a 5.
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 short sentences are front-loaded with the action, then the use case, then the return value. Every sentence contributes needed information with no waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool with no output schema, the description covers the action, the triggering condition, and the return value (count released). Nothing an agent needs in order to call it correctly is missing.
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?
This tool takes zero parameters, so the baseline is 4. The description correctly implies the operation is global and parameter-free, with no misleading parameter details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: continue every intercepted request via network.continueRequest. It clearly distinguishes this bulk release from siblings like browser_network_intercept and browser_network_provide_response by framing it as operating on all held requests.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit when-to-use rule: call it whenever a page seems stuck while interception is on, and labels it the safety valve. It does not name alternative tools such as browser_network_provide_response for handling specific held requests, so it stops just short of full alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_network_interceptStart or stop intercepting requestsADestructive
Turn BiDi request interception on or off (network.addIntercept / removeIntercept, phase beforeRequestSent). While interception is ON, matching requests are HELD until something continues them — a page can appear to hang if nothing does. ⚠️ So always pair this with browser_network_continue_all (release everything held) or browser_network_provide_response (answer one request), and turn interception OFF when finished. Intercepted requests are listed by browser_network_requests (network.beforeRequestSent).
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | start to begin intercepting, stop to release and stop | |
| urlPattern | No | Optional URL pattern to limit interception. MEASURED: the wildcard must be ESCAPED and the whole thing must parse as a URL, so use e.g. "http://127.0.0.1:8099/*" — a bare "*" fails with "Unable to parse URL" and an unescaped "*" fails with "unescaped forbidden character". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, but the description adds the crucial non-obvious consequence: matching requests are HELD and pages can appear to hang if nothing continues them. That is a genuine behavioral disclosure beyond structured metadata, and it directly justifies the destructive 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?
Front-loads the action, then the hang warning, then the remedy and the related tool. The warning icon and parenthetical protocol details are slightly verbose but every sentence carries actionable content.
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?
Covers the stateful-toggle risk and recovery path thoroughly, which is the main thing an agent needs. The remaining gap is scope: it never says whether interception applies globally, per tab, or per context — a real ambiguity given the absence of any tab/context parameter.
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%, and the urlPattern description in the schema is unusually thorough (escaping, parse-as-URL requirement), so the description need not repeat it. The description adds no parameter-level meaning of its own beyond mentioning the interception phase, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb pair (turn on/off) plus the exact resource (BiDi request interception) and even names the protocol commands (network.addIntercept / removeIntercept, phase beforeRequestSent). It is immediately distinguishable from siblings like browser_network_continue_all and browser_network_requests, which it references by 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?
Gives explicit when-to-use conditions and the required companions: pair with browser_network_continue_all or browser_network_provide_response, and turn interception OFF when finished. It also tells the agent where the resulting data shows up (browser_network_requests), leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_network_provide_responseAnswer a held request yourselfA
Fulfil one intercepted request with your own response body (network.provideResponse), instead of letting it reach the network. Pass the request id reported by browser_network_requests. Use this to stub an API, then release the rest with browser_network_continue_all.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | Response body (default empty) | |
| requestId | Yes | Request id from browser_network_requests (network.beforeRequestSent) | |
| statusCode | Yes | HTTP status code, e.g. 200 | |
| contentType | No | Content-Type header (default text/plain) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint=false annotation already signals mutation, and the description adds meaningful context: it substitutes a held request's response rather than allowing network traffic, and remaining requests are released separately. It does not discuss permissions or side effects beyond the immediate request, so it is strong 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?
Three concise sentences, front-loaded with the core action, then the prerequisite id source, then the intended workflow. No sentence is wasted.
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 four-parameter network interception tool with full schema descriptions and no output schema, the definition covers purpose, request-id provenance, and the follow-up sibling. It could more explicitly mention that interception must already be active, but the core workflow is adequately covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters are already documented. The description repeats the requestId source and mentions using your own response body, but adds little semantic detail beyond the schema; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: fulfil one intercepted request with a custom response instead of letting it reach the network. It clearly distinguishes this from sibling network tools like browser_network_requests and browser_network_continue_all.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states a clear use case ('stub an API') and identifies the follow-up sibling ('release the rest with browser_network_continue_all'). It does not explicitly cover when not to use it or how interception must first be enabled, so it stops short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_network_requestsObserved network requestsARead-only
Report network activity seen since this server connected: network.beforeRequestSent (request URL/method), network.responseCompleted (status) and network.fetchError. This observes rather than intercepts — use it to find out what a page actually loaded. Buffered in memory (most recent 500) for this connection only.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max events, newest first (default 20) | |
| method | No | Only events whose method name contains this text, e.g. "fetchError" or "responseCompleted" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true, and the description corroborates that with 'observes rather than intercepts' while adding genuinely new behavioral facts: the 500-event in-memory buffer, newest-first retention, and the per-connection lifetime ('since this server connected'). It does not say what happens on rollover or whether events survive navigation, which keeps it from a 5.
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, front-loaded with the scope constraint and closing with the buffer limit, with no filler. The middle sentence is dense with event names but each one earns its place by defining what the method filter accepts.
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?
With no output schema, the description carries the burden of describing return shape, and it does so via the enumerated event types and the newest-first 500-event buffer. A caller still has to infer the exact field layout of each event, which is the one remaining gap for a read-only observation 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 only two optional parameters, so the schema already documents limit and method fully. The description does supply the event-name vocabulary that a caller would pass to method (beforeRequestSent, responseCompleted, fetchError), which is marginal value beyond the schema's example.
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?
States a specific verb and resource ('Report network activity'), enumerates the three event types it captures, and explicitly distinguishes itself from the sibling browser_network_intercept ('observes rather than intercepts'). An agent can separate it from the interception tools without opening the schema.
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?
'Use it to find out what a page actually loaded' gives a clear context for invocation, and the observe-vs-intercept contrast implicitly routes interception needs to browser_network_intercept. It stops short of explicitly naming that sibling or stating a when-not condition, so it is strong but not complete routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_new_tabOpen a new tabB
Open a new tab, optionally navigating it to a URL. Returns the new context id.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Optional URL to open |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false, so the description is the sole source of behavior. It usefully discloses that a new context id is returned, but omits key traits: whether the new tab becomes focused/active, whether navigation is awaited before returning, and whether the prior tab state is affected.
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 short sentences, purpose first and return value second, with no filler. Nothing could be removed without losing 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?
With no output schema, the description correctly covers the return value (new context id). For a tool that mutates browser state and feeds into later tools by id, it should also say whether the tab is foregrounded and how the id relates to browser_list_tabs/browser_activate_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?
Schema coverage is 100% and there is a single optional URL parameter already documented. The description's "optionally navigating it to a URL" adds only emphasis, not format or default behavior detail 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?
Specific verb+resource ("Open a new tab") with the optional navigation and a stated return value. It does not differentiate itself from close siblings such as browser_navigate or browser_duplicate_tab, which an agent could plausibly confuse it with.
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?
There is no statement of when to use this versus browser_navigate (open a tab and load a URL in one call) or browser_duplicate_tab / browser_reopen_closed_tab. The agent must infer selection 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.
browser_new_windowOpen a new browser windowA
Open a new browser window (BiDi browsingContext.create with type "window") and return its context id. A window is a top-level context; browser_close_window closes one again. Use browser_new_tab when you only need another tab — a new window is a visible change on screen and leaves a window to clean up.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Optional URL to open in the new window | |
| background | No | false focuses the new window; default false |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply readOnlyHint=false; the description adds real behavioral context beyond that: a new window is 'a visible change on screen' and leaves an artifact requiring cleanup. That is exactly the kind of side-effect disclosure a mutation tool needs. It stops short of noting focus/background behavior or whether the window persists across sessions, so not a full 5.
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 plus a clarifying clause; the identity/return value is front-loaded and the sibling comparison follows immediately. No redundant restatement of the title or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-required-param creation tool with no output schema, the description covers what it produces (context id), what it costs (visible change, cleanup), and the correct alternative. That is everything an agent needs to choose and call 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?
Schema description coverage is 100%, so both params (url, background) are already documented in the schema; the baseline is 3. The description adds no semantics about url defaults or what background=true means for focus, so it does not exceed the baseline.
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?
States a specific verb and resource ('Open a new browser window') and grounds it in the underlying primitive (BiDi browsingContext.create with type "window"), plus declares the return value (the context id). It explicitly frames a window as a top-level context, which distinguishes it from tab-level siblings.
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?
Names the alternative explicitly — 'Use browser_new_tab when you only need another tab' — and gives the condition that selects it. It also routes cleanup to browser_close_window, so the full lifecycle decision is covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_oauth_clientsList the OAuth clients attached to the Mozilla accountARead-only
List devices and web sessions attached to the signed-in Mozilla account (listAttachedOAuthClients). MEASURED: with no account signed in it resolves to an empty array rather than throwing, and the underlying _fetchAttachedOAuthClients needs a session token, so this only returns data for a REAL signed-in account. The mock account from browser_sync_probe deliberately has no session, so it yields an empty list — that is the expected offline answer.
| Name | Required | Description | Default |
|---|---|---|---|
| refresh | No | Bypass the 4-hour cache |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the readOnlyHint annotation: it discloses that no-session resolves to an empty array rather than throwing, that a session token is required internally, and that the mock account is expected to yield an empty list. These failure-mode and edge-case details are exactly what an agent needs before calling.
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?
Purpose is front-loaded in the first clause, followed by the measured edge-case notes. Slightly dense with internal jargon ("MEASURED:", "_fetchAttachedOAuthClients") but each sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-optional-parameter read tool with no output schema and minimal annotations, the description covers invocation, preconditions, and the empty-result case. The only gap is the shape of individual client/session entries, which the agent must discover empirically.
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 single parameter `refresh` is fully documented in the schema ("Bypass the 4-hour cache"), so baseline is 3. The description adds nothing about the cache behavior or when to force a refresh, leaving that meaning entirely to 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?
States a specific verb and resource: "List devices and web sessions attached to the signed-in Mozilla account," and gives the underlying API name. The mention of browser_sync_probe distinguishes it from the neighboring sync tool without the agent opening either schema.
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?
Clearly frames the condition under which the tool is meaningful (a real signed-in account) and warns that the browser_sync_probe mock account is a deliberate mismatch that returns empty. It doesn't explicitly say "use X instead if you need Y," but the when-not context is concrete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_open_about_pageOpen one of Firefox internal about: pagesB
Open a Firefox internal page in a new tab. This covers the entries of the Tools > Browser Tools menu that are plain about: pages rather than DevTools APIs — MEASURED: the Task Manager is about:processes and Developer Tools for extensions is about:debugging. Both render real content this way. Also accepts addons, config, support, profiles, netmonitor-free pages and any other whitelisted about: name.
| Name | Required | Description | Default |
|---|---|---|---|
| page | Yes | Which about: page to open (about:<page>) | |
| background | No | Open in the background |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description usefully discloses the side effect (a new tab is created, consistent with readOnlyHint=false) and adds a real behavioral note that these pages "render real content this way." However, "any other whitelisted about: name" is vague about what the whitelist is, and the MEASURED/internal-menu framing is noise rather than operational detail.
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 purpose is front-loaded in the first sentence, which is good, but the rest rambles through menu provenance and "MEASURED" evidence that does not help an agent call the tool. The awkward clause "netmonitor-free pages" adds confusion rather than information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with full schema coverage and no output schema, the description covers purpose and the new-tab side effect adequately. It falls short on the whitelist ambiguity and says nothing about failure when a page cannot be opened.
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 an enum of 15 page names, so the schema already carries the parameter meaning. The description names a few pages but also claims it accepts "any other whitelisted about: name," which conflicts with the closed enum and could lead an agent to pass an invalid value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Open a Firefox internal page in a new tab" gives a specific verb plus resource, and the contrast with "DevTools APIs" separates it from browser_devtools_open and browser_navigate. What it lacks is an explicit naming of the sibling an agent should pick instead, so the differentiation is inferential.
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 "rather than DevTools APIs" implies the DevTools tools cover the non-about: entries, but no alternative is named and no positive/negative conditions are stated outright. An agent can infer the split, but must know the sibling list to act on it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_open_extension_optionsOpen an extension options page in a tabA
Open the options page of an extension in a new tab, resolved from its live manifest (options_ui.page or options_page). Fails clearly when the extension has no options page. Use browser_extension_details first if you want to see the URL without opening it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Extension id | |
| background | No | Open in the background |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply readOnlyHint=false, so the description must carry the rest, and it does add value: it discloses where the URL comes from (live manifest) and that the call fails clearly when no options page exists. It does not say what the failure looks like or how the 'background' flag changes tab visibility/focus.
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 short sentences, front-loaded with the action, no filler, and the alternative pointer placed last where a routing hint belongs.
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 the description compensates with the resolution rule and error behavior, which is enough for an agent to call it correctly. The only gap is the unstated effect of 'background' on tab focus, left entirely to the schema.
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 both parameters (id, background) are already documented; the description adds no meaning about the id format or what 'background' actually does to focus. Baseline 3 applies when the schema does the heavy lifting.
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?
States a specific verb and resource ('Open the options page of an extension in a new tab') and adds the resolution source (live manifest, options_ui.page or options_page), which distinguishes it from browser_extension_details and browser_open_extension_popup in the sibling list.
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 routes the agent to browser_extension_details when it only wants the URL without opening a tab, which is a real selection criterion. It does not mention the adjacent browser_open_extension_popup sibling or any preconditions (e.g. extension must be installed/enabled).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_open_extension_popupOpen an extension's toolbar popupA
Open the browser-action popup of an extension, the same thing clicking its toolbar button does. Firefox does not expose extension.browserAction to remote scripts (policy.extension is undefined), so this drives the real UI: it opens the unified-extensions panel, finds the item for this id, and clicks its action button. Reports the popup URL that ended up loaded, so silence is not mistaken for success.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Extension id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the readOnlyHint=false annotation by disclosing the mechanism: opening the unified-extensions panel, locating the entry by id, and clicking the action button. It also notes the popup URL is reported, preventing silent-failure confusion. It stops short of noting residual side effects, such as the panel remaining open or focus changes.
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, front-loaded with the action and its user-visible equivalent, then the constraint and mechanism. Dense but every sentence carries information; only the mechanism detail could be trimmed slightly.
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?
With a single required parameter, a full-coverage schema, and no output schema, the description supplies what is missing: the underlying UI mechanism and the fact that a popup URL is returned. An agent has enough to call it and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the only parameter ('id', extension id) is self-explanatory. The description ties the id to locating the matching toolbar item, but adds no format or constraint details beyond the 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?
The description opens with a specific verb and resource ('Open the browser-action popup of an extension') and grounds it in a familiar equivalent ('the same thing clicking its toolbar button does'), which clearly separates it from siblings like browser_open_extension_options and browser_close_extension_popup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains why this UI-driven path exists (Firefox does not expose extension.browserAction to remote scripts), which implies when it must be used, but it never names alternatives such as browser_run_in_extension or browser_open_extension_options, nor states exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_open_firefox_viewOpen Firefox ViewA
Open the Firefox View page (about:firefoxview), the tab that lists recently closed tabs, tabs from other devices and sync status. MEASURED: it is a plain about: page, so no privileged API is needed — bBrowser.addTab suffices. This is separate from browser_open_about_page because firefoxview is a browser/ page rather than a toolkit one, and the tool enum keeps them apart on purpose.
| Name | Required | Description | Default |
|---|---|---|---|
| background | No | Open in the background |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=false is consistent with a tool that creates a tab, and the description corroborates that a new tab is opened via bBrowser.addTab with no privileged API needed. However, the implementation note is developer-facing trivia rather than agent-relevant behavior: it does not say whether the new tab becomes active, whether an existing Firefox View tab is reused, or what the call returns. The safety profile is adequately covered by the annotation, so a 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 opening sentence is well front-loaded and the closing routing sentence earns its place. The middle 'MEASURED: it is a plain about: page, so no privileged API is needed — bBrowser.addTab suffices' is internal implementation justification that an agent cannot act on and dilutes an otherwise two-sentence definition.
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 one-optional-parameter, no-output-schema navigation tool, the description covers what opens and how it differs from the nearest sibling. Only minor gaps remain (foreground vs. background default, whether an existing view tab is focused), which are low-cost for an agent to discover by calling 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?
Only one optional parameter (background) and the schema already documents it at 100% coverage ('Open in the background'). The description never references the parameter, so it adds nothing beyond the schema; baseline 3 applies when the schema carries the full burden.
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?
States a specific verb (open) and a specific resource (the about:firefoxview page), then enumerates what that page shows (recently closed tabs, tabs from other devices, sync status). It also explicitly names the sibling it is not — browser_open_about_page — so an agent can pick between them without opening a schema.
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 third sentence gives a clear routing rule: firefoxview is a browser/ page rather than a toolkit page, which is why it lives in its own tool instead of browser_open_about_page. That is genuine sibling-level guidance, though it is framed as an explanation of design rather than an explicit 'use this when / not when' instruction, and it says nothing about prerequisites or side effects.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_page_infoCurrent page infoARead-only
Read the active tab title and URL.
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Tab context id (default: the active tab) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description is consistent with a safe read. It adds no further behavioral context: no note on what happens if no tab is active, no pagination/return detail, and it does not acknowledge that the operation can target a non-active tab via the context parameter.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence, front-loaded with the verb and resource, with no filler whatsoever.
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 trivial read-only getter with no output schema and full parameter documentation, this is close to sufficient. The only missing piece is a hint about the shape of the returned data or behavior when no tab is active.
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?
Only one optional parameter with 100% schema description coverage, so the baseline is 3. The description says 'active tab' while the schema allows any tab context id with the active tab as default, leaving that flexibility to the schema rather than reinforcing it.
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?
Specific verb (Read) plus concrete resources (title and URL) scoped to the tab. It is distinguishable from browser_info and browser_list_tabs by the 'active tab' focus, though it never names those siblings to make the boundary explicit.
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 is only implied: an agent can infer it should call this when it needs the current page's title or URL. There is no explicit when-to-use, when-not-to-use, or pointer to alternatives such as browser_list_tabs for other tabs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_page_sourceGet the page HTML sourceARead-only
Return the serialised DOM of a tab (document.documentElement.outerHTML). This is what the page looks like after scripts ran. It is NOT the original bytes on the wire, so it is not the same as the View Source menu item — use the network tools if the raw response matters.
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Tab (default: the active tab) | |
| maxChars | No | Truncate the result (default 20000) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds meaningful behavioral context: the result reflects the page after scripts ran, is not the original wire bytes, and differs from View Source. It does not detail truncation behavior or auth constraints, but for a read-only DOM inspection tool the disclosure is strong.
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 efficient sentences, front-loads what is returned, then immediately clarifies the important distinction from raw network bytes. Every sentence 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 two-parameter read-only tool with full schema coverage and no output schema, the description supplies the essential return-shape and semantic distinction. An agent has enough information to invoke it correctly and knows where to go if raw response bytes are needed.
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 both context and maxChars are fully documented in the schema. The description adds no additional parameter semantics beyond what the schema already provides, which is acceptable at the baseline.
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 names a specific operation — returning the serialised DOM of a tab via document.documentElement.outerHTML — and clearly distinguishes it from raw network response retrieval. This lets an agent choose it over the network sibling tools without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use this tool (post-script DOM inspection) and when not to use it (raw bytes, View Source), naming the alternative network tools. The selection condition is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_pdfExport the page as PDFARead-only
Render the page to PDF and return it base64-encoded (verified: browsingContext.print returns %PDF-1.4). Unlike browser_screenshot this covers the WHOLE document, including parts below the viewport, so it is the way to capture a long page. Note the output is binary and can be large; write it to a file to view it.
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Tab context id (default: the active tab) | |
| landscape | No | Landscape orientation (default false) | |
| printBackground | No | Print background colours and images (default true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true; the description adds substantial context beyond that — output is binary base64, may be large, and should be written to a file, with an observed format marker (%PDF-1.4). It does not cover pagination, paper size defaults, or whether rendering is awaited before capture.
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 doing distinct work: what it does and returns, how it differs from the screenshot sibling, and a practical caveat about output size. Core action and return format are 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?
With no output schema, the description correctly carries the return-value burden (base64 PDF, potentially large). Combined with 100% parameter coverage, the only real omission is routing guidance against browser_print.
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 three parameters (context, landscape, printBackground) are already fully documented with defaults. The description adds no syntax or behavioral detail about them, 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?
States a specific verb and resource ('Render the page to PDF and return it base64-encoded') plus the return encoding, and explicitly contrasts scope with browser_screenshot. An agent can identify the tool without opening the schema.
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?
Gives a clear selection rule: use this for full-document capture, use browser_screenshot for viewport capture, and it names the long-page case explicitly. It does not, however, address the closely related browser_print sibling, leaving one plausible alternative un-disambiguated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_pick_color_atRead the colour of one viewport pixelARead-only
Capture the viewport and return the colour at a CSS-pixel coordinate (x from the left, y from the top). Fully deterministic: it decodes the screenshot in-process, so no eyedropper and no human click is needed. Coordinates are CSS pixels; the screenshot is physical pixels, so devicePixelRatio is applied internally.
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | X in CSS pixels from the left edge of the viewport | |
| y | Yes | Y in CSS pixels from the top edge of the viewport | |
| context | No | Tab context id (default: the active tab) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so safety is covered. The description adds genuinely useful behavior ('fully deterministic', 'decodes the screenshot in-process', devicePixelRatio applied internally), but omits the return format (hex, rgb(), alpha channel?) which matters because there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action and coordinate convention, followed by determinism and the DPR caveat. Nothing is redundant or padded.
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?
With no output schema, the description should specify what 'the colour' looks like (format, alpha handling, behavior when coordinates are out of bounds). Those gaps are significant for a value-returning tool, though the coordinate model and determinism guarantees are well covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds real meaning beyond the schema by explaining that input coordinates are CSS pixels while the screenshot is physical pixels and DPR is applied internally, which clarifies why x/y are not raw image offsets.
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?
States a specific verb and resource ('return the colour at a CSS-pixel coordinate') plus the mechanism ('capture the viewport'). It is clearly distinguishable from browser_eyedropper and browser_screenshot by being programmatic and single-pixel.
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 eyedropper and no human click is needed' implicitly routes the agent away from browser_eyedropper toward this tool. However, it never states an explicit when-to-use condition or a when-not-to-use case (e.g., when a full screenshot is preferable).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_picture_in_pictureOpen a Document Picture-in-Picture windowA
Open a floating always-on-top mini window showing a URL (Document Picture-in-Picture). MEASURED: requestWindow throws "requires user activation" when called cold, so this tool first performs a real click in the page to satisfy that requirement. PiP windows are per-document: closing the tab closes the window.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | URL to show (default: the current page) | |
| width | No | Window width (default 320) | |
| height | No | Window height (default 240) | |
| context | No | Tab context id (default: the active tab) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real value beyond the readOnlyHint=false annotation: it discloses that a genuine click is synthesized in the page first (a side effect that could trigger page handlers) and that the window's lifetime is tied to the tab. What is left unsaid is whether the click target matters or whether the synthetic click can have unintended consequences on arbitrary pages.
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 carrying distinct information: what it does, the non-obvious activation workaround, and the lifecycle constraint. The capability statement is front-loaded with zero filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Four optional parameters are fully covered by the schema, and the description handles the two behaviors an agent could not infer. The only gap is that, with no output schema, it does not say what the call returns (a window handle, id, or nothing), which matters for follow-up calls.
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 url, width, height, and context are all documented in the schema itself. The description adds no syntax, format, or interaction detail for any of them, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Open a floating always-on-top mini window showing a URL' — and names the underlying API (Document Picture-in-Picture). No sibling tool offers this capability, so the agent can identify it immediately from the name-plus-description pair.
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 is implied by the capability description (a floating, always-on-top mini window), but it never states when to prefer this over browser_new_window, browser_split_view, or browser_set_window_state. No exclusions or prerequisites are given beyond the user-activation workaround.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_pin_tabPin or unpin a tabA
Pin a tab (it shrinks to an icon and stops being closed by "close others") or unpin it again. This is the same state the tab context menu toggles.
| Name | Required | Description | Default |
|---|---|---|---|
| pinned | Yes | true to pin, false to unpin | |
| context | No | Tab context id (default: the active tab) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation only says readOnlyHint=false, so the description must carry the behavior, and it does: it discloses the concrete state change (icon-sized tab) and the protective interaction with "close others." It stops short of saying whether the pinned state persists across session restore or browser restart, which matters for a persistent-flag 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 short sentences, zero filler; the effect is front-loaded in parentheses before the secondary note about the context menu. Nothing could be removed without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-parameter, no-output-schema toggle with a thin annotation, the description covers purpose, effect, reversibility, and UI equivalence. The remaining gap is persistence/lifecycle of the pinned state, which an agent might reasonably want before pinning at scale.
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% and the boolean is fully documented ("true to pin, false to unpin"), as is the context default. The description adds nothing parameter-specific beyond the toggle semantics implied by "or unpin it again," 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?
States a specific verb and resource ("Pin a tab... or unpin it") and immediately explains the observable effect: it "shrinks to an icon and stops being closed by 'close others'." That effect also distinguishes it from the tab-closing siblings like browser_close_other_tabs without the agent needing to open either schema.
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?
"This is the same state the tab context menu toggles" anchors it to a familiar UI action, and the effect implies the use case (keep a tab out of bulk-close operations). However, there is no explicit guidance on when to pin instead of, say, grouping or duplicating a tab, and no stated prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_press_keyPress a key or key combinationA
Send a real key press, optionally with modifiers — Ctrl/Shift/Alt/Meta plus one key. Works for shortcuts (Ctrl+A, Ctrl+C, Ctrl+V, Ctrl+Z), navigation (Tab, Enter, Escape) and repeated keys. Uses BiDi input.performActions with the "key" action type, so pages see ordinary keydown/keyup events with the modifier flags set. Give keys in the WebDriver key vocabulary: Control, Shift, Alt, Meta, Enter, Tab, Escape, Backspace, Delete, ArrowUp/Down/Left/Right, Home, End, PageUp, PageDown, F1-F12, or a single character.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | The key itself (e.g. "a", "Enter", "ArrowDown", "F5") | |
| repeat | No | Press this many times (default 1) | |
| context | No | Tab context id (default: the active tab) | |
| modifiers | No | Modifier keys held during the press |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the lone readOnlyHint=false annotation: it discloses the underlying mechanism (BiDi input.performActions with the 'key' action type) and, importantly, that pages will observe ordinary keydown/keyup events with modifier flags set. That is exactly the kind of side-effect context an agent needs before firing keystrokes at a live page.
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?
Front-loaded with the action and its modifier capability, then the use cases, then the format contract. The key-vocabulary enumeration is long but functional; little is wasted, though the BiDi sentence could be trimmed.
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?
With no output schema, the description needs to cover what happens on invocation, and it does through the keydown/keyup/BiDi disclosure. For a 4-parameter, single-required-field tool this is nearly sufficient; only tab-context behavior is left entirely to the schema.
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 already 100%, so the baseline is 3; the description earns extra credit by supplying the full WebDriver key vocabulary and the rule that modifiers are 'plus one key', which lets an agent construct valid values without guessing. It does not describe the context or repeat parameters, but the schema's own descriptions are adequate there.
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?
Opening sentence gives a specific verb+resource ('Send a real key press, optionally with modifiers') and scopes what counts as a key. It implicitly distinguishes itself from siblings like browser_key_hold and browser_type through the press semantics, though neither is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Concrete use cases are enumerated (shortcuts such as Ctrl+A/Ctrl+V, navigation keys, repeated presses), which gives an agent clear conditions for reaching for this tool. It stops short of stating when NOT to use it or naming browser_key_hold/browser_type as alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_printOpen the print UI, print preview or page setupA
Open the printing surface for a tab. MEASURED: PrintUtils is NOT a module — it is the global object defined by chrome/toolkit/content/global/printUtils.js and reachable as PrintUtils on the browser window. It offers startPrintWindow, togglePrintPreview, showPageSetup, getPrintSettings and handleSystemPrintDialog (there is no print()/showPrintDialog()). Use browser_pdf when you want the PDF without any UI.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | print = open print UI; preview = toggle preview; page-setup = page setup dialog |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=false correctly signals a side-effecting UI action, and the description reinforces that a real printing surface opens. The remaining content — that PrintUtils is a global rather than a module, and which helper methods exist — is implementation trivia rather than behavior an agent needs; nothing says whether the dialog blocks the session or what the call returns.
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 first and last sentences are tight and front-loaded, but the middle MEASURED paragraph about PrintUtils internals and absent methods consumes most of the text without helping tool selection or invocation.
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 one-parameter UI-opening tool with no output schema and only a readOnlyHint annotation, the description covers purpose and the PDF alternative but leaves out whether the call returns immediately, whether it requires an active tab, and how the agent should proceed after the dialog opens.
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% and the single enum parameter already documents print/preview/page-setup with inline meanings. The description adds no further semantics for the action values, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a concrete verb and resource ('Open the printing surface for a tab'), and the final sentence names the sibling it is not (browser_pdf). The middle section drifts into internal API trivia, but the core purpose is unmistakable and distinguishable from the many tab/PDF siblings.
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 routes the agent: 'Use browser_pdf when you want the PDF without any UI,' which cleanly separates the two paths for producing printable output. It does not state preconditions (e.g. whether a tab must be active/focused) or when-not to open the UI at all.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_profile_infoWhich Firefox profile is this?ARead-only
Report the profile the connected Firefox is running with: profile directory (ProfD), its name, the local cache directory, whether it is the default profile, and whether this Firefox was started with MOZ_REMOTE_ALLOW_SYSTEM_ACCESS. Use it to confirm you are driving the browser you think you are. NOTE: the profile is chosen when Firefox STARTS; this server attaches to an already-running browser and cannot switch it. To work against another profile, start a second Firefox with "-profile " plus its own --remote-debugging-port, then register a second MCP entry pointing at that port.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply readOnlyHint=true; the description carries the real behavioral weight by disclosing the hard limitation that profile switching is impossible at runtime and by naming the environmental prerequisite (MOZ_REMOTE_ALLOW_SYSTEM_ACCESS) it reports on. It also implicitly enumerates the response contents, so the agent knows what evidence it will get back for verification.
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, front-loaded with the payload first, then the use case, then the immutability caveat and workaround. Every sentence adds decision-relevant information and nothing is repeated from the schema or annotations.
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?
With no output schema, the description fills the gap by naming the specific fields returned. Combined with the disclosed runtime constraint and the alternative approach, an agent has everything needed to decide whether to call it and how to interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. The description correctly implies no input is needed, staying consistent with the empty 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?
States a specific verb (report) and resource (the running Firefox profile), and enumerates exactly what is returned: ProfD, profile name, local cache dir, default-profile flag, and MOZ_REMOTE_ALLOW_SYSTEM_ACCESS status. This is clearly distinguishable from nearby siblings like browser_info and browser_page_info, which describe the browser/page rather than the profile identity.
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?
Gives an explicit use case ('confirm you are driving the browser you think you are') and an explicit non-use constraint ('the profile is chosen when Firefox STARTS; this server... cannot switch it'). It then supplies the concrete alternative workflow (launch a second Firefox with -profile <dir> and its own --remote-debugging-port, register a second MCP entry), so the agent knows both when to call this and what to do when it is the wrong tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_quitQuit FirefoxADestructive
Ask the connected Firefox to exit (browser.close). This tears down the browser and this server loses its connection until Firefox is started again, so use it deliberately. LIMIT (measured): it CANNOT rescue an already-leaked session. Firefox allows ONE active BiDi session; when a client is killed with SIGKILL it never sends session.end, every call — including this one, since it must open a session too — fails with "Maximum number of active sessions". In that state only restarting Firefox externally helps. What this tool does give you is a clean, orderly shutdown while a session IS available, instead of killing the process.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say destructive/not-read-only; the description adds real consequences: the browser is torn down, the server loses its connection until Firefox restarts, and the one-active-BiDi-session limit means this call fails with 'Maximum number of active sessions' in the leaked-SIGKILL state. That is precisely the kind of runtime behavior annotations cannot convey.
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?
Front-loaded with the action and its consequence, then the limitation, then the value proposition — good ordering. It runs long for a zero-param tool and 'use it deliberately' plus the closing sentence restate the caution slightly, but no sentence is pure filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters, no output schema, and only coarse annotations, the description carries the full burden and meets it: it covers the effect, the loss of connection, the known limitation, and the recovery path. An agent has everything needed to decide to call it or not.
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 has zero parameters, so there is nothing to disambiguate; the baseline for a 0-param tool is 4. The description adds no parameter guidance because none is needed.
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?
States a concrete verb and resource ('Ask the connected Firefox to exit (browser.close)') and is clearly distinguishable from the many browser_close_tab / browser_close_window / browser_*_session siblings. The scoping is unambiguous: whole-browser shutdown, not tab or window teardown.
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 says when to use it ('a clean, orderly shutdown while a session IS available, instead of killing the process') and when it will not work ('it CANNOT rescue an already-leaked session ... only restarting Firefox externally helps'). It even names the failure condition that diverts the agent to an out-of-band action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_reader_modeOpen a page in Reader ViewA
Open a tab in Reader View (about:reader) or report whether the current page is reader-able. MEASURED: ReaderMode lives at moz-src:///toolkit/components/reader/ReaderMode.sys.mjs (NOT resource:// — that path fails), and about:reader?url= is the page form. This is the "reading mode" that strips chrome and ads from an article.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | open = go to about:reader; is-readable = ask ReaderMode | |
| context | No | Tab (default: the active tab) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds genuinely useful behavior context not present in annotations: the exact module path that works (moz-src:///...) versus the one that fails, and the about:reader?url=<encoded> URL convention. This is a real implementation gotcha an agent would otherwise stumble on. It doesn't cover permissions or what happens to the existing tab, and readOnlyHint=false is consistent with opening a tab.
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 compact sentences with the core capability front-loaded. The 'MEASURED' aside is technical but earns its place as an actionable implementation detail; nothing is padding.
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 two-parameter tool with no output schema, the description covers purpose and the tricky implementation path well. The one gap is that it doesn't say what is-readable returns (a boolean, presumably), which matters slightly since there is no output schema.
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% and both parameters are already documented, including the action enum. The description's about:reader detail adds marginal meaning to 'open' but nothing new about the 'context' parameter or token format.
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?
States a specific verb and resource ('Open a tab in Reader View') plus a second mode ('report whether the current page is reader-able'), which is unambiguous. It also clarifies the underlying page form (about:reader?url=<encoded>), distinguishing it implicitly from browser_open_about_page/browser_navigate, though no sibling is named.
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 two modes are described, but there is no explicit guidance on when to choose this over browser_navigate, browser_open_about_page, or browser_page_info, nor any prerequisite for the is-readable check. Usage is inferable from the action names rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_relax_certificate_checksRelax or restore TLS certificate checkingADestructive
SECURITY SENSITIVE. Switches the certificate-checking preferences that make a self-signed or internally issued test certificate usable: cert pinning, OCSP and OCSP stapling/must-staple. relax:true turns those checks off; relax:false puts them back. Restoring is precise: a preference that had no user value before is cleared so it falls back to the Firefox default again, instead of being overwritten with a guess. The pre-relax values are remembered by THIS SERVER PROCESS, so restore only works while it is alive; if the server restarted, restore reports that instead of guessing. Some TLS changes only affect new connections.
| Name | Required | Description | Default |
|---|---|---|---|
| relax | Yes | true to relax the checks (unsafe), false to restore what was there before |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by naming exactly which checks are disabled (pinning, OCSP, stapling/must-staple), disclosing the reversibility constraint (pre-relax values live only in this server process, restore fails after a restart rather than guessing), and noting that some TLS changes apply only to new connections. readOnlyHint=false and destructiveHint=true are consistent with this.
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?
Front-loads the SECURITY SENSITIVE warning and then proceeds in a logical order: what changes, how to reverse, caveats. Sentences are dense but each carries information; the restore-precision sentence is long but not redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-boolean security toggle with annotations covering the safety profile and no output schema, the description covers what is mutated, reversibility, failure behavior after a server restart, and when effects take hold. Nothing needed to call it correctly is missing.
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 boolean is already documented, but the description adds real meaning: relax:true disables the checks and is unsafe, and relax:false performs a precise restore that clears pre-existing-empty prefs back to Firefox defaults instead of writing a guessed value. That extra semantics is genuinely useful 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?
States a precise verb set (switches/relax/restore) and a specific resource (certificate-checking preferences: pinning, OCSP, OCSP stapling/must-staple), so the agent knows exactly what state changes. It is clearly distinguishable from pref-level siblings like browser_set_pref and from override management like browser_certificate_manage.
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?
Gives a clear usage context — making a self-signed or internally issued test certificate usable — and both modes (relax:true to disable, relax:false to restore). It flags the unsafe direction explicitly, but never names an alternative (e.g. certificate overrides) or states when not to use it, so routing is inferred rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_remote_debuggingInspect or change the DevTools remote debugging server settingsA
Report or change Firefox remote debugging settings — the "Remote Debugging" entry in the Browser Tools menu. MEASURED on Firefox Developer Edition: the port lives in the integer pref devtools.debugger.remote-port (observed 6000) and the server module is resource://devtools/server/devtools-server.sys.mjs (an object, so this build does ship a DevTools server). Note that DSH itself talks to Firefox over WebDriver BiDi on the separate --remote-debugging-port flag, which is not this pref.
| Name | Required | Description | Default |
|---|---|---|---|
| port | No | Port to use when enabling (default keeps current) | |
| action | Yes | status = read only; enable/disable flips the prefs |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only give readOnlyHint=false, so the description carries the burden and does add real context: the exact pref name, an observed value, the server module path, and the crucial note that this pref is distinct from the BiDi flag DSH uses. It stops short of saying whether enable/disable takes effect immediately or requires a browser restart.
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?
Front-loaded with the purpose, but the evidence dump ('MEASURED on Firefox Developer Edition... an object, so this build does ship a DevTools server') is diagnostic noise for an invoking agent. The one genuinely load-bearing sentence is the BiDi-flag caveat at the end.
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?
There is no output schema, so the description should say what a 'status' call returns and whether pref changes require a restart — neither is covered. For a two-parameter, no-output-schema tool it is adequate but leaves the operational consequences of enable/disable unexplained.
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 action enum is self-documenting ('status = read only; enable/disable flips the prefs'), so baseline 3 applies. The description adds only the mapping of the port parameter to devtools.debugger.remote-port, with no further detail on default/retention behavior.
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?
States a specific verb pair (report or change) plus the exact resource (Firefox remote debugging settings, i.e. the Browser Tools > Remote Debugging entry) and even names the underlying pref. It does not explicitly distinguish itself from siblings that could touch the same pref (browser_get_pref/browser_set_pref) or from browser_devtools_open/close, so a small ambiguity remains.
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 clarifies an important scope boundary — DSH's own WebDriver BiDi connection uses a separate --remote-debugging-port flag, not this pref — which helps avoid confusion. But it never says when to prefer this tool over browser_get_pref/browser_set_pref for the same pref, nor any prerequisites (e.g. whether a restart is needed). Usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_remove_bookmarkRemove a bookmarkADestructive
Remove a bookmark or folder by guid (PlacesUtils.bookmarks.remove). Get guids from browser_list_bookmarks, or from browser_add_bookmark which returns the guid of what it just created. Passing a folder guid removes the whole subtree, so look the entry up first.
| Name | Required | Description | Default |
|---|---|---|---|
| guid | Yes | Bookmark guid from browser_list_bookmarks |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true, so the description's job is lighter. It still adds non-obvious blowback: passing a folder guid removes the entire subtree, plus the advice to look the entry up first. It stops short of saying the removal is irreversible or whether any confirmation/undo exists.
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 short sentences: the action and parameter first, the guid source second, the folder caveat last. No filler, no repetition of the title, and the riskiest detail is placed where it will be read before the call.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter destructive tool with no output schema and full schema coverage, the description covers action, input provenance, and the subtree side effect. There is nothing further an agent needs to invoke it correctly.
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?
Only one parameter and schema coverage is 100%, so baseline would be 3; the description earns extra credit by clarifying that the guid may refer to a folder as well as a bookmark, which the schema's 'Bookmark guid from browser_list_bookmarks' does not convey.
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?
States a specific verb and resource — 'Remove a bookmark or folder by guid' — and explicitly notes the underlying API call. It is clearly distinguishable from browser_list_bookmarks and browser_add_bookmark, which are named as the guid sources rather than as alternatives for this 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?
Tells the agent exactly where to obtain the required guid (browser_list_bookmarks for existing entries, browser_add_bookmark for freshly created ones), which is the main usage hurdle. It does not, however, name any alternative removal path (e.g. browser_bookmark_manage) or state when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_remove_containerRemove a containerADestructive
Delete a container / user context by id (BiDi browser.removeUserContext). Anything stored inside that container is discarded, so check the id with browser_list_user_contexts first.
| Name | Required | Description | Default |
|---|---|---|---|
| userContext | Yes | Container id from browser_list_user_contexts |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and readOnlyHint=false, and the description goes beyond them by disclosing the consequence: anything stored inside the container is discarded. That is exactly the extra context an agent needs before committing an irreversible delete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence leads with the action and resource, then appends the destructive consequence and the safety check. No filler or redundant restatement of the title.
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 one-parameter destructive tool with no output schema, the description covers identity, effect, source of the id, and the spec-level command. Nothing an agent needs to invoke it safely is missing.
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 single parameter is already documented as 'Container id from browser_list_user_contexts'. The description's 'by id' phrasing mirrors rather than extends the schema, so 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?
States a specific verb and resource ('Delete a container / user context by id') and even names the underlying BiDi command, so an agent can distinguish it from browser_create_container and browser_list_user_contexts without consulting the schema.
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?
Gives an explicit prerequisite ordering — verify the id with browser_list_user_contexts before deleting — which routes the agent to the right sibling. It does not name an alternative tool for a different intent, but for a single-purpose destructive operation the guidance is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_remove_duplicate_tabsClose duplicate tabsA
Close tabs that load the same page as another tab, keeping one of each (gBrowser.removeDuplicateTabs). This is the same cleanup the tab context menu offers when it notices duplicates. Reports how many were closed.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The only annotation is readOnlyHint=false, so the description must carry the mutation profile — and it does explain what 'duplicate' means (same page loaded) and guarantees one tab of each set survives, plus that a count is reported. It stops short of saying whether the closed duplicates land in the recently-closed list / are recoverable via browser_reopen_closed_tab, and whether the sweep spans all windows.
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 short sentences: definition first, familiar analogy second, return value last. No restatement of the title, no filler, and the scoping rule ('keeping one of each') is front-loaded where it matters most.
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?
With zero params, no output schema and only a readOnlyHint annotation, the description covers the essentials including the return value ('reports how many were closed'), which is valuable given the missing output schema. Minor gaps: scope across windows/tab groups and recoverability of closed duplicates.
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 takes zero parameters and the schema is an empty object, so there is nothing for the description to disambiguate — baseline 4 applies. It correctly adds no pseudo-parameter speculation and instead spends its words on behavior.
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?
States a specific verb (close) and precisely scoped resource (tabs that load the same page as another tab, keeping one of each), which cleanly separates it from browser_close_tab, browser_close_other_tabs, browser_close_tabs_to_right and browser_close_tabs_by_url. The parenthetical API reference (gBrowser.removeDuplicateTabs) pins down exact semantics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the use case (deduplicating tabs) and anchors it to the tab context-menu cleanup, so an agent can infer when to reach for it. However, it never names the adjacent alternatives (browser_close_tabs_by_url, browser_close_other_tabs) or states when *not* to use it, leaving the selection decision to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_remove_loginDelete a saved loginADestructive
Delete saved logins. Give origin and optionally username; with username omitted, every login for that origin is removed. Reports how many were removed so the result can be checked.
| Name | Required | Description | Default |
|---|---|---|---|
| origin | Yes | Origin whose logins should be removed | |
| username | No | Only remove this username (default: all for the origin) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, so the safety profile is covered; the description adds the important detail the annotations cannot convey — that omitting username escalates a targeted delete into a bulk removal of all logins for the origin. It also discloses that a removal count is returned. It does not state irreversibility or whether password data is recoverable, which keeps it at 4.
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 short sentences, front-loaded with the action, then the parameters, then the return behavior. Nothing is padded and each sentence carries a distinct fact.
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?
With no output schema, the description usefully covers the return value (a removal count) and fully explains the destructive scope. For a two-parameter tool with annotations already flagging destructiveness, that is close to complete; only recovery/permission caveats are absent.
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% and both parameters already carry descriptions including the 'default: all' behavior, so the description is largely restating the schema. It reinforces the omission semantics but adds no format or syntax guidance beyond that. 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?
States a specific verb and resource ('Delete saved logins') that is unmistakably distinct from the sibling read/write login tools (browser_list_logins, browser_add_login, browser_get_login_password). It also clarifies the bulk-vs-single scope, which no sibling name implies. It stops short of naming an alternative tool, so it lands at 4 rather than 5.
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?
Explains the key selection decision the agent faces: supply username to target one entry, omit it to wipe every login for the origin. That is real when-to-use guidance for the tool's main branching point. No exclusions or prerequisite steps (e.g. verifying with browser_list_logins first) are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_remove_tab_groupRemove a tab groupA
Remove a tab group by id (gBrowser.removeTabGroup). ungroup:true keeps the tabs and just dissolves the group; without it the tabs are closed. Get ids from browser_list_tab_groups.
| Name | Required | Description | Default |
|---|---|---|---|
| groupId | Yes | Group id from browser_list_tab_groups | |
| ungroup | No | Keep the tabs and only dissolve the group (default false = close tabs) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only readOnlyHint=false in annotations, the description carries the critical disclosure: the default path closes the tabs, while ungroup:true preserves them. That is exactly the destructive-vs-safe distinction an agent must know before invoking it.
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 short sentences, zero filler, with the destructive default surfaced before the id-sourcing pointer. Nothing could be removed without losing meaning.
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 two-parameter, one-required tool with no output schema and full schema coverage, the description covers purpose, safety semantics, and id source. Nothing an agent needs to call it correctly is missing.
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% and both parameters are already documented in the schema, including the 'default false = close tabs' note. The description restates that semantics rather than adding new detail, 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?
States a specific verb and resource ('Remove a tab group by id') and even names the underlying platform call. It is clearly distinguishable from siblings like browser_group_tabs, browser_move_tab_to_group, and browser_list_tab_groups.
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 routes the agent to browser_list_tab_groups for obtaining ids, which is the key prerequisite. It also frames the ungroup decision as a conditional, though it does not name a non-destructive alternative tool (e.g. tab closing) as a contrast case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_reopen_closed_tabReopen a closed tabA
Reopen a tab that was closed in this session (SessionStore.undoCloseTab). index 0 is the most recently closed tab; get indices from browser_list_closed_tabs. This undoes browser_close_tab, so the pair is reversible.
| Name | Required | Description | Default |
|---|---|---|---|
| index | No | 0-based position among closed tabs (default 0) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false, so the description must carry the behavioral load, and it does: 'closed in this session' is the key constraint — the tab is only recoverable from SessionStore, not after a restart. It also discloses the undo relationship to browser_close_tab, making the pair's reversibility explicit. It does not say how an invalid index is handled, which keeps it from a 5.
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, zero filler, front-loaded with the action and immediately followed by the index semantics and the sibling routing hint. Every clause is load-bearing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-optional-parameter tool with no output schema, this covers scope (session only), parameter semantics, and the inverse relationship. The only gap is error behavior for an out-of-range index, which is a minor omission rather than a blocker.
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%, but the schema description only says '0-based position among closed tabs (default 0)' and omits the ordering direction; the description supplies that critical detail — 'index 0 is the most recently closed tab' — and points to browser_list_closed_tabs as the source of valid values. That is genuine added 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?
States a specific verb and resource (reopen a closed tab) plus the underlying mechanism (SessionStore.undoCloseTab). It also names the two siblings it relates to, browser_close_tab (the inverse) and browser_list_closed_tabs (the index source), so an agent can distinguish it from the ~130 other tab tools without opening any schema.
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 tells the agent where to get valid indices (browser_list_closed_tabs) and frames the tool as the inverse of browser_close_tab, which gives a clear use condition. It stops short of stating failure modes, e.g. what happens with a stale or out-of-range index, but the positive guidance is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_reset_prefReset a preference to its defaultADestructive
Remove the user value of a preference so it falls back to the built-in default (Services.prefs.clearUserPref). Reports whether it had a user value before and whether it still has one after. Pair with browser_search_prefs to find the name, and browser_get_pref to see the current effective value.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Preference name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and readOnlyHint=false, and the description adds real value beyond them by disclosing exactly what is removed (the user value, not the preference itself) and what the fallback behavior is. It also says the result reports pre- and post-state, which substitutes for the missing output schema; what it does not state is whether the removed value is recoverable or how to capture it beforehand.
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: the action and effect first, then the return information, then the companion tools. No redundancy with the title or schema.
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 one-parameter tool with annotations present and no output schema, the description covers the mutation's effect, the fallback behavior, the reported state change, and how to discover and verify the target. Nothing an agent needs in order to call it correctly is missing.
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 a single required 'name' parameter, so the schema already carries the parameter meaning. The description only implies the name is a preference identifier via the browser_search_prefs hint, adding no format or resolution detail beyond the schema; 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?
States a specific verb ('Remove the user value') on a specific resource ('a preference') and spells out the resulting semantics ('falls back to the built-in default'), even naming the underlying API (Services.prefs.clearUserPref). This cleanly separates it from sibling mutations like browser_set_pref and from reads like browser_get_pref.
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?
Gives an explicit workflow: use browser_search_prefs to obtain the name and browser_get_pref to check the current effective value first. It names the alternatives and the condition that selects them, so an agent knows how to prepare for and verify the call rather than guessing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_responsive_modeOpen or close Responsive Design Mode (RDM)B
Open, close or query Firefox Responsive Design Mode for a tab. MEASURED details that matter: (1) the entry point is ResponsiveUIManager.openIfNeeded(window, tab, {trigger}) from module "devtools/client/responsive/manager" — that module IS the manager instance, not a container; (2) the window argument MUST come from Services.wm.getMostRecentWindow("navigator:browser"); passing gBrowser.ownerGlobal through the DevTools loader fails with "can't access property gBrowser, window is undefined"; (3) the manager must be cached on the chrome window — a fresh DevToolsLoader cannot see a UI opened through another loader, so closing would silently do nothing. IMPORTANT: iframe.rdm-toolbar is a PERMANENT node in the browser document — it stays after closing, so never use its presence to decide whether RDM is active. Use the responsive-mode class on the browser container (or the manager isActiveForTab) instead.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | What to do | |
| context | No | Tab (default: the active tab) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only readOnlyHint=false declared, the description adds substantial behavioral context: manager caching requirements, silent close failures, and the permanent iframe.rdm-toolbar node. It does not contradict the annotation, but it still omits what status returns and general side effects of opening/closing RDM.
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 purpose is front-loaded, but the body is heavily over-specified with internal module paths and DevTools loader implementation details. Those details do not help an agent select or invoke a simple two-parameter tool and make the description disproportionately long.
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 purpose and several behavioral caveats, but with no output schema it should clarify what the status action returns. Usage alternatives are also absent, leaving gaps for a status-capable, mutation-containing tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters. The description implies tab targeting but does not add meaningful semantics for action values such as toggle or status beyond what the enum 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 first sentence states a clear verb set and resource: 'Open, close or query Firefox Responsive Design Mode for a tab.' The resource is distinctive, but the description does not explicitly differentiate it from sibling tools such as browser_set_viewport or browser_devtools_open.
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 explains operations but gives no guidance on when to choose this tool over alternatives like browser_set_viewport. There are no explicit when/when-not conditions or named sibling tools to route the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_restore_sessionRestore a session from a fileADestructive
Replace the current session with one saved earlier (SessionStore.setBrowserState). WARNING: this REPLACES the windows and tabs that are open now — run browser_save_session first if you might want them back. The file must be JSON produced by the save tool; anything else is rejected before the state is touched.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute path of a file written by browser_save_session |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, but the description adds critical details beyond them: that open windows and tabs are replaced, and that invalid input is rejected before any state is touched. This tells the agent exactly what is destroyed and when the destructive action actually occurs.
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 with zero waste: the destructive warning is front-loaded and bolded, followed by the prerequisite and validation rule. It is appropriately sized for a single-parameter destructive tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter destructive tool with annotations and no output schema, the description covers the action, the danger, the prerequisite, and input validation. Nothing an agent needs to avoid data loss or misuse is missing.
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%, and the schema already describes 'path' as an absolute path written by browser_save_session. The description reinforces the same constraint ('must be JSON produced by the save tool') but does not add new syntax or format details 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?
States a specific verb and resource: 'Replace the current session with one saved earlier', and names the sibling tool that creates the file. An agent can immediately distinguish this restore operation from browser_save_session or other workspace-oriented siblings.
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 warns to run browser_save_session first if current windows and tabs might be needed, and specifies the accepted file source (JSON produced by the save tool). This gives both the prerequisite and the rejection condition for invalid files.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_run_in_extensionRun JavaScript inside an extension own pageA
Evaluate an expression inside the context of one of the extension own pages, where the WebExtension APIs (browser.*) and the extension DOM are available. It opens the page in a background tab, evaluates, then closes the tab. This is the general escape hatch behind browser_extension_storage: with it an extension that exposes no command line of its own can still be inspected and driven. The expression should return a JSON value or a string.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Extension id | |
| page | No | Relative page to run in (default: the options page) | |
| expression | Yes | JavaScript expression; may return a Promise |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only readOnlyHint=false in annotations, the description carries most of the burden and does well: it discloses that a background tab is opened, the expression is evaluated, and the tab is closed afterwards. It also states the return expectation (JSON value or string), though it doesn't explicitly warn that arbitrary evaluated code can mutate extension 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?
Four sentences, front-loaded with the core purpose, followed by the tab lifecycle, the relationship to a sibling, and the return constraint. Every sentence adds information and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates by explaining the return-value expectation and the tab lifecycle side effect. For a tool that executes arbitrary code in an extension context, an explicit note about the privilege level of the evaluated code would make it complete, but the essentials are present.
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 baseline is 3, but the description adds meaning the schema does not: it constrains what the expression should return ('a JSON value or a string') beyond the schema's note that a Promise is allowed. The 'page' default is already in the schema, so no further credit is needed there.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and scope: 'Evaluate an expression inside the context of one of the extension own pages' with browser.* APIs and extension DOM available. It explicitly positions itself against browser_extension_storage as 'the general escape hatch behind' it, letting an agent distinguish it from siblings without opening schemas.
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?
Clear context for when to use it: when an extension exposes no command line of its own but still needs to be inspected and driven, and as a fallback beyond browser_extension_storage. It lacks explicit when-not-to-use guidance (e.g., prefer browser_evaluate for normal page contexts) but the usage context is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_save_sessionSave the current session to a fileADestructive
Write the current window and tab session to a JSON file (SessionStore.getBrowserState). This only READS the browser; the file it writes is the input for browser_restore_session. Save before restoring, so the state you have now can be brought back.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute file path to write (forward slashes are fine) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description usefully clarifies that the operation only reads the browser but does write a file, which is meaningful context beyond the annotations. However, destructiveHint=true suggests the file write may overwrite existing content, and the description does not mention overwrite behavior, file replacement risk, or error handling. It does not directly contradict the annotations, but it under-discloses the destructive aspect.
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 tight sentences, front-loads the core action, and uses the remaining space to explain the save-before-restore relationship. There is no redundant or filler 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?
For a simple one-parameter save operation with no output schema, the description covers purpose, relationship to restore, and the fact that the browser is only read. The main remaining gap is the absence of information about overwriting an existing file, which matters given the destructive annotation.
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 single path parameter is fully documented in the schema, including that it must be an absolute path and that forward slashes are acceptable. The description adds that the file is JSON and consumed by browser_restore_session, but does not add further semantics about the path itself beyond the schema baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a precise verb and resource: writing the current window and tab session to a JSON file, and even names the underlying SessionStore.getBrowserState. It clearly distinguishes this from browser_restore_session by identifying the saved file as restore input.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear usage context: save before restoring so the current state can be brought back, and explicitly links the output to browser_restore_session. It does not spell out exclusions or failure cases, but the when-to-use guidance is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_screen_infoScreen and monitor informationARead-only
Report the screen the window is on: size, usable area, and the window position within it. LIMITATION (measured): Firefox exposes only the CURRENT screen to page/chrome script — Services.appShell.screenManager is undefined, so there is no way to enumerate or name other monitors from here. To place a window on another monitor, use browser_set_window_position with that monitor coordinates (they can be negative).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true already covering safety, the description still adds real behavioral context: a measured platform limitation (Services.appShell.screenManager undefined in Firefox) meaning only the current screen is ever returned and other monitors cannot be enumerated or named. That prevents an agent from assuming multi-monitor discovery is possible; the absence of return-shape detail keeps it from a 5.
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, front-loaded with what is reported, then the hard limitation, then the workaround. Every sentence carries distinct information an agent would otherwise have to discover by trial and error.
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 exists, but the description names the returned fields (size, usable area, window position within it) and explains the multi-monitor failure mode plus the alternative path. Only the exact return structure and units are left unstated.
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?
Zero parameters, so the baseline is 4 and there is nothing for the description to disambiguate. No parameter-relevant claims are made or needed.
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?
States a specific verb and resource: reports the size, usable area and window position of the screen the window is on. It also carves out its boundary against browser_set_window_position, so an agent can separate the read side from the write side without opening a schema.
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 routes multi-monitor placement to browser_set_window_position and notes coordinates can be negative, which is clear alternative-tool guidance. It does not say when to prefer this over the related sibling browser_get_window_geometry, leaving that one comparison to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_screenshotScreenshotARead-only
Capture a base64 PNG. By default only the visible viewport is captured (physical pixels, i.e. viewport size x devicePixelRatio); Firefox ignores the BiDi clip argument and this call does not scroll. Set fullPage to capture a whole scrollable area by scrolling and stitching segments inside the page (the original scroll position is restored). Pass selector to capture the full content of one scrollable element (an overflow:scroll container) — document scrolling alone would miss it.
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Tab context id (default: the active tab) | |
| fullPage | No | Capture the whole scrollable area instead of just the viewport (default false) | |
| lazyLoad | No | Before capturing, walk the area once so lazily loaded content appears and wait for its height to settle (default true) | |
| selector | No | CSS selector of a scrollable element to capture in full; implies fullPage |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond readOnlyHint: Firefox ignores the BiDi clip argument, the call does not scroll by default, fullPage stitches segments inside the page and restores the original scroll position, and coordinates are physical pixels (viewport x devicePixelRatio). These are exactly the behavioral quirks an agent cannot infer from annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first clause, then modes are ordered viewport -> fullPage -> selector, which mirrors how an agent chooses. The sentences are dense with em-dash asides but each carries a distinct behavioral fact, so little is wasted.
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?
With no output schema, the description properly states the return is base64 PNG, and it covers the main capture modes and their gotchas. The lazyLoad default behavior is only in the schema, leaving a small gap for a tool whose output is a raw payload.
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 would be 3, but the description goes further: it explains what fullPage actually does mechanically (scroll-and-stitch, scroll restore), notes that selector implies fullPage and targets a scrollable container, and clarifies the viewport default in physical pixels. Only lazyLoad goes unmentioned outside 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?
States a specific verb and resource ('Capture a base64 PNG') and describes the default scope precisely (visible viewport, physical pixels). It does not name or differentiate against siblings such as browser_pdf or browser_print, which are adjacent use cases for page capture, so it stops short of a 5.
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?
Gives clear conditional guidance: use fullPage for whole scrollable areas, use selector for a single overflow:scroll container, and notes that document scrolling alone would miss it. It does not state when NOT to use this tool or name an alternative (e.g. pdf/print for paginated output), so it is clear context without exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_scrollScroll with the wheelA
Scroll the page (or one scrollable element) using real wheel events (BiDi input.performActions type "wheel"). Give deltaX/deltaY in pixels: positive Y scrolls down. With selector, the wheel is aimed at that element, which is how inner overflow containers scroll — document.scrollTop never moves for those.
| Name | Required | Description | Default |
|---|---|---|---|
| deltaX | No | Horizontal pixels (positive = right, default 0) | |
| deltaY | No | Vertical pixels (positive = down, default 600) | |
| context | No | Tab context id (default: the active tab) | |
| selector | No | Scrollable element to aim at (default: the page) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only mark readOnlyHint=false, so the description does real work: it discloses that real wheel events are dispatched at the BiDi layer and explains the inner-container scrolling behavior that a naive scrollTop approach would miss. It is consistent with readOnlyHint=false (scrolling mutates viewport state), though it doesn't describe the return value or whether the resulting scroll position is reported.
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 tight sentences, front-loaded with what the tool does, then parameter semantics, then the key selector caveat. Every sentence contributes and none restates the schema verbatim without adding meaning.
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 4-parameter, no-output-schema tool with thin annotations, the description covers mechanism, units, direction, defaults (via schema), and the selector caveat well. The only gap is that it doesn't say what the call returns or whether scroll position is observable afterwards.
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 already 100%, so the baseline is 3. The description adds semantic value beyond the schema by explaining sign convention (positive Y scrolls down), pixel units, and, importantly, the behavioral meaning of selector beyond the schema's terse 'Scrollable element to aim at' — that it aims wheel events at inner overflow containers.
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?
States a specific verb (scroll) and resource (the page or one scrollable element) and identifies the mechanism, 'real wheel events (BiDi input.performActions type "wheel")'. This clearly separates it from sibling input tools like browser_press_key or browser_mouse_action without needing to open the schema.
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 explains the selector/no-selector choice: with a selector the wheel is aimed at that element, which is required for inner overflow containers since document.scrollTop never moves for those. It gives clear context for when this tool is needed but stops short of naming alternatives such as keyboard-based PageDown scrolling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_search_engineList, set, move or remove search enginesC
Manage Firefox search engines. MEASURED, and this is the whole trick: the SearchService is NOT reachable via resource:// in this build — it lives under the moz-src protocol, so the module id is "moz-src:///toolkit/components/search/SearchService.sys.mjs" and it exports SearchService (a singleton). That object exposes getEngines/setDefault/setDefaultPrivate/moveEngine/removeEngine/restoreDefaultEngines and the add* family (addEngineFromExtension / addOpenSearchEngine / addUserEngine). Older guidance that the service is unreachable was wrong.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Engine name, for set-default / move / remove | |
| action | Yes | What to do | |
| position | No | 1-based position for move |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only set readOnlyHint=false; the description does disclose mutating methods such as setDefault, moveEngine, removeEngine, and restoreDefaultEngines, which aligns with that annotation. However, it does not explain effects, whether reset is destructive, required permissions, or error behavior, and the add* family it describes is not in the action enum.
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 front-loaded with a short purpose sentence, but the remaining space is spent on an internal-module tangent rather than tool-selection or invocation guidance. That second sentence reads as implementation trivia from the calling agent's perspective.
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 mutating tool with no output schema, the description should cover action semantics and mutation effects; instead it mostly explains SearchService internals. An agent cannot reliably decide between this and browser_get_search_engine or browser_add_search_engine from the description alone.
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 name, action, and position are already documented in the schema. The description adds no conditional parameter requirements or syntax beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening 'Manage Firefox search engines' names the resource but uses a broad verb and never distinguishes this tool from siblings such as browser_get_search_engine, browser_add_search_engine, or browser_search_prefs. The title and action enum carry the specific operations, but the description itself does not.
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?
There is no explicit when-to-use or when-not-to-use guidance, and no routing to alternatives. The bulk of the text is an implementation note about moz-src module ids, leaving the agent to infer that list/set-default/move/remove/reset belong here and adding engines belongs elsewhere.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_search_prefsSearch preference namesARead-only
Search all Firefox preference NAMES (Services.prefs.getChildList) for a substring and report the matching names with their current values and whether a user value is set. Use it to discover the pref behind a setting before changing it with browser_set_pref. Values are truncated; this is a discovery tool, not a dump.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 40) | |
| query | Yes | Substring to match in pref names (e.g. browser.tabs) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, so the safety profile is already covered; the description adds real context beyond that by disclosing that values are truncated and that results are name-only matches with current/user-set status. This warns the agent not to treat output as a full value dump. The truncation length itself is unspecified, which is a minor gap.
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 tight sentences: what is searched, what is returned and why, then the truncation caveat. Every sentence carries information and the core action is 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?
With no output schema, the description does the work of explaining the return shape (names + values + user-value flag) and flags truncation, which is sufficient for correct invocation. Ordering and exact truncation behavior are left unstated, a small residual gap for a simple read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both 'query' (substring match, with example) and 'limit' (1-200, default 40) are already fully documented. The description adds the concept of a substring match consistent with the schema but nothing about limit semantics, 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?
States a specific verb (search) and resource (Firefox preference NAMES) plus the underlying API (Services.prefs.getChildList), and describes exactly what is reported back: matching names, current values, and whether a user value exists. This clearly separates it from browser_get_pref (single pref lookup) and browser_set_pref (mutation) among the many siblings.
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?
Gives an explicit use case and workflow: discover the pref behind a setting before changing it with browser_set_pref. It also implies an exclusion by calling itself a discovery tool rather than a dump. It does not explicitly mention browser_get_pref as the follow-up for a known exact name, so the routing is slightly incomplete but still clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_selfcheckCompatibility self-checkARead-only
Run after a Firefox upgrade: report the version and verify the non-standard pieces this server relies on (the moz:scope "chrome" scope, privileged Services access, PlacesUtils.history.executeQuery, CustomizableUI, AddonManager). A failing line means the upstream API moved and this server needs updating.
| 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, so safety is covered; the description adds the interpretive rule that a failing line means the upstream API moved and the server needs updating. That goes beyond the annotation by telling the agent how to read the result, though it doesn't specify output format beyond "lines".
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?
Front-loaded with the trigger and purpose, then a compact enumeration of the checked APIs. The parenthetical list is long but each item is meaningful evidence of what is verified; no filler sentences.
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?
With no output schema, the description carries return-value meaning and does so adequately: version reported, per-check lines, and failure interpretation. Only the exact result shape (pass/fail per line, error text) is left implicit.
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?
Zero parameters, so the baseline of 4 applies. Nothing in the description is needed to explain inputs, and nothing misleads about them.
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?
States a specific verb and resource pair — report the Firefox version and verify named privileged APIs (moz:scope, PlacesUtils.history.executeQuery, CustomizableUI, AddonManager). No sibling tool overlaps this diagnostic role, so the agent can distinguish it immediately.
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?
"Run after a Firefox upgrade" gives a concrete trigger condition, which is the main usage question here. It does not name an alternative or state when not to run it, but no sibling performs a compatibility check, so the omission is minor.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_set_addon_stateEnable or disable an add-onADestructive
Turn an installed extension on or off by id (AddonManager, privileged context). MEASURED: BiDi itself has no webExtension.* commands, so the privileged route is the only one available. Disabling is reversible; get ids from browser_list_addons.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Add-on id, as reported by browser_list_addons | |
| enabled | Yes | true to enable, false to disable |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare a non-read-only, destructive-hinted mutation; the description adds genuinely new behavioral facts: it requires a privileged context (AddonManager) and that disabling is reversible, which softens the destructive hint and tells the agent the state change can be undone. The privilege requirement is the kind of failure-mode context annotations cannot express. It does not cover error behavior if the privileged path is unavailable, keeping it below a 5.
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 short sentences, action front-loaded before the rationale and the id source; nothing is filler. The 'MEASURED:' marker is slightly idiosyncratic but signals verified context and does not obstruct reading.
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 two-parameter toggle with full schema coverage, no output schema, and annotations already carrying the safety profile, the description supplies the remaining essentials: the privilege requirement, the id source, and reversibility. Nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with both parameters documented including the enable/disable boolean semantics. The description's pointer to browser_list_addons for ids largely restates what the schema already says, so it adds little beyond the baseline.
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?
States a specific verb pair (turn on/off) and a specific resource (installed extension by id), which distinguishes it cleanly from the sibling tools browser_install_addon and browser_uninstall_addon. An agent can identify the operation without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives the prerequisite path explicitly ('get ids from browser_list_addons') and explains why this route is used (BiDi lacks webExtension.* commands), which is real selection context. It stops short of naming when to prefer browser_install_addon / browser_uninstall_addon instead, so it is clear context without explicit alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_set_cookieSet a cookieA
Create or replace one cookie (BiDi storage.setCookie). domain and path scope it; omit domain for a host-only cookie. Use browser_get_cookies afterwards to confirm the value and expiry the browser actually stored.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Cookie name | |
| path | No | Cookie path (default "/") | |
| value | Yes | Cookie value | |
| domain | Yes | Cookie domain, e.g. "127.0.0.1" | |
| secure | No | Mark the cookie Secure | |
| httpOnly | No | Mark the cookie HttpOnly | |
| sameSite | No | SameSite policy | |
| expirySeconds | No | Expiry as a Unix timestamp in seconds |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only flag readOnlyHint=false, so the description earns credit for disclosing upsert semantics ('create or replace'), scoping rules, and host-only behavior. It does not say what happens to a pre-existing cookie's other attributes (secure/httpOnly/sameSite) when replaced, which is the remaining behavioral gap.
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 tight sentences: the action and upsert semantics come first, then scoping guidance, then a verification pointer. Nothing redundant with the schema is restated.
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 an 8-parameter mutation with no output schema, the description covers upsert behavior, scoping, and how to confirm the result. It would be complete if it resolved the required-vs-optional domain question and noted that non-specified attributes are defaulted rather than preserved on replace.
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 baseline is 3. The description adds real meaning about domain/path scoping, but it also says 'omit domain for a host-only cookie' while the schema marks domain as required — a conflict that leaves the agent unsure whether the call will succeed without it.
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?
States a specific verb+resource ('Create or replace one cookie') and names the underlying primitive (BiDi storage.setCookie), which cleanly separates it from browser_get_cookies, browser_delete_cookies, and the various import_cookies siblings.
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?
Gives concrete usage context: domain/path scope the cookie, omit domain for host-only, and verify afterwards with browser_get_cookies. It does not explicitly contrast with browser_delete_cookies or the import_cookies tools, but the intended use case is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_set_dohConfigure DNS over HTTPSADestructive
Set network.trr.mode (0 off, 2 on with fallback, 3 on only, 5 explicitly off) and optionally the resolver URI (network.trr.uri). This is what the Network Settings > DNS over HTTPS control writes.
| Name | Required | Description | Default |
|---|---|---|---|
| uri | No | Resolver URI, e.g. https://mozilla.cloudflare-dns.com/dns-query | |
| mode | Yes | DoH mode |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag this as a mutating, destructive write, and the description correctly identifies the persisted prefs being overwritten. However, it adds no context on the practical consequence — that a bad DoH mode can break DNS resolution or that the change persists beyond the session — which is exactly what an agent needs for a destructiveHint=true network setting.
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 filler, with the concrete prefs and enum mapping front-loaded before the UI-equivalence framing.
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 2-parameter setter with no output schema, the description covers what is written and the mode encoding, but omits when the change takes effect and what interacts with it (e.g. the existing resolved DNS state). Adequate, 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%, so the baseline is 3, but the description earns above baseline by mapping each human-readable enum label to the raw integer value actually written (0/2/3/5), which the schema does not reveal. It says nothing extra about the uri parameter beyond the schema's own example.
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?
States a specific verb ('Set') against a specific resource (network.trr.mode and network.trr.uri), and grounds it in the visible UI control (Network Settings > DNS over HTTPS). It does not distinguish itself from the generic sibling browser_set_pref, which could write the same prefs, so it stops short of a 5.
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 is only implied via the UI equivalence sentence; there is no explicit when-to-use, no mention that browser_set_pref is an alternative for the same underlying prefs, and no note about whether a restart or reload is required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_set_download_dirSet the download directoryADestructive
Point Firefox at a download directory (privileged context) by writing browser.download.folderList=2, browser.download.dir and browser.download.useDownloadDir=true. BiDi cannot configure downloads itself (browsingContext.setDownloadBehavior is not implemented), so the preferences are the supported route. Send the path with FORWARD slashes: single backslashes inside a JSON string are invalid escapes (D:DSH... fails on D), the request is then dropped before reaching the server, and it looks like the tool hung. Use browser_list_downloads to see what landed there.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute directory to download into |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false / destructiveHint=true, and the description adds real context beyond that: it runs in a privileged context and touches specific prefs. The forward-slash warning with a concrete failure mode (invalid JSON escape, request dropped before reaching the server, appearing to hang) is exactly the kind of non-obvious behavior an agent needs. It does not address what 'destructive' means here or whether the change persists across restarts.
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?
Front-loaded with the action, then rationale, then the path-format hazard, then the follow-up tool — no filler sentences. The enumeration of all three pref keys is mildly implementation-heavy, but it is short enough to be worth the debugging 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?
With one fully documented parameter, no output schema, and annotations already covering the safety profile, the description supplies everything an agent needs: purpose, privileged-context caveat, exact input format gotcha, and the tool to check results. Nothing material is missing for correct invocation.
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 already 100% ('Absolute directory to download into'), so baseline would be 3, but the description adds the critical, non-obvious format constraint: forward slashes only, because single backslashes inside a JSON string are invalid escapes (D:DSH... fails on D). That prevents a silent failure the schema alone would not.
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?
States a concrete verb and resource ('Point Firefox at a download directory') plus the mechanism (three about:config prefs). It is unmistakably distinct from the sibling read tools (browser_list_downloads) and adjacent download tools, so an agent can pick it without opening the schema.
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?
Gives a clear when-to-use rationale: BiDi cannot configure downloads because browsingContext.setDownloadBehavior is unimplemented, so preferences are the supported route. It also routes to browser_list_downloads for verification, but does not contrast with browser_set_download_state, browser_download_manage, or browser_download_add, which an agent might plausibly confuse with this.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_set_downloads_panelOpen or close the downloads panelB
Open or close the downloads panel (the toolbar arrow that lists recent downloads). MEASURED: the entry points are DownloadsPanel.showPanel() / hidePanel() — NOT .show(), which does not exist. Also reports whether the panel is currently showing.
| Name | Required | Description | Default |
|---|---|---|---|
| open | Yes | true to open, false to close |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=false already tells the agent this mutates UI state, so the bar is lower. The description adds that it returns whether the panel is currently showing, which is valuable given no output schema, but it omits what happens if the panel is already in the requested state and offers no side-effect or scope notes. The 'MEASURED: DownloadsPanel.showPanel() / hidePanel()' clause documents an internal browser API rather than agent-facing behavior.
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?
Only two sentences and the purpose is front-loaded, which is good. But the middle 'MEASURED: ... NOT .show(), which does not exist' clause is internal implementation trivia that does not help an agent decide or call correctly, and it interrupts the flow between purpose and return behavior.
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 one-parameter UI toggle with no output schema, the description covers what it does, what the parameter means, and what it reports back. Only the already-open/already-closed behavior and interaction with the downloads list tools are missing.
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% and the single boolean already carries 'true to open, false to close'. The description adds nothing beyond the schema about the parameter, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (open/close) plus a specific resource (the downloads panel), with a helpful parenthetical identifying it as the toolbar arrow listing recent downloads. That locates it clearly apart from browser_list_downloads, though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the 'open or close' phrasing and the boolean parameter; there is no statement of when to reach for this versus browser_list_downloads, browser_download_manage, or browser_download_add. The closing note about reporting current state hints at a read use case but does not spell it out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_set_download_statePause, resume or cancel a downloadA
Act on one entry of the download list by index (as shown by browser_list_downloads): pause it, resume it, or cancel it. Cancelling removes the partial file — this cannot be undone.
| Name | Required | Description | Default |
|---|---|---|---|
| index | Yes | 0-based index into browser_list_downloads | |
| action | Yes | What to do with it |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply readOnlyHint=false, so the description does real work by disclosing the irreversible consequence of the 'cancel' action ('removes the partial file — this cannot be undone'). It stops short of stating what pause/resume do to the file or whether cancellation is possible after completion, but the destructive branch is well covered.
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, zero filler: the first gives the action scope and the index source, the second front-loads the destructive warning. Nothing is repeated without 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?
For a two-parameter, fully documented, single-object mutation tool with a readOnlyHint annotation and no output schema, the description covers what the agent needs: target selection, action set, and the irreversible outcome. It could add a note on what happens if the index is stale or the download is already finished, but that is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters are fully described there, including the enum and the '0-based index into browser_list_downloads' note. The description largely restates that linkage rather than adding new syntax or constraint detail, 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?
The description states a specific verb set ('pause, resume, cancel') against a specific resource ('one entry of the download list by index'), and explicitly routes the agent to browser_list_downloads for obtaining the index. An agent can distinguish this from sibling listing tools like browser_list_downloads and browser_list_download_events without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly establishes the prerequisite/context ('as shown by browser_list_downloads'), telling the agent how to obtain a valid index before calling. It does not, however, state when not to use it (e.g., for downloads not yet in the list, or the difference versus browser_download_manage / browser_download_add).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_set_gpcTurn Global Privacy Control on or offADestructive
Enable or disable the Global Privacy Control signal (requests then carry Sec-GPC: 1). MEASURED: the parameter is { gpc: boolean }, not { value: boolean } — the latter is rejected with "Value of gpc should be of type boolean". Marionette-only, so Firefox must run with --marionette.
| Name | Required | Description | Default |
|---|---|---|---|
| gpc | Yes | true to send Sec-GPC, false to stop sending it |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, destructiveHint=true), the description discloses the actual behavioral effect on outgoing requests and the environment prerequisite. It stops short of saying whether the setting persists across sessions or is per-profile only, which matters for a state-changing privacy toggle.
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?
Front-loaded with the effect, then the parameter caveat, then the runtime prerequisite — a sensible order with no filler. The parameter-shape warning is slightly redundant against a schema that already names the key `gpc`, costing a bit of tightness.
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 one-boolean-parameter tool with annotations and no output schema, the definition covers purpose, effect, and prerequisite adequately. Only the persistence/scope question and sibling routing are unaddressed.
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% and the schema already documents `gpc` as 'true to send Sec-GPC, false to stop sending it'. The 'MEASURED' note reinforces the exact key name and the error text, which helps recovery from a malformed call, but adds little semantic meaning beyond the schema itself — baseline 3.
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?
States a specific verb pair (enable/disable) and a concrete resource (the Global Privacy Control signal), plus the observable effect of the request header Sec-GPC: 1. It is clearly distinguishable from the sibling browser_get_gpc, which reads rather than sets the signal.
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 hard prerequisite (Marionette-only, Firefox must run with --marionette), which is genuinely useful usage guidance. However, it never says when to reach for this versus browser_get_gpc or the broader tracking-protection/pref tools, so the choice between siblings is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_set_homepageSet the homepage and startup behaviourADestructive
Set the homepage (browser.startup.homepage, one URL per line for several) and what Firefox opens on startup (browser.startup.page: 0 blank, 1 homepage, 2 last session, 3 bookmarks). Pass only homepage to leave the startup behaviour alone.
| Name | Required | Description | Default |
|---|---|---|---|
| homepage | No | Homepage URL(s), newline separated | |
| startupPage | No | What to open on startup |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the mutation profile is known. The description adds real context by mapping startupPage to the numeric pref values, but never says that an existing homepage value is overwritten, that the change persists in the profile, or whether a restart is required — gaps that matter for a destructive tool.
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 dense, front-loaded sentences with zero filler: the mutation target and format come first, the exception case last. Every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-optional-parameter tool with a full schema and annotations covering the destructive profile, the description is nearly sufficient — the enum-to-pref mapping is a nice bonus. The remaining hole is what happens to an existing homepage and whether the setting takes effect without a restart.
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 both parameters are documented there, so baseline is 3. The description restates the newline-separated homepage format and the four startupPage values already enumerated in the schema, adding only the underlying pref value mapping as marginal extra meaning.
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?
States a specific verb ('Set') and resource (homepage plus startup behaviour), and names the underlying pref keys browser.startup.homepage / browser.startup.page, which implicitly distinguishes it from the generic browser_set_pref sibling. It does not explicitly say why to prefer it over browser_set_pref, so it stops short of a 5.
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 closing sentence 'Pass only homepage to leave the startup behaviour alone' gives one useful usage rule for the optional-parameter case. However, there is no guidance on when to use this tool versus browser_set_pref or browser_save_session/browser_restore_session, which are the obvious alternatives for startup behaviour.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_set_permissionGrant or deny a site permissionADestructive
Set one permission for an origin (BiDi permissions.setPermission). MEASURED: the permission goes in a "descriptor" object — { descriptor: { name }, state, origin } — passing the name at the top level is rejected. state is granted / denied / prompt. Useful to stop a page blocking on a location or notification request during automation.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Permission name, e.g. "geolocation", "notifications" | |
| state | Yes | What to set it to | |
| origin | Yes | Origin to apply it to, e.g. "http://127.0.0.1:8099" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and readOnlyHint=false, so the safety profile is known. The description adds valuable implementation context by revealing the required BiDi request shape, including the nested descriptor object and the fact that a top-level name is rejected. It does not explain persistence or whether changes are reversible, but it goes beyond the 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?
Three compact sentences, front-loaded with the purpose and the most important wire-format warning. The callout to the underlying BiDi command and the practical use case follow efficiently with no wasted wording.
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 three-parameter mutation tool with no output schema, the description covers what it does, exactly how to format the request, and why an automation agent would use it. A brief note on persistence or how to restore a permission would make it fully 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%, so the schema already defines all three parameters. The description adds critical payload semantics that the schema does not convey: the permission name must be wrapped in a descriptor object, while state and origin sit at the top level. It also clarifies that state controls granted, denied, or prompt behavior.
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?
States a specific action and resource: 'Set one permission for an origin', and names the underlying BiDi command. It is cleanly distinguishable from the read-only sibling browser_list_permissions.
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?
Explains the practical automation context: stopping a page from blocking on location or notification requests. It does not explicitly name alternatives or say when not to use this tool, but the intended use case is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_set_prefWrite a Firefox preferenceADestructive
Set a preference (privileged context). This changes the browser and outlives the session. Some preferences are locked; some are only read at startup, so a change has no effect until Firefox restarts.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Preference name | |
| type | Yes | Value type | |
| value | Yes | Value (bool: "true"/"false"; int: digits; string: literal) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag this as non-read-only and destructive, but the description earns credit by adding traits annotations can't express: the change outlives the session, some prefs are locked, and some are only read at startup so the write is deferred until restart. It still doesn't say what happens when a pref is locked (silent failure vs. error) or whether success is reported.
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 tight sentences with the privileged-context caveat front-loaded, then persistence, then the restart caveat. Every sentence carries a non-obvious fact; nothing is repeated from the schema or annotations.
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 destructive, persistent config mutation with no output schema, the description covers the two biggest agent risks: durability and deferred effect. The residual gap is failure semantics for locked prefs and whether the tool returns confirmation, but the definition is largely sufficient to call it responsibly.
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%, including the enum for 'type' and the per-type value encoding, so the schema carries full parameter burden. The description adds nothing about the name/type/value triplet beyond what the schema states, which is the expected baseline here.
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?
States a specific verb and resource ('Set a preference'), and the '(privileged context)' qualifier makes clear this is a low-level browser config write, not a page-level action. It doesn't name the obvious siblings browser_get_pref, browser_search_prefs, or browser_reset_pref, so differentiation must be inferred from the verb alone.
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 is only implied by the verb: an agent can guess this is the write counterpart to browser_get_pref and browser_search_prefs. No sentence tells the agent when to prefer browser_reset_pref over setting a value, or what prerequisites (privileged context) must be satisfied before calling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_set_proxySet the proxy modeADestructive
Set the proxy configuration (network.proxy.* preferences) and read back what was written. mode: 0 none, 1 manual (give host/hostPort), 2 PAC (give pacUrl), 4 auto-detect, 5 use system settings. Existing connections may keep using the old proxy until they are reopened. Read browser_get_proxy first so you can put the previous values back. A local HTTP proxy for testing is often written mode=1, host=127.0.0.1.
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | Manual proxy host (mode 1), e.g. "127.0.0.1" | |
| mode | Yes | Proxy mode: 0 none, 1 manual, 2 PAC, 4 auto-detect, 5 system | |
| port | No | Manual proxy port (mode 1) | |
| pacUrl | No | PAC script URL (mode 2) | |
| noProxiesOn | No | Comma-separated "no proxy for" list |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the description doesn't need to restate mutability. It adds valuable behavioral context beyond annotations: 'Existing connections may keep using the old proxy until they are reopened,' and it notes that the tool reads back what was written. It doesn't cover permissions or rate limits, but the added side-effect warning is meaningful.
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 front-loaded with the core action, then adds mode semantics, a side-effect warning, a pre-read recommendation, and a common example. Every sentence contributes useful guidance without fluff, though the example sentence could be considered optional; overall it is 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 5 parameters, no output schema, and destructive annotations, the description covers the action, mode options, a key side effect, a restoration recommendation, and a common use case. It doesn't specify what the read-back response contains or whether a restart is needed, but for a proxy-setting tool with annotations covering the safety profile, 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?
Schema description coverage is 100%, and the schema already explains each parameter's role and mode association. The description's mode-value mapping ('mode: 0 none, 1 manual (give host/hostPort), 2 PAC (give pacUrl)...') largely repeats the schema, though the conditional 'give' phrasing adds marginal clarity. Per the baseline rule for high schema coverage, a 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 states a specific verb and resource: 'Set the proxy configuration (network.proxy.* preferences) and read back what was written.' It explicitly distinguishes from the read counterpart browser_get_proxy, so an agent can identify which of the sibling tools to use.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It instructs 'Read browser_get_proxy first so you can put the previous values back,' giving clear pre-use guidance, and it offers a common scenario (local HTTP proxy for testing). It doesn't state when not to use this tool or name any alternative besides the read counterpart, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_set_sidebarOpen or close a sidebarA
Open a sidebar by id, close the current one, or toggle it. Get ids from browser_list_sidebars. MEASURED entry point: window.SidebarController.show(id) / hide() / toggle(id). Action: open (needs id), close, toggle (needs id).
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Sidebar id (required for open/toggle) | |
| action | Yes | What to do |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses specific behavioral constraints that go beyond the basic annotations, notably that certain actions ('open' and 'toggle') require an 'id,' while 'close' does not. It also provides the specific measured entry point for implementation 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 definition is highly concise. It packs three distinct pieces of information—the actions, the prerequisite data source, and the parameter dependencies—into a single, easily readable block of 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 the simple nature of the API and the presence of a mutation hint, the description is functionally complete. An agent receives all necessary information to determine if and how to call the tool correctly.
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?
While the schema is complete (100% coverage), the description adds critical semantic value by explaining the conditional requirement for the 'id' parameter based on the selected 'action' (e.g., 'open (needs id)'). This is vital context not captured by the schema alone.
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 defines the resource (sidebar) and the specific verbs it performs (open, close, toggle). It distinguishes this tool from other potential sidebars management tools by detailing the operations available within it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides crucial guidance by instructing the agent where to retrieve necessary parameters ('Get ids from browser_list_sidebars'), linking the tool's functionality to another necessary tool in the ecosystem.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_set_tab_visibleHide or show a tab in the tab stripA
Hide a tab from the tab strip (gBrowser.hideTab) or bring it back (gBrowser.showTab). A hidden tab stays loaded and reachable by context id, it just is not shown — handy to park a tab without closing it. The last visible tab in a window cannot be hidden.
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Tab (default: the active tab) | |
| visible | Yes | true to show it again, false to hide it |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnlyHint=false, so the description carries the burden and does well: it discloses that a hidden tab stays loaded and remains reachable by context id, and that hiding the last visible tab is impossible. It does not state what happens on failure or what the call returns, which keeps it below 5.
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, front-loaded with the action and its internal API mapping, then the usage note and the constraint. No filler and nothing redundant.
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 two-parameter, fully described schema with no output schema, the description covers purpose, side effects on tab state, and the blocking constraint. Only the error/response behavior on a refused hide is unaddressed, which is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters are already documented inline ('true to show it again, false to hide it', context defaults to the active tab). The description adds only a light hint that a hidden tab is reachable 'by context id', reinforcing the context parameter but not extending its semantics 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?
States a specific verb pair and resource: hide a tab from the tab strip (gBrowser.hideTab) or bring it back (gBrowser.showTab). The phrase 'park a tab without closing it' separates it from browser_close_tab and browser_pin_tab without needing to open either schema.
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?
Gives a clear use case ('handy to park a tab without closing it') and a hard precondition ('the last visible tab in a window cannot be hidden'). It stops short of explicitly naming the alternative tools (close_tab, pin_tab) that an agent might otherwise choose, so it is clear context rather than full when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_set_themeSwitch the active themeADestructive
Activate one of the installed themes by id (from browser_list_themes), or pass default:true to go back to the default theme. Uses the theme add-on enable path, which is what the Add-ons manager does when you click "Enable". The change is visible immediately.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Theme add-on id from browser_list_themes | |
| default | No | Go back to the default theme |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true; the description adds real context beyond them by explaining the mechanism (the add-on enable path, same as clicking Enable in the Add-ons manager) and that the effect is immediate. It also supplies a recovery path (default:true). It does not say the previously active theme is deactivated or whether there is any failure mode, which is the remaining gap.
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 short sentences, front-loaded with the primary action and mode switch before the mechanism rationale. Every sentence adds information; nothing is padding.
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 two-parameter, no-output-schema switch tool with full annotation coverage, the description gives enough to call it correctly, including the id source and a reset option. The only omission is the zero-argument edge case, which is minor 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?
Schema description coverage is 100%, so both parameters are already documented in structured data and the description only restates the id source and the default flag. Neither required parameter means an agent could call this with no arguments, and the description never says whether that errors or is a no-op — a meaningful semantic gap the schema also leaves open.
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?
States a specific verb and resource ("Activate one of the installed themes by id") plus the reset variant via default:true, so the operation is unambiguous. It points at browser_list_themes as the id source but never mentions when the generic sibling browser_set_addon_state would be the better choice, so sibling differentiation is only partial.
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 covers both invocation modes: activate an installed theme by id, or pass default:true to return to the default theme. That is clear operative guidance, but there are no exclusions or prerequisites (e.g. what happens if the id refers to a disabled/removed theme).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_set_toolbar_visibilityShow or hide a toolbarADestructive
Show or hide a whole toolbar such as the bookmarks toolbar or the menu bar (CustomizableUI.setToolbarVisibility, which applies immediately). This is coarser than browser_set_toolbar_widget, which moves individual widgets.
| Name | Required | Description | Default |
|---|---|---|---|
| toolbar | Yes | Toolbar id, e.g. "PersonalToolbar" (bookmarks) or "toolbar-menubar" | |
| visible | Yes | true to show, false to hide |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true, so the mutation profile is covered. The description adds real context beyond that: it names CustomizableUI.setToolbarVisibility and states the change 'applies immediately,' telling the agent there is no restart or deferred commit — though it omits whether visibility persists across sessions or how to revert.
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 dense sentences: the capability first, then the disambiguation. Every clause carries information and nothing is padded.
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 two-parameter toggling tool with full schema coverage, annotations, and no output schema, this is nearly sufficient. The one gap is not mentioning the menubar-specific sibling it overlaps with, which could produce a suboptimal tool choice.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with both parameters documented including example ids, so the baseline is 3. The description's examples of toolbars loosely map to the 'toolbar' parameter but add no id syntax or accepted-value detail 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?
States a specific verb (show or hide) and resource (a whole toolbar), gives concrete examples (bookmarks toolbar, menu bar), and explicitly contrasts scope with browser_set_toolbar_widget. An agent can identify the tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names the alternative and the condition that selects it: this tool is 'coarser than browser_set_toolbar_widget, which moves individual widgets.' However, the description cites 'the menu bar' as a use case while a dedicated sibling browser_set_menubar_visibility exists, and it never routes the agent to that more specific tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_set_toolbar_widgetAdd or remove a toolbar widgetADestructive
Move a widget into a toolbar area, or remove it from wherever it is (CustomizableUI.addWidgetToArea / removeWidgetFromArea). MEASURED: the CustomizableUI route applies immediately to the running browser, unlike editing browser.uiCustomization.state directly, which needs a restart. Get ids from browser_get_toolbar_layout or browser_toolbar_widgets, and note the layout so you can undo it.
| Name | Required | Description | Default |
|---|---|---|---|
| area | No | Target area, e.g. "nav-bar" or "TabsToolbar" (required unless remove is true) | |
| remove | No | Remove the widget from its current area instead of adding it | |
| widget | Yes | Widget id, e.g. "downloads-button" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds useful behavioral context beyond the destructiveHint annotation: the CustomizableUI route applies immediately to the running browser, unlike editing browser.uiCustomization.state which requires a restart. It also warns the agent to record the layout for undo, though it does not cover permissions or error behavior.
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 focused sentences with no filler. The primary action is front-loaded, followed by the immediate-application caveat and the ID/undo guidance.
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 destructive mutation tool with annotations and full schema coverage, the description is nearly complete: it covers immediate effect, ID sources, and undo preparation. Minor gaps remain around return values or failure cases, but no output schema exists and annotations already signal destructiveness.
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 parameter meaning is already largely documented. The description still adds value by pointing to browser_get_toolbar_layout and browser_toolbar_widgets as sources for valid widget IDs, which is not in 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 states a specific action and resource: move a widget into a toolbar area or remove it. It names the underlying CustomizableUI methods, making the operation unambiguous and distinguishable from read-only siblings like browser_get_toolbar_layout.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly explains the two usage modes (add with an area, or remove) and directs the agent to browser_get_toolbar_layout or browser_toolbar_widgets for widget IDs. It also advises noting the layout for undo, but does not explicitly compare against other toolbar-related tools such as browser_set_toolbar_visibility.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_set_tracking_protectionSet tracking protection and cookie behaviourADestructive
Switch the tracking-protection level: off, standard (blocks known trackers in private windows only), strict (also blocks them in normal windows and tightens cookie behaviour). This sets the same prefs the Privacy panel toggles, so the change appears in about:preferences immediately.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | Yes | Tracking protection level |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The destructive/read-write nature is already covered by annotations (readOnlyHint=false, destructiveHint=true). The description adds useful context that this writes the real Privacy-panel prefs and appears in about:preferences immediately, indicating persistence. It stops short of stating scope (all windows/profiles/containers), whether a restart is needed, or that setting mode back to 'off' is how you revert.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tightly packed sentence that front-loads the action, then the enumerated levels, then the practical consequence. No filler, no restatement of the tool name, and the ordering matches how an agent would reason about the call.
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 one-parameter tool with a fully described enum and annotations carrying the destructive profile, this covers what the agent needs. The remaining gap is scope and reversibility of the pref change, which is a minor omission rather than a blocking one.
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% and the enum is listed there, so the baseline is 3; the description earns above that by actually explaining what each of 'off', 'standard', and 'strict' blocks, including the cookie-behaviour side effect of 'strict'. This is meaning the schema's bare 'Tracking protection level' label does not convey.
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 a specific verb and resource ('Switch the tracking-protection level') and defines the three levels, so the agent knows exactly what is being changed. It doesn't directly differentiate itself from the nearby browser_set_pref, though the note about the Privacy panel prefs hints at overlap without resolving it.
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 per-mode explanations (off / private-only / also normal windows plus cookie tightening) implicitly tell an agent which mode to pick for a given privacy posture. However, there is no statement of when to use this tool versus browser_set_pref or other privacy-related siblings, and no preconditions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_set_viewportSet the page viewportADestructive
Set (or clear) the BiDi viewport override and read back the result. The override PERSISTS across sessions and changes screenshot resolution (screenshots are physical pixels: viewport x devicePixelRatio), so clearing it matters. Measured: clearing works by sending viewport=null and OMITTING devicePixelRatio; sending null for both times out, so this tool never does that.
| Name | Required | Description | Default |
|---|---|---|---|
| clear | No | Remove the override (sent as viewport=null with devicePixelRatio omitted) | |
| width | No | Viewport width in CSS pixels | |
| height | No | Viewport height in CSS pixels | |
| context | No | Tab context id (default: the active tab) | |
| devicePixelRatio | No | Device pixel ratio override |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: discloses that the override PERSISTS across sessions, that it changes screenshot resolution (viewport × devicePixelRatio), and a measured quirk that null/null times out. That is genuinely useful operational context for a destructive-flagged tool. It still doesn't say what the read-back returns or which contexts are affected when 'context' is omitted.
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 tight sentences, front-loaded with the action and its persistence consequence; every sentence carries information. Milder deduction for the denseness of the final measured-behavior sentence, which mixes two separate facts (clearing mechanics and the timeout) in a slightly compressed way.
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 5-param, no-required, no-output-schema mutation tool, the description covers persistence, side effects on screenshots, and clearing mechanics — enough to call it correctly. The remaining gap is that 'read back the result' is never specified, so an agent doesn't know what state it receives to confirm success.
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 baseline is 3. The description adds a little meaning by explaining that clearing is sent as viewport=null with devicePixelRatio omitted, but the schema's own 'clear' description already states this, so most of the added value is duplication rather than new 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?
States a specific verb+resource ('Set (or clear) the BiDi viewport override') and the read-back side effect. However, it does not distinguish itself from plausible siblings such as browser_set_window_size, browser_responsive_mode, or browser_screen_info, which an agent could easily confuse with viewport 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?
It implies usage by stressing that 'clearing it matters' and warning about the null/null timeout, which is a real invocation rule. But it gives no explicit when-to-use guidance versus window-size or responsive-mode tools, and no statement of preconditions (e.g., per-context scope, tab must exist).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_set_window_positionMove a window on screenA
Move the window to a screen coordinate (window.moveTo) and optionally resize it (window.resizeTo). Coordinates are in screen pixels. Use browser_get_window_geometry first if you need the current values, and remember multi-monitor setups can have negative coordinates.
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | Screen x | |
| y | Yes | Screen y | |
| width | No | Optional new width | |
| height | No | Optional new height |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false, so the description rightly carries the burden: it discloses that this mutates the live window's position (and size if width/height are supplied) via window.moveTo/resizeTo, which tells the agent the effect is immediate and observable on the OS desktop. The negative-coordinate caveat is behavioral context not present in annotations. It omits failure behavior (e.g., what happens if the OS rejects the move or the resize is clamped).
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, front-loaded with the action and the coordinate semantics, followed by the prerequisite and the caveat. Every clause carries information an agent would otherwise have to guess.
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 4-parameter mutation with no output schema, the description covers units, optional resize, prerequisite tool, and a real edge case. The one residual gap is that no window identifier is accepted, so it relies on an implicit "current/active window" — worth stating explicitly given siblings like browser_list_windows and browser_new_window exist.
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% but the field descriptions are minimal ("Screen x", "Optional new width"), so the baseline is 3. The description earns the bump by fixing the unit (screen pixels, not CSS/viewport pixels) and explicitly permitting negative values on multi-monitor layouts, which the schema's bare minimum bound does not convey.
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?
A specific verb + resource (move the window to a screen coordinate) with the underlying API (window.moveTo) named, plus the optional resize capability. It is unambiguous about what it changes, though it never explicitly contrasts itself with the sibling browser_set_window_size, which the optional width/height arguments partially overlap.
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?
"Use browser_get_window_geometry first if you need the current values" names a concrete sibling and the condition under which to call it. The multi-monitor negative-coordinate warning is a useful precondition. It stops short of saying when to prefer browser_set_window_size or browser_set_window_state instead, so it is strong but not complete routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_set_window_sizeResize or move the browser windowA
Set the client window position and size through BiDi (browser.setClientWindowState). Read the current geometry with browser_list_windows first. These are window pixels, not page pixels — use browser_set_viewport when you mean the page viewport instead.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | Left edge in screen coordinates | |
| y | No | Top edge in screen coordinates | |
| width | No | Window width | |
| height | No | Window height | |
| clientWindow | No | Client window id. MEASURED: these ids are regenerated per session, so an id read in an earlier call is stale — omit this and the tool acts on the ACTIVE window, which is usually what you want. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that this is a mutating BiDi window-state command and clarifies the coordinate space is window pixels, which is real context beyond readOnlyHint=false. However, it does not explain what happens to omitted coordinates (does x alone move without resizing?), whether the operation is clamped by screen bounds, or what the call returns.
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 short sentences: what it does, what to read first, and how it differs from the viewport tool. Nothing is repeated from the schema and the unit caveat is front-loaded where it matters.
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 five-optional-parameter mutation with no output schema, the description covers routing, prerequisite reads, and units, which is most of what an agent needs. The remaining gap is default/partial-argument behavior, partly covered by the clientWindow schema note about the active window.
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 baseline is 3, but the description earns a bump by disambiguating units: window pixels versus page pixels, which the schema does not state. It also frames the four geometry fields as position and size, mapping cleanly onto x/y/width/height.
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?
States a specific verb and resource ("Set the client window position and size") and names the underlying BiDi command, so the effect is unambiguous. It differentiates itself from browser_set_viewport but not from the closer siblings browser_set_window_state and browser_set_window_position, which an agent could easily confuse with this one.
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?
Gives an explicit prerequisite ("Read the current geometry with browser_list_windows first") and an explicit exclusion with the alternative named ("use browser_set_viewport when you mean the page viewport instead"). It stops short of disambiguating against browser_set_window_state / browser_set_window_position, the most likely wrong picks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_set_window_stateMaximize, minimize, restore or go fullscreenA
Change the window state: normal, maximized, minimized or fullscreen. This is the title-bar buttons and F11, done programmatically. MEASURED: fullscreen is a PROPERTY (window.fullScreen = true), while the others are methods (maximize/minimize/restore). Minimizing hides the window — restore it before interacting again.
| Name | Required | Description | Default |
|---|---|---|---|
| state | Yes | Target window state |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnlyHint=false; the description adds meaningful behavior beyond that, noting fullscreen is a property while the others are methods, and warning that minimizing hides the window until restored. It does not say which window is affected (active vs. any) or whether the state persists, leaving a small gap.
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 short sentences, front-loaded with the action and states, followed by the property/method distinction and the one real gotcha. Nothing is redundant.
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 one-parameter mutation tool with no output schema and thin annotations, the description covers the state semantics and the main pitfall, which is enough to call it correctly. The only missing piece is which window is targeted.
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 single enum parameter is already fully documented, so the schema carries the load. The description restates the same four values and adds only an implementation nuance (property vs. method) rather than new semantic meaning about the parameter.
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 gives a specific verb+resource ("Change the window state") and enumerates all four states, so the agent knows exactly what the tool does. It does not explicitly distinguish itself from nearby siblings such as browser_set_window_size, browser_set_window_position, or browser_get_window_geometry, which an agent could easily confuse with it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It frames when to use it concretely ("the title-bar buttons and F11, done programmatically") and adds a real operational caveat: minimizing hides the window, so restore it before interacting. It stops short of naming an alternative sibling or stating exclusions relative to set_window_size.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_split_viewSplit the window between two tabsA
Put two tabs side by side in one window (Firefox split view, gBrowser.addTabSplitView). Give the two tab contexts, or one context plus a url to open in the second pane. Useful when a human wants to watch two pages at once — including watching one page while the agent works on another. Reverse it with browser_unsplit_view, or by closing one of the two tabs.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Instead of otherContext: URL to open in the second pane | |
| context | No | First tab context id (default: the active tab) | |
| otherContext | No | Second tab context id to put beside it |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint=false annotation already signals mutation; the description adds real value by disclosing the reversal path (browser_unsplit_view or closing a pane) and that this is a Firefox gBrowser feature. It does not cover failure conditions such as a pane already being split, but the added context is substantial.
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 tight sentences, purpose first, parameter modes second, reversal last. No filler or restatement of the title.
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?
With no output schema, the description should ideally hint at what comes back (context ids, pane handle) or what happens to the active tab after splitting. That is a minor gap against an otherwise complete picture of a 3-parameter 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 coverage is 100%, so the baseline is 3, but the description adds the combination logic the schema doesn't spell out: either pass two contexts, or one context plus a url for the second pane, and the default first tab is the active tab. That mutual-exclusivity guidance is the useful extra.
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?
States a specific verb and resource ('Put two tabs side by side in one window') plus the underlying API, and explicitly distinguishes itself from browser_unsplit_view. An agent can immediately tell this is the split operation and not a general tab-move.
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?
Gives a concrete use case ('watching one page while the agent works on another') and names the reverse operation and the alternative reversal (closing one of the two tabs). It stops short of stating when-not to use it, e.g. cross-window or non-Firefox constraints, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_sync_nowTrigger a real Sync run (Weave)A
Run the real Firefox Sync engine instead of the mock account. MEASURED: the entry point is NOT Weave.sys.mjs — that module only exports a WeaveService class whose instance is an empty object. The real singleton comes from resource://gre/modules/services-sync/service.sys.mjs, which exports Service with sync()/status. Without a signed-in account the engine reports notConfigured, which is the expected offline answer rather than a bug. Pair with browser_sync_probe for mock-account testing.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | status = report engine state; sync = trigger a run |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=false already declared, the description still adds meaningful behavior: an unsigned-in engine returns notConfigured, and this is expected rather than a failure. It also notes the real singleton/service entry point, though it omits how a sync run manifests (e.g., progress or return shape).
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?
Purpose is front-loaded, but a large share of the text is internal module-path archaeology ('MEASURED: the entry point is NOT Weave.sys.mjs…') that does not help an agent select or invoke the tool. It is useful context but not efficiently packaged.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with no output schema and a minimal readOnlyHint annotation, the description covers the key operational caveat (notConfigured when signed out) and the sibling relationship. Only minor gaps remain around return/progress 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 single enum parameter is already documented with 'status = report engine state; sync = trigger a run'. The description adds no syntax or semantic detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource: run the real Firefox Sync engine rather than the mock account. It also distinguishes itself from the sibling browser_sync_probe, which is explicitly named as the mock-account alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for when this tool applies (real engine vs mock) and routes the agent to browser_sync_probe for mock testing. It also sets an expectation for the no-account case but doesn't state explicit exclusions beyond that.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_sync_probeProbe FxAccounts / Sync state without using a real accountA
Inspect the Sync/FxAccounts surface WITHOUT signing in to any real account. MEASURED: resource://gre/modules/FxAccounts.sys.mjs exports FxAccounts whose constructor takes a mocks object (constructor(mocks = null)), which is the supported way to exercise account code paths offline — this is how the Sync test suites run. This tool reports what can be reached and whether a real account is signed in; it never sends credentials anywhere.
| Name | Required | Description | Default |
|---|---|---|---|
| No | Fake account email (default mock-user@example.test) | ||
| action | Yes | status = inspect only; mock-signin installs a fake account; mock-signout removes it |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=false alone only tells the agent the tool isn't a pure read; the description adds the safety-relevant context that no real credentials are sent and that mock accounts are installed/removed. It doesn't say whether mock state persists across calls or how failures surface, so it isn't fully transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and safety constraint are front-loaded, which is good, but the middle clause quoting the module path and constructor signature (constructor(mocks = null)) is implementation trivia that doesn't help an agent select or invoke the 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?
No output schema exists, and the description partially compensates by stating what is reported (reachable surface, real-account sign-in state). That is adequate for a 2-parameter, enum-driven tool, though the exact shape of the report is left unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with the action enum and default mock email fully documented in-schema. The description mentions the reachability/real-account status output but adds no format or semantics beyond the 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?
Names a specific verb+resource: inspect the Sync/FxAccounts surface and report what is reachable and whether a real account is signed in. The offline/mock framing implicitly separates it from browser_sync_now, but no sibling is named explicitly, so differentiation still requires the agent to infer.
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?
"Inspect ... WITHOUT signing in to any real account" gives a clear condition for when this tool applies, and calling it the way the Sync test suites run frames its intended context. It stops short of naming alternatives (e.g. browser_sync_now) or stating 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.
browser_tampermonkey_installInstall a userscript into TampermonkeyA
Install (or update) a userscript by handing its source to Tampermonkey saveScript. Pass code for a whole userscript, or url to fetch one over HTTP first. De-duplicates by the @name header: an existing script with that name is updated instead of duplicated, because MEASURED saveScript creates a NEW script for every new uuid. Returns the assigned uuid.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Alternatively, an http(s) URL to a .user.js | |
| code | No | Full userscript source, including the ==UserScript== header | |
| force | No | Install even when the name already exists (creates a duplicate) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations supply only readOnlyHint=false, so the description carries the real burden and does so well: it discloses the @name-based de-duplication rule, the measured underlying behavior (saveScript creates a new script per uuid), and the return value (assigned uuid). It omits failure modes (missing header, fetch error on url) and permission/enablement requirements, keeping it out of the 5 tier.
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 tight sentences, front-loaded with the action, followed by input modes and then the de-duplication rationale. The 'because MEASURED saveScript creates a NEW script for every new uuid' aside is slightly jargon-heavy but justifies a non-obvious behavior rather than padding.
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 three-parameter mutation with no output schema, the description covers input modes, idempotency semantics, and the return value, which is most of what an agent needs. It leaves an ambiguity around zero-required-parameter invocation and around error behavior when the @name header is absent or the url fetch fails.
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% and each parameter already has a clear description, so the baseline is 3. The description clarifies that code and url are alternatives and that the url path fetches over HTTP first, but it largely restates the schema and never addresses the fact that all three parameters are optional yet at least one of code/url is effectively required.
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?
States a specific verb and resource ('Install (or update) a userscript') plus the mechanism ('handing its source to Tampermonkey saveScript'). The install/update framing and the Tampermonkey-specific naming make it easily separable from siblings like browser_tampermonkey_list, browser_tampermonkey_remove, and browser_tampermonkey_set_enabled.
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?
Explains the two input modes ('Pass code for a whole userscript, or url to fetch one over HTTP first') and when duplication occurs versus update. It does not explicitly state prerequisites such as Tampermonkey being installed/enabled, nor point to sibling tools for listing or removing scripts, so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_tampermonkey_listList userscripts installed in TampermonkeyARead-only
List the userscripts Tampermonkey currently manages, by asking its own internal API (loadTree). Works with the official Firefox build (firefoxbeta@tampermonkey.net) out of the box; a converted Chrome package needs its INTERNAL_PAGE_PROTOCOLS patched to moz-extension: first.
| 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, so the safety profile is covered; the description earns credit for adding context beyond that. It discloses that the tool reaches into Tampermonkey's internal API (loadTree) and that compatibility is conditional — official Firefox build works out of the box, while a converted Chrome package requires patching INTERNAL_PAGE_PROTOCOLS to moz-extension:. That is exactly the kind of failure-mode information an agent cannot get from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, both load-bearing: the first states the action and mechanism, the second states the environment caveat. The core purpose is front-loaded and nothing is wasted or repeated from the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read tool with no output schema, the definition covers purpose, mechanism, and environment constraints. The one remaining gap is the shape of the returned data — it does not say whether results include script names, enabled state, or metadata — which an agent would otherwise need before consuming the response.
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 takes zero parameters, so there is no parameter semantics to explain and the baseline of 4 applies. The description correctly does not pad with parameter talk, and the schema coverage is trivially 100%.
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 a specific verb and resource: 'List the userscripts Tampermonkey currently manages', which is plainly distinct from the sibling operations install/set_enabled/remove. It also names the underlying mechanism (loadTree), reinforcing what the call actually does. It stops short of an explicit contrast with siblings, which keeps it at 4 rather than 5.
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 is implied by the phrasing 'currently manages' — you call this to enumerate installed userscripts — and the second sentence gives a real prerequisite about browser/extension packaging. However, there is no explicit statement of when to prefer this over the other tampermonkey tools or what to do if the enumeration fails, so guidance remains inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_tampermonkey_removeRemove userscripts from TampermonkeyADestructive
Delete userscripts by uuid or by the @name shown in browser_tampermonkey_list (purgeScripts). Removed scripts go to Tampermonkey trash by default, so the deletion is recoverable from its dashboard.
| Name | Required | Description | Default |
|---|---|---|---|
| names | No | Script @names to remove | |
| uuids | No | Script uuids to remove |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is known. The description adds genuinely new context beyond the annotations: removed scripts land in Tampermonkey's trash and are recoverable from its dashboard, which materially changes how an agent should weigh the destructive hint.
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, zero filler, and the core operation is front-loaded before the recoverability caveat. No redundancy with the title.
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?
With only two optional params, no output schema, and annotations covering the safety profile, the description supplies the missing pieces an agent needs: identification options and deletion semantics. The only gap is undefined behavior when names and uuids are passed together, or when neither is supplied.
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 baseline is 3, but the description adds value by clarifying that the two parameters are alternative identification strategies and by telling the agent where valid @name values come from. It stops short of explaining precedence when both arrays are supplied.
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?
States a specific verb ('Delete') and resource ('userscripts'), plus the two supported identifiers (uuid or @name) and the underlying API name (purgeScripts). It is clearly distinguishable from sibling tools like browser_tampermonkey_list, browser_tampermonkey_install, and browser_tampermonkey_set_enabled.
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 routes the agent to browser_tampermonkey_list as the source of the @name values, which is a real usage pointer. It does not, however, state when to prefer disabling (browser_tampermonkey_set_enabled) over deleting, nor whether both identifiers can be mixed in one call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_tampermonkey_set_enabledEnable or disable a userscriptA
Turn a userscript on or off in Tampermonkey (modifyScriptOptions with {enabled}). Identify the script by uuid, or by the @name shown in browser_tampermonkey_list. A disabled script stays installed but is not injected.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Script @name | |
| uuid | No | Script uuid, if you already have it | |
| enabled | Yes | true to enable, false to disable |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=false correctly signals mutation, and the description adds the key behavioral fact beyond annotations: disabling keeps the script installed but stops injection. It stops short of covering what happens on an unknown name/uuid or whether the change persists across sessions.
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, front-loaded with the action, then identification, then the semantic note about disabled state. No filler and nothing could be removed without losing signal.
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 small 3-parameter toggle with no output schema, this covers action, identification, and the state semantics. Only the edge cases (unknown script, both identifiers supplied) are unaddressed, which are minor for this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds value by explaining the two mutually alternative identifiers (uuid vs @name) and sourcing the @name from browser_tampermonkey_list. It does not address precedence when both are supplied, nor behavior when neither optional identifier is given.
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?
States a specific verb and resource: turn a userscript on/off in Tampermonkey, and names the underlying mechanism (modifyScriptOptions with {enabled}). It is trivially distinguishable from browser_tampermonkey_install and browser_tampermonkey_remove, which change installation state rather than the enabled flag.
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?
Gives concrete routing guidance: identify the script by uuid, or by the @name obtained from browser_tampermonkey_list. It does not explicitly say when to prefer this over removal/reinstall, but the enabled-vs-installed framing makes that distinction implicit and clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_toolbar_widgetsList toolbar widgetsARead-only
List the widget ids currently in a toolbar area (privileged context). Use area "nav-bar" for the main toolbar.
| Name | Required | Description | Default |
|---|---|---|---|
| area | No | Toolbar area id, default "nav-bar" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds one genuinely useful trait — '(privileged context)' — signaling it may require elevated privileges, plus 'currently' implying live state. It does not say what happens if the area id is unknown or how many widgets come back.
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 short sentences, zero filler, with the core action front-loaded and the parameter hint trailing. Nothing to trim.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-required-parameter read tool with no output schema, the description tells the agent what it returns (widget ids) and what the main area is called. Only the return shape (array? count?) and behavior on invalid areas are left implicit.
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% and the single parameter already has a description and default of 'nav-bar', so the schema does the heavy lifting. The description's example of 'nav-bar' for the main toolbar is mildly additive but does not enumerate valid area ids beyond the default.
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?
States a specific verb and resource: 'List the widget ids currently in a toolbar area.' An agent can tell it returns widget identifiers for a toolbar region, but it never contrasts itself with the closely related browser_get_toolbar_layout or browser_set_toolbar_widget siblings.
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 guidance given ('Use area "nav-bar" for the main toolbar') is about parameter values, not about when to choose this tool over browser_get_toolbar_layout or the setter siblings. Usage is implied by the read-only listing framing, but no exclusions or alternatives are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_translationsReport or toggle Firefox full-page translationB
Report the full-page translation state and optionally enable the feature. MEASURED: the pref is browser.translations.enable (false by default in this build); the actor resource://gre/actors/TranslationsParent.sys.mjs exposes getIsTranslationsEngineSupported / getWebContentLanguages / isTranslationsEngineMocked. With a real engine the supported-language map is populated only after language packs are downloaded, so an empty map while isEngineSupported is true means "engine present, packs absent" rather than a broken feature.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | status/enable/disable = pref; pairs = supported language pairs; download = fetch model files | |
| source | No | Source language for download (default en) | |
| target | No | Target language for download (default zh-Hans) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only readOnlyHint=false declared, the description does real work: it names the backing pref (browser.translations.enable, false by default in this build), the actor and its methods, and warns that an empty supported-language map with isEngineSupported=true means packs are absent rather than a broken feature. That is genuine diagnostic context an agent could not infer from annotations. It falls short of 5 because it does not disclose that disable/download mutate state or what any action returns.
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 capability statement is front-loaded, which is good, but the second sentence is a dense 'MEASURED:' dump including an internal resource:// actor path that does not help an agent select or call the tool. Content that earns its place (the empty-map caveat) is buried inside implementation trivia.
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 3-parameter tool with no output schema and only a readOnlyHint annotation, the description supplies the missing safety and diagnostic context — the pref, its default, and how to interpret an empty language map. The main gap is that three of the five actions (disable, pairs, download) and their return shapes are never described.
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 action enum and the source/target defaults are already fully documented in the schema. The description adds no parameter-level detail beyond implying the pref toggle, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: reporting full-page translation state, plus optionally enabling it. It is clearly distinct from every sibling (no other translation tool exists in the list). However, it only names status/enable while the schema also exposes disable, pairs, and download, so the stated purpose under-describes the tool's actual 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?
There is no when-to-use guidance and no routing to alternatives (there are none for translation, but that is never said). The five actions are never distinguished — an agent gets no help deciding between 'status', 'pairs', or 'download', which is exactly the decision the tool requires.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_traverse_historyGo back or forwardA
Move the active tab through its session history (browsingContext.traverseHistory): delta -1 is back, +1 is forward. Fails with "no such history entry" when that direction has nothing to go to, which is a normal answer rather than a broken tool.
| Name | Required | Description | Default |
|---|---|---|---|
| delta | Yes | Negative goes back, positive goes forward (e.g. -1 or 1) | |
| context | No | Tab context id (default: the active tab) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply readOnlyHint=false, so the description carries most of the burden, and it delivers the single most useful behavioral fact: the expected failure mode and its benign interpretation. It does not say what happens to the forward stack after a new navigation, nor what the call returns (no output schema exists), but the error semantics are the high-value disclosure here.
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 filler, with the core action and delta convention front-loaded and the failure-mode caveat appended where it is needed.
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 2-parameter tool with no output schema and minimal annotations, the description covers purpose, parameter convention, and the expected error case. Remaining gaps — return value and forward-history invalidation behavior — are modest but real.
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% and the delta property already documents 'Negative goes back, positive goes forward (e.g. -1 or 1)'. The description's '-1 is back, +1 is forward' largely restates the schema, though tying the failure condition to direction adds a little. 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?
States a specific verb and resource — 'Move the active tab through its session history' — and even names the underlying API (browsingContext.traverseHistory). This is clearly distinguishable from siblings like browser_navigate or browser_activate_tab, which also move the active tab but for different reasons.
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?
Explains the delta semantics (-1 back, +1 forward) and, importantly, that a 'no such history entry' failure is a normal answer rather than a broken tool — that tells the agent when this call legitimately has nothing to do. It stops short of explicitly naming alternatives (e.g. use browser_navigate for new URLs instead of traversing), so no exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_troubleshootRead the about:support troubleshooting snapshotARead-only
Return the same diagnostic snapshot that about:support shows. MEASURED: the module is resource://gre/modules/Troubleshoot.sys.mjs and Troubleshoot.snapshot() resolves to sections including modifiedPreferences, lockedPreferences, printingPreferences, media, accessibility, pdfjs, intl, securitySoftware, startupCache and libraryVersions. Use sections to narrow the output.
| Name | Required | Description | Default |
|---|---|---|---|
| sections | No | Only these top-level keys (default: a useful subset) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds useful context about the module and the returned sections, but it does not disclose privacy implications, output size, or the exact default subset.
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 front-loaded with the purpose and remains fairly short. The internal module path and Troubleshoot.snapshot() detail are somewhat implementation-heavy for an agent choosing and calling the tool, but they do not obscure the main point.
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 one-parameter read-only diagnostic tool with full schema coverage and no output schema, the description is nearly complete: it names the snapshot source and many returned sections. It could still say more about the default subset and whether the snapshot contains sensitive or large data.
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 the single optional sections parameter. The description adds value by naming example top-level sections and stating that sections narrows the output, though the list is introduced with 'including' and is not exhaustive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific resource and verb: it returns the diagnostic snapshot shown by about:support. It is distinguishable from most browser tools by the about:support and Troubleshoot.snapshot() references, though it does not explicitly contrast itself with nearby diagnostic siblings such as browser_selfcheck or browser_profile_info.
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 is implied by the diagnostic/troubleshooting nature of the tool, and the description says to use sections to narrow the output. However, it gives no explicit when-to-use, when-not-to-use, or alternative-tool guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_typeType into an elementB
Focus the element matching a CSS selector and type text with real per-character key events.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Text to type | |
| context | No | Tab context id (default: the active tab) | |
| selector | Yes | CSS selector of the field |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations only declare readOnlyHint=false, so the description usefully adds that typing uses real per-character key events rather than setting a value directly. It does not disclose whether existing text is cleared, whether the element must be visible or focusable, or what happens on failure.
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 with the action and mechanism front-loaded. Every phrase contributes to understanding what the tool does.
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 text-entry tool with fully described parameters and no output schema, the description is largely complete. It omits one potentially important behavioral detail, whether typing appends to or replaces existing field content, but otherwise provides enough context to invoke it correctly.
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 all three parameters are already documented. The description reinforces that selector identifies the element and text is what gets typed, but it adds no additional semantics beyond the schema, particularly for the context parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: focus an element matching a CSS selector and type text. The phrase 'real per-character key events' clarifies the mechanism, but it does not explicitly distinguish this tool from siblings such as browser_press_key or browser_fill_login.
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 explains how typing is performed but gives no guidance on when to use this tool versus alternatives like browser_press_key or browser_fill_login. An agent must infer its role from the operation alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_uninstall_addonUninstall an add-onADestructive
Uninstall an installed extension by id (AddonManager, privileged context). This is destructive and, unlike browser_set_addon_state, not simply reversible — the add-on would have to be installed again. Some add-ons cannot be uninstalled (permissions are reported as PERM_CAN_UNINSTALL false).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Add-on id, as reported by browser_list_addons |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Although annotations already declare destructiveHint=true, the description adds meaningful context: privileged AddonManager context, irreversibility requiring reinstallation, and the PERM_CAN_UNINSTALL false constraint. This goes well beyond what the annotations 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?
Three sentences, each front-loaded with the key point: action and context, destructiveness and reversibility contrast, then a constraint. No wasted 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?
For a single-parameter destructive tool with no output schema, the description covers what an agent needs: what it does, that it is irreversible, how it differs from the safer alternative, and when it may fail.
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% and the id parameter is already documented as coming from browser_list_addons. The description restates 'by id' but adds no syntax or format details beyond the 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?
States a specific verb and resource ('Uninstall an installed extension by id') and names the execution context. It is clearly distinguishable from sibling tools such as browser_install_addon and browser_set_addon_state.
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 contrasts this tool with browser_set_addon_state, noting that uninstall is not simply reversible. It also states that some add-ons cannot be uninstalled, giving the agent a clear condition to check before invoking.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_unsplit_viewUndo the split viewA
Close the split view in the current window (gBrowser.unsplitView on the active tab). The two tabs stay open; they just stop sharing the window. Reports whether there was a split view to begin with.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false, so the description carries most of the burden and does so well: 'The two tabs stay open; they just stop sharing the window' is a genuinely non-obvious reassurance that this mutation destroys no user state. It also discloses the return signal (whether a split existed), though it doesn't say whether the no-op case errors or returns false.
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 short sentences, front-loaded with the action, then the side-effect scope, then the return value. No boilerplate or repetition of the title.
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?
With no output schema and no parameters, the description covers what an agent needs: what is undone, that tabs survive, and that a status is reported. The only gap is the no-split-view edge case (no-op vs. error), which the 'reports whether there was a split view' clause hints at but doesn't resolve.
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 takes zero parameters, so there is nothing for the description to disambiguate; the baseline of 4 applies. The parenthetical clarifies that it acts on the active tab / current window rather than any specified target, which is the only scoping question that matters here.
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?
States a specific verb and resource ('Close the split view in the current window'), and the parenthetical implementation reference (gBrowser.unsplitView on the active tab) pins the exact scope. It is unambiguously the inverse of the browser_split_view sibling, so an agent can tell them apart without inspecting schemas.
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 'Close the split view' clearly signals the condition (a split view exists and should be undone) and implies the counterpart tool. However, it never names browser_split_view or states what happens if no split view is active, so the routing is inferred rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_upload_fileAttach a file to a file inputA
Attach one or more local files to the file input matching a CSS selector (privileged not required). IMPORTANT (measured on Windows): paths must be NATIVE (D:dirile.txt); a file:///D:/... URL is rejected with "File error: Unrecognized path". The file is read by Firefox itself, so it must exist and be readable.
| Name | Required | Description | Default |
|---|---|---|---|
| files | Yes | Native absolute paths of the files to attach | |
| context | No | Tab context id (default: the active tab) | |
| selector | Yes | CSS selector of the file input |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only readOnlyHint=false available, the description carries the burden well: it discloses a non-obvious platform constraint (paths must be NATIVE on Windows), quotes the exact rejection error for file:/// URLs, and explains the underlying reason (Firefox itself reads the file, so it must exist and be readable). This is precisely the kind of operational knowledge an agent cannot derive from the schema or annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the action and immediately followed by the highest-risk constraint flagged with "IMPORTANT". No filler; every clause either states the operation or prevents a known failure.
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 mutation tool with no output schema, the description covers what to do, what will fail, and why. It does not say what happens after the attach (whether change events fire, whether a form submit or network request follows, or what the call returns), which an agent may need to know before chaining further steps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all three parameters; the baseline would be 3. The description adds meaning on top, specifically the path-format rule and failure mode for the files parameter beyond the schema's terse "Native absolute paths of the files to attach", justifying a notch above baseline.
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?
"Attach one or more local files to the file input matching a CSS selector" gives a specific verb (attach), a specific resource (local files), and the exact targeting mechanism (CSS selector). It is clearly distinguishable from browser_click/browser_type siblings, which operate on generic elements rather than file 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?
The description makes the use case clear enough (attaching local files to a file input) and even notes "privileged not required", which tells the agent no special add-on permission is needed. However, it offers no explicit when-not guidance or named alternative for cases where the input is not a real file input (e.g., drag/drop via browser_drag_html5 or click-based pickers), so it stops short of full routing guidance.
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.
178 tool updates
v0.1.0- First observed
browser_a11y_tree - First observed
browser_about_page_info - First observed
browser_accept_popup_notification - First observed
browser_activate_tab - First observed
browser_add_bookmark - First observed
browser_add_login - First observed
browser_add_search_engine - First observed
browser_autofill_data - First observed
browser_autofill_status - First observed
browser_bookmark_backup - First observed
browser_bookmark_folder - First observed
browser_bookmark_manage - First observed
browser_bookmarks_export - First observed
browser_bookmarks_import - First observed
browser_certificate_manage - First observed
browser_clear_cache - First observed
browser_clear_data - First observed
browser_clear_site_cache - First observed
browser_click - First observed
browser_close_extension_popup - First observed
browser_close_other_tabs - First observed
browser_close_tab - First observed
browser_close_tabs_by_url - First observed
browser_close_tabs_to_right - First observed
browser_close_window - First observed
browser_collect_response_body - First observed
browser_console - First observed
browser_console_logs - First observed
browser_create_container - First observed
browser_delete_cookies - First observed
browser_devtools_close - First observed
browser_devtools_open - First observed
browser_devtools_tools - First observed
browser_dom_tree - First observed
browser_download_add - First observed
browser_download_manage - First observed
browser_drag - First observed
browser_drag_html5 - First observed
browser_duplicate_tab - First observed
browser_element_screen_coords - First observed
browser_evaluate - First observed
browser_extension_details - First observed
browser_extension_permissions - First observed
browser_extension_storage - First observed
browser_eyedropper - First observed
browser_fill_login - First observed
browser_find_login_form - First observed
browser_get_cache_usage - First observed
browser_get_cookies - First observed
browser_get_favicon - First observed
browser_get_gpc - First observed
browser_get_login_password - First observed
browser_get_pref - First observed
browser_get_proxy - First observed
browser_get_response_body - First observed
browser_get_search_engine - First observed
browser_get_tab_processes - First observed
browser_get_toolbar_layout - First observed
browser_get_window_geometry - First observed
browser_group_tabs - First observed
browser_handle_prompt - First observed
browser_hide_automation_flags - First observed
browser_history_manage - First observed
browser_hover - First observed
browser_import_cookies - First observed
browser_import_cookies_from_file - First observed
browser_import_history - First observed
browser_import_logins - First observed
browser_import_logins_from_file - First observed
browser_info - First observed
browser_install_addon - First observed
browser_key_hold - First observed
browser_list_addons - First observed
browser_list_bookmarks - First observed
browser_list_cert_overrides - First observed
browser_list_closed_tabs - First observed
browser_list_download_events - First observed
browser_list_downloads - First observed
browser_list_history - First observed
browser_list_logins - First observed
browser_list_permissions - First observed
browser_list_popup_notifications - First observed
browser_list_prompts - First observed
browser_list_sidebars - First observed
browser_list_tab_groups - First observed
browser_list_tabs - First observed
browser_list_themes - First observed
browser_list_user_contexts - First observed
browser_list_windows - First observed
browser_memory_usage - First observed
browser_mouse_action - First observed
browser_move_tab - First observed
browser_move_tab_to_container - First observed
browser_move_tab_to_group - First observed
browser_move_tab_to_split_view - First observed
browser_move_tab_to_window - First observed
browser_multi_select_tabs - First observed
browser_mute_tab - First observed
browser_navigate - First observed
browser_network_continue_all - First observed
browser_network_intercept - First observed
browser_network_provide_response - First observed
browser_network_requests - First observed
browser_new_tab - First observed
browser_new_window - First observed
browser_oauth_clients - First observed
browser_open_about_page - First observed
browser_open_extension_options - First observed
browser_open_extension_popup - First observed
browser_open_firefox_view - First observed
browser_page_info - First observed
browser_page_source - First observed
browser_pdf - First observed
browser_pick_color_at - First observed
browser_picture_in_picture - First observed
browser_pin_tab - First observed
browser_press_key - First observed
browser_print - First observed
browser_profile_info - First observed
browser_quit - First observed
browser_reader_mode - First observed
browser_relax_certificate_checks - First observed
browser_remote_debugging - First observed
browser_remove_bookmark - First observed
browser_remove_container - First observed
browser_remove_duplicate_tabs - First observed
browser_remove_login - First observed
browser_remove_tab_group - First observed
browser_reopen_closed_tab - First observed
browser_reset_pref - First observed
browser_responsive_mode - First observed
browser_restore_session - First observed
browser_run_in_extension - First observed
browser_save_session - First observed
browser_screen_info - First observed
browser_screenshot - First observed
browser_scroll - First observed
browser_search_engine - First observed
browser_search_prefs - First observed
browser_selfcheck - First observed
browser_set_addon_state - First observed
browser_set_cookie - First observed
browser_set_doh - First observed
browser_set_download_dir - First observed
browser_set_download_state - First observed
browser_set_downloads_panel - First observed
browser_set_gpc - First observed
browser_set_homepage - First observed
browser_set_main_menu - First observed
browser_set_menubar_visibility - First observed
browser_set_permission - First observed
browser_set_pref - First observed
browser_set_proxy - First observed
browser_set_sidebar - First observed
browser_set_tab_visible - First observed
browser_set_theme - First observed
browser_set_toolbar_visibility - First observed
browser_set_toolbar_widget - First observed
browser_set_tracking_protection - First observed
browser_set_viewport - First observed
browser_set_window_position - First observed
browser_set_window_size - First observed
browser_set_window_state - First observed
browser_split_view - First observed
browser_sync_now - First observed
browser_sync_probe - First observed
browser_tampermonkey_install - First observed
browser_tampermonkey_list - First observed
browser_tampermonkey_remove - First observed
browser_tampermonkey_set_enabled - First observed
browser_toolbar_widgets - First observed
browser_translations - First observed
browser_traverse_history - First observed
browser_troubleshoot - First observed
browser_type - First observed
browser_uninstall_addon - First observed
browser_unsplit_view - First observed
browser_upload_file
TDQS
Scored across 178 tools
Despite extremely rich individual descriptions, the surface contains many near-synonym clusters that an agent must read at length to separate: browser_clear_data vs browser_clear_cache vs browser_clear_site_cache, browser_list_downloads vs browser_list_download_events vs browser_download_manage vs browser_download_add, browser_search_engine vs browser_get_search_engine vs browser_add_search_engine, browser_evaluate vs browser_run_in_extension, and a large pile of tab tools (close_tab/close_other_tabs/close_tabs_to_right/close_tabs_by_url/remove_duplicate_tabs/move_tab/move_tab_to_window/move_tab_to_container/move_tab_to_group/move_tab_to_split_view). With 178 tools, selection among overlapping neighbours is genuinely error-prone even with good prose.
The browser_ snake_case prefix is used throughout, which is a real plus, but verb choice is inconsistent: new_tab/new_window alongside create_container, open_about_page, add_bookmark, insert-style tools, and many noun-only names (browser_info, browser_page_info, browser_screen_info, browser_memory_usage, browser_selfcheck, browser_troubleshoot). The result is readable but not predictable enough to guess a name without consulting the list.
178 tools is an extreme mismatch for any agent-facing server: the tool list alone consumes enormous context and forces the model to discriminate among dozens of low-frequency operations (DevTools opener, Tampermonkey userscripts, Sync probing, toolbar widget layout, certificate overrides). Far past the 50+ threshold for 'extreme mismatch', even though each tool is individually justified.
The surface is remarkably complete for full browser control: tabs/windows lifecycle, navigation, input, screenshots/PDF, cookies, storage clearing, bookmarks (including folders, tags, HTML import/export, backups), history, downloads, logins, prefs, add-ons/themes, proxies, certificates, containers, DevTools, network interception and response bodies. Even acknowledged upstream gaps are documented and worked around rather than left as blind spots.
Maintenance
Related MCP Connectors
Control a real browser from AI agents: navigate, click, type, screenshot, read the page.
Cloud browsers for AI agents: saved logins, residential IPs, live human takeover, 57 browser tools.
Provides cloud browser automation capabilities using Stagehand and Browserbase, enabling LLMs to i…
Hosted browser for agents: open pages, search the web, extract data, read PDFs and take screenshots.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceProvides complete browser automation capabilities for AI agents via 44 tools, including navigation, element interaction, state management, and session recording.85 npm1Apache 2.0
- AlicenseAqualityAmaintenanceEnables AI agents to control a real web browser (Firefox) via Selenium WebDriver, supporting page navigation, interaction, and inspection through natural language.434MIT
- AlicenseNot gradedqualityDmaintenanceProvides 66 tools for browser automation using Selenium WebDriver, enabling AI agents to navigate, interact, capture screenshots, assert conditions, manage cookies, handle tabs, execute HTTP requests, record sessions, and more.21 npm1MIT
- AlicenseBqualityBmaintenanceEnables AI agents to drive a user-launched Firefox instance via its native Marionette protocol, providing precise DOM actuation like clicking, typing, uploading files, taking screenshots, and evaluating JavaScript.1820 npm1GPL 2.0