@rekog/mcp-nest 1.9.4 → 1.9.6

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 (128) hide show
  1. package/README.md +5 -1
  2. package/dist/mcp/decorators/prompt.decorator.d.ts +1 -2
  3. package/dist/mcp/decorators/prompt.decorator.d.ts.map +1 -1
  4. package/dist/mcp/decorators/prompt.decorator.js.map +1 -1
  5. package/dist/mcp/index.d.ts +2 -2
  6. package/dist/mcp/index.d.ts.map +1 -1
  7. package/dist/mcp/index.js +2 -2
  8. package/dist/mcp/index.js.map +1 -1
  9. package/dist/mcp/interfaces/dynamic-prompt.interface.d.ts +11 -0
  10. package/dist/mcp/interfaces/dynamic-prompt.interface.d.ts.map +1 -0
  11. package/dist/mcp/interfaces/dynamic-prompt.interface.js +3 -0
  12. package/dist/mcp/interfaces/dynamic-prompt.interface.js.map +1 -0
  13. package/dist/mcp/interfaces/dynamic-resource.interface.d.ts +11 -0
  14. package/dist/mcp/interfaces/dynamic-resource.interface.d.ts.map +1 -0
  15. package/dist/mcp/interfaces/dynamic-resource.interface.js +3 -0
  16. package/dist/mcp/interfaces/dynamic-resource.interface.js.map +1 -0
  17. package/dist/mcp/interfaces/dynamic-tool.interface.js.map +1 -1
  18. package/dist/mcp/interfaces/index.d.ts +2 -0
  19. package/dist/mcp/interfaces/index.d.ts.map +1 -1
  20. package/dist/mcp/interfaces/index.js.map +1 -1
  21. package/dist/mcp/mcp.module.d.ts.map +1 -1
  22. package/dist/mcp/mcp.module.js +15 -11
  23. package/dist/mcp/mcp.module.js.map +1 -1
  24. package/dist/mcp/services/handlers/mcp-handler.base.d.ts +4 -4
  25. package/dist/mcp/services/handlers/mcp-handler.base.d.ts.map +1 -1
  26. package/dist/mcp/services/handlers/mcp-handler.base.js.map +1 -1
  27. package/dist/mcp/services/handlers/mcp-prompts.handler.d.ts +2 -2
  28. package/dist/mcp/services/handlers/mcp-prompts.handler.d.ts.map +1 -1
  29. package/dist/mcp/services/handlers/mcp-prompts.handler.js +13 -3
  30. package/dist/mcp/services/handlers/mcp-prompts.handler.js.map +1 -1
  31. package/dist/mcp/services/handlers/mcp-resources.handler.d.ts +2 -2
  32. package/dist/mcp/services/handlers/mcp-resources.handler.d.ts.map +1 -1
  33. package/dist/mcp/services/handlers/mcp-resources.handler.js +12 -2
  34. package/dist/mcp/services/handlers/mcp-resources.handler.js.map +1 -1
  35. package/dist/mcp/services/handlers/mcp-tools.handler.d.ts +2 -2
  36. package/dist/mcp/services/handlers/mcp-tools.handler.d.ts.map +1 -1
  37. package/dist/mcp/services/handlers/mcp-tools.handler.js +5 -5
  38. package/dist/mcp/services/handlers/mcp-tools.handler.js.map +1 -1
  39. package/dist/mcp/services/mcp-dynamic-registry.service.d.ts +26 -0
  40. package/dist/mcp/services/mcp-dynamic-registry.service.d.ts.map +1 -0
  41. package/dist/mcp/services/mcp-dynamic-registry.service.js +133 -0
  42. package/dist/mcp/services/mcp-dynamic-registry.service.js.map +1 -0
  43. package/dist/mcp/services/mcp-executor.service.d.ts +2 -2
  44. package/dist/mcp/services/mcp-executor.service.d.ts.map +1 -1
  45. package/dist/mcp/services/mcp-executor.service.js +2 -2
  46. package/dist/mcp/services/mcp-executor.service.js.map +1 -1
  47. package/dist/mcp/services/{mcp-registry.service.d.ts → mcp-registry-discovery.service.d.ts} +16 -15
  48. package/dist/mcp/services/mcp-registry-discovery.service.d.ts.map +1 -0
  49. package/dist/mcp/services/{mcp-registry.service.js → mcp-registry-discovery.service.js} +41 -25
  50. package/dist/mcp/services/mcp-registry-discovery.service.js.map +1 -0
  51. package/dist/mcp/services/mcp-sse.service.d.ts +2 -2
  52. package/dist/mcp/services/mcp-sse.service.d.ts.map +1 -1
  53. package/dist/mcp/services/mcp-sse.service.js +2 -2
  54. package/dist/mcp/services/mcp-sse.service.js.map +1 -1
  55. package/dist/mcp/services/mcp-streamable-http.service.d.ts +2 -2
  56. package/dist/mcp/services/mcp-streamable-http.service.d.ts.map +1 -1
  57. package/dist/mcp/services/mcp-streamable-http.service.js +2 -2
  58. package/dist/mcp/services/mcp-streamable-http.service.js.map +1 -1
  59. package/dist/mcp/services/tool-authorization.service.d.ts +4 -4
  60. package/dist/mcp/services/tool-authorization.service.d.ts.map +1 -1
  61. package/dist/mcp/services/tool-authorization.service.js.map +1 -1
  62. package/dist/mcp/transport/stdio.service.d.ts +2 -2
  63. package/dist/mcp/transport/stdio.service.d.ts.map +1 -1
  64. package/dist/mcp/transport/stdio.service.js +7 -7
  65. package/dist/mcp/transport/stdio.service.js.map +1 -1
  66. package/dist/mcp/utils/capabilities-builder.d.ts +2 -2
  67. package/dist/mcp/utils/capabilities-builder.d.ts.map +1 -1
  68. package/dist/mcp/utils/capabilities-builder.js.map +1 -1
  69. package/dist/mcp/utils/mcp-server.factory.d.ts +2 -2
  70. package/dist/mcp/utils/mcp-server.factory.d.ts.map +1 -1
  71. package/dist/mcp/utils/mcp-server.factory.js.map +1 -1
  72. package/package.json +9 -9
  73. package/src/mcp/decorators/prompt.decorator.ts +1 -1
  74. package/src/mcp/index.ts +2 -2
  75. package/src/mcp/interfaces/dynamic-prompt.interface.ts +20 -0
  76. package/src/mcp/interfaces/dynamic-resource.interface.ts +22 -0
  77. package/src/mcp/interfaces/dynamic-tool.interface.ts +2 -2
  78. package/src/mcp/interfaces/index.ts +10 -0
  79. package/src/mcp/mcp.module.ts +15 -11
  80. package/src/mcp/services/handlers/mcp-handler.base.ts +6 -3
  81. package/src/mcp/services/handlers/mcp-prompts.handler.ts +36 -4
  82. package/src/mcp/services/handlers/mcp-resources.handler.ts +24 -2
  83. package/src/mcp/services/handlers/mcp-tools.handler.ts +11 -8
  84. package/src/mcp/services/mcp-dynamic-registry.service.ts +236 -0
  85. package/src/mcp/services/mcp-executor.service.ts +2 -2
  86. package/src/mcp/services/{mcp-registry.service.spec.ts → mcp-registry-discovery.service.spec.ts} +18 -12
  87. package/src/mcp/services/{mcp-registry.service.ts → mcp-registry-discovery.service.ts} +77 -35
  88. package/src/mcp/services/mcp-sse.service.ts +2 -2
  89. package/src/mcp/services/mcp-streamable-http.service.ts +2 -2
  90. package/src/mcp/services/tool-authorization.service.ts +4 -4
  91. package/src/mcp/transport/stdio.service.ts +8 -8
  92. package/src/mcp/utils/capabilities-builder.ts +2 -2
  93. package/src/mcp/utils/mcp-server.factory.ts +2 -2
  94. package/dist/authz/services/jwt-token.service.spec.d.ts +0 -2
  95. package/dist/authz/services/jwt-token.service.spec.d.ts.map +0 -1
  96. package/dist/authz/services/jwt-token.service.spec.js +0 -86
  97. package/dist/authz/services/jwt-token.service.spec.js.map +0 -1
  98. package/dist/authz/stores/memory-store.service.spec.d.ts +0 -2
  99. package/dist/authz/stores/memory-store.service.spec.d.ts.map +0 -1
  100. package/dist/authz/stores/memory-store.service.spec.js +0 -382
  101. package/dist/authz/stores/memory-store.service.spec.js.map +0 -1
  102. package/dist/authz/stores/typeorm/typeorm-store.service.spec.d.ts +0 -2
  103. package/dist/authz/stores/typeorm/typeorm-store.service.spec.d.ts.map +0 -1
  104. package/dist/authz/stores/typeorm/typeorm-store.service.spec.js +0 -340
  105. package/dist/authz/stores/typeorm/typeorm-store.service.spec.js.map +0 -1
  106. package/dist/mcp/services/mcp-registry.service.d.ts.map +0 -1
  107. package/dist/mcp/services/mcp-registry.service.js.map +0 -1
  108. package/dist/mcp/services/mcp-registry.service.spec.d.ts +0 -2
  109. package/dist/mcp/services/mcp-registry.service.spec.d.ts.map +0 -1
  110. package/dist/mcp/services/mcp-registry.service.spec.js +0 -245
  111. package/dist/mcp/services/mcp-registry.service.spec.js.map +0 -1
  112. package/dist/mcp/services/mcp-tool-builder.service.d.ts +0 -15
  113. package/dist/mcp/services/mcp-tool-builder.service.d.ts.map +0 -1
  114. package/dist/mcp/services/mcp-tool-builder.service.js +0 -70
  115. package/dist/mcp/services/mcp-tool-builder.service.js.map +0 -1
  116. package/dist/mcp/transport/custom-decorator.spec.d.ts +0 -2
  117. package/dist/mcp/transport/custom-decorator.spec.d.ts.map +0 -1
  118. package/dist/mcp/transport/custom-decorator.spec.js +0 -34
  119. package/dist/mcp/transport/custom-decorator.spec.js.map +0 -1
  120. package/dist/mcp/utils/mcp-logger.factory.spec.d.ts +0 -2
  121. package/dist/mcp/utils/mcp-logger.factory.spec.d.ts.map +0 -1
  122. package/dist/mcp/utils/mcp-logger.factory.spec.js +0 -150
  123. package/dist/mcp/utils/mcp-logger.factory.spec.js.map +0 -1
  124. package/dist/mcp/utils/normalize-endpoint.spec.d.ts +0 -2
  125. package/dist/mcp/utils/normalize-endpoint.spec.d.ts.map +0 -1
  126. package/dist/mcp/utils/normalize-endpoint.spec.js +0 -40
  127. package/dist/mcp/utils/normalize-endpoint.spec.js.map +0 -1
  128. package/src/mcp/services/mcp-tool-builder.service.ts +0 -151
