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.
Files changed (70) hide show
  1. package/README.md +195 -0
  2. package/dist/__tests__/config/load.test.d.ts +2 -0
  3. package/dist/__tests__/config/load.test.d.ts.map +1 -0
  4. package/dist/__tests__/config/load.test.js +142 -0
  5. package/dist/__tests__/config/load.test.js.map +1 -0
  6. package/dist/__tests__/config/manager.test.d.ts +2 -0
  7. package/dist/__tests__/config/manager.test.d.ts.map +1 -0
  8. package/dist/__tests__/config/manager.test.js +133 -0
  9. package/dist/__tests__/config/manager.test.js.map +1 -0
  10. package/dist/__tests__/config/save.test.d.ts +2 -0
  11. package/dist/__tests__/config/save.test.d.ts.map +1 -0
  12. package/dist/__tests__/config/save.test.js +120 -0
  13. package/dist/__tests__/config/save.test.js.map +1 -0
  14. package/dist/__tests__/fixtures/fixtures.test.d.ts +2 -0
  15. package/dist/__tests__/fixtures/fixtures.test.d.ts.map +1 -0
  16. package/dist/__tests__/fixtures/fixtures.test.js +107 -0
  17. package/dist/__tests__/fixtures/fixtures.test.js.map +1 -0
  18. package/dist/__tests__/types.test.d.ts +2 -0
  19. package/dist/__tests__/types.test.d.ts.map +1 -0
  20. package/dist/__tests__/types.test.js +263 -0
  21. package/dist/__tests__/types.test.js.map +1 -0
  22. package/dist/__tests__/utils/errors.test.d.ts +2 -0
  23. package/dist/__tests__/utils/errors.test.d.ts.map +1 -0
  24. package/dist/__tests__/utils/errors.test.js +198 -0
  25. package/dist/__tests__/utils/errors.test.js.map +1 -0
  26. package/dist/__tests__/validation/validate.test.d.ts +2 -0
  27. package/dist/__tests__/validation/validate.test.d.ts.map +1 -0
  28. package/dist/__tests__/validation/validate.test.js +123 -0
  29. package/dist/__tests__/validation/validate.test.js.map +1 -0
  30. package/dist/config/load.d.ts +3 -0
  31. package/dist/config/load.d.ts.map +1 -0
  32. package/dist/config/load.js +66 -0
  33. package/dist/config/load.js.map +1 -0
  34. package/dist/config/manager.d.ts +3 -0
  35. package/dist/config/manager.d.ts.map +1 -0
  36. package/dist/config/manager.js +58 -0
  37. package/dist/config/manager.js.map +1 -0
  38. package/dist/config/operations.d.ts +6 -0
  39. package/dist/config/operations.d.ts.map +1 -0
  40. package/dist/config/operations.js +26 -0
  41. package/dist/config/operations.js.map +1 -0
  42. package/dist/config/save.d.ts +3 -0
  43. package/dist/config/save.d.ts.map +1 -0
  44. package/dist/config/save.js +40 -0
  45. package/dist/config/save.js.map +1 -0
  46. package/dist/index.d.ts +10 -0
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +28 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/types.d.ts +165 -0
  51. package/dist/types.d.ts.map +1 -0
  52. package/dist/types.js +4 -0
  53. package/dist/types.js.map +1 -0
  54. package/dist/utils/errors.d.ts +40 -0
  55. package/dist/utils/errors.d.ts.map +1 -0
  56. package/dist/utils/errors.js +74 -0
  57. package/dist/utils/errors.js.map +1 -0
  58. package/dist/validation/json-syntax.d.ts +3 -0
  59. package/dist/validation/json-syntax.d.ts.map +1 -0
  60. package/dist/validation/json-syntax.js +44 -0
  61. package/dist/validation/json-syntax.js.map +1 -0
  62. package/dist/validation/schema.d.ts +3 -0
  63. package/dist/validation/schema.d.ts.map +1 -0
  64. package/dist/validation/schema.js +76 -0
  65. package/dist/validation/schema.js.map +1 -0
  66. package/dist/validation/validate.d.ts +5 -0
  67. package/dist/validation/validate.d.ts.map +1 -0
  68. package/dist/validation/validate.js +37 -0
  69. package/dist/validation/validate.js.map +1 -0
  70. package/package.json +34 -0
