Skip to content

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 ​

Groupplatform, on with --features=local,platform (private alpha)
TierPlatform
Needsthe server started with --features=local,platform, and a login; dryRun: false, cancel and rollout need a workspace owner's approval
Read onlyno
Destructiveyes
Idempotentno
Reaches the open webyes

Inputs ​

InputTypeRequiredDefaultWhat 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.
projectstringnoWhich 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.
browsersarray of "chrome" | "firefox" | "edge" | "safari"noStores to submit to.
buildShastringnoThe built commit SHA to submit. It needs a completed build in the project's build index; an unknown sha is rejected.
channelstringnoRelease channel to submit from (default stable).
versionstringnoVersion label for the submission record (optional).
dryRunbooleannotruePreflight only. Pass false to actually dispatch (irreversible, enters store review).
projectPathstringnoPath 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.
approvalIdstringnoThe 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.
apistringnoPlatform base URL (default EXTENSION_DEV_API_URL, else https://www.extension.dev)
store"chrome" | "firefox" | "edge" | "safari"noWith cancel or rollout, the store (default chrome, the one store that supports both).
submissionIdstringnoWith cancel, the platform's id of the submission to withdraw, from extension_release_status include:['stores'].
deployPercentagenumbernoWith 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 the approvalId.
  • The approval is refused as ApprovalExpired. An approval lasts 15 minutes. Call again with no approvalId to 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 no approvalId.
  • 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 with extension_release_status and include: ["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 with include: ["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 with extension_auth and 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.