@@ -1,14 +1,14 @@
1
1
  import { OnApplicationBootstrap } from '@nestjs/common';
2
2
  import { ModuleRef } from '@nestjs/core';
3
3
  import type { McpOptions } from '../interfaces';
4
- import { McpRegistryService } from '../services/mcp-registry.service';
4
+ import { McpRegistryDiscoveryService } from '../services/mcp-registry-discovery.service';
5
5
  export declare class StdioService implements OnApplicationBootstrap {
6
6
  private readonly options;
7
7
  private readonly mcpModuleId;
8
8
  private readonly moduleRef;
9
9
  private readonly toolRegistry;
10
10
  private readonly logger;
11
- constructor(options: McpOptions, mcpModuleId: string, moduleRef: ModuleRef, toolRegistry: McpRegistryService);
11
+ constructor(options: McpOptions, mcpModuleId: string, moduleRef: ModuleRef, toolRegistry: McpRegistryDiscoveryService);
12
12
  onApplicationBootstrap(): Promise<void>;
13
13
  }
14
14
  //# sourceMappingURL=stdio.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"stdio.service.d.ts","sourceRoot":"","sources":["../../../src/mcp/transport/stdio.service.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,sBAAsB,EACvB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAE3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAItE,qBACa,YAAa,YAAW,sBAAsB;IAIhC,OAAO,CAAC,QAAQ,CAAC,OAAO;IACtB,OAAO,CAAC,QAAQ,CAAC,WAAW;IACrD,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAN/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAGU,OAAO,EAAE,UAAU,EACjB,WAAW,EAAE,MAAM,EAC5C,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,kBAAkB;IAK7C,sBAAsB;CA8C7B"}
