@alsania-io/mcpnyx 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.
Files changed (98) hide show
  1. package/README.md +251 -0
  2. package/dist/gateways/configToSse.d.ts +16 -0
  3. package/dist/gateways/configToSse.d.ts.map +1 -0
  4. package/dist/gateways/configToSse.js +144 -0
  5. package/dist/gateways/configToSse.js.map +1 -0
  6. package/dist/gateways/configToStreamableHttp.d.ts +16 -0
  7. package/dist/gateways/configToStreamableHttp.d.ts.map +1 -0
  8. package/dist/gateways/configToStreamableHttp.js +287 -0
  9. package/dist/gateways/configToStreamableHttp.js.map +1 -0
  10. package/dist/gateways/configToWs.d.ts +14 -0
  11. package/dist/gateways/configToWs.d.ts.map +1 -0
  12. package/dist/gateways/configToWs.js +145 -0
  13. package/dist/gateways/configToWs.js.map +1 -0
  14. package/dist/gateways/sseToSse.d.ts +16 -0
  15. package/dist/gateways/sseToSse.d.ts.map +1 -0
  16. package/dist/gateways/sseToSse.js +224 -0
  17. package/dist/gateways/sseToSse.js.map +1 -0
  18. package/dist/gateways/sseToStdio.d.ts +8 -0
  19. package/dist/gateways/sseToStdio.d.ts.map +1 -0
  20. package/dist/gateways/sseToStdio.js +130 -0
  21. package/dist/gateways/sseToStdio.js.map +1 -0
  22. package/dist/gateways/sseToWs.d.ts +14 -0
  23. package/dist/gateways/sseToWs.d.ts.map +1 -0
  24. package/dist/gateways/sseToWs.js +212 -0
  25. package/dist/gateways/sseToWs.js.map +1 -0
  26. package/dist/gateways/stdioToSse.d.ts +16 -0
  27. package/dist/gateways/stdioToSse.d.ts.map +1 -0
  28. package/dist/gateways/stdioToSse.js +134 -0
  29. package/dist/gateways/stdioToSse.js.map +1 -0
  30. package/dist/gateways/stdioToStatefulStreamableHttp.d.ts +15 -0
  31. package/dist/gateways/stdioToStatefulStreamableHttp.d.ts.map +1 -0
  32. package/dist/gateways/stdioToStatefulStreamableHttp.js +189 -0
  33. package/dist/gateways/stdioToStatefulStreamableHttp.js.map +1 -0
  34. package/dist/gateways/stdioToStatelessStreamableHttp.d.ts +14 -0
  35. package/dist/gateways/stdioToStatelessStreamableHttp.d.ts.map +1 -0
  36. package/dist/gateways/stdioToStatelessStreamableHttp.js +132 -0
  37. package/dist/gateways/stdioToStatelessStreamableHttp.js.map +1 -0
  38. package/dist/gateways/stdioToWs.d.ts +13 -0
  39. package/dist/gateways/stdioToWs.d.ts.map +1 -0
  40. package/dist/gateways/stdioToWs.js +115 -0
  41. package/dist/gateways/stdioToWs.js.map +1 -0
  42. package/dist/gateways/streamableHttpToSse.d.ts +16 -0
  43. package/dist/gateways/streamableHttpToSse.d.ts.map +1 -0
  44. package/dist/gateways/streamableHttpToSse.js +219 -0
  45. package/dist/gateways/streamableHttpToSse.js.map +1 -0
  46. package/dist/gateways/streamableHttpToStdio.d.ts +8 -0
  47. package/dist/gateways/streamableHttpToStdio.d.ts.map +1 -0
  48. package/dist/gateways/streamableHttpToStdio.js +124 -0
  49. package/dist/gateways/streamableHttpToStdio.js.map +1 -0
  50. package/dist/index.d.ts +46 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +424 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/lib/config.d.ts +78 -0
  55. package/dist/lib/config.d.ts.map +1 -0
  56. package/dist/lib/config.js +59 -0
  57. package/dist/lib/config.js.map +1 -0
  58. package/dist/lib/corsOrigin.d.ts +6 -0
  59. package/dist/lib/corsOrigin.d.ts.map +1 -0
  60. package/dist/lib/corsOrigin.js +24 -0
  61. package/dist/lib/corsOrigin.js.map +1 -0
  62. package/dist/lib/getLogger.d.ts +6 -0
  63. package/dist/lib/getLogger.d.ts.map +1 -0
  64. package/dist/lib/getLogger.js +55 -0
  65. package/dist/lib/getLogger.js.map +1 -0
  66. package/dist/lib/getVersion.d.ts +2 -0
  67. package/dist/lib/getVersion.d.ts.map +1 -0
  68. package/dist/lib/getVersion.js +17 -0
  69. package/dist/lib/getVersion.js.map +1 -0
  70. package/dist/lib/headers.d.ts +9 -0
  71. package/dist/lib/headers.d.ts.map +1 -0
  72. package/dist/lib/headers.js +32 -0
  73. package/dist/lib/headers.js.map +1 -0
  74. package/dist/lib/mcpServerManager.d.ts +24 -0
  75. package/dist/lib/mcpServerManager.d.ts.map +1 -0
  76. package/dist/lib/mcpServerManager.js +347 -0
  77. package/dist/lib/mcpServerManager.js.map +1 -0
  78. package/dist/lib/onSignals.d.ts +14 -0
  79. package/dist/lib/onSignals.d.ts.map +1 -0
  80. package/dist/lib/onSignals.js +28 -0
  81. package/dist/lib/onSignals.js.map +1 -0
  82. package/dist/lib/serializeCorsOrigin.d.ts +5 -0
  83. package/dist/lib/serializeCorsOrigin.d.ts.map +1 -0
  84. package/dist/lib/serializeCorsOrigin.js +7 -0
  85. package/dist/lib/serializeCorsOrigin.js.map +1 -0
  86. package/dist/lib/sessionAccessCounter.d.ts +12 -0
  87. package/dist/lib/sessionAccessCounter.d.ts.map +1 -0
  88. package/dist/lib/sessionAccessCounter.js +78 -0
  89. package/dist/lib/sessionAccessCounter.js.map +1 -0
  90. package/dist/server/websocket.d.ts +22 -0
  91. package/dist/server/websocket.d.ts.map +1 -0
  92. package/dist/server/websocket.js +103 -0
  93. package/dist/server/websocket.js.map +1 -0
  94. package/dist/types.d.ts +7 -0
  95. package/dist/types.d.ts.map +1 -0
  96. package/dist/types.js +2 -0
  97. package/dist/types.js.map +1 -0
  98. package/package.json +95 -0
