@platf/bridge 0.0.16 → 0.0.18
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/dist/gateways/statefulBridge.d.ts +10 -7
- package/dist/gateways/statefulBridge.js +79 -139
- package/dist/gateways/statefulBridge.js.map +1 -1
- package/dist/gateways/statelessBridge.d.ts +10 -7
- package/dist/gateways/statelessBridge.js +85 -166
- package/dist/gateways/statelessBridge.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/childProcess.d.ts +37 -0
- package/dist/lib/childProcess.js +80 -0
- package/dist/lib/childProcess.js.map +1 -0
- package/dist/lib/config.d.ts +6 -0
- package/dist/lib/config.js +7 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/discoveryRoutes.d.ts +3 -1
- package/dist/lib/discoveryRoutes.js +7 -68
- package/dist/lib/discoveryRoutes.js.map +1 -1
- package/dist/lib/express.d.ts +33 -0
- package/dist/lib/express.js +65 -0
- package/dist/lib/express.js.map +1 -0
- package/dist/lib/getLogger.d.ts +2 -2
- package/dist/lib/getLogger.js.map +1 -1
- package/dist/lib/mcpMessages.d.ts +10 -0
- package/dist/lib/mcpMessages.js +35 -0
- package/dist/lib/mcpMessages.js.map +1 -0
- package/dist/lib/oauthProxy.d.ts +14 -0
- package/dist/lib/oauthProxy.js +80 -0
- package/dist/lib/oauthProxy.js.map +1 -0
- package/dist/types.d.ts +3 -0
- package/package.json +1 -1
- package/src/gateways/statefulBridge.ts +87 -167
- package/src/gateways/statelessBridge.ts +100 -218
- package/src/index.ts +2 -2
- package/src/lib/childProcess.ts +120 -0
- package/src/lib/config.ts +9 -0
- package/src/lib/discoveryRoutes.ts +7 -71
- package/src/lib/express.ts +82 -0
- package/src/lib/getLogger.ts +4 -3
- package/src/lib/mcpMessages.ts +42 -0
- package/src/lib/oauthProxy.ts +86 -0
- package/src/types.ts +4 -0
|
@@ -1,36 +1,3 @@
|
|
|
1
|
-
import express from 'express';
|
|
2
|
-
import cors from 'cors';
|
|
3
|
-
import { spawn } from 'child_process';
|
|
4
|
-
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
5
|
-
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
6
|
-
import { isInitializeRequest, } from '@modelcontextprotocol/sdk/types.js';
|
|
7
|
-
import { onSignals } from '../lib/onSignals.js';
|
|
8
|
-
import { serializeCorsOrigin } from '../lib/cors.js';
|
|
9
|
-
import { createAuthMiddleware } from '../lib/authMiddleware.js';
|
|
10
|
-
import { createDiscoveryRouter } from '../lib/discoveryRoutes.js';
|
|
11
|
-
const VERSION = '1.0.0';
|
|
12
|
-
const setResponseHeaders = (res, headers) => Object.entries(headers).forEach(([key, value]) => res.setHeader(key, value));
|
|
13
|
-
/** Create a synthetic MCP initialize request */
|
|
14
|
-
const createInitializeRequest = (id, protocolVersion) => ({
|
|
15
|
-
jsonrpc: '2.0',
|
|
16
|
-
id,
|
|
17
|
-
method: 'initialize',
|
|
18
|
-
params: {
|
|
19
|
-
protocolVersion,
|
|
20
|
-
capabilities: {
|
|
21
|
-
roots: { listChanged: true },
|
|
22
|
-
sampling: {},
|
|
23
|
-
},
|
|
24
|
-
clientInfo: {
|
|
25
|
-
name: 'platf-bridge',
|
|
26
|
-
version: VERSION,
|
|
27
|
-
},
|
|
28
|
-
},
|
|
29
|
-
});
|
|
30
|
-
const createInitializedNotification = () => ({
|
|
31
|
-
jsonrpc: '2.0',
|
|
32
|
-
method: 'notifications/initialized',
|
|
33
|
-
});
|
|
34
1
|
/**
|
|
35
2
|
* Stateless stdio-to-Streamable HTTP bridge.
|
|
36
3
|
*
|
|
@@ -39,169 +6,127 @@ const createInitializedNotification = () => ({
|
|
|
39
6
|
* and proxies JSON-RPC messages between the HTTP transport and the
|
|
40
7
|
* child's stdin/stdout.
|
|
41
8
|
*/
|
|
9
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
10
|
+
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
11
|
+
import { isInitializeRequest } from '@modelcontextprotocol/sdk/types.js';
|
|
12
|
+
import { createApp } from '../lib/express.js';
|
|
13
|
+
import { onSignals } from '../lib/onSignals.js';
|
|
14
|
+
import { spawnManagedChild } from '../lib/childProcess.js';
|
|
15
|
+
import { createInitializeRequest, createInitializedNotification, generateAutoInitId } from '../lib/mcpMessages.js';
|
|
16
|
+
import { VERSION, SERVER_NAME } from '../lib/config.js';
|
|
17
|
+
/**
|
|
18
|
+
* Start the stateless bridge server.
|
|
19
|
+
*/
|
|
42
20
|
export async function startStatelessBridge(args) {
|
|
43
|
-
const { stdioCmd, port, path, logger, corsOrigin, healthEndpoints, headers, protocolVersion, auth
|
|
44
|
-
logger.info(`[stateless] Starting
|
|
45
|
-
logger.info(` - Headers: ${Object.keys(headers).length ? JSON.stringify(headers) : '(none)'}`);
|
|
21
|
+
const { stdioCmd, port, path, logger, corsOrigin, healthEndpoints, headers, protocolVersion, auth } = args;
|
|
22
|
+
logger.info(`[stateless] Starting ${SERVER_NAME}`);
|
|
46
23
|
logger.info(` - port: ${port}`);
|
|
47
24
|
logger.info(` - stdio: ${stdioCmd}`);
|
|
48
25
|
logger.info(` - path: ${path}`);
|
|
49
26
|
logger.info(` - protocolVersion: ${protocolVersion}`);
|
|
50
|
-
logger.info(` -
|
|
51
|
-
logger.info(` - Health endpoints: ${healthEndpoints.length ? healthEndpoints.join(', ') : '(none)'}`);
|
|
27
|
+
logger.info(` - Headers: ${Object.keys(headers).length ? JSON.stringify(headers) : '(none)'}`);
|
|
52
28
|
onSignals({ logger });
|
|
53
|
-
const app =
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
res.send('ok');
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
// --- OAuth discovery & auth middleware (when auth is enabled) ---
|
|
66
|
-
if (auth) {
|
|
67
|
-
app.use(createDiscoveryRouter(auth, logger));
|
|
68
|
-
app.use(path, createAuthMiddleware(auth, logger));
|
|
69
|
-
logger.info(` - Auth: enabled (issuer=${auth.issuer})`);
|
|
70
|
-
}
|
|
29
|
+
const app = createApp({
|
|
30
|
+
logger,
|
|
31
|
+
corsOrigin,
|
|
32
|
+
healthEndpoints,
|
|
33
|
+
headers,
|
|
34
|
+
auth,
|
|
35
|
+
mcpPath: path,
|
|
36
|
+
});
|
|
37
|
+
// POST handler — spawn child, proxy messages
|
|
71
38
|
app.post(path, async (req, res) => {
|
|
72
39
|
try {
|
|
73
|
-
const server = new Server({ name:
|
|
74
|
-
const transport = new StreamableHTTPServerTransport({
|
|
75
|
-
sessionIdGenerator: undefined,
|
|
76
|
-
});
|
|
40
|
+
const server = new Server({ name: SERVER_NAME, version: VERSION }, { capabilities: {} });
|
|
41
|
+
const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });
|
|
77
42
|
await server.connect(transport);
|
|
78
|
-
|
|
79
|
-
const pendingRequestIds = new Set();
|
|
80
|
-
let stderrOutput = '';
|
|
81
|
-
child.on('exit', (code, signal) => {
|
|
82
|
-
logger.error(`Child exited: code=${code}, signal=${signal}`);
|
|
83
|
-
// Include queued original message's ID if it was never sent to the child
|
|
84
|
-
if (pendingOriginalMessage && 'id' in pendingOriginalMessage && pendingOriginalMessage.id !== undefined) {
|
|
85
|
-
pendingRequestIds.add(pendingOriginalMessage.id);
|
|
86
|
-
pendingOriginalMessage = null;
|
|
87
|
-
}
|
|
88
|
-
// Remove auto-init ID — the client doesn't expect a response for it
|
|
89
|
-
if (isAutoInitializing && initializeRequestId !== null) {
|
|
90
|
-
pendingRequestIds.delete(initializeRequestId);
|
|
91
|
-
}
|
|
92
|
-
// Send JSON-RPC error responses for all pending client requests
|
|
93
|
-
for (const id of pendingRequestIds) {
|
|
94
|
-
const detail = stderrOutput.trim().slice(0, 1000);
|
|
95
|
-
const message = detail
|
|
96
|
-
? `Child process exited (code=${code}): ${detail}`
|
|
97
|
-
: `Child process exited unexpectedly (code=${code}, signal=${signal})`;
|
|
98
|
-
try {
|
|
99
|
-
transport.send({
|
|
100
|
-
jsonrpc: '2.0',
|
|
101
|
-
error: { code: -32603, message },
|
|
102
|
-
id,
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
catch (e) {
|
|
106
|
-
logger.error(`Failed to send error response for request ${id}`, e);
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
pendingRequestIds.clear();
|
|
110
|
-
transport.close();
|
|
111
|
-
});
|
|
112
|
-
// --- Auto-initialization state ---
|
|
43
|
+
// Auto-initialization state
|
|
113
44
|
let isInitialized = false;
|
|
114
45
|
let initializeRequestId = null;
|
|
115
46
|
let isAutoInitializing = false;
|
|
116
47
|
let pendingOriginalMessage = null;
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
}
|
|
130
|
-
logger.info('Child → HTTP:', line);
|
|
131
|
-
// Handle initialize response (auto or client-initiated)
|
|
132
|
-
if (initializeRequestId && jsonMsg.id === initializeRequestId) {
|
|
133
|
-
logger.info('Initialize response received');
|
|
134
|
-
isInitialized = true;
|
|
135
|
-
if (isAutoInitializing) {
|
|
136
|
-
// Send initialized notification then the queued original message
|
|
137
|
-
const notification = createInitializedNotification();
|
|
138
|
-
logger.info(`HTTP → Child (initialized): ${JSON.stringify(notification)}`);
|
|
139
|
-
child.stdin.write(JSON.stringify(notification) + '\n');
|
|
140
|
-
if (pendingOriginalMessage) {
|
|
141
|
-
logger.info(`HTTP → Child (original): ${JSON.stringify(pendingOriginalMessage)}`);
|
|
142
|
-
child.stdin.write(JSON.stringify(pendingOriginalMessage) + '\n');
|
|
143
|
-
pendingOriginalMessage = null;
|
|
144
|
-
}
|
|
145
|
-
isAutoInitializing = false;
|
|
146
|
-
initializeRequestId = null;
|
|
147
|
-
return; // don't forward auto-init response to client
|
|
48
|
+
const managedChild = spawnManagedChild(stdioCmd, logger, {
|
|
49
|
+
onMessage: (msg) => {
|
|
50
|
+
// Handle initialize response (auto or client-initiated)
|
|
51
|
+
if (initializeRequestId && 'id' in msg && msg.id === initializeRequestId) {
|
|
52
|
+
logger.info('[stateless] Initialize response received');
|
|
53
|
+
isInitialized = true;
|
|
54
|
+
if (isAutoInitializing) {
|
|
55
|
+
// Send initialized notification then the queued original message
|
|
56
|
+
managedChild.send(createInitializedNotification());
|
|
57
|
+
if (pendingOriginalMessage) {
|
|
58
|
+
managedChild.send(pendingOriginalMessage);
|
|
59
|
+
pendingOriginalMessage = null;
|
|
148
60
|
}
|
|
61
|
+
isAutoInitializing = false;
|
|
149
62
|
initializeRequestId = null;
|
|
63
|
+
return; // don't forward auto-init response to client
|
|
150
64
|
}
|
|
151
|
-
|
|
152
|
-
transport.send(jsonMsg);
|
|
153
|
-
}
|
|
154
|
-
catch (e) {
|
|
155
|
-
logger.error('Failed to send to HTTP transport', e);
|
|
156
|
-
}
|
|
65
|
+
initializeRequestId = null;
|
|
157
66
|
}
|
|
158
|
-
catch {
|
|
159
|
-
logger.error(
|
|
67
|
+
transport.send(msg).catch((e) => {
|
|
68
|
+
logger.error('[stateless] Failed to send to HTTP transport', e);
|
|
69
|
+
});
|
|
70
|
+
},
|
|
71
|
+
onExit: (code, signal, stderrOutput) => {
|
|
72
|
+
// Include queued original message's ID if never sent
|
|
73
|
+
if (pendingOriginalMessage && 'id' in pendingOriginalMessage && pendingOriginalMessage.id !== undefined) {
|
|
74
|
+
managedChild.trackRequest(pendingOriginalMessage.id);
|
|
75
|
+
pendingOriginalMessage = null;
|
|
160
76
|
}
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
77
|
+
// Remove auto-init ID — client doesn't expect a response for it
|
|
78
|
+
if (isAutoInitializing && initializeRequestId !== null) {
|
|
79
|
+
managedChild.completeRequest(initializeRequestId);
|
|
80
|
+
}
|
|
81
|
+
// Send error responses for all pending requests
|
|
82
|
+
for (const id of managedChild.getPendingRequests()) {
|
|
83
|
+
const detail = stderrOutput.trim().slice(0, 1000);
|
|
84
|
+
const message = detail
|
|
85
|
+
? `Child process exited (code=${code}): ${detail}`
|
|
86
|
+
: `Child process exited unexpectedly (code=${code}, signal=${signal})`;
|
|
87
|
+
transport.send({
|
|
88
|
+
jsonrpc: '2.0',
|
|
89
|
+
error: { code: -32603, message },
|
|
90
|
+
id,
|
|
91
|
+
}).catch(() => { });
|
|
92
|
+
}
|
|
93
|
+
transport.close();
|
|
94
|
+
},
|
|
167
95
|
});
|
|
168
96
|
transport.onmessage = (msg) => {
|
|
169
|
-
logger.info(`HTTP → Child: ${JSON.stringify(msg)}`);
|
|
170
97
|
// Track client request IDs for error reporting on child exit
|
|
171
98
|
if ('id' in msg && msg.id !== undefined) {
|
|
172
|
-
|
|
99
|
+
managedChild.trackRequest(msg.id);
|
|
173
100
|
}
|
|
174
|
-
// Auto-initialize if
|
|
101
|
+
// Auto-initialize if first message is not an initialize request
|
|
175
102
|
if (!isInitialized && !isInitializeRequest(msg)) {
|
|
176
103
|
pendingOriginalMessage = msg;
|
|
177
|
-
initializeRequestId =
|
|
104
|
+
initializeRequestId = generateAutoInitId();
|
|
178
105
|
isAutoInitializing = true;
|
|
179
|
-
logger.info('Non-initialize message detected, sending auto-initialize first');
|
|
180
|
-
|
|
181
|
-
logger.info(`HTTP → Child (auto-init): ${JSON.stringify(initReq)}`);
|
|
182
|
-
child.stdin.write(JSON.stringify(initReq) + '\n');
|
|
106
|
+
logger.info('[stateless] Non-initialize message detected, sending auto-initialize first');
|
|
107
|
+
managedChild.send(createInitializeRequest(initializeRequestId, protocolVersion));
|
|
183
108
|
return;
|
|
184
109
|
}
|
|
185
110
|
// Track client-initiated initialize
|
|
186
111
|
if (isInitializeRequest(msg) && 'id' in msg && msg.id !== undefined) {
|
|
187
112
|
initializeRequestId = msg.id;
|
|
188
113
|
isAutoInitializing = false;
|
|
189
|
-
logger.info(`Tracking initialize request ID: ${msg.id}`);
|
|
114
|
+
logger.info(`[stateless] Tracking initialize request ID: ${msg.id}`);
|
|
190
115
|
}
|
|
191
|
-
|
|
116
|
+
managedChild.send(msg);
|
|
192
117
|
};
|
|
193
118
|
transport.onclose = () => {
|
|
194
|
-
logger.info('HTTP connection closed');
|
|
195
|
-
|
|
119
|
+
logger.info('[stateless] HTTP connection closed');
|
|
120
|
+
managedChild.kill();
|
|
196
121
|
};
|
|
197
122
|
transport.onerror = (err) => {
|
|
198
|
-
logger.error('HTTP transport error:', err);
|
|
199
|
-
|
|
123
|
+
logger.error('[stateless] HTTP transport error:', err);
|
|
124
|
+
managedChild.kill();
|
|
200
125
|
};
|
|
201
126
|
await transport.handleRequest(req, res, req.body);
|
|
202
127
|
}
|
|
203
128
|
catch (error) {
|
|
204
|
-
logger.error('Error handling MCP request:', error);
|
|
129
|
+
logger.error('[stateless] Error handling MCP request:', error);
|
|
205
130
|
if (!res.headersSent) {
|
|
206
131
|
res.status(500).json({
|
|
207
132
|
jsonrpc: '2.0',
|
|
@@ -211,22 +136,16 @@ export async function startStatelessBridge(args) {
|
|
|
211
136
|
}
|
|
212
137
|
}
|
|
213
138
|
});
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
res.writeHead(405).end(JSON.stringify({
|
|
217
|
-
jsonrpc: '2.0',
|
|
218
|
-
error: { code: -32000, message: 'Method not allowed.' },
|
|
219
|
-
id: null,
|
|
220
|
-
}));
|
|
221
|
-
});
|
|
222
|
-
app.delete(path, (_req, res) => {
|
|
223
|
-
logger.info('Received DELETE — method not allowed in stateless mode');
|
|
139
|
+
// GET/DELETE not allowed in stateless mode
|
|
140
|
+
const methodNotAllowed = (_req, res) => {
|
|
224
141
|
res.writeHead(405).end(JSON.stringify({
|
|
225
142
|
jsonrpc: '2.0',
|
|
226
143
|
error: { code: -32000, message: 'Method not allowed.' },
|
|
227
144
|
id: null,
|
|
228
145
|
}));
|
|
229
|
-
}
|
|
146
|
+
};
|
|
147
|
+
app.get(path, methodNotAllowed);
|
|
148
|
+
app.delete(path, methodNotAllowed);
|
|
230
149
|
app.listen(port, () => {
|
|
231
150
|
logger.info(`Listening on port ${port}`);
|
|
232
151
|
logger.info(`Streamable HTTP endpoint: http://localhost:${port}${path}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"statelessBridge.js","sourceRoot":"","sources":["../../src/gateways/statelessBridge.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"statelessBridge.js","sourceRoot":"","sources":["../../src/gateways/statelessBridge.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAA;AAClE,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAA;AAClG,OAAO,EAAuB,mBAAmB,EAAE,MAAM,oCAAoC,CAAA;AAG7F,OAAO,EAAE,SAAS,EAAsB,MAAM,mBAAmB,CAAA;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,uBAAuB,EAAE,6BAA6B,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAClH,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAcvD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,IAAyB;IAClE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,eAAe,EAAE,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,GAAG,IAAI,CAAA;IAE1G,MAAM,CAAC,IAAI,CAAC,wBAAwB,WAAW,EAAE,CAAC,CAAA;IAClD,MAAM,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC,CAAA;IAChC,MAAM,CAAC,IAAI,CAAC,cAAc,QAAQ,EAAE,CAAC,CAAA;IACrC,MAAM,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC,CAAA;IAChC,MAAM,CAAC,IAAI,CAAC,wBAAwB,eAAe,EAAE,CAAC,CAAA;IACtD,MAAM,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;IAE/F,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;IAErB,MAAM,GAAG,GAAG,SAAS,CAAC;QACpB,MAAM;QACN,UAAU;QACV,eAAe;QACf,OAAO;QACP,IAAI;QACJ,OAAO,EAAE,IAAI;KACd,CAAC,CAAA;IAEF,6CAA6C;IAC7C,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QAChC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAA;YACxF,MAAM,SAAS,GAAG,IAAI,6BAA6B,CAAC,EAAE,kBAAkB,EAAE,SAAS,EAAE,CAAC,CAAA;YACtF,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;YAE/B,4BAA4B;YAC5B,IAAI,aAAa,GAAG,KAAK,CAAA;YACzB,IAAI,mBAAmB,GAA2B,IAAI,CAAA;YACtD,IAAI,kBAAkB,GAAG,KAAK,CAAA;YAC9B,IAAI,sBAAsB,GAA0B,IAAI,CAAA;YAExD,MAAM,YAAY,GAAG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE;gBACvD,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE;oBACjB,wDAAwD;oBACxD,IAAI,mBAAmB,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,CAAC,EAAE,KAAK,mBAAmB,EAAE,CAAC;wBACzE,MAAM,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAA;wBACvD,aAAa,GAAG,IAAI,CAAA;wBAEpB,IAAI,kBAAkB,EAAE,CAAC;4BACvB,iEAAiE;4BACjE,YAAY,CAAC,IAAI,CAAC,6BAA6B,EAAE,CAAC,CAAA;4BAElD,IAAI,sBAAsB,EAAE,CAAC;gCAC3B,YAAY,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAA;gCACzC,sBAAsB,GAAG,IAAI,CAAA;4BAC/B,CAAC;4BAED,kBAAkB,GAAG,KAAK,CAAA;4BAC1B,mBAAmB,GAAG,IAAI,CAAA;4BAC1B,OAAM,CAAC,6CAA6C;wBACtD,CAAC;wBAED,mBAAmB,GAAG,IAAI,CAAA;oBAC5B,CAAC;oBAED,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;wBAC9B,MAAM,CAAC,KAAK,CAAC,8CAA8C,EAAE,CAAC,CAAC,CAAA;oBACjE,CAAC,CAAC,CAAA;gBACJ,CAAC;gBAED,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE;oBACrC,qDAAqD;oBACrD,IAAI,sBAAsB,IAAI,IAAI,IAAI,sBAAsB,IAAI,sBAAsB,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;wBACxG,YAAY,CAAC,YAAY,CAAC,sBAAsB,CAAC,EAAqB,CAAC,CAAA;wBACvE,sBAAsB,GAAG,IAAI,CAAA;oBAC/B,CAAC;oBAED,gEAAgE;oBAChE,IAAI,kBAAkB,IAAI,mBAAmB,KAAK,IAAI,EAAE,CAAC;wBACvD,YAAY,CAAC,eAAe,CAAC,mBAAmB,CAAC,CAAA;oBACnD,CAAC;oBAED,gDAAgD;oBAChD,KAAK,MAAM,EAAE,IAAI,YAAY,CAAC,kBAAkB,EAAE,EAAE,CAAC;wBACnD,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;wBACjD,MAAM,OAAO,GAAG,MAAM;4BACpB,CAAC,CAAC,8BAA8B,IAAI,MAAM,MAAM,EAAE;4BAClD,CAAC,CAAC,2CAA2C,IAAI,YAAY,MAAM,GAAG,CAAA;wBACxE,SAAS,CAAC,IAAI,CAAC;4BACb,OAAO,EAAE,KAAK;4BACd,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE;4BAChC,EAAE;yBACe,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;oBACtC,CAAC;oBAED,SAAS,CAAC,KAAK,EAAE,CAAA;gBACnB,CAAC;aACF,CAAC,CAAA;YAEF,SAAS,CAAC,SAAS,GAAG,CAAC,GAAmB,EAAE,EAAE;gBAC5C,6DAA6D;gBAC7D,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;oBACxC,YAAY,CAAC,YAAY,CAAC,GAAG,CAAC,EAAqB,CAAC,CAAA;gBACtD,CAAC;gBAED,gEAAgE;gBAChE,IAAI,CAAC,aAAa,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC;oBAChD,sBAAsB,GAAG,GAAG,CAAA;oBAC5B,mBAAmB,GAAG,kBAAkB,EAAE,CAAA;oBAC1C,kBAAkB,GAAG,IAAI,CAAA;oBAEzB,MAAM,CAAC,IAAI,CAAC,4EAA4E,CAAC,CAAA;oBACzF,YAAY,CAAC,IAAI,CAAC,uBAAuB,CAAC,mBAAmB,EAAE,eAAe,CAAC,CAAC,CAAA;oBAChF,OAAM;gBACR,CAAC;gBAED,oCAAoC;gBACpC,IAAI,mBAAmB,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;oBACpE,mBAAmB,GAAG,GAAG,CAAC,EAAE,CAAA;oBAC5B,kBAAkB,GAAG,KAAK,CAAA;oBAC1B,MAAM,CAAC,IAAI,CAAC,+CAA+C,GAAG,CAAC,EAAE,EAAE,CAAC,CAAA;gBACtE,CAAC;gBAED,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACxB,CAAC,CAAA;YAED,SAAS,CAAC,OAAO,GAAG,GAAG,EAAE;gBACvB,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAA;gBACjD,YAAY,CAAC,IAAI,EAAE,CAAA;YACrB,CAAC,CAAA;YAED,SAAS,CAAC,OAAO,GAAG,CAAC,GAAG,EAAE,EAAE;gBAC1B,MAAM,CAAC,KAAK,CAAC,mCAAmC,EAAE,GAAG,CAAC,CAAA;gBACtD,YAAY,CAAC,IAAI,EAAE,CAAA;YACrB,CAAC,CAAA;YAED,MAAM,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAA;QACnD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,yCAAyC,EAAE,KAAK,CAAC,CAAA;YAC9D,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;gBACrB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,uBAAuB,EAAE;oBACzD,EAAE,EAAE,IAAI;iBACT,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,2CAA2C;IAC3C,MAAM,gBAAgB,GAAG,CAAC,IAAS,EAAE,GAAQ,EAAE,EAAE;QAC/C,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;YACpC,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,qBAAqB,EAAE;YACvD,EAAE,EAAE,IAAI;SACT,CAAC,CAAC,CAAA;IACL,CAAC,CAAA;IACD,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAA;IAC/B,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAA;IAElC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;QACpB,MAAM,CAAC,IAAI,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAA;QACxC,MAAM,CAAC,IAAI,CAAC,8CAA8C,IAAI,GAAG,IAAI,EAAE,CAAC,CAAA;IAC1E,CAAC,CAAC,CAAA;AACJ,CAAC"}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Child process management for stdio-based MCP servers.
|
|
3
|
+
*
|
|
4
|
+
* Handles spawning child processes, parsing JSON-RPC messages from stdout,
|
|
5
|
+
* and writing messages to stdin.
|
|
6
|
+
*/
|
|
7
|
+
import { type ChildProcess } from 'child_process';
|
|
8
|
+
import type { JSONRPCMessage } from '@modelcontextprotocol/sdk/types.js';
|
|
9
|
+
import type { Logger } from '../types.js';
|
|
10
|
+
export interface ChildProcessCallbacks {
|
|
11
|
+
/** Called when a JSON-RPC message is received from the child */
|
|
12
|
+
onMessage: (msg: JSONRPCMessage) => void;
|
|
13
|
+
/** Called when the child process exits */
|
|
14
|
+
onExit: (code: number | null, signal: string | null, stderrOutput: string) => void;
|
|
15
|
+
/** Called when there's an error spawning or communicating with the child */
|
|
16
|
+
onError?: (err: Error) => void;
|
|
17
|
+
}
|
|
18
|
+
export interface ManagedChildProcess {
|
|
19
|
+
/** The underlying child process */
|
|
20
|
+
child: ChildProcess;
|
|
21
|
+
/** Send a JSON-RPC message to the child's stdin */
|
|
22
|
+
send: (msg: JSONRPCMessage) => boolean;
|
|
23
|
+
/** Kill the child process */
|
|
24
|
+
kill: () => void;
|
|
25
|
+
/** Track a request ID as pending (for error reporting on exit) */
|
|
26
|
+
trackRequest: (id: string | number) => void;
|
|
27
|
+
/** Mark a request ID as completed */
|
|
28
|
+
completeRequest: (id: string | number) => void;
|
|
29
|
+
/** Get all pending request IDs */
|
|
30
|
+
getPendingRequests: () => Set<string | number>;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Spawn a child process and set up JSON-RPC message handling.
|
|
34
|
+
*
|
|
35
|
+
* The child is expected to speak JSON-RPC over stdio (one message per line).
|
|
36
|
+
*/
|
|
37
|
+
export declare function spawnManagedChild(command: string, logger: Logger, callbacks: ChildProcessCallbacks): ManagedChildProcess;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Child process management for stdio-based MCP servers.
|
|
3
|
+
*
|
|
4
|
+
* Handles spawning child processes, parsing JSON-RPC messages from stdout,
|
|
5
|
+
* and writing messages to stdin.
|
|
6
|
+
*/
|
|
7
|
+
import { spawn } from 'child_process';
|
|
8
|
+
/**
|
|
9
|
+
* Spawn a child process and set up JSON-RPC message handling.
|
|
10
|
+
*
|
|
11
|
+
* The child is expected to speak JSON-RPC over stdio (one message per line).
|
|
12
|
+
*/
|
|
13
|
+
export function spawnManagedChild(command, logger, callbacks) {
|
|
14
|
+
const pendingRequestIds = new Set();
|
|
15
|
+
let stderrOutput = '';
|
|
16
|
+
let buffer = '';
|
|
17
|
+
const child = spawn(command, { shell: true, stdio: ['pipe', 'pipe', 'pipe'] });
|
|
18
|
+
logger.info(`[child] Spawned process, pid=${child.pid}`);
|
|
19
|
+
child.on('spawn', () => {
|
|
20
|
+
logger.info(`[child] spawn event fired, pid=${child.pid}`);
|
|
21
|
+
});
|
|
22
|
+
child.on('error', (err) => {
|
|
23
|
+
logger.error(`[child] error event: ${err.message}`);
|
|
24
|
+
callbacks.onError?.(err);
|
|
25
|
+
});
|
|
26
|
+
child.on('exit', (code, signal) => {
|
|
27
|
+
logger.info(`[child] exited: code=${code}, signal=${signal}`);
|
|
28
|
+
callbacks.onExit(code, signal, stderrOutput);
|
|
29
|
+
});
|
|
30
|
+
child.stdout.on('data', (chunk) => {
|
|
31
|
+
const chunkStr = chunk.toString('utf8');
|
|
32
|
+
logger.info(`[child] stdout received ${chunk.length} bytes`);
|
|
33
|
+
buffer += chunkStr;
|
|
34
|
+
const lines = buffer.split(/\r?\n/);
|
|
35
|
+
buffer = lines.pop() ?? '';
|
|
36
|
+
for (const line of lines) {
|
|
37
|
+
if (!line.trim())
|
|
38
|
+
continue;
|
|
39
|
+
try {
|
|
40
|
+
const jsonMsg = JSON.parse(line);
|
|
41
|
+
// Auto-complete request tracking for responses
|
|
42
|
+
if ('id' in jsonMsg && jsonMsg.id !== undefined) {
|
|
43
|
+
pendingRequestIds.delete(jsonMsg.id);
|
|
44
|
+
}
|
|
45
|
+
logger.info(`[child] → message: ${line.slice(0, 200)}${line.length > 200 ? '...' : ''}`);
|
|
46
|
+
callbacks.onMessage(jsonMsg);
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
logger.error(`[child] non-JSON output: ${line}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
child.stderr.on('data', (chunk) => {
|
|
54
|
+
const text = chunk.toString('utf8');
|
|
55
|
+
stderrOutput += text;
|
|
56
|
+
logger.error(`[child] stderr: ${text}`);
|
|
57
|
+
});
|
|
58
|
+
child.stdin.on('error', (err) => {
|
|
59
|
+
logger.error(`[child] stdin error: ${err.message}`);
|
|
60
|
+
});
|
|
61
|
+
return {
|
|
62
|
+
child,
|
|
63
|
+
send: (msg) => {
|
|
64
|
+
const payload = JSON.stringify(msg) + '\n';
|
|
65
|
+
logger.info(`[child] ← message: ${JSON.stringify(msg).slice(0, 200)}`);
|
|
66
|
+
return child.stdin.write(payload);
|
|
67
|
+
},
|
|
68
|
+
kill: () => {
|
|
69
|
+
child.kill();
|
|
70
|
+
},
|
|
71
|
+
trackRequest: (id) => {
|
|
72
|
+
pendingRequestIds.add(id);
|
|
73
|
+
},
|
|
74
|
+
completeRequest: (id) => {
|
|
75
|
+
pendingRequestIds.delete(id);
|
|
76
|
+
},
|
|
77
|
+
getPendingRequests: () => pendingRequestIds,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=childProcess.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"childProcess.js","sourceRoot":"","sources":["../../src/lib/childProcess.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Shared configuration constants */
|
|
2
|
+
export declare const VERSION = "1.0.0";
|
|
3
|
+
/** Default MCP protocol version for auto-initialization */
|
|
4
|
+
export declare const DEFAULT_PROTOCOL_VERSION = "2025-03-26";
|
|
5
|
+
/** Bridge server name used in MCP handshakes */
|
|
6
|
+
export declare const SERVER_NAME = "platf-bridge";
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Shared configuration constants */
|
|
2
|
+
export const VERSION = '1.0.0';
|
|
3
|
+
/** Default MCP protocol version for auto-initialization */
|
|
4
|
+
export const DEFAULT_PROTOCOL_VERSION = '2025-03-26';
|
|
5
|
+
/** Bridge server name used in MCP handshakes */
|
|
6
|
+
export const SERVER_NAME = 'platf-bridge';
|
|
7
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,qCAAqC;AAErC,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAA;AAE9B,2DAA2D;AAC3D,MAAM,CAAC,MAAM,wBAAwB,GAAG,YAAY,CAAA;AAEpD,gDAAgD;AAChD,MAAM,CAAC,MAAM,WAAW,GAAG,cAAc,CAAA"}
|
|
@@ -4,7 +4,9 @@
|
|
|
4
4
|
* When auth is enabled these routes expose:
|
|
5
5
|
* - GET /.well-known/oauth-protected-resource[/*] (RFC 9728)
|
|
6
6
|
* - GET /.well-known/oauth-authorization-server[/*] (RFC 8414 — proxied from issuer)
|
|
7
|
-
* - POST /
|
|
7
|
+
* - POST /register (Pseudo-DCR — RFC 7591)
|
|
8
|
+
*
|
|
9
|
+
* OAuth proxy routes (/authorize, /token, /jwks) are in oauthProxy.ts.
|
|
8
10
|
*
|
|
9
11
|
* These endpoints are unauthenticated — they must be accessible to
|
|
10
12
|
* any client performing OAuth discovery before obtaining a token.
|