@extension.dev/mcp 10.10.6 → 10.10.7
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 +15 -0
- package/README.md +3 -2
- package/dist/module.js +106 -3
- package/dist/src/tools/docs-search.d.ts +30 -0
- package/package.json +2 -2
- package/server.json +3 -3
|
@@ -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.7",
|
|
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.7",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cezar Augusto",
|
|
7
7
|
"email": "hello@extension.dev",
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 10.10.7
|
|
4
|
+
|
|
5
|
+
- A share revoke now waits for a person by default, like a real store
|
|
6
|
+
submission and a promotion to stable: the first `extension_shares`
|
|
7
|
+
revoke answers `approval-required` with a link, and the same call with
|
|
8
|
+
the returned `approvalId` runs it once. A revoke cannot be undone, so
|
|
9
|
+
it is the one outward call that should never run on an agent's word
|
|
10
|
+
alone. `EXTENSION_DEV_APPROVAL_GATE=0` still turns the gate off.
|
|
11
|
+
- New tool `extension_docs_search`: keyword search over the Extension.js
|
|
12
|
+
and extension.dev docs, returning up to 8 pages with a title, URL and
|
|
13
|
+
an excerpt of at most 400 characters. It calls
|
|
14
|
+
`/api/docs/search` on extension.dev, which ranks with no model call, so
|
|
15
|
+
it is free, needs no login and is in the `local` group. Its
|
|
16
|
+
description is kept short on purpose so it costs little context.
|
|
17
|
+
|
|
3
18
|
## 10.10.6
|
|
4
19
|
|
|
5
20
|
- Tools that read a page or an extension (`extension_logs`,
|
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
# @extension.dev/mcp [![Version][npm-version-image]][npm-version-url] [![Downloads][npm-downloads-image]][npm-downloads-url] [![Discord][discord-image]][discord-url]
|
|
9
9
|
|
|
10
|
-
> Give your AI agent hands for browser extension development.
|
|
10
|
+
> Give your AI agent hands for browser extension development. 32 MCP tools that scaffold, run, inspect, debug, and publish cross-browser extensions.
|
|
11
11
|
|
|
12
12
|
<img alt="Logo" align="right" src="https://media.extension.land/brand/extension-dev/logo-dock.png" width="20.7%" />
|
|
13
13
|
|
|
@@ -151,7 +151,7 @@ Two flags (or environment variables) narrow the server before an agent sees it:
|
|
|
151
151
|
|
|
152
152
|
A refused call answers `E_TOOL_DISABLED` with the flag to change.
|
|
153
153
|
|
|
154
|
-
A real store submission
|
|
154
|
+
A real store submission, a promotion to stable and a share revoke also wait for a person by default: the first call answers `approval-required` with a link on extension.dev, a workspace member approves exactly that action, and the same call with the returned `approvalId` runs it once. `EXTENSION_DEV_APPROVAL_GATE=1` extends this to every promotion; `EXTENSION_DEV_APPROVAL_GATE=0` turns it off.
|
|
155
155
|
|
|
156
156
|
Every tool also carries MCP annotations (`readOnlyHint`, `destructiveHint`, `idempotentHint`, `openWorldHint`), so clients can auto-approve reads and ask before the rest.
|
|
157
157
|
|
|
@@ -196,6 +196,7 @@ cp node_modules/@extension.dev/mcp/claude/commands/*.md ~/my-extension/.claude/c
|
|
|
196
196
|
| ---- | ---- | ----------- |
|
|
197
197
|
| build | `extension_create` | Scaffold from a template |
|
|
198
198
|
| build | `extension_templates` | Browse 50+ templates (`list`) and read one's source (`source`) |
|
|
199
|
+
| build | `extension_docs_search` | Search the Extension.js and extension.dev docs by keyword |
|
|
199
200
|
| build | `extension_add_feature` | Add sidebar/popup/content script |
|
|
200
201
|
| build | `extension_build` | Build for production |
|
|
201
202
|
| run | `extension_dev` | Dev server with HMR |
|
package/dist/module.js
CHANGED
|
@@ -75,6 +75,12 @@ __webpack_require__.d(dev_namespaceObject, {
|
|
|
75
75
|
handler: ()=>dev_handler,
|
|
76
76
|
schema: ()=>dev_schema
|
|
77
77
|
});
|
|
78
|
+
var docs_search_namespaceObject = {};
|
|
79
|
+
__webpack_require__.r(docs_search_namespaceObject);
|
|
80
|
+
__webpack_require__.d(docs_search_namespaceObject, {
|
|
81
|
+
handler: ()=>docs_search_handler,
|
|
82
|
+
schema: ()=>docs_search_schema
|
|
83
|
+
});
|
|
78
84
|
var doctor_namespaceObject = {};
|
|
79
85
|
__webpack_require__.r(doctor_namespaceObject);
|
|
80
86
|
__webpack_require__.d(doctor_namespaceObject, {
|
|
@@ -236,7 +242,7 @@ __webpack_require__.d(workspace_create_namespaceObject, {
|
|
|
236
242
|
handler: ()=>workspace_create_handler,
|
|
237
243
|
schema: ()=>workspace_create_schema
|
|
238
244
|
});
|
|
239
|
-
var package_namespaceObject = JSON.parse('{"rE":"10.10.
|
|
245
|
+
var package_namespaceObject = JSON.parse('{"rE":"10.10.7","El":{"OP":"4.1.31"}}');
|
|
240
246
|
const ENVELOPE_SCHEMA = 1;
|
|
241
247
|
const collectWarnings = (warnings)=>{
|
|
242
248
|
if (!warnings) return [];
|
|
@@ -9930,7 +9936,10 @@ async function revokeShare(args) {
|
|
|
9930
9936
|
api: args.api
|
|
9931
9937
|
};
|
|
9932
9938
|
if (token) {
|
|
9933
|
-
const gate = await evaluateApproval(
|
|
9939
|
+
const gate = await evaluateApproval({
|
|
9940
|
+
...gateInput,
|
|
9941
|
+
enabled: approvalGateEnabled(true)
|
|
9942
|
+
});
|
|
9934
9943
|
if (gate.blocked) return gate.envelope;
|
|
9935
9944
|
}
|
|
9936
9945
|
const result = await revokeArtifact({
|
|
@@ -17939,6 +17948,95 @@ async function browsers_handler(args) {
|
|
|
17939
17948
|
});
|
|
17940
17949
|
return detectBrowsers(args.browsers);
|
|
17941
17950
|
}
|
|
17951
|
+
const docs_search_COMMAND = "extension_docs_search";
|
|
17952
|
+
const docs_search_schema = {
|
|
17953
|
+
name: docs_search_COMMAND,
|
|
17954
|
+
description: "Find pages in the Extension.js and extension.dev docs by keyword, each with a short excerpt. Use it before answering from memory on anything version-specific: a CLI flag, a manifest field across browsers, a store submission rule. Free and needs no login.",
|
|
17955
|
+
inputSchema: {
|
|
17956
|
+
type: "object",
|
|
17957
|
+
properties: {
|
|
17958
|
+
query: {
|
|
17959
|
+
type: "string",
|
|
17960
|
+
description: "What to look up, in a few words."
|
|
17961
|
+
},
|
|
17962
|
+
limit: {
|
|
17963
|
+
type: "number",
|
|
17964
|
+
minimum: 1,
|
|
17965
|
+
maximum: 8,
|
|
17966
|
+
default: 5,
|
|
17967
|
+
description: "How many pages to return, 1 to 8."
|
|
17968
|
+
},
|
|
17969
|
+
api: API_BASE
|
|
17970
|
+
},
|
|
17971
|
+
required: [
|
|
17972
|
+
"query"
|
|
17973
|
+
]
|
|
17974
|
+
}
|
|
17975
|
+
};
|
|
17976
|
+
async function docs_search_handler(args) {
|
|
17977
|
+
const query = String(args.query || "").trim();
|
|
17978
|
+
if (!query) return envelope_envelope({
|
|
17979
|
+
ok: false,
|
|
17980
|
+
command: docs_search_COMMAND,
|
|
17981
|
+
status: "bad-request",
|
|
17982
|
+
error: {
|
|
17983
|
+
code: "E_BAD_REQUEST",
|
|
17984
|
+
message: "query is required."
|
|
17985
|
+
}
|
|
17986
|
+
});
|
|
17987
|
+
const base = mcpOrigins(args.api).www.replace(/\/+$/, "");
|
|
17988
|
+
const limit = Math.min(8, Math.max(1, Math.floor(Number(args.limit) || 5)));
|
|
17989
|
+
const url = `${base}/api/docs/search?q=${encodeURIComponent(query)}&limit=${limit}`;
|
|
17990
|
+
let res;
|
|
17991
|
+
try {
|
|
17992
|
+
res = await fetch(url, {
|
|
17993
|
+
headers: {
|
|
17994
|
+
accept: "application/json"
|
|
17995
|
+
}
|
|
17996
|
+
});
|
|
17997
|
+
} catch (err) {
|
|
17998
|
+
return envelope_envelope({
|
|
17999
|
+
ok: false,
|
|
18000
|
+
command: docs_search_COMMAND,
|
|
18001
|
+
status: "network-failed",
|
|
18002
|
+
error: {
|
|
18003
|
+
code: "E_NETWORK",
|
|
18004
|
+
message: `Could not reach ${base}: ${err instanceof Error ? err.message : String(err)}`
|
|
18005
|
+
}
|
|
18006
|
+
});
|
|
18007
|
+
}
|
|
18008
|
+
let body = {};
|
|
18009
|
+
try {
|
|
18010
|
+
body = await res.json();
|
|
18011
|
+
} catch {
|
|
18012
|
+
body = {};
|
|
18013
|
+
}
|
|
18014
|
+
if (!res.ok) return envelope_envelope({
|
|
18015
|
+
ok: false,
|
|
18016
|
+
command: docs_search_COMMAND,
|
|
18017
|
+
status: 429 === res.status ? "rate-limited" : "search-failed",
|
|
18018
|
+
error: {
|
|
18019
|
+
code: "E_PLATFORM",
|
|
18020
|
+
message: body.message || `Docs search answered ${res.status}.`
|
|
18021
|
+
},
|
|
18022
|
+
...429 === res.status ? {
|
|
18023
|
+
hint: `Wait ${body.retryAfterSeconds ?? 60} seconds, or read the docs at https://extension.js.org/docs.`
|
|
18024
|
+
} : {}
|
|
18025
|
+
});
|
|
18026
|
+
const results = Array.isArray(body.results) ? body.results : [];
|
|
18027
|
+
return envelope_envelope({
|
|
18028
|
+
ok: true,
|
|
18029
|
+
command: docs_search_COMMAND,
|
|
18030
|
+
status: results.length ? "found" : "no-match",
|
|
18031
|
+
value: {
|
|
18032
|
+
query,
|
|
18033
|
+
results
|
|
18034
|
+
},
|
|
18035
|
+
...results.length ? {} : {
|
|
18036
|
+
hint: "No page matched. Try fewer or different words, or browse https://extension.js.org/docs."
|
|
18037
|
+
}
|
|
18038
|
+
});
|
|
18039
|
+
}
|
|
17942
18040
|
function typeOf(value) {
|
|
17943
18041
|
if (Array.isArray(value)) return "array";
|
|
17944
18042
|
if (null === value) return "null";
|
|
@@ -18195,6 +18293,10 @@ const TOOL_POLICY = {
|
|
|
18195
18293
|
group: "local",
|
|
18196
18294
|
annotations: reads(true)
|
|
18197
18295
|
},
|
|
18296
|
+
extension_docs_search: {
|
|
18297
|
+
group: "local",
|
|
18298
|
+
annotations: reads(true)
|
|
18299
|
+
},
|
|
18198
18300
|
extension_add_feature: {
|
|
18199
18301
|
group: "local",
|
|
18200
18302
|
annotations: reads()
|
|
@@ -18535,7 +18637,8 @@ const tools = [
|
|
|
18535
18637
|
project_create_namespaceObject,
|
|
18536
18638
|
workspace_create_namespaceObject,
|
|
18537
18639
|
browsers_namespaceObject,
|
|
18538
|
-
doctor_namespaceObject
|
|
18640
|
+
doctor_namespaceObject,
|
|
18641
|
+
docs_search_namespaceObject
|
|
18539
18642
|
];
|
|
18540
18643
|
function toolResultFrame(result, untrusted = false) {
|
|
18541
18644
|
let refused;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export declare const schema: {
|
|
2
|
+
name: string;
|
|
3
|
+
description: string;
|
|
4
|
+
inputSchema: {
|
|
5
|
+
type: "object";
|
|
6
|
+
properties: {
|
|
7
|
+
query: {
|
|
8
|
+
type: string;
|
|
9
|
+
description: string;
|
|
10
|
+
};
|
|
11
|
+
limit: {
|
|
12
|
+
type: string;
|
|
13
|
+
minimum: number;
|
|
14
|
+
maximum: number;
|
|
15
|
+
default: number;
|
|
16
|
+
description: string;
|
|
17
|
+
};
|
|
18
|
+
api: {
|
|
19
|
+
readonly type: "string";
|
|
20
|
+
readonly description: "Platform base URL (default EXTENSION_DEV_API_URL, else https://www.extension.dev)";
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
required: string[];
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
export declare function handler(args: {
|
|
27
|
+
query: string;
|
|
28
|
+
limit?: number;
|
|
29
|
+
api?: string;
|
|
30
|
+
}): Promise<string>;
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@extension.dev/mcp",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "10.10.
|
|
5
|
-
"description": "MCP server that lets AI agents (Claude Code, Claude Desktop, Cursor, Copilot, Codex) build, run, inspect, and publish browser extensions.
|
|
4
|
+
"version": "10.10.7",
|
|
5
|
+
"description": "MCP server that lets AI agents (Claude Code, Claude Desktop, Cursor, Copilot, Codex) build, run, inspect, and publish browser extensions. 32 tools for scaffolding, live DOM inspection, log streaming, and store-ready builds across Chrome, Edge, Firefox, Safari, and every Chromium- or Gecko-based browser (Brave, Opera, Vivaldi, Yandex, Waterfox, LibreWolf). Powered by extension.dev and Extension.js.",
|
|
6
6
|
"mcpName": "io.github.extensiondev/mcp",
|
|
7
7
|
"license": "Apache-2.0",
|
|
8
8
|
"author": {
|
package/server.json
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-09-29/server.schema.json",
|
|
3
3
|
"name": "io.github.extensiondev/mcp",
|
|
4
|
-
"description": "Build, run, inspect, and publish browser extensions from any MCP client.
|
|
4
|
+
"description": "Build, run, inspect, and publish browser extensions from any MCP client. 32 tools, 11 browsers.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"url": "https://github.com/extensiondev/mcp",
|
|
7
7
|
"source": "github"
|
|
8
8
|
},
|
|
9
9
|
"websiteUrl": "https://extension.dev",
|
|
10
|
-
"version": "10.10.
|
|
10
|
+
"version": "10.10.7",
|
|
11
11
|
"packages": [
|
|
12
12
|
{
|
|
13
13
|
"registryType": "npm",
|
|
14
14
|
"registryBaseUrl": "https://registry.npmjs.org",
|
|
15
15
|
"identifier": "@extension.dev/mcp",
|
|
16
|
-
"version": "10.10.
|
|
16
|
+
"version": "10.10.7",
|
|
17
17
|
"runtimeHint": "npx",
|
|
18
18
|
"transport": {
|
|
19
19
|
"type": "stdio"
|