mcp-compose 0.0.1

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.
@@ -0,0 +1,175 @@
1
+ import { readFileSync, existsSync } from 'fs';
2
+ import { createServer } from 'net';
3
+ import { homedir } from 'os';
4
+ import { resolve } from 'path';
5
+ import { assertValidConfig } from './validation.js';
6
+ const DEFAULT_SETTINGS = {
7
+ portBase: 19100,
8
+ claudeConfigPath: '~/.mcp.json',
9
+ logLevel: 'info',
10
+ processPrefix: 'mcp-compose-',
11
+ };
12
+ const CONFIG_FILENAMES = [
13
+ 'mcp-compose.json',
14
+ 'mcp-compose.jsonc',
15
+ 'config.json',
16
+ 'config.jsonc',
17
+ ];
18
+ export function expandPath(p) {
19
+ if (p.startsWith('~/')) {
20
+ return resolve(homedir(), p.slice(2));
21
+ }
22
+ return resolve(p);
23
+ }
24
+ export function findConfigFile(startDir = process.cwd()) {
25
+ const searchDirs = [
26
+ resolve(homedir(), '.config', 'mcp-compose'),
27
+ startDir,
28
+ ];
29
+ for (const dir of searchDirs) {
30
+ for (const filename of CONFIG_FILENAMES) {
31
+ const configPath = resolve(dir, filename);
32
+ if (existsSync(configPath)) {
33
+ return configPath;
34
+ }
35
+ }
36
+ }
37
+ return null;
38
+ }
39
+ export function loadConfig(configPath) {
40
+ const resolvedPath = configPath ?? findConfigFile();
41
+ if (!resolvedPath) {
42
+ throw new Error('No mcp-compose.json found. Create one or specify path with --config');
43
+ }
44
+ if (!existsSync(resolvedPath)) {
45
+ throw new Error(`Config file not found: ${resolvedPath}`);
46
+ }
47
+ const content = readFileSync(resolvedPath, 'utf-8');
48
+ let config;
49
+ try {
50
+ config = JSON.parse(content);
51
+ }
52
+ catch (err) {
53
+ const message = err instanceof Error ? err.message : String(err);
54
+ throw new Error(`Invalid JSON in config file: ${message}`);
55
+ }
56
+ // Validate configuration structure
57
+ assertValidConfig(config);
58
+ return normalizeConfig(config);
59
+ }
60
+ /**
61
+ * Check if a port is available
62
+ */
63
+ export function isPortAvailable(port) {
64
+ return new Promise((resolve) => {
65
+ const server = createServer();
66
+ server.once('error', () => {
67
+ resolve(false);
68
+ });
69
+ server.once('listening', () => {
70
+ server.close(() => {
71
+ resolve(true);
72
+ });
73
+ });
74
+ server.listen(port, '127.0.0.1');
75
+ });
76
+ }
77
+ /**
78
+ * Find the next available port starting from the given port
79
+ */
80
+ async function findAvailablePort(startPort, maxAttempts = 100) {
81
+ for (let i = 0; i < maxAttempts; i++) {
82
+ const port = startPort + i;
83
+ if (port > 65535) {
84
+ throw new Error('No available ports found (exceeded port 65535)');
85
+ }
86
+ if (await isPortAvailable(port)) {
87
+ return port;
88
+ }
89
+ }
90
+ throw new Error(`No available ports found after ${String(maxAttempts)} attempts starting from ${String(startPort)}`);
91
+ }
92
+ /**
93
+ * Allocate available ports for servers, skipping ports that are in use
94
+ */
95
+ export async function allocatePorts(serverCount, portBase, onPortSkipped) {
96
+ const ports = [];
97
+ let nextPort = portBase;
98
+ for (let i = 0; i < serverCount; i++) {
99
+ const availablePort = await findAvailablePort(nextPort);
100
+ if (availablePort !== nextPort && onPortSkipped) {
101
+ onPortSkipped(nextPort, availablePort);
102
+ }
103
+ ports.push(availablePort);
104
+ nextPort = availablePort + 1;
105
+ }
106
+ return ports;
107
+ }
108
+ export function normalizeConfig(config) {
109
+ const settings = { ...DEFAULT_SETTINGS, ...config.settings };
110
+ settings.claudeConfigPath = expandPath(settings.claudeConfigPath);
111
+ const mcpServers = {};
112
+ let portIndex = 0;
113
+ for (const [name, server] of Object.entries(config.mcpServers ?? {})) {
114
+ if (server.disabled) {
115
+ continue;
116
+ }
117
+ const normalized = normalizeServer(name, server, settings.portBase + portIndex, settings);
118
+ mcpServers[name] = normalized;
119
+ if (normalized.type === 'stdio') {
120
+ portIndex++;
121
+ }
122
+ }
123
+ return {
124
+ settings,
125
+ mcpServers,
126
+ configPath: config.configPath,
127
+ };
128
+ }
129
+ const DEFAULT_RESOURCE_LIMITS = {
130
+ maxRestarts: 10,
131
+ restartDelay: 1000,
132
+ };
133
+ function normalizeServer(name, server, internalPort, settings) {
134
+ const type = server.type ?? ('command' in server ? 'stdio' : 'http');
135
+ if (type === 'stdio') {
136
+ if (!('command' in server) || !server.command) {
137
+ throw new Error(`Server "${name}" is stdio type but missing command`);
138
+ }
139
+ return {
140
+ type: 'stdio',
141
+ command: server.command,
142
+ args: server.args ?? [],
143
+ env: server.env ?? {},
144
+ internalPort,
145
+ logLevel: server.logLevel ?? settings.logLevel,
146
+ resourceLimits: { ...DEFAULT_RESOURCE_LIMITS, ...server.resourceLimits },
147
+ };
148
+ }
149
+ // type is 'sse' or 'http'
150
+ if (!('url' in server) || !server.url) {
151
+ throw new Error(`Server "${name}" is ${type} type but missing url`);
152
+ }
153
+ return {
154
+ type,
155
+ url: server.url,
156
+ };
157
+ }
158
+ export function getServerNames(config, filter = []) {
159
+ const allNames = Object.keys(config.mcpServers);
160
+ if (filter.length === 0) {
161
+ return allNames;
162
+ }
163
+ for (const name of filter) {
164
+ if (!allNames.includes(name)) {
165
+ throw new Error(`Unknown server: ${name}. Available: ${allNames.join(', ')}`);
166
+ }
167
+ }
168
+ return filter;
169
+ }
170
+ export function getStdioServers(config) {
171
+ return Object.entries(config.mcpServers)
172
+ .filter((entry) => entry[1].type === 'stdio')
173
+ .map(([name, server]) => ({ name, ...server }));
174
+ }
175
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export type * from './types.js';
2
+ export * from './config.js';
3
+ export * from './pm2.js';
4
+ export * from './supergateway.js';
5
+ export * from './sync.js';
6
+ export * from './validation.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,mBAAmB,YAAY,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC;AAClC,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export * from './config.js';
2
+ export * from './pm2.js';
3
+ export * from './supergateway.js';
4
+ export * from './sync.js';
5
+ export * from './validation.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC;AAClC,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { spawn } from 'child_process';
2
+ import type { NamedStdioServer, StartResult, ServerStatus } from './types.js';
3
+ export type ProgressCallback = (event: ProgressEvent) => void;
4
+ export interface ProgressEvent {
5
+ type: 'starting' | 'started' | 'stopping' | 'stopped' | 'port_skipped' | 'checking_ports';
6
+ server: string;
7
+ port?: number;
8
+ originalPort?: number;
9
+ current?: number;
10
+ total?: number;
11
+ }
12
+ export declare function startServers(servers: NamedStdioServer[], prefix: string, onProgress?: ProgressCallback): Promise<StartResult[]>;
13
+ export declare function stopServers(serverNames: string[], prefix: string, onProgress?: ProgressCallback): Promise<void>;
14
+ export declare function stopAllManagedServers(): Promise<number>;
15
+ export declare function restartServers(serverNames: string[], prefix: string): Promise<void>;
16
+ export declare function getStatus(): Promise<ServerStatus[]>;
17
+ export declare function streamLogs(serverName?: string, prefix?: string): ReturnType<typeof spawn>;
18
+ export declare function setupStartup(): Promise<void>;
19
+ export declare function saveProcessList(): Promise<void>;
20
+ export declare function unstartup(): Promise<void>;
21
+ //# sourceMappingURL=pm2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pm2.d.ts","sourceRoot":"","sources":["../../src/pm2.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE9E,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;AAE9D,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,cAAc,GAAG,gBAAgB,CAAC;IAC1F,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA2HD,wBAAgB,YAAY,CAC1B,OAAO,EAAE,gBAAgB,EAAE,EAC3B,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,gBAAgB,GAC5B,OAAO,CAAC,WAAW,EAAE,CAAC,CA0DxB;AAED,wBAAgB,WAAW,CACzB,WAAW,EAAE,MAAM,EAAE,EACrB,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,gBAAgB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAwBf;AAED,wBAAgB,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC,CAWvD;AAED,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMnF;AAED,wBAAgB,SAAS,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAcnD;AAED,wBAAgB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC,OAAO,KAAK,CAAC,CAMzF;AAED,wBAAgB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAE5C;AAED,wBAAgB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAE/C;AAED,wBAAgB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAEzC"}
@@ -0,0 +1,236 @@
1
+ import pm2 from 'pm2';
2
+ import { spawn } from 'child_process';
3
+ import { buildSupergatewayCmdForServer } from './supergateway.js';
4
+ // Environment variable marker to identify mcp-compose managed processes
5
+ const MCP_COMPOSE_MARKER = '__MCP_COMPOSE__';
6
+ /**
7
+ * Parse memory limit string (e.g., "512M", "1G") to bytes
8
+ */
9
+ function parseMemoryLimit(limit) {
10
+ if (typeof limit === 'number')
11
+ return limit;
12
+ const regex = /^(\d+)([KMG])?$/i;
13
+ const match = regex.exec(limit);
14
+ if (!match?.[1])
15
+ return undefined;
16
+ const value = parseInt(match[1], 10);
17
+ const unit = (match[2] ?? '').toUpperCase();
18
+ switch (unit) {
19
+ case 'K': return value * 1024;
20
+ case 'M': return value * 1024 * 1024;
21
+ case 'G': return value * 1024 * 1024 * 1024;
22
+ default: return value;
23
+ }
24
+ }
25
+ // Note: pm2's types incorrectly define callbacks as (err: Error) instead of (err: Error | null)
26
+ // We use type assertions to handle this properly
27
+ function pm2Connect() {
28
+ return new Promise((resolve, reject) => {
29
+ pm2.connect((err) => {
30
+ if (err)
31
+ reject(err);
32
+ else
33
+ resolve();
34
+ });
35
+ });
36
+ }
37
+ function pm2Start(options) {
38
+ return new Promise((resolve, reject) => {
39
+ pm2.start(options, ((err) => {
40
+ if (err)
41
+ reject(err);
42
+ else
43
+ resolve();
44
+ }));
45
+ });
46
+ }
47
+ function pm2Delete(name) {
48
+ return new Promise((resolve, reject) => {
49
+ pm2.delete(name, ((err) => {
50
+ // Ignore "not found" errors (process already stopped)
51
+ if (err && !err.message.includes('not found')) {
52
+ reject(err);
53
+ }
54
+ else {
55
+ resolve();
56
+ }
57
+ }));
58
+ });
59
+ }
60
+ function pm2List() {
61
+ return new Promise((resolve, reject) => {
62
+ pm2.list(((err, list) => {
63
+ if (err)
64
+ reject(err);
65
+ else
66
+ resolve(list ?? []);
67
+ }));
68
+ });
69
+ }
70
+ function pm2Restart(name) {
71
+ return new Promise((resolve, reject) => {
72
+ pm2.restart(name, ((err) => {
73
+ if (err)
74
+ reject(err);
75
+ else
76
+ resolve();
77
+ }));
78
+ });
79
+ }
80
+ async function withPm2(fn) {
81
+ await pm2Connect();
82
+ try {
83
+ return await fn();
84
+ }
85
+ finally {
86
+ pm2.disconnect();
87
+ }
88
+ }
89
+ function execPm2Command(args) {
90
+ return new Promise((resolve, reject) => {
91
+ const proc = spawn('npx', ['pm2', ...args], { stdio: 'inherit' });
92
+ proc.on('close', (code) => {
93
+ if (code === 0)
94
+ resolve();
95
+ else
96
+ reject(new Error(`pm2 ${args.join(' ')} failed with code ${String(code)}`));
97
+ });
98
+ });
99
+ }
100
+ function getProcessName(serverName, prefix) {
101
+ return `${prefix}${serverName}`;
102
+ }
103
+ /**
104
+ * Check if a process is managed by mcp-compose by looking for the marker env var
105
+ */
106
+ function isManagedProcess(p) {
107
+ const env = p.pm2_env;
108
+ return typeof p.name === 'string' && env?.[MCP_COMPOSE_MARKER] !== undefined;
109
+ }
110
+ /**
111
+ * Get the server name from a managed process (stored in the marker env var)
112
+ */
113
+ function getServerNameFromProcess(p) {
114
+ return p.pm2_env[MCP_COMPOSE_MARKER] ?? p.name;
115
+ }
116
+ export function startServers(servers, prefix, onProgress) {
117
+ return withPm2(async () => {
118
+ const results = [];
119
+ const total = servers.length;
120
+ let current = 0;
121
+ for (const serverEntry of servers) {
122
+ current++;
123
+ const { name, resourceLimits, ...server } = serverEntry;
124
+ const processName = getProcessName(name, prefix);
125
+ const cmd = buildSupergatewayCmdForServer({ ...server, resourceLimits });
126
+ onProgress?.({
127
+ type: 'starting',
128
+ server: name,
129
+ port: server.internalPort,
130
+ current,
131
+ total,
132
+ });
133
+ await pm2Delete(processName);
134
+ const startOptions = {
135
+ name: processName,
136
+ script: cmd.script,
137
+ args: cmd.args,
138
+ env: {
139
+ ...server.env,
140
+ [MCP_COMPOSE_MARKER]: name, // Mark as managed and store server name
141
+ },
142
+ autorestart: true,
143
+ max_restarts: resourceLimits.maxRestarts ?? 10,
144
+ restart_delay: resourceLimits.restartDelay ?? 1000,
145
+ };
146
+ // Add memory limit if specified
147
+ if (resourceLimits.maxMemory !== undefined) {
148
+ const maxMemory = parseMemoryLimit(resourceLimits.maxMemory);
149
+ if (maxMemory) {
150
+ startOptions.max_memory_restart = maxMemory;
151
+ }
152
+ }
153
+ await pm2Start(startOptions);
154
+ onProgress?.({
155
+ type: 'started',
156
+ server: name,
157
+ port: server.internalPort,
158
+ current,
159
+ total,
160
+ });
161
+ results.push({ name, processName, port: server.internalPort });
162
+ }
163
+ return results;
164
+ });
165
+ }
166
+ export function stopServers(serverNames, prefix, onProgress) {
167
+ return withPm2(async () => {
168
+ const total = serverNames.length;
169
+ let current = 0;
170
+ for (const name of serverNames) {
171
+ current++;
172
+ onProgress?.({
173
+ type: 'stopping',
174
+ server: name,
175
+ current,
176
+ total,
177
+ });
178
+ await pm2Delete(getProcessName(name, prefix));
179
+ onProgress?.({
180
+ type: 'stopped',
181
+ server: name,
182
+ current,
183
+ total,
184
+ });
185
+ }
186
+ });
187
+ }
188
+ export function stopAllManagedServers() {
189
+ return withPm2(async () => {
190
+ const list = await pm2List();
191
+ const managedProcesses = list.filter(isManagedProcess);
192
+ for (const proc of managedProcesses) {
193
+ await pm2Delete(proc.name);
194
+ }
195
+ return managedProcesses.length;
196
+ });
197
+ }
198
+ export function restartServers(serverNames, prefix) {
199
+ return withPm2(async () => {
200
+ for (const name of serverNames) {
201
+ await pm2Restart(getProcessName(name, prefix));
202
+ }
203
+ });
204
+ }
205
+ export function getStatus() {
206
+ return withPm2(async () => {
207
+ const list = await pm2List();
208
+ return list.filter(isManagedProcess).map((p) => ({
209
+ name: getServerNameFromProcess(p),
210
+ processName: p.name,
211
+ pid: p.pid,
212
+ status: p.pm2_env.status ?? 'unknown',
213
+ uptime: p.pm2_env.pm_uptime,
214
+ restarts: p.pm2_env.restart_time ?? 0,
215
+ memory: p.monit?.memory,
216
+ cpu: p.monit?.cpu,
217
+ }));
218
+ });
219
+ }
220
+ export function streamLogs(serverName, prefix) {
221
+ const args = ['pm2', 'logs'];
222
+ if (serverName && prefix) {
223
+ args.push(getProcessName(serverName, prefix));
224
+ }
225
+ return spawn('npx', args, { stdio: 'inherit' });
226
+ }
227
+ export function setupStartup() {
228
+ return execPm2Command(['startup']);
229
+ }
230
+ export function saveProcessList() {
231
+ return execPm2Command(['save']);
232
+ }
233
+ export function unstartup() {
234
+ return execPm2Command(['unstartup']);
235
+ }
236
+ //# sourceMappingURL=pm2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pm2.js","sourceRoot":"","sources":["../../src/pm2.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { StdioServer, SupergatewayCommand } from './types.js';
2
+ export declare function buildSupergatewayCmdForServer(server: StdioServer): SupergatewayCommand;
3
+ //# sourceMappingURL=supergateway.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supergateway.d.ts","sourceRoot":"","sources":["../../src/supergateway.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEnE,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,WAAW,GAAG,mBAAmB,CAoBtF"}
@@ -0,0 +1,38 @@
1
+ import { expandPath } from './config.js';
2
+ export function buildSupergatewayCmdForServer(server) {
3
+ const { command, args, internalPort, logLevel } = server;
4
+ const stdioCmd = buildStdioCommand(command, args);
5
+ return {
6
+ script: 'npx',
7
+ args: [
8
+ '-y',
9
+ 'supergateway@latest',
10
+ '--stdio',
11
+ stdioCmd,
12
+ '--outputTransport',
13
+ 'streamableHttp',
14
+ '--port',
15
+ String(internalPort),
16
+ '--logLevel',
17
+ logLevel,
18
+ ],
19
+ };
20
+ }
21
+ function buildStdioCommand(command, args) {
22
+ const expandedArgs = args.map((arg) => {
23
+ if (arg.includes('~')) {
24
+ return expandPath(arg);
25
+ }
26
+ return arg;
27
+ });
28
+ const allParts = [command, ...expandedArgs];
29
+ return allParts
30
+ .map((part) => {
31
+ if (/[\s"'\\]/.test(part)) {
32
+ return `"${part.replace(/["\\]/g, '\\$&')}"`;
33
+ }
34
+ return part;
35
+ })
36
+ .join(' ');
37
+ }
38
+ //# sourceMappingURL=supergateway.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supergateway.js","sourceRoot":"","sources":["../../src/supergateway.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,MAAM,UAAU,6BAA6B,CAAC,MAAmB;IAC/D,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IAEzD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAElD,OAAO;QACL,MAAM,EAAE,KAAK;QACb,IAAI,EAAE;YACJ,IAAI;YACJ,qBAAqB;YACrB,SAAS;YACT,QAAQ;YACR,mBAAmB;YACnB,gBAAgB;YAChB,QAAQ;YACR,MAAM,CAAC,YAAY,CAAC;YACpB,YAAY;YACZ,QAAQ;SACT;KACF,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAe,EAAE,IAAc;IACxD,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACpC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,CAAC,OAAO,EAAE,GAAG,YAAY,CAAC,CAAC;IAE5C,OAAO,QAAQ;SACZ,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC;QAC/C,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;SACD,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { NormalizedConfig, SyncResult, RemoveResult } from './types.js';
2
+ export declare function syncToClaudeConfig(config: NormalizedConfig): SyncResult;
3
+ export declare function removeFromClaudeConfig(config: NormalizedConfig, serverNames?: string[] | null): RemoveResult;
4
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/sync.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,gBAAgB,EAGhB,UAAU,EACV,YAAY,EACb,MAAM,YAAY,CAAC;AAyBpB,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,gBAAgB,GAAG,UAAU,CAgCvE;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,gBAAgB,EACxB,WAAW,GAAE,MAAM,EAAE,GAAG,IAAW,GAClC,YAAY,CAwCd"}
@@ -0,0 +1,79 @@
1
+ import { readFileSync, writeFileSync, existsSync } from 'fs';
2
+ function generateClaudeConfig(config) {
3
+ const { mcpServers } = config;
4
+ const claudeConfig = {};
5
+ for (const [name, server] of Object.entries(mcpServers)) {
6
+ if (server.type === 'stdio') {
7
+ claudeConfig[name] = {
8
+ type: 'http',
9
+ url: `http://localhost:${String(server.internalPort)}/mcp`,
10
+ };
11
+ }
12
+ else {
13
+ claudeConfig[name] = {
14
+ type: server.type,
15
+ url: server.url,
16
+ };
17
+ }
18
+ }
19
+ return claudeConfig;
20
+ }
21
+ export function syncToClaudeConfig(config) {
22
+ const { settings } = config;
23
+ const claudeConfigPath = settings.claudeConfigPath;
24
+ let existingConfig = {};
25
+ if (existsSync(claudeConfigPath)) {
26
+ try {
27
+ const content = readFileSync(claudeConfigPath, 'utf-8');
28
+ existingConfig = JSON.parse(content);
29
+ }
30
+ catch {
31
+ existingConfig = {};
32
+ }
33
+ }
34
+ const newServers = generateClaudeConfig(config);
35
+ const mergedConfig = { ...existingConfig };
36
+ mergedConfig.mcpServers = { ...(existingConfig.mcpServers ?? {}) };
37
+ for (const [name, serverConfig] of Object.entries(newServers)) {
38
+ mergedConfig.mcpServers[name] = serverConfig;
39
+ }
40
+ writeFileSync(claudeConfigPath, JSON.stringify(mergedConfig, null, 2) + '\n');
41
+ return {
42
+ path: claudeConfigPath,
43
+ servers: Object.keys(newServers),
44
+ merged: Object.keys(existingConfig.mcpServers ?? {}).length > 0,
45
+ };
46
+ }
47
+ export function removeFromClaudeConfig(config, serverNames = null) {
48
+ const { settings, mcpServers } = config;
49
+ const claudeConfigPath = settings.claudeConfigPath;
50
+ if (!existsSync(claudeConfigPath)) {
51
+ return { path: claudeConfigPath, removed: [] };
52
+ }
53
+ let existingConfig;
54
+ try {
55
+ const content = readFileSync(claudeConfigPath, 'utf-8');
56
+ existingConfig = JSON.parse(content);
57
+ }
58
+ catch {
59
+ return { path: claudeConfigPath, removed: [] };
60
+ }
61
+ if (!existingConfig.mcpServers) {
62
+ return { path: claudeConfigPath, removed: [] };
63
+ }
64
+ const toRemove = serverNames ?? Object.keys(mcpServers);
65
+ const removed = [];
66
+ for (const name of toRemove) {
67
+ if (existingConfig.mcpServers[name]) {
68
+ // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
69
+ delete existingConfig.mcpServers[name];
70
+ removed.push(name);
71
+ }
72
+ }
73
+ writeFileSync(claudeConfigPath, JSON.stringify(existingConfig, null, 2) + '\n');
74
+ return {
75
+ path: claudeConfigPath,
76
+ removed,
77
+ };
78
+ }
79
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAS7D,SAAS,oBAAoB,CAC3B,MAAwB;IAExB,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;IAC9B,MAAM,YAAY,GAAuC,EAAE,CAAC;IAE5D,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACxD,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC5B,YAAY,CAAC,IAAI,CAAC,GAAG;gBACnB,IAAI,EAAE,MAAM;gBACZ,GAAG,EAAE,oBAAoB,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM;aAC3D,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,YAAY,CAAC,IAAI,CAAC,GAAG;gBACnB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,GAAG,EAAE,MAAM,CAAC,GAAG;aAChB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAwB;IACzD,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IAC5B,MAAM,gBAAgB,GAAG,QAAQ,CAAC,gBAAgB,CAAC;IAEnD,IAAI,cAAc,GAAiB,EAAE,CAAC;IACtC,IAAI,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;YACxD,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAiB,CAAC;QACvD,CAAC;QAAC,MAAM,CAAC;YACP,cAAc,GAAG,EAAE,CAAC;QACtB,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAEhD,MAAM,YAAY,GAAiB,EAAE,GAAG,cAAc,EAAE,CAAC;IACzD,YAAY,CAAC,UAAU,GAAG,EAAE,GAAG,CAAC,cAAc,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,CAAC;IACnE,KAAK,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9D,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC;IAC/C,CAAC;IAED,aAAa,CACX,gBAAgB,EAChB,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAC7C,CAAC;IAEF,OAAO;QACL,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;QAChC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC;KAChE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,MAAwB,EACxB,cAA+B,IAAI;IAEnC,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;IACxC,MAAM,gBAAgB,GAAG,QAAQ,CAAC,gBAAgB,CAAC;IAEnD,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAClC,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACjD,CAAC;IAED,IAAI,cAA4B,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;QACxD,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAiB,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACjD,CAAC;IAED,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,CAAC;QAC/B,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACjD,CAAC;IAED,MAAM,QAAQ,GAAG,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACxD,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,gEAAgE;YAChE,OAAO,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACvC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,aAAa,CACX,gBAAgB,EAChB,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAC/C,CAAC;IAEF,OAAO;QACL,IAAI,EAAE,gBAAgB;QACtB,OAAO;KACR,CAAC;AACJ,CAAC"}