mcp-config-ts 0.3.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/README.md +195 -0
- package/dist/__tests__/config/load.test.d.ts +2 -0
- package/dist/__tests__/config/load.test.d.ts.map +1 -0
- package/dist/__tests__/config/load.test.js +142 -0
- package/dist/__tests__/config/load.test.js.map +1 -0
- package/dist/__tests__/config/manager.test.d.ts +2 -0
- package/dist/__tests__/config/manager.test.d.ts.map +1 -0
- package/dist/__tests__/config/manager.test.js +133 -0
- package/dist/__tests__/config/manager.test.js.map +1 -0
- package/dist/__tests__/config/save.test.d.ts +2 -0
- package/dist/__tests__/config/save.test.d.ts.map +1 -0
- package/dist/__tests__/config/save.test.js +120 -0
- package/dist/__tests__/config/save.test.js.map +1 -0
- package/dist/__tests__/fixtures/fixtures.test.d.ts +2 -0
- package/dist/__tests__/fixtures/fixtures.test.d.ts.map +1 -0
- package/dist/__tests__/fixtures/fixtures.test.js +107 -0
- package/dist/__tests__/fixtures/fixtures.test.js.map +1 -0
- package/dist/__tests__/types.test.d.ts +2 -0
- package/dist/__tests__/types.test.d.ts.map +1 -0
- package/dist/__tests__/types.test.js +263 -0
- package/dist/__tests__/types.test.js.map +1 -0
- package/dist/__tests__/utils/errors.test.d.ts +2 -0
- package/dist/__tests__/utils/errors.test.d.ts.map +1 -0
- package/dist/__tests__/utils/errors.test.js +198 -0
- package/dist/__tests__/utils/errors.test.js.map +1 -0
- package/dist/__tests__/validation/validate.test.d.ts +2 -0
- package/dist/__tests__/validation/validate.test.d.ts.map +1 -0
- package/dist/__tests__/validation/validate.test.js +123 -0
- package/dist/__tests__/validation/validate.test.js.map +1 -0
- package/dist/config/load.d.ts +3 -0
- package/dist/config/load.d.ts.map +1 -0
- package/dist/config/load.js +66 -0
- package/dist/config/load.js.map +1 -0
- package/dist/config/manager.d.ts +3 -0
- package/dist/config/manager.d.ts.map +1 -0
- package/dist/config/manager.js +58 -0
- package/dist/config/manager.js.map +1 -0
- package/dist/config/operations.d.ts +6 -0
- package/dist/config/operations.d.ts.map +1 -0
- package/dist/config/operations.js +26 -0
- package/dist/config/operations.js.map +1 -0
- package/dist/config/save.d.ts +3 -0
- package/dist/config/save.d.ts.map +1 -0
- package/dist/config/save.js +40 -0
- package/dist/config/save.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +165 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/errors.d.ts +40 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +74 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/validation/json-syntax.d.ts +3 -0
- package/dist/validation/json-syntax.d.ts.map +1 -0
- package/dist/validation/json-syntax.js +44 -0
- package/dist/validation/json-syntax.js.map +1 -0
- package/dist/validation/schema.d.ts +3 -0
- package/dist/validation/schema.d.ts.map +1 -0
- package/dist/validation/schema.js +76 -0
- package/dist/validation/schema.js.map +1 -0
- package/dist/validation/validate.d.ts +5 -0
- package/dist/validation/validate.d.ts.map +1 -0
- package/dist/validation/validate.js +37 -0
- package/dist/validation/validate.js.map +1 -0
- package/package.json +34 -0
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
const os_1 = require("os");
|
|
7
|
+
const crypto_1 = require("crypto");
|
|
8
|
+
const validate_1 = require("../../validation/validate");
|
|
9
|
+
(0, vitest_1.describe)('validateConfig', () => {
|
|
10
|
+
const dirs = [];
|
|
11
|
+
(0, vitest_1.afterEach)(() => {
|
|
12
|
+
for (const dir of dirs) {
|
|
13
|
+
try {
|
|
14
|
+
(0, fs_1.rmSync)(dir, { recursive: true, force: true });
|
|
15
|
+
}
|
|
16
|
+
catch { /* ignore */ }
|
|
17
|
+
}
|
|
18
|
+
dirs.length = 0;
|
|
19
|
+
});
|
|
20
|
+
function tmpFile(content) {
|
|
21
|
+
const dir = (0, path_1.join)((0, os_1.tmpdir)(), `mcp-config-test-${(0, crypto_1.randomUUID)()}`);
|
|
22
|
+
(0, fs_1.mkdirSync)(dir, { recursive: true });
|
|
23
|
+
dirs.push(dir);
|
|
24
|
+
const file = (0, path_1.join)(dir, '.mcp.json');
|
|
25
|
+
(0, fs_1.writeFileSync)(file, content);
|
|
26
|
+
return file;
|
|
27
|
+
}
|
|
28
|
+
function makeConfig(servers, filePath, _otherKeys) {
|
|
29
|
+
return { servers, filePath, _otherKeys };
|
|
30
|
+
}
|
|
31
|
+
(0, vitest_1.it)('valid config with stdio server passes all checks', async () => {
|
|
32
|
+
const file = tmpFile(JSON.stringify({ mcpServers: { fs: { command: 'npx' } } }));
|
|
33
|
+
const config = makeConfig({ fs: { type: 'stdio', command: 'npx' } }, file);
|
|
34
|
+
const result = await (0, validate_1.validateConfig)(config);
|
|
35
|
+
(0, vitest_1.expect)(result.valid).toBe(true);
|
|
36
|
+
(0, vitest_1.expect)(result.completenessScore).toBe(100);
|
|
37
|
+
(0, vitest_1.expect)(result.summary.failed).toBe(0);
|
|
38
|
+
});
|
|
39
|
+
(0, vitest_1.it)('valid config with http server passes', async () => {
|
|
40
|
+
const file = tmpFile(JSON.stringify({ mcpServers: { r: { url: 'https://example.com' } } }));
|
|
41
|
+
const config = makeConfig({ r: { type: 'http', url: 'https://example.com' } }, file);
|
|
42
|
+
const result = await (0, validate_1.validateConfig)(config);
|
|
43
|
+
(0, vitest_1.expect)(result.valid).toBe(true);
|
|
44
|
+
});
|
|
45
|
+
(0, vitest_1.it)('file not found produces json-syntax failure', async () => {
|
|
46
|
+
const config = makeConfig({}, '/nonexistent/path/.mcp.json');
|
|
47
|
+
const result = await (0, validate_1.validateConfig)(config);
|
|
48
|
+
const syntaxCheck = result.checks.find(c => c.id === 'json-syntax');
|
|
49
|
+
(0, vitest_1.expect)(syntaxCheck?.passed).toBe(false);
|
|
50
|
+
});
|
|
51
|
+
(0, vitest_1.it)('invalid JSON produces json-syntax failure', async () => {
|
|
52
|
+
const file = tmpFile('{ this is not json }');
|
|
53
|
+
const config = makeConfig({}, file);
|
|
54
|
+
const result = await (0, validate_1.validateConfig)(config);
|
|
55
|
+
(0, vitest_1.expect)(result.valid).toBe(false);
|
|
56
|
+
const syntaxCheck = result.checks.find(c => c.id === 'json-syntax');
|
|
57
|
+
(0, vitest_1.expect)(syntaxCheck?.passed).toBe(false);
|
|
58
|
+
});
|
|
59
|
+
(0, vitest_1.it)('level 1 only includes json-syntax check', async () => {
|
|
60
|
+
const file = tmpFile(JSON.stringify({ mcpServers: {} }));
|
|
61
|
+
const config = makeConfig({}, file);
|
|
62
|
+
const result = await (0, validate_1.validateConfig)(config, { level: 1 });
|
|
63
|
+
(0, vitest_1.expect)(result.checks).toHaveLength(1);
|
|
64
|
+
(0, vitest_1.expect)(result.checks[0].id).toBe('json-syntax');
|
|
65
|
+
});
|
|
66
|
+
(0, vitest_1.it)('level 2 includes json-syntax and schema checks', async () => {
|
|
67
|
+
const file = tmpFile(JSON.stringify({ mcpServers: {} }));
|
|
68
|
+
const config = makeConfig({}, file);
|
|
69
|
+
const result = await (0, validate_1.validateConfig)(config, { level: 2 });
|
|
70
|
+
(0, vitest_1.expect)(result.checks.length).toBeGreaterThan(1);
|
|
71
|
+
(0, vitest_1.expect)(result.checks.some(c => c.id === 'json-syntax')).toBe(true);
|
|
72
|
+
(0, vitest_1.expect)(result.checks.some(c => c.id === 'has-mcp-servers')).toBe(true);
|
|
73
|
+
});
|
|
74
|
+
(0, vitest_1.it)('level 3 (default) includes all checks', async () => {
|
|
75
|
+
const file = tmpFile(JSON.stringify({ mcpServers: {} }));
|
|
76
|
+
const config = makeConfig({}, file);
|
|
77
|
+
const result = await (0, validate_1.validateConfig)(config, { level: 3 });
|
|
78
|
+
(0, vitest_1.expect)(result.checks.some(c => c.id === 'json-syntax')).toBe(true);
|
|
79
|
+
(0, vitest_1.expect)(result.checks.some(c => c.id === 'has-mcp-servers')).toBe(true);
|
|
80
|
+
(0, vitest_1.expect)(result.checks.some(c => c.id === 'url-format')).toBe(true);
|
|
81
|
+
});
|
|
82
|
+
(0, vitest_1.it)('http server with invalid URL produces url-format warning', async () => {
|
|
83
|
+
const file = tmpFile(JSON.stringify({ mcpServers: { bad: { url: 'ftp://invalid' } } }));
|
|
84
|
+
const config = makeConfig({ bad: { type: 'http', url: 'ftp://invalid' } }, file);
|
|
85
|
+
const result = await (0, validate_1.validateConfig)(config);
|
|
86
|
+
const urlCheck = result.checks.find(c => c.id === 'url-format');
|
|
87
|
+
(0, vitest_1.expect)(urlCheck?.passed).toBe(false);
|
|
88
|
+
(0, vitest_1.expect)(urlCheck?.severity).toBe('warning');
|
|
89
|
+
});
|
|
90
|
+
(0, vitest_1.it)('valid is false only when error-severity checks fail', async () => {
|
|
91
|
+
const file = tmpFile(JSON.stringify({ mcpServers: { r: { url: 'ftp://bad' } } }));
|
|
92
|
+
const config = makeConfig({ r: { type: 'http', url: 'ftp://bad' } }, file);
|
|
93
|
+
const result = await (0, validate_1.validateConfig)(config);
|
|
94
|
+
// url-format is a warning, json-syntax passes, has-mcp-servers passes
|
|
95
|
+
(0, vitest_1.expect)(result.valid).toBe(true);
|
|
96
|
+
});
|
|
97
|
+
(0, vitest_1.it)('completenessScore is reduced by warning failures', async () => {
|
|
98
|
+
const file = tmpFile(JSON.stringify({ mcpServers: { r: { url: 'ftp://bad' } } }));
|
|
99
|
+
const config = makeConfig({ r: { type: 'http', url: 'ftp://bad' } }, file);
|
|
100
|
+
const result = await (0, validate_1.validateConfig)(config);
|
|
101
|
+
(0, vitest_1.expect)(result.completenessScore).toBeLessThan(100);
|
|
102
|
+
});
|
|
103
|
+
(0, vitest_1.it)('completenessScore is 0 or clamped when many errors', async () => {
|
|
104
|
+
const config = makeConfig({}, '/nonexistent/.mcp.json');
|
|
105
|
+
const result = await (0, validate_1.validateConfig)(config);
|
|
106
|
+
(0, vitest_1.expect)(result.completenessScore).toBeGreaterThanOrEqual(0);
|
|
107
|
+
(0, vitest_1.expect)(result.completenessScore).toBeLessThanOrEqual(100);
|
|
108
|
+
});
|
|
109
|
+
(0, vitest_1.it)('configPath in result matches config.filePath', async () => {
|
|
110
|
+
const file = tmpFile(JSON.stringify({ mcpServers: {} }));
|
|
111
|
+
const config = makeConfig({}, file);
|
|
112
|
+
const result = await (0, validate_1.validateConfig)(config);
|
|
113
|
+
(0, vitest_1.expect)(result.configPath).toBe(file);
|
|
114
|
+
});
|
|
115
|
+
(0, vitest_1.it)('summary counts are correct', async () => {
|
|
116
|
+
const file = tmpFile(JSON.stringify({ mcpServers: { s: { command: 'node' } } }));
|
|
117
|
+
const config = makeConfig({ s: { type: 'stdio', command: 'node' } }, file);
|
|
118
|
+
const result = await (0, validate_1.validateConfig)(config);
|
|
119
|
+
(0, vitest_1.expect)(result.summary.total).toBe(result.checks.length);
|
|
120
|
+
(0, vitest_1.expect)(result.summary.passed + result.summary.failed).toBe(result.summary.total);
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
//# sourceMappingURL=validate.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.test.js","sourceRoot":"","sources":["../../../src/__tests__/validation/validate.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../src/config/load.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAkD,MAAM,UAAU,CAAA;AAKzF,wBAAgB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAgEzD"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.loadConfig = loadConfig;
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
const errors_1 = require("../utils/errors");
|
|
7
|
+
const DEFAULT_CONFIG_PATH = '.mcp.json';
|
|
8
|
+
function loadConfig(configPath) {
|
|
9
|
+
const filePath = (0, path_1.resolve)(configPath ?? DEFAULT_CONFIG_PATH);
|
|
10
|
+
if (!(0, fs_1.existsSync)(filePath)) {
|
|
11
|
+
throw new errors_1.ConfigNotFoundError(filePath);
|
|
12
|
+
}
|
|
13
|
+
let raw;
|
|
14
|
+
try {
|
|
15
|
+
raw = (0, fs_1.readFileSync)(filePath, 'utf-8');
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
throw new errors_1.ConfigNotFoundError(filePath);
|
|
19
|
+
}
|
|
20
|
+
let parsed;
|
|
21
|
+
try {
|
|
22
|
+
parsed = JSON.parse(raw);
|
|
23
|
+
}
|
|
24
|
+
catch (err) {
|
|
25
|
+
const syntaxErr = err instanceof SyntaxError ? err : undefined;
|
|
26
|
+
throw new errors_1.ConfigParseError(syntaxErr?.message ?? 'Failed to parse JSON', filePath, syntaxErr);
|
|
27
|
+
}
|
|
28
|
+
const { mcpServers, ...rest } = parsed;
|
|
29
|
+
const servers = {};
|
|
30
|
+
if (mcpServers != null && typeof mcpServers === 'object' && !Array.isArray(mcpServers)) {
|
|
31
|
+
for (const [name, rawEntry] of Object.entries(mcpServers)) {
|
|
32
|
+
if (rawEntry == null || typeof rawEntry !== 'object' || Array.isArray(rawEntry)) {
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
const entry = rawEntry;
|
|
36
|
+
if (typeof entry.command === 'string') {
|
|
37
|
+
const stdioEntry = { type: 'stdio', command: entry.command };
|
|
38
|
+
if (Array.isArray(entry.args))
|
|
39
|
+
stdioEntry.args = entry.args;
|
|
40
|
+
if (entry.env != null && typeof entry.env === 'object' && !Array.isArray(entry.env)) {
|
|
41
|
+
stdioEntry.env = entry.env;
|
|
42
|
+
}
|
|
43
|
+
if (typeof entry.cwd === 'string')
|
|
44
|
+
stdioEntry.cwd = entry.cwd;
|
|
45
|
+
if (typeof entry.disabled === 'boolean')
|
|
46
|
+
stdioEntry.disabled = entry.disabled;
|
|
47
|
+
servers[name] = stdioEntry;
|
|
48
|
+
}
|
|
49
|
+
else if (typeof entry.url === 'string') {
|
|
50
|
+
const httpEntry = { type: 'http', url: entry.url };
|
|
51
|
+
if (entry.headers != null && typeof entry.headers === 'object' && !Array.isArray(entry.headers)) {
|
|
52
|
+
httpEntry.headers = entry.headers;
|
|
53
|
+
}
|
|
54
|
+
if (typeof entry.disabled === 'boolean')
|
|
55
|
+
httpEntry.disabled = entry.disabled;
|
|
56
|
+
servers[name] = httpEntry;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
const config = { servers, filePath };
|
|
61
|
+
if (Object.keys(rest).length > 0) {
|
|
62
|
+
config._otherKeys = rest;
|
|
63
|
+
}
|
|
64
|
+
return config;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=load.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load.js","sourceRoot":"","sources":["../../src/config/load.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/config/manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAA4C,MAAM,UAAU,CAAA;AASvG,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,aAAa,CAyDrE"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createManager = createManager;
|
|
4
|
+
const path_1 = require("path");
|
|
5
|
+
const errors_1 = require("../utils/errors");
|
|
6
|
+
const load_1 = require("./load");
|
|
7
|
+
const save_1 = require("./save");
|
|
8
|
+
const validate_1 = require("../validation/validate");
|
|
9
|
+
const operations_1 = require("./operations");
|
|
10
|
+
const DEFAULT_CONFIG_PATH = '.mcp.json';
|
|
11
|
+
function createManager(options) {
|
|
12
|
+
const configPath = (0, path_1.resolve)(options?.configPath ?? DEFAULT_CONFIG_PATH);
|
|
13
|
+
let _config = null;
|
|
14
|
+
function assertLoaded() {
|
|
15
|
+
if (_config == null) {
|
|
16
|
+
throw new Error('Config not loaded. Call load() first.');
|
|
17
|
+
}
|
|
18
|
+
return _config;
|
|
19
|
+
}
|
|
20
|
+
return {
|
|
21
|
+
async load() {
|
|
22
|
+
_config = (0, load_1.loadConfig)(configPath);
|
|
23
|
+
},
|
|
24
|
+
async save() {
|
|
25
|
+
const config = assertLoaded();
|
|
26
|
+
(0, save_1.saveConfig)(config);
|
|
27
|
+
},
|
|
28
|
+
getConfig() {
|
|
29
|
+
return assertLoaded();
|
|
30
|
+
},
|
|
31
|
+
list() {
|
|
32
|
+
return (0, operations_1.listServers)(assertLoaded());
|
|
33
|
+
},
|
|
34
|
+
get(serverName) {
|
|
35
|
+
return (0, operations_1.getServer)(assertLoaded(), serverName);
|
|
36
|
+
},
|
|
37
|
+
add(serverName, entry) {
|
|
38
|
+
(0, operations_1.addServer)(assertLoaded(), serverName, entry);
|
|
39
|
+
},
|
|
40
|
+
addFromRegistry(_registryName, _envValues) {
|
|
41
|
+
throw new errors_1.ServerNotFoundError(_registryName);
|
|
42
|
+
},
|
|
43
|
+
remove(serverName) {
|
|
44
|
+
(0, operations_1.removeServer)(assertLoaded(), serverName);
|
|
45
|
+
},
|
|
46
|
+
async validate(opts) {
|
|
47
|
+
const config = assertLoaded();
|
|
48
|
+
const level = (opts?.level ?? 3);
|
|
49
|
+
const clampedLevel = level > 3 ? 3 : level < 1 ? 1 : level;
|
|
50
|
+
return (0, validate_1.validateConfig)(config, { level: clampedLevel });
|
|
51
|
+
},
|
|
52
|
+
has(serverName) {
|
|
53
|
+
const config = assertLoaded();
|
|
54
|
+
return Object.prototype.hasOwnProperty.call(config.servers, serverName);
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/config/manager.ts"],"names":[],"mappings":";;AAUA,sCAyDC;AAnED,+BAA8B;AAE9B,4CAAqD;AACrD,iCAAmC;AACnC,iCAAmC;AACnC,qDAAuD;AACvD,6CAA8E;AAE9E,MAAM,mBAAmB,GAAG,WAAW,CAAA;AAEvC,SAAgB,aAAa,CAAC,OAAwB;IACpD,MAAM,UAAU,GAAG,IAAA,cAAO,EAAC,OAAO,EAAE,UAAU,IAAI,mBAAmB,CAAC,CAAA;IACtE,IAAI,OAAO,GAAqB,IAAI,CAAA;IAEpC,SAAS,YAAY;QACnB,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAA;QAC1D,CAAC;QACD,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,OAAO;QACL,KAAK,CAAC,IAAI;YACR,OAAO,GAAG,IAAA,iBAAU,EAAC,UAAU,CAAC,CAAA;QAClC,CAAC;QAED,KAAK,CAAC,IAAI;YACR,MAAM,MAAM,GAAG,YAAY,EAAE,CAAA;YAC7B,IAAA,iBAAU,EAAC,MAAM,CAAC,CAAA;QACpB,CAAC;QAED,SAAS;YACP,OAAO,YAAY,EAAE,CAAA;QACvB,CAAC;QAED,IAAI;YACF,OAAO,IAAA,wBAAW,EAAC,YAAY,EAAE,CAAC,CAAA;QACpC,CAAC;QAED,GAAG,CAAC,UAAkB;YACpB,OAAO,IAAA,sBAAS,EAAC,YAAY,EAAE,EAAE,UAAU,CAAC,CAAA;QAC9C,CAAC;QAED,GAAG,CAAC,UAAkB,EAAE,KAAkB;YACxC,IAAA,sBAAS,EAAC,YAAY,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC,CAAA;QAC9C,CAAC;QAED,eAAe,CAAC,aAAqB,EAAE,UAAmC;YACxE,MAAM,IAAI,4BAAmB,CAAC,aAAa,CAAC,CAAA;QAC9C,CAAC;QAED,MAAM,CAAC,UAAkB;YACvB,IAAA,yBAAY,EAAC,YAAY,EAAE,EAAE,UAAU,CAAC,CAAA;QAC1C,CAAC;QAED,KAAK,CAAC,QAAQ,CAAC,IAAoC;YACjD,MAAM,MAAM,GAAG,YAAY,EAAE,CAAA;YAC7B,MAAM,KAAK,GAAG,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,CAAc,CAAA;YAC7C,MAAM,YAAY,GAAc,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;YACrE,OAAO,IAAA,yBAAc,EAAC,MAAM,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAA;QACxD,CAAC;QAED,GAAG,CAAC,UAAkB;YACpB,MAAM,MAAM,GAAG,YAAY,EAAE,CAAA;YAC7B,OAAO,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;QACzE,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { MCPConfig, ServerEntry } from '../types';
|
|
2
|
+
export declare function addServer(config: MCPConfig, name: string, entry: ServerEntry): void;
|
|
3
|
+
export declare function removeServer(config: MCPConfig, name: string): void;
|
|
4
|
+
export declare function getServer(config: MCPConfig, name: string): ServerEntry | undefined;
|
|
5
|
+
export declare function listServers(config: MCPConfig): string[];
|
|
6
|
+
//# sourceMappingURL=operations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operations.d.ts","sourceRoot":"","sources":["../../src/config/operations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAGtD,wBAAgB,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAKnF;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAKlE;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAElF;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,EAAE,CAEvD"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.addServer = addServer;
|
|
4
|
+
exports.removeServer = removeServer;
|
|
5
|
+
exports.getServer = getServer;
|
|
6
|
+
exports.listServers = listServers;
|
|
7
|
+
const errors_1 = require("../utils/errors");
|
|
8
|
+
function addServer(config, name, entry) {
|
|
9
|
+
if (Object.prototype.hasOwnProperty.call(config.servers, name)) {
|
|
10
|
+
throw new errors_1.ServerExistsError(name);
|
|
11
|
+
}
|
|
12
|
+
config.servers[name] = entry;
|
|
13
|
+
}
|
|
14
|
+
function removeServer(config, name) {
|
|
15
|
+
if (!Object.prototype.hasOwnProperty.call(config.servers, name)) {
|
|
16
|
+
throw new errors_1.ServerNotFoundError(name);
|
|
17
|
+
}
|
|
18
|
+
delete config.servers[name];
|
|
19
|
+
}
|
|
20
|
+
function getServer(config, name) {
|
|
21
|
+
return config.servers[name];
|
|
22
|
+
}
|
|
23
|
+
function listServers(config) {
|
|
24
|
+
return Object.keys(config.servers).sort();
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=operations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operations.js","sourceRoot":"","sources":["../../src/config/operations.ts"],"names":[],"mappings":";;AAGA,8BAKC;AAED,oCAKC;AAED,8BAEC;AAED,kCAEC;AAtBD,4CAAwE;AAExE,SAAgB,SAAS,CAAC,MAAiB,EAAE,IAAY,EAAE,KAAkB;IAC3E,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC;QAC/D,MAAM,IAAI,0BAAiB,CAAC,IAAI,CAAC,CAAA;IACnC,CAAC;IACD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAA;AAC9B,CAAC;AAED,SAAgB,YAAY,CAAC,MAAiB,EAAE,IAAY;IAC1D,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,4BAAmB,CAAC,IAAI,CAAC,CAAA;IACrC,CAAC;IACD,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;AAC7B,CAAC;AAED,SAAgB,SAAS,CAAC,MAAiB,EAAE,IAAY;IACvD,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;AAC7B,CAAC;AAED,SAAgB,WAAW,CAAC,MAAiB;IAC3C,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAA;AAC3C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"save.d.ts","sourceRoot":"","sources":["../../src/config/save.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAkD,MAAM,UAAU,CAAA;AAoBzF,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAYlD"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.saveConfig = saveConfig;
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
function serializeEntry(entry) {
|
|
7
|
+
if (entry.type === 'stdio') {
|
|
8
|
+
const e = entry;
|
|
9
|
+
const out = { command: e.command };
|
|
10
|
+
if (e.args != null)
|
|
11
|
+
out.args = e.args;
|
|
12
|
+
if (e.env != null)
|
|
13
|
+
out.env = e.env;
|
|
14
|
+
if (e.cwd != null)
|
|
15
|
+
out.cwd = e.cwd;
|
|
16
|
+
if (e.disabled != null)
|
|
17
|
+
out.disabled = e.disabled;
|
|
18
|
+
return out;
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
const e = entry;
|
|
22
|
+
const out = { url: e.url };
|
|
23
|
+
if (e.headers != null)
|
|
24
|
+
out.headers = e.headers;
|
|
25
|
+
if (e.disabled != null)
|
|
26
|
+
out.disabled = e.disabled;
|
|
27
|
+
return out;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function saveConfig(config) {
|
|
31
|
+
const dir = (0, path_1.dirname)(config.filePath);
|
|
32
|
+
(0, fs_1.mkdirSync)(dir, { recursive: true });
|
|
33
|
+
const mcpServers = {};
|
|
34
|
+
for (const [name, entry] of Object.entries(config.servers)) {
|
|
35
|
+
mcpServers[name] = serializeEntry(entry);
|
|
36
|
+
}
|
|
37
|
+
const output = { ...(config._otherKeys ?? {}), mcpServers };
|
|
38
|
+
(0, fs_1.writeFileSync)(config.filePath, JSON.stringify(output, null, 2) + '\n', 'utf-8');
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=save.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"save.js","sourceRoot":"","sources":["../../src/config/save.ts"],"names":[],"mappings":";;AAsBA,gCAYC;AAlCD,2BAA6C;AAC7C,+BAA8B;AAG9B,SAAS,cAAc,CAAC,KAAkB;IACxC,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,KAAyB,CAAA;QACnC,MAAM,GAAG,GAA4B,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAA;QAC3D,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI;YAAE,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAA;QACrC,IAAI,CAAC,CAAC,GAAG,IAAI,IAAI;YAAE,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAA;QAClC,IAAI,CAAC,CAAC,GAAG,IAAI,IAAI;YAAE,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAA;QAClC,IAAI,CAAC,CAAC,QAAQ,IAAI,IAAI;YAAE,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAA;QACjD,OAAO,GAAG,CAAA;IACZ,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,GAAG,KAAwB,CAAA;QAClC,MAAM,GAAG,GAA4B,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAA;QACnD,IAAI,CAAC,CAAC,OAAO,IAAI,IAAI;YAAE,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAA;QAC9C,IAAI,CAAC,CAAC,QAAQ,IAAI,IAAI;YAAE,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAA;QACjD,OAAO,GAAG,CAAA;IACZ,CAAC;AACH,CAAC;AAED,SAAgB,UAAU,CAAC,MAAiB;IAC1C,MAAM,GAAG,GAAG,IAAA,cAAO,EAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IACpC,IAAA,cAAS,EAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAEnC,MAAM,UAAU,GAA4B,EAAE,CAAA;IAC9C,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3D,UAAU,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,CAAA;IAC1C,CAAC;IAED,MAAM,MAAM,GAA4B,EAAE,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,CAAA;IAEpF,IAAA,kBAAa,EAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAA;AACjF,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type { StdioServerEntry, HttpServerEntry, ServerEntry, MCPConfig, ValidationCheck, ValidationResult, SyncOptions, SyncResult, ServerInfo, DiscoverOptions, ManagerOptions, ConfigManager, RegistryEntry, } from './types';
|
|
2
|
+
export { MCPConfigError, ConfigNotFoundError, ConfigParseError, ServerExistsError, ServerNotFoundError, ValidationError, } from './utils/errors';
|
|
3
|
+
export { loadConfig } from './config/load';
|
|
4
|
+
export { saveConfig } from './config/save';
|
|
5
|
+
export { addServer, removeServer, getServer, listServers } from './config/operations';
|
|
6
|
+
export { createManager } from './config/manager';
|
|
7
|
+
export { validateConfig } from './validation/validate';
|
|
8
|
+
export { validateJsonSyntax } from './validation/json-syntax';
|
|
9
|
+
export { validateSchema } from './validation/schema';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,SAAS,EACT,eAAe,EACf,gBAAgB,EAChB,WAAW,EACX,UAAU,EACV,UAAU,EACV,eAAe,EACf,cAAc,EACd,aAAa,EACb,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,GAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateSchema = exports.validateJsonSyntax = exports.validateConfig = exports.createManager = exports.listServers = exports.getServer = exports.removeServer = exports.addServer = exports.saveConfig = exports.loadConfig = exports.ValidationError = exports.ServerNotFoundError = exports.ServerExistsError = exports.ConfigParseError = exports.ConfigNotFoundError = exports.MCPConfigError = void 0;
|
|
4
|
+
var errors_1 = require("./utils/errors");
|
|
5
|
+
Object.defineProperty(exports, "MCPConfigError", { enumerable: true, get: function () { return errors_1.MCPConfigError; } });
|
|
6
|
+
Object.defineProperty(exports, "ConfigNotFoundError", { enumerable: true, get: function () { return errors_1.ConfigNotFoundError; } });
|
|
7
|
+
Object.defineProperty(exports, "ConfigParseError", { enumerable: true, get: function () { return errors_1.ConfigParseError; } });
|
|
8
|
+
Object.defineProperty(exports, "ServerExistsError", { enumerable: true, get: function () { return errors_1.ServerExistsError; } });
|
|
9
|
+
Object.defineProperty(exports, "ServerNotFoundError", { enumerable: true, get: function () { return errors_1.ServerNotFoundError; } });
|
|
10
|
+
Object.defineProperty(exports, "ValidationError", { enumerable: true, get: function () { return errors_1.ValidationError; } });
|
|
11
|
+
var load_1 = require("./config/load");
|
|
12
|
+
Object.defineProperty(exports, "loadConfig", { enumerable: true, get: function () { return load_1.loadConfig; } });
|
|
13
|
+
var save_1 = require("./config/save");
|
|
14
|
+
Object.defineProperty(exports, "saveConfig", { enumerable: true, get: function () { return save_1.saveConfig; } });
|
|
15
|
+
var operations_1 = require("./config/operations");
|
|
16
|
+
Object.defineProperty(exports, "addServer", { enumerable: true, get: function () { return operations_1.addServer; } });
|
|
17
|
+
Object.defineProperty(exports, "removeServer", { enumerable: true, get: function () { return operations_1.removeServer; } });
|
|
18
|
+
Object.defineProperty(exports, "getServer", { enumerable: true, get: function () { return operations_1.getServer; } });
|
|
19
|
+
Object.defineProperty(exports, "listServers", { enumerable: true, get: function () { return operations_1.listServers; } });
|
|
20
|
+
var manager_1 = require("./config/manager");
|
|
21
|
+
Object.defineProperty(exports, "createManager", { enumerable: true, get: function () { return manager_1.createManager; } });
|
|
22
|
+
var validate_1 = require("./validation/validate");
|
|
23
|
+
Object.defineProperty(exports, "validateConfig", { enumerable: true, get: function () { return validate_1.validateConfig; } });
|
|
24
|
+
var json_syntax_1 = require("./validation/json-syntax");
|
|
25
|
+
Object.defineProperty(exports, "validateJsonSyntax", { enumerable: true, get: function () { return json_syntax_1.validateJsonSyntax; } });
|
|
26
|
+
var schema_1 = require("./validation/schema");
|
|
27
|
+
Object.defineProperty(exports, "validateSchema", { enumerable: true, get: function () { return schema_1.validateSchema; } });
|
|
28
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAgBA,yCAOwB;AANtB,wGAAA,cAAc,OAAA;AACd,6GAAA,mBAAmB,OAAA;AACnB,0GAAA,gBAAgB,OAAA;AAChB,2GAAA,iBAAiB,OAAA;AACjB,6GAAA,mBAAmB,OAAA;AACnB,yGAAA,eAAe,OAAA;AAEjB,sCAA2C;AAAlC,kGAAA,UAAU,OAAA;AACnB,sCAA2C;AAAlC,kGAAA,UAAU,OAAA;AACnB,kDAAsF;AAA7E,uGAAA,SAAS,OAAA;AAAE,0GAAA,YAAY,OAAA;AAAE,uGAAA,SAAS,OAAA;AAAE,yGAAA,WAAW,OAAA;AACxD,4CAAiD;AAAxC,wGAAA,aAAa,OAAA;AACtB,kDAAuD;AAA9C,0GAAA,cAAc,OAAA;AACvB,wDAA8D;AAArD,iHAAA,kBAAkB,OAAA;AAC3B,8CAAqD;AAA5C,wGAAA,cAAc,OAAA"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/** A stdio server entry. */
|
|
2
|
+
export interface StdioServerEntry {
|
|
3
|
+
type: 'stdio';
|
|
4
|
+
command: string;
|
|
5
|
+
args?: string[];
|
|
6
|
+
env?: Record<string, string>;
|
|
7
|
+
cwd?: string;
|
|
8
|
+
disabled?: boolean;
|
|
9
|
+
}
|
|
10
|
+
/** An HTTP server entry. */
|
|
11
|
+
export interface HttpServerEntry {
|
|
12
|
+
type: 'http';
|
|
13
|
+
url: string;
|
|
14
|
+
headers?: Record<string, string>;
|
|
15
|
+
disabled?: boolean;
|
|
16
|
+
}
|
|
17
|
+
/** A server entry (stdio or HTTP). */
|
|
18
|
+
export type ServerEntry = StdioServerEntry | HttpServerEntry;
|
|
19
|
+
/** A parsed MCP configuration. */
|
|
20
|
+
export interface MCPConfig {
|
|
21
|
+
/** The servers declared in this config. */
|
|
22
|
+
servers: Record<string, ServerEntry>;
|
|
23
|
+
/** The file path this config was loaded from. */
|
|
24
|
+
filePath: string;
|
|
25
|
+
/** Non-MCP keys in the original file, preserved for round-trip writing. */
|
|
26
|
+
_otherKeys?: Record<string, unknown>;
|
|
27
|
+
}
|
|
28
|
+
/** An individual validation check result. */
|
|
29
|
+
export interface ValidationCheck {
|
|
30
|
+
/** Check identifier (e.g., 'json-syntax', 'schema-mcpservers-present', 'command-exists:npx'). */
|
|
31
|
+
id: string;
|
|
32
|
+
/** Severity: 'error' for hard failures, 'warning' for potential issues. */
|
|
33
|
+
severity: 'error' | 'warning';
|
|
34
|
+
/** Whether this check passed. */
|
|
35
|
+
passed: boolean;
|
|
36
|
+
/** Human-readable description of what was checked. */
|
|
37
|
+
message: string;
|
|
38
|
+
/** The server name this check applies to, if server-specific. */
|
|
39
|
+
serverName?: string;
|
|
40
|
+
/** Suggestion for fixing the issue, if applicable. */
|
|
41
|
+
suggestion?: string;
|
|
42
|
+
}
|
|
43
|
+
/** Result of config validation. */
|
|
44
|
+
export interface ValidationResult {
|
|
45
|
+
/** Whether the config passed all checks. */
|
|
46
|
+
valid: boolean;
|
|
47
|
+
/** Path to the validated config file. */
|
|
48
|
+
configPath: string;
|
|
49
|
+
/** Individual check results. */
|
|
50
|
+
checks: ValidationCheck[];
|
|
51
|
+
/** Summary counts. */
|
|
52
|
+
summary: {
|
|
53
|
+
total: number;
|
|
54
|
+
passed: number;
|
|
55
|
+
failed: number;
|
|
56
|
+
warnings: number;
|
|
57
|
+
};
|
|
58
|
+
/** Completeness score (0-100). */
|
|
59
|
+
completenessScore: number;
|
|
60
|
+
}
|
|
61
|
+
export interface SyncOptions {
|
|
62
|
+
/** Path to the source config file, or a tool alias ('claude-desktop', 'cursor', 'windsurf', 'cline'). */
|
|
63
|
+
source: string;
|
|
64
|
+
/** Path to the target config file, or a tool alias. */
|
|
65
|
+
target: string;
|
|
66
|
+
/** Which servers to sync. If omitted, all servers from the source are synced. */
|
|
67
|
+
servers?: string[];
|
|
68
|
+
/** How to handle conflicts when the target already has a server with the same name. */
|
|
69
|
+
conflictStrategy: 'skip' | 'overwrite' | 'merge-env';
|
|
70
|
+
/** If true, perform a dry run: report what would change without modifying the target. */
|
|
71
|
+
dryRun: boolean;
|
|
72
|
+
}
|
|
73
|
+
export interface SyncResult {
|
|
74
|
+
/** Path to the source config file. */
|
|
75
|
+
sourcePath: string;
|
|
76
|
+
/** Path to the target config file. */
|
|
77
|
+
targetPath: string;
|
|
78
|
+
/** Servers that were added to the target (new). */
|
|
79
|
+
added: string[];
|
|
80
|
+
/** Servers that were updated in the target (overwrite or merge-env). */
|
|
81
|
+
updated: string[];
|
|
82
|
+
/** Servers that were skipped (already exist in target, strategy is 'skip'). */
|
|
83
|
+
skipped: string[];
|
|
84
|
+
/** Servers in the source that were not synced due to errors. */
|
|
85
|
+
errors: Array<{
|
|
86
|
+
serverName: string;
|
|
87
|
+
error: string;
|
|
88
|
+
}>;
|
|
89
|
+
/** Whether any changes were made (false for dry runs or when everything is skipped). */
|
|
90
|
+
changed: boolean;
|
|
91
|
+
}
|
|
92
|
+
/** Information about a discoverable MCP server. */
|
|
93
|
+
export interface ServerInfo {
|
|
94
|
+
name: string;
|
|
95
|
+
description: string;
|
|
96
|
+
npmPackage: string;
|
|
97
|
+
category: string;
|
|
98
|
+
requiredEnvVars: Array<{
|
|
99
|
+
name: string;
|
|
100
|
+
description: string;
|
|
101
|
+
sensitive: boolean;
|
|
102
|
+
}>;
|
|
103
|
+
source: 'registry' | 'npm';
|
|
104
|
+
weeklyDownloads?: number;
|
|
105
|
+
homepage?: string;
|
|
106
|
+
}
|
|
107
|
+
export interface DiscoverOptions {
|
|
108
|
+
/** Whether to also search the npm registry. */
|
|
109
|
+
searchNpm?: boolean;
|
|
110
|
+
/** Maximum number of results to return. */
|
|
111
|
+
limit?: number;
|
|
112
|
+
}
|
|
113
|
+
export interface ManagerOptions {
|
|
114
|
+
/** Default config file path. Defaults to `.mcp.json` in cwd. */
|
|
115
|
+
configPath?: string;
|
|
116
|
+
/** Validation level for automatic validation. */
|
|
117
|
+
validationLevel?: 1 | 2 | 3 | 4 | 5;
|
|
118
|
+
}
|
|
119
|
+
export interface ConfigManager {
|
|
120
|
+
/** Load the config from disk. */
|
|
121
|
+
load(): Promise<void>;
|
|
122
|
+
/** Save the current config to disk. */
|
|
123
|
+
save(): Promise<void>;
|
|
124
|
+
/** Get the current config. Throws if not loaded. */
|
|
125
|
+
getConfig(): MCPConfig;
|
|
126
|
+
/** List all server names. */
|
|
127
|
+
list(): string[];
|
|
128
|
+
/** Get a specific server entry. */
|
|
129
|
+
get(serverName: string): ServerEntry | undefined;
|
|
130
|
+
/** Add a server. Throws if it already exists. */
|
|
131
|
+
add(serverName: string, entry: ServerEntry): void;
|
|
132
|
+
/** Add a server from the built-in registry. */
|
|
133
|
+
addFromRegistry(registryName: string, envValues?: Record<string, string>): void;
|
|
134
|
+
/** Remove a server. Throws if it does not exist. */
|
|
135
|
+
remove(serverName: string): void;
|
|
136
|
+
/** Validate the current config. */
|
|
137
|
+
validate(options?: {
|
|
138
|
+
level?: 1 | 2 | 3 | 4 | 5;
|
|
139
|
+
}): Promise<ValidationResult>;
|
|
140
|
+
/** Check if a server exists. */
|
|
141
|
+
has(serverName: string): boolean;
|
|
142
|
+
}
|
|
143
|
+
export interface RegistryEntry {
|
|
144
|
+
name: string;
|
|
145
|
+
description: string;
|
|
146
|
+
npmPackage: string;
|
|
147
|
+
category: string;
|
|
148
|
+
entry: ServerEntry;
|
|
149
|
+
requiredEnvVars?: Array<{
|
|
150
|
+
name: string;
|
|
151
|
+
description: string;
|
|
152
|
+
example: string;
|
|
153
|
+
sensitive: boolean;
|
|
154
|
+
}>;
|
|
155
|
+
optionalEnvVars?: Array<{
|
|
156
|
+
name: string;
|
|
157
|
+
description: string;
|
|
158
|
+
example: string;
|
|
159
|
+
default?: string;
|
|
160
|
+
sensitive: boolean;
|
|
161
|
+
}>;
|
|
162
|
+
keywords: string[];
|
|
163
|
+
homepage?: string;
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";AAAA,wEAAwE"}
|