extension_submit
Submit a built extension for store REVIEW through extension.dev, which holds your store credentials and dispatches from your project's mirror CI: the Chrome Web Store, Firefox AMO, Edge Add-ons and the App Store (Safari).
Quick start
Dry run a Chrome and Firefox store submission of the latest build
How the agent uses it
This is store review only. It does not push a build to the extension.dev platform, and it does not make a shareable link: that is extension_publish, which is what "deploy" or "ship" an extension almost always means. Reach for this only when the ask is explicitly a store submission. It defaults to a dry run that dispatches nothing: the platform verifies the token and project, finds the store workflow, reads the build from its index when that index is readable, reads store health itself and adds a Safari plan verdict; this tool re-reads the per-store health rows beside it. The dry run does not run the owner gate, the approval, the build quota, the dispatch pause or the submission-mode check, which the real run does first. Pass dryRun:false to actually submit, which is irreversible: it needs a token issued by a workspace owner and a workspace owner's approval of that exact submission, every time, and it dispatches the store workflow; a Chrome or Edge store with no saved submission mode is uploaded as a draft (absent_mode: safe) and does not enter review. A real submission answers 'submitted' only when the platform recorded a submission for every store asked; 'submitted-partially' names the stores it did not record, which are the only ones to submit again; 'submit-unconfirmed' means no usable answer came back, so read extension_release_status before submitting again, because a second call submits a second time. The project comes from your token (extension_auth or EXTENSION_DEV_TOKEN; tokens live at most 7 days, so CI must re-mint from the console's Access tokens page); with several logins stored, project picks which one. action:'preflight' reads each store's readiness for browsers (the failing checks with what to fix, the warnings, never a secret value) and writes nothing. action:'cancel' withdraws a submission from review (store, default chrome, and submissionId from extension_release_status), and action:'rollout' raises the Chrome staged rollout to deployPercentage, which Chrome does not let be lowered again; both need a workspace owner's approval of the exact act, so the first call answers approval-required with the approval URL, or refuses with the reason before anyone is asked. Store credentials are never arguments, and no local file is uploaded. Call extension_release_status for valid shas, and, after a real submission, for the recorded outcome and review state.
Reference
| Group | platform, on with --features=local,platform (private alpha) |
| Tier | Platform |
| Needs | the server started with --features=local,platform, and a login; dryRun: false, cancel and rollout need a workspace owner's approval |
| Read only | no |
| Destructive | yes |
| Idempotent | no |
| Reaches the open web | yes |
Inputs
| Input | Type | Required | Default | What it does |
|---|---|---|---|---|
action | "submit" | "preflight" | "cancel" | "rollout" | no | "submit" | submit (the default) sends a build for store review; preflight reads each store's readiness and writes nothing; cancel withdraws a submission from review; rollout raises the Chrome staged rollout. |
project | string | no | Which stored login to use, as '<workspace>/<project>' (or a project slug that matches one login), when extension_auth has signed in to more than one project on this machine. Omitted, the most recent login is used, after EXTENSION_DEV_TOKEN when that is set. Named, it outranks EXTENSION_DEV_TOKEN. extension_auth (action: status) lists the stored logins. | |
browsers | array of "chrome" | "firefox" | "edge" | "safari" | no | Stores to submit to. | |
buildSha | string | no | The built commit SHA to submit. It needs a completed build in the project's build index; an unknown sha is rejected. | |
channel | string | no | Release channel to submit from (default stable). | |
version | string | no | Version label for the submission record (optional). | |
dryRun | boolean | no | true | Preflight only. Pass false to actually dispatch (irreversible, enters store review). |
projectPath | string | no | Path to the extension project root, read only for the local STORE.md advisory check. Nothing local is uploaded; without it the check falls back to the server's working directory. | |
approvalId | string | no | The approval handle returned by a prior approval-required response for a real submission. A real submission (dryRun:false) is irreversible and needs a workspace owner's approval every time: call once without this to get an approval id and URL, have a human approve at extension.dev, then call again with the same id. A dry run never needs it. | |
api | string | no | Platform base URL (default EXTENSION_DEV_API_URL, else https://www.extension.dev) | |
store | "chrome" | "firefox" | "edge" | "safari" | no | With cancel or rollout, the store (default chrome, the one store that supports both). | |
submissionId | string | no | With cancel, the platform's id of the submission to withdraw, from extension_release_status include:['stores']. | |
deployPercentage | number | no | With rollout, the share of users to raise the staged rollout to: a whole number from 1 to 100, above the current one. |
When it fails
- The tool is missing from the client's list. Start the server with
--features=local,platform; see Platform tools. - The platform refuses the call. Log in first with
extension_auth. - The answer reads
status: "platform-held". extension.dev is not open to the public yet, so nothing ran on its machines. Creating, running and building an extension still work on your machine; see Use the platform from your agent. - The answer reads
status: "approval-required". The act needs a person's approval. Open the approval URL in the answer, approve it, then call again with the same arguments and theapprovalId. - The approval is refused as
ApprovalExpired. An approval lasts 15 minutes. Call again with noapprovalIdto ask for a fresh one. - The approval is refused as
ApprovalConsumed. An approval runs its act once, and the call that spent it may already have run. Read the current state first, then ask again only if the act did not happen. - The approval is refused as
ApprovalScopeMismatch. It covers a different act, or the arguments changed since it was approved. Call again with noapprovalId. - A rollout is refused with
ROLLOUT_NOT_STAGED. Chrome publishes this project to everyone at once. Turn on staged publish in the project's Chrome store settings in the console; it applies from the next submission. - A rollout is refused with
ROLLOUT_NOT_HIGHER. A staged rollout only goes up. Read the current share withextension_release_statusandinclude: ["rollout"]. - A cancel is refused with
SUBMISSION_NOT_IN_REVIEW. Only a submission the store is still reviewing can be withdrawn. Read its review state withinclude: ["stores"]. - A cancel or a rollout answers
status: "needs-owner". Both need a login approved by a workspace owner. Ask a workspace owner to sign in withextension_authand run it, or make the change in the console. - The answer depends on the network. This tool reaches the open web, so a refusal can be the network, not the project.
Next
- MCP server: install, the two groups and the session gates
- Install in your client
extension_auth: Sign this machine in to extension.dev, report that login, or clear it.extension_builds: Read, rebuild and configure the platform's builds of the logged-in project on extension.dev.extension_preview_web: Preview an in-progress extension in the web emulator, with no real browser.extension_project_create: Create an extension.dev project for an extension that does not have one yet, without opening the console.extension_publish: Publish the project your stored token is scoped to (extension_auth, or EXTENSION_DEV_TOKEN) to extension.dev, and return its shareable URL.extension_release_promote: Promote a built extension to a release channel (stable, preview, beta, …) on extension.dev, headless.extension_release_status: Read where a project stands on extension.dev, from the public registry (registry.extension.land).extension_shares: List, create and revoke the public preview links this token has shared, which is what extension_preview_web share:true hands out.extension_workspace: Read the extension.dev workspace a stored login belongs to: its plan and limits, its projects, and its usage.extension_workspace_create: Create an extension.dev workspace that does not exist yet, without opening the console.