@monoes/mcp 1.0.1 → 1.0.3
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/LICENSE +191 -0
- package/README.md +36 -7
- package/dist/auth.d.ts +19 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +72 -0
- package/dist/auth.js.map +1 -0
- package/dist/connection-pool.d.ts +0 -0
- package/dist/connection-pool.d.ts.map +0 -0
- package/dist/connection-pool.js +0 -0
- package/dist/connection-pool.js.map +0 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -8
- package/dist/index.js.map +1 -1
- package/dist/oauth.d.ts +21 -7
- package/dist/oauth.d.ts.map +1 -1
- package/dist/oauth.js +21 -24
- package/dist/oauth.js.map +1 -1
- package/dist/prompt-registry.d.ts +0 -0
- package/dist/prompt-registry.d.ts.map +0 -0
- package/dist/prompt-registry.js +0 -0
- package/dist/prompt-registry.js.map +0 -0
- package/dist/rate-limiter.d.ts +0 -0
- package/dist/rate-limiter.d.ts.map +0 -0
- package/dist/rate-limiter.js +0 -0
- package/dist/rate-limiter.js.map +0 -0
- package/dist/resource-registry.d.ts +0 -0
- package/dist/resource-registry.d.ts.map +0 -0
- package/dist/resource-registry.js +0 -0
- package/dist/resource-registry.js.map +0 -0
- package/dist/sampling.d.ts +0 -0
- package/dist/sampling.d.ts.map +0 -0
- package/dist/sampling.js +0 -0
- package/dist/sampling.js.map +0 -0
- package/dist/schema-validator.d.ts +0 -0
- package/dist/schema-validator.d.ts.map +0 -0
- package/dist/schema-validator.js +0 -0
- package/dist/schema-validator.js.map +0 -0
- package/dist/server.d.ts +27 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +241 -38
- package/dist/server.js.map +1 -1
- package/dist/session-manager.d.ts +0 -0
- package/dist/session-manager.d.ts.map +0 -0
- package/dist/session-manager.js +0 -0
- package/dist/session-manager.js.map +0 -0
- package/dist/task-manager.d.ts +0 -0
- package/dist/task-manager.d.ts.map +0 -0
- package/dist/task-manager.js +0 -0
- package/dist/task-manager.js.map +0 -0
- package/dist/tool-registry.d.ts +0 -0
- package/dist/tool-registry.d.ts.map +0 -0
- package/dist/tool-registry.js +0 -0
- package/dist/tool-registry.js.map +0 -0
- package/dist/transport/http.d.ts +16 -5
- package/dist/transport/http.d.ts.map +1 -1
- package/dist/transport/http.js +81 -72
- package/dist/transport/http.js.map +1 -1
- package/dist/transport/index.d.ts +0 -0
- package/dist/transport/index.d.ts.map +0 -0
- package/dist/transport/index.js +0 -0
- package/dist/transport/index.js.map +0 -0
- package/dist/transport/stdio.d.ts +0 -0
- package/dist/transport/stdio.d.ts.map +0 -0
- package/dist/transport/stdio.js +0 -0
- package/dist/transport/stdio.js.map +0 -0
- package/dist/transport/websocket.d.ts +14 -13
- package/dist/transport/websocket.d.ts.map +1 -1
- package/dist/transport/websocket.js +36 -37
- package/dist/transport/websocket.js.map +1 -1
- package/dist/types.d.ts +16 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +0 -0
- package/dist/types.js.map +1 -1
- package/package.json +8 -7
package/dist/oauth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"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"}
|
|
File without changes
|
|
File without changes
|
package/dist/prompt-registry.js
CHANGED
|
File without changes
|
|
File without changes
|
package/dist/rate-limiter.d.ts
CHANGED
|
File without changes
|
|
File without changes
|
package/dist/rate-limiter.js
CHANGED
|
File without changes
|
package/dist/rate-limiter.js.map
CHANGED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
package/dist/sampling.d.ts
CHANGED
|
File without changes
|
package/dist/sampling.d.ts.map
CHANGED
|
File without changes
|
package/dist/sampling.js
CHANGED
|
File without changes
|
package/dist/sampling.js.map
CHANGED
|
File without changes
|
|
File without changes
|
|
File without changes
|
package/dist/schema-validator.js
CHANGED
|
File without changes
|
|
File without changes
|
package/dist/server.d.ts
CHANGED
|
@@ -47,6 +47,7 @@ export declare class MCPServer extends EventEmitter implements IMCPServer {
|
|
|
47
47
|
private startTime?;
|
|
48
48
|
private startupDuration?;
|
|
49
49
|
private currentSession?;
|
|
50
|
+
private readonly connectionSessions;
|
|
50
51
|
private resourceSubscriptions;
|
|
51
52
|
private readonly serverInfo;
|
|
52
53
|
private readonly protocolVersion;
|
|
@@ -94,6 +95,30 @@ export declare class MCPServer extends EventEmitter implements IMCPServer {
|
|
|
94
95
|
getSessions(): MCPSession[];
|
|
95
96
|
getSession(sessionId: string): MCPSession | undefined;
|
|
96
97
|
terminateSession(sessionId: string): boolean;
|
|
98
|
+
/**
|
|
99
|
+
* Resolve the session bound to a connection without creating one.
|
|
100
|
+
* Multi-client transports (http, websocket) pass a `connectionId`, which is
|
|
101
|
+
* looked up in `connectionSessions`. Single-client transports (stdio,
|
|
102
|
+
* in-process) omit it, falling back to the `currentSession` singleton.
|
|
103
|
+
*/
|
|
104
|
+
private getSessionForConnection;
|
|
105
|
+
/**
|
|
106
|
+
* Bind a newly-created session to a connection: per-connectionId when the
|
|
107
|
+
* transport supports multiple clients, otherwise the singleton fallback.
|
|
108
|
+
*/
|
|
109
|
+
private bindSessionToConnection;
|
|
110
|
+
/**
|
|
111
|
+
* Tear down the session owned by a connection when the transport reports
|
|
112
|
+
* that connection has closed — prevents closed clients' sessions (and any
|
|
113
|
+
* resource subscriptions) from lingering until the idle-timeout sweep.
|
|
114
|
+
*/
|
|
115
|
+
private closeConnectionSession;
|
|
116
|
+
/**
|
|
117
|
+
* Detach every registry subscription owned by a session. Called whenever a
|
|
118
|
+
* session ends (terminated, connection closed, expired, server stopped) so
|
|
119
|
+
* no update callback outlives its session (issue #92).
|
|
120
|
+
*/
|
|
121
|
+
private purgeSessionSubscriptions;
|
|
97
122
|
private handleRequest;
|
|
98
123
|
private handleNotification;
|
|
99
124
|
private handleInitialize;
|
|
@@ -116,6 +141,8 @@ export declare class MCPServer extends EventEmitter implements IMCPServer {
|
|
|
116
141
|
private getOrCreateSession;
|
|
117
142
|
private createErrorResponse;
|
|
118
143
|
private registerBuiltInTools;
|
|
144
|
+
private registerBuiltInResources;
|
|
145
|
+
private registerBuiltInPrompts;
|
|
119
146
|
private setupEventHandlers;
|
|
120
147
|
}
|
|
121
148
|
export declare function createMCPServer(config: Partial<MCPServerConfig>, logger: ILogger, orchestrator?: unknown, swarmCoordinator?: unknown): MCPServer;
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,KAAK,EACV,eAAe,EAIf,UAAU,EACV,OAAO,EAKP,gBAAgB,EAGhB,OAAO,EAER,MAAM,YAAY,CAAC;AAKpB,OAAO,EAAE,gBAAgB,EAA0B,MAAM,wBAAwB,CAAC;AAClF,OAAO,EAAE,cAAc,EAAwB,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAqB,MAAM,mBAAmB,CAAC;AAEnE,OAAO,EAAE,WAAW,EAA2C,MAAM,mBAAmB,CAAC;AACzF,OAAO,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/server.js
CHANGED
|
@@ -14,7 +14,7 @@ import { createPromptRegistry } from './prompt-registry.js';
|
|
|
14
14
|
import { createTaskManager } from './task-manager.js';
|
|
15
15
|
import { createTransport, createTransportManager } from './transport/index.js';
|
|
16
16
|
import { createRateLimiter } from './rate-limiter.js';
|
|
17
|
-
import { createSamplingManager } from './sampling.js';
|
|
17
|
+
import { createSamplingManager, } from './sampling.js';
|
|
18
18
|
const DEFAULT_CONFIG = {
|
|
19
19
|
name: 'Monomind MCP Server V1',
|
|
20
20
|
version: '3.0.0',
|
|
@@ -46,8 +46,20 @@ export class MCPServer extends EventEmitter {
|
|
|
46
46
|
running = false;
|
|
47
47
|
startTime;
|
|
48
48
|
startupDuration;
|
|
49
|
+
// Fallback singleton session, used only for transports that are inherently
|
|
50
|
+
// single-client (stdio, in-process) where the transport never supplies a
|
|
51
|
+
// connectionId to handleRequest/handleNotification.
|
|
49
52
|
currentSession;
|
|
50
|
-
|
|
53
|
+
// connectionId -> session, for multi-client transports (http, websocket).
|
|
54
|
+
// Without this, every connection shared `currentSession` above and a
|
|
55
|
+
// second client's `initialize` would silently reassign the session out
|
|
56
|
+
// from under the first client (issue #93).
|
|
57
|
+
connectionSessions = new Map();
|
|
58
|
+
// sessionId -> (uri -> subscriptionId). The registry-issued subscriptionId
|
|
59
|
+
// must be retained so resources/unsubscribe (and session teardown) can call
|
|
60
|
+
// resourceRegistry.unsubscribe(id) — without it callbacks leak and phantom
|
|
61
|
+
// notifications fire after unsubscribe (issue #92).
|
|
62
|
+
resourceSubscriptions = new Map();
|
|
51
63
|
serverInfo = {
|
|
52
64
|
name: 'Monomind MCP Server V1',
|
|
53
65
|
version: '3.0.0',
|
|
@@ -163,14 +175,23 @@ export class MCPServer extends EventEmitter {
|
|
|
163
175
|
maxRequestSize: String(this.config.maxRequestSize),
|
|
164
176
|
requestTimeout: this.config.requestTimeout,
|
|
165
177
|
});
|
|
166
|
-
this.transport.onRequest(async (request) => {
|
|
167
|
-
return await this.handleRequest(request);
|
|
178
|
+
this.transport.onRequest(async (request, connectionId) => {
|
|
179
|
+
return await this.handleRequest(request, connectionId);
|
|
168
180
|
});
|
|
169
|
-
this.transport.onNotification(async (notification) => {
|
|
170
|
-
await this.handleNotification(notification);
|
|
181
|
+
this.transport.onNotification(async (notification, connectionId) => {
|
|
182
|
+
await this.handleNotification(notification, connectionId);
|
|
183
|
+
});
|
|
184
|
+
// Transports that support multiple concurrent clients (http, websocket)
|
|
185
|
+
// report when a connection closes so its session can be torn down —
|
|
186
|
+
// without this a disconnected client's session (and any resource
|
|
187
|
+
// subscriptions) would leak for the full sessionTimeout.
|
|
188
|
+
this.transport.onConnectionClose?.((connectionId) => {
|
|
189
|
+
this.closeConnectionSession(connectionId);
|
|
171
190
|
});
|
|
172
191
|
await this.transport.start();
|
|
173
192
|
await this.registerBuiltInTools();
|
|
193
|
+
this.registerBuiltInResources();
|
|
194
|
+
this.registerBuiltInPrompts();
|
|
174
195
|
this.running = true;
|
|
175
196
|
this.startupDuration = performance.now() - startTime;
|
|
176
197
|
this.logger.info('MCP server started', {
|
|
@@ -197,8 +218,16 @@ export class MCPServer extends EventEmitter {
|
|
|
197
218
|
await this.transport.stop();
|
|
198
219
|
this.transport = undefined;
|
|
199
220
|
}
|
|
200
|
-
|
|
221
|
+
// PKG-1: destroy() runs stopCleanupTimer + clearAll + removeAllListeners.
|
|
222
|
+
// clearAll() alone left the SessionManager cleanup interval (setInterval
|
|
223
|
+
// at session-manager.ts:303) firing forever after stop().
|
|
224
|
+
this.sessionManager.destroy();
|
|
201
225
|
this.taskManager.destroy();
|
|
226
|
+
// Safety net: detach any subscription whose session already vanished
|
|
227
|
+
// without a session:closed event reaching the purge handler.
|
|
228
|
+
for (const sessionId of [...this.resourceSubscriptions.keys()]) {
|
|
229
|
+
this.purgeSessionSubscriptions(sessionId);
|
|
230
|
+
}
|
|
202
231
|
this.resourceSubscriptions.clear();
|
|
203
232
|
this.rateLimiter.destroy();
|
|
204
233
|
if (this.connectionPool) {
|
|
@@ -206,6 +235,7 @@ export class MCPServer extends EventEmitter {
|
|
|
206
235
|
}
|
|
207
236
|
this.running = false;
|
|
208
237
|
this.currentSession = undefined;
|
|
238
|
+
this.connectionSessions.clear();
|
|
209
239
|
this.logger.info('MCP server stopped');
|
|
210
240
|
this.emit('server:stopped');
|
|
211
241
|
}
|
|
@@ -286,9 +316,67 @@ export class MCPServer extends EventEmitter {
|
|
|
286
316
|
if (this.currentSession?.id === sessionId) {
|
|
287
317
|
this.currentSession = undefined;
|
|
288
318
|
}
|
|
319
|
+
for (const [connectionId, session] of this.connectionSessions) {
|
|
320
|
+
if (session.id === sessionId) {
|
|
321
|
+
this.connectionSessions.delete(connectionId);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
289
324
|
return result;
|
|
290
325
|
}
|
|
291
|
-
|
|
326
|
+
/**
|
|
327
|
+
* Resolve the session bound to a connection without creating one.
|
|
328
|
+
* Multi-client transports (http, websocket) pass a `connectionId`, which is
|
|
329
|
+
* looked up in `connectionSessions`. Single-client transports (stdio,
|
|
330
|
+
* in-process) omit it, falling back to the `currentSession` singleton.
|
|
331
|
+
*/
|
|
332
|
+
getSessionForConnection(connectionId) {
|
|
333
|
+
if (connectionId) {
|
|
334
|
+
return this.connectionSessions.get(connectionId);
|
|
335
|
+
}
|
|
336
|
+
return this.currentSession;
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Bind a newly-created session to a connection: per-connectionId when the
|
|
340
|
+
* transport supports multiple clients, otherwise the singleton fallback.
|
|
341
|
+
*/
|
|
342
|
+
bindSessionToConnection(session, connectionId) {
|
|
343
|
+
if (connectionId) {
|
|
344
|
+
this.connectionSessions.set(connectionId, session);
|
|
345
|
+
}
|
|
346
|
+
else {
|
|
347
|
+
this.currentSession = session;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Tear down the session owned by a connection when the transport reports
|
|
352
|
+
* that connection has closed — prevents closed clients' sessions (and any
|
|
353
|
+
* resource subscriptions) from lingering until the idle-timeout sweep.
|
|
354
|
+
*/
|
|
355
|
+
closeConnectionSession(connectionId) {
|
|
356
|
+
const session = this.connectionSessions.get(connectionId);
|
|
357
|
+
this.connectionSessions.delete(connectionId);
|
|
358
|
+
if (session) {
|
|
359
|
+
// closeSession emits 'session:closed', which purges the session's
|
|
360
|
+
// resource subscriptions (see setupEventHandlers).
|
|
361
|
+
this.sessionManager.closeSession(session.id, 'Connection closed');
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Detach every registry subscription owned by a session. Called whenever a
|
|
366
|
+
* session ends (terminated, connection closed, expired, server stopped) so
|
|
367
|
+
* no update callback outlives its session (issue #92).
|
|
368
|
+
*/
|
|
369
|
+
purgeSessionSubscriptions(sessionId) {
|
|
370
|
+
const sessionSubs = this.resourceSubscriptions.get(sessionId);
|
|
371
|
+
if (!sessionSubs) {
|
|
372
|
+
return;
|
|
373
|
+
}
|
|
374
|
+
for (const subscriptionId of sessionSubs.values()) {
|
|
375
|
+
this.resourceRegistry.unsubscribe(subscriptionId);
|
|
376
|
+
}
|
|
377
|
+
this.resourceSubscriptions.delete(sessionId);
|
|
378
|
+
}
|
|
379
|
+
async handleRequest(request, connectionId) {
|
|
292
380
|
const startTime = performance.now();
|
|
293
381
|
this.requestStats.total++;
|
|
294
382
|
this.logger.debug('Handling request', {
|
|
@@ -297,7 +385,7 @@ export class MCPServer extends EventEmitter {
|
|
|
297
385
|
});
|
|
298
386
|
// Rate limiting check (skip for initialize)
|
|
299
387
|
if (request.method !== 'initialize') {
|
|
300
|
-
const sessionId = this.
|
|
388
|
+
const sessionId = this.getSessionForConnection(connectionId)?.id;
|
|
301
389
|
const rateLimitResult = this.rateLimiter.check(sessionId);
|
|
302
390
|
if (!rateLimitResult.allowed) {
|
|
303
391
|
this.requestStats.failed++;
|
|
@@ -315,14 +403,14 @@ export class MCPServer extends EventEmitter {
|
|
|
315
403
|
}
|
|
316
404
|
try {
|
|
317
405
|
if (request.method === 'initialize') {
|
|
318
|
-
return await this.handleInitialize(request);
|
|
406
|
+
return await this.handleInitialize(request, connectionId);
|
|
319
407
|
}
|
|
320
|
-
const session = this.getOrCreateSession();
|
|
408
|
+
const session = this.getOrCreateSession(connectionId);
|
|
321
409
|
if (!session.isInitialized && request.method !== 'initialized') {
|
|
322
410
|
return this.createErrorResponse(request.id, ErrorCodes.SERVER_NOT_INITIALIZED, 'Server not initialized');
|
|
323
411
|
}
|
|
324
412
|
this.sessionManager.updateActivity(session.id);
|
|
325
|
-
const response = await this.routeRequest(request);
|
|
413
|
+
const response = await this.routeRequest(request, connectionId);
|
|
326
414
|
const duration = performance.now() - startTime;
|
|
327
415
|
this.requestStats.successful++;
|
|
328
416
|
this.requestStats.totalResponseTime += duration;
|
|
@@ -345,7 +433,7 @@ export class MCPServer extends EventEmitter {
|
|
|
345
433
|
return this.createErrorResponse(request.id, ErrorCodes.INTERNAL_ERROR, error instanceof Error ? error.message : 'Internal error');
|
|
346
434
|
}
|
|
347
435
|
}
|
|
348
|
-
async handleNotification(notification) {
|
|
436
|
+
async handleNotification(notification, connectionId) {
|
|
349
437
|
this.logger.debug('Handling notification', { method: notification.method });
|
|
350
438
|
switch (notification.method) {
|
|
351
439
|
case 'initialized':
|
|
@@ -358,14 +446,14 @@ export class MCPServer extends EventEmitter {
|
|
|
358
446
|
this.logger.debug('Unknown notification', { method: notification.method });
|
|
359
447
|
}
|
|
360
448
|
}
|
|
361
|
-
async handleInitialize(request) {
|
|
449
|
+
async handleInitialize(request, connectionId) {
|
|
362
450
|
const params = request.params;
|
|
363
451
|
if (!params) {
|
|
364
452
|
return this.createErrorResponse(request.id, ErrorCodes.INVALID_PARAMS, 'Invalid params');
|
|
365
453
|
}
|
|
366
454
|
const session = this.sessionManager.createSession(this.config.transport);
|
|
367
455
|
this.sessionManager.initializeSession(session.id, params);
|
|
368
|
-
this.
|
|
456
|
+
this.bindSessionToConnection(session, connectionId);
|
|
369
457
|
const result = {
|
|
370
458
|
protocolVersion: this.protocolVersion,
|
|
371
459
|
capabilities: this.capabilities,
|
|
@@ -382,22 +470,22 @@ export class MCPServer extends EventEmitter {
|
|
|
382
470
|
result,
|
|
383
471
|
};
|
|
384
472
|
}
|
|
385
|
-
async routeRequest(request) {
|
|
473
|
+
async routeRequest(request, connectionId) {
|
|
386
474
|
switch (request.method) {
|
|
387
475
|
// Tool methods
|
|
388
476
|
case 'tools/list':
|
|
389
477
|
return this.handleToolsList(request);
|
|
390
478
|
case 'tools/call':
|
|
391
|
-
return this.handleToolsCall(request);
|
|
479
|
+
return this.handleToolsCall(request, connectionId);
|
|
392
480
|
// Resource methods (MCP 2025-11-25)
|
|
393
481
|
case 'resources/list':
|
|
394
482
|
return this.handleResourcesList(request);
|
|
395
483
|
case 'resources/read':
|
|
396
484
|
return this.handleResourcesRead(request);
|
|
397
485
|
case 'resources/subscribe':
|
|
398
|
-
return this.handleResourcesSubscribe(request);
|
|
486
|
+
return this.handleResourcesSubscribe(request, connectionId);
|
|
399
487
|
case 'resources/unsubscribe':
|
|
400
|
-
return this.handleResourcesUnsubscribe(request);
|
|
488
|
+
return this.handleResourcesUnsubscribe(request, connectionId);
|
|
401
489
|
// Prompt methods (MCP 2025-11-25)
|
|
402
490
|
case 'prompts/list':
|
|
403
491
|
return this.handlePromptsList(request);
|
|
@@ -416,7 +504,7 @@ export class MCPServer extends EventEmitter {
|
|
|
416
504
|
return this.handleLoggingSetLevel(request);
|
|
417
505
|
// Sampling (MCP 2025-11-25)
|
|
418
506
|
case 'sampling/createMessage':
|
|
419
|
-
return this.handleSamplingCreateMessage(request);
|
|
507
|
+
return this.handleSamplingCreateMessage(request, connectionId);
|
|
420
508
|
// Utility
|
|
421
509
|
case 'ping':
|
|
422
510
|
return {
|
|
@@ -427,7 +515,7 @@ export class MCPServer extends EventEmitter {
|
|
|
427
515
|
default:
|
|
428
516
|
// Check if it's a direct tool call
|
|
429
517
|
if (this.toolRegistry.hasTool(request.method)) {
|
|
430
|
-
return this.handleToolExecution(request);
|
|
518
|
+
return this.handleToolExecution(request, connectionId);
|
|
431
519
|
}
|
|
432
520
|
return this.createErrorResponse(request.id, ErrorCodes.METHOD_NOT_FOUND, `Method not found: ${request.method}`);
|
|
433
521
|
}
|
|
@@ -444,13 +532,13 @@ export class MCPServer extends EventEmitter {
|
|
|
444
532
|
result: { tools },
|
|
445
533
|
};
|
|
446
534
|
}
|
|
447
|
-
async handleToolsCall(request) {
|
|
535
|
+
async handleToolsCall(request, connectionId) {
|
|
448
536
|
const params = request.params;
|
|
449
537
|
if (!params?.name) {
|
|
450
538
|
return this.createErrorResponse(request.id, ErrorCodes.INVALID_PARAMS, 'Tool name is required');
|
|
451
539
|
}
|
|
452
540
|
const context = {
|
|
453
|
-
sessionId: this.
|
|
541
|
+
sessionId: this.getSessionForConnection(connectionId)?.id || 'unknown',
|
|
454
542
|
requestId: request.id,
|
|
455
543
|
orchestrator: this.orchestrator,
|
|
456
544
|
swarmCoordinator: this.swarmCoordinator,
|
|
@@ -462,9 +550,9 @@ export class MCPServer extends EventEmitter {
|
|
|
462
550
|
result,
|
|
463
551
|
};
|
|
464
552
|
}
|
|
465
|
-
async handleToolExecution(request) {
|
|
553
|
+
async handleToolExecution(request, connectionId) {
|
|
466
554
|
const context = {
|
|
467
|
-
sessionId: this.
|
|
555
|
+
sessionId: this.getSessionForConnection(connectionId)?.id || 'unknown',
|
|
468
556
|
requestId: request.id,
|
|
469
557
|
orchestrator: this.orchestrator,
|
|
470
558
|
swarmCoordinator: this.swarmCoordinator,
|
|
@@ -505,9 +593,9 @@ export class MCPServer extends EventEmitter {
|
|
|
505
593
|
return this.createErrorResponse(request.id, ErrorCodes.INVALID_PARAMS, error instanceof Error ? error.message : 'Resource read failed');
|
|
506
594
|
}
|
|
507
595
|
}
|
|
508
|
-
handleResourcesSubscribe(request) {
|
|
596
|
+
handleResourcesSubscribe(request, connectionId) {
|
|
509
597
|
const params = request.params;
|
|
510
|
-
const sessionId = this.
|
|
598
|
+
const sessionId = this.getSessionForConnection(connectionId)?.id;
|
|
511
599
|
if (!params?.uri) {
|
|
512
600
|
return this.createErrorResponse(request.id, ErrorCodes.INVALID_PARAMS, 'Resource URI is required');
|
|
513
601
|
}
|
|
@@ -518,14 +606,20 @@ export class MCPServer extends EventEmitter {
|
|
|
518
606
|
// Track subscription for this session
|
|
519
607
|
let sessionSubs = this.resourceSubscriptions.get(sessionId);
|
|
520
608
|
if (!sessionSubs) {
|
|
521
|
-
sessionSubs = new
|
|
609
|
+
sessionSubs = new Map();
|
|
522
610
|
this.resourceSubscriptions.set(sessionId, sessionSubs);
|
|
523
611
|
}
|
|
612
|
+
// Re-subscribing the same URI replaces the previous subscription —
|
|
613
|
+
// otherwise the old callback would keep firing with no way to reach it.
|
|
614
|
+
const existingId = sessionSubs.get(params.uri);
|
|
615
|
+
if (existingId) {
|
|
616
|
+
this.resourceRegistry.unsubscribe(existingId);
|
|
617
|
+
}
|
|
524
618
|
const subscriptionId = this.resourceRegistry.subscribe(params.uri, (uri, content) => {
|
|
525
619
|
// Send notification when resource updates
|
|
526
620
|
this.sendNotification('notifications/resources/updated', { uri });
|
|
527
621
|
});
|
|
528
|
-
sessionSubs.
|
|
622
|
+
sessionSubs.set(params.uri, subscriptionId);
|
|
529
623
|
return {
|
|
530
624
|
jsonrpc: '2.0',
|
|
531
625
|
id: request.id,
|
|
@@ -536,16 +630,24 @@ export class MCPServer extends EventEmitter {
|
|
|
536
630
|
return this.createErrorResponse(request.id, ErrorCodes.INTERNAL_ERROR, error instanceof Error ? error.message : 'Subscription failed');
|
|
537
631
|
}
|
|
538
632
|
}
|
|
539
|
-
handleResourcesUnsubscribe(request) {
|
|
633
|
+
handleResourcesUnsubscribe(request, connectionId) {
|
|
540
634
|
const params = request.params;
|
|
541
|
-
const sessionId = this.
|
|
635
|
+
const sessionId = this.getSessionForConnection(connectionId)?.id;
|
|
542
636
|
if (!params?.uri) {
|
|
543
637
|
return this.createErrorResponse(request.id, ErrorCodes.INVALID_PARAMS, 'Resource URI is required');
|
|
544
638
|
}
|
|
545
639
|
if (sessionId) {
|
|
546
640
|
const sessionSubs = this.resourceSubscriptions.get(sessionId);
|
|
547
|
-
|
|
641
|
+
const subscriptionId = sessionSubs?.get(params.uri);
|
|
642
|
+
if (sessionSubs && subscriptionId) {
|
|
643
|
+
// Actually detach the registry callback — just forgetting the URI
|
|
644
|
+
// locally left the callback live, producing phantom notifications
|
|
645
|
+
// (issue #92).
|
|
646
|
+
this.resourceRegistry.unsubscribe(subscriptionId);
|
|
548
647
|
sessionSubs.delete(params.uri);
|
|
648
|
+
if (sessionSubs.size === 0) {
|
|
649
|
+
this.resourceSubscriptions.delete(sessionId);
|
|
650
|
+
}
|
|
549
651
|
}
|
|
550
652
|
}
|
|
551
653
|
return {
|
|
@@ -680,7 +782,7 @@ export class MCPServer extends EventEmitter {
|
|
|
680
782
|
// ============================================================================
|
|
681
783
|
// Sampling Handler (MCP 2025-11-25)
|
|
682
784
|
// ============================================================================
|
|
683
|
-
async handleSamplingCreateMessage(request) {
|
|
785
|
+
async handleSamplingCreateMessage(request, connectionId) {
|
|
684
786
|
const params = request.params;
|
|
685
787
|
if (!params?.messages || !params?.maxTokens) {
|
|
686
788
|
return this.createErrorResponse(request.id, ErrorCodes.INVALID_PARAMS, 'messages and maxTokens are required');
|
|
@@ -704,7 +806,7 @@ export class MCPServer extends EventEmitter {
|
|
|
704
806
|
stopSequences: params.stopSequences,
|
|
705
807
|
metadata: params.metadata,
|
|
706
808
|
}, {
|
|
707
|
-
sessionId: this.
|
|
809
|
+
sessionId: this.getSessionForConnection(connectionId)?.id || 'unknown',
|
|
708
810
|
serverId: this.serverInfo.name,
|
|
709
811
|
});
|
|
710
812
|
return {
|
|
@@ -729,12 +831,17 @@ export class MCPServer extends EventEmitter {
|
|
|
729
831
|
});
|
|
730
832
|
}
|
|
731
833
|
}
|
|
732
|
-
getOrCreateSession() {
|
|
733
|
-
|
|
734
|
-
|
|
834
|
+
getOrCreateSession(connectionId) {
|
|
835
|
+
const existing = this.getSessionForConnection(connectionId);
|
|
836
|
+
if (existing) {
|
|
837
|
+
return existing;
|
|
735
838
|
}
|
|
839
|
+
// A client is calling a non-initialize method on a connection that never
|
|
840
|
+
// sent `initialize` (or whose session already expired). Create a fresh
|
|
841
|
+
// session bound to this specific connection rather than reusing/
|
|
842
|
+
// overwriting another client's session.
|
|
736
843
|
const session = this.sessionManager.createSession(this.config.transport);
|
|
737
|
-
this.
|
|
844
|
+
this.bindSessionToConnection(session, connectionId);
|
|
738
845
|
return session;
|
|
739
846
|
}
|
|
740
847
|
createErrorResponse(id, code, message) {
|
|
@@ -799,6 +906,88 @@ export class MCPServer extends EventEmitter {
|
|
|
799
906
|
count: 4,
|
|
800
907
|
});
|
|
801
908
|
}
|
|
909
|
+
// P2-1: Populate the Resources registry with system-level resources.
|
|
910
|
+
// The registry scaffolding always shipped empty — these adapter registrations
|
|
911
|
+
// surface monomind's state to MCP clients as app-driven context.
|
|
912
|
+
registerBuiltInResources() {
|
|
913
|
+
this.resourceRegistry.registerResource({
|
|
914
|
+
uri: 'monomind://system/status',
|
|
915
|
+
name: 'System Status',
|
|
916
|
+
description: 'Current monomind MCP server health, uptime, and tool count',
|
|
917
|
+
mimeType: 'application/json',
|
|
918
|
+
}, async (uri) => [{
|
|
919
|
+
uri,
|
|
920
|
+
mimeType: 'application/json',
|
|
921
|
+
text: JSON.stringify({
|
|
922
|
+
status: 'running',
|
|
923
|
+
uptime: this.startTime ? Date.now() - this.startTime.getTime() : 0,
|
|
924
|
+
tools: this.toolRegistry.listTools().length,
|
|
925
|
+
version: this.serverInfo.version,
|
|
926
|
+
}, null, 2),
|
|
927
|
+
}]);
|
|
928
|
+
this.resourceRegistry.registerResource({
|
|
929
|
+
uri: 'monomind://system/metrics',
|
|
930
|
+
name: 'Server Metrics',
|
|
931
|
+
description: 'Request count, cache hit rate, error rate',
|
|
932
|
+
mimeType: 'application/json',
|
|
933
|
+
}, async (uri) => [{
|
|
934
|
+
uri,
|
|
935
|
+
mimeType: 'application/json',
|
|
936
|
+
text: JSON.stringify(this.getMetrics(), null, 2),
|
|
937
|
+
}]);
|
|
938
|
+
this.resourceRegistry.registerResource({
|
|
939
|
+
uri: 'monomind://system/tools',
|
|
940
|
+
name: 'Tool Inventory',
|
|
941
|
+
description: 'Complete list of registered MCP tools with categories',
|
|
942
|
+
mimeType: 'application/json',
|
|
943
|
+
}, async (uri) => [{
|
|
944
|
+
uri,
|
|
945
|
+
mimeType: 'application/json',
|
|
946
|
+
text: JSON.stringify(this.toolRegistry.listTools(), null, 2),
|
|
947
|
+
}]);
|
|
948
|
+
this.logger.info('Built-in resources registered', { count: 3 });
|
|
949
|
+
}
|
|
950
|
+
// P2-2: Populate the Prompts registry with curated workflow templates.
|
|
951
|
+
// These give MCP clients pre-built prompt structures for common dev tasks.
|
|
952
|
+
registerBuiltInPrompts() {
|
|
953
|
+
this.promptRegistry.register({
|
|
954
|
+
name: 'monomind:research-plan',
|
|
955
|
+
description: 'Generate a structured research plan for a topic',
|
|
956
|
+
arguments: [{ name: 'topic', description: 'The research topic', required: true }],
|
|
957
|
+
handler: async (args) => [{
|
|
958
|
+
role: 'user',
|
|
959
|
+
content: {
|
|
960
|
+
type: 'text',
|
|
961
|
+
text: `Research plan for: ${args.topic ?? '(unspecified)'}\n\n1. Define scope and key questions\n2. Identify sources and prior work\n3. Outline methodology\n4. Execute research (parallel agents if appropriate)\n5. Synthesize findings\n6. Review and refine`,
|
|
962
|
+
},
|
|
963
|
+
}],
|
|
964
|
+
});
|
|
965
|
+
this.promptRegistry.register({
|
|
966
|
+
name: 'monomind:pr-review',
|
|
967
|
+
description: 'Structured pull-request review checklist',
|
|
968
|
+
arguments: [{ name: 'changes', description: 'Description of the changes', required: true }],
|
|
969
|
+
handler: async (args) => [{
|
|
970
|
+
role: 'user',
|
|
971
|
+
content: {
|
|
972
|
+
type: 'text',
|
|
973
|
+
text: `PR Review checklist for: ${args.changes ?? '(unspecified)'}\n\n- [ ] Correctness: does the code do what it claims?\n- [ ] Tests: are there tests covering the changes?\n- [ ] Security: any input validation gaps?\n- [ ] Performance: any O(n²) or unnecessary allocations?\n- [ ] Docs: are relevant docs updated?\n- [ ] Breaking changes: any removed APIs or changed behavior?\n- [ ] Honesty: any fabricated metrics or misleading output?`,
|
|
974
|
+
},
|
|
975
|
+
}],
|
|
976
|
+
});
|
|
977
|
+
this.promptRegistry.register({
|
|
978
|
+
name: 'monomind:debug-protocol',
|
|
979
|
+
description: 'Systematic root-cause debugging protocol (4-phase)',
|
|
980
|
+
arguments: [{ name: 'symptom', description: 'Description of the bug or unexpected behavior', required: true }],
|
|
981
|
+
handler: async (args) => [{
|
|
982
|
+
role: 'user',
|
|
983
|
+
content: {
|
|
984
|
+
type: 'text',
|
|
985
|
+
text: `Debug protocol for: ${args.symptom ?? '(unspecified)'}\n\nPhase 1 — REPRODUCE: Write a test that triggers the bug. Verify it fails.\nPhase 2 — ISOLATE: Binary-search the cause. What's the smallest change that triggers it?\nPhase 3 — FIX: Make the test pass with the minimal code change.\nPhase 4 — VERIFY: Run the full test suite. Confirm no regressions.`,
|
|
986
|
+
},
|
|
987
|
+
}],
|
|
988
|
+
});
|
|
989
|
+
this.logger.info('Built-in prompts registered', { count: 3 });
|
|
990
|
+
}
|
|
802
991
|
setupEventHandlers() {
|
|
803
992
|
this.toolRegistry.on('tool:registered', (name) => {
|
|
804
993
|
this.emit('tool:registered', name);
|
|
@@ -816,9 +1005,23 @@ export class MCPServer extends EventEmitter {
|
|
|
816
1005
|
this.emit('session:created', session);
|
|
817
1006
|
});
|
|
818
1007
|
this.sessionManager.on('session:closed', (data) => {
|
|
1008
|
+
this.purgeSessionSubscriptions(data.session.id);
|
|
819
1009
|
this.emit('session:closed', data);
|
|
820
1010
|
});
|
|
821
1011
|
this.sessionManager.on('session:expired', (session) => {
|
|
1012
|
+
this.purgeSessionSubscriptions(session.id);
|
|
1013
|
+
// Drop references to the expired session — otherwise `currentSession` /
|
|
1014
|
+
// `connectionSessions` keep pointing at a session the manager has
|
|
1015
|
+
// already reaped, and subsequent updateActivity calls fail silently
|
|
1016
|
+
// against the ghost (issue #93).
|
|
1017
|
+
if (this.currentSession?.id === session.id) {
|
|
1018
|
+
this.currentSession = undefined;
|
|
1019
|
+
}
|
|
1020
|
+
for (const [connectionId, s] of this.connectionSessions) {
|
|
1021
|
+
if (s.id === session.id) {
|
|
1022
|
+
this.connectionSessions.delete(connectionId);
|
|
1023
|
+
}
|
|
1024
|
+
}
|
|
822
1025
|
this.emit('session:expired', session);
|
|
823
1026
|
});
|
|
824
1027
|
}
|