Skip to main content
Glama
extensiondev

@extension.dev/mcp

by extensiondev

@extension.dev/mcp Version Downloads Discord

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/mcp

Works 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.storage contents, and the loaded-extension list

  • Act: 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/mcp

Or 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-mcp

Cursor

Install MCP Server

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

extension_create

Scaffold from a template

build

extension_templates

Browse 50+ templates (list) and read one's source (source)

build

extension_add_feature

Add sidebar/popup/content script

build

extension_build

Build for production

run

extension_dev

Dev server with HMR

run

extension_start

Build + launch the production build (build: false launches the existing dist)

run

extension_wait

Poll the dev-server ready contract

run

extension_stop

Stop a dev/start/preview session (server + browser)

see

extension_manifest_validate

Cross-browser manifest validation

see

extension_analyze

Static analysis of the built extension on disk

see

extension_inspect

Deep live inspection of a running extension (closed shadow roots, probes)

see

extension_dom_snapshot

Shallow DOM snapshot of a chosen tab or extension surface over the agent bridge

see

extension_list_extensions

List loaded extensions (Chromium and Firefox)

see

extension_logs

Stream logs from every context

see

extension_doctor

Diagnose the dev session leg by leg (ready contract, ports, token, executor, browser)

see

extension_theme_verify

Verify a Chrome theme manifest against the colors Chrome actually paints

test

extension_assert

State expectations about a running extension and get one verdict each: pass, fail, or inconclusive

act

extension_eval

Evaluate in a context (needs allowEval: true on extension_dev)

act

extension_storage

Read/write chrome.storage

act

extension_reload

Reload extension or tab

act

extension_open

Open a surface / trigger action, command

browsers

extension_browsers

Detect, list, install, and uninstall browsers

platform

extension_auth

Device login at extension.dev, plus login status and logout

platform

extension_project_create

Create the extension.dev project for a built extension, headless, via device approval

platform

extension_preview_web

Render a build in the web emulator, and share it as a link

platform

extension_shares

List every link you have shared, and revoke one permanently

platform

extension_publish

Publish a shareable preview to extension.dev

platform

extension_release_promote

Promote a build to a release channel, headless

platform

extension_submit

Submit for store review: Chrome, Firefox and Edge, through extension.dev

platform

extension_release_status

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

@extension.dev/skill

Teach AI agents the judgment half: cross-browser rules, gotchas, playbooks

@extension.dev/artifact-integrity

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

License

Apache-2.0 (c) 2026 Cezar Augusto and the extension.dev collaborators. See LICENSE.

Available Tools

30 tools
extension_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
featureYesFeature surface to add
frameworkNoreact
projectPathYesExtension project root

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
formatNosummary
browserNoBrowser build to analyzechrome
projectPathYesExtension project root

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
expectYesOne 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).
browserNoSession browser; defaults to this project's live session
timeoutNoCommand timeout in ms (default 5000)
projectPathYesExtension project root (needs a live dev session)

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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

