@nestjs-mcp/server 0.1.0-alpha.10

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 (100) hide show
  1. package/.copilotignore +38 -0
  2. package/.devcontainer/Dockerfile.dev +28 -0
  3. package/.devcontainer/devcontainer.json +56 -0
  4. package/.devcontainer/docker-compose.yml +15 -0
  5. package/.dockerignore +37 -0
  6. package/.prettierrc +4 -0
  7. package/LICENSE +21 -0
  8. package/README.md +540 -0
  9. package/dist/controllers/sse/index.d.ts +2 -0
  10. package/dist/controllers/sse/index.js +19 -0
  11. package/dist/controllers/sse/index.js.map +1 -0
  12. package/dist/controllers/sse/sse.controller.d.ts +10 -0
  13. package/dist/controllers/sse/sse.controller.js +57 -0
  14. package/dist/controllers/sse/sse.controller.js.map +1 -0
  15. package/dist/controllers/sse/sse.service.d.ts +16 -0
  16. package/dist/controllers/sse/sse.service.js +78 -0
  17. package/dist/controllers/sse/sse.service.js.map +1 -0
  18. package/dist/controllers/streamable/index.d.ts +2 -0
  19. package/dist/controllers/streamable/index.js +19 -0
  20. package/dist/controllers/streamable/index.js.map +1 -0
  21. package/dist/controllers/streamable/streamable.controller.d.ts +9 -0
  22. package/dist/controllers/streamable/streamable.controller.js +62 -0
  23. package/dist/controllers/streamable/streamable.controller.js.map +1 -0
  24. package/dist/controllers/streamable/streamable.service.d.ts +24 -0
  25. package/dist/controllers/streamable/streamable.service.js +118 -0
  26. package/dist/controllers/streamable/streamable.service.js.map +1 -0
  27. package/dist/decorators/capabilities.constants.d.ts +4 -0
  28. package/dist/decorators/capabilities.constants.js +8 -0
  29. package/dist/decorators/capabilities.constants.js.map +1 -0
  30. package/dist/decorators/capabilities.decorators.d.ts +8 -0
  31. package/dist/decorators/capabilities.decorators.js +49 -0
  32. package/dist/decorators/capabilities.decorators.js.map +1 -0
  33. package/dist/decorators/index.d.ts +2 -0
  34. package/dist/decorators/index.js +19 -0
  35. package/dist/decorators/index.js.map +1 -0
  36. package/dist/index.d.ts +4 -0
  37. package/dist/index.js +21 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/interceptors/message.interceptor.d.ts +10 -0
  40. package/dist/interceptors/message.interceptor.js +61 -0
  41. package/dist/interceptors/message.interceptor.js.map +1 -0
  42. package/dist/interfaces/capabilities.interface.d.ts +52 -0
  43. package/dist/interfaces/capabilities.interface.js +3 -0
  44. package/dist/interfaces/capabilities.interface.js.map +1 -0
  45. package/dist/interfaces/context.interface.d.ts +6 -0
  46. package/dist/interfaces/context.interface.js +3 -0
  47. package/dist/interfaces/context.interface.js.map +1 -0
  48. package/dist/interfaces/index.d.ts +2 -0
  49. package/dist/interfaces/index.js +19 -0
  50. package/dist/interfaces/index.js.map +1 -0
  51. package/dist/interfaces/mcp-server-options.interface.d.ts +42 -0
  52. package/dist/interfaces/mcp-server-options.interface.js +3 -0
  53. package/dist/interfaces/mcp-server-options.interface.js.map +1 -0
  54. package/dist/interfaces/message.types.d.ts +8 -0
  55. package/dist/interfaces/message.types.js +3 -0
  56. package/dist/interfaces/message.types.js.map +1 -0
  57. package/dist/mcp.module.d.ts +13 -0
  58. package/dist/mcp.module.js +193 -0
  59. package/dist/mcp.module.js.map +1 -0
  60. package/dist/registry/discovery.service.d.ts +16 -0
  61. package/dist/registry/discovery.service.js +85 -0
  62. package/dist/registry/discovery.service.js.map +1 -0
  63. package/dist/registry/index.d.ts +2 -0
  64. package/dist/registry/index.js +19 -0
  65. package/dist/registry/index.js.map +1 -0
  66. package/dist/registry/logger.service.d.ts +16 -0
  67. package/dist/registry/logger.service.js +97 -0
  68. package/dist/registry/logger.service.js.map +1 -0
  69. package/dist/registry/registry.service.d.ts +16 -0
  70. package/dist/registry/registry.service.js +170 -0
  71. package/dist/registry/registry.service.js.map +1 -0
  72. package/dist/services/message.service.d.ts +7 -0
  73. package/dist/services/message.service.js +25 -0
  74. package/dist/services/message.service.js.map +1 -0
  75. package/dist/tsconfig.build.tsbuildinfo +1 -0
  76. package/eslint.config.mjs +40 -0
  77. package/package.json +109 -0
  78. package/src/controllers/sse/index.ts +2 -0
  79. package/src/controllers/sse/sse.controller.ts +25 -0
  80. package/src/controllers/sse/sse.service.ts +90 -0
  81. package/src/controllers/streamable/index.ts +2 -0
  82. package/src/controllers/streamable/streamable.controller.ts +24 -0
  83. package/src/controllers/streamable/streamable.service.ts +169 -0
  84. package/src/decorators/capabilities.constants.ts +7 -0
  85. package/src/decorators/capabilities.decorators.ts +150 -0
  86. package/src/decorators/index.ts +2 -0
  87. package/src/index.ts +11 -0
  88. package/src/interceptors/message.interceptor.ts +70 -0
  89. package/src/interfaces/capabilities.interface.ts +95 -0
  90. package/src/interfaces/context.interface.ts +18 -0
  91. package/src/interfaces/index.ts +2 -0
  92. package/src/interfaces/mcp-server-options.interface.ts +105 -0
  93. package/src/interfaces/message.types.ts +13 -0
  94. package/src/mcp.module.ts +250 -0
  95. package/src/mcp.service.spec.ts +28 -0
  96. package/src/registry/discovery.service.ts +116 -0
  97. package/src/registry/index.ts +2 -0
  98. package/src/registry/logger.service.ts +143 -0
  99. package/src/registry/registry.service.ts +282 -0
  100. package/src/services/message.service.ts +18 -0
