mcp-compose 0.0.8 → 0.1.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 +16 -14
- package/dist/bin/mcp-compose.js +8 -8
- package/dist/bin/mcp-compose.js.map +1 -1
- package/dist/bin/mcp-gateway.d.ts +3 -0
- package/dist/bin/mcp-gateway.d.ts.map +1 -0
- package/dist/bin/mcp-gateway.js +41 -0
- package/dist/bin/mcp-gateway.js.map +1 -0
- package/dist/package.json +4 -3
- package/dist/src/command.d.ts +4 -0
- package/dist/src/command.d.ts.map +1 -0
- package/dist/src/command.js +66 -0
- package/dist/src/command.js.map +1 -0
- package/dist/src/config.d.ts +2 -2
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +8 -18
- package/dist/src/config.js.map +1 -1
- package/dist/src/gateway.d.ts +22 -0
- package/dist/src/gateway.d.ts.map +1 -0
- package/dist/src/gateway.js +405 -0
- package/dist/src/gateway.js.map +1 -0
- package/dist/src/index.d.ts +3 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +3 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/oauth.d.ts +37 -0
- package/dist/src/oauth.d.ts.map +1 -0
- package/dist/src/oauth.js +317 -0
- package/dist/src/oauth.js.map +1 -0
- package/dist/src/pm2.d.ts +2 -2
- package/dist/src/pm2.d.ts.map +1 -1
- package/dist/src/pm2.js +17 -26
- package/dist/src/pm2.js.map +1 -1
- package/dist/src/sync.js +1 -1
- package/dist/src/sync.js.map +1 -1
- package/dist/src/types.d.ts +15 -2
- package/dist/src/types.d.ts.map +1 -1
- package/package.json +4 -3
- package/dist/src/supergateway.d.ts +0 -5
- package/dist/src/supergateway.d.ts.map +0 -1
- package/dist/src/supergateway.js +0 -61
- package/dist/src/supergateway.js.map +0 -1
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Run MCP servers once, share them across all Claude Code sessions.
|
|
4
4
|
|
|
5
|
-
Claude Code launches stdio MCP servers per session by default. mcp-compose converts them to persistent HTTP endpoints using
|
|
5
|
+
Claude Code launches stdio MCP servers per session by default. mcp-compose converts them to persistent HTTP endpoints using a built-in gateway and manages them with [pm2](https://github.com/Unitech/pm2), so multiple sessions can connect to the same running servers.
|
|
6
6
|
|
|
7
7
|
Servers run directly on your system without containerization, preserving full access to local dependencies that some MCP servers require.
|
|
8
8
|
|
|
@@ -60,15 +60,15 @@ Create `mcp-compose.json` (or `mcp-compose.jsonc`) in:
|
|
|
60
60
|
|
|
61
61
|
| Property | Type | Default | Description |
|
|
62
62
|
|----------|------|---------|-------------|
|
|
63
|
-
| `portBase` | number | `19100` | Starting port for
|
|
63
|
+
| `portBase` | number | `19100` | Starting port for managed servers. Ports are allocated sequentially. |
|
|
64
64
|
| `claudeConfigPath` | string | `~/.mcp.json` | Path to Claude Code's MCP config file. Supports `~` for home directory. |
|
|
65
|
-
| `logLevel` | string | `"info"` | Default log level for
|
|
65
|
+
| `logLevel` | string | `"info"` | Default log level for gateway processes. Options: `"debug"`, `"info"`, `"none"` |
|
|
66
66
|
|
|
67
67
|
### Server Types
|
|
68
68
|
|
|
69
69
|
#### stdio - Local Command Server
|
|
70
70
|
|
|
71
|
-
Runs a local command and
|
|
71
|
+
Runs a local command and exposes it as an HTTP endpoint via the built-in gateway.
|
|
72
72
|
|
|
73
73
|
```json
|
|
74
74
|
{
|
|
@@ -124,7 +124,7 @@ Passthrough to remote MCP servers. No local process is started by default.
|
|
|
124
124
|
|
|
125
125
|
#### Remote Server with OAuth Proxy
|
|
126
126
|
|
|
127
|
-
Remote servers with `"proxy": true` are
|
|
127
|
+
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.
|
|
128
128
|
|
|
129
129
|
```json
|
|
130
130
|
{
|
|
@@ -137,10 +137,10 @@ Remote servers with `"proxy": true` are wrapped with [mcp-remote](https://github
|
|
|
137
137
|
```
|
|
138
138
|
|
|
139
139
|
When proxy is enabled:
|
|
140
|
-
- A local process is started (managed by pm2, just like stdio servers)
|
|
141
|
-
-
|
|
142
|
-
- Tokens are cached at `~/.mcp-auth/` and refreshed automatically when they expire
|
|
143
|
-
- The first
|
|
140
|
+
- A local gateway process is started (managed by pm2, just like stdio servers)
|
|
141
|
+
- The gateway handles OAuth 2.0 (PKCE, browser-based consent, automatic token refresh)
|
|
142
|
+
- Tokens are cached at `~/.mcp-auth/mcp-compose/` and refreshed automatically when they expire
|
|
143
|
+
- The first connection opens a browser for OAuth consent; subsequent connections reuse cached tokens
|
|
144
144
|
|
|
145
145
|
You can also pass custom headers for API key authentication:
|
|
146
146
|
|
|
@@ -159,7 +159,7 @@ You can also pass custom headers for API key authentication:
|
|
|
159
159
|
|
|
160
160
|
### Resource Limits
|
|
161
161
|
|
|
162
|
-
Control pm2 process management behavior for
|
|
162
|
+
Control pm2 process management behavior for managed servers.
|
|
163
163
|
|
|
164
164
|
```json
|
|
165
165
|
{
|
|
@@ -278,16 +278,18 @@ mcp-compose logs -f
|
|
|
278
278
|
|
|
279
279
|
## How It Works
|
|
280
280
|
|
|
281
|
-
1. **stdio servers**:
|
|
282
|
-
2. **Remote servers**: Registered directly (no local process)
|
|
283
|
-
3. **Remote servers with proxy**:
|
|
281
|
+
1. **stdio servers**: Wrapped by a built-in gateway that bridges stdio to [MCP Streamable HTTP](https://modelcontextprotocol.io/specification/2025-03-26/basic/transports#streamable-http), managed by pm2
|
|
282
|
+
2. **Remote servers**: Registered directly in Claude Code config (no local process)
|
|
283
|
+
3. **Remote servers with proxy**: Proxied through a local gateway with built-in OAuth 2.0 lifecycle management (PKCE, token refresh)
|
|
284
284
|
4. **Config sync**: Auto-updates `~/.mcp.json` for Claude Code integration
|
|
285
285
|
5. **Port allocation**: Automatically detects port conflicts and uses next available port
|
|
286
286
|
|
|
287
|
-
Each
|
|
287
|
+
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.
|
|
288
288
|
|
|
289
289
|
## Features
|
|
290
290
|
|
|
291
|
+
- **Zero external dependencies for transport**: Built-in MCP gateway replaces supergateway and mcp-remote
|
|
292
|
+
- **Built-in OAuth 2.0**: PKCE authorization, token refresh, and persistent token storage for remote servers
|
|
291
293
|
- **Incremental updates**: Only restarts servers with changed configurations
|
|
292
294
|
- **Automatic port conflict detection**: Skips ports in use and allocates next available
|
|
293
295
|
- **Config validation**: Validates configuration structure with helpful error messages
|
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,
|
|
3
|
+
import { loadConfig, getManagedServers, getServerNames, } 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';
|
|
@@ -56,19 +56,19 @@ program
|
|
|
56
56
|
try {
|
|
57
57
|
const config = loadConfig(getConfigPath(cmd));
|
|
58
58
|
const { processPrefix, portBase } = config.settings;
|
|
59
|
-
const
|
|
59
|
+
const managedServers = getManagedServers(config);
|
|
60
60
|
const filteredServers = servers.length > 0
|
|
61
|
-
?
|
|
62
|
-
:
|
|
61
|
+
? managedServers.filter((s) => servers.includes(s.name))
|
|
62
|
+
: managedServers;
|
|
63
63
|
if (filteredServers.length === 0 && servers.length > 0) {
|
|
64
|
-
console.log('No
|
|
64
|
+
console.log('No managed servers match the filter. Remote servers are synced directly.');
|
|
65
65
|
}
|
|
66
66
|
if (filteredServers.length > 0) {
|
|
67
67
|
const results = await startServers(filteredServers, processPrefix, portBase, printProgress);
|
|
68
68
|
// Update config with actual running ports before syncing
|
|
69
69
|
for (const result of results) {
|
|
70
70
|
const server = config.mcpServers[result.name];
|
|
71
|
-
if (server?.type === 'stdio') {
|
|
71
|
+
if (server?.type === 'stdio' || server?.type === 'proxy') {
|
|
72
72
|
server.internalPort = result.port;
|
|
73
73
|
}
|
|
74
74
|
}
|
|
@@ -129,8 +129,8 @@ program
|
|
|
129
129
|
try {
|
|
130
130
|
const config = loadConfig(getConfigPath(cmd));
|
|
131
131
|
const { processPrefix } = config.settings;
|
|
132
|
-
const
|
|
133
|
-
const serverNames = servers.length > 0 ? servers :
|
|
132
|
+
const allManagedServers = getManagedServers(config);
|
|
133
|
+
const serverNames = servers.length > 0 ? servers : allManagedServers.map((s) => s.name);
|
|
134
134
|
console.log(`Restarting ${String(serverNames.length)} server(s)...`);
|
|
135
135
|
await restartServers(serverNames, processPrefix);
|
|
136
136
|
for (const name of serverNames) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-compose.js","sourceRoot":"","sources":["../../bin/mcp-compose.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,UAAU,EACV,
|
|
1
|
+
{"version":3,"file":"mcp-compose.js","sourceRoot":"","sources":["../../bin/mcp-compose.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-gateway.d.ts","sourceRoot":"","sources":["../../bin/mcp-gateway.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { createGateway } from '../src/gateway.js';
|
|
3
|
+
function getArg(name) {
|
|
4
|
+
const idx = process.argv.indexOf(`--${name}`);
|
|
5
|
+
if (idx === -1 || idx + 1 >= process.argv.length)
|
|
6
|
+
return undefined;
|
|
7
|
+
return process.argv[idx + 1];
|
|
8
|
+
}
|
|
9
|
+
const port = parseInt(getArg('port') ?? '19100', 10);
|
|
10
|
+
const logLevel = (getArg('log-level') ?? 'info');
|
|
11
|
+
// Detect mode from arguments
|
|
12
|
+
const command = getArg('command');
|
|
13
|
+
const url = getArg('url');
|
|
14
|
+
let options;
|
|
15
|
+
if (command) {
|
|
16
|
+
options = { mode: 'stdio', port, command, logLevel };
|
|
17
|
+
}
|
|
18
|
+
else if (url) {
|
|
19
|
+
const transport = (getArg('transport') ?? 'http');
|
|
20
|
+
const headersStr = getArg('headers');
|
|
21
|
+
const headers = headersStr ? JSON.parse(headersStr) : {};
|
|
22
|
+
options = { mode: 'proxy', port, url, transport, headers, logLevel };
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
process.stderr.write('Usage:\n' +
|
|
26
|
+
' mcp-gateway --command <cmd> --port <port> [--log-level debug|info|none]\n' +
|
|
27
|
+
' mcp-gateway --url <url> --port <port> [--transport http|sse] [--headers \'{"k":"v"}\'] [--log-level debug|info|none]\n');
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
const gateway = createGateway(options);
|
|
31
|
+
gateway.start().catch((err) => {
|
|
32
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
33
|
+
process.stderr.write(`Failed to start gateway: ${msg}\n`);
|
|
34
|
+
process.exit(1);
|
|
35
|
+
});
|
|
36
|
+
function shutdown() {
|
|
37
|
+
gateway.stop().then(() => { process.exit(0); }, () => { process.exit(1); });
|
|
38
|
+
}
|
|
39
|
+
process.on('SIGTERM', shutdown);
|
|
40
|
+
process.on('SIGINT', shutdown);
|
|
41
|
+
//# sourceMappingURL=mcp-gateway.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-gateway.js","sourceRoot":"","sources":["../../bin/mcp-gateway.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAIlD,SAAS,MAAM,CAAC,IAAY;IAC1B,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAC9C,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IACnE,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;AACrD,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,MAAM,CAAa,CAAC;AAE7D,6BAA6B;AAC7B,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;AAClC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;AAE1B,IAAI,OAAuB,CAAC;AAE5B,IAAI,OAAO,EAAE,CAAC;IACZ,OAAO,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AACvD,CAAC;KAAM,IAAI,GAAG,EAAE,CAAC;IACf,MAAM,SAAS,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,MAAM,CAAmB,CAAC;IACpE,MAAM,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAA2B,CAAC,CAAC,CAAC,EAAE,CAAC;IACnF,OAAO,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AACvE,CAAC;KAAM,CAAC;IACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,UAAU;QACV,6EAA6E;QAC7E,0HAA0H,CAC3H,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;AAEvC,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IACrC,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,GAAG,IAAI,CAAC,CAAC;IAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,SAAS,QAAQ;IACf,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,CACjB,GAAG,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAC1B,GAAG,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAC3B,CAAC;AACJ,CAAC;AAED,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAChC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC"}
|
package/dist/package.json
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mcp-compose",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.1.0",
|
|
4
4
|
"description": "MCP server orchestration tool - manage multiple MCP servers with a single gateway",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
|
-
"mcp-compose": "./dist/bin/mcp-compose.js"
|
|
7
|
+
"mcp-compose": "./dist/bin/mcp-compose.js",
|
|
8
|
+
"mcp-gateway": "./dist/bin/mcp-gateway.js"
|
|
8
9
|
},
|
|
9
10
|
"main": "./dist/src/index.js",
|
|
10
11
|
"types": "./dist/src/index.d.ts",
|
|
@@ -18,7 +19,7 @@
|
|
|
18
19
|
"dist"
|
|
19
20
|
],
|
|
20
21
|
"scripts": {
|
|
21
|
-
"build": "tsc && cp package.json dist/",
|
|
22
|
+
"build": "tsc && cp package.json dist/ && chmod +x dist/bin/mcp-gateway.js",
|
|
22
23
|
"clean": "rm -rf dist",
|
|
23
24
|
"lint": "eslint src bin",
|
|
24
25
|
"lint:fix": "eslint src bin --fix",
|
|
@@ -0,0 +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,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,GAAG,cAAc,CAK1F"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { fileURLToPath } from 'node:url';
|
|
2
|
+
import { dirname, join } from 'node:path';
|
|
3
|
+
import { expandPath } from './config.js';
|
|
4
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
5
|
+
const __dirname = dirname(__filename);
|
|
6
|
+
const GATEWAY_BIN = join(__dirname, '..', 'bin', 'mcp-gateway.js');
|
|
7
|
+
export function resolveGatewayBin() {
|
|
8
|
+
return GATEWAY_BIN;
|
|
9
|
+
}
|
|
10
|
+
export function buildGatewayCmdForServer(server) {
|
|
11
|
+
if (server.type === 'stdio') {
|
|
12
|
+
return buildStdioGatewayCmd(server);
|
|
13
|
+
}
|
|
14
|
+
return buildProxyGatewayCmd(server);
|
|
15
|
+
}
|
|
16
|
+
function buildStdioGatewayCmd(server) {
|
|
17
|
+
const stdioCmd = buildStdioCommand(server.command, server.args);
|
|
18
|
+
return {
|
|
19
|
+
script: resolveGatewayBin(),
|
|
20
|
+
args: [
|
|
21
|
+
'--command',
|
|
22
|
+
stdioCmd,
|
|
23
|
+
'--port',
|
|
24
|
+
String(server.internalPort),
|
|
25
|
+
'--log-level',
|
|
26
|
+
server.logLevel,
|
|
27
|
+
],
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function buildProxyGatewayCmd(server) {
|
|
31
|
+
const args = [
|
|
32
|
+
'--url',
|
|
33
|
+
server.url,
|
|
34
|
+
'--port',
|
|
35
|
+
String(server.internalPort),
|
|
36
|
+
'--transport',
|
|
37
|
+
server.transport,
|
|
38
|
+
'--log-level',
|
|
39
|
+
server.logLevel,
|
|
40
|
+
];
|
|
41
|
+
if (Object.keys(server.headers).length > 0) {
|
|
42
|
+
args.push('--headers', JSON.stringify(server.headers));
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
script: resolveGatewayBin(),
|
|
46
|
+
args,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function buildStdioCommand(command, args) {
|
|
50
|
+
const expandedArgs = args.map((arg) => {
|
|
51
|
+
if (arg.includes('~')) {
|
|
52
|
+
return expandPath(arg);
|
|
53
|
+
}
|
|
54
|
+
return arg;
|
|
55
|
+
});
|
|
56
|
+
const allParts = [command, ...expandedArgs];
|
|
57
|
+
return allParts
|
|
58
|
+
.map((part) => {
|
|
59
|
+
if (/[\s"'\\]/.test(part)) {
|
|
60
|
+
return `"${part.replace(/["\\]/g, '\\$&')}"`;
|
|
61
|
+
}
|
|
62
|
+
return part;
|
|
63
|
+
})
|
|
64
|
+
.join(' ');
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=command.js.map
|
|
@@ -0,0 +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;AAED,MAAM,UAAU,wBAAwB,CAAC,MAAiC;IACxE,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC5B,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAmB;IAC/C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAEhE,OAAO;QACL,MAAM,EAAE,iBAAiB,EAAE;QAC3B,IAAI,EAAE;YACJ,WAAW;YACX,QAAQ;YACR,QAAQ;YACR,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC;YAC3B,aAAa;YACb,MAAM,CAAC,QAAQ;SAChB;KACF,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAmB;IAC/C,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;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;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"}
|
package/dist/src/config.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { RawConfig, NormalizedConfig,
|
|
1
|
+
import type { RawConfig, NormalizedConfig, NamedManagedServer } from './types.js';
|
|
2
2
|
export declare function expandPath(p: string): string;
|
|
3
3
|
export declare function findConfigFile(startDir?: string): string | null;
|
|
4
4
|
export declare function loadConfig(configPath?: string): NormalizedConfig;
|
|
@@ -12,5 +12,5 @@ export declare function isPortAvailable(port: number): Promise<boolean>;
|
|
|
12
12
|
export declare function allocatePorts(serverCount: number, portBase: number, onPortSkipped?: (port: number, assignedPort: number) => void): Promise<number[]>;
|
|
13
13
|
export declare function normalizeConfig(config: RawConfig): NormalizedConfig;
|
|
14
14
|
export declare function getServerNames(config: NormalizedConfig, filter?: string[]): string[];
|
|
15
|
-
export declare function
|
|
15
|
+
export declare function getManagedServers(config: NormalizedConfig): NamedManagedServer[];
|
|
16
16
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/src/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAEV,SAAS,EAET,gBAAgB,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAEV,SAAS,EAET,gBAAgB,EAIhB,kBAAkB,EAEnB,MAAM,YAAY,CAAC;AAiBpB,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAK5C;AAED,wBAAgB,cAAc,CAAC,QAAQ,GAAE,MAAsB,GAAG,MAAM,GAAG,IAAI,CAe9E;AAED,wBAAgB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,gBAAgB,CA4BhE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAa9D;AAkBD;;GAEG;AACH,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,GAC3D,OAAO,CAAC,MAAM,EAAE,CAAC,CAcnB;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,gBAAgB,CAyBnE;AAwDD,wBAAgB,cAAc,CAC5B,MAAM,EAAE,gBAAgB,EACxB,MAAM,GAAE,MAAM,EAAO,GACpB,MAAM,EAAE,CAgBV;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,GAAG,kBAAkB,EAAE,CAKhF"}
|
package/dist/src/config.js
CHANGED
|
@@ -120,7 +120,7 @@ export function normalizeConfig(config) {
|
|
|
120
120
|
}
|
|
121
121
|
const normalized = normalizeServer(name, server, settings.portBase + portIndex, settings);
|
|
122
122
|
mcpServers[name] = normalized;
|
|
123
|
-
if (normalized.type === 'stdio') {
|
|
123
|
+
if (normalized.type === 'stdio' || normalized.type === 'proxy') {
|
|
124
124
|
portIndex++;
|
|
125
125
|
}
|
|
126
126
|
}
|
|
@@ -154,14 +154,14 @@ function normalizeServer(name, server, internalPort, settings) {
|
|
|
154
154
|
if (!('url' in server) || !server.url) {
|
|
155
155
|
throw new Error(`Server "${name}" is ${type} type but missing url`);
|
|
156
156
|
}
|
|
157
|
-
// Proxy mode:
|
|
157
|
+
// Proxy mode: gateway connects directly to remote server with OAuth lifecycle management
|
|
158
158
|
if ('proxy' in server && server.proxy) {
|
|
159
159
|
const headers = 'headers' in server ? server.headers : undefined;
|
|
160
160
|
return {
|
|
161
|
-
type: '
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
161
|
+
type: 'proxy',
|
|
162
|
+
url: server.url,
|
|
163
|
+
transport: type,
|
|
164
|
+
headers: headers ?? {},
|
|
165
165
|
internalPort,
|
|
166
166
|
logLevel: server.logLevel ?? settings.logLevel,
|
|
167
167
|
resourceLimits: { ...DEFAULT_RESOURCE_LIMITS, ...server.resourceLimits },
|
|
@@ -172,16 +172,6 @@ function normalizeServer(name, server, internalPort, settings) {
|
|
|
172
172
|
url: server.url,
|
|
173
173
|
};
|
|
174
174
|
}
|
|
175
|
-
function buildMcpRemoteArgs(url, transport, headers) {
|
|
176
|
-
const args = [url];
|
|
177
|
-
args.push('--transport', transport === 'sse' ? 'sse-only' : 'http-only');
|
|
178
|
-
if (headers) {
|
|
179
|
-
for (const [key, value] of Object.entries(headers)) {
|
|
180
|
-
args.push('--header', `${key}:${value}`);
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
return args;
|
|
184
|
-
}
|
|
185
175
|
export function getServerNames(config, filter = []) {
|
|
186
176
|
const allNames = Object.keys(config.mcpServers);
|
|
187
177
|
if (filter.length === 0) {
|
|
@@ -194,9 +184,9 @@ export function getServerNames(config, filter = []) {
|
|
|
194
184
|
}
|
|
195
185
|
return filter;
|
|
196
186
|
}
|
|
197
|
-
export function
|
|
187
|
+
export function getManagedServers(config) {
|
|
198
188
|
return Object.entries(config.mcpServers)
|
|
199
|
-
.filter((entry) => entry[1].type === 'stdio')
|
|
189
|
+
.filter((entry) => entry[1].type === 'stdio' || entry[1].type === 'proxy')
|
|
200
190
|
.map(([name, server]) => ({ name, ...server }));
|
|
201
191
|
}
|
|
202
192
|
//# sourceMappingURL=config.js.map
|
package/dist/src/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,KAAK,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAC/C,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { LogLevel } from './types.js';
|
|
2
|
+
export interface StdioGatewayOptions {
|
|
3
|
+
mode: 'stdio';
|
|
4
|
+
port: number;
|
|
5
|
+
command: string;
|
|
6
|
+
logLevel?: LogLevel;
|
|
7
|
+
}
|
|
8
|
+
export interface ProxyGatewayOptions {
|
|
9
|
+
mode: 'proxy';
|
|
10
|
+
port: number;
|
|
11
|
+
url: string;
|
|
12
|
+
transport?: 'http' | 'sse';
|
|
13
|
+
headers?: Record<string, string>;
|
|
14
|
+
logLevel?: LogLevel;
|
|
15
|
+
}
|
|
16
|
+
export type GatewayOptions = StdioGatewayOptions | ProxyGatewayOptions;
|
|
17
|
+
export interface Gateway {
|
|
18
|
+
start(): Promise<void>;
|
|
19
|
+
stop(): Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
export declare function createGateway(options: GatewayOptions): Gateway;
|
|
22
|
+
//# sourceMappingURL=gateway.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../../src/gateway.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAG3C,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED,MAAM,MAAM,cAAc,GAAG,mBAAmB,GAAG,mBAAmB,CAAC;AAEvE,MAAM,WAAW,OAAO;IACtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAmPD,wBAAgB,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAmP9D"}
|