@frontmcp/sdk 0.4.1 → 0.5.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 +30 -18
- package/package.json +20 -5
- package/src/app/app.registry.d.ts +3 -2
- package/src/app/app.registry.js +3 -1
- package/src/app/app.registry.js.map +1 -1
- package/src/app/instances/app.local.instance.js +2 -2
- package/src/app/instances/app.local.instance.js.map +1 -1
- package/src/auth/auth.registry.d.ts +34 -2
- package/src/auth/auth.registry.js +162 -24
- package/src/auth/auth.registry.js.map +1 -1
- package/src/auth/auth.utils.js +8 -9
- package/src/auth/auth.utils.js.map +1 -1
- package/src/auth/authorization/authorization.class.d.ts +125 -0
- package/src/auth/authorization/authorization.class.js +224 -0
- package/src/auth/authorization/authorization.class.js.map +1 -0
- package/src/auth/authorization/authorization.types.d.ts +300 -0
- package/src/auth/authorization/authorization.types.js +79 -0
- package/src/auth/authorization/authorization.types.js.map +1 -0
- package/src/auth/authorization/index.d.ts +5 -0
- package/src/auth/authorization/index.js +19 -0
- package/src/auth/authorization/index.js.map +1 -0
- package/src/auth/authorization/orchestrated.authorization.d.ts +242 -0
- package/src/auth/authorization/orchestrated.authorization.js +306 -0
- package/src/auth/authorization/orchestrated.authorization.js.map +1 -0
- package/src/auth/authorization/public.authorization.d.ts +91 -0
- package/src/auth/authorization/public.authorization.js +132 -0
- package/src/auth/authorization/public.authorization.js.map +1 -0
- package/src/auth/authorization/transparent.authorization.d.ts +130 -0
- package/src/auth/authorization/transparent.authorization.js +147 -0
- package/src/auth/authorization/transparent.authorization.js.map +1 -0
- package/src/auth/consent/consent.types.d.ts +111 -0
- package/src/auth/consent/consent.types.js +119 -0
- package/src/auth/consent/consent.types.js.map +1 -0
- package/src/auth/consent/index.d.ts +1 -0
- package/src/auth/consent/index.js +13 -0
- package/src/auth/consent/index.js.map +1 -0
- package/src/auth/detection/auth-provider-detection.d.ts +84 -0
- package/src/auth/detection/auth-provider-detection.js +230 -0
- package/src/auth/detection/auth-provider-detection.js.map +1 -0
- package/src/auth/detection/index.d.ts +1 -0
- package/src/auth/detection/index.js +15 -0
- package/src/auth/detection/index.js.map +1 -0
- package/src/auth/flows/auth.verify.flow.d.ts +110 -0
- package/src/auth/flows/auth.verify.flow.js +379 -0
- package/src/auth/flows/auth.verify.flow.js.map +1 -0
- package/src/auth/flows/oauth.authorize.flow.d.ts +118 -164
- package/src/auth/flows/oauth.authorize.flow.js +701 -33
- package/src/auth/flows/oauth.authorize.flow.js.map +1 -1
- package/src/auth/flows/oauth.callback.flow.d.ts +117 -0
- package/src/auth/flows/oauth.callback.flow.js +357 -0
- package/src/auth/flows/oauth.callback.flow.js.map +1 -0
- package/src/auth/flows/oauth.register.flow.d.ts +32 -125
- package/src/auth/flows/oauth.token.flow.d.ts +52 -154
- package/src/auth/flows/oauth.token.flow.js +193 -55
- package/src/auth/flows/oauth.token.flow.js.map +1 -1
- package/src/auth/flows/session.verify.flow.d.ts +66 -321
- package/src/auth/flows/session.verify.flow.js +107 -18
- package/src/auth/flows/session.verify.flow.js.map +1 -1
- package/src/auth/flows/well-known.jwks.flow.d.ts +34 -205
- package/src/auth/flows/well-known.jwks.flow.js +15 -8
- package/src/auth/flows/well-known.jwks.flow.js.map +1 -1
- package/src/auth/flows/well-known.oauth-authorization-server.flow.d.ts +48 -223
- package/src/auth/flows/well-known.oauth-authorization-server.flow.js +2 -3
- package/src/auth/flows/well-known.oauth-authorization-server.flow.js.map +1 -1
- package/src/auth/flows/well-known.prm.flow.d.ts +19 -120
- package/src/auth/flows/well-known.prm.flow.js +3 -4
- package/src/auth/flows/well-known.prm.flow.js.map +1 -1
- package/src/auth/instances/instance.local-primary-auth.d.ts +91 -4
- package/src/auth/instances/instance.local-primary-auth.js +236 -6
- package/src/auth/instances/instance.local-primary-auth.js.map +1 -1
- package/src/auth/instances/instance.remote-primary-auth.d.ts +4 -3
- package/src/auth/instances/instance.remote-primary-auth.js +2 -2
- package/src/auth/instances/instance.remote-primary-auth.js.map +1 -1
- package/src/auth/session/authorization-vault.d.ts +611 -0
- package/src/auth/session/authorization-vault.js +817 -0
- package/src/auth/session/authorization-vault.js.map +1 -0
- package/src/auth/session/authorization.store.d.ts +301 -0
- package/src/auth/session/authorization.store.js +323 -0
- package/src/auth/session/authorization.store.js.map +1 -0
- package/src/auth/session/encrypted-authorization-vault.d.ts +181 -0
- package/src/auth/session/encrypted-authorization-vault.js +493 -0
- package/src/auth/session/encrypted-authorization-vault.js.map +1 -0
- package/src/auth/session/index.d.ts +4 -4
- package/src/auth/session/index.js +11 -7
- package/src/auth/session/index.js.map +1 -1
- package/src/auth/session/session.schema.d.ts +1 -1
- package/src/auth/session/session.service.d.ts +1 -1
- package/src/auth/session/transport-session.manager.d.ts +101 -0
- package/src/auth/session/transport-session.manager.js +300 -0
- package/src/auth/session/transport-session.manager.js.map +1 -0
- package/src/auth/session/transport-session.types.d.ts +457 -0
- package/src/auth/session/transport-session.types.js +110 -0
- package/src/auth/session/transport-session.types.js.map +1 -0
- package/src/auth/session/utils/session-id.utils.d.ts +14 -2
- package/src/auth/session/utils/session-id.utils.js +68 -19
- package/src/auth/session/utils/session-id.utils.js.map +1 -1
- package/src/auth/session/vault-encryption.d.ts +189 -0
- package/src/auth/session/vault-encryption.js +263 -0
- package/src/auth/session/vault-encryption.js.map +1 -0
- package/src/auth/ui/base-layout.d.ts +188 -0
- package/src/auth/ui/base-layout.js +292 -0
- package/src/auth/ui/base-layout.js.map +1 -0
- package/src/auth/ui/htmx-templates.d.ts +135 -0
- package/src/auth/ui/htmx-templates.js +433 -0
- package/src/auth/ui/htmx-templates.js.map +1 -0
- package/src/auth/ui/index.d.ts +11 -0
- package/src/auth/ui/index.js +35 -0
- package/src/auth/ui/index.js.map +1 -0
- package/src/auth/utils/audience.validator.d.ts +129 -0
- package/src/auth/utils/audience.validator.js +196 -0
- package/src/auth/utils/audience.validator.js.map +1 -0
- package/src/auth/utils/index.d.ts +2 -0
- package/src/auth/utils/index.js +7 -0
- package/src/auth/utils/index.js.map +1 -0
- package/src/auth/utils/www-authenticate.utils.d.ts +97 -0
- package/src/auth/utils/www-authenticate.utils.js +183 -0
- package/src/auth/utils/www-authenticate.utils.js.map +1 -0
- package/src/common/common.schema.d.ts +2 -16
- package/src/common/constants.d.ts +3 -0
- package/src/common/constants.js +6 -1
- package/src/common/constants.js.map +1 -1
- package/src/common/decorators/decorator-utils.d.ts +131 -0
- package/src/common/decorators/decorator-utils.js +195 -0
- package/src/common/decorators/decorator-utils.js.map +1 -0
- package/src/common/decorators/front-mcp.decorator.js +3 -2
- package/src/common/decorators/front-mcp.decorator.js.map +1 -1
- package/src/common/decorators/hook.decorator.d.ts +58 -2
- package/src/common/decorators/hook.decorator.js +127 -17
- package/src/common/decorators/hook.decorator.js.map +1 -1
- package/src/common/decorators/plugin.decorator.d.ts +1 -1
- package/src/common/decorators/plugin.decorator.js +11 -10
- package/src/common/decorators/plugin.decorator.js.map +1 -1
- package/src/common/decorators/resource.decorator.d.ts +32 -3
- package/src/common/decorators/resource.decorator.js +46 -4
- package/src/common/decorators/resource.decorator.js.map +1 -1
- package/src/common/decorators/tool.decorator.d.ts +54 -5
- package/src/common/decorators/tool.decorator.js.map +1 -1
- package/src/common/dynamic/dynamic.plugin.d.ts +22 -11
- package/src/common/dynamic/dynamic.plugin.js +7 -1
- package/src/common/dynamic/dynamic.plugin.js.map +1 -1
- package/src/common/entries/prompt.entry.d.ts +46 -2
- package/src/common/entries/prompt.entry.js +10 -0
- package/src/common/entries/prompt.entry.js.map +1 -1
- package/src/common/entries/resource.entry.d.ts +69 -6
- package/src/common/entries/resource.entry.js +27 -3
- package/src/common/entries/resource.entry.js.map +1 -1
- package/src/common/entries/scope.entry.d.ts +5 -1
- package/src/common/entries/scope.entry.js +3 -3
- package/src/common/entries/scope.entry.js.map +1 -1
- package/src/common/flow/flow.utils.d.ts +56 -0
- package/src/common/flow/flow.utils.js +96 -0
- package/src/common/flow/flow.utils.js.map +1 -0
- package/src/common/index.d.ts +2 -2
- package/src/common/index.js +2 -2
- package/src/common/index.js.map +1 -1
- package/src/common/interfaces/execution-context.interface.d.ts +59 -0
- package/src/common/interfaces/execution-context.interface.js +81 -0
- package/src/common/interfaces/execution-context.interface.js.map +1 -0
- package/src/common/interfaces/flow.interface.d.ts +1 -1
- package/src/common/interfaces/flow.interface.js.map +1 -1
- package/src/common/interfaces/index.d.ts +1 -0
- package/src/common/interfaces/index.js +1 -0
- package/src/common/interfaces/index.js.map +1 -1
- package/src/common/interfaces/internal/primary-auth-provider.interface.d.ts +17 -2
- package/src/common/interfaces/internal/primary-auth-provider.interface.js +52 -4
- package/src/common/interfaces/internal/primary-auth-provider.interface.js.map +1 -1
- package/src/common/interfaces/internal/registry.interface.d.ts +16 -2
- package/src/common/interfaces/internal/registry.interface.js.map +1 -1
- package/src/common/interfaces/plugin.interface.js.map +1 -1
- package/src/common/interfaces/prompt.interface.d.ts +53 -4
- package/src/common/interfaces/prompt.interface.js +78 -0
- package/src/common/interfaces/prompt.interface.js.map +1 -1
- package/src/common/interfaces/resource.interface.d.ts +47 -17
- package/src/common/interfaces/resource.interface.js +53 -0
- package/src/common/interfaces/resource.interface.js.map +1 -1
- package/src/common/interfaces/tool.interface.d.ts +39 -22
- package/src/common/interfaces/tool.interface.js +61 -34
- package/src/common/interfaces/tool.interface.js.map +1 -1
- package/src/common/metadata/adapter.metadata.d.ts +1 -9
- package/src/common/metadata/app.metadata.d.ts +425 -730
- package/src/common/metadata/auth-provider.metadata.d.ts +2 -12
- package/src/common/metadata/flow.metadata.d.ts +10 -25
- package/src/common/metadata/front-mcp.metadata.d.ts +602 -1023
- package/src/common/metadata/front-mcp.metadata.js +6 -4
- package/src/common/metadata/front-mcp.metadata.js.map +1 -1
- package/src/common/metadata/hook.metadata.d.ts +1 -1
- package/src/common/metadata/hook.metadata.js.map +1 -1
- package/src/common/metadata/index.d.ts +1 -0
- package/src/common/metadata/index.js +1 -0
- package/src/common/metadata/index.js.map +1 -1
- package/src/common/metadata/logger.metadata.d.ts +1 -9
- package/src/common/metadata/plugin.metadata.d.ts +8 -30
- package/src/common/metadata/prompt.metadata.d.ts +4 -161
- package/src/common/metadata/provider.metadata.d.ts +2 -12
- package/src/common/metadata/resource.metadata.d.ts +6 -98
- package/src/common/metadata/resource.metadata.js +15 -6
- package/src/common/metadata/resource.metadata.js.map +1 -1
- package/src/common/metadata/tool-ui.metadata.d.ts +10 -0
- package/src/common/metadata/tool-ui.metadata.js +12 -0
- package/src/common/metadata/tool-ui.metadata.js.map +1 -0
- package/src/common/metadata/tool.metadata.d.ts +78 -199
- package/src/common/metadata/tool.metadata.js +11 -14
- package/src/common/metadata/tool.metadata.js.map +1 -1
- package/src/common/providers/base-config.provider.d.ts +84 -0
- package/src/common/providers/base-config.provider.js +128 -0
- package/src/common/providers/base-config.provider.js.map +1 -0
- package/src/common/records/plugin.record.d.ts +5 -6
- package/src/common/records/plugin.record.js.map +1 -1
- package/src/common/records/prompt.record.js.map +1 -1
- package/src/common/records/resource.record.d.ts +17 -1
- package/src/common/records/resource.record.js +12 -6
- package/src/common/records/resource.record.js.map +1 -1
- package/src/common/records/tool.record.js.map +1 -1
- package/src/common/schemas/annotated-class.schema.d.ts +9 -9
- package/src/common/schemas/annotated-class.schema.js +92 -27
- package/src/common/schemas/annotated-class.schema.js.map +1 -1
- package/src/common/schemas/http-input.schema.d.ts +6 -30
- package/src/common/schemas/http-output.schema.d.ts +326 -1630
- package/src/common/schemas/http-output.schema.js +39 -1
- package/src/common/schemas/http-output.schema.js.map +1 -1
- package/src/common/tokens/front-mcp.tokens.js +4 -1
- package/src/common/tokens/front-mcp.tokens.js.map +1 -1
- package/src/common/tokens/resource.tokens.d.ts +2 -0
- package/src/common/tokens/resource.tokens.js +4 -1
- package/src/common/tokens/resource.tokens.js.map +1 -1
- package/src/common/tokens/tool.tokens.d.ts +2 -0
- package/src/common/tokens/tool.tokens.js +2 -0
- package/src/common/tokens/tool.tokens.js.map +1 -1
- package/src/common/types/auth/jwt.types.d.ts +5 -31
- package/src/common/types/auth/session.types.d.ts +97 -192
- package/src/common/types/auth/session.types.js +24 -11
- package/src/common/types/auth/session.types.js.map +1 -1
- package/src/common/types/options/auth.options.d.ts +1013 -490
- package/src/common/types/options/auth.options.js +554 -36
- package/src/common/types/options/auth.options.js.map +1 -1
- package/src/common/types/options/http.options.d.ts +1 -9
- package/src/common/types/options/logging.options.d.ts +7 -13
- package/src/common/types/options/logging.options.js +4 -0
- package/src/common/types/options/logging.options.js.map +1 -1
- package/src/common/types/options/server-info.options.d.ts +3 -31
- package/src/common/types/options/session.options.d.ts +90 -10
- package/src/common/types/options/session.options.js +26 -3
- package/src/common/types/options/session.options.js.map +1 -1
- package/src/common/utils/decide-request-intent.utils.d.ts +8 -46
- package/src/common/utils/decide-request-intent.utils.js +88 -23
- package/src/common/utils/decide-request-intent.utils.js.map +1 -1
- package/src/completion/flows/complete.flow.d.ts +74 -0
- package/src/completion/flows/complete.flow.js +199 -0
- package/src/completion/flows/complete.flow.js.map +1 -0
- package/src/errors/authorization-required.error.d.ts +189 -0
- package/src/errors/authorization-required.error.js +274 -0
- package/src/errors/authorization-required.error.js.map +1 -0
- package/src/errors/index.d.ts +2 -1
- package/src/errors/index.js +17 -1
- package/src/errors/index.js.map +1 -1
- package/src/errors/mcp.error.d.ts +101 -1
- package/src/errors/mcp.error.js +147 -2
- package/src/errors/mcp.error.js.map +1 -1
- package/src/flows/flow.instance.js +4 -3
- package/src/flows/flow.instance.js.map +1 -1
- package/src/flows/flow.registry.js.map +1 -1
- package/src/flows/flow.stages.js +14 -11
- package/src/flows/flow.stages.js.map +1 -1
- package/src/front-mcp/front-mcp.providers.d.ts +464 -102
- package/src/front-mcp/front-mcp.providers.js +3 -5
- package/src/front-mcp/front-mcp.providers.js.map +1 -1
- package/src/hooks/hook.instance.d.ts +1 -1
- package/src/hooks/hook.instance.js +5 -2
- package/src/hooks/hook.instance.js.map +1 -1
- package/src/hooks/hook.registry.js +7 -5
- package/src/hooks/hook.registry.js.map +1 -1
- package/src/index.d.ts +28 -9
- package/src/index.js +5 -1
- package/src/index.js.map +1 -1
- package/src/logger/instances/instance.logger.js +3 -2
- package/src/logger/instances/instance.logger.js.map +1 -1
- package/src/logger/logger.registry.js +7 -2
- package/src/logger/logger.registry.js.map +1 -1
- package/src/logging/flows/set-level.flow.d.ts +62 -0
- package/src/logging/flows/set-level.flow.js +108 -0
- package/src/logging/flows/set-level.flow.js.map +1 -0
- package/src/mcp-apps/csp.d.ts +111 -0
- package/src/mcp-apps/csp.js +267 -0
- package/src/mcp-apps/csp.js.map +1 -0
- package/src/mcp-apps/index.d.ts +23 -0
- package/src/mcp-apps/index.js +91 -0
- package/src/mcp-apps/index.js.map +1 -0
- package/src/mcp-apps/schemas.d.ts +403 -0
- package/src/mcp-apps/schemas.js +345 -0
- package/src/mcp-apps/schemas.js.map +1 -0
- package/src/mcp-apps/template.d.ts +94 -0
- package/src/mcp-apps/template.js +419 -0
- package/src/mcp-apps/template.js.map +1 -0
- package/src/mcp-apps/types.d.ts +323 -0
- package/src/mcp-apps/types.js +59 -0
- package/src/mcp-apps/types.js.map +1 -0
- package/src/notification/index.d.ts +1 -0
- package/src/notification/index.js +13 -0
- package/src/notification/index.js.map +1 -0
- package/src/notification/notification.service.d.ts +378 -0
- package/src/notification/notification.service.js +727 -0
- package/src/notification/notification.service.js.map +1 -0
- package/src/plugin/plugin.registry.js +12 -9
- package/src/plugin/plugin.registry.js.map +1 -1
- package/src/prompt/flows/get-prompt.flow.d.ts +153 -0
- package/src/prompt/flows/get-prompt.flow.js +214 -0
- package/src/prompt/flows/get-prompt.flow.js.map +1 -0
- package/src/prompt/flows/prompts-list.flow.d.ts +67 -0
- package/src/prompt/flows/prompts-list.flow.js +176 -0
- package/src/prompt/flows/prompts-list.flow.js.map +1 -0
- package/src/prompt/index.d.ts +7 -0
- package/src/prompt/index.js +17 -0
- package/src/prompt/index.js.map +1 -0
- package/src/prompt/prompt.events.d.ts +17 -0
- package/src/prompt/prompt.events.js +25 -0
- package/src/prompt/prompt.events.js.map +1 -0
- package/src/prompt/prompt.instance.d.ts +30 -0
- package/src/prompt/prompt.instance.js +120 -0
- package/src/prompt/prompt.instance.js.map +1 -0
- package/src/prompt/prompt.registry.d.ts +79 -12
- package/src/prompt/prompt.registry.js +360 -15
- package/src/prompt/prompt.registry.js.map +1 -1
- package/src/prompt/prompt.types.d.ts +26 -0
- package/src/prompt/prompt.types.js +11 -0
- package/src/prompt/prompt.types.js.map +1 -0
- package/src/prompt/prompt.utils.d.ts +26 -0
- package/src/prompt/prompt.utils.js +136 -0
- package/src/prompt/prompt.utils.js.map +1 -0
- package/src/provider/provider.registry.d.ts +12 -5
- package/src/provider/provider.registry.js +30 -138
- package/src/provider/provider.registry.js.map +1 -1
- package/src/regsitry/registry.base.d.ts +1 -1
- package/src/regsitry/registry.base.js.map +1 -1
- package/src/resource/flows/read-resource.flow.d.ts +91 -0
- package/src/resource/flows/read-resource.flow.js +270 -0
- package/src/resource/flows/read-resource.flow.js.map +1 -0
- package/src/resource/flows/resource-templates-list.flow.d.ts +64 -0
- package/src/resource/flows/resource-templates-list.flow.js +191 -0
- package/src/resource/flows/resource-templates-list.flow.js.map +1 -0
- package/src/resource/flows/resources-list.flow.d.ts +64 -0
- package/src/resource/flows/resources-list.flow.js +196 -0
- package/src/resource/flows/resources-list.flow.js.map +1 -0
- package/src/resource/flows/subscribe-resource.flow.d.ts +45 -0
- package/src/resource/flows/subscribe-resource.flow.js +123 -0
- package/src/resource/flows/subscribe-resource.flow.js.map +1 -0
- package/src/resource/flows/unsubscribe-resource.flow.d.ts +44 -0
- package/src/resource/flows/unsubscribe-resource.flow.js +107 -0
- package/src/resource/flows/unsubscribe-resource.flow.js.map +1 -0
- package/src/resource/index.d.ts +8 -0
- package/src/resource/index.js +20 -0
- package/src/resource/index.js.map +1 -0
- package/src/resource/resource.events.d.ts +24 -0
- package/src/resource/resource.events.js +17 -0
- package/src/resource/resource.events.js.map +1 -0
- package/src/resource/resource.instance.d.ts +35 -0
- package/src/resource/resource.instance.js +163 -0
- package/src/resource/resource.instance.js.map +1 -0
- package/src/resource/resource.registry.d.ts +106 -12
- package/src/resource/resource.registry.js +449 -13
- package/src/resource/resource.registry.js.map +1 -1
- package/src/resource/resource.types.d.ts +35 -0
- package/src/resource/resource.types.js +11 -0
- package/src/resource/resource.types.js.map +1 -0
- package/src/resource/resource.utils.d.ts +30 -0
- package/src/resource/resource.utils.js +151 -0
- package/src/resource/resource.utils.js.map +1 -0
- package/src/scope/flows/http.request.flow.d.ts +48 -330
- package/src/scope/flows/http.request.flow.js +306 -78
- package/src/scope/flows/http.request.flow.js.map +1 -1
- package/src/scope/scope.instance.d.ts +12 -0
- package/src/scope/scope.instance.js +145 -15
- package/src/scope/scope.instance.js.map +1 -1
- package/src/tool/flows/call-tool.flow.d.ts +64 -1110
- package/src/tool/flows/call-tool.flow.js +303 -15
- package/src/tool/flows/call-tool.flow.js.map +1 -1
- package/src/tool/flows/tools-list.flow.d.ts +32 -473
- package/src/tool/flows/tools-list.flow.js +121 -40
- package/src/tool/flows/tools-list.flow.js.map +1 -1
- package/src/tool/tool.events.d.ts +8 -1
- package/src/tool/tool.events.js.map +1 -1
- package/src/tool/tool.instance.d.ts +3 -1
- package/src/tool/tool.instance.js +17 -3
- package/src/tool/tool.instance.js.map +1 -1
- package/src/tool/tool.registry.d.ts +7 -1
- package/src/tool/tool.registry.js +26 -10
- package/src/tool/tool.registry.js.map +1 -1
- package/src/tool/tool.types.d.ts +4 -4
- package/src/tool/tool.types.js.map +1 -1
- package/src/tool/tool.utils.d.ts +3 -12
- package/src/tool/tool.utils.js +39 -193
- package/src/tool/tool.utils.js.map +1 -1
- package/src/tool/ui/index.d.ts +22 -0
- package/src/tool/ui/index.js +63 -0
- package/src/tool/ui/index.js.map +1 -0
- package/src/tool/ui/platform-adapters.d.ts +10 -0
- package/src/tool/ui/platform-adapters.js +18 -0
- package/src/tool/ui/platform-adapters.js.map +1 -0
- package/src/tool/ui/template-helpers.d.ts +46 -0
- package/src/tool/ui/template-helpers.js +112 -0
- package/src/tool/ui/template-helpers.js.map +1 -0
- package/src/tool/ui/ui-resource-template.d.ts +34 -0
- package/src/tool/ui/ui-resource-template.js +64 -0
- package/src/tool/ui/ui-resource-template.js.map +1 -0
- package/src/tool/ui/ui-resource.handler.d.ts +74 -0
- package/src/tool/ui/ui-resource.handler.js +129 -0
- package/src/tool/ui/ui-resource.handler.js.map +1 -0
- package/src/transport/adapters/transport.local.adapter.d.ts +2 -2
- package/src/transport/adapters/transport.local.adapter.js +28 -7
- package/src/transport/adapters/transport.local.adapter.js.map +1 -1
- package/src/transport/adapters/transport.sse.adapter.d.ts +2 -2
- package/src/transport/adapters/transport.sse.adapter.js +4 -3
- package/src/transport/adapters/transport.sse.adapter.js.map +1 -1
- package/src/transport/adapters/transport.streamable-http.adapter.d.ts +10 -3
- package/src/transport/adapters/transport.streamable-http.adapter.js +54 -8
- package/src/transport/adapters/transport.streamable-http.adapter.js.map +1 -1
- package/src/transport/flows/handle.sse.flow.d.ts +29 -63
- package/src/transport/flows/handle.sse.flow.js +78 -10
- package/src/transport/flows/handle.sse.flow.js.map +1 -1
- package/src/transport/flows/handle.stateless-http.flow.d.ts +29 -0
- package/src/transport/flows/handle.stateless-http.flow.js +102 -0
- package/src/transport/flows/handle.stateless-http.flow.js.map +1 -0
- package/src/transport/flows/handle.streamable-http.flow.d.ts +32 -64
- package/src/transport/flows/handle.streamable-http.flow.js +158 -26
- package/src/transport/flows/handle.streamable-http.flow.js.map +1 -1
- package/src/transport/legacy/legacy.sse.tranporter.d.ts +9 -0
- package/src/transport/legacy/legacy.sse.tranporter.js +17 -2
- package/src/transport/legacy/legacy.sse.tranporter.js.map +1 -1
- package/src/transport/mcp-handlers/call-tool-request.handler.js +27 -1
- package/src/transport/mcp-handlers/call-tool-request.handler.js.map +1 -1
- package/src/transport/mcp-handlers/complete-request.handler.d.ts +69 -0
- package/src/transport/mcp-handlers/complete-request.handler.js +11 -0
- package/src/transport/mcp-handlers/complete-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/get-prompt-request.handler.d.ts +87 -0
- package/src/transport/mcp-handlers/get-prompt-request.handler.js +11 -0
- package/src/transport/mcp-handlers/get-prompt-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/index.d.ts +517 -208
- package/src/transport/mcp-handlers/index.js +39 -2
- package/src/transport/mcp-handlers/index.js.map +1 -1
- package/src/transport/mcp-handlers/initialize-request.handler.d.ts +1 -1
- package/src/transport/mcp-handlers/initialize-request.handler.js +73 -7
- package/src/transport/mcp-handlers/initialize-request.handler.js.map +1 -1
- package/src/transport/mcp-handlers/list-prompts-request.handler.d.ts +54 -0
- package/src/transport/mcp-handlers/list-prompts-request.handler.js +11 -0
- package/src/transport/mcp-handlers/list-prompts-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/list-resource-templates-request.handler.d.ts +51 -0
- package/src/transport/mcp-handlers/list-resource-templates-request.handler.js +12 -0
- package/src/transport/mcp-handlers/list-resource-templates-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/list-resources-request.handler.d.ts +51 -0
- package/src/transport/mcp-handlers/list-resources-request.handler.js +12 -0
- package/src/transport/mcp-handlers/list-resources-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/list-tools-request.handler.d.ts +19 -146
- package/src/transport/mcp-handlers/logging-set-level-request.handler.d.ts +46 -0
- package/src/transport/mcp-handlers/logging-set-level-request.handler.js +34 -0
- package/src/transport/mcp-handlers/logging-set-level-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/mcp-handlers.types.d.ts +3 -7
- package/src/transport/mcp-handlers/mcp-handlers.types.js.map +1 -1
- package/src/transport/mcp-handlers/read-resource-request.handler.d.ts +46 -0
- package/src/transport/mcp-handlers/read-resource-request.handler.js +12 -0
- package/src/transport/mcp-handlers/read-resource-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/roots-list-changed-notification.handler.d.ts +11 -0
- package/src/transport/mcp-handlers/roots-list-changed-notification.handler.js +26 -0
- package/src/transport/mcp-handlers/roots-list-changed-notification.handler.js.map +1 -0
- package/src/transport/mcp-handlers/subscribe-request.handler.d.ts +37 -0
- package/src/transport/mcp-handlers/subscribe-request.handler.js +34 -0
- package/src/transport/mcp-handlers/subscribe-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/unsubscribe-request.handler.d.ts +37 -0
- package/src/transport/mcp-handlers/unsubscribe-request.handler.js +34 -0
- package/src/transport/mcp-handlers/unsubscribe-request.handler.js.map +1 -0
- package/src/transport/transport.local.js +7 -2
- package/src/transport/transport.local.js.map +1 -1
- package/src/transport/transport.registry.d.ts +30 -0
- package/src/transport/transport.registry.js +84 -1
- package/src/transport/transport.registry.js.map +1 -1
- package/src/transport/transport.types.d.ts +3 -3
- package/src/transport/transport.types.js.map +1 -1
- package/src/utils/content.utils.d.ts +48 -0
- package/src/utils/content.utils.js +194 -0
- package/src/utils/content.utils.js.map +1 -0
- package/src/utils/index.d.ts +8 -0
- package/src/utils/index.js +55 -0
- package/src/utils/index.js.map +1 -0
- package/src/utils/lineage.utils.d.ts +40 -0
- package/src/utils/lineage.utils.js +82 -0
- package/src/utils/lineage.utils.js.map +1 -0
- package/src/utils/naming.utils.d.ts +46 -0
- package/src/utils/naming.utils.js +136 -0
- package/src/utils/naming.utils.js.map +1 -0
- package/src/utils/types.utils.d.ts +2 -2
- package/src/utils/types.utils.js.map +1 -1
- package/src/utils/uri-template.utils.d.ts +57 -0
- package/src/utils/uri-template.utils.js +113 -0
- package/src/utils/uri-template.utils.js.map +1 -0
- package/src/utils/uri-validation.utils.d.ts +40 -0
- package/src/utils/uri-validation.utils.js +76 -0
- package/src/utils/uri-validation.utils.js.map +1 -0
- package/src/__test-utils__/fixtures/hook.fixtures.d.ts +0 -46
- package/src/__test-utils__/fixtures/hook.fixtures.js +0 -114
- package/src/__test-utils__/fixtures/hook.fixtures.js.map +0 -1
- package/src/__test-utils__/fixtures/index.d.ts +0 -7
- package/src/__test-utils__/fixtures/index.js +0 -11
- package/src/__test-utils__/fixtures/index.js.map +0 -1
- package/src/__test-utils__/fixtures/plugin.fixtures.d.ts +0 -46
- package/src/__test-utils__/fixtures/plugin.fixtures.js +0 -127
- package/src/__test-utils__/fixtures/plugin.fixtures.js.map +0 -1
- package/src/__test-utils__/fixtures/provider.fixtures.d.ts +0 -69
- package/src/__test-utils__/fixtures/provider.fixtures.js +0 -131
- package/src/__test-utils__/fixtures/provider.fixtures.js.map +0 -1
- package/src/__test-utils__/fixtures/scope.fixtures.d.ts +0 -14
- package/src/__test-utils__/fixtures/scope.fixtures.js +0 -59
- package/src/__test-utils__/fixtures/scope.fixtures.js.map +0 -1
- package/src/__test-utils__/fixtures/tool.fixtures.d.ts +0 -36
- package/src/__test-utils__/fixtures/tool.fixtures.js +0 -91
- package/src/__test-utils__/fixtures/tool.fixtures.js.map +0 -1
- package/src/__test-utils__/helpers/assertion.helpers.d.ts +0 -45
- package/src/__test-utils__/helpers/assertion.helpers.js +0 -153
- package/src/__test-utils__/helpers/assertion.helpers.js.map +0 -1
- package/src/__test-utils__/helpers/async.helpers.d.ts +0 -48
- package/src/__test-utils__/helpers/async.helpers.js +0 -112
- package/src/__test-utils__/helpers/async.helpers.js.map +0 -1
- package/src/__test-utils__/helpers/index.d.ts +0 -6
- package/src/__test-utils__/helpers/index.js +0 -10
- package/src/__test-utils__/helpers/index.js.map +0 -1
- package/src/__test-utils__/helpers/setup.helpers.d.ts +0 -54
- package/src/__test-utils__/helpers/setup.helpers.js +0 -106
- package/src/__test-utils__/helpers/setup.helpers.js.map +0 -1
- package/src/__test-utils__/index.d.ts +0 -9
- package/src/__test-utils__/index.js +0 -14
- package/src/__test-utils__/index.js.map +0 -1
- package/src/__test-utils__/mocks/flow-instance.mock.d.ts +0 -50
- package/src/__test-utils__/mocks/flow-instance.mock.js +0 -72
- package/src/__test-utils__/mocks/flow-instance.mock.js.map +0 -1
- package/src/__test-utils__/mocks/hook-registry.mock.d.ts +0 -25
- package/src/__test-utils__/mocks/hook-registry.mock.js +0 -65
- package/src/__test-utils__/mocks/hook-registry.mock.js.map +0 -1
- package/src/__test-utils__/mocks/index.d.ts +0 -8
- package/src/__test-utils__/mocks/index.js +0 -12
- package/src/__test-utils__/mocks/index.js.map +0 -1
- package/src/__test-utils__/mocks/plugin-registry.mock.d.ts +0 -43
- package/src/__test-utils__/mocks/plugin-registry.mock.js +0 -70
- package/src/__test-utils__/mocks/plugin-registry.mock.js.map +0 -1
- package/src/__test-utils__/mocks/provider-registry.mock.d.ts +0 -39
- package/src/__test-utils__/mocks/provider-registry.mock.js +0 -72
- package/src/__test-utils__/mocks/provider-registry.mock.js.map +0 -1
- package/src/__test-utils__/mocks/tool-registry.mock.d.ts +0 -43
- package/src/__test-utils__/mocks/tool-registry.mock.js +0 -79
- package/src/__test-utils__/mocks/tool-registry.mock.js.map +0 -1
- package/src/auth/path.utils.d.ts +0 -20
- package/src/auth/path.utils.js +0 -71
- package/src/auth/path.utils.js.map +0 -1
- package/src/common/decorators-old/async-with.decorator.d.ts +0 -10
- package/src/common/decorators-old/async-with.decorator.js +0 -24
- package/src/common/decorators-old/async-with.decorator.js.map +0 -1
- package/src/common/decorators-old/auth-hook.decorator.d.ts +0 -14
- package/src/common/decorators-old/auth-hook.decorator.js +0 -27
- package/src/common/decorators-old/auth-hook.decorator.js.map +0 -1
- package/src/common/decorators-old/session-hook.decorator.d.ts +0 -14
- package/src/common/decorators-old/session-hook.decorator.js +0 -27
- package/src/common/decorators-old/session-hook.decorator.js.map +0 -1
|
@@ -4,10 +4,11 @@ exports.httpRequestStateSchema = void 0;
|
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
const common_1 = require("../../common");
|
|
6
6
|
const zod_1 = require("zod");
|
|
7
|
-
const path_utils_1 = require("../../auth/path.utils");
|
|
8
7
|
const session_verify_flow_1 = require("../../auth/flows/session.verify.flow");
|
|
9
8
|
const plan = {
|
|
10
9
|
pre: [
|
|
10
|
+
// request tracing
|
|
11
|
+
'traceRequest',
|
|
11
12
|
// rate limiting / concurrency
|
|
12
13
|
'acquireQuota',
|
|
13
14
|
'acquireSemaphore',
|
|
@@ -21,6 +22,7 @@ const plan = {
|
|
|
21
22
|
'handleStreamableHttp',
|
|
22
23
|
'handleStatefulHttp',
|
|
23
24
|
'handleStatelessHttp',
|
|
25
|
+
'handleDeleteSession',
|
|
24
26
|
],
|
|
25
27
|
finalize: [
|
|
26
28
|
// audit/metrics
|
|
@@ -31,7 +33,7 @@ const plan = {
|
|
|
31
33
|
'releaseQuota',
|
|
32
34
|
'finalize',
|
|
33
35
|
],
|
|
34
|
-
error: [
|
|
36
|
+
error: [],
|
|
35
37
|
};
|
|
36
38
|
exports.httpRequestStateSchema = zod_1.z.object({
|
|
37
39
|
decision: common_1.decisionSchema,
|
|
@@ -42,106 +44,318 @@ const name = 'http:request';
|
|
|
42
44
|
const { Stage } = (0, common_1.FlowHooksOf)('http:request');
|
|
43
45
|
let HttpRequestFlow = class HttpRequestFlow extends common_1.FlowBase {
|
|
44
46
|
logger = this.scope.logger.child('HttpRequestFlow');
|
|
47
|
+
requestStartTime = 0;
|
|
48
|
+
requestId = '';
|
|
45
49
|
static canActivate(request, scope) {
|
|
46
|
-
const requestPath = (0,
|
|
47
|
-
const prefix = (0,
|
|
48
|
-
const scopePath = (0,
|
|
49
|
-
|
|
50
|
+
const requestPath = (0, common_1.normalizeEntryPrefix)(request.path);
|
|
51
|
+
const prefix = (0, common_1.normalizeEntryPrefix)(scope.entryPath);
|
|
52
|
+
const scopePath = (0, common_1.normalizeScopeBase)(scope.routeBase);
|
|
53
|
+
const basePath = `${prefix}${scopePath}`;
|
|
54
|
+
return (requestPath === basePath || // Modern transports: /
|
|
55
|
+
requestPath === `${basePath}/sse` || // Legacy SSE: /sse
|
|
56
|
+
requestPath === `${basePath}/message` // Legacy SSE: /message
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
async traceRequest() {
|
|
60
|
+
const { request } = this.rawInput;
|
|
61
|
+
this.requestStartTime = Date.now();
|
|
62
|
+
this.requestId = `req-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
63
|
+
// Extract useful tracing info
|
|
64
|
+
const userAgent = request.headers?.['user-agent'];
|
|
65
|
+
const sessionId = request.headers?.['mcp-session-id'];
|
|
66
|
+
const contentType = request.headers?.['content-type'];
|
|
67
|
+
const accept = request.headers?.['accept'];
|
|
68
|
+
const body = request.body;
|
|
69
|
+
this.logger.info(`[${this.requestId}] ▶ ${request.method} ${request.path}`, {
|
|
70
|
+
requestId: this.requestId,
|
|
71
|
+
method: request.method,
|
|
72
|
+
path: request.path,
|
|
73
|
+
userAgent: userAgent?.slice(0, 50),
|
|
74
|
+
sessionId: sessionId?.slice(0, 20),
|
|
75
|
+
contentType,
|
|
76
|
+
accept,
|
|
77
|
+
hasBody: !!request.body,
|
|
78
|
+
bodyMethod: body?.['method'],
|
|
79
|
+
});
|
|
80
|
+
// Log sanitized headers for debugging connection issues
|
|
81
|
+
const headers = request.headers ?? {};
|
|
82
|
+
const sanitizedHeaders = Object.fromEntries(Object.entries(headers).map(([key, value]) => {
|
|
83
|
+
// Redact clearly sensitive headers
|
|
84
|
+
if (/^(authorization|proxy-authorization|cookie|set-cookie|x-api-key)$/i.test(key)) {
|
|
85
|
+
return [key, '[REDACTED]'];
|
|
86
|
+
}
|
|
87
|
+
// Truncate session identifiers instead of logging full values
|
|
88
|
+
if (key === 'mcp-session-id') {
|
|
89
|
+
return [key, String(value).slice(0, 8) + '...'];
|
|
90
|
+
}
|
|
91
|
+
return [key, value];
|
|
92
|
+
}));
|
|
93
|
+
this.logger.debug(`[${this.requestId}] HEADERS`, { headers: sanitizedHeaders });
|
|
50
94
|
}
|
|
51
95
|
async checkAuthorization() {
|
|
52
96
|
const { request } = this.rawInput;
|
|
53
|
-
this.logger.
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
97
|
+
this.logger.verbose(`[${this.requestId}] checkAuthorization: verifying session`);
|
|
98
|
+
try {
|
|
99
|
+
const result = await this.scope.runFlow('session:verify', { request });
|
|
100
|
+
if (!result) {
|
|
101
|
+
this.logger.error(`[${this.requestId}] failed to verify session`);
|
|
102
|
+
throw new Error('Session verification failed');
|
|
103
|
+
}
|
|
104
|
+
this.state.set({
|
|
105
|
+
verifyResult: result,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
// FlowControl is expected control flow, not an error
|
|
110
|
+
if (!(error instanceof common_1.FlowControl)) {
|
|
111
|
+
this.logError(error, 'checkAuthorization');
|
|
112
|
+
}
|
|
113
|
+
throw error;
|
|
58
114
|
}
|
|
59
|
-
this.state.set({
|
|
60
|
-
verifyResult: result,
|
|
61
|
-
});
|
|
62
115
|
}
|
|
63
116
|
async router() {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
this.logger.info(`decision from session: ${intent}`);
|
|
83
|
-
this.state.set('intent', intent);
|
|
117
|
+
try {
|
|
118
|
+
const { request } = this.rawInput;
|
|
119
|
+
this.logger.verbose(`[${this.requestId}] router: check request decision`);
|
|
120
|
+
// Use transport config directly from auth (already parsed with defaults by Zod)
|
|
121
|
+
const transport = this.scope.auth.transport;
|
|
122
|
+
const decision = (0, common_1.decideIntent)(request, { ...transport, tolerateMissingAccept: true });
|
|
123
|
+
// Handle DELETE method immediately - it's for session termination
|
|
124
|
+
// regardless of what protocol the session was created with
|
|
125
|
+
if (request.method.toUpperCase() === 'DELETE') {
|
|
126
|
+
this.logger.verbose(`[${this.requestId}] DELETE request, using decision intent: ${decision.intent}`);
|
|
127
|
+
if (decision.intent === 'unknown') {
|
|
128
|
+
// DELETE without session ID - forward to next middleware
|
|
129
|
+
// to allow custom DELETE handlers by developers
|
|
130
|
+
this.logger.verbose(`[${this.requestId}] DELETE with unknown intent, forwarding to next middleware`);
|
|
131
|
+
this.next();
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
this.state.set('intent', decision.intent);
|
|
84
135
|
return;
|
|
85
136
|
}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
137
|
+
const { verifyResult } = this.state.required;
|
|
138
|
+
if (verifyResult.kind === 'authorized') {
|
|
139
|
+
const { authorization } = verifyResult;
|
|
140
|
+
request[common_1.ServerRequestTokens.auth] = authorization;
|
|
141
|
+
if (authorization.session) {
|
|
142
|
+
const sessionId = authorization.session.id;
|
|
143
|
+
request[common_1.ServerRequestTokens.sessionId] = sessionId;
|
|
144
|
+
// Check if the session has been terminated (via DELETE)
|
|
145
|
+
// Per MCP spec, requests to terminated sessions should return 404
|
|
146
|
+
if (this.scope.notifications.isSessionTerminated(sessionId)) {
|
|
147
|
+
this.logger.warn(`[${this.requestId}] Request to terminated session: ${sessionId.slice(0, 20)}...`);
|
|
148
|
+
this.respond(common_1.httpRespond.notFound('Session not found'));
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
// Safely access payload.protocol with null check
|
|
152
|
+
const protocol = authorization.session.payload?.protocol;
|
|
153
|
+
if (protocol) {
|
|
154
|
+
this.logger.info(`[${this.requestId}] decision from session: ${protocol}`);
|
|
155
|
+
this.state.set('intent', protocol);
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
if (decision.intent === 'unknown') {
|
|
160
|
+
// continue to other middleware
|
|
161
|
+
// with authentication (public/authorized routes)
|
|
162
|
+
this.logger.verbose(`[${this.requestId}] decision is unknown, continue to next http middleware`);
|
|
163
|
+
this.next();
|
|
164
|
+
return; // Explicit return for clarity (this.next() throws FlowControl)
|
|
165
|
+
}
|
|
166
|
+
// register decision intent to state
|
|
167
|
+
// and move to next stage
|
|
168
|
+
this.logger.verbose(`[${this.requestId}] decision is request info: ${decision.intent}`);
|
|
169
|
+
this.state.set('intent', decision.intent);
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
this.logger.verbose(`[${this.requestId}] not authorized request, check decision intent: ${decision.intent}`);
|
|
173
|
+
if (decision.intent === 'unknown') {
|
|
174
|
+
this.logger.verbose(`[${this.requestId}] decision is unknown, continue to other public http middleware`);
|
|
175
|
+
// continue to other middleware
|
|
176
|
+
// without authentication (public routes)
|
|
177
|
+
this.next();
|
|
178
|
+
return; // Explicit return for clarity (this.next() throws FlowControl)
|
|
179
|
+
}
|
|
180
|
+
this.logger.warn(`[${this.requestId}] decision is ${decision.intent}, but not authorized, respond with 401`);
|
|
181
|
+
// if the decision is specific mcp transport and no auth
|
|
182
|
+
// then respond with 401
|
|
183
|
+
this.respond(common_1.httpRespond.unauthorized({
|
|
184
|
+
headers: {
|
|
185
|
+
'WWW-Authenticate': verifyResult.prmMetadataHeader,
|
|
186
|
+
},
|
|
187
|
+
}));
|
|
91
188
|
}
|
|
92
|
-
// register decision intent to state
|
|
93
|
-
// and move to next stage
|
|
94
|
-
this.logger.verbose(`decision is request info: ${decision.intent}`);
|
|
95
|
-
this.state.set('intent', decision.intent);
|
|
96
189
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
if (
|
|
100
|
-
this.
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
this.next();
|
|
104
|
-
}
|
|
105
|
-
this.logger.warn(`decision is ${decision.intent}, but not authorized, respond with 401`);
|
|
106
|
-
// if the decision is specific mcp transport and no auth
|
|
107
|
-
// then respond with 401
|
|
108
|
-
this.respond(common_1.httpRespond.unauthorized({
|
|
109
|
-
headers: {
|
|
110
|
-
'WWW-Authenticate': verifyResult.prmMetadataHeader,
|
|
111
|
-
},
|
|
112
|
-
}));
|
|
190
|
+
catch (error) {
|
|
191
|
+
// FlowControl is expected control flow, not an error
|
|
192
|
+
if (!(error instanceof common_1.FlowControl)) {
|
|
193
|
+
this.logError(error, 'router');
|
|
194
|
+
}
|
|
195
|
+
throw error;
|
|
113
196
|
}
|
|
114
197
|
}
|
|
115
198
|
async handleLegacySse() {
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
199
|
+
try {
|
|
200
|
+
const response = await this.scope.runFlow('handle:legacy-sse', this.rawInput);
|
|
201
|
+
if (response) {
|
|
202
|
+
this.respond(response);
|
|
203
|
+
}
|
|
204
|
+
this.handled();
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
// FlowControl is expected control flow, not an error
|
|
208
|
+
if (!(error instanceof common_1.FlowControl)) {
|
|
209
|
+
this.logError(error, 'handleLegacySse');
|
|
210
|
+
}
|
|
211
|
+
throw error;
|
|
119
212
|
}
|
|
120
|
-
this.handled();
|
|
121
213
|
}
|
|
122
214
|
async handleSse() {
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
215
|
+
try {
|
|
216
|
+
const response = await this.scope.runFlow('handle:streamable-http', this.rawInput);
|
|
217
|
+
if (response) {
|
|
218
|
+
this.respond(response);
|
|
219
|
+
}
|
|
220
|
+
this.next();
|
|
221
|
+
}
|
|
222
|
+
catch (error) {
|
|
223
|
+
// FlowControl is expected control flow, not an error
|
|
224
|
+
if (!(error instanceof common_1.FlowControl)) {
|
|
225
|
+
this.logError(error, 'handleSse');
|
|
226
|
+
}
|
|
227
|
+
throw error;
|
|
126
228
|
}
|
|
127
|
-
this.next();
|
|
128
229
|
}
|
|
129
230
|
async handleStreamableHttp() {
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
231
|
+
try {
|
|
232
|
+
const response = await this.scope.runFlow('handle:streamable-http', this.rawInput);
|
|
233
|
+
if (response) {
|
|
234
|
+
this.respond(response);
|
|
235
|
+
}
|
|
236
|
+
this.next();
|
|
237
|
+
}
|
|
238
|
+
catch (error) {
|
|
239
|
+
// FlowControl is expected control flow, not an error
|
|
240
|
+
if (!(error instanceof common_1.FlowControl)) {
|
|
241
|
+
this.logError(error, 'handleStreamableHttp');
|
|
242
|
+
}
|
|
243
|
+
throw error;
|
|
133
244
|
}
|
|
134
|
-
this.next();
|
|
135
245
|
}
|
|
136
246
|
async handleStatefulHttp() {
|
|
137
247
|
// this.scope.runFlow('mcp:transport:stateful-http', this.rawInput);
|
|
138
248
|
this.next();
|
|
139
249
|
}
|
|
140
250
|
async handleStatelessHttp() {
|
|
141
|
-
|
|
142
|
-
|
|
251
|
+
try {
|
|
252
|
+
const response = await this.scope.runFlow('handle:stateless-http', this.rawInput);
|
|
253
|
+
if (response) {
|
|
254
|
+
this.respond(response);
|
|
255
|
+
}
|
|
256
|
+
this.handled();
|
|
257
|
+
}
|
|
258
|
+
catch (error) {
|
|
259
|
+
// FlowControl is expected control flow, not an error
|
|
260
|
+
if (!(error instanceof common_1.FlowControl)) {
|
|
261
|
+
this.logError(error, 'handleStatelessHttp');
|
|
262
|
+
}
|
|
263
|
+
throw error;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
async handleDeleteSession() {
|
|
267
|
+
try {
|
|
268
|
+
const { request } = this.rawInput;
|
|
269
|
+
// Headers are normalized to lowercase by the adapter
|
|
270
|
+
const sessionId = request[common_1.ServerRequestTokens.sessionId] ?? request.headers['mcp-session-id'];
|
|
271
|
+
if (!sessionId || typeof sessionId !== 'string') {
|
|
272
|
+
this.logger.warn(`[${this.requestId}] DELETE request without valid session ID`);
|
|
273
|
+
this.respond(common_1.httpRespond.rpcError('No valid session ID provided'));
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
this.logger.info(`[${this.requestId}] DELETE session: ${sessionId}`);
|
|
277
|
+
// Terminate the session - this unregisters the server AND adds to terminated set
|
|
278
|
+
// This prevents future requests with this session ID from being accepted
|
|
279
|
+
const wasRegistered = this.scope.notifications.terminateSession(sessionId);
|
|
280
|
+
if (!wasRegistered) {
|
|
281
|
+
// Session not found - per MCP spec, return 404
|
|
282
|
+
// Note: We still added it to terminated set to prevent future use
|
|
283
|
+
this.logger.warn(`[${this.requestId}] Session not found for DELETE: ${sessionId}`);
|
|
284
|
+
this.respond(common_1.httpRespond.notFound('Session not found'));
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
this.logger.info(`[${this.requestId}] Session terminated: ${sessionId}`);
|
|
288
|
+
this.respond(common_1.httpRespond.noContent());
|
|
289
|
+
}
|
|
290
|
+
catch (error) {
|
|
291
|
+
// FlowControl is expected control flow, not an error
|
|
292
|
+
if (!(error instanceof common_1.FlowControl)) {
|
|
293
|
+
this.logError(error, 'handleDeleteSession');
|
|
294
|
+
}
|
|
295
|
+
throw error;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
async finalize() {
|
|
299
|
+
const { request } = this.rawInput;
|
|
300
|
+
const duration = Date.now() - this.requestStartTime;
|
|
301
|
+
const intent = this.state.get('intent') ?? 'unknown';
|
|
302
|
+
this.logger.info(`[${this.requestId}] ◀ ${request.method} ${request.path} completed in ${duration}ms`, {
|
|
303
|
+
requestId: this.requestId,
|
|
304
|
+
method: request.method,
|
|
305
|
+
path: request.path,
|
|
306
|
+
duration,
|
|
307
|
+
intent,
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Log an error that occurred during request processing.
|
|
312
|
+
* Called from stage handlers that catch errors.
|
|
313
|
+
*/
|
|
314
|
+
logError(error, context) {
|
|
315
|
+
const { request } = this.rawInput;
|
|
316
|
+
const duration = Date.now() - this.requestStartTime;
|
|
317
|
+
// Extract error details - handle various error shapes
|
|
318
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
319
|
+
const errorName = error instanceof Error ? error.name : 'UnknownError';
|
|
320
|
+
const errorStack = error instanceof Error ? error.stack : undefined;
|
|
321
|
+
const body = request.body;
|
|
322
|
+
// For errors with empty messages, try to extract more info
|
|
323
|
+
const errorCode = error?.code;
|
|
324
|
+
const errorCause = error?.cause;
|
|
325
|
+
// Log comprehensive error info including stack trace
|
|
326
|
+
this.logger.error(`[${this.requestId}] ✖ ${request.method} ${request.path} failed${context ? ` in ${context}` : ''} after ${duration}ms: ${errorMessage || '(no message)'}`, {
|
|
327
|
+
requestId: this.requestId,
|
|
328
|
+
method: request.method,
|
|
329
|
+
path: request.path,
|
|
330
|
+
duration,
|
|
331
|
+
context,
|
|
332
|
+
error: {
|
|
333
|
+
name: errorName,
|
|
334
|
+
message: errorMessage || '(no message)',
|
|
335
|
+
code: errorCode,
|
|
336
|
+
cause: errorCause instanceof Error ? errorCause.message : errorCause,
|
|
337
|
+
stack: errorStack,
|
|
338
|
+
},
|
|
339
|
+
request: {
|
|
340
|
+
userAgent: request.headers?.['user-agent']?.slice(0, 50),
|
|
341
|
+
sessionId: request.headers?.['mcp-session-id']?.slice(0, 20),
|
|
342
|
+
contentType: request.headers?.['content-type'],
|
|
343
|
+
bodyMethod: body?.['method'],
|
|
344
|
+
bodyId: body?.['id'],
|
|
345
|
+
},
|
|
346
|
+
state: {
|
|
347
|
+
intent: this.state.get('intent'),
|
|
348
|
+
hasVerifyResult: !!this.state.get('verifyResult'),
|
|
349
|
+
},
|
|
350
|
+
});
|
|
143
351
|
}
|
|
144
352
|
};
|
|
353
|
+
tslib_1.__decorate([
|
|
354
|
+
Stage('traceRequest'),
|
|
355
|
+
tslib_1.__metadata("design:type", Function),
|
|
356
|
+
tslib_1.__metadata("design:paramtypes", []),
|
|
357
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
358
|
+
], HttpRequestFlow.prototype, "traceRequest", null);
|
|
145
359
|
tslib_1.__decorate([
|
|
146
360
|
Stage('checkAuthorization'),
|
|
147
361
|
tslib_1.__metadata("design:type", Function),
|
|
@@ -156,7 +370,7 @@ tslib_1.__decorate([
|
|
|
156
370
|
], HttpRequestFlow.prototype, "router", null);
|
|
157
371
|
tslib_1.__decorate([
|
|
158
372
|
Stage('handleLegacySse', {
|
|
159
|
-
filter: ({ state: { required: { intent } } }) => intent === 'legacy-sse',
|
|
373
|
+
filter: ({ state: { required: { intent }, }, }) => intent === 'legacy-sse',
|
|
160
374
|
}),
|
|
161
375
|
tslib_1.__metadata("design:type", Function),
|
|
162
376
|
tslib_1.__metadata("design:paramtypes", []),
|
|
@@ -164,7 +378,7 @@ tslib_1.__decorate([
|
|
|
164
378
|
], HttpRequestFlow.prototype, "handleLegacySse", null);
|
|
165
379
|
tslib_1.__decorate([
|
|
166
380
|
Stage('handleSse', {
|
|
167
|
-
filter: ({ state: { required: { intent } } }) => intent === 'sse',
|
|
381
|
+
filter: ({ state: { required: { intent }, }, }) => intent === 'sse',
|
|
168
382
|
}),
|
|
169
383
|
tslib_1.__metadata("design:type", Function),
|
|
170
384
|
tslib_1.__metadata("design:paramtypes", []),
|
|
@@ -172,7 +386,7 @@ tslib_1.__decorate([
|
|
|
172
386
|
], HttpRequestFlow.prototype, "handleSse", null);
|
|
173
387
|
tslib_1.__decorate([
|
|
174
388
|
Stage('handleStreamableHttp', {
|
|
175
|
-
filter: ({ state: { required: { intent } } }) => intent === 'streamable-http',
|
|
389
|
+
filter: ({ state: { required: { intent }, }, }) => intent === 'streamable-http',
|
|
176
390
|
}),
|
|
177
391
|
tslib_1.__metadata("design:type", Function),
|
|
178
392
|
tslib_1.__metadata("design:paramtypes", []),
|
|
@@ -180,7 +394,7 @@ tslib_1.__decorate([
|
|
|
180
394
|
], HttpRequestFlow.prototype, "handleStreamableHttp", null);
|
|
181
395
|
tslib_1.__decorate([
|
|
182
396
|
Stage('handleStatefulHttp', {
|
|
183
|
-
filter: ({ state: { required: { intent } } }) => intent === 'stateful-http',
|
|
397
|
+
filter: ({ state: { required: { intent }, }, }) => intent === 'stateful-http',
|
|
184
398
|
}),
|
|
185
399
|
tslib_1.__metadata("design:type", Function),
|
|
186
400
|
tslib_1.__metadata("design:paramtypes", []),
|
|
@@ -188,12 +402,26 @@ tslib_1.__decorate([
|
|
|
188
402
|
], HttpRequestFlow.prototype, "handleStatefulHttp", null);
|
|
189
403
|
tslib_1.__decorate([
|
|
190
404
|
Stage('handleStatelessHttp', {
|
|
191
|
-
filter: ({ state: { required: { intent } } }) => intent === 'stateless-http',
|
|
405
|
+
filter: ({ state: { required: { intent }, }, }) => intent === 'stateless-http',
|
|
192
406
|
}),
|
|
193
407
|
tslib_1.__metadata("design:type", Function),
|
|
194
408
|
tslib_1.__metadata("design:paramtypes", []),
|
|
195
409
|
tslib_1.__metadata("design:returntype", Promise)
|
|
196
410
|
], HttpRequestFlow.prototype, "handleStatelessHttp", null);
|
|
411
|
+
tslib_1.__decorate([
|
|
412
|
+
Stage('handleDeleteSession', {
|
|
413
|
+
filter: ({ state: { required: { intent }, }, }) => intent === 'delete-session',
|
|
414
|
+
}),
|
|
415
|
+
tslib_1.__metadata("design:type", Function),
|
|
416
|
+
tslib_1.__metadata("design:paramtypes", []),
|
|
417
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
418
|
+
], HttpRequestFlow.prototype, "handleDeleteSession", null);
|
|
419
|
+
tslib_1.__decorate([
|
|
420
|
+
Stage('finalize'),
|
|
421
|
+
tslib_1.__metadata("design:type", Function),
|
|
422
|
+
tslib_1.__metadata("design:paramtypes", []),
|
|
423
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
424
|
+
], HttpRequestFlow.prototype, "finalize", null);
|
|
197
425
|
HttpRequestFlow = tslib_1.__decorate([
|
|
198
426
|
(0, common_1.Flow)({
|
|
199
427
|
name,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.request.flow.js","sourceRoot":"","sources":["../../../../src/scope/flows/http.request.flow.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Flow, httpInputSchema, FlowRunOptions,\n httpOutputSchema,\n FlowPlan, FlowBase, ScopeEntry, FlowHooksOf, ServerRequest, ServerRequestTokens,\n httpRespond,\n decideIntent, decisionSchema, intentSchema,\n} from '../../common';\nimport {z} from 'zod';\nimport {normalizeEntryPrefix, normalizeScopeBase} from '../../auth/path.utils';\nimport {sessionVerifyOutputSchema} from '../../auth/flows/session.verify.flow';\n\nconst plan = {\n pre: [\n // rate limiting / concurrency\n 'acquireQuota',\n 'acquireSemaphore',\n // route request to the correct flow\n 'checkAuthorization',\n 'router',\n ],\n execute: [\n 'handleLegacySse',\n 'handleSse',\n 'handleStreamableHttp',\n 'handleStatefulHttp',\n 'handleStatelessHttp',\n ],\n finalize: [\n // audit/metrics\n 'audit',\n 'metrics',\n\n // cleanup\n 'releaseSemaphore',\n 'releaseQuota',\n 'finalize',\n ],\n error: ['error'],\n} as const satisfies FlowPlan<string>;\n\n\nexport const httpRequestStateSchema = z.object({\n decision: decisionSchema,\n intent: intentSchema,\n verifyResult: sessionVerifyOutputSchema,\n});\n\n\nconst name = 'http:request' as const;\nconst {Stage} = FlowHooksOf('http:request');\n\ndeclare global {\n interface ExtendFlows {\n 'http:request': FlowRunOptions<\n HttpRequestFlow,\n typeof plan,\n typeof httpInputSchema,\n typeof httpOutputSchema,\n typeof httpRequestStateSchema\n >;\n }\n}\n\n\n@Flow({\n name,\n plan,\n access: 'public',\n inputSchema: httpInputSchema,\n outputSchema: httpOutputSchema,\n middleware: {\n path: '/',\n },\n})\nexport default class HttpRequestFlow extends FlowBase<typeof name> {\n\n logger = this.scope.logger.child('HttpRequestFlow');\n\n static canActivate(request: ServerRequest, scope: ScopeEntry) {\n const requestPath = normalizeEntryPrefix(request.path);\n const prefix = normalizeEntryPrefix(scope.entryPath);\n const scopePath = normalizeScopeBase(scope.routeBase);\n return requestPath === `${prefix}${scopePath}` || requestPath === `${prefix}${scopePath}/message`;\n }\n\n @Stage('checkAuthorization')\n async checkAuthorization() {\n const {request} = this.rawInput;\n this.logger.info(`New request: ${request.method} ${request.path}`);\n\n const result = await this.scope.runFlow('session:verify', {request});\n if (!result) {\n this.logger.error('failed to to verify session');\n throw new Error('Session verification failed');\n }\n this.state.set({\n verifyResult: result,\n });\n\n }\n\n\n @Stage('router')\n async router() {\n const {request} = this.rawInput;\n this.logger.verbose('check request decision');\n const decision = decideIntent(request, {\n enableLegacySSE: true,\n enableSseListener: true,\n enableStatelessHttp: false,\n enableStatefulHttp: false,\n enableStreamableHttp: true,\n requireSessionForStreamable: true,\n tolerateMissingAccept: true,\n });\n\n const {verifyResult} = this.state.required;\n if (verifyResult.kind === 'authorized') {\n const {authorization} = verifyResult;\n request[ServerRequestTokens.auth] = authorization;\n if (authorization.session) {\n request[ServerRequestTokens.sessionId] = authorization.session.id;\n\n const intent = authorization.session.payload.protocol;\n this.logger.info(`decision from session: ${intent}`);\n this.state.set('intent', intent);\n return;\n }\n\n if (decision.intent === 'unknown') {\n // continue to other middleware\n // with authentication (public/authorized routes)\n this.logger.verbose(`decision is unknown, continue to next http middleware`);\n this.next();\n }\n\n // register decision intent to state\n // and move to next stage\n this.logger.verbose(`decision is request info: ${decision.intent}`);\n this.state.set('intent', decision.intent);\n } else {\n this.logger.verbose(`not authorized request, check decision intent: ${decision.intent}`);\n if (decision.intent === 'unknown') {\n this.logger.verbose(`decision is unknown, continue to other public http middleware`);\n // continue to other middleware\n // without authentication (public routes)\n this.next();\n }\n\n this.logger.warn(`decision is ${decision.intent}, but not authorized, respond with 401`);\n // if the decision is specific mcp transport and no auth\n // then respond with 401\n this.respond(httpRespond.unauthorized({\n headers: {\n 'WWW-Authenticate': verifyResult.prmMetadataHeader,\n },\n }));\n }\n\n }\n\n\n @Stage('handleLegacySse', {\n filter: ({state: {required: {intent}}}) =>\n intent === 'legacy-sse',\n })\n async handleLegacySse() {\n const response = await this.scope.runFlow('handle:legacy-sse', this.rawInput);\n if (response) {\n this.respond(response);\n }\n this.handled();\n }\n\n @Stage('handleSse', {\n filter: ({state: {required: {intent}}}) => intent === 'sse',\n })\n async handleSse() {\n const response = await this.scope.runFlow('handle:streamable-http', this.rawInput);\n if (response) {\n this.respond(response);\n }\n this.next();\n }\n\n @Stage('handleStreamableHttp', {\n filter: ({state: {required: {intent}}}) => intent === 'streamable-http',\n })\n async handleStreamableHttp() {\n const response = await this.scope.runFlow('handle:streamable-http', this.rawInput);\n if (response) {\n this.respond(response);\n }\n this.next();\n }\n\n @Stage('handleStatefulHttp', {\n filter: ({state: {required: {intent}}}) => intent === 'stateful-http',\n })\n async handleStatefulHttp() {\n // this.scope.runFlow('mcp:transport:stateful-http', this.rawInput);\n this.next();\n }\n\n @Stage('handleStatelessHttp', {\n filter: ({state: {required: {intent}}}) => intent === 'stateless-http',\n })\n async handleStatelessHttp() {\n // this.scope.runFlow('mcp:transport:stateless-http', this.rawInput);\n this.next();\n }\n\n}\n"]}
|
|
1
|
+
{"version":3,"file":"http.request.flow.js","sourceRoot":"","sources":["../../../../src/scope/flows/http.request.flow.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Flow,\n httpInputSchema,\n FlowRunOptions,\n httpOutputSchema,\n FlowPlan,\n FlowBase,\n ScopeEntry,\n FlowHooksOf,\n ServerRequest,\n ServerRequestTokens,\n httpRespond,\n decideIntent,\n decisionSchema,\n intentSchema,\n normalizeEntryPrefix,\n normalizeScopeBase,\n FlowControl,\n} from '../../common';\nimport { z } from 'zod';\nimport { sessionVerifyOutputSchema } from '../../auth/flows/session.verify.flow';\n\nconst plan = {\n pre: [\n // request tracing\n 'traceRequest',\n // rate limiting / concurrency\n 'acquireQuota',\n 'acquireSemaphore',\n // route request to the correct flow\n 'checkAuthorization',\n 'router',\n ],\n execute: [\n 'handleLegacySse',\n 'handleSse',\n 'handleStreamableHttp',\n 'handleStatefulHttp',\n 'handleStatelessHttp',\n 'handleDeleteSession',\n ],\n finalize: [\n // audit/metrics\n 'audit',\n 'metrics',\n\n // cleanup\n 'releaseSemaphore',\n 'releaseQuota',\n 'finalize',\n ],\n error: [],\n} as const satisfies FlowPlan<string>;\n\nexport const httpRequestStateSchema = z.object({\n decision: decisionSchema,\n intent: intentSchema,\n verifyResult: sessionVerifyOutputSchema,\n});\n\nconst name = 'http:request' as const;\nconst { Stage } = FlowHooksOf('http:request');\n\ndeclare global {\n interface ExtendFlows {\n 'http:request': FlowRunOptions<\n HttpRequestFlow,\n typeof plan,\n typeof httpInputSchema,\n typeof httpOutputSchema,\n typeof httpRequestStateSchema\n >;\n }\n}\n\n@Flow({\n name,\n plan,\n access: 'public',\n inputSchema: httpInputSchema,\n outputSchema: httpOutputSchema,\n middleware: {\n path: '/',\n },\n})\nexport default class HttpRequestFlow extends FlowBase<typeof name> {\n logger = this.scope.logger.child('HttpRequestFlow');\n private requestStartTime = 0;\n private requestId = '';\n\n static canActivate(request: ServerRequest, scope: ScopeEntry) {\n const requestPath = normalizeEntryPrefix(request.path);\n const prefix = normalizeEntryPrefix(scope.entryPath);\n const scopePath = normalizeScopeBase(scope.routeBase);\n const basePath = `${prefix}${scopePath}`;\n\n return (\n requestPath === basePath || // Modern transports: /\n requestPath === `${basePath}/sse` || // Legacy SSE: /sse\n requestPath === `${basePath}/message` // Legacy SSE: /message\n );\n }\n\n @Stage('traceRequest')\n async traceRequest() {\n const { request } = this.rawInput;\n this.requestStartTime = Date.now();\n this.requestId = `req-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n\n // Extract useful tracing info\n const userAgent = request.headers?.['user-agent'] as string | undefined;\n const sessionId = request.headers?.['mcp-session-id'] as string | undefined;\n const contentType = request.headers?.['content-type'] as string | undefined;\n const accept = request.headers?.['accept'] as string | undefined;\n\n const body = request.body as Record<string, unknown> | undefined;\n this.logger.info(`[${this.requestId}] ▶ ${request.method} ${request.path}`, {\n requestId: this.requestId,\n method: request.method,\n path: request.path,\n userAgent: userAgent?.slice(0, 50),\n sessionId: sessionId?.slice(0, 20),\n contentType,\n accept,\n hasBody: !!request.body,\n bodyMethod: body?.['method'],\n });\n\n // Log sanitized headers for debugging connection issues\n const headers = request.headers ?? {};\n const sanitizedHeaders = Object.fromEntries(\n Object.entries(headers).map(([key, value]) => {\n // Redact clearly sensitive headers\n if (/^(authorization|proxy-authorization|cookie|set-cookie|x-api-key)$/i.test(key)) {\n return [key, '[REDACTED]'];\n }\n // Truncate session identifiers instead of logging full values\n if (key === 'mcp-session-id') {\n return [key, String(value).slice(0, 8) + '...'];\n }\n return [key, value];\n }),\n );\n this.logger.debug(`[${this.requestId}] HEADERS`, { headers: sanitizedHeaders });\n }\n\n @Stage('checkAuthorization')\n async checkAuthorization() {\n const { request } = this.rawInput;\n this.logger.verbose(`[${this.requestId}] checkAuthorization: verifying session`);\n\n try {\n const result = await this.scope.runFlow('session:verify', { request });\n if (!result) {\n this.logger.error(`[${this.requestId}] failed to verify session`);\n throw new Error('Session verification failed');\n }\n this.state.set({\n verifyResult: result,\n });\n } catch (error) {\n // FlowControl is expected control flow, not an error\n if (!(error instanceof FlowControl)) {\n this.logError(error, 'checkAuthorization');\n }\n throw error;\n }\n }\n\n @Stage('router')\n async router() {\n try {\n const { request } = this.rawInput;\n this.logger.verbose(`[${this.requestId}] router: check request decision`);\n\n // Use transport config directly from auth (already parsed with defaults by Zod)\n const transport = this.scope.auth.transport;\n const decision = decideIntent(request, { ...transport, tolerateMissingAccept: true });\n\n // Handle DELETE method immediately - it's for session termination\n // regardless of what protocol the session was created with\n if (request.method.toUpperCase() === 'DELETE') {\n this.logger.verbose(`[${this.requestId}] DELETE request, using decision intent: ${decision.intent}`);\n if (decision.intent === 'unknown') {\n // DELETE without session ID - forward to next middleware\n // to allow custom DELETE handlers by developers\n this.logger.verbose(`[${this.requestId}] DELETE with unknown intent, forwarding to next middleware`);\n this.next();\n return;\n }\n this.state.set('intent', decision.intent);\n return;\n }\n\n const { verifyResult } = this.state.required;\n if (verifyResult.kind === 'authorized') {\n const { authorization } = verifyResult;\n request[ServerRequestTokens.auth] = authorization;\n if (authorization.session) {\n const sessionId = authorization.session.id;\n request[ServerRequestTokens.sessionId] = sessionId;\n\n // Check if the session has been terminated (via DELETE)\n // Per MCP spec, requests to terminated sessions should return 404\n if (this.scope.notifications.isSessionTerminated(sessionId)) {\n this.logger.warn(`[${this.requestId}] Request to terminated session: ${sessionId.slice(0, 20)}...`);\n this.respond(httpRespond.notFound('Session not found'));\n return;\n }\n\n // Safely access payload.protocol with null check\n const protocol = authorization.session.payload?.protocol;\n if (protocol) {\n this.logger.info(`[${this.requestId}] decision from session: ${protocol}`);\n this.state.set('intent', protocol);\n return;\n }\n }\n\n if (decision.intent === 'unknown') {\n // continue to other middleware\n // with authentication (public/authorized routes)\n this.logger.verbose(`[${this.requestId}] decision is unknown, continue to next http middleware`);\n this.next();\n return; // Explicit return for clarity (this.next() throws FlowControl)\n }\n\n // register decision intent to state\n // and move to next stage\n this.logger.verbose(`[${this.requestId}] decision is request info: ${decision.intent}`);\n this.state.set('intent', decision.intent);\n } else {\n this.logger.verbose(`[${this.requestId}] not authorized request, check decision intent: ${decision.intent}`);\n if (decision.intent === 'unknown') {\n this.logger.verbose(`[${this.requestId}] decision is unknown, continue to other public http middleware`);\n // continue to other middleware\n // without authentication (public routes)\n this.next();\n return; // Explicit return for clarity (this.next() throws FlowControl)\n }\n\n this.logger.warn(`[${this.requestId}] decision is ${decision.intent}, but not authorized, respond with 401`);\n // if the decision is specific mcp transport and no auth\n // then respond with 401\n this.respond(\n httpRespond.unauthorized({\n headers: {\n 'WWW-Authenticate': verifyResult.prmMetadataHeader,\n },\n }),\n );\n }\n } catch (error) {\n // FlowControl is expected control flow, not an error\n if (!(error instanceof FlowControl)) {\n this.logError(error, 'router');\n }\n throw error;\n }\n }\n\n @Stage('handleLegacySse', {\n filter: ({\n state: {\n required: { intent },\n },\n }) => intent === 'legacy-sse',\n })\n async handleLegacySse() {\n try {\n const response = await this.scope.runFlow('handle:legacy-sse', this.rawInput);\n if (response) {\n this.respond(response);\n }\n this.handled();\n } catch (error) {\n // FlowControl is expected control flow, not an error\n if (!(error instanceof FlowControl)) {\n this.logError(error, 'handleLegacySse');\n }\n throw error;\n }\n }\n\n @Stage('handleSse', {\n filter: ({\n state: {\n required: { intent },\n },\n }) => intent === 'sse',\n })\n async handleSse() {\n try {\n const response = await this.scope.runFlow('handle:streamable-http', this.rawInput);\n if (response) {\n this.respond(response);\n }\n this.next();\n } catch (error) {\n // FlowControl is expected control flow, not an error\n if (!(error instanceof FlowControl)) {\n this.logError(error, 'handleSse');\n }\n throw error;\n }\n }\n\n @Stage('handleStreamableHttp', {\n filter: ({\n state: {\n required: { intent },\n },\n }) => intent === 'streamable-http',\n })\n async handleStreamableHttp() {\n try {\n const response = await this.scope.runFlow('handle:streamable-http', this.rawInput);\n if (response) {\n this.respond(response);\n }\n this.next();\n } catch (error) {\n // FlowControl is expected control flow, not an error\n if (!(error instanceof FlowControl)) {\n this.logError(error, 'handleStreamableHttp');\n }\n throw error;\n }\n }\n\n @Stage('handleStatefulHttp', {\n filter: ({\n state: {\n required: { intent },\n },\n }) => intent === 'stateful-http',\n })\n async handleStatefulHttp() {\n // this.scope.runFlow('mcp:transport:stateful-http', this.rawInput);\n this.next();\n }\n\n @Stage('handleStatelessHttp', {\n filter: ({\n state: {\n required: { intent },\n },\n }) => intent === 'stateless-http',\n })\n async handleStatelessHttp() {\n try {\n const response = await this.scope.runFlow('handle:stateless-http', this.rawInput);\n if (response) {\n this.respond(response);\n }\n this.handled();\n } catch (error) {\n // FlowControl is expected control flow, not an error\n if (!(error instanceof FlowControl)) {\n this.logError(error, 'handleStatelessHttp');\n }\n throw error;\n }\n }\n\n @Stage('handleDeleteSession', {\n filter: ({\n state: {\n required: { intent },\n },\n }) => intent === 'delete-session',\n })\n async handleDeleteSession() {\n try {\n const { request } = this.rawInput;\n // Headers are normalized to lowercase by the adapter\n const sessionId = request[ServerRequestTokens.sessionId] ?? request.headers['mcp-session-id'];\n\n if (!sessionId || typeof sessionId !== 'string') {\n this.logger.warn(`[${this.requestId}] DELETE request without valid session ID`);\n this.respond(httpRespond.rpcError('No valid session ID provided'));\n return;\n }\n\n this.logger.info(`[${this.requestId}] DELETE session: ${sessionId}`);\n\n // Terminate the session - this unregisters the server AND adds to terminated set\n // This prevents future requests with this session ID from being accepted\n const wasRegistered = this.scope.notifications.terminateSession(sessionId);\n\n if (!wasRegistered) {\n // Session not found - per MCP spec, return 404\n // Note: We still added it to terminated set to prevent future use\n this.logger.warn(`[${this.requestId}] Session not found for DELETE: ${sessionId}`);\n this.respond(httpRespond.notFound('Session not found'));\n return;\n }\n\n this.logger.info(`[${this.requestId}] Session terminated: ${sessionId}`);\n this.respond(httpRespond.noContent());\n } catch (error) {\n // FlowControl is expected control flow, not an error\n if (!(error instanceof FlowControl)) {\n this.logError(error, 'handleDeleteSession');\n }\n throw error;\n }\n }\n\n @Stage('finalize')\n async finalize() {\n const { request } = this.rawInput;\n const duration = Date.now() - this.requestStartTime;\n const intent = this.state.get('intent') ?? 'unknown';\n\n this.logger.info(`[${this.requestId}] ◀ ${request.method} ${request.path} completed in ${duration}ms`, {\n requestId: this.requestId,\n method: request.method,\n path: request.path,\n duration,\n intent,\n });\n }\n\n /**\n * Log an error that occurred during request processing.\n * Called from stage handlers that catch errors.\n */\n private logError(error: unknown, context?: string) {\n const { request } = this.rawInput;\n const duration = Date.now() - this.requestStartTime;\n\n // Extract error details - handle various error shapes\n const errorMessage = error instanceof Error ? error.message : String(error);\n const errorName = error instanceof Error ? error.name : 'UnknownError';\n const errorStack = error instanceof Error ? error.stack : undefined;\n const body = request.body as Record<string, unknown> | undefined;\n\n // For errors with empty messages, try to extract more info\n const errorCode = (error as { code?: string | number })?.code;\n const errorCause = (error as { cause?: unknown })?.cause;\n\n // Log comprehensive error info including stack trace\n this.logger.error(\n `[${this.requestId}] ✖ ${request.method} ${request.path} failed${\n context ? ` in ${context}` : ''\n } after ${duration}ms: ${errorMessage || '(no message)'}`,\n {\n requestId: this.requestId,\n method: request.method,\n path: request.path,\n duration,\n context,\n error: {\n name: errorName,\n message: errorMessage || '(no message)',\n code: errorCode,\n cause: errorCause instanceof Error ? errorCause.message : errorCause,\n stack: errorStack,\n },\n request: {\n userAgent: (request.headers?.['user-agent'] as string)?.slice(0, 50),\n sessionId: (request.headers?.['mcp-session-id'] as string)?.slice(0, 20),\n contentType: request.headers?.['content-type'],\n bodyMethod: body?.['method'],\n bodyId: body?.['id'],\n },\n state: {\n intent: this.state.get('intent'),\n hasVerifyResult: !!this.state.get('verifyResult'),\n },\n },\n );\n }\n}\n"]}
|
|
@@ -5,6 +5,10 @@ import ProviderRegistry from '../provider/provider.registry';
|
|
|
5
5
|
import { AuthRegistry } from '../auth/auth.registry';
|
|
6
6
|
import { TransportService } from '../transport/transport.registry';
|
|
7
7
|
import ToolRegistry from '../tool/tool.registry';
|
|
8
|
+
import ResourceRegistry from '../resource/resource.registry';
|
|
9
|
+
import PromptRegistry from '../prompt/prompt.registry';
|
|
10
|
+
import { NotificationService } from '../notification';
|
|
11
|
+
import { ToolUIRegistry } from '../tool/ui';
|
|
8
12
|
export declare class Scope extends ScopeEntry {
|
|
9
13
|
readonly id: string;
|
|
10
14
|
private readonly globalProviders;
|
|
@@ -15,7 +19,11 @@ export declare class Scope extends ScopeEntry {
|
|
|
15
19
|
private scopeApps;
|
|
16
20
|
private scopeHooks;
|
|
17
21
|
private scopeTools;
|
|
22
|
+
private scopeResources;
|
|
23
|
+
private scopePrompts;
|
|
18
24
|
transportService: TransportService;
|
|
25
|
+
notificationService: NotificationService;
|
|
26
|
+
private toolUIRegistry;
|
|
19
27
|
readonly entryPath: string;
|
|
20
28
|
readonly routeBase: string;
|
|
21
29
|
readonly orchestrated: boolean;
|
|
@@ -29,6 +37,10 @@ export declare class Scope extends ScopeEntry {
|
|
|
29
37
|
get providers(): ProviderRegistry;
|
|
30
38
|
get apps(): AppRegistry;
|
|
31
39
|
get tools(): ToolRegistry;
|
|
40
|
+
get toolUI(): ToolUIRegistry;
|
|
41
|
+
get resources(): ResourceRegistry;
|
|
42
|
+
get prompts(): PromptRegistry;
|
|
43
|
+
get notifications(): NotificationService;
|
|
32
44
|
registryFlows(...flows: FlowType[]): Promise<void>;
|
|
33
45
|
runFlow<Name extends FlowName>(name: Name, input: FlowInputOf<Name>, deps?: Map<Token, Type>): Promise<FlowOutputOf<Name> | undefined>;
|
|
34
46
|
runFlowForOutput<Name extends FlowName>(name: Name, input: FlowInputOf<Name>, deps?: Map<Token, Type>): Promise<FlowOutputOf<Name>>;
|