@candide/nestjs-mcp-server 1.1.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 (79) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1065 -0
  3. package/dist/decorators/index.d.ts +5 -0
  4. package/dist/decorators/index.js +22 -0
  5. package/dist/decorators/index.js.map +1 -0
  6. package/dist/decorators/prompt.decorator.d.ts +15 -0
  7. package/dist/decorators/prompt.decorator.js +16 -0
  8. package/dist/decorators/prompt.decorator.js.map +1 -0
  9. package/dist/decorators/resolver.decorator.d.ts +2 -0
  10. package/dist/decorators/resolver.decorator.js +14 -0
  11. package/dist/decorators/resolver.decorator.js.map +1 -0
  12. package/dist/decorators/resource.decorator.d.ts +18 -0
  13. package/dist/decorators/resource.decorator.js +16 -0
  14. package/dist/decorators/resource.decorator.js.map +1 -0
  15. package/dist/decorators/tool.decorator.d.ts +30 -0
  16. package/dist/decorators/tool.decorator.js +16 -0
  17. package/dist/decorators/tool.decorator.js.map +1 -0
  18. package/dist/decorators/user-guard.decorator.d.ts +2 -0
  19. package/dist/decorators/user-guard.decorator.js +10 -0
  20. package/dist/decorators/user-guard.decorator.js.map +1 -0
  21. package/dist/index.d.ts +6 -0
  22. package/dist/index.js +23 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/interfaces/context.interface.d.ts +11 -0
  25. package/dist/interfaces/context.interface.js +3 -0
  26. package/dist/interfaces/context.interface.js.map +1 -0
  27. package/dist/interfaces/index.d.ts +1 -0
  28. package/dist/interfaces/index.js +18 -0
  29. package/dist/interfaces/index.js.map +1 -0
  30. package/dist/mcp-core.module.d.ts +11 -0
  31. package/dist/mcp-core.module.js +218 -0
  32. package/dist/mcp-core.module.js.map +1 -0
  33. package/dist/mcp.constants.d.ts +6 -0
  34. package/dist/mcp.constants.js +10 -0
  35. package/dist/mcp.constants.js.map +1 -0
  36. package/dist/mcp.module.d.ts +11 -0
  37. package/dist/mcp.module.js +40 -0
  38. package/dist/mcp.module.js.map +1 -0
  39. package/dist/mcp.types.d.ts +62 -0
  40. package/dist/mcp.types.js +3 -0
  41. package/dist/mcp.types.js.map +1 -0
  42. package/dist/services/discovery.service.d.ts +16 -0
  43. package/dist/services/discovery.service.js +85 -0
  44. package/dist/services/discovery.service.js.map +1 -0
  45. package/dist/services/index.d.ts +3 -0
  46. package/dist/services/index.js +20 -0
  47. package/dist/services/index.js.map +1 -0
  48. package/dist/services/logger.service.d.ts +16 -0
  49. package/dist/services/logger.service.js +98 -0
  50. package/dist/services/logger.service.js.map +1 -0
  51. package/dist/services/registry.service.d.ts +23 -0
  52. package/dist/services/registry.service.js +284 -0
  53. package/dist/services/registry.service.js.map +1 -0
  54. package/dist/services/session.manager.d.ts +18 -0
  55. package/dist/services/session.manager.js +46 -0
  56. package/dist/services/session.manager.js.map +1 -0
  57. package/dist/transports/sse/index.d.ts +2 -0
  58. package/dist/transports/sse/index.js +19 -0
  59. package/dist/transports/sse/index.js.map +1 -0
  60. package/dist/transports/sse/sse.controller.d.ts +3 -0
  61. package/dist/transports/sse/sse.controller.js +61 -0
  62. package/dist/transports/sse/sse.controller.js.map +1 -0
  63. package/dist/transports/sse/sse.service.d.ts +29 -0
  64. package/dist/transports/sse/sse.service.js +174 -0
  65. package/dist/transports/sse/sse.service.js.map +1 -0
  66. package/dist/transports/streamable/index.d.ts +2 -0
  67. package/dist/transports/streamable/index.js +19 -0
  68. package/dist/transports/streamable/index.js.map +1 -0
  69. package/dist/transports/streamable/streamable.controller.d.ts +3 -0
  70. package/dist/transports/streamable/streamable.controller.js +66 -0
  71. package/dist/transports/streamable/streamable.controller.js.map +1 -0
  72. package/dist/transports/streamable/streamable.service.d.ts +30 -0
  73. package/dist/transports/streamable/streamable.service.js +238 -0
  74. package/dist/transports/streamable/streamable.service.js.map +1 -0
  75. package/dist/tsconfig.build.tsbuildinfo +1 -0
  76. package/dist/types/handler-args.types.d.ts +23 -0
  77. package/dist/types/handler-args.types.js +3 -0
  78. package/dist/types/handler-args.types.js.map +1 -0
  79. package/package.json +151 -0
