@extension.dev/mcp 6.5.0 → 7.0.0

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.
@@ -10,7 +10,7 @@
10
10
  "name": "extension-mcp",
11
11
  "source": "./",
12
12
  "description": "MCP tools for browser extension development: scaffold from 60+ 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": "6.5.0",
13
+ "version": "7.0.0",
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 60+ 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": "6.5.0",
4
+ "version": "7.0.0",
5
5
  "author": {
6
6
  "name": "Cezar Augusto",
7
7
  "email": "hello@extension.dev",
@@ -9,7 +9,7 @@
9
9
  },
10
10
  "homepage": "https://github.com/extensiondev/mcp",
11
11
  "repository": "https://github.com/extensiondev/mcp",
12
- "license": "MIT",
12
+ "license": "Apache-2.0",
13
13
  "keywords": [
14
14
  "mcp",
15
15
  "browser-extension",
package/CHANGELOG.md CHANGED
@@ -1,5 +1,88 @@
1
1
  # Changelog
2
2
 
3
+ ## 7.0.0
4
+
5
+ `preview.extension.dev` is the only web door this package knows about. The
6
+ inspect door predates it and had stopped being reachable.
7
+
8
+ ### Removed
9
+
10
+ - **`extension_preview_web` no longer takes `surface` or `inspectUrl`.**
11
+ `surface:"inspect"` pointed a local build at `inspect.extension.dev` over the
12
+ `inspect://path` scheme, which is what the tool did before
13
+ `preview.extension.dev` existed. Only the inspect dev server ever answered it:
14
+ the deployed origin serves store listings and has no `/__inspect/fetch`, so
15
+ the door resolved on one machine and nowhere else. Every build now renders in
16
+ `preview.extension.dev`, which is also the surface that carries the
17
+ Emulated/Real lane toggle and the Trace tab. The response no longer carries a
18
+ `surface` field, and `hostUrl` is the only origin override.
19
+ - **The carrier no longer allowlists `inspect.extension.dev`.** Pairing needs a
20
+ page that opens the bridge, and inspect never did: it traces the emulated lane
21
+ of the extension it fetched and has no lane toggle. `extension_dev`
22
+ `carrier: true` and the pairing notes now point at `preview.extension.dev`,
23
+ and the carrier's `externally_connectable` drops the origin that was never
24
+ going to connect.
25
+ - **`extension_login` no longer falls back to the GitHub device flow.**
26
+ extension.dev hosts the device flow itself and federates GitHub server-side, so
27
+ the only authorization surface is `extension.dev/device` and no GitHub token
28
+ ever lands on the caller's machine. The legacy path is gone entirely: the
29
+ GitHub device-code client, the `provider` fork (which existed twice, once in the
30
+ tool and once in the `extension-mcp login` bin), the
31
+ `/api/cli/login/exchange` hop, and the `EXTENSION_DEV_GITHUB_CLIENT_ID`
32
+ override. Stored credentials record `provider: "extensiondev"` and
33
+ `extension_whoami` reports that instead of defaulting to `"github"`. Nothing
34
+ changes for a caller who was already on the branded flow, which is every caller
35
+ the platform has served since it went live; a self-hosted platform pinned to
36
+ the old exchange endpoint is no longer supported.
37
+
38
+ ## 6.6.0
39
+
40
+ A shared build belongs to the project that owns it, not to whoever happened to
41
+ press publish. `extension_shares` now says which of the two it is looking at,
42
+ and it names the publisher without ever inventing one.
43
+
44
+ ### Added
45
+
46
+ - **Every listed share carries its owner and its publisher.** The platform now
47
+ returns `owner` and `sharedBy` on each row and both come through untouched,
48
+ alongside an `attribution` block that reads them. `attribution.ownership` is
49
+ `"project"` when the owning workspace holds the share, `"personal"` when one
50
+ person holds it alone, and `"unknown"` when the platform disclosed no owner.
51
+ `attribution.ownerPath` gives the owning `workspace/project` for a project
52
+ share. Ownership is read off `owner` and never off the publisher, because the
53
+ owner is what decides who may revoke a share and the publisher is only who
54
+ made it.
55
+ - **`attribution.revocableBy` says who can actually pull the link back.** A
56
+ project share is revocable by any member of the owning workspace and by any
57
+ token scoped to the owning project. A personal share belongs to one person,
58
+ so nobody else can see it or revoke it and a project token cannot touch it.
59
+ Knowing which of the two you are holding is the difference between a revoke
60
+ that will work and a 404 that reads like a bug.
61
+ - **`server.ownership` counts the listed shares by owner.** Project, personal
62
+ and unknown, so a list can be reasoned about without walking every row.
63
+
64
+ ### Changed
65
+
66
+ - **A publisher is never guessed.** `attribution.credit` is the GitHub login
67
+ when the platform resolved one. When a share was made by a CLI token whose
68
+ issuer could not be resolved it reads `CLI token <id>`, which is exactly what
69
+ the credential itself proves, and a share made before attribution existed
70
+ reads as not recorded. The workspace slug, the project slug and the owner are
71
+ never substituted for a name, because naming a team where a human is expected
72
+ attributes the share to whoever the reader takes that team to be.
73
+ `attribution.creditSource` says which of the three it was.
74
+ - **Attribution is stated as attribution.** The response spells out that
75
+ `sharedBy` records who published a share and grants and restricts nothing, so
76
+ it is not read as a permission.
77
+ - **A truncated list is more explicit about why.** `truncated` also goes true
78
+ when the platform spends its budget working out which shares the caller is
79
+ entitled to see, so the note now says `matched` is a floor rather than a
80
+ total.
81
+ - **Revoking a share the token does not own explains the personal case.** The
82
+ 404 message already covered a different project and an already dead link; it
83
+ now also names a teammate's personal share, which no project token can
84
+ revoke.
85
+
3
86
  ## 6.5.0
4
87
 
5
88
  A link you shared is no longer only as findable as the response that created
package/README.md CHANGED
@@ -5,11 +5,9 @@
5
5
  [discord-image]: https://img.shields.io/discord/1253608412890271755?label=Discord&logo=discord&style=flat&color=26FFB8
6
6
  [discord-url]: https://discord.gg/v9h2RgeTSN
7
7
 
8
- <img alt="@extension.dev/mcp" src="https://media.extension.land/brand/repos/mcp/github-banner.png" />
9
-
10
8
  # @extension.dev/mcp [![Version][npm-version-image]][npm-version-url] [![Downloads][npm-downloads-image]][npm-downloads-url] [![Discord][discord-image]][discord-url]
11
9
 
12
- > Give your AI agent hands for browser extension development. 35 MCP tools that scaffold, run, inspect, debug, and publish cross-browser extensions.
10
+ > Give your AI agent hands for browser extension development. 36 MCP tools that scaffold, run, inspect, debug, and publish cross-browser extensions.
13
11
 
14
12
  <img alt="Logo" align="right" src="https://media.extension.land/brand/extension-dev/logo-dock.png" width="20.7%" />
15
13
 
@@ -129,14 +127,16 @@ cp node_modules/@extension.dev/mcp/claude/commands/*.md ~/my-extension/.claude/c
129
127
  | browsers | `extension_uninstall_browser` | Remove a managed browser binary |
130
128
  | browsers | `extension_list_browsers` | List managed browsers |
131
129
  | browsers | `extension_detect_browsers` | Detect system browsers |
132
- | platform | `extension_login` | GitHub device-code login, stored token |
130
+ | platform | `extension_login` | Device login at extension.dev, stored token |
133
131
  | platform | `extension_whoami` | Show the stored login (never the token) |
134
132
  | platform | `extension_logout` | Remove stored credentials |
135
133
  | platform | `extension_preview_web` | Render a build in the web emulator, and share it as a link |
136
134
  | platform | `extension_shares` | List every link you have shared, and revoke one permanently |
137
135
  | platform | `extension_publish` | Publish a shareable preview to extension.dev |
138
136
  | platform | `extension_release_promote` | Promote a build to a release channel, headless |
137
+ | platform | `extension_release_list` | List release channels and recent builds, to pick a valid build sha |
139
138
  | platform | `extension_deploy` | Submit to the Chrome, Firefox, and Edge stores through extension.dev |
139
+ | platform | `extension_store_status` | Read a submission's outcome, credential health, and review state |
140
140
 
141
141
  Browser-launching tools (`dev`, `start`, `preview`) shell out to the `extension` CLI, the project's own `node_modules/.bin/extension` when present, otherwise `npx extension@<pinned>` at the version this package is verified against; everything else runs in-process.
142
142
 
@@ -150,7 +150,7 @@ That is a different job from shipping. Use `share` for the build you are holding
150
150
 
151
151
  ## From preview to store
152
152
 
153
- The platform tools connect agents to [extension.dev](https://extension.dev): `extension_login` runs a GitHub device-code flow 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_deploy` 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. After a real submission, `extension_store_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.
153
+ The platform tools connect agents to [extension.dev](https://extension.dev): `extension_login` 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_deploy` 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. After a real submission, `extension_store_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.
154
154
 
155
155
  ## The extension.dev stack
156
156