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

Give your AI agent hands for browser extension development. 30 MCP tools that scaffold, run, inspect, debug, and publish cross-browser extensions.
claude mcp add extension-dev npx @extension.dev/mcpWorks with Claude Code, Claude Desktop, Cursor, and any MCP client.
extension.dev · Extension.js · Templates · Examples · Discord
Why an MCP server for extensions
Extensions fail silently: content scripts that never inject, panels that never open, permissions that return undefined with no error. An agent editing files blind will happily "fix" all of them without noticing none of them work.
These tools give agents eyes on the live browser, so they debug from evidence instead of guessing:
Scaffold from the 50+ template catalog behind templates.extension.dev, or add a popup, sidebar, or content script to an existing project
Run the dev server with HMR in Chrome, Edge, Firefox, Brave, Opera, Vivaldi, Yandex, Waterfox, LibreWolf, or any Chromium- or Gecko-based binary, plus Safari on macOS (no HMR yet), no build config
See the live DOM, unified logs from every extension context,
chrome.storagecontents, and the loaded-extension listAct: evaluate code in any context, trigger the action button and commands, reload the extension, replay events
Ship: validate the manifest cross-browser, build for production, publish a shareable preview, and promote builds to release channels headlessly
Built on Extension.js, the open-source cross-browser extension framework.
Related MCP server: Chrome Extension MCP Bridge
Clients
Claude Code | Claude Desktop | Cursor |
Setup
Claude Code
claude mcp add extension-dev npx @extension.dev/mcpOr install it as a plugin, the MCP server plus the /extension, /extension-add, /extension-debug, and /extension-publish commands in one step:
/plugin marketplace add extensiondev/mcp
/plugin install extension-mcp@extensiondev-mcpCursor
Claude Desktop / .mcp.json
{
"mcpServers": {
"extension-dev": {
"command": "npx",
"args": ["@extension.dev/mcp"]
}
}
}Pair with the skill
This server gives agents hands; @extension.dev/skill gives them judgment: the cross-browser rules, silent-failure gotchas, debugging playbooks, and store checklist, packaged in the open Agent Skills format. With both installed, agents know to verify against the live browser instead of guessing, and these tools make that a one-call operation.
npm i -D @extension.dev/skill
mkdir -p .claude/skills && cp -R node_modules/@extension.dev/skill/skills/extension-dev .claude/skills/Claude Code project integration
The package ships drop-in instructions, slash commands, and rules for extension projects:
# Rules (how Claude understands your project)
cp node_modules/@extension.dev/mcp/claude/CLAUDE.md ~/my-extension/.claude/CLAUDE.md
# Slash commands (/extension, /extension-add, /extension-debug, /extension-publish)
mkdir -p ~/my-extension/.claude/commands
cp node_modules/@extension.dev/mcp/claude/commands/*.md ~/my-extension/.claude/commands/Tools
Tier | Tool | Description |
build |
| Scaffold from a template |
build |
| Browse 50+ templates ( |
build |
| Add sidebar/popup/content script |
build |
| Build for production |
run |
| Dev server with HMR |
run |
| Build + launch the production build ( |
run |
| Poll the dev-server ready contract |
run |
| Stop a dev/start/preview session (server + browser) |
see |
| Cross-browser manifest validation |
see |
| Static analysis of the built extension on disk |
see |
| Deep live inspection of a running extension (closed shadow roots, probes) |
see |
| Shallow DOM snapshot of a chosen tab or extension surface over the agent bridge |
see |
| List loaded extensions (Chromium and Firefox) |
see |
| Stream logs from every context |
see |
| Diagnose the dev session leg by leg (ready contract, ports, token, executor, browser) |
see |
| Verify a Chrome theme manifest against the colors Chrome actually paints |
test |
| State expectations about a running extension and get one verdict each: pass, fail, or inconclusive |
act |
| Evaluate in a context (needs |
act |
| Read/write |
act |
| Reload extension or tab |
act |
| Open a surface / trigger |
browsers |
| Detect, list, install, and uninstall browsers |
platform |
| Device login at extension.dev, plus login status and logout |
platform |
| Create the extension.dev project for a built extension, headless, via device approval |
platform |
| Render a build in the web emulator, and share it as a link |
platform |
| List every link you have shared, and revoke one permanently |
platform |
| Publish a shareable preview to extension.dev |
platform |
| Promote a build to a release channel, headless |
platform |
| Submit for store review: Chrome, Firefox and Edge, through extension.dev |
platform |
| Read release channels, recent builds, and store submission and review state |
Browser-launching tools (dev, start) shell out to the extension CLI, the project's own node_modules/.bin/extension when present, otherwise npx extension@<pinned> at the version this package is verified against; everything else runs in-process.
Asserting instead of guessing
Every other tool here hands back a reading: a DOM, a log window, an evaluated
expression. Turning a reading into "the popup works" was left to the agent, as
a string of JavaScript it wrote on the spot, which is the guesswork the paired
skill exists to prevent. extension_assert states the expectation and returns
the verdict.
{
"projectPath": "/path/to/extension",
"expect": [
{ "assert": "background-worker-booted" },
{ "assert": "surface-rendered", "surface": "popup", "selector": "[data-testid=root]" },
{ "assert": "storage-key-present", "key": "settings", "area": "local" },
{ "assert": "console-errors-empty", "context": ["background", "popup"] },
{ "assert": "content-script-injected", "url": "https://shop.example/cart" }
]
}Each check comes back as pass, fail or inconclusive, and the run is a
pass only when every check passed. inconclusive is the part that matters: it
means this platform cannot cover the question today, and the check carries a
settledBy naming the evidence that would answer it. A content script's
execution is not observable from outside its isolated world, so
content-script-injected passes only on a line the script itself wrote and is
inconclusive over a declared match, never a pass. "No console errors" over a
session that never built is inconclusive too, because zero errors and zero
events are the same number. A read the platform refuses, such as
chrome.storage on a session started without allowControl, is inconclusive
rather than a failure: nothing was learned about the extension.
The verdict document is the same grammar the preview lane's CI verdict uses
(@extension.dev/preview-verdict), with its own contract name and its own
check registry, so a document from one lane can never be mistaken for the
other's. Each check here names the preview check it is the live-browser
counterpart of, and a contract test holds the two grammars together.
Sharing a build in progress
An unpacked extension is unusually hard to hand to someone: the only way to look at a colleague's work-in-progress has been to take their zip and run untrusted code with real browser permissions on your own machine. extension_preview_web with share: true uploads the dist/ it just built and returns a link that renders those exact bytes in the emulator. Whoever opens it installs nothing and signs in to nothing, which is what lets a designer, a PM, or a reviewer into the loop at all. Those bytes run in an isolated sandbox origin or they do not run at all: preview refuses a shared build rather than serving it in its own renderer. Sharing needs auth (extension_auth or EXTENSION_DEV_TOKEN), the link lives 30 days, and DELETEing the returned revokeUrl with the same token kills it early. Re-sharing an unchanged build returns that same link rather than a second one, and only a revoked link is replaced by a different one, because revocation is permanent: the address is burned and never resolves again. That makes revokeUrl the handle to the link you just made, so every share is also appended to .extension.dev/shared-previews.json in the project (gitignored) so it survives losing the tool output. The upload holds up to 2,000 files and about 64MB of text, or roughly 48MB when the build is mostly images, fonts or wasm, which travel base64-encoded. Without share, the tool returns a local-only deep link and uploads nothing.
extension_shares is the other half of that: it lists every link the token has shared, live and dead, with the previewUrl and revokeUrl of each, and revokes one by artifactId or by pasting any of its URLs. Pass projectPath and it reconciles the platform's answer with the project's own record, so a link shared from another machine shows up as remoteOnly and a record with nothing behind it any more shows up under localOnly. It never rewrites the local file.
That is a different job from shipping. Use share for the build you are holding right now; use extension_publish and extension_release_promote below for builds your CI has released.
From preview to store
The platform tools connect agents to extension.dev: extension_auth runs extension.dev's own device flow (you approve the code at extension.dev/device, and GitHub is federated server-side, so no GitHub token ever reaches your machine) and stores a project-scoped token locally (never returned to the agent), extension_publish turns a build your project has already published into a shareable URL, and extension_release_promote promotes a tested build to a release channel from CI or an agent session, no browser required. extension_submit submits a built extension to the Chrome Web Store, Edge Add-ons, and Firefox AMO through extension.dev, which holds your store credentials and dispatches the release from your project's mirror CI, it defaults to a dry run and store credentials are never tool arguments. Safari and the App Store are one paid lane on the platform, so a free workspace is refused there and the other three stores are unaffected. The two verbs are not interchangeable: extension_publish pushes to the extension.dev platform, extension_submit sends the build into a store's review queue, which is irreversible. After a real submission, extension_release_status reads the recorded outcome, per-store credential health, and review state from the project's public registry, so agents and CI can answer "was it approved?" without a console visit. Access tokens live at most 7 days; CI pipelines re-mint them from the console's Access tokens page.
The extension.dev stack
Package | Use it to |
Teach AI agents the judgment half: cross-browser rules, gotchas, playbooks | |
Check an artifact against a declared SHA-256 and gate CI on the result |
All of it rides on Extension.js, the open-source cross-browser extension framework.
Community
Join the extension.dev Discord for help and feedback
Browse production-ready templates at templates.extension.dev
Follow the platform's public packages on GitHub
Report Extension.js framework issues on GitHub
License
Apache-2.0 (c) 2026 Cezar Augusto and the extension.dev collaborators. See LICENSE.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceAn MCP server that enables AI agents to control a real Google Chrome instance using specific user profiles, cookies, and extensions. It provides 18 tools for browser navigation, element interaction, and page inspection via the Chrome DevTools Protocol.
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to control the Google Chrome browser through a Node.js WebSocket bridge and a dedicated browser extension. It provides tools for capturing screenshots, executing JavaScript, managing tabs, and extracting page content via the MCP protocol.2
- AlicenseNot gradedqualityBmaintenanceLets AI coding agents control and inspect a live Chrome browser via MCP, providing Chrome DevTools capabilities for automation, debugging, and performance analysis.11Apache 2.0
- AlicenseNot gradedqualityBmaintenanceMCP server that bridges Model Context Protocol with browser automation, offering 37 tools across three modes (Playwright, CDP, Chrome Extension) and an autonomous agent for web tasks.MIT
Related MCP Connectors
Live browser debugging for AI assistants — DOM, console, network via MCP.
A paid remote MCP for AI agent browser DevTools MCP, built to return verdicts, receipts, usage logs,
Hosted MCP with 91 agent tools: X, domains, SEO, Maps, Trends, Search, YouTube, TikTok, and more.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/extensiondev/mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server