@extension.dev/mcp
This server provides 28 MCP tools to scaffold, run, inspect, debug, and publish cross-browser extensions, giving AI agents hands-on control of the browser environment.
Build & Scaffold: Create from 50+ templates (
extension_create,extension_templates), add features (extension_add_feature), and build for production (extension_build).Run & Manage Sessions: Start dev servers with HMR (
extension_dev), run production builds (extension_start), wait for readiness (extension_wait), and stop sessions (extension_stop).Inspect & Debug: Validate manifests across browsers (
extension_manifest_validate), analyze builds (extension_analyze), deep-inspect live extensions including shadow DOM (extension_inspect), snapshot the DOM (extension_dom_snapshot), list loaded extensions (extension_list_extensions), stream logs from all contexts (extension_logs), run diagnostic checks (extension_doctor), and verify Chrome theme colors (extension_theme_verify).Act & Control: Evaluate JavaScript in any extension context (
extension_eval), read/writechrome.storage(extension_storage), reload extensions/tabs (extension_reload), and open surfaces or trigger actions (extension_open).Browser Management: Detect, list, install, and uninstall browsers (
extension_browsers).Platform & Publishing: Authenticate (
extension_auth), preview in a web emulator and share links (extension_preview_web,extension_shares), publish builds (extension_publish), promote to release channels (extension_release_promote), submit to stores (extension_submit), and check release status (extension_release_status).
Allows running and debugging extensions in the Brave browser during development.
Enables submitting extension builds to the Chrome Web Store for publication and release management.
Allows running and debugging extensions in Firefox during development.
Provides authentication via GitHub device-code flow for accessing platform tools such as publishing and promoting builds.
Allows running and debugging extensions in LibreWolf during development.
Allows running and debugging extensions in Opera during development.
Allows running and debugging extensions in Safari on macOS during development.
Allows running and debugging extensions in Vivaldi during development.
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., "@@extension.dev/mcpscaffold a new popup extension using React"
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.
@extension.dev/mcp