@@ -0,0 +1,18 @@
1
+ import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse';
2
+ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
3
+ import { Request } from 'express';
4
+ type Session = {
5
+ transport: StreamableHTTPServerTransport | SSEServerTransport;
6
+ request: Request;
7
+ lastActivity: number;
8
+ };
9
+ export declare class SessionManager {
10
+ private sessions;
11
+ getSession(sessionId: string): Session | undefined;
12
+ setSession(sessionId: string, session: Omit<Session, 'lastActivity'>): void;
13
+ deleteSession(sessionId: string): void;
14
+ getActiveSessionCount(): number;
15
+ getInactiveSessions(timeoutMs: number): string[];
16
+ getAllSessionIds(): string[];
17
+ }
18
+ export {};
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.SessionManager = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ let SessionManager = class SessionManager {
12
+ sessions = new Map();
13
+ getSession(sessionId) {
14
+ const session = this.sessions.get(sessionId);
15
+ if (session) {
16
+ session.lastActivity = Date.now();
17
+ }
18
+ return session;
19
+ }
20
+ setSession(sessionId, session) {
21
+ this.sessions.set(sessionId, {
22
+ ...session,
23
+ lastActivity: Date.now(),
24
+ });
25
+ }
26
+ deleteSession(sessionId) {
27
+ this.sessions.delete(sessionId);
28
+ }
29
+ getActiveSessionCount() {
30
+ return this.sessions.size;
31
+ }
32
+ getInactiveSessions(timeoutMs) {
33
+ const now = Date.now();
34
+ return Array.from(this.sessions.entries())
35
+ .filter(([_, session]) => now - session.lastActivity > timeoutMs)
36
+ .map(([sessionId]) => sessionId);
37
+ }
38
+ getAllSessionIds() {
39
+ return Array.from(this.sessions.keys());
40
+ }
41
+ };
42
+ exports.SessionManager = SessionManager;
43
+ exports.SessionManager = SessionManager = __decorate([
44
+ (0, common_1.Injectable)()
45
+ ], SessionManager);
46
+ //# sourceMappingURL=session.manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.manager.js","sourceRoot":"","sources":["../../src/services/session.manager.ts"],"names":[],"mappings":";;;;;;;;;AAEA,2CAA4C;AAUrC,IAAM,cAAc,GAApB,MAAM,cAAc;IACjB,QAAQ,GAAG,IAAI,GAAG,EAAmB,CAAC;IAEvC,UAAU,CAAC,SAAiB;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC7C,IAAI,OAAO,EAAE,CAAC;YAEZ,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACpC,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAEM,UAAU,CACf,SAAiB,EACjB,OAAsC;QAEtC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE;YAC3B,GAAG,OAAO;YACV,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE;SACzB,CAAC,CAAC;IACL,CAAC;IAEM,aAAa,CAAC,SAAiB;QACpC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAClC,CAAC;IAEM,qBAAqB;QAC1B,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;IAC5B,CAAC;IAEM,mBAAmB,CAAC,SAAiB;QAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;aACvC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;aAChE,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;IAEM,gBAAgB;QACrB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC;CACF,CAAA;AAxCY,wCAAc;yBAAd,cAAc;IAD1B,IAAA,mBAAU,GAAE;GACA,cAAc,CAwC1B"}
@@ -0,0 +1,2 @@
1
+ export * from './sse.controller';
2
+ export * from './sse.service';
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./sse.controller"), exports);
18
+ __exportStar(require("./sse.service"), exports);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/transports/sse/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mDAAiC;AACjC,gDAA8B"}
@@ -0,0 +1,3 @@
1
+ import { Type } from '@nestjs/common';
2
+ export declare function createSseController(sseEndpoint?: string, messagesEndpoint?: string): Type<any>;
3
+ export declare const SseController: Type<any>;
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.SseController = void 0;
16
+ exports.createSseController = createSseController;
17
+ const common_1 = require("@nestjs/common");
18
+ const logger_service_1 = require("../../services/logger.service");
19
+ const sse_service_1 = require("./sse.service");
20
+ function createSseController(sseEndpoint = 'sse', messagesEndpoint = 'messages') {
21
+ let DynamicSseController = class DynamicSseController {
22
+ logger;
23
+ service;
24
+ constructor(logger, service) {
25
+ this.logger = logger;
26
+ this.service = service;
27
+ }
28
+ async handleSse(req, res) {
29
+ this.logger.log('[SSE] Connection established');
30
+ await this.service.handleSse(req, res);
31
+ }
32
+ async handleMessages(req, res) {
33
+ this.logger.log('[SSE] Message received');
34
+ await this.service.handleMessage(req, res);
35
+ }
36
+ };
37
+ __decorate([
38
+ (0, common_1.Get)(sseEndpoint),
39
+ __param(0, (0, common_1.Req)()),
40
+ __param(1, (0, common_1.Res)()),
41
+ __metadata("design:type", Function),
42
+ __metadata("design:paramtypes", [Object, Object]),
43
+ __metadata("design:returntype", Promise)
44
+ ], DynamicSseController.prototype, "handleSse", null);
45
+ __decorate([
46
+ (0, common_1.Post)(messagesEndpoint),
47
+ __param(0, (0, common_1.Req)()),
48
+ __param(1, (0, common_1.Res)()),
49
+ __metadata("design:type", Function),
50
+ __metadata("design:paramtypes", [Object, Object]),
51
+ __metadata("design:returntype", Promise)
52
+ ], DynamicSseController.prototype, "handleMessages", null);
53
+ DynamicSseController = __decorate([
54
+ (0, common_1.Controller)(),
55
+ __metadata("design:paramtypes", [logger_service_1.McpLoggerService,
56
+ sse_service_1.SseService])
57
+ ], DynamicSseController);
58
+ return DynamicSseController;
59
+ }
60
+ exports.SseController = createSseController();
61
+ //# sourceMappingURL=sse.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.controller.js","sourceRoot":"","sources":["../../../src/transports/sse/sse.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAWA,kDAyBC;AApCD,2CAAuE;AAGvE,kEAAiE;AACjE,+CAA2C;AAO3C,SAAgB,mBAAmB,CACjC,cAAsB,KAAK,EAC3B,mBAA2B,UAAU;IAErC,IACM,oBAAoB,GAD1B,MACM,oBAAoB;QAEL;QACA;QAFnB,YACmB,MAAwB,EACxB,OAAmB;YADnB,WAAM,GAAN,MAAM,CAAkB;YACxB,YAAO,GAAP,OAAO,CAAY;QACnC,CAAC;QAGE,AAAN,KAAK,CAAC,SAAS,CAAQ,GAAY,EAAS,GAAa;YACvD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;YAChD,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACzC,CAAC;QAGK,AAAN,KAAK,CAAC,cAAc,CAAQ,GAAY,EAAS,GAAa;YAC5D,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;YAC1C,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC7C,CAAC;KACF,CAAA;IAVO;QADL,IAAA,YAAG,EAAC,WAAW,CAAC;QACA,WAAA,IAAA,YAAG,GAAE,CAAA;QAAgB,WAAA,IAAA,YAAG,GAAE,CAAA;;;;yDAG1C;IAGK;QADL,IAAA,aAAI,EAAC,gBAAgB,CAAC;QACD,WAAA,IAAA,YAAG,GAAE,CAAA;QAAgB,WAAA,IAAA,YAAG,GAAE,CAAA;;;;8DAG/C;IAhBG,oBAAoB;QADzB,IAAA,mBAAU,GAAE;yCAGgB,iCAAgB;YACf,wBAAU;OAHlC,oBAAoB,CAiBzB;IAED,OAAO,oBAAoB,CAAC;AAC9B,CAAC;AAGY,QAAA,aAAa,GAAG,mBAAmB,EAAE,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { OnModuleInit } from '@nestjs/common';
2
+ import { Request, Response } from 'express';
3
+ import { McpModuleTransportOptions, McpServerOptions, McpSessionOptions } from '../../mcp.types';
4
+ import { McpLoggerService } from '../../services/logger.service';
5
+ import { RegistryService } from '../../services/registry.service';
6
+ import { SessionManager } from '../../services/session.manager';
7
+ export declare class SseService implements OnModuleInit {
8
+ private readonly options;
9
+ private readonly sessionOptions;
10
+ private readonly transportOptions;
11
+ private readonly workspace;
12
+ private readonly registry;
13
+ private readonly logger;
14
+ private readonly sessionManager;
15
+ private readonly sessionTimeoutMs;
16
+ private readonly maxConcurrentSessions;
17
+ private readonly cleanupIntervalMs;
18
+ private readonly enabled;
19
+ private cleanupTimer?;
20
+ constructor(options: McpServerOptions, sessionOptions: McpSessionOptions, transportOptions: McpModuleTransportOptions, workspace: string | null, registry: RegistryService, logger: McpLoggerService, sessionManager: SessionManager);
21
+ onModuleInit(): void;
22
+ onModuleDestroy(): void;
23
+ private startCleanupJob;
24
+ private stopCleanupJob;
25
+ private cleanupInactiveSessions;
26
+ private createServer;
27
+ handleSse(req: Request, res: Response): Promise<void>;
28
+ handleMessage(req: Request, res: Response): Promise<void>;
29
+ }
@@ -0,0 +1,174 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.SseService = void 0;
16
+ const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
17
+ const sse_js_1 = require("@modelcontextprotocol/sdk/server/sse.js");
18
+ const common_1 = require("@nestjs/common");
19
+ const mcp_constants_1 = require("../../mcp.constants");
20
+ const logger_service_1 = require("../../services/logger.service");
21
+ const registry_service_1 = require("../../services/registry.service");
22
+ const session_manager_1 = require("../../services/session.manager");
23
+ let SseService = class SseService {
24
+ options;
25
+ sessionOptions;
26
+ transportOptions;
27
+ workspace;
28
+ registry;
29
+ logger;
30
+ sessionManager;
31
+ sessionTimeoutMs;
32
+ maxConcurrentSessions;
33
+ cleanupIntervalMs;
34
+ enabled;
35
+ cleanupTimer;
36
+ constructor(options, sessionOptions, transportOptions, workspace, registry, logger, sessionManager) {
37
+ this.options = options;
38
+ this.sessionOptions = sessionOptions;
39
+ this.transportOptions = transportOptions;
40
+ this.workspace = workspace;
41
+ this.registry = registry;
42
+ this.logger = logger;
43
+ this.sessionManager = sessionManager;
44
+ this.enabled = transportOptions?.sse?.enabled !== false;
45
+ this.sessionTimeoutMs = sessionOptions.sessionTimeoutMs ?? 1800000;
46
+ this.maxConcurrentSessions = sessionOptions.maxConcurrentSessions ?? 1000;
47
+ this.cleanupIntervalMs = sessionOptions.cleanupIntervalMs ?? 300000;
48
+ }
49
+ onModuleInit() {
50
+ if (!this.enabled) {
51
+ this.logger.log('SSE transport disabled', 'MCP_SERVER');
52
+ return;
53
+ }
54
+ this.logger.log('MCP initialization completed', 'MCP_SERVER');
55
+ this.startCleanupJob();
56
+ }
57
+ onModuleDestroy() {
58
+ this.stopCleanupJob();
59
+ }
60
+ startCleanupJob() {
61
+ this.cleanupTimer = setInterval(() => {
62
+ this.cleanupInactiveSessions();
63
+ }, this.cleanupIntervalMs);
64
+ }
65
+ stopCleanupJob() {
66
+ if (this.cleanupTimer) {
67
+ clearInterval(this.cleanupTimer);
68
+ }
69
+ }
70
+ cleanupInactiveSessions() {
71
+ const inactiveSessions = this.sessionManager.getInactiveSessions(this.sessionTimeoutMs);
72
+ if (inactiveSessions.length > 0) {
73
+ this.logger.debug(`Cleaning up ${inactiveSessions.length} inactive sessions`, 'SSE');
74
+ for (const sessionId of inactiveSessions) {
75
+ const session = this.sessionManager.getSession(sessionId);
76
+ if (session) {
77
+ try {
78
+ void session.transport.close();
79
+ }
80
+ catch (error) {
81
+ const errorMessage = error instanceof Error ? error.message : String(error);
82
+ this.logger.error(`Error closing transport for session ${sessionId}`, errorMessage, 'SSE');
83
+ }
84
+ this.sessionManager.deleteSession(sessionId);
85
+ }
86
+ }
87
+ }
88
+ }
89
+ createServer() {
90
+ const server = new mcp_js_1.McpServer(this.options.serverInfo, this.options.options);
91
+ this.registry.registerAll(server, this.workspace ?? undefined);
92
+ return server;
93
+ }
94
+ async handleSse(req, res) {
95
+ if (!this.enabled) {
96
+ res.status(404).send('SSE transport is disabled');
97
+ return;
98
+ }
99
+ if (this.sessionManager.getActiveSessionCount() >= this.maxConcurrentSessions) {
100
+ this.logger.warn(`Maximum concurrent sessions reached: ${this.maxConcurrentSessions}`, 'SSE');
101
+ res
102
+ .status(503)
103
+ .send('Service temporarily unavailable: Maximum concurrent sessions reached');
104
+ return;
105
+ }
106
+ const transport = new sse_js_1.SSEServerTransport('/messages', res);
107
+ this.sessionManager.setSession(transport.sessionId, {
108
+ transport,
109
+ request: req,
110
+ });
111
+ this.logger.debug(`Starting SSE for sessionId: ${transport.sessionId}`, 'SSE');
112
+ res.on('close', () => {
113
+ this.logger.debug(`SSE connection closed for session: ${transport.sessionId}`, 'SSE');
114
+ this.sessionManager.deleteSession(transport.sessionId);
115
+ });
116
+ try {
117
+ const server = this.createServer();
118
+ await server.connect(transport);
119
+ }
120
+ catch (error) {
121
+ this.logger.error('Failed to create or connect server', error, 'SSE');
122
+ this.sessionManager.deleteSession(transport.sessionId);
123
+ res.status(500).send('Internal server error');
124
+ }
125
+ }
126
+ async handleMessage(req, res) {
127
+ if (!this.enabled) {
128
+ res.status(404).send('SSE transport is disabled');
129
+ return;
130
+ }
131
+ const sessionId = req.query.sessionId;
132
+ const session = this.sessionManager.getSession(sessionId);
133
+ if (!session) {
134
+ res.status(400).send('Invalid or missing sessionId');
135
+ return;
136
+ }
137
+ this.logger.debug(`Receiving SSE message for sessionId: ${sessionId}`, 'api');
138
+ this.logger.debug(`SSE message: ${JSON.stringify(req.body)}`, 'MCP_SERVER');
139
+ const transport = session.transport;
140
+ if (!(transport instanceof sse_js_1.SSEServerTransport)) {
141
+ res.status(400).send('Invalid transport');
142
+ return;
143
+ }
144
+ try {
145
+ if (transport) {
146
+ await transport.handlePostMessage(req, res, req.body);
147
+ }
148
+ else {
149
+ res.status(400).send('No transport found for sessionId');
150
+ }
151
+ }
152
+ catch (error) {
153
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
154
+ this.logger.error('Error al manejar mensaje SSE', errorMessage, 'MCP_SERVER');
155
+ res.status(500).send({
156
+ statusCode: 500,
157
+ error: 'Internal Server Error',
158
+ message: errorMessage,
159
+ });
160
+ }
161
+ }
162
+ };
163
+ exports.SseService = SseService;
164
+ exports.SseService = SseService = __decorate([
165
+ (0, common_1.Injectable)(),
166
+ __param(0, (0, common_1.Inject)(mcp_constants_1.MCP_SERVER_OPTIONS)),
167
+ __param(1, (0, common_1.Inject)(mcp_constants_1.MCP_SESSION_OPTIONS)),
168
+ __param(2, (0, common_1.Inject)(mcp_constants_1.MCP_TRANSPORT_OPTIONS)),
169
+ __param(3, (0, common_1.Inject)(mcp_constants_1.MCP_WORKSPACE)),
170
+ __metadata("design:paramtypes", [Object, Object, Object, Object, registry_service_1.RegistryService,
171
+ logger_service_1.McpLoggerService,
172
+ session_manager_1.SessionManager])
173
+ ], SseService);
174
+ //# sourceMappingURL=sse.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.service.js","sourceRoot":"","sources":["../../../src/transports/sse/sse.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from './streamable.controller';
2
+ export * from './streamable.service';
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./streamable.controller"), exports);
18
+ __exportStar(require("./streamable.service"), exports);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/transports/streamable/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0DAAwC;AACxC,uDAAqC"}
@@ -0,0 +1,3 @@
1
+ import { Type } from '@nestjs/common';
2
+ export declare function createStreamableController(endpoint?: string): Type<any>;
3
+ export declare const StreamableController: Type<any>;
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.StreamableController = void 0;
16
+ exports.createStreamableController = createStreamableController;
17
+ const common_1 = require("@nestjs/common");
18
+ const streamable_service_1 = require("./streamable.service");
19
+ function createStreamableController(endpoint = 'mcp') {
20
+ let DynamicStreamableController = class DynamicStreamableController {
21
+ service;
22
+ constructor(service) {
23
+ this.service = service;
24
+ }
25
+ async handleMcpPost(req, res) {
26
+ await this.service.handlePostRequest(req, res);
27
+ }
28
+ async handleMcpGet(req, res) {
29
+ await this.service.handleGetRequest(req, res);
30
+ }
31
+ async handleMcpDelete(req, res) {
32
+ await this.service.handleDeleteRequest(req, res);
33
+ }
34
+ };
35
+ __decorate([
36
+ (0, common_1.Post)(endpoint),
37
+ __param(0, (0, common_1.Req)()),
38
+ __param(1, (0, common_1.Res)()),
39
+ __metadata("design:type", Function),
40
+ __metadata("design:paramtypes", [Object, Object]),
41
+ __metadata("design:returntype", Promise)
42
+ ], DynamicStreamableController.prototype, "handleMcpPost", null);
43
+ __decorate([
44
+ (0, common_1.Get)(endpoint),
45
+ __param(0, (0, common_1.Req)()),
46
+ __param(1, (0, common_1.Res)()),
47
+ __metadata("design:type", Function),
48
+ __metadata("design:paramtypes", [Object, Object]),
49
+ __metadata("design:returntype", Promise)
50
+ ], DynamicStreamableController.prototype, "handleMcpGet", null);
51
+ __decorate([
52
+ (0, common_1.Delete)(endpoint),
53
+ __param(0, (0, common_1.Req)()),
54
+ __param(1, (0, common_1.Res)()),
55
+ __metadata("design:type", Function),
56
+ __metadata("design:paramtypes", [Object, Object]),
57
+ __metadata("design:returntype", Promise)
58
+ ], DynamicStreamableController.prototype, "handleMcpDelete", null);
59
+ DynamicStreamableController = __decorate([
60
+ (0, common_1.Controller)(),
61
+ __metadata("design:paramtypes", [streamable_service_1.StreamableService])
62
+ ], DynamicStreamableController);
63
+ return DynamicStreamableController;
64
+ }
65
+ exports.StreamableController = createStreamableController();
66
+ //# sourceMappingURL=streamable.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streamable.controller.js","sourceRoot":"","sources":["../../../src/transports/streamable/streamable.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AASA,gEAwBC;AAjCD,2CAA+E;AAG/E,6DAAyD;AAMzD,SAAgB,0BAA0B,CACxC,WAAmB,KAAK;IAExB,IACM,2BAA2B,GADjC,MACM,2BAA2B;QACF;QAA7B,YAA6B,OAA0B;YAA1B,YAAO,GAAP,OAAO,CAAmB;QAAG,CAAC;QAGrD,AAAN,KAAK,CAAC,aAAa,CAAQ,GAAY,EAAS,GAAa;YAC3D,MAAM,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACjD,CAAC;QAGK,AAAN,KAAK,CAAC,YAAY,CAAQ,GAAY,EAAS,GAAa;YAC1D,MAAM,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAChD,CAAC;QAGK,AAAN,KAAK,CAAC,eAAe,CAAQ,GAAY,EAAS,GAAa;YAC7D,MAAM,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACnD,CAAC;KACF,CAAA;IAbO;QADL,IAAA,aAAI,EAAC,QAAQ,CAAC;QACM,WAAA,IAAA,YAAG,GAAE,CAAA;QAAgB,WAAA,IAAA,YAAG,GAAE,CAAA;;;;oEAE9C;IAGK;QADL,IAAA,YAAG,EAAC,QAAQ,CAAC;QACM,WAAA,IAAA,YAAG,GAAE,CAAA;QAAgB,WAAA,IAAA,YAAG,GAAE,CAAA;;;;mEAE7C;IAGK;QADL,IAAA,eAAM,EAAC,QAAQ,CAAC;QACM,WAAA,IAAA,YAAG,GAAE,CAAA;QAAgB,WAAA,IAAA,YAAG,GAAE,CAAA;;;;sEAEhD;IAhBG,2BAA2B;QADhC,IAAA,mBAAU,GAAE;yCAE2B,sCAAiB;OADnD,2BAA2B,CAiBhC;IAED,OAAO,2BAA2B,CAAC;AACrC,CAAC;AAGY,QAAA,oBAAoB,GAAG,0BAA0B,EAAE,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { OnModuleInit } from '@nestjs/common';
2
+ import { Request, Response } from 'express';
3
+ import { McpModuleTransportOptions, McpServerOptions, McpSessionOptions } from '../../mcp.types';
4
+ import { McpLoggerService } from '../../services/logger.service';
5
+ import { RegistryService } from '../../services/registry.service';
6
+ import { SessionManager } from '../../services/session.manager';
7
+ export declare class StreamableService implements OnModuleInit {
8
+ private readonly options;
9
+ private readonly transportOptions;
10
+ private readonly sessionOptions;
11
+ private readonly workspace;
12
+ private readonly registry;
13
+ private readonly logger;
14
+ private readonly sessionManager;
15
+ private readonly sessionTimeoutMs;
16
+ private readonly maxConcurrentSessions;
17
+ private readonly cleanupIntervalMs;
18
+ private readonly enabled;
19
+ private cleanupTimer?;
20
+ constructor(options: McpServerOptions, transportOptions: McpModuleTransportOptions, sessionOptions: McpSessionOptions, workspace: string | null, registry: RegistryService, logger: McpLoggerService, sessionManager: SessionManager);
21
+ onModuleInit(): void;
22
+ onModuleDestroy(): void;
23
+ private startCleanupJob;
24
+ private stopCleanupJob;
25
+ private cleanupInactiveSessions;
26
+ private createServer;
27
+ handlePostRequest(req: Request, res: Response): Promise<void>;
28
+ handleGetRequest(req: Request, res: Response): Promise<void>;
29
+ handleDeleteRequest(req: Request, res: Response): Promise<void>;
30
+ }