@frontmcp/sdk 0.4.0 → 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 +111 -10
- 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
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { SetLevelRequest, EmptyResult } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
import { McpHandlerOptions } from './mcp-handlers.types';
|
|
3
|
+
/**
|
|
4
|
+
* Handler for the logging/setLevel MCP request.
|
|
5
|
+
* Per MCP 2025-11-25 spec, this allows clients to set the minimum log level
|
|
6
|
+
* for log messages sent via notifications/message.
|
|
7
|
+
*/
|
|
8
|
+
export default function LoggingSetLevelRequestHandler({ scope }: McpHandlerOptions): {
|
|
9
|
+
requestSchema: import("zod").ZodObject<{
|
|
10
|
+
method: import("zod").ZodLiteral<"logging/setLevel">;
|
|
11
|
+
params: import("zod").ZodObject<{
|
|
12
|
+
_meta: import("zod").ZodOptional<import("zod").ZodObject<{
|
|
13
|
+
progressToken: import("zod").ZodOptional<import("zod").ZodUnion<readonly [import("zod").ZodString, import("zod").ZodNumber]>>;
|
|
14
|
+
}, import("zod/v4/core").$loose>>;
|
|
15
|
+
level: import("zod").ZodEnum<{
|
|
16
|
+
error: "error";
|
|
17
|
+
debug: "debug";
|
|
18
|
+
info: "info";
|
|
19
|
+
notice: "notice";
|
|
20
|
+
warning: "warning";
|
|
21
|
+
critical: "critical";
|
|
22
|
+
alert: "alert";
|
|
23
|
+
emergency: "emergency";
|
|
24
|
+
}>;
|
|
25
|
+
}, import("zod/v4/core").$loose>;
|
|
26
|
+
}, import("zod/v4/core").$strip>;
|
|
27
|
+
handler: (request: SetLevelRequest, ctx: import("./mcp-handlers.types").McpRequestHandler<{
|
|
28
|
+
method: "logging/setLevel";
|
|
29
|
+
params: {
|
|
30
|
+
[x: string]: unknown;
|
|
31
|
+
level: "error" | "debug" | "info" | "warning" | "notice" | "critical" | "alert" | "emergency";
|
|
32
|
+
_meta?: {
|
|
33
|
+
[x: string]: unknown;
|
|
34
|
+
progressToken?: string | number | undefined;
|
|
35
|
+
} | undefined;
|
|
36
|
+
};
|
|
37
|
+
}, {
|
|
38
|
+
method: string;
|
|
39
|
+
params?: {
|
|
40
|
+
[x: string]: unknown;
|
|
41
|
+
_meta?: {
|
|
42
|
+
[x: string]: unknown;
|
|
43
|
+
} | undefined;
|
|
44
|
+
} | undefined;
|
|
45
|
+
}>) => Promise<EmptyResult>;
|
|
46
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = LoggingSetLevelRequestHandler;
|
|
4
|
+
const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
|
|
5
|
+
/**
|
|
6
|
+
* Handler for the logging/setLevel MCP request.
|
|
7
|
+
* Per MCP 2025-11-25 spec, this allows clients to set the minimum log level
|
|
8
|
+
* for log messages sent via notifications/message.
|
|
9
|
+
*/
|
|
10
|
+
function LoggingSetLevelRequestHandler({ scope }) {
|
|
11
|
+
return {
|
|
12
|
+
requestSchema: types_js_1.SetLevelRequestSchema,
|
|
13
|
+
handler: async (request, ctx) => {
|
|
14
|
+
const { level } = request.params;
|
|
15
|
+
// Get session ID from auth context
|
|
16
|
+
const sessionId = ctx.authInfo?.sessionId;
|
|
17
|
+
if (!sessionId) {
|
|
18
|
+
scope.logger.warn('logging/setLevel: No session ID found in request context');
|
|
19
|
+
return {};
|
|
20
|
+
}
|
|
21
|
+
// Set the log level for this session
|
|
22
|
+
const success = scope.notifications.setLogLevel(sessionId, level);
|
|
23
|
+
if (!success) {
|
|
24
|
+
scope.logger.warn(`logging/setLevel: Failed to set log level for session ${sessionId.slice(0, 20)}...`);
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
scope.logger.verbose(`logging/setLevel: Set level to '${level}' for session ${sessionId.slice(0, 20)}...`);
|
|
28
|
+
}
|
|
29
|
+
// Per MCP spec, return empty result
|
|
30
|
+
return {};
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=logging-set-level-request.handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logging-set-level-request.handler.js","sourceRoot":"","sources":["../../../../src/transport/mcp-handlers/logging-set-level-request.handler.ts"],"names":[],"mappings":";;AAQA,gDA0BC;AAlCD,iEAAyG;AAGzG;;;;GAIG;AACH,SAAwB,6BAA6B,CAAC,EAAE,KAAK,EAAqB;IAChF,OAAO;QACL,aAAa,EAAE,gCAAqB;QACpC,OAAO,EAAE,KAAK,EAAE,OAAwB,EAAE,GAAG,EAAwB,EAAE;YACrE,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;YAEjC,mCAAmC;YACnC,MAAM,SAAS,GAAG,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC;YAC1C,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;gBAC9E,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,qCAAqC;YACrC,MAAM,OAAO,GAAG,KAAK,CAAC,aAAa,CAAC,WAAW,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAElE,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,yDAAyD,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;YAC1G,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,mCAAmC,KAAK,iBAAiB,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;YAC7G,CAAC;YAED,oCAAoC;YACpC,OAAO,EAAE,CAAC;QACZ,CAAC;KACiD,CAAC;AACvD,CAAC","sourcesContent":["import { SetLevelRequestSchema, SetLevelRequest, EmptyResult } from '@modelcontextprotocol/sdk/types.js';\nimport { McpHandler, McpHandlerOptions } from './mcp-handlers.types';\n\n/**\n * Handler for the logging/setLevel MCP request.\n * Per MCP 2025-11-25 spec, this allows clients to set the minimum log level\n * for log messages sent via notifications/message.\n */\nexport default function LoggingSetLevelRequestHandler({ scope }: McpHandlerOptions) {\n return {\n requestSchema: SetLevelRequestSchema,\n handler: async (request: SetLevelRequest, ctx): Promise<EmptyResult> => {\n const { level } = request.params;\n\n // Get session ID from auth context\n const sessionId = ctx.authInfo?.sessionId;\n if (!sessionId) {\n scope.logger.warn('logging/setLevel: No session ID found in request context');\n return {};\n }\n\n // Set the log level for this session\n const success = scope.notifications.setLogLevel(sessionId, level);\n\n if (!success) {\n scope.logger.warn(`logging/setLevel: Failed to set log level for session ${sessionId.slice(0, 20)}...`);\n } else {\n scope.logger.verbose(`logging/setLevel: Set level to '${level}' for session ${sessionId.slice(0, 20)}...`);\n }\n\n // Per MCP spec, return empty result\n return {};\n },\n } satisfies McpHandler<SetLevelRequest, EmptyResult>;\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { z,
|
|
1
|
+
import { z, ZodType } from 'zod';
|
|
2
2
|
import { Notification, Request, Result } from '@modelcontextprotocol/sdk/types.js';
|
|
3
3
|
import { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';
|
|
4
4
|
import { ServerOptions } from '@modelcontextprotocol/sdk/server/index.js';
|
|
@@ -10,12 +10,8 @@ type Primitive = string | number | boolean | bigint | null | undefined;
|
|
|
10
10
|
type Flatten<T> = T extends Primitive ? T : T extends Array<infer U> ? Array<Flatten<U>> : T extends Set<infer U> ? Set<Flatten<U>> : T extends Map<infer K, infer V> ? Map<Flatten<K>, Flatten<V>> : T extends object ? {
|
|
11
11
|
[K in keyof T]: Flatten<T[K]>;
|
|
12
12
|
} : T;
|
|
13
|
-
type Infer<Schema extends
|
|
14
|
-
export interface McpHandler<HandlerRequest extends Request = Request, HandlerResult extends Result = Result, In extends ZodObject<{
|
|
15
|
-
method: ZodLiteral<string>;
|
|
16
|
-
}> = ZodObject<{
|
|
17
|
-
method: ZodLiteral<string>;
|
|
18
|
-
}>, Out extends ZodObject<any> = ZodObject<any>, HandlerNotification extends Notification = Notification> {
|
|
13
|
+
type Infer<Schema extends ZodType> = Flatten<z.infer<Schema>>;
|
|
14
|
+
export interface McpHandler<HandlerRequest extends Request = Request, HandlerResult extends Result = Result, In extends z.ZodObject<any> = z.ZodObject<any>, Out extends z.ZodObject<any> = z.ZodObject<any>, HandlerNotification extends Notification = Notification> {
|
|
19
15
|
when?: (request: Infer<In>) => boolean;
|
|
20
16
|
requestSchema: In;
|
|
21
17
|
responseSchema?: Out;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-handlers.types.js","sourceRoot":"","sources":["../../../../src/transport/mcp-handlers/mcp-handlers.types.ts"],"names":[],"mappings":"","sourcesContent":["import { z,
|
|
1
|
+
{"version":3,"file":"mcp-handlers.types.js","sourceRoot":"","sources":["../../../../src/transport/mcp-handlers/mcp-handlers.types.ts"],"names":[],"mappings":"","sourcesContent":["import { z, ZodType, ZodLiteral } from 'zod';\nimport { Notification, Request, Result } from '@modelcontextprotocol/sdk/types.js';\nimport { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';\nimport { ServerOptions } from '@modelcontextprotocol/sdk/server/index.js';\nimport { AuthInfo } from '@modelcontextprotocol/sdk/server/auth/types.js';\nimport { LocalTransporter } from '../transport.local';\nimport { Authorization } from '../../common';\nimport { Scope } from '../../scope';\n\ntype Primitive = string | number | boolean | bigint | null | undefined;\ntype Flatten<T> = T extends Primitive\n ? T\n : T extends Array<infer U>\n ? Array<Flatten<U>>\n : T extends Set<infer U>\n ? Set<Flatten<U>>\n : T extends Map<infer K, infer V>\n ? Map<Flatten<K>, Flatten<V>>\n : T extends object\n ? {\n [K in keyof T]: Flatten<T[K]>;\n }\n : T;\ntype Infer<Schema extends ZodType> = Flatten<z.infer<Schema>>;\n\nexport interface McpHandler<\n HandlerRequest extends Request = Request,\n HandlerResult extends Result = Result,\n In extends z.ZodObject<any> = z.ZodObject<any>,\n Out extends z.ZodObject<any> = z.ZodObject<any>,\n HandlerNotification extends Notification = Notification,\n> {\n when?: (request: Infer<In>) => boolean;\n requestSchema: In;\n responseSchema?: Out;\n\n handler: (\n request: HandlerRequest,\n ctx: McpRequestHandler<HandlerRequest, HandlerNotification>,\n ) => Promise<HandlerResult> | HandlerResult;\n}\n\nexport type McpHandlerOptions = {\n scope: Scope;\n serverOptions: ServerOptions;\n};\n\nexport type McpRequestHandler<\n SendRequestT extends Request,\n SendNotificationT extends Notification,\n> = RequestHandlerExtra<SendRequestT, SendNotificationT> & {\n authInfo?: AuthInfo & {\n extra?: {\n [key: string]: unknown;\n transport: LocalTransporter;\n authSession: Authorization;\n };\n };\n};\n"]}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { ReadResourceRequest } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
import { McpHandlerOptions } from './mcp-handlers.types';
|
|
3
|
+
export default function readResourceRequestHandler({ scope }: McpHandlerOptions): {
|
|
4
|
+
requestSchema: import("zod").ZodObject<{
|
|
5
|
+
method: import("zod").ZodLiteral<"resources/read">;
|
|
6
|
+
params: import("zod").ZodObject<{
|
|
7
|
+
_meta: import("zod").ZodOptional<import("zod").ZodObject<{
|
|
8
|
+
progressToken: import("zod").ZodOptional<import("zod").ZodUnion<readonly [import("zod").ZodString, import("zod").ZodNumber]>>;
|
|
9
|
+
}, import("zod/v4/core").$loose>>;
|
|
10
|
+
uri: import("zod").ZodString;
|
|
11
|
+
}, import("zod/v4/core").$loose>;
|
|
12
|
+
}, import("zod/v4/core").$strip>;
|
|
13
|
+
handler: (request: ReadResourceRequest, ctx: import("./mcp-handlers.types").McpRequestHandler<{
|
|
14
|
+
method: "resources/read";
|
|
15
|
+
params: {
|
|
16
|
+
[x: string]: unknown;
|
|
17
|
+
uri: string;
|
|
18
|
+
_meta?: {
|
|
19
|
+
[x: string]: unknown;
|
|
20
|
+
progressToken?: string | number | undefined;
|
|
21
|
+
} | undefined;
|
|
22
|
+
};
|
|
23
|
+
}, {
|
|
24
|
+
method: string;
|
|
25
|
+
params?: {
|
|
26
|
+
[x: string]: unknown;
|
|
27
|
+
_meta?: {
|
|
28
|
+
[x: string]: unknown;
|
|
29
|
+
} | undefined;
|
|
30
|
+
} | undefined;
|
|
31
|
+
}>) => Promise<{
|
|
32
|
+
[x: string]: unknown;
|
|
33
|
+
contents: ({
|
|
34
|
+
uri: string;
|
|
35
|
+
text: string;
|
|
36
|
+
mimeType?: string | undefined;
|
|
37
|
+
_meta?: Record<string, unknown> | undefined;
|
|
38
|
+
} | {
|
|
39
|
+
uri: string;
|
|
40
|
+
blob: string;
|
|
41
|
+
mimeType?: string | undefined;
|
|
42
|
+
_meta?: Record<string, unknown> | undefined;
|
|
43
|
+
})[];
|
|
44
|
+
_meta?: Record<string, unknown> | undefined;
|
|
45
|
+
}>;
|
|
46
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// file: libs/sdk/src/transport/mcp-handlers/read-resource-request.handler.ts
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.default = readResourceRequestHandler;
|
|
5
|
+
const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
|
|
6
|
+
function readResourceRequestHandler({ scope }) {
|
|
7
|
+
return {
|
|
8
|
+
requestSchema: types_js_1.ReadResourceRequestSchema,
|
|
9
|
+
handler: (request, ctx) => scope.runFlowForOutput('resources:read-resource', { request, ctx }),
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=read-resource-request.handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-resource-request.handler.js","sourceRoot":"","sources":["../../../../src/transport/mcp-handlers/read-resource-request.handler.ts"],"names":[],"mappings":";AAAA,6EAA6E;;AAK7E,6CAKC;AARD,iEAAwH;AAGxH,SAAwB,0BAA0B,CAAC,EAAE,KAAK,EAAqB;IAC7E,OAAO;QACL,aAAa,EAAE,oCAAyB;QACxC,OAAO,EAAE,CAAC,OAA4B,EAAE,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,yBAAyB,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;KACtD,CAAC;AAClE,CAAC","sourcesContent":["// file: libs/sdk/src/transport/mcp-handlers/read-resource-request.handler.ts\n\nimport { ReadResourceRequestSchema, ReadResourceRequest, ReadResourceResult } from '@modelcontextprotocol/sdk/types.js';\nimport { McpHandler, McpHandlerOptions } from './mcp-handlers.types';\n\nexport default function readResourceRequestHandler({ scope }: McpHandlerOptions) {\n return {\n requestSchema: ReadResourceRequestSchema,\n handler: (request: ReadResourceRequest, ctx) => scope.runFlowForOutput('resources:read-resource', { request, ctx }),\n } satisfies McpHandler<ReadResourceRequest, ReadResourceResult>;\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Result } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
import { McpHandler, McpHandlerOptions } from './mcp-handlers.types';
|
|
3
|
+
import type { RootsListChangedNotification } from '@modelcontextprotocol/sdk/types.js';
|
|
4
|
+
/**
|
|
5
|
+
* Handler for `notifications/roots/list_changed` notification from the client.
|
|
6
|
+
*
|
|
7
|
+
* Per MCP 2025-11-25 spec, this notification is sent by clients that support
|
|
8
|
+
* roots to indicate that the list of roots has changed. When received, the
|
|
9
|
+
* server should invalidate any cached roots and optionally re-fetch them.
|
|
10
|
+
*/
|
|
11
|
+
export default function rootsListChangedNotificationHandler({ scope, }: McpHandlerOptions): McpHandler<RootsListChangedNotification, Result>;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = rootsListChangedNotificationHandler;
|
|
4
|
+
const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
|
|
5
|
+
/**
|
|
6
|
+
* Handler for `notifications/roots/list_changed` notification from the client.
|
|
7
|
+
*
|
|
8
|
+
* Per MCP 2025-11-25 spec, this notification is sent by clients that support
|
|
9
|
+
* roots to indicate that the list of roots has changed. When received, the
|
|
10
|
+
* server should invalidate any cached roots and optionally re-fetch them.
|
|
11
|
+
*/
|
|
12
|
+
function rootsListChangedNotificationHandler({ scope, }) {
|
|
13
|
+
return {
|
|
14
|
+
requestSchema: types_js_1.RootsListChangedNotificationSchema,
|
|
15
|
+
handler: async (request, ctx) => {
|
|
16
|
+
const sessionId = ctx.authInfo?.sessionId;
|
|
17
|
+
if (sessionId) {
|
|
18
|
+
// Invalidate cached roots for this session
|
|
19
|
+
scope.notifications.invalidateRootsCache(sessionId);
|
|
20
|
+
}
|
|
21
|
+
// Notifications don't return a response body
|
|
22
|
+
return {};
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=roots-list-changed-notification.handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roots-list-changed-notification.handler.js","sourceRoot":"","sources":["../../../../src/transport/mcp-handlers/roots-list-changed-notification.handler.ts"],"names":[],"mappings":";;AAWA,sDAeC;AA1BD,iEAAgG;AAIhG;;;;;;GAMG;AACH,SAAwB,mCAAmC,CAAC,EAC1D,KAAK,GACa;IAClB,OAAO;QACL,aAAa,EAAE,6CAAkC;QACjD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAmB,EAAE;YAC/C,MAAM,SAAS,GAAG,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC;YAC1C,IAAI,SAAS,EAAE,CAAC;gBACd,2CAA2C;gBAC3C,KAAK,CAAC,aAAa,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;YACtD,CAAC;YACD,6CAA6C;YAC7C,OAAO,EAAE,CAAC;QACZ,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import { RootsListChangedNotificationSchema, Result } from '@modelcontextprotocol/sdk/types.js';\nimport { McpHandler, McpHandlerOptions } from './mcp-handlers.types';\nimport type { RootsListChangedNotification } from '@modelcontextprotocol/sdk/types.js';\n\n/**\n * Handler for `notifications/roots/list_changed` notification from the client.\n *\n * Per MCP 2025-11-25 spec, this notification is sent by clients that support\n * roots to indicate that the list of roots has changed. When received, the\n * server should invalidate any cached roots and optionally re-fetch them.\n */\nexport default function rootsListChangedNotificationHandler({\n scope,\n}: McpHandlerOptions): McpHandler<RootsListChangedNotification, Result> {\n return {\n requestSchema: RootsListChangedNotificationSchema,\n handler: async (request, ctx): Promise<Result> => {\n const sessionId = ctx.authInfo?.sessionId;\n if (sessionId) {\n // Invalidate cached roots for this session\n scope.notifications.invalidateRootsCache(sessionId);\n }\n // Notifications don't return a response body\n return {};\n },\n };\n}\n"]}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { SubscribeRequest, EmptyResult } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
import { McpHandlerOptions } from './mcp-handlers.types';
|
|
3
|
+
/**
|
|
4
|
+
* Handler for the resources/subscribe MCP request.
|
|
5
|
+
* Per MCP 2025-11-25 spec, this allows clients to subscribe to receive
|
|
6
|
+
* notifications when a specific resource changes.
|
|
7
|
+
*/
|
|
8
|
+
export default function SubscribeRequestHandler({ scope }: McpHandlerOptions): {
|
|
9
|
+
requestSchema: import("zod").ZodObject<{
|
|
10
|
+
method: import("zod").ZodLiteral<"resources/subscribe">;
|
|
11
|
+
params: import("zod").ZodObject<{
|
|
12
|
+
_meta: import("zod").ZodOptional<import("zod").ZodObject<{
|
|
13
|
+
progressToken: import("zod").ZodOptional<import("zod").ZodUnion<readonly [import("zod").ZodString, import("zod").ZodNumber]>>;
|
|
14
|
+
}, import("zod/v4/core").$loose>>;
|
|
15
|
+
uri: import("zod").ZodString;
|
|
16
|
+
}, import("zod/v4/core").$loose>;
|
|
17
|
+
}, import("zod/v4/core").$strip>;
|
|
18
|
+
handler: (request: SubscribeRequest, ctx: import("./mcp-handlers.types").McpRequestHandler<{
|
|
19
|
+
method: "resources/subscribe";
|
|
20
|
+
params: {
|
|
21
|
+
[x: string]: unknown;
|
|
22
|
+
uri: string;
|
|
23
|
+
_meta?: {
|
|
24
|
+
[x: string]: unknown;
|
|
25
|
+
progressToken?: string | number | undefined;
|
|
26
|
+
} | undefined;
|
|
27
|
+
};
|
|
28
|
+
}, {
|
|
29
|
+
method: string;
|
|
30
|
+
params?: {
|
|
31
|
+
[x: string]: unknown;
|
|
32
|
+
_meta?: {
|
|
33
|
+
[x: string]: unknown;
|
|
34
|
+
} | undefined;
|
|
35
|
+
} | undefined;
|
|
36
|
+
}>) => Promise<EmptyResult>;
|
|
37
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = SubscribeRequestHandler;
|
|
4
|
+
const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
|
|
5
|
+
/**
|
|
6
|
+
* Handler for the resources/subscribe MCP request.
|
|
7
|
+
* Per MCP 2025-11-25 spec, this allows clients to subscribe to receive
|
|
8
|
+
* notifications when a specific resource changes.
|
|
9
|
+
*/
|
|
10
|
+
function SubscribeRequestHandler({ scope }) {
|
|
11
|
+
return {
|
|
12
|
+
requestSchema: types_js_1.SubscribeRequestSchema,
|
|
13
|
+
handler: async (request, ctx) => {
|
|
14
|
+
const { uri } = request.params;
|
|
15
|
+
// Get session ID from auth context
|
|
16
|
+
const sessionId = ctx.authInfo?.sessionId;
|
|
17
|
+
if (!sessionId) {
|
|
18
|
+
scope.logger.warn('resources/subscribe: No session ID found in request context');
|
|
19
|
+
return {};
|
|
20
|
+
}
|
|
21
|
+
// Subscribe the session to the resource
|
|
22
|
+
const isNew = scope.notifications.subscribeResource(sessionId, uri);
|
|
23
|
+
if (isNew) {
|
|
24
|
+
scope.logger.verbose(`resources/subscribe: Session ${sessionId.slice(0, 20)}... subscribed to ${uri}`);
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
scope.logger.verbose(`resources/subscribe: Session ${sessionId.slice(0, 20)}... already subscribed to ${uri}`);
|
|
28
|
+
}
|
|
29
|
+
// Per MCP spec, return empty result
|
|
30
|
+
return {};
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=subscribe-request.handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscribe-request.handler.js","sourceRoot":"","sources":["../../../../src/transport/mcp-handlers/subscribe-request.handler.ts"],"names":[],"mappings":";;AAQA,0CA0BC;AAlCD,iEAA2G;AAG3G;;;;GAIG;AACH,SAAwB,uBAAuB,CAAC,EAAE,KAAK,EAAqB;IAC1E,OAAO;QACL,aAAa,EAAE,iCAAsB;QACrC,OAAO,EAAE,KAAK,EAAE,OAAyB,EAAE,GAAG,EAAwB,EAAE;YACtE,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;YAE/B,mCAAmC;YACnC,MAAM,SAAS,GAAG,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC;YAC1C,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;gBACjF,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,wCAAwC;YACxC,MAAM,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC,iBAAiB,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;YAEpE,IAAI,KAAK,EAAE,CAAC;gBACV,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,gCAAgC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,qBAAqB,GAAG,EAAE,CAAC,CAAC;YACzG,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,gCAAgC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,6BAA6B,GAAG,EAAE,CAAC,CAAC;YACjH,CAAC;YAED,oCAAoC;YACpC,OAAO,EAAE,CAAC;QACZ,CAAC;KACkD,CAAC;AACxD,CAAC","sourcesContent":["import { SubscribeRequestSchema, SubscribeRequest, EmptyResult } from '@modelcontextprotocol/sdk/types.js';\nimport { McpHandler, McpHandlerOptions } from './mcp-handlers.types';\n\n/**\n * Handler for the resources/subscribe MCP request.\n * Per MCP 2025-11-25 spec, this allows clients to subscribe to receive\n * notifications when a specific resource changes.\n */\nexport default function SubscribeRequestHandler({ scope }: McpHandlerOptions) {\n return {\n requestSchema: SubscribeRequestSchema,\n handler: async (request: SubscribeRequest, ctx): Promise<EmptyResult> => {\n const { uri } = request.params;\n\n // Get session ID from auth context\n const sessionId = ctx.authInfo?.sessionId;\n if (!sessionId) {\n scope.logger.warn('resources/subscribe: No session ID found in request context');\n return {};\n }\n\n // Subscribe the session to the resource\n const isNew = scope.notifications.subscribeResource(sessionId, uri);\n\n if (isNew) {\n scope.logger.verbose(`resources/subscribe: Session ${sessionId.slice(0, 20)}... subscribed to ${uri}`);\n } else {\n scope.logger.verbose(`resources/subscribe: Session ${sessionId.slice(0, 20)}... already subscribed to ${uri}`);\n }\n\n // Per MCP spec, return empty result\n return {};\n },\n } satisfies McpHandler<SubscribeRequest, EmptyResult>;\n}\n"]}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { UnsubscribeRequest, EmptyResult } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
import { McpHandlerOptions } from './mcp-handlers.types';
|
|
3
|
+
/**
|
|
4
|
+
* Handler for the resources/unsubscribe MCP request.
|
|
5
|
+
* Per MCP 2025-11-25 spec, this allows clients to unsubscribe from
|
|
6
|
+
* receiving notifications about a specific resource.
|
|
7
|
+
*/
|
|
8
|
+
export default function UnsubscribeRequestHandler({ scope }: McpHandlerOptions): {
|
|
9
|
+
requestSchema: import("zod").ZodObject<{
|
|
10
|
+
method: import("zod").ZodLiteral<"resources/unsubscribe">;
|
|
11
|
+
params: import("zod").ZodObject<{
|
|
12
|
+
_meta: import("zod").ZodOptional<import("zod").ZodObject<{
|
|
13
|
+
progressToken: import("zod").ZodOptional<import("zod").ZodUnion<readonly [import("zod").ZodString, import("zod").ZodNumber]>>;
|
|
14
|
+
}, import("zod/v4/core").$loose>>;
|
|
15
|
+
uri: import("zod").ZodString;
|
|
16
|
+
}, import("zod/v4/core").$loose>;
|
|
17
|
+
}, import("zod/v4/core").$strip>;
|
|
18
|
+
handler: (request: UnsubscribeRequest, ctx: import("./mcp-handlers.types").McpRequestHandler<{
|
|
19
|
+
method: "resources/unsubscribe";
|
|
20
|
+
params: {
|
|
21
|
+
[x: string]: unknown;
|
|
22
|
+
uri: string;
|
|
23
|
+
_meta?: {
|
|
24
|
+
[x: string]: unknown;
|
|
25
|
+
progressToken?: string | number | undefined;
|
|
26
|
+
} | undefined;
|
|
27
|
+
};
|
|
28
|
+
}, {
|
|
29
|
+
method: string;
|
|
30
|
+
params?: {
|
|
31
|
+
[x: string]: unknown;
|
|
32
|
+
_meta?: {
|
|
33
|
+
[x: string]: unknown;
|
|
34
|
+
} | undefined;
|
|
35
|
+
} | undefined;
|
|
36
|
+
}>) => Promise<EmptyResult>;
|
|
37
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = UnsubscribeRequestHandler;
|
|
4
|
+
const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
|
|
5
|
+
/**
|
|
6
|
+
* Handler for the resources/unsubscribe MCP request.
|
|
7
|
+
* Per MCP 2025-11-25 spec, this allows clients to unsubscribe from
|
|
8
|
+
* receiving notifications about a specific resource.
|
|
9
|
+
*/
|
|
10
|
+
function UnsubscribeRequestHandler({ scope }) {
|
|
11
|
+
return {
|
|
12
|
+
requestSchema: types_js_1.UnsubscribeRequestSchema,
|
|
13
|
+
handler: async (request, ctx) => {
|
|
14
|
+
const { uri } = request.params;
|
|
15
|
+
// Get session ID from auth context
|
|
16
|
+
const sessionId = ctx.authInfo?.sessionId;
|
|
17
|
+
if (!sessionId) {
|
|
18
|
+
scope.logger.warn('resources/unsubscribe: No session ID found in request context');
|
|
19
|
+
return {};
|
|
20
|
+
}
|
|
21
|
+
// Unsubscribe the session from the resource
|
|
22
|
+
const wasSubscribed = scope.notifications.unsubscribeResource(sessionId, uri);
|
|
23
|
+
if (wasSubscribed) {
|
|
24
|
+
scope.logger.verbose(`resources/unsubscribe: Session ${sessionId.slice(0, 20)}... unsubscribed from ${uri}`);
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
scope.logger.verbose(`resources/unsubscribe: Session ${sessionId.slice(0, 20)}... was not subscribed to ${uri}`);
|
|
28
|
+
}
|
|
29
|
+
// Per MCP spec, return empty result
|
|
30
|
+
return {};
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=unsubscribe-request.handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unsubscribe-request.handler.js","sourceRoot":"","sources":["../../../../src/transport/mcp-handlers/unsubscribe-request.handler.ts"],"names":[],"mappings":";;AAQA,4CA4BC;AApCD,iEAA+G;AAG/G;;;;GAIG;AACH,SAAwB,yBAAyB,CAAC,EAAE,KAAK,EAAqB;IAC5E,OAAO;QACL,aAAa,EAAE,mCAAwB;QACvC,OAAO,EAAE,KAAK,EAAE,OAA2B,EAAE,GAAG,EAAwB,EAAE;YACxE,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;YAE/B,mCAAmC;YACnC,MAAM,SAAS,GAAG,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC;YAC1C,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;gBACnF,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,4CAA4C;YAC5C,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC,mBAAmB,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;YAE9E,IAAI,aAAa,EAAE,CAAC;gBAClB,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,kCAAkC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,yBAAyB,GAAG,EAAE,CAAC,CAAC;YAC/G,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,MAAM,CAAC,OAAO,CAClB,kCAAkC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,6BAA6B,GAAG,EAAE,CAC3F,CAAC;YACJ,CAAC;YAED,oCAAoC;YACpC,OAAO,EAAE,CAAC;QACZ,CAAC;KACoD,CAAC;AAC1D,CAAC","sourcesContent":["import { UnsubscribeRequestSchema, UnsubscribeRequest, EmptyResult } from '@modelcontextprotocol/sdk/types.js';\nimport { McpHandler, McpHandlerOptions } from './mcp-handlers.types';\n\n/**\n * Handler for the resources/unsubscribe MCP request.\n * Per MCP 2025-11-25 spec, this allows clients to unsubscribe from\n * receiving notifications about a specific resource.\n */\nexport default function UnsubscribeRequestHandler({ scope }: McpHandlerOptions) {\n return {\n requestSchema: UnsubscribeRequestSchema,\n handler: async (request: UnsubscribeRequest, ctx): Promise<EmptyResult> => {\n const { uri } = request.params;\n\n // Get session ID from auth context\n const sessionId = ctx.authInfo?.sessionId;\n if (!sessionId) {\n scope.logger.warn('resources/unsubscribe: No session ID found in request context');\n return {};\n }\n\n // Unsubscribe the session from the resource\n const wasSubscribed = scope.notifications.unsubscribeResource(sessionId, uri);\n\n if (wasSubscribed) {\n scope.logger.verbose(`resources/unsubscribe: Session ${sessionId.slice(0, 20)}... unsubscribed from ${uri}`);\n } else {\n scope.logger.verbose(\n `resources/unsubscribe: Session ${sessionId.slice(0, 20)}... was not subscribed to ${uri}`,\n );\n }\n\n // Per MCP spec, return empty result\n return {};\n },\n } satisfies McpHandler<UnsubscribeRequest, EmptyResult>;\n}\n"]}
|
|
@@ -22,6 +22,9 @@ class LocalTransporter {
|
|
|
22
22
|
this.adapter = new transport_sse_adapter_1.TransportSSEAdapter(scope, key, onDispose ?? defaultOnDispose, res);
|
|
23
23
|
break;
|
|
24
24
|
case 'streamable-http':
|
|
25
|
+
case 'stateless-http':
|
|
26
|
+
// Both streamable-http and stateless-http use the same underlying adapter
|
|
27
|
+
// The difference is in how the transport is managed (singleton vs per-session)
|
|
25
28
|
this.adapter = new transport_streamable_http_adapter_1.TransportStreamableHttpAdapter(scope, key, onDispose ?? defaultOnDispose, res);
|
|
26
29
|
break;
|
|
27
30
|
default:
|
|
@@ -36,7 +39,8 @@ class LocalTransporter {
|
|
|
36
39
|
await this.adapter.handleRequest(req, res);
|
|
37
40
|
}
|
|
38
41
|
catch (err) {
|
|
39
|
-
|
|
42
|
+
// Use safe logging to avoid Node.js 24 util.inspect bug with Zod errors
|
|
43
|
+
console.error('MCP POST error:', err instanceof Error ? err.message : 'Unknown error');
|
|
40
44
|
res.status(500).json((0, transport_error_1.rpcError)('Internal error'));
|
|
41
45
|
}
|
|
42
46
|
}
|
|
@@ -49,7 +53,8 @@ class LocalTransporter {
|
|
|
49
53
|
return this.adapter.initialize(req, res);
|
|
50
54
|
}
|
|
51
55
|
catch (err) {
|
|
52
|
-
|
|
56
|
+
// Use safe logging to avoid Node.js 24 util.inspect bug with Zod errors
|
|
57
|
+
console.error('MCP POST error:', err instanceof Error ? err.message : 'Unknown error');
|
|
53
58
|
res.status(500).json((0, transport_error_1.rpcError)('Internal error'));
|
|
54
59
|
}
|
|
55
60
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.local.js","sourceRoot":"","sources":["../../../src/transport/transport.local.ts"],"names":[],"mappings":";;;AAEA,4EAAuE;AACvE,oGAA8F;AAC9F,uDAA6C;AAO7C,MAAa,gBAAgB;IAOwD;IAN1E,IAAI,CAAgB;IACpB,SAAS,CAAS;IAClB,SAAS,CAAS;IAEnB,OAAO,CAA4E;IAE3F,YAAY,KAAY,EAAE,GAAiB,EAAE,GAAmB,EAAmB,SAAsB;QAAtB,cAAS,GAAT,SAAS,CAAa;QACvG,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC;QAE/B,MAAM,gBAAgB,GAAG,GAAG,EAAE;YAC5B,WAAW;QACb,CAAC,CAAC;QAEF,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,KAAK;gBACR,IAAI,CAAC,OAAO,GAAG,IAAI,2CAAmB,CAAC,KAAK,EAAE,GAAG,EAAE,SAAS,IAAI,gBAAgB,EAAE,GAAG,CAAC,CAAC;gBACvF,MAAM;YACR,KAAK,iBAAiB;
|
|
1
|
+
{"version":3,"file":"transport.local.js","sourceRoot":"","sources":["../../../src/transport/transport.local.ts"],"names":[],"mappings":";;;AAEA,4EAAuE;AACvE,oGAA8F;AAC9F,uDAA6C;AAO7C,MAAa,gBAAgB;IAOwD;IAN1E,IAAI,CAAgB;IACpB,SAAS,CAAS;IAClB,SAAS,CAAS;IAEnB,OAAO,CAA4E;IAE3F,YAAY,KAAY,EAAE,GAAiB,EAAE,GAAmB,EAAmB,SAAsB;QAAtB,cAAS,GAAT,SAAS,CAAa;QACvG,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC;QAE/B,MAAM,gBAAgB,GAAG,GAAG,EAAE;YAC5B,WAAW;QACb,CAAC,CAAC;QAEF,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,KAAK;gBACR,IAAI,CAAC,OAAO,GAAG,IAAI,2CAAmB,CAAC,KAAK,EAAE,GAAG,EAAE,SAAS,IAAI,gBAAgB,EAAE,GAAG,CAAC,CAAC;gBACvF,MAAM;YACR,KAAK,iBAAiB,CAAC;YACvB,KAAK,gBAAgB;gBACnB,0EAA0E;gBAC1E,+EAA+E;gBAC/E,IAAI,CAAC,OAAO,GAAG,IAAI,kEAA8B,CAAC,KAAK,EAAE,GAAG,EAAE,SAAS,IAAI,gBAAgB,EAAE,GAAG,CAAC,CAAC;gBAClG,MAAM;YACR;gBACE,MAAM,IAAI,KAAK,CAAC,+BAA+B,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED,IAAI,CAAC,SAAkB;QACrB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,GAA+B,EAAE,GAAmB;QACtE,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,wEAAwE;YACxE,OAAO,CAAC,KAAK,CAAC,iBAAiB,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;YACvF,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAA,0BAAQ,EAAC,gBAAgB,CAAC,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,GAA+B,EAAE,GAAmB;QACnE,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;YACzB,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,wEAAwE;YACxE,OAAO,CAAC,KAAK,CAAC,iBAAiB,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;YACvF,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAA,0BAAQ,EAAC,gBAAgB,CAAC,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAc;QAC1B,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACrC,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;QACrB,CAAC;IACH,CAAC;CACF;AAlED,4CAkEC","sourcesContent":["import { Transporter, TransportKey, TransportType } from './transport.types';\nimport { AuthenticatedServerRequest } from '../server/server.types';\nimport { TransportSSEAdapter } from './adapters/transport.sse.adapter';\nimport { TransportStreamableHttpAdapter } from './adapters/transport.streamable-http.adapter';\nimport { rpcError } from './transport.error';\nimport { LocalTransportAdapter } from './adapters/transport.local.adapter';\nimport { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';\nimport { SSEServerTransport } from './legacy/legacy.sse.tranporter';\nimport { ServerResponse } from '../common';\nimport { Scope } from '../scope';\n\nexport class LocalTransporter implements Transporter {\n readonly type: TransportType;\n readonly tokenHash: string;\n readonly sessionId: string;\n\n private adapter: LocalTransportAdapter<StreamableHTTPServerTransport | SSEServerTransport>;\n\n constructor(scope: Scope, key: TransportKey, res: ServerResponse, private readonly onDispose?: () => void) {\n this.type = key.type;\n this.tokenHash = key.tokenHash;\n\n const defaultOnDispose = () => {\n /* empty */\n };\n\n switch (this.type) {\n case 'sse':\n this.adapter = new TransportSSEAdapter(scope, key, onDispose ?? defaultOnDispose, res);\n break;\n case 'streamable-http':\n case 'stateless-http':\n // Both streamable-http and stateless-http use the same underlying adapter\n // The difference is in how the transport is managed (singleton vs per-session)\n this.adapter = new TransportStreamableHttpAdapter(scope, key, onDispose ?? defaultOnDispose, res);\n break;\n default:\n throw new Error(`Unsupported transport type: ${this.type}`);\n }\n }\n\n ping(timeoutMs?: number): Promise<boolean> {\n throw new Error('Method not implemented.');\n }\n\n async handleRequest(req: AuthenticatedServerRequest, res: ServerResponse): Promise<void> {\n try {\n await this.adapter.handleRequest(req, res);\n } catch (err) {\n // Use safe logging to avoid Node.js 24 util.inspect bug with Zod errors\n console.error('MCP POST error:', err instanceof Error ? err.message : 'Unknown error');\n res.status(500).json(rpcError('Internal error'));\n }\n }\n\n async ready(): Promise<void> {\n return this.adapter.ready;\n }\n\n async initialize(req: AuthenticatedServerRequest, res: ServerResponse): Promise<void> {\n try {\n await this.adapter.ready;\n return this.adapter.initialize(req, res);\n } catch (err) {\n // Use safe logging to avoid Node.js 24 util.inspect bug with Zod errors\n console.error('MCP POST error:', err instanceof Error ? err.message : 'Unknown error');\n res.status(500).json(rpcError('Internal error'));\n }\n }\n\n async destroy(reason: string): Promise<void> {\n try {\n await this.adapter.destroy(reason);\n } finally {\n this.onDispose?.();\n }\n }\n}\n"]}
|
|
@@ -7,12 +7,42 @@ export declare class TransportService {
|
|
|
7
7
|
private readonly distributed;
|
|
8
8
|
private readonly bus?;
|
|
9
9
|
private readonly scope;
|
|
10
|
+
/**
|
|
11
|
+
* Session history cache for tracking if sessions were ever created.
|
|
12
|
+
* Used to differentiate between "session never initialized" (HTTP 400) and
|
|
13
|
+
* "session expired/terminated" (HTTP 404) per MCP Spec 2025-11-25.
|
|
14
|
+
*
|
|
15
|
+
* Key: "type:tokenHash:sessionId", Value: creation timestamp
|
|
16
|
+
*/
|
|
17
|
+
private readonly sessionHistory;
|
|
18
|
+
private readonly MAX_SESSION_HISTORY;
|
|
10
19
|
constructor(scope: Scope);
|
|
11
20
|
private initialize;
|
|
12
21
|
destroy(): Promise<void>;
|
|
13
22
|
getTransporter(type: TransportType, token: string, sessionId: string): Promise<Transporter | undefined>;
|
|
14
23
|
createTransporter(type: TransportType, token: string, sessionId: string, res: ServerResponse): Promise<Transporter>;
|
|
15
24
|
destroyTransporter(type: TransportType, token: string, sessionId: string, reason?: string): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Get or create a shared singleton transport for anonymous stateless requests.
|
|
27
|
+
* All anonymous requests share the same transport instance.
|
|
28
|
+
*/
|
|
29
|
+
getOrCreateAnonymousStatelessTransport(type: TransportType, res: ServerResponse): Promise<Transporter>;
|
|
30
|
+
/**
|
|
31
|
+
* Get or create a singleton transport for authenticated stateless requests.
|
|
32
|
+
* Each unique token gets its own singleton transport.
|
|
33
|
+
*/
|
|
34
|
+
getOrCreateAuthenticatedStatelessTransport(type: TransportType, token: string, res: ServerResponse): Promise<Transporter>;
|
|
35
|
+
/**
|
|
36
|
+
* Check if a session was ever created (even if it's been terminated/evicted).
|
|
37
|
+
* Used to differentiate between "session never initialized" (HTTP 400) and
|
|
38
|
+
* "session expired/terminated" (HTTP 404) per MCP Spec 2025-11-25.
|
|
39
|
+
*
|
|
40
|
+
* @param type - Transport type (e.g., 'streamable-http', 'sse')
|
|
41
|
+
* @param token - The authorization token
|
|
42
|
+
* @param sessionId - The session ID to check
|
|
43
|
+
* @returns true if session was ever created, false otherwise
|
|
44
|
+
*/
|
|
45
|
+
wasSessionCreated(type: TransportType, token: string, sessionId: string): boolean;
|
|
16
46
|
private sha256;
|
|
17
47
|
private keyOf;
|
|
18
48
|
private ensureTypeBucket;
|
|
@@ -8,12 +8,22 @@ const transport_remote_1 = require("./transport.remote");
|
|
|
8
8
|
const transport_local_1 = require("./transport.local");
|
|
9
9
|
const handle_streamable_http_flow_1 = tslib_1.__importDefault(require("./flows/handle.streamable-http.flow"));
|
|
10
10
|
const handle_sse_flow_1 = tslib_1.__importDefault(require("./flows/handle.sse.flow"));
|
|
11
|
+
const handle_stateless_http_flow_1 = tslib_1.__importDefault(require("./flows/handle.stateless-http.flow"));
|
|
11
12
|
class TransportService {
|
|
12
13
|
ready;
|
|
13
14
|
byType = new Map();
|
|
14
15
|
distributed;
|
|
15
16
|
bus;
|
|
16
17
|
scope;
|
|
18
|
+
/**
|
|
19
|
+
* Session history cache for tracking if sessions were ever created.
|
|
20
|
+
* Used to differentiate between "session never initialized" (HTTP 400) and
|
|
21
|
+
* "session expired/terminated" (HTTP 404) per MCP Spec 2025-11-25.
|
|
22
|
+
*
|
|
23
|
+
* Key: "type:tokenHash:sessionId", Value: creation timestamp
|
|
24
|
+
*/
|
|
25
|
+
sessionHistory = new Map();
|
|
26
|
+
MAX_SESSION_HISTORY = 10000;
|
|
17
27
|
constructor(scope) {
|
|
18
28
|
this.scope = scope;
|
|
19
29
|
this.distributed = false; // get from scope metadata
|
|
@@ -24,7 +34,7 @@ class TransportService {
|
|
|
24
34
|
this.ready = this.initialize();
|
|
25
35
|
}
|
|
26
36
|
async initialize() {
|
|
27
|
-
await this.scope.registryFlows(handle_streamable_http_flow_1.default, handle_sse_flow_1.default);
|
|
37
|
+
await this.scope.registryFlows(handle_streamable_http_flow_1.default, handle_sse_flow_1.default, handle_stateless_http_flow_1.default);
|
|
28
38
|
}
|
|
29
39
|
async destroy() {
|
|
30
40
|
/* empty */
|
|
@@ -77,6 +87,67 @@ class TransportService {
|
|
|
77
87
|
}
|
|
78
88
|
throw new Error('Invalid session: cannot destroy non-existent transporter.');
|
|
79
89
|
}
|
|
90
|
+
/**
|
|
91
|
+
* Get or create a shared singleton transport for anonymous stateless requests.
|
|
92
|
+
* All anonymous requests share the same transport instance.
|
|
93
|
+
*/
|
|
94
|
+
async getOrCreateAnonymousStatelessTransport(type, res) {
|
|
95
|
+
const key = this.keyOf(type, '__anonymous__', '__stateless__');
|
|
96
|
+
const existing = this.lookupLocal(key);
|
|
97
|
+
if (existing)
|
|
98
|
+
return existing;
|
|
99
|
+
// Create shared transport for all anonymous requests
|
|
100
|
+
const transporter = new transport_local_1.LocalTransporter(this.scope, key, res, () => {
|
|
101
|
+
this.evictLocal(key);
|
|
102
|
+
if (this.distributed && this.bus) {
|
|
103
|
+
this.bus.revoke(key).catch(() => void 0);
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
await transporter.ready();
|
|
107
|
+
this.insertLocal(key, transporter);
|
|
108
|
+
if (this.distributed && this.bus) {
|
|
109
|
+
await this.bus.advertise(key);
|
|
110
|
+
}
|
|
111
|
+
return transporter;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Get or create a singleton transport for authenticated stateless requests.
|
|
115
|
+
* Each unique token gets its own singleton transport.
|
|
116
|
+
*/
|
|
117
|
+
async getOrCreateAuthenticatedStatelessTransport(type, token, res) {
|
|
118
|
+
const key = this.keyOf(type, token, '__stateless__');
|
|
119
|
+
const existing = this.lookupLocal(key);
|
|
120
|
+
if (existing)
|
|
121
|
+
return existing;
|
|
122
|
+
// Create singleton transport for this token
|
|
123
|
+
const transporter = new transport_local_1.LocalTransporter(this.scope, key, res, () => {
|
|
124
|
+
this.evictLocal(key);
|
|
125
|
+
if (this.distributed && this.bus) {
|
|
126
|
+
this.bus.revoke(key).catch(() => void 0);
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
await transporter.ready();
|
|
130
|
+
this.insertLocal(key, transporter);
|
|
131
|
+
if (this.distributed && this.bus) {
|
|
132
|
+
await this.bus.advertise(key);
|
|
133
|
+
}
|
|
134
|
+
return transporter;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Check if a session was ever created (even if it's been terminated/evicted).
|
|
138
|
+
* Used to differentiate between "session never initialized" (HTTP 400) and
|
|
139
|
+
* "session expired/terminated" (HTTP 404) per MCP Spec 2025-11-25.
|
|
140
|
+
*
|
|
141
|
+
* @param type - Transport type (e.g., 'streamable-http', 'sse')
|
|
142
|
+
* @param token - The authorization token
|
|
143
|
+
* @param sessionId - The session ID to check
|
|
144
|
+
* @returns true if session was ever created, false otherwise
|
|
145
|
+
*/
|
|
146
|
+
wasSessionCreated(type, token, sessionId) {
|
|
147
|
+
const tokenHash = this.sha256(token);
|
|
148
|
+
const historyKey = `${type}:${tokenHash}:${sessionId}`;
|
|
149
|
+
return this.sessionHistory.has(historyKey);
|
|
150
|
+
}
|
|
80
151
|
/* --------------------------------- internals -------------------------------- */
|
|
81
152
|
sha256(value) {
|
|
82
153
|
return (0, crypto_1.createHash)('sha256').update(value, 'utf8').digest('hex');
|
|
@@ -119,6 +190,18 @@ class TransportService {
|
|
|
119
190
|
const typeBucket = this.ensureTypeBucket(key.type);
|
|
120
191
|
const tokenBucket = this.ensureTokenBucket(typeBucket, key.tokenHash);
|
|
121
192
|
tokenBucket.set(key.sessionId, t);
|
|
193
|
+
// Record session creation in history for HTTP 404 detection
|
|
194
|
+
const historyKey = `${key.type}:${key.tokenHash}:${key.sessionId}`;
|
|
195
|
+
this.sessionHistory.set(historyKey, Date.now());
|
|
196
|
+
// Evict oldest entries if cache exceeds max size (LRU-like eviction)
|
|
197
|
+
if (this.sessionHistory.size > this.MAX_SESSION_HISTORY) {
|
|
198
|
+
const entries = [...this.sessionHistory.entries()].sort((a, b) => a[1] - b[1]);
|
|
199
|
+
// Remove oldest 10% of entries
|
|
200
|
+
const toEvict = Math.ceil(this.MAX_SESSION_HISTORY * 0.1);
|
|
201
|
+
for (let i = 0; i < toEvict && i < entries.length; i++) {
|
|
202
|
+
this.sessionHistory.delete(entries[i][0]);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
122
205
|
}
|
|
123
206
|
evictLocal(key) {
|
|
124
207
|
const typeBucket = this.byType.get(key.type);
|