@extension.dev/mcp 9.0.0 → 10.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": "9.0.0",
13
+ "version": "10.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": "9.0.0",
4
+ "version": "10.0.0",
5
5
  "author": {
6
6
  "name": "Cezar Augusto",
7
7
  "email": "hello@extension.dev",
package/CHANGELOG.md CHANGED
@@ -1,5 +1,52 @@
1
1
  # Changelog
2
2
 
3
+ ## 10.0.0
4
+
5
+ Every tool now returns the same frame. Before this, 28 tools hand-built 142
6
+ different JSON shapes: `ok` appeared on 71 of them, `error` on 67, `hint` on 60,
7
+ `message` on 49, `status` on 46, and five more keys carried the same meaning
8
+ under different names. An agent could not tell success from failure without
9
+ knowing which tool it had called.
10
+
11
+ The frame is schema 1, the same one the Extension.js CLI emits under
12
+ `--output json`:
13
+
14
+ ```json
15
+ {
16
+ "schema": 1,
17
+ "ok": false,
18
+ "command": "extension_dev",
19
+ "status": "compile-failed",
20
+ "value": null,
21
+ "error": { "code": "E_FIRST_COMPILE", "message": "…" },
22
+ "hint": "…",
23
+ "warnings": []
24
+ }
25
+ ```
26
+
27
+ `command` names the tool. `status` is a kebab-case word from that tool's own
28
+ vocabulary. `error.code` is stable and worth branching on; `error.message` is
29
+ free copy and is not. The payload moved under `value`, and every advisory note
30
+ that used to have its own key is now an entry in `warnings`.
31
+
32
+ **Breaking.** Every payload key moved one level down. `build.success` is now
33
+ `ok`, `doctor.healthy` is now `ok`, `manifest_validate.valid` is now
34
+ `value.valid`, and `wait` gained the `ok` it never had. The ready contract's own
35
+ `command` is carried as `value.sessionCommand`, because the envelope claims that
36
+ key. `authorization_pending` became `authorization-pending`, with the old
37
+ spelling echoed as `value.legacyStatus` for one minor.
38
+
39
+ `extension_dev` and `extension_start` also stopped reading the dev server's
40
+ prose to decide whether the first compile failed. They poll its `ready.json`
41
+ contract instead, which splits a locked profile out of a dead browser and
42
+ returns the compile errors as a list. The output scrape survives only as a
43
+ fallback for a project whose own CLI predates the contract, is confined to one
44
+ `@deprecated` module, and says so in `warnings` whenever it is used. The choice
45
+ is a capability probe, never a version check: a project-local `extension` binary
46
+ wins over this package's pin, so the version is not knowable in advance. The
47
+ contract's own error stamps are read whatever the engine's age, so a locked
48
+ profile is named as one the moment the engine records it.
49
+
3
50
  ## 9.0.0
4
51
 
5
52
  Every client pays for this server's tool list at the start of every session,
@@ -154,7 +154,7 @@ These map directly to existing programmatic APIs and provide immediate value.
154
154
  ```json
155
155
  {
156
156
  "name": "extension_build",
157
- "description": "Build a browser extension for production. Outputs to dist/<browser>/. Optionally creates .zip for store submission.",
157
+ "description": "Build a browser extension for production. The output lands in dist/<browser>/. Pass zip:true to also package a .zip for store submission. The build refuses a manifest with build-blocking errors unless you pass skipValidation:true, because such a manifest yields a broken bundle the bundler itself never flags.",
158
158
  "inputSchema": {
159
159
  "type": "object",
160
160
  "properties": {
@@ -610,22 +610,34 @@ The `similarTemplates` field lists templates from the catalog with similar surfa
610
610
  }
611
611
  ```
612
612
 
613
- **Returns:** The `ready.json` contract:
613
+ **Returns:** The schema-1 envelope, carrying the `ready.json` contract under `value`:
614
614
 
615
615
  ```json
616
616
  {
617
+ "schema": 1,
618
+ "ok": true,
619
+ "command": "extension_wait",
617
620
  "status": "ready",
618
- "command": "dev",
619
- "browser": "chrome",
620
- "port": 8080,
621
- "pid": 12345,
622
- "distPath": "/path/to/dist/chrome",
623
- "manifestPath": "/path/to/dist/chrome/manifest.json",
624
- "compiledAt": "2026-04-14T10:30:00.000Z",
625
- "startedAt": "2026-04-14T10:29:55.000Z"
621
+ "value": {
622
+ "compiled": true,
623
+ "browserAttached": true,
624
+ "sessionCommand": "dev",
625
+ "browser": "chrome",
626
+ "port": 8080,
627
+ "pid": 12345,
628
+ "distPath": "/path/to/dist/chrome",
629
+ "manifestPath": "/path/to/dist/chrome/manifest.json",
630
+ "compiledAt": "2026-04-14T10:30:00.000Z",
631
+ "startedAt": "2026-04-14T10:29:55.000Z"
632
+ },
633
+ "error": null,
634
+ "warnings": []
626
635
  }
627
636
  ```
628
637
 
638
+ The envelope's `command` names the tool, so the ready contract's own `command`
639
+ is carried as `value.sessionCommand`.
640
+
629
641
  **Why this matters for MCP:** When Claude starts a dev session via `extension_dev`, it needs to know when the extension is actually loaded and ready before calling `extension_inspect`. This tool provides that gate.
630
642
 
631
643
  ---