@@ -0,0 +1,115 @@
1
+ import express from 'express';
2
+ import cors from 'cors';
3
+ import { createServer } from 'http';
4
+ import { spawn } from 'child_process';
5
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
6
+ import { getVersion } from '../lib/getVersion.js';
7
+ import { WebSocketServerTransport } from '../server/websocket.js';
8
+ import { onSignals } from '../lib/onSignals.js';
9
+ import { serializeCorsOrigin } from '../lib/serializeCorsOrigin.js';
10
+ export async function stdioToWs(args) {
11
+ const { stdioCmd, port, host, messagePath, logger, healthEndpoints, corsOrigin } = args;
12
+ logger.info(` - host: ${host}`);
13
+ logger.info(` - port: ${port}`);
14
+ logger.info(` - stdio: ${stdioCmd}`);
15
+ logger.info(` - messagePath: ${messagePath}`);
16
+ logger.info(` - CORS: ${corsOrigin ? `enabled (${serializeCorsOrigin({ corsOrigin })})` : 'disabled'}`);
17
+ logger.info(` - Health endpoints: ${healthEndpoints.length ? healthEndpoints.join(', ') : '(none)'}`);
18
+ let wsTransport = null;
19
+ let child = null;
20
+ let isReady = false;
21
+ const cleanup = () => {
22
+ if (wsTransport) {
23
+ wsTransport.close().catch((err) => {
24
+ logger.error(`Error stopping WebSocket server: ${err.message}`);
25
+ });
26
+ }
27
+ if (child) {
28
+ child.kill();
29
+ }
30
+ };
31
+ onSignals({
32
+ logger,
33
+ cleanup,
34
+ });
35
+ try {
36
+ child = spawn(stdioCmd, { shell: true });
37
+ child.on('exit', (code, signal) => {
38
+ logger.error(`Child exited: code=${code}, signal=${signal}`);
39
+ cleanup();
40
+ process.exit(code ?? 1);
41
+ });
42
+ const server = new Server({ name: 'mcp-nyx', version: getVersion() }, { capabilities: {} });
43
+ // Handle child process output
44
+ let buffer = '';
45
+ child.stdout.on('data', (chunk) => {
46
+ buffer += chunk.toString('utf8');
47
+ const lines = buffer.split(/\r?\n/);
48
+ buffer = lines.pop() ?? '';
49
+ lines.forEach((line) => {
50
+ if (!line.trim())
51
+ return;
52
+ try {
53
+ const jsonMsg = JSON.parse(line);
54
+ logger.info(`Child → WebSocket: ${JSON.stringify(jsonMsg)}`);
55
+ // Broadcast to all connected clients
56
+ wsTransport?.send(jsonMsg, jsonMsg.id).catch((err) => {
57
+ logger.error('Failed to broadcast message:', err);
58
+ });
59
+ }
60
+ catch {
61
+ logger.error(`Child non-JSON: ${line}`);
62
+ }
63
+ });
64
+ });
65
+ child.stderr.on('data', (chunk) => {
66
+ logger.info(`Child stderr: ${chunk.toString('utf8')}`);
67
+ });
68
+ const app = express();
69
+ if (corsOrigin) {
70
+ app.use(cors({ origin: corsOrigin }));
71
+ }
72
+ for (const ep of healthEndpoints) {
73
+ app.get(ep, (_req, res) => {
74
+ if (child?.killed) {
75
+ res.status(500).send('Child process has been killed');
76
+ }
77
+ if (!isReady) {
78
+ res.status(500).send('Server is not ready');
79
+ }
80
+ res.send('ok');
81
+ });
82
+ }
83
+ const httpServer = createServer(app);
84
+ wsTransport = new WebSocketServerTransport({
85
+ path: messagePath,
86
+ server: httpServer,
87
+ });
88
+ await server.connect(wsTransport);
89
+ wsTransport.onmessage = (msg) => {
90
+ const line = JSON.stringify(msg);
91
+ logger.info(`WebSocket → Child: ${line}`);
92
+ child.stdin.write(line + '\n');
93
+ };
94
+ wsTransport.onconnection = (clientId) => {
95
+ logger.info(`New WebSocket connection: ${clientId}`);
96
+ };
97
+ wsTransport.ondisconnection = (clientId) => {
98
+ logger.info(`WebSocket connection closed: ${clientId}`);
99
+ };
100
+ wsTransport.onerror = (err) => {
101
+ logger.error(`WebSocket error: ${err.message}`);
102
+ };
103
+ isReady = true;
104
+ httpServer.listen(port, host, () => {
105
+ logger.info(`Listening on ${host}:${port}`);
106
+ logger.info(`WebSocket endpoint: ws://${host}:${port}${messagePath}`);
107
+ });
108
+ }
109
+ catch (err) {
110
+ logger.error(`Failed to start: ${err.message}`);
111
+ cleanup();
112
+ process.exit(1);
113
+ }
114
+ }
115
+ //# sourceMappingURL=stdioToWs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdioToWs.js","sourceRoot":"","sources":["../../src/gateways/stdioToWs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { type CorsOptions } from 'cors';
2
+ import { Logger } from '../types.js';
3
+ export interface StreamableHttpToSseArgs {
4
+ streamableHttpUrl: string;
5
+ port: number;
6
+ host: string;
7
+ baseUrl: string;
8
+ ssePath: string;
9
+ messagePath: string;
10
+ logger: Logger;
11
+ corsOrigin: CorsOptions['origin'];
12
+ healthEndpoints: string[];
13
+ headers: Record<string, string>;
14
+ }
15
+ export declare function streamableHttpToSse(args: StreamableHttpToSseArgs): Promise<void>;
16
+ //# sourceMappingURL=streamableHttpToSse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streamableHttpToSse.d.ts","sourceRoot":"","sources":["../../src/gateways/streamableHttpToSse.ts"],"names":[],"mappings":"AAEA,OAAa,EAAE,KAAK,WAAW,EAAE,MAAM,MAAM,CAAC;AAc9C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAIrC,MAAM,WAAW,uBAAuB;IACtC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IAClC,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AA2CD,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,uBAAuB,iBAmNtE"}
@@ -0,0 +1,219 @@
1
+ import express from 'express';
2
+ import bodyParser from 'body-parser';
3
+ import cors from 'cors';
4
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
5
+ import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
6
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
7
+ import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';
8
+ import { InitializeRequestSchema } from '@modelcontextprotocol/sdk/types.js';
9
+ import { z } from 'zod';
10
+ import { getVersion } from '../lib/getVersion.js';
11
+ import { onSignals } from '../lib/onSignals.js';
12
+ import { serializeCorsOrigin } from '../lib/serializeCorsOrigin.js';
13
+ let streamableHttpClient;
14
+ const newInitializeStreamableHttpClient = ({ message }) => {
15
+ const clientInfo = message.params?.clientInfo;
16
+ const clientCapabilities = message.params?.capabilities;
17
+ return new Client({
18
+ name: clientInfo?.name ?? 'mcp-nyx',
19
+ version: clientInfo?.version ?? getVersion(),
20
+ }, {
21
+ capabilities: clientCapabilities ?? {},
22
+ });
23
+ };
24
+ const newFallbackStreamableHttpClient = async ({ streamableHttpTransport, }) => {
25
+ const fallbackStreamableHttpClient = new Client({
26
+ name: 'mcp-nyx',
27
+ version: getVersion(),
28
+ }, {
29
+ capabilities: {},
30
+ });
31
+ await fallbackStreamableHttpClient.connect(streamableHttpTransport);
32
+ return fallbackStreamableHttpClient;
33
+ };
34
+ const setResponseHeaders = ({ res, headers }) => Object.entries(headers).forEach(([key, value]) => {
35
+ res.setHeader(key, value);
36
+ });
37
+ export async function streamableHttpToSse(args) {
38
+ const { streamableHttpUrl, port, host, baseUrl, ssePath, messagePath, logger, corsOrigin, healthEndpoints, headers } = args;
39
+ logger.info(` - input StreamableHttp: ${streamableHttpUrl}`);
40
+ logger.info(` - Headers: ${Object.keys(headers).length ? JSON.stringify(headers) : '(none)'}`);
41
+ logger.info(` - host: ${host}`);
42
+ logger.info(` - port: ${port}`);
43
+ if (baseUrl) {
44
+ logger.info(` - baseUrl: ${baseUrl}`);
45
+ }
46
+ logger.info(` - ssePath: ${ssePath}`);
47
+ logger.info(` - messagePath: ${messagePath}`);
48
+ logger.info(` - CORS: ${corsOrigin ? `enabled (${serializeCorsOrigin({ corsOrigin })})` : 'disabled'}`);
49
+ logger.info(` - Health endpoints: ${healthEndpoints.length ? healthEndpoints.join(', ') : '(none)'}`);
50
+ onSignals({ logger });
51
+ const inputStreamableHttpTransport = new StreamableHTTPClientTransport(new URL(streamableHttpUrl), {
52
+ requestInit: {
53
+ headers,
54
+ },
55
+ });
56
+ inputStreamableHttpTransport.onerror = (err) => {
57
+ logger.error('Input StreamableHttp error:', err);
58
+ };
59
+ inputStreamableHttpTransport.onclose = () => {
60
+ logger.error('Input StreamableHttp connection closed');
61
+ process.exit(1);
62
+ };
63
+ const outputServer = new Server({ name: 'mcp-nyx', version: getVersion() }, { capabilities: {} });
64
+ const sessions = {};
65
+ const app = express();
66
+ if (corsOrigin) {
67
+ app.use(cors({ origin: corsOrigin }));
68
+ }
69
+ app.use((req, res, next) => {
70
+ if (req.path === messagePath)
71
+ return next();
72
+ return bodyParser.json()(req, res, next);
73
+ });
74
+ for (const ep of healthEndpoints) {
75
+ app.get(ep, (_req, res) => {
76
+ setResponseHeaders({
77
+ res,
78
+ headers,
79
+ });
80
+ res.send('ok');
81
+ });
82
+ }
83
+ app.get(ssePath, async (req, res) => {
84
+ logger.info(`New SSE connection from ${req.ip}`);
85
+ setResponseHeaders({
86
+ res,
87
+ headers,
88
+ });
89
+ const outputSseTransport = new SSEServerTransport(`${baseUrl}${messagePath}`, res);
90
+ await outputServer.connect(outputSseTransport);
91
+ const sessionId = outputSseTransport.sessionId;
92
+ if (sessionId) {
93
+ sessions[sessionId] = { transport: outputSseTransport, response: res };
94
+ }
95
+ const wrapResponse = (req, payload) => ({
96
+ jsonrpc: req.jsonrpc || '2.0',
97
+ id: req.id,
98
+ ...payload,
99
+ });
100
+ outputSseTransport.onmessage = async (message) => {
101
+ const isRequest = 'method' in message && 'id' in message;
102
+ if (isRequest) {
103
+ logger.info(`Output SSE → Input StreamableHttp (session ${sessionId}):`, message);
104
+ const req = message;
105
+ let result;
106
+ try {
107
+ if (!streamableHttpClient) {
108
+ if (message.method === 'initialize') {
109
+ streamableHttpClient = newInitializeStreamableHttpClient({
110
+ message,
111
+ });
112
+ const originalRequest = streamableHttpClient.request;
113
+ streamableHttpClient.request = async function (requestMessage, ...restArgs) {
114
+ if (InitializeRequestSchema.safeParse(requestMessage).success &&
115
+ message.params?.protocolVersion &&
116
+ requestMessage.params?.protocolVersion) {
117
+ requestMessage.params.protocolVersion = message.params.protocolVersion;
118
+ }
119
+ result = await originalRequest.apply(this, [requestMessage, ...restArgs]);
120
+ return result;
121
+ };
122
+ await streamableHttpClient.connect(inputStreamableHttpTransport);
123
+ streamableHttpClient.request = originalRequest;
124
+ }
125
+ else {
126
+ logger.info('StreamableHttp client not initialized, creating fallback client');
127
+ streamableHttpClient = await newFallbackStreamableHttpClient({
128
+ streamableHttpTransport: inputStreamableHttpTransport,
129
+ });
130
+ }
131
+ logger.info('Input StreamableHttp connected');
132
+ }
133
+ else {
134
+ result = await streamableHttpClient.request(req, z.any());
135
+ }
136
+ }
137
+ catch (err) {
138
+ logger.error('Request error:', err);
139
+ const errorCode = err && typeof err === 'object' && 'code' in err ? err.code : -32000;
140
+ let errorMsg = err && typeof err === 'object' && 'message' in err ? err.message : 'Internal error';
141
+ const prefix = `MCP error ${errorCode}:`;
142
+ if (errorMsg.startsWith(prefix)) {
143
+ errorMsg = errorMsg.slice(prefix.length).trim();
144
+ }
145
+ const errorResp = wrapResponse(req, {
146
+ error: {
147
+ code: errorCode,
148
+ message: errorMsg,
149
+ },
150
+ });
151
+ try {
152
+ outputSseTransport.send(errorResp);
153
+ }
154
+ catch (sendErr) {
155
+ logger.error(`Failed to send error response to session ${sessionId}:`, sendErr);
156
+ delete sessions[sessionId];
157
+ }
158
+ return;
159
+ }
160
+ const response = wrapResponse(req, result.hasOwnProperty('error') ? { error: { ...result.error } } : { result: { ...result } });
161
+ logger.info(`Response (session ${sessionId}):`, response);
162
+ try {
163
+ outputSseTransport.send(response);
164
+ }
165
+ catch (sendErr) {
166
+ logger.error(`Failed to send response to session ${sessionId}:`, sendErr);
167
+ delete sessions[sessionId];
168
+ }
169
+ }
170
+ else {
171
+ logger.info(`Input StreamableHttp → Output SSE (session ${sessionId}):`, message);
172
+ try {
173
+ outputSseTransport.send(message);
174
+ }
175
+ catch (sendErr) {
176
+ logger.error(`Failed to send message to session ${sessionId}:`, sendErr);
177
+ delete sessions[sessionId];
178
+ }
179
+ }
180
+ };
181
+ outputSseTransport.onclose = () => {
182
+ logger.info(`Output SSE connection closed (session ${sessionId})`);
183
+ delete sessions[sessionId];
184
+ };
185
+ outputSseTransport.onerror = (err) => {
186
+ logger.error(`Output SSE error (session ${sessionId}):`, err);
187
+ delete sessions[sessionId];
188
+ };
189
+ req.on('close', () => {
190
+ logger.info(`Client disconnected (session ${sessionId})`);
191
+ delete sessions[sessionId];
192
+ });
193
+ });
194
+ app.post(messagePath, async (req, res) => {
195
+ const sessionId = req.query.sessionId;
196
+ setResponseHeaders({
197
+ res,
198
+ headers,
199
+ });
200
+ if (!sessionId) {
201
+ return res.status(400).send('Missing sessionId parameter');
202
+ }
203
+ const session = sessions[sessionId];
204
+ if (session?.transport?.handlePostMessage) {
205
+ logger.info(`POST to SSE transport (session ${sessionId})`);
206
+ await session.transport.handlePostMessage(req, res);
207
+ }
208
+ else {
209
+ res.status(503).send(`No active SSE connection for session ${sessionId}`);
210
+ }
211
+ });
212
+ app.listen(port, host, () => {
213
+ logger.info(`Listening on ${host}:${port}`);
214
+ logger.info(`SSE endpoint: http://${host}:${port}${ssePath}`);
215
+ logger.info(`POST messages: http://${host}:${port}${messagePath}`);
216
+ });
217
+ logger.info('StreamableHttp-to-SSE gateway ready');
218
+ }
219
+ //# sourceMappingURL=streamableHttpToSse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streamableHttpToSse.js","sourceRoot":"","sources":["../../src/gateways/streamableHttpToSse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { Logger } from '../types.js';
2
+ export interface StreamableHttpToStdioArgs {
3
+ streamableHttpUrl: string;
4
+ logger: Logger;
5
+ headers: Record<string, string>;
6
+ }
7
+ export declare function streamableHttpToStdio(args: StreamableHttpToStdioArgs): Promise<void>;
8
+ //# sourceMappingURL=streamableHttpToStdio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streamableHttpToStdio.d.ts","sourceRoot":"","sources":["../../src/gateways/streamableHttpToStdio.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC,MAAM,WAAW,yBAAyB;IACxC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAkCD,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,yBAAyB,iBAgH1E"}
@@ -0,0 +1,124 @@
1
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
2
+ import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
3
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
4
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
5
+ import { InitializeRequestSchema } from '@modelcontextprotocol/sdk/types.js';
6
+ import { z } from 'zod';
7
+ import { getVersion } from '../lib/getVersion.js';
8
+ import { onSignals } from '../lib/onSignals.js';
9
+ let mcpClient;
10
+ const newInitializeMcpClient = ({ message }) => {
11
+ const clientInfo = message.params?.clientInfo;
12
+ const clientCapabilities = message.params?.capabilities;
13
+ return new Client({
14
+ name: clientInfo?.name ?? 'mcp-nyx',
15
+ version: clientInfo?.version ?? getVersion(),
16
+ }, {
17
+ capabilities: clientCapabilities ?? {},
18
+ });
19
+ };
20
+ const newFallbackMcpClient = async ({ mcpTransport }) => {
21
+ const fallbackMcpClient = new Client({
22
+ name: 'mcp-nyx',
23
+ version: getVersion(),
24
+ }, {
25
+ capabilities: {},
26
+ });
27
+ await fallbackMcpClient.connect(mcpTransport);
28
+ return fallbackMcpClient;
29
+ };
30
+ export async function streamableHttpToStdio(args) {
31
+ const { streamableHttpUrl, logger, headers } = args;
32
+ logger.info(` - streamableHttp: ${streamableHttpUrl}`);
33
+ logger.info(` - Headers: ${Object.keys(headers).length ? JSON.stringify(headers) : '(none)'}`);
34
+ logger.info('Connecting to Streamable HTTP...');
35
+ onSignals({ logger });
36
+ const mcpTransport = new StreamableHTTPClientTransport(new URL(streamableHttpUrl), {
37
+ requestInit: {
38
+ headers,
39
+ },
40
+ });
41
+ mcpTransport.onerror = (err) => {
42
+ logger.error('Streamable HTTP error:', err);
43
+ };
44
+ mcpTransport.onclose = () => {
45
+ logger.error('Streamable HTTP connection closed');
46
+ process.exit(1);
47
+ };
48
+ const stdioServer = new Server({
49
+ name: 'mcp-nyx',
50
+ version: getVersion(),
51
+ }, {
52
+ capabilities: {},
53
+ });
54
+ const stdioTransport = new StdioServerTransport();
55
+ await stdioServer.connect(stdioTransport);
56
+ const wrapResponse = (req, payload) => ({
57
+ jsonrpc: req.jsonrpc || '2.0',
58
+ id: req.id,
59
+ ...payload,
60
+ });
61
+ stdioServer.transport.onmessage = async (message) => {
62
+ const isRequest = 'method' in message && 'id' in message;
63
+ if (isRequest) {
64
+ logger.info('Stdio → Streamable HTTP:', message);
65
+ const req = message;
66
+ let result;
67
+ try {
68
+ if (!mcpClient) {
69
+ if (message.method === 'initialize') {
70
+ mcpClient = newInitializeMcpClient({
71
+ message,
72
+ });
73
+ const originalRequest = mcpClient.request;
74
+ mcpClient.request = async function (possibleInitRequestMessage, ...restArgs) {
75
+ if (InitializeRequestSchema.safeParse(possibleInitRequestMessage).success &&
76
+ message.params?.protocolVersion) {
77
+ // respect the protocol version from the stdio client's init request
78
+ possibleInitRequestMessage.params.protocolVersion = message.params.protocolVersion;
79
+ }
80
+ result = await originalRequest.apply(this, [possibleInitRequestMessage, ...restArgs]);
81
+ return result;
82
+ };
83
+ await mcpClient.connect(mcpTransport);
84
+ mcpClient.request = originalRequest;
85
+ }
86
+ else {
87
+ logger.info('Streamable HTTP client not initialized, creating fallback client');
88
+ mcpClient = await newFallbackMcpClient({ mcpTransport });
89
+ }
90
+ logger.info('Streamable HTTP connected');
91
+ }
92
+ else {
93
+ result = await mcpClient.request(req, z.any());
94
+ }
95
+ }
96
+ catch (err) {
97
+ logger.error('Request error:', err);
98
+ const errorCode = err && typeof err === 'object' && 'code' in err ? err.code : -32000;
99
+ let errorMsg = err && typeof err === 'object' && 'message' in err ? err.message : 'Internal error';
100
+ const prefix = `MCP error ${errorCode}:`;
101
+ if (errorMsg.startsWith(prefix)) {
102
+ errorMsg = errorMsg.slice(prefix.length).trim();
103
+ }
104
+ const errorResp = wrapResponse(req, {
105
+ error: {
106
+ code: errorCode,
107
+ message: errorMsg,
108
+ },
109
+ });
110
+ process.stdout.write(JSON.stringify(errorResp) + '\n');
111
+ return;
112
+ }
113
+ const response = wrapResponse(req, result.hasOwnProperty('error') ? { error: { ...result.error } } : { result: { ...result } });
114
+ logger.info('Response:', response);
115
+ process.stdout.write(JSON.stringify(response) + '\n');
116
+ }
117
+ else {
118
+ logger.info('Streamable HTTP → Stdio:', message);
119
+ process.stdout.write(JSON.stringify(message) + '\n');
120
+ }
121
+ };
122
+ logger.info('Stdio server listening');
123
+ }
124
+ //# sourceMappingURL=streamableHttpToStdio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streamableHttpToStdio.js","sourceRoot":"","sources":["../../src/gateways/streamableHttpToStdio.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * index.ts
4
+ *
5
+ * Run MCP stdio servers over SSE, convert between stdio, SSE, WS.
6
+ *
7
+ * Usage:
8
+ * # stdio→SSE
9
+ * npx -y @alsania-io/mcpnyx --stdio "npx -y @modelcontextprotocol/server-filesystem /" \
10
+ * --port 3006 --baseUrl http://localhost:3006 --ssePath /sse --messagePath /message
11
+ *
12
+ * # SSE→stdio
13
+ * npx -y @alsania-io/mcpnyx --sse "https://mcp-server-ab71a6b2-cd55-49d0-adba-562bc85956e3.supermachine.app"
14
+ *
15
+ * # SSE→SSE
16
+ * npx -y @alsania-io/mcpnyx --sse "https://input-sse-server.example.com/sse" --outputTransport ssetosse \
17
+ * --port 3006 --baseUrl http://localhost:3006 --ssePath /sse --messagePath /message
18
+ *
19
+ * # SSE→WS
20
+ * npx -y @alsania-io/mcpnyx --sse "https://input-sse-server.example.com/sse" --outputTransport ws \
21
+ * --port 3006 --messagePath /message
22
+ *
23
+ * # stdio→WS
24
+ * npx -y @alsania-io/mcpnyx --stdio "npx -y @modelcontextprotocol/server-filesystem /" --outputTransport ws
25
+ *
26
+ * # Streamable HTTP→stdio
27
+ * npx -y @alsania-io/mcpnyx --streamableHttp "https://mcp-server.example.com/mcp"
28
+ *
29
+ * # Streamable HTTP→SSE
30
+ * npx -y @alsania-io/mcpnyx --streamableHttp "https://mcp-server.example.com/mcp" --outputTransport sse \
31
+ * --port 3006 --baseUrl http://localhost:3006 --ssePath /sse --messagePath /message
32
+ *
33
+ * # Config→SSE (unified multiple servers)
34
+ * npx -y @alsania-io/mcpnyx --config ./config.json --outputTransport sse --port 3006
35
+ *
36
+ * # Config→WS (unified multiple servers)
37
+ * npx -y @alsania-io/mcpnyx --config ./config.json --outputTransport ws --port 3006
38
+ *
39
+ * # Config→StreamableHttp (unified multiple servers - stateless)
40
+ * npx -y @alsania-io/mcpnyx --config ./config.json --outputTransport streamableHttp --port 3006
41
+ *
42
+ * # Config→StreamableHttp (unified multiple servers - stateful with session timeout)
43
+ * npx -y @alsania-io/mcpnyx --config ./config.json --outputTransport streamableHttp --port 3006 --stateful --sessionTimeout 300000
44
+ */
45
+ export {};
46
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG"}