@monoes/mcp 1.0.0 → 1.0.2
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 +37 -6
- 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 +25 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +157 -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 -69
- 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 -6
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;
|
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,11 +175,18 @@ 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();
|
|
@@ -197,8 +216,16 @@ export class MCPServer extends EventEmitter {
|
|
|
197
216
|
await this.transport.stop();
|
|
198
217
|
this.transport = undefined;
|
|
199
218
|
}
|
|
200
|
-
|
|
219
|
+
// PKG-1: destroy() runs stopCleanupTimer + clearAll + removeAllListeners.
|
|
220
|
+
// clearAll() alone left the SessionManager cleanup interval (setInterval
|
|
221
|
+
// at session-manager.ts:303) firing forever after stop().
|
|
222
|
+
this.sessionManager.destroy();
|
|
201
223
|
this.taskManager.destroy();
|
|
224
|
+
// Safety net: detach any subscription whose session already vanished
|
|
225
|
+
// without a session:closed event reaching the purge handler.
|
|
226
|
+
for (const sessionId of [...this.resourceSubscriptions.keys()]) {
|
|
227
|
+
this.purgeSessionSubscriptions(sessionId);
|
|
228
|
+
}
|
|
202
229
|
this.resourceSubscriptions.clear();
|
|
203
230
|
this.rateLimiter.destroy();
|
|
204
231
|
if (this.connectionPool) {
|
|
@@ -206,6 +233,7 @@ export class MCPServer extends EventEmitter {
|
|
|
206
233
|
}
|
|
207
234
|
this.running = false;
|
|
208
235
|
this.currentSession = undefined;
|
|
236
|
+
this.connectionSessions.clear();
|
|
209
237
|
this.logger.info('MCP server stopped');
|
|
210
238
|
this.emit('server:stopped');
|
|
211
239
|
}
|
|
@@ -286,9 +314,67 @@ export class MCPServer extends EventEmitter {
|
|
|
286
314
|
if (this.currentSession?.id === sessionId) {
|
|
287
315
|
this.currentSession = undefined;
|
|
288
316
|
}
|
|
317
|
+
for (const [connectionId, session] of this.connectionSessions) {
|
|
318
|
+
if (session.id === sessionId) {
|
|
319
|
+
this.connectionSessions.delete(connectionId);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
289
322
|
return result;
|
|
290
323
|
}
|
|
291
|
-
|
|
324
|
+
/**
|
|
325
|
+
* Resolve the session bound to a connection without creating one.
|
|
326
|
+
* Multi-client transports (http, websocket) pass a `connectionId`, which is
|
|
327
|
+
* looked up in `connectionSessions`. Single-client transports (stdio,
|
|
328
|
+
* in-process) omit it, falling back to the `currentSession` singleton.
|
|
329
|
+
*/
|
|
330
|
+
getSessionForConnection(connectionId) {
|
|
331
|
+
if (connectionId) {
|
|
332
|
+
return this.connectionSessions.get(connectionId);
|
|
333
|
+
}
|
|
334
|
+
return this.currentSession;
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Bind a newly-created session to a connection: per-connectionId when the
|
|
338
|
+
* transport supports multiple clients, otherwise the singleton fallback.
|
|
339
|
+
*/
|
|
340
|
+
bindSessionToConnection(session, connectionId) {
|
|
341
|
+
if (connectionId) {
|
|
342
|
+
this.connectionSessions.set(connectionId, session);
|
|
343
|
+
}
|
|
344
|
+
else {
|
|
345
|
+
this.currentSession = session;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Tear down the session owned by a connection when the transport reports
|
|
350
|
+
* that connection has closed — prevents closed clients' sessions (and any
|
|
351
|
+
* resource subscriptions) from lingering until the idle-timeout sweep.
|
|
352
|
+
*/
|
|
353
|
+
closeConnectionSession(connectionId) {
|
|
354
|
+
const session = this.connectionSessions.get(connectionId);
|
|
355
|
+
this.connectionSessions.delete(connectionId);
|
|
356
|
+
if (session) {
|
|
357
|
+
// closeSession emits 'session:closed', which purges the session's
|
|
358
|
+
// resource subscriptions (see setupEventHandlers).
|
|
359
|
+
this.sessionManager.closeSession(session.id, 'Connection closed');
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Detach every registry subscription owned by a session. Called whenever a
|
|
364
|
+
* session ends (terminated, connection closed, expired, server stopped) so
|
|
365
|
+
* no update callback outlives its session (issue #92).
|
|
366
|
+
*/
|
|
367
|
+
purgeSessionSubscriptions(sessionId) {
|
|
368
|
+
const sessionSubs = this.resourceSubscriptions.get(sessionId);
|
|
369
|
+
if (!sessionSubs) {
|
|
370
|
+
return;
|
|
371
|
+
}
|
|
372
|
+
for (const subscriptionId of sessionSubs.values()) {
|
|
373
|
+
this.resourceRegistry.unsubscribe(subscriptionId);
|
|
374
|
+
}
|
|
375
|
+
this.resourceSubscriptions.delete(sessionId);
|
|
376
|
+
}
|
|
377
|
+
async handleRequest(request, connectionId) {
|
|
292
378
|
const startTime = performance.now();
|
|
293
379
|
this.requestStats.total++;
|
|
294
380
|
this.logger.debug('Handling request', {
|
|
@@ -297,7 +383,7 @@ export class MCPServer extends EventEmitter {
|
|
|
297
383
|
});
|
|
298
384
|
// Rate limiting check (skip for initialize)
|
|
299
385
|
if (request.method !== 'initialize') {
|
|
300
|
-
const sessionId = this.
|
|
386
|
+
const sessionId = this.getSessionForConnection(connectionId)?.id;
|
|
301
387
|
const rateLimitResult = this.rateLimiter.check(sessionId);
|
|
302
388
|
if (!rateLimitResult.allowed) {
|
|
303
389
|
this.requestStats.failed++;
|
|
@@ -315,14 +401,14 @@ export class MCPServer extends EventEmitter {
|
|
|
315
401
|
}
|
|
316
402
|
try {
|
|
317
403
|
if (request.method === 'initialize') {
|
|
318
|
-
return await this.handleInitialize(request);
|
|
404
|
+
return await this.handleInitialize(request, connectionId);
|
|
319
405
|
}
|
|
320
|
-
const session = this.getOrCreateSession();
|
|
406
|
+
const session = this.getOrCreateSession(connectionId);
|
|
321
407
|
if (!session.isInitialized && request.method !== 'initialized') {
|
|
322
408
|
return this.createErrorResponse(request.id, ErrorCodes.SERVER_NOT_INITIALIZED, 'Server not initialized');
|
|
323
409
|
}
|
|
324
410
|
this.sessionManager.updateActivity(session.id);
|
|
325
|
-
const response = await this.routeRequest(request);
|
|
411
|
+
const response = await this.routeRequest(request, connectionId);
|
|
326
412
|
const duration = performance.now() - startTime;
|
|
327
413
|
this.requestStats.successful++;
|
|
328
414
|
this.requestStats.totalResponseTime += duration;
|
|
@@ -345,7 +431,7 @@ export class MCPServer extends EventEmitter {
|
|
|
345
431
|
return this.createErrorResponse(request.id, ErrorCodes.INTERNAL_ERROR, error instanceof Error ? error.message : 'Internal error');
|
|
346
432
|
}
|
|
347
433
|
}
|
|
348
|
-
async handleNotification(notification) {
|
|
434
|
+
async handleNotification(notification, connectionId) {
|
|
349
435
|
this.logger.debug('Handling notification', { method: notification.method });
|
|
350
436
|
switch (notification.method) {
|
|
351
437
|
case 'initialized':
|
|
@@ -358,14 +444,14 @@ export class MCPServer extends EventEmitter {
|
|
|
358
444
|
this.logger.debug('Unknown notification', { method: notification.method });
|
|
359
445
|
}
|
|
360
446
|
}
|
|
361
|
-
async handleInitialize(request) {
|
|
447
|
+
async handleInitialize(request, connectionId) {
|
|
362
448
|
const params = request.params;
|
|
363
449
|
if (!params) {
|
|
364
450
|
return this.createErrorResponse(request.id, ErrorCodes.INVALID_PARAMS, 'Invalid params');
|
|
365
451
|
}
|
|
366
452
|
const session = this.sessionManager.createSession(this.config.transport);
|
|
367
453
|
this.sessionManager.initializeSession(session.id, params);
|
|
368
|
-
this.
|
|
454
|
+
this.bindSessionToConnection(session, connectionId);
|
|
369
455
|
const result = {
|
|
370
456
|
protocolVersion: this.protocolVersion,
|
|
371
457
|
capabilities: this.capabilities,
|
|
@@ -382,22 +468,22 @@ export class MCPServer extends EventEmitter {
|
|
|
382
468
|
result,
|
|
383
469
|
};
|
|
384
470
|
}
|
|
385
|
-
async routeRequest(request) {
|
|
471
|
+
async routeRequest(request, connectionId) {
|
|
386
472
|
switch (request.method) {
|
|
387
473
|
// Tool methods
|
|
388
474
|
case 'tools/list':
|
|
389
475
|
return this.handleToolsList(request);
|
|
390
476
|
case 'tools/call':
|
|
391
|
-
return this.handleToolsCall(request);
|
|
477
|
+
return this.handleToolsCall(request, connectionId);
|
|
392
478
|
// Resource methods (MCP 2025-11-25)
|
|
393
479
|
case 'resources/list':
|
|
394
480
|
return this.handleResourcesList(request);
|
|
395
481
|
case 'resources/read':
|
|
396
482
|
return this.handleResourcesRead(request);
|
|
397
483
|
case 'resources/subscribe':
|
|
398
|
-
return this.handleResourcesSubscribe(request);
|
|
484
|
+
return this.handleResourcesSubscribe(request, connectionId);
|
|
399
485
|
case 'resources/unsubscribe':
|
|
400
|
-
return this.handleResourcesUnsubscribe(request);
|
|
486
|
+
return this.handleResourcesUnsubscribe(request, connectionId);
|
|
401
487
|
// Prompt methods (MCP 2025-11-25)
|
|
402
488
|
case 'prompts/list':
|
|
403
489
|
return this.handlePromptsList(request);
|
|
@@ -416,7 +502,7 @@ export class MCPServer extends EventEmitter {
|
|
|
416
502
|
return this.handleLoggingSetLevel(request);
|
|
417
503
|
// Sampling (MCP 2025-11-25)
|
|
418
504
|
case 'sampling/createMessage':
|
|
419
|
-
return this.handleSamplingCreateMessage(request);
|
|
505
|
+
return this.handleSamplingCreateMessage(request, connectionId);
|
|
420
506
|
// Utility
|
|
421
507
|
case 'ping':
|
|
422
508
|
return {
|
|
@@ -427,7 +513,7 @@ export class MCPServer extends EventEmitter {
|
|
|
427
513
|
default:
|
|
428
514
|
// Check if it's a direct tool call
|
|
429
515
|
if (this.toolRegistry.hasTool(request.method)) {
|
|
430
|
-
return this.handleToolExecution(request);
|
|
516
|
+
return this.handleToolExecution(request, connectionId);
|
|
431
517
|
}
|
|
432
518
|
return this.createErrorResponse(request.id, ErrorCodes.METHOD_NOT_FOUND, `Method not found: ${request.method}`);
|
|
433
519
|
}
|
|
@@ -444,13 +530,13 @@ export class MCPServer extends EventEmitter {
|
|
|
444
530
|
result: { tools },
|
|
445
531
|
};
|
|
446
532
|
}
|
|
447
|
-
async handleToolsCall(request) {
|
|
533
|
+
async handleToolsCall(request, connectionId) {
|
|
448
534
|
const params = request.params;
|
|
449
535
|
if (!params?.name) {
|
|
450
536
|
return this.createErrorResponse(request.id, ErrorCodes.INVALID_PARAMS, 'Tool name is required');
|
|
451
537
|
}
|
|
452
538
|
const context = {
|
|
453
|
-
sessionId: this.
|
|
539
|
+
sessionId: this.getSessionForConnection(connectionId)?.id || 'unknown',
|
|
454
540
|
requestId: request.id,
|
|
455
541
|
orchestrator: this.orchestrator,
|
|
456
542
|
swarmCoordinator: this.swarmCoordinator,
|
|
@@ -462,9 +548,9 @@ export class MCPServer extends EventEmitter {
|
|
|
462
548
|
result,
|
|
463
549
|
};
|
|
464
550
|
}
|
|
465
|
-
async handleToolExecution(request) {
|
|
551
|
+
async handleToolExecution(request, connectionId) {
|
|
466
552
|
const context = {
|
|
467
|
-
sessionId: this.
|
|
553
|
+
sessionId: this.getSessionForConnection(connectionId)?.id || 'unknown',
|
|
468
554
|
requestId: request.id,
|
|
469
555
|
orchestrator: this.orchestrator,
|
|
470
556
|
swarmCoordinator: this.swarmCoordinator,
|
|
@@ -505,9 +591,9 @@ export class MCPServer extends EventEmitter {
|
|
|
505
591
|
return this.createErrorResponse(request.id, ErrorCodes.INVALID_PARAMS, error instanceof Error ? error.message : 'Resource read failed');
|
|
506
592
|
}
|
|
507
593
|
}
|
|
508
|
-
handleResourcesSubscribe(request) {
|
|
594
|
+
handleResourcesSubscribe(request, connectionId) {
|
|
509
595
|
const params = request.params;
|
|
510
|
-
const sessionId = this.
|
|
596
|
+
const sessionId = this.getSessionForConnection(connectionId)?.id;
|
|
511
597
|
if (!params?.uri) {
|
|
512
598
|
return this.createErrorResponse(request.id, ErrorCodes.INVALID_PARAMS, 'Resource URI is required');
|
|
513
599
|
}
|
|
@@ -518,14 +604,20 @@ export class MCPServer extends EventEmitter {
|
|
|
518
604
|
// Track subscription for this session
|
|
519
605
|
let sessionSubs = this.resourceSubscriptions.get(sessionId);
|
|
520
606
|
if (!sessionSubs) {
|
|
521
|
-
sessionSubs = new
|
|
607
|
+
sessionSubs = new Map();
|
|
522
608
|
this.resourceSubscriptions.set(sessionId, sessionSubs);
|
|
523
609
|
}
|
|
610
|
+
// Re-subscribing the same URI replaces the previous subscription —
|
|
611
|
+
// otherwise the old callback would keep firing with no way to reach it.
|
|
612
|
+
const existingId = sessionSubs.get(params.uri);
|
|
613
|
+
if (existingId) {
|
|
614
|
+
this.resourceRegistry.unsubscribe(existingId);
|
|
615
|
+
}
|
|
524
616
|
const subscriptionId = this.resourceRegistry.subscribe(params.uri, (uri, content) => {
|
|
525
617
|
// Send notification when resource updates
|
|
526
618
|
this.sendNotification('notifications/resources/updated', { uri });
|
|
527
619
|
});
|
|
528
|
-
sessionSubs.
|
|
620
|
+
sessionSubs.set(params.uri, subscriptionId);
|
|
529
621
|
return {
|
|
530
622
|
jsonrpc: '2.0',
|
|
531
623
|
id: request.id,
|
|
@@ -536,16 +628,24 @@ export class MCPServer extends EventEmitter {
|
|
|
536
628
|
return this.createErrorResponse(request.id, ErrorCodes.INTERNAL_ERROR, error instanceof Error ? error.message : 'Subscription failed');
|
|
537
629
|
}
|
|
538
630
|
}
|
|
539
|
-
handleResourcesUnsubscribe(request) {
|
|
631
|
+
handleResourcesUnsubscribe(request, connectionId) {
|
|
540
632
|
const params = request.params;
|
|
541
|
-
const sessionId = this.
|
|
633
|
+
const sessionId = this.getSessionForConnection(connectionId)?.id;
|
|
542
634
|
if (!params?.uri) {
|
|
543
635
|
return this.createErrorResponse(request.id, ErrorCodes.INVALID_PARAMS, 'Resource URI is required');
|
|
544
636
|
}
|
|
545
637
|
if (sessionId) {
|
|
546
638
|
const sessionSubs = this.resourceSubscriptions.get(sessionId);
|
|
547
|
-
|
|
639
|
+
const subscriptionId = sessionSubs?.get(params.uri);
|
|
640
|
+
if (sessionSubs && subscriptionId) {
|
|
641
|
+
// Actually detach the registry callback — just forgetting the URI
|
|
642
|
+
// locally left the callback live, producing phantom notifications
|
|
643
|
+
// (issue #92).
|
|
644
|
+
this.resourceRegistry.unsubscribe(subscriptionId);
|
|
548
645
|
sessionSubs.delete(params.uri);
|
|
646
|
+
if (sessionSubs.size === 0) {
|
|
647
|
+
this.resourceSubscriptions.delete(sessionId);
|
|
648
|
+
}
|
|
549
649
|
}
|
|
550
650
|
}
|
|
551
651
|
return {
|
|
@@ -680,7 +780,7 @@ export class MCPServer extends EventEmitter {
|
|
|
680
780
|
// ============================================================================
|
|
681
781
|
// Sampling Handler (MCP 2025-11-25)
|
|
682
782
|
// ============================================================================
|
|
683
|
-
async handleSamplingCreateMessage(request) {
|
|
783
|
+
async handleSamplingCreateMessage(request, connectionId) {
|
|
684
784
|
const params = request.params;
|
|
685
785
|
if (!params?.messages || !params?.maxTokens) {
|
|
686
786
|
return this.createErrorResponse(request.id, ErrorCodes.INVALID_PARAMS, 'messages and maxTokens are required');
|
|
@@ -704,7 +804,7 @@ export class MCPServer extends EventEmitter {
|
|
|
704
804
|
stopSequences: params.stopSequences,
|
|
705
805
|
metadata: params.metadata,
|
|
706
806
|
}, {
|
|
707
|
-
sessionId: this.
|
|
807
|
+
sessionId: this.getSessionForConnection(connectionId)?.id || 'unknown',
|
|
708
808
|
serverId: this.serverInfo.name,
|
|
709
809
|
});
|
|
710
810
|
return {
|
|
@@ -729,12 +829,17 @@ export class MCPServer extends EventEmitter {
|
|
|
729
829
|
});
|
|
730
830
|
}
|
|
731
831
|
}
|
|
732
|
-
getOrCreateSession() {
|
|
733
|
-
|
|
734
|
-
|
|
832
|
+
getOrCreateSession(connectionId) {
|
|
833
|
+
const existing = this.getSessionForConnection(connectionId);
|
|
834
|
+
if (existing) {
|
|
835
|
+
return existing;
|
|
735
836
|
}
|
|
837
|
+
// A client is calling a non-initialize method on a connection that never
|
|
838
|
+
// sent `initialize` (or whose session already expired). Create a fresh
|
|
839
|
+
// session bound to this specific connection rather than reusing/
|
|
840
|
+
// overwriting another client's session.
|
|
736
841
|
const session = this.sessionManager.createSession(this.config.transport);
|
|
737
|
-
this.
|
|
842
|
+
this.bindSessionToConnection(session, connectionId);
|
|
738
843
|
return session;
|
|
739
844
|
}
|
|
740
845
|
createErrorResponse(id, code, message) {
|
|
@@ -816,9 +921,23 @@ export class MCPServer extends EventEmitter {
|
|
|
816
921
|
this.emit('session:created', session);
|
|
817
922
|
});
|
|
818
923
|
this.sessionManager.on('session:closed', (data) => {
|
|
924
|
+
this.purgeSessionSubscriptions(data.session.id);
|
|
819
925
|
this.emit('session:closed', data);
|
|
820
926
|
});
|
|
821
927
|
this.sessionManager.on('session:expired', (session) => {
|
|
928
|
+
this.purgeSessionSubscriptions(session.id);
|
|
929
|
+
// Drop references to the expired session — otherwise `currentSession` /
|
|
930
|
+
// `connectionSessions` keep pointing at a session the manager has
|
|
931
|
+
// already reaped, and subsequent updateActivity calls fail silently
|
|
932
|
+
// against the ghost (issue #93).
|
|
933
|
+
if (this.currentSession?.id === session.id) {
|
|
934
|
+
this.currentSession = undefined;
|
|
935
|
+
}
|
|
936
|
+
for (const [connectionId, s] of this.connectionSessions) {
|
|
937
|
+
if (s.id === session.id) {
|
|
938
|
+
this.connectionSessions.delete(connectionId);
|
|
939
|
+
}
|
|
940
|
+
}
|
|
822
941
|
this.emit('session:expired', session);
|
|
823
942
|
});
|
|
824
943
|
}
|