Skip to content

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.

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 ​

Grouplocal, on by default
TierRun
Needsnone
Read onlyno
Destructiveno
Idempotentno
Reaches the open webno

Inputs ​

InputTypeRequiredDefaultWhat it does
projectPathstringyesExtension 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"
portnumbernoDev server port (0 for auto-assign)
noBrowserbooleannofalseStart the dev server without launching a browser
polyfillbooleannotrueApply cross-browser polyfill
profilestringnoProfile path, or "false" to reuse the real user profile. Omit for a throwaway one.
startingUrlstringnoURL the browser opens on launch
chromiumBinarystringnoCustom Chromium-based binary to launch; browser still names the target family the engine builds for (chromium-based when none is given).
geckoBinarystringnoCustom Gecko/Firefox binary to launch; browser still names the target family the engine builds for (gecko-based when none is given).
hoststringnoBind host, default 127.0.0.1. Use 0.0.0.0 in Docker or devcontainers.
publicHoststringnoHost the browser dials for HMR and reload when it differs from the bind host
extensionsarray of stringnoExtra extension paths or store URLs to load alongside the project
replacebooleannofalseStop 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.
allowControlbooleannotrueThe 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).
waitbooleannotrueWait 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.
allowEvalbooleannofalseEnable 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.