@extension.dev/mcp 10.10.7 → 10.10.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +119 -0
- package/README.md +4 -2
- package/dist/module.js +1604 -189
- package/dist/src/lib/credentials.d.ts +1 -0
- package/dist/src/lib/device-flow.d.ts +4 -0
- package/dist/src/lib/login-flow.d.ts +7 -0
- package/dist/src/lib/project-batch.d.ts +28 -0
- package/dist/src/lib/project-create-batch.d.ts +42 -0
- package/dist/src/lib/project-create-body.d.ts +14 -0
- package/dist/src/lib/rdp.d.ts +28 -0
- package/dist/src/lib/registry.d.ts +1 -0
- package/dist/src/tools/auth.d.ts +8 -0
- package/dist/src/tools/dom-snapshot.d.ts +1 -0
- package/dist/src/tools/login.d.ts +5 -0
- package/dist/src/tools/project-create.d.ts +10 -2
- package/package.json +2 -2
- package/server.json +2 -2
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"name": "extension-mcp",
|
|
11
11
|
"source": "./",
|
|
12
12
|
"description": "MCP tools for browser extension development: scaffold from 50+ templates, run the dev server with HMR, inspect the live DOM and logs, and publish store-ready builds for Chrome, Edge, and Firefox.",
|
|
13
|
-
"version": "10.10.
|
|
13
|
+
"version": "10.10.9",
|
|
14
14
|
"category": "development",
|
|
15
15
|
"author": {
|
|
16
16
|
"name": "Cezar Augusto"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "extension-mcp",
|
|
3
3
|
"description": "MCP tools for browser extension development: scaffold from 50+ templates, run the dev server with HMR, inspect the live DOM and logs, and publish store-ready builds for Chrome, Edge, and Firefox. Ships /extension, /extension-add, /extension-debug, and /extension-publish commands.",
|
|
4
|
-
"version": "10.10.
|
|
4
|
+
"version": "10.10.9",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cezar Augusto",
|
|
7
7
|
"email": "hello@extension.dev",
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,124 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 10.10.9
|
|
4
|
+
|
|
5
|
+
- One approval now covers several projects in one workspace
|
|
6
|
+
(BUGS_TO_FIX_MCP.md entry 27). Onboarding ten projects used to cost
|
|
7
|
+
twenty visits to extension.dev/device, one to create each project and
|
|
8
|
+
one to sign in to it, and the ten tokens then expired together and cost
|
|
9
|
+
ten more. This release is the client half and waits on the platform
|
|
10
|
+
deploy that accepts a list. The platform advertises the capability as
|
|
11
|
+
`batchOnboarding` in its login config; against a platform that does
|
|
12
|
+
not, both inputs below refuse the list before a device code is spent
|
|
13
|
+
and name the one-project call to use instead.
|
|
14
|
+
- `extension_project_create` takes `projects`, a list of
|
|
15
|
+
`{ project, repo }` entries in one workspace, in place of `project` and
|
|
16
|
+
`repo`. The approval page lists every name. Each project is created by
|
|
17
|
+
its own request and its 7-day token is stored as that project's login,
|
|
18
|
+
so no `extension_auth` call follows. An entry may carry its own
|
|
19
|
+
`displayName`, `description`, `installCommand`, `buildCommand`,
|
|
20
|
+
`outputDirectory`, `browsers` and `outputDirectories`; the same inputs
|
|
21
|
+
at the top level are the default for entries that leave them out.
|
|
22
|
+
- The answer has one row per project: created and logged in, created
|
|
23
|
+
with no token (the hint names the batch login to run), refused with the
|
|
24
|
+
platform's own code, unconfirmed when a request got no answer, or not
|
|
25
|
+
attempted. A refusal about one project (a name taken, a reserved slug)
|
|
26
|
+
does not stop the list. A refusal about the approval (an expired grant,
|
|
27
|
+
the hourly limit, the plan's project limit, a missing GitHub App
|
|
28
|
+
installation) stops it, and every project not reached still gets a row
|
|
29
|
+
saying so.
|
|
30
|
+
- A list takes a few calls: creating a project is slow, so while
|
|
31
|
+
projects remain the answer is `status: "creating"` with the same
|
|
32
|
+
`deviceCode` to call again. The provisioning grant is held in the
|
|
33
|
+
server's memory for its 15 minutes and is never written to disk or
|
|
34
|
+
returned; if the server restarts mid-list the projects already created
|
|
35
|
+
stay created and the rest need a new approval.
|
|
36
|
+
- One approval creates at most 10 projects, because the platform creates
|
|
37
|
+
at most 10 per hour for one approving account; the next 10 can start
|
|
38
|
+
in a new call once that limit allows. The cap is read from the
|
|
39
|
+
platform's login config (`createProjectsPerApproval`), with 10 as the
|
|
40
|
+
fallback when the platform states no usable number. A longer create
|
|
41
|
+
list is refused before any approval is asked for, with that reason; it
|
|
42
|
+
is never split silently.
|
|
43
|
+
- `extension_auth` with `action: "login"` takes `projects`, a list of up
|
|
44
|
+
to 20 `<workspace>/<project>` names of existing projects in one
|
|
45
|
+
workspace (the platform's `loginProjectsPerApproval`), in place of
|
|
46
|
+
`project`. One approval stores one token per
|
|
47
|
+
project, which is also how a set of logins that expire together is
|
|
48
|
+
renewed. One missing project refuses the whole list and stores
|
|
49
|
+
nothing. The call that completes a batch login can take up to a
|
|
50
|
+
minute.
|
|
51
|
+
- Both lists are checked before a device code is spent, by the
|
|
52
|
+
platform's own rules: one workspace, 1 to 20 names, no name twice, and
|
|
53
|
+
each project by its exact slug (lowercase letters and digits joined by
|
|
54
|
+
single dashes, at most 48 characters). The refusal names the entry.
|
|
55
|
+
- A batch login or create does not change which login is the default.
|
|
56
|
+
A single login still does.
|
|
57
|
+
- A server started with `--project` refuses a list that names any other
|
|
58
|
+
project, the same refusal a single call gets, and takes a list of the
|
|
59
|
+
pinned project alone. A list on `logout` or `status` is refused rather
|
|
60
|
+
than ignored.
|
|
61
|
+
- `extension_project_create` no longer lists `project` and `repo` as
|
|
62
|
+
required in its schema, since a list replaces them. A call with
|
|
63
|
+
neither form is still refused, by the tool.
|
|
64
|
+
- `extension_publish` with `project` now describes the project it was
|
|
65
|
+
called for (BUGS_TO_FIX_MCP.md entry 44). The token was already picked
|
|
66
|
+
by `project`, but `registryUrl`, and the build index behind a missing
|
|
67
|
+
`buildSha`, `version` or `builtAt`, came from the most recent login, so
|
|
68
|
+
with several logins stored a publish for one project could return
|
|
69
|
+
another project's registry address and fill its build details from
|
|
70
|
+
another project's builds. The same slip is fixed in
|
|
71
|
+
`extension_release_promote` (the builds page, the channel list and the
|
|
72
|
+
public URLs it returns) and in the `extension_submit` dry run (the
|
|
73
|
+
console page it names). `extension_shares` and `extension_preview_web`
|
|
74
|
+
were checked and did not have it.
|
|
75
|
+
- A private project's registry data is read with the login stored for
|
|
76
|
+
that project. It used to be asked with the most recent login, which
|
|
77
|
+
gave up on a mismatch and reported the builds as missing.
|
|
78
|
+
- `extension_release_status` reads a `project` given as
|
|
79
|
+
`<workspace>/<project>`, the form every other tool takes. It used to
|
|
80
|
+
join the pair to the active login's workspace and ask the registry for
|
|
81
|
+
an address that names no project, which is also what a server started
|
|
82
|
+
with `--project` sent on every call.
|
|
83
|
+
|
|
84
|
+
## 10.10.8
|
|
85
|
+
|
|
86
|
+
- On Firefox, `extension_eval` now reads an extension whose content
|
|
87
|
+
security policy forbids eval, which is every MV3 extension page
|
|
88
|
+
(BUGS_TO_FIX_MCP.md entry 20). Extension.js 4.1.31 evaluates such a
|
|
89
|
+
document over the debugger protocol, but the wrapper this server put
|
|
90
|
+
around a popup, options, sidebar or override-page expression called
|
|
91
|
+
eval itself, so those contexts still answered "blocked by CSP" on an
|
|
92
|
+
engine that could read them. A refused surface is now asked again with
|
|
93
|
+
the bare expression, which the engine takes over the protocol and
|
|
94
|
+
awaits there. A project pinned below 4.1.31 keeps the refusal, and its
|
|
95
|
+
hint now names that floor.
|
|
96
|
+
- `extension_eval` with `context: "page"` and a `moz-extension://` url
|
|
97
|
+
reaches a page the manifest declares as no surface (`pages/*`), through
|
|
98
|
+
the console actor of the tab showing it. It used to answer
|
|
99
|
+
`E_NO_SURFACE_DOCUMENT`. Open the page with `extension_open` first; a
|
|
100
|
+
page no tab shows answers `E_NO_MATCHING_TARGET`.
|
|
101
|
+
- `extension_dom_snapshot` on a `moz-extension://` url reads the page the
|
|
102
|
+
same way when Firefox refuses the injection with "Missing host
|
|
103
|
+
permission for the tab", and returns the engine's own snapshot fields.
|
|
104
|
+
- `extension_eval` with `context: "page"` on a site whose policy forbids
|
|
105
|
+
eval now works on an MV3 Firefox build, over the debugger protocol,
|
|
106
|
+
when `url` names the tab. An MV2 build keeps its `tabs.executeScript`
|
|
107
|
+
route, which had gone dead on Extension.js 4.1.31 because that engine
|
|
108
|
+
renamed the refusal to `E_CSP_BLOCKS_EVAL`; both spellings are read now.
|
|
109
|
+
- The protocol takes one expression. A statement list sent to a
|
|
110
|
+
policy-locked Firefox document answers `E_BAD_REQUEST` with the way to
|
|
111
|
+
wrap it, where the background used to answer a control-channel error
|
|
112
|
+
carrying "SyntaxError: expected expression".
|
|
113
|
+
- Still refused, by name: a string evaluated in the content-script world
|
|
114
|
+
of an extension whose policy forbids eval. Use `context: "page"` or
|
|
115
|
+
`extension_dom_snapshot` there.
|
|
116
|
+
|
|
117
|
+
- `extension_submit` and `extension_store_status` link to the console's
|
|
118
|
+
Submissions tab at `/<workspace>/<project>/submissions`, where the page
|
|
119
|
+
moved; the old `/stores` address still redirects. `@extension.dev/urls`
|
|
120
|
+
moves to `^0.8.2`, which carries the new paths.
|
|
121
|
+
|
|
3
122
|
## 10.10.7
|
|
4
123
|
|
|
5
124
|
- A share revoke now waits for a person by default, like a real store
|
package/README.md
CHANGED
|
@@ -217,9 +217,9 @@ cp node_modules/@extension.dev/mcp/claude/commands/*.md ~/my-extension/.claude/c
|
|
|
217
217
|
| act | `extension_reload` | Reload extension or tab |
|
|
218
218
|
| act | `extension_open` | Open a surface (popup, options, sidebar, devtools panel, override pages) / trigger `action`, `command` |
|
|
219
219
|
| browsers | `extension_browsers` | Detect, list, install, and uninstall browsers |
|
|
220
|
-
| platform | `extension_auth` | Device login at extension.dev, plus login status and logout |
|
|
220
|
+
| platform | `extension_auth` | Device login at extension.dev for one project or a list of them, plus login status and logout |
|
|
221
221
|
| platform | `extension_workspace_create` | Create an extension.dev workspace, headless, via device approval; the approver becomes its owner |
|
|
222
|
-
| platform | `extension_project_create` | Create the extension.dev project for a built extension, headless, via device approval |
|
|
222
|
+
| platform | `extension_project_create` | Create the extension.dev project for a built extension, or several under one approval, headless, via device approval |
|
|
223
223
|
| platform | `extension_preview_web` | Render a build in the web emulator, and share it as a link |
|
|
224
224
|
| platform | `extension_shares` | List every link you have shared, and revoke one permanently |
|
|
225
225
|
| platform | `extension_publish` | Publish a shareable preview to extension.dev |
|
|
@@ -314,6 +314,8 @@ That is a different job from shipping. Use `share` for the build you are holding
|
|
|
314
314
|
|
|
315
315
|
The platform tools connect agents to [extension.dev](https://extension.dev): `extension_auth` runs extension.dev's own device flow (you approve the code at [extension.dev/device](https://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.
|
|
316
316
|
|
|
317
|
+
Onboarding several extensions at once costs one approval, not two per project. `extension_project_create` takes `projects`, a list of `{ project, repo }` entries in one workspace, in place of `project` and `repo`: the approval page at extension.dev/device lists every name, each project is created by its own request, and each one's 7-day token is stored as that project's login. `extension_auth` with `action: "login"` takes `projects`, a list of `<workspace>/<project>` names of existing projects, and stores one token per project, which is also how logins that expire together are renewed. Both lists are checked before a device code is spent: one workspace, 1 to 20 names, each by its exact slug (lowercase letters and digits joined by single dashes, at most 48 characters), none twice. A create list is capped at 10, because the platform creates at most 10 projects per hour for one approving account; a longer one is refused with that reason rather than split, and the next 10 can start in a new call once that limit allows. The platform states both caps, and that it takes a list at all, in its login config; a list sent to a platform that does not advertise it is refused before a device code is spent. Creating takes a few calls: while projects remain the answer is `status: "creating"` with the same `deviceCode` to call again, and the answer always carries one row per project, so a refusal on one never hides the others. A server pinned with `--project` refuses a list that names any other project.
|
|
318
|
+
|
|
317
319
|
## The extension.dev stack
|
|
318
320
|
|
|
319
321
|
| Package | Use it to |
|