Schema description coverage is 100%, and the description 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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
apiNoPlatform base URL (default EXTENSION_DEV_API_URL, else https://www.extension.dev)
actionNostatus
projectNologin: 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.
deviceCodeNologin: resume token from the prior call's `deviceCode`; omit on the first call.

TDQS

A4.6/5.0
Behavior5/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure—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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
allNouninstall: remove every managed binary.
actionNodetect
browserNoinstall/uninstall: which managed binary. Required for install.
browsersNodetect: limit the scan to these. Omit to check all.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose5/5

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

The description clearly states the tool's 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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
zipNoCreate a .zip file for store distribution
modeNoBundler mode override (also sets NODE_ENV)production
silentNoSuppress build output
appNameNoSafari targets only: name of the generated macOS app, which also names the Xcode scheme and the .app on disk. Defaults to the manifest name.
browserNochrome
bundleIdNoSafari 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.
polyfillNoApply cross-browser polyfill
macOsOnlyNoSafari 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.
zipSourceNoInclude source code zip (required by some stores)
projectPathYesExtension project root
zipFilenameNoCustom .zip file name (defaults to name and version)
skipValidationNoBuild 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.
forceRegenerateNoSafari 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

A4.6/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
installNoInstall dependencies after creation
templateNoTemplate slug from the extension.dev catalog (e.g. 'react', 'ai-claude', 'content-vue'). extension_templates discovers them.typescript
parentDirNoDirectory 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.
projectNameYesName of the extension project (used as directory name). Alias: name.

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
hostNoBind host, default 127.0.0.1. Use 0.0.0.0 in Docker or devcontainers.
portNoDev server port (0 for auto-assign)
browserNochrome
carrierNoLoad 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.
profileNoProfile path, or "false" to reuse the real user profile. Omit for a throwaway one.
replaceNoStop 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.
polyfillNoApply cross-browser polyfill
allowEvalNoEnable extension_eval (runs code in a context; writes a 0600 session token). Implies allowControl, so you never need to pass both.
noBrowserNoStart the dev server without launching a browser
extensionsNoExtra extension paths or store URLs to load alongside the project
publicHostNoHost the browser dials for HMR and reload when it differs from the bind host
geckoBinaryNoCustom Gecko/Firefox binary (overrides browser)
projectPathYesExtension project root
startingUrlNoURL the browser opens on launch
allowControlNoEnable the agent-bridge control channel that extension_storage/reload/open/dom_snapshot need
chromiumBinaryNoCustom Chromium-based binary (overrides browser)

TDQS

A5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
browserNoBrowser session to diagnose. Defaults to the active dev session's browser for this project.
projectPathNoPath to the extension project root. Omit for a pre-flight environment check with no project.

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
tabNoNumeric chrome.tabs id, only to disambiguate when several tabs match. With neither `tab` nor `url`, content/page target the active tab.
urlNocontent/page: pick the tab by url (match pattern, then substring). Preferred over `tab`.
tabUrlNoTarget 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`.
browserNoSession browser; defaults to this project's live session
contextNocontent/page targets `url`, else the active tab; the rest must already be OPENcontent
includeNoWhat to include; html is byte-capped
timeoutNoCommand timeout in ms (default 5000)
listTabsNoEnumerate open tabs as {tabId,url,title} and return, ignoring the other args. Use when you need a numeric tab id.
maxBytesNo
listTargetsNoEnumerate 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.
projectPathYesExtension project root (needs a live dev session)
withConsoleNoAlso include recent console lines. A number is how many; true means 50.

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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

The description clearly states the tool's 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.

Usage Guidelines5/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
tabNoNumeric chrome.tabs id, only to disambiguate when several tabs match.
urlNocontent/page: pick the tab by url (match pattern, then substring). Preferred over `tab`.
browserNoSession browser; defaults to this project's live session
contextNoWhere to evaluate. Default background, except Chromium MV3 sessions default to page (the active tab).
timeoutNoCommand timeout in ms (default 5000)
expressionYesJavaScript expression to evaluate in the target context
projectPathYesExtension project root (needs a live dev session)

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoURL to inspect; the tab is navigated there first
probeNoCSS selectors to query; returns counts and samples for each
browserNoSession browser; defaults to this project's live session
deepDomNoPierce 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).
includeNoWhat to include
maxBytesNoTruncate HTML output at this byte count (0 = unlimited)
projectPathYesExtension project root (needs a live dev session)

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
browserNoSession browser; defaults to this project's live session
projectPathYesExtension project root (needs a live dev session)

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tabNoOnly events from this tab id.
urlNoOnly events whose url/hostname matches (glob or substring), e.g. https://shop.example/*.
levelNoMinimum severity; a level includes everything more severe.all
limitNoHow many of the most recent events to return.
sinceNoOnly events with seq greater than this; the cursor for polling forward.
followNoCollect from the live control channel for a bounded window instead of reading the file.
browserNoWhich dist/extension-js/<browser>/ to read. Defaults to this project's live session, else chromium.
contextNoRestrict to these contexts. Omit for all.
followMsNoHow long to collect live frames when follow=true (clamped 500–15000ms).
projectPathYesExtension project root (needs a live dev session)
signalsOnlyNoOnly structured dx.signal diagnostics (code/status/remediation), no plain console lines.

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
browserNoSingle browser to validate against; alias for browsers:[browser] to match the other tools.
browsersNoBrowsers to validate against
projectPathNoPath to the extension project root; manifest.json is resolved from it (root or src/). Accepted in place of manifestPath.
manifestPathNoPath to manifest.json. Or pass projectPath and the manifest is located for you.

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoNavigate 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.
nameNoFor surface 'command': the chrome.commands name to trigger.
asTabNopopup/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.
browserNoSession browser; defaults to this project's live session
surfaceNoWhich surface to open or event to replay.
timeoutNoCommand timeout in ms (default 5000)
projectPathYesExtension project root (needs a live dev session)

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
openNoAlso open the deep link in a running session's browser, in a focus-safe background tab. Needs a live extension_dev/extension_start session.
buildNoBuild first. false previews the existing dist/<browser> as-is.
probeNoFetch 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.
shareNoUpload 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.
openInNoWhich session's browser to open it in. Defaults to `browser`.
browserNoWhich dist/<browser> output to preview. The emulator renders it as mocked Chrome either way.chrome
hostUrlNoOrigin of the running preview.extension.dev dev server (default http://localhost:3110).
distPathNoPreview this built directory instead of dist/<browser> under projectPath. Implies build:false.
projectPathYesExtension project root

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
apiNoPlatform base URL (default EXTENSION_DEV_API_URL, else https://www.extension.dev)
repoYesSource 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.
projectYesTarget 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.
deviceCodeNoResume token from the prior call's `deviceCode`; omit on the first call.
descriptionNoShort project description. Defaults to a generic sentence naming the repo.
displayNameNoHuman name for the project. Defaults to the project slug.
buildCommandNoBuild command producing the extension bundle.npm run build
installCommandNoDependency install command the build runs first.npm install
installationIdNoOptional 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.
outputDirectoryNoDirectory the build writes the loadable extension into.dist/chrome

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
apiNoPlatform base URL (default EXTENSION_DEV_API_URL, else https://www.extension.dev)
buildShaNoPin 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.
ttlHoursNoPrivate-project share-link lifetime in hours, 1-168 (default 24). Ignored for public projects.

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
apiNoPlatform base URL (default EXTENSION_DEV_API_URL, else https://www.extension.dev)
buildIdYesBuild commit SHA to promote (a 7-char short SHA is fine)
channelYesTarget release channel, e.g. stable, preview, beta
versionNoVersion label for the release (optional)
browsersNoBrowsers to release (optional; auto-detected from the build)
approvalIdNoThe 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.
releaseNotesNoRelease notes markdown (optional)
sourceChannelNoChannel to promote from (optional; inferred otherwise)

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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

The description clearly states the tool's 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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
apiNoPlatform base URL (default EXTENSION_DEV_API_URL, else https://www.extension.dev)
includeNoWhich sections to read. Both by default.
projectNoProject slug override (default: the stored login's).
workspaceNoWorkspace slug override (default: the stored login's).

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
tabNoFor content/page: a specific tab id
browserNoSession browser; defaults to this project's live session
contextNobackground
timeoutNoCommand timeout in ms (default 5000)
projectPathYesExtension project root (needs a live dev session)

TDQS

A3.7/5.0
Behavior2/5

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

No annotations are provided, so the description 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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_sharesA

List and revoke the public preview links this token has shared, which is what extension_preview_web share:true hands out. Pass action:'list' (the default) for every artifact the logged-in project owns, with its artifactId, name, version, live or dead state, createdAt, expiresAt, revokedAt, size, previewUrl, zipUrl and revokeUrl, so a link whose response you lost is findable again. Each row carries owner and sharedBy as the platform returned them. Read attribution.ownership for who may revoke a share: 'project' means the workspace holds it and any member can pull it back, 'personal' means one person holds it alone, 'unknown' means no owner was disclosed. Read attribution.credit as credit only, never access; it names the publisher, and reads 'CLI token ' or 'not recorded' when no person can be named. Pass action:'revoke' with an artifactId, or with any URL of the share, to kill one permanently. Pass projectPath to reconcile against the project's own append-only .extension.dev/shared-previews.json, which is read and never rewritten: a share made on another machine shows as remoteOnly, a record with no live artifact as localOnly. That record is append-only, so localOnly is counted by distinct artifactId and a build re-shared unchanged is one share, not two; server.count and server.matched are share counts, while server.scanned counts records the platform read and is never a share count. This needs the same token as sharing (extension_auth or EXTENSION_DEV_TOKEN); without one, listing still returns the local record with a login hint.

ParametersJSON Schema
NameRequiredDescriptionDefault
apiNoPlatform base URL (default EXTENSION_DEV_API_URL, else https://www.extension.dev)
urlNoAny URL of the share to revoke (previewUrl, zipUrl, viewUrl, or revokeUrl). The artifact id is read out of it, so the link you sent someone is enough to pull it back.
limitNoHow many shares to return, 1 to 200 (platform default 100). A cut list comes back with truncated:true.
actionNolist reads every share this token owns; revoke permanently kills one and cannot be undone.list
statusNoall (default) includes expired and revoked shares, which is what makes a dead link explainable; live returns only links that still resolve.all
approvalIdNoThe 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.
artifactIdNoWhich share to revoke (the gen_... id from a share response or from action:"list"). Required for revoke unless url is given.
projectPathNoPath to the extension project root. Reconciles the platform's answer against this project's .extension.dev/shared-previews.json record. Read-only.

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations provided, the description carries full disclosure responsibility. It clearly states that revoke 'permanently kills' a share and 'cannot be undone', explains the approval gate for revokes, details the append-only and read-only nature of the local record, and clarifies nuanced field semantics (e.g., server.count vs server.scanned).

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

Conciseness4/5

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

The description is a dense, front-loaded paragraph that begins with the core purpose and then layers actionable detail. Every sentence contributes unique information, but the single-paragraph structure could be better organized with bullets or sections for improved scannability. Still, it is appropriately sized for the tool's complexity.

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

Completeness5/5

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

Given 8 parameters, no output schema, and no annotations, this description is exceptionally complete. It covers return fields, row-level semantics, attribution meanings, authentication behavior, approval requirements, local record reconciliation, and count semantics, leaving no significant ambiguity for the agent.

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

Parameters5/5

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

Even though schema coverage is 100%, the description adds substantial meaning to every parameter. It explains the action enum default, the relationship between url and artifactId, the two-call approvalId flow, the status filter's rationale, the limit's truncated flag, and projectPath's reconciliation behavior—far exceeding the schema's basic descriptions.

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

Purpose5/5

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

The description opens with a specific verb+resource: 'List and revoke the public preview links this token has shared,' and immediately distinguishes this tool from the sibling extension_preview_web by noting these are the links it hands out. It further clarifies the two main actions (list and revoke), making the tool's purpose unmistakable.

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

Usage Guidelines5/5

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

The description explicitly explains when to use list vs revoke, when approvalId is needed, and when projectPath is useful. It also names the authentication requirement (extension_auth or EXTENSION_DEV_TOKEN) and the behavior without a token, providing clear usage context without needing to consult siblings.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
hostNoBind host, default 127.0.0.1. Use 0.0.0.0 in Docker or devcontainers.
portNoServer port (0 for auto-assign)
buildNoBuild before serving. false serves the existing dist/<browser> as-is and fails when there is none.
browserNochrome
profileNoProfile path, or "false" to reuse the real user profile. Omit for a throwaway one.
polyfillNoApply cross-browser polyfill (build only)
noBrowserNoServe without launching a browser
extensionsNoExtra extension paths or store URLs to load alongside the project
publicHostNoHost the browser dials for HMR and reload when it differs from the bind host
geckoBinaryNoCustom Gecko/Firefox binary (overrides browser)
projectPathYesExtension project root
startingUrlNoURL the browser opens on launch
chromiumBinaryNoCustom Chromium-based binary (overrides browser)

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
allNoStop 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.
browserNoBrowser of the session to stop. Defaults to the single live session for this project rather than assuming chrome.
projectPathNoExtension project root

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyNoKey to get or set
areaNolocal
valueNoValue to set (any JSON value); required for action=set
actionYesget reads a key (or the whole area); set writes a key
browserNoSession browser; defaults to this project's live session
contextNobackground
timeoutNoCommand timeout in ms (default 5000)
projectPathYesExtension project root (needs a live dev session)

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
apiNoPlatform base URL (default EXTENSION_DEV_API_URL, else https://www.extension.dev)
dryRunNoPreflight only. Pass false to actually dispatch (irreversible, enters store review).
channelNoRelease channel to submit from (default stable).
versionNoVersion label for the submission record (optional).
browsersYesStores to submit to.
buildShaYesThe built commit SHA to submit. It needs a completed build in the project's build index; an unknown sha is rejected.
approvalIdNoThe 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.
projectPathNoPath 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

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugNosource: which template to read (e.g. 'ai-claude', 'content-react'). Required for source.
tagsNolist: filter by tags, e.g. ['ai', 'chat'].
filesNosource: paths to read (e.g. ['src/manifest.json']). Omit for the file listing.
queryNolist: keyword search over slug, description, tags and useCases. Ranks by word matches, so a natural phrase works.
actionNolist
surfaceNolist: filter by surface. For a popup/action starter use query:'action', not a surface.
featuredNolist: only featured templates.
frameworkNolist: UI framework filter (empty string = vanilla JS).

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
manifestNoThe Chrome theme manifest object (with a `theme` block). Pass this or manifestPath.
manifestPathNoPath to a theme manifest.json (or a { manifest } seed wrapper). Read in place of the inline manifest.

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
browserNoSession browser; defaults to this project's live session
timeoutNoDeprecated alias of timeoutMs, which wins when both are given.
timeoutMsNoWait 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.
projectPathYesExtension project root

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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

The description clearly states the tool's 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.

Usage Guidelines4/5

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. 1 tool updatev10.9.0
    • Changedextension_preview_web1 field changed
      • changedInput schema / properties / share / description
        Previous 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."
  2. 5 tool updatesv10.8.0
    • Addedextension_assert
    • Addedextension_project_create
    • Changedextension_release_promote1 field changed
      • addedInput schema / properties / approvalId
        Added 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"
        +}
    • Changedextension_shares1 field changed
      • addedInput schema / properties / approvalId
        Added 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"
        +}
    • Changedextension_submit1 field changed
      • addedInput schema / properties / approvalId
        Added 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"
        +}
  3. 2 tool updatesv10.3.1
    • Changedextension_auth1 field changed
      • changedInput schema / properties / project / description
        Previous 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."
    • Changedextension_build1 field changed
      • changedInput schema / properties / bundleId / description
        Previous 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."
  4. 28 tool updatesv10.1.0
    • First observedextension_add_feature
    • First observedextension_analyze
    • First observedextension_auth
    • First observedextension_browsers
    • First observedextension_build
    • First observedextension_create
    • First observedextension_dev
    • First observedextension_doctor
    • First observedextension_dom_snapshot
    • First observedextension_eval
    • First observedextension_inspect
    • First observedextension_list_extensions
    • First observedextension_logs
    • First observedextension_manifest_validate
    • First observedextension_open
    • First observedextension_preview_web
    • First observedextension_publish
    • First observedextension_release_promote
    • First observedextension_release_status
    • First observedextension_reload
    • First observedextension_shares
    • First observedextension_start
    • First observedextension_stop
    • First observedextension_storage
    • First observedextension_submit
    • First observedextension_templates
    • First observedextension_theme_verify
    • First observedextension_wait

TDQS

A4.1/5.0

Scored across 30 tools

Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count4/5

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.

Completeness4/5

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

ActivityActive
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables 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
    -
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables 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.
    -
  • F
    license
    Not graded
    quality
    B
    maintenance
    Exposes 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
    -