@nestjs-mcp/server 0.1.1 → 0.2.0-alpha.1

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 (106) hide show
  1. package/README.md +66 -0
  2. package/dist/controllers/sse/sse.controller.d.ts +3 -1
  3. package/dist/controllers/sse/sse.controller.js +8 -2
  4. package/dist/controllers/sse/sse.controller.js.map +1 -1
  5. package/dist/controllers/sse/sse.service.d.ts +3 -2
  6. package/dist/controllers/sse/sse.service.js +21 -6
  7. package/dist/controllers/sse/sse.service.js.map +1 -1
  8. package/dist/controllers/streamable/streamable.service.d.ts +6 -11
  9. package/dist/controllers/streamable/streamable.service.js +36 -11
  10. package/dist/controllers/streamable/streamable.service.js.map +1 -1
  11. package/dist/index.d.ts +1 -0
  12. package/dist/index.js +1 -0
  13. package/dist/index.js.map +1 -1
  14. package/dist/interfaces/capabilities.interface.d.ts +32 -2
  15. package/dist/interfaces/capabilities.interface.js +51 -0
  16. package/dist/interfaces/capabilities.interface.js.map +1 -1
  17. package/dist/interfaces/context.interface.d.ts +6 -0
  18. package/dist/interfaces/context.interface.js +3 -0
  19. package/dist/interfaces/context.interface.js.map +1 -0
  20. package/dist/interfaces/index.d.ts +2 -1
  21. package/dist/interfaces/index.js +2 -1
  22. package/dist/interfaces/index.js.map +1 -1
  23. package/dist/interfaces/mcp-server-options.interface.d.ts +2 -2
  24. package/dist/interfaces/message.types.d.ts +8 -0
  25. package/dist/interfaces/{guards.interface.js → message.types.js} +1 -1
  26. package/dist/interfaces/message.types.js.map +1 -0
  27. package/dist/mcp.module.js +13 -1
  28. package/dist/mcp.module.js.map +1 -1
  29. package/dist/registry/registry.service.d.ts +7 -1
  30. package/dist/registry/registry.service.js +72 -6
  31. package/dist/registry/registry.service.js.map +1 -1
  32. package/dist/services/index.d.ts +1 -0
  33. package/dist/services/index.js +18 -0
  34. package/dist/services/index.js.map +1 -0
  35. package/dist/services/session.manager.d.ts +14 -0
  36. package/dist/services/session.manager.js +27 -0
  37. package/dist/services/session.manager.js.map +1 -0
  38. package/dist/tsconfig.build.tsbuildinfo +1 -1
  39. package/package.json +23 -16
  40. package/.copilotignore +0 -38
  41. package/.devcontainer/Dockerfile.dev +0 -28
  42. package/.devcontainer/devcontainer.json +0 -56
  43. package/.devcontainer/docker-compose.yml +0 -15
  44. package/.dockerignore +0 -37
  45. package/.prettierrc +0 -4
  46. package/coverage/clover.xml +0 -507
  47. package/coverage/coverage-final.json +0 -19
  48. package/coverage/lcov-report/base.css +0 -224
  49. package/coverage/lcov-report/block-navigation.js +0 -87
  50. package/coverage/lcov-report/favicon.png +0 -0
  51. package/coverage/lcov-report/index.html +0 -206
  52. package/coverage/lcov-report/prettify.css +0 -1
  53. package/coverage/lcov-report/prettify.js +0 -2
  54. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  55. package/coverage/lcov-report/sorter.js +0 -196
  56. package/coverage/lcov-report/src/controllers/sse/index.html +0 -146
  57. package/coverage/lcov-report/src/controllers/sse/index.ts.html +0 -91
  58. package/coverage/lcov-report/src/controllers/sse/sse.controller.ts.html +0 -160
  59. package/coverage/lcov-report/src/controllers/sse/sse.service.ts.html +0 -403
  60. package/coverage/lcov-report/src/controllers/streamable/index.html +0 -146
  61. package/coverage/lcov-report/src/controllers/streamable/index.ts.html +0 -91
  62. package/coverage/lcov-report/src/controllers/streamable/streamable.controller.ts.html +0 -157
  63. package/coverage/lcov-report/src/controllers/streamable/streamable.service.ts.html +0 -655
  64. package/coverage/lcov-report/src/decorators/capabilities.constants.ts.html +0 -106
  65. package/coverage/lcov-report/src/decorators/capabilities.decorators.ts.html +0 -535
  66. package/coverage/lcov-report/src/decorators/index.html +0 -146
  67. package/coverage/lcov-report/src/decorators/index.ts.html +0 -91
  68. package/coverage/lcov-report/src/index.html +0 -131
  69. package/coverage/lcov-report/src/index.ts.html +0 -118
  70. package/coverage/lcov-report/src/interfaces/capabilities.interface.ts.html +0 -703
  71. package/coverage/lcov-report/src/interfaces/index.html +0 -131
  72. package/coverage/lcov-report/src/interfaces/index.ts.html +0 -91
  73. package/coverage/lcov-report/src/mcp.module.ts.html +0 -817
  74. package/coverage/lcov-report/src/registry/discovery.service.ts.html +0 -433
  75. package/coverage/lcov-report/src/registry/index.html +0 -161
  76. package/coverage/lcov-report/src/registry/index.ts.html +0 -91
  77. package/coverage/lcov-report/src/registry/logger.service.ts.html +0 -514
  78. package/coverage/lcov-report/src/registry/registry.service.ts.html +0 -1183
  79. package/coverage/lcov-report/src/services/index.html +0 -116
  80. package/coverage/lcov-report/src/services/session.manager.ts.html +0 -163
  81. package/coverage/lcov.info +0 -912
  82. package/dist/interfaces/guards.interface.d.ts +0 -4
  83. package/dist/interfaces/guards.interface.js.map +0 -1
  84. package/eslint.config.mjs +0 -40
  85. package/src/controllers/sse/index.ts +0 -2
  86. package/src/controllers/sse/sse.controller.ts +0 -25
  87. package/src/controllers/sse/sse.service.ts +0 -106
  88. package/src/controllers/streamable/index.ts +0 -2
  89. package/src/controllers/streamable/streamable.controller.ts +0 -24
  90. package/src/controllers/streamable/streamable.service.ts +0 -190
  91. package/src/decorators/capabilities.constants.ts +0 -7
  92. package/src/decorators/capabilities.decorators.ts +0 -150
  93. package/src/decorators/index.ts +0 -2
  94. package/src/index.ts +0 -11
  95. package/src/interfaces/capabilities.interface.ts +0 -206
  96. package/src/interfaces/context.interface.ts +0 -33
  97. package/src/interfaces/index.ts +0 -2
  98. package/src/interfaces/mcp-server-options.interface.ts +0 -105
  99. package/src/interfaces/message.types.ts +0 -13
  100. package/src/mcp.module.ts +0 -244
  101. package/src/mcp.service.spec.ts +0 -28
  102. package/src/registry/discovery.service.ts +0 -116
  103. package/src/registry/index.ts +0 -2
  104. package/src/registry/logger.service.ts +0 -143
  105. package/src/registry/registry.service.ts +0 -366
  106. package/src/services/session.manager.ts +0 -26