@@ -0,0 +1,78 @@
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 logger_service_1 = require("../../registry/logger.service");
20
+ const registry_service_1 = require("../../registry/registry.service");
21
+ let SseService = class SseService {
22
+ options;
23
+ registry;
24
+ logger;
25
+ server;
26
+ transports = {};
27
+ constructor(options, registry, logger) {
28
+ this.options = options;
29
+ this.registry = registry;
30
+ this.logger = logger;
31
+ this.server = new mcp_js_1.McpServer(this.options.serverInfo, this.options.options);
32
+ }
33
+ async onModuleInit() {
34
+ this.logger.log('Starting MCP controller registration', 'MCP_SERVER');
35
+ await this.registry.registerAll(this.server);
36
+ this.logger.log('MCP initialization completed', 'MCP_SERVER');
37
+ }
38
+ async handleSse(req, res) {
39
+ const transport = new sse_js_1.SSEServerTransport('/messages', res);
40
+ this.transports[transport.sessionId] = transport;
41
+ this.logger.debug(`Starting SSE for sessionId: ${transport.sessionId}`, 'api');
42
+ res.on('close', () => {
43
+ delete this.transports[transport.sessionId];
44
+ });
45
+ await this.server.connect(transport);
46
+ }
47
+ async handleMessage(req, res) {
48
+ const sessionId = req.query.sessionId;
49
+ const transport = this.transports[sessionId];
50
+ this.logger.debug(`Receiving SSE message for sessionId: ${sessionId}`, 'api');
51
+ this.logger.debug(`SSE message: ${JSON.stringify(req.body)}`, 'MCP_SERVER');
52
+ try {
53
+ if (transport) {
54
+ await transport.handlePostMessage(req, res, req.body);
55
+ }
56
+ else {
57
+ res.status(400).send('No transport found for sessionId');
58
+ }
59
+ }
60
+ catch (error) {
61
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
62
+ this.logger.error('Error al manejar mensaje SSE', errorMessage, 'MCP_SERVER');
63
+ res.status(500).send({
64
+ statusCode: 500,
65
+ error: 'Internal Server Error',
66
+ message: errorMessage,
67
+ });
68
+ }
69
+ }
70
+ };
71
+ exports.SseService = SseService;
72
+ exports.SseService = SseService = __decorate([
73
+ (0, common_1.Injectable)(),
74
+ __param(0, (0, common_1.Inject)('MCP_SERVER_OPTIONS')),
75
+ __metadata("design:paramtypes", [Object, registry_service_1.RegistryService,
76
+ logger_service_1.McpLoggerService])
77
+ ], SseService);
78
+ //# sourceMappingURL=sse.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.service.js","sourceRoot":"","sources":["../../../src/controllers/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/controllers/streamable/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0DAAwC;AACxC,uDAAqC"}
@@ -0,0 +1,9 @@
1
+ import { Request, Response } from 'express';
2
+ import { StreamableService } from './streamable.service';
3
+ export declare class StreamableController {
4
+ private readonly service;
5
+ constructor(service: StreamableService);
6
+ handleMcpPost(req: Request, res: Response): Promise<void>;
7
+ handleMcpGet(req: Request, res: Response): Promise<void>;
8
+ handleMcpDelete(req: Request, res: Response): Promise<void>;
9
+ }
@@ -0,0 +1,62 @@
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
+ const common_1 = require("@nestjs/common");
17
+ const streamable_service_1 = require("./streamable.service");
18
+ let StreamableController = class StreamableController {
19
+ service;
20
+ constructor(service) {
21
+ this.service = service;
22
+ }
23
+ async handleMcpPost(req, res) {
24
+ await this.service.handlePostRequest(req, res);
25
+ }
26
+ async handleMcpGet(req, res) {
27
+ await this.service.handleGetRequest(req, res);
28
+ }
29
+ async handleMcpDelete(req, res) {
30
+ await this.service.handleDeleteRequest(req, res);
31
+ }
32
+ };
33
+ exports.StreamableController = StreamableController;
34
+ __decorate([
35
+ (0, common_1.Post)('mcp'),
36
+ __param(0, (0, common_1.Req)()),
37
+ __param(1, (0, common_1.Res)()),
38
+ __metadata("design:type", Function),
39
+ __metadata("design:paramtypes", [Object, Object]),
40
+ __metadata("design:returntype", Promise)
41
+ ], StreamableController.prototype, "handleMcpPost", null);
42
+ __decorate([
43
+ (0, common_1.Get)('mcp'),
44
+ __param(0, (0, common_1.Req)()),
45
+ __param(1, (0, common_1.Res)()),
46
+ __metadata("design:type", Function),
47
+ __metadata("design:paramtypes", [Object, Object]),
48
+ __metadata("design:returntype", Promise)
49
+ ], StreamableController.prototype, "handleMcpGet", null);
50
+ __decorate([
51
+ (0, common_1.Delete)('mcp'),
52
+ __param(0, (0, common_1.Req)()),
53
+ __param(1, (0, common_1.Res)()),
54
+ __metadata("design:type", Function),
55
+ __metadata("design:paramtypes", [Object, Object]),
56
+ __metadata("design:returntype", Promise)
57
+ ], StreamableController.prototype, "handleMcpDelete", null);
58
+ exports.StreamableController = StreamableController = __decorate([
59
+ (0, common_1.Controller)(),
60
+ __metadata("design:paramtypes", [streamable_service_1.StreamableService])
61
+ ], StreamableController);
62
+ //# sourceMappingURL=streamable.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streamable.controller.js","sourceRoot":"","sources":["../../../src/controllers/streamable/streamable.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAyE;AAGzE,6DAAyD;AAGlD,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IACF;IAA7B,YAA6B,OAA0B;QAA1B,YAAO,GAAP,OAAO,CAAmB;IAAG,CAAC;IAGrD,AAAN,KAAK,CAAC,aAAa,CAAQ,GAAY,EAAS,GAAa;QAC3D,MAAM,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACjD,CAAC;IAGK,AAAN,KAAK,CAAC,YAAY,CAAQ,GAAY,EAAS,GAAa;QAC1D,MAAM,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAChD,CAAC;IAGK,AAAN,KAAK,CAAC,eAAe,CAAQ,GAAY,EAAS,GAAa;QAC7D,MAAM,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACnD,CAAC;CACF,CAAA;AAjBY,oDAAoB;AAIzB;IADL,IAAA,aAAI,EAAC,KAAK,CAAC;IACS,WAAA,IAAA,YAAG,GAAE,CAAA;IAAgB,WAAA,IAAA,YAAG,GAAE,CAAA;;;;yDAE9C;AAGK;IADL,IAAA,YAAG,EAAC,KAAK,CAAC;IACS,WAAA,IAAA,YAAG,GAAE,CAAA;IAAgB,WAAA,IAAA,YAAG,GAAE,CAAA;;;;wDAE7C;AAGK;IADL,IAAA,eAAM,EAAC,KAAK,CAAC;IACS,WAAA,IAAA,YAAG,GAAE,CAAA;IAAgB,WAAA,IAAA,YAAG,GAAE,CAAA;;;;2DAEhD;+BAhBU,oBAAoB;IADhC,IAAA,mBAAU,GAAE;qCAE2B,sCAAiB;GAD5C,oBAAoB,CAiBhC"}
@@ -0,0 +1,24 @@
1
+ import { OnModuleInit } from '@nestjs/common';
2
+ import { Request, Response } from 'express';
3
+ import { McpModuleTransportOptions, McpServerOptions } from '../../interfaces/mcp-server-options.interface';
4
+ import { McpLoggerService } from '../../registry/logger.service';
5
+ import { RegistryService } from '../../registry/registry.service';
6
+ export declare class StreamableService implements OnModuleInit {
7
+ private readonly options;
8
+ private readonly transportOptions;
9
+ private readonly registry;
10
+ private readonly logger;
11
+ private server;
12
+ private transports;
13
+ constructor(options: McpServerOptions, transportOptions: McpModuleTransportOptions, registry: RegistryService, logger: McpLoggerService);
14
+ onModuleInit(): Promise<void>;
15
+ handlePostRequest(req: Request<any, any, any, {
16
+ sessionId?: string;
17
+ }>, res: Response): Promise<void>;
18
+ handleGetRequest(req: Request<any, any, any, {
19
+ sessionId?: string;
20
+ }>, res: Response): Promise<void>;
21
+ handleDeleteRequest(req: Request<any, any, any, {
22
+ sessionId?: string;
23
+ }>, res: Response): Promise<void>;
24
+ }
@@ -0,0 +1,118 @@
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.StreamableService = void 0;
16
+ const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
17
+ const streamableHttp_js_1 = require("@modelcontextprotocol/sdk/server/streamableHttp.js");
18
+ const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
19
+ const common_1 = require("@nestjs/common");
20
+ const crypto_1 = require("crypto");
21
+ const logger_service_1 = require("../../registry/logger.service");
22
+ const registry_service_1 = require("../../registry/registry.service");
23
+ let StreamableService = class StreamableService {
24
+ options;
25
+ transportOptions;
26
+ registry;
27
+ logger;
28
+ server;
29
+ transports = {};
30
+ constructor(options, transportOptions, registry, logger) {
31
+ this.options = options;
32
+ this.transportOptions = transportOptions;
33
+ this.registry = registry;
34
+ this.logger = logger;
35
+ this.server = new mcp_js_1.McpServer(this.options.serverInfo, this.options.options);
36
+ }
37
+ async onModuleInit() {
38
+ await this.registry.registerAll(this.server);
39
+ this.logger.log('MCP STREAMEABLE initialization completed');
40
+ }
41
+ async handlePostRequest(req, res) {
42
+ const sessionId = req.headers['mcp-session-id'];
43
+ let transport;
44
+ const { options } = this.transportOptions?.streamable || {};
45
+ if (sessionId && this.transports[sessionId]) {
46
+ transport = this.transports[sessionId];
47
+ }
48
+ else if (!sessionId && (0, types_js_1.isInitializeRequest)(req.body)) {
49
+ transport = new streamableHttp_js_1.StreamableHTTPServerTransport({
50
+ sessionIdGenerator: () => options?.sessionIdGenerator?.() || (0, crypto_1.randomUUID)(),
51
+ onsessioninitialized: (sessionId) => {
52
+ this.transports[sessionId] = transport;
53
+ },
54
+ enableJsonResponse: options?.enableJsonResponse,
55
+ eventStore: options?.eventStore,
56
+ });
57
+ transport.onclose = () => {
58
+ if (transport.sessionId) {
59
+ delete this.transports[transport.sessionId];
60
+ }
61
+ };
62
+ await this.server.connect(transport);
63
+ }
64
+ else {
65
+ res.status(400).json({
66
+ jsonrpc: '2.0',
67
+ error: {
68
+ code: -32000,
69
+ message: 'Bad Request: No valid session ID provided',
70
+ },
71
+ id: null,
72
+ });
73
+ return;
74
+ }
75
+ await transport.handleRequest(req, res, req.body);
76
+ }
77
+ async handleGetRequest(req, res) {
78
+ const sessionId = req.headers['mcp-session-id'];
79
+ if (!sessionId || !this.transports[sessionId]) {
80
+ res.status(400).send('Invalid or missing session ID');
81
+ return;
82
+ }
83
+ const transport = this.transports[sessionId];
84
+ await transport.handleRequest(req, res);
85
+ }
86
+ async handleDeleteRequest(req, res) {
87
+ const sessionId = req.headers['mcp-session-id'];
88
+ if (!sessionId) {
89
+ res.status(400).json({ error: 'Missing sessionId' });
90
+ return;
91
+ }
92
+ const transport = this.transports[sessionId];
93
+ if (transport) {
94
+ this.logger.debug(`Closing streamable transport for sessionId: ${sessionId}`, 'STREAMABLE');
95
+ await transport.close();
96
+ const uuidV4Regex = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
97
+ if (!uuidV4Regex.test(sessionId)) {
98
+ res.status(400).json({ error: 'Invalid sessionId format' });
99
+ return;
100
+ }
101
+ delete this.transports[sessionId];
102
+ res.status(200).json({ success: true, sessionId });
103
+ }
104
+ else {
105
+ this.logger.debug(`No streamable transport found for sessionId: ${sessionId}`, 'STREAMABLE');
106
+ res.status(404).json({ error: 'Transport not found', sessionId });
107
+ }
108
+ }
109
+ };
110
+ exports.StreamableService = StreamableService;
111
+ exports.StreamableService = StreamableService = __decorate([
112
+ (0, common_1.Injectable)(),
113
+ __param(0, (0, common_1.Inject)('MCP_SERVER_OPTIONS')),
114
+ __param(1, (0, common_1.Inject)('MCP_TRANSPORT_OPTIONS')),
115
+ __metadata("design:paramtypes", [Object, Object, registry_service_1.RegistryService,
116
+ logger_service_1.McpLoggerService])
117
+ ], StreamableService);
118
+ //# sourceMappingURL=streamable.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streamable.service.js","sourceRoot":"","sources":["../../../src/controllers/streamable/streamable.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare const PREFIX = "MCP";
2
+ export declare const MCP_TOOL = "MCP:tool";
3
+ export declare const MCP_PROMPT = "MCP:prompt";
4
+ export declare const MCP_RESOURCE = "MCP:resource";
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MCP_RESOURCE = exports.MCP_PROMPT = exports.MCP_TOOL = exports.PREFIX = void 0;
4
+ exports.PREFIX = 'MCP';
5
+ exports.MCP_TOOL = `${exports.PREFIX}:tool`;
6
+ exports.MCP_PROMPT = `${exports.PREFIX}:prompt`;
7
+ exports.MCP_RESOURCE = `${exports.PREFIX}:resource`;
8
+ //# sourceMappingURL=capabilities.constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.constants.js","sourceRoot":"","sources":["../../src/decorators/capabilities.constants.ts"],"names":[],"mappings":";;;AACa,QAAA,MAAM,GAAG,KAAK,CAAC;AAGf,QAAA,QAAQ,GAAG,GAAG,cAAM,OAAO,CAAC;AAC5B,QAAA,UAAU,GAAG,GAAG,cAAM,SAAS,CAAC;AAChC,QAAA,YAAY,GAAG,GAAG,cAAM,WAAW,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { PromptOptions, ResourceOptions, ToolOptions } from '../interfaces/capabilities.interface';
2
+ export declare const MCP_RESOLVER = "__mcp_resolver__";
3
+ export declare const MCP_GUARDS = "__mcp_guards__";
4
+ export declare function Resolver(workspace?: string): ClassDecorator;
5
+ export declare function UseGuards(...guards: any[]): ClassDecorator & MethodDecorator;
6
+ export declare function Tool(options: ToolOptions): (target: object, propertyKey: string, descriptor: PropertyDescriptor) => PropertyDescriptor;
7
+ export declare function Prompt(options: PromptOptions): (target: object, propertyKey: string, descriptor: PropertyDescriptor) => PropertyDescriptor;
8
+ export declare function Resource(options: ResourceOptions): (target: object, propertyKey: string, descriptor: PropertyDescriptor) => PropertyDescriptor;
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MCP_GUARDS = exports.MCP_RESOLVER = void 0;
4
+ exports.Resolver = Resolver;
5
+ exports.UseGuards = UseGuards;
6
+ exports.Tool = Tool;
7
+ exports.Prompt = Prompt;
8
+ exports.Resource = Resource;
9
+ const common_1 = require("@nestjs/common");
10
+ const capabilities_constants_1 = require("./capabilities.constants");
11
+ exports.MCP_RESOLVER = '__mcp_resolver__';
12
+ exports.MCP_GUARDS = '__mcp_guards__';
13
+ function Resolver(workspace) {
14
+ return function (target) {
15
+ (0, common_1.Injectable)()(target);
16
+ (0, common_1.SetMetadata)(exports.MCP_RESOLVER, workspace || true)(target);
17
+ };
18
+ }
19
+ function UseGuards(...guards) {
20
+ return (0, common_1.SetMetadata)(exports.MCP_GUARDS, guards);
21
+ }
22
+ function Tool(options) {
23
+ return function (target, propertyKey, descriptor) {
24
+ (0, common_1.SetMetadata)(capabilities_constants_1.MCP_TOOL, {
25
+ ...options,
26
+ methodName: propertyKey,
27
+ })(target, propertyKey, descriptor);
28
+ return descriptor;
29
+ };
30
+ }
31
+ function Prompt(options) {
32
+ return function (target, propertyKey, descriptor) {
33
+ (0, common_1.SetMetadata)(capabilities_constants_1.MCP_PROMPT, {
34
+ ...options,
35
+ methodName: propertyKey,
36
+ })(target, propertyKey, descriptor);
37
+ return descriptor;
38
+ };
39
+ }
40
+ function Resource(options) {
41
+ return function (target, propertyKey, descriptor) {
42
+ (0, common_1.SetMetadata)(capabilities_constants_1.MCP_RESOURCE, {
43
+ ...options,
44
+ methodName: propertyKey,
45
+ })(target, propertyKey, descriptor);
46
+ return descriptor;
47
+ };
48
+ }
49
+ //# sourceMappingURL=capabilities.decorators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.decorators.js","sourceRoot":"","sources":["../../src/decorators/capabilities.decorators.ts"],"names":[],"mappings":";;;AA4BA,4BAKC;AAYD,8BAEC;AAkBD,oBAaC;AAqBD,wBAaC;AAyBD,4BAYC;AArJD,2CAAyD;AAOzD,qEAA8E;AAKjE,QAAA,YAAY,GAAG,kBAAkB,CAAC;AAKlC,QAAA,UAAU,GAAG,gBAAgB,CAAC;AAW3C,SAAgB,QAAQ,CAAC,SAAkB;IACzC,OAAO,UAAU,MAAW;QAC1B,IAAA,mBAAU,GAAE,CAAC,MAAM,CAAC,CAAC;QACrB,IAAA,oBAAW,EAAC,oBAAY,EAAE,SAAS,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC;IACvD,CAAC,CAAC;AACJ,CAAC;AAYD,SAAgB,SAAS,CAAC,GAAG,MAAa;IACxC,OAAO,IAAA,oBAAW,EAAC,kBAAU,EAAE,MAAM,CAAC,CAAC;AACzC,CAAC;AAkBD,SAAgB,IAAI,CAAC,OAAoB;IACvC,OAAO,UACL,MAAc,EACd,WAAmB,EACnB,UAA8B;QAE9B,IAAA,oBAAW,EAAC,iCAAQ,EAAE;YACpB,GAAG,OAAO;YACV,UAAU,EAAE,WAAW;SACxB,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;QAEpC,OAAO,UAAU,CAAC;IACpB,CAAC,CAAC;AACJ,CAAC;AAqBD,SAAgB,MAAM,CAAC,OAAsB;IAC3C,OAAO,UACL,MAAc,EACd,WAAmB,EACnB,UAA8B;QAE9B,IAAA,oBAAW,EAAC,mCAAU,EAAE;YACtB,GAAG,OAAO;YACV,UAAU,EAAE,WAAW;SACxB,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;QAEpC,OAAO,UAAU,CAAC;IACpB,CAAC,CAAC;AACJ,CAAC;AAyBD,SAAgB,QAAQ,CAAC,OAAwB;IAC/C,OAAO,UACL,MAAc,EACd,WAAmB,EACnB,UAA8B;QAE9B,IAAA,oBAAW,EAAC,qCAAY,EAAE;YACxB,GAAG,OAAO;YACV,UAAU,EAAE,WAAW;SACxB,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;QACpC,OAAO,UAAU,CAAC;IACpB,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './capabilities.constants';
2
+ export * from './capabilities.decorators';
@@ -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("./capabilities.constants"), exports);
18
+ __exportStar(require("./capabilities.decorators"), exports);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/decorators/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2DAAyC;AACzC,4DAA0C"}
@@ -0,0 +1,4 @@
1
+ export * from './mcp.module';
2
+ export * from './interfaces';
3
+ export * from './registry';
4
+ export * from './decorators';
package/dist/index.js ADDED
@@ -0,0 +1,21 @@
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("./mcp.module"), exports);
18
+ __exportStar(require("./interfaces"), exports);
19
+ __exportStar(require("./registry"), exports);
20
+ __exportStar(require("./decorators"), exports);
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AACA,+CAA6B;AAG7B,+CAA6B;AAG7B,6CAA2B;AAG3B,+CAA6B"}
@@ -0,0 +1,10 @@
1
+ import { CallHandler, ExecutionContext, NestInterceptor } from '@nestjs/common';
2
+ import { Observable } from 'rxjs';
3
+ import { McpLoggerService } from '../registry/logger.service';
4
+ import { MessageService } from '../services/message.service';
5
+ export declare class RequestContextInterceptor implements NestInterceptor {
6
+ private readonly logger;
7
+ private readonly messageService;
8
+ constructor(logger: McpLoggerService, messageService: MessageService);
9
+ intercept(context: ExecutionContext, next: CallHandler): Observable<any>;
10
+ }
@@ -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
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.RequestContextInterceptor = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const logger_service_1 = require("../registry/logger.service");
15
+ const message_service_1 = require("../services/message.service");
16
+ let RequestContextInterceptor = class RequestContextInterceptor {
17
+ logger;
18
+ messageService;
19
+ constructor(logger, messageService) {
20
+ this.logger = logger;
21
+ this.messageService = messageService;
22
+ }
23
+ intercept(context, next) {
24
+ const request = context.switchToHttp().getRequest();
25
+ const response = context.switchToHttp().getResponse();
26
+ let message;
27
+ this.logger.log(`Request path: ${request.path}`, '[RequestContextInterceptor]');
28
+ switch (request.path) {
29
+ case '/sse':
30
+ this.logger.log('SSE connection detected', '[RequestContextInterceptor]');
31
+ message = {
32
+ req: request,
33
+ res: response,
34
+ };
35
+ this.messageService.set(message);
36
+ break;
37
+ case '/messages':
38
+ this.logger.log('SSE message received', '[RequestContextInterceptor]');
39
+ message = {
40
+ req: request,
41
+ res: response,
42
+ };
43
+ this.messageService.set(message);
44
+ break;
45
+ case '/mcp':
46
+ this.logger.log('MCP request detected', '[RequestContextInterceptor]');
47
+ break;
48
+ default:
49
+ this.logger.log(`Regular request: ${request.method} ${request.url}`, '[RequestContextInterceptor]');
50
+ break;
51
+ }
52
+ return next.handle();
53
+ }
54
+ };
55
+ exports.RequestContextInterceptor = RequestContextInterceptor;
56
+ exports.RequestContextInterceptor = RequestContextInterceptor = __decorate([
57
+ (0, common_1.Injectable)(),
58
+ __metadata("design:paramtypes", [logger_service_1.McpLoggerService,
59
+ message_service_1.MessageService])
60
+ ], RequestContextInterceptor);
61
+ //# sourceMappingURL=message.interceptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.interceptor.js","sourceRoot":"","sources":["../../src/interceptors/message.interceptor.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAKwB;AAKxB,+DAA8D;AAC9D,iEAA6D;AAEtD,IAAM,yBAAyB,GAA/B,MAAM,yBAAyB;IAEjB;IACA;IAFnB,YACmB,MAAwB,EACxB,cAA8B;QAD9B,WAAM,GAAN,MAAM,CAAkB;QACxB,mBAAc,GAAd,cAAc,CAAgB;IAC9C,CAAC;IAEJ,SAAS,CAAC,OAAyB,EAAE,IAAiB;QACpD,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAW,CAAC;QAC7D,MAAM,QAAQ,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,WAAW,EAAY,CAAC;QAChE,IAAI,OAA+B,CAAC;QAEpC,IAAI,CAAC,MAAM,CAAC,GAAG,CACb,iBAAiB,OAAO,CAAC,IAAI,EAAE,EAC/B,6BAA6B,CAC9B,CAAC;QAEF,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;YACrB,KAAK,MAAM;gBACT,IAAI,CAAC,MAAM,CAAC,GAAG,CACb,yBAAyB,EACzB,6BAA6B,CAC9B,CAAC;gBAEF,OAAO,GAAG;oBACR,GAAG,EAAE,OAAO;oBACZ,GAAG,EAAE,QAAQ;iBACd,CAAC;gBAEF,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAEjC,MAAM;YACR,KAAK,WAAW;gBACd,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,sBAAsB,EAAE,6BAA6B,CAAC,CAAC;gBAEvE,OAAO,GAAG;oBACR,GAAG,EAAE,OAAO;oBACZ,GAAG,EAAE,QAAQ;iBACd,CAAC;gBAEF,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAEjC,MAAM;YACR,KAAK,MAAM;gBACT,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,sBAAsB,EAAE,6BAA6B,CAAC,CAAC;gBAEvE,MAAM;YACR;gBACE,IAAI,CAAC,MAAM,CAAC,GAAG,CACb,oBAAoB,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,EACnD,6BAA6B,CAC9B,CAAC;gBACF,MAAM;QACV,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;IACvB,CAAC;CACF,CAAA;AAxDY,8DAAyB;oCAAzB,yBAAyB;IADrC,IAAA,mBAAU,GAAE;qCAGgB,iCAAgB;QACR,gCAAc;GAHtC,yBAAyB,CAwDrC"}
@@ -0,0 +1,52 @@
1
+ import { CompleteResourceTemplateCallback, ListResourcesCallback } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { ZodOptional, ZodRawShape, ZodType, ZodTypeDef } from 'zod';
3
+ export interface ResourceBaseOptions {
4
+ name: string;
5
+ }
6
+ export interface ResourceUriOptions extends ResourceBaseOptions {
7
+ uri: string;
8
+ }
9
+ export interface ResourceUriWithMetadataOptions extends ResourceUriOptions {
10
+ metadata: Record<string, any>;
11
+ }
12
+ export interface ResourceTemplateOptions extends ResourceBaseOptions {
13
+ template: string;
14
+ }
15
+ export interface ResourceTemplateWithMetadataOptions extends ResourceTemplateOptions {
16
+ metadata: Record<string, any>;
17
+ }
18
+ export type ResourceOptions = ResourceUriOptions | ResourceUriWithMetadataOptions | ResourceTemplateOptions | ResourceTemplateWithMetadataOptions;
19
+ export interface ToolNameOptions {
20
+ name: string;
21
+ }
22
+ export interface ToolWithDescriptionOptions extends ToolNameOptions {
23
+ description: string;
24
+ }
25
+ export interface ToolWithParamSchemaOptions extends ToolNameOptions {
26
+ paramSchema: ZodRawShape;
27
+ }
28
+ export interface ToolWithDescriptionAndParamSchemaOptions extends ToolWithDescriptionOptions, ToolWithParamSchemaOptions {
29
+ }
30
+ export type ToolOptions = ToolNameOptions | ToolWithDescriptionOptions | ToolWithParamSchemaOptions | ToolWithDescriptionAndParamSchemaOptions;
31
+ export interface PromptBaseOptions {
32
+ name: string;
33
+ }
34
+ export interface PromptWithDescriptionOptions extends PromptBaseOptions {
35
+ description: string;
36
+ }
37
+ type PromptArgsRawShape = {
38
+ [k: string]: ZodType<string, ZodTypeDef, string> | ZodOptional<ZodType<string, ZodTypeDef, string>>;
39
+ };
40
+ export interface PromptWithArgsSchemaOptions extends PromptBaseOptions {
41
+ argsSchema: PromptArgsRawShape;
42
+ }
43
+ export interface PromptWithDescriptionAndArgsSchemaOptions extends PromptWithDescriptionOptions, PromptWithArgsSchemaOptions {
44
+ }
45
+ export type PromptOptions = PromptBaseOptions | PromptWithDescriptionOptions | PromptWithArgsSchemaOptions | PromptWithDescriptionAndArgsSchemaOptions;
46
+ export interface TemplateCallbacks {
47
+ list: ListResourcesCallback | undefined;
48
+ complete?: {
49
+ [variable: string]: CompleteResourceTemplateCallback;
50
+ };
51
+ }
52
+ export {};
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=capabilities.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.interface.js","sourceRoot":"","sources":["../../src/interfaces/capabilities.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ import { ExecutionContext } from '@nestjs/common';
2
+ import { McpMessage } from './message.types';
3
+ export interface McpExecutionContext extends ExecutionContext {
4
+ args: unknown[];
5
+ message: McpMessage | undefined;
6
+ }