@rekog/mcp-nest 1.9.10 → 2.0.0-alpha.1
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 +4 -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 +32 -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
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
import { Inject, Injectable, Logger } from '@nestjs/common';
|
|
2
|
-
import { ApplicationConfig, ContextIdFactory, ModuleRef } from '@nestjs/core';
|
|
3
|
-
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
4
|
-
import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';
|
|
5
|
-
import type { McpOptions } from '../interfaces';
|
|
6
|
-
import { McpExecutorService } from './mcp-executor.service';
|
|
7
|
-
import { McpRegistryDiscoveryService } from './mcp-registry-discovery.service';
|
|
8
|
-
import { SsePingService } from './sse-ping.service';
|
|
9
|
-
import { normalizeEndpoint } from '../utils/normalize-endpoint';
|
|
10
|
-
import { HttpAdapterFactory } from '../adapters';
|
|
11
|
-
import { createMcpLogger } from '../utils/mcp-logger.factory';
|
|
12
|
-
import { createMcpServer } from '../utils/mcp-server.factory';
|
|
13
|
-
|
|
14
|
-
@Injectable()
|
|
15
|
-
export class McpSseService {
|
|
16
|
-
private readonly logger: Logger;
|
|
17
|
-
|
|
18
|
-
// Note: Currently, storing transports and servers makes it a requirement to have sticky sessions.
|
|
19
|
-
|
|
20
|
-
// Map to store active transports by session ID
|
|
21
|
-
private readonly transports = new Map<string, SSEServerTransport>();
|
|
22
|
-
// Map to store MCP server instances by session ID
|
|
23
|
-
private readonly mcpServers = new Map<string, McpServer>();
|
|
24
|
-
|
|
25
|
-
constructor(
|
|
26
|
-
@Inject('MCP_OPTIONS') private readonly options: McpOptions,
|
|
27
|
-
@Inject('MCP_MODULE_ID') private readonly mcpModuleId: string,
|
|
28
|
-
private readonly applicationConfig: ApplicationConfig,
|
|
29
|
-
private readonly moduleRef: ModuleRef,
|
|
30
|
-
private readonly toolRegistry: McpRegistryDiscoveryService,
|
|
31
|
-
@Inject(SsePingService) private readonly pingService: SsePingService,
|
|
32
|
-
) {
|
|
33
|
-
this.logger = createMcpLogger(McpSseService.name, this.options);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Initialize the SSE service and configure ping service
|
|
38
|
-
*/
|
|
39
|
-
initialize() {
|
|
40
|
-
// Configure ping service with options
|
|
41
|
-
this.pingService.configure({
|
|
42
|
-
pingEnabled: this.options.sse?.pingEnabled, // Enable by default
|
|
43
|
-
pingIntervalMs: this.options.sse?.pingIntervalMs,
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Create and manage SSE connection
|
|
49
|
-
*/
|
|
50
|
-
async createSseConnection(
|
|
51
|
-
rawReq: any,
|
|
52
|
-
rawRes: any,
|
|
53
|
-
messagesEndpoint: string,
|
|
54
|
-
apiPrefix: string,
|
|
55
|
-
): Promise<void> {
|
|
56
|
-
const adapter = HttpAdapterFactory.getAdapter(rawReq, rawRes);
|
|
57
|
-
const res = adapter.adaptResponse(rawRes);
|
|
58
|
-
|
|
59
|
-
// Create a new SSE transport instance
|
|
60
|
-
const transport = new SSEServerTransport(
|
|
61
|
-
normalizeEndpoint(
|
|
62
|
-
`${apiPrefix}/${this.applicationConfig.getGlobalPrefix()}/${messagesEndpoint}`,
|
|
63
|
-
),
|
|
64
|
-
res.raw,
|
|
65
|
-
);
|
|
66
|
-
const sessionId = transport.sessionId;
|
|
67
|
-
|
|
68
|
-
const mcpServer = createMcpServer(
|
|
69
|
-
this.mcpModuleId,
|
|
70
|
-
this.toolRegistry,
|
|
71
|
-
this.options,
|
|
72
|
-
this.logger,
|
|
73
|
-
);
|
|
74
|
-
|
|
75
|
-
// Store the transport and server for this session
|
|
76
|
-
this.transports.set(sessionId, transport);
|
|
77
|
-
this.mcpServers.set(sessionId, mcpServer);
|
|
78
|
-
|
|
79
|
-
// Register the connection with the ping service
|
|
80
|
-
this.pingService.registerConnection(sessionId, transport, res);
|
|
81
|
-
|
|
82
|
-
transport.onclose = () => {
|
|
83
|
-
// Clean up when the connection closes
|
|
84
|
-
this.transports.delete(sessionId);
|
|
85
|
-
this.mcpServers.delete(sessionId);
|
|
86
|
-
this.pingService.removeConnection(sessionId);
|
|
87
|
-
};
|
|
88
|
-
|
|
89
|
-
await mcpServer.connect(transport);
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
/**
|
|
93
|
-
* Handle message processing for SSE
|
|
94
|
-
*/
|
|
95
|
-
async handleMessage(rawReq: any, rawRes: any, body: unknown): Promise<any> {
|
|
96
|
-
const adapter = HttpAdapterFactory.getAdapter(rawReq, rawRes);
|
|
97
|
-
const req = adapter.adaptRequest(rawReq);
|
|
98
|
-
const res = adapter.adaptResponse(rawRes);
|
|
99
|
-
const sessionId = req.query.sessionId as string;
|
|
100
|
-
const transport = this.transports.get(sessionId);
|
|
101
|
-
|
|
102
|
-
if (!transport) {
|
|
103
|
-
return res.status(404).send('Session not found');
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
const mcpServer = this.mcpServers.get(sessionId);
|
|
107
|
-
if (!mcpServer) {
|
|
108
|
-
return res.status(404).send('MCP server not found for session');
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// Resolve the request-scoped tool executor service
|
|
112
|
-
const contextId = ContextIdFactory.getByRequest(req);
|
|
113
|
-
const executor = await this.moduleRef.resolve(
|
|
114
|
-
McpExecutorService,
|
|
115
|
-
contextId,
|
|
116
|
-
);
|
|
117
|
-
|
|
118
|
-
// Register request handlers with the user context from this specific request
|
|
119
|
-
executor.registerRequestHandlers(mcpServer, req);
|
|
120
|
-
|
|
121
|
-
// Process the message
|
|
122
|
-
await transport.handlePostMessage(req.raw, res.raw, body);
|
|
123
|
-
}
|
|
124
|
-
}
|
|
@@ -1,472 +0,0 @@
|
|
|
1
|
-
import { Inject, Injectable, Logger, OnModuleDestroy } from '@nestjs/common';
|
|
2
|
-
import { ContextIdFactory, ModuleRef } from '@nestjs/core';
|
|
3
|
-
import { randomUUID } from 'crypto';
|
|
4
|
-
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
5
|
-
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
6
|
-
import { HttpAdapterFactory } from '../adapters/http-adapter.factory';
|
|
7
|
-
import {
|
|
8
|
-
HttpRequest,
|
|
9
|
-
HttpResponse,
|
|
10
|
-
} from '../interfaces/http-adapter.interface';
|
|
11
|
-
import type { McpOptions } from '../interfaces';
|
|
12
|
-
import { McpExecutorService } from './mcp-executor.service';
|
|
13
|
-
import { McpRegistryDiscoveryService } from './mcp-registry-discovery.service';
|
|
14
|
-
import { createMcpLogger } from '../utils/mcp-logger.factory';
|
|
15
|
-
import { createMcpServer } from '../utils/mcp-server.factory';
|
|
16
|
-
|
|
17
|
-
@Injectable()
|
|
18
|
-
export class McpStreamableHttpService implements OnModuleDestroy {
|
|
19
|
-
private readonly logger: Logger;
|
|
20
|
-
private readonly transports: {
|
|
21
|
-
[sessionId: string]: StreamableHTTPServerTransport;
|
|
22
|
-
} = {};
|
|
23
|
-
private readonly mcpServers: { [sessionId: string]: McpServer } = {};
|
|
24
|
-
private readonly executors: { [sessionId: string]: McpExecutorService } = {};
|
|
25
|
-
private readonly isStatelessMode: boolean;
|
|
26
|
-
|
|
27
|
-
constructor(
|
|
28
|
-
@Inject('MCP_OPTIONS') private readonly options: McpOptions,
|
|
29
|
-
@Inject('MCP_MODULE_ID') private readonly mcpModuleId: string,
|
|
30
|
-
private readonly moduleRef: ModuleRef,
|
|
31
|
-
private readonly toolRegistry: McpRegistryDiscoveryService,
|
|
32
|
-
) {
|
|
33
|
-
// Determine if we're in stateless mode
|
|
34
|
-
this.isStatelessMode = !!options.streamableHttp?.statelessMode;
|
|
35
|
-
this.logger = createMcpLogger(McpStreamableHttpService.name, this.options);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Create a new MCP server instance for stateless requests
|
|
40
|
-
*/
|
|
41
|
-
async createStatelessServer(rawReq: any): Promise<{
|
|
42
|
-
server: McpServer;
|
|
43
|
-
transport: StreamableHTTPServerTransport;
|
|
44
|
-
}> {
|
|
45
|
-
// Create a new transport for this request (stateless = no session management)
|
|
46
|
-
const transport = new StreamableHTTPServerTransport({
|
|
47
|
-
sessionIdGenerator: undefined,
|
|
48
|
-
enableJsonResponse:
|
|
49
|
-
this.options.streamableHttp?.enableJsonResponse || false,
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
const server = createMcpServer(
|
|
53
|
-
this.mcpModuleId,
|
|
54
|
-
this.toolRegistry,
|
|
55
|
-
this.options,
|
|
56
|
-
this.logger,
|
|
57
|
-
);
|
|
58
|
-
|
|
59
|
-
// Connect the transport to the MCP server first
|
|
60
|
-
await server.connect(transport);
|
|
61
|
-
|
|
62
|
-
// Now resolve the request-scoped tool executor service
|
|
63
|
-
const contextId = ContextIdFactory.getByRequest(rawReq);
|
|
64
|
-
const executor = await this.moduleRef.resolve(
|
|
65
|
-
McpExecutorService,
|
|
66
|
-
contextId,
|
|
67
|
-
{ strict: true },
|
|
68
|
-
);
|
|
69
|
-
|
|
70
|
-
// Register request handlers after connection
|
|
71
|
-
this.logger.debug(
|
|
72
|
-
'[Stateless] Registering request handlers for stateless MCP server',
|
|
73
|
-
);
|
|
74
|
-
executor.registerRequestHandlers(server, rawReq);
|
|
75
|
-
|
|
76
|
-
return { server, transport };
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Handle POST requests
|
|
81
|
-
*/
|
|
82
|
-
async handlePostRequest(req: any, res: any, body: unknown): Promise<void> {
|
|
83
|
-
// Get the appropriate HTTP adapter for the request/response
|
|
84
|
-
const adapter = HttpAdapterFactory.getAdapter(req, res);
|
|
85
|
-
const adaptedReq = adapter.adaptRequest(req);
|
|
86
|
-
const adaptedRes = adapter.adaptResponse(res);
|
|
87
|
-
const sessionId = adaptedReq.headers['mcp-session-id'] as
|
|
88
|
-
| string
|
|
89
|
-
| undefined;
|
|
90
|
-
|
|
91
|
-
this.logger.debug(
|
|
92
|
-
`[${sessionId || 'No-Session'}] Received MCP request: ${JSON.stringify(body)}`,
|
|
93
|
-
);
|
|
94
|
-
|
|
95
|
-
try {
|
|
96
|
-
if (this.isStatelessMode) {
|
|
97
|
-
return this.handleStatelessRequest(adaptedReq, adaptedRes, body);
|
|
98
|
-
} else {
|
|
99
|
-
return this.handleStatefulRequest(adaptedReq, adaptedRes, body);
|
|
100
|
-
}
|
|
101
|
-
} catch (error) {
|
|
102
|
-
this.logger.error(
|
|
103
|
-
`[${sessionId || 'No-Session'}] Error handling MCP request: ${error}`,
|
|
104
|
-
);
|
|
105
|
-
if (!adaptedRes.headersSent) {
|
|
106
|
-
adaptedRes.status(500).json({
|
|
107
|
-
jsonrpc: '2.0',
|
|
108
|
-
error: {
|
|
109
|
-
code: -32603,
|
|
110
|
-
message: 'Internal server error',
|
|
111
|
-
},
|
|
112
|
-
id: null,
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* Handle requests in stateless mode
|
|
120
|
-
*/
|
|
121
|
-
async handleStatelessRequest(
|
|
122
|
-
req: any,
|
|
123
|
-
res: HttpResponse,
|
|
124
|
-
body: unknown,
|
|
125
|
-
): Promise<void> {
|
|
126
|
-
this.logger.debug(
|
|
127
|
-
`[Stateless] Handling stateless MCP request at ${req.url}`,
|
|
128
|
-
);
|
|
129
|
-
|
|
130
|
-
let server: McpServer | null = null;
|
|
131
|
-
let transport: StreamableHTTPServerTransport | null = null;
|
|
132
|
-
|
|
133
|
-
try {
|
|
134
|
-
// Create a new server and transport for each request
|
|
135
|
-
const stateless = await this.createStatelessServer(req);
|
|
136
|
-
server = stateless.server;
|
|
137
|
-
transport = stateless.transport;
|
|
138
|
-
|
|
139
|
-
// Handle the request
|
|
140
|
-
await transport.handleRequest(req.raw, res.raw, body);
|
|
141
|
-
|
|
142
|
-
// Clean up after response is sent
|
|
143
|
-
res.raw.on('finish', async () => {
|
|
144
|
-
this.logger.debug('[Stateless] Response sent, cleaning up');
|
|
145
|
-
try {
|
|
146
|
-
if (transport) await transport.close();
|
|
147
|
-
if (server) await server.close();
|
|
148
|
-
} catch (error) {
|
|
149
|
-
this.logger.error('[Stateless] Error cleaning up:', error);
|
|
150
|
-
}
|
|
151
|
-
});
|
|
152
|
-
} catch (error) {
|
|
153
|
-
this.logger.error(
|
|
154
|
-
`[Stateless] Error in stateless request handling: ${error}`,
|
|
155
|
-
);
|
|
156
|
-
// Clean up on error
|
|
157
|
-
try {
|
|
158
|
-
if (transport) await transport.close();
|
|
159
|
-
if (server) await server.close();
|
|
160
|
-
} catch (error) {
|
|
161
|
-
this.logger.error('[Stateless] Error cleaning up on error:', error);
|
|
162
|
-
}
|
|
163
|
-
throw error;
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
/**
|
|
168
|
-
* Handle requests in stateful mode
|
|
169
|
-
*/
|
|
170
|
-
async handleStatefulRequest(
|
|
171
|
-
req: HttpRequest,
|
|
172
|
-
res: HttpResponse,
|
|
173
|
-
body: unknown,
|
|
174
|
-
): Promise<void> {
|
|
175
|
-
const sessionId = req.headers['mcp-session-id'] as string | undefined;
|
|
176
|
-
|
|
177
|
-
this.logger.debug(`[${sessionId || 'New'}] Handling stateful MCP request`);
|
|
178
|
-
|
|
179
|
-
// Case 1: New initialization request
|
|
180
|
-
if (!sessionId && this.isInitializeRequest(body)) {
|
|
181
|
-
// Validate it's not a batch with multiple requests
|
|
182
|
-
if (Array.isArray(body) && body.length > 1) {
|
|
183
|
-
res.status(400).json({
|
|
184
|
-
jsonrpc: '2.0',
|
|
185
|
-
error: {
|
|
186
|
-
code: -32600,
|
|
187
|
-
message:
|
|
188
|
-
'Invalid Request: Only one initialization request is allowed',
|
|
189
|
-
},
|
|
190
|
-
id: null,
|
|
191
|
-
});
|
|
192
|
-
return;
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
const mcpServer = createMcpServer(
|
|
196
|
-
this.mcpModuleId,
|
|
197
|
-
this.toolRegistry,
|
|
198
|
-
this.options,
|
|
199
|
-
this.logger,
|
|
200
|
-
);
|
|
201
|
-
|
|
202
|
-
// Create transport with session management
|
|
203
|
-
const transport = new StreamableHTTPServerTransport({
|
|
204
|
-
sessionIdGenerator:
|
|
205
|
-
this.options.streamableHttp?.sessionIdGenerator ||
|
|
206
|
-
(() => randomUUID()),
|
|
207
|
-
enableJsonResponse:
|
|
208
|
-
this.options.streamableHttp?.enableJsonResponse || false,
|
|
209
|
-
onsessioninitialized: async (sid: string) => {
|
|
210
|
-
this.logger.debug(`[${sid}] Session initialized, storing references`);
|
|
211
|
-
// Store all session data
|
|
212
|
-
this.transports[sid] = transport;
|
|
213
|
-
this.mcpServers[sid] = mcpServer;
|
|
214
|
-
|
|
215
|
-
// Resolve and store the executor for this session
|
|
216
|
-
const contextId = ContextIdFactory.getByRequest(req);
|
|
217
|
-
const executor = await this.moduleRef.resolve(
|
|
218
|
-
McpExecutorService,
|
|
219
|
-
contextId,
|
|
220
|
-
{ strict: true },
|
|
221
|
-
);
|
|
222
|
-
this.executors[sid] = executor;
|
|
223
|
-
|
|
224
|
-
// Register request handlers ONCE during initialization
|
|
225
|
-
executor.registerRequestHandlers(mcpServer, req);
|
|
226
|
-
},
|
|
227
|
-
onsessionclosed: async (sid: string) => {
|
|
228
|
-
this.logger.debug(`[${sid}] Session closed via DELETE`);
|
|
229
|
-
await this.cleanupSession(sid);
|
|
230
|
-
},
|
|
231
|
-
});
|
|
232
|
-
|
|
233
|
-
// Connect transport to server
|
|
234
|
-
await mcpServer.connect(transport);
|
|
235
|
-
|
|
236
|
-
// Handle the initialization request
|
|
237
|
-
await transport.handleRequest(req.raw, res.raw, body);
|
|
238
|
-
|
|
239
|
-
this.logger.log(`[${transport.sessionId}] New session initialized`);
|
|
240
|
-
return;
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
// Case 2: Request with session ID
|
|
244
|
-
if (sessionId) {
|
|
245
|
-
// Check if session exists
|
|
246
|
-
if (!this.transports[sessionId]) {
|
|
247
|
-
this.logger.debug(`[${sessionId}] Session not found`);
|
|
248
|
-
res.status(404).json({
|
|
249
|
-
jsonrpc: '2.0',
|
|
250
|
-
error: {
|
|
251
|
-
code: -32001,
|
|
252
|
-
message: 'Session not found',
|
|
253
|
-
},
|
|
254
|
-
id: null,
|
|
255
|
-
});
|
|
256
|
-
return;
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
// Reject re-initialization attempts
|
|
260
|
-
if (this.isInitializeRequest(body)) {
|
|
261
|
-
res.status(400).json({
|
|
262
|
-
jsonrpc: '2.0',
|
|
263
|
-
error: {
|
|
264
|
-
code: -32600,
|
|
265
|
-
message: 'Invalid Request: Server already initialized',
|
|
266
|
-
},
|
|
267
|
-
id: null,
|
|
268
|
-
});
|
|
269
|
-
return;
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
// Use existing transport
|
|
273
|
-
const transport = this.transports[sessionId];
|
|
274
|
-
|
|
275
|
-
this.logger.debug(
|
|
276
|
-
`[${sessionId}] Handling request with existing session`,
|
|
277
|
-
);
|
|
278
|
-
|
|
279
|
-
// Handle the request with existing transport and handlers
|
|
280
|
-
await transport.handleRequest(req.raw, res.raw, body);
|
|
281
|
-
return;
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
// Case 3: No session ID and not initialization
|
|
285
|
-
res.status(400).json({
|
|
286
|
-
jsonrpc: '2.0',
|
|
287
|
-
error: {
|
|
288
|
-
code: -32000,
|
|
289
|
-
message: 'Bad Request: Mcp-Session-Id header is required',
|
|
290
|
-
},
|
|
291
|
-
id: null,
|
|
292
|
-
});
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
/**
|
|
296
|
-
* Handle GET requests for SSE streams
|
|
297
|
-
*/
|
|
298
|
-
async handleGetRequest(req: any, res: any): Promise<void> {
|
|
299
|
-
const adapter = HttpAdapterFactory.getAdapter(req, res);
|
|
300
|
-
const adaptedReq = adapter.adaptRequest(req);
|
|
301
|
-
const adaptedRes = adapter.adaptResponse(res);
|
|
302
|
-
|
|
303
|
-
if (this.isStatelessMode) {
|
|
304
|
-
adaptedRes.status(405).json({
|
|
305
|
-
jsonrpc: '2.0',
|
|
306
|
-
error: {
|
|
307
|
-
code: -32000,
|
|
308
|
-
message: 'Method not allowed in stateless mode',
|
|
309
|
-
},
|
|
310
|
-
id: null,
|
|
311
|
-
});
|
|
312
|
-
return;
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
const sessionId = adaptedReq.headers['mcp-session-id'] as
|
|
316
|
-
| string
|
|
317
|
-
| undefined;
|
|
318
|
-
|
|
319
|
-
if (!sessionId) {
|
|
320
|
-
adaptedRes.status(400).json({
|
|
321
|
-
jsonrpc: '2.0',
|
|
322
|
-
error: {
|
|
323
|
-
code: -32000,
|
|
324
|
-
message: 'Bad Request: Mcp-Session-Id header is required',
|
|
325
|
-
},
|
|
326
|
-
id: null,
|
|
327
|
-
});
|
|
328
|
-
return;
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
if (!this.transports[sessionId]) {
|
|
332
|
-
this.logger.debug(`[${sessionId}] GET request - session not found`);
|
|
333
|
-
adaptedRes.status(404).json({
|
|
334
|
-
jsonrpc: '2.0',
|
|
335
|
-
error: {
|
|
336
|
-
code: -32001,
|
|
337
|
-
message: 'Session not found',
|
|
338
|
-
},
|
|
339
|
-
id: null,
|
|
340
|
-
});
|
|
341
|
-
return;
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
this.logger.debug(`[${sessionId}] Establishing SSE stream`);
|
|
345
|
-
const transport = this.transports[sessionId];
|
|
346
|
-
await transport.handleRequest(adaptedReq.raw, adaptedRes.raw);
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
/**
|
|
350
|
-
* Handle DELETE requests for terminating sessions
|
|
351
|
-
*/
|
|
352
|
-
async handleDeleteRequest(req: any, res: any): Promise<void> {
|
|
353
|
-
const adapter = HttpAdapterFactory.getAdapter(req, res);
|
|
354
|
-
const adaptedReq = adapter.adaptRequest(req);
|
|
355
|
-
const adaptedRes = adapter.adaptResponse(res);
|
|
356
|
-
|
|
357
|
-
if (this.isStatelessMode) {
|
|
358
|
-
adaptedRes.status(405).json({
|
|
359
|
-
jsonrpc: '2.0',
|
|
360
|
-
error: {
|
|
361
|
-
code: -32000,
|
|
362
|
-
message: 'Method not allowed in stateless mode',
|
|
363
|
-
},
|
|
364
|
-
id: null,
|
|
365
|
-
});
|
|
366
|
-
return;
|
|
367
|
-
}
|
|
368
|
-
|
|
369
|
-
const sessionId = adaptedReq.headers['mcp-session-id'] as
|
|
370
|
-
| string
|
|
371
|
-
| undefined;
|
|
372
|
-
|
|
373
|
-
if (!sessionId) {
|
|
374
|
-
adaptedRes.status(400).json({
|
|
375
|
-
jsonrpc: '2.0',
|
|
376
|
-
error: {
|
|
377
|
-
code: -32000,
|
|
378
|
-
message: 'Bad Request: Mcp-Session-Id header is required',
|
|
379
|
-
},
|
|
380
|
-
id: null,
|
|
381
|
-
});
|
|
382
|
-
return;
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
if (!this.transports[sessionId]) {
|
|
386
|
-
this.logger.debug(`[${sessionId}] DELETE request - session not found`);
|
|
387
|
-
adaptedRes.status(404).json({
|
|
388
|
-
jsonrpc: '2.0',
|
|
389
|
-
error: {
|
|
390
|
-
code: -32001,
|
|
391
|
-
message: 'Session not found',
|
|
392
|
-
},
|
|
393
|
-
id: null,
|
|
394
|
-
});
|
|
395
|
-
return;
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
this.logger.debug(`[${sessionId}] Processing DELETE request`);
|
|
399
|
-
const transport = this.transports[sessionId];
|
|
400
|
-
|
|
401
|
-
// Let transport handle the DELETE request
|
|
402
|
-
// The onsessionclosed callback will handle cleanup
|
|
403
|
-
await transport.handleRequest(adaptedReq.raw, adaptedRes.raw);
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
/**
|
|
407
|
-
* Helper function to detect initialize requests
|
|
408
|
-
*/
|
|
409
|
-
private isInitializeRequest(body: unknown): boolean {
|
|
410
|
-
if (Array.isArray(body)) {
|
|
411
|
-
return body.some(
|
|
412
|
-
(msg) =>
|
|
413
|
-
typeof msg === 'object' &&
|
|
414
|
-
msg !== null &&
|
|
415
|
-
'method' in msg &&
|
|
416
|
-
msg.method === 'initialize',
|
|
417
|
-
);
|
|
418
|
-
}
|
|
419
|
-
return (
|
|
420
|
-
typeof body === 'object' &&
|
|
421
|
-
body !== null &&
|
|
422
|
-
'method' in body &&
|
|
423
|
-
(body as any).method === 'initialize'
|
|
424
|
-
);
|
|
425
|
-
}
|
|
426
|
-
|
|
427
|
-
/**
|
|
428
|
-
* Clean up session resources
|
|
429
|
-
*/
|
|
430
|
-
private async cleanupSession(sessionId: string): Promise<void> {
|
|
431
|
-
if (!sessionId || !this.transports[sessionId]) {
|
|
432
|
-
return;
|
|
433
|
-
}
|
|
434
|
-
|
|
435
|
-
this.logger.debug(`[${sessionId}] Cleaning up session`);
|
|
436
|
-
|
|
437
|
-
try {
|
|
438
|
-
// Close transport if still open
|
|
439
|
-
const transport = this.transports[sessionId];
|
|
440
|
-
if (transport) {
|
|
441
|
-
await transport.close();
|
|
442
|
-
}
|
|
443
|
-
|
|
444
|
-
// Close MCP server
|
|
445
|
-
const server = this.mcpServers[sessionId];
|
|
446
|
-
if (server) {
|
|
447
|
-
await server.close();
|
|
448
|
-
}
|
|
449
|
-
|
|
450
|
-
// Clean up all references
|
|
451
|
-
delete this.transports[sessionId];
|
|
452
|
-
delete this.mcpServers[sessionId];
|
|
453
|
-
delete this.executors[sessionId];
|
|
454
|
-
} catch (error) {
|
|
455
|
-
this.logger.error(`[${sessionId}] Error during cleanup:`, error);
|
|
456
|
-
}
|
|
457
|
-
}
|
|
458
|
-
|
|
459
|
-
/**
|
|
460
|
-
* Clean up all sessions on module destroy
|
|
461
|
-
*/
|
|
462
|
-
async onModuleDestroy(): Promise<void> {
|
|
463
|
-
this.logger.log('Cleaning up all MCP sessions...');
|
|
464
|
-
const sessionIds = Object.keys(this.transports);
|
|
465
|
-
|
|
466
|
-
await Promise.all(
|
|
467
|
-
sessionIds.map((sessionId) => this.cleanupSession(sessionId)),
|
|
468
|
-
);
|
|
469
|
-
|
|
470
|
-
this.logger.log(`Cleaned up ${sessionIds.length} MCP sessions`);
|
|
471
|
-
}
|
|
472
|
-
}
|