extension_dev
Run the extension while you edit it: dev build, hot module replacement, and a browser with the extension loaded.
Quick start
Run my extension in Chrome and let me act on it
Asked to run the extension, the agent starts the session and the browser opens with it loaded.
How the agent uses it
Reach for this first when the ask is "run my extension": by default it waits for the session to be ready and answers with the readiness and the first log lines, so one call covers the ask; pass wait:false to return as soon as the server is spawned. A dev session carries the control channel that extension_storage, extension_reload, extension_open and extension_dom_snapshot need (local, same machine, same user) unless you pass allowControl:false; the eval channel that extension_eval needs is the one gate that stays off until you pass allowEval:true (which implies control, so you never need to pass both). Use extension_start instead to run the production build in a browser. When the answer's ready.status is "ready" the session is up and nothing else needs calling before extension_logs, extension_inspect or the control verbs; extension_wait is only for wait:false, an answer whose ready.status was not ready, or a build-only session.
Reference
| Group | local, on by default |
| Tier | Run |
| Needs | none |
| Read only | no |
| Destructive | no |
| Idempotent | no |
| Reaches the open web | no |
Inputs
| Input | Type | Required | Default | What it does |
|---|---|---|---|---|
projectPath | string | yes | Extension project root | |
browser | "chrome" | "chromium" | "edge" | "brave" | "opera" | "vivaldi" | "yandex" | "firefox" | "waterfox" | "librewolf" | "zen" | "floorp" | "safari" | "chromium-based" | "gecko-based" | "firefox-based" | "webkit-based" | no | "chrome" | |
port | number | no | Dev server port (0 for auto-assign) | |
noBrowser | boolean | no | false | Start the dev server without launching a browser |
polyfill | boolean | no | true | Apply cross-browser polyfill |
profile | string | no | Profile path, or "false" to reuse the real user profile. Omit for a throwaway one. | |
startingUrl | string | no | URL the browser opens on launch | |
chromiumBinary | string | no | Custom Chromium-based binary to launch; browser still names the target family the engine builds for (chromium-based when none is given). | |
geckoBinary | string | no | Custom Gecko/Firefox binary to launch; browser still names the target family the engine builds for (gecko-based when none is given). | |
host | string | no | Bind host, default 127.0.0.1. Use 0.0.0.0 in Docker or devcontainers. | |
publicHost | string | no | Host the browser dials for HMR and reload when it differs from the bind host | |
extensions | array of string | no | Extra extension paths or store URLs to load alongside the project | |
replace | boolean | no | false | Stop the live session for this projectPath first, reported as replacedSession. Without it a second call is refused rather than forking: two sessions fight over one profile and the newer browser dies on the lock. |
allowControl | boolean | no | true | The agent-bridge control channel that extension_storage/reload/open/dom_snapshot ride (local, same machine). On unless you pass false; eval is the gate that stays off (allowEval). |
wait | boolean | no | true | Wait for the session to be ready before answering (the same contract extension_wait reads, up to 45s) and include the first log lines. false returns as soon as the server is spawned; call extension_wait and extension_logs yourself then. |
allowEval | boolean | no | false | Enable extension_eval (runs code in a context; writes a 0600 session token). Implies allowControl, so you never need to pass both. |
Next
- MCP server: install, the two groups and the session gates
- Install in your client
extension_start: Run the PRODUCTION build in a browser: build the project, serve it, and launch.extension_stop: 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.extension_wait: Wait for a running dev or start session to be ready.