@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
@@ -17,8 +17,9 @@ exports.McpResourcesHandler = void 0;
17
17
  const common_1 = require("@nestjs/common");
18
18
  const core_1 = require("@nestjs/core");
19
19
  const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
20
- const mcp_registry_service_1 = require("../mcp-registry.service");
20
+ const mcp_registry_discovery_service_1 = require("../mcp-registry-discovery.service");
21
21
  const mcp_handler_base_1 = require("./mcp-handler.base");
22
+ const mcp_dynamic_registry_service_1 = require("../mcp-dynamic-registry.service");
22
23
  let McpResourcesHandler = McpResourcesHandler_1 = class McpResourcesHandler extends mcp_handler_base_1.McpHandlerBase {
23
24
  constructor(moduleRef, registry, reflector, mcpModuleId, options) {
24
25
  super(moduleRef, registry, reflector, McpResourcesHandler_1.name, options);
@@ -83,6 +84,15 @@ let McpResourcesHandler = McpResourcesHandler_1 = class McpResourcesHandler exte
83
84
  });
84
85
  }
85
86
  async handleRequest(httpRequest, providerClass, uri, context, requestParams, methodName) {
87
+ if (providerClass === mcp_dynamic_registry_service_1.DYNAMIC_RESOURCE_HANDLER_TOKEN) {
88
+ const handler = mcp_dynamic_registry_service_1.McpRegistryService.getResourceHandlerByModuleId(this.mcpModuleId, methodName);
89
+ if (!handler) {
90
+ throw new types_js_1.McpError(types_js_1.ErrorCode.MethodNotFound, `Handler not found for dynamic resource: ${uri}`);
91
+ }
92
+ const result = await handler(requestParams, context, httpRequest.raw);
93
+ this.logger.debug('ReadResourceRequestSchema result', result);
94
+ return result;
95
+ }
86
96
  const contextId = core_1.ContextIdFactory.getByRequest(httpRequest);
87
97
  this.moduleRef.registerRequestByContextId(httpRequest, contextId);
88
98
  const resourceInstance = await this.moduleRef.resolve(providerClass, contextId, { strict: false });
@@ -101,7 +111,7 @@ exports.McpResourcesHandler = McpResourcesHandler = McpResourcesHandler_1 = __de
101
111
  __param(4, (0, common_1.Optional)()),
102
112
  __param(4, (0, common_1.Inject)('MCP_OPTIONS')),
103
113
  __metadata("design:paramtypes", [core_1.ModuleRef,
104
- mcp_registry_service_1.McpRegistryService,
114
+ mcp_registry_discovery_service_1.McpRegistryDiscoveryService,
105
115
  core_1.Reflector, String, Object])
106
116
  ], McpResourcesHandler);
107
117
  //# sourceMappingURL=mcp-resources.handler.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-resources.handler.js","sourceRoot":"","sources":["../../../../src/mcp/services/handlers/mcp-resources.handler.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Inject,\n Injectable,\n InjectionToken,\n Optional,\n Scope,\n} from '@nestjs/common';\nimport { ContextIdFactory, ModuleRef, Reflector } from '@nestjs/core';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport {\n ErrorCode,\n ListResourcesRequestSchema,\n ListResourceTemplatesRequestSchema,\n McpError,\n ReadResourceRequestSchema,\n ReadResourceResult,\n} from '@modelcontextprotocol/sdk/types.js';\nimport { McpRegistryService } from '../mcp-registry.service';\nimport { McpHandlerBase } from './mcp-handler.base';\nimport type { Context, McpOptions } from '../../interfaces';\nimport { HttpRequest } from '../../interfaces/http-adapter.interface';\n\n@Injectable({ scope: Scope.REQUEST })\nexport class McpResourcesHandler extends McpHandlerBase {\n constructor(\n moduleRef: ModuleRef,\n registry: McpRegistryService,\n reflector: Reflector,\n @Inject('MCP_MODULE_ID') private readonly mcpModuleId: string,\n @Optional() @Inject('MCP_OPTIONS') options?: McpOptions,\n ) {\n super(moduleRef, registry, reflector, McpResourcesHandler.name, options);\n }\n\n registerHandlers(mcpServer: McpServer, httpRequest: HttpRequest) {\n const resources = this.registry.getResources(this.mcpModuleId);\n const resourceTemplates = this.registry.getResourceTemplates(\n this.mcpModuleId,\n );\n if (resources.length === 0 && resourceTemplates.length === 0) {\n this.logger.debug(\n 'No resources or resource templates registered, skipping resource handlers',\n );\n return;\n }\n\n mcpServer.server.setRequestHandler(ListResourcesRequestSchema, () => {\n this.logger.debug('ListResourcesRequestSchema is being called');\n return {\n resources: this.registry\n .getResources(this.mcpModuleId)\n .map((resources) => resources.metadata),\n };\n });\n\n mcpServer.server.setRequestHandler(\n ListResourceTemplatesRequestSchema,\n () => {\n this.logger.debug('ListResourceTemplatesRequestSchema is being called');\n return {\n resourceTemplates: this.registry\n .getResourceTemplates(this.mcpModuleId)\n .map((resourceTemplate) => resourceTemplate.metadata),\n };\n },\n );\n\n mcpServer.server.setRequestHandler(\n ReadResourceRequestSchema,\n async (request) => {\n this.logger.debug('ReadResourceRequestSchema is being called');\n\n const uri = request.params.uri;\n const resourceInfo = this.registry.findResourceByUri(\n this.mcpModuleId,\n uri,\n );\n const resourceTemplateInfo = this.registry.findResourceTemplateByUri(\n this.mcpModuleId,\n uri,\n );\n\n try {\n let providerClass: InjectionToken;\n let params: Record<string, unknown> = {};\n let methodName: string;\n if (resourceTemplateInfo) {\n providerClass = resourceTemplateInfo.resourceTemplate.providerClass;\n params = {\n ...resourceTemplateInfo.params,\n ...request.params,\n };\n methodName = resourceTemplateInfo.resourceTemplate.methodName;\n } else if (resourceInfo) {\n providerClass = resourceInfo.resource.providerClass;\n\n params = {\n ...resourceInfo.params,\n ...request.params,\n };\n methodName = resourceInfo.resource.methodName;\n } else {\n throw new McpError(\n ErrorCode.MethodNotFound,\n `Unknown resource: ${uri}`,\n );\n }\n return await this.handleRequest(\n httpRequest,\n providerClass,\n uri,\n this.createContext(mcpServer, request),\n params,\n methodName,\n );\n } catch (error) {\n return this.handleError(\n error as Error,\n (resourceInfo?.resource ?? resourceTemplateInfo?.resourceTemplate)!,\n httpRequest,\n );\n }\n },\n );\n }\n\n private async handleRequest(\n httpRequest: HttpRequest,\n providerClass: InjectionToken,\n uri: string,\n context: Context,\n requestParams: Record<string, unknown>,\n methodName: string,\n ) {\n const contextId = ContextIdFactory.getByRequest(httpRequest);\n this.moduleRef.registerRequestByContextId(httpRequest, contextId);\n\n const resourceInstance = await this.moduleRef.resolve(\n providerClass,\n contextId,\n { strict: false },\n );\n\n if (!resourceInstance) {\n throw new McpError(\n ErrorCode.MethodNotFound,\n `Unknown resource template: ${uri}`,\n );\n }\n const result = await resourceInstance[methodName].call(\n resourceInstance,\n requestParams,\n context,\n httpRequest,\n );\n\n this.logger.debug('ReadResourceRequestSchema result', result);\n\n return result as ReadResourceResult;\n }\n}\n"]}
