@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,78 @@
1
+ export class SessionAccessCounter {
2
+ timeout;
3
+ cleanup;
4
+ logger;
5
+ sessions = new Map();
6
+ constructor(timeout, cleanup, logger) {
7
+ this.timeout = timeout;
8
+ this.cleanup = cleanup;
9
+ this.logger = logger;
10
+ }
11
+ inc(sessionId, reason) {
12
+ this.logger.info(`SessionAccessCounter.inc() ${sessionId}, caused by ${reason}`);
13
+ const session = this.sessions.get(sessionId);
14
+ if (!session) {
15
+ // New session
16
+ this.logger.info(`Session access count 0 -> 1 for ${sessionId} (new session)`);
17
+ this.sessions.set(sessionId, { accessCount: 1 });
18
+ return;
19
+ }
20
+ if ('timeout' in session) {
21
+ // Clear pending cleanup and reactivate
22
+ this.logger.info(`Session access count 0 -> 1, clearing cleanup timeout for ${sessionId}`);
23
+ clearTimeout(session.timeout);
24
+ this.sessions.set(sessionId, { accessCount: 1 });
25
+ }
26
+ else {
27
+ // Increment active session
28
+ this.logger.info(`Session access count ${session.accessCount} -> ${session.accessCount + 1} for ${sessionId}`);
29
+ session.accessCount++;
30
+ }
31
+ }
32
+ dec(sessionId, reason) {
33
+ this.logger.info(`SessionAccessCounter.dec() ${sessionId}, caused by ${reason}`);
34
+ const session = this.sessions.get(sessionId);
35
+ if (!session) {
36
+ this.logger.error(`Called dec() on non-existent session ${sessionId}, ignoring`);
37
+ return;
38
+ }
39
+ if ('timeout' in session) {
40
+ this.logger.error(`Called dec() on session ${sessionId} that is already pending cleanup, ignoring`);
41
+ return;
42
+ }
43
+ if (session.accessCount <= 0) {
44
+ throw new Error(`Invalid access count ${session.accessCount} for session ${sessionId}`);
45
+ }
46
+ session.accessCount--;
47
+ this.logger.info(`Session access count ${session.accessCount + 1} -> ${session.accessCount} for ${sessionId}`);
48
+ if (session.accessCount === 0) {
49
+ this.logger.info(`Session access count reached 0, setting cleanup timeout for ${sessionId}`);
50
+ this.sessions.set(sessionId, {
51
+ timeout: setTimeout(() => {
52
+ this.logger.info(`Session ${sessionId} timed out, cleaning up`);
53
+ this.sessions.delete(sessionId);
54
+ this.cleanup(sessionId);
55
+ }, this.timeout),
56
+ });
57
+ }
58
+ }
59
+ clear(sessionId, runCleanup, reason) {
60
+ this.logger.info(`SessionAccessCounter.clear() ${sessionId}, caused by ${reason}`);
61
+ const session = this.sessions.get(sessionId);
62
+ if (!session) {
63
+ this.logger.info(`Attempted to clear non-existent session ${sessionId}`);
64
+ return;
65
+ }
66
+ // Clear any pending timeout
67
+ if ('timeout' in session) {
68
+ clearTimeout(session.timeout);
69
+ }
70
+ // Remove from tracking
71
+ this.sessions.delete(sessionId);
72
+ // Run cleanup if requested
73
+ if (runCleanup) {
74
+ this.cleanup(sessionId);
75
+ }
76
+ }
77
+ }
78
+ //# sourceMappingURL=sessionAccessCounter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionAccessCounter.js","sourceRoot":"","sources":["../../src/lib/sessionAccessCounter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { Transport, TransportSendOptions } from '@modelcontextprotocol/sdk/shared/transport.js';
2
+ import { JSONRPCMessage } from '@modelcontextprotocol/sdk/types.js';
3
+ import { Server } from 'http';
4
+ export declare class WebSocketServerTransport implements Transport {
5
+ private wss;
6
+ private clients;
7
+ onclose?: () => void;
8
+ onerror?: (err: Error) => void;
9
+ private messageHandler?;
10
+ onconnection?: (clientId: string) => void;
11
+ ondisconnection?: (clientId: string) => void;
12
+ set onmessage(handler: ((message: JSONRPCMessage) => void) | undefined);
13
+ constructor({ path, server }: {
14
+ path: string;
15
+ server: Server;
16
+ });
17
+ start(): Promise<void>;
18
+ send(msg: JSONRPCMessage, options?: TransportSendOptions | string): Promise<void>;
19
+ broadcast(msg: JSONRPCMessage): Promise<void>;
20
+ close(): Promise<void>;
21
+ }
22
+ //# sourceMappingURL=websocket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../src/server/websocket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,+CAA+C,CAAC;AAChG,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAGpE,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAE9B,qBAAa,wBAAyB,YAAW,SAAS;IACxD,OAAO,CAAC,GAAG,CAAmB;IAC9B,OAAO,CAAC,OAAO,CAAqC;IAEpD,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;IAC/B,OAAO,CAAC,cAAc,CAAC,CAAkD;IACzE,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAE7C,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC,GAAG,SAAS,EAgBrE;gBAEW,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAOxD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA0BtB,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmCjF,SAAS,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAQ7B"}
@@ -0,0 +1,103 @@
1
+ import { v4 as uuidv4 } from 'uuid';
2
+ import { WebSocket, WebSocketServer } from 'ws';
3
+ export class WebSocketServerTransport {
4
+ wss;
5
+ clients = new Map();
6
+ onclose;
7
+ onerror;
8
+ messageHandler;
9
+ onconnection;
10
+ ondisconnection;
11
+ set onmessage(handler) {
12
+ this.messageHandler = handler
13
+ ? (msg, clientId) => {
14
+ // @ts-ignore
15
+ if (msg.id === undefined) {
16
+ console.log('Broadcast message:', msg);
17
+ return handler(msg);
18
+ }
19
+ // @ts-ignore
20
+ return handler({
21
+ ...msg,
22
+ // @ts-ignore
23
+ id: clientId + ':' + msg.id,
24
+ });
25
+ }
26
+ : undefined;
27
+ }
28
+ constructor({ path, server }) {
29
+ this.wss = new WebSocketServer({
30
+ path,
31
+ server,
32
+ });
33
+ }
34
+ async start() {
35
+ this.wss.on('connection', (ws) => {
36
+ const clientId = uuidv4();
37
+ this.clients.set(clientId, ws);
38
+ this.onconnection?.(clientId);
39
+ ws.on('message', (data) => {
40
+ try {
41
+ const msg = JSON.parse(data.toString());
42
+ this.messageHandler?.(msg, clientId);
43
+ }
44
+ catch (err) {
45
+ this.onerror?.(new Error(`Failed to parse message: ${err}`));
46
+ }
47
+ });
48
+ ws.on('close', () => {
49
+ this.clients.delete(clientId);
50
+ this.ondisconnection?.(clientId);
51
+ });
52
+ ws.on('error', (err) => {
53
+ this.onerror?.(err);
54
+ });
55
+ });
56
+ }
57
+ async send(msg, options) {
58
+ // decide if they passed a raw clientId (legacy) or options object
59
+ const clientId = typeof options === 'string' ? options : undefined;
60
+ // if your protocol mangles IDs to include clientId, strip it off
61
+ const [cId, rawId] = clientId?.split(':') ?? [];
62
+ if (rawId !== undefined) {
63
+ // @ts-ignore
64
+ msg.id = parseInt(rawId, 10);
65
+ }
66
+ const payload = JSON.stringify(msg);
67
+ if (cId) {
68
+ // send only to the one client
69
+ const ws = this.clients.get(cId);
70
+ if (ws?.readyState === WebSocket.OPEN) {
71
+ ws.send(payload);
72
+ }
73
+ else {
74
+ this.clients.delete(cId);
75
+ this.ondisconnection?.(cId);
76
+ }
77
+ }
78
+ else {
79
+ // broadcast to everyone
80
+ for (const [id, ws] of this.clients) {
81
+ if (ws.readyState === WebSocket.OPEN) {
82
+ ws.send(payload);
83
+ }
84
+ else {
85
+ this.clients.delete(id);
86
+ this.ondisconnection?.(id);
87
+ }
88
+ }
89
+ }
90
+ }
91
+ async broadcast(msg) {
92
+ return this.send(msg);
93
+ }
94
+ async close() {
95
+ return new Promise((resolve) => {
96
+ this.wss.close(() => {
97
+ this.clients.clear();
98
+ resolve();
99
+ });
100
+ });
101
+ }
102
+ }
103
+ //# sourceMappingURL=websocket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../src/server/websocket.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface Logger {
2
+ info: (...args: any[]) => void;
3
+ error: (...args: any[]) => void;
4
+ debug: (...args: any[]) => void;
5
+ warn: (...args: any[]) => void;
6
+ }
7
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;IAC/B,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;IAChC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;IAChC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;CAChC"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,95 @@
1
+ {
2
+ "$schema": "https://json.schemastore.org/package.json",
3
+ "name": "@alsania-io/mcpnyx",
4
+ "version": "0.0.1",
5
+ "description": "MCPNyx - Advanced MCP proxy server for Nyx extension. Run multiple MCP stdio-based and SSE-based servers through a unified SSE/HTTP/WebSocket endpoint.",
6
+ "keywords": [
7
+ "mcp",
8
+ "model-context-protocol",
9
+ "sse",
10
+ "http",
11
+ "websocket",
12
+ "stream",
13
+ "nyx",
14
+ "alsania",
15
+ "gateway",
16
+ "proxy",
17
+ "bridge"
18
+ ],
19
+ "author": "Alsania I/O <sigma@alsania.dev>",
20
+ "license": "MIT",
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "https://github.com/alsania-io/mcpnyx.git"
24
+ },
25
+ "bugs": {
26
+ "url": "https://github.com/alsania-io/mcpnyx/issues"
27
+ },
28
+ "homepage": "https://alsania-io.com",
29
+ "type": "module",
30
+ "main": "dist/index.js",
31
+ "bin": {
32
+ "mcpnyx": "dist/index.js",
33
+ "nyxmcp": "dist/index.js"
34
+ },
35
+ "files": [
36
+ "dist",
37
+ "README.md",
38
+ "LICENSE"
39
+ ],
40
+ "scripts": {
41
+ "clean": "rm -rf ./dist && rm -rf ./node_modules",
42
+ "format": "prettier --write .",
43
+ "format:check": "prettier --check .",
44
+ "test": "echo \"No tests yet\" && exit 0",
45
+ "lint": "eslint src/**/*.ts",
46
+ "lint:fix": "eslint src/**/*.ts --fix",
47
+ "build": "tsc",
48
+ "start": "node dist/index.js",
49
+ "dev": "tsx src/index.ts",
50
+ "prepare": "husky install"
51
+ },
52
+ "dependencies": {
53
+ "@genkit-ai/mcp": "^1.22.0",
54
+ "@modelcontextprotocol/sdk": "^1.20.2",
55
+ "body-parser": "^2.2.0",
56
+ "cors": "^2.8.5",
57
+ "express": "^5.1.0",
58
+ "uuid": "^13.0.0",
59
+ "ws": "^8.18.3",
60
+ "yargs": "^18.0.0",
61
+ "zod": "^3.25.76"
62
+ },
63
+ "devDependencies": {
64
+ "@types/cors": "^2.8.17",
65
+ "@types/express": "^5.0.5",
66
+ "@types/node": "^24.9.2",
67
+ "@types/uuid": "^10.0.0",
68
+ "@types/ws": "^8.18.1",
69
+ "@types/yargs": "^17.0.34",
70
+ "@typescript-eslint/eslint-plugin": "^8.46.2",
71
+ "@typescript-eslint/parser": "^8.46.2",
72
+ "eslint": "^9.39.0",
73
+ "husky": "^9.1.7",
74
+ "lint-staged": "^16.2.6",
75
+ "prettier": "^3.6.2",
76
+ "ts-node": "^10.9.2",
77
+ "tsx": "^4.20.6",
78
+ "typescript": "^5.9.3"
79
+ },
80
+ "engines": {
81
+ "node": ">=18.0.0"
82
+ },
83
+ "lint-staged": {
84
+ "*.{ts,tsx}": [
85
+ "prettier --write",
86
+ "eslint --fix"
87
+ ]
88
+ },
89
+ "prettier": {
90
+ "tabWidth": 2,
91
+ "trailingComma": "all",
92
+ "singleQuote": true,
93
+ "printWidth": 120
94
+ }
95
+ }