@monoes/mcp 1.0.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.
Files changed (70) hide show
  1. package/README.md +127 -0
  2. package/dist/connection-pool.d.ts +36 -0
  3. package/dist/connection-pool.d.ts.map +1 -0
  4. package/dist/connection-pool.js +273 -0
  5. package/dist/connection-pool.js.map +1 -0
  6. package/dist/index.d.ts +75 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +85 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/oauth.d.ts +146 -0
  11. package/dist/oauth.d.ts.map +1 -0
  12. package/dist/oauth.js +318 -0
  13. package/dist/oauth.js.map +1 -0
  14. package/dist/prompt-registry.d.ts +90 -0
  15. package/dist/prompt-registry.d.ts.map +1 -0
  16. package/dist/prompt-registry.js +209 -0
  17. package/dist/prompt-registry.js.map +1 -0
  18. package/dist/rate-limiter.d.ts +86 -0
  19. package/dist/rate-limiter.d.ts.map +1 -0
  20. package/dist/rate-limiter.js +197 -0
  21. package/dist/rate-limiter.js.map +1 -0
  22. package/dist/resource-registry.d.ts +144 -0
  23. package/dist/resource-registry.d.ts.map +1 -0
  24. package/dist/resource-registry.js +405 -0
  25. package/dist/resource-registry.js.map +1 -0
  26. package/dist/sampling.d.ts +102 -0
  27. package/dist/sampling.d.ts.map +1 -0
  28. package/dist/sampling.js +268 -0
  29. package/dist/sampling.js.map +1 -0
  30. package/dist/schema-validator.d.ts +30 -0
  31. package/dist/schema-validator.d.ts.map +1 -0
  32. package/dist/schema-validator.js +182 -0
  33. package/dist/schema-validator.js.map +1 -0
  34. package/dist/server.d.ts +122 -0
  35. package/dist/server.d.ts.map +1 -0
  36. package/dist/server.js +829 -0
  37. package/dist/server.js.map +1 -0
  38. package/dist/session-manager.d.ts +55 -0
  39. package/dist/session-manager.d.ts.map +1 -0
  40. package/dist/session-manager.js +252 -0
  41. package/dist/session-manager.js.map +1 -0
  42. package/dist/task-manager.d.ts +81 -0
  43. package/dist/task-manager.d.ts.map +1 -0
  44. package/dist/task-manager.js +337 -0
  45. package/dist/task-manager.js.map +1 -0
  46. package/dist/tool-registry.d.ts +88 -0
  47. package/dist/tool-registry.d.ts.map +1 -0
  48. package/dist/tool-registry.js +353 -0
  49. package/dist/tool-registry.js.map +1 -0
  50. package/dist/transport/http.d.ts +71 -0
  51. package/dist/transport/http.d.ts.map +1 -0
  52. package/dist/transport/http.js +567 -0
  53. package/dist/transport/http.js.map +1 -0
  54. package/dist/transport/index.d.ts +50 -0
  55. package/dist/transport/index.d.ts.map +1 -0
  56. package/dist/transport/index.js +181 -0
  57. package/dist/transport/index.js.map +1 -0
  58. package/dist/transport/stdio.d.ts +43 -0
  59. package/dist/transport/stdio.d.ts.map +1 -0
  60. package/dist/transport/stdio.js +194 -0
  61. package/dist/transport/stdio.js.map +1 -0
  62. package/dist/transport/websocket.d.ts +87 -0
  63. package/dist/transport/websocket.d.ts.map +1 -0
  64. package/dist/transport/websocket.js +408 -0
  65. package/dist/transport/websocket.js.map +1 -0
  66. package/dist/types.d.ts +473 -0
  67. package/dist/types.d.ts.map +1 -0
  68. package/dist/types.js +40 -0
  69. package/dist/types.js.map +1 -0
  70. package/package.json +45 -0
