@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.
Files changed (121) hide show
  1. package/dist/commands/add.d.ts.map +1 -1
  2. package/dist/commands/add.js +117 -71
  3. package/dist/commands/add.js.map +1 -1
  4. package/dist/commands/backup.d.ts.map +1 -1
  5. package/dist/commands/backup.js +27 -27
  6. package/dist/commands/backup.js.map +1 -1
  7. package/dist/commands/completion.d.ts.map +1 -1
  8. package/dist/commands/completion.js +50 -35
  9. package/dist/commands/completion.js.map +1 -1
  10. package/dist/commands/doctor.d.ts +5 -1
  11. package/dist/commands/doctor.d.ts.map +1 -1
  12. package/dist/commands/doctor.js +128 -104
  13. package/dist/commands/doctor.js.map +1 -1
  14. package/dist/commands/env-check.d.ts.map +1 -1
  15. package/dist/commands/env-check.js +63 -40
  16. package/dist/commands/env-check.js.map +1 -1
  17. package/dist/commands/export.d.ts +6 -4
  18. package/dist/commands/export.d.ts.map +1 -1
  19. package/dist/commands/export.js +52 -41
  20. package/dist/commands/export.js.map +1 -1
  21. package/dist/commands/import.d.ts.map +1 -1
  22. package/dist/commands/import.js +109 -74
  23. package/dist/commands/import.js.map +1 -1
  24. package/dist/commands/info.d.ts.map +1 -1
  25. package/dist/commands/info.js +60 -56
  26. package/dist/commands/info.js.map +1 -1
  27. package/dist/commands/init.d.ts +5 -2
  28. package/dist/commands/init.d.ts.map +1 -1
  29. package/dist/commands/init.js +189 -87
  30. package/dist/commands/init.js.map +1 -1
  31. package/dist/commands/install.d.ts.map +1 -1
  32. package/dist/commands/install.js +56 -48
  33. package/dist/commands/install.js.map +1 -1
  34. package/dist/commands/list.d.ts +5 -2
  35. package/dist/commands/list.d.ts.map +1 -1
  36. package/dist/commands/list.js +103 -45
  37. package/dist/commands/list.js.map +1 -1
  38. package/dist/commands/open.d.ts.map +1 -1
  39. package/dist/commands/open.js +31 -23
  40. package/dist/commands/open.js.map +1 -1
  41. package/dist/commands/remove.d.ts.map +1 -1
  42. package/dist/commands/remove.js +60 -43
  43. package/dist/commands/remove.js.map +1 -1
  44. package/dist/commands/reset.d.ts.map +1 -1
  45. package/dist/commands/reset.js +52 -48
  46. package/dist/commands/reset.js.map +1 -1
  47. package/dist/commands/search.d.ts.map +1 -1
  48. package/dist/commands/search.js +52 -20
  49. package/dist/commands/search.js.map +1 -1
  50. package/dist/commands/status.d.ts.map +1 -1
  51. package/dist/commands/status.js +94 -76
  52. package/dist/commands/status.js.map +1 -1
  53. package/dist/commands/toggle.d.ts.map +1 -1
  54. package/dist/commands/toggle.js +22 -24
  55. package/dist/commands/toggle.js.map +1 -1
  56. package/dist/commands/update.d.ts.map +1 -1
  57. package/dist/commands/update.js +86 -62
  58. package/dist/commands/update.js.map +1 -1
  59. package/dist/commands/validate.d.ts.map +1 -1
  60. package/dist/commands/validate.js +43 -37
  61. package/dist/commands/validate.js.map +1 -1
  62. package/dist/constants.d.ts +3 -1
  63. package/dist/constants.d.ts.map +1 -1
  64. package/dist/constants.js +377 -78
  65. package/dist/constants.js.map +1 -1
  66. package/dist/core/credentials.d.ts +15 -2
  67. package/dist/core/credentials.d.ts.map +1 -1
  68. package/dist/core/credentials.js +205 -116
  69. package/dist/core/credentials.js.map +1 -1
  70. package/dist/core/detector.d.ts +28 -2
  71. package/dist/core/detector.d.ts.map +1 -1
  72. package/dist/core/detector.js +101 -60
  73. package/dist/core/detector.js.map +1 -1
  74. package/dist/core/registry.d.ts +25 -1
  75. package/dist/core/registry.d.ts.map +1 -1
  76. package/dist/core/registry.js +45 -33
  77. package/dist/core/registry.js.map +1 -1
  78. package/dist/core/validator.d.ts +18 -2
  79. package/dist/core/validator.d.ts.map +1 -1
  80. package/dist/core/validator.js +53 -30
  81. package/dist/core/validator.js.map +1 -1
  82. package/dist/core/writer.d.ts +19 -1
  83. package/dist/core/writer.d.ts.map +1 -1
  84. package/dist/core/writer.js +41 -35
  85. package/dist/core/writer.js.map +1 -1
  86. package/dist/index.d.ts +0 -1
  87. package/dist/index.js +233 -123
  88. package/dist/index.js.map +1 -1
  89. package/dist/postinstall.js +25 -30
  90. package/dist/postinstall.js.map +1 -1
  91. package/dist/prompts/dev-prompts.d.ts +10 -2
  92. package/dist/prompts/dev-prompts.d.ts.map +1 -1
  93. package/dist/prompts/dev-prompts.js +87 -31
  94. package/dist/prompts/dev-prompts.js.map +1 -1
  95. package/dist/prompts/non-dev-prompts.d.ts +16 -2
  96. package/dist/prompts/non-dev-prompts.d.ts.map +1 -1
  97. package/dist/prompts/non-dev-prompts.js +90 -35
  98. package/dist/prompts/non-dev-prompts.js.map +1 -1
  99. package/dist/prompts/shared-prompts.d.ts +10 -1
  100. package/dist/prompts/shared-prompts.d.ts.map +1 -1
  101. package/dist/prompts/shared-prompts.js +66 -43
  102. package/dist/prompts/shared-prompts.js.map +1 -1
  103. package/dist/types.d.ts +22 -6
  104. package/dist/types.d.ts.map +1 -1
  105. package/dist/types.js +4 -2
  106. package/dist/types.js.map +1 -1
  107. package/dist/utils/fs.d.ts +36 -4
  108. package/dist/utils/fs.d.ts.map +1 -1
  109. package/dist/utils/fs.js +92 -28
  110. package/dist/utils/fs.js.map +1 -1
  111. package/dist/utils/logger.d.ts.map +1 -1
  112. package/dist/utils/logger.js +18 -24
  113. package/dist/utils/logger.js.map +1 -1
  114. package/dist/utils/network.d.ts +12 -1
  115. package/dist/utils/network.d.ts.map +1 -1
  116. package/dist/utils/network.js +37 -9
  117. package/dist/utils/network.js.map +1 -1
  118. package/dist/utils/spinner.js +10 -19
  119. package/dist/utils/spinner.js.map +1 -1
  120. package/package.json +58 -16
  121. package/src/postinstall.ts +121 -0
