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.
- package/LICENSE +21 -0
- package/README.md +257 -0
- package/dist/bin/mcp-compose.d.ts +3 -0
- package/dist/bin/mcp-compose.d.ts.map +1 -0
- package/dist/bin/mcp-compose.js +210 -0
- package/dist/bin/mcp-compose.js.map +1 -0
- package/dist/src/config.d.ts +16 -0
- package/dist/src/config.d.ts.map +1 -0
- package/dist/src/config.js +175 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/index.d.ts +7 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +6 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/pm2.d.ts +21 -0
- package/dist/src/pm2.d.ts.map +1 -0
- package/dist/src/pm2.js +236 -0
- package/dist/src/pm2.js.map +1 -0
- package/dist/src/supergateway.d.ts +3 -0
- package/dist/src/supergateway.d.ts.map +1 -0
- package/dist/src/supergateway.js +38 -0
- package/dist/src/supergateway.js.map +1 -0
- package/dist/src/sync.d.ts +4 -0
- package/dist/src/sync.d.ts.map +1 -0
- package/dist/src/sync.js +79 -0
- package/dist/src/sync.js.map +1 -0
- package/dist/src/types.d.ts +91 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/validation.d.ts +13 -0
- package/dist/src/validation.d.ts.map +1 -0
- package/dist/src/validation.js +197 -0
- package/dist/src/validation.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
export type LogLevel = 'debug' | 'info' | 'none';
|
|
2
|
+
export interface ResourceLimits {
|
|
3
|
+
maxMemory?: string | number;
|
|
4
|
+
maxRestarts?: number;
|
|
5
|
+
restartDelay?: number;
|
|
6
|
+
}
|
|
7
|
+
export interface Settings {
|
|
8
|
+
portBase: number;
|
|
9
|
+
claudeConfigPath: string;
|
|
10
|
+
logLevel: LogLevel;
|
|
11
|
+
processPrefix: string;
|
|
12
|
+
}
|
|
13
|
+
export interface RawStdioServer {
|
|
14
|
+
type?: 'stdio';
|
|
15
|
+
command: string;
|
|
16
|
+
args?: string[];
|
|
17
|
+
env?: Record<string, string>;
|
|
18
|
+
disabled?: boolean;
|
|
19
|
+
logLevel?: LogLevel;
|
|
20
|
+
resourceLimits?: ResourceLimits;
|
|
21
|
+
}
|
|
22
|
+
export interface RawRemoteServer {
|
|
23
|
+
type: 'sse' | 'http';
|
|
24
|
+
url: string;
|
|
25
|
+
disabled?: boolean;
|
|
26
|
+
}
|
|
27
|
+
export type RawServerConfig = RawStdioServer | RawRemoteServer;
|
|
28
|
+
export interface RawConfig {
|
|
29
|
+
settings?: Partial<Settings>;
|
|
30
|
+
mcpServers?: Record<string, RawServerConfig>;
|
|
31
|
+
configPath?: string;
|
|
32
|
+
}
|
|
33
|
+
export interface StdioServer {
|
|
34
|
+
type: 'stdio';
|
|
35
|
+
command: string;
|
|
36
|
+
args: string[];
|
|
37
|
+
env: Record<string, string>;
|
|
38
|
+
internalPort: number;
|
|
39
|
+
logLevel: LogLevel;
|
|
40
|
+
resourceLimits: ResourceLimits;
|
|
41
|
+
}
|
|
42
|
+
export interface RemoteServer {
|
|
43
|
+
type: 'sse' | 'http';
|
|
44
|
+
url: string;
|
|
45
|
+
}
|
|
46
|
+
export type NormalizedServer = StdioServer | RemoteServer;
|
|
47
|
+
export interface NormalizedConfig {
|
|
48
|
+
settings: Settings;
|
|
49
|
+
mcpServers: Record<string, NormalizedServer>;
|
|
50
|
+
configPath: string | undefined;
|
|
51
|
+
}
|
|
52
|
+
export interface NamedStdioServer extends StdioServer {
|
|
53
|
+
name: string;
|
|
54
|
+
}
|
|
55
|
+
export interface SupergatewayCommand {
|
|
56
|
+
script: string;
|
|
57
|
+
args: string[];
|
|
58
|
+
}
|
|
59
|
+
export interface StartResult {
|
|
60
|
+
name: string;
|
|
61
|
+
processName: string;
|
|
62
|
+
port: number;
|
|
63
|
+
}
|
|
64
|
+
export interface ServerStatus {
|
|
65
|
+
name: string;
|
|
66
|
+
processName: string;
|
|
67
|
+
pid: number | undefined;
|
|
68
|
+
status: string;
|
|
69
|
+
uptime: number | undefined;
|
|
70
|
+
restarts: number;
|
|
71
|
+
memory: number | undefined;
|
|
72
|
+
cpu: number | undefined;
|
|
73
|
+
}
|
|
74
|
+
export interface ClaudeServerConfig {
|
|
75
|
+
type: 'sse' | 'http';
|
|
76
|
+
url: string;
|
|
77
|
+
}
|
|
78
|
+
export interface ClaudeConfig {
|
|
79
|
+
mcpServers?: Record<string, ClaudeServerConfig>;
|
|
80
|
+
[key: string]: unknown;
|
|
81
|
+
}
|
|
82
|
+
export interface SyncResult {
|
|
83
|
+
path: string;
|
|
84
|
+
servers: string[];
|
|
85
|
+
merged: boolean;
|
|
86
|
+
}
|
|
87
|
+
export interface RemoveResult {
|
|
88
|
+
path: string;
|
|
89
|
+
removed: string[];
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AAEjD,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,QAAQ,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,MAAM,eAAe,GAAG,cAAc,GAAG,eAAe,CAAC;AAE/D,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,QAAQ,CAAC;IACnB,cAAc,EAAE,cAAc,CAAC;CAChC;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,YAAY,CAAC;AAE1D,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,QAAQ,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC7C,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC;AAED,MAAM,WAAW,gBAAiB,SAAQ,WAAW;IACnD,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAChD,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { RawConfig } from './types.js';
|
|
2
|
+
export interface ValidationError {
|
|
3
|
+
path: string;
|
|
4
|
+
message: string;
|
|
5
|
+
}
|
|
6
|
+
export interface ValidationResult {
|
|
7
|
+
valid: boolean;
|
|
8
|
+
errors: ValidationError[];
|
|
9
|
+
}
|
|
10
|
+
export declare function validateConfig(config: unknown): ValidationResult;
|
|
11
|
+
export declare function formatValidationErrors(errors: ValidationError[]): string;
|
|
12
|
+
export declare function assertValidConfig(config: unknown): asserts config is RawConfig;
|
|
13
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAY,MAAM,YAAY,CAAC;AAEtD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AA6ND,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,gBAAgB,CAyBhE;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,CAIxE;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,IAAI,SAAS,CAO9E"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
const VALID_LOG_LEVELS = ['debug', 'info', 'none'];
|
|
2
|
+
const VALID_SERVER_TYPES = ['stdio', 'sse', 'http'];
|
|
3
|
+
function addError(errors, path, message) {
|
|
4
|
+
errors.push({ path, message });
|
|
5
|
+
}
|
|
6
|
+
function isObject(value) {
|
|
7
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
8
|
+
}
|
|
9
|
+
function validateSettings(settings, errors) {
|
|
10
|
+
if (settings === undefined)
|
|
11
|
+
return;
|
|
12
|
+
if (!isObject(settings)) {
|
|
13
|
+
addError(errors, 'settings', 'must be an object');
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
if ('portBase' in settings) {
|
|
17
|
+
const portBase = settings['portBase'];
|
|
18
|
+
if (typeof portBase !== 'number') {
|
|
19
|
+
addError(errors, 'settings.portBase', 'must be a number');
|
|
20
|
+
}
|
|
21
|
+
else if (portBase < 1 || portBase > 65535) {
|
|
22
|
+
addError(errors, 'settings.portBase', 'must be between 1 and 65535');
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
if ('claudeConfigPath' in settings) {
|
|
26
|
+
if (typeof settings['claudeConfigPath'] !== 'string') {
|
|
27
|
+
addError(errors, 'settings.claudeConfigPath', 'must be a string');
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
if ('logLevel' in settings) {
|
|
31
|
+
if (!VALID_LOG_LEVELS.includes(settings['logLevel'])) {
|
|
32
|
+
addError(errors, 'settings.logLevel', `must be one of: ${VALID_LOG_LEVELS.join(', ')}`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function validateResourceLimits(limits, path, errors) {
|
|
37
|
+
if (!isObject(limits)) {
|
|
38
|
+
addError(errors, path, 'must be an object');
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
if ('maxMemory' in limits) {
|
|
42
|
+
const mem = limits['maxMemory'];
|
|
43
|
+
if (typeof mem !== 'string' && typeof mem !== 'number') {
|
|
44
|
+
addError(errors, `${path}.maxMemory`, 'must be a string (e.g., "512M") or number (bytes)');
|
|
45
|
+
}
|
|
46
|
+
else if (typeof mem === 'string' && !/^\d+[KMG]?$/i.test(mem)) {
|
|
47
|
+
addError(errors, `${path}.maxMemory`, 'invalid format, use number or string like "512M", "1G"');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if ('maxRestarts' in limits) {
|
|
51
|
+
const maxRestarts = limits['maxRestarts'];
|
|
52
|
+
if (typeof maxRestarts !== 'number' || maxRestarts < 0) {
|
|
53
|
+
addError(errors, `${path}.maxRestarts`, 'must be a non-negative number');
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if ('restartDelay' in limits) {
|
|
57
|
+
const restartDelay = limits['restartDelay'];
|
|
58
|
+
if (typeof restartDelay !== 'number' || restartDelay < 0) {
|
|
59
|
+
addError(errors, `${path}.restartDelay`, 'must be a non-negative number (milliseconds)');
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function validateStdioServer(server, path, errors) {
|
|
64
|
+
const command = server['command'];
|
|
65
|
+
if (!('command' in server) || typeof command !== 'string') {
|
|
66
|
+
addError(errors, `${path}.command`, 'is required and must be a string');
|
|
67
|
+
}
|
|
68
|
+
else if (command.trim() === '') {
|
|
69
|
+
addError(errors, `${path}.command`, 'cannot be empty');
|
|
70
|
+
}
|
|
71
|
+
if ('args' in server) {
|
|
72
|
+
const args = server['args'];
|
|
73
|
+
if (!Array.isArray(args)) {
|
|
74
|
+
addError(errors, `${path}.args`, 'must be an array');
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
for (let i = 0; i < args.length; i++) {
|
|
78
|
+
if (typeof args[i] !== 'string') {
|
|
79
|
+
addError(errors, `${path}.args[${String(i)}]`, 'must be a string');
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if ('env' in server) {
|
|
85
|
+
const env = server['env'];
|
|
86
|
+
if (!isObject(env)) {
|
|
87
|
+
addError(errors, `${path}.env`, 'must be an object');
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
for (const [key, value] of Object.entries(env)) {
|
|
91
|
+
if (typeof value !== 'string') {
|
|
92
|
+
addError(errors, `${path}.env.${key}`, 'must be a string');
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
if ('logLevel' in server) {
|
|
98
|
+
if (!VALID_LOG_LEVELS.includes(server['logLevel'])) {
|
|
99
|
+
addError(errors, `${path}.logLevel`, `must be one of: ${VALID_LOG_LEVELS.join(', ')}`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if ('resourceLimits' in server) {
|
|
103
|
+
validateResourceLimits(server['resourceLimits'], `${path}.resourceLimits`, errors);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
function validateRemoteServer(server, path, errors) {
|
|
107
|
+
const url = server['url'];
|
|
108
|
+
if (!('url' in server) || typeof url !== 'string') {
|
|
109
|
+
addError(errors, `${path}.url`, 'is required and must be a string');
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
try {
|
|
113
|
+
new URL(url);
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
addError(errors, `${path}.url`, 'must be a valid URL');
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
function validateServer(name, server, errors) {
|
|
121
|
+
const path = `mcpServers.${name}`;
|
|
122
|
+
if (!isObject(server)) {
|
|
123
|
+
addError(errors, path, 'must be an object');
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
// Validate disabled field
|
|
127
|
+
if ('disabled' in server && typeof server['disabled'] !== 'boolean') {
|
|
128
|
+
addError(errors, `${path}.disabled`, 'must be a boolean');
|
|
129
|
+
}
|
|
130
|
+
// Determine type
|
|
131
|
+
const explicitType = server['type'];
|
|
132
|
+
const inferredType = 'command' in server ? 'stdio' : 'http';
|
|
133
|
+
const type = explicitType ?? inferredType;
|
|
134
|
+
if (explicitType !== undefined && !VALID_SERVER_TYPES.includes(explicitType)) {
|
|
135
|
+
addError(errors, `${path}.type`, `must be one of: ${VALID_SERVER_TYPES.join(', ')}`);
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
if (type === 'stdio') {
|
|
139
|
+
validateStdioServer(server, path, errors);
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
validateRemoteServer(server, path, errors);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
function validateMcpServers(mcpServers, errors) {
|
|
146
|
+
if (mcpServers === undefined)
|
|
147
|
+
return;
|
|
148
|
+
if (!isObject(mcpServers)) {
|
|
149
|
+
addError(errors, 'mcpServers', 'must be an object');
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
if (Object.keys(mcpServers).length === 0) {
|
|
153
|
+
addError(errors, 'mcpServers', 'must contain at least one server');
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
for (const [name, server] of Object.entries(mcpServers)) {
|
|
157
|
+
// Validate server name
|
|
158
|
+
if (!/^[a-zA-Z0-9_-]+$/.test(name)) {
|
|
159
|
+
addError(errors, `mcpServers.${name}`, 'server name must contain only alphanumeric characters, hyphens, and underscores');
|
|
160
|
+
}
|
|
161
|
+
validateServer(name, server, errors);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
export function validateConfig(config) {
|
|
165
|
+
const errors = [];
|
|
166
|
+
if (!isObject(config)) {
|
|
167
|
+
return {
|
|
168
|
+
valid: false,
|
|
169
|
+
errors: [{ path: '', message: 'config must be an object' }],
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
// Check for unknown top-level keys
|
|
173
|
+
const knownKeys = ['settings', 'mcpServers', 'configPath'];
|
|
174
|
+
for (const key of Object.keys(config)) {
|
|
175
|
+
if (!knownKeys.includes(key)) {
|
|
176
|
+
addError(errors, key, `unknown configuration key "${key}"`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
validateSettings(config['settings'], errors);
|
|
180
|
+
validateMcpServers(config['mcpServers'], errors);
|
|
181
|
+
return {
|
|
182
|
+
valid: errors.length === 0,
|
|
183
|
+
errors,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
export function formatValidationErrors(errors) {
|
|
187
|
+
return errors
|
|
188
|
+
.map((e) => ` - ${e.path ? `${e.path}: ` : ''}${e.message}`)
|
|
189
|
+
.join('\n');
|
|
190
|
+
}
|
|
191
|
+
export function assertValidConfig(config) {
|
|
192
|
+
const result = validateConfig(config);
|
|
193
|
+
if (!result.valid) {
|
|
194
|
+
throw new Error(`Invalid configuration:\n${formatValidationErrors(result.errors)}`);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/validation.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "mcp-compose",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "MCP server orchestration tool - manage multiple MCP servers with a single gateway",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"mcp-compose": "./dist/bin/mcp-compose.js"
|
|
8
|
+
},
|
|
9
|
+
"main": "./dist/src/index.js",
|
|
10
|
+
"types": "./dist/src/index.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./dist/src/index.d.ts",
|
|
14
|
+
"import": "./dist/src/index.js"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist"
|
|
19
|
+
],
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "tsc",
|
|
22
|
+
"clean": "rm -rf dist",
|
|
23
|
+
"lint": "eslint src bin",
|
|
24
|
+
"lint:fix": "eslint src bin --fix",
|
|
25
|
+
"typecheck": "tsc --noEmit",
|
|
26
|
+
"prepublishOnly": "npm run clean && npm run build",
|
|
27
|
+
"start": "node dist/bin/mcp-compose.js"
|
|
28
|
+
},
|
|
29
|
+
"keywords": [
|
|
30
|
+
"mcp",
|
|
31
|
+
"model-context-protocol",
|
|
32
|
+
"claude",
|
|
33
|
+
"ai",
|
|
34
|
+
"orchestration"
|
|
35
|
+
],
|
|
36
|
+
"author": "unsafe9",
|
|
37
|
+
"license": "MIT",
|
|
38
|
+
"repository": {
|
|
39
|
+
"type": "git",
|
|
40
|
+
"url": "git+https://github.com/unsafe9/mcp-compose.git"
|
|
41
|
+
},
|
|
42
|
+
"homepage": "https://github.com/unsafe9/mcp-compose#readme",
|
|
43
|
+
"bugs": {
|
|
44
|
+
"url": "https://github.com/unsafe9/mcp-compose/issues"
|
|
45
|
+
},
|
|
46
|
+
"dependencies": {
|
|
47
|
+
"commander": "^12.1.0",
|
|
48
|
+
"pm2": "^5.4.3"
|
|
49
|
+
},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"@eslint/js": "^9.39.2",
|
|
52
|
+
"@types/node": "^25.0.3",
|
|
53
|
+
"eslint": "^9.39.2",
|
|
54
|
+
"typescript": "^5.9.3",
|
|
55
|
+
"typescript-eslint": "^8.52.0"
|
|
56
|
+
}
|
|
57
|
+
}
|