@global-packages/mcp-kit 1.0.0 → 1.0.3
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/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +117 -71
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/backup.d.ts.map +1 -1
- package/dist/commands/backup.js +27 -27
- package/dist/commands/backup.js.map +1 -1
- package/dist/commands/completion.d.ts.map +1 -1
- package/dist/commands/completion.js +50 -35
- package/dist/commands/completion.js.map +1 -1
- package/dist/commands/doctor.d.ts +5 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +128 -104
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/env-check.d.ts.map +1 -1
- package/dist/commands/env-check.js +63 -40
- package/dist/commands/env-check.js.map +1 -1
- package/dist/commands/export.d.ts +6 -4
- package/dist/commands/export.d.ts.map +1 -1
- package/dist/commands/export.js +52 -41
- package/dist/commands/export.js.map +1 -1
- package/dist/commands/import.d.ts.map +1 -1
- package/dist/commands/import.js +109 -74
- package/dist/commands/import.js.map +1 -1
- package/dist/commands/info.d.ts.map +1 -1
- package/dist/commands/info.js +60 -56
- package/dist/commands/info.js.map +1 -1
- package/dist/commands/init.d.ts +5 -2
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +189 -87
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +56 -48
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/list.d.ts +5 -2
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +103 -45
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/open.d.ts.map +1 -1
- package/dist/commands/open.js +31 -23
- package/dist/commands/open.js.map +1 -1
- package/dist/commands/remove.d.ts.map +1 -1
- package/dist/commands/remove.js +60 -43
- package/dist/commands/remove.js.map +1 -1
- package/dist/commands/reset.d.ts.map +1 -1
- package/dist/commands/reset.js +52 -48
- package/dist/commands/reset.js.map +1 -1
- package/dist/commands/search.d.ts.map +1 -1
- package/dist/commands/search.js +52 -20
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +94 -76
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/toggle.d.ts.map +1 -1
- package/dist/commands/toggle.js +22 -24
- package/dist/commands/toggle.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +86 -62
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/validate.d.ts.map +1 -1
- package/dist/commands/validate.js +43 -37
- package/dist/commands/validate.js.map +1 -1
- package/dist/constants.d.ts +3 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +377 -78
- package/dist/constants.js.map +1 -1
- package/dist/core/credentials.d.ts +15 -2
- package/dist/core/credentials.d.ts.map +1 -1
- package/dist/core/credentials.js +205 -116
- package/dist/core/credentials.js.map +1 -1
- package/dist/core/detector.d.ts +28 -2
- package/dist/core/detector.d.ts.map +1 -1
- package/dist/core/detector.js +101 -60
- package/dist/core/detector.js.map +1 -1
- package/dist/core/registry.d.ts +25 -1
- package/dist/core/registry.d.ts.map +1 -1
- package/dist/core/registry.js +45 -33
- package/dist/core/registry.js.map +1 -1
- package/dist/core/validator.d.ts +18 -2
- package/dist/core/validator.d.ts.map +1 -1
- package/dist/core/validator.js +53 -30
- package/dist/core/validator.js.map +1 -1
- package/dist/core/writer.d.ts +19 -1
- package/dist/core/writer.d.ts.map +1 -1
- package/dist/core/writer.js +41 -35
- package/dist/core/writer.js.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.js +233 -123
- package/dist/index.js.map +1 -1
- package/dist/postinstall.js +25 -30
- package/dist/postinstall.js.map +1 -1
- package/dist/prompts/dev-prompts.d.ts +10 -2
- package/dist/prompts/dev-prompts.d.ts.map +1 -1
- package/dist/prompts/dev-prompts.js +87 -31
- package/dist/prompts/dev-prompts.js.map +1 -1
- package/dist/prompts/non-dev-prompts.d.ts +16 -2
- package/dist/prompts/non-dev-prompts.d.ts.map +1 -1
- package/dist/prompts/non-dev-prompts.js +90 -35
- package/dist/prompts/non-dev-prompts.js.map +1 -1
- package/dist/prompts/shared-prompts.d.ts +10 -1
- package/dist/prompts/shared-prompts.d.ts.map +1 -1
- package/dist/prompts/shared-prompts.js +66 -43
- package/dist/prompts/shared-prompts.js.map +1 -1
- package/dist/types.d.ts +22 -6
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +4 -2
- package/dist/types.js.map +1 -1
- package/dist/utils/fs.d.ts +36 -4
- package/dist/utils/fs.d.ts.map +1 -1
- package/dist/utils/fs.js +92 -28
- package/dist/utils/fs.js.map +1 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +18 -24
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/network.d.ts +12 -1
- package/dist/utils/network.d.ts.map +1 -1
- package/dist/utils/network.js +37 -9
- package/dist/utils/network.js.map +1 -1
- package/dist/utils/spinner.js +10 -19
- package/dist/utils/spinner.js.map +1 -1
- package/package.json +58 -16
- package/src/postinstall.ts +121 -0
package/dist/core/detector.js
CHANGED
|
@@ -1,82 +1,123 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
if (process.platform === "win32") {
|
|
20
|
-
return "windows";
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import os from 'node:os';
|
|
3
|
+
import fs from 'node:fs';
|
|
4
|
+
import semver from 'semver';
|
|
5
|
+
import { VSCODE_SEARCH_DEPTH } from '../constants.js';
|
|
6
|
+
import { fileExists } from '../utils/fs.js';
|
|
7
|
+
// OS + VS Code path detector
|
|
8
|
+
/**
|
|
9
|
+
* Detect the current operating system.
|
|
10
|
+
*/
|
|
11
|
+
export function detectOS() {
|
|
12
|
+
switch (process.platform) {
|
|
13
|
+
case 'win32':
|
|
14
|
+
return 'windows';
|
|
15
|
+
case 'darwin':
|
|
16
|
+
return 'mac';
|
|
17
|
+
default:
|
|
18
|
+
return 'linux';
|
|
21
19
|
}
|
|
22
|
-
if (process.platform === "darwin") {
|
|
23
|
-
return "mac";
|
|
24
|
-
}
|
|
25
|
-
return "linux";
|
|
26
20
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
21
|
+
/**
|
|
22
|
+
* Return the OS-specific VS Code global user config directory.
|
|
23
|
+
*/
|
|
24
|
+
export function getGlobalVsCodeConfigPath(currentOS) {
|
|
25
|
+
switch (currentOS) {
|
|
26
|
+
case 'windows': {
|
|
27
|
+
const appData = process.env['APPDATA'];
|
|
28
|
+
if (!appData) {
|
|
29
|
+
throw new Error('APPDATA environment variable is not set');
|
|
30
|
+
}
|
|
31
|
+
return path.join(appData, 'Code', 'User');
|
|
32
|
+
}
|
|
33
|
+
case 'mac':
|
|
34
|
+
return path.join(os.homedir(), 'Library', 'Application Support', 'Code', 'User');
|
|
35
|
+
case 'linux':
|
|
36
|
+
default:
|
|
37
|
+
return path.join(os.homedir(), '.config', 'Code', 'User');
|
|
33
38
|
}
|
|
34
|
-
return node_path_1.default.join(node_os_1.default.homedir(), ".config", "Code", "User");
|
|
35
39
|
}
|
|
36
|
-
|
|
40
|
+
/**
|
|
41
|
+
* Detect the best .vscode folder to use, in priority order:
|
|
42
|
+
* 1. Walk up from cwd looking for a .vscode folder (project-local),
|
|
43
|
+
* but SKIP ~/.vscode - that's VS Code's extension storage, not a project config.
|
|
44
|
+
* 2. Check the OS-level VS Code user config directory (global):
|
|
45
|
+
* - mac: ~/Library/Application Support/Code/User/mcp.json
|
|
46
|
+
* - windows: %APPDATA%\Code\User\mcp.json
|
|
47
|
+
* - linux: ~/.config/Code/User/mcp.json
|
|
48
|
+
* 3. Create a .vscode folder in cwd (fallback).
|
|
49
|
+
*/
|
|
50
|
+
export async function detectVsCodePath() {
|
|
51
|
+
const homeDir = os.homedir();
|
|
52
|
+
// Step 1 - walk up from cwd, but skip the bare ~/.vscode directory.
|
|
53
|
+
// ~/.vscode is where VS Code stores extensions; it is NOT a project config.
|
|
37
54
|
let current = process.cwd();
|
|
38
|
-
for (let
|
|
39
|
-
const candidate =
|
|
40
|
-
|
|
55
|
+
for (let depth = 0; depth < VSCODE_SEARCH_DEPTH; depth++) {
|
|
56
|
+
const candidate = path.join(current, '.vscode');
|
|
57
|
+
const isHomeDotVscode = path.resolve(candidate) === path.resolve(path.join(homeDir, '.vscode'));
|
|
58
|
+
if (!isHomeDotVscode && (await fileExists(candidate))) {
|
|
41
59
|
return {
|
|
42
60
|
vscodeFolderPath: candidate,
|
|
43
|
-
mcpJsonPath:
|
|
44
|
-
source:
|
|
61
|
+
mcpJsonPath: path.join(candidate, 'mcp.json'),
|
|
62
|
+
source: 'project',
|
|
45
63
|
};
|
|
46
64
|
}
|
|
47
|
-
const parent =
|
|
48
|
-
if (parent === current)
|
|
49
|
-
break;
|
|
50
|
-
}
|
|
65
|
+
const parent = path.dirname(current);
|
|
66
|
+
if (parent === current)
|
|
67
|
+
break; // filesystem root
|
|
51
68
|
current = parent;
|
|
52
69
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
70
|
+
// Step 2 - check OS global VS Code config path
|
|
71
|
+
try {
|
|
72
|
+
const globalPath = getGlobalVsCodeConfigPath(detectOS());
|
|
73
|
+
if (await fileExists(globalPath)) {
|
|
74
|
+
return {
|
|
75
|
+
vscodeFolderPath: globalPath,
|
|
76
|
+
mcpJsonPath: path.join(globalPath, 'mcp.json'),
|
|
77
|
+
source: 'global',
|
|
78
|
+
};
|
|
79
|
+
}
|
|
60
80
|
}
|
|
61
|
-
|
|
62
|
-
|
|
81
|
+
catch {
|
|
82
|
+
// APPDATA not set or path check failed - fall through to Step 3
|
|
83
|
+
}
|
|
84
|
+
// Step 3 - create .vscode in cwd
|
|
85
|
+
const newVscodePath = path.join(process.cwd(), '.vscode');
|
|
86
|
+
fs.mkdirSync(newVscodePath, { recursive: true });
|
|
63
87
|
return {
|
|
64
|
-
vscodeFolderPath:
|
|
65
|
-
mcpJsonPath:
|
|
66
|
-
source:
|
|
88
|
+
vscodeFolderPath: newVscodePath,
|
|
89
|
+
mcpJsonPath: path.join(newVscodePath, 'mcp.json'),
|
|
90
|
+
source: 'created',
|
|
67
91
|
};
|
|
68
92
|
}
|
|
69
|
-
|
|
93
|
+
/**
|
|
94
|
+
* Return the running Node.js version string (e.g. "v20.11.0").
|
|
95
|
+
*/
|
|
96
|
+
export function detectNodeVersion() {
|
|
70
97
|
return process.version;
|
|
71
98
|
}
|
|
72
|
-
|
|
73
|
-
|
|
99
|
+
/**
|
|
100
|
+
* Return true if the current Node.js version satisfies >= 18.0.0.
|
|
101
|
+
*/
|
|
102
|
+
export function isNodeVersionCompatible() {
|
|
103
|
+
const version = process.version.replace(/^v/, '');
|
|
104
|
+
return semver.gte(version, '18.0.0');
|
|
74
105
|
}
|
|
75
|
-
|
|
76
|
-
|
|
106
|
+
/**
|
|
107
|
+
* Return the list of MCP server IDs currently present in an mcp.json file.
|
|
108
|
+
* Returns an empty array if the file does not exist or cannot be parsed.
|
|
109
|
+
*/
|
|
110
|
+
export async function detectExistingMcps(mcpJsonPath) {
|
|
111
|
+
try {
|
|
112
|
+
const { readFile } = await import('node:fs/promises');
|
|
113
|
+
const raw = await readFile(mcpJsonPath, 'utf-8').catch(() => null);
|
|
114
|
+
if (!raw)
|
|
115
|
+
return [];
|
|
116
|
+
const parsed = JSON.parse(raw);
|
|
117
|
+
return Object.keys(parsed.servers ?? {});
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
77
120
|
return [];
|
|
78
121
|
}
|
|
79
|
-
const config = await (0, writer_1.readMcpJson)(mcpJsonPath);
|
|
80
|
-
return Object.keys(config.servers);
|
|
81
122
|
}
|
|
82
123
|
//# sourceMappingURL=detector.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detector.js","sourceRoot":"","sources":["../../src/core/detector.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"detector.js","sourceRoot":"","sources":["../../src/core/detector.ts"],"names":[],"mappings":"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"}
|
package/dist/core/registry.d.ts
CHANGED
|
@@ -1,7 +1,31 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { McpDefinition, McpCategory, ProfileMode } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Look up an MCP definition by its slug ID.
|
|
4
|
+
*/
|
|
2
5
|
export declare function getMcpById(id: string): McpDefinition | undefined;
|
|
6
|
+
/**
|
|
7
|
+
* Return all MCPs appropriate for the given profile mode.
|
|
8
|
+
* - dev: all MCPs where nonDevOnly === false
|
|
9
|
+
* - non-dev: all MCPs where devOnly === false
|
|
10
|
+
*/
|
|
3
11
|
export declare function getMcpsForProfile(mode: ProfileMode): McpDefinition[];
|
|
12
|
+
/**
|
|
13
|
+
* Return all MCPs in the given category.
|
|
14
|
+
*/
|
|
4
15
|
export declare function getMcpsByCategory(category: McpCategory): McpDefinition[];
|
|
16
|
+
/**
|
|
17
|
+
* Return only the default MCPs for a profile (the pre-selected defaults
|
|
18
|
+
* listed in DEV_MCP_IDS / NON_DEV_MCP_IDS).
|
|
19
|
+
*/
|
|
20
|
+
export declare function getDefaultMcpIds(mode: ProfileMode): string[];
|
|
21
|
+
/**
|
|
22
|
+
* Fetch the latest published version of an npm package from the npm registry.
|
|
23
|
+
* Returns "unknown" on any network error.
|
|
24
|
+
*/
|
|
5
25
|
export declare function getLatestVersion(npmPackage: string): Promise<string>;
|
|
26
|
+
/**
|
|
27
|
+
* Enrich a list of McpDefinition objects with their latest npm versions.
|
|
28
|
+
* All version lookups run in parallel.
|
|
29
|
+
*/
|
|
6
30
|
export declare function enrichWithVersions(mcps: McpDefinition[]): Promise<McpDefinition[]>;
|
|
7
31
|
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/core/registry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/core/registry.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAM3E;;GAEG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAEhE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,aAAa,EAAE,CAKpE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,WAAW,GAAG,aAAa,EAAE,CAExE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,EAAE,CAE5D;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAG1E;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,aAAa,EAAE,GACpB,OAAO,CAAC,aAAa,EAAE,CAAC,CAK1B"}
|
package/dist/core/registry.js
CHANGED
|
@@ -1,40 +1,52 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
const axios_1 = __importDefault(require("axios"));
|
|
12
|
-
const constants_1 = require("../constants");
|
|
13
|
-
function getMcpById(id) {
|
|
14
|
-
return constants_1.MCP_REGISTRY.find((mcp) => mcp.id === id);
|
|
1
|
+
import { MCP_REGISTRY, DEV_MCP_IDS, NON_DEV_MCP_IDS } from '../constants.js';
|
|
2
|
+
import { getNpmPackageVersion } from '../utils/network.js';
|
|
3
|
+
//
|
|
4
|
+
// MCP catalog manager
|
|
5
|
+
//
|
|
6
|
+
/**
|
|
7
|
+
* Look up an MCP definition by its slug ID.
|
|
8
|
+
*/
|
|
9
|
+
export function getMcpById(id) {
|
|
10
|
+
return MCP_REGISTRY.find(mcp => mcp.id === id);
|
|
15
11
|
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
12
|
+
/**
|
|
13
|
+
* Return all MCPs appropriate for the given profile mode.
|
|
14
|
+
* - dev: all MCPs where nonDevOnly === false
|
|
15
|
+
* - non-dev: all MCPs where devOnly === false
|
|
16
|
+
*/
|
|
17
|
+
export function getMcpsForProfile(mode) {
|
|
18
|
+
if (mode === 'dev') {
|
|
19
|
+
return MCP_REGISTRY.filter(mcp => !mcp.nonDevOnly);
|
|
19
20
|
}
|
|
20
|
-
return
|
|
21
|
+
return MCP_REGISTRY.filter(mcp => !mcp.devOnly);
|
|
21
22
|
}
|
|
22
|
-
|
|
23
|
-
|
|
23
|
+
/**
|
|
24
|
+
* Return all MCPs in the given category.
|
|
25
|
+
*/
|
|
26
|
+
export function getMcpsByCategory(category) {
|
|
27
|
+
return MCP_REGISTRY.filter(mcp => mcp.category === category);
|
|
24
28
|
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
29
|
+
/**
|
|
30
|
+
* Return only the default MCPs for a profile (the pre-selected defaults
|
|
31
|
+
* listed in DEV_MCP_IDS / NON_DEV_MCP_IDS).
|
|
32
|
+
*/
|
|
33
|
+
export function getDefaultMcpIds(mode) {
|
|
34
|
+
return mode === 'dev' ? DEV_MCP_IDS : NON_DEV_MCP_IDS;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Fetch the latest published version of an npm package from the npm registry.
|
|
38
|
+
* Returns "unknown" on any network error.
|
|
39
|
+
*/
|
|
40
|
+
export async function getLatestVersion(npmPackage) {
|
|
41
|
+
const version = await getNpmPackageVersion(npmPackage);
|
|
42
|
+
return version ?? 'unknown';
|
|
35
43
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
44
|
+
/**
|
|
45
|
+
* Enrich a list of McpDefinition objects with their latest npm versions.
|
|
46
|
+
* All version lookups run in parallel.
|
|
47
|
+
*/
|
|
48
|
+
export async function enrichWithVersions(mcps) {
|
|
49
|
+
const versions = await Promise.all(mcps.map(mcp => getLatestVersion(mcp.npmPackage)));
|
|
50
|
+
return mcps.map((mcp, i) => ({ ...mcp, version: versions[i] }));
|
|
39
51
|
}
|
|
40
52
|
//# sourceMappingURL=registry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/core/registry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/core/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAG3D,EAAE;AACF,sBAAsB;AACtB,EAAE;AAEF;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,EAAU;IACnC,OAAO,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AACjD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAiB;IACjD,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACnB,OAAO,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAqB;IACrD,OAAO,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;AAC/D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAiB;IAChD,OAAO,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC;AACxD,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,UAAkB;IACvD,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,UAAU,CAAC,CAAC;IACvD,OAAO,OAAO,IAAI,SAAS,CAAC;AAC9B,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,IAAqB;IAErB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAChC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAClD,CAAC;IACF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAClE,CAAC"}
|
package/dist/core/validator.d.ts
CHANGED
|
@@ -1,6 +1,22 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { checkNpmPackageExists } from '../utils/network.js';
|
|
2
|
+
import type { McpJsonConfig } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Validate an unknown value against the mcp.json schema.
|
|
5
|
+
* Throws a descriptive ZodError if the input is invalid.
|
|
6
|
+
*/
|
|
2
7
|
export declare function validateMcpJson(config: unknown): McpJsonConfig;
|
|
8
|
+
/**
|
|
9
|
+
* Check whether a URL is reachable. Returns true on a 2xx response.
|
|
10
|
+
*/
|
|
3
11
|
export declare function checkNetworkReachability(url: string): Promise<boolean>;
|
|
4
|
-
|
|
12
|
+
/**
|
|
13
|
+
* Check whether an npm package exists in the public registry.
|
|
14
|
+
*/
|
|
15
|
+
export { checkNpmPackageExists };
|
|
16
|
+
/**
|
|
17
|
+
* Validate a single env var value.
|
|
18
|
+
* - If no regex is provided: passes when the trimmed value is non-empty.
|
|
19
|
+
* - If a regex is provided: passes when the value matches the regex.
|
|
20
|
+
*/
|
|
5
21
|
export declare function validateEnvVar(value: string, regex?: string): boolean;
|
|
6
22
|
//# sourceMappingURL=validator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/core/validator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/core/validator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AA+BjD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,GAAG,aAAa,CAS9D;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO5E;AAED;;GAEG;AACH,OAAO,EAAE,qBAAqB,EAAE,CAAC;AAEjC;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CASrE"}
|
package/dist/core/validator.js
CHANGED
|
@@ -1,50 +1,73 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import axios from 'axios';
|
|
3
|
+
import { checkNpmPackageExists } from '../utils/network.js';
|
|
4
|
+
//
|
|
5
|
+
// Zod schema for mcp.json validation
|
|
6
|
+
//
|
|
7
|
+
const McpServerEntrySchema = z.object({
|
|
8
|
+
type: z.string().optional(),
|
|
9
|
+
command: z.string().min(1, 'command must be a non-empty string'),
|
|
10
|
+
args: z.array(z.string()),
|
|
11
|
+
env: z.record(z.string()).optional(),
|
|
12
|
+
});
|
|
13
|
+
const McpJsonConfigSchema = z.object({
|
|
14
|
+
inputs: z
|
|
15
|
+
.array(z.object({
|
|
16
|
+
id: z.string(),
|
|
17
|
+
type: z.string(),
|
|
18
|
+
description: z.string(),
|
|
19
|
+
password: z.boolean().optional(),
|
|
17
20
|
}))
|
|
21
|
+
.optional(),
|
|
22
|
+
servers: z.record(McpServerEntrySchema),
|
|
18
23
|
});
|
|
19
|
-
|
|
20
|
-
|
|
24
|
+
//
|
|
25
|
+
// Public API
|
|
26
|
+
//
|
|
27
|
+
/**
|
|
28
|
+
* Validate an unknown value against the mcp.json schema.
|
|
29
|
+
* Throws a descriptive ZodError if the input is invalid.
|
|
30
|
+
*/
|
|
31
|
+
export function validateMcpJson(config) {
|
|
32
|
+
const result = McpJsonConfigSchema.safeParse(config);
|
|
21
33
|
if (!result.success) {
|
|
22
|
-
|
|
34
|
+
const messages = result.error.errors
|
|
35
|
+
.map(e => `${e.path.join('.')}: ${e.message}`)
|
|
36
|
+
.join('\n');
|
|
37
|
+
throw new Error(`Invalid mcp.json structure:\n${messages}`);
|
|
23
38
|
}
|
|
24
39
|
return result.data;
|
|
25
40
|
}
|
|
26
|
-
|
|
41
|
+
/**
|
|
42
|
+
* Check whether a URL is reachable. Returns true on a 2xx response.
|
|
43
|
+
*/
|
|
44
|
+
export async function checkNetworkReachability(url) {
|
|
27
45
|
try {
|
|
28
|
-
const response = await
|
|
46
|
+
const response = await axios.head(url, { timeout: 5000 });
|
|
29
47
|
return response.status >= 200 && response.status < 300;
|
|
30
48
|
}
|
|
31
49
|
catch {
|
|
32
50
|
return false;
|
|
33
51
|
}
|
|
34
52
|
}
|
|
35
|
-
|
|
53
|
+
/**
|
|
54
|
+
* Check whether an npm package exists in the public registry.
|
|
55
|
+
*/
|
|
56
|
+
export { checkNpmPackageExists };
|
|
57
|
+
/**
|
|
58
|
+
* Validate a single env var value.
|
|
59
|
+
* - If no regex is provided: passes when the trimmed value is non-empty.
|
|
60
|
+
* - If a regex is provided: passes when the value matches the regex.
|
|
61
|
+
*/
|
|
62
|
+
export function validateEnvVar(value, regex) {
|
|
63
|
+
if (!regex) {
|
|
64
|
+
return value.trim().length > 0;
|
|
65
|
+
}
|
|
36
66
|
try {
|
|
37
|
-
|
|
38
|
-
return response.status === 200;
|
|
67
|
+
return new RegExp(regex).test(value);
|
|
39
68
|
}
|
|
40
69
|
catch {
|
|
41
|
-
return false;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
function validateEnvVar(value, regex) {
|
|
45
|
-
if (!regex) {
|
|
46
70
|
return value.trim().length > 0;
|
|
47
71
|
}
|
|
48
|
-
return new RegExp(regex).test(value);
|
|
49
72
|
}
|
|
50
73
|
//# sourceMappingURL=validator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/core/validator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/core/validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAG5D,EAAE;AACF,qCAAqC;AACrC,EAAE;AAEF,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,oCAAoC,CAAC;IAChE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACzB,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CACrC,CAAC,CAAC;AAEH,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,MAAM,EAAE,CAAC;SACN,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;QACP,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;QACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;QACvB,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;KACjC,CAAC,CACH;SACA,QAAQ,EAAE;IACb,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,oBAAoB,CAAC;CACxC,CAAC,CAAC;AAEH,EAAE;AACF,aAAa;AACb,EAAE;AAEF;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,MAAe;IAC7C,MAAM,MAAM,GAAG,mBAAmB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACrD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM;aACjC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;aAC7C,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,gCAAgC,QAAQ,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,MAAM,CAAC,IAAqB,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,GAAW;IACxD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,OAAO,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,OAAO,EAAE,qBAAqB,EAAE,CAAC;AAEjC;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa,EAAE,KAAc;IAC1D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IACjC,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IACjC,CAAC;AACH,CAAC"}
|
package/dist/core/writer.d.ts
CHANGED
|
@@ -1,7 +1,25 @@
|
|
|
1
|
-
import { McpJsonConfig, McpServerEntry } from
|
|
1
|
+
import type { McpJsonConfig, McpServerEntry } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Read mcp.json from disk. Returns { servers: {} } if the file does not
|
|
4
|
+
* exist. Throws if the file exists but cannot be parsed.
|
|
5
|
+
*/
|
|
2
6
|
export declare function readMcpJson(mcpJsonPath: string): Promise<McpJsonConfig>;
|
|
7
|
+
/**
|
|
8
|
+
* Write mcp.json to disk atomically (write to .tmp then rename).
|
|
9
|
+
* Logs the path on success.
|
|
10
|
+
*/
|
|
3
11
|
export declare function writeMcpJson(mcpJsonPath: string, config: McpJsonConfig): Promise<void>;
|
|
12
|
+
/**
|
|
13
|
+
* Add or overwrite a single MCP server entry in mcp.json.
|
|
14
|
+
*/
|
|
4
15
|
export declare function addServerToMcpJson(mcpJsonPath: string, serverId: string, entry: McpServerEntry): Promise<void>;
|
|
16
|
+
/**
|
|
17
|
+
* Remove a single MCP server entry from mcp.json.
|
|
18
|
+
*/
|
|
5
19
|
export declare function removeServerFromMcpJson(mcpJsonPath: string, serverId: string): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* Merge an incoming McpJsonConfig into the existing one.
|
|
22
|
+
* Incoming servers win on key conflict.
|
|
23
|
+
*/
|
|
6
24
|
export declare function mergeMcpJson(mcpJsonPath: string, incoming: McpJsonConfig): Promise<void>;
|
|
7
25
|
//# sourceMappingURL=writer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../../src/core/writer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../../src/core/writer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAMjE;;;GAGG;AACH,wBAAsB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAW7E;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,IAAI,CAAC,CAGf;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,cAAc,GACpB,OAAO,CAAC,IAAI,CAAC,CAIf;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAIf;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,aAAa,GACtB,OAAO,CAAC,IAAI,CAAC,CAOf"}
|
package/dist/core/writer.js
CHANGED
|
@@ -1,50 +1,56 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
const logger_1 = require("../utils/logger");
|
|
14
|
-
const validator_1 = require("./validator");
|
|
15
|
-
async function readMcpJson(mcpJsonPath) {
|
|
16
|
-
if (!(await fs_extra_1.default.pathExists(mcpJsonPath))) {
|
|
1
|
+
import { safeReadJSON, safeWriteJSON } from '../utils/fs.js';
|
|
2
|
+
import { log } from '../utils/logger.js';
|
|
3
|
+
//
|
|
4
|
+
// mcp.json reader / writer
|
|
5
|
+
//
|
|
6
|
+
/**
|
|
7
|
+
* Read mcp.json from disk. Returns { servers: {} } if the file does not
|
|
8
|
+
* exist. Throws if the file exists but cannot be parsed.
|
|
9
|
+
*/
|
|
10
|
+
export async function readMcpJson(mcpJsonPath) {
|
|
11
|
+
const data = await safeReadJSON(mcpJsonPath);
|
|
12
|
+
if (!data) {
|
|
17
13
|
return { servers: {} };
|
|
18
14
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
15
|
+
if (typeof data !== 'object' || !('servers' in data)) {
|
|
16
|
+
throw new Error(`mcp.json at ${mcpJsonPath} is malformed - missing "servers" key`);
|
|
17
|
+
}
|
|
18
|
+
return data;
|
|
22
19
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
20
|
+
/**
|
|
21
|
+
* Write mcp.json to disk atomically (write to .tmp then rename).
|
|
22
|
+
* Logs the path on success.
|
|
23
|
+
*/
|
|
24
|
+
export async function writeMcpJson(mcpJsonPath, config) {
|
|
25
|
+
await safeWriteJSON(mcpJsonPath, config);
|
|
26
|
+
log.success(`Written: ${mcpJsonPath}`);
|
|
29
27
|
}
|
|
30
|
-
|
|
28
|
+
/**
|
|
29
|
+
* Add or overwrite a single MCP server entry in mcp.json.
|
|
30
|
+
*/
|
|
31
|
+
export async function addServerToMcpJson(mcpJsonPath, serverId, entry) {
|
|
31
32
|
const config = await readMcpJson(mcpJsonPath);
|
|
32
33
|
config.servers[serverId] = entry;
|
|
33
34
|
await writeMcpJson(mcpJsonPath, config);
|
|
34
35
|
}
|
|
35
|
-
|
|
36
|
+
/**
|
|
37
|
+
* Remove a single MCP server entry from mcp.json.
|
|
38
|
+
*/
|
|
39
|
+
export async function removeServerFromMcpJson(mcpJsonPath, serverId) {
|
|
36
40
|
const config = await readMcpJson(mcpJsonPath);
|
|
37
41
|
delete config.servers[serverId];
|
|
38
42
|
await writeMcpJson(mcpJsonPath, config);
|
|
39
43
|
}
|
|
40
|
-
|
|
44
|
+
/**
|
|
45
|
+
* Merge an incoming McpJsonConfig into the existing one.
|
|
46
|
+
* Incoming servers win on key conflict.
|
|
47
|
+
*/
|
|
48
|
+
export async function mergeMcpJson(mcpJsonPath, incoming) {
|
|
41
49
|
const existing = await readMcpJson(mcpJsonPath);
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
};
|
|
48
|
-
await writeMcpJson(mcpJsonPath, merged);
|
|
50
|
+
existing.servers = { ...existing.servers, ...incoming.servers };
|
|
51
|
+
if (incoming.inputs) {
|
|
52
|
+
existing.inputs = [...(existing.inputs ?? []), ...incoming.inputs];
|
|
53
|
+
}
|
|
54
|
+
await writeMcpJson(mcpJsonPath, existing);
|
|
49
55
|
}
|
|
50
56
|
//# sourceMappingURL=writer.js.map
|