package/README.md CHANGED
@@ -8,6 +8,7 @@
8
8
  [![Known Vulnerabilities](https://snyk.io/test/github/adrian-d-hidalgo/nestjs-mcp-server/badge.svg)](https://snyk.io/test/github/adrian-d-hidalgo/nestjs-mcp-server)
9
9
  [![MIT License](https://img.shields.io/badge/license-MIT-green.svg)](./LICENSE)
10
10
  [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](./CONTRIBUTING.md)
11
+ [![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](CODE_OF_CONDUCT.md)
11
12
 
12
13
  ---
13
14
 
@@ -40,6 +41,7 @@
40
41
  - [Prompt Decorator](#prompt-decorator)
41
42
  - [Resource Decorator](#resource-decorator)
42
43
  - [Tool Decorator](#tool-decorator)
44
+ - [RequestHandlerExtra Parameter](#requesthandlerextra-argument)
43
45
  - [Guards](#guards)
44
46
  - [Global-level guards](#global-level-guards)
45
47
  - [Resolver-level guards](#resolver-level-guards)
@@ -496,6 +498,68 @@ export class MyTools {
496
498
  }
497
499
  ```
498
500
 
501
+ ### RequestHandlerExtra Argument
502
+
503
+ All MCP capability methods (`@Prompt`, `@Resource`, `@Tool`) always receive a `RequestHandlerExtra` object as their last parameter. This object extends the original type from `@modelcontextprotocol/sdk` and provides essential context about the current MCP request.
504
+
505
+ **Properties from SDK:**
506
+
507
+ - `signal`: An `AbortSignal` used to communicate if the request was cancelled
508
+ - `authInfo`: Optional information about a validated access token
509
+ - `sessionId`: The session ID from the transport, if available
510
+ - `sendNotification`: Function to send a notification related to the current request
511
+ - `sendRequest`: Function to send a request related to the current request
512
+
513
+ **Extended Properties:**
514
+
515
+ - `headers`: HTTP headers from the original request (added by @nestjs-mcp/server)
516
+
517
+ **Usage Example:**
518
+
519
+ ```ts
520
+ import { Tool, Resolver, SessionManager } from '@nestjs-mcp/server';
521
+ import { RequestHandlerExtra } from '@nestjs-mcp/server';
522
+ import { CallToolResult } from '@modelcontextprotocol/sdk/types';
523
+
524
+ @Resolver('auth')
525
+ export class AuthResolver {
526
+ @Tool({
527
+ name: 'authenticate_user',
528
+ description: 'Authenticates a user with credentials',
529
+ // ...other options
530
+ })
531
+ authenticateUser(
532
+ params: { username: string; password: string },
533
+ extra: RequestHandlerExtra, // Always the last parameter
534
+ ): CallToolResult {
535
+ // Access the session ID
536
+ console.log(`Request received in session: ${extra.sessionId}`);
537
+
538
+ // Access request headers (extended property)
539
+ const authHeader = extra.headers.authorization;
540
+ const userAgent = extra.headers['user-agent'];
541
+ console.log(`Request from: ${userAgent}`);
542
+
543
+ // Check if request was cancelled
544
+ if (extra.signal.aborted) {
545
+ return {
546
+ content: [{ type: 'text', text: 'Request was cancelled' }],
547
+ };
548
+ }
549
+
550
+ // Implement authentication logic
551
+ return {
552
+ content: [{ type: 'text', text: 'Authentication successful' }],
553
+ };
554
+ }
555
+ }
556
+ ```
557
+
558
+ **Important Notes:**
559
+
560
+ - `extra` is always the last parameter in any method decorated with `@Resource`, `@Prompt`, or `@Tool`
561
+ - The `headers` property is an extension added by @nestjs-mcp/server to access HTTP headers directly
562
+
499
563
  ---
500
564
 
501
565
  ## Guards
@@ -856,3 +920,5 @@ MIT — see [LICENSE](./LICENSE) for details.
856
920
  ## Contributions
857
921
 
858
922
  Contributions are welcome! Please see [CONTRIBUTING.md](./CONTRIBUTING.md) for guidelines, reporting issues, and pull request rules.
923
+
924
+ Before contributing, please read our [Code of Conduct](./CODE_OF_CONDUCT.md) to understand the expectations for behavior in our community.
@@ -1,8 +1,10 @@
1
1
  import { Request, Response } from 'express';
2
+ import { McpLoggerService } from '../../registry/logger.service';
2
3
  import { SseService } from './sse.service';
3
4
  export declare class SseController {
5
+ private readonly logger;
4
6
  private readonly service;
5
- constructor(service: SseService);
7
+ constructor(logger: McpLoggerService, service: SseService);
6
8
  handleSse(req: Request, res: Response): Promise<void>;
7
9
  handleMessages(req: Request, res: Response): Promise<void>;
8
10
  }
@@ -14,16 +14,21 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.SseController = void 0;
16
16
  const common_1 = require("@nestjs/common");
17
+ const logger_service_1 = require("../../registry/logger.service");
17
18
  const sse_service_1 = require("./sse.service");
18
19
  let SseController = class SseController {
20
+ logger;
19
21
  service;
20
- constructor(service) {
22
+ constructor(logger, service) {
23
+ this.logger = logger;
21
24
  this.service = service;
22
25
  }
23
26
  async handleSse(req, res) {
27
+ this.logger.log('[SSE] Connection established');
24
28
  await this.service.handleSse(req, res);
25
29
  }
26
30
  async handleMessages(req, res) {
31
+ this.logger.log('[SSE] Message received');
27
32
  await this.service.handleMessage(req, res);
28
33
  }
29
34
  };
@@ -46,6 +51,7 @@ __decorate([
46
51
  ], SseController.prototype, "handleMessages", null);
47
52
  exports.SseController = SseController = __decorate([
48
53
  (0, common_1.Controller)(),
49
- __metadata("design:paramtypes", [sse_service_1.SseService])
54
+ __metadata("design:paramtypes", [logger_service_1.McpLoggerService,
55
+ sse_service_1.SseService])
50
56
  ], SseController);
51
57
  //# sourceMappingURL=sse.controller.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sse.controller.js","sourceRoot":"","sources":["../../../src/controllers/sse/sse.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAiE;AAGjE,+CAA2C;AAGpC,IAAM,aAAa,GAAnB,MAAM,aAAa;IACK;IAA7B,YAA6B,OAAmB;QAAnB,YAAO,GAAP,OAAO,CAAY;IAAG,CAAC;IAG9C,AAAN,KAAK,CAAC,SAAS,CAAQ,GAAY,EAAS,GAAa;QACvD,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACzC,CAAC;IAGK,AAAN,KAAK,CAAC,cAAc,CAAQ,GAAY,EAAS,GAAa;QAC5D,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC7C,CAAC;CACF,CAAA;AAZY,sCAAa;AAIlB;IADL,IAAA,YAAG,EAAC,KAAK,CAAC;IACM,WAAA,IAAA,YAAG,GAAE,CAAA;IAAgB,WAAA,IAAA,YAAG,GAAE,CAAA;;;;8CAE1C;AAGK;IADL,IAAA,aAAI,EAAC,UAAU,CAAC;IACK,WAAA,IAAA,YAAG,GAAE,CAAA;IAAgB,WAAA,IAAA,YAAG,GAAE,CAAA;;;;mDAE/C;wBAXU,aAAa;IADzB,IAAA,mBAAU,GAAE;qCAE2B,wBAAU;GADrC,aAAa,CAYzB"}
1
+ {"version":3,"file":"sse.controller.js","sourceRoot":"","sources":["../../../src/controllers/sse/sse.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAiE;AAGjE,kEAAiE;AACjE,+CAA2C;AAGpC,IAAM,aAAa,GAAnB,MAAM,aAAa;IAEL;IACA;IAFnB,YACmB,MAAwB,EACxB,OAAmB;QADnB,WAAM,GAAN,MAAM,CAAkB;QACxB,YAAO,GAAP,OAAO,CAAY;IACnC,CAAC;IAGE,AAAN,KAAK,CAAC,SAAS,CAAQ,GAAY,EAAS,GAAa;QACvD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAChD,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACzC,CAAC;IAGK,AAAN,KAAK,CAAC,cAAc,CAAQ,GAAY,EAAS,GAAa;QAC5D,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QAC1C,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC7C,CAAC;CACF,CAAA;AAjBY,sCAAa;AAOlB;IADL,IAAA,YAAG,EAAC,KAAK,CAAC;IACM,WAAA,IAAA,YAAG,GAAE,CAAA;IAAgB,WAAA,IAAA,YAAG,GAAE,CAAA;;;;8CAG1C;AAGK;IADL,IAAA,aAAI,EAAC,UAAU,CAAC;IACK,WAAA,IAAA,YAAG,GAAE,CAAA;IAAgB,WAAA,IAAA,YAAG,GAAE,CAAA;;;;mDAG/C;wBAhBU,aAAa;IADzB,IAAA,mBAAU,GAAE;qCAGgB,iCAAgB;QACf,wBAAU;GAH3B,aAAa,CAiBzB"}
@@ -3,13 +3,14 @@ import { Request, Response } from 'express';
3
3
  import { McpServerOptions } from '../../interfaces/mcp-server-options.interface';
4
4
  import { McpLoggerService } from '../../registry/logger.service';
5
5
  import { RegistryService } from '../../registry/registry.service';
6
+ import { SessionManager } from '../../services/session.manager';
6
7
  export declare class SseService implements OnModuleInit {
7
8
  private readonly options;
8
9
  private readonly registry;
9
10
  private readonly logger;
11
+ private readonly sessionManager;
10
12
  private server;
11
- private transports;
12
- constructor(options: McpServerOptions, registry: RegistryService, logger: McpLoggerService);
13
+ constructor(options: McpServerOptions, registry: RegistryService, logger: McpLoggerService, sessionManager: SessionManager);
13
14
  onModuleInit(): Promise<void>;
14
15
  handleSse(req: Request, res: Response): Promise<void>;
15
16
  handleMessage(req: Request, res: Response): Promise<void>;
@@ -18,16 +18,18 @@ const sse_js_1 = require("@modelcontextprotocol/sdk/server/sse.js");
18
18
  const common_1 = require("@nestjs/common");
19
19
  const logger_service_1 = require("../../registry/logger.service");
20
20
  const registry_service_1 = require("../../registry/registry.service");
21
+ const session_manager_1 = require("../../services/session.manager");
21
22
  let SseService = class SseService {
22
23
  options;
23
24
  registry;
24
25
  logger;
26
+ sessionManager;
25
27
  server;
26
- transports = {};
27
- constructor(options, registry, logger) {
28
+ constructor(options, registry, logger, sessionManager) {
28
29
  this.options = options;
29
30
  this.registry = registry;
30
31
  this.logger = logger;
32
+ this.sessionManager = sessionManager;
31
33
  this.server = new mcp_js_1.McpServer(this.options.serverInfo, this.options.options);
32
34
  }
33
35
  async onModuleInit() {
@@ -37,18 +39,30 @@ let SseService = class SseService {
37
39
  }
38
40
  async handleSse(req, res) {
39
41
  const transport = new sse_js_1.SSEServerTransport('/messages', res);
40
- this.transports[transport.sessionId] = transport;
42
+ this.sessionManager.setSession(transport.sessionId, {
43
+ transport,
44
+ request: req,
45
+ });
41
46
  this.logger.debug(`Starting SSE for sessionId: ${transport.sessionId}`, 'api');
42
47
  res.on('close', () => {
43
- delete this.transports[transport.sessionId];
48
+ this.sessionManager.deleteSession(transport.sessionId);
44
49
  });
45
50
  await this.server.connect(transport);
46
51
  }
47
52
  async handleMessage(req, res) {
48
53
  const sessionId = req.query.sessionId;
49
- const transport = this.transports[sessionId];
54
+ const session = this.sessionManager.getSession(sessionId);
55
+ if (!session) {
56
+ res.status(400).send('Invalid or missing sessionId');
57
+ return;
58
+ }
50
59
  this.logger.debug(`Receiving SSE message for sessionId: ${sessionId}`, 'api');
51
60
  this.logger.debug(`SSE message: ${JSON.stringify(req.body)}`, 'MCP_SERVER');
61
+ const transport = session.transport;
62
+ if (!(transport instanceof sse_js_1.SSEServerTransport)) {
63
+ res.status(400).send('Invalid transport');
64
+ return;
65
+ }
52
66
  try {
53
67
  if (transport) {
54
68
  await transport.handlePostMessage(req, res, req.body);
@@ -73,6 +87,7 @@ exports.SseService = SseService = __decorate([
73
87
  (0, common_1.Injectable)(),
74
88
  __param(0, (0, common_1.Inject)('MCP_SERVER_OPTIONS')),
75
89
  __metadata("design:paramtypes", [Object, registry_service_1.RegistryService,
76
- logger_service_1.McpLoggerService])
90
+ logger_service_1.McpLoggerService,
91
+ session_manager_1.SessionManager])
77
92
  ], SseService);
78
93
  //# sourceMappingURL=sse.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sse.service.js","sourceRoot":"","sources":["../../../src/controllers/sse/sse.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sse.service.js","sourceRoot":"","sources":["../../../src/controllers/sse/sse.service.ts"],"names":[],"mappings":"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"}
@@ -3,22 +3,17 @@ import { Request, Response } from 'express';
3
3
  import { McpModuleTransportOptions, McpServerOptions } from '../../interfaces/mcp-server-options.interface';
4
4
  import { McpLoggerService } from '../../registry/logger.service';
5
5
  import { RegistryService } from '../../registry/registry.service';
6
+ import { SessionManager } from '../../services/session.manager';
6
7
  export declare class StreamableService implements OnModuleInit {
7
8
  private readonly options;
8
9
  private readonly transportOptions;
9
10
  private readonly registry;
10
11
  private readonly logger;
12
+ private readonly sessionManager;
11
13
  private server;
12
- private transports;
13
- constructor(options: McpServerOptions, transportOptions: McpModuleTransportOptions, registry: RegistryService, logger: McpLoggerService);
14
+ constructor(options: McpServerOptions, transportOptions: McpModuleTransportOptions, registry: RegistryService, logger: McpLoggerService, sessionManager: SessionManager);
14
15
  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>;
16
+ handlePostRequest(req: Request, res: Response): Promise<void>;
17
+ handleGetRequest(req: Request, res: Response): Promise<void>;
18
+ handleDeleteRequest(req: Request, res: Response): Promise<void>;
24
19
  }
@@ -20,18 +20,20 @@ const common_1 = require("@nestjs/common");
20
20
  const crypto_1 = require("crypto");
21
21
  const logger_service_1 = require("../../registry/logger.service");
22
22
  const registry_service_1 = require("../../registry/registry.service");
23
+ const session_manager_1 = require("../../services/session.manager");
23
24
  let StreamableService = class StreamableService {
24
25
  options;
25
26
  transportOptions;
26
27
  registry;
27
28
  logger;
29
+ sessionManager;
28
30
  server;
29
- transports = {};
30
- constructor(options, transportOptions, registry, logger) {
31
+ constructor(options, transportOptions, registry, logger, sessionManager) {
31
32
  this.options = options;
32
33
  this.transportOptions = transportOptions;
33
34
  this.registry = registry;
34
35
  this.logger = logger;
36
+ this.sessionManager = sessionManager;
35
37
  this.server = new mcp_js_1.McpServer(this.options.serverInfo, this.options.options);
36
38
  }
37
39
  async onModuleInit() {
@@ -42,23 +44,34 @@ let StreamableService = class StreamableService {
42
44
  const sessionId = req.headers['mcp-session-id'];
43
45
  let transport;
44
46
  const { options } = this.transportOptions?.streamable || {};
45
- if (sessionId && this.transports[sessionId]) {
46
- transport = this.transports[sessionId];
47
+ if (sessionId && this.sessionManager.getSession(sessionId)) {
48
+ const session = this.sessionManager.getSession(sessionId);
49
+ if (!session) {
50
+ throw new Error('Session not found');
51
+ }
52
+ if (!(session.transport instanceof streamableHttp_js_1.StreamableHTTPServerTransport)) {
53
+ throw new Error('Invalid transport');
54
+ }
55
+ transport = session.transport;
47
56
  }
48
57
  else if (!sessionId && (0, types_js_1.isInitializeRequest)(req.body)) {
49
58
  transport = new streamableHttp_js_1.StreamableHTTPServerTransport({
50
59
  sessionIdGenerator: () => options?.sessionIdGenerator?.() || (0, crypto_1.randomUUID)(),
51
60
  onsessioninitialized: (sessionId) => {
52
- this.transports[sessionId] = transport;
61
+ this.sessionManager.setSession(sessionId, {
62
+ transport,
63
+ request: req,
64
+ });
53
65
  },
54
66
  enableJsonResponse: options?.enableJsonResponse,
55
67
  eventStore: options?.eventStore,
56
68
  });
57
69
  transport.onclose = () => {
58
70
  if (transport.sessionId) {
59
- delete this.transports[transport.sessionId];
71
+ this.sessionManager.deleteSession(transport.sessionId);
60
72
  }
61
73
  };
74
+ await this.server.connect(transport);
62
75
  }
63
76
  else {
64
77
  res.status(400).json({
@@ -75,11 +88,18 @@ let StreamableService = class StreamableService {
75
88
  }
76
89
  async handleGetRequest(req, res) {
77
90
  const sessionId = req.headers['mcp-session-id'];
78
- if (!sessionId || !this.transports[sessionId]) {
91
+ if (!sessionId || !this.sessionManager.getSession(sessionId)) {
79
92
  res.status(400).send('Invalid or missing session ID');
80
93
  return;
81
94
  }
82
- const transport = this.transports[sessionId];
95
+ const session = this.sessionManager.getSession(sessionId);
96
+ if (!session) {
97
+ throw new Error('Session not found');
98
+ }
99
+ const { transport } = session;
100
+ if (!(transport instanceof streamableHttp_js_1.StreamableHTTPServerTransport)) {
101
+ throw new Error('Invalid transport');
102
+ }
83
103
  await transport.handleRequest(req, res);
84
104
  }
85
105
  async handleDeleteRequest(req, res) {
@@ -88,7 +108,11 @@ let StreamableService = class StreamableService {
88
108
  res.status(400).json({ error: 'Missing sessionId' });
89
109
  return;
90
110
  }
91
- const transport = this.transports[sessionId];
111
+ const session = this.sessionManager.getSession(sessionId);
112
+ if (!session) {
113
+ throw new Error('Session not found');
114
+ }
115
+ const { transport } = session;
92
116
  if (transport) {
93
117
  this.logger.debug(`Closing streamable transport for sessionId: ${sessionId}`, 'STREAMABLE');
94
118
  await transport.close();
@@ -97,7 +121,7 @@ let StreamableService = class StreamableService {
97
121
  res.status(400).json({ error: 'Invalid sessionId format' });
98
122
  return;
99
123
  }
100
- delete this.transports[sessionId];
124
+ this.sessionManager.deleteSession(sessionId);
101
125
  res.status(200).json({ success: true, sessionId });
102
126
  }
103
127
  else {
@@ -112,6 +136,7 @@ exports.StreamableService = StreamableService = __decorate([
112
136
  __param(0, (0, common_1.Inject)('MCP_SERVER_OPTIONS')),
113
137
  __param(1, (0, common_1.Inject)('MCP_TRANSPORT_OPTIONS')),
114
138
  __metadata("design:paramtypes", [Object, Object, registry_service_1.RegistryService,
115
- logger_service_1.McpLoggerService])
139
+ logger_service_1.McpLoggerService,
140
+ session_manager_1.SessionManager])
116
141
  ], StreamableService);
117
142
  //# sourceMappingURL=streamable.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"streamable.service.js","sourceRoot":"","sources":["../../../src/controllers/streamable/streamable.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"streamable.service.js","sourceRoot":"","sources":["../../../src/controllers/streamable/streamable.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,oEAAoE;AACpE,0FAAmG;AACnG,iEAAyE;AACzE,2CAAkE;AAClE,mCAAoC;AAOpC,kEAAiE;AACjE,sEAAkE;AAClE,oEAAgE;AAIzD,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;IAKT;IAEA;IACA;IACA;IACA;IATX,MAAM,CAAY;IAE1B,YAEmB,OAAyB,EAEzB,gBAA2C,EAC3C,QAAyB,EACzB,MAAwB,EACxB,cAA8B;QAL9B,YAAO,GAAP,OAAO,CAAkB;QAEzB,qBAAgB,GAAhB,gBAAgB,CAA2B;QAC3C,aAAQ,GAAR,QAAQ,CAAiB;QACzB,WAAM,GAAN,MAAM,CAAkB;QACxB,mBAAc,GAAd,cAAc,CAAgB;QAE/C,IAAI,CAAC,MAAM,GAAG,IAAI,kBAAS,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7E,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAE7C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IAYD,KAAK,CAAC,iBAAiB,CAAC,GAAY,EAAE,GAAa;QACjD,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAuB,CAAC;QACtE,IAAI,SAAwC,CAAC;QAE7C,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,gBAAgB,EAAE,UAAU,IAAI,EAAE,CAAC;QAE5D,IAAI,SAAS,IAAI,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YAE1D,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;YACvC,CAAC;YAED,IAAI,CAAC,CAAC,OAAO,CAAC,SAAS,YAAY,iDAA6B,CAAC,EAAE,CAAC;gBAClE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;YACvC,CAAC;YAED,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QAChC,CAAC;aAAM,IAAI,CAAC,SAAS,IAAI,IAAA,8BAAmB,EAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAEvD,SAAS,GAAG,IAAI,iDAA6B,CAAC;gBAC5C,kBAAkB,EAAE,GAAG,EAAE,CACvB,OAAO,EAAE,kBAAkB,EAAE,EAAE,IAAI,IAAA,mBAAU,GAAE;gBACjD,oBAAoB,EAAE,CAAC,SAAS,EAAE,EAAE;oBAClC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,SAAS,EAAE;wBACxC,SAAS;wBACT,OAAO,EAAE,GAAG;qBACb,CAAC,CAAC;gBACL,CAAC;gBACD,kBAAkB,EAAE,OAAO,EAAE,kBAAkB;gBAC/C,UAAU,EAAE,OAAO,EAAE,UAAU;aAChC,CAAC,CAAC;YAEH,SAAS,CAAC,OAAO,GAAG,GAAG,EAAE;gBACvB,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;oBACxB,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;gBACzD,CAAC;YACH,CAAC,CAAC;YAEF,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YAEN,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE;oBACL,IAAI,EAAE,CAAC,KAAK;oBACZ,OAAO,EAAE,2CAA2C;iBACrD;gBACD,EAAE,EAAE,IAAI;aACT,CAAC,CAAC;YAEH,OAAO;QACT,CAAC;QAED,MAAM,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;IACpD,CAAC;IAUD,KAAK,CAAC,gBAAgB,CAAC,GAAY,EAAE,GAAa;QAChD,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAuB,CAAC;QAEtE,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7D,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;YACtD,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAE1D,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACvC,CAAC;QAED,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;QAE9B,IAAI,CAAC,CAAC,SAAS,YAAY,iDAA6B,CAAC,EAAE,CAAC;YAC1D,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACvC,CAAC;QAED,MAAM,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC1C,CAAC;IAYD,KAAK,CAAC,mBAAmB,CAAC,GAAY,EAAE,GAAa;QACnD,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAuB,CAAC;QAEtE,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC;YACrD,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAE1D,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACvC,CAAC;QAED,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;QAE9B,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,+CAA+C,SAAS,EAAE,EAC1D,YAAY,CACb,CAAC;YAEF,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;YAExB,MAAM,WAAW,GACf,wEAAwE,CAAC;YAE3E,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;gBACjC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC,CAAC;gBAC5D,OAAO;YACT,CAAC;YAED,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;YAE7C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QACrD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,gDAAgD,SAAS,EAAE,EAC3D,YAAY,CACb,CAAC;YACF,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,qBAAqB,EAAE,SAAS,EAAE,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;CACF,CAAA;AA5KY,8CAAiB;4BAAjB,iBAAiB;IAD7B,IAAA,mBAAU,GAAE;IAKR,WAAA,IAAA,eAAM,EAAC,oBAAoB,CAAC,CAAA;IAE5B,WAAA,IAAA,eAAM,EAAC,uBAAuB,CAAC,CAAA;qDAEL,kCAAe;QACjB,iCAAgB;QACR,gCAAc;GAVtC,iBAAiB,CA4K7B"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export * from './mcp.module';
2
2
  export * from './interfaces';
3
3
  export * from './registry';
4
+ export * from './services';
4
5
  export * from './decorators';
package/dist/index.js CHANGED
@@ -17,5 +17,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./mcp.module"), exports);
18
18
  __exportStar(require("./interfaces"), exports);
19
19
  __exportStar(require("./registry"), exports);
20
+ __exportStar(require("./services"), exports);
20
21
  __exportStar(require("./decorators"), exports);
21
22
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AACA,+CAA6B;AAG7B,+CAA6B;AAG7B,6CAA2B;AAG3B,+CAA6B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AACA,+CAA6B;AAG7B,+CAA6B;AAG7B,6CAA2B;AAG3B,6CAA2B;AAG3B,+CAA6B"}
@@ -1,5 +1,7 @@
1
- import { CompleteResourceTemplateCallback, ListResourcesCallback } from '@modelcontextprotocol/sdk/server/mcp';
2
- import { ZodOptional, ZodRawShape, ZodType, ZodTypeDef } from 'zod';
1
+ import { CompleteResourceTemplateCallback, ListResourcesCallback } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { RequestHandlerExtra as SdkRequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';
3
+ import { ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types.js';
4
+ import { z, ZodOptional, ZodRawShape, ZodType, ZodTypeAny, ZodTypeDef } from 'zod';
3
5
  export interface ResourceBaseOptions {
4
6
  name: string;
5
7
  }
@@ -49,4 +51,32 @@ export interface TemplateCallbacks {
49
51
  [variable: string]: CompleteResourceTemplateCallback;
50
52
  };
51
53
  }
54
+ export type RequestHandlerExtra = SdkRequestHandlerExtra<ServerRequest, ServerNotification> & {
55
+ headers: Record<string, string>;
56
+ };
57
+ export declare class ResourceUriHandlerParams {
58
+ readonly uri: URL;
59
+ readonly extra: RequestHandlerExtra;
60
+ private constructor();
61
+ static from(uri: URL, extra: RequestHandlerExtra): ResourceUriHandlerParams;
62
+ }
63
+ export declare class ResourceTemplateHandlerParams {
64
+ readonly uri: URL;
65
+ readonly variables?: Record<string, string>;
66
+ readonly extra: RequestHandlerExtra;
67
+ private constructor();
68
+ static from(uri: URL, extra: RequestHandlerExtra, variables?: Record<string, string>): ResourceTemplateHandlerParams;
69
+ }
70
+ export declare class PromptHandlerParams<Args extends PromptArgsRawShape | undefined = undefined> {
71
+ readonly args?: Args extends PromptArgsRawShape ? z.objectOutputType<Args, ZodTypeAny> : undefined;
72
+ readonly extra: RequestHandlerExtra;
73
+ private constructor();
74
+ static from<Args extends PromptArgsRawShape | undefined>(extra: RequestHandlerExtra, args?: Args extends PromptArgsRawShape ? z.objectOutputType<Args, ZodTypeAny> : undefined): PromptHandlerParams<Args>;
75
+ }
76
+ export declare class ToolHandlerParams<Args extends ZodRawShape | undefined = undefined> {
77
+ readonly args?: Args extends ZodRawShape ? z.objectOutputType<Args, ZodTypeAny> : undefined;
78
+ readonly extra: RequestHandlerExtra;
79
+ private constructor();
80
+ static from<Args extends ZodRawShape | undefined>(extra: RequestHandlerExtra, args?: Args extends ZodRawShape ? z.objectOutputType<Args, ZodTypeAny> : undefined): ToolHandlerParams<Args>;
81
+ }
52
82
  export {};
@@ -1,3 +1,54 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ToolHandlerParams = exports.PromptHandlerParams = exports.ResourceTemplateHandlerParams = exports.ResourceUriHandlerParams = void 0;
4
+ class ResourceUriHandlerParams {
5
+ uri;
6
+ extra;
7
+ constructor(uri, extra) {
8
+ this.uri = uri;
9
+ this.extra = extra;
10
+ }
11
+ static from(uri, extra) {
12
+ return new ResourceUriHandlerParams(uri, extra);
13
+ }
14
+ }
15
+ exports.ResourceUriHandlerParams = ResourceUriHandlerParams;
16
+ class ResourceTemplateHandlerParams {
17
+ uri;
18
+ variables;
19
+ extra;
20
+ constructor(uri, extra, variables) {
21
+ this.uri = uri;
22
+ this.extra = extra;
23
+ this.variables = variables;
24
+ }
25
+ static from(uri, extra, variables) {
26
+ return new ResourceTemplateHandlerParams(uri, extra, variables);
27
+ }
28
+ }
29
+ exports.ResourceTemplateHandlerParams = ResourceTemplateHandlerParams;
30
+ class PromptHandlerParams {
31
+ args;
32
+ extra;
33
+ constructor(extra, args) {
34
+ this.extra = extra;
35
+ this.args = args;
36
+ }
37
+ static from(extra, args) {
38
+ return new PromptHandlerParams(extra, args);
39
+ }
40
+ }
41
+ exports.PromptHandlerParams = PromptHandlerParams;
42
+ class ToolHandlerParams {
43
+ args;
44
+ extra;
45
+ constructor(extra, args) {
46
+ this.extra = extra;
47
+ this.args = args;
48
+ }
49
+ static from(extra, args) {
50
+ return new ToolHandlerParams(extra, args);
51
+ }
52
+ }
53
+ exports.ToolHandlerParams = ToolHandlerParams;
3
54
  //# sourceMappingURL=capabilities.interface.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"capabilities.interface.js","sourceRoot":"","sources":["../../src/interfaces/capabilities.interface.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"capabilities.interface.js","sourceRoot":"","sources":["../../src/interfaces/capabilities.interface.ts"],"names":[],"mappings":";;;AAmHA,MAAa,wBAAwB;IACnB,GAAG,CAAM;IACT,KAAK,CAAsB;IAE3C,YAAoB,GAAQ,EAAE,KAA0B;QACtD,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,GAAQ,EAAE,KAA0B;QAC9C,OAAO,IAAI,wBAAwB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAClD,CAAC;CACF;AAZD,4DAYC;AAED,MAAa,6BAA6B;IACxB,GAAG,CAAM;IACT,SAAS,CAA0B;IACnC,KAAK,CAAsB;IAE3C,YACE,GAAQ,EACR,KAA0B,EAC1B,SAAkC;QAElC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,MAAM,CAAC,IAAI,CACT,GAAQ,EACR,KAA0B,EAC1B,SAAkC;QAElC,OAAO,IAAI,6BAA6B,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IAClE,CAAC;CACF;AAtBD,sEAsBC;AAED,MAAa,mBAAmB;IAGd,IAAI,CAEN;IACE,KAAK,CAAsB;IAE3C,YACE,KAA0B,EAC1B,IAEa;QAEb,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,MAAM,CAAC,IAAI,CACT,KAA0B,EAC1B,IAEa;QAEb,OAAO,IAAI,mBAAmB,CAAO,KAAK,EAAE,IAAI,CAAC,CAAC;IACpD,CAAC;CACF;AA1BD,kDA0BC;AAED,MAAa,iBAAiB;IAGZ,IAAI,CAEN;IACE,KAAK,CAAsB;IAE3C,YACE,KAA0B,EAC1B,IAEa;QAEb,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,MAAM,CAAC,IAAI,CACT,KAA0B,EAC1B,IAEa;QAEb,OAAO,IAAI,iBAAiB,CAAO,KAAK,EAAE,IAAI,CAAC,CAAC;IAClD,CAAC;CACF;AA1BD,8CA0BC"}
@@ -0,0 +1,6 @@
1
+ import { ExecutionContext } from '@nestjs/common';
2
+ import { PromptHandlerParams, ResourceTemplateHandlerParams, ResourceUriHandlerParams, ToolHandlerParams } from './capabilities.interface';
3
+ export interface McpExecutionContext extends ExecutionContext {
4
+ args: ResourceUriHandlerParams | ResourceTemplateHandlerParams | PromptHandlerParams | ToolHandlerParams;
5
+ getSessionId: () => string;
6
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=context.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.interface.js","sourceRoot":"","sources":["../../src/interfaces/context.interface.ts"],"names":[],"mappings":""}
@@ -1,2 +1,3 @@
1
- export * from './guards.interface';
1
+ export * from './capabilities.interface';
2
+ export * from './context.interface';
2
3
  export * from './mcp-server-options.interface';
@@ -14,6 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./guards.interface"), exports);
17
+ __exportStar(require("./capabilities.interface"), exports);
18
+ __exportStar(require("./context.interface"), exports);
18
19
  __exportStar(require("./mcp-server-options.interface"), exports);
19
20
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/interfaces/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,qDAAmC;AACnC,iEAA+C"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/interfaces/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2DAAyC;AACzC,sDAAoC;AACpC,iEAA+C"}
@@ -1,6 +1,6 @@
1
1
  import { StreamableHTTPServerTransportOptions } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
2
- import { ProtocolOptions } from '@modelcontextprotocol/sdk/shared/protocol';
3
- import { Implementation, ServerCapabilities } from '@modelcontextprotocol/sdk/types';
2
+ import { ProtocolOptions } from '@modelcontextprotocol/sdk/shared/protocol.js';
3
+ import { Implementation, ServerCapabilities } from '@modelcontextprotocol/sdk/types.js';
4
4
  import { Provider, Type } from '@nestjs/common';
5
5
  export type ServerOptions = {
6
6
  instructions?: string;
@@ -0,0 +1,8 @@
1
+ import { Request as ExpressRequest, Response as ExpressResponse } from 'express';
2
+ export type Request = ExpressRequest & {
3
+ auth?: any;
4
+ };
5
+ export type McpMessage = {
6
+ req: Request;
7
+ res: ExpressResponse;
8
+ };
@@ -1,3 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=guards.interface.js.map
3
+ //# sourceMappingURL=message.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.types.js","sourceRoot":"","sources":["../../src/interfaces/message.types.ts"],"names":[],"mappings":""}
@@ -10,11 +10,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
10
10
  exports.McpModule = void 0;
11
11
  const common_1 = require("@nestjs/common");
12
12
  const core_1 = require("@nestjs/core");
13
+ const async_hooks_1 = require("async_hooks");
13
14
  const sse_1 = require("./controllers/sse");
14
15
  const streamable_1 = require("./controllers/streamable");
15
16
  const discovery_service_1 = require("./registry/discovery.service");
16
17
  const logger_service_1 = require("./registry/logger.service");
17
18
  const registry_service_1 = require("./registry/registry.service");
19
+ const session_manager_1 = require("./services/session.manager");
18
20
  let McpModule = McpModule_1 = class McpModule {
19
21
  static getActiveTransportControllersAndProviders(transports) {
20
22
  const controllers = new Set();
@@ -170,7 +172,17 @@ exports.McpModule = McpModule;
170
172
  exports.McpModule = McpModule = McpModule_1 = __decorate([
171
173
  (0, common_1.Module)({
172
174
  imports: [core_1.DiscoveryModule],
173
- providers: [registry_service_1.RegistryService, discovery_service_1.DiscoveryService, logger_service_1.McpLoggerService],
175
+ providers: [
176
+ registry_service_1.RegistryService,
177
+ discovery_service_1.DiscoveryService,
178
+ {
179
+ provide: async_hooks_1.AsyncLocalStorage,
180
+ useValue: new async_hooks_1.AsyncLocalStorage(),
181
+ },
182
+ logger_service_1.McpLoggerService,
183
+ session_manager_1.SessionManager,
184
+ ],
185
+ exports: [session_manager_1.SessionManager],
174
186
  })
175
187
  ], McpModule);
176
188
  //# sourceMappingURL=mcp.module.js.map