@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.
- package/README.md +127 -0
- package/dist/connection-pool.d.ts +36 -0
- package/dist/connection-pool.d.ts.map +1 -0
- package/dist/connection-pool.js +273 -0
- package/dist/connection-pool.js.map +1 -0
- package/dist/index.d.ts +75 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +85 -0
- package/dist/index.js.map +1 -0
- package/dist/oauth.d.ts +146 -0
- package/dist/oauth.d.ts.map +1 -0
- package/dist/oauth.js +318 -0
- package/dist/oauth.js.map +1 -0
- package/dist/prompt-registry.d.ts +90 -0
- package/dist/prompt-registry.d.ts.map +1 -0
- package/dist/prompt-registry.js +209 -0
- package/dist/prompt-registry.js.map +1 -0
- package/dist/rate-limiter.d.ts +86 -0
- package/dist/rate-limiter.d.ts.map +1 -0
- package/dist/rate-limiter.js +197 -0
- package/dist/rate-limiter.js.map +1 -0
- package/dist/resource-registry.d.ts +144 -0
- package/dist/resource-registry.d.ts.map +1 -0
- package/dist/resource-registry.js +405 -0
- package/dist/resource-registry.js.map +1 -0
- package/dist/sampling.d.ts +102 -0
- package/dist/sampling.d.ts.map +1 -0
- package/dist/sampling.js +268 -0
- package/dist/sampling.js.map +1 -0
- package/dist/schema-validator.d.ts +30 -0
- package/dist/schema-validator.d.ts.map +1 -0
- package/dist/schema-validator.js +182 -0
- package/dist/schema-validator.js.map +1 -0
- package/dist/server.d.ts +122 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +829 -0
- package/dist/server.js.map +1 -0
- package/dist/session-manager.d.ts +55 -0
- package/dist/session-manager.d.ts.map +1 -0
- package/dist/session-manager.js +252 -0
- package/dist/session-manager.js.map +1 -0
- package/dist/task-manager.d.ts +81 -0
- package/dist/task-manager.d.ts.map +1 -0
- package/dist/task-manager.js +337 -0
- package/dist/task-manager.js.map +1 -0
- package/dist/tool-registry.d.ts +88 -0
- package/dist/tool-registry.d.ts.map +1 -0
- package/dist/tool-registry.js +353 -0
- package/dist/tool-registry.js.map +1 -0
- package/dist/transport/http.d.ts +71 -0
- package/dist/transport/http.d.ts.map +1 -0
- package/dist/transport/http.js +567 -0
- package/dist/transport/http.js.map +1 -0
- package/dist/transport/index.d.ts +50 -0
- package/dist/transport/index.d.ts.map +1 -0
- package/dist/transport/index.js +181 -0
- package/dist/transport/index.js.map +1 -0
- package/dist/transport/stdio.d.ts +43 -0
- package/dist/transport/stdio.d.ts.map +1 -0
- package/dist/transport/stdio.js +194 -0
- package/dist/transport/stdio.js.map +1 -0
- package/dist/transport/websocket.d.ts +87 -0
- package/dist/transport/websocket.d.ts.map +1 -0
- package/dist/transport/websocket.js +408 -0
- package/dist/transport/websocket.js.map +1 -0
- package/dist/types.d.ts +473 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +40 -0
- package/dist/types.js.map +1 -0
- 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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"}
|