Skip to content

MCP server

@extension.dev/mcp gives a coding agent hands on a real browser and on the platform. An agent editing extension files blind will happily fix a content script that never injected without noticing it never injected. These tools let it debug from evidence.

Install

bash
claude mcp add extension-dev npx @extension.dev/mcp

Or as a plugin, which adds the server plus the /extension, /extension-add, /extension-debug and /extension-publish commands:

/plugin marketplace add extensiondev/mcp
/plugin install extension-mcp@extensiondev-mcp

The server is listed in the MCP registry as io.github.extensiondev/mcp. It works with Claude Code, Claude Desktop, Cursor, and any MCP client. The same shape works in any client configured by hand:

json
{
  "mcpServers": {
    "extension-dev": {
      "command": "npx",
      "args": ["@extension.dev/mcp"]
    }
  }
}

How it works

The server does not reimplement Extension.js, it wraps the CLI and the local agent bridge. Tools that run a build or launch a browser shell out to the extension command; tools that observe or act connect to the bridge's local channel exactly as any other client would. That means the assistant and the CLI always behave the same way, and your assistant never holds anything the CLI does not.

The tools

The server registers 28 tools. This table is canonical. Everything outside the release, publish and store groups is local and needs no account.

Create and scaffold

ToolWhat it does
extension_createScaffold a project from a template
extension_templatesBrowse the catalog and read a template's source
extension_add_featureAdd a popup, sidebar or content script to an existing project

Run and debug

ToolWhat it does
extension_devStart a dev session with hot reload and a launched browser
extension_buildProduce a production build per browser
extension_startBuild and launch, or launch an existing dist with build: false
extension_stopStop a dev or start session, server and browser
extension_waitWait for the ready.json contract
extension_logsStream logs from every context (Agent logs)
extension_inspectRead the live DOM of a running extension surface (Inspect and act)
extension_dom_snapshotSnapshot a chosen surface's DOM
extension_evalEvaluate an expression in a chosen context, session opt-in
extension_storageRead or write chrome.storage, session opt-in
extension_reloadReload the extension, session opt-in
extension_openOpen a surface (popup, options, sidebar, action, command), session opt-in
extension_list_extensionsList extensions with a live context in the dev browser, Chromium only

Preview and share

ToolWhat it does
extension_preview_webRender a build in the web emulator; sharing it as a link needs a token
extension_sharesList and revoke the links this token has shared, token required

Release and publish

ToolWhat it does
extension_publishReturn the project's build page URL, with a time-limited ?share= token when the project is private (Publish), token required
extension_release_statusRead release channels, recent builds, and store review state
extension_release_promotePromote a build to a release channel, headless, token required

Stores

ToolWhat it does
extension_submitSend a released build into a store's review queue, dry run by default, token required

Utility

ToolWhat it does
extension_analyzeAnalyze the built output on disk
extension_manifest_validateValidate the manifest cross browser
extension_theme_verifyVerify a Chrome theme manifest against what Chrome paints
extension_authDevice login at extension.dev, login status, and logout
extension_browsersDetect, list, install, and uninstall browsers
extension_doctorDiagnose a dev session leg by leg

Publish is not submit

The shipping verbs do different things, so keep them apart.

extension_publish answers with the project's build page on its workspace host: the canonical public page for a public project, a time-limited ?share= link (1 to 168 hours) for a private one. It uploads nothing and never changes the project's visibility. The revocable 30-day preview link is a different verb: extension_preview_web with share: true uploads the local build and mints it (Share an unpublished build for review).

extension_submit sends a released build into a store's review queue, and that is not reversible from the CLI; only Chrome accepts a cancel. Read the dry run before letting an agent submit. extension_submit never takes store credentials as arguments; the platform holds them.

Login

Local tools need nothing. The platform tools read EXTENSION_DEV_TOKEN, a workspace or project access token, from the environment, or use the device login:

extension_auth with action: "login" and project: "<workspace>/<project>" returns a user code and a URL. The human approves the code at extension.dev/device. GitHub is federated server side, so no GitHub token reaches the machine. The resulting token is project scoped, stored locally, never returned to the agent, and lives at most 7 days.

Login names a project that already exists on the platform. A <workspace>/<project> the platform does not know is refused before a code is ever minted, so nobody approves an authorization that can never redeem. Bootstrap in the browser: import a repository or a template at extension.dev/new, then log in again.

The same flow exists headless: extension-mcp login, extension-mcp whoami, extension-mcp logout, and extension-mcp release promote.

Pair with the skill

The MCP server pairs with @extension.dev/skill, which teaches the agent when to reach for each tool. The server without the skill gives an agent hands with no instructions.

When it fails

  • A platform tool returns an auth error: the stored device login lives at most 7 days. Log in again with extension_auth, or set EXTENSION_DEV_TOKEN.
  • extension_auth answers that the project does not exist: login only targets a project the platform already has. Create it at extension.dev/new, then log in again.
  • extension_eval errors in background: Chromium MV3 blocks eval in the service worker. Target page or content, or a Firefox build.
  • An act tool refuses: eval and control are session opt-in. Start the dev session with the gates enabled, then retry.
  • extension_list_extensions misses an extension: a dormant MV3 service worker with no open page is absent until it wakes.

Next