@extension.dev/mcp 4.3.0 → 4.5.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.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +5 -2
- package/CHANGELOG.md +39 -0
- package/LICENSE +1 -1
- package/README.md +8 -8
- package/bin/extension-mcp.js +7 -0
- package/claude/CLAUDE.md +29 -39
- package/claude/commands/extension-debug.md +2 -3
- package/claude/rules/mcp-tools.md +68 -18
- package/dist/module.js +626 -24
- package/dist/src/lib/browser-family.d.ts +1 -0
- package/dist/src/lib/credentials.d.ts +24 -0
- package/dist/src/lib/github-device.d.ts +40 -0
- package/dist/src/lib/launch-flags.d.ts +43 -0
- package/dist/src/lib/login-flow.d.ts +40 -0
- package/dist/src/lib/publish.d.ts +31 -0
- package/dist/src/tools/build.d.ts +24 -0
- package/dist/src/tools/dev.d.ts +45 -7
- package/dist/src/tools/preview.d.ts +44 -1
- package/dist/src/tools/start.d.ts +44 -1
- package/dist/src/tools/uninstall-browser.d.ts +24 -0
- package/package.json +20 -15
- package/server.json +3 -3
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export declare const CHROMIUM_FAMILY: ReadonlySet<string>;
|
|
2
2
|
export declare const GECKO_FAMILY: ReadonlySet<string>;
|
|
3
|
+
export declare const WEBKIT_FAMILY: ReadonlySet<string>;
|
|
3
4
|
export declare function isChromiumFamily(browser: string): boolean;
|
|
4
5
|
export declare function isGeckoFamily(browser: string): boolean;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export interface StoredCredentials {
|
|
2
|
+
version: 1;
|
|
3
|
+
/** The HMAC access token the publish path sends as `Bearer`. */
|
|
4
|
+
token: string;
|
|
5
|
+
workspaceSlug: string;
|
|
6
|
+
projectSlug: string;
|
|
7
|
+
/** Token expiry as unix epoch seconds (0 if unknown). */
|
|
8
|
+
expiresAt: number;
|
|
9
|
+
/** Platform base URL the token was minted against. */
|
|
10
|
+
api: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function credentialsPath(): string;
|
|
13
|
+
export declare function readCredentials(): StoredCredentials | null;
|
|
14
|
+
export declare function writeCredentials(creds: StoredCredentials): string;
|
|
15
|
+
export declare function clearCredentials(): {
|
|
16
|
+
cleared: boolean;
|
|
17
|
+
path: string;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Return stored credentials only if the token has not expired. Used by the
|
|
21
|
+
* publish token resolution so an expired local token falls through cleanly to
|
|
22
|
+
* "no token" instead of producing a 401 from the platform.
|
|
23
|
+
*/
|
|
24
|
+
export declare function readValidCredentials(nowSeconds?: number): StoredCredentials | null;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export interface DeviceCodeStart {
|
|
2
|
+
deviceCode: string;
|
|
3
|
+
userCode: string;
|
|
4
|
+
verificationUri: string;
|
|
5
|
+
/** Minimum seconds to wait between polls. */
|
|
6
|
+
interval: number;
|
|
7
|
+
/** Seconds until the device code expires. */
|
|
8
|
+
expiresIn: number;
|
|
9
|
+
}
|
|
10
|
+
export type PollResult = {
|
|
11
|
+
ok: true;
|
|
12
|
+
githubToken: string;
|
|
13
|
+
} | {
|
|
14
|
+
ok: false;
|
|
15
|
+
reason: "pending" | "expired" | "denied";
|
|
16
|
+
error?: string;
|
|
17
|
+
};
|
|
18
|
+
type FetchImpl = typeof fetch;
|
|
19
|
+
type SleepImpl = (ms: number) => Promise<void>;
|
|
20
|
+
export declare function startDeviceCode(args: {
|
|
21
|
+
clientId: string;
|
|
22
|
+
scope?: string;
|
|
23
|
+
fetchImpl?: FetchImpl;
|
|
24
|
+
}): Promise<DeviceCodeStart>;
|
|
25
|
+
/**
|
|
26
|
+
* Poll for the access token until the budget elapses. A budget shorter than
|
|
27
|
+
* the device-code lifetime lets a caller (e.g. an MCP tool that must return
|
|
28
|
+
* promptly) poll in bounded slices and report "pending" between calls; a long
|
|
29
|
+
* budget (a blocking CLI) waits the whole time. Returns `pending` only on
|
|
30
|
+
* budget exhaustion; `expired`/`denied` are terminal.
|
|
31
|
+
*/
|
|
32
|
+
export declare function pollForToken(args: {
|
|
33
|
+
clientId: string;
|
|
34
|
+
deviceCode: string;
|
|
35
|
+
interval: number;
|
|
36
|
+
budgetMs: number;
|
|
37
|
+
fetchImpl?: FetchImpl;
|
|
38
|
+
sleepImpl?: SleepImpl;
|
|
39
|
+
}): Promise<PollResult>;
|
|
40
|
+
export {};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export declare const LAUNCH_FLAG_SCHEMA: {
|
|
2
|
+
readonly profile: {
|
|
3
|
+
readonly type: "string";
|
|
4
|
+
readonly description: "Browser profile path, or \"false\" to reuse the default user profile. Omit for a fresh throwaway profile.";
|
|
5
|
+
};
|
|
6
|
+
readonly startingUrl: {
|
|
7
|
+
readonly type: "string";
|
|
8
|
+
readonly description: "URL the browser opens on launch";
|
|
9
|
+
};
|
|
10
|
+
readonly chromiumBinary: {
|
|
11
|
+
readonly type: "string";
|
|
12
|
+
readonly description: "Path to a custom Chromium-based binary (overrides browser)";
|
|
13
|
+
};
|
|
14
|
+
readonly geckoBinary: {
|
|
15
|
+
readonly type: "string";
|
|
16
|
+
readonly description: "Path to a custom Gecko/Firefox binary (overrides browser)";
|
|
17
|
+
};
|
|
18
|
+
readonly host: {
|
|
19
|
+
readonly type: "string";
|
|
20
|
+
readonly description: "Dev server bind host. Use 0.0.0.0 for Docker or devcontainers. Defaults to 127.0.0.1";
|
|
21
|
+
};
|
|
22
|
+
readonly publicHost: {
|
|
23
|
+
readonly type: "string";
|
|
24
|
+
readonly description: "Connectable host the browser dials for HMR and reload when it differs from the bind host";
|
|
25
|
+
};
|
|
26
|
+
readonly extensions: {
|
|
27
|
+
readonly type: "array";
|
|
28
|
+
readonly items: {
|
|
29
|
+
readonly type: "string";
|
|
30
|
+
};
|
|
31
|
+
readonly description: "Companion extension paths or store URLs to load alongside the project";
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
export interface LaunchFlagArgs {
|
|
35
|
+
profile?: string;
|
|
36
|
+
startingUrl?: string;
|
|
37
|
+
chromiumBinary?: string;
|
|
38
|
+
geckoBinary?: string;
|
|
39
|
+
host?: string;
|
|
40
|
+
publicHost?: string;
|
|
41
|
+
extensions?: string[];
|
|
42
|
+
}
|
|
43
|
+
export declare function launchFlagArgs(args: LaunchFlagArgs): string[];
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { type StoredCredentials } from "./credentials";
|
|
2
|
+
type FetchImpl = typeof fetch;
|
|
3
|
+
export declare function resolveApiBase(api?: string): string;
|
|
4
|
+
/**
|
|
5
|
+
* Validate the platform base URL BEFORE we attach a bearer token to a request to
|
|
6
|
+
* it. SECURITY: the `api` arg / EXTENSION_DEV_API_URL is operator-supplied, but a
|
|
7
|
+
* hostile value (e.g. via prompt-injection in the client) could redirect the
|
|
8
|
+
* token to an attacker. The access token must never leave over plaintext or go to
|
|
9
|
+
* an arbitrary scheme, so we require https -- allowing http only for localhost
|
|
10
|
+
* dev. Returns the normalized base (no trailing slash) or an error message.
|
|
11
|
+
*/
|
|
12
|
+
export declare function safeApiBase(raw: string): {
|
|
13
|
+
ok: true;
|
|
14
|
+
base: string;
|
|
15
|
+
} | {
|
|
16
|
+
ok: false;
|
|
17
|
+
message: string;
|
|
18
|
+
};
|
|
19
|
+
export interface LoginConfig {
|
|
20
|
+
clientId: string;
|
|
21
|
+
scope: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Resolve the GitHub OAuth client id the device flow authenticates against.
|
|
25
|
+
* EXTENSION_DEV_GITHUB_CLIENT_ID overrides (useful when pointing at a self-
|
|
26
|
+
* hosted platform); otherwise it comes from the platform's public config.
|
|
27
|
+
*/
|
|
28
|
+
export declare function fetchLoginConfig(apiBase: string, fetchImpl?: FetchImpl): Promise<LoginConfig>;
|
|
29
|
+
/**
|
|
30
|
+
* Trade a verified GitHub user token for a project-scoped access token and
|
|
31
|
+
* write it to the local credentials file. Returns the stored credentials
|
|
32
|
+
* (token included for the caller's in-memory use; never logged).
|
|
33
|
+
*/
|
|
34
|
+
export declare function exchangeAndPersist(args: {
|
|
35
|
+
apiBase: string;
|
|
36
|
+
githubToken: string;
|
|
37
|
+
project: string;
|
|
38
|
+
fetchImpl?: FetchImpl;
|
|
39
|
+
}): Promise<StoredCredentials>;
|
|
40
|
+
export {};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
type FetchImpl = typeof fetch;
|
|
2
|
+
/** Resolve the access token: EXTENSION_DEV_TOKEN env first, then the login creds file. */
|
|
3
|
+
export declare function resolveToken(): string;
|
|
4
|
+
export interface PublishOptions {
|
|
5
|
+
/** Share-link lifetime in hours (1-168, platform default 24). */
|
|
6
|
+
ttlHours?: number;
|
|
7
|
+
/** Pin the share URL to a specific build sha. */
|
|
8
|
+
buildSha?: string;
|
|
9
|
+
/** Platform base URL (defaults to https://www.extension.dev or EXTENSION_DEV_API_URL). */
|
|
10
|
+
api?: string;
|
|
11
|
+
/** Explicit token; defaults to resolveToken(). */
|
|
12
|
+
token?: string;
|
|
13
|
+
fetchImpl?: FetchImpl;
|
|
14
|
+
}
|
|
15
|
+
export type PublishResult = {
|
|
16
|
+
ok: true;
|
|
17
|
+
data: Record<string, unknown>;
|
|
18
|
+
} | {
|
|
19
|
+
ok: false;
|
|
20
|
+
error: {
|
|
21
|
+
name: string;
|
|
22
|
+
message: string;
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Publish the project the token is scoped to and return the platform
|
|
27
|
+
* response (shareUrl, visibility, ...). The publish target is identified by
|
|
28
|
+
* the token's claims (workspaceSlug/projectSlug), so no project path is sent.
|
|
29
|
+
*/
|
|
30
|
+
export declare function publish(options?: PublishOptions): Promise<PublishResult>;
|
|
31
|
+
export {};
|
|
@@ -24,6 +24,26 @@ export declare const schema: {
|
|
|
24
24
|
default: boolean;
|
|
25
25
|
description: string;
|
|
26
26
|
};
|
|
27
|
+
zipFilename: {
|
|
28
|
+
type: string;
|
|
29
|
+
description: string;
|
|
30
|
+
};
|
|
31
|
+
polyfill: {
|
|
32
|
+
type: string;
|
|
33
|
+
default: boolean;
|
|
34
|
+
description: string;
|
|
35
|
+
};
|
|
36
|
+
silent: {
|
|
37
|
+
type: string;
|
|
38
|
+
default: boolean;
|
|
39
|
+
description: string;
|
|
40
|
+
};
|
|
41
|
+
mode: {
|
|
42
|
+
type: string;
|
|
43
|
+
enum: string[];
|
|
44
|
+
default: string;
|
|
45
|
+
description: string;
|
|
46
|
+
};
|
|
27
47
|
};
|
|
28
48
|
required: string[];
|
|
29
49
|
};
|
|
@@ -33,4 +53,8 @@ export declare function handler(args: {
|
|
|
33
53
|
browser?: string;
|
|
34
54
|
zip?: boolean;
|
|
35
55
|
zipSource?: boolean;
|
|
56
|
+
zipFilename?: string;
|
|
57
|
+
polyfill?: boolean;
|
|
58
|
+
silent?: boolean;
|
|
59
|
+
mode?: "development" | "production" | "none";
|
|
36
60
|
}): Promise<string>;
|
package/dist/src/tools/dev.d.ts
CHANGED
|
@@ -1,9 +1,51 @@
|
|
|
1
|
+
import { type LaunchFlagArgs } from "../lib/launch-flags";
|
|
1
2
|
export declare const schema: {
|
|
2
3
|
name: string;
|
|
3
4
|
description: string;
|
|
4
5
|
inputSchema: {
|
|
5
6
|
type: "object";
|
|
6
7
|
properties: {
|
|
8
|
+
allowControl: {
|
|
9
|
+
type: string;
|
|
10
|
+
default: boolean;
|
|
11
|
+
description: string;
|
|
12
|
+
};
|
|
13
|
+
allowEval: {
|
|
14
|
+
type: string;
|
|
15
|
+
default: boolean;
|
|
16
|
+
description: string;
|
|
17
|
+
};
|
|
18
|
+
profile: {
|
|
19
|
+
readonly type: "string";
|
|
20
|
+
readonly description: "Browser profile path, or \"false\" to reuse the default user profile. Omit for a fresh throwaway profile.";
|
|
21
|
+
};
|
|
22
|
+
startingUrl: {
|
|
23
|
+
readonly type: "string";
|
|
24
|
+
readonly description: "URL the browser opens on launch";
|
|
25
|
+
};
|
|
26
|
+
chromiumBinary: {
|
|
27
|
+
readonly type: "string";
|
|
28
|
+
readonly description: "Path to a custom Chromium-based binary (overrides browser)";
|
|
29
|
+
};
|
|
30
|
+
geckoBinary: {
|
|
31
|
+
readonly type: "string";
|
|
32
|
+
readonly description: "Path to a custom Gecko/Firefox binary (overrides browser)";
|
|
33
|
+
};
|
|
34
|
+
host: {
|
|
35
|
+
readonly type: "string";
|
|
36
|
+
readonly description: "Dev server bind host. Use 0.0.0.0 for Docker or devcontainers. Defaults to 127.0.0.1";
|
|
37
|
+
};
|
|
38
|
+
publicHost: {
|
|
39
|
+
readonly type: "string";
|
|
40
|
+
readonly description: "Connectable host the browser dials for HMR and reload when it differs from the bind host";
|
|
41
|
+
};
|
|
42
|
+
extensions: {
|
|
43
|
+
readonly type: "array";
|
|
44
|
+
readonly items: {
|
|
45
|
+
readonly type: "string";
|
|
46
|
+
};
|
|
47
|
+
readonly description: "Companion extension paths or store URLs to load alongside the project";
|
|
48
|
+
};
|
|
7
49
|
projectPath: {
|
|
8
50
|
type: string;
|
|
9
51
|
description: string;
|
|
@@ -22,12 +64,7 @@ export declare const schema: {
|
|
|
22
64
|
default: boolean;
|
|
23
65
|
description: string;
|
|
24
66
|
};
|
|
25
|
-
|
|
26
|
-
type: string;
|
|
27
|
-
default: boolean;
|
|
28
|
-
description: string;
|
|
29
|
-
};
|
|
30
|
-
allowEval: {
|
|
67
|
+
polyfill: {
|
|
31
68
|
type: string;
|
|
32
69
|
default: boolean;
|
|
33
70
|
description: string;
|
|
@@ -41,6 +78,7 @@ export declare function handler(args: {
|
|
|
41
78
|
browser?: string;
|
|
42
79
|
port?: number;
|
|
43
80
|
noBrowser?: boolean;
|
|
81
|
+
polyfill?: boolean;
|
|
44
82
|
allowControl?: boolean;
|
|
45
83
|
allowEval?: boolean;
|
|
46
|
-
}): Promise<string>;
|
|
84
|
+
} & LaunchFlagArgs): Promise<string>;
|
|
@@ -1,9 +1,41 @@
|
|
|
1
|
+
import { type LaunchFlagArgs } from "../lib/launch-flags";
|
|
1
2
|
export declare const schema: {
|
|
2
3
|
name: string;
|
|
3
4
|
description: string;
|
|
4
5
|
inputSchema: {
|
|
5
6
|
type: "object";
|
|
6
7
|
properties: {
|
|
8
|
+
profile: {
|
|
9
|
+
readonly type: "string";
|
|
10
|
+
readonly description: "Browser profile path, or \"false\" to reuse the default user profile. Omit for a fresh throwaway profile.";
|
|
11
|
+
};
|
|
12
|
+
startingUrl: {
|
|
13
|
+
readonly type: "string";
|
|
14
|
+
readonly description: "URL the browser opens on launch";
|
|
15
|
+
};
|
|
16
|
+
chromiumBinary: {
|
|
17
|
+
readonly type: "string";
|
|
18
|
+
readonly description: "Path to a custom Chromium-based binary (overrides browser)";
|
|
19
|
+
};
|
|
20
|
+
geckoBinary: {
|
|
21
|
+
readonly type: "string";
|
|
22
|
+
readonly description: "Path to a custom Gecko/Firefox binary (overrides browser)";
|
|
23
|
+
};
|
|
24
|
+
host: {
|
|
25
|
+
readonly type: "string";
|
|
26
|
+
readonly description: "Dev server bind host. Use 0.0.0.0 for Docker or devcontainers. Defaults to 127.0.0.1";
|
|
27
|
+
};
|
|
28
|
+
publicHost: {
|
|
29
|
+
readonly type: "string";
|
|
30
|
+
readonly description: "Connectable host the browser dials for HMR and reload when it differs from the bind host";
|
|
31
|
+
};
|
|
32
|
+
extensions: {
|
|
33
|
+
readonly type: "array";
|
|
34
|
+
readonly items: {
|
|
35
|
+
readonly type: "string";
|
|
36
|
+
};
|
|
37
|
+
readonly description: "Companion extension paths or store URLs to load alongside the project";
|
|
38
|
+
};
|
|
7
39
|
projectPath: {
|
|
8
40
|
type: string;
|
|
9
41
|
description: string;
|
|
@@ -13,6 +45,15 @@ export declare const schema: {
|
|
|
13
45
|
enum: string[];
|
|
14
46
|
default: string;
|
|
15
47
|
};
|
|
48
|
+
port: {
|
|
49
|
+
type: string;
|
|
50
|
+
description: string;
|
|
51
|
+
};
|
|
52
|
+
noBrowser: {
|
|
53
|
+
type: string;
|
|
54
|
+
default: boolean;
|
|
55
|
+
description: string;
|
|
56
|
+
};
|
|
16
57
|
};
|
|
17
58
|
required: string[];
|
|
18
59
|
};
|
|
@@ -20,4 +61,6 @@ export declare const schema: {
|
|
|
20
61
|
export declare function handler(args: {
|
|
21
62
|
projectPath: string;
|
|
22
63
|
browser?: string;
|
|
23
|
-
|
|
64
|
+
port?: number;
|
|
65
|
+
noBrowser?: boolean;
|
|
66
|
+
} & LaunchFlagArgs): Promise<string>;
|
|
@@ -1,9 +1,41 @@
|
|
|
1
|
+
import { type LaunchFlagArgs } from "../lib/launch-flags";
|
|
1
2
|
export declare const schema: {
|
|
2
3
|
name: string;
|
|
3
4
|
description: string;
|
|
4
5
|
inputSchema: {
|
|
5
6
|
type: "object";
|
|
6
7
|
properties: {
|
|
8
|
+
profile: {
|
|
9
|
+
readonly type: "string";
|
|
10
|
+
readonly description: "Browser profile path, or \"false\" to reuse the default user profile. Omit for a fresh throwaway profile.";
|
|
11
|
+
};
|
|
12
|
+
startingUrl: {
|
|
13
|
+
readonly type: "string";
|
|
14
|
+
readonly description: "URL the browser opens on launch";
|
|
15
|
+
};
|
|
16
|
+
chromiumBinary: {
|
|
17
|
+
readonly type: "string";
|
|
18
|
+
readonly description: "Path to a custom Chromium-based binary (overrides browser)";
|
|
19
|
+
};
|
|
20
|
+
geckoBinary: {
|
|
21
|
+
readonly type: "string";
|
|
22
|
+
readonly description: "Path to a custom Gecko/Firefox binary (overrides browser)";
|
|
23
|
+
};
|
|
24
|
+
host: {
|
|
25
|
+
readonly type: "string";
|
|
26
|
+
readonly description: "Dev server bind host. Use 0.0.0.0 for Docker or devcontainers. Defaults to 127.0.0.1";
|
|
27
|
+
};
|
|
28
|
+
publicHost: {
|
|
29
|
+
readonly type: "string";
|
|
30
|
+
readonly description: "Connectable host the browser dials for HMR and reload when it differs from the bind host";
|
|
31
|
+
};
|
|
32
|
+
extensions: {
|
|
33
|
+
readonly type: "array";
|
|
34
|
+
readonly items: {
|
|
35
|
+
readonly type: "string";
|
|
36
|
+
};
|
|
37
|
+
readonly description: "Companion extension paths or store URLs to load alongside the project";
|
|
38
|
+
};
|
|
7
39
|
projectPath: {
|
|
8
40
|
type: string;
|
|
9
41
|
description: string;
|
|
@@ -18,6 +50,15 @@ export declare const schema: {
|
|
|
18
50
|
default: boolean;
|
|
19
51
|
description: string;
|
|
20
52
|
};
|
|
53
|
+
port: {
|
|
54
|
+
type: string;
|
|
55
|
+
description: string;
|
|
56
|
+
};
|
|
57
|
+
noBrowser: {
|
|
58
|
+
type: string;
|
|
59
|
+
default: boolean;
|
|
60
|
+
description: string;
|
|
61
|
+
};
|
|
21
62
|
};
|
|
22
63
|
required: string[];
|
|
23
64
|
};
|
|
@@ -26,4 +67,6 @@ export declare function handler(args: {
|
|
|
26
67
|
projectPath: string;
|
|
27
68
|
browser?: string;
|
|
28
69
|
polyfill?: boolean;
|
|
29
|
-
|
|
70
|
+
port?: number;
|
|
71
|
+
noBrowser?: boolean;
|
|
72
|
+
} & LaunchFlagArgs): Promise<string>;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export declare const schema: {
|
|
2
|
+
name: string;
|
|
3
|
+
description: string;
|
|
4
|
+
inputSchema: {
|
|
5
|
+
type: "object";
|
|
6
|
+
properties: {
|
|
7
|
+
browser: {
|
|
8
|
+
type: string;
|
|
9
|
+
enum: string[];
|
|
10
|
+
description: string;
|
|
11
|
+
};
|
|
12
|
+
all: {
|
|
13
|
+
type: string;
|
|
14
|
+
default: boolean;
|
|
15
|
+
description: string;
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
required: never[];
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
export declare function handler(args: {
|
|
22
|
+
browser?: string;
|
|
23
|
+
all?: boolean;
|
|
24
|
+
}): Promise<string>;
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@extension.dev/mcp",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "4.
|
|
5
|
-
"description": "MCP server that lets AI agents (Claude Code, Claude Desktop, Cursor, Copilot, Codex) build, run, inspect, and publish browser extensions.
|
|
4
|
+
"version": "4.5.0",
|
|
5
|
+
"description": "MCP server that lets AI agents (Claude Code, Claude Desktop, Cursor, Copilot, Codex) build, run, inspect, and publish browser extensions. 30 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": "MIT",
|
|
8
8
|
"author": {
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
"engines": {
|
|
22
22
|
"node": ">=20.18"
|
|
23
23
|
},
|
|
24
|
+
"packageManager": "pnpm@10.19.0",
|
|
24
25
|
"exports": {
|
|
25
26
|
".": {
|
|
26
27
|
"types": "./dist/module.d.ts",
|
|
@@ -42,8 +43,20 @@
|
|
|
42
43
|
"CHANGELOG.md",
|
|
43
44
|
"LICENSE"
|
|
44
45
|
],
|
|
46
|
+
"scripts": {
|
|
47
|
+
"clean": "rm -rf dist",
|
|
48
|
+
"watch": "rslib build --watch",
|
|
49
|
+
"compile": "rslib build",
|
|
50
|
+
"build": "pnpm run compile",
|
|
51
|
+
"start": "node bin/extension-mcp.js",
|
|
52
|
+
"test": "vitest run",
|
|
53
|
+
"prepack": "node scripts/readme-logo-width.mjs npm",
|
|
54
|
+
"postpack": "node scripts/readme-logo-width.mjs github",
|
|
55
|
+
"prepublishOnly": "pnpm run test && pnpm run compile"
|
|
56
|
+
},
|
|
45
57
|
"publishConfig": {
|
|
46
58
|
"access": "public",
|
|
59
|
+
"provenance": true,
|
|
47
60
|
"registry": "https://registry.npmjs.org"
|
|
48
61
|
},
|
|
49
62
|
"keywords": [
|
|
@@ -62,6 +75,7 @@
|
|
|
62
75
|
"chrome-extension",
|
|
63
76
|
"firefox-addon",
|
|
64
77
|
"edge-extension",
|
|
78
|
+
"safari-web-extension",
|
|
65
79
|
"manifest-v3",
|
|
66
80
|
"webextension",
|
|
67
81
|
"cross-browser",
|
|
@@ -70,13 +84,12 @@
|
|
|
70
84
|
"extension.js"
|
|
71
85
|
],
|
|
72
86
|
"dependencies": {
|
|
73
|
-
"@extension.dev/core": "^0.2.0",
|
|
74
87
|
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
75
88
|
"browser-extension-manifest-fields": "^2.2.9",
|
|
76
89
|
"cross-spawn": "^7.0.6",
|
|
77
|
-
"extension-create": "^4.0.
|
|
78
|
-
"extension-develop": "^4.0.
|
|
79
|
-
"extension-install": "^4.0.
|
|
90
|
+
"extension-create": "^4.0.11",
|
|
91
|
+
"extension-develop": "^4.0.11",
|
|
92
|
+
"extension-install": "^4.0.11",
|
|
80
93
|
"ws": "^8.20.0"
|
|
81
94
|
},
|
|
82
95
|
"devDependencies": {
|
|
@@ -85,13 +98,5 @@
|
|
|
85
98
|
"@types/ws": "^8.18.1",
|
|
86
99
|
"typescript": "6.0.2",
|
|
87
100
|
"vitest": "^4.1.3"
|
|
88
|
-
},
|
|
89
|
-
"scripts": {
|
|
90
|
-
"clean": "rm -rf dist",
|
|
91
|
-
"watch": "rslib build --watch",
|
|
92
|
-
"compile": "rslib build",
|
|
93
|
-
"build": "pnpm run compile",
|
|
94
|
-
"start": "node bin/extension-mcp.js",
|
|
95
|
-
"test": "vitest run"
|
|
96
101
|
}
|
|
97
|
-
}
|
|
102
|
+
}
|
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. 30 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": "4.
|
|
10
|
+
"version": "4.5.0",
|
|
11
11
|
"packages": [
|
|
12
12
|
{
|
|
13
13
|
"registryType": "npm",
|
|
14
14
|
"registryBaseUrl": "https://registry.npmjs.org",
|
|
15
15
|
"identifier": "@extension.dev/mcp",
|
|
16
|
-
"version": "4.
|
|
16
|
+
"version": "4.5.0",
|
|
17
17
|
"runtimeHint": "npx",
|
|
18
18
|
"transport": {
|
|
19
19
|
"type": "stdio"
|