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