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
claude mcp add extension-dev npx @extension.dev/mcpOr 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-mcpThe 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:
{
"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
| Tool | What it does |
|---|---|
extension_create | Scaffold a project from a template |
extension_templates | Browse the catalog and read a template's source |
extension_add_feature | Add a popup, sidebar or content script to an existing project |
Run and debug
| Tool | What it does |
|---|---|
extension_dev | Start a dev session with hot reload and a launched browser |
extension_build | Produce a production build per browser |
extension_start | Build and launch, or launch an existing dist with build: false |
extension_stop | Stop a dev or start session, server and browser |
extension_wait | Wait for the ready.json contract |
extension_logs | Stream logs from every context (Agent logs) |
extension_inspect | Read the live DOM of a running extension surface (Inspect and act) |
extension_dom_snapshot | Snapshot a chosen surface's DOM |
extension_eval | Evaluate an expression in a chosen context, session opt-in |
extension_storage | Read or write chrome.storage, session opt-in |
extension_reload | Reload the extension, session opt-in |
extension_open | Open a surface (popup, options, sidebar, action, command), session opt-in |
extension_list_extensions | List extensions with a live context in the dev browser, Chromium only |
Preview and share
| Tool | What it does |
|---|---|
extension_preview_web | Render a build in the web emulator; sharing it as a link needs a token |
extension_shares | List and revoke the links this token has shared, token required |
Release and publish
| Tool | What it does |
|---|---|
extension_publish | Return the project's build page URL, with a time-limited ?share= token when the project is private (Publish), token required |
extension_release_status | Read release channels, recent builds, and store review state |
extension_release_promote | Promote a build to a release channel, headless, token required |
Stores
| Tool | What it does |
|---|---|
extension_submit | Send a released build into a store's review queue, dry run by default, token required |
Utility
| Tool | What it does |
|---|---|
extension_analyze | Analyze the built output on disk |
extension_manifest_validate | Validate the manifest cross browser |
extension_theme_verify | Verify a Chrome theme manifest against what Chrome paints |
extension_auth | Device login at extension.dev, login status, and logout |
extension_browsers | Detect, list, install, and uninstall browsers |
extension_doctor | Diagnose 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 setEXTENSION_DEV_TOKEN. extension_authanswers 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_evalerrors inbackground: Chromium MV3 blocks eval in the service worker. Targetpageorcontent, 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_extensionsmisses an extension: a dormant MV3 service worker with no open page is absent until it wakes.
Next
- Agent bridge is the capability behind the local tools
- Agent logs and Inspect and act in depth
- Publish from the CLI links a project's build page
- Access tokens
