@rekog/mcp-nest 1.9.10 → 2.0.0-alpha.0
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 +76 -29
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/decorators/constants.d.ts +1 -0
- package/dist/mcp/decorators/constants.d.ts.map +1 -1
- package/dist/mcp/decorators/constants.js +2 -1
- package/dist/mcp/decorators/constants.js.map +1 -1
- package/dist/mcp/decorators/index.d.ts +3 -1
- package/dist/mcp/decorators/index.d.ts.map +1 -1
- package/dist/mcp/decorators/index.js +3 -1
- package/dist/mcp/decorators/index.js.map +1 -1
- package/dist/mcp/decorators/mcp-controller.decorator.d.ts +6 -0
- package/dist/mcp/decorators/mcp-controller.decorator.d.ts.map +1 -0
- package/dist/mcp/decorators/mcp-controller.decorator.js +43 -0
- package/dist/mcp/decorators/mcp-controller.decorator.js.map +1 -0
- package/dist/mcp/decorators/mcp-message-pattern.d.ts +3 -0
- package/dist/mcp/decorators/mcp-message-pattern.d.ts.map +1 -0
- package/dist/mcp/decorators/mcp-message-pattern.js +13 -0
- package/dist/mcp/decorators/mcp-message-pattern.js.map +1 -0
- package/dist/mcp/decorators/prompt.decorator.d.ts +1 -1
- package/dist/mcp/decorators/prompt.decorator.d.ts.map +1 -1
- package/dist/mcp/decorators/prompt.decorator.js +2 -1
- package/dist/mcp/decorators/prompt.decorator.js.map +1 -1
- package/dist/mcp/decorators/public.decorator.js.map +1 -1
- package/dist/mcp/decorators/raw-request.decorator.d.ts +2 -0
- package/dist/mcp/decorators/raw-request.decorator.d.ts.map +1 -0
- package/dist/mcp/decorators/raw-request.decorator.js +6 -0
- package/dist/mcp/decorators/raw-request.decorator.js.map +1 -0
- package/dist/mcp/decorators/resource-template.decorator.d.ts +1 -1
- package/dist/mcp/decorators/resource-template.decorator.d.ts.map +1 -1
- package/dist/mcp/decorators/resource-template.decorator.js +2 -1
- package/dist/mcp/decorators/resource-template.decorator.js.map +1 -1
- package/dist/mcp/decorators/resource.decorator.d.ts +1 -1
- package/dist/mcp/decorators/resource.decorator.d.ts.map +1 -1
- package/dist/mcp/decorators/resource.decorator.js +2 -1
- package/dist/mcp/decorators/resource.decorator.js.map +1 -1
- package/dist/mcp/decorators/tool.decorator.d.ts +1 -3
- package/dist/mcp/decorators/tool.decorator.d.ts.map +1 -1
- package/dist/mcp/decorators/tool.decorator.js +2 -1
- package/dist/mcp/decorators/tool.decorator.js.map +1 -1
- package/dist/mcp/filters/mcp-exception.filter.d.ts +6 -0
- package/dist/mcp/filters/mcp-exception.filter.d.ts.map +1 -0
- package/dist/mcp/filters/mcp-exception.filter.js +26 -0
- package/dist/mcp/filters/mcp-exception.filter.js.map +1 -0
- package/dist/mcp/index.d.ts +11 -7
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +11 -7
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/interfaces/authenticated-user.interface.d.ts +9 -0
- package/dist/mcp/interfaces/authenticated-user.interface.d.ts.map +1 -0
- package/dist/{authz/interfaces/request-with-user.js → mcp/interfaces/authenticated-user.interface.js} +1 -1
- package/dist/mcp/interfaces/authenticated-user.interface.js.map +1 -0
- package/dist/mcp/interfaces/dynamic-prompt.interface.d.ts +1 -1
- package/dist/mcp/interfaces/dynamic-prompt.interface.d.ts.map +1 -1
- package/dist/mcp/interfaces/dynamic-prompt.interface.js.map +1 -1
- package/dist/mcp/interfaces/dynamic-resource.interface.d.ts +1 -1
- package/dist/mcp/interfaces/dynamic-resource.interface.d.ts.map +1 -1
- package/dist/mcp/interfaces/dynamic-resource.interface.js.map +1 -1
- package/dist/mcp/interfaces/dynamic-tool.interface.d.ts +1 -1
- package/dist/mcp/interfaces/dynamic-tool.interface.d.ts.map +1 -1
- package/dist/mcp/interfaces/dynamic-tool.interface.js.map +1 -1
- package/dist/mcp/interfaces/index.d.ts +2 -2
- package/dist/mcp/interfaces/index.d.ts.map +1 -1
- package/dist/mcp/interfaces/index.js +0 -3
- package/dist/mcp/interfaces/index.js.map +1 -1
- package/dist/mcp/services/tool-authorization.service.d.ts +7 -5
- package/dist/mcp/services/tool-authorization.service.d.ts.map +1 -1
- package/dist/mcp/services/tool-authorization.service.js +9 -6
- package/dist/mcp/services/tool-authorization.service.js.map +1 -1
- package/dist/mcp/transport/mcp-context.d.ts +34 -0
- package/dist/mcp/transport/mcp-context.d.ts.map +1 -0
- package/dist/mcp/transport/mcp-context.js +74 -0
- package/dist/mcp/transport/mcp-context.js.map +1 -0
- package/dist/mcp/transport/mcp-http-handler.d.ts +7 -0
- package/dist/mcp/transport/mcp-http-handler.d.ts.map +1 -0
- package/dist/mcp/transport/mcp-http-handler.js +5 -0
- package/dist/mcp/transport/mcp-http-handler.js.map +1 -0
- package/dist/mcp/transport/mcp-server-options.interface.d.ts +23 -0
- package/dist/mcp/transport/mcp-server-options.interface.d.ts.map +1 -0
- package/dist/{authz/providers/oauth-provider.interface.js → mcp/transport/mcp-server-options.interface.js} +1 -1
- package/dist/mcp/transport/mcp-server-options.interface.js.map +1 -0
- package/dist/mcp/transport/mcp-transport.constants.d.ts +19 -0
- package/dist/mcp/transport/mcp-transport.constants.d.ts.map +1 -0
- package/dist/mcp/transport/mcp-transport.constants.js +21 -0
- package/dist/mcp/transport/mcp-transport.constants.js.map +1 -0
- package/dist/mcp/transport/mcp-transport.interface.d.ts +17 -0
- package/dist/mcp/transport/mcp-transport.interface.d.ts.map +1 -0
- package/dist/{authz/interfaces/oauth-common.interface.js → mcp/transport/mcp-transport.interface.js} +1 -1
- package/dist/mcp/transport/mcp-transport.interface.js.map +1 -0
- package/dist/mcp/transport/mcp.strategy.d.ts +56 -0
- package/dist/mcp/transport/mcp.strategy.d.ts.map +1 -0
- package/dist/mcp/transport/mcp.strategy.js +446 -0
- package/dist/mcp/transport/mcp.strategy.js.map +1 -0
- package/dist/mcp/transport/resource-matcher.d.ts +13 -0
- package/dist/mcp/transport/resource-matcher.d.ts.map +1 -0
- package/dist/mcp/transport/resource-matcher.js +83 -0
- package/dist/mcp/transport/resource-matcher.js.map +1 -0
- package/dist/mcp/transport/streamable-http.controller.d.ts +16 -0
- package/dist/mcp/transport/streamable-http.controller.d.ts.map +1 -0
- package/dist/mcp/transport/streamable-http.controller.js +98 -0
- package/dist/mcp/transport/streamable-http.controller.js.map +1 -0
- package/dist/mcp/transport/transports/index.d.ts +3 -0
- package/dist/mcp/transport/transports/index.d.ts.map +1 -0
- package/dist/{authz → mcp/transport/transports}/index.js +2 -10
- package/dist/mcp/transport/transports/index.js.map +1 -0
- package/dist/mcp/transport/transports/read-body.d.ts +3 -0
- package/dist/mcp/transport/transports/read-body.d.ts.map +1 -0
- package/dist/mcp/transport/transports/read-body.js +32 -0
- package/dist/mcp/transport/transports/read-body.js.map +1 -0
- package/dist/mcp/transport/transports/stdio.transport.d.ts +9 -0
- package/dist/mcp/transport/transports/stdio.transport.d.ts.map +1 -0
- package/dist/mcp/transport/transports/stdio.transport.js +27 -0
- package/dist/mcp/transport/transports/stdio.transport.js.map +1 -0
- package/dist/mcp/transport/transports/streamable-http.transport.d.ts +33 -0
- package/dist/mcp/transport/transports/streamable-http.transport.d.ts.map +1 -0
- package/dist/mcp/transport/transports/streamable-http.transport.js +216 -0
- package/dist/mcp/transport/transports/streamable-http.transport.js.map +1 -0
- package/dist/mcp/utils/mcp-logger.factory.d.ts +6 -2
- package/dist/mcp/utils/mcp-logger.factory.d.ts.map +1 -1
- package/dist/mcp/utils/mcp-logger.factory.js.map +1 -1
- package/package.json +3 -66
- package/src/index.ts +0 -1
- package/src/mcp/decorators/constants.ts +1 -0
- package/src/mcp/decorators/index.ts +3 -1
- package/src/mcp/decorators/mcp-controller.decorator.ts +126 -0
- package/src/mcp/decorators/mcp-message-pattern.ts +38 -0
- package/src/mcp/decorators/prompt.decorator.ts +6 -2
- package/src/mcp/decorators/public.decorator.ts +3 -3
- package/src/mcp/decorators/raw-request.decorator.ts +32 -0
- package/src/mcp/decorators/resource-template.decorator.ts +6 -2
- package/src/mcp/decorators/resource.decorator.ts +6 -2
- package/src/mcp/decorators/tool.decorator.ts +6 -3
- package/src/mcp/filters/mcp-exception.filter.ts +47 -0
- package/src/mcp/index.ts +13 -7
- package/src/mcp/interfaces/authenticated-user.interface.ts +22 -0
- package/src/mcp/interfaces/dynamic-prompt.interface.ts +1 -1
- package/src/mcp/interfaces/dynamic-resource.interface.ts +1 -1
- package/src/mcp/interfaces/dynamic-tool.interface.ts +2 -2
- package/src/mcp/interfaces/index.ts +3 -7
- package/src/mcp/services/tool-authorization.service.ts +52 -72
- package/src/mcp/transport/mcp-context.ts +138 -0
- package/src/mcp/transport/mcp-http-handler.ts +32 -0
- package/src/mcp/transport/mcp-server-options.interface.ts +75 -0
- package/src/mcp/transport/mcp-transport.constants.ts +99 -0
- package/src/mcp/transport/mcp-transport.interface.ts +50 -0
- package/src/mcp/transport/mcp.strategy.ts +752 -0
- package/src/mcp/transport/resource-matcher.ts +107 -0
- package/src/mcp/transport/streamable-http.controller.ts +114 -0
- package/src/mcp/transport/transports/index.ts +2 -0
- package/src/mcp/transport/transports/read-body.ts +39 -0
- package/src/mcp/transport/transports/stdio.transport.ts +35 -0
- package/src/mcp/transport/transports/streamable-http.transport.ts +384 -0
- package/src/mcp/utils/mcp-logger.factory.spec.ts +8 -22
- package/src/mcp/utils/mcp-logger.factory.ts +13 -2
- package/dist/authz/guards/jwt-auth.guard.d.ts +0 -19
- package/dist/authz/guards/jwt-auth.guard.d.ts.map +0 -1
- package/dist/authz/guards/jwt-auth.guard.js +0 -108
- package/dist/authz/guards/jwt-auth.guard.js.map +0 -1
- package/dist/authz/index.d.ts +0 -11
- package/dist/authz/index.d.ts.map +0 -1
- package/dist/authz/index.js.map +0 -1
- package/dist/authz/interfaces/oauth-common.interface.d.ts +0 -21
- package/dist/authz/interfaces/oauth-common.interface.d.ts.map +0 -1
- package/dist/authz/interfaces/oauth-common.interface.js.map +0 -1
- package/dist/authz/interfaces/request-with-user.d.ts +0 -13
- package/dist/authz/interfaces/request-with-user.d.ts.map +0 -1
- package/dist/authz/interfaces/request-with-user.js.map +0 -1
- package/dist/authz/mcp-oauth.controller.d.ts +0 -81
- package/dist/authz/mcp-oauth.controller.d.ts.map +0 -1
- package/dist/authz/mcp-oauth.controller.js +0 -540
- package/dist/authz/mcp-oauth.controller.js.map +0 -1
- package/dist/authz/mcp-oauth.module.d.ts +0 -12
- package/dist/authz/mcp-oauth.module.d.ts.map +0 -1
- package/dist/authz/mcp-oauth.module.js +0 -271
- package/dist/authz/mcp-oauth.module.js.map +0 -1
- package/dist/authz/providers/azure-ad.provider.d.ts +0 -3
- package/dist/authz/providers/azure-ad.provider.d.ts.map +0 -1
- package/dist/authz/providers/azure-ad.provider.js +0 -37
- package/dist/authz/providers/azure-ad.provider.js.map +0 -1
- package/dist/authz/providers/github.provider.d.ts +0 -3
- package/dist/authz/providers/github.provider.d.ts.map +0 -1
- package/dist/authz/providers/github.provider.js +0 -24
- package/dist/authz/providers/github.provider.js.map +0 -1
- package/dist/authz/providers/google.provider.d.ts +0 -3
- package/dist/authz/providers/google.provider.d.ts.map +0 -1
- package/dist/authz/providers/google.provider.js +0 -25
- package/dist/authz/providers/google.provider.js.map +0 -1
- package/dist/authz/providers/oauth-provider.interface.d.ts +0 -107
- package/dist/authz/providers/oauth-provider.interface.d.ts.map +0 -1
- package/dist/authz/providers/oauth-provider.interface.js.map +0 -1
- package/dist/authz/services/client.service.d.ts +0 -12
- package/dist/authz/services/client.service.d.ts.map +0 -1
- package/dist/authz/services/client.service.js +0 -81
- package/dist/authz/services/client.service.js.map +0 -1
- package/dist/authz/services/jwt-token.service.d.ts +0 -37
- package/dist/authz/services/jwt-token.service.d.ts.map +0 -1
- package/dist/authz/services/jwt-token.service.js +0 -182
- package/dist/authz/services/jwt-token.service.js.map +0 -1
- package/dist/authz/services/oauth-strategy.service.d.ts +0 -13
- package/dist/authz/services/oauth-strategy.service.d.ts.map +0 -1
- package/dist/authz/services/oauth-strategy.service.js +0 -71
- package/dist/authz/services/oauth-strategy.service.js.map +0 -1
- package/dist/authz/stores/memory-store.service.d.ts +0 -27
- package/dist/authz/stores/memory-store.service.d.ts.map +0 -1
- package/dist/authz/stores/memory-store.service.js +0 -107
- package/dist/authz/stores/memory-store.service.js.map +0 -1
- package/dist/authz/stores/oauth-store.interface.d.ts +0 -61
- package/dist/authz/stores/oauth-store.interface.d.ts.map +0 -1
- package/dist/authz/stores/oauth-store.interface.js +0 -5
- package/dist/authz/stores/oauth-store.interface.js.map +0 -1
- package/dist/authz/stores/typeorm/constants.d.ts +0 -3
- package/dist/authz/stores/typeorm/constants.d.ts.map +0 -1
- package/dist/authz/stores/typeorm/constants.js +0 -6
- package/dist/authz/stores/typeorm/constants.js.map +0 -1
- package/dist/authz/stores/typeorm/entities/authorization-code.entity.d.ts +0 -15
- package/dist/authz/stores/typeorm/entities/authorization-code.entity.d.ts.map +0 -1
- package/dist/authz/stores/typeorm/entities/authorization-code.entity.js +0 -69
- package/dist/authz/stores/typeorm/entities/authorization-code.entity.js.map +0 -1
- package/dist/authz/stores/typeorm/entities/index.d.ts +0 -5
- package/dist/authz/stores/typeorm/entities/index.d.ts.map +0 -1
- package/dist/authz/stores/typeorm/entities/index.js +0 -12
- package/dist/authz/stores/typeorm/entities/index.js.map +0 -1
- package/dist/authz/stores/typeorm/entities/oauth-client.entity.d.ts +0 -17
- package/dist/authz/stores/typeorm/entities/oauth-client.entity.d.ts.map +0 -1
- package/dist/authz/stores/typeorm/entities/oauth-client.entity.js +0 -77
- package/dist/authz/stores/typeorm/entities/oauth-client.entity.js.map +0 -1
- package/dist/authz/stores/typeorm/entities/oauth-session.entity.d.ts +0 -14
- package/dist/authz/stores/typeorm/entities/oauth-session.entity.d.ts.map +0 -1
- package/dist/authz/stores/typeorm/entities/oauth-session.entity.js +0 -65
- package/dist/authz/stores/typeorm/entities/oauth-session.entity.js.map +0 -1
- package/dist/authz/stores/typeorm/entities/user-profile.entity.d.ts +0 -13
- package/dist/authz/stores/typeorm/entities/user-profile.entity.d.ts.map +0 -1
- package/dist/authz/stores/typeorm/entities/user-profile.entity.js +0 -62
- package/dist/authz/stores/typeorm/entities/user-profile.entity.js.map +0 -1
- package/dist/authz/stores/typeorm/typeorm-store.service.d.ts +0 -28
- package/dist/authz/stores/typeorm/typeorm-store.service.d.ts.map +0 -1
- package/dist/authz/stores/typeorm/typeorm-store.service.js +0 -138
- package/dist/authz/stores/typeorm/typeorm-store.service.js.map +0 -1
- package/dist/mcp/constants/feature-registration.constants.d.ts +0 -7
- package/dist/mcp/constants/feature-registration.constants.d.ts.map +0 -1
- package/dist/mcp/constants/feature-registration.constants.js +0 -5
- package/dist/mcp/constants/feature-registration.constants.js.map +0 -1
- package/dist/mcp/decorators/tool-guards.decorator.d.ts +0 -12
- package/dist/mcp/decorators/tool-guards.decorator.d.ts.map +0 -1
- package/dist/mcp/decorators/tool-guards.decorator.js +0 -13
- package/dist/mcp/decorators/tool-guards.decorator.js.map +0 -1
- package/dist/mcp/interfaces/mcp-options.interface.d.ts +0 -53
- package/dist/mcp/interfaces/mcp-options.interface.d.ts.map +0 -1
- package/dist/mcp/interfaces/mcp-options.interface.js +0 -10
- package/dist/mcp/interfaces/mcp-options.interface.js.map +0 -1
- package/dist/mcp/mcp.module.d.ts +0 -15
- package/dist/mcp/mcp.module.d.ts.map +0 -1
- package/dist/mcp/mcp.module.js +0 -248
- package/dist/mcp/mcp.module.js.map +0 -1
- package/dist/mcp/services/handlers/mcp-handler.base.d.ts +0 -117
- package/dist/mcp/services/handlers/mcp-handler.base.d.ts.map +0 -1
- package/dist/mcp/services/handlers/mcp-handler.base.js +0 -125
- package/dist/mcp/services/handlers/mcp-handler.base.js.map +0 -1
- package/dist/mcp/services/handlers/mcp-prompts.handler.d.ts +0 -12
- package/dist/mcp/services/handlers/mcp-prompts.handler.d.ts.map +0 -1
- package/dist/mcp/services/handlers/mcp-prompts.handler.js +0 -98
- package/dist/mcp/services/handlers/mcp-prompts.handler.js.map +0 -1
- package/dist/mcp/services/handlers/mcp-resources.handler.d.ts +0 -13
- package/dist/mcp/services/handlers/mcp-resources.handler.d.ts.map +0 -1
- package/dist/mcp/services/handlers/mcp-resources.handler.js +0 -117
- package/dist/mcp/services/handlers/mcp-resources.handler.js.map +0 -1
- package/dist/mcp/services/handlers/mcp-tools.handler.d.ts +0 -22
- package/dist/mcp/services/handlers/mcp-tools.handler.d.ts.map +0 -1
- package/dist/mcp/services/handlers/mcp-tools.handler.js +0 -258
- package/dist/mcp/services/handlers/mcp-tools.handler.js.map +0 -1
- package/dist/mcp/services/mcp-dynamic-registry.service.d.ts +0 -26
- package/dist/mcp/services/mcp-dynamic-registry.service.d.ts.map +0 -1
- package/dist/mcp/services/mcp-dynamic-registry.service.js +0 -133
- package/dist/mcp/services/mcp-dynamic-registry.service.js.map +0 -1
- package/dist/mcp/services/mcp-executor.service.d.ts +0 -15
- package/dist/mcp/services/mcp-executor.service.d.ts.map +0 -1
- package/dist/mcp/services/mcp-executor.service.js +0 -47
- package/dist/mcp/services/mcp-executor.service.js.map +0 -1
- package/dist/mcp/services/mcp-registry-discovery.service.d.ts +0 -63
- package/dist/mcp/services/mcp-registry-discovery.service.d.ts.map +0 -1
- package/dist/mcp/services/mcp-registry-discovery.service.js +0 -397
- package/dist/mcp/services/mcp-registry-discovery.service.js.map +0 -1
- package/dist/mcp/services/mcp-sse.service.d.ts +0 -20
- package/dist/mcp/services/mcp-sse.service.d.ts.map +0 -1
- package/dist/mcp/services/mcp-sse.service.js +0 -91
- package/dist/mcp/services/mcp-sse.service.js.map +0 -1
- package/dist/mcp/services/mcp-streamable-http.service.d.ts +0 -32
- package/dist/mcp/services/mcp-streamable-http.service.d.ts.map +0 -1
- package/dist/mcp/services/mcp-streamable-http.service.js +0 -327
- package/dist/mcp/services/mcp-streamable-http.service.js.map +0 -1
- package/dist/mcp/services/sse-ping.service.d.ts +0 -23
- package/dist/mcp/services/sse-ping.service.d.ts.map +0 -1
- package/dist/mcp/services/sse-ping.service.js +0 -99
- package/dist/mcp/services/sse-ping.service.js.map +0 -1
- package/dist/mcp/transport/sse.controller.factory.d.ts +0 -14
- package/dist/mcp/transport/sse.controller.factory.d.ts.map +0 -1
- package/dist/mcp/transport/sse.controller.factory.js +0 -67
- package/dist/mcp/transport/sse.controller.factory.js.map +0 -1
- package/dist/mcp/transport/stdio.service.d.ts +0 -14
- package/dist/mcp/transport/stdio.service.d.ts.map +0 -1
- package/dist/mcp/transport/stdio.service.js +0 -66
- package/dist/mcp/transport/stdio.service.js.map +0 -1
- package/dist/mcp/transport/streamable-http.controller.factory.d.ts +0 -14
- package/dist/mcp/transport/streamable-http.controller.factory.d.ts.map +0 -1
- package/dist/mcp/transport/streamable-http.controller.factory.js +0 -74
- package/dist/mcp/transport/streamable-http.controller.factory.js.map +0 -1
- package/dist/mcp/utils/capabilities-builder.d.ts +0 -5
- package/dist/mcp/utils/capabilities-builder.d.ts.map +0 -1
- package/dist/mcp/utils/capabilities-builder.js +0 -25
- package/dist/mcp/utils/capabilities-builder.js.map +0 -1
- package/dist/mcp/utils/mcp-server.factory.d.ts +0 -6
- package/dist/mcp/utils/mcp-server.factory.d.ts.map +0 -1
- package/dist/mcp/utils/mcp-server.factory.js +0 -22
- package/dist/mcp/utils/mcp-server.factory.js.map +0 -1
- package/src/authz/guards/jwt-auth.guard.ts +0 -127
- package/src/authz/index.ts +0 -10
- package/src/authz/interfaces/oauth-common.interface.ts +0 -21
- package/src/authz/interfaces/request-with-user.ts +0 -16
- package/src/authz/mcp-oauth.controller.ts +0 -860
- package/src/authz/mcp-oauth.module.ts +0 -384
- package/src/authz/providers/azure-ad.provider.ts +0 -40
- package/src/authz/providers/github.provider.ts +0 -22
- package/src/authz/providers/google.provider.ts +0 -23
- package/src/authz/providers/oauth-provider.interface.ts +0 -147
- package/src/authz/services/client.service.ts +0 -125
- package/src/authz/services/jwt-token.service.spec.ts +0 -67
- package/src/authz/services/jwt-token.service.ts +0 -188
- package/src/authz/services/oauth-strategy.service.ts +0 -64
- package/src/authz/stores/memory-store.service.spec.ts +0 -475
- package/src/authz/stores/memory-store.service.ts +0 -141
- package/src/authz/stores/oauth-store.interface.ts +0 -131
- package/src/authz/stores/typeorm/README.md +0 -140
- package/src/authz/stores/typeorm/constants.ts +0 -6
- package/src/authz/stores/typeorm/entities/authorization-code.entity.ts +0 -41
- package/src/authz/stores/typeorm/entities/index.ts +0 -4
- package/src/authz/stores/typeorm/entities/oauth-client.entity.ts +0 -53
- package/src/authz/stores/typeorm/entities/oauth-session.entity.ts +0 -38
- package/src/authz/stores/typeorm/entities/user-profile.entity.ts +0 -46
- package/src/authz/stores/typeorm/typeorm-store.service.spec.ts +0 -494
- package/src/authz/stores/typeorm/typeorm-store.service.ts +0 -165
- package/src/mcp/constants/feature-registration.constants.ts +0 -24
- package/src/mcp/decorators/tool-guards.decorator.ts +0 -82
- package/src/mcp/interfaces/mcp-options.interface.ts +0 -95
- package/src/mcp/mcp.module.ts +0 -349
- package/src/mcp/services/handlers/mcp-handler.base.ts +0 -203
- package/src/mcp/services/handlers/mcp-prompts.handler.ts +0 -143
- package/src/mcp/services/handlers/mcp-resources.handler.ts +0 -183
- package/src/mcp/services/handlers/mcp-tools.handler.spec.ts +0 -41
- package/src/mcp/services/handlers/mcp-tools.handler.ts +0 -436
- package/src/mcp/services/mcp-dynamic-registry.service.ts +0 -236
- package/src/mcp/services/mcp-executor.service.ts +0 -64
- package/src/mcp/services/mcp-registry-discovery.service.spec.ts +0 -306
- package/src/mcp/services/mcp-registry-discovery.service.ts +0 -849
- package/src/mcp/services/mcp-sse.service.ts +0 -124
- package/src/mcp/services/mcp-streamable-http.service.ts +0 -472
- package/src/mcp/services/sse-ping.service.ts +0 -144
- package/src/mcp/transport/custom-decorator.spec.ts +0 -75
- package/src/mcp/transport/sse.controller.factory.ts +0 -84
- package/src/mcp/transport/stdio.service.ts +0 -75
- package/src/mcp/transport/streamable-http.controller.factory.ts +0 -80
- package/src/mcp/utils/capabilities-builder.ts +0 -43
- package/src/mcp/utils/mcp-server.factory.ts +0 -33
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MCP_SERVER_NAME_METADATA_KEY = exports.mcpTransportFor = exports.MCP_TRANSPORT = void 0;
|
|
4
|
+
exports.buildMcpPattern = buildMcpPattern;
|
|
5
|
+
exports.buildMcpHandlerExtras = buildMcpHandlerExtras;
|
|
6
|
+
exports.MCP_TRANSPORT = Symbol.for('@rekog/mcp-nest:transport');
|
|
7
|
+
const mcpTransportFor = (server) => server ? Symbol.for(`@rekog/mcp-nest:transport:${server}`) : exports.MCP_TRANSPORT;
|
|
8
|
+
exports.mcpTransportFor = mcpTransportFor;
|
|
9
|
+
exports.MCP_SERVER_NAME_METADATA_KEY = 'mcp:server-name';
|
|
10
|
+
function buildMcpPattern(type, name) {
|
|
11
|
+
return { mcp: type, name };
|
|
12
|
+
}
|
|
13
|
+
function buildMcpHandlerExtras(type, name, methodKey, methodRef) {
|
|
14
|
+
return {
|
|
15
|
+
mcpType: type,
|
|
16
|
+
mcpName: name,
|
|
17
|
+
mcpMethodKey: methodKey,
|
|
18
|
+
mcpMethodRef: methodRef,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=mcp-transport.constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-transport.constants.js","sourceRoot":"","sources":["../../../src/mcp/transport/mcp-transport.constants.ts"],"names":[],"mappings":";;;AA+EA,0CAKC;AAED,sDAYC;AAlFY,QAAA,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;AAe9D,MAAM,eAAe,GAAG,CAAC,MAAe,EAAU,EAAE,CACzD,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,6BAA6B,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,qBAAa,CAAC;AADhE,QAAA,eAAe,mBACiD;AAOhE,QAAA,4BAA4B,GAAG,iBAAiB,CAAC;AAwC9D,SAAgB,eAAe,CAC7B,IAAuB,EACvB,IAAY;IAEZ,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAC7B,CAAC;AAED,SAAgB,qBAAqB,CACnC,IAAuB,EACvB,IAAY,EACZ,SAAiB,EACjB,SAAuB;IAEvB,OAAO;QACL,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,IAAI;QACb,YAAY,EAAE,SAAS;QACvB,YAAY,EAAE,SAAS;KACxB,CAAC;AACJ,CAAC","sourcesContent":["/**\n * Shared transport identifier for the MCP microservice strategy.\n *\n * Both the MCP capability decorators (`@Tool`, `@Resource`, `@ResourceTemplate`,\n * `@Prompt`) and the {@link McpStrategy} reference this exact symbol. NestJS\n * binds a `@MessagePattern` handler to a strategy only when the handler's\n * declared transport is undefined OR equals the strategy's `transportId`\n * (see `@nestjs/microservices` ListenersController). By tagging MCP handlers\n * with this symbol and setting it as the strategy's `transportId` we get mutual\n * exclusion: other microservice transports never bind MCP handlers, and the MCP\n * strategy prunes any stray non-MCP handler that matched via the undefined-transport\n * clause.\n *\n * Uses the global symbol registry (`Symbol.for`) so it stays stable even if the\n * package is duplicated across `node_modules`.\n */\nexport const MCP_TRANSPORT = Symbol.for('@rekog/mcp-nest:transport');\n\n/**\n * Transport id for a *named* MCP server, falling back to the default shared id\n * ({@link MCP_TRANSPORT}) when no name is given.\n *\n * Naming a server gives it its own transport id, so NestJS's existing\n * `transport === transportId` routing isolates each server's handlers natively:\n * only `@McpController({ server: <name> })` classes bind to the matching\n * `McpStrategy({ server: <name> })`. An unnamed controller + unnamed strategy\n * keep using {@link MCP_TRANSPORT} — i.e. the original single-server behavior.\n *\n * Uses the global symbol registry (`Symbol.for`) so the id stays stable even if\n * the package is duplicated across `node_modules`.\n */\nexport const mcpTransportFor = (server?: string): symbol =>\n server ? Symbol.for(`@rekog/mcp-nest:transport:${server}`) : MCP_TRANSPORT;\n\n/**\n * Class-metadata key recording the logical server name an `@McpController` was\n * assigned to (via `@McpController({ server })`). Kept for diagnostics; the\n * actual routing is driven by the per-method transport id, not this key.\n */\nexport const MCP_SERVER_NAME_METADATA_KEY = 'mcp:server-name';\n\nexport type McpCapabilityType =\n | 'tool'\n | 'resource'\n | 'resource-template'\n | 'prompt';\n\n/**\n * Structured message pattern stored for every MCP capability handler. NestJS\n * normalizes object patterns by sorting keys and JSON-stringifying them, so the\n * strategy can deterministically rebuild a route from a discovered capability\n * name and look the handler up via `getHandlerByPattern`.\n */\nexport interface McpPattern {\n mcp: McpCapabilityType;\n name: string;\n // Index signature keeps the pattern assignable to NestJS's MsObjectPattern.\n [key: string]: string;\n}\n\n/**\n * Routing + metadata identity carried in the bound handler's `extras`.\n *\n * `mcpMethodRef` is the original decorated method (`descriptor.value`). NestJS\n * stores `extras` by reference on the handler, so at `listen()` time — after ALL\n * decorators on that method have run — the strategy reads every metadata key off\n * `mcpMethodRef` directly (`@Tool` options + `@ToolScopes`/`@ToolRoles`/etc.),\n * with no DI discovery service.\n */\n/** A decorated capability method reference (used to read its metadata at bind time). */\nexport type McpMethodRef = (...args: any[]) => any;\n\nexport interface McpHandlerExtras {\n mcpType: McpCapabilityType;\n mcpName: string;\n mcpMethodKey: string;\n mcpMethodRef: McpMethodRef;\n}\n\nexport function buildMcpPattern(\n type: McpCapabilityType,\n name: string,\n): McpPattern {\n return { mcp: type, name };\n}\n\nexport function buildMcpHandlerExtras(\n type: McpCapabilityType,\n name: string,\n methodKey: string,\n methodRef: McpMethodRef,\n): McpHandlerExtras {\n return {\n mcpType: type,\n mcpName: name,\n mcpMethodKey: methodKey,\n mcpMethodRef: methodRef,\n };\n}\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { HttpServer, Logger } from '@nestjs/common';
|
|
2
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
3
|
+
import { McpServerOptions } from './mcp-server-options.interface';
|
|
4
|
+
import { McpSessionInfo, McpTransportKind } from './mcp-context';
|
|
5
|
+
export interface McpTransportContext {
|
|
6
|
+
createServer(): McpServer;
|
|
7
|
+
bindRequestHandlers(server: McpServer, session: Pick<McpSessionInfo, 'transport' | 'stateless' | 'sessionId'>, rawRequest?: unknown): void;
|
|
8
|
+
httpAdapter?: HttpServer;
|
|
9
|
+
options: McpServerOptions;
|
|
10
|
+
logger: Logger;
|
|
11
|
+
}
|
|
12
|
+
export interface McpTransport {
|
|
13
|
+
readonly kind: McpTransportKind;
|
|
14
|
+
start(ctx: McpTransportContext): Promise<void> | void;
|
|
15
|
+
close(): Promise<void> | void;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=mcp-transport.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-transport.interface.d.ts","sourceRoot":"","sources":["../../../src/mcp/transport/mcp-transport.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAOjE,MAAM,WAAW,mBAAmB;IAMlC,YAAY,IAAI,SAAS,CAAC;IAO1B,mBAAmB,CACjB,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,WAAW,GAAG,WAAW,GAAG,WAAW,CAAC,EACtE,UAAU,CAAC,EAAE,OAAO,GACnB,IAAI,CAAC;IAGR,WAAW,CAAC,EAAE,UAAU,CAAC;IAGzB,OAAO,EAAE,gBAAgB,CAAC;IAG1B,MAAM,EAAE,MAAM,CAAC;CAChB;AAMD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAEhC,KAAK,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAEtD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAC/B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-transport.interface.js","sourceRoot":"","sources":["../../../src/mcp/transport/mcp-transport.interface.ts"],"names":[],"mappings":"","sourcesContent":["import { HttpServer, Logger } from '@nestjs/common';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { McpServerOptions } from './mcp-server-options.interface';\nimport { McpSessionInfo, McpTransportKind } from './mcp-context';\n\n/**\n * The surface a transport receives from the {@link McpStrategy} when it starts.\n * Transports own the wire protocol; the strategy owns capability discovery,\n * the MCP request handlers, and routing into the NestJS RPC pipeline.\n */\nexport interface McpTransportContext {\n /**\n * Create a bare SDK `McpServer` (capabilities derived from discovery + any\n * `serverMutator` applied). The caller is responsible for connecting it to an\n * SDK transport and for calling {@link bindRequestHandlers}.\n */\n createServer(): McpServer;\n\n /**\n * (Re)register the MCP request handlers (tools/resources/prompts) on a server,\n * bound to a specific incoming request. Call this per request for session-aware\n * transports so the per-request `rawRequest` (auth context) is current.\n */\n bindRequestHandlers(\n server: McpServer,\n session: Pick<McpSessionInfo, 'transport' | 'stateless' | 'sessionId'>,\n rawRequest?: unknown,\n ): void;\n\n /** The Nest HTTP adapter. Present whenever an HTTP-based transport is used. */\n httpAdapter?: HttpServer;\n\n /** The resolved strategy options. */\n options: McpServerOptions;\n\n /** A logger scoped to the MCP server. */\n logger: Logger;\n}\n\n/**\n * A single MCP integration (stdio or streamable-HTTP). Implementations\n * are plain objects the user constructs and passes via {@link McpServerOptions.transports}.\n */\nexport interface McpTransport {\n readonly kind: McpTransportKind;\n /** Called once from {@link McpStrategy.listen}. */\n start(ctx: McpTransportContext): Promise<void> | void;\n /** Called from {@link McpStrategy.close}. */\n close(): Promise<void> | void;\n}\n"]}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { HttpServer, Logger } from '@nestjs/common';
|
|
2
|
+
import { CustomTransportStrategy, Server } from '@nestjs/microservices';
|
|
3
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
4
|
+
import type { DynamicPromptDefinition, DynamicResourceDefinition, DynamicToolDefinition } from '../interfaces';
|
|
5
|
+
import { McpSessionInfo } from './mcp-context';
|
|
6
|
+
import { McpServerOptions } from './mcp-server-options.interface';
|
|
7
|
+
export declare const MCP_STRATEGY = "MCP_STRATEGY";
|
|
8
|
+
export declare class McpStrategy extends Server implements CustomTransportStrategy {
|
|
9
|
+
readonly options: McpServerOptions;
|
|
10
|
+
transportId: symbol;
|
|
11
|
+
readonly moduleId: string;
|
|
12
|
+
protected readonly logger: Logger;
|
|
13
|
+
private readonly authService;
|
|
14
|
+
private httpAdapter?;
|
|
15
|
+
private built;
|
|
16
|
+
private readonly tools;
|
|
17
|
+
private readonly resources;
|
|
18
|
+
private readonly templates;
|
|
19
|
+
private readonly prompts;
|
|
20
|
+
private readonly dynamicTools;
|
|
21
|
+
private readonly dynamicResources;
|
|
22
|
+
private readonly dynamicPrompts;
|
|
23
|
+
private readonly eventListeners;
|
|
24
|
+
constructor(options: McpServerOptions);
|
|
25
|
+
setHttpAdapter(adapter: HttpServer): void;
|
|
26
|
+
listen(callback: (err?: unknown, ...args: unknown[]) => void): Promise<void>;
|
|
27
|
+
close(): Promise<void>;
|
|
28
|
+
on<EventKey extends string = string, EventCallback extends Function = Function>(event: EventKey, callback: EventCallback): void;
|
|
29
|
+
unwrap<T>(): T;
|
|
30
|
+
private warnIfNamedServerHasNoDecoratorCapabilities;
|
|
31
|
+
private buildCapabilities;
|
|
32
|
+
private readToolMetadata;
|
|
33
|
+
private readMetadata;
|
|
34
|
+
private getTools;
|
|
35
|
+
private getResources;
|
|
36
|
+
private getTemplates;
|
|
37
|
+
private getPrompts;
|
|
38
|
+
private createTransportContext;
|
|
39
|
+
private createServer;
|
|
40
|
+
bindRequestHandlers(server: McpServer, session: Pick<McpSessionInfo, 'transport' | 'stateless' | 'sessionId'>, rawRequest?: unknown): void;
|
|
41
|
+
private buildContext;
|
|
42
|
+
private getUser;
|
|
43
|
+
private bindToolHandlers;
|
|
44
|
+
private bindResourceHandlers;
|
|
45
|
+
private bindPromptHandlers;
|
|
46
|
+
private invokeViaPipeline;
|
|
47
|
+
private formatToolResult;
|
|
48
|
+
private toErrorResult;
|
|
49
|
+
registerTool(definition: DynamicToolDefinition): void;
|
|
50
|
+
registerResource(definition: DynamicResourceDefinition): void;
|
|
51
|
+
registerPrompt(definition: DynamicPromptDefinition): void;
|
|
52
|
+
removeTool(name: string): void;
|
|
53
|
+
removeResource(uri: string): void;
|
|
54
|
+
removePrompt(name: string): void;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=mcp.strategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.strategy.d.ts","sourceRoot":"","sources":["../../../src/mcp/transport/mcp.strategy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAEL,uBAAuB,EAEvB,MAAM,EACP,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAqCpE,OAAO,KAAK,EACV,uBAAuB,EAEvB,yBAAyB,EAEzB,qBAAqB,EAEtB,MAAM,eAAe,CAAC;AAMvB,OAAO,EAAc,cAAc,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAQlE,eAAO,MAAM,YAAY,iBAAiB,CAAC;AAoC3C,qBAAa,WAAY,SAAQ,MAAO,YAAW,uBAAuB;aAwB5C,OAAO,EAAE,gBAAgB;IAvBrC,WAAW,EAAE,MAAM,CAAC;IAEpC,SAAgB,QAAQ,EAAE,MAAM,CAAC;IACjC,mBAA4B,MAAM,EAAE,MAAM,CAAC;IAE3C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAkC;IAC9D,OAAO,CAAC,WAAW,CAAC,CAAa;IACjC,OAAO,CAAC,KAAK,CAAS;IAEtB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAwB;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA4B;IACtD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA4B;IACtD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;IAElD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqC;IAClE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAyC;IAC1E,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAuC;IAEtE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAG3B;gBAEwB,OAAO,EAAE,gBAAgB;IAYrD,cAAc,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;IAQnC,MAAM,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI;IAe5D,KAAK;IAWX,EAAE,CACA,QAAQ,SAAS,MAAM,GAAG,MAAM,EAEhC,aAAa,SAAS,QAAQ,GAAG,QAAQ,EACzC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI;IAMjD,MAAM,CAAC,CAAC,KAAK,CAAC;IAkBd,OAAO,CAAC,2CAA2C;IAqBnD,OAAO,CAAC,iBAAiB;IA2DzB,OAAO,CAAC,gBAAgB;IA4BxB,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,QAAQ;IAGhB,OAAO,CAAC,YAAY;IAGpB,OAAO,CAAC,YAAY;IAGpB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,sBAAsB;IAW9B,OAAO,CAAC,YAAY;IAiCpB,mBAAmB,CACjB,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,WAAW,GAAG,WAAW,GAAG,WAAW,CAAC,EACtE,UAAU,CAAC,EAAE,OAAO,GACnB,IAAI;IAMP,OAAO,CAAC,YAAY;IAgBpB,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,gBAAgB;IAgGxB,OAAO,CAAC,oBAAoB;IAoD5B,OAAO,CAAC,kBAAkB;YA6CZ,iBAAiB;IAyB/B,OAAO,CAAC,gBAAgB;IAqCxB,OAAO,CAAC,aAAa;IAyBrB,YAAY,CAAC,UAAU,EAAE,qBAAqB,GAAG,IAAI;IAqBrD,gBAAgB,CAAC,UAAU,EAAE,yBAAyB,GAAG,IAAI;IAiB7D,cAAc,CAAC,UAAU,EAAE,uBAAuB,GAAG,IAAI;IAezD,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAG9B,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAGjC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;CAGjC"}
|
|
@@ -0,0 +1,446 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.McpStrategy = exports.MCP_STRATEGY = void 0;
|
|
4
|
+
const microservices_1 = require("@nestjs/microservices");
|
|
5
|
+
const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
|
|
6
|
+
const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
|
|
7
|
+
const zod_json_schema_compat_js_1 = require("@modelcontextprotocol/sdk/server/zod-json-schema-compat.js");
|
|
8
|
+
const zod_compat_js_1 = require("@modelcontextprotocol/sdk/server/zod-compat.js");
|
|
9
|
+
const rxjs_1 = require("rxjs");
|
|
10
|
+
const zod_1 = require("zod");
|
|
11
|
+
const decorators_1 = require("../decorators");
|
|
12
|
+
const tool_authorization_service_1 = require("../services/tool-authorization.service");
|
|
13
|
+
const mcp_logger_factory_1 = require("../utils/mcp-logger.factory");
|
|
14
|
+
const mcp_transport_constants_1 = require("./mcp-transport.constants");
|
|
15
|
+
const mcp_context_1 = require("./mcp-context");
|
|
16
|
+
const resource_matcher_1 = require("./resource-matcher");
|
|
17
|
+
exports.MCP_STRATEGY = 'MCP_STRATEGY';
|
|
18
|
+
let strategyIdCounter = 0;
|
|
19
|
+
class McpStrategy extends microservices_1.Server {
|
|
20
|
+
constructor(options) {
|
|
21
|
+
super();
|
|
22
|
+
this.options = options;
|
|
23
|
+
this.authService = new tool_authorization_service_1.ToolAuthorizationService();
|
|
24
|
+
this.built = false;
|
|
25
|
+
this.tools = [];
|
|
26
|
+
this.resources = [];
|
|
27
|
+
this.templates = [];
|
|
28
|
+
this.prompts = [];
|
|
29
|
+
this.dynamicTools = new Map();
|
|
30
|
+
this.dynamicResources = new Map();
|
|
31
|
+
this.dynamicPrompts = new Map();
|
|
32
|
+
this.eventListeners = new Map();
|
|
33
|
+
this.transportId = (0, mcp_transport_constants_1.mcpTransportFor)(options.server);
|
|
34
|
+
this.moduleId = `mcp-strategy-${strategyIdCounter++}`;
|
|
35
|
+
this.httpAdapter = options.httpAdapter;
|
|
36
|
+
this.logger = (0, mcp_logger_factory_1.createMcpLogger)(McpStrategy.name, this.options);
|
|
37
|
+
}
|
|
38
|
+
setHttpAdapter(adapter) {
|
|
39
|
+
this.httpAdapter = adapter;
|
|
40
|
+
}
|
|
41
|
+
async listen(callback) {
|
|
42
|
+
try {
|
|
43
|
+
this.buildCapabilities();
|
|
44
|
+
this.warnIfNamedServerHasNoDecoratorCapabilities();
|
|
45
|
+
const ctx = this.createTransportContext();
|
|
46
|
+
for (const transport of this.options.transports) {
|
|
47
|
+
await transport.start(ctx);
|
|
48
|
+
}
|
|
49
|
+
callback();
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
this.logger.error('Failed to start MCP strategy', err);
|
|
53
|
+
callback(err);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
async close() {
|
|
57
|
+
for (const transport of this.options.transports) {
|
|
58
|
+
try {
|
|
59
|
+
await transport.close();
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
this.logger.error('Error closing MCP transport', err);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
this.eventListeners.clear();
|
|
66
|
+
}
|
|
67
|
+
on(event, callback) {
|
|
68
|
+
const list = this.eventListeners.get(event) ?? [];
|
|
69
|
+
list.push(callback);
|
|
70
|
+
this.eventListeners.set(event, list);
|
|
71
|
+
}
|
|
72
|
+
unwrap() {
|
|
73
|
+
return {
|
|
74
|
+
transports: this.options.transports,
|
|
75
|
+
httpAdapter: this.httpAdapter,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
warnIfNamedServerHasNoDecoratorCapabilities() {
|
|
79
|
+
if (!this.options.server)
|
|
80
|
+
return;
|
|
81
|
+
const decoratorCount = this.tools.length +
|
|
82
|
+
this.resources.length +
|
|
83
|
+
this.templates.length +
|
|
84
|
+
this.prompts.length;
|
|
85
|
+
if (decoratorCount > 0)
|
|
86
|
+
return;
|
|
87
|
+
this.logger.warn(`MCP server '${this.options.server}' started with no @McpController ` +
|
|
88
|
+
`capabilities bound to it. Check that a @McpController({ server: ` +
|
|
89
|
+
`'${this.options.server}' }) exists and is listed in a module's ` +
|
|
90
|
+
`controllers. (Safe to ignore if this server is populated at runtime ` +
|
|
91
|
+
`via strategy.registerTool()/registerResource()/registerPrompt().)`);
|
|
92
|
+
}
|
|
93
|
+
buildCapabilities() {
|
|
94
|
+
if (this.built)
|
|
95
|
+
return;
|
|
96
|
+
this.built = true;
|
|
97
|
+
for (const [route, handler] of this.messageHandlers) {
|
|
98
|
+
const extras = handler
|
|
99
|
+
.extras;
|
|
100
|
+
if (!extras?.mcpType) {
|
|
101
|
+
this.messageHandlers.delete(route);
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
const { mcpType, mcpMethodKey, mcpMethodRef } = extras;
|
|
105
|
+
const invoke = (payload, ctx) => this.invokeViaPipeline(handler, payload, ctx);
|
|
106
|
+
switch (mcpType) {
|
|
107
|
+
case 'tool':
|
|
108
|
+
this.tools.push({
|
|
109
|
+
metadata: this.readToolMetadata(mcpMethodRef, mcpMethodKey),
|
|
110
|
+
invoke,
|
|
111
|
+
});
|
|
112
|
+
break;
|
|
113
|
+
case 'resource':
|
|
114
|
+
this.resources.push({
|
|
115
|
+
metadata: this.readMetadata(decorators_1.MCP_RESOURCE_METADATA_KEY, mcpMethodRef, mcpMethodKey),
|
|
116
|
+
invoke,
|
|
117
|
+
});
|
|
118
|
+
break;
|
|
119
|
+
case 'resource-template':
|
|
120
|
+
this.templates.push({
|
|
121
|
+
metadata: this.readMetadata(decorators_1.MCP_RESOURCE_TEMPLATE_METADATA_KEY, mcpMethodRef, mcpMethodKey),
|
|
122
|
+
invoke,
|
|
123
|
+
});
|
|
124
|
+
break;
|
|
125
|
+
case 'prompt':
|
|
126
|
+
this.prompts.push({
|
|
127
|
+
metadata: this.readMetadata(decorators_1.MCP_PROMPT_METADATA_KEY, mcpMethodRef, mcpMethodKey),
|
|
128
|
+
invoke,
|
|
129
|
+
});
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
readToolMetadata(methodRef, methodKey) {
|
|
135
|
+
const base = {
|
|
136
|
+
...Reflect.getMetadata(decorators_1.MCP_TOOL_METADATA_KEY, methodRef),
|
|
137
|
+
};
|
|
138
|
+
if (!base.name)
|
|
139
|
+
base.name = methodKey;
|
|
140
|
+
if (!base.parameters)
|
|
141
|
+
base.parameters = zod_1.z.object({});
|
|
142
|
+
const isPublic = Reflect.getMetadata(decorators_1.MCP_PUBLIC_METADATA_KEY, methodRef);
|
|
143
|
+
const requiredScopes = Reflect.getMetadata(decorators_1.MCP_SCOPES_METADATA_KEY, methodRef);
|
|
144
|
+
const requiredRoles = Reflect.getMetadata(decorators_1.MCP_ROLES_METADATA_KEY, methodRef);
|
|
145
|
+
if (isPublic !== undefined)
|
|
146
|
+
base.isPublic = isPublic;
|
|
147
|
+
if (requiredScopes)
|
|
148
|
+
base.requiredScopes = requiredScopes;
|
|
149
|
+
if (requiredRoles)
|
|
150
|
+
base.requiredRoles = requiredRoles;
|
|
151
|
+
return base;
|
|
152
|
+
}
|
|
153
|
+
readMetadata(key, methodRef, methodKey) {
|
|
154
|
+
const metadata = { ...Reflect.getMetadata(key, methodRef) };
|
|
155
|
+
if (!metadata.name)
|
|
156
|
+
metadata.name = methodKey;
|
|
157
|
+
return metadata;
|
|
158
|
+
}
|
|
159
|
+
getTools() {
|
|
160
|
+
return [...this.tools, ...this.dynamicTools.values()];
|
|
161
|
+
}
|
|
162
|
+
getResources() {
|
|
163
|
+
return [...this.resources, ...this.dynamicResources.values()];
|
|
164
|
+
}
|
|
165
|
+
getTemplates() {
|
|
166
|
+
return [...this.templates];
|
|
167
|
+
}
|
|
168
|
+
getPrompts() {
|
|
169
|
+
return [...this.prompts, ...this.dynamicPrompts.values()];
|
|
170
|
+
}
|
|
171
|
+
createTransportContext() {
|
|
172
|
+
return {
|
|
173
|
+
createServer: () => this.createServer(),
|
|
174
|
+
bindRequestHandlers: (server, session, rawRequest) => this.bindRequestHandlers(server, session, rawRequest),
|
|
175
|
+
httpAdapter: this.httpAdapter,
|
|
176
|
+
options: this.options,
|
|
177
|
+
logger: this.logger,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
createServer() {
|
|
181
|
+
const capabilities = {
|
|
182
|
+
...(this.options.capabilities ?? {}),
|
|
183
|
+
};
|
|
184
|
+
if (this.getTools().length > 0) {
|
|
185
|
+
capabilities.tools = capabilities.tools ?? { listChanged: true };
|
|
186
|
+
}
|
|
187
|
+
if (this.getResources().length + this.getTemplates().length > 0) {
|
|
188
|
+
capabilities.resources = capabilities.resources ?? { listChanged: true };
|
|
189
|
+
}
|
|
190
|
+
if (this.getPrompts().length > 0) {
|
|
191
|
+
capabilities.prompts = capabilities.prompts ?? { listChanged: true };
|
|
192
|
+
}
|
|
193
|
+
const server = new mcp_js_1.McpServer({
|
|
194
|
+
name: this.options.name,
|
|
195
|
+
version: this.options.version,
|
|
196
|
+
...(this.options.title && { title: this.options.title }),
|
|
197
|
+
...(this.options.description && {
|
|
198
|
+
description: this.options.description,
|
|
199
|
+
}),
|
|
200
|
+
...(this.options.websiteUrl && { websiteUrl: this.options.websiteUrl }),
|
|
201
|
+
...(this.options.icons && { icons: this.options.icons }),
|
|
202
|
+
}, { capabilities, instructions: this.options.instructions ?? '' });
|
|
203
|
+
return this.options.serverMutator
|
|
204
|
+
? this.options.serverMutator(server)
|
|
205
|
+
: server;
|
|
206
|
+
}
|
|
207
|
+
bindRequestHandlers(server, session, rawRequest) {
|
|
208
|
+
this.bindToolHandlers(server, session, rawRequest);
|
|
209
|
+
this.bindResourceHandlers(server, session, rawRequest);
|
|
210
|
+
this.bindPromptHandlers(server, session, rawRequest);
|
|
211
|
+
}
|
|
212
|
+
buildContext(server, request, session, rawRequest) {
|
|
213
|
+
const sessionId = session.sessionId ??
|
|
214
|
+
server.server.transport
|
|
215
|
+
?.sessionId;
|
|
216
|
+
return new mcp_context_1.McpContext([server, request, { ...session, sessionId }, rawRequest], this.logger);
|
|
217
|
+
}
|
|
218
|
+
getUser(rawRequest) {
|
|
219
|
+
return rawRequest ? rawRequest.user : undefined;
|
|
220
|
+
}
|
|
221
|
+
bindToolHandlers(server, session, rawRequest) {
|
|
222
|
+
if (this.getTools().length === 0)
|
|
223
|
+
return;
|
|
224
|
+
const allowUnauthenticatedAccess = this.options.allowUnauthenticatedAccess ?? false;
|
|
225
|
+
server.server.setRequestHandler(types_js_1.ListToolsRequestSchema, () => {
|
|
226
|
+
const user = this.getUser(rawRequest);
|
|
227
|
+
const tools = this.getTools()
|
|
228
|
+
.filter((tool) => this.authService.canAccessTool(user, tool, allowUnauthenticatedAccess))
|
|
229
|
+
.map((tool) => {
|
|
230
|
+
const schema = {
|
|
231
|
+
name: tool.metadata.name,
|
|
232
|
+
description: tool.metadata.description,
|
|
233
|
+
annotations: tool.metadata.annotations,
|
|
234
|
+
_meta: tool.metadata._meta,
|
|
235
|
+
};
|
|
236
|
+
const securitySchemes = this.authService.generateSecuritySchemes(tool, allowUnauthenticatedAccess);
|
|
237
|
+
if (securitySchemes.length > 0) {
|
|
238
|
+
schema._meta = { ...schema._meta, securitySchemes };
|
|
239
|
+
}
|
|
240
|
+
const input = (0, zod_compat_js_1.normalizeObjectSchema)(tool.metadata.parameters);
|
|
241
|
+
if (input)
|
|
242
|
+
schema.inputSchema = (0, zod_json_schema_compat_js_1.toJsonSchemaCompat)(input);
|
|
243
|
+
const output = (0, zod_compat_js_1.normalizeObjectSchema)(tool.metadata.outputSchema);
|
|
244
|
+
if (output) {
|
|
245
|
+
schema.outputSchema = {
|
|
246
|
+
...(0, zod_json_schema_compat_js_1.toJsonSchemaCompat)(output),
|
|
247
|
+
type: 'object',
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
return schema;
|
|
251
|
+
});
|
|
252
|
+
return { tools };
|
|
253
|
+
});
|
|
254
|
+
server.server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
|
|
255
|
+
const tool = this.getTools().find((t) => t.metadata.name === request.params.name);
|
|
256
|
+
if (!tool) {
|
|
257
|
+
throw new types_js_1.McpError(types_js_1.ErrorCode.MethodNotFound, `Unknown tool: ${request.params.name}`);
|
|
258
|
+
}
|
|
259
|
+
this.authService.validateToolAccess(this.getUser(rawRequest), tool, allowUnauthenticatedAccess);
|
|
260
|
+
if (tool.metadata.parameters) {
|
|
261
|
+
const validation = tool.metadata.parameters.safeParse(request.params.arguments ?? {});
|
|
262
|
+
if (!validation.success) {
|
|
263
|
+
const issues = validation.error.issues
|
|
264
|
+
.map((issue) => {
|
|
265
|
+
const path = issue.path.length > 0 ? issue.path.join('.') : '';
|
|
266
|
+
return `${path ? `[${path}]: ` : ''}${issue.message}`;
|
|
267
|
+
})
|
|
268
|
+
.join('; ');
|
|
269
|
+
return {
|
|
270
|
+
content: [{ type: 'text', text: `Invalid parameters: ${issues}` }],
|
|
271
|
+
isError: true,
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
request.params.arguments = validation.data;
|
|
275
|
+
}
|
|
276
|
+
const ctx = this.buildContext(server, request, session, rawRequest);
|
|
277
|
+
try {
|
|
278
|
+
const result = await tool.invoke(request.params.arguments ?? {}, ctx);
|
|
279
|
+
return this.formatToolResult(result, tool.metadata.outputSchema);
|
|
280
|
+
}
|
|
281
|
+
catch (error) {
|
|
282
|
+
return this.toErrorResult(error);
|
|
283
|
+
}
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
bindResourceHandlers(server, session, rawRequest) {
|
|
287
|
+
if (this.getResources().length + this.getTemplates().length === 0)
|
|
288
|
+
return;
|
|
289
|
+
server.server.setRequestHandler(types_js_1.ListResourcesRequestSchema, () => ({
|
|
290
|
+
resources: this.getResources().map((r) => r.metadata),
|
|
291
|
+
}));
|
|
292
|
+
server.server.setRequestHandler(types_js_1.ListResourceTemplatesRequestSchema, () => ({
|
|
293
|
+
resourceTemplates: this.getTemplates().map((r) => r.metadata),
|
|
294
|
+
}));
|
|
295
|
+
server.server.setRequestHandler(types_js_1.ReadResourceRequestSchema, async (request) => {
|
|
296
|
+
const uri = request.params.uri;
|
|
297
|
+
const templateMatch = (0, resource_matcher_1.matchResourceTemplateByUri)(this.getTemplates().map((cap) => ({
|
|
298
|
+
uriTemplate: cap.metadata.uriTemplate,
|
|
299
|
+
cap,
|
|
300
|
+
})), uri);
|
|
301
|
+
const resourceMatch = (0, resource_matcher_1.matchResourceByUri)(this.getResources().map((cap) => ({ uri: cap.metadata.uri, cap })), uri);
|
|
302
|
+
let invoke;
|
|
303
|
+
let params;
|
|
304
|
+
if (templateMatch) {
|
|
305
|
+
invoke = templateMatch.template.cap.invoke;
|
|
306
|
+
params = { ...templateMatch.params, ...request.params };
|
|
307
|
+
}
|
|
308
|
+
else if (resourceMatch) {
|
|
309
|
+
invoke = resourceMatch.resource.cap.invoke;
|
|
310
|
+
params = { ...resourceMatch.params, ...request.params };
|
|
311
|
+
}
|
|
312
|
+
else {
|
|
313
|
+
throw new types_js_1.McpError(types_js_1.ErrorCode.MethodNotFound, `Unknown resource: ${uri}`);
|
|
314
|
+
}
|
|
315
|
+
const ctx = this.buildContext(server, request, session, rawRequest);
|
|
316
|
+
return (await invoke(params, ctx));
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
bindPromptHandlers(server, session, rawRequest) {
|
|
320
|
+
if (this.getPrompts().length === 0)
|
|
321
|
+
return;
|
|
322
|
+
server.server.setRequestHandler(types_js_1.ListPromptsRequestSchema, () => ({
|
|
323
|
+
prompts: this.getPrompts().map((prompt) => ({
|
|
324
|
+
name: prompt.metadata.name,
|
|
325
|
+
description: prompt.metadata.description,
|
|
326
|
+
arguments: prompt.metadata.parameters
|
|
327
|
+
? Object.entries(prompt.metadata.parameters.shape).map(([name, field]) => ({
|
|
328
|
+
name,
|
|
329
|
+
description: field.description,
|
|
330
|
+
required: !field.isOptional(),
|
|
331
|
+
}))
|
|
332
|
+
: [],
|
|
333
|
+
})),
|
|
334
|
+
}));
|
|
335
|
+
server.server.setRequestHandler(types_js_1.GetPromptRequestSchema, async (request) => {
|
|
336
|
+
const prompt = this.getPrompts().find((p) => p.metadata.name === request.params.name);
|
|
337
|
+
if (!prompt) {
|
|
338
|
+
throw new types_js_1.McpError(types_js_1.ErrorCode.MethodNotFound, `Unknown prompt: ${request.params.name}`);
|
|
339
|
+
}
|
|
340
|
+
const ctx = this.buildContext(server, request, session, rawRequest);
|
|
341
|
+
return (await prompt.invoke(request.params.arguments, ctx));
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
async invokeViaPipeline(handler, payload, ctx) {
|
|
345
|
+
let resultPromise;
|
|
346
|
+
const done = () => {
|
|
347
|
+
resultPromise = (async () => {
|
|
348
|
+
const resultOrStream = await handler(payload, ctx);
|
|
349
|
+
return (0, rxjs_1.firstValueFrom)(this.transformToObservable(resultOrStream));
|
|
350
|
+
})();
|
|
351
|
+
return resultPromise;
|
|
352
|
+
};
|
|
353
|
+
await Promise.resolve(this.onProcessingStartHook(this.transportId, ctx, done));
|
|
354
|
+
try {
|
|
355
|
+
return await resultPromise;
|
|
356
|
+
}
|
|
357
|
+
finally {
|
|
358
|
+
this.onProcessingEndHook?.(this.transportId, ctx);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
formatToolResult(result, outputSchema) {
|
|
362
|
+
if (result && typeof result === 'object' && Array.isArray(result.content)) {
|
|
363
|
+
return result;
|
|
364
|
+
}
|
|
365
|
+
const defaultContent = [{ type: 'text', text: JSON.stringify(result) }];
|
|
366
|
+
if (outputSchema) {
|
|
367
|
+
const validation = outputSchema.safeParse(result);
|
|
368
|
+
if (!validation.success) {
|
|
369
|
+
throw new types_js_1.McpError(types_js_1.ErrorCode.InternalError, `Tool result does not match outputSchema: ${validation.error.message}`);
|
|
370
|
+
}
|
|
371
|
+
return { structuredContent: validation.data, content: defaultContent };
|
|
372
|
+
}
|
|
373
|
+
return { content: defaultContent };
|
|
374
|
+
}
|
|
375
|
+
toErrorResult(error) {
|
|
376
|
+
if (error instanceof types_js_1.McpError) {
|
|
377
|
+
throw error;
|
|
378
|
+
}
|
|
379
|
+
let message = 'Internal server error';
|
|
380
|
+
if (error instanceof Error) {
|
|
381
|
+
message = error.message;
|
|
382
|
+
}
|
|
383
|
+
else if (typeof error === 'string') {
|
|
384
|
+
message = error;
|
|
385
|
+
}
|
|
386
|
+
else if (error &&
|
|
387
|
+
typeof error === 'object' &&
|
|
388
|
+
typeof error.message === 'string') {
|
|
389
|
+
message = error.message;
|
|
390
|
+
}
|
|
391
|
+
this.logger.error(message);
|
|
392
|
+
return { content: [{ type: 'text', text: message }], isError: true };
|
|
393
|
+
}
|
|
394
|
+
registerTool(definition) {
|
|
395
|
+
const handler = definition.handler;
|
|
396
|
+
this.dynamicTools.set(definition.name, {
|
|
397
|
+
metadata: {
|
|
398
|
+
name: definition.name,
|
|
399
|
+
description: definition.description,
|
|
400
|
+
parameters: definition.parameters ?? zod_1.z.object({}),
|
|
401
|
+
outputSchema: definition.outputSchema,
|
|
402
|
+
annotations: definition.annotations,
|
|
403
|
+
_meta: definition._meta,
|
|
404
|
+
isPublic: definition.isPublic,
|
|
405
|
+
requiredScopes: definition.requiredScopes,
|
|
406
|
+
requiredRoles: definition.requiredRoles,
|
|
407
|
+
},
|
|
408
|
+
invoke: (payload, ctx) => Promise.resolve(handler(payload, ctx, ctx.getRawRequest())),
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
registerResource(definition) {
|
|
412
|
+
const handler = definition.handler;
|
|
413
|
+
this.dynamicResources.set(definition.uri, {
|
|
414
|
+
metadata: {
|
|
415
|
+
uri: definition.uri,
|
|
416
|
+
name: definition.name ?? definition.uri,
|
|
417
|
+
description: definition.description,
|
|
418
|
+
mimeType: definition.mimeType,
|
|
419
|
+
_meta: definition._meta,
|
|
420
|
+
},
|
|
421
|
+
invoke: (payload, ctx) => Promise.resolve(handler(payload, ctx, ctx.getRawRequest())),
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
registerPrompt(definition) {
|
|
425
|
+
const handler = definition.handler;
|
|
426
|
+
this.dynamicPrompts.set(definition.name, {
|
|
427
|
+
metadata: {
|
|
428
|
+
name: definition.name,
|
|
429
|
+
description: definition.description,
|
|
430
|
+
parameters: definition.parameters,
|
|
431
|
+
},
|
|
432
|
+
invoke: (payload, ctx) => Promise.resolve(handler(payload, ctx, ctx.getRawRequest())),
|
|
433
|
+
});
|
|
434
|
+
}
|
|
435
|
+
removeTool(name) {
|
|
436
|
+
this.dynamicTools.delete(name);
|
|
437
|
+
}
|
|
438
|
+
removeResource(uri) {
|
|
439
|
+
this.dynamicResources.delete(uri);
|
|
440
|
+
}
|
|
441
|
+
removePrompt(name) {
|
|
442
|
+
this.dynamicPrompts.delete(name);
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
exports.McpStrategy = McpStrategy;
|
|
446
|
+
//# sourceMappingURL=mcp.strategy.js.map
|