1
+ {"version":3,"file":"stdio.service.d.ts","sourceRoot":"","sources":["../../../src/mcp/transport/stdio.service.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,sBAAsB,EACvB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAE3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,2BAA2B,EAAE,MAAM,4CAA4C,CAAC;AAIzF,qBACa,YAAa,YAAW,sBAAsB;IAIhC,OAAO,CAAC,QAAQ,CAAC,OAAO;IACtB,OAAO,CAAC,QAAQ,CAAC,WAAW;IACrD,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAN/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAGU,OAAO,EAAE,UAAU,EACjB,WAAW,EAAE,MAAM,EAC5C,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,2BAA2B;IAKtD,sBAAsB;CA8C7B"}
@@ -19,7 +19,7 @@ const common_1 = require("@nestjs/common");
19
19
  const core_1 = require("@nestjs/core");
20
20
  const interfaces_1 = require("../interfaces");
21
21
  const mcp_executor_service_1 = require("../services/mcp-executor.service");
22
- const mcp_registry_service_1 = require("../services/mcp-registry.service");
22
+ const mcp_registry_discovery_service_1 = require("../services/mcp-registry-discovery.service");
23
23
  const mcp_logger_factory_1 = require("../utils/mcp-logger.factory");
24
24
  const mcp_server_factory_1 = require("../utils/mcp-server.factory");
25
25
  let StdioService = StdioService_1 = class StdioService {
@@ -31,17 +31,17 @@ let StdioService = StdioService_1 = class StdioService {
31
31
  this.logger = (0, mcp_logger_factory_1.createMcpLogger)(StdioService_1.name, this.options);
32
32
  }
33
33
  async onApplicationBootstrap() {
34
- if (this.options.transport !== interfaces_1.McpTransportType.STDIO) {
34
+ const transports = Array.isArray(this.options.transport)
35
+ ? this.options.transport
36
+ : [this.options.transport];
37
+ if (!transports.includes(interfaces_1.McpTransportType.STDIO))
35
38
  return;
36
- }
37
39
  this.logger.log('Bootstrapping MCP STDIO...');
38
40
  const toolsWithGuards = this.toolRegistry
39
41
  .getTools(this.mcpModuleId)
40
42
  .filter((tool) => tool.metadata.guards && tool.metadata.guards.length > 0);
41
43
  if (toolsWithGuards.length > 0) {
42
- const toolNames = toolsWithGuards
43
- .map((t) => t.metadata.name)
44
- .join(', ');
44
+ const toolNames = toolsWithGuards.map((t) => t.metadata.name).join(', ');
45
45
  this.logger.warn(`@ToolGuards() are not supported with STDIO transport. ` +
46
46
  `The following tools have guards configured and will be hidden: ${toolNames}. ` +
47
47
  `Consider using HTTP transport.`);
@@ -61,6 +61,6 @@ exports.StdioService = StdioService = StdioService_1 = __decorate([
61
61
  __param(0, (0, common_1.Inject)('MCP_OPTIONS')),
62
62
  __param(1, (0, common_1.Inject)('MCP_MODULE_ID')),
63
63
  __metadata("design:paramtypes", [Object, String, core_1.ModuleRef,
64
- mcp_registry_service_1.McpRegistryService])
64
+ mcp_registry_discovery_service_1.McpRegistryDiscoveryService])
65
65
  ], StdioService);
66
66
  //# sourceMappingURL=stdio.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"stdio.service.js","sourceRoot":"","sources":["../../../src/mcp/transport/stdio.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wEAAiF;AACjF,2CAKwB;AACxB,uCAA2D;AAC3D,8CAAiD;AAEjD,2EAAsE;AACtE,2EAAsE;AACtE,oEAA8D;AAC9D,oEAA8D;AAGvD,IAAM,YAAY,oBAAlB,MAAM,YAAY;IAGvB,YAC0C,OAAmB,EACjB,WAAmB,EAC5C,SAAoB,EACpB,YAAgC;QAHT,YAAO,GAAP,OAAO,CAAY;QACjB,gBAAW,GAAX,WAAW,CAAQ;QAC5C,cAAS,GAAT,SAAS,CAAW;QACpB,iBAAY,GAAZ,YAAY,CAAoB;QAEjD,IAAI,CAAC,MAAM,GAAG,IAAA,oCAAe,EAAC,cAAY,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACjE,CAAC;IAED,KAAK,CAAC,sBAAsB;QAC1B,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,KAAK,6BAAgB,CAAC,KAAK,EAAE,CAAC;YACtD,OAAO;QACT,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAG9C,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY;aACtC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC;aAC1B,MAAM,CACL,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAClE,CAAC;QAEJ,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,SAAS,GAAG,eAAe;iBAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;iBAC3B,IAAI,CAAC,IAAI,CAAC,CAAC;YACd,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,wDAAwD;gBACtD,kEAAkE,SAAS,IAAI;gBAC/E,gCAAgC,CACnC,CAAC;QACJ,CAAC;QAED,MAAM,SAAS,GAAG,IAAA,oCAAe,EAC/B,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,MAAM,CACZ,CAAC;QAEF,MAAM,SAAS,GAAG,uBAAgB,CAAC,MAAM,EAAE,CAAC;QAC5C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAC3C,yCAAkB,EAClB,SAAS,EACT,EAAE,MAAM,EAAE,KAAK,EAAE,CAClB,CAAC;QAGF,QAAQ,CAAC,uBAAuB,CAAC,SAAS,EAAE,EAAS,CAAC,CAAC;QAEvD,MAAM,SAAS,GAAG,IAAI,+BAAoB,EAAE,CAAC;QAC7C,MAAM,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAEnC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACrC,CAAC;CACF,CAAA;AA1DY,oCAAY;uBAAZ,YAAY;IADxB,IAAA,mBAAU,GAAE;IAKR,WAAA,IAAA,eAAM,EAAC,aAAa,CAAC,CAAA;IACrB,WAAA,IAAA,eAAM,EAAC,eAAe,CAAC,CAAA;qDACI,gBAAS;QACN,yCAAkB;GAPxC,YAAY,CA0DxB","sourcesContent":["import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n Inject,\n Injectable,\n Logger,\n OnApplicationBootstrap,\n} from '@nestjs/common';\nimport { ContextIdFactory, ModuleRef } from '@nestjs/core';\nimport { McpTransportType } from '../interfaces';\nimport type { McpOptions } from '../interfaces';\nimport { McpExecutorService } from '../services/mcp-executor.service';\nimport { McpRegistryService } from '../services/mcp-registry.service';\nimport { createMcpLogger } from '../utils/mcp-logger.factory';\nimport { createMcpServer } from '../utils/mcp-server.factory';\n\n@Injectable()\nexport class StdioService implements OnApplicationBootstrap {\n private readonly logger: Logger;\n\n constructor(\n @Inject('MCP_OPTIONS') private readonly options: McpOptions,\n @Inject('MCP_MODULE_ID') private readonly mcpModuleId: string,\n private readonly moduleRef: ModuleRef,\n private readonly toolRegistry: McpRegistryService,\n ) {\n this.logger = createMcpLogger(StdioService.name, this.options);\n }\n\n async onApplicationBootstrap() {\n if (this.options.transport !== McpTransportType.STDIO) {\n return;\n }\n this.logger.log('Bootstrapping MCP STDIO...');\n\n // Warn about tools with @ToolGuards() - they require HTTP context\n const toolsWithGuards = this.toolRegistry\n .getTools(this.mcpModuleId)\n .filter(\n (tool) => tool.metadata.guards && tool.metadata.guards.length > 0,\n );\n\n if (toolsWithGuards.length > 0) {\n const toolNames = toolsWithGuards\n .map((t) => t.metadata.name)\n .join(', ');\n this.logger.warn(\n `@ToolGuards() are not supported with STDIO transport. ` +\n `The following tools have guards configured and will be hidden: ${toolNames}. ` +\n `Consider using HTTP transport.`,\n );\n }\n\n const mcpServer = createMcpServer(\n this.mcpModuleId,\n this.toolRegistry,\n this.options,\n this.logger,\n );\n\n const contextId = ContextIdFactory.create();\n const executor = await this.moduleRef.resolve(\n McpExecutorService,\n contextId,\n { strict: false },\n );\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n executor.registerRequestHandlers(mcpServer, {} as any);\n\n const transport = new StdioServerTransport();\n await mcpServer.connect(transport);\n\n this.logger.log('MCP STDIO ready');\n }\n}\n"]}
1
+ {"version":3,"file":"stdio.service.js","sourceRoot":"","sources":["../../../src/mcp/transport/stdio.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wEAAiF;AACjF,2CAKwB;AACxB,uCAA2D;AAC3D,8CAAiD;AAEjD,2EAAsE;AACtE,+FAAyF;AACzF,oEAA8D;AAC9D,oEAA8D;AAGvD,IAAM,YAAY,oBAAlB,MAAM,YAAY;IAGvB,YAC0C,OAAmB,EACjB,WAAmB,EAC5C,SAAoB,EACpB,YAAyC;QAHlB,YAAO,GAAP,OAAO,CAAY;QACjB,gBAAW,GAAX,WAAW,CAAQ;QAC5C,cAAS,GAAT,SAAS,CAAW;QACpB,iBAAY,GAAZ,YAAY,CAA6B;QAE1D,IAAI,CAAC,MAAM,GAAG,IAAA,oCAAe,EAAC,cAAY,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACjE,CAAC;IAED,KAAK,CAAC,sBAAsB;QAC1B,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;YACtD,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS;YACxB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC7B,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,6BAAgB,CAAC,KAAK,CAAC;YAAE,OAAO;QAEzD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAG9C,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY;aACtC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC;aAC1B,MAAM,CACL,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAClE,CAAC;QAEJ,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,SAAS,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzE,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,wDAAwD;gBACtD,kEAAkE,SAAS,IAAI;gBAC/E,gCAAgC,CACnC,CAAC;QACJ,CAAC;QAED,MAAM,SAAS,GAAG,IAAA,oCAAe,EAC/B,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,MAAM,CACZ,CAAC;QAEF,MAAM,SAAS,GAAG,uBAAgB,CAAC,MAAM,EAAE,CAAC;QAC5C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAC3C,yCAAkB,EAClB,SAAS,EACT,EAAE,MAAM,EAAE,KAAK,EAAE,CAClB,CAAC;QAGF,QAAQ,CAAC,uBAAuB,CAAC,SAAS,EAAE,EAAS,CAAC,CAAC;QAEvD,MAAM,SAAS,GAAG,IAAI,+BAAoB,EAAE,CAAC;QAC7C,MAAM,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAEnC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACrC,CAAC;CACF,CAAA;AA1DY,oCAAY;uBAAZ,YAAY;IADxB,IAAA,mBAAU,GAAE;IAKR,WAAA,IAAA,eAAM,EAAC,aAAa,CAAC,CAAA;IACrB,WAAA,IAAA,eAAM,EAAC,eAAe,CAAC,CAAA;qDACI,gBAAS;QACN,4DAA2B;GAPjD,YAAY,CA0DxB","sourcesContent":["import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n Inject,\n Injectable,\n Logger,\n OnApplicationBootstrap,\n} from '@nestjs/common';\nimport { ContextIdFactory, ModuleRef } from '@nestjs/core';\nimport { McpTransportType } from '../interfaces';\nimport type { McpOptions } from '../interfaces';\nimport { McpExecutorService } from '../services/mcp-executor.service';\nimport { McpRegistryDiscoveryService } from '../services/mcp-registry-discovery.service';\nimport { createMcpLogger } from '../utils/mcp-logger.factory';\nimport { createMcpServer } from '../utils/mcp-server.factory';\n\n@Injectable()\nexport class StdioService implements OnApplicationBootstrap {\n private readonly logger: Logger;\n\n constructor(\n @Inject('MCP_OPTIONS') private readonly options: McpOptions,\n @Inject('MCP_MODULE_ID') private readonly mcpModuleId: string,\n private readonly moduleRef: ModuleRef,\n private readonly toolRegistry: McpRegistryDiscoveryService,\n ) {\n this.logger = createMcpLogger(StdioService.name, this.options);\n }\n\n async onApplicationBootstrap() {\n const transports = Array.isArray(this.options.transport)\n ? this.options.transport\n : [this.options.transport];\n if (!transports.includes(McpTransportType.STDIO)) return;\n\n this.logger.log('Bootstrapping MCP STDIO...');\n\n // Warn about tools with @ToolGuards() - they require HTTP context\n const toolsWithGuards = this.toolRegistry\n .getTools(this.mcpModuleId)\n .filter(\n (tool) => tool.metadata.guards && tool.metadata.guards.length > 0,\n );\n\n if (toolsWithGuards.length > 0) {\n const toolNames = toolsWithGuards.map((t) => t.metadata.name).join(', ');\n this.logger.warn(\n `@ToolGuards() are not supported with STDIO transport. ` +\n `The following tools have guards configured and will be hidden: ${toolNames}. ` +\n `Consider using HTTP transport.`,\n );\n }\n\n const mcpServer = createMcpServer(\n this.mcpModuleId,\n this.toolRegistry,\n this.options,\n this.logger,\n );\n\n const contextId = ContextIdFactory.create();\n const executor = await this.moduleRef.resolve(\n McpExecutorService,\n contextId,\n { strict: false },\n );\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n executor.registerRequestHandlers(mcpServer, {} as any);\n\n const transport = new StdioServerTransport();\n await mcpServer.connect(transport);\n\n this.logger.log('MCP STDIO ready');\n }\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import { ServerCapabilities } from '@modelcontextprotocol/sdk/types.js';
2
- import { McpRegistryService } from '../services/mcp-registry.service';
2
+ import { McpRegistryDiscoveryService } from '../services/mcp-registry-discovery.service';
3
3
  import type { McpOptions } from '../interfaces';
4
- export declare function buildMcpCapabilities(mcpModuleId: string, registry: McpRegistryService, options: McpOptions): ServerCapabilities;
4
+ export declare function buildMcpCapabilities(mcpModuleId: string, registry: McpRegistryDiscoveryService, options: McpOptions): ServerCapabilities;
5
5
  //# sourceMappingURL=capabilities-builder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"capabilities-builder.d.ts","sourceRoot":"","sources":["../../../src/mcp/utils/capabilities-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAMhD,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,EAAE,UAAU,GAClB,kBAAkB,CA8BpB"}
1
+ {"version":3,"file":"capabilities-builder.d.ts","sourceRoot":"","sources":["../../../src/mcp/utils/capabilities-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,2BAA2B,EAAE,MAAM,4CAA4C,CAAC;AACzF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAMhD,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,2BAA2B,EACrC,OAAO,EAAE,UAAU,GAClB,kBAAkB,CA8BpB"}
@@ -1 +1 @@
1
- {"version":3,"file":"capabilities-builder.js","sourceRoot":"","sources":["../../../src/mcp/utils/capabilities-builder.ts"],"names":[],"mappings":";;AAQA,oDAkCC;AAlCD,SAAgB,oBAAoB,CAClC,WAAmB,EACnB,QAA4B,EAC5B,OAAmB;IAGnB,MAAM,gBAAgB,GAAG,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC;IAEpD,MAAM,YAAY,GAAuB,EAAE,GAAG,gBAAgB,EAAE,CAAC;IAGjE,IAAI,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9C,YAAY,CAAC,KAAK,GAAG,YAAY,CAAC,KAAK,IAAI;YACzC,WAAW,EAAE,IAAI;SAClB,CAAC;IACJ,CAAC;IAED,IACE,QAAQ,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC;QAC7C,QAAQ,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,EACrD,CAAC;QACD,YAAY,CAAC,SAAS,GAAG,YAAY,CAAC,SAAS,IAAI;YACjD,WAAW,EAAE,IAAI;SAClB,CAAC;IACJ,CAAC;IAGD,IAAI,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,YAAY,CAAC,OAAO,GAAG,YAAY,CAAC,OAAO,IAAI;YAC7C,WAAW,EAAE,IAAI;SAClB,CAAC;IACJ,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC","sourcesContent":["import { ServerCapabilities } from '@modelcontextprotocol/sdk/types.js';\nimport { McpRegistryService } from '../services/mcp-registry.service';\nimport type { McpOptions } from '../interfaces';\n\n/**\n * Utility function to build MCP server capabilities dynamically based on\n * discovered tools, resources, and prompts\n */\nexport function buildMcpCapabilities(\n mcpModuleId: string,\n registry: McpRegistryService,\n options: McpOptions,\n): ServerCapabilities {\n // Start with user-provided capabilities or empty object\n const baseCapabilities = options.capabilities || {};\n\n const capabilities: ServerCapabilities = { ...baseCapabilities };\n\n // Add tools capability if tools are discovered\n if (registry.getTools(mcpModuleId).length > 0) {\n capabilities.tools = capabilities.tools || {\n listChanged: true,\n };\n }\n\n if (\n registry.getResources(mcpModuleId).length > 0 ||\n registry.getResourceTemplates(mcpModuleId).length > 0\n ) {\n capabilities.resources = capabilities.resources || {\n listChanged: true,\n };\n }\n\n // Add prompts capability if prompts are discovered\n if (registry.getPrompts(mcpModuleId).length > 0) {\n capabilities.prompts = capabilities.prompts || {\n listChanged: true,\n };\n }\n\n return capabilities;\n}\n"]}
1
+ {"version":3,"file":"capabilities-builder.js","sourceRoot":"","sources":["../../../src/mcp/utils/capabilities-builder.ts"],"names":[],"mappings":";;AAQA,oDAkCC;AAlCD,SAAgB,oBAAoB,CAClC,WAAmB,EACnB,QAAqC,EACrC,OAAmB;IAGnB,MAAM,gBAAgB,GAAG,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC;IAEpD,MAAM,YAAY,GAAuB,EAAE,GAAG,gBAAgB,EAAE,CAAC;IAGjE,IAAI,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9C,YAAY,CAAC,KAAK,GAAG,YAAY,CAAC,KAAK,IAAI;YACzC,WAAW,EAAE,IAAI;SAClB,CAAC;IACJ,CAAC;IAED,IACE,QAAQ,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC;QAC7C,QAAQ,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,EACrD,CAAC;QACD,YAAY,CAAC,SAAS,GAAG,YAAY,CAAC,SAAS,IAAI;YACjD,WAAW,EAAE,IAAI;SAClB,CAAC;IACJ,CAAC;IAGD,IAAI,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,YAAY,CAAC,OAAO,GAAG,YAAY,CAAC,OAAO,IAAI;YAC7C,WAAW,EAAE,IAAI;SAClB,CAAC;IACJ,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC","sourcesContent":["import { ServerCapabilities } from '@modelcontextprotocol/sdk/types.js';\nimport { McpRegistryDiscoveryService } from '../services/mcp-registry-discovery.service';\nimport type { McpOptions } from '../interfaces';\n\n/**\n * Utility function to build MCP server capabilities dynamically based on\n * discovered tools, resources, and prompts\n */\nexport function buildMcpCapabilities(\n mcpModuleId: string,\n registry: McpRegistryDiscoveryService,\n options: McpOptions,\n): ServerCapabilities {\n // Start with user-provided capabilities or empty object\n const baseCapabilities = options.capabilities || {};\n\n const capabilities: ServerCapabilities = { ...baseCapabilities };\n\n // Add tools capability if tools are discovered\n if (registry.getTools(mcpModuleId).length > 0) {\n capabilities.tools = capabilities.tools || {\n listChanged: true,\n };\n }\n\n if (\n registry.getResources(mcpModuleId).length > 0 ||\n registry.getResourceTemplates(mcpModuleId).length > 0\n ) {\n capabilities.resources = capabilities.resources || {\n listChanged: true,\n };\n }\n\n // Add prompts capability if prompts are discovered\n if (registry.getPrompts(mcpModuleId).length > 0) {\n capabilities.prompts = capabilities.prompts || {\n listChanged: true,\n };\n }\n\n return capabilities;\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import { McpOptions } from '../interfaces';
2
2
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
- import { McpRegistryService } from '../services/mcp-registry.service';
3
+ import { McpRegistryDiscoveryService } from '../services/mcp-registry-discovery.service';
4
4
  import { Logger } from '@nestjs/common';
5
- export declare function createMcpServer(mcpModuleId: string, registry: McpRegistryService, options: McpOptions, logger: Logger): McpServer;
5
+ export declare function createMcpServer(mcpModuleId: string, registry: McpRegistryDiscoveryService, options: McpOptions, logger: Logger): McpServer;
6
6
  //# sourceMappingURL=mcp-server.factory.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-server.factory.d.ts","sourceRoot":"","sources":["../../../src/mcp/utils/mcp-server.factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,wBAAgB,eAAe,CAC7B,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,EAAE,UAAU,EACnB,MAAM,EAAE,MAAM,GACb,SAAS,CAcX"}
1
+ {"version":3,"file":"mcp-server.factory.d.ts","sourceRoot":"","sources":["../../../src/mcp/utils/mcp-server.factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,2BAA2B,EAAE,MAAM,4CAA4C,CAAC;AACzF,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,wBAAgB,eAAe,CAC7B,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,2BAA2B,EACrC,OAAO,EAAE,UAAU,EACnB,MAAM,EAAE,MAAM,GACb,SAAS,CAcX"}
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-server.factory.js","sourceRoot":"","sources":["../../../src/mcp/utils/mcp-server.factory.ts"],"names":[],"mappings":";;AAMA,0CAmBC;AAxBD,oEAAoE;AACpE,iEAA8D;AAI9D,SAAgB,eAAe,CAC7B,WAAmB,EACnB,QAA4B,EAC5B,OAAmB,EACnB,MAAc;IAEd,MAAM,YAAY,GAAG,IAAA,2CAAoB,EAAC,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAE1E,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,YAAY,CAAC,CAAC;IAEtD,MAAM,SAAS,GAAG,IAAI,kBAAS,CAC7B,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,EAChD;QACE,YAAY;QACZ,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,EAAE;KACzC,CACF,CAAC;IAEF,OAAO,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9E,CAAC","sourcesContent":["import { McpOptions } from '../interfaces';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { buildMcpCapabilities } from './capabilities-builder';\nimport { McpRegistryService } from '../services/mcp-registry.service';\nimport { Logger } from '@nestjs/common';\n\nexport function createMcpServer(\n mcpModuleId: string,\n registry: McpRegistryService,\n options: McpOptions,\n logger: Logger,\n): McpServer {\n const capabilities = buildMcpCapabilities(mcpModuleId, registry, options);\n\n logger.debug('Built MCP capabilities:', capabilities);\n\n const mcpServer = new McpServer(\n { name: options.name, version: options.version },\n {\n capabilities,\n instructions: options.instructions || '',\n },\n );\n\n return options.serverMutator ? options.serverMutator(mcpServer) : mcpServer;\n}\n"]}
1
+ {"version":3,"file":"mcp-server.factory.js","sourceRoot":"","sources":["../../../src/mcp/utils/mcp-server.factory.ts"],"names":[],"mappings":";;AAMA,0CAmBC;AAxBD,oEAAoE;AACpE,iEAA8D;AAI9D,SAAgB,eAAe,CAC7B,WAAmB,EACnB,QAAqC,EACrC,OAAmB,EACnB,MAAc;IAEd,MAAM,YAAY,GAAG,IAAA,2CAAoB,EAAC,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAE1E,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,YAAY,CAAC,CAAC;IAEtD,MAAM,SAAS,GAAG,IAAI,kBAAS,CAC7B,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,EAChD;QACE,YAAY;QACZ,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,EAAE;KACzC,CACF,CAAC;IAEF,OAAO,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9E,CAAC","sourcesContent":["import { McpOptions } from '../interfaces';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { buildMcpCapabilities } from './capabilities-builder';\nimport { McpRegistryDiscoveryService } from '../services/mcp-registry-discovery.service';\nimport { Logger } from '@nestjs/common';\n\nexport function createMcpServer(\n mcpModuleId: string,\n registry: McpRegistryDiscoveryService,\n options: McpOptions,\n logger: Logger,\n): McpServer {\n const capabilities = buildMcpCapabilities(mcpModuleId, registry, options);\n\n logger.debug('Built MCP capabilities:', capabilities);\n\n const mcpServer = new McpServer(\n { name: options.name, version: options.version },\n {\n capabilities,\n instructions: options.instructions || '',\n },\n );\n\n return options.serverMutator ? options.serverMutator(mcpServer) : mcpServer;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rekog/mcp-nest",
3
- "version": "1.9.4",
3
+ "version": "1.9.6",
4
4
  "description": "NestJS module for creating Model Context Protocol (MCP) servers",
5
5
  "main": "dist/index.js",
6
6
  "license": "MIT",
@@ -56,12 +56,12 @@
56
56
  "devDependencies": {
57
57
  "@eslint/eslintrc": "^3.3.3",
58
58
  "@eslint/js": "^9.39.2",
59
- "@modelcontextprotocol/sdk": "^1.25.3",
60
- "@nestjs/common": "^11.1.12",
61
- "@nestjs/core": "^11.1.12",
62
- "@nestjs/platform-express": "^11.1.12",
63
- "@nestjs/platform-fastify": "^11.1.12",
64
- "@nestjs/testing": "^11.1.12",
59
+ "@modelcontextprotocol/sdk": "^1.27.1",
60
+ "@nestjs/common": "^11.1.14",
61
+ "@nestjs/core": "^11.1.14",
62
+ "@nestjs/platform-express": "^11.1.14",
63
+ "@nestjs/platform-fastify": "^11.1.14",
64
+ "@nestjs/testing": "^11.1.14",
65
65
  "@nestjs/typeorm": "^11.0.0",
66
66
  "@types/cookie-parser": "^1.4.10",
67
67
  "@types/express": "^5.0.6",
@@ -80,10 +80,10 @@
80
80
  "ts-node-dev": "^2.0.0",
81
81
  "typeorm": "^0.3.28",
82
82
  "typescript": "^5.9.3",
83
- "typescript-eslint": "^8.54.0"
83
+ "typescript-eslint": "^8.56.1"
84
84
  },
85
85
  "dependencies": {
86
- "@nestjs/config": "^4.0.2",
86
+ "@nestjs/config": "^4.0.3",
87
87
  "cookie-parser": "^1.4.7",
88
88
  "multer": "^2.0.2",
89
89
  "passport": "^0.7.0",
@@ -2,7 +2,7 @@ import { SetMetadata } from '@nestjs/common';
2
2
  import { MCP_PROMPT_METADATA_KEY } from './constants';
3
3
  import { ZodObject, ZodType } from 'zod';
4
4
 
5
- type PromptArgsRawShape = {
5
+ export type PromptArgsRawShape = {
6
6
  [k: string]: ZodType;
7
7
  };
8
8
 
package/src/mcp/index.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  export * from './decorators';
2
2
  export * from './interfaces';
3
3
  export * from './mcp.module';
4
- export * from './services/mcp-registry.service';
4
+ export * from './services/mcp-registry-discovery.service';
5
5
  export * from './services/mcp-executor.service';
6
6
  export * from './services/mcp-sse.service';
7
7
  export * from './services/mcp-streamable-http.service';
8
- export * from './services/mcp-tool-builder.service';
8
+ export * from './services/mcp-dynamic-registry.service';
9
9
  export * from './constants/feature-registration.constants';
@@ -0,0 +1,20 @@
1
+ import { ZodObject } from 'zod';
2
+ import { Context } from './mcp-tool.interface';
3
+ import type { PromptArgsRawShape } from '../decorators/prompt.decorator';
4
+
5
+ export type DynamicPromptHandler = (
6
+ args: Record<string, string> | undefined,
7
+ context: Context,
8
+ request: any,
9
+ ) => Promise<any> | any;
10
+
11
+ export interface DynamicPromptDefinition {
12
+ /** Unique name for the prompt */
13
+ name: string;
14
+ /** Description shown to the LLM */
15
+ description: string;
16
+ /** Zod schema describing the prompt arguments */
17
+ parameters?: ZodObject<PromptArgsRawShape>;
18
+ /** Handler function that returns the prompt messages */
19
+ handler: DynamicPromptHandler;
20
+ }
@@ -0,0 +1,22 @@
1
+ import { Context } from './mcp-tool.interface';
2
+
3
+ export type DynamicResourceHandler = (
4
+ params: Record<string, unknown>,
5
+ context: Context,
6
+ request: any,
7
+ ) => Promise<any> | any;
8
+
9
+ export interface DynamicResourceDefinition {
10
+ /** URI that uniquely identifies this resource */
11
+ uri: string;
12
+ /** Human-readable name (defaults to uri if omitted) */
13
+ name?: string;
14
+ /** Optional description shown to the LLM */
15
+ description?: string;
16
+ /** Optional MIME type of the resource content */
17
+ mimeType?: string;
18
+ /** Additional metadata */
19
+ _meta?: Record<string, any>;
20
+ /** Handler function that returns the resource content */
21
+ handler: DynamicResourceHandler;
22
+ }
@@ -14,11 +14,11 @@ export type DynamicToolHandler = (
14
14
 
15
15
  /**
16
16
  * Definition for a dynamically registered tool.
17
- * Use this with McpToolBuilder.registerTool() to register tools at runtime.
17
+ * Use this with McpRegistryService.registerTool() to register tools at runtime.
18
18
  *
19
19
  * @example
20
20
  * ```typescript
21
- * toolBuilder.registerTool({
21
+ * registry.registerTool({
22
22
  * name: 'search-knowledge',
23
23
  * description: 'Search the knowledge base',
24
24
  * parameters: z.object({ query: z.string() }),
@@ -20,3 +20,13 @@ export type {
20
20
  DynamicToolDefinition,
21
21
  DynamicToolHandler,
22
22
  } from './dynamic-tool.interface';
23
+
24
+ export type {
25
+ DynamicResourceDefinition,
26
+ DynamicResourceHandler,
27
+ } from './dynamic-resource.interface';
28
+
29
+ export type {
30
+ DynamicPromptDefinition,
31
+ DynamicPromptHandler,
32
+ } from './dynamic-prompt.interface';
@@ -14,12 +14,12 @@ import type {
14
14
  McpAsyncOptions,
15
15
  } from './interfaces';
16
16
  import { McpExecutorService } from './services/mcp-executor.service';
17
- import { McpRegistryService } from './services/mcp-registry.service';
17
+ import { McpRegistryDiscoveryService } from './services/mcp-registry-discovery.service';
18
18
  import { McpSseService } from './services/mcp-sse.service';
19
19
  import { McpStreamableHttpService } from './services/mcp-streamable-http.service';
20
20
  import { SsePingService } from './services/sse-ping.service';
21
21
  import { ToolAuthorizationService } from './services/tool-authorization.service';
22
- import { McpToolBuilder } from './services/mcp-tool-builder.service';
22
+ import { McpRegistryService } from './services/mcp-dynamic-registry.service';
23
23
  import { createSseController } from './transport/sse.controller.factory';
24
24
  import { StdioService } from './transport/stdio.service';
25
25
  import { createStreamableHttpController } from './transport/streamable-http.controller.factory';
@@ -41,7 +41,11 @@ export class McpFeatureModule {}
41
41
 
42
42
  @Module({
43
43
  imports: [DiscoveryModule],
44
- providers: [McpRegistryService, McpExecutorService, ToolAuthorizationService],
44
+ providers: [
45
+ McpRegistryDiscoveryService,
46
+ McpExecutorService,
47
+ ToolAuthorizationService,
48
+ ],
45
49
  })
46
50
  export class McpModule {
47
51
  /**
@@ -141,10 +145,10 @@ export class McpModule {
141
145
  controllers,
142
146
  providers,
143
147
  exports: [
144
- McpRegistryService,
148
+ McpRegistryDiscoveryService,
145
149
  McpSseService,
146
150
  McpStreamableHttpService,
147
- McpToolBuilder,
151
+ McpRegistryService,
148
152
  ],
149
153
  };
150
154
  }
@@ -169,13 +173,13 @@ export class McpModule {
169
173
  provide: 'MCP_MODULE_ID',
170
174
  useValue: moduleId,
171
175
  },
172
- McpRegistryService,
176
+ McpRegistryDiscoveryService,
173
177
  McpExecutorService,
174
178
  ToolAuthorizationService,
175
179
  SsePingService,
176
180
  McpSseService,
177
181
  McpStreamableHttpService,
178
- McpToolBuilder,
182
+ McpRegistryService,
179
183
  StdioService,
180
184
  ];
181
185
 
@@ -190,10 +194,10 @@ export class McpModule {
190
194
  ...(options.extraProviders ?? []),
191
195
  ],
192
196
  exports: [
193
- McpRegistryService,
197
+ McpRegistryDiscoveryService,
194
198
  McpSseService,
195
199
  McpStreamableHttpService,
196
- McpToolBuilder,
200
+ McpRegistryService,
197
201
  ],
198
202
  };
199
203
  }
@@ -330,13 +334,13 @@ export class McpModule {
330
334
  provide: 'MCP_MODULE_ID',
331
335
  useValue: moduleId,
332
336
  },
333
- McpRegistryService,
337
+ McpRegistryDiscoveryService,
334
338
  McpExecutorService,
335
339
  ToolAuthorizationService,
336
340
  SsePingService,
337
341
  McpSseService,
338
342
  McpStreamableHttpService,
339
- McpToolBuilder,
343
+ McpRegistryService,
340
344
  StdioService,
341
345
  ];
342
346
 
@@ -14,7 +14,10 @@ import {
14
14
  HttpRequest,
15
15
  } from '../../interfaces';
16
16
  import { McpOptions } from '../../interfaces/mcp-options.interface';
17
- import { DiscoveredTool, McpRegistryService } from '../mcp-registry.service';
17
+ import {
18
+ DiscoveredCapability,
19
+ McpRegistryDiscoveryService,
20
+ } from '../mcp-registry-discovery.service';
18
21
  import { createMcpLogger } from '../../utils/mcp-logger.factory';
19
22
  import {
20
23
  EXCEPTION_FILTERS_METADATA,
@@ -27,7 +30,7 @@ export abstract class McpHandlerBase {
27
30
 
28
31
  protected constructor(
29
32
  protected readonly moduleRef: ModuleRef,
30
- protected readonly registry: McpRegistryService,
33
+ protected readonly registry: McpRegistryDiscoveryService,
31
34
  private readonly reflector: Reflector,
32
35
  loggerContext: string,
33
36
  options?: McpOptions,
@@ -129,7 +132,7 @@ export abstract class McpHandlerBase {
129
132
 
130
133
  protected handleError(
131
134
  error: Error,
132
- capabilityInfo: DiscoveredTool<object>,
135
+ capabilityInfo: DiscoveredCapability<object>,
133
136
  httpRequest: HttpRequest,
134
137
  ) {
135
138
  this.logger.error(error);
@@ -8,17 +8,24 @@ import {
8
8
  McpError,
9
9
  PromptArgument,
10
10
  } from '@modelcontextprotocol/sdk/types.js';
11
- import { DiscoveredTool, McpRegistryService } from '../mcp-registry.service';
11
+ import {
12
+ DiscoveredCapability,
13
+ McpRegistryDiscoveryService,
14
+ } from '../mcp-registry-discovery.service';
12
15
  import { McpHandlerBase } from './mcp-handler.base';
13
16
  import { HttpRequest } from '../../interfaces/http-adapter.interface';
14
17
  import type { McpOptions } from '../../interfaces/mcp-options.interface';
15
18
  import { PromptMetadata } from '../../decorators';
19
+ import {
20
+ McpRegistryService,
21
+ DYNAMIC_PROMPT_HANDLER_TOKEN,
22
+ } from '../mcp-dynamic-registry.service';
16
23
 
17
24
  @Injectable({ scope: Scope.REQUEST })
18
25
  export class McpPromptsHandler extends McpHandlerBase {
19
26
  constructor(
20
27
  moduleRef: ModuleRef,
21
- registry: McpRegistryService,
28
+ registry: McpRegistryDiscoveryService,
22
29
  reflector: Reflector,
23
30
  @Inject('MCP_MODULE_ID') private readonly mcpModuleId: string,
24
31
  @Optional() @Inject('MCP_OPTIONS') options?: McpOptions,
@@ -59,7 +66,7 @@ export class McpPromptsHandler extends McpHandlerBase {
59
66
  GetPromptRequestSchema,
60
67
  async (request) => {
61
68
  this.logger.debug('GetPromptRequestSchema is being called');
62
- let promptInfo: DiscoveredTool<PromptMetadata> | undefined;
69
+ let promptInfo: DiscoveredCapability<PromptMetadata> | undefined;
63
70
 
64
71
  try {
65
72
  const name = request.params.name;
@@ -72,6 +79,32 @@ export class McpPromptsHandler extends McpHandlerBase {
72
79
  );
73
80
  }
74
81
 
82
+ const context = this.createContext(mcpServer, request);
83
+
84
+ if (promptInfo.providerClass === DYNAMIC_PROMPT_HANDLER_TOKEN) {
85
+ const handler = McpRegistryService.getPromptHandlerByModuleId(
86
+ this.mcpModuleId,
87
+ name,
88
+ );
89
+
90
+ if (!handler) {
91
+ throw new McpError(
92
+ ErrorCode.MethodNotFound,
93
+ `Handler not found for dynamic prompt: ${name}`,
94
+ );
95
+ }
96
+
97
+ const result = await handler(
98
+ request.params.arguments,
99
+ context,
100
+ httpRequest.raw,
101
+ );
102
+
103
+ this.logger.debug('GetPromptRequestSchema result', result);
104
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
105
+ return result;
106
+ }
107
+
75
108
  const contextId = ContextIdFactory.getByRequest(httpRequest);
76
109
  this.moduleRef.registerRequestByContextId(httpRequest, contextId);
77
110
 
@@ -88,7 +121,6 @@ export class McpPromptsHandler extends McpHandlerBase {
88
121
  );
89
122
  }
90
123
 
91
- const context = this.createContext(mcpServer, request);
92
124
  const methodName = promptInfo.methodName;
93
125
 
94
126
  const result = await promptInstance[methodName].call(
@@ -15,16 +15,20 @@ import {
15
15
  ReadResourceRequestSchema,
16
16
  ReadResourceResult,
17
17
  } from '@modelcontextprotocol/sdk/types.js';
18
- import { McpRegistryService } from '../mcp-registry.service';
18
+ import { McpRegistryDiscoveryService } from '../mcp-registry-discovery.service';
19
19
  import { McpHandlerBase } from './mcp-handler.base';
20
20
  import type { Context, McpOptions } from '../../interfaces';
21
21
  import { HttpRequest } from '../../interfaces/http-adapter.interface';
22
+ import {
23
+ McpRegistryService,
24
+ DYNAMIC_RESOURCE_HANDLER_TOKEN,
25
+ } from '../mcp-dynamic-registry.service';
22
26
 
23
27
  @Injectable({ scope: Scope.REQUEST })
24
28
  export class McpResourcesHandler extends McpHandlerBase {
25
29
  constructor(
26
30
  moduleRef: ModuleRef,
27
- registry: McpRegistryService,
31
+ registry: McpRegistryDiscoveryService,
28
32
  reflector: Reflector,
29
33
  @Inject('MCP_MODULE_ID') private readonly mcpModuleId: string,
30
34
  @Optional() @Inject('MCP_OPTIONS') options?: McpOptions,
@@ -132,6 +136,24 @@ export class McpResourcesHandler extends McpHandlerBase {
132
136
  requestParams: Record<string, unknown>,
133
137
  methodName: string,
134
138
  ) {
139
+ if (providerClass === DYNAMIC_RESOURCE_HANDLER_TOKEN) {
140
+ const handler = McpRegistryService.getResourceHandlerByModuleId(
141
+ this.mcpModuleId,
142
+ methodName,
143
+ );
144
+
145
+ if (!handler) {
146
+ throw new McpError(
147
+ ErrorCode.MethodNotFound,
148
+ `Handler not found for dynamic resource: ${uri}`,
149
+ );
150
+ }
151
+
152
+ const result = await handler(requestParams, context, httpRequest.raw);
153
+ this.logger.debug('ReadResourceRequestSchema result', result);
154
+ return result as ReadResourceResult;
155
+ }
156
+
135
157
  const contextId = ContextIdFactory.getByRequest(httpRequest);
136
158
  this.moduleRef.registerRequestByContextId(httpRequest, contextId);
137
159
 
@@ -15,7 +15,10 @@ import {
15
15
  Type,
16
16
  } from '@nestjs/common';
17
17
  import { ContextIdFactory, ModuleRef, Reflector } from '@nestjs/core';
18
- import { DiscoveredTool, McpRegistryService } from '../mcp-registry.service';
18
+ import {
19
+ DiscoveredCapability,
20
+ McpRegistryDiscoveryService,
21
+ } from '../mcp-registry-discovery.service';
19
22
  import { ToolGuardExecutionContext, ToolMetadata } from '../../decorators';
20
23
  import { McpHandlerBase } from './mcp-handler.base';
21
24
  import { ZodType } from 'zod';
@@ -26,9 +29,9 @@ import { toJsonSchemaCompat } from '@modelcontextprotocol/sdk/server/zod-json-sc
26
29
  import { normalizeObjectSchema } from '@modelcontextprotocol/sdk/server/zod-compat.js';
27
30
  import type { McpOptions } from '../../interfaces/mcp-options.interface';
28
31
  import {
29
- McpToolBuilder,
32
+ McpRegistryService,
30
33
  DYNAMIC_TOOL_HANDLER_TOKEN,
31
- } from '../mcp-tool-builder.service';
34
+ } from '../mcp-dynamic-registry.service';
32
35
 
33
36
  @Injectable({ scope: Scope.REQUEST })
34
37
  export class McpToolsHandler extends McpHandlerBase {
@@ -36,7 +39,7 @@ export class McpToolsHandler extends McpHandlerBase {
36
39
 
37
40
  constructor(
38
41
  moduleRef: ModuleRef,
39
- registry: McpRegistryService,
42
+ registry: McpRegistryDiscoveryService,
40
43
  reflector: Reflector,
41
44
  @Inject('MCP_MODULE_ID') private readonly mcpModuleId: string,
42
45
  @Inject('MCP_OPTIONS') private readonly options: McpOptions,
@@ -98,7 +101,7 @@ export class McpToolsHandler extends McpHandlerBase {
98
101
  */
99
102
  private createToolGuardExecutionContext(
100
103
  httpRequest: HttpRequest,
101
- tool: DiscoveredTool<ToolMetadata>,
104
+ tool: DiscoveredCapability<ToolMetadata>,
102
105
  ): ToolGuardExecutionContext & ExecutionContext {
103
106
  const providerClass = tool.providerClass as Type;
104
107
  const methodHandler =
@@ -133,7 +136,7 @@ export class McpToolsHandler extends McpHandlerBase {
133
136
  * Returns true if the tool has no guards or all guards pass.
134
137
  */
135
138
  private async checkToolGuards(
136
- tool: DiscoveredTool<ToolMetadata>,
139
+ tool: DiscoveredCapability<ToolMetadata>,
137
140
  httpRequest: HttpRequest,
138
141
  ): Promise<boolean> {
139
142
  const guards = tool.metadata.guards;
@@ -353,10 +356,10 @@ export class McpToolsHandler extends McpHandlerBase {
353
356
  const context = this.createContext(mcpServer, request);
354
357
  let result: any;
355
358
 
356
- // Check if this is a dynamic tool (registered via McpToolBuilder)
359
+ // Check if this is a dynamic tool (registered via McpRegistryService)
357
360
  if (toolInfo.providerClass === DYNAMIC_TOOL_HANDLER_TOKEN) {
358
361
  // Dynamic tool - get handler using static method with the correct moduleId
359
- const handler = McpToolBuilder.getHandlerByModuleId(
362
+ const handler = McpRegistryService.getHandlerByModuleId(
360
363
  this.mcpModuleId,
361
364
  request.params.name,
362
365
  );