mcp-compose 0.3.0 → 0.4.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 +80 -4
- package/dist/bin/mcp-compose.js +78 -20
- package/dist/bin/mcp-compose.js.map +1 -1
- package/dist/bin/mcp-gateway.js +92 -17
- package/dist/bin/mcp-gateway.js.map +1 -1
- package/dist/package.json +21 -3
- package/dist/src/command.d.ts +5 -1
- package/dist/src/command.d.ts.map +1 -1
- package/dist/src/command.js +24 -22
- package/dist/src/command.js.map +1 -1
- package/dist/src/config.d.ts +4 -1
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +20 -4
- package/dist/src/config.js.map +1 -1
- package/dist/src/gateway.d.ts +1 -0
- package/dist/src/gateway.d.ts.map +1 -1
- package/dist/src/gateway.js +2070 -222
- package/dist/src/gateway.js.map +1 -1
- package/dist/src/oauth.d.ts +27 -3
- package/dist/src/oauth.d.ts.map +1 -1
- package/dist/src/oauth.js +557 -78
- package/dist/src/oauth.js.map +1 -1
- package/dist/src/pm2-args.d.ts +2 -0
- package/dist/src/pm2-args.d.ts.map +1 -0
- package/dist/src/pm2-args.js +19 -0
- package/dist/src/pm2-args.js.map +1 -0
- package/dist/src/pm2.d.ts +3 -1
- package/dist/src/pm2.d.ts.map +1 -1
- package/dist/src/pm2.js +85 -75
- package/dist/src/pm2.js.map +1 -1
- package/dist/src/process-tree.d.ts +4 -0
- package/dist/src/process-tree.d.ts.map +1 -0
- package/dist/src/process-tree.js +81 -0
- package/dist/src/process-tree.js.map +1 -0
- package/dist/src/sync.d.ts.map +1 -1
- package/dist/src/sync.js +70 -4
- package/dist/src/sync.js.map +1 -1
- package/dist/src/types.d.ts +9 -0
- package/dist/src/types.d.ts.map +1 -1
- package/package.json +21 -3
package/README.md
CHANGED
|
@@ -120,10 +120,12 @@ Passthrough to remote MCP servers. No local process is started by default.
|
|
|
120
120
|
| `url` | string | Yes | Remote server URL |
|
|
121
121
|
| `disabled` | boolean | No | Skip this server |
|
|
122
122
|
| `proxy` | boolean | No | Enable local proxy with OAuth support (see below) |
|
|
123
|
-
| `headers` | object | No | Custom headers to send to the remote server
|
|
123
|
+
| `headers` | object | No | Custom headers to send to the remote server |
|
|
124
124
|
| `logLevel` | string | No | Override log level (proxy mode only) |
|
|
125
125
|
| `resourceLimits` | object | No | Process resource limits (proxy mode only) |
|
|
126
126
|
|
|
127
|
+
Without `proxy`, headers are written into the generated Claude Code and Codex configs, so any secret they carry ends up in plain text on disk. Use `"proxy": true` to keep the secret inside the gateway process instead.
|
|
128
|
+
|
|
127
129
|
#### Remote Server with OAuth Proxy
|
|
128
130
|
|
|
129
131
|
Remote servers with `"proxy": true` are proxied through a local gateway process that handles the full OAuth 2.0 lifecycle automatically. This solves the common issue where OAuth tokens expire and break MCP connections between sessions.
|
|
@@ -235,13 +237,67 @@ Add `"disabled": true` to skip a server without removing its config:
|
|
|
235
237
|
}
|
|
236
238
|
```
|
|
237
239
|
|
|
240
|
+
### Tip: 1Password CLI Secrets
|
|
241
|
+
|
|
242
|
+
Use 1Password secret references when MCP servers need API keys or tokens. This lets you unlock 1Password once, start all long-running MCP servers with resolved credentials, and then run each agent session without handing credentials to the agent itself.
|
|
243
|
+
|
|
244
|
+
`mcp-compose` expands environment variables in its JSON config before starting servers, so keep the 1Password paths in a local env file:
|
|
245
|
+
|
|
246
|
+
```dotenv
|
|
247
|
+
# mcp-compose.env
|
|
248
|
+
GITHUB_PERSONAL_ACCESS_TOKEN=op://Private/github-mcp/token
|
|
249
|
+
FIRECRAWL_API_KEY=op://Private/firecrawl/api-key
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
Then reference those variables from `mcp-compose.json`:
|
|
253
|
+
|
|
254
|
+
```json
|
|
255
|
+
{
|
|
256
|
+
"mcpServers": {
|
|
257
|
+
"github": {
|
|
258
|
+
"command": "docker",
|
|
259
|
+
"args": ["run", "-i", "--rm", "-e", "GITHUB_PERSONAL_ACCESS_TOKEN", "ghcr.io/github/github-mcp-server"],
|
|
260
|
+
"env": {
|
|
261
|
+
"GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_PERSONAL_ACCESS_TOKEN}"
|
|
262
|
+
}
|
|
263
|
+
},
|
|
264
|
+
"firecrawl": {
|
|
265
|
+
"command": "npx",
|
|
266
|
+
"args": ["-y", "firecrawl-mcp"],
|
|
267
|
+
"env": {
|
|
268
|
+
"FIRECRAWL_API_KEY": "${FIRECRAWL_API_KEY}"
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
Start or restart the servers through `op run`:
|
|
276
|
+
|
|
277
|
+
```bash
|
|
278
|
+
op signin
|
|
279
|
+
op run --env-file ./mcp-compose.env -- mcp-compose up
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
`op signin` only prompts when the CLI is not already authenticated. If multiple 1Password accounts are configured, choose one with `op --account <account> run ...` or set `OP_ACCOUNT`. `op run` resolves environment variables whose values are `op://vault/item/field` secret references before `mcp-compose` starts the managed servers. This keeps plaintext secrets out of the tracked config and agent config, but the managed MCP server process still receives the resolved environment variables. Secret output is masked by default.
|
|
283
|
+
|
|
284
|
+
`op inject` can also resolve `{{ op://vault/item/field }}` placeholders into a temporary config file, but this is not recommended because the output file contains plaintext secrets:
|
|
285
|
+
|
|
286
|
+
```bash
|
|
287
|
+
op inject -i mcp-compose.1password.json -o /tmp/mcp-compose.json
|
|
288
|
+
mcp-compose -c /tmp/mcp-compose.json up
|
|
289
|
+
rm /tmp/mcp-compose.json
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
Prefer the `op run --env-file` flow so the tracked config contains only environment variable names and the env file contains only 1Password references.
|
|
293
|
+
|
|
238
294
|
## CLI Reference
|
|
239
295
|
|
|
240
296
|
```
|
|
241
297
|
mcp-compose up [servers...] Start or update servers (only restarts changed configs)
|
|
242
298
|
mcp-compose down [servers...] Stop servers
|
|
243
299
|
mcp-compose restart [servers...] Restart servers
|
|
244
|
-
mcp-compose status Show
|
|
300
|
+
mcp-compose status Show configured servers and their processes
|
|
245
301
|
mcp-compose logs [server] [-f] View logs (follow with -f)
|
|
246
302
|
```
|
|
247
303
|
|
|
@@ -280,7 +336,7 @@ mcp-compose logs -f
|
|
|
280
336
|
|
|
281
337
|
## How It Works
|
|
282
338
|
|
|
283
|
-
1. **stdio servers**: Wrapped by a built-in gateway that bridges stdio to [MCP Streamable HTTP](https://modelcontextprotocol.io/specification/
|
|
339
|
+
1. **stdio servers**: Wrapped by a built-in gateway that bridges stdio to [MCP Streamable HTTP](https://modelcontextprotocol.io/specification/2026-07-28/basic/transports), managed by pm2
|
|
284
340
|
2. **Remote servers**: Registered directly in Claude Code config (no local process)
|
|
285
341
|
3. **Remote servers with proxy**: Proxied through a local gateway with built-in OAuth 2.0 lifecycle management (PKCE, token refresh)
|
|
286
342
|
4. **Config sync**: Auto-updates `~/.mcp.json` for Claude Code and `~/.codex/config.toml` for Codex CLI
|
|
@@ -288,6 +344,26 @@ mcp-compose logs -f
|
|
|
288
344
|
|
|
289
345
|
Each managed server gets an internal port starting from `portBase` (default 19100). If a port is in use, the next available port is automatically selected.
|
|
290
346
|
|
|
347
|
+
### Gateway compatibility
|
|
348
|
+
|
|
349
|
+
The gateway supports the stateless [MCP 2026-07-28 transport](https://modelcontextprotocol.io/specification/2026-07-28/basic/transports) and the earlier session-based transport. It detects the client and backend eras independently, so a modern client can use a legacy backend and a legacy client can use a modern backend.
|
|
350
|
+
|
|
351
|
+
For a modern request, `_meta.io.modelcontextprotocol/protocolVersion` and `_meta.io.modelcontextprotocol/clientCapabilities` are required and must agree with `MCP-Protocol-Version`. `Mcp-Method` must match the JSON-RPC method. `Mcp-Name` is required only for `tools/call`, `prompts/get`, and `resources/read`, where it must match the named tool, prompt, or resource. Mismatched, missing, malformed, unsupported, or extra routing headers are rejected before forwarding.
|
|
352
|
+
|
|
353
|
+
Modern-to-modern proxy traffic is relayed without legacy compatibility handling, including the client request ID and request-scoped SSE events. The gateway synthesizes only the explicit era bridge: `initialize` and `server/discover`, session metadata, completion markers, resource-not-found error codes, and legacy-only methods. When a legacy client uses a modern backend, its `clientInfo` and capabilities become the modern per-request metadata. A legacy backend is initialized once by the gateway, rather than once per downstream client session.
|
|
354
|
+
|
|
355
|
+
`subscriptions/listen` uses the standard `notifications` filter object and a separate SSE stream. A locally synthesized legacy subscription first emits `notifications/subscriptions/acknowledged`, then matches backend notification methods against the requested standard or extension filters; every frame carries `_meta.io.modelcontextprotocol/subscriptionId` equal to the listen request's JSON-RPC ID. Internal ownership keeps identical request IDs from different clients isolated. Modern backends retain their own subscription stream unchanged for both client eras. Request-scoped events never leak into a subscription, and legacy change notifications never leak into an unrelated request. Idle locally synthesized streams send keep-alive comments.
|
|
356
|
+
|
|
357
|
+
For proxy servers, configured headers, supported protocol metadata, and `Mcp-Param-*` extension headers are forwarded upstream; arbitrary client headers are not. The gateway preserves an upstream status and only the safe response headers (`Content-Type`, `Cache-Control`, `WWW-Authenticate`, and `MCP-Protocol-Version`) for same-era proxy responses. Cross-era responses use gateway-generated transport metadata.
|
|
358
|
+
|
|
359
|
+
The local endpoint accepts requests without an `Origin` header for native MCP clients. Browser requests must use a literal loopback origin (`localhost`, `127.0.0.1`, or `[::1]`); other origins are rejected and not reflected in CORS headers.
|
|
360
|
+
|
|
361
|
+
Managed OAuth follows the [MCP authorization specification](https://modelcontextprotocol.io/specification/2026-07-28/basic/authorization): it requires advertised PKCE `S256` support, verifies that protected-resource metadata binds to the exact requested resource, validates the exact authorization-server issuer and callback issuer, and cancels discovery, token work, and the callback listener when the client request ends. A `Bearer` challenge scope is authoritative; when it is absent on an initial authorization, protected-resource `scopes_supported` supplies the scope. A 401 challenge or 403 `insufficient_scope` response can start authorization. Step-up requests the union of the existing grant and newly challenged scopes, while an unscoped retry retains the existing grant and refresh never expands it. Only `Bearer` token responses are forwarded to the MCP server.
|
|
362
|
+
|
|
363
|
+
In passthrough mode, a shared legacy upstream session, including the deprecated HTTP+SSE (`"type": "sse"`) transport, is bound to the credential that created it. A request with another credential is rejected until that session closes; its cleanup uses the owning credential. An HTTP+SSE server may advertise a message endpoint only on the configured upstream origin. Modern upstream requests remain independently credentialed.
|
|
364
|
+
|
|
365
|
+
The gateway does not translate legacy server-initiated sampling, elicitation, or roots requests into multi-round-trip requests (MRTR). Those requests are dropped rather than being delivered on another request or subscription stream.
|
|
366
|
+
|
|
291
367
|
## Features
|
|
292
368
|
|
|
293
369
|
- **Zero external dependencies for transport**: Built-in MCP gateway replaces supergateway and mcp-remote
|
|
@@ -297,7 +373,7 @@ Each managed server gets an internal port starting from `portBase` (default 1910
|
|
|
297
373
|
- **Config validation**: Validates configuration structure with helpful error messages
|
|
298
374
|
- **Resource limits**: Control memory usage and restart behavior per server
|
|
299
375
|
- **Process management**: Auto-restart with configurable limits via pm2
|
|
300
|
-
- **Non-destructive config sync**: Merges with existing Claude Code config
|
|
376
|
+
- **Non-destructive config sync**: Merges with existing Claude Code config, and drops only the entries it wrote itself once a server is disabled or removed
|
|
301
377
|
|
|
302
378
|
## Requirements
|
|
303
379
|
|
package/dist/bin/mcp-compose.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { Command } from 'commander';
|
|
3
|
-
import { loadConfig, getManagedServers, getServerNames, } from '../src/config.js';
|
|
3
|
+
import { loadConfig, getManagedServers, getRemoteServers, getServerNames, isRemoteServer, } from '../src/config.js';
|
|
4
4
|
import pkg from '../package.json' with { type: 'json' };
|
|
5
5
|
const { version } = pkg;
|
|
6
6
|
import { startServers, stopServers, stopAllManagedServers, stopOrphanedServers, restartServers, getStatus, streamLogs, } from '../src/pm2.js';
|
|
@@ -34,6 +34,26 @@ function printProgress(event) {
|
|
|
34
34
|
if (msg)
|
|
35
35
|
console.log(msg);
|
|
36
36
|
}
|
|
37
|
+
function printRemoved(removed) {
|
|
38
|
+
if (removed.length > 0) {
|
|
39
|
+
console.log(` Removed disabled/deleted: ${removed.join(', ')}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// Anything not listed here is a pm2 failure state (stopped, errored, ...) and shows red
|
|
43
|
+
const STATUS_COLORS = {
|
|
44
|
+
online: '\x1b[32m',
|
|
45
|
+
remote: '\x1b[36m',
|
|
46
|
+
'not started': '\x1b[90m',
|
|
47
|
+
};
|
|
48
|
+
function toStatusRow(s) {
|
|
49
|
+
return {
|
|
50
|
+
name: s.name,
|
|
51
|
+
status: s.status,
|
|
52
|
+
pid: String(s.pid ?? '-'),
|
|
53
|
+
memory: s.memory ? `${String(Math.round(s.memory / 1024 / 1024))}MB` : '-',
|
|
54
|
+
restarts: String(s.restarts),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
37
57
|
const program = new Command();
|
|
38
58
|
function getConfigPath(cmd) {
|
|
39
59
|
return cmd.parent?.opts().config;
|
|
@@ -57,14 +77,18 @@ program
|
|
|
57
77
|
const config = loadConfig(getConfigPath(cmd));
|
|
58
78
|
const { processPrefix, portBase } = config.settings;
|
|
59
79
|
const managedServers = getManagedServers(config);
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
80
|
+
const matchesFilter = (name) => servers.length === 0 || servers.includes(name);
|
|
81
|
+
const filteredServers = managedServers.filter((s) => matchesFilter(s.name));
|
|
82
|
+
const remoteNames = getRemoteServers(config)
|
|
83
|
+
.map((s) => s.name)
|
|
84
|
+
.filter(matchesFilter);
|
|
85
|
+
if (filteredServers.length === 0 && remoteNames.length === 0 && servers.length > 0) {
|
|
86
|
+
console.log('No servers match the filter.');
|
|
65
87
|
}
|
|
66
88
|
if (filteredServers.length > 0) {
|
|
67
|
-
const results = await startServers(filteredServers, processPrefix, portBase, printProgress
|
|
89
|
+
const results = await startServers(filteredServers, processPrefix, portBase, printProgress, {
|
|
90
|
+
configPath: config.configPath,
|
|
91
|
+
});
|
|
68
92
|
// Update config with actual running ports before syncing
|
|
69
93
|
for (const result of results) {
|
|
70
94
|
const server = config.mcpServers[result.name];
|
|
@@ -73,10 +97,17 @@ program
|
|
|
73
97
|
}
|
|
74
98
|
}
|
|
75
99
|
}
|
|
76
|
-
//
|
|
100
|
+
// Remote servers run no local process, so nothing above reports them.
|
|
101
|
+
// List them anyway, otherwise `up` looks like it dropped them.
|
|
102
|
+
for (const name of remoteNames) {
|
|
103
|
+
console.log(` ${name} is remote (no local process)`);
|
|
104
|
+
}
|
|
105
|
+
// When starting all servers, clean up orphaned processes from removed servers.
|
|
106
|
+
// Only managed names survive here, so dropping `proxy` from a remote server
|
|
107
|
+
// also stops the gateway it used to run behind.
|
|
77
108
|
if (servers.length === 0) {
|
|
78
|
-
const
|
|
79
|
-
const orphaned = await stopOrphanedServers(
|
|
109
|
+
const managedNames = managedServers.map((s) => s.name);
|
|
110
|
+
const orphaned = await stopOrphanedServers(managedNames, processPrefix, printProgress);
|
|
80
111
|
if (orphaned.length > 0) {
|
|
81
112
|
console.log('');
|
|
82
113
|
console.log(` Cleaned up ${String(orphaned.length)} removed server(s): ${orphaned.join(', ')}`);
|
|
@@ -85,8 +116,10 @@ program
|
|
|
85
116
|
console.log('');
|
|
86
117
|
const claudeResult = syncToClaudeConfig(config);
|
|
87
118
|
console.log(` ✓ Synced ${claudeResult.path}`);
|
|
119
|
+
printRemoved(claudeResult.removed);
|
|
88
120
|
const codexResult = syncToCodexConfig(config);
|
|
89
121
|
console.log(` ✓ Synced ${codexResult.path}`);
|
|
122
|
+
printRemoved(codexResult.removed);
|
|
90
123
|
if (codexResult.skipped.length > 0) {
|
|
91
124
|
console.log(` ⚠ Skipped (codex requires streamable HTTP, use proxy:true for SSE): ${codexResult.skipped.join(', ')}`);
|
|
92
125
|
}
|
|
@@ -158,23 +191,40 @@ program
|
|
|
158
191
|
program
|
|
159
192
|
.command('status')
|
|
160
193
|
.description('Show status of MCP servers')
|
|
161
|
-
.action(async () => {
|
|
194
|
+
.action(async (_options, cmd) => {
|
|
162
195
|
try {
|
|
163
|
-
const
|
|
164
|
-
|
|
196
|
+
const config = loadConfig(getConfigPath(cmd));
|
|
197
|
+
const running = new Map((await getStatus()).map((s) => [s.name, s]));
|
|
198
|
+
const rows = [];
|
|
199
|
+
for (const [name, server] of Object.entries(config.mcpServers)) {
|
|
200
|
+
if (isRemoteServer(server)) {
|
|
201
|
+
rows.push({ name, status: 'remote', pid: '-', memory: '-', restarts: '-' });
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
204
|
+
const proc = running.get(name);
|
|
205
|
+
if (proc) {
|
|
206
|
+
rows.push(toStatusRow(proc));
|
|
207
|
+
running.delete(name);
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
rows.push({ name, status: 'not started', pid: '-', memory: '-', restarts: '-' });
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
// Processes left over from servers the config no longer declares
|
|
214
|
+
for (const proc of running.values()) {
|
|
215
|
+
rows.push(toStatusRow(proc));
|
|
216
|
+
}
|
|
217
|
+
if (rows.length === 0) {
|
|
165
218
|
console.log('No MCP servers running.');
|
|
166
219
|
return;
|
|
167
220
|
}
|
|
168
221
|
console.log('MCP Servers:\n');
|
|
169
|
-
console.log(' Name Status
|
|
222
|
+
console.log(' Name Status PID Memory Restarts');
|
|
170
223
|
console.log(' ' + '-'.repeat(65));
|
|
171
|
-
for (const
|
|
172
|
-
const
|
|
173
|
-
? `${String(Math.round(s.memory / 1024 / 1024))}MB`
|
|
174
|
-
: '-';
|
|
175
|
-
const statusColor = s.status === 'online' ? '\x1b[32m' : '\x1b[31m';
|
|
224
|
+
for (const row of rows) {
|
|
225
|
+
const color = STATUS_COLORS[row.status] ?? '\x1b[31m';
|
|
176
226
|
const reset = '\x1b[0m';
|
|
177
|
-
console.log(` ${
|
|
227
|
+
console.log(` ${row.name.padEnd(20)} ${color}${row.status.padEnd(12)}${reset} ${row.pid.padEnd(8)} ${row.memory.padEnd(10)} ${row.restarts}`);
|
|
178
228
|
}
|
|
179
229
|
}
|
|
180
230
|
catch (err) {
|
|
@@ -191,6 +241,14 @@ program
|
|
|
191
241
|
try {
|
|
192
242
|
const config = loadConfig(getConfigPath(cmd));
|
|
193
243
|
const { processPrefix } = config.settings;
|
|
244
|
+
const remoteNames = getRemoteServers(config).map((s) => s.name);
|
|
245
|
+
if (server !== undefined && remoteNames.includes(server)) {
|
|
246
|
+
console.log(`${server} is remote (no local process, so no logs)`);
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
if (server === undefined && remoteNames.length > 0) {
|
|
250
|
+
console.log(`Remote servers have no logs: ${remoteNames.join(', ')}\n`);
|
|
251
|
+
}
|
|
194
252
|
streamLogs(server, processPrefix, { follow: options.follow, err: options.err });
|
|
195
253
|
}
|
|
196
254
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-compose.js","sourceRoot":"","sources":["../../bin/mcp-compose.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mcp-compose.js","sourceRoot":"","sources":["../../bin/mcp-compose.ts"],"names":[],"mappings":"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"}
|
package/dist/bin/mcp-gateway.js
CHANGED
|
@@ -1,10 +1,52 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createGateway } from '../src/gateway.js';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
import { loadConfig } from '../src/config.js';
|
|
4
|
+
function parseArgs(argv) {
|
|
5
|
+
const parsed = { commandArgs: [] };
|
|
6
|
+
for (let i = 0; i < argv.length; i++) {
|
|
7
|
+
const name = argv[i];
|
|
8
|
+
if (!name?.startsWith('--'))
|
|
9
|
+
continue;
|
|
10
|
+
const value = argv[i + 1];
|
|
11
|
+
if (value === undefined)
|
|
12
|
+
break;
|
|
13
|
+
switch (name) {
|
|
14
|
+
case '--config':
|
|
15
|
+
parsed.configPath = value;
|
|
16
|
+
break;
|
|
17
|
+
case '--server':
|
|
18
|
+
parsed.serverName = value;
|
|
19
|
+
break;
|
|
20
|
+
case '--command':
|
|
21
|
+
parsed.command = value;
|
|
22
|
+
break;
|
|
23
|
+
case '--command-arg':
|
|
24
|
+
parsed.commandArgs.push(value);
|
|
25
|
+
break;
|
|
26
|
+
case '--url':
|
|
27
|
+
parsed.url = value;
|
|
28
|
+
break;
|
|
29
|
+
case '--transport':
|
|
30
|
+
parsed.transport = value;
|
|
31
|
+
break;
|
|
32
|
+
case '--headers':
|
|
33
|
+
parsed.headers = value;
|
|
34
|
+
break;
|
|
35
|
+
case '--auth-mode':
|
|
36
|
+
parsed.authMode = value;
|
|
37
|
+
break;
|
|
38
|
+
case '--port':
|
|
39
|
+
parsed.port = value;
|
|
40
|
+
break;
|
|
41
|
+
case '--log-level':
|
|
42
|
+
parsed.logLevel = value;
|
|
43
|
+
break;
|
|
44
|
+
default:
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
i++;
|
|
48
|
+
}
|
|
49
|
+
return parsed;
|
|
8
50
|
}
|
|
9
51
|
function parseHeaders(raw) {
|
|
10
52
|
if (!raw)
|
|
@@ -32,19 +74,51 @@ function parseHeaders(raw) {
|
|
|
32
74
|
}
|
|
33
75
|
return result;
|
|
34
76
|
}
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
77
|
+
const cliArgs = parseArgs(process.argv.slice(2));
|
|
78
|
+
function parsePort(raw, fallback) {
|
|
79
|
+
if (!raw)
|
|
80
|
+
return fallback;
|
|
81
|
+
return parseInt(raw, 10);
|
|
82
|
+
}
|
|
40
83
|
let options;
|
|
41
|
-
if (
|
|
42
|
-
|
|
84
|
+
if (cliArgs.configPath || cliArgs.serverName) {
|
|
85
|
+
if (!cliArgs.configPath || !cliArgs.serverName) {
|
|
86
|
+
process.stderr.write('--config and --server must be provided together\n');
|
|
87
|
+
process.exit(1);
|
|
88
|
+
}
|
|
89
|
+
const config = loadConfig(cliArgs.configPath);
|
|
90
|
+
const server = config.mcpServers[cliArgs.serverName];
|
|
91
|
+
if (!server) {
|
|
92
|
+
process.stderr.write(`Unknown server "${cliArgs.serverName}" in ${cliArgs.configPath}\n`);
|
|
93
|
+
process.exit(1);
|
|
94
|
+
}
|
|
95
|
+
if (server.type !== 'proxy') {
|
|
96
|
+
process.stderr.write(`--server "${cliArgs.serverName}" must select a proxy server\n`);
|
|
97
|
+
process.exit(1);
|
|
98
|
+
}
|
|
99
|
+
options = {
|
|
100
|
+
mode: 'proxy',
|
|
101
|
+
port: parsePort(cliArgs.port, server.internalPort),
|
|
102
|
+
url: server.url,
|
|
103
|
+
transport: server.transport,
|
|
104
|
+
headers: server.headers,
|
|
105
|
+
authMode: server.authMode,
|
|
106
|
+
logLevel: server.logLevel,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
else if (cliArgs.command !== undefined) {
|
|
110
|
+
const port = parsePort(cliArgs.port, 19100);
|
|
111
|
+
const logLevel = (cliArgs.logLevel ?? 'info');
|
|
112
|
+
const command = cliArgs.command;
|
|
113
|
+
options = { mode: 'stdio', port, command, args: cliArgs.commandArgs, logLevel };
|
|
43
114
|
}
|
|
44
|
-
else if (url) {
|
|
45
|
-
const
|
|
46
|
-
const
|
|
47
|
-
const
|
|
115
|
+
else if (cliArgs.url) {
|
|
116
|
+
const port = parsePort(cliArgs.port, 19100);
|
|
117
|
+
const logLevel = (cliArgs.logLevel ?? 'info');
|
|
118
|
+
const url = cliArgs.url;
|
|
119
|
+
const transport = (cliArgs.transport ?? 'http');
|
|
120
|
+
const headers = parseHeaders(cliArgs.headers);
|
|
121
|
+
const rawAuthMode = cliArgs.authMode ?? 'managed';
|
|
48
122
|
if (rawAuthMode !== 'managed' && rawAuthMode !== 'passthrough') {
|
|
49
123
|
process.stderr.write(`--auth-mode must be "managed" or "passthrough", got "${rawAuthMode}"\n`);
|
|
50
124
|
process.exit(1);
|
|
@@ -54,7 +128,8 @@ else if (url) {
|
|
|
54
128
|
}
|
|
55
129
|
else {
|
|
56
130
|
process.stderr.write('Usage:\n' +
|
|
57
|
-
' mcp-gateway --command <cmd> --port <port> [--log-level debug|info|none]\n' +
|
|
131
|
+
' mcp-gateway --command <cmd> [--command-arg <arg> ...] --port <port> [--log-level debug|info|none]\n' +
|
|
132
|
+
' mcp-gateway --config <path> --server <name> [--port <port>]\n' +
|
|
58
133
|
' mcp-gateway --url <url> --port <port> [--transport http|sse] [--headers \'{"k":"v"}\'] [--auth-mode managed|passthrough] [--log-level debug|info|none]\n');
|
|
59
134
|
process.exit(1);
|
|
60
135
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-gateway.js","sourceRoot":"","sources":["../../bin/mcp-gateway.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp-gateway.js","sourceRoot":"","sources":["../../bin/mcp-gateway.ts"],"names":[],"mappings":"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"}
|
package/dist/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mcp-compose",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "MCP server orchestration tool - manage multiple MCP servers with a single gateway",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
"clean": "rm -rf dist",
|
|
24
24
|
"lint": "eslint src bin",
|
|
25
25
|
"lint:fix": "eslint src bin --fix",
|
|
26
|
+
"test": "npm run build && node --test test/*.test.mjs",
|
|
26
27
|
"typecheck": "tsc --noEmit",
|
|
27
28
|
"prepublishOnly": "npm run clean && npm run build",
|
|
28
29
|
"start": "node dist/bin/mcp-compose.js"
|
|
@@ -46,14 +47,31 @@
|
|
|
46
47
|
},
|
|
47
48
|
"dependencies": {
|
|
48
49
|
"commander": "^12.1.0",
|
|
49
|
-
"
|
|
50
|
-
"pm2": "^
|
|
50
|
+
"cross-spawn": "^7.0.6",
|
|
51
|
+
"pm2": "^7.0.4",
|
|
51
52
|
"smol-toml": "^1.6.1",
|
|
52
53
|
"string-env-interpolation": "^1.0.1",
|
|
53
54
|
"strip-json-comments": "^5.0.3"
|
|
54
55
|
},
|
|
56
|
+
"overrides": {
|
|
57
|
+
"pm2": {
|
|
58
|
+
"js-yaml": "^4.3.2",
|
|
59
|
+
"ws": "^8.21.0"
|
|
60
|
+
},
|
|
61
|
+
"ip-address": "^10.7.0",
|
|
62
|
+
"@humanfs/node": "0.16.8",
|
|
63
|
+
"minimatch": {
|
|
64
|
+
"brace-expansion": "1.1.18"
|
|
65
|
+
},
|
|
66
|
+
"@typescript-eslint/typescript-estree": {
|
|
67
|
+
"minimatch": {
|
|
68
|
+
"brace-expansion": "2.1.4"
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
},
|
|
55
72
|
"devDependencies": {
|
|
56
73
|
"@eslint/js": "^9.39.2",
|
|
74
|
+
"@types/cross-spawn": "^6.0.6",
|
|
57
75
|
"@types/node": "^25.0.3",
|
|
58
76
|
"eslint": "^9.39.2",
|
|
59
77
|
"typescript": "^5.9.3",
|
package/dist/src/command.d.ts
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import type { StdioServer, ProxyServer, GatewayCommand } from './types.js';
|
|
2
2
|
export declare function resolveGatewayBin(): string;
|
|
3
|
-
export
|
|
3
|
+
export interface GatewayLaunchOptions {
|
|
4
|
+
configPath?: string | undefined;
|
|
5
|
+
serverName?: string | undefined;
|
|
6
|
+
}
|
|
7
|
+
export declare function buildGatewayCmdForServer(server: StdioServer | ProxyServer, options?: GatewayLaunchOptions): GatewayCommand;
|
|
4
8
|
//# sourceMappingURL=command.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/command.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAM3E,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,wBAAwB,
|
|
1
|
+
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/command.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAM3E,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,MAAM,WAAW,oBAAoB;IACnC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,WAAW,GAAG,WAAW,EACjC,OAAO,GAAE,oBAAyB,GACjC,cAAc,CAKhB"}
|
package/dist/src/command.js
CHANGED
|
@@ -7,19 +7,25 @@ const GATEWAY_BIN = join(__dirname, '..', 'bin', 'mcp-gateway.js');
|
|
|
7
7
|
export function resolveGatewayBin() {
|
|
8
8
|
return GATEWAY_BIN;
|
|
9
9
|
}
|
|
10
|
-
export function buildGatewayCmdForServer(server) {
|
|
10
|
+
export function buildGatewayCmdForServer(server, options = {}) {
|
|
11
11
|
if (server.type === 'stdio') {
|
|
12
12
|
return buildStdioGatewayCmd(server);
|
|
13
13
|
}
|
|
14
|
-
return buildProxyGatewayCmd(server);
|
|
14
|
+
return buildProxyGatewayCmd(server, options);
|
|
15
15
|
}
|
|
16
16
|
function buildStdioGatewayCmd(server) {
|
|
17
|
-
const
|
|
17
|
+
const stdioArgs = server.args.map((arg) => {
|
|
18
|
+
if (arg.includes('~')) {
|
|
19
|
+
return expandPath(arg);
|
|
20
|
+
}
|
|
21
|
+
return arg;
|
|
22
|
+
});
|
|
18
23
|
return {
|
|
19
24
|
script: resolveGatewayBin(),
|
|
20
25
|
args: [
|
|
21
26
|
'--command',
|
|
22
|
-
|
|
27
|
+
server.command,
|
|
28
|
+
...stdioArgs.flatMap((arg) => ['--command-arg', arg]),
|
|
23
29
|
'--port',
|
|
24
30
|
String(server.internalPort),
|
|
25
31
|
'--log-level',
|
|
@@ -27,7 +33,20 @@ function buildStdioGatewayCmd(server) {
|
|
|
27
33
|
],
|
|
28
34
|
};
|
|
29
35
|
}
|
|
30
|
-
function buildProxyGatewayCmd(server) {
|
|
36
|
+
function buildProxyGatewayCmd(server, options) {
|
|
37
|
+
if (options.configPath && options.serverName) {
|
|
38
|
+
return {
|
|
39
|
+
script: resolveGatewayBin(),
|
|
40
|
+
args: [
|
|
41
|
+
'--config',
|
|
42
|
+
options.configPath,
|
|
43
|
+
'--server',
|
|
44
|
+
options.serverName,
|
|
45
|
+
'--port',
|
|
46
|
+
String(server.internalPort),
|
|
47
|
+
],
|
|
48
|
+
};
|
|
49
|
+
}
|
|
31
50
|
const args = [
|
|
32
51
|
'--url',
|
|
33
52
|
server.url,
|
|
@@ -48,21 +67,4 @@ function buildProxyGatewayCmd(server) {
|
|
|
48
67
|
args,
|
|
49
68
|
};
|
|
50
69
|
}
|
|
51
|
-
function buildStdioCommand(command, args) {
|
|
52
|
-
const expandedArgs = args.map((arg) => {
|
|
53
|
-
if (arg.includes('~')) {
|
|
54
|
-
return expandPath(arg);
|
|
55
|
-
}
|
|
56
|
-
return arg;
|
|
57
|
-
});
|
|
58
|
-
const allParts = [command, ...expandedArgs];
|
|
59
|
-
return allParts
|
|
60
|
-
.map((part) => {
|
|
61
|
-
if (/[\s"'\\]/.test(part)) {
|
|
62
|
-
return `"${part.replace(/["\\]/g, '\\$&')}"`;
|
|
63
|
-
}
|
|
64
|
-
return part;
|
|
65
|
-
})
|
|
66
|
-
.join(' ');
|
|
67
|
-
}
|
|
68
70
|
//# sourceMappingURL=command.js.map
|
package/dist/src/command.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACtC,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC;AAEnE,MAAM,UAAU,iBAAiB;IAC/B,OAAO,WAAW,CAAC;AACrB,CAAC;
|
|
1
|
+
{"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACtC,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC;AAEnE,MAAM,UAAU,iBAAiB;IAC/B,OAAO,WAAW,CAAC;AACrB,CAAC;AAOD,MAAM,UAAU,wBAAwB,CACtC,MAAiC,EACjC,UAAgC,EAAE;IAElC,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC5B,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAmB;IAC/C,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACxC,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,OAAO;QACL,MAAM,EAAE,iBAAiB,EAAE;QAC3B,IAAI,EAAE;YACJ,WAAW;YACX,MAAM,CAAC,OAAO;YACd,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;YACrD,QAAQ;YACR,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC;YAC3B,aAAa;YACb,MAAM,CAAC,QAAQ;SAChB;KACF,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAmB,EAAE,OAA6B;IAC9E,IAAI,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QAC7C,OAAO;YACL,MAAM,EAAE,iBAAiB,EAAE;YAC3B,IAAI,EAAE;gBACJ,UAAU;gBACV,OAAO,CAAC,UAAU;gBAClB,UAAU;gBACV,OAAO,CAAC,UAAU;gBAClB,QAAQ;gBACR,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC;aAC5B;SACF,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG;QACX,OAAO;QACP,MAAM,CAAC,GAAG;QACV,QAAQ;QACR,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC;QAC3B,aAAa;QACb,MAAM,CAAC,SAAS;QAChB,aAAa;QACb,MAAM,CAAC,QAAQ;QACf,aAAa;QACb,MAAM,CAAC,QAAQ;KAChB,CAAC;IAEF,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3C,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IACzD,CAAC;IAED,OAAO;QACL,MAAM,EAAE,iBAAiB,EAAE;QAC3B,IAAI;KACL,CAAC;AACJ,CAAC"}
|