Give your AI agent hands for browser extension development. 30 MCP tools that scaffold, run, inspect, debug, and publish cross-browser extensions.
claude mcp add extension-dev npx @extension.dev/mcpWorks with Claude Code, Claude Desktop, Cursor, and any MCP client.
extension.dev · Extension.js · Templates · Examples · Discord
Why an MCP server for extensions
Extensions fail silently: content scripts that never inject, panels that never open, permissions that return undefined with no error. An agent editing files blind will happily "fix" all of them without noticing none of them work.
These tools give agents eyes on the live browser, so they debug from evidence instead of guessing:
Scaffold from the 50+ template catalog behind templates.extension.dev, or add a popup, sidebar, or content script to an existing project
Run the dev server with HMR in Chrome, Edge, Firefox, Brave, Opera, Vivaldi, Yandex, Waterfox, LibreWolf, or any Chromium- or Gecko-based binary, plus Safari on macOS (no HMR yet), no build config
See the live DOM, unified logs from every extension context,
chrome.storagecontents, and the loaded-extension listAct: evaluate code in any context, trigger the action button and commands, reload the extension, replay events
Ship: validate the manifest cross-browser, build for production, publish a shareable preview, and promote builds to release channels headlessly
Built on Extension.js, the open-source cross-browser extension framework.
Related MCP server: @nimbus21.ai/chrome-devtools-mcp
Clients
Claude Code | Claude Desktop | Cursor |
Setup
Claude Code
claude mcp add extension-dev npx @extension.dev/mcpOr install it as a plugin, the MCP server plus the /extension, /extension-add, /extension-debug, and /extension-publish commands in one step:
/plugin marketplace add extensiondev/mcp
/plugin install extension-mcp@extensiondev-mcpCursor
Claude Desktop / .mcp.json
{
"mcpServers": {
"extension-dev": {
"command": "npx",
"args": ["@extension.dev/mcp"]
}
}
}Pair with the skill
This server gives agents hands; @extension.dev/skill gives them judgment: the cross-browser rules, silent-failure gotchas, debugging playbooks, and store checklist, packaged in the open Agent Skills format. With both installed, agents know to verify against the live browser instead of guessing, and these tools make that a one-call operation.
npm i -D @extension.dev/skill
mkdir -p .claude/skills && cp -R node_modules/@extension.dev/skill/skills/extension-dev .claude/skills/Claude Code project integration
The package ships drop-in instructions, slash commands, and rules for extension projects:
# Rules (how Claude understands your project)
cp node_modules/@extension.dev/mcp/claude/CLAUDE.md ~/my-extension/.claude/CLAUDE.md
# Slash commands (/extension, /extension-add, /extension-debug, /extension-publish)
mkdir -p ~/my-extension/.claude/commands
cp node_modules/@extension.dev/mcp/claude/commands/*.md ~/my-extension/.claude/commands/Tools
Tier | Tool | Description |
build |
| Scaffold from a template |
build |
| Browse 50+ templates ( |
build |
| Add sidebar/popup/content script |
build |
| Build for production |
run |
| Dev server with HMR |
run |
| Build + launch the production build ( |
run |
| Poll the dev-server ready contract |
run |
| Stop a dev/start/preview session (server + browser) |
see |
| Cross-browser manifest validation |
see |
| Static analysis of the built extension on disk |
see |
| Deep live inspection of a running extension (closed shadow roots, probes) |
see |
| Shallow DOM snapshot of a chosen tab or extension surface over the agent bridge |
see |
| List loaded extensions (Chromium and Firefox) |
see |
| Stream logs from every context |
see |
| Diagnose the dev session leg by leg (ready contract, ports, token, executor, browser) |
see |
| Verify a Chrome theme manifest against the colors Chrome actually paints |
test |
| State expectations about a running extension and get one verdict each: pass, fail, or inconclusive |
act |
| Evaluate in a context (needs |
act |
| Read/write |
act |
| Reload extension or tab |
act |
| Open a surface / trigger |
browsers |
| Detect, list, install, and uninstall browsers |
platform |
| Device login at extension.dev, plus login status and logout |
platform |
| Create the extension.dev project for a built extension, headless, via device approval |
platform |
| Render a build in the web emulator, and share it as a link |
platform |
| List every link you have shared, and revoke one permanently |
platform |
| Publish a shareable preview to extension.dev |
platform |
| Promote a build to a release channel, headless |
platform |
| Submit for store review: Chrome, Firefox and Edge, through extension.dev |
platform |
| Read release channels, recent builds, and store submission and review state |
Browser-launching tools (dev, start) shell out to the extension CLI, the project's own node_modules/.bin/extension when present, otherwise npx extension@<pinned> at the version this package is verified against; everything else runs in-process.
Asserting instead of guessing
Every other tool here hands back a reading: a DOM, a log window, an evaluated
expression. Turning a reading into "the popup works" was left to the agent, as
a string of JavaScript it wrote on the spot, which is the guesswork the paired
skill exists to prevent. extension_assert states the expectation and returns
the verdict.
{
"projectPath": "/path/to/extension",
"expect": [
{ "assert": "background-worker-booted" },
{ "assert": "surface-rendered", "surface": "popup", "selector": "[data-testid=root]" },
{ "assert": "storage-key-present", "key": "settings", "area": "local" },
{ "assert": "console-errors-empty", "context": ["background", "popup"] },
{ "assert": "content-script-injected", "url": "https://shop.example/cart" }
]
}Each check comes back as pass, fail or inconclusive, and the run is a
pass only when every check passed. inconclusive is the part that matters: it
means this platform cannot cover the question today, and the check carries a
settledBy naming the evidence that would answer it. A content script's
execution is not observable from outside its isolated world, so
content-script-injected passes only on a line the script itself wrote and is
inconclusive over a declared match, never a pass. "No console errors" over a
session that never built is inconclusive too, because zero errors and zero
events are the same number. A read the platform refuses, such as
chrome.storage on a session started without allowControl, is inconclusive
rather than a failure: nothing was learned about the extension.
The verdict document is the same grammar the preview lane's CI verdict uses
(@extension.dev/preview-verdict), with its own contract name and its own
check registry, so a document from one lane can never be mistaken for the
other's. Each check here names the preview check it is the live-browser
counterpart of, and a contract test holds the two grammars together.
Sharing a build in progress
An unpacked extension is unusually hard to hand to someone: the only way to look at a colleague's work-in-progress has been to take their zip and run untrusted code with real browser permissions on your own machine. extension_preview_web with share: true uploads the dist/ it just built and returns a link that renders those exact bytes in the emulator. Whoever opens it installs nothing and signs in to nothing, which is what lets a designer, a PM, or a reviewer into the loop at all. Those bytes run in an isolated sandbox origin or they do not run at all: preview refuses a shared build rather than serving it in its own renderer. Sharing needs auth (extension_auth or EXTENSION_DEV_TOKEN), the link lives 30 days, and DELETEing the returned revokeUrl with the same token kills it early. Re-sharing an unchanged build returns that same link rather than a second one, and only a revoked link is replaced by a different one, because revocation is permanent: the address is burned and never resolves again. That makes revokeUrl the handle to the link you just made, so every share is also appended to .extension.dev/shared-previews.json in the project (gitignored) so it survives losing the tool output. The upload holds up to 2,000 files and about 64MB of text, or roughly 48MB when the build is mostly images, fonts or wasm, which travel base64-encoded. Without share, the tool returns a local-only deep link and uploads nothing.
extension_shares is the other half of that: it lists every link the token has shared, live and dead, with the previewUrl and revokeUrl of each, and revokes one by artifactId or by pasting any of its URLs. Pass projectPath and it reconciles the platform's answer with the project's own record, so a link shared from another machine shows up as remoteOnly and a record with nothing behind it any more shows up under localOnly. It never rewrites the local file.
That is a different job from shipping. Use share for the build you are holding right now; use extension_publish and extension_release_promote below for builds your CI has released.
From preview to store
The platform tools connect agents to extension.dev: extension_auth runs extension.dev's own device flow (you approve the code at extension.dev/device, and GitHub is federated server-side, so no GitHub token ever reaches your machine) and stores a project-scoped token locally (never returned to the agent), extension_publish turns a build your project has already published into a shareable URL, and extension_release_promote promotes a tested build to a release channel from CI or an agent session, no browser required. extension_submit submits a built extension to the Chrome Web Store, Edge Add-ons, and Firefox AMO through extension.dev, which holds your store credentials and dispatches the release from your project's mirror CI, it defaults to a dry run and store credentials are never tool arguments. Safari and the App Store are one paid lane on the platform, so a free workspace is refused there and the other three stores are unaffected. The two verbs are not interchangeable: extension_publish pushes to the extension.dev platform, extension_submit sends the build into a store's review queue, which is irreversible. After a real submission, extension_release_status reads the recorded outcome, per-store credential health, and review state from the project's public registry, so agents and CI can answer "was it approved?" without a console visit. Access tokens live at most 7 days; CI pipelines re-mint them from the console's Access tokens page.
The extension.dev stack
Package | Use it to |
Teach AI agents the judgment half: cross-browser rules, gotchas, playbooks | |
Check an artifact against a declared SHA-256 and gate CI on the result |
All of it rides on Extension.js, the open-source cross-browser extension framework.
Community
Join the extension.dev Discord for help and feedback
Browse production-ready templates at templates.extension.dev
Follow the platform's public packages on GitHub
Report Extension.js framework issues on GitHub
License
Apache-2.0 (c) 2026 Cezar Augusto and the extension.dev collaborators. See LICENSE.
Available Tools
30 toolsextension_add_featureA
Plan a new feature surface for an existing extension. This returns step-by-step instructions, the manifest additions to make, and reference templates from the extension.dev catalog. It modifies no files: apply the returned plan yourself.
| Name | Required | Description | Default |
|---|---|---|---|
| feature | Yes | Feature surface to add | |
| framework | No | react | |
| projectPath | Yes | Extension project root |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description bears full responsibility. It clearly states 'It modifies no files: apply the returned plan yourself', effectively communicating the read-only, non-destructive nature. It also describes the output format, adding beyond what annotations could 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?
Two sentences: first states the core purpose, second clarifies behavior and output. Front-loaded and concise with no unnecessary words. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple planning tool with no output schema, the description covers what the tool returns (instructions, manifest additions, templates) and its non-modifying behavior. It could mention prerequisites (e.g., project must be a valid extension) but is largely complete. Score 4.
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 67% (feature and projectPath have descriptions; framework does not). The description adds context about output (templates, manifest additions) that relates to parameters, but does not independently explain each parameter beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description specifies the verb 'Plan' and the resource 'a new feature surface for an existing extension', clearly differentiating from siblings like extension_create or extension_build. It details the output (step-by-step instructions, manifest additions, reference templates) and explicitly states that no files are modified.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for existing extensions to plan a feature, but does not explicitly state when to use this tool versus alternatives, nor does it provide when-not-to-use guidance. It is adequate but lacks explicit contextual boundaries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extension_analyzeA
Analyze a BUILT extension on disk: file sizes, declared entry points, permissions, bundle composition, and store-readiness checks. This is static only: it reads dist/ from the filesystem and never touches a browser, so build first with extension_build. Use extension_inspect for a running extension's live DOM and console.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | summary | |
| browser | No | Browser build to analyze | chrome |
| projectPath | Yes | Extension project root |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must convey behavioral traits. It clearly states the tool is static, reads from dist/<browser>, and never touches a browser. It does not mention non-destructiveness explicitly, but the static nature implies no side effects. Could be more explicit about safety, but adequate.
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 wasted words. First sentence covers purpose and specifics, second sets boundaries and alternatives. Front-loaded and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 3 params, no output schema, and no annotations, the description covers core functionality, prerequisites, and sibling differentiation. Missing details on output format styles and 'store-readiness checks', but sufficient for basic use.
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 67% and parameters are well-named with enums and defaults. The description adds little beyond the schema; it does not explain how 'format' affects output or the meaning of 'browser'. Baseline score is appropriate given schema handles most semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it analyzes a BUILT extension on disk, listing specific aspects (file sizes, entry points, permissions, bundle composition, store-readiness). It distinguishes from sibling tool extension_inspect by specifying static vs. live analysis.
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 prerequisite (build first with extension_build), clarifies the tool is for static analysis only, and directs users to extension_inspect for live DOM/console inspection. This provides excellent when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extension_assertA
Run a test stage against a live dev session: state expectations and read one verdict for each, instead of reading a blob and hand-rolling the judgement. Every expectation comes back pass, fail or inconclusive, where inconclusive means this platform cannot cover the question today and the verdict says what would settle it. An inconclusive check is never a pass. Start the session with extension_dev; use extension_inspect or extension_logs when you want the raw reading instead of a verdict.
| Name | Required | Description | Default |
|---|---|---|---|
| expect | Yes | One object per expectation, each { assert: <check id>, ...args }. background-worker-booted: no args. surface-rendered: surface (popup, options, sidebar, newtab, history, bookmarks), optional selector and minNodes. content-script-injected: url. storage-key-present: key, optional area (default local), equals, context. console-errors-empty: optional context (array), since (seq cursor), ignore (substrings). | |
| browser | No | Session browser; defaults to this project's live session | |
| timeout | No | Command timeout in ms (default 5000) | |
| projectPath | Yes | Extension project root (needs a live dev session) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description discloses verdict semantics (pass/fail/inconclusive) and notes that inconclusive is never a pass Newton. It implies read-only behavior but doesn't explicitly state no side effects or prerequisites beyond extending dev session; still, it provides meaningful behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences pack purpose, verdict semantics, and alternative tools without fluffaine; the structure is efficient, though slightly dense.
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 lack of annotations, the description covers the operational context well: how verdicts work, what inconclusive means, and the prerequisite of starting with extension_dev. It doesn't describe return value format, but it's adequate for usage decisions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the description does not add substantial semantics beyond what the schema already documents for each parameter. Baseline 3 applies since schema is complete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it runs a test stage against a live dev session and reads verdicts per expectation. It explicitly distinguishes itself from extension_inspect and extension_logs by noting the alternative for raw readings.
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 says to start with extension_dev and to use extension_inspect or extension_logs when raw readings are desired, giving clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extension_authA
Sign this machine in to extension.dev, report that login, or clear it. Pass action:'status' (the default) to name the workspace and project the stored token is scoped to and when it expires, never the token itself; that identity comes from the stored token alone, and does not change with the current working directory or whichever project folder you are in. Status also asks the platform's whoami endpoint whether that credential actually resolves there: the answer is reported as confirmed, refused-by-server, or unverified when the server cannot be reached, so a local file claiming a login the server would refuse is never reported as simply logged in. Pass action:'login' for a two-phase flow: call with project to get a code plus a URL the user authorizes at extension.dev/device, then call again with the returned deviceCode. GitHub federation happens server-side, so no GitHub token lands on this machine. Minted tokens live at most 7 days, server-enforced, so CI must re-mint before expiry on the console's project settings, Access tokens page. Pass action:'logout' to delete the local credentials only; the token stays valid server-side until it is revoked at the URL the response returns.
| Name | Required | Description | Default |
|---|---|---|---|
| api | No | Platform base URL (default EXTENSION_DEV_API_URL, else https://www.extension.dev) | |
| action | No | status | |
| project | No | login: target project as '<workspace>/<project>'; the token is scoped to it. The slug pair is the console address bar: an existing project's page is console.extension.dev/<workspace>/<project>. Create one at extension.dev/new if none exists yet. | |
| deviceCode | No | login: resume token from the prior call's `deviceCode`; omit on the first call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure—and it excels. It reveals that status never returns the token, identity does not depend on the working directory, server verification can result in three distinct states, login never stores a GitHub token, tokens expire server-side after 7 days, and logout only removes local credentials. This level of transparency is exceptional and leaves no misleading assumptions.
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 long but appropriately sized for a complex auth tool with three distinct modes. It is front-loaded with the action summary and then methodically explains each path. Some redundancy exists (e.g., repeating 'deviceCode'), but no sentence is wasted; the length is justified by the need to convey security and flow details. It remains readable and well-organized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description is complete enough for an agent to invoke all three actions correctly. It explains the login handshake, status verification states, token lifetime, logout side effects, and API base URL default. The richness of contextual details ensures the agent understands not only what to call but also the expected behavior and caveats, making this a fully self-contained tool description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers 75% of parameters (api, project, deviceCode have descriptions; action only has an enum). The description adds substantial meaning to action, project, and deviceCode by explaining the two-phase flow, the workspace/project slug format, and the role of deviceCode in resuming login. It does not elaborate on the api parameter, but the schema already provides its default behavior, and the description's added context goes well beyond schema basics.
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 precise, verb-driven summary: 'Sign this machine in to extension.dev, report that login, or clear it.' It clearly enumerates the three actions (status/login/logout) and distinguishes this tool from sibling dev tools by focusing on authentication lifecycle. The scope is unambiguous and immediately differentiates from the other extension_* 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 description provides explicit usage instructions for each action, including the two-phase login flow, project parameter format, and logout semantics. It stops short of explicitly stating when not to use this tool in favor of a sibling, but the auth-only purpose is clear from the name and context; the action-level guidance is thorough and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extension_browsersA
Find, install and remove the browsers Extension.js tooling can launch. Pass action:'detect' (the default) to scan both system-installed and managed browsers, and report each one's binary path, version, engine and debugger support. Pass action:'list' for the managed cache this tool downloads into, with sizes on disk. Pass action:'install' to download a managed binary: 580 to 625 MB in one blocking call, so allow a generous client timeout. Pass action:'uninstall' to remove managed binaries; it never touches a system install.
| Name | Required | Description | Default |
|---|---|---|---|
| all | No | uninstall: remove every managed binary. | |
| action | No | detect | |
| browser | No | install/uninstall: which managed binary. Required for install. | |
| browsers | No | detect: limit the scan to these. Omit to check all. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses that install downloads 580-625 MB in one blocking call and that uninstall never touches system installs. It could mention potential failure modes or that detect might be slow, but overall it provides good behavioral insight.
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 paragraph but efficiently organizes information by action. Every sentence adds value, and the most important information (purpose and actions) comes first. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
While the description covers the main actions and their inputs, it lacks explicit details on return values for each action. For example, it does not specify the format of the output for detect or list, and for install/uninstall it does not confirm success/failure indicators. However, given the moderate complexity and lack of output schema, it is mostly adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75% (3 of 4 parameters have descriptions). The description adds context beyond the schema: it explains the actions in detail and specifies which parameters apply to which actions (e.g., 'browser' for install/uninstall, 'browsers' for detect). This helps an agent use parameters correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Find, install and remove the browsers Extension.js tooling can launch.' It specifies each action (detect, list, install, uninstall) and what it does, making it distinct from sibling tools which focus on extension development rather than browser management.
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 explicit instructions for each action, including default behavior, required parameters, and important caveats like the large download size and generous timeout needed for install. It clearly differentiates between system and managed browsers, helping the agent decide when 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.
extension_buildA
Build a browser extension for production. The output lands in dist//. Pass zip:true to also package a .zip for store submission. With browser:'safari' the build converts the extension into a macOS app through Xcode, and bundleId sets the identifier it ships under. The build refuses a manifest with build-blocking errors unless you pass skipValidation:true, because such a manifest yields a broken bundle the bundler itself never flags.
| Name | Required | Description | Default |
|---|---|---|---|
| zip | No | Create a .zip file for store distribution | |
| mode | No | Bundler mode override (also sets NODE_ENV) | production |
| silent | No | Suppress build output | |
| appName | No | Safari targets only: name of the generated macOS app, which also names the Xcode scheme and the .app on disk. Defaults to the manifest name. | |
| browser | No | chrome | |
| bundleId | No | Safari targets only: a reverse-DNS bundle identifier you own, such as com.acme.readinglist. Without one the app is packaged under a generated dev.extensionjs.* identifier derived from the app name, which every project built from the same template shares, and the first team to register it takes it. | |
| polyfill | No | Apply cross-browser polyfill | |
| macOsOnly | No | Safari targets only: generate a macOS-only Xcode project. Pass false for a universal project that also targets iOS and iPadOS, which is what you want if the extension ships on iPhone or iPad. | |
| zipSource | No | Include source code zip (required by some stores) | |
| projectPath | Yes | Extension project root | |
| zipFilename | No | Custom .zip file name (defaults to name and version) | |
| skipValidation | No | Build even when extension_manifest_validate reports build-blocking errors. The build normally refuses: a manifest error yields a broken bundle the bundler itself never flags. | |
| forceRegenerate | No | Safari targets only: regenerate the Xcode project even when the engine considers it up to date. Use it when an earlier packaging run left the project broken. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full disclosure burden. It reveals output location, Safari-to-macOS conversion, bundleId behavior, and the refusal on build-blocking errors (with rationale), offering strong transparency into non-obvious side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four sentences, front-loaded with the core purpose, then adding output, zip, Safari, and validation behavior. Each sentence provides unique, necessary information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 13 parameters, no annotations, and no output schema, the description covers the most critical non-obvious aspects (Safari, validation, zip). It omits some minor parameters like mode and silent, but the schema descriptions fill those gaps, making the description sufficiently complete for an agent.
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 high (92%), so baseline is 3. The description adds value by explaining zip:true's store submission purpose, Safari-specific browser behavior, bundleId identifier role, and skipValidation logic. It does not cover all params (mode, silent, etc.), but those are already well-documented 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 clearly states 'Build a browser extension for production' with a specific verb, resource, and scope. It also specifies output location (dist/<browser>) and unique behaviors (Safari conversion, validation refusal), distinguishing it from sibling tools like extension_dev.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context for production builds and specific use cases (zip for store submission, Safari conversion, skipValidation). However, it does not explicitly mention when to use alternatives like extension_dev for development, leaving some ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extension_createA
Create a browser extension project from a template in the extension.dev catalog. Call extension_templates first to see what is available. The scaffolder may initialize a git repository in the new project. Read the result's defaultsApplied block for that, and for every other decision made without being asked.
| Name | Required | Description | Default |
|---|---|---|---|
| install | No | Install dependencies after creation | |
| template | No | Template slug from the extension.dev catalog (e.g. 'react', 'ai-claude', 'content-vue'). extension_templates discovers them. | typescript |
| parentDir | No | Directory to create the project inside. Defaults to the MCP server process cwd, NOT the caller's cwd, so pass it whenever you care where the project lands. Aliases: parent, into. | |
| projectName | Yes | Name of the extension project (used as directory name). Alias: name. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that git repository initialization may occur and tells the agent to read the defaultsApplied block in the result. No annotations are provided, so the description carries the burden; it covers key behaviors but could mention potential side effects like overwriting.
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 serving a clear purpose: stating action, prerequisite, and behavioral note. No unnecessary words or information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema or annotations, the description covers purpose, prerequisite, side effect (git init), and how to interpret results. It lacks details on error conditions or dependencies but is fairly complete for a create tool with well-documented parameters.
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 description does not add new meaning beyond the schema's parameter descriptions. No additional parameter guidance is provided, 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 clearly states the tool creates a browser extension project from a template, with the specific verb 'create' and resource 'browser extension project'. It distinguishes from sibling tools like extension_templates which lists templates.
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 advises calling extension_templates first to see available templates, providing clear usage context. While it doesn't list when not to use, the guidance is direct and helpful.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extension_devA
Run the extension while you edit it: dev build, hot module replacement, and a browser with the extension loaded. Reach for this first when the ask is "run my extension". ONLY this tool unlocks the control channel that extension_storage, extension_reload, extension_open and extension_dom_snapshot need (allowControl:true) and the eval channel that extension_eval needs (allowEval:true, which implies allowControl, so you never need to pass both). Use extension_start instead to run the production build in a browser. The result carries the process info that extension_wait and extension_inspect need.
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | Bind host, default 127.0.0.1. Use 0.0.0.0 in Docker or devcontainers. | |
| port | No | Dev server port (0 for auto-assign) | |
| browser | No | chrome | |
| carrier | No | Load the bundled Live Preview carrier beside your extension (Chromium only) so allowlisted pages (preview.extension.dev, localhost) can pair with the session and stream its real-lane chrome.* trace. Written into the auto-loaded ./extensions folder, gitignored, and removed on extension_stop or extension_build: never part of a release. | |
| profile | No | Profile path, or "false" to reuse the real user profile. Omit for a throwaway one. | |
| replace | No | Stop the live session for this projectPath first, reported as replacedSession. Without it a second call is refused rather than forking: two sessions fight over one profile and the newer browser dies on the lock. | |
| polyfill | No | Apply cross-browser polyfill | |
| allowEval | No | Enable extension_eval (runs code in a context; writes a 0600 session token). Implies allowControl, so you never need to pass both. | |
| noBrowser | No | Start the dev server without launching a browser | |
| extensions | No | Extra extension paths or store URLs to load alongside the project | |
| publicHost | No | Host the browser dials for HMR and reload when it differs from the bind host | |
| geckoBinary | No | Custom Gecko/Firefox binary (overrides browser) | |
| projectPath | Yes | Extension project root | |
| startingUrl | No | URL the browser opens on launch | |
| allowControl | No | Enable the agent-bridge control channel that extension_storage/reload/open/dom_snapshot need | |
| chromiumBinary | No | Custom Chromium-based binary (overrides browser) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses control/eval channels, carrier behavior, replace conflict handling, and that result carries process info for other tools. No annotations present, so description bears full burden and excels.
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?
Well-structured: front-loads purpose, then details parameters and relationships. Every sentence provides necessary information without redundancy.
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?
Comprehensive for a complex tool with 16 parameters and many siblings. Explains return value implications and dependencies on other 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?
Adds significant context beyond schema: carrier gitignored, replace stops live session, allowEval implies allowControl. Schema coverage is 94%, but description still adds value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it runs the extension in dev mode with dev build, HMR, and browser. Distinguishes from extension_start for production build.
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 'Reach for this first when the ask is 'run my extension'.' Contrasts with extension_start and explains when to use alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extension_doctorA
Diagnose a dev session end to end: ready contract, dev-server process, control-port agreement, control channel, eval token, executor, browser liveness. This returns one {check, status, detail, remediation?} per leg, in dependency order. Read a 'skip' as blocked, not as a pass: it names the check that blocked it. A session started without allowControl comes back ok:true with status 'read-only', not as an error: its control channel is off by choice. Run this first when any act tool (storage, reload, eval, open) errors unexpectedly. Call it with no projectPath for a pre-flight environment check (node, the Extension.js CLI, the template cache) before any project exists.
| Name | Required | Description | Default |
|---|---|---|---|
| browser | No | Browser session to diagnose. Defaults to the active dev session's browser for this project. | |
| projectPath | No | Path to the extension project root. Omit for a pre-flight environment check with no project. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses behavior: it returns a per-leg object in dependency order, clarifies that 'skip' means blocked (not pass), and explains the read-only behavior for sessions without allowControl. This goes beyond a simple 'diagnose' and prepares the agent for unexpected statuses.
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 four sentences, front-loaded with the main diagnostic purpose, and each later sentence earns its place by adding behavioral nuances or usage guidance. No fluff, tightly packed with essential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite the lack of an output schema, the description fully explains the return shape and semantics. It covers both diagnostic modes, error handling context, and the meaning of distinct statuses (skip, read-only). This is complete for a tool of 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 coverage is 100% for both parameters, so baseline is 3. The description adds semantic clarity by explicitly noting that omitting projectPath triggers a pre-flight environment check, which supplements the schema's 'Omit for a pre-flight environment check' with additional context about what that check includes.
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: 'Diagnose a dev session end to end' and enumerates the specific checkpoints (ready contract, dev-server process, etc.). It clearly distinguishes itself from sibling act tools by positioning itself as a diagnostic tool to run first when act tools error.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use guidance is given: 'Run this first when any act tool (storage, reload, eval, open) errors unexpectedly.' It also explains the two invocation modes (with/without projectPath) and the pre-flight use case. This clearly differentiates it from the act tools and sets expectations for when it should be called.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extension_dom_snapshotA
Take a shallow structured DOM snapshot of one chosen surface through the agent bridge (localhost only; the snapshot itself needs no CDP, but listTargets and tabUrl resolution ask the browser directly and need the session's debug port: CDP page targets on Chromium, RDP tab descriptors on Firefox): element counts, extension roots, open shadow roots, optional byte-capped HTML, and optional recent console lines. This is the SURFACE PICKER: the only tool that reads an open extension surface by name (context: popup, options, sidebar, devtools) or an override page, the only one that takes a numeric chrome.tabs id, and the only one that enumerates what is open (listTargets for CDP targetIds and RDP tab actors, listTabs for numeric tab ids). An ambiguous tabUrl returns the candidates instead of guessing. It does not pierce closed shadow roots, run selector probes, or navigate: use extension_inspect for those, and for a deep read of an already-open web page. Start the session with allowControl:true (extension_dev).
| Name | Required | Description | Default |
|---|---|---|---|
| tab | No | Numeric chrome.tabs id, only to disambiguate when several tabs match. With neither `tab` nor `url`, content/page target the active tab. | |
| url | No | content/page: pick the tab by url (match pattern, then substring). Preferred over `tab`. | |
| tabUrl | No | Target the tab whose URL contains this substring (case-insensitive; titles checked only when no url matches). Resolved against the live browser first: exactly one match proceeds, zero or several return the candidates instead of a guess. Alternative to `url`. | |
| browser | No | Session browser; defaults to this project's live session | |
| context | No | content/page targets `url`, else the active tab; the rest must already be OPEN | content |
| include | No | What to include; html is byte-capped | |
| timeout | No | Command timeout in ms (default 5000) | |
| listTabs | No | Enumerate open tabs as {tabId,url,title} and return, ignoring the other args. Use when you need a numeric tab id. | |
| maxBytes | No | ||
| listTargets | No | Enumerate live page targets and return, ignoring the other args. The discovery path for `tabUrl`. Chromium: {targetId,url,title,type}. Firefox: RDP tab descriptors {actor,url,title,type}. Neither id is a numeric chrome.tabs id; for those use listTabs. | |
| projectPath | Yes | Extension project root (needs a live dev session) | |
| withConsole | No | Also include recent console lines. A number is how many; true means 50. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries the burden. It discloses key behaviors: localhost only, need for debug port, optional byte-capped HTML, console lines, ambiguous tabUrl returns candidates, and that it does not navigate or run probes. Comprehensive.
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 lengthy but front-loaded with the main purpose. Some sentences are dense with technical details, but every sentence adds value. Slightly more concise could improve, but still well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (12 params, no output schema), the description covers prerequisites, behavior, limitations, and output characteristics. It explains what to expect for ambiguous inputs (returns candidates) and lists what the tool does not do.
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 high (92%), but the description adds significant extra context: explains the purpose of listTabs/listTargets, clarifies the context enum meanings, and details how tabUrl resolution works. This goes well beyond the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: taking a shallow structured DOM snapshot of a chosen surface. It specifies it is the 'SURFACE PICKER' and contrasts with extension_inspect, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool vs alternatives: 'does not pierce closed shadow roots... use extension_inspect for those'. It also mentions the prerequisite 'Start the session with allowControl:true (extension_dev)', providing clear usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extension_evalA
Evaluate an expression in a running extension context. Start the session with allowEval:true (extension_dev), which writes a 0600 session token. Context defaults to 'background', except on a Chromium MV3 session (the default template) where it defaults to 'page', the active tab, because the MV3 service worker CSP blocks eval; pass context:'background' to target the worker anyway and get that explanation back. For content and page, pass url to pick the tab, or omit both url and tab for the active tab; a numeric tab only disambiguates. Extension surfaces (popup, options, sidebar, devtools) and override pages evaluate over the in-bundle relay and need no tab id, but must already be open: open one with extension_open first, because a closed one returns an explicit error. Call extension_dom_snapshot with listTabs:true to enumerate {tabId, url, title}.
| Name | Required | Description | Default |
|---|---|---|---|
| tab | No | Numeric chrome.tabs id, only to disambiguate when several tabs match. | |
| url | No | content/page: pick the tab by url (match pattern, then substring). Preferred over `tab`. | |
| browser | No | Session browser; defaults to this project's live session | |
| context | No | Where to evaluate. Default background, except Chromium MV3 sessions default to page (the active tab). | |
| timeout | No | Command timeout in ms (default 5000) | |
| expression | Yes | JavaScript expression to evaluate in the target context | |
| projectPath | Yes | Extension project root (needs a live dev session) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully discloses behavioral traits: writing a session token, default context behavior, Chromium MV3 specific changes, error messages for closed surfaces, and disambiguation logic. These are critical for safe usage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured paragraph that efficiently covers core purpose, multiple edge cases, and usage guidelines. Every sentence serves a purpose, and the most important 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?
The description thoroughly covers usage contexts but does not explicitly describe the return value format. Given the complexity of the tool and no output schema, a brief note on what the tool returns would enhance completeness, though the lack is minor.
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?
Despite 100% schema coverage, the description adds significant value by explaining parameter interactions (e.g., url vs tab, context defaults, no need for tab in extension surfaces). It goes beyond the schema to clarify disambiguation and prerequisites.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool evaluates an expression in a running extension context. It distinguishes itself from siblings by detailing specific contexts and scenarios, such as background, page, and extension surfaces, making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly provides when to use this tool, including references to extension_dev for session start and extension_dom_snapshot for tab enumeration. It also explains defaults and when to use url vs tab, and warns when a closed surface returns an error, offering clear alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extension_inspectA
Inspect a running extension deeply over the browser's debugger protocol: full HTML including shadow DOM, DOM structure, content-script injection, console messages, and CSS selector queries through probe. This is the ONLY tool that pierces closed shadow roots (deepDom), runs selector probes, and navigates a tab to url before reading it. It reads a web or override page and picks the first inspectable target, or the first whose url contains url; it cannot address an extension surface by name and takes no chrome.tabs id. Use extension_dom_snapshot to choose which tab or which open surface (popup, options, sidebar, devtools) to read, or to enumerate what is open. Use extension_analyze for a built extension's files and sizes on disk. Chromium rides the Chrome DevTools Protocol and needs the session's debug port, not allowControl. Firefox is fully paired: summary, meta, html, dom_snapshot, extension_roots and probes ride the agent bridge and need allowEval:true, console rides the RDP watcher replay on engine 4.0.15 and later, and deepDom needs an MV2 session with host permissions for the target url, because the Firefox MV3 background CSP blocks bridge evals. This requires an active dev or start session.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | URL to inspect; the tab is navigated there first | |
| probe | No | CSS selectors to query; returns counts and samples for each | |
| browser | No | Session browser; defaults to this project's live session | |
| deepDom | No | Pierce CLOSED shadow roots; open ones are read anyway. Chromium: CDP DOM pierce. Firefox: a content-script walk via tabs.executeScript (MV2 only, needs host permissions for the target url). | |
| include | No | What to include | |
| maxBytes | No | Truncate HTML output at this byte count (0 = unlimited) | |
| projectPath | Yes | Extension project root (needs a live dev session) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully discloses behaviors: it navigates tabs, pierces closed shadow roots, runs selector probes, picks the first inspectable target, and cannot address by name. It also details browser-specific behavior for Chromium vs Firefox, including permission requirements (allowControl, allowEval, host permissions).
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 dense but well-organized, front-loading the core purpose and then detailing capabilities and limitations. While long, the complexity of the tool justifies the length. Slightly verbose but 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?
The description is highly complete given the tool's complexity, covering behavior, limitations, browser differences, and prerequisites. However, it lacks explicit description of the return value or output structure, which would be helpful since no output schema is provided.
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?
All 7 parameters have schema descriptions (100% coverage), and the description adds substantial context beyond the schema, e.g., explaining deepDom piercing, the include options, maxBytes truncation, and the need for a live dev session for projectPath.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool inspects a running extension deeply over the browser's debugger protocol, listing specific capabilities (HTML, shadow DOM, console, probes). It explicitly distinguishes from sibling tools like extension_dom_snapshot and extension_analyze, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use this tool versus alternatives: use extension_dom_snapshot for choosing tabs/surfaces, use extension_analyze for built extension files. It also notes that the tool requires an active dev or start session, giving clear use cases and prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extension_list_extensionsA
List the extensions in the running dev browser: id, name, version, and, on Chromium, live contexts. This session's own extension carries ownExtension:true, with name and version from the ready contract even when the browser exposes no identity. Chromium rides the Chrome DevTools Protocol, so an entry needs at least one live context, and a dormant MV3 service worker may be absent until it wakes. Firefox rides the RDP root actor (listAddons, engine 4.0.15 and later), so entries are installed add-ons regardless of contexts, are marked temporarilyInstalled where relevant, and carry no contexts. Other extensions' contexts are never attached to or evaluated in. This requires an active dev or start session.
| Name | Required | Description | Default |
|---|---|---|---|
| browser | No | Session browser; defaults to this project's live session | |
| projectPath | Yes | Extension project root (needs a live dev session) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and excels. It explains browser-specific differences (Chromium via CDP requiring live contexts, Firefox via RDP listing add-ons regardless of contexts), owns-extension detection, and dormant service worker behavior. It also clarifies that other extensions' contexts are never attached or evaluated.
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 detailed but well-structured, starting with the core function then diving into browser-specific details. Every sentence adds value, though a slight trim could be made. It is appropriately front-loaded with the main action and critical requirements.
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 cross-browser differences and lack of annotations, the description covers the essential details: what the tool does, returned fields, browser behaviors, and session requirements. No output schema exists, but the description sufficiently describes return structure (id, name, version, contexts, ownExtension flag). It is complete for a list tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for both parameters (browser and projectPath). The description adds context about session requirements (e.g., projectPath needing a live dev session) but does not significantly enhance parameter understanding beyond the schema. Baseline of 3 is appropriate given the schema already describes parameters well.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'list' and the resource 'extensions in the running dev browser,' specifying the information returned (id, name, version, live contexts on Chromium). It distinguishes behavior across browsers and mentions the own-extension marker, making the purpose unambiguous and distinct from sibling 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?
The description explicitly requires an active dev or start session, providing a clear precondition. It implies when to use the tool (to inspect installed extensions) but does not explicitly state when not to use it or suggest alternatives. The detail on browser-specific behavior acts as a guideline for expected differences.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extension_logsA
Read or stream logs from every context of a running dev session (service worker, content scripts, popup, options, sidebar, devtools, pages) in one ordered timeline. This reads the same agent-bridge plane as the extension logs CLI: a one-shot returns the most recent matching lines from logs.ndjson, and follow:true collects from the live control channel for a bounded window. This requires an active extension_dev session.
| Name | Required | Description | Default |
|---|---|---|---|
| tab | No | Only events from this tab id. | |
| url | No | Only events whose url/hostname matches (glob or substring), e.g. https://shop.example/*. | |
| level | No | Minimum severity; a level includes everything more severe. | all |
| limit | No | How many of the most recent events to return. | |
| since | No | Only events with seq greater than this; the cursor for polling forward. | |
| follow | No | Collect from the live control channel for a bounded window instead of reading the file. | |
| browser | No | Which dist/extension-js/<browser>/ to read. Defaults to this project's live session, else chromium. | |
| context | No | Restrict to these contexts. Omit for all. | |
| followMs | No | How long to collect live frames when follow=true (clamped 500–15000ms). | |
| projectPath | Yes | Extension project root (needs a live dev session) | |
| signalsOnly | No | Only structured dx.signal diagnostics (code/status/remediation), no plain console lines. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It explains the behavioral modes (one-shot, follow), the bounded window, and the requirement for an active session. It does not mention destructive actions, which is appropriate for a read-only tool. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, with front-loaded main purpose and no unnecessary words. It is a single paragraph of four sentences that 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?
Given the tool has 11 parameters and no output schema, the description explains overall behavior and modes but does not describe the return format or details of structured diagnostics (signalsOnly). It is adequate but could be more 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%, so baseline is 3. The description adds the concept of 'agent-bridge plane' and 'live control channel' which provide context, but does not significantly enhance understanding of individual parameters beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb (read/stream) and the resource (logs from all contexts of a running dev session), and distinguishes it from the CLI tool. It is specific and actionable.
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 context about one-shot vs follow mode and requires an active extension_dev session, but does not explicitly compare to sibling tools or state when not to use it. Lacks clear when-to-use versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extension_manifest_validateA
Validate a manifest.json across browsers. This reports missing fields, invalid permissions, dangling file references, and cross-browser compatibility issues. Read buildBlocking for the errors that make extension_build refuse.
| Name | Required | Description | Default |
|---|---|---|---|
| browser | No | Single browser to validate against; alias for browsers:[browser] to match the other tools. | |
| browsers | No | Browsers to validate against | |
| projectPath | No | Path to the extension project root; manifest.json is resolved from it (root or src/). Accepted in place of manifestPath. | |
| manifestPath | No | Path to manifest.json. Or pass projectPath and the manifest is located for you. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description should disclose side effects, permissions, or output behavior. It mentions reporting actions but does not confirm read-only status, clarify whether it modifies state, or describe the response format. The reference to buildBlocking adds context but more detail would improve transparency.
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 cover essential information: purpose and a key usage hint. No filler words; every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description does not clarify the structure of the validation report (e.g., error codes, severity levels). While the listed checks give some context, the format and how to interpret results remain unclear.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameters are well-documented in the schema. The description does not add new meaning to parameters—it only states the tool's purpose. 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 specifies a concrete action ('Validate a manifest.json'), identifies the resource, and lists specific checks (missing fields, invalid permissions, dangling file references, cross-browser compatibility). It differentiates from siblings like extension_analyze or extension_doctor by focusing solely on manifest validation.
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 implicitly suggests use before building by referencing buildBlocking errors. However, it does not explicitly compare with sibling tools (e.g., when to use extension_analyze instead) or state prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extension_openA
Open an extension surface, or replay an event, in a running session. Pass surface:'popup', 'options' or 'sidebar' to open a UI surface, or 'newtab', 'history' or 'bookmarks' to open the matching chrome_url_overrides page in a tab. Pass surface:'action' to trigger the toolbar action, which opens its popup or replays chrome.action.onClicked when there is none. Pass surface:'command' with name to replay a chrome.commands.onCommand shortcut. Note that action and command replay invoke your listener without a user gesture, so the gesture-derived activeTab grant does not apply; the result reports gesture:false and warns when activeTab is declared. Start the session with allowControl:true (extension_dev).
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Navigate a real tab here instead of opening a surface (Firefox needs allowEval: true). Use for content-script test pages, or a surface as a page: chrome-extension://<id>/popup.html. | |
| name | No | For surface 'command': the chrome.commands name to trigger. | |
| asTab | No | popup/options/sidebar: render the surface's document in a real tab instead of a popup window. This is how you inspect a surface HEADLESSLY, and it is applied automatically when a headless session refuses to open one. Same page and APIs, but no popup sizing and window.close() closes the tab. | |
| browser | No | Session browser; defaults to this project's live session | |
| surface | No | Which surface to open or event to replay. | |
| timeout | No | Command timeout in ms (default 5000) | |
| projectPath | Yes | Extension project root (needs a live dev session) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses key behaviors: the effect of each surface, automatic use of asTab in headless sessions, gesture-derived activeTab grant not applying for action/command, and the need for allowControl:true. This is comprehensive.
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 dense paragraph that front-loads the main action. While it packs much information, it could be more structured with bullet points or clearer separation of scenarios. Still, every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (7 parameters, enum, no output schema), the description covers essential aspects: all surface options, asTab behavior, gesture implications, session requirement. It omits return format but that is acceptable without an 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%, so baseline is 3. The description adds value beyond schema by explaining how parameters interact (e.g., surface='command' requires name, asTab applied automatically in headless). It clarifies behavioral aspects 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 clearly states the tool opens an extension surface or replays an event in a running session. It enumerates specific surface values (popup, options, sidebar, newtab, history, bookmarks, action, command) and their distinct behaviors, distinguishing it from sibling tools like extension_start or extension_eval.
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 explicit context on when to use each surface type, including UI surfaces, chrome_url_overrides, toolbar action, and command replay. It also notes the gesture limitation for action and command, but does not directly compare to sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extension_preview_webA
Preview an in-progress extension in the web emulator, with no real browser. This builds the project (unless build:false) and previews dist/. Pass share:true unless you are working inside the extension.dev monorepo: it uploads the build and returns a link anyone can open, with no install, sign-in or dev server, and it is the only lane that works from an npm install of this server. Sharing also serves the build as a zip, so it hands over the built code; read the share property before using it. The default lane instead returns a deep link over the dev-only preview://build scheme, which resolves only against a preview.extension.dev dev server on this machine, so it is for people developing extension.dev itself. Call extension_shares to list and revoke every link shared this way, so one never vanishes with this response.
| Name | Required | Description | Default |
|---|---|---|---|
| open | No | Also open the deep link in a running session's browser, in a focus-safe background tab. Needs a live extension_dev/extension_start session. | |
| build | No | Build first. false previews the existing dist/<browser> as-is. | |
| probe | No | Fetch the surface's dev middleware first to confirm the artifact loads on the local host. With share:true it also checks the shared link the way a browser would, following the zip's redirects and asserting the final response allows the preview origin, and reports that as share.browserLoadable. | |
| share | No | Upload the built dist and return a public link (share.previewUrl) that renders those exact bytes for anyone: no install, sign-in or dev server. Uploading runs on extension.dev's machines and counts against your free allowance; left false, the result's share property says what the local deepLink needs, what share:true spends, and the exact call to get a shareable link. It also serves the build as a zip (share.zipUrl), so sharing hands over the code. Needs a token scoped to an extension.dev project (extension_auth or EXTENSION_DEV_TOKEN); without one you get a login hint and the local preview still succeeds. Live until share.expiresAt; DELETE share.revokeUrl to kill it sooner. Revocation is permanent, and re-sharing an unchanged build returns the same link unless it was revoked, so each share is also appended to the project's gitignored .extension.dev/shared-previews.json. | |
| openIn | No | Which session's browser to open it in. Defaults to `browser`. | |
| browser | No | Which dist/<browser> output to preview. The emulator renders it as mocked Chrome either way. | chrome |
| hostUrl | No | Origin of the running preview.extension.dev dev server (default http://localhost:3110). | |
| distPath | No | Preview this built directory instead of dist/<browser> under projectPath. Implies build:false. | |
| projectPath | Yes | Extension project root |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden, and it is remarkably thorough: it discloses builds, uploads, quota consumption, zip exposure of source code, token requirements, expiry, permanent revocation, and the gitignored shared-previews.json record. It also warns the agent to read the share property before using the response.
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 each clause is information-dense, so nothing feels like filler. However, it is a long single block of text for its length, and the complexity of the sharing lane could benefit from sharper structural segmentation. This is acceptable given the tool's complexity.
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, yet the description covers the key return concepts: share URL, zip URL, local deepLink, share.browserLoadable, expireAt, revokeUrl, and the local dev-server constraint. It also covers auth side effects, lifecycle, and cleanup, so an agent can invoke and respond to the tool safely.
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 baseline for adding value is already high. The description does add meaningful parameter usage context, especially for share:true, build:false, and browser→dist/<browser>, but it does not enrich the other parameters in any meaningful way 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 opening sentence states a specific action: preview an in-progress extension in the web emulator with no real browser. It then describes the resource and behavior — building the project and previewing dist/<browser> — and clearly distinguishes the shared-preview lane from the dev-only deep-link lane.
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 selection rule: pass share:true unless you are inside the extension.dev monorepo, noting that sharing is the only lane that works from an npm install. It also marks the default lane as being for extension.dev developers and names extension_shares as the cleanup path for shared links.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extension_project_createA
Create an extension.dev project for an extension that does not have one yet, without opening the console. Use it right after extension_create and extension_build, once the extension's source is pushed to a GitHub repository, and BEFORE extension_auth: extension_auth can only log in to a project that already exists, and this tool is what brings that project into existence. Ask for nothing but the project slug and the repo; the platform finds the GitHub App installation on the approving account itself, and if there is none it returns a connect link to open. Two-phase, like login: the first call returns a code and a URL where the signed-in workspace owner approves creating exactly this project; call again with the returned deviceCode to finish. The approval mints a provisioning grant that lives minutes, can only create the one named project, and is never stored on this machine. On success the platform creates the project, its mirror repository, and dispatches the first build. Then run extension_auth (action: login) against the new project, and extension_publish to share it.
| Name | Required | Description | Default |
|---|---|---|---|
| api | No | Platform base URL (default EXTENSION_DEV_API_URL, else https://www.extension.dev) | |
| repo | Yes | Source GitHub repository as '<owner>/<repo>'. The extension's code must be pushed there, and the owner must be the same GitHub account that approves the device code. | |
| project | Yes | Target project as '<workspace>/<project>'. The workspace is the GitHub login of the approving user for personal workspaces; the project slug is the new project's name and must not exist yet. | |
| deviceCode | No | Resume token from the prior call's `deviceCode`; omit on the first call. | |
| description | No | Short project description. Defaults to a generic sentence naming the repo. | |
| displayName | No | Human name for the project. Defaults to the project slug. | |
| buildCommand | No | Build command producing the extension bundle. | npm run build |
| installCommand | No | Dependency install command the build runs first. | npm install |
| installationId | No | Optional override. Leave it out: the platform finds the extension.dev GitHub App installation on the approving account itself. Pass it only when an operator needs to name one explicitly, and it must still be an installation on that account or the platform refuses it. | |
| outputDirectory | No | Directory the build writes the loadable extension into. | dist/chrome |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully carries the behavioral transparency burden. It discloses the two-phase device flow, the temporary provisioning grant ('lives minutes, can only create the one named project, and is never stored on this machine'), the automatic GitHub App installation discovery, fallback connect link, and side effects (creates project, mirror repo, dispatches first build). This goes far beyond basic mutation 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?
The description is a dense paragraph but every sentence provides distinct value: purpose, sequencing, prerequisites, two-phase flow, security properties, success side effects, and follow-up actions. It is front-loaded with the primary purpose and maintains tight, information-rich phrasing without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex two-phase tool with 10 parameters and no output schema, the description is remarkably complete. It covers prerequisites, the approval flow, security behavior, post-success state, and next steps. The only gap is lack of explicit success-response structure or error cases (e.g., project already exists), but given the rich flow description, this is a minor 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?
The schema already covers 100% of parameters with detailed descriptions, giving a baseline of 3. The description adds meaningful semantic context by explaining the high-level flow ('call again with the returned deviceCode to finish'), advising against using installationId ('Leave it out'), and simplifying scope ('Ask for nothing but the project slug and the repo'). This elevates it above baseline, though individual parameter detail is largely 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 opens with a specific, unambiguous statement: 'Create an extension.dev project for an extension that does not have one yet, without opening the console.' It further distinguishes this tool from siblings by placing it in a sequence (after extension_create and extension_build, before extension_auth), making its unique role clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage timing: 'Use it right after extension_create and extension_build, once the extension's source is pushed to a GitHub repository, and BEFORE extension_auth.' It also explains why ordering matters ('extension_auth can only log in to a project that already exists') and what not to ask for ('Ask for nothing but the project slug and the repo'), effectively guiding selection among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extension_publishA
Publish the project your stored token is scoped to (extension_auth, or EXTENSION_DEV_TOKEN) to extension.dev, and return its shareable URL. This is what "deploy" or "ship" an extension usually means; extension_submit is the separate store-review path. The target is the token's project: there is no projectPath, and no local file is uploaded. For a public project the URL is the canonical public page and ttlHours does not apply. For a private one it is a fresh time-limited share link (?share=) whose lifetime is ttlHours.
| Name | Required | Description | Default |
|---|---|---|---|
| api | No | Platform base URL (default EXTENSION_DEV_API_URL, else https://www.extension.dev) | |
| buildSha | No | Pin the URL to a build sha (7-40 hex chars). An unknown sha is rejected, so the returned URL always points at a real build. | |
| ttlHours | No | Private-project share-link lifetime in hours, 1-168 (default 24). Ignored for public projects. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description fully discloses behaviors: no local file upload, no projectPath, token-scoped, and details for public vs. private projects, including ttlHours being ignored for public projects and buildSha rejection for unknown shas.
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 somewhat lengthy but each sentence adds value. It is front-loaded with the main action and then explains nuances. Slight room for tightening but overall 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 no output schema, the description explains the return value (shareable URL) and covers key behavioral details. It is complete for a tool with 3 optional parameters, though could mention error cases or prerequisites.
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%, providing baseline 3. The description adds context beyond the schema: explains that buildSha pins to a specific build and is rejected if unknown, ttlHours only applies to private projects, and api defaults are 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?
The description clearly states it publishes the project to extension.dev and returns a shareable URL. It distinguishes from extension_submit ('store-review path') and explains it is what 'deploy' or 'ship' usually means, providing a specific verb and resource.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use this tool (to publish/deploy) and contrasts it with extension_submit. It also clarifies behavior differences for public vs. private projects, but does not explicitly state when not to use it or provide alternative tools for different contexts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extension_release_promoteA
Promote a built extension to a release channel (stable, preview, beta, …) on extension.dev, headless. This WRITES: it is the only verb that changes what a channel points at. It is auth-gated by your stored login (extension_auth) or a release token in EXTENSION_DEV_TOKEN, minted and revoked under project settings, Access tokens. Tokens live at most 7 days, so CI must re-mint before expiry. The project comes from the token. Call extension_release_status to find a valid buildId. Cutting a version-bump PR is not available headlessly, because it writes to your source repo and needs an interactive login.
| Name | Required | Description | Default |
|---|---|---|---|
| api | No | Platform base URL (default EXTENSION_DEV_API_URL, else https://www.extension.dev) | |
| buildId | Yes | Build commit SHA to promote (a 7-char short SHA is fine) | |
| channel | Yes | Target release channel, e.g. stable, preview, beta | |
| version | No | Version label for the release (optional) | |
| browsers | No | Browsers to release (optional; auto-detected from the build) | |
| approvalId | No | The approval handle returned by a prior approval-required response. Promoting changes what a public channel serves and is not reversible in place, so when the platform's approval gate is on this needs a human approval: call once without this to get an approval id and URL, have a human approve at extension.dev, then call again with the same id. | |
| releaseNotes | No | Release notes markdown (optional) | |
| sourceChannel | No | Channel to promote from (optional; inferred otherwise) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explicitly states 'This WRITES' and explains auth-gating and token expiry. It also indirectly conveys irreversibility through the approvalId parameter description ('not reversible in place'). While this information is present, it is not repeated in the main description, so a slight deduction is warranted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured, conveying necessary information in a few sentences without redundancy. It balances clarity and brevity, earning a high score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers key contextual elements: prerequisites (buildId), authentication, limitations (headless constraints), and the irreversible nature via parameter docs. It lacks an explicit output description, but since there is no output schema, this is not a significant gap. Overall, it is sufficiently complete for the tool's 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?
The schema already provides rich descriptions for all parameters (e.g., buildId, channel, approvalId). The main description adds only minor context (e.g., buildId is found via release_status, project comes from token), which does not significantly enhance the schema's coverage. Thus, baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Promote a built extension to a release channel' and explicitly differentiates it from siblings by noting it is 'the only verb that changes what a channel points at.' This makes the tool's role 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 provides usage context by mentioning the prerequisite to 'Call extension_release_status to find a valid buildId' and notes limitations such as not being able to cut a version-bump PR headlessly. However, it could more explicitly contrast with alternative tools beyond stating it is the only verb for channel changes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extension_release_statusA
Read where a project stands on extension.dev, from the public registry (registry.extension.land). This is read-only: it dispatches nothing and promotes nothing. Pass include:'releases' for the release channels (channel to promoted build sha), recent builds, and a public build-page URL for each, which is how you find a valid sha for extension_release_promote, extension_submit or extension_publish. Pass include:'stores' for the per-store picture after an extension_submit (chrome, firefox, edge, safari): configured or not, the last credential health check, the last recorded submission, and the latest review status, read from stores/health.json, stores/status.json and stores/submissions.json. Both are included by default. This defaults to the logged-in project (extension_auth); pass workspace and project to read another. Private projects work when your stored login covers them. Registry state can lag the store dashboards by up to a polling interval.
| Name | Required | Description | Default |
|---|---|---|---|
| api | No | Platform base URL (default EXTENSION_DEV_API_URL, else https://www.extension.dev) | |
| include | No | Which sections to read. Both by default. | |
| project | No | Project slug override (default: the stored login's). | |
| workspace | No | Workspace slug override (default: the stored login's). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description fully carries the burden. It explicitly states 'read-only', 'dispatches nothing and promotes nothing', describes the data returned for each include option, and mentions access control and potential lag.
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 detailed but not verbose. Every sentence provides useful information, though it could be slightly more streamlined. It is front-loaded with the main purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of an output schema, the description compensates well by outlining the kind of data returned for each include option. It covers purpose, behavior, parameters, and usage context comprehensively.
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 description adds significant value by detailing what each include option returns and how the workspace/project parameters default. The api parameter's default URL is also clarified.
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 starts with 'Read where a project stands on extension.dev, from the public registry', using a specific verb and resource. It distinguishes itself from sibling tools like extension_release_promote and extension_submit by explicitly stating it is read-only.
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 when to use the tool (to read status), how to use the include parameter to get releases or stores data, and how the output can be used to find valid SHAs for other tools. It also covers default behavior and limitations like lag.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extension_reloadA
Reload a running extension's background context, or a tab. Start the session with allowControl:true (extension_dev).
| Name | Required | Description | Default |
|---|---|---|---|
| tab | No | For content/page: a specific tab id | |
| browser | No | Session browser; defaults to this project's live session | |
| context | No | background | |
| timeout | No | Command timeout in ms (default 5000) | |
| projectPath | Yes | Extension project root (needs a live dev session) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits. It states 'reload' (a mutation) but does not mention side effects (e.g., state loss), whether the extension must be running, or what happens to open connections. The note about allowControl is useful but insufficient for full transparency.
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 no wasted words. The main action is front-loaded, and the critical prerequisite is included. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has five parameters, no output schema, and moderate complexity. The description covers the core purpose and a key prerequisite but omits details like error conditions, effect on extension state, or that a live dev session is required (implied in schema). Adequate but not comprehensive.
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 80%, so the schema already describes four of five parameters. The description does not add additional meaning beyond the schema, such as how 'context' affects the reload behavior. It meets the baseline but does not enhance understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reloads a running extension's background context or a tab. It uses specific verbs ('Reload') and identifies the resources ('extension's background context, or a tab'), distinguishing it from other extension tools like extension_start or extension_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?
The description provides a prerequisite: 'Start the session with allowControl:true (extension_dev).' This gives clear guidance on when to use the tool but does not explicitly exclude alternatives or describe 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.
extension_startA
Run the PRODUCTION build in a browser: build the project, serve it, and launch. There is no hot module replacement and no control channel, so your edits are not picked up and extension_eval, extension_storage, extension_reload, extension_open and extension_dom_snapshot cannot attach to this session. Use extension_dev while writing code, and this to check what actually ships. Pass build:false to launch an existing dist/ without rebuilding.
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | Bind host, default 127.0.0.1. Use 0.0.0.0 in Docker or devcontainers. | |
| port | No | Server port (0 for auto-assign) | |
| build | No | Build before serving. false serves the existing dist/<browser> as-is and fails when there is none. | |
| browser | No | chrome | |
| profile | No | Profile path, or "false" to reuse the real user profile. Omit for a throwaway one. | |
| polyfill | No | Apply cross-browser polyfill (build only) | |
| noBrowser | No | Serve without launching a browser | |
| extensions | No | Extra extension paths or store URLs to load alongside the project | |
| publicHost | No | Host the browser dials for HMR and reload when it differs from the bind host | |
| geckoBinary | No | Custom Gecko/Firefox binary (overrides browser) | |
| projectPath | Yes | Extension project root | |
| startingUrl | No | URL the browser opens on launch | |
| chromiumBinary | No | Custom Chromium-based binary (overrides browser) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Details that there is no hot module replacement, no control channel, and that extension_eval etc. cannot attach. Discloses limitations without requiring 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-loads the key action, then covers limitations and usage advice efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but description covers purpose, usage, and limitations. Could mention return type, but not critical for a launch 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 92%, so baseline 3. Description adds context for build parameter but does not add much beyond schema for others.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it runs the production build in a browser, building, serving, and launching. It distinguishes from extension_dev by specifying this is for production checks.
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 this tool vs extension_dev: 'Use extension_dev while writing code, and this to check what actually ships'. Also gives guidance on build:false for serving existing dist.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extension_stopA
Stop a session that extension_dev or extension_start is running: terminate the server and the browser it launched, and remove the live-preview carrier if extension_dev placed one. This covers extension_start build:false too, which the registry records as a preview session. Call it when you are done verifying, so sessions do not accumulate.
| Name | Required | Description | Default |
|---|---|---|---|
| all | No | Stop every known session across projects and browsers, found from this server's registry AND the on-disk markers earlier runs left, so it still works after an MCP restart. It also takes back every live-preview carrier still recorded on this machine, including one in a project whose session was never stopped. projectPath/browser are then ignored. | |
| browser | No | Browser of the session to stop. Defaults to the single live session for this project rather than assuming chrome. | |
| projectPath | No | Extension project root |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description bears full responsibility for behavioral disclosure. It details multiple side effects: terminating server/browser, removing live-preview carrier, covering build:false sessions, and the behavior of the 'all' parameter (stopping all sessions across projects, working after MCP restart). This is highly transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded with the primary action. Every sentence provides essential information: what the tool does, its coverage, and when to call it. No redundant or extraneous 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?
The description covers the tool's effects and usage context comprehensively. However, it does not mention the return value or error scenarios, which could be inferred from the tool's action but are not explicitly stated. Given the tool's simplicity (no output schema, no required parameters), this 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%, with each parameter having a detailed description in the schema. The tool description does not add additional meaning beyond what the schema provides, so it meets the baseline but does not exceed 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?
The description clearly states the action: stopping a session started by extension_dev or extension_start, terminating the server and browser, and removing the live-preview carrier. It also explicitly distinguishes from sibling tools like extension_start and extension_dev by focusing on the cleanup step.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear usage guidance: 'Call it when you are done verifying, so sessions do not accumulate.' This tells the agent when to use the tool. It does not explicitly list exclusions or alternatives, but the context is sufficient for correct invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extension_storageA
Read or write chrome.storage in a running extension. Start the session with allowControl:true (extension_dev). Set one key per call: there is no bulk-object set.
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | Key to get or set | |
| area | No | local | |
| value | No | Value to set (any JSON value); required for action=set | |
| action | Yes | get reads a key (or the whole area); set writes a key | |
| browser | No | Session browser; defaults to this project's live session | |
| context | No | background | |
| timeout | No | Command timeout in ms (default 5000) | |
| projectPath | Yes | Extension project root (needs a live dev session) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses read/write behavior and the single-key constraint, but omits error handling, permission requirements, and return value behavior for 'get' actions.
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 no wasted words. The first sentence states the core purpose, and the second adds crucial operational constraints.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 8 parameters, no output schema, and no annotations, the description is adequate but incomplete. It lacks details on return values, error states, and the exact behavior of 'get' when a key 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 input schema already describes all 8 parameters (100% coverage). The description adds modest value by clarifying that only one key can be set per call, reinforcing the relationship between key and 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?
The description explicitly states 'Read or write chrome.storage in a running extension,' providing a specific verb and resource. This clearly distinguishes the tool from siblings like extension_eval or extension_dom_snapshot.
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 prerequisite (session with allowControl:true via extension_dev) and a key constraint (one key per call, no bulk), but does not mention when to use this tool versus alternatives like extension_eval for arbitrary code execution.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extension_submitA
Submit a built extension for store REVIEW through extension.dev, which holds your store credentials and dispatches from your project's mirror CI: the Chrome Web Store, Firefox AMO, Edge Add-ons and the App Store (Safari). This is store review only. It does not push a build to the extension.dev platform, and it does not make a shareable link: that is extension_publish, which is what "deploy" or "ship" an extension almost always means. Reach for this only when the ask is explicitly a store submission. It defaults to a dry run that dispatches nothing: the platform verifies auth, project, build and store workflow, and this tool adds each store's credential-health verdict. Trust those per-store rows over the platform's bare preflight line, which does not check store health. Pass dryRun:false to actually submit, which is irreversible and enters store review. The project comes from your token (extension_auth or EXTENSION_DEV_TOKEN; tokens live at most 7 days, so CI must re-mint from the console's Access tokens page). Store credentials are never arguments, and no local file is uploaded. Call extension_release_status for valid shas, and, after a real submission, for the recorded outcome and review state.
| Name | Required | Description | Default |
|---|---|---|---|
| api | No | Platform base URL (default EXTENSION_DEV_API_URL, else https://www.extension.dev) | |
| dryRun | No | Preflight only. Pass false to actually dispatch (irreversible, enters store review). | |
| channel | No | Release channel to submit from (default stable). | |
| version | No | Version label for the submission record (optional). | |
| browsers | Yes | Stores to submit to. | |
| buildSha | Yes | The built commit SHA to submit. It needs a completed build in the project's build index; an unknown sha is rejected. | |
| approvalId | No | The approval handle returned by a prior approval-required response for a real submission. A real submission (dryRun:false) is irreversible and needs a human approval when the platform's approval gate is on: call once without this to get an approval id and URL, have a human approve at extension.dev, then call again with the same id. A dry run never needs it. | |
| projectPath | No | Path to the extension project root, read only for the local STORE.md advisory check. Nothing local is uploaded; without it the check falls back to the server's working directory. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description fully discloses key behaviors: it holds credentials, dispatches from CI, defaults to dry run, real submission is irreversible, credentials are never arguments, no local file upload, token expiry up to 7 days, and the importance of trusting per-store rows over preflight. This is thorough and goes beyond schema details.
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 moderately long but packed with essential information, front-loaded with the purpose and key distinction. It uses clear warnings and step hints. Slight verbosity in the approval flow could be trimmed, but 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?
Given the tool's complexity (multi-store, auth, dry-run, approval flow), no output schema, and no annotations, the description provides complete guidance: it covers prerequisites, side effects, error-prone points (credential health), and directs to extension_release_status for follow-up. It is comprehensive for both dry-run and real submission.
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 extra context for parameters like dryRun (irreversible), approvalId (two-step approval flow), and buildSha (needs completed build). This adds meaning beyond schema, earning a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it submits a built extension for store review via extension.dev, targeting specific stores (Chrome Web Store, etc.), and explicitly distinguishes from extension_publish. Verb and resource are specified, and it differentiates from the sibling tool extension_publish.
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 explicitly says when to use it ('only when the ask is explicitly a store submission'), when not to use it (not for pushing a build or making a shareable link), and names the alternative (extension_publish). It also clarifies the default dry run behavior and how to trigger a real submission.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extension_templatesA
Browse the extension.dev template catalog. Pass action:'list' (the default) to search and filter it and get metadata per template. Pass action:'source' with a slug to read one template's files, for learning a pattern before building something similar. Read framework as the UI framework only, never the language: TypeScript and JavaScript templates live under slugs ('typescript', 'content-typescript'), shadcn is a React variant ('sidebar-shadcn'), and provider AIs carry the 'ai' tag ('ai-chatgpt', 'ai-claude'). Reach those through query, tags or slug.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | No | source: which template to read (e.g. 'ai-claude', 'content-react'). Required for source. | |
| tags | No | list: filter by tags, e.g. ['ai', 'chat']. | |
| files | No | source: paths to read (e.g. ['src/manifest.json']). Omit for the file listing. | |
| query | No | list: keyword search over slug, description, tags and useCases. Ranks by word matches, so a natural phrase works. | |
| action | No | list | |
| surface | No | list: filter by surface. For a popup/action starter use query:'action', not a surface. | |
| featured | No | list: only featured templates. | |
| framework | No | list: UI framework filter (empty string = vanilla JS). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so burden is on description. It describes actions and parameter dependencies but does not explicitly state read-only behavior, auth requirements, or rate limits. Adequate but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, concise and well-structured. Front-loaded with action types and default. Could be slightly more organized but 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 8 parameters, high schema coverage, no output schema, the description covers both actions, parameter usage, and special interpretations. Completeness is sufficient for agent use.
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 high (88%), and description adds meaning beyond schema: clarifies that framework is UI-only, explains slug patterns for TypeScript/JavaScript and shadcn, and how to reach AI templates via tags. Adds 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?
The description clearly states the tool browses the extension.dev template catalog with two actions (list and source). It distinguishes itself from sibling tools like extension_create or extension_build by focusing on catalog browsing, not creation or building.
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 when to use list vs source, how to filter via query/tags/slug/surface/framework, and provides clarifications on framework interpretation. Does not explicitly state when not to use, but the scope is well-defined.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extension_theme_verifyA
Verify a Chrome theme manifest before it ships. This settles the four-leg WYSIWYG contract (app-shows == manifest-says == chrome-paints, plus chrome-accepts) as far as is possible headless: it derives every color current Chrome would paint from the manifest through the transcribed Chromium resolver, and classifies each problem as D1 fabrication, D3 parity gap, or D4 acceptance gap (keys Chrome silently discards: dead legacy, incognito, unknown, out-of-range). It verifies only, and never authors or mutates a theme. The app-rendered and real-pixel legs need a browser, so they come back as needsAttended pointing at the assert:theme and install-parity harnesses, never as passed.
| Name | Required | Description | Default |
|---|---|---|---|
| manifest | No | The Chrome theme manifest object (with a `theme` block). Pass this or manifestPath. | |
| manifestPath | No | Path to a theme manifest.json (or a { manifest } seed wrapper). Read in place of the inline manifest. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully discloses behavior: it is headless, derives colors from the manifest, classifies problems into three specific types (D1, D3, D4), and states that app-rendered and real-pixel legs require a browser and will come back as needsAttended. It honestly covers its limitations and what it can and cannot verify.
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 paragraph but front-loaded with the main purpose. It uses specific jargon and provides many details, which are valuable for a complex tool. While it could be slightly more concise, every sentence adds necessary information, and it avoids redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity and no output schema, the description provides good context: what verification entails, problem classification, and limitations. It hints at output format (needsAttended for unresolved legs), but more explicit output structure would improve completeness. Overall, it covers the tool's functionality adequately.
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 baseline is 3. The description does not add parameter-specific details beyond what the schema already provides (e.g., 'Pass this or manifestPath' is already in the schema). No additional semantics or usage hints are given for the 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?
The description clearly states the verb+resource: 'Verify a Chrome theme manifest before it ships.' It provides specific details about what the tool does (derives colors, classifies problems) and explicitly states it only verifies and never mutates, distinguishing it from sibling tools like extension_manifest_validate which may validate but not with this theme-specific color resolution.
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 before shipping and clarifies that the tool only verifies without authoring or mutating, so it should not be used for modifications. It also indicates that for browser-rendered aspects, the tool will return needsAttended, guiding the agent to use other harnesses for those parts. However, it does not explicitly mention alternative sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extension_waitA
Wait for a running dev or start session to be ready. This polls the ready.json contract and reports compiled (the compiler finished), browserAttached (the runtime executor connected), and guestLoaded (the browser's own target list shows your extension). Read guestLoaded as the trustworthy load signal: it catches a silently rejected --load-extension that leaves ready.json stamped attached with empty logs. It is null when it could not be checked, for example a gecko session with no CDP port. Every result reports budgetMs and elapsedMs; on status 'timeout', call again to keep waiting on the same contract. In a noBrowser session this returns as soon as the compile lands, instead of waiting for a browser that will never attach. Ports come from the contract, so they match what the server actually bound.
| Name | Required | Description | Default |
|---|---|---|---|
| browser | No | Session browser; defaults to this project's live session | |
| timeout | No | Deprecated alias of timeoutMs, which wins when both are given. | |
| timeoutMs | No | Wait budget for this call. Default 45000, clamped to 1000-50000 so one call stays under the client's 60s request timeout. On timeout, call again to keep waiting. | |
| projectPath | Yes | Extension project root |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses behavioral traits: polling mechanism, trustworthiness of guestLoaded, handling of noBrowser sessions, timeout behavior (call again), and port matching. This is comprehensive and honest.
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 detailed but well-structured, starting with the core purpose and then elaborating on signals, edge cases, and return values. Could be slightly more concise, but every sentence adds meaningful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of an output schema, the description fully explains the return fields (compiled, browserAttached, guestLoaded, budgetMs, elapsedMs) and covers edge cases (noBrowser, timeout retry). It is complete for a polling 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 description adds value by explaining defaults for browser, deprecation of timeout, and the clamping and retry behavior of timeoutMs. This supplements the schema effectively.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: waiting for a dev or start session to be ready by polling a contract. It provides specific signals (compiled, browserAttached, guestLoaded) and distinguishes itself from sibling tools like extension_dev and extension_start by focusing on readiness polling.
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 when to use the tool (after starting a session) and provides guidance on interpreting results and handling timeouts. It does not explicitly mention alternatives, but the context of waiting after a dev/start command is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v10.9.0- Changed
extension_preview_web1 field changed- changed
Input schema / properties / share / descriptionPrevious value: -"Upload the built dist and return a public link (share.previewUrl) that renders those exact bytes for anyone: no install, sign-in or dev server. It also serves the build as a zip (share.zipUrl), so sharing hands over the code. Needs a token scoped to an extension.dev project (extension_auth or EXTENSION_DEV_TOKEN); without one you get a login hint and the local preview still succeeds. Live until share.expiresAt; DELETE share.revokeUrl to kill it sooner. Revocation is permanent, and re-sharing an unchanged build returns the same link unless it was revoked, so each share is also appended to the project's gitignored .extension.dev/shared-previews.json."New value: +"Upload the built dist and return a public link (share.previewUrl) that renders those exact bytes for anyone: no install, sign-in or dev server. Uploading runs on extension.dev's machines and counts against your free allowance; left false, the result's share property says what the local deepLink needs, what share:true spends, and the exact call to get a shareable link. It also serves the build as a zip (share.zipUrl), so sharing hands over the code. Needs a token scoped to an extension.dev project (extension_auth or EXTENSION_DEV_TOKEN); without one you get a login hint and the local preview still succeeds. Live until share.expiresAt; DELETE share.revokeUrl to kill it sooner. Revocation is permanent, and re-sharing an unchanged build returns the same link unless it was revoked, so each share is also appended to the project's gitignored .extension.dev/shared-previews.json."
5 tool updates
v10.8.0- Added
extension_assert - Added
extension_project_create - Changed
extension_release_promote1 field changed- added
Input schema / properties / approvalIdAdded value: +{ + "description": "The approval handle returned by a prior approval-required response. Promoting changes what a public channel serves and is not reversible in place, so when the platform's approval gate is on this needs a human approval: call once without this to get an approval id and URL, have a human approve at extension.dev, then call again with the same id.", + "type": "string" +}
- Changed
extension_shares1 field changed- added
Input schema / properties / approvalIdAdded value: +{ + "description": "The approval handle returned by a prior approval-required response for a revoke. Revoking permanently burns a share and cannot be undone, so when the platform's approval gate is on this needs a human approval: call revoke once without this to get an approval id and URL, have a human approve at extension.dev, then call revoke again with the same id. Listing never needs it.", + "type": "string" +}
- Changed
extension_submit1 field changed- added
Input schema / properties / approvalIdAdded value: +{ + "description": "The approval handle returned by a prior approval-required response for a real submission. A real submission (dryRun:false) is irreversible and needs a human approval when the platform's approval gate is on: call once without this to get an approval id and URL, have a human approve at extension.dev, then call again with the same id. A dry run never needs it.", + "type": "string" +}
2 tool updates
v10.3.1- Changed
extension_auth1 field changed- changed
Input schema / properties / project / descriptionPrevious value: -"login: target project as '<workspace>/<project>'; the token is scoped to it."New value: +"login: target project as '<workspace>/<project>'; the token is scoped to it. The slug pair is the console address bar: an existing project's page is console.extension.dev/<workspace>/<project>. Create one at extension.dev/new if none exists yet."
- Changed
extension_build1 field changed- changed
Input schema / properties / bundleId / descriptionPrevious value: -"Safari targets only: a reverse-DNS bundle identifier you own, such as com.acme.readinglist. Without one the app is packaged under a generated dev.extensionjs.* identifier that Apple will not accept for distribution."New value: +"Safari targets only: a reverse-DNS bundle identifier you own, such as com.acme.readinglist. Without one the app is packaged under a generated dev.extensionjs.* identifier derived from the app name, which every project built from the same template shares, and the first team to register it takes it."
28 tool updates
v10.1.0- First observed
extension_add_feature - First observed
extension_analyze - First observed
extension_auth - First observed
extension_browsers - First observed
extension_build - First observed
extension_create - First observed
extension_dev - First observed
extension_doctor - First observed
extension_dom_snapshot - First observed
extension_eval - First observed
extension_inspect - First observed
extension_list_extensions - First observed
extension_logs - First observed
extension_manifest_validate - First observed
extension_open - First observed
extension_preview_web - First observed
extension_publish - First observed
extension_release_promote - First observed
extension_release_status - First observed
extension_reload - First observed
extension_shares - First observed
extension_start - First observed
extension_stop - First observed
extension_storage - First observed
extension_submit - First observed
extension_templates - First observed
extension_theme_verify - First observed
extension_wait
TDQS
Scored across 30 tools
Tools are highly differentiated with explicit cross-references (e.g., extension_dev vs extension_start, extension_inspect vs extension_dom_snapshot), but a few name pairs like extension_create vs extension_project_create and several dev-session inspection tools could cause misselection without careful reading.
All tools share the extension_ prefix and snake_case, creating a clear family, but the internal structure mixes bare verbs (build, dev, start), verb-object (list_extensions, add_feature), object-verb (manifest_validate, release_promote), and nouns (templates, shares, browsers), so there is no single verb_noun pattern throughout.
30 tools is high, but the toolset covers the full extension lifecycle from scaffolding and dev sessions through building, testing, previewing, publishing, releasing, and store submission; each tool addresses a distinct function, so the count feels scaled to the broad platform scope rather than padded.
The lifecycle is well covered: create, develop, test, build, preview, publish, promote, submit, and monitor, plus auth and browser management. Minor gaps exist such as no unpublish/demote or cancel-submission path, but agents can generally work around them.
Maintenance
Related MCP Connectors
Live browser debugging for AI assistants — DOM, console, network via MCP.
A paid remote MCP for AI agent browser DevTools MCP, built to return verdicts, receipts, usage logs,
Hosted MCP with 91 agent tools: X, domains, SEO, Maps, Trends, Search, YouTube, TikTok, and more.
Your org's AI agents, tasks, runs, search, and brain files as MCP tools and resources.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceEnables AI agents to control the Google Chrome browser through a Node.js WebSocket bridge and a dedicated browser extension. It provides tools for capturing screenshots, executing JavaScript, managing tabs, and extracting page content via the MCP protocol.2-
- AlicenseNot gradedqualityCmaintenanceLets AI coding agents control and inspect a live Chrome browser via MCP, providing Chrome DevTools capabilities for automation, debugging, and performance analysis.9 npmApache 2.0
- FlicenseNot gradedqualityCmaintenanceEnables AI assistants to control and interact with a Chrome browser via MCP, providing tools for navigation, screenshots, clicking, form filling, content extraction, and tab management.-
- FlicenseNot gradedqualityBmaintenanceExposes your Chrome/Edge browser as MCP tools for AI agents, enabling browser automation through a Chrome extension with 47 tools for navigation, interaction, page reading, and more.14 npm-