@@ -0,0 +1,408 @@
1
+ /**
2
+ * @monoes/mcp - WebSocket Transport
3
+ *
4
+ * Standalone WebSocket transport with heartbeat
5
+ */
6
+ import { EventEmitter } from 'events';
7
+ import { WebSocketServer, WebSocket } from 'ws';
8
+ import { createServer } from 'http';
9
+ import { timingSafeEqual } from 'crypto';
10
+ export class WebSocketTransport extends EventEmitter {
11
+ logger;
12
+ config;
13
+ type = 'websocket';
14
+ requestHandler;
15
+ notificationHandler;
16
+ server;
17
+ wss;
18
+ clients = new Map();
19
+ heartbeatTimer;
20
+ running = false;
21
+ connectionCounter = 0;
22
+ messagesReceived = 0;
23
+ messagesSent = 0;
24
+ errors = 0;
25
+ totalConnections = 0;
26
+ constructor(logger, config) {
27
+ super();
28
+ this.logger = logger;
29
+ this.config = config;
30
+ }
31
+ async start() {
32
+ if (this.running) {
33
+ throw new Error('WebSocket transport already running');
34
+ }
35
+ const bindHost = this.resolveBindHost();
36
+ this.logger.info('Starting WebSocket transport', {
37
+ host: bindHost,
38
+ port: this.config.port,
39
+ path: this.config.path || '/ws',
40
+ });
41
+ this.server = createServer((req, res) => {
42
+ res.writeHead(426, { 'Content-Type': 'text/plain' });
43
+ res.end('Upgrade Required - WebSocket connection expected');
44
+ });
45
+ this.wss = new WebSocketServer({
46
+ server: this.server,
47
+ path: this.config.path || '/ws',
48
+ maxPayload: this.config.maxMessageSize || 10 * 1024 * 1024,
49
+ perMessageDeflate: true,
50
+ });
51
+ this.setupWebSocketHandlers();
52
+ this.startHeartbeat();
53
+ await new Promise((resolve, reject) => {
54
+ this.server.listen(this.config.port, bindHost, () => {
55
+ resolve();
56
+ });
57
+ this.server.on('error', reject);
58
+ });
59
+ this.running = true;
60
+ this.logger.info('WebSocket transport started', {
61
+ url: `ws://${bindHost}:${this.config.port}${this.config.path || '/ws'}`,
62
+ });
63
+ }
64
+ /**
65
+ * SECURITY: Refuse to bind unauthenticated servers to a non-loopback
66
+ * interface. Without `auth` configured, every connecting client is marked
67
+ * `isAuthenticated: true` (see setupWebSocketHandlers) — that is only
68
+ * acceptable on loopback. Mirrors http.ts's resolveBindHost().
69
+ */
70
+ resolveBindHost() {
71
+ const configuredHost = this.config.host;
72
+ if (this.config.auth) {
73
+ return configuredHost;
74
+ }
75
+ const isLoopback = configuredHost === 'localhost' ||
76
+ configuredHost === '127.0.0.1' ||
77
+ configuredHost === '::1' ||
78
+ configuredHost === '::ffff:127.0.0.1';
79
+ if (isLoopback) {
80
+ return configuredHost;
81
+ }
82
+ if (process.env.MONOMIND_MCP_ALLOW_REMOTE === '1') {
83
+ this.logger.warn(`SECURITY WARNING: WebSocket transport is binding to non-loopback host "${configuredHost}" ` +
84
+ 'with NO authentication configured. MONOMIND_MCP_ALLOW_REMOTE=1 opt-in detected — ' +
85
+ 'every client will be treated as authenticated. This exposes every registered tool ' +
86
+ 'to anyone who can reach this host/port.');
87
+ return configuredHost;
88
+ }
89
+ this.logger.warn(`SECURITY: refusing to bind WebSocket transport to non-loopback host "${configuredHost}" with ` +
90
+ 'no "auth" configured. Falling back to 127.0.0.1. Set MONOMIND_MCP_ALLOW_REMOTE=1 to ' +
91
+ 'override (unsafe) or configure "auth" with tokens.');
92
+ return '127.0.0.1';
93
+ }
94
+ async stop() {
95
+ if (!this.running) {
96
+ return;
97
+ }
98
+ this.logger.info('Stopping WebSocket transport');
99
+ this.running = false;
100
+ this.stopHeartbeat();
101
+ for (const client of this.clients.values()) {
102
+ try {
103
+ client.ws.close(1000, 'Server shutting down');
104
+ }
105
+ catch {
106
+ // Ignore errors
107
+ }
108
+ }
109
+ this.clients.clear();
110
+ if (this.wss) {
111
+ this.wss.close();
112
+ this.wss = undefined;
113
+ }
114
+ if (this.server) {
115
+ await new Promise((resolve) => {
116
+ this.server.close(() => resolve());
117
+ });
118
+ this.server = undefined;
119
+ }
120
+ this.logger.info('WebSocket transport stopped');
121
+ }
122
+ onRequest(handler) {
123
+ this.requestHandler = handler;
124
+ }
125
+ onNotification(handler) {
126
+ this.notificationHandler = handler;
127
+ }
128
+ async getHealthStatus() {
129
+ return {
130
+ healthy: this.running,
131
+ metrics: {
132
+ messagesReceived: this.messagesReceived,
133
+ messagesSent: this.messagesSent,
134
+ errors: this.errors,
135
+ activeConnections: this.clients.size,
136
+ totalConnections: this.totalConnections,
137
+ },
138
+ };
139
+ }
140
+ async sendNotification(notification) {
141
+ const message = this.serializeMessage(notification);
142
+ for (const client of this.clients.values()) {
143
+ try {
144
+ if (client.ws.readyState === WebSocket.OPEN) {
145
+ client.ws.send(message);
146
+ this.messagesSent++;
147
+ }
148
+ }
149
+ catch (error) {
150
+ this.logger.error('Failed to send notification', { clientId: client.id, error });
151
+ this.errors++;
152
+ }
153
+ }
154
+ }
155
+ async sendToClient(clientId, notification) {
156
+ const client = this.clients.get(clientId);
157
+ if (!client || client.ws.readyState !== WebSocket.OPEN) {
158
+ return false;
159
+ }
160
+ try {
161
+ client.ws.send(this.serializeMessage(notification));
162
+ this.messagesSent++;
163
+ return true;
164
+ }
165
+ catch (error) {
166
+ this.logger.error('Failed to send to client', { clientId, error });
167
+ this.errors++;
168
+ return false;
169
+ }
170
+ }
171
+ getClients() {
172
+ return Array.from(this.clients.keys());
173
+ }
174
+ getClientInfo(clientId) {
175
+ return this.clients.get(clientId);
176
+ }
177
+ disconnectClient(clientId, reason = 'Disconnected by server') {
178
+ const client = this.clients.get(clientId);
179
+ if (!client) {
180
+ return false;
181
+ }
182
+ try {
183
+ client.ws.close(1000, reason);
184
+ return true;
185
+ }
186
+ catch {
187
+ return false;
188
+ }
189
+ }
190
+ setupWebSocketHandlers() {
191
+ if (!this.wss)
192
+ return;
193
+ this.wss.on('connection', (ws) => {
194
+ if (this.config.maxConnections && this.clients.size >= this.config.maxConnections) {
195
+ this.logger.warn('Max connections reached, rejecting client');
196
+ ws.close(1013, 'Server at capacity');
197
+ return;
198
+ }
199
+ const clientId = `client-${++this.connectionCounter}`;
200
+ const client = {
201
+ id: clientId,
202
+ ws,
203
+ createdAt: new Date(),
204
+ lastActivity: new Date(),
205
+ messageCount: 0,
206
+ isAlive: true,
207
+ isAuthenticated: !this.config.auth?.enabled,
208
+ };
209
+ this.clients.set(clientId, client);
210
+ this.totalConnections++;
211
+ this.logger.info('Client connected', {
212
+ id: clientId,
213
+ total: this.clients.size,
214
+ });
215
+ ws.on('message', async (data) => {
216
+ await this.handleMessage(client, data);
217
+ });
218
+ ws.on('pong', () => {
219
+ client.isAlive = true;
220
+ });
221
+ ws.on('close', (code, reason) => {
222
+ this.clients.delete(clientId);
223
+ this.logger.info('Client disconnected', {
224
+ id: clientId,
225
+ code,
226
+ reason: reason.toString(),
227
+ total: this.clients.size,
228
+ });
229
+ this.emit('client:disconnected', clientId);
230
+ });
231
+ ws.on('error', (error) => {
232
+ this.logger.error('Client error', { id: clientId, error });
233
+ this.errors++;
234
+ this.clients.delete(clientId);
235
+ });
236
+ this.emit('client:connected', clientId);
237
+ });
238
+ }
239
+ async handleMessage(client, data) {
240
+ client.lastActivity = new Date();
241
+ client.messageCount++;
242
+ this.messagesReceived++;
243
+ try {
244
+ const message = this.parseMessage(data);
245
+ if (!client.isAuthenticated && this.config.auth?.enabled) {
246
+ if (message.method === 'authenticate') {
247
+ // SECURITY: this is the ONLY path that may set isAuthenticated.
248
+ // The previous version accepted this branch and fell through to
249
+ // dispatch the 'authenticate' message itself to the request
250
+ // handler without ever validating the token or flipping the flag —
251
+ // a permanent lockout for legit clients plus an auth-check bypass
252
+ // for the message that was supposed to perform the check.
253
+ this.handleAuthenticate(client, message);
254
+ return;
255
+ }
256
+ client.ws.send(this.serializeMessage({
257
+ jsonrpc: '2.0',
258
+ id: message.id || null,
259
+ error: { code: -32001, message: 'Authentication required' },
260
+ }));
261
+ return;
262
+ }
263
+ if (message.jsonrpc !== '2.0') {
264
+ client.ws.send(this.serializeMessage({
265
+ jsonrpc: '2.0',
266
+ id: message.id || null,
267
+ error: { code: -32600, message: 'Invalid JSON-RPC version' },
268
+ }));
269
+ return;
270
+ }
271
+ if (message.id === undefined) {
272
+ if (this.notificationHandler) {
273
+ await this.notificationHandler(message);
274
+ }
275
+ }
276
+ else {
277
+ if (!this.requestHandler) {
278
+ client.ws.send(this.serializeMessage({
279
+ jsonrpc: '2.0',
280
+ id: message.id,
281
+ error: { code: -32603, message: 'No request handler' },
282
+ }));
283
+ return;
284
+ }
285
+ const startTime = performance.now();
286
+ const response = await this.requestHandler(message);
287
+ const duration = performance.now() - startTime;
288
+ this.logger.debug('Request processed', {
289
+ clientId: client.id,
290
+ method: message.method,
291
+ duration: `${duration.toFixed(2)}ms`,
292
+ });
293
+ client.ws.send(this.serializeMessage(response));
294
+ this.messagesSent++;
295
+ }
296
+ }
297
+ catch (error) {
298
+ this.errors++;
299
+ this.logger.error('Message handling error', { clientId: client.id, error });
300
+ try {
301
+ client.ws.send(this.serializeMessage({
302
+ jsonrpc: '2.0',
303
+ id: null,
304
+ error: { code: -32700, message: 'Parse error' },
305
+ }));
306
+ }
307
+ catch {
308
+ // Ignore send errors
309
+ }
310
+ }
311
+ }
312
+ /**
313
+ * SECURITY: Real `authenticate` handler. Validates the client-supplied
314
+ * credential against `config.auth.tokens` with a timing-safe comparison
315
+ * and only sets `client.isAuthenticated = true` on success. The
316
+ * `authenticate` message itself is never forwarded to `requestHandler` —
317
+ * a response is sent directly here regardless of outcome.
318
+ */
319
+ handleAuthenticate(client, message) {
320
+ const supplied = message?.params?.token;
321
+ const configured = this.config.auth?.tokens;
322
+ const success = this.checkCredential(supplied, configured);
323
+ if (success) {
324
+ client.isAuthenticated = true;
325
+ this.logger.info('WebSocket client authenticated', { clientId: client.id });
326
+ client.ws.send(this.serializeMessage({
327
+ jsonrpc: '2.0',
328
+ id: message?.id ?? null,
329
+ result: { authenticated: true },
330
+ }));
331
+ }
332
+ else {
333
+ this.logger.warn('WebSocket authenticate failed', { clientId: client.id });
334
+ client.ws.send(this.serializeMessage({
335
+ jsonrpc: '2.0',
336
+ id: message?.id ?? null,
337
+ error: { code: -32001, message: 'Authentication failed' },
338
+ }));
339
+ }
340
+ }
341
+ checkCredential(supplied, configured) {
342
+ if (typeof supplied !== 'string' || !configured || configured.length === 0) {
343
+ return false;
344
+ }
345
+ for (const entry of configured) {
346
+ if (this.timingSafeCompare(supplied, entry)) {
347
+ return true;
348
+ }
349
+ }
350
+ return false;
351
+ }
352
+ /**
353
+ * SECURITY: Timing-safe comparison to prevent timing attacks. Mismatched
354
+ * lengths still run a constant-time compare (against itself) before
355
+ * returning false, so length differences aren't observable via timing.
356
+ */
357
+ timingSafeCompare(a, b) {
358
+ const bufA = Buffer.from(a, 'utf-8');
359
+ const bufB = Buffer.from(b, 'utf-8');
360
+ if (bufA.length !== bufB.length) {
361
+ timingSafeEqual(bufA, bufA);
362
+ return false;
363
+ }
364
+ return timingSafeEqual(bufA, bufB);
365
+ }
366
+ parseMessage(data) {
367
+ if (this.config.enableBinaryMode && Buffer.isBuffer(data)) {
368
+ return JSON.parse(data.toString());
369
+ }
370
+ return JSON.parse(data.toString());
371
+ }
372
+ serializeMessage(message) {
373
+ if (this.config.enableBinaryMode) {
374
+ return JSON.stringify(message);
375
+ }
376
+ return JSON.stringify(message);
377
+ }
378
+ startHeartbeat() {
379
+ const interval = this.config.heartbeatInterval || 30000;
380
+ this.heartbeatTimer = setInterval(() => {
381
+ for (const client of this.clients.values()) {
382
+ if (!client.isAlive) {
383
+ this.logger.warn('Client heartbeat timeout', { id: client.id });
384
+ client.ws.terminate();
385
+ this.clients.delete(client.id);
386
+ continue;
387
+ }
388
+ client.isAlive = false;
389
+ try {
390
+ client.ws.ping();
391
+ }
392
+ catch {
393
+ // Ignore ping errors
394
+ }
395
+ }
396
+ }, interval);
397
+ }
398
+ stopHeartbeat() {
399
+ if (this.heartbeatTimer) {
400
+ clearInterval(this.heartbeatTimer);
401
+ this.heartbeatTimer = undefined;
402
+ }
403
+ }
404
+ }
405
+ export function createWebSocketTransport(logger, config) {
406
+ return new WebSocketTransport(logger, config);
407
+ }
408
+ //# sourceMappingURL=websocket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../src/transport/websocket.ts"],"names":[],"mappings":"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"}