package/README.md ADDED
@@ -0,0 +1,195 @@
1
+ # mcp-config-ts
2
+
3
+ CLI to discover, add, validate, and sync MCP server configs.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install mcp-config-ts
9
+ ```
10
+
11
+ Or run directly with npx:
12
+
13
+ ```bash
14
+ npx mcp-config-ts validate
15
+ ```
16
+
17
+ ## Quick Start
18
+
19
+ ```typescript
20
+ import {
21
+ loadConfig,
22
+ saveConfig,
23
+ validateConfig,
24
+ addServer,
25
+ removeServer,
26
+ getServer,
27
+ listServers,
28
+ createManager,
29
+ } from 'mcp-config-ts';
30
+
31
+ // Load a config file (synchronous)
32
+ const config = loadConfig('.mcp.json');
33
+
34
+ // Validate the config
35
+ const result = await validateConfig(config, { level: 3 });
36
+ console.log(result.valid); // true or false
37
+ console.log(result.completenessScore); // 0-100
38
+
39
+ // Add a server (mutates config in place)
40
+ addServer(config, 'my-server', {
41
+ type: 'stdio',
42
+ command: 'npx',
43
+ args: ['-y', '@modelcontextprotocol/server-filesystem', '/path/to/dir'],
44
+ });
45
+
46
+ // Save the config (synchronous, creates parent dirs automatically)
47
+ saveConfig(config);
48
+
49
+ // Remove a server (mutates config in place)
50
+ removeServer(config, 'my-server');
51
+
52
+ // List all server names (sorted)
53
+ const names = listServers(config); // ['github', 'filesystem', ...]
54
+
55
+ // Get a single server entry
56
+ const entry = getServer(config, 'github'); // ServerEntry | undefined
57
+
58
+ // Use the ConfigManager for stateful load/save/validate operations
59
+ const manager = createManager({ configPath: '.mcp.json' });
60
+ await manager.load();
61
+ manager.add('github', {
62
+ type: 'stdio',
63
+ command: 'npx',
64
+ args: ['-y', '@modelcontextprotocol/server-github'],
65
+ env: { GITHUB_TOKEN: process.env.GITHUB_TOKEN! },
66
+ });
67
+ await manager.save();
68
+ ```
69
+
70
+ ## API Reference
71
+
72
+ ### `loadConfig(configPath?: string): MCPConfig`
73
+
74
+ Loads and parses an MCP config file synchronously.
75
+
76
+ - `configPath` defaults to `.mcp.json` in the current working directory.
77
+ - Throws `ConfigNotFoundError` if the file does not exist.
78
+ - Throws `ConfigParseError` if the file is not valid JSON.
79
+ - Infers `type: 'stdio'` for entries with a `command` field, `type: 'http'` for entries with a `url` field.
80
+ - Non-`mcpServers` keys are preserved in `config._otherKeys` for round-trip writing.
81
+
82
+ ### `saveConfig(config: MCPConfig): void`
83
+
84
+ Writes an `MCPConfig` object to disk synchronously.
85
+
86
+ - Creates parent directories automatically (`mkdirSync` with `recursive: true`).
87
+ - Strips the `type` field from each server entry (not stored on disk).
88
+ - Merges `_otherKeys` back into the output so non-MCP fields are preserved.
89
+ - Writes JSON with 2-space indentation and a trailing newline.
90
+
91
+ ### `validateConfig(config: MCPConfig, options?: { level?: 1 | 2 | 3 }): Promise<ValidationResult>`
92
+
93
+ Validates an `MCPConfig` object and returns a `ValidationResult`.
94
+
95
+ - `level 1`: JSON syntax check only.
96
+ - `level 2`: JSON syntax + schema checks (mcpServers present, entries valid).
97
+ - `level 3` (default): all checks including URL format and non-empty command warnings.
98
+ - `completenessScore`: 0–100, reduced by 30 per error failure and 10 per warning failure.
99
+ - `valid`: `true` only when no error-severity checks fail.
100
+
101
+ ### `createManager(options?: ManagerOptions): ConfigManager`
102
+
103
+ Creates a stateful config manager.
104
+
105
+ - `options.configPath`: path to the config file (defaults to `.mcp.json`).
106
+ - Call `manager.load()` before any other methods.
107
+ - Mutations (`add`, `remove`) are in-memory until `manager.save()` is called.
108
+
109
+ #### `ConfigManager` methods
110
+
111
+ | Method | Description |
112
+ |---|---|
113
+ | `load(): Promise<void>` | Load config from disk |
114
+ | `save(): Promise<void>` | Persist current config to disk |
115
+ | `getConfig(): MCPConfig` | Return the loaded config object |
116
+ | `list(): string[]` | Return sorted array of server names |
117
+ | `get(name): ServerEntry \| undefined` | Return a server entry by name |
118
+ | `has(name): boolean` | Check if a server exists |
119
+ | `add(name, entry): void` | Add a server (throws `ServerExistsError` if exists) |
120
+ | `remove(name): void` | Remove a server (throws `ServerNotFoundError` if missing) |
121
+ | `validate(opts?): Promise<ValidationResult>` | Validate the current config |
122
+
123
+ ### `addServer(config, name, entry): void`
124
+
125
+ Adds a server entry to the config in place. Throws `ServerExistsError` if a server with that name already exists.
126
+
127
+ ### `removeServer(config, name): void`
128
+
129
+ Removes a server entry from the config in place. Throws `ServerNotFoundError` if the server does not exist.
130
+
131
+ ### `getServer(config, name): ServerEntry | undefined`
132
+
133
+ Returns the server entry for the given name, or `undefined` if not found.
134
+
135
+ ### `listServers(config): string[]`
136
+
137
+ Returns a sorted array of all server names in the config.
138
+
139
+ ## Available Exports
140
+
141
+ ### Types
142
+
143
+ - `MCPConfig` -- Parsed MCP configuration object
144
+ - `StdioServerEntry` -- A stdio transport server entry
145
+ - `HttpServerEntry` -- An HTTP transport server entry
146
+ - `ServerEntry` -- Union of StdioServerEntry | HttpServerEntry
147
+ - `ValidationCheck` -- Individual validation check result
148
+ - `ValidationResult` -- Full validation result with summary and completeness score
149
+ - `SyncOptions` -- Options for syncing configs between files
150
+ - `SyncResult` -- Result of a sync operation
151
+ - `ServerInfo` -- Discoverable MCP server info
152
+ - `DiscoverOptions` -- Options for server discovery
153
+ - `ManagerOptions` -- Options for creating a ConfigManager
154
+ - `ConfigManager` -- Stateful config manager interface
155
+ - `RegistryEntry` -- Built-in server registry entry
156
+
157
+ ### Error Classes
158
+
159
+ - `MCPConfigError` -- Base error class (code: string)
160
+ - `ConfigNotFoundError` -- Config file not found (code: `CONFIG_NOT_FOUND`)
161
+ - `ConfigParseError` -- Config file is not valid JSON (code: `CONFIG_PARSE_ERROR`)
162
+ - `ServerExistsError` -- Server already exists in config (code: `SERVER_EXISTS`)
163
+ - `ServerNotFoundError` -- Server not found in config or registry (code: `SERVER_NOT_FOUND`)
164
+ - `ValidationError` -- Validation failed at a critical level (code: `VALIDATION_ERROR`)
165
+
166
+ ## CLI Commands
167
+
168
+ ```
169
+ mcp-config validate [--config <path>] [--level <1-5>] [--format json]
170
+ Validate the MCP config file. Exits with code 1 if validation fails.
171
+
172
+ mcp-config add <name> [--command <cmd>] [--args <args...>] [--url <url>] [--env KEY=VAL]
173
+ Add a server to the config. Supports registry lookup by name.
174
+
175
+ mcp-config list [--all] [--format json]
176
+ List servers in the config. Use --all to scan all known config locations.
177
+
178
+ mcp-config sync <source> <target> [--strategy skip|overwrite|merge-env] [--dry-run]
179
+ Sync servers from one config to another.
180
+
181
+ mcp-config search <query> [--npm] [--limit <n>]
182
+ Search for MCP servers in the built-in registry and npm.
183
+
184
+ mcp-config doctor [--check-npm] [--check-env] [--format json]
185
+ Run comprehensive diagnostics on the config.
186
+
187
+ mcp-config init [--with <servers...>] [--force]
188
+ Create a new .mcp.json config file.
189
+ ```
190
+
191
+ Global options: `--config <path>`, `--format human|json`, `--quiet`, `--version`, `--help`.
192
+
193
+ ## License
194
+
195
+ MIT
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=load.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/config/load.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,142 @@
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 load_1 = require("../../config/load");
9
+ const errors_1 = require("../../utils/errors");
10
+ function makeTmpDir() {
11
+ const dir = (0, path_1.join)((0, os_1.tmpdir)(), `mcp-config-test-${(0, crypto_1.randomUUID)()}`);
12
+ (0, fs_1.mkdirSync)(dir, { recursive: true });
13
+ return dir;
14
+ }
15
+ (0, vitest_1.describe)('loadConfig', () => {
16
+ const dirs = [];
17
+ (0, vitest_1.afterEach)(() => {
18
+ for (const dir of dirs) {
19
+ try {
20
+ (0, fs_1.rmSync)(dir, { recursive: true, force: true });
21
+ }
22
+ catch { /* ignore */ }
23
+ }
24
+ dirs.length = 0;
25
+ });
26
+ function tmpDir() {
27
+ const d = makeTmpDir();
28
+ dirs.push(d);
29
+ return d;
30
+ }
31
+ (0, vitest_1.it)('throws ConfigNotFoundError when file does not exist', () => {
32
+ const dir = tmpDir();
33
+ (0, vitest_1.expect)(() => (0, load_1.loadConfig)((0, path_1.join)(dir, 'nonexistent.json'))).toThrow(errors_1.ConfigNotFoundError);
34
+ });
35
+ (0, vitest_1.it)('throws ConfigParseError for invalid JSON', () => {
36
+ const dir = tmpDir();
37
+ const file = (0, path_1.join)(dir, '.mcp.json');
38
+ (0, fs_1.writeFileSync)(file, '{ this is not valid json }');
39
+ (0, vitest_1.expect)(() => (0, load_1.loadConfig)(file)).toThrow(errors_1.ConfigParseError);
40
+ });
41
+ (0, vitest_1.it)('loads a valid stdio-only config', () => {
42
+ const dir = tmpDir();
43
+ const file = (0, path_1.join)(dir, '.mcp.json');
44
+ (0, fs_1.writeFileSync)(file, JSON.stringify({
45
+ mcpServers: {
46
+ filesystem: { command: 'npx', args: ['-y', '@modelcontextprotocol/server-filesystem', '/tmp'] },
47
+ },
48
+ }));
49
+ const config = (0, load_1.loadConfig)(file);
50
+ (0, vitest_1.expect)(config.filePath).toBe(file);
51
+ (0, vitest_1.expect)(config.servers.filesystem).toBeDefined();
52
+ (0, vitest_1.expect)(config.servers.filesystem.type).toBe('stdio');
53
+ });
54
+ (0, vitest_1.it)('parses stdio entry fields correctly', () => {
55
+ const dir = tmpDir();
56
+ const file = (0, path_1.join)(dir, '.mcp.json');
57
+ (0, fs_1.writeFileSync)(file, JSON.stringify({
58
+ mcpServers: {
59
+ github: {
60
+ command: 'npx',
61
+ args: ['-y', '@modelcontextprotocol/server-github'],
62
+ env: { GITHUB_TOKEN: 'ghp_test' },
63
+ cwd: '/home/user',
64
+ disabled: true,
65
+ },
66
+ },
67
+ }));
68
+ const config = (0, load_1.loadConfig)(file);
69
+ const entry = config.servers.github;
70
+ (0, vitest_1.expect)(entry.type).toBe('stdio');
71
+ if (entry.type === 'stdio') {
72
+ (0, vitest_1.expect)(entry.command).toBe('npx');
73
+ (0, vitest_1.expect)(entry.args).toEqual(['-y', '@modelcontextprotocol/server-github']);
74
+ (0, vitest_1.expect)(entry.env).toEqual({ GITHUB_TOKEN: 'ghp_test' });
75
+ (0, vitest_1.expect)(entry.cwd).toBe('/home/user');
76
+ (0, vitest_1.expect)(entry.disabled).toBe(true);
77
+ }
78
+ });
79
+ (0, vitest_1.it)('parses http entry fields correctly', () => {
80
+ const dir = tmpDir();
81
+ const file = (0, path_1.join)(dir, '.mcp.json');
82
+ (0, fs_1.writeFileSync)(file, JSON.stringify({
83
+ mcpServers: {
84
+ remote: {
85
+ url: 'https://mcp.example.com/api',
86
+ headers: { Authorization: 'Bearer token' },
87
+ disabled: false,
88
+ },
89
+ },
90
+ }));
91
+ const config = (0, load_1.loadConfig)(file);
92
+ const entry = config.servers.remote;
93
+ (0, vitest_1.expect)(entry.type).toBe('http');
94
+ if (entry.type === 'http') {
95
+ (0, vitest_1.expect)(entry.url).toBe('https://mcp.example.com/api');
96
+ (0, vitest_1.expect)(entry.headers).toEqual({ Authorization: 'Bearer token' });
97
+ (0, vitest_1.expect)(entry.disabled).toBe(false);
98
+ }
99
+ });
100
+ (0, vitest_1.it)('handles mixed stdio and http entries', () => {
101
+ const dir = tmpDir();
102
+ const file = (0, path_1.join)(dir, '.mcp.json');
103
+ (0, fs_1.writeFileSync)(file, JSON.stringify({
104
+ mcpServers: {
105
+ local: { command: 'node', args: ['server.js'] },
106
+ remote: { url: 'https://mcp.example.com/api' },
107
+ },
108
+ }));
109
+ const config = (0, load_1.loadConfig)(file);
110
+ (0, vitest_1.expect)(config.servers.local.type).toBe('stdio');
111
+ (0, vitest_1.expect)(config.servers.remote.type).toBe('http');
112
+ });
113
+ (0, vitest_1.it)('preserves _otherKeys from the raw JSON', () => {
114
+ const dir = tmpDir();
115
+ const file = (0, path_1.join)(dir, '.mcp.json');
116
+ (0, fs_1.writeFileSync)(file, JSON.stringify({
117
+ mcpServers: {},
118
+ someOtherSetting: true,
119
+ version: 2,
120
+ }));
121
+ const config = (0, load_1.loadConfig)(file);
122
+ (0, vitest_1.expect)(config._otherKeys).toBeDefined();
123
+ (0, vitest_1.expect)(config._otherKeys?.someOtherSetting).toBe(true);
124
+ (0, vitest_1.expect)(config._otherKeys?.version).toBe(2);
125
+ });
126
+ (0, vitest_1.it)('does not set _otherKeys when only mcpServers key is present', () => {
127
+ const dir = tmpDir();
128
+ const file = (0, path_1.join)(dir, '.mcp.json');
129
+ (0, fs_1.writeFileSync)(file, JSON.stringify({ mcpServers: {} }));
130
+ const config = (0, load_1.loadConfig)(file);
131
+ (0, vitest_1.expect)(config._otherKeys).toBeUndefined();
132
+ });
133
+ (0, vitest_1.it)('loads an empty servers object when mcpServers is missing', () => {
134
+ const dir = tmpDir();
135
+ const file = (0, path_1.join)(dir, '.mcp.json');
136
+ (0, fs_1.writeFileSync)(file, JSON.stringify({ other: 'data' }));
137
+ const config = (0, load_1.loadConfig)(file);
138
+ (0, vitest_1.expect)(config.servers).toEqual({});
139
+ (0, vitest_1.expect)(config._otherKeys?.other).toBe('data');
140
+ });
141
+ });
142
+ //# sourceMappingURL=load.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load.test.js","sourceRoot":"","sources":["../../../src/__tests__/config/load.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=manager.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/config/manager.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,133 @@
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 manager_1 = require("../../config/manager");
9
+ const errors_1 = require("../../utils/errors");
10
+ function makeTmpDir() {
11
+ const dir = (0, path_1.join)((0, os_1.tmpdir)(), `mcp-config-test-${(0, crypto_1.randomUUID)()}`);
12
+ (0, fs_1.mkdirSync)(dir, { recursive: true });
13
+ return dir;
14
+ }
15
+ (0, vitest_1.describe)('createManager', () => {
16
+ const dirs = [];
17
+ (0, vitest_1.afterEach)(() => {
18
+ for (const dir of dirs) {
19
+ try {
20
+ (0, fs_1.rmSync)(dir, { recursive: true, force: true });
21
+ }
22
+ catch { /* ignore */ }
23
+ }
24
+ dirs.length = 0;
25
+ });
26
+ function makeConfigFile(content) {
27
+ const dir = makeTmpDir();
28
+ dirs.push(dir);
29
+ const file = (0, path_1.join)(dir, '.mcp.json');
30
+ (0, fs_1.writeFileSync)(file, JSON.stringify(content));
31
+ return file;
32
+ }
33
+ (0, vitest_1.it)('throws before load is called', () => {
34
+ const file = makeConfigFile({ mcpServers: {} });
35
+ const manager = (0, manager_1.createManager)({ configPath: file });
36
+ (0, vitest_1.expect)(() => manager.getConfig()).toThrow();
37
+ });
38
+ (0, vitest_1.it)('load() populates the config', async () => {
39
+ const file = makeConfigFile({ mcpServers: { myserver: { command: 'node' } } });
40
+ const manager = (0, manager_1.createManager)({ configPath: file });
41
+ await manager.load();
42
+ const config = manager.getConfig();
43
+ (0, vitest_1.expect)(config.servers).toHaveProperty('myserver');
44
+ });
45
+ (0, vitest_1.it)('list() returns sorted server names', async () => {
46
+ const file = makeConfigFile({
47
+ mcpServers: {
48
+ zebra: { command: 'z' },
49
+ alpha: { command: 'a' },
50
+ mango: { url: 'https://example.com' },
51
+ },
52
+ });
53
+ const manager = (0, manager_1.createManager)({ configPath: file });
54
+ await manager.load();
55
+ (0, vitest_1.expect)(manager.list()).toEqual(['alpha', 'mango', 'zebra']);
56
+ });
57
+ (0, vitest_1.it)('get() returns the server entry', async () => {
58
+ const file = makeConfigFile({ mcpServers: { myserver: { command: 'node' } } });
59
+ const manager = (0, manager_1.createManager)({ configPath: file });
60
+ await manager.load();
61
+ const entry = manager.get('myserver');
62
+ (0, vitest_1.expect)(entry).toBeDefined();
63
+ (0, vitest_1.expect)(entry?.type).toBe('stdio');
64
+ });
65
+ (0, vitest_1.it)('get() returns undefined for unknown server', async () => {
66
+ const file = makeConfigFile({ mcpServers: {} });
67
+ const manager = (0, manager_1.createManager)({ configPath: file });
68
+ await manager.load();
69
+ (0, vitest_1.expect)(manager.get('nonexistent')).toBeUndefined();
70
+ });
71
+ (0, vitest_1.it)('has() returns true for existing server', async () => {
72
+ const file = makeConfigFile({ mcpServers: { s: { command: 'node' } } });
73
+ const manager = (0, manager_1.createManager)({ configPath: file });
74
+ await manager.load();
75
+ (0, vitest_1.expect)(manager.has('s')).toBe(true);
76
+ });
77
+ (0, vitest_1.it)('has() returns false for missing server', async () => {
78
+ const file = makeConfigFile({ mcpServers: {} });
79
+ const manager = (0, manager_1.createManager)({ configPath: file });
80
+ await manager.load();
81
+ (0, vitest_1.expect)(manager.has('missing')).toBe(false);
82
+ });
83
+ (0, vitest_1.it)('add() adds a new server', async () => {
84
+ const file = makeConfigFile({ mcpServers: {} });
85
+ const manager = (0, manager_1.createManager)({ configPath: file });
86
+ await manager.load();
87
+ manager.add('newserver', { type: 'stdio', command: 'npx' });
88
+ (0, vitest_1.expect)(manager.has('newserver')).toBe(true);
89
+ (0, vitest_1.expect)(manager.get('newserver')?.type).toBe('stdio');
90
+ });
91
+ (0, vitest_1.it)('add() throws ServerExistsError if server already exists', async () => {
92
+ const file = makeConfigFile({ mcpServers: { existing: { command: 'node' } } });
93
+ const manager = (0, manager_1.createManager)({ configPath: file });
94
+ await manager.load();
95
+ (0, vitest_1.expect)(() => manager.add('existing', { type: 'stdio', command: 'node' })).toThrow(errors_1.ServerExistsError);
96
+ });
97
+ (0, vitest_1.it)('remove() removes an existing server', async () => {
98
+ const file = makeConfigFile({ mcpServers: { toremove: { command: 'node' } } });
99
+ const manager = (0, manager_1.createManager)({ configPath: file });
100
+ await manager.load();
101
+ manager.remove('toremove');
102
+ (0, vitest_1.expect)(manager.has('toremove')).toBe(false);
103
+ (0, vitest_1.expect)(manager.list()).toHaveLength(0);
104
+ });
105
+ (0, vitest_1.it)('remove() throws ServerNotFoundError if server does not exist', async () => {
106
+ const file = makeConfigFile({ mcpServers: {} });
107
+ const manager = (0, manager_1.createManager)({ configPath: file });
108
+ await manager.load();
109
+ (0, vitest_1.expect)(() => manager.remove('missing')).toThrow(errors_1.ServerNotFoundError);
110
+ });
111
+ (0, vitest_1.it)('save() persists mutations to disk', async () => {
112
+ const file = makeConfigFile({ mcpServers: {} });
113
+ const manager = (0, manager_1.createManager)({ configPath: file });
114
+ await manager.load();
115
+ manager.add('saved-server', { type: 'http', url: 'https://example.com' });
116
+ await manager.save();
117
+ // Reload from disk with a new manager
118
+ const manager2 = (0, manager_1.createManager)({ configPath: file });
119
+ await manager2.load();
120
+ (0, vitest_1.expect)(manager2.has('saved-server')).toBe(true);
121
+ (0, vitest_1.expect)(manager2.get('saved-server')?.type).toBe('http');
122
+ });
123
+ (0, vitest_1.it)('validate() returns a ValidationResult', async () => {
124
+ const file = makeConfigFile({ mcpServers: { s: { command: 'node' } } });
125
+ const manager = (0, manager_1.createManager)({ configPath: file });
126
+ await manager.load();
127
+ const result = await manager.validate({ level: 3 });
128
+ (0, vitest_1.expect)(result.valid).toBeDefined();
129
+ (0, vitest_1.expect)(result.checks).toBeDefined();
130
+ (0, vitest_1.expect)(result.completenessScore).toBeGreaterThanOrEqual(0);
131
+ });
132
+ });
133
+ //# sourceMappingURL=manager.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.test.js","sourceRoot":"","sources":["../../../src/__tests__/config/manager.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=save.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"save.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/config/save.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,120 @@
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 load_1 = require("../../config/load");
9
+ const save_1 = require("../../config/save");
10
+ const fs_2 = require("fs");
11
+ function makeTmpDir() {
12
+ const dir = (0, path_1.join)((0, os_1.tmpdir)(), `mcp-config-test-${(0, crypto_1.randomUUID)()}`);
13
+ (0, fs_1.mkdirSync)(dir, { recursive: true });
14
+ return dir;
15
+ }
16
+ (0, vitest_1.describe)('saveConfig', () => {
17
+ const dirs = [];
18
+ (0, vitest_1.afterEach)(() => {
19
+ for (const dir of dirs) {
20
+ try {
21
+ (0, fs_1.rmSync)(dir, { recursive: true, force: true });
22
+ }
23
+ catch { /* ignore */ }
24
+ }
25
+ dirs.length = 0;
26
+ });
27
+ function tmpDir() {
28
+ const d = makeTmpDir();
29
+ dirs.push(d);
30
+ return d;
31
+ }
32
+ (0, vitest_1.it)('writes valid JSON with mcpServers key', () => {
33
+ const dir = tmpDir();
34
+ const file = (0, path_1.join)(dir, '.mcp.json');
35
+ const config = {
36
+ servers: { myserver: { type: 'stdio', command: 'node' } },
37
+ filePath: file,
38
+ };
39
+ (0, save_1.saveConfig)(config);
40
+ const raw = JSON.parse((0, fs_1.readFileSync)(file, 'utf-8'));
41
+ (0, vitest_1.expect)(raw).toHaveProperty('mcpServers');
42
+ (0, vitest_1.expect)(raw.mcpServers).toHaveProperty('myserver');
43
+ });
44
+ (0, vitest_1.it)('strips the type field from saved entries', () => {
45
+ const dir = tmpDir();
46
+ const file = (0, path_1.join)(dir, '.mcp.json');
47
+ const config = {
48
+ servers: { myserver: { type: 'stdio', command: 'node' } },
49
+ filePath: file,
50
+ };
51
+ (0, save_1.saveConfig)(config);
52
+ const raw = JSON.parse((0, fs_1.readFileSync)(file, 'utf-8'));
53
+ (0, vitest_1.expect)(raw.mcpServers.myserver).not.toHaveProperty('type');
54
+ (0, vitest_1.expect)(raw.mcpServers.myserver.command).toBe('node');
55
+ });
56
+ (0, vitest_1.it)('strips type from http entries too', () => {
57
+ const dir = tmpDir();
58
+ const file = (0, path_1.join)(dir, '.mcp.json');
59
+ const config = {
60
+ servers: { remote: { type: 'http', url: 'https://example.com' } },
61
+ filePath: file,
62
+ };
63
+ (0, save_1.saveConfig)(config);
64
+ const raw = JSON.parse((0, fs_1.readFileSync)(file, 'utf-8'));
65
+ (0, vitest_1.expect)(raw.mcpServers.remote).not.toHaveProperty('type');
66
+ (0, vitest_1.expect)(raw.mcpServers.remote.url).toBe('https://example.com');
67
+ });
68
+ (0, vitest_1.it)('round-trips a config: load → modify → save → reload', () => {
69
+ const dir = tmpDir();
70
+ const file = (0, path_1.join)(dir, '.mcp.json');
71
+ (0, fs_2.writeFileSync)(file, JSON.stringify({
72
+ mcpServers: {
73
+ github: { command: 'npx', args: ['-y', '@modelcontextprotocol/server-github'] },
74
+ },
75
+ }));
76
+ const config = (0, load_1.loadConfig)(file);
77
+ config.servers.newserver = { type: 'http', url: 'https://new.example.com' };
78
+ (0, save_1.saveConfig)(config);
79
+ const reloaded = (0, load_1.loadConfig)(file);
80
+ (0, vitest_1.expect)(Object.keys(reloaded.servers)).toHaveLength(2);
81
+ (0, vitest_1.expect)(reloaded.servers.github.type).toBe('stdio');
82
+ (0, vitest_1.expect)(reloaded.servers.newserver.type).toBe('http');
83
+ });
84
+ (0, vitest_1.it)('preserves _otherKeys on round-trip', () => {
85
+ const dir = tmpDir();
86
+ const file = (0, path_1.join)(dir, '.mcp.json');
87
+ (0, fs_2.writeFileSync)(file, JSON.stringify({
88
+ mcpServers: {},
89
+ extraSetting: 'preserved',
90
+ }));
91
+ const config = (0, load_1.loadConfig)(file);
92
+ (0, save_1.saveConfig)(config);
93
+ const raw = JSON.parse((0, fs_1.readFileSync)(file, 'utf-8'));
94
+ (0, vitest_1.expect)(raw.extraSetting).toBe('preserved');
95
+ });
96
+ (0, vitest_1.it)('creates parent directories if they do not exist', () => {
97
+ const dir = tmpDir();
98
+ const file = (0, path_1.join)(dir, 'deep', 'nested', 'dir', '.mcp.json');
99
+ const config = {
100
+ servers: {},
101
+ filePath: file,
102
+ };
103
+ (0, vitest_1.expect)(() => (0, save_1.saveConfig)(config)).not.toThrow();
104
+ const raw = JSON.parse((0, fs_1.readFileSync)(file, 'utf-8'));
105
+ (0, vitest_1.expect)(raw).toHaveProperty('mcpServers');
106
+ });
107
+ (0, vitest_1.it)('writes JSON with 2-space indent and trailing newline', () => {
108
+ const dir = tmpDir();
109
+ const file = (0, path_1.join)(dir, '.mcp.json');
110
+ const config = {
111
+ servers: { s: { type: 'stdio', command: 'node' } },
112
+ filePath: file,
113
+ };
114
+ (0, save_1.saveConfig)(config);
115
+ const raw = (0, fs_1.readFileSync)(file, 'utf-8');
116
+ (0, vitest_1.expect)(raw.endsWith('\n')).toBe(true);
117
+ (0, vitest_1.expect)(raw).toContain(' ');
118
+ });
119
+ });
120
+ //# sourceMappingURL=save.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"save.test.js","sourceRoot":"","sources":["../../../src/__tests__/config/save.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=fixtures.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixtures.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/fixtures/fixtures.test.ts"],"names":[],"mappings":""}