@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,40 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const normalize_endpoint_1 = require("./normalize-endpoint");
4
- describe('normalizeEndpoint', () => {
5
- it('returns empty string for null or undefined', () => {
6
- expect((0, normalize_endpoint_1.normalizeEndpoint)(null)).toBe('');
7
- expect((0, normalize_endpoint_1.normalizeEndpoint)(undefined)).toBe('');
8
- });
9
- it('collapses multiple slashes in the path', () => {
10
- const input = 'foo//bar///baz';
11
- const expected = 'foo/bar/baz';
12
- expect((0, normalize_endpoint_1.normalizeEndpoint)(input)).toBe(expected);
13
- });
14
- it('removes leading slash', () => {
15
- const input = '/foo/bar';
16
- const expected = 'foo/bar';
17
- expect((0, normalize_endpoint_1.normalizeEndpoint)(input)).toBe(expected);
18
- });
19
- it('preserves http protocol and collapses slashes after domain', () => {
20
- const input = 'http://localhost:3000//remote-auth/auth/callback';
21
- const expected = 'http://localhost:3000/remote-auth/auth/callback';
22
- expect((0, normalize_endpoint_1.normalizeEndpoint)(input)).toBe(expected);
23
- });
24
- it('preserves https protocol and collapses slashes after domain', () => {
25
- const input = 'https://example.com///path///to';
26
- const expected = 'https://example.com/path/to';
27
- expect((0, normalize_endpoint_1.normalizeEndpoint)(input)).toBe(expected);
28
- });
29
- it('preserves other protocols (ftp)', () => {
30
- const input = 'ftp://example.com//dir/file';
31
- const expected = 'ftp://example.com/dir/file';
32
- expect((0, normalize_endpoint_1.normalizeEndpoint)(input)).toBe(expected);
33
- });
34
- it('handles no protocol and leading double slashes', () => {
35
- const input = '//foo//bar';
36
- const expected = 'foo/bar';
37
- expect((0, normalize_endpoint_1.normalizeEndpoint)(input)).toBe(expected);
38
- });
39
- });
40
- //# sourceMappingURL=normalize-endpoint.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"normalize-endpoint.spec.js","sourceRoot":"","sources":["../../../src/mcp/utils/normalize-endpoint.spec.ts"],"names":[],"mappings":";;AAAA,6DAAyD;AAEzD,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,CAAC,IAAA,sCAAiB,EAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzC,MAAM,CAAC,IAAA,sCAAiB,EAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,KAAK,GAAG,gBAAgB,CAAC;QAC/B,MAAM,QAAQ,GAAG,aAAa,CAAC;QAC/B,MAAM,CAAC,IAAA,sCAAiB,EAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,KAAK,GAAG,UAAU,CAAC;QACzB,MAAM,QAAQ,GAAG,SAAS,CAAC;QAC3B,MAAM,CAAC,IAAA,sCAAiB,EAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,MAAM,KAAK,GAAG,kDAAkD,CAAC;QACjE,MAAM,QAAQ,GAAG,iDAAiD,CAAC;QACnE,MAAM,CAAC,IAAA,sCAAiB,EAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,KAAK,GAAG,iCAAiC,CAAC;QAChD,MAAM,QAAQ,GAAG,6BAA6B,CAAC;QAC/C,MAAM,CAAC,IAAA,sCAAiB,EAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,KAAK,GAAG,6BAA6B,CAAC;QAC5C,MAAM,QAAQ,GAAG,4BAA4B,CAAC;QAC9C,MAAM,CAAC,IAAA,sCAAiB,EAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,KAAK,GAAG,YAAY,CAAC;QAC3B,MAAM,QAAQ,GAAG,SAAS,CAAC;QAC3B,MAAM,CAAC,IAAA,sCAAiB,EAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { normalizeEndpoint } from './normalize-endpoint';\n\ndescribe('normalizeEndpoint', () => {\n it('returns empty string for null or undefined', () => {\n expect(normalizeEndpoint(null)).toBe('');\n expect(normalizeEndpoint(undefined)).toBe('');\n });\n\n it('collapses multiple slashes in the path', () => {\n const input = 'foo//bar///baz';\n const expected = 'foo/bar/baz';\n expect(normalizeEndpoint(input)).toBe(expected);\n });\n\n it('removes leading slash', () => {\n const input = '/foo/bar';\n const expected = 'foo/bar';\n expect(normalizeEndpoint(input)).toBe(expected);\n });\n\n it('preserves http protocol and collapses slashes after domain', () => {\n const input = 'http://localhost:3000//remote-auth/auth/callback';\n const expected = 'http://localhost:3000/remote-auth/auth/callback';\n expect(normalizeEndpoint(input)).toBe(expected);\n });\n\n it('preserves https protocol and collapses slashes after domain', () => {\n const input = 'https://example.com///path///to';\n const expected = 'https://example.com/path/to';\n expect(normalizeEndpoint(input)).toBe(expected);\n });\n\n it('preserves other protocols (ftp)', () => {\n const input = 'ftp://example.com//dir/file';\n const expected = 'ftp://example.com/dir/file';\n expect(normalizeEndpoint(input)).toBe(expected);\n });\n\n it('handles no protocol and leading double slashes', () => {\n const input = '//foo//bar';\n const expected = 'foo/bar';\n expect(normalizeEndpoint(input)).toBe(expected);\n });\n});\n"]}
@@ -1,151 +0,0 @@
1
- import { Injectable, Inject, Logger } from '@nestjs/common';
2
- import { z } from 'zod';
3
- import {
4
- DynamicToolDefinition,
5
- DynamicToolHandler,
6
- } from '../interfaces/dynamic-tool.interface';
7
- import { McpRegistryService } from './mcp-registry.service';
8
- import type { McpOptions } from '../interfaces';
9
- import { createMcpLogger } from '../utils/mcp-logger.factory';
10
- import { ToolMetadata } from '../decorators/tool.decorator';
11
-
12
- /**
13
- * Symbol used to identify dynamic tools in the registry.
14
- * When a tool's providerClass equals this token, it's a dynamic tool.
15
- */
16
- export const DYNAMIC_TOOL_HANDLER_TOKEN = Symbol('DYNAMIC_TOOL_HANDLER');
17
-
18
- /**
19
- * Global map of dynamic tool handlers, scoped by moduleId.
20
- * Using a module-level Map ensures handlers persist across different
21
- * McpToolBuilder instances that may be created by the DI container.
22
- */
23
- const globalHandlers = new Map<string, Map<string, DynamicToolHandler>>();
24
-
25
- /**
26
- * Service for programmatically registering MCP tools at runtime.
27
- *
28
- * Use this to register tools with descriptions/parameters from databases
29
- * or other dynamic sources during application bootstrap.
30
- *
31
- * @example
32
- * ```typescript
33
- * @Injectable()
34
- * export class DynamicToolsService implements OnModuleInit {
35
- * constructor(
36
- * private readonly toolBuilder: McpToolBuilder,
37
- * private readonly dbService: DatabaseService,
38
- * ) {}
39
- *
40
- * async onModuleInit() {
41
- * const collections = await this.dbService.getCollections();
42
- *
43
- * this.toolBuilder.registerTool({
44
- * name: 'search-knowledge',
45
- * description: `Search collections: ${collections.join(', ')}`,
46
- * parameters: z.object({ query: z.string() }),
47
- * handler: async (args, context) => {
48
- * const results = await this.dbService.search(args.query);
49
- * return { content: [{ type: 'text', text: JSON.stringify(results) }] };
50
- * },
51
- * });
52
- * }
53
- * }
54
- * ```
55
- */
56
- @Injectable()
57
- export class McpToolBuilder {
58
- private readonly logger: Logger;
59
-
60
- constructor(
61
- private readonly registry: McpRegistryService,
62
- @Inject('MCP_MODULE_ID') private readonly mcpModuleId: string,
63
- @Inject('MCP_OPTIONS') private readonly options: McpOptions,
64
- ) {
65
- this.logger = createMcpLogger(McpToolBuilder.name, this.options);
66
- // Initialize handler map for this module if it doesn't exist
67
- if (!globalHandlers.has(mcpModuleId)) {
68
- globalHandlers.set(mcpModuleId, new Map());
69
- }
70
- }
71
-
72
- /**
73
- * Register a dynamic tool for the current MCP server.
74
- *
75
- * Tools registered here will appear in the `tools/list` response and
76
- * can be called via `tools/call` just like decorator-based tools.
77
- *
78
- * @param definition - The tool definition including name, description, parameters, and handler
79
- *
80
- * @example
81
- * ```typescript
82
- * toolBuilder.registerTool({
83
- * name: 'search-knowledge',
84
- * description: await getDescriptionFromDB(),
85
- * parameters: z.object({ query: z.string() }),
86
- * handler: async (args, context) => {
87
- * const results = await searchService.search(args.query);
88
- * return { content: [{ type: 'text', text: JSON.stringify(results) }] };
89
- * },
90
- * });
91
- * ```
92
- */
93
- registerTool(definition: DynamicToolDefinition): void {
94
- this.logger.debug(`Registering dynamic tool: ${definition.name}`);
95
-
96
- // Store the handler for later execution (scoped by moduleId)
97
- const moduleHandlers = globalHandlers.get(this.mcpModuleId)!;
98
- moduleHandlers.set(definition.name, definition.handler);
99
-
100
- // Default to empty object schema if no parameters provided (matches @Tool decorator behavior)
101
- const parameters = definition.parameters ?? z.object({});
102
-
103
- // Build metadata matching ToolMetadata interface
104
- const metadata: ToolMetadata = {
105
- name: definition.name,
106
- description: definition.description,
107
- parameters,
108
- outputSchema: definition.outputSchema,
109
- annotations: definition.annotations,
110
- _meta: definition._meta,
111
- isPublic: definition.isPublic,
112
- requiredScopes: definition.requiredScopes,
113
- requiredRoles: definition.requiredRoles,
114
- };
115
-
116
- // Register with the registry
117
- this.registry.registerDynamicTool(this.mcpModuleId, {
118
- type: 'tool',
119
- metadata,
120
- providerClass: DYNAMIC_TOOL_HANDLER_TOKEN,
121
- methodName: definition.name,
122
- });
123
- }
124
-
125
- /**
126
- * Get the handler function for a dynamic tool.
127
- * Used internally by McpToolsHandler to execute dynamic tools.
128
- *
129
- * @param toolName - The name of the tool
130
- * @returns The handler function, or undefined if not found
131
- */
132
- getHandler(toolName: string): DynamicToolHandler | undefined {
133
- return globalHandlers.get(this.mcpModuleId)?.get(toolName);
134
- }
135
-
136
- /**
137
- * Get the handler function for a dynamic tool by module ID.
138
- * Static method used when the module ID is known but the correct
139
- * McpToolBuilder instance may not be available.
140
- *
141
- * @param mcpModuleId - The module ID to look up handlers for
142
- * @param toolName - The name of the tool
143
- * @returns The handler function, or undefined if not found
144
- */
145
- static getHandlerByModuleId(
146
- mcpModuleId: string,
147
- toolName: string,
148
- ): DynamicToolHandler | undefined {
149
- return globalHandlers.get(mcpModuleId)?.get(toolName);
150
- }
151
- }