@@ -1,82 +1,123 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.detectOS = detectOS;
7
- exports.getGlobalVsCodeConfigPath = getGlobalVsCodeConfigPath;
8
- exports.detectVsCodePath = detectVsCodePath;
9
- exports.detectNodeVersion = detectNodeVersion;
10
- exports.isNodeVersionCompatible = isNodeVersionCompatible;
11
- exports.detectExistingMcps = detectExistingMcps;
12
- const fs_extra_1 = __importDefault(require("fs-extra"));
13
- const node_os_1 = __importDefault(require("node:os"));
14
- const node_path_1 = __importDefault(require("node:path"));
15
- const semver_1 = __importDefault(require("semver"));
16
- const constants_1 = require("../constants");
17
- const writer_1 = require("./writer");
18
- function detectOS() {
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
- function getGlobalVsCodeConfigPath(currentOs) {
28
- if (currentOs === "windows") {
29
- return node_path_1.default.join(process.env.APPDATA || node_path_1.default.join(node_os_1.default.homedir(), "AppData", "Roaming"), "Code", "User");
30
- }
31
- if (currentOs === "mac") {
32
- return node_path_1.default.join(node_os_1.default.homedir(), "Library", "Application Support", "Code", "User");
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
- async function detectVsCodePath() {
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 i = 0; i <= constants_1.VSCODE_SEARCH_DEPTH; i += 1) {
39
- const candidate = node_path_1.default.join(current, ".vscode");
40
- if (await fs_extra_1.default.pathExists(candidate)) {
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: node_path_1.default.join(candidate, "mcp.json"),
44
- source: "project"
61
+ mcpJsonPath: path.join(candidate, 'mcp.json'),
62
+ source: 'project',
45
63
  };
46
64
  }
47
- const parent = node_path_1.default.dirname(current);
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
- const globalPath = getGlobalVsCodeConfigPath(detectOS());
54
- if (await fs_extra_1.default.pathExists(globalPath)) {
55
- return {
56
- vscodeFolderPath: globalPath,
57
- mcpJsonPath: node_path_1.default.join(globalPath, "mcp.json"),
58
- source: "global"
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
- const created = node_path_1.default.join(process.cwd(), ".vscode");
62
- fs_extra_1.default.mkdirSync(created, { recursive: true });
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: created,
65
- mcpJsonPath: node_path_1.default.join(created, "mcp.json"),
66
- source: "created"
88
+ vscodeFolderPath: newVscodePath,
89
+ mcpJsonPath: path.join(newVscodePath, 'mcp.json'),
90
+ source: 'created',
67
91
  };
68
92
  }
69
- function detectNodeVersion() {
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
- function isNodeVersionCompatible() {
73
- return semver_1.default.gte(process.version, "18.0.0");
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
- async function detectExistingMcps(mcpJsonPath) {
76
- if (!(await fs_extra_1.default.pathExists(mcpJsonPath))) {
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":"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"}
1
+ {"version":3,"file":"detector.js","sourceRoot":"","sources":["../../src/core/detector.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,31 @@
1
- import { McpCategory, McpDefinition, ProfileMode } from "../types";
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,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEnE,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAEhE;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,aAAa,EAAE,CAMpE;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,WAAW,GAAG,aAAa,EAAE,CAExE;AAED,wBAAsB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAS1E;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAGxF"}
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"}
@@ -1,40 +1,52 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.getMcpById = getMcpById;
7
- exports.getMcpsForProfile = getMcpsForProfile;
8
- exports.getMcpsByCategory = getMcpsByCategory;
9
- exports.getLatestVersion = getLatestVersion;
10
- exports.enrichWithVersions = enrichWithVersions;
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
- function getMcpsForProfile(mode) {
17
- if (mode === "dev") {
18
- return constants_1.MCP_REGISTRY.filter((mcp) => !mcp.nonDevOnly);
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 constants_1.MCP_REGISTRY.filter((mcp) => !mcp.devOnly);
21
+ return MCP_REGISTRY.filter(mcp => !mcp.devOnly);
21
22
  }
22
- function getMcpsByCategory(category) {
23
- return constants_1.MCP_REGISTRY.filter((mcp) => mcp.category === category);
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
- async function getLatestVersion(npmPackage) {
26
- try {
27
- const response = await axios_1.default.get(`https://registry.npmjs.org/${npmPackage}/latest`, {
28
- timeout: 5000
29
- });
30
- return response.data.version || "unknown";
31
- }
32
- catch {
33
- return "unknown";
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
- async function enrichWithVersions(mcps) {
37
- const versions = await Promise.all(mcps.map((mcp) => getLatestVersion(mcp.npmPackage)));
38
- return mcps.map((mcp, index) => ({ ...mcp, version: versions[index] }));
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":";;;;;AAIA,gCAEC;AAED,8CAMC;AAED,8CAEC;AAED,4CASC;AAED,gDAGC;AAlCD,kDAA0B;AAC1B,4CAA4C;AAG5C,SAAgB,UAAU,CAAC,EAAU;IACnC,OAAO,wBAAY,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AACnD,CAAC;AAED,SAAgB,iBAAiB,CAAC,IAAiB;IACjD,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACnB,OAAO,wBAAY,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACvD,CAAC;IAED,OAAO,wBAAY,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACpD,CAAC;AAED,SAAgB,iBAAiB,CAAC,QAAqB;IACrD,OAAO,wBAAY,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;AACjE,CAAC;AAEM,KAAK,UAAU,gBAAgB,CAAC,UAAkB;IACvD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,GAAG,CAAuB,8BAA8B,UAAU,SAAS,EAAE;YACxG,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,IAAI,SAAS,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,kBAAkB,CAAC,IAAqB;IAC5D,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACxF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1E,CAAC"}
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"}
@@ -1,6 +1,22 @@
1
- import { McpJsonConfig } from "../types";
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
- export declare function checkNpmPackageExists(pkg: string): Promise<boolean>;
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,UAAU,CAAC;AAYzC,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,GAAG,aAAa,CAM9D;AAED,wBAAsB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO5E;AAED,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOzE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAMrE"}
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"}
@@ -1,50 +1,73 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.validateMcpJson = validateMcpJson;
7
- exports.checkNetworkReachability = checkNetworkReachability;
8
- exports.checkNpmPackageExists = checkNpmPackageExists;
9
- exports.validateEnvVar = validateEnvVar;
10
- const axios_1 = __importDefault(require("axios"));
11
- const zod_1 = require("zod");
12
- const mcpJsonSchema = zod_1.z.object({
13
- servers: zod_1.z.record(zod_1.z.object({
14
- command: zod_1.z.string(),
15
- args: zod_1.z.array(zod_1.z.string()),
16
- env: zod_1.z.record(zod_1.z.string()).optional()
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
- function validateMcpJson(config) {
20
- const result = mcpJsonSchema.safeParse(config);
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
- throw new Error(`Invalid mcp.json format: ${result.error.issues.map((i) => i.message).join(", ")}`);
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
- async function checkNetworkReachability(url) {
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 axios_1.default.head(url, { timeout: 5000 });
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
- async function checkNpmPackageExists(pkg) {
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
- const response = await axios_1.default.get(`https://registry.npmjs.org/${pkg}`, { timeout: 5000 });
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":";;;;;AAcA,0CAMC;AAED,4DAOC;AAED,sDAOC;AAED,wCAMC;AA9CD,kDAA0B;AAC1B,6BAAwB;AAGxB,MAAM,aAAa,GAAG,OAAC,CAAC,MAAM,CAAC;IAC7B,OAAO,EAAE,OAAC,CAAC,MAAM,CACf,OAAC,CAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE;QACnB,IAAI,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC;QACzB,GAAG,EAAE,OAAC,CAAC,MAAM,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;KACrC,CAAC,CACH;CACF,CAAC,CAAC;AAEH,SAAgB,eAAe,CAAC,MAAe;IAC7C,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC/C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,4BAA4B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtG,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAEM,KAAK,UAAU,wBAAwB,CAAC,GAAW;IACxD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,eAAK,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;AAEM,KAAK,UAAU,qBAAqB,CAAC,GAAW;IACrD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,GAAG,CAAC,8BAA8B,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACzF,OAAO,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAgB,cAAc,CAAC,KAAa,EAAE,KAAc;IAC1D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IACjC,CAAC;IAED,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACvC,CAAC"}
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"}
@@ -1,7 +1,25 @@
1
- import { McpJsonConfig, McpServerEntry } from "../types";
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":"AAIA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAEzD,wBAAsB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAQ7E;AAED,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAM5F;AAED,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,cAAc,GACpB,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,wBAAsB,uBAAuB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIlG;AAED,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAS9F"}
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"}
@@ -1,50 +1,56 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.readMcpJson = readMcpJson;
7
- exports.writeMcpJson = writeMcpJson;
8
- exports.addServerToMcpJson = addServerToMcpJson;
9
- exports.removeServerFromMcpJson = removeServerFromMcpJson;
10
- exports.mergeMcpJson = mergeMcpJson;
11
- const fs_extra_1 = __importDefault(require("fs-extra"));
12
- const node_path_1 = __importDefault(require("node:path"));
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
- const raw = await fs_extra_1.default.readFile(mcpJsonPath, "utf8");
20
- const parsed = JSON.parse(raw);
21
- return (0, validator_1.validateMcpJson)(parsed);
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
- async function writeMcpJson(mcpJsonPath, config) {
24
- await fs_extra_1.default.mkdirp(node_path_1.default.dirname(mcpJsonPath));
25
- const tmpPath = `${mcpJsonPath}.tmp`;
26
- await fs_extra_1.default.writeFile(tmpPath, JSON.stringify(config, null, 2), "utf8");
27
- await fs_extra_1.default.rename(tmpPath, mcpJsonPath);
28
- logger_1.log.success(`Written: ${mcpJsonPath}`);
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
- async function addServerToMcpJson(mcpJsonPath, serverId, entry) {
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
- async function removeServerFromMcpJson(mcpJsonPath, serverId) {
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
- async function mergeMcpJson(mcpJsonPath, incoming) {
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
- const merged = {
43
- servers: {
44
- ...existing.servers,
45
- ...incoming.servers
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