@rekog/mcp-nest 1.9.10-alpha.4 → 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
package/README.md
CHANGED
|
@@ -17,7 +17,8 @@ With `@rekog/mcp-nest` you define tools, resources, and prompts in a way that's
|
|
|
17
17
|
|
|
18
18
|
## Features
|
|
19
19
|
|
|
20
|
-
-
|
|
20
|
+
- 🧩 **[NestJS Microservice Strategy](docs/migration-to-strategy.md)**: MCP runs as a `CustomTransportStrategy`, so tools/resources/prompts are real `@MessagePattern` handlers — **guards, pipes, interceptors, and exception filters apply to them natively**
|
|
21
|
+
- 🚀 **[Multi-Transport Support](docs/server-examples.md#multiple-transport-types)**: Streamable HTTP and STDIO — selected via the `transports` array
|
|
21
22
|
- 🔧 **[Tools](docs/tools.md)**: Expose NestJS methods as MCP tools with automatic discovery and Zod validation
|
|
22
23
|
- 🛠️ **[Elicitation](docs/tools.md#interactive-tool-calls)**: Interactive tool calls with user input elicitation
|
|
23
24
|
- 🌐 **[HTTP Request Access](docs/tools.md#understanding-tool-method-parameters)**: Full access to request context within MCP handlers
|
|
@@ -46,7 +47,13 @@ npm install @rekog/mcp-nest @modelcontextprotocol/sdk zod@^4
|
|
|
46
47
|
|
|
47
48
|
### Optional dependencies
|
|
48
49
|
|
|
49
|
-
|
|
50
|
+
The built-in authorization server now lives in a separate package. If you use it, install it alongside `@rekog/mcp-nest`:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
npm install @rekog/mcp-nest-auth
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
If you additionally use the TypeORM store for the authorization server, install the following optional peer dependencies as well:
|
|
50
57
|
|
|
51
58
|
```bash
|
|
52
59
|
npm install @nestjs/typeorm typeorm
|
|
@@ -54,48 +61,88 @@ npm install @nestjs/typeorm typeorm
|
|
|
54
61
|
|
|
55
62
|
## Quick Start
|
|
56
63
|
|
|
64
|
+
MCP-Nest runs as a **NestJS microservice transport strategy**. Tools, resources,
|
|
65
|
+
and prompts live on `@McpController()` classes (so NestJS guards, pipes,
|
|
66
|
+
interceptors, and exception filters apply to them), and the strategy serves them
|
|
67
|
+
over one or more transports (Streamable HTTP, STDIO).
|
|
68
|
+
|
|
69
|
+
```typescript
|
|
70
|
+
// greeting.controller.ts
|
|
71
|
+
import { McpController, Tool, McpContext } from '@rekog/mcp-nest';
|
|
72
|
+
import { Ctx, Payload } from '@nestjs/microservices';
|
|
73
|
+
import { z } from 'zod';
|
|
74
|
+
|
|
75
|
+
@McpController()
|
|
76
|
+
export class GreetingController {
|
|
77
|
+
@Tool({
|
|
78
|
+
name: 'greeting-tool',
|
|
79
|
+
description: 'Returns a greeting with progress updates',
|
|
80
|
+
parameters: z.object({ name: z.string().default('World') }),
|
|
81
|
+
})
|
|
82
|
+
async sayHello(
|
|
83
|
+
@Payload() { name }: { name: string },
|
|
84
|
+
@Ctx() ctx: McpContext,
|
|
85
|
+
) {
|
|
86
|
+
await ctx.reportProgress({ progress: 50, total: 100 });
|
|
87
|
+
return { content: [{ type: 'text', text: `Hello, ${name}!` }] };
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
57
92
|
```typescript
|
|
58
93
|
// app.module.ts
|
|
59
94
|
import { Module } from '@nestjs/common';
|
|
60
|
-
import {
|
|
61
|
-
|
|
95
|
+
import {
|
|
96
|
+
McpStrategy,
|
|
97
|
+
MCP_STRATEGY,
|
|
98
|
+
StreamableHttpTransport,
|
|
99
|
+
} from '@rekog/mcp-nest';
|
|
100
|
+
import { GreetingController } from './greeting.controller';
|
|
101
|
+
|
|
102
|
+
// The strategy is the whole configuration — there is no McpModule.
|
|
103
|
+
export const mcp = new McpStrategy({
|
|
104
|
+
name: 'my-mcp-server',
|
|
105
|
+
version: '1.0.0',
|
|
106
|
+
transports: [
|
|
107
|
+
new StreamableHttpTransport(),
|
|
108
|
+
],
|
|
109
|
+
});
|
|
62
110
|
|
|
63
111
|
@Module({
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
}),
|
|
69
|
-
],
|
|
70
|
-
providers: [GreetingTool],
|
|
112
|
+
controllers: [GreetingController],
|
|
113
|
+
// Optional: only needed if a provider injects the strategy (e.g. for
|
|
114
|
+
// runtime/dynamic tool registration).
|
|
115
|
+
providers: [{ provide: MCP_STRATEGY, useValue: mcp }],
|
|
71
116
|
})
|
|
72
117
|
export class AppModule {}
|
|
73
118
|
```
|
|
74
119
|
|
|
75
120
|
```typescript
|
|
76
|
-
//
|
|
77
|
-
import {
|
|
78
|
-
import {
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
parameters: z.object({
|
|
87
|
-
name: z.string().default('World'),
|
|
88
|
-
}),
|
|
89
|
-
})
|
|
90
|
-
async sayHello({ name }, context: Context) {
|
|
91
|
-
await context.reportProgress({ progress: 50, total: 100 });
|
|
92
|
-
return `Hello, ${name}!`;
|
|
93
|
-
}
|
|
121
|
+
// main.ts
|
|
122
|
+
import { NestFactory } from '@nestjs/core';
|
|
123
|
+
import { AppModule, mcp } from './app.module';
|
|
124
|
+
|
|
125
|
+
async function bootstrap() {
|
|
126
|
+
const app = await NestFactory.create(AppModule);
|
|
127
|
+
mcp.setHttpAdapter(app.getHttpAdapter()); // needed for HTTP transports
|
|
128
|
+
app.connectMicroservice({ strategy: mcp });
|
|
129
|
+
await app.startAllMicroservices(); // mounts the MCP transports
|
|
130
|
+
await app.listen(3000); // also serves your normal HTTP routes
|
|
94
131
|
}
|
|
132
|
+
void bootstrap();
|
|
95
133
|
```
|
|
96
134
|
|
|
135
|
+
> **Order matters:** call `startAllMicroservices()` before `listen()` so the MCP
|
|
136
|
+
> HTTP routes are mounted before the server starts accepting connections.
|
|
137
|
+
|
|
138
|
+
For an STDIO-only server, skip the HTTP adapter and use
|
|
139
|
+
`NestFactory.createMicroservice(AppModule, { strategy: mcp })` with
|
|
140
|
+
`transports: [new StdioTransport()]` and disable logging (stdout is reserved for
|
|
141
|
+
the protocol).
|
|
142
|
+
|
|
97
143
|
## Documentation
|
|
98
144
|
|
|
145
|
+
- **[Migration to the Strategy API](docs/migration-to-strategy.md)** - Moving from `McpModule.forRoot(options)` to `McpStrategy` + `@McpController`
|
|
99
146
|
- **[Tools Guide](docs/tools.md)** - Define and expose NestJS methods as MCP tools
|
|
100
147
|
- **[Discovery and Registration of Tools](docs/tool-discovery-and-registration.md)** - Automatic discovery and manual registration of tools
|
|
101
148
|
- **[Dynamic Capabilities Guide](docs/dynamic-capabilities.md)** - Register tools, resources, and prompts programmatically at runtime
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -15,5 +15,4 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
__exportStar(require("./mcp"), exports);
|
|
18
|
-
__exportStar(require("./authz"), exports);
|
|
19
18
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wCAAsB
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wCAAsB","sourcesContent":["export * from './mcp';\n"]}
|
|
@@ -2,4 +2,5 @@ export declare const MCP_TOOL_METADATA_KEY = "mcp:tool";
|
|
|
2
2
|
export declare const MCP_RESOURCE_METADATA_KEY = "mcp:resource";
|
|
3
3
|
export declare const MCP_RESOURCE_TEMPLATE_METADATA_KEY = "mcp:resource-template";
|
|
4
4
|
export declare const MCP_PROMPT_METADATA_KEY = "mcp:prompt";
|
|
5
|
+
export declare const MCP_CONTROLLER_METADATA_KEY = "mcp:controller";
|
|
5
6
|
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/mcp/decorators/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,qBAAqB,aAAa,CAAC;AAChD,eAAO,MAAM,yBAAyB,iBAAiB,CAAC;AACxD,eAAO,MAAM,kCAAkC,0BAA0B,CAAC;AAC1E,eAAO,MAAM,uBAAuB,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/mcp/decorators/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,qBAAqB,aAAa,CAAC;AAChD,eAAO,MAAM,yBAAyB,iBAAiB,CAAC;AACxD,eAAO,MAAM,kCAAkC,0BAA0B,CAAC;AAC1E,eAAO,MAAM,uBAAuB,eAAe,CAAC;AACpD,eAAO,MAAM,2BAA2B,mBAAmB,CAAC"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.MCP_PROMPT_METADATA_KEY = exports.MCP_RESOURCE_TEMPLATE_METADATA_KEY = exports.MCP_RESOURCE_METADATA_KEY = exports.MCP_TOOL_METADATA_KEY = void 0;
|
|
3
|
+
exports.MCP_CONTROLLER_METADATA_KEY = exports.MCP_PROMPT_METADATA_KEY = exports.MCP_RESOURCE_TEMPLATE_METADATA_KEY = exports.MCP_RESOURCE_METADATA_KEY = exports.MCP_TOOL_METADATA_KEY = void 0;
|
|
4
4
|
exports.MCP_TOOL_METADATA_KEY = 'mcp:tool';
|
|
5
5
|
exports.MCP_RESOURCE_METADATA_KEY = 'mcp:resource';
|
|
6
6
|
exports.MCP_RESOURCE_TEMPLATE_METADATA_KEY = 'mcp:resource-template';
|
|
7
7
|
exports.MCP_PROMPT_METADATA_KEY = 'mcp:prompt';
|
|
8
|
+
exports.MCP_CONTROLLER_METADATA_KEY = 'mcp:controller';
|
|
8
9
|
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/mcp/decorators/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,qBAAqB,GAAG,UAAU,CAAC;AACnC,QAAA,yBAAyB,GAAG,cAAc,CAAC;AAC3C,QAAA,kCAAkC,GAAG,uBAAuB,CAAC;AAC7D,QAAA,uBAAuB,GAAG,YAAY,CAAC","sourcesContent":["export const MCP_TOOL_METADATA_KEY = 'mcp:tool';\nexport const MCP_RESOURCE_METADATA_KEY = 'mcp:resource';\nexport const MCP_RESOURCE_TEMPLATE_METADATA_KEY = 'mcp:resource-template';\nexport const MCP_PROMPT_METADATA_KEY = 'mcp:prompt';\n"]}
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/mcp/decorators/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,qBAAqB,GAAG,UAAU,CAAC;AACnC,QAAA,yBAAyB,GAAG,cAAc,CAAC;AAC3C,QAAA,kCAAkC,GAAG,uBAAuB,CAAC;AAC7D,QAAA,uBAAuB,GAAG,YAAY,CAAC;AACvC,QAAA,2BAA2B,GAAG,gBAAgB,CAAC","sourcesContent":["export const MCP_TOOL_METADATA_KEY = 'mcp:tool';\nexport const MCP_RESOURCE_METADATA_KEY = 'mcp:resource';\nexport const MCP_RESOURCE_TEMPLATE_METADATA_KEY = 'mcp:resource-template';\nexport const MCP_PROMPT_METADATA_KEY = 'mcp:prompt';\nexport const MCP_CONTROLLER_METADATA_KEY = 'mcp:controller';\n"]}
|
|
@@ -6,5 +6,7 @@ export * from './prompt.decorator';
|
|
|
6
6
|
export * from './public.decorator';
|
|
7
7
|
export * from './tool-scopes.decorator';
|
|
8
8
|
export * from './tool-roles.decorator';
|
|
9
|
-
export * from './
|
|
9
|
+
export * from './mcp-controller.decorator';
|
|
10
|
+
export * from './mcp-message-pattern';
|
|
11
|
+
export * from './raw-request.decorator';
|
|
10
12
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/mcp/decorators/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/mcp/decorators/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC"}
|
|
@@ -22,5 +22,7 @@ __exportStar(require("./prompt.decorator"), exports);
|
|
|
22
22
|
__exportStar(require("./public.decorator"), exports);
|
|
23
23
|
__exportStar(require("./tool-scopes.decorator"), exports);
|
|
24
24
|
__exportStar(require("./tool-roles.decorator"), exports);
|
|
25
|
-
__exportStar(require("./
|
|
25
|
+
__exportStar(require("./mcp-controller.decorator"), exports);
|
|
26
|
+
__exportStar(require("./mcp-message-pattern"), exports);
|
|
27
|
+
__exportStar(require("./raw-request.decorator"), exports);
|
|
26
28
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/mcp/decorators/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mDAAiC;AACjC,8CAA4B;AAC5B,uDAAqC;AACrC,gEAA8C;AAC9C,qDAAmC;AACnC,qDAAmC;AACnC,0DAAwC;AACxC,yDAAuC;AACvC,0DAAwC","sourcesContent":["export * from './tool.decorator';\nexport * from './constants';\nexport * from './resource.decorator';\nexport * from './resource-template.decorator';\nexport * from './prompt.decorator';\nexport * from './public.decorator';\nexport * from './tool-scopes.decorator';\nexport * from './tool-roles.decorator';\nexport * from './
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/mcp/decorators/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mDAAiC;AACjC,8CAA4B;AAC5B,uDAAqC;AACrC,gEAA8C;AAC9C,qDAAmC;AACnC,qDAAmC;AACnC,0DAAwC;AACxC,yDAAuC;AACvC,6DAA2C;AAC3C,wDAAsC;AACtC,0DAAwC","sourcesContent":["export * from './tool.decorator';\nexport * from './constants';\nexport * from './resource.decorator';\nexport * from './resource-template.decorator';\nexport * from './prompt.decorator';\nexport * from './public.decorator';\nexport * from './tool-scopes.decorator';\nexport * from './tool-roles.decorator';\nexport * from './mcp-controller.decorator';\nexport * from './mcp-message-pattern';\nexport * from './raw-request.decorator';\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { ControllerOptions } from '@nestjs/common';
|
|
2
|
+
export interface McpControllerOptions extends ControllerOptions {
|
|
3
|
+
server?: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function McpController(prefixOrOptions?: string | string[] | McpControllerOptions): ClassDecorator;
|
|
6
|
+
//# sourceMappingURL=mcp-controller.decorator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-controller.decorator.d.ts","sourceRoot":"","sources":["../../../src/mcp/decorators/mcp-controller.decorator.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,iBAAiB,EAElB,MAAM,gBAAgB,CAAC;AAkBxB,MAAM,WAAW,oBAAqB,SAAQ,iBAAiB;IAM7D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA+DD,wBAAgB,aAAa,CAC3B,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,oBAAoB,GACzD,cAAc,CA8BhB"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.McpController = McpController;
|
|
4
|
+
const common_1 = require("@nestjs/common");
|
|
5
|
+
const constants_1 = require("./constants");
|
|
6
|
+
const mcp_transport_constants_1 = require("../transport/mcp-transport.constants");
|
|
7
|
+
const PATTERN_EXTRAS_METADATA = 'microservices:pattern_extras';
|
|
8
|
+
const TRANSPORT_METADATA = 'microservices:transport';
|
|
9
|
+
function retagMcpMethodsTransport(target, transportId) {
|
|
10
|
+
const proto = target.prototype;
|
|
11
|
+
if (!proto)
|
|
12
|
+
return;
|
|
13
|
+
for (const key of Object.getOwnPropertyNames(proto)) {
|
|
14
|
+
if (key === 'constructor')
|
|
15
|
+
continue;
|
|
16
|
+
const fn = proto[key];
|
|
17
|
+
if (typeof fn !== 'function')
|
|
18
|
+
continue;
|
|
19
|
+
const extras = Reflect.getMetadata(PATTERN_EXTRAS_METADATA, fn);
|
|
20
|
+
if (extras && extras.mcpType) {
|
|
21
|
+
Reflect.defineMetadata(TRANSPORT_METADATA, transportId, fn);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function McpController(prefixOrOptions) {
|
|
26
|
+
let server;
|
|
27
|
+
let controllerOptions = prefixOrOptions;
|
|
28
|
+
if (prefixOrOptions &&
|
|
29
|
+
typeof prefixOrOptions === 'object' &&
|
|
30
|
+
!Array.isArray(prefixOrOptions) &&
|
|
31
|
+
'server' in prefixOrOptions) {
|
|
32
|
+
const { server: serverName, ...rest } = prefixOrOptions;
|
|
33
|
+
server = serverName;
|
|
34
|
+
controllerOptions = rest;
|
|
35
|
+
}
|
|
36
|
+
return (target) => {
|
|
37
|
+
(0, common_1.applyDecorators)((0, common_1.Controller)(controllerOptions), (0, common_1.SetMetadata)(constants_1.MCP_CONTROLLER_METADATA_KEY, true), (0, common_1.SetMetadata)(mcp_transport_constants_1.MCP_SERVER_NAME_METADATA_KEY, server))(target);
|
|
38
|
+
if (server) {
|
|
39
|
+
retagMcpMethodsTransport(target, (0, mcp_transport_constants_1.mcpTransportFor)(server));
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=mcp-controller.decorator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-controller.decorator.js","sourceRoot":"","sources":["../../../src/mcp/decorators/mcp-controller.decorator.ts"],"names":[],"mappings":";;AA6FA,sCAgCC;AA7HD,2CAKwB;AACxB,2CAA0D;AAC1D,kFAG8C;AAS9C,MAAM,uBAAuB,GAAG,8BAA8B,CAAC;AAC/D,MAAM,kBAAkB,GAAG,yBAAyB,CAAC;AAyBrD,SAAS,wBAAwB,CAC/B,MAAgB,EAChB,WAAmB;IAEnB,MAAM,KAAK,GAAI,MAAkD,CAAC,SAAS,CAAC;IAC5E,IAAI,CAAC,KAAK;QAAE,OAAO;IACnB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;QACpD,IAAI,GAAG,KAAK,aAAa;YAAE,SAAS;QACpC,MAAM,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QACtB,IAAI,OAAO,EAAE,KAAK,UAAU;YAAE,SAAS;QACvC,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,uBAAuB,EAAE,EAAE,CAEjD,CAAC;QACd,IAAI,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YAC7B,OAAO,CAAC,cAAc,CAAC,kBAAkB,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;AACH,CAAC;AA+BD,SAAgB,aAAa,CAC3B,eAA0D;IAI1D,IAAI,MAA0B,CAAC;IAC/B,IAAI,iBAAiB,GACnB,eAAe,CAAC;IAClB,IACE,eAAe;QACf,OAAO,eAAe,KAAK,QAAQ;QACnC,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC;QAC/B,QAAQ,IAAI,eAAe,EAC3B,CAAC;QACD,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,EAAE,GAAG,eAAe,CAAC;QACxD,MAAM,GAAG,UAAU,CAAC;QACpB,iBAAiB,GAAG,IAAI,CAAC;IAC3B,CAAC;IAED,OAAO,CAAC,MAAgB,EAAE,EAAE;QAC1B,IAAA,wBAAe,EACb,IAAA,mBAAU,EAAC,iBAAsC,CAAC,EAClD,IAAA,oBAAW,EAAC,uCAA2B,EAAE,IAAI,CAAC,EAC9C,IAAA,oBAAW,EAAC,sDAA4B,EAAE,MAAM,CAAC,CAClD,CAAC,MAAM,CAAC,CAAC;QAIV,IAAI,MAAM,EAAE,CAAC;YACX,wBAAwB,CAAC,MAAM,EAAE,IAAA,yCAAe,EAAC,MAAM,CAAC,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import {\n applyDecorators,\n Controller,\n ControllerOptions,\n SetMetadata,\n} from '@nestjs/common';\nimport { MCP_CONTROLLER_METADATA_KEY } from './constants';\nimport {\n MCP_SERVER_NAME_METADATA_KEY,\n mcpTransportFor,\n} from '../transport/mcp-transport.constants';\n\n/**\n * NestJS-internal metadata keys written by `@MessagePattern`. They are NOT\n * re-exported from the `@nestjs/microservices` package entry, so we reference\n * the string literals directly (see `@nestjs/microservices/constants`:\n * `PATTERN_EXTRAS_METADATA` / `TRANSPORT_METADATA`). The multi-server e2e test\n * guards against these drifting on a NestJS bump.\n */\nconst PATTERN_EXTRAS_METADATA = 'microservices:pattern_extras';\nconst TRANSPORT_METADATA = 'microservices:transport';\n\n/** Options for {@link McpController}: standard `@Controller` options plus a server name. */\nexport interface McpControllerOptions extends ControllerOptions {\n /**\n * Logical MCP server name. The controller's MCP methods bind ONLY to a\n * connected `McpStrategy({ server: <name> })`. Omit to use the default shared\n * server (binds to a plain `McpStrategy()`).\n */\n server?: string;\n}\n\n/**\n * Re-tags every MCP capability method on `target`'s prototype with the given\n * transport id, overriding the default {@link MCP_TRANSPORT} that the\n * `@Tool`/`@Resource`/`@Prompt` method decorators wrote.\n *\n * This works because class decorators run AFTER the method decorators, and both\n * `@MessagePattern` and this walk reach the SAME function reference via\n * `prototype[key]` — so re-defining the transport metadata on it wins. We\n * recognize MCP methods by the `mcpType` marker stored in their pattern extras.\n *\n * Note: `Object.getOwnPropertyNames` only sees methods declared on this class,\n * not ones inherited from a base class.\n */\nfunction retagMcpMethodsTransport(\n target: Function,\n transportId: symbol,\n): void {\n const proto = (target as { prototype?: Record<string, unknown> }).prototype;\n if (!proto) return;\n for (const key of Object.getOwnPropertyNames(proto)) {\n if (key === 'constructor') continue;\n const fn = proto[key];\n if (typeof fn !== 'function') continue;\n const extras = Reflect.getMetadata(PATTERN_EXTRAS_METADATA, fn) as\n | { mcpType?: unknown }\n | undefined;\n if (extras && extras.mcpType) {\n Reflect.defineMetadata(TRANSPORT_METADATA, transportId, fn);\n }\n }\n}\n\n/**\n * Marks a class as an MCP capability controller.\n *\n * NestJS only scans classes registered in a module's `controllers` array for\n * microservice (`@MessagePattern`) handlers, so MCP tool/resource/prompt classes\n * MUST be controllers. `@McpController` composes the standard `@Controller()`\n * decorator (so the framework discovers and binds the `@Tool`/`@Resource`/\n * `@Prompt` handlers) and adds a marker the {@link McpStrategy} uses to recognize\n * MCP controllers.\n *\n * Because `@Tool`/`@Resource`/`@Prompt` do not add HTTP route decorators, methods\n * on an `@McpController` are NOT exposed as HTTP routes — they are reachable only\n * through the MCP transport.\n *\n * To run multiple isolated MCP servers in one app, assign a controller to a\n * named server with `@McpController({ server: 'admin' })`; its tools/resources/\n * prompts then bind ONLY to a matching `McpStrategy({ server: 'admin' })`.\n *\n * @example\n * ```typescript\n * @McpController()\n * export class GreetingTool {\n * @Tool({ name: 'hello', description: 'Say hello', parameters: z.object({ name: z.string() }) })\n * sayHello(@Payload() { name }: { name: string }, @Ctx() ctx: McpContext) {\n * return { content: [{ type: 'text', text: `Hello, ${name}!` }] };\n * }\n * }\n * ```\n */\nexport function McpController(\n prefixOrOptions?: string | string[] | McpControllerOptions,\n): ClassDecorator {\n // Extract the MCP-specific `server` name (if any) and forward the remaining\n // standard controller options to `@Controller`.\n let server: string | undefined;\n let controllerOptions: string | string[] | ControllerOptions | undefined =\n prefixOrOptions;\n if (\n prefixOrOptions &&\n typeof prefixOrOptions === 'object' &&\n !Array.isArray(prefixOrOptions) &&\n 'server' in prefixOrOptions\n ) {\n const { server: serverName, ...rest } = prefixOrOptions;\n server = serverName;\n controllerOptions = rest;\n }\n\n return (target: Function) => {\n applyDecorators(\n Controller(controllerOptions as ControllerOptions),\n SetMetadata(MCP_CONTROLLER_METADATA_KEY, true),\n SetMetadata(MCP_SERVER_NAME_METADATA_KEY, server),\n )(target);\n // A named server re-tags this controller's MCP methods with that server's\n // transport id, so NestJS routes them only to the matching strategy. An\n // unnamed controller keeps the default MCP_TRANSPORT (single-server) behavior.\n if (server) {\n retagMcpMethodsTransport(target, mcpTransportFor(server));\n }\n };\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-message-pattern.d.ts","sourceRoot":"","sources":["../../../src/mcp/decorators/mcp-message-pattern.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,iBAAiB,EAClB,MAAM,sCAAsC,CAAC;AAgB9C,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,iBAAiB,EACvB,YAAY,CAAC,EAAE,MAAM,GACpB,eAAe,CAYjB"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mcpMessagePattern = mcpMessagePattern;
|
|
4
|
+
const microservices_1 = require("@nestjs/microservices");
|
|
5
|
+
const mcp_transport_constants_1 = require("../transport/mcp-transport.constants");
|
|
6
|
+
function mcpMessagePattern(type, explicitName) {
|
|
7
|
+
return (target, propertyKey, descriptor) => {
|
|
8
|
+
const methodKey = String(propertyKey);
|
|
9
|
+
const name = explicitName ?? methodKey;
|
|
10
|
+
return (0, microservices_1.MessagePattern)((0, mcp_transport_constants_1.buildMcpPattern)(type, name), mcp_transport_constants_1.MCP_TRANSPORT, (0, mcp_transport_constants_1.buildMcpHandlerExtras)(type, name, methodKey, descriptor.value))(target, propertyKey, descriptor);
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=mcp-message-pattern.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-message-pattern.js","sourceRoot":"","sources":["../../../src/mcp/decorators/mcp-message-pattern.ts"],"names":[],"mappings":";;AAsBA,8CAeC;AArCD,yDAAuD;AACvD,kFAK8C;AAgB9C,SAAgB,iBAAiB,CAC/B,IAAuB,EACvB,YAAqB;IAErB,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,UAA8B,EAAE,EAAE;QAC7D,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,YAAY,IAAI,SAAS,CAAC;QACvC,OAAO,IAAA,8BAAc,EACnB,IAAA,yCAAe,EAAC,IAAI,EAAE,IAAI,CAAC,EAC3B,uCAAa,EAGb,IAAA,+CAAqB,EAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC,KAAK,CAAC,CAC/D,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;IACrC,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import { MessagePattern } from '@nestjs/microservices';\nimport {\n buildMcpHandlerExtras,\n buildMcpPattern,\n MCP_TRANSPORT,\n McpCapabilityType,\n} from '../transport/mcp-transport.constants';\n\n/**\n * Builds the `@MessagePattern` half of an MCP capability decorator.\n *\n * The returned method decorator registers a NestJS RPC handler scoped to the\n * {@link MCP_TRANSPORT} identifier, with:\n * - a structured pattern `{ mcp, name }` so the strategy can deterministically\n * map a discovered capability back to its handler, and\n * - `extras` `{ mcpType, mcpName }` so the strategy can recognize/prune MCP\n * handlers from the shared `messageHandlers` map.\n *\n * When `explicitName` is omitted (e.g. a `@Tool` without `name`), the method\n * name is used — mirroring the name-defaulting in `McpRegistryDiscoveryService`,\n * so the discovered metadata name and the pattern name stay in sync.\n */\nexport function mcpMessagePattern(\n type: McpCapabilityType,\n explicitName?: string,\n): MethodDecorator {\n return (target, propertyKey, descriptor: PropertyDescriptor) => {\n const methodKey = String(propertyKey);\n const name = explicitName ?? methodKey;\n return MessagePattern(\n buildMcpPattern(type, name),\n MCP_TRANSPORT,\n // `descriptor.value` is the decorated method; the strategy reads all MCP\n // metadata (tool options + security decorators) off it at listen() time.\n buildMcpHandlerExtras(type, name, methodKey, descriptor.value),\n )(target, propertyKey, descriptor);\n };\n}\n"]}
|
|
@@ -12,5 +12,5 @@ export interface PromptOptions {
|
|
|
12
12
|
description: string;
|
|
13
13
|
parameters?: ZodObject<PromptArgsRawShape>;
|
|
14
14
|
}
|
|
15
|
-
export declare const Prompt: (options: PromptOptions) =>
|
|
15
|
+
export declare const Prompt: (options: PromptOptions) => <TFunction extends Function, Y>(target: TFunction | object, propertyKey?: string | symbol, descriptor?: TypedPropertyDescriptor<Y>) => void;
|
|
16
16
|
//# sourceMappingURL=prompt.decorator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt.decorator.d.ts","sourceRoot":"","sources":["../../../src/mcp/decorators/prompt.decorator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"prompt.decorator.d.ts","sourceRoot":"","sources":["../../../src/mcp/decorators/prompt.decorator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AAGzC,MAAM,MAAM,kBAAkB,GAAG;IAC/B,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACtB,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,SAAS,CAAC,kBAAkB,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,SAAS,CAAC,kBAAkB,CAAC,CAAC;CAC5C;AAED,eAAO,MAAM,MAAM,GAAI,SAAS,aAAa,gJAK5C,CAAC"}
|
|
@@ -3,8 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.Prompt = void 0;
|
|
4
4
|
const common_1 = require("@nestjs/common");
|
|
5
5
|
const constants_1 = require("./constants");
|
|
6
|
+
const mcp_message_pattern_1 = require("./mcp-message-pattern");
|
|
6
7
|
const Prompt = (options) => {
|
|
7
|
-
return (0, common_1.SetMetadata)(constants_1.MCP_PROMPT_METADATA_KEY, options);
|
|
8
|
+
return (0, common_1.applyDecorators)((0, common_1.SetMetadata)(constants_1.MCP_PROMPT_METADATA_KEY, options), (0, mcp_message_pattern_1.mcpMessagePattern)('prompt', options.name));
|
|
8
9
|
};
|
|
9
10
|
exports.Prompt = Prompt;
|
|
10
11
|
//# sourceMappingURL=prompt.decorator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt.decorator.js","sourceRoot":"","sources":["../../../src/mcp/decorators/prompt.decorator.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"prompt.decorator.js","sourceRoot":"","sources":["../../../src/mcp/decorators/prompt.decorator.ts"],"names":[],"mappings":";;;AAAA,2CAA8D;AAC9D,2CAAsD;AAEtD,+DAA0D;AAkBnD,MAAM,MAAM,GAAG,CAAC,OAAsB,EAAE,EAAE;IAC/C,OAAO,IAAA,wBAAe,EACpB,IAAA,oBAAW,EAAC,mCAAuB,EAAE,OAAO,CAAC,EAC7C,IAAA,uCAAiB,EAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAC1C,CAAC;AACJ,CAAC,CAAC;AALW,QAAA,MAAM,UAKjB","sourcesContent":["import { applyDecorators, SetMetadata } from '@nestjs/common';\nimport { MCP_PROMPT_METADATA_KEY } from './constants';\nimport { ZodObject, ZodType } from 'zod';\nimport { mcpMessagePattern } from './mcp-message-pattern';\n\nexport type PromptArgsRawShape = {\n [k: string]: ZodType;\n};\n\nexport interface PromptMetadata {\n name: string;\n description: string;\n parameters?: ZodObject<PromptArgsRawShape>;\n}\n\nexport interface PromptOptions {\n name?: string;\n description: string;\n parameters?: ZodObject<PromptArgsRawShape>;\n}\n\nexport const Prompt = (options: PromptOptions) => {\n return applyDecorators(\n SetMetadata(MCP_PROMPT_METADATA_KEY, options),\n mcpMessagePattern('prompt', options.name),\n );\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"public.decorator.js","sourceRoot":"","sources":["../../../src/mcp/decorators/public.decorator.ts"],"names":[],"mappings":";;;AAAA,2CAA6C;AAKhC,QAAA,uBAAuB,GAAG,iBAAiB,CAAC;AAuBlD,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,IAAA,oBAAW,EAAC,+BAAuB,EAAE,IAAI,CAAC,CAAC;AAA9D,QAAA,UAAU,cAAoD","sourcesContent":["import { SetMetadata } from '@nestjs/common';\n\n/**\n * Metadata key for marking a tool as publicly accessible\n */\nexport const MCP_PUBLIC_METADATA_KEY = 'mcp:public-tool';\n\n/**\n * Decorator to mark a tool as publicly accessible, bypassing authentication requirements.\n *\n * Use this when you want a tool to be available even to unauthenticated users\n * when `allowUnauthenticatedAccess` is enabled
|
|
1
|
+
{"version":3,"file":"public.decorator.js","sourceRoot":"","sources":["../../../src/mcp/decorators/public.decorator.ts"],"names":[],"mappings":";;;AAAA,2CAA6C;AAKhC,QAAA,uBAAuB,GAAG,iBAAiB,CAAC;AAuBlD,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,IAAA,oBAAW,EAAC,+BAAuB,EAAE,IAAI,CAAC,CAAC;AAA9D,QAAA,UAAU,cAAoD","sourcesContent":["import { SetMetadata } from '@nestjs/common';\n\n/**\n * Metadata key for marking a tool as publicly accessible\n */\nexport const MCP_PUBLIC_METADATA_KEY = 'mcp:public-tool';\n\n/**\n * Decorator to mark a tool as publicly accessible, bypassing authentication requirements.\n *\n * Use this when you want a tool to be available even to unauthenticated users\n * when `allowUnauthenticatedAccess` is enabled on the {@link McpStrategy}.\n *\n * When applied to a tool method, it allows the tool to be listed and called\n * without authentication, even when other tools on the server require it.\n *\n * @example\n * ```typescript\n * @Injectable()\n * export class MyTools {\n * @Tool({ name: 'public-search', description: 'Search publicly' })\n * @PublicTool()\n * async search() {\n * return { content: [{ type: 'text', text: 'Public results' }] };\n * }\n * }\n * ```\n */\nexport const PublicTool = () => SetMetadata(MCP_PUBLIC_METADATA_KEY, true);\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"raw-request.decorator.d.ts","sourceRoot":"","sources":["../../../src/mcp/decorators/raw-request.decorator.ts"],"names":[],"mappings":"AA4BA,eAAO,MAAM,aAAa,mDAGzB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.McpRawRequest = void 0;
|
|
4
|
+
const common_1 = require("@nestjs/common");
|
|
5
|
+
exports.McpRawRequest = (0, common_1.createParamDecorator)((_data, ctx) => ctx.switchToRpc().getContext()?.getRawRequest());
|
|
6
|
+
//# sourceMappingURL=raw-request.decorator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"raw-request.decorator.js","sourceRoot":"","sources":["../../../src/mcp/decorators/raw-request.decorator.ts"],"names":[],"mappings":";;;AAAA,2CAAwE;AA4B3D,QAAA,aAAa,GAAG,IAAA,6BAAoB,EAC/C,CAAC,KAAc,EAAE,GAAqB,EAAE,EAAE,CACxC,GAAG,CAAC,WAAW,EAAE,CAAC,UAAU,EAAc,EAAE,aAAa,EAAE,CAC9D,CAAC","sourcesContent":["import { createParamDecorator, ExecutionContext } from '@nestjs/common';\nimport type { McpContext } from '../transport/mcp-context';\n\n/**\n * Injects the raw transport request into an MCP capability handler — the MCP\n * analog of NestJS's `@Req()`.\n *\n * Returns the underlying HTTP request object (Express `Request` / Fastify\n * `FastifyRequest`) for HTTP-based transports, or `undefined` for STDIO, which\n * is stream-oriented and has no per-call request object. Annotate the parameter\n * with your framework's request type — the decorator itself does not type it,\n * exactly like `@Req()`:\n *\n * @example\n * ```typescript\n * import type { Request } from 'express';\n *\n * @Tool({ name: 'whoami', description: 'Echo the caller' })\n * whoami(@McpRawRequest() req?: Request) {\n * return { content: [{ type: 'text', text: req?.ip ?? 'stdio' }] };\n * }\n * ```\n *\n * This is sugar for `ctx.getRawRequest()` on the `@Ctx()` context; reach for it\n * when the request is all you need from the context. Note that, like every\n * NestJS param decorator, using this means the data parameter must also be\n * annotated (with `@Payload()`).\n */\nexport const McpRawRequest = createParamDecorator(\n (_data: unknown, ctx: ExecutionContext) =>\n ctx.switchToRpc().getContext<McpContext>()?.getRawRequest(),\n);\n"]}
|
|
@@ -12,5 +12,5 @@ export interface ResourceTemplateMetadata {
|
|
|
12
12
|
mimeType?: string;
|
|
13
13
|
_meta?: Record<string, any>;
|
|
14
14
|
}
|
|
15
|
-
export declare const ResourceTemplate: (options: ResourceTemplateOptions) =>
|
|
15
|
+
export declare const ResourceTemplate: (options: ResourceTemplateOptions) => <TFunction extends Function, Y>(target: TFunction | object, propertyKey?: string | symbol, descriptor?: TypedPropertyDescriptor<Y>) => void;
|
|
16
16
|
//# sourceMappingURL=resource-template.decorator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-template.decorator.d.ts","sourceRoot":"","sources":["../../../src/mcp/decorators/resource-template.decorator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"resource-template.decorator.d.ts","sourceRoot":"","sources":["../../../src/mcp/decorators/resource-template.decorator.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,uBAAuB,GAEjC;IACE,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC7B,CAAC;AAEJ,MAAM,WAAW,wBAAwB;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC7B;AASD,eAAO,MAAM,gBAAgB,GAAI,SAAS,uBAAuB,gJAKhE,CAAC"}
|
|
@@ -3,8 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.ResourceTemplate = void 0;
|
|
4
4
|
const common_1 = require("@nestjs/common");
|
|
5
5
|
const constants_1 = require("./constants");
|
|
6
|
+
const mcp_message_pattern_1 = require("./mcp-message-pattern");
|
|
6
7
|
const ResourceTemplate = (options) => {
|
|
7
|
-
return (0, common_1.SetMetadata)(constants_1.MCP_RESOURCE_TEMPLATE_METADATA_KEY, options);
|
|
8
|
+
return (0, common_1.applyDecorators)((0, common_1.SetMetadata)(constants_1.MCP_RESOURCE_TEMPLATE_METADATA_KEY, options), (0, mcp_message_pattern_1.mcpMessagePattern)('resource-template', options.uriTemplate));
|
|
8
9
|
};
|
|
9
10
|
exports.ResourceTemplate = ResourceTemplate;
|
|
10
11
|
//# sourceMappingURL=resource-template.decorator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-template.decorator.js","sourceRoot":"","sources":["../../../src/mcp/decorators/resource-template.decorator.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"resource-template.decorator.js","sourceRoot":"","sources":["../../../src/mcp/decorators/resource-template.decorator.ts"],"names":[],"mappings":";;;AAAA,2CAA8D;AAC9D,2CAAiE;AACjE,+DAA0D;AA2BnD,MAAM,gBAAgB,GAAG,CAAC,OAAgC,EAAE,EAAE;IACnE,OAAO,IAAA,wBAAe,EACpB,IAAA,oBAAW,EAAC,8CAAkC,EAAE,OAAO,CAAC,EACxD,IAAA,uCAAiB,EAAC,mBAAmB,EAAE,OAAO,CAAC,WAAW,CAAC,CAC5D,CAAC;AACJ,CAAC,CAAC;AALW,QAAA,gBAAgB,oBAK3B","sourcesContent":["import { applyDecorators, SetMetadata } from '@nestjs/common';\nimport { MCP_RESOURCE_TEMPLATE_METADATA_KEY } from './constants';\nimport { mcpMessagePattern } from './mcp-message-pattern';\n\nexport type ResourceTemplateOptions =\n // https://modelcontextprotocol.io/docs/concepts/resources#resource-templates\n {\n uriTemplate: string; // URI template following RFC 6570\n name?: string; // Human-readable name\n description?: string; // Optional description\n mimeType?: string; // Optional MIME type\n _meta?: Record<string, any>;\n };\n\nexport interface ResourceTemplateMetadata {\n uriTemplate: string; // URI template following RFC 6570\n name: string; // Human-readable name\n description?: string; // Optional description\n mimeType?: string; // Optional MIME type\n _meta?: Record<string, any>;\n}\n\n/**\n * Decorator that marks a controller method as an MCP resource.\n * @param {Object} options - The options for the decorator\n * @param {string} options.name - The name of the resource\n * @param {string} options.uriTemplate - The URI template of the resource\n * @returns {MethodDecorator} - The decorator\n */\nexport const ResourceTemplate = (options: ResourceTemplateOptions) => {\n return applyDecorators(\n SetMetadata(MCP_RESOURCE_TEMPLATE_METADATA_KEY, options),\n mcpMessagePattern('resource-template', options.uriTemplate),\n );\n};\n"]}
|
|
@@ -12,5 +12,5 @@ export interface ResourceMetadata {
|
|
|
12
12
|
mimeType?: string;
|
|
13
13
|
_meta?: Record<string, any>;
|
|
14
14
|
}
|
|
15
|
-
export declare const Resource: (options: ResourceOptions) =>
|
|
15
|
+
export declare const Resource: (options: ResourceOptions) => <TFunction extends Function, Y>(target: TFunction | object, propertyKey?: string | symbol, descriptor?: TypedPropertyDescriptor<Y>) => void;
|
|
16
16
|
//# sourceMappingURL=resource.decorator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource.decorator.d.ts","sourceRoot":"","sources":["../../../src/mcp/decorators/resource.decorator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"resource.decorator.d.ts","sourceRoot":"","sources":["../../../src/mcp/decorators/resource.decorator.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,eAAe,GAEzB;IACE,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC7B,CAAC;AAEJ,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC7B;AASD,eAAO,MAAM,QAAQ,GAAI,SAAS,eAAe,gJAKhD,CAAC"}
|
|
@@ -3,8 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.Resource = void 0;
|
|
4
4
|
const common_1 = require("@nestjs/common");
|
|
5
5
|
const constants_1 = require("./constants");
|
|
6
|
+
const mcp_message_pattern_1 = require("./mcp-message-pattern");
|
|
6
7
|
const Resource = (options) => {
|
|
7
|
-
return (0, common_1.SetMetadata)(constants_1.MCP_RESOURCE_METADATA_KEY, options);
|
|
8
|
+
return (0, common_1.applyDecorators)((0, common_1.SetMetadata)(constants_1.MCP_RESOURCE_METADATA_KEY, options), (0, mcp_message_pattern_1.mcpMessagePattern)('resource', options.uri));
|
|
8
9
|
};
|
|
9
10
|
exports.Resource = Resource;
|
|
10
11
|
//# sourceMappingURL=resource.decorator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource.decorator.js","sourceRoot":"","sources":["../../../src/mcp/decorators/resource.decorator.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"resource.decorator.js","sourceRoot":"","sources":["../../../src/mcp/decorators/resource.decorator.ts"],"names":[],"mappings":";;;AAAA,2CAA8D;AAC9D,2CAAwD;AACxD,+DAA0D;AA2BnD,MAAM,QAAQ,GAAG,CAAC,OAAwB,EAAE,EAAE;IACnD,OAAO,IAAA,wBAAe,EACpB,IAAA,oBAAW,EAAC,qCAAyB,EAAE,OAAO,CAAC,EAC/C,IAAA,uCAAiB,EAAC,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,CAC3C,CAAC;AACJ,CAAC,CAAC;AALW,QAAA,QAAQ,YAKnB","sourcesContent":["import { applyDecorators, SetMetadata } from '@nestjs/common';\nimport { MCP_RESOURCE_METADATA_KEY } from './constants';\nimport { mcpMessagePattern } from './mcp-message-pattern';\n\nexport type ResourceOptions =\n // https://modelcontextprotocol.io/docs/concepts/resources#direct-resources\n {\n uri: string; // Unique identifier for the resource\n name?: string; // Human-readable name\n description?: string; // Optional description\n mimeType?: string; // Optional MIME type\n _meta?: Record<string, any>;\n };\n\nexport interface ResourceMetadata {\n uri: string; // Unique identifier for the resource\n name: string; // Human-readable name\n description?: string; // Optional description\n mimeType?: string; // Optional MIME type\n _meta?: Record<string, any>;\n}\n\n/**\n * Decorator that marks a controller method as an MCP resource.\n * @param {Object} options - The options for the decorator\n * @param {string} options.name - The name of the resource\n * @param {string} options.uri - The URI of the resource\n * @returns {MethodDecorator} - The decorator\n */\nexport const Resource = (options: ResourceOptions) => {\n return applyDecorators(\n SetMetadata(MCP_RESOURCE_METADATA_KEY, options),\n mcpMessagePattern('resource', options.uri),\n );\n};\n"]}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { CanActivate, Type } from '@nestjs/common';
|
|
2
1
|
import { z } from 'zod';
|
|
3
2
|
import { ToolAnnotations as SdkToolAnnotations } from '@modelcontextprotocol/sdk/types.js';
|
|
4
3
|
export type SecurityScheme = {
|
|
@@ -18,7 +17,6 @@ export interface ToolMetadata {
|
|
|
18
17
|
isPublic?: boolean;
|
|
19
18
|
requiredScopes?: string[];
|
|
20
19
|
requiredRoles?: string[];
|
|
21
|
-
guards?: Type<CanActivate>[];
|
|
22
20
|
}
|
|
23
21
|
export interface ToolAnnotations extends SdkToolAnnotations {
|
|
24
22
|
}
|
|
@@ -30,5 +28,5 @@ export interface ToolOptions {
|
|
|
30
28
|
annotations?: ToolAnnotations;
|
|
31
29
|
_meta?: Record<string, any>;
|
|
32
30
|
}
|
|
33
|
-
export declare const Tool: (options: ToolOptions) =>
|
|
31
|
+
export declare const Tool: (options: ToolOptions) => <TFunction extends Function, Y>(target: TFunction | object, propertyKey?: string | symbol, descriptor?: TypedPropertyDescriptor<Y>) => void;
|
|
34
32
|
//# sourceMappingURL=tool.decorator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool.decorator.d.ts","sourceRoot":"","sources":["../../../src/mcp/decorators/tool.decorator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tool.decorator.d.ts","sourceRoot":"","sources":["../../../src/mcp/decorators/tool.decorator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,IAAI,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAO3F,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAE1C,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAE5B,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAGD,MAAM,WAAW,eAAgB,SAAQ,kBAAkB;CAAG;AAE9D,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC7B;AAWD,eAAO,MAAM,IAAI,GAAI,SAAS,WAAW,gJASxC,CAAC"}
|
|
@@ -4,11 +4,12 @@ exports.Tool = void 0;
|
|
|
4
4
|
const common_1 = require("@nestjs/common");
|
|
5
5
|
const zod_1 = require("zod");
|
|
6
6
|
const constants_1 = require("./constants");
|
|
7
|
+
const mcp_message_pattern_1 = require("./mcp-message-pattern");
|
|
7
8
|
const Tool = (options) => {
|
|
8
9
|
if (options.parameters === undefined) {
|
|
9
10
|
options.parameters = zod_1.z.object({});
|
|
10
11
|
}
|
|
11
|
-
return (0, common_1.SetMetadata)(constants_1.MCP_TOOL_METADATA_KEY, options);
|
|
12
|
+
return (0, common_1.applyDecorators)((0, common_1.SetMetadata)(constants_1.MCP_TOOL_METADATA_KEY, options), (0, mcp_message_pattern_1.mcpMessagePattern)('tool', options.name));
|
|
12
13
|
};
|
|
13
14
|
exports.Tool = Tool;
|
|
14
15
|
//# sourceMappingURL=tool.decorator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool.decorator.js","sourceRoot":"","sources":["../../../src/mcp/decorators/tool.decorator.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"tool.decorator.js","sourceRoot":"","sources":["../../../src/mcp/decorators/tool.decorator.ts"],"names":[],"mappings":";;;AAAA,2CAA8D;AAC9D,6BAAwB;AAExB,2CAAoD;AACpD,+DAA0D;AA4CnD,MAAM,IAAI,GAAG,CAAC,OAAoB,EAAE,EAAE;IAC3C,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACrC,OAAO,CAAC,UAAU,GAAG,OAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,OAAO,IAAA,wBAAe,EACpB,IAAA,oBAAW,EAAC,iCAAqB,EAAE,OAAO,CAAC,EAC3C,IAAA,uCAAiB,EAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CACxC,CAAC;AACJ,CAAC,CAAC;AATW,QAAA,IAAI,QASf","sourcesContent":["import { applyDecorators, SetMetadata } from '@nestjs/common';\nimport { z } from 'zod';\nimport { ToolAnnotations as SdkToolAnnotations } from '@modelcontextprotocol/sdk/types.js';\nimport { MCP_TOOL_METADATA_KEY } from './constants';\nimport { mcpMessagePattern } from './mcp-message-pattern';\n\n/**\n * Security scheme type for MCP tools\n */\nexport type SecurityScheme =\n | { type: 'noauth' }\n | { type: 'oauth2'; scopes?: string[] };\n\nexport interface ToolMetadata {\n name: string;\n description: string;\n parameters?: z.ZodType;\n outputSchema?: z.ZodType;\n annotations?: SdkToolAnnotations;\n _meta?: Record<string, any>;\n // Security-related metadata\n securitySchemes?: SecurityScheme[];\n isPublic?: boolean;\n requiredScopes?: string[];\n requiredRoles?: string[];\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface ToolAnnotations extends SdkToolAnnotations {}\n\nexport interface ToolOptions {\n name?: string;\n description?: string;\n parameters?: z.ZodType;\n outputSchema?: z.ZodType;\n annotations?: ToolAnnotations;\n _meta?: Record<string, any>;\n}\n\n/**\n * Decorator that marks a controller method as an MCP tool.\n * @param {Object} options - The options for the decorator\n * @param {string} options.name - The name of the tool\n * @param {string} options.description - The description of the tool\n * @param {z.ZodType} [options.parameters] - The parameters of the tool\n * @param {z.ZodType} [options.outputSchema] - The output schema of the tool\n * @returns {MethodDecorator} - The decorator\n */\nexport const Tool = (options: ToolOptions) => {\n if (options.parameters === undefined) {\n options.parameters = z.object({});\n }\n\n return applyDecorators(\n SetMetadata(MCP_TOOL_METADATA_KEY, options),\n mcpMessagePattern('tool', options.name),\n );\n};\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { ArgumentsHost, RpcExceptionFilter } from '@nestjs/common';
|
|
2
|
+
import { Observable } from 'rxjs';
|
|
3
|
+
export declare class McpExceptionFilter implements RpcExceptionFilter {
|
|
4
|
+
catch(exception: unknown, _host: ArgumentsHost): Observable<never>;
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=mcp-exception.filter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-exception.filter.d.ts","sourceRoot":"","sources":["../../../src/mcp/filters/mcp-exception.filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAS,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAE1E,OAAO,EAAE,UAAU,EAAc,MAAM,MAAM,CAAC;AAiC9C,qBACa,kBAAmB,YAAW,kBAAkB;IAC3D,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC;CASnE"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.McpExceptionFilter = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const microservices_1 = require("@nestjs/microservices");
|
|
12
|
+
const rxjs_1 = require("rxjs");
|
|
13
|
+
let McpExceptionFilter = class McpExceptionFilter {
|
|
14
|
+
catch(exception, _host) {
|
|
15
|
+
if (exception instanceof microservices_1.RpcException) {
|
|
16
|
+
return (0, rxjs_1.throwError)(() => exception.getError());
|
|
17
|
+
}
|
|
18
|
+
const message = exception instanceof Error ? exception.message : 'Internal server error';
|
|
19
|
+
return (0, rxjs_1.throwError)(() => ({ status: 'error', message }));
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
exports.McpExceptionFilter = McpExceptionFilter;
|
|
23
|
+
exports.McpExceptionFilter = McpExceptionFilter = __decorate([
|
|
24
|
+
(0, common_1.Catch)()
|
|
25
|
+
], McpExceptionFilter);
|
|
26
|
+
//# sourceMappingURL=mcp-exception.filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-exception.filter.js","sourceRoot":"","sources":["../../../src/mcp/filters/mcp-exception.filter.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA0E;AAC1E,yDAAqD;AACrD,+BAA8C;AAkCvC,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;IAC7B,KAAK,CAAC,SAAkB,EAAE,KAAoB;QAE5C,IAAI,SAAS,YAAY,4BAAY,EAAE,CAAC;YACtC,OAAO,IAAA,iBAAU,EAAC,GAAG,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;QAChD,CAAC;QACD,MAAM,OAAO,GACX,SAAS,YAAY,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC;QAC3E,OAAO,IAAA,iBAAU,EAAC,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IAC1D,CAAC;CACF,CAAA;AAVY,gDAAkB;6BAAlB,kBAAkB;IAD9B,IAAA,cAAK,GAAE;GACK,kBAAkB,CAU9B","sourcesContent":["import { ArgumentsHost, Catch, RpcExceptionFilter } from '@nestjs/common';\nimport { RpcException } from '@nestjs/microservices';\nimport { Observable, throwError } from 'rxjs';\n\n/**\n * Surfaces the real error message of any exception thrown by an MCP\n * tool/resource/prompt handler, instead of NestJS's default \"Internal server\n * error\" masking.\n *\n * By default NestJS's RPC pipeline masks any non-`RpcException` to a generic\n * \"Internal server error\" before the strategy can read it, so a plain\n * `throw new Error('Order #42 not found')` reaches the agent as an opaque\n * failure. That is a safe default (it avoids leaking internals), but it is poor\n * DX when the message is meant for the caller. Register this filter to opt into\n * passing the original message through:\n *\n * ```typescript\n * // Globally (recommended) — applies to every MCP handler, but never overrides\n * // a more specific `@UseFilters()` you put on a controller/method.\n * providers: [{ provide: APP_FILTER, useClass: McpExceptionFilter }]\n * ```\n *\n * ```typescript\n * // Or per controller/method:\n * @UseFilters(McpExceptionFilter)\n * @McpController()\n * class MyTools { ... }\n * ```\n *\n * The surfaced message becomes an `isError: true` tool result (or a JSON-RPC\n * error for resources/prompts), so the agent can tell a real failure from a\n * successful call. For input problems, prefer the built-in Zod validation\n * (a clear \"Invalid parameters: …\" result) or `throw new RpcException(...)` /\n * a NestJS exception — those are already surfaced without this filter.\n */\n@Catch()\nexport class McpExceptionFilter implements RpcExceptionFilter {\n catch(exception: unknown, _host: ArgumentsHost): Observable<never> {\n // RpcException already carries an explicit, client-facing payload.\n if (exception instanceof RpcException) {\n return throwError(() => exception.getError());\n }\n const message =\n exception instanceof Error ? exception.message : 'Internal server error';\n return throwError(() => ({ status: 'error', message }));\n }\n}\n"]}
|