1
+ {"version":3,"file":"mcp-resources.handler.js","sourceRoot":"","sources":["../../../../src/mcp/services/handlers/mcp-resources.handler.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Inject,\n Injectable,\n InjectionToken,\n Optional,\n Scope,\n} from '@nestjs/common';\nimport { ContextIdFactory, ModuleRef, Reflector } from '@nestjs/core';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport {\n ErrorCode,\n ListResourcesRequestSchema,\n ListResourceTemplatesRequestSchema,\n McpError,\n ReadResourceRequestSchema,\n ReadResourceResult,\n} from '@modelcontextprotocol/sdk/types.js';\nimport { McpRegistryDiscoveryService } from '../mcp-registry-discovery.service';\nimport { McpHandlerBase } from './mcp-handler.base';\nimport type { Context, McpOptions } from '../../interfaces';\nimport { HttpRequest } from '../../interfaces/http-adapter.interface';\nimport {\n McpRegistryService,\n DYNAMIC_RESOURCE_HANDLER_TOKEN,\n} from '../mcp-dynamic-registry.service';\n\n@Injectable({ scope: Scope.REQUEST })\nexport class McpResourcesHandler extends McpHandlerBase {\n constructor(\n moduleRef: ModuleRef,\n registry: McpRegistryDiscoveryService,\n reflector: Reflector,\n @Inject('MCP_MODULE_ID') private readonly mcpModuleId: string,\n @Optional() @Inject('MCP_OPTIONS') options?: McpOptions,\n ) {\n super(moduleRef, registry, reflector, McpResourcesHandler.name, options);\n }\n\n registerHandlers(mcpServer: McpServer, httpRequest: HttpRequest) {\n const resources = this.registry.getResources(this.mcpModuleId);\n const resourceTemplates = this.registry.getResourceTemplates(\n this.mcpModuleId,\n );\n if (resources.length === 0 && resourceTemplates.length === 0) {\n this.logger.debug(\n 'No resources or resource templates registered, skipping resource handlers',\n );\n return;\n }\n\n mcpServer.server.setRequestHandler(ListResourcesRequestSchema, () => {\n this.logger.debug('ListResourcesRequestSchema is being called');\n return {\n resources: this.registry\n .getResources(this.mcpModuleId)\n .map((resources) => resources.metadata),\n };\n });\n\n mcpServer.server.setRequestHandler(\n ListResourceTemplatesRequestSchema,\n () => {\n this.logger.debug('ListResourceTemplatesRequestSchema is being called');\n return {\n resourceTemplates: this.registry\n .getResourceTemplates(this.mcpModuleId)\n .map((resourceTemplate) => resourceTemplate.metadata),\n };\n },\n );\n\n mcpServer.server.setRequestHandler(\n ReadResourceRequestSchema,\n async (request) => {\n this.logger.debug('ReadResourceRequestSchema is being called');\n\n const uri = request.params.uri;\n const resourceInfo = this.registry.findResourceByUri(\n this.mcpModuleId,\n uri,\n );\n const resourceTemplateInfo = this.registry.findResourceTemplateByUri(\n this.mcpModuleId,\n uri,\n );\n\n try {\n let providerClass: InjectionToken;\n let params: Record<string, unknown> = {};\n let methodName: string;\n if (resourceTemplateInfo) {\n providerClass = resourceTemplateInfo.resourceTemplate.providerClass;\n params = {\n ...resourceTemplateInfo.params,\n ...request.params,\n };\n methodName = resourceTemplateInfo.resourceTemplate.methodName;\n } else if (resourceInfo) {\n providerClass = resourceInfo.resource.providerClass;\n\n params = {\n ...resourceInfo.params,\n ...request.params,\n };\n methodName = resourceInfo.resource.methodName;\n } else {\n throw new McpError(\n ErrorCode.MethodNotFound,\n `Unknown resource: ${uri}`,\n );\n }\n return await this.handleRequest(\n httpRequest,\n providerClass,\n uri,\n this.createContext(mcpServer, request),\n params,\n methodName,\n );\n } catch (error) {\n return this.handleError(\n error as Error,\n (resourceInfo?.resource ?? resourceTemplateInfo?.resourceTemplate)!,\n httpRequest,\n );\n }\n },\n );\n }\n\n private async handleRequest(\n httpRequest: HttpRequest,\n providerClass: InjectionToken,\n uri: string,\n context: Context,\n requestParams: Record<string, unknown>,\n methodName: string,\n ) {\n if (providerClass === DYNAMIC_RESOURCE_HANDLER_TOKEN) {\n const handler = McpRegistryService.getResourceHandlerByModuleId(\n this.mcpModuleId,\n methodName,\n );\n\n if (!handler) {\n throw new McpError(\n ErrorCode.MethodNotFound,\n `Handler not found for dynamic resource: ${uri}`,\n );\n }\n\n const result = await handler(requestParams, context, httpRequest.raw);\n this.logger.debug('ReadResourceRequestSchema result', result);\n return result as ReadResourceResult;\n }\n\n const contextId = ContextIdFactory.getByRequest(httpRequest);\n this.moduleRef.registerRequestByContextId(httpRequest, contextId);\n\n const resourceInstance = await this.moduleRef.resolve(\n providerClass,\n contextId,\n { strict: false },\n );\n\n if (!resourceInstance) {\n throw new McpError(\n ErrorCode.MethodNotFound,\n `Unknown resource template: ${uri}`,\n );\n }\n const result = await resourceInstance[methodName].call(\n resourceInstance,\n requestParams,\n context,\n httpRequest,\n );\n\n this.logger.debug('ReadResourceRequestSchema result', result);\n\n return result as ReadResourceResult;\n }\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
2
  import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
3
3
  import { ModuleRef, Reflector } from '@nestjs/core';
4
- import { McpRegistryService } from '../mcp-registry.service';
4
+ import { McpRegistryDiscoveryService } from '../mcp-registry-discovery.service';
5
5
  import { McpHandlerBase } from './mcp-handler.base';
6
6
  import { HttpRequest } from '../../interfaces/http-adapter.interface';
7
7
  import { ToolAuthorizationService } from '../tool-authorization.service';
@@ -11,7 +11,7 @@ export declare class McpToolsHandler extends McpHandlerBase {
11
11
  private readonly options;
12
12
  private readonly authService;
13
13
  private readonly moduleHasGuards;
14
- constructor(moduleRef: ModuleRef, registry: McpRegistryService, reflector: Reflector, mcpModuleId: string, options: McpOptions, authService: ToolAuthorizationService);
14
+ constructor(moduleRef: ModuleRef, registry: McpRegistryDiscoveryService, reflector: Reflector, mcpModuleId: string, options: McpOptions, authService: ToolAuthorizationService);
15
15
  private buildDefaultContentBlock;
16
16
  private formatToolResult;
17
17
  protected createErrorResponse(errorText: string): CallToolResult | never;
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-tools.handler.d.ts","sourceRoot":"","sources":["../../../../src/mcp/services/handlers/mcp-tools.handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAEL,cAAc,EAIf,MAAM,oCAAoC,CAAC;AAS5C,OAAO,EAAoB,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,EAAkB,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7E,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,OAAO,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAC;AAEtE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAGzE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAMzE,qBACa,eAAgB,SAAQ,cAAc;IAOtB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAC/C,OAAO,CAAC,QAAQ,CAAC,WAAW;IAR9B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAU;gBAGxC,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,kBAAkB,EAC5B,SAAS,EAAE,SAAS,EACsB,WAAW,EAAE,MAAM,EACrB,OAAO,EAAE,UAAU,EAC1C,WAAW,EAAE,wBAAwB;IAOxD,OAAO,CAAC,wBAAwB;IAShC,OAAO,CAAC,gBAAgB;cAwBL,mBAAmB,CACpC,SAAS,EAAE,MAAM,GAChB,cAAc,GAAG,KAAK;IAczB,OAAO,CAAC,+BAA+B;YAoCzB,eAAe;IA0C7B,gBAAgB,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW;CA8OhE"}
1
+ {"version":3,"file":"mcp-tools.handler.d.ts","sourceRoot":"","sources":["../../../../src/mcp/services/handlers/mcp-tools.handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAEL,cAAc,EAIf,MAAM,oCAAoC,CAAC;AAS5C,OAAO,EAAoB,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,EAEL,2BAA2B,EAC5B,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,OAAO,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAC;AAEtE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAGzE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAMzE,qBACa,eAAgB,SAAQ,cAAc;IAOtB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAC/C,OAAO,CAAC,QAAQ,CAAC,WAAW;IAR9B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAU;gBAGxC,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,2BAA2B,EACrC,SAAS,EAAE,SAAS,EACsB,WAAW,EAAE,MAAM,EACrB,OAAO,EAAE,UAAU,EAC1C,WAAW,EAAE,wBAAwB;IAOxD,OAAO,CAAC,wBAAwB;IAShC,OAAO,CAAC,gBAAgB;cAwBL,mBAAmB,CACpC,SAAS,EAAE,MAAM,GAChB,cAAc,GAAG,KAAK;IAczB,OAAO,CAAC,+BAA+B;YAoCzB,eAAe;IA0C7B,gBAAgB,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW;CA8OhE"}
@@ -17,12 +17,12 @@ exports.McpToolsHandler = void 0;
17
17
  const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
18
18
  const common_1 = require("@nestjs/common");
19
19
  const core_1 = require("@nestjs/core");
20
- const mcp_registry_service_1 = require("../mcp-registry.service");
20
+ const mcp_registry_discovery_service_1 = require("../mcp-registry-discovery.service");
21
21
  const mcp_handler_base_1 = require("./mcp-handler.base");
22
22
  const tool_authorization_service_1 = require("../tool-authorization.service");
23
23
  const zod_json_schema_compat_js_1 = require("@modelcontextprotocol/sdk/server/zod-json-schema-compat.js");
24
24
  const zod_compat_js_1 = require("@modelcontextprotocol/sdk/server/zod-compat.js");
25
- const mcp_tool_builder_service_1 = require("../mcp-tool-builder.service");
25
+ const mcp_dynamic_registry_service_1 = require("../mcp-dynamic-registry.service");
26
26
  let McpToolsHandler = McpToolsHandler_1 = class McpToolsHandler extends mcp_handler_base_1.McpHandlerBase {
27
27
  constructor(moduleRef, registry, reflector, mcpModuleId, options, authService) {
28
28
  super(moduleRef, registry, reflector, McpToolsHandler_1.name, options);
@@ -218,8 +218,8 @@ let McpToolsHandler = McpToolsHandler_1 = class McpToolsHandler extends mcp_hand
218
218
  this.moduleRef.registerRequestByContextId(httpRequest, contextId);
219
219
  const context = this.createContext(mcpServer, request);
220
220
  let result;
221
- if (toolInfo.providerClass === mcp_tool_builder_service_1.DYNAMIC_TOOL_HANDLER_TOKEN) {
222
- const handler = mcp_tool_builder_service_1.McpToolBuilder.getHandlerByModuleId(this.mcpModuleId, request.params.name);
221
+ if (toolInfo.providerClass === mcp_dynamic_registry_service_1.DYNAMIC_TOOL_HANDLER_TOKEN) {
222
+ const handler = mcp_dynamic_registry_service_1.McpRegistryService.getHandlerByModuleId(this.mcpModuleId, request.params.name);
223
223
  if (!handler) {
224
224
  throw new types_js_1.McpError(types_js_1.ErrorCode.MethodNotFound, `Handler not found for dynamic tool: ${request.params.name}`);
225
225
  }
@@ -248,7 +248,7 @@ exports.McpToolsHandler = McpToolsHandler = McpToolsHandler_1 = __decorate([
248
248
  __param(3, (0, common_1.Inject)('MCP_MODULE_ID')),
249
249
  __param(4, (0, common_1.Inject)('MCP_OPTIONS')),
250
250
  __metadata("design:paramtypes", [core_1.ModuleRef,
251
- mcp_registry_service_1.McpRegistryService,
251
+ mcp_registry_discovery_service_1.McpRegistryDiscoveryService,
252
252
  core_1.Reflector, String, Object, tool_authorization_service_1.ToolAuthorizationService])
253
253
  ], McpToolsHandler);
254
254
  //# sourceMappingURL=mcp-tools.handler.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-tools.handler.js","sourceRoot":"","sources":["../../../../src/mcp/services/handlers/mcp-tools.handler.ts"],"names":[],"mappings":"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","sourcesContent":["import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport {\n CallToolRequestSchema,\n CallToolResult,\n ErrorCode,\n ListToolsRequestSchema,\n McpError,\n} from '@modelcontextprotocol/sdk/types.js';\nimport {\n CanActivate,\n ExecutionContext,\n Inject,\n Injectable,\n Scope,\n Type,\n} from '@nestjs/common';\nimport { ContextIdFactory, ModuleRef, Reflector } from '@nestjs/core';\nimport { DiscoveredTool, McpRegistryService } from '../mcp-registry.service';\nimport { ToolGuardExecutionContext, ToolMetadata } from '../../decorators';\nimport { McpHandlerBase } from './mcp-handler.base';\nimport { ZodType } from 'zod';\nimport { HttpRequest } from '../../interfaces/http-adapter.interface';\nimport { McpRequestWithUser } from 'src/authz';\nimport { ToolAuthorizationService } from '../tool-authorization.service';\nimport { toJsonSchemaCompat } from '@modelcontextprotocol/sdk/server/zod-json-schema-compat.js';\nimport { normalizeObjectSchema } from '@modelcontextprotocol/sdk/server/zod-compat.js';\nimport type { McpOptions } from '../../interfaces/mcp-options.interface';\nimport {\n McpToolBuilder,\n DYNAMIC_TOOL_HANDLER_TOKEN,\n} from '../mcp-tool-builder.service';\n\n@Injectable({ scope: Scope.REQUEST })\nexport class McpToolsHandler extends McpHandlerBase {\n private readonly moduleHasGuards: boolean;\n\n constructor(\n moduleRef: ModuleRef,\n registry: McpRegistryService,\n reflector: Reflector,\n @Inject('MCP_MODULE_ID') private readonly mcpModuleId: string,\n @Inject('MCP_OPTIONS') private readonly options: McpOptions,\n private readonly authService: ToolAuthorizationService,\n ) {\n super(moduleRef, registry, reflector, McpToolsHandler.name, options);\n this.moduleHasGuards =\n this.options.guards !== undefined && this.options.guards.length > 0;\n }\n\n private buildDefaultContentBlock(result: any) {\n return [\n {\n type: 'text',\n text: JSON.stringify(result),\n },\n ];\n }\n\n private formatToolResult(result: any, outputSchema?: ZodType): any {\n if (result && typeof result === 'object' && Array.isArray(result.content)) {\n return result;\n }\n\n if (outputSchema) {\n const validation = outputSchema.safeParse(result);\n if (!validation.success) {\n throw new McpError(\n ErrorCode.InternalError,\n `Tool result does not match outputSchema: ${validation.error.message}`,\n );\n }\n return {\n structuredContent: result,\n content: this.buildDefaultContentBlock(result),\n };\n }\n\n return {\n content: this.buildDefaultContentBlock(result),\n };\n }\n\n protected override createErrorResponse(\n errorText: string,\n ): CallToolResult | never {\n return {\n content: [{ type: 'text', text: errorText }],\n isError: true,\n };\n }\n\n /**\n * Creates an ExecutionContext for @ToolGuards() evaluation.\n *\n * Only the fields documented in ToolGuardExecutionContext are available.\n * Invalid fields throw with a descriptive message rather than silently\n * returning garbage.\n */\n private createToolGuardExecutionContext(\n httpRequest: HttpRequest,\n tool: DiscoveredTool<ToolMetadata>,\n ): ToolGuardExecutionContext & ExecutionContext {\n const providerClass = tool.providerClass as Type;\n const methodHandler =\n providerClass.prototype?.[tool.methodName] ?? (() => {});\n\n const unavailable = (method: string): never => {\n throw new Error(\n `${method} is not available in @ToolGuards() context. ` +\n `MCP tools share a single HTTP endpoint, so only a limited API is available.` +\n `See ToolGuardExecutionContext for the supported API.`,\n );\n };\n\n return {\n switchToHttp: () => ({\n getRequest: <T = unknown>() => httpRequest.raw as T,\n getResponse: () => unavailable('switchToHttp().getResponse()'),\n getNext: () => unavailable('switchToHttp().getNext()'),\n }),\n getClass: <T = unknown>() => providerClass as Type<T>,\n getHandler: () => methodHandler as () => void,\n getArgs: () => unavailable('getArgs()'),\n getArgByIndex: () => unavailable('getArgByIndex()'),\n getType: <TContext extends string = string>() => 'http' as TContext,\n switchToRpc: () => unavailable('switchToRpc()'),\n switchToWs: () => unavailable('switchToWs()'),\n };\n }\n\n /**\n * Evaluates all @ToolGuards() for a tool.\n * Returns true if the tool has no guards or all guards pass.\n */\n private async checkToolGuards(\n tool: DiscoveredTool<ToolMetadata>,\n httpRequest: HttpRequest,\n ): Promise<boolean> {\n const guards = tool.metadata.guards;\n if (!guards || guards.length === 0) {\n return true;\n }\n\n // Guards require HTTP context - not available on STDIO\n if (!httpRequest.raw) {\n this.logger.warn(\n `@ToolGuards() on tool '${tool.metadata.name}' cannot be evaluated without HTTP context (STDIO transport). ` +\n `The tool will be hidden. Use HTTP transport to support guarded tools.`,\n );\n return false;\n }\n\n const context = this.createToolGuardExecutionContext(httpRequest, tool);\n\n for (const GuardClass of guards) {\n try {\n const guard = this.moduleRef.get<CanActivate>(GuardClass, {\n strict: false,\n });\n const result = guard.canActivate(context);\n const canActivate = result instanceof Promise ? await result : result;\n if (!canActivate) {\n return false;\n }\n } catch (error) {\n this.logger.warn(\n `@ToolGuards() guard ${GuardClass.name} threw on tool '${tool.metadata.name}': ${error.message}. ` +\n `The tool will be hidden. If this is unexpected, ensure the guard only uses ` +\n `the API available in ToolGuardExecutionContext.`,\n );\n return false;\n }\n }\n\n return true;\n }\n registerHandlers(mcpServer: McpServer, httpRequest: HttpRequest) {\n if (this.registry.getTools(this.mcpModuleId).length === 0) {\n this.logger.debug('No tools registered, skipping tool handlers');\n return;\n }\n\n mcpServer.server.setRequestHandler(ListToolsRequestSchema, async () => {\n // Extract user from request (may be undefined if not authenticated or STDIO)\n // For STDIO transport, httpRequest.raw is undefined, so bypass auth entirely\n const user = httpRequest.raw\n ? (httpRequest.raw as McpRequestWithUser).user\n : undefined;\n\n // Get all tools and filter based on user permissions\n // STDIO: If no httpRequest.raw, disable guards (local dev mode)\n const allTools = this.registry.getTools(this.mcpModuleId);\n const effectiveModuleHasGuards = httpRequest.raw\n ? this.moduleHasGuards\n : false;\n const allowUnauthenticatedAccess =\n this.options.allowUnauthenticatedAccess ?? false;\n\n // Filter by JWT-based authorization (scopes, roles, public)\n const jwtAuthorizedTools = allTools.filter((tool) =>\n this.authService.canAccessTool(\n user,\n tool,\n effectiveModuleHasGuards,\n allowUnauthenticatedAccess,\n ),\n );\n\n // Filter by @ToolGuards() - evaluate each tool's guards\n const authorizedTools: typeof jwtAuthorizedTools = [];\n for (const tool of jwtAuthorizedTools) {\n if (await this.checkToolGuards(tool, httpRequest)) {\n authorizedTools.push(tool);\n }\n }\n\n const tools = authorizedTools.map((tool) => {\n // Create base schema\n const toolSchema = {\n name: tool.metadata.name,\n description: tool.metadata.description,\n annotations: tool.metadata.annotations,\n _meta: tool.metadata._meta,\n };\n\n // Add security schemes\n const securitySchemes = this.authService.generateSecuritySchemes(\n tool,\n effectiveModuleHasGuards,\n );\n if (securitySchemes.length > 0) {\n toolSchema['securitySchemes'] = securitySchemes;\n // Note: Currently securitySchemes are not supported in MCP sdk, adding to _meta as workaround\n // (see https://developers.openai.com/apps-sdk/reference/)\n toolSchema._meta = {\n ...toolSchema._meta,\n securitySchemes,\n };\n }\n\n // Add input schema if defined\n const normalizedInputParameters = normalizeObjectSchema(\n tool.metadata.parameters,\n );\n if (normalizedInputParameters) {\n toolSchema['inputSchema'] = toJsonSchemaCompat(\n normalizedInputParameters,\n );\n }\n\n // Add output schema if defined, ensuring it has type: 'object'\n const normalizedOutputSchema = normalizeObjectSchema(\n tool.metadata.outputSchema,\n );\n if (normalizedOutputSchema) {\n const outputSchema = toJsonSchemaCompat(normalizedOutputSchema);\n\n // Create a new object that explicitly includes type: 'object'\n const jsonSchema = {\n ...outputSchema,\n type: 'object',\n };\n\n toolSchema['outputSchema'] = jsonSchema;\n }\n\n return toolSchema;\n });\n\n return {\n tools,\n };\n });\n\n mcpServer.server.setRequestHandler(\n CallToolRequestSchema,\n async (request) => {\n this.logger.debug('CallToolRequestSchema is being called');\n\n const toolInfo = this.registry.findTool(\n this.mcpModuleId,\n request.params.name,\n );\n\n if (!toolInfo) {\n throw new McpError(\n ErrorCode.MethodNotFound,\n `Unknown tool: ${request.params.name}`,\n );\n }\n\n // Validate authorization before execution\n // For STDIO transport, bypass auth entirely (local dev mode)\n const user = httpRequest.raw\n ? (httpRequest.raw as McpRequestWithUser).user\n : undefined;\n const effectiveModuleHasGuards = httpRequest.raw\n ? this.moduleHasGuards\n : false;\n const allowUnauthenticatedAccess =\n this.options.allowUnauthenticatedAccess ?? false;\n this.authService.validateToolAccess(\n user,\n toolInfo,\n effectiveModuleHasGuards,\n allowUnauthenticatedAccess,\n );\n\n // Validate @ToolGuards()\n const guardsPassed = await this.checkToolGuards(toolInfo, httpRequest);\n if (!guardsPassed) {\n throw new McpError(\n ErrorCode.InvalidRequest,\n `Access denied: insufficient permissions for tool '${request.params.name}'`,\n );\n }\n\n try {\n // Validate input parameters against the tool's schema\n if (toolInfo.metadata.parameters) {\n const validation = toolInfo.metadata.parameters.safeParse(\n request.params.arguments || {},\n );\n if (!validation.success) {\n const issues = validation.error.issues\n .map((issue) => {\n const path =\n issue.path.length > 0 ? issue.path.join('.') : '';\n const location = path ? `[${path}]: ` : '';\n return `${location}${issue.message}`;\n })\n .join('; ');\n return {\n content: [\n {\n type: 'text',\n text: `Invalid parameters: ${issues}`,\n },\n ],\n isError: true,\n };\n }\n // Use validated arguments to ensure defaults and transformations are applied\n request.params.arguments = validation.data as Record<\n string,\n unknown\n >;\n }\n\n const contextId = ContextIdFactory.getByRequest(httpRequest);\n this.moduleRef.registerRequestByContextId(httpRequest, contextId);\n\n const context = this.createContext(mcpServer, request);\n let result: any;\n\n // Check if this is a dynamic tool (registered via McpToolBuilder)\n if (toolInfo.providerClass === DYNAMIC_TOOL_HANDLER_TOKEN) {\n // Dynamic tool - get handler using static method with the correct moduleId\n const handler = McpToolBuilder.getHandlerByModuleId(\n this.mcpModuleId,\n request.params.name,\n );\n\n if (!handler) {\n throw new McpError(\n ErrorCode.MethodNotFound,\n `Handler not found for dynamic tool: ${request.params.name}`,\n );\n }\n\n result = await handler(\n request.params.arguments || {},\n context,\n httpRequest.raw as McpRequestWithUser,\n );\n } else {\n // Decorator-based tool - resolve provider instance and call method\n const toolInstance = await this.moduleRef.resolve(\n toolInfo.providerClass,\n contextId,\n { strict: false },\n );\n\n if (!toolInstance) {\n throw new McpError(\n ErrorCode.MethodNotFound,\n `Unknown tool: ${request.params.name}`,\n );\n }\n\n result = await toolInstance[toolInfo.methodName].call(\n toolInstance,\n request.params.arguments,\n context,\n httpRequest.raw as McpRequestWithUser,\n );\n }\n\n const transformedResult = this.formatToolResult(\n result,\n toolInfo.metadata.outputSchema,\n );\n\n this.logger.debug('CallToolRequestSchema result', transformedResult);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return transformedResult;\n } catch (error) {\n // We are assuming error as at least a message property\n return this.handleError(error as Error, toolInfo, httpRequest);\n }\n },\n );\n }\n}\n"]}
1
+ {"version":3,"file":"mcp-tools.handler.js","sourceRoot":"","sources":["../../../../src/mcp/services/handlers/mcp-tools.handler.ts"],"names":[],"mappings":"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","sourcesContent":["import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport {\n CallToolRequestSchema,\n CallToolResult,\n ErrorCode,\n ListToolsRequestSchema,\n McpError,\n} from '@modelcontextprotocol/sdk/types.js';\nimport {\n CanActivate,\n ExecutionContext,\n Inject,\n Injectable,\n Scope,\n Type,\n} from '@nestjs/common';\nimport { ContextIdFactory, ModuleRef, Reflector } from '@nestjs/core';\nimport {\n DiscoveredCapability,\n McpRegistryDiscoveryService,\n} from '../mcp-registry-discovery.service';\nimport { ToolGuardExecutionContext, ToolMetadata } from '../../decorators';\nimport { McpHandlerBase } from './mcp-handler.base';\nimport { ZodType } from 'zod';\nimport { HttpRequest } from '../../interfaces/http-adapter.interface';\nimport { McpRequestWithUser } from 'src/authz';\nimport { ToolAuthorizationService } from '../tool-authorization.service';\nimport { toJsonSchemaCompat } from '@modelcontextprotocol/sdk/server/zod-json-schema-compat.js';\nimport { normalizeObjectSchema } from '@modelcontextprotocol/sdk/server/zod-compat.js';\nimport type { McpOptions } from '../../interfaces/mcp-options.interface';\nimport {\n McpRegistryService,\n DYNAMIC_TOOL_HANDLER_TOKEN,\n} from '../mcp-dynamic-registry.service';\n\n@Injectable({ scope: Scope.REQUEST })\nexport class McpToolsHandler extends McpHandlerBase {\n private readonly moduleHasGuards: boolean;\n\n constructor(\n moduleRef: ModuleRef,\n registry: McpRegistryDiscoveryService,\n reflector: Reflector,\n @Inject('MCP_MODULE_ID') private readonly mcpModuleId: string,\n @Inject('MCP_OPTIONS') private readonly options: McpOptions,\n private readonly authService: ToolAuthorizationService,\n ) {\n super(moduleRef, registry, reflector, McpToolsHandler.name, options);\n this.moduleHasGuards =\n this.options.guards !== undefined && this.options.guards.length > 0;\n }\n\n private buildDefaultContentBlock(result: any) {\n return [\n {\n type: 'text',\n text: JSON.stringify(result),\n },\n ];\n }\n\n private formatToolResult(result: any, outputSchema?: ZodType): any {\n if (result && typeof result === 'object' && Array.isArray(result.content)) {\n return result;\n }\n\n if (outputSchema) {\n const validation = outputSchema.safeParse(result);\n if (!validation.success) {\n throw new McpError(\n ErrorCode.InternalError,\n `Tool result does not match outputSchema: ${validation.error.message}`,\n );\n }\n return {\n structuredContent: result,\n content: this.buildDefaultContentBlock(result),\n };\n }\n\n return {\n content: this.buildDefaultContentBlock(result),\n };\n }\n\n protected override createErrorResponse(\n errorText: string,\n ): CallToolResult | never {\n return {\n content: [{ type: 'text', text: errorText }],\n isError: true,\n };\n }\n\n /**\n * Creates an ExecutionContext for @ToolGuards() evaluation.\n *\n * Only the fields documented in ToolGuardExecutionContext are available.\n * Invalid fields throw with a descriptive message rather than silently\n * returning garbage.\n */\n private createToolGuardExecutionContext(\n httpRequest: HttpRequest,\n tool: DiscoveredCapability<ToolMetadata>,\n ): ToolGuardExecutionContext & ExecutionContext {\n const providerClass = tool.providerClass as Type;\n const methodHandler =\n providerClass.prototype?.[tool.methodName] ?? (() => {});\n\n const unavailable = (method: string): never => {\n throw new Error(\n `${method} is not available in @ToolGuards() context. ` +\n `MCP tools share a single HTTP endpoint, so only a limited API is available.` +\n `See ToolGuardExecutionContext for the supported API.`,\n );\n };\n\n return {\n switchToHttp: () => ({\n getRequest: <T = unknown>() => httpRequest.raw as T,\n getResponse: () => unavailable('switchToHttp().getResponse()'),\n getNext: () => unavailable('switchToHttp().getNext()'),\n }),\n getClass: <T = unknown>() => providerClass as Type<T>,\n getHandler: () => methodHandler as () => void,\n getArgs: () => unavailable('getArgs()'),\n getArgByIndex: () => unavailable('getArgByIndex()'),\n getType: <TContext extends string = string>() => 'http' as TContext,\n switchToRpc: () => unavailable('switchToRpc()'),\n switchToWs: () => unavailable('switchToWs()'),\n };\n }\n\n /**\n * Evaluates all @ToolGuards() for a tool.\n * Returns true if the tool has no guards or all guards pass.\n */\n private async checkToolGuards(\n tool: DiscoveredCapability<ToolMetadata>,\n httpRequest: HttpRequest,\n ): Promise<boolean> {\n const guards = tool.metadata.guards;\n if (!guards || guards.length === 0) {\n return true;\n }\n\n // Guards require HTTP context - not available on STDIO\n if (!httpRequest.raw) {\n this.logger.warn(\n `@ToolGuards() on tool '${tool.metadata.name}' cannot be evaluated without HTTP context (STDIO transport). ` +\n `The tool will be hidden. Use HTTP transport to support guarded tools.`,\n );\n return false;\n }\n\n const context = this.createToolGuardExecutionContext(httpRequest, tool);\n\n for (const GuardClass of guards) {\n try {\n const guard = this.moduleRef.get<CanActivate>(GuardClass, {\n strict: false,\n });\n const result = guard.canActivate(context);\n const canActivate = result instanceof Promise ? await result : result;\n if (!canActivate) {\n return false;\n }\n } catch (error) {\n this.logger.warn(\n `@ToolGuards() guard ${GuardClass.name} threw on tool '${tool.metadata.name}': ${error.message}. ` +\n `The tool will be hidden. If this is unexpected, ensure the guard only uses ` +\n `the API available in ToolGuardExecutionContext.`,\n );\n return false;\n }\n }\n\n return true;\n }\n registerHandlers(mcpServer: McpServer, httpRequest: HttpRequest) {\n if (this.registry.getTools(this.mcpModuleId).length === 0) {\n this.logger.debug('No tools registered, skipping tool handlers');\n return;\n }\n\n mcpServer.server.setRequestHandler(ListToolsRequestSchema, async () => {\n // Extract user from request (may be undefined if not authenticated or STDIO)\n // For STDIO transport, httpRequest.raw is undefined, so bypass auth entirely\n const user = httpRequest.raw\n ? (httpRequest.raw as McpRequestWithUser).user\n : undefined;\n\n // Get all tools and filter based on user permissions\n // STDIO: If no httpRequest.raw, disable guards (local dev mode)\n const allTools = this.registry.getTools(this.mcpModuleId);\n const effectiveModuleHasGuards = httpRequest.raw\n ? this.moduleHasGuards\n : false;\n const allowUnauthenticatedAccess =\n this.options.allowUnauthenticatedAccess ?? false;\n\n // Filter by JWT-based authorization (scopes, roles, public)\n const jwtAuthorizedTools = allTools.filter((tool) =>\n this.authService.canAccessTool(\n user,\n tool,\n effectiveModuleHasGuards,\n allowUnauthenticatedAccess,\n ),\n );\n\n // Filter by @ToolGuards() - evaluate each tool's guards\n const authorizedTools: typeof jwtAuthorizedTools = [];\n for (const tool of jwtAuthorizedTools) {\n if (await this.checkToolGuards(tool, httpRequest)) {\n authorizedTools.push(tool);\n }\n }\n\n const tools = authorizedTools.map((tool) => {\n // Create base schema\n const toolSchema = {\n name: tool.metadata.name,\n description: tool.metadata.description,\n annotations: tool.metadata.annotations,\n _meta: tool.metadata._meta,\n };\n\n // Add security schemes\n const securitySchemes = this.authService.generateSecuritySchemes(\n tool,\n effectiveModuleHasGuards,\n );\n if (securitySchemes.length > 0) {\n toolSchema['securitySchemes'] = securitySchemes;\n // Note: Currently securitySchemes are not supported in MCP sdk, adding to _meta as workaround\n // (see https://developers.openai.com/apps-sdk/reference/)\n toolSchema._meta = {\n ...toolSchema._meta,\n securitySchemes,\n };\n }\n\n // Add input schema if defined\n const normalizedInputParameters = normalizeObjectSchema(\n tool.metadata.parameters,\n );\n if (normalizedInputParameters) {\n toolSchema['inputSchema'] = toJsonSchemaCompat(\n normalizedInputParameters,\n );\n }\n\n // Add output schema if defined, ensuring it has type: 'object'\n const normalizedOutputSchema = normalizeObjectSchema(\n tool.metadata.outputSchema,\n );\n if (normalizedOutputSchema) {\n const outputSchema = toJsonSchemaCompat(normalizedOutputSchema);\n\n // Create a new object that explicitly includes type: 'object'\n const jsonSchema = {\n ...outputSchema,\n type: 'object',\n };\n\n toolSchema['outputSchema'] = jsonSchema;\n }\n\n return toolSchema;\n });\n\n return {\n tools,\n };\n });\n\n mcpServer.server.setRequestHandler(\n CallToolRequestSchema,\n async (request) => {\n this.logger.debug('CallToolRequestSchema is being called');\n\n const toolInfo = this.registry.findTool(\n this.mcpModuleId,\n request.params.name,\n );\n\n if (!toolInfo) {\n throw new McpError(\n ErrorCode.MethodNotFound,\n `Unknown tool: ${request.params.name}`,\n );\n }\n\n // Validate authorization before execution\n // For STDIO transport, bypass auth entirely (local dev mode)\n const user = httpRequest.raw\n ? (httpRequest.raw as McpRequestWithUser).user\n : undefined;\n const effectiveModuleHasGuards = httpRequest.raw\n ? this.moduleHasGuards\n : false;\n const allowUnauthenticatedAccess =\n this.options.allowUnauthenticatedAccess ?? false;\n this.authService.validateToolAccess(\n user,\n toolInfo,\n effectiveModuleHasGuards,\n allowUnauthenticatedAccess,\n );\n\n // Validate @ToolGuards()\n const guardsPassed = await this.checkToolGuards(toolInfo, httpRequest);\n if (!guardsPassed) {\n throw new McpError(\n ErrorCode.InvalidRequest,\n `Access denied: insufficient permissions for tool '${request.params.name}'`,\n );\n }\n\n try {\n // Validate input parameters against the tool's schema\n if (toolInfo.metadata.parameters) {\n const validation = toolInfo.metadata.parameters.safeParse(\n request.params.arguments || {},\n );\n if (!validation.success) {\n const issues = validation.error.issues\n .map((issue) => {\n const path =\n issue.path.length > 0 ? issue.path.join('.') : '';\n const location = path ? `[${path}]: ` : '';\n return `${location}${issue.message}`;\n })\n .join('; ');\n return {\n content: [\n {\n type: 'text',\n text: `Invalid parameters: ${issues}`,\n },\n ],\n isError: true,\n };\n }\n // Use validated arguments to ensure defaults and transformations are applied\n request.params.arguments = validation.data as Record<\n string,\n unknown\n >;\n }\n\n const contextId = ContextIdFactory.getByRequest(httpRequest);\n this.moduleRef.registerRequestByContextId(httpRequest, contextId);\n\n const context = this.createContext(mcpServer, request);\n let result: any;\n\n // Check if this is a dynamic tool (registered via McpRegistryService)\n if (toolInfo.providerClass === DYNAMIC_TOOL_HANDLER_TOKEN) {\n // Dynamic tool - get handler using static method with the correct moduleId\n const handler = McpRegistryService.getHandlerByModuleId(\n this.mcpModuleId,\n request.params.name,\n );\n\n if (!handler) {\n throw new McpError(\n ErrorCode.MethodNotFound,\n `Handler not found for dynamic tool: ${request.params.name}`,\n );\n }\n\n result = await handler(\n request.params.arguments || {},\n context,\n httpRequest.raw as McpRequestWithUser,\n );\n } else {\n // Decorator-based tool - resolve provider instance and call method\n const toolInstance = await this.moduleRef.resolve(\n toolInfo.providerClass,\n contextId,\n { strict: false },\n );\n\n if (!toolInstance) {\n throw new McpError(\n ErrorCode.MethodNotFound,\n `Unknown tool: ${request.params.name}`,\n );\n }\n\n result = await toolInstance[toolInfo.methodName].call(\n toolInstance,\n request.params.arguments,\n context,\n httpRequest.raw as McpRequestWithUser,\n );\n }\n\n const transformedResult = this.formatToolResult(\n result,\n toolInfo.metadata.outputSchema,\n );\n\n this.logger.debug('CallToolRequestSchema result', transformedResult);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return transformedResult;\n } catch (error) {\n // We are assuming error as at least a message property\n return this.handleError(error as Error, toolInfo, httpRequest);\n }\n },\n );\n }\n}\n"]}
@@ -0,0 +1,26 @@
1
+ import { DynamicToolDefinition, DynamicToolHandler } from '../interfaces/dynamic-tool.interface';
2
+ import { DynamicResourceDefinition, DynamicResourceHandler } from '../interfaces/dynamic-resource.interface';
3
+ import { DynamicPromptDefinition, DynamicPromptHandler } from '../interfaces/dynamic-prompt.interface';
4
+ import { McpRegistryDiscoveryService } from './mcp-registry-discovery.service';
5
+ import type { McpOptions } from '../interfaces';
6
+ export declare const DYNAMIC_TOOL_HANDLER_TOKEN: unique symbol;
7
+ export declare const DYNAMIC_RESOURCE_HANDLER_TOKEN: unique symbol;
8
+ export declare const DYNAMIC_PROMPT_HANDLER_TOKEN: unique symbol;
9
+ export declare class McpRegistryService {
10
+ private readonly registry;
11
+ private readonly mcpModuleId;
12
+ private readonly options;
13
+ private readonly logger;
14
+ constructor(registry: McpRegistryDiscoveryService, mcpModuleId: string, options: McpOptions);
15
+ registerTool(definition: DynamicToolDefinition): void;
16
+ getHandler(toolName: string): DynamicToolHandler | undefined;
17
+ static getHandlerByModuleId(mcpModuleId: string, toolName: string): DynamicToolHandler | undefined;
18
+ registerResource(definition: DynamicResourceDefinition): void;
19
+ static getResourceHandlerByModuleId(mcpModuleId: string, uri: string): DynamicResourceHandler | undefined;
20
+ registerPrompt(definition: DynamicPromptDefinition): void;
21
+ static getPromptHandlerByModuleId(mcpModuleId: string, name: string): DynamicPromptHandler | undefined;
22
+ removeTool(name: string): void;
23
+ removeResource(uri: string): void;
24
+ removePrompt(name: string): void;
25
+ }
26
+ //# sourceMappingURL=mcp-dynamic-registry.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-dynamic-registry.service.d.ts","sourceRoot":"","sources":["../../../src/mcp/services/mcp-dynamic-registry.service.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EACnB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EACL,yBAAyB,EACzB,sBAAsB,EACvB,MAAM,0CAA0C,CAAC;AAClD,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACrB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAUhD,eAAO,MAAM,0BAA0B,eAAiC,CAAC;AACzE,eAAO,MAAM,8BAA8B,eAE1C,CAAC;AACF,eAAO,MAAM,4BAA4B,eAAmC,CAAC;AAgD7E,qBACa,kBAAkB;IAI3B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACA,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO;IALjD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAGb,QAAQ,EAAE,2BAA2B,EACZ,WAAW,EAAE,MAAM,EACrB,OAAO,EAAE,UAAU;IAiC7D,YAAY,CAAC,UAAU,EAAE,qBAAqB,GAAG,IAAI;IAgCrD,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS;IAI5D,MAAM,CAAC,oBAAoB,CACzB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GACf,kBAAkB,GAAG,SAAS;IAIjC,gBAAgB,CAAC,UAAU,EAAE,yBAAyB,GAAG,IAAI;IAuB7D,MAAM,CAAC,4BAA4B,CACjC,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,GACV,sBAAsB,GAAG,SAAS;IAIrC,cAAc,CAAC,UAAU,EAAE,uBAAuB,GAAG,IAAI;IAqBzD,MAAM,CAAC,0BAA0B,CAC/B,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,GACX,oBAAoB,GAAG,SAAS;IAInC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAM9B,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAMjC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;CAKjC"}
@@ -0,0 +1,133 @@
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
+ var McpRegistryService_1;
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.McpRegistryService = exports.DYNAMIC_PROMPT_HANDLER_TOKEN = exports.DYNAMIC_RESOURCE_HANDLER_TOKEN = exports.DYNAMIC_TOOL_HANDLER_TOKEN = void 0;
17
+ const common_1 = require("@nestjs/common");
18
+ const zod_1 = require("zod");
19
+ const mcp_registry_discovery_service_1 = require("./mcp-registry-discovery.service");
20
+ const mcp_logger_factory_1 = require("../utils/mcp-logger.factory");
21
+ exports.DYNAMIC_TOOL_HANDLER_TOKEN = Symbol('DYNAMIC_TOOL_HANDLER');
22
+ exports.DYNAMIC_RESOURCE_HANDLER_TOKEN = Symbol('DYNAMIC_RESOURCE_HANDLER');
23
+ exports.DYNAMIC_PROMPT_HANDLER_TOKEN = Symbol('DYNAMIC_PROMPT_HANDLER');
24
+ const globalHandlers = new Map();
25
+ const globalResourceHandlers = new Map();
26
+ const globalPromptHandlers = new Map();
27
+ let McpRegistryService = McpRegistryService_1 = class McpRegistryService {
28
+ constructor(registry, mcpModuleId, options) {
29
+ this.registry = registry;
30
+ this.mcpModuleId = mcpModuleId;
31
+ this.options = options;
32
+ this.logger = (0, mcp_logger_factory_1.createMcpLogger)(McpRegistryService_1.name, this.options);
33
+ [globalHandlers, globalResourceHandlers, globalPromptHandlers].forEach((store) => {
34
+ if (!store.has(mcpModuleId)) {
35
+ store.set(mcpModuleId, new Map());
36
+ }
37
+ });
38
+ }
39
+ registerTool(definition) {
40
+ this.logger.debug(`Registering dynamic tool: ${definition.name}`);
41
+ const moduleHandlers = globalHandlers.get(this.mcpModuleId);
42
+ moduleHandlers.set(definition.name, definition.handler);
43
+ const parameters = definition.parameters ?? zod_1.z.object({});
44
+ const metadata = {
45
+ name: definition.name,
46
+ description: definition.description,
47
+ parameters,
48
+ outputSchema: definition.outputSchema,
49
+ annotations: definition.annotations,
50
+ _meta: definition._meta,
51
+ isPublic: definition.isPublic,
52
+ requiredScopes: definition.requiredScopes,
53
+ requiredRoles: definition.requiredRoles,
54
+ };
55
+ this.registry.registerDynamicCapability(this.mcpModuleId, {
56
+ type: 'tool',
57
+ metadata,
58
+ providerClass: exports.DYNAMIC_TOOL_HANDLER_TOKEN,
59
+ methodName: definition.name,
60
+ });
61
+ }
62
+ getHandler(toolName) {
63
+ return globalHandlers.get(this.mcpModuleId)?.get(toolName);
64
+ }
65
+ static getHandlerByModuleId(mcpModuleId, toolName) {
66
+ return globalHandlers.get(mcpModuleId)?.get(toolName);
67
+ }
68
+ registerResource(definition) {
69
+ this.logger.debug(`Registering dynamic resource: ${definition.uri}`);
70
+ globalResourceHandlers
71
+ .get(this.mcpModuleId)
72
+ .set(definition.uri, definition.handler);
73
+ const metadata = {
74
+ uri: definition.uri,
75
+ name: definition.name ?? definition.uri,
76
+ description: definition.description,
77
+ mimeType: definition.mimeType,
78
+ _meta: definition._meta,
79
+ };
80
+ this.registry.registerDynamicCapability(this.mcpModuleId, {
81
+ type: 'resource',
82
+ metadata,
83
+ providerClass: exports.DYNAMIC_RESOURCE_HANDLER_TOKEN,
84
+ methodName: definition.uri,
85
+ });
86
+ }
87
+ static getResourceHandlerByModuleId(mcpModuleId, uri) {
88
+ return globalResourceHandlers.get(mcpModuleId)?.get(uri);
89
+ }
90
+ registerPrompt(definition) {
91
+ this.logger.debug(`Registering dynamic prompt: ${definition.name}`);
92
+ globalPromptHandlers
93
+ .get(this.mcpModuleId)
94
+ .set(definition.name, definition.handler);
95
+ const metadata = {
96
+ name: definition.name,
97
+ description: definition.description,
98
+ parameters: definition.parameters,
99
+ };
100
+ this.registry.registerDynamicCapability(this.mcpModuleId, {
101
+ type: 'prompt',
102
+ metadata,
103
+ providerClass: exports.DYNAMIC_PROMPT_HANDLER_TOKEN,
104
+ methodName: definition.name,
105
+ });
106
+ }
107
+ static getPromptHandlerByModuleId(mcpModuleId, name) {
108
+ return globalPromptHandlers.get(mcpModuleId)?.get(name);
109
+ }
110
+ removeTool(name) {
111
+ this.logger.debug(`Removing dynamic tool: ${name}`);
112
+ globalHandlers.get(this.mcpModuleId)?.delete(name);
113
+ this.registry.removeDynamicCapability(this.mcpModuleId, 'tool', name);
114
+ }
115
+ removeResource(uri) {
116
+ this.logger.debug(`Removing dynamic resource: ${uri}`);
117
+ globalResourceHandlers.get(this.mcpModuleId)?.delete(uri);
118
+ this.registry.removeDynamicCapability(this.mcpModuleId, 'resource', uri);
119
+ }
120
+ removePrompt(name) {
121
+ this.logger.debug(`Removing dynamic prompt: ${name}`);
122
+ globalPromptHandlers.get(this.mcpModuleId)?.delete(name);
123
+ this.registry.removeDynamicCapability(this.mcpModuleId, 'prompt', name);
124
+ }
125
+ };
126
+ exports.McpRegistryService = McpRegistryService;
127
+ exports.McpRegistryService = McpRegistryService = McpRegistryService_1 = __decorate([
128
+ (0, common_1.Injectable)(),
129
+ __param(1, (0, common_1.Inject)('MCP_MODULE_ID')),
130
+ __param(2, (0, common_1.Inject)('MCP_OPTIONS')),
131
+ __metadata("design:paramtypes", [mcp_registry_discovery_service_1.McpRegistryDiscoveryService, String, Object])
132
+ ], McpRegistryService);
133
+ //# sourceMappingURL=mcp-dynamic-registry.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-dynamic-registry.service.js","sourceRoot":"","sources":["../../../src/mcp/services/mcp-dynamic-registry.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable, Inject, Logger } from '@nestjs/common';\nimport { z } from 'zod';\nimport {\n DynamicToolDefinition,\n DynamicToolHandler,\n} from '../interfaces/dynamic-tool.interface';\nimport {\n DynamicResourceDefinition,\n DynamicResourceHandler,\n} from '../interfaces/dynamic-resource.interface';\nimport {\n DynamicPromptDefinition,\n DynamicPromptHandler,\n} from '../interfaces/dynamic-prompt.interface';\nimport { McpRegistryDiscoveryService } from './mcp-registry-discovery.service';\nimport type { McpOptions } from '../interfaces';\nimport { createMcpLogger } from '../utils/mcp-logger.factory';\nimport { ToolMetadata } from '../decorators/tool.decorator';\nimport { ResourceMetadata } from '../decorators/resource.decorator';\nimport { PromptMetadata } from '../decorators/prompt.decorator';\n\n/**\n * Symbol used to identify dynamic tools in the registry.\n * When a tool's providerClass equals this token, it's a dynamic tool.\n */\nexport const DYNAMIC_TOOL_HANDLER_TOKEN = Symbol('DYNAMIC_TOOL_HANDLER');\nexport const DYNAMIC_RESOURCE_HANDLER_TOKEN = Symbol(\n 'DYNAMIC_RESOURCE_HANDLER',\n);\nexport const DYNAMIC_PROMPT_HANDLER_TOKEN = Symbol('DYNAMIC_PROMPT_HANDLER');\n\n/**\n * Global maps of dynamic capability handlers, scoped by moduleId.\n * Using module-level Maps ensures handlers persist across different\n * McpRegistryService instances that may be created by the DI container.\n */\nconst globalHandlers = new Map<string, Map<string, DynamicToolHandler>>();\nconst globalResourceHandlers = new Map<\n string,\n Map<string, DynamicResourceHandler>\n>();\nconst globalPromptHandlers = new Map<\n string,\n Map<string, DynamicPromptHandler>\n>();\n\n/**\n * Service for programmatically registering MCP tools at runtime.\n *\n * Use this to register tools with descriptions/parameters from databases\n * or other dynamic sources during application bootstrap.\n *\n * @example\n * ```typescript\n * @Injectable()\n * export class DynamicToolsService implements OnModuleInit {\n * constructor(\n * private readonly capabilityBuilder: McpRegistryService,\n * private readonly dbService: DatabaseService,\n * ) {}\n *\n * async onModuleInit() {\n * const collections = await this.dbService.getCollections();\n *\n * this.capabilityBuilder.registerTool({\n * name: 'search-knowledge',\n * description: `Search collections: ${collections.join(', ')}`,\n * parameters: z.object({ query: z.string() }),\n * handler: async (args, context) => {\n * const results = await this.dbService.search(args.query);\n * return { content: [{ type: 'text', text: JSON.stringify(results) }] };\n * },\n * });\n * }\n * }\n * ```\n */\n@Injectable()\nexport class McpRegistryService {\n private readonly logger: Logger;\n\n constructor(\n private readonly registry: McpRegistryDiscoveryService,\n @Inject('MCP_MODULE_ID') private readonly mcpModuleId: string,\n @Inject('MCP_OPTIONS') private readonly options: McpOptions,\n ) {\n this.logger = createMcpLogger(McpRegistryService.name, this.options);\n [globalHandlers, globalResourceHandlers, globalPromptHandlers].forEach(\n (store) => {\n if (!store.has(mcpModuleId)) {\n store.set(mcpModuleId, new Map());\n }\n },\n );\n }\n\n /**\n * Register a dynamic tool for the current MCP server.\n *\n * Tools registered here will appear in the `tools/list` response and\n * can be called via `tools/call` just like decorator-based tools.\n *\n * @param definition - The tool definition including name, description, parameters, and handler\n *\n * @example\n * ```typescript\n * registry.registerTool({\n * name: 'search-knowledge',\n * description: await getDescriptionFromDB(),\n * parameters: z.object({ query: z.string() }),\n * handler: async (args, context) => {\n * const results = await searchService.search(args.query);\n * return { content: [{ type: 'text', text: JSON.stringify(results) }] };\n * },\n * });\n * ```\n */\n registerTool(definition: DynamicToolDefinition): void {\n this.logger.debug(`Registering dynamic tool: ${definition.name}`);\n\n // Store the handler for later execution (scoped by moduleId)\n const moduleHandlers = globalHandlers.get(this.mcpModuleId)!;\n moduleHandlers.set(definition.name, definition.handler);\n\n // Default to empty object schema if no parameters provided (matches @Tool decorator behavior)\n const parameters = definition.parameters ?? z.object({});\n\n // Build metadata matching ToolMetadata interface\n const metadata: ToolMetadata = {\n name: definition.name,\n description: definition.description,\n parameters,\n outputSchema: definition.outputSchema,\n annotations: definition.annotations,\n _meta: definition._meta,\n isPublic: definition.isPublic,\n requiredScopes: definition.requiredScopes,\n requiredRoles: definition.requiredRoles,\n };\n\n // Register with the registry\n this.registry.registerDynamicCapability(this.mcpModuleId, {\n type: 'tool',\n metadata,\n providerClass: DYNAMIC_TOOL_HANDLER_TOKEN,\n methodName: definition.name,\n });\n }\n\n getHandler(toolName: string): DynamicToolHandler | undefined {\n return globalHandlers.get(this.mcpModuleId)?.get(toolName);\n }\n\n static getHandlerByModuleId(\n mcpModuleId: string,\n toolName: string,\n ): DynamicToolHandler | undefined {\n return globalHandlers.get(mcpModuleId)?.get(toolName);\n }\n\n registerResource(definition: DynamicResourceDefinition): void {\n this.logger.debug(`Registering dynamic resource: ${definition.uri}`);\n\n globalResourceHandlers\n .get(this.mcpModuleId)!\n .set(definition.uri, definition.handler);\n\n const metadata: ResourceMetadata = {\n uri: definition.uri,\n name: definition.name ?? definition.uri,\n description: definition.description,\n mimeType: definition.mimeType,\n _meta: definition._meta,\n };\n\n this.registry.registerDynamicCapability(this.mcpModuleId, {\n type: 'resource',\n metadata,\n providerClass: DYNAMIC_RESOURCE_HANDLER_TOKEN,\n methodName: definition.uri,\n });\n }\n\n static getResourceHandlerByModuleId(\n mcpModuleId: string,\n uri: string,\n ): DynamicResourceHandler | undefined {\n return globalResourceHandlers.get(mcpModuleId)?.get(uri);\n }\n\n registerPrompt(definition: DynamicPromptDefinition): void {\n this.logger.debug(`Registering dynamic prompt: ${definition.name}`);\n\n globalPromptHandlers\n .get(this.mcpModuleId)!\n .set(definition.name, definition.handler);\n\n const metadata: PromptMetadata = {\n name: definition.name,\n description: definition.description,\n parameters: definition.parameters,\n };\n\n this.registry.registerDynamicCapability(this.mcpModuleId, {\n type: 'prompt',\n metadata,\n providerClass: DYNAMIC_PROMPT_HANDLER_TOKEN,\n methodName: definition.name,\n });\n }\n\n static getPromptHandlerByModuleId(\n mcpModuleId: string,\n name: string,\n ): DynamicPromptHandler | undefined {\n return globalPromptHandlers.get(mcpModuleId)?.get(name);\n }\n\n removeTool(name: string): void {\n this.logger.debug(`Removing dynamic tool: ${name}`);\n globalHandlers.get(this.mcpModuleId)?.delete(name);\n this.registry.removeDynamicCapability(this.mcpModuleId, 'tool', name);\n }\n\n removeResource(uri: string): void {\n this.logger.debug(`Removing dynamic resource: ${uri}`);\n globalResourceHandlers.get(this.mcpModuleId)?.delete(uri);\n this.registry.removeDynamicCapability(this.mcpModuleId, 'resource', uri);\n }\n\n removePrompt(name: string): void {\n this.logger.debug(`Removing dynamic prompt: ${name}`);\n globalPromptHandlers.get(this.mcpModuleId)?.delete(name);\n this.registry.removeDynamicCapability(this.mcpModuleId, 'prompt', name);\n }\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
2
  import { ModuleRef, Reflector } from '@nestjs/core';
3
- import { McpRegistryService } from './mcp-registry.service';
3
+ import { McpRegistryDiscoveryService } from './mcp-registry-discovery.service';
4
4
  import { HttpRequest } from '../interfaces/http-adapter.interface';
5
5
  import { ToolAuthorizationService } from './tool-authorization.service';
6
6
  import type { McpOptions } from '../interfaces/mcp-options.interface';
@@ -9,7 +9,7 @@ export declare class McpExecutorService {
9
9
  private toolsHandler;
10
10
  private resourcesHandler;
11
11
  private promptsHandler;
12
- constructor(moduleRef: ModuleRef, registry: McpRegistryService, mcpModuleId: string, options: McpOptions, authService: ToolAuthorizationService, reflector: Reflector);
12
+ constructor(moduleRef: ModuleRef, registry: McpRegistryDiscoveryService, mcpModuleId: string, options: McpOptions, authService: ToolAuthorizationService, reflector: Reflector);
13
13
  registerRequestHandlers(mcpServer: McpServer, httpRequest: HttpRequest): void;
14
14
  }
15
15
  //# sourceMappingURL=mcp-executor.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-executor.service.d.ts","sourceRoot":"","sources":["../../../src/mcp/services/mcp-executor.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAI5D,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACnE,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AAMtE,qBACa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAAkB;IACtC,OAAO,CAAC,gBAAgB,CAAsB;IAC9C,OAAO,CAAC,cAAc,CAAoB;gBAGxC,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,kBAAkB,EACH,WAAW,EAAE,MAAM,EACrB,OAAO,EAAE,UAAU,EAC1C,WAAW,EAAE,wBAAwB,EACrC,SAAS,EAAE,SAAS;IA8BtB,uBAAuB,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW;CAKvE"}
1
+ {"version":3,"file":"mcp-executor.service.d.ts","sourceRoot":"","sources":["../../../src/mcp/services/mcp-executor.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAI/E,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACnE,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AAMtE,qBACa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAAkB;IACtC,OAAO,CAAC,gBAAgB,CAAsB;IAC9C,OAAO,CAAC,cAAc,CAAoB;gBAGxC,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,2BAA2B,EACZ,WAAW,EAAE,MAAM,EACrB,OAAO,EAAE,UAAU,EAC1C,WAAW,EAAE,wBAAwB,EACrC,SAAS,EAAE,SAAS;IA8BtB,uBAAuB,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW;CAKvE"}
@@ -16,7 +16,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
16
16
  exports.McpExecutorService = void 0;
17
17
  const common_1 = require("@nestjs/common");
18
18
  const core_1 = require("@nestjs/core");
19
- const mcp_registry_service_1 = require("./mcp-registry.service");
19
+ const mcp_registry_discovery_service_1 = require("./mcp-registry-discovery.service");
20
20
  const mcp_tools_handler_1 = require("./handlers/mcp-tools.handler");
21
21
  const mcp_resources_handler_1 = require("./handlers/mcp-resources.handler");
22
22
  const mcp_prompts_handler_1 = require("./handlers/mcp-prompts.handler");
@@ -41,7 +41,7 @@ exports.McpExecutorService = McpExecutorService = McpExecutorService_1 = __decor
41
41
  __param(2, (0, common_1.Inject)('MCP_MODULE_ID')),
42
42
  __param(3, (0, common_1.Inject)('MCP_OPTIONS')),
43
43
  __metadata("design:paramtypes", [core_1.ModuleRef,
44
- mcp_registry_service_1.McpRegistryService, String, Object, tool_authorization_service_1.ToolAuthorizationService,
44
+ mcp_registry_discovery_service_1.McpRegistryDiscoveryService, String, Object, tool_authorization_service_1.ToolAuthorizationService,
45
45
  core_1.Reflector])
46
46
  ], McpExecutorService);
47
47
  //# sourceMappingURL=mcp-executor.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-executor.service.js","sourceRoot":"","sources":["../../../src/mcp/services/mcp-executor.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AACA,2CAA6E;AAC7E,uCAAoD;AACpD,iEAA4D;AAC5D,oEAA+D;AAC/D,4EAAuE;AACvE,wEAAmE;AAEnE,6EAAwE;AAExE,oEAA8D;AAMvD,IAAM,kBAAkB,0BAAxB,MAAM,kBAAkB;IAM7B,YACE,SAAoB,EACpB,QAA4B,EACH,WAAmB,EACrB,OAAmB,EAC1C,WAAqC,EACrC,SAAoB;QAEpB,IAAI,CAAC,MAAM,GAAG,IAAA,oCAAe,EAAC,oBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAChE,IAAI,CAAC,YAAY,GAAG,IAAI,mCAAe,CACrC,SAAS,EACT,QAAQ,EACR,SAAS,EACT,WAAW,EACX,OAAO,EACP,WAAW,CACZ,CAAC;QACF,IAAI,CAAC,gBAAgB,GAAG,IAAI,2CAAmB,CAC7C,SAAS,EACT,QAAQ,EACR,SAAS,EACT,WAAW,CACZ,CAAC;QACF,IAAI,CAAC,cAAc,GAAG,IAAI,uCAAiB,CACzC,SAAS,EACT,QAAQ,EACR,SAAS,EACT,WAAW,CACZ,CAAC;IACJ,CAAC;IAOD,uBAAuB,CAAC,SAAoB,EAAE,WAAwB;QACpE,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAC3D,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAC/D,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAC/D,CAAC;CACF,CAAA;AA/CY,gDAAkB;6BAAlB,kBAAkB;IAD9B,IAAA,mBAAU,EAAC,EAAE,KAAK,EAAE,cAAK,CAAC,OAAO,EAAE,CAAC;IAUhC,WAAA,IAAA,eAAM,EAAC,eAAe,CAAC,CAAA;IACvB,WAAA,IAAA,eAAM,EAAC,aAAa,CAAC,CAAA;qCAHX,gBAAS;QACV,yCAAkB,kBAGf,qDAAwB;QAC1B,gBAAS;GAZX,kBAAkB,CA+C9B","sourcesContent":["import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { Inject, Injectable, Logger, Optional, Scope } from '@nestjs/common';\nimport { ModuleRef, Reflector } from '@nestjs/core';\nimport { McpRegistryService } from './mcp-registry.service';\nimport { McpToolsHandler } from './handlers/mcp-tools.handler';\nimport { McpResourcesHandler } from './handlers/mcp-resources.handler';\nimport { McpPromptsHandler } from './handlers/mcp-prompts.handler';\nimport { HttpRequest } from '../interfaces/http-adapter.interface';\nimport { ToolAuthorizationService } from './tool-authorization.service';\nimport type { McpOptions } from '../interfaces/mcp-options.interface';\nimport { createMcpLogger } from '../utils/mcp-logger.factory';\n\n/**\n * Request-scoped service for executing MCP tools\n */\n@Injectable({ scope: Scope.REQUEST })\nexport class McpExecutorService {\n private logger: Logger;\n private toolsHandler: McpToolsHandler;\n private resourcesHandler: McpResourcesHandler;\n private promptsHandler: McpPromptsHandler;\n\n constructor(\n moduleRef: ModuleRef,\n registry: McpRegistryService,\n @Inject('MCP_MODULE_ID') mcpModuleId: string,\n @Inject('MCP_OPTIONS') options: McpOptions,\n authService: ToolAuthorizationService,\n reflector: Reflector,\n ) {\n this.logger = createMcpLogger(McpExecutorService.name, options);\n this.toolsHandler = new McpToolsHandler(\n moduleRef,\n registry,\n reflector,\n mcpModuleId,\n options,\n authService,\n );\n this.resourcesHandler = new McpResourcesHandler(\n moduleRef,\n registry,\n reflector,\n mcpModuleId,\n );\n this.promptsHandler = new McpPromptsHandler(\n moduleRef,\n registry,\n reflector,\n mcpModuleId,\n );\n }\n\n /**\n * Register tool-related request handlers with the MCP server\n * @param mcpServer - The MCP server instance\n * @param request - The current HTTP request object\n */\n registerRequestHandlers(mcpServer: McpServer, httpRequest: HttpRequest) {\n this.toolsHandler.registerHandlers(mcpServer, httpRequest);\n this.resourcesHandler.registerHandlers(mcpServer, httpRequest);\n this.promptsHandler.registerHandlers(mcpServer, httpRequest);\n }\n}\n"]}
1
+ {"version":3,"file":"mcp-executor.service.js","sourceRoot":"","sources":["../../../src/mcp/services/mcp-executor.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AACA,2CAA6E;AAC7E,uCAAoD;AACpD,qFAA+E;AAC/E,oEAA+D;AAC/D,4EAAuE;AACvE,wEAAmE;AAEnE,6EAAwE;AAExE,oEAA8D;AAMvD,IAAM,kBAAkB,0BAAxB,MAAM,kBAAkB;IAM7B,YACE,SAAoB,EACpB,QAAqC,EACZ,WAAmB,EACrB,OAAmB,EAC1C,WAAqC,EACrC,SAAoB;QAEpB,IAAI,CAAC,MAAM,GAAG,IAAA,oCAAe,EAAC,oBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAChE,IAAI,CAAC,YAAY,GAAG,IAAI,mCAAe,CACrC,SAAS,EACT,QAAQ,EACR,SAAS,EACT,WAAW,EACX,OAAO,EACP,WAAW,CACZ,CAAC;QACF,IAAI,CAAC,gBAAgB,GAAG,IAAI,2CAAmB,CAC7C,SAAS,EACT,QAAQ,EACR,SAAS,EACT,WAAW,CACZ,CAAC;QACF,IAAI,CAAC,cAAc,GAAG,IAAI,uCAAiB,CACzC,SAAS,EACT,QAAQ,EACR,SAAS,EACT,WAAW,CACZ,CAAC;IACJ,CAAC;IAOD,uBAAuB,CAAC,SAAoB,EAAE,WAAwB;QACpE,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAC3D,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAC/D,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAC/D,CAAC;CACF,CAAA;AA/CY,gDAAkB;6BAAlB,kBAAkB;IAD9B,IAAA,mBAAU,EAAC,EAAE,KAAK,EAAE,cAAK,CAAC,OAAO,EAAE,CAAC;IAUhC,WAAA,IAAA,eAAM,EAAC,eAAe,CAAC,CAAA;IACvB,WAAA,IAAA,eAAM,EAAC,aAAa,CAAC,CAAA;qCAHX,gBAAS;QACV,4DAA2B,kBAGxB,qDAAwB;QAC1B,gBAAS;GAZX,kBAAkB,CA+C9B","sourcesContent":["import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { Inject, Injectable, Logger, Optional, Scope } from '@nestjs/common';\nimport { ModuleRef, Reflector } from '@nestjs/core';\nimport { McpRegistryDiscoveryService } from './mcp-registry-discovery.service';\nimport { McpToolsHandler } from './handlers/mcp-tools.handler';\nimport { McpResourcesHandler } from './handlers/mcp-resources.handler';\nimport { McpPromptsHandler } from './handlers/mcp-prompts.handler';\nimport { HttpRequest } from '../interfaces/http-adapter.interface';\nimport { ToolAuthorizationService } from './tool-authorization.service';\nimport type { McpOptions } from '../interfaces/mcp-options.interface';\nimport { createMcpLogger } from '../utils/mcp-logger.factory';\n\n/**\n * Request-scoped service for executing MCP tools\n */\n@Injectable({ scope: Scope.REQUEST })\nexport class McpExecutorService {\n private logger: Logger;\n private toolsHandler: McpToolsHandler;\n private resourcesHandler: McpResourcesHandler;\n private promptsHandler: McpPromptsHandler;\n\n constructor(\n moduleRef: ModuleRef,\n registry: McpRegistryDiscoveryService,\n @Inject('MCP_MODULE_ID') mcpModuleId: string,\n @Inject('MCP_OPTIONS') options: McpOptions,\n authService: ToolAuthorizationService,\n reflector: Reflector,\n ) {\n this.logger = createMcpLogger(McpExecutorService.name, options);\n this.toolsHandler = new McpToolsHandler(\n moduleRef,\n registry,\n reflector,\n mcpModuleId,\n options,\n authService,\n );\n this.resourcesHandler = new McpResourcesHandler(\n moduleRef,\n registry,\n reflector,\n mcpModuleId,\n );\n this.promptsHandler = new McpPromptsHandler(\n moduleRef,\n registry,\n reflector,\n mcpModuleId,\n );\n }\n\n /**\n * Register tool-related request handlers with the MCP server\n * @param mcpServer - The MCP server instance\n * @param request - The current HTTP request object\n */\n registerRequestHandlers(mcpServer: McpServer, httpRequest: HttpRequest) {\n this.toolsHandler.registerHandlers(mcpServer, httpRequest);\n this.resourcesHandler.registerHandlers(mcpServer, httpRequest);\n this.promptsHandler.registerHandlers(mcpServer, httpRequest);\n }\n}\n"]}
@@ -5,7 +5,7 @@ import { ResourceMetadata } from '../decorators/resource.decorator';
5
5
  import { PromptMetadata } from '../decorators/prompt.decorator';
6
6
  import { ResourceTemplateMetadata } from '../decorators/resource-template.decorator';
7
7
  import type { McpOptions } from '../interfaces';
8
- export type DiscoveredTool<T extends object> = {
8
+ export type DiscoveredCapability<T extends object> = {
9
9
  type: 'tool' | 'resource' | 'resource-template' | 'prompt';
10
10
  metadata: T;
11
11
  providerClass: InjectionToken;
@@ -14,13 +14,13 @@ export type DiscoveredTool<T extends object> = {
14
14
  export type InjectionTokenWithName = InjectionToken & {
15
15
  name: string;
16
16
  };
17
- export declare class McpRegistryService implements OnApplicationBootstrap {
17
+ export declare class McpRegistryDiscoveryService implements OnApplicationBootstrap {
18
18
  private readonly discovery;
19
19
  private readonly metadataScanner;
20
20
  private readonly modulesContainer;
21
21
  private readonly options?;
22
22
  private readonly logger;
23
- private discoveredToolsByMcpModuleId;
23
+ private discoveredCapabilitiesByMcpModuleId;
24
24
  constructor(discovery: DiscoveryService, metadataScanner: MetadataScanner, modulesContainer: ModulesContainer, options?: McpOptions | undefined);
25
25
  onApplicationBootstrap(): void;
26
26
  private discoverTools;
@@ -36,27 +36,28 @@ export declare class McpRegistryService implements OnApplicationBootstrap {
36
36
  private addDiscoveryResource;
37
37
  private addDiscoveryResourceTemplate;
38
38
  getMcpModuleIds(): string[];
39
- getTools(mcpModuleId: string): DiscoveredTool<ToolMetadata>[];
40
- findTool(mcpModuleId: string, name: string): DiscoveredTool<ToolMetadata> | undefined;
41
- getResources(mcpModuleId: string): DiscoveredTool<ResourceMetadata>[];
42
- findResource(mcpModuleId: string, name: string): DiscoveredTool<ResourceMetadata> | undefined;
43
- getResourceTemplates(mcpModuleId: string): DiscoveredTool<ResourceTemplateMetadata>[];
44
- findResourceTemplate(mcpModuleId: string, name: string): DiscoveredTool<ResourceTemplateMetadata> | undefined;
45
- getPrompts(mcpModuleId: string): DiscoveredTool<PromptMetadata>[];
46
- findPrompt(mcpModuleId: string, name: string): DiscoveredTool<PromptMetadata> | undefined;
39
+ getTools(mcpModuleId: string): DiscoveredCapability<ToolMetadata>[];
40
+ findTool(mcpModuleId: string, name: string): DiscoveredCapability<ToolMetadata> | undefined;
41
+ getResources(mcpModuleId: string): DiscoveredCapability<ResourceMetadata>[];
42
+ findResource(mcpModuleId: string, name: string): DiscoveredCapability<ResourceMetadata> | undefined;
43
+ getResourceTemplates(mcpModuleId: string): DiscoveredCapability<ResourceTemplateMetadata>[];
44
+ findResourceTemplate(mcpModuleId: string, name: string): DiscoveredCapability<ResourceTemplateMetadata> | undefined;
45
+ getPrompts(mcpModuleId: string): DiscoveredCapability<PromptMetadata>[];
46
+ findPrompt(mcpModuleId: string, name: string): DiscoveredCapability<PromptMetadata> | undefined;
47
47
  private convertTemplate;
48
48
  private extractTemplateQueryParams;
49
49
  private parseQueryString;
50
50
  private stripQueryString;
51
51
  private convertUri;
52
52
  findResourceByUri(mcpModuleId: string, uri: string): {
53
- resource: DiscoveredTool<ResourceMetadata>;
53
+ resource: DiscoveredCapability<ResourceMetadata>;
54
54
  params: Record<string, string>;
55
55
  } | undefined;
56
56
  findResourceTemplateByUri(mcpModuleId: string, uri: string): {
57
- resourceTemplate: DiscoveredTool<ResourceTemplateMetadata>;
57
+ resourceTemplate: DiscoveredCapability<ResourceTemplateMetadata>;
58
58
  params: Record<string, string>;
59
59
  } | undefined;
60
- registerDynamicTool(mcpModuleId: string, tool: DiscoveredTool<ToolMetadata>): void;
60
+ registerDynamicCapability<T extends object>(mcpModuleId: string, capability: DiscoveredCapability<T>): void;
61
+ removeDynamicCapability(mcpModuleId: string, type: DiscoveredCapability<object>['type'], identifier: string): void;
61
62
  }
62
- //# sourceMappingURL=mcp-registry.service.d.ts.map
63
+ //# sourceMappingURL=mcp-registry-discovery.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-registry-discovery.service.d.ts","sourceRoot":"","sources":["../../../src/mcp/services/mcp-registry-discovery.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,cAAc,EAEd,sBAAsB,EAGvB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EACjB,MAAM,cAAc,CAAC;AACtB,OAAO,EASL,YAAY,EACb,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAEpE,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAEhE,OAAO,EAAE,wBAAwB,EAAE,MAAM,2CAA2C,CAAC;AACrF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAUhD,MAAM,MAAM,oBAAoB,CAAC,CAAC,SAAS,MAAM,IAAI;IACnD,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,mBAAmB,GAAG,QAAQ,CAAC;IAC3D,QAAQ,EAAE,CAAC,CAAC;IACZ,aAAa,EAAE,cAAc,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,cAAc,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAKvE,qBACa,2BAA4B,YAAW,sBAAsB;IAQtE,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAV9D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,mCAAmC,CAG7B;gBAGK,SAAS,EAAE,gBAAgB,EAC3B,eAAe,EAAE,eAAe,EAChC,gBAAgB,EAAE,gBAAgB,EACC,OAAO,CAAC,EAAE,UAAU,YAAA;IAQ1E,sBAAsB;IAQtB,OAAO,CAAC,aAAa;IA4CrB,OAAO,CAAC,4BAA4B;IAsBpC,OAAO,CAAC,2BAA2B;IA+BnC,OAAO,CAAC,2BAA2B;IA4CnC,OAAO,CAAC,uBAAuB;IAiC/B,OAAO,CAAC,0BAA0B;IA6DlC,OAAO,CAAC,6BAA6B;IAiErC,OAAO,CAAC,YAAY;IA0BpB,OAAO,CAAC,kBAAkB;IAmB1B,OAAO,CAAC,gBAAgB;IA0DxB,OAAO,CAAC,oBAAoB;IAmB5B,OAAO,CAAC,4BAA4B;IAsBpC,eAAe,IAAI,MAAM,EAAE;IAO3B,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,oBAAoB,CAAC,YAAY,CAAC,EAAE;IAWnE,QAAQ,CACN,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,GACX,oBAAoB,CAAC,YAAY,CAAC,GAAG,SAAS;IASjD,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,oBAAoB,CAAC,gBAAgB,CAAC,EAAE;IAW3E,YAAY,CACV,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,GACX,oBAAoB,CAAC,gBAAgB,CAAC,GAAG,SAAS;IASrD,oBAAoB,CAClB,WAAW,EAAE,MAAM,GAClB,oBAAoB,CAAC,wBAAwB,CAAC,EAAE;IAWnD,oBAAoB,CAClB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,GACX,oBAAoB,CAAC,wBAAwB,CAAC,GAAG,SAAS;IAS7D,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,oBAAoB,CAAC,cAAc,CAAC,EAAE;IAWvE,UAAU,CACR,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,GACX,oBAAoB,CAAC,cAAc,CAAC,GAAG,SAAS;IAUnD,OAAO,CAAC,eAAe;IAevB,OAAO,CAAC,0BAA0B;IASlC,OAAO,CAAC,gBAAgB;IAsBxB,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,UAAU;IAYlB,iBAAiB,CACf,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,GAET;QACE,QAAQ,EAAE,oBAAoB,CAAC,gBAAgB,CAAC,CAAC;QACjD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAChC,GACD,SAAS;IAkCb,yBAAyB,CACvB,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,GAET;QACE,gBAAgB,EAAE,oBAAoB,CAAC,wBAAwB,CAAC,CAAC;QACjE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAChC,GACD,SAAS;IA2Db,yBAAyB,CAAC,CAAC,SAAS,MAAM,EACxC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAClC,IAAI;IA0BP,uBAAuB,CACrB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,oBAAoB,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,EAC1C,UAAU,EAAE,MAAM,GACjB,IAAI;CAkBR"}