@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
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* UI Resource Handler
|
|
4
|
+
*
|
|
5
|
+
* Handles resources/read requests for ui:// URIs, serving widget HTML
|
|
6
|
+
* from the ToolUIRegistry.
|
|
7
|
+
*
|
|
8
|
+
* Supported URI format:
|
|
9
|
+
* - ui://widget/{toolName}.html - Static widget HTML (pre-compiled at startup)
|
|
10
|
+
*
|
|
11
|
+
* The static widget is registered at server startup for tools with
|
|
12
|
+
* `servingMode: 'static'`. The widget HTML includes the FrontMCP Bridge
|
|
13
|
+
* which reads tool output from the platform context at runtime.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* // Client requests widget HTML (OpenAI discovery)
|
|
18
|
+
* const result = await client.readResource({
|
|
19
|
+
* uri: 'ui://widget/get_weather.html'
|
|
20
|
+
* });
|
|
21
|
+
*
|
|
22
|
+
* // Returns pre-compiled widget with FrontMCP Bridge
|
|
23
|
+
* // Widget reads tool output from window.openai.toolOutput at runtime
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
27
|
+
exports.handleUIResourceRead = handleUIResourceRead;
|
|
28
|
+
exports.createUIResourceHandler = createUIResourceHandler;
|
|
29
|
+
const ui_1 = require("@frontmcp/ui");
|
|
30
|
+
const registry_1 = require("@frontmcp/ui/registry");
|
|
31
|
+
/**
|
|
32
|
+
* Generate a placeholder widget HTML that reads from window.openai.toolOutput.
|
|
33
|
+
*
|
|
34
|
+
* Delegates to @frontmcp/ui's createDefaultBaseTemplate which provides:
|
|
35
|
+
* - Tailwind CSS with @theme configuration
|
|
36
|
+
* - Platform polyfills (callTool, detectMcpSession, getToolOutput)
|
|
37
|
+
* - Polling for toolOutput injection
|
|
38
|
+
* - Default JSON renderer (data-type-specific renderers are in @frontmcp/ui)
|
|
39
|
+
*
|
|
40
|
+
* This is returned when the static widget URI is fetched before the tool is called.
|
|
41
|
+
* OpenAI caches this HTML, so it must be dynamic (read toolOutput at runtime).
|
|
42
|
+
*
|
|
43
|
+
* @param toolName - The name of the tool
|
|
44
|
+
* @returns HTML string with a dynamic widget that renders toolOutput
|
|
45
|
+
*/
|
|
46
|
+
function generatePlaceholderWidget(toolName) {
|
|
47
|
+
return (0, ui_1.createDefaultBaseTemplate)({ toolName });
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Handle a UI resource read request
|
|
51
|
+
*
|
|
52
|
+
* @param uri - The UI resource URI
|
|
53
|
+
* @param registry - The ToolUIRegistry containing cached HTML
|
|
54
|
+
* @param platformType - Optional platform type for dynamic MIME type selection
|
|
55
|
+
* @returns Handle result with content or error
|
|
56
|
+
*/
|
|
57
|
+
function handleUIResourceRead(uri, registry, platformType) {
|
|
58
|
+
// Check if this is a UI resource URI
|
|
59
|
+
if (!(0, registry_1.isUIResourceUri)(uri)) {
|
|
60
|
+
return { handled: false };
|
|
61
|
+
}
|
|
62
|
+
// Get the platform-appropriate MIME type
|
|
63
|
+
const mimeType = (0, registry_1.getUIResourceMimeType)(platformType);
|
|
64
|
+
// Try static widget URI (ui://widget/{toolName}.html)
|
|
65
|
+
// This is used by OpenAI at discovery time
|
|
66
|
+
const widgetParsed = (0, registry_1.parseWidgetUri)(uri);
|
|
67
|
+
if (widgetParsed) {
|
|
68
|
+
// Check for pre-compiled static widget from the developer's template
|
|
69
|
+
// Static widgets are compiled at server startup for tools with servingMode: 'static'
|
|
70
|
+
const cachedWidget = registry.getStaticWidget(widgetParsed.toolName);
|
|
71
|
+
if (cachedWidget) {
|
|
72
|
+
// Return the developer's actual template (SSR'd React/MDX component)
|
|
73
|
+
// This template includes the FrontMCP Bridge for runtime data access
|
|
74
|
+
return {
|
|
75
|
+
handled: true,
|
|
76
|
+
result: {
|
|
77
|
+
contents: [
|
|
78
|
+
{
|
|
79
|
+
uri,
|
|
80
|
+
mimeType,
|
|
81
|
+
text: cachedWidget,
|
|
82
|
+
},
|
|
83
|
+
],
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
// Fallback to dynamic placeholder widget if no pre-compiled template.
|
|
88
|
+
// This is returned when the tool doesn't have a UI template configured
|
|
89
|
+
// or uses a different serving mode.
|
|
90
|
+
//
|
|
91
|
+
// OpenAI caches widget HTML from outputTemplate URI, so we must return
|
|
92
|
+
// a template that reads from window.openai.toolOutput at runtime.
|
|
93
|
+
const html = generatePlaceholderWidget(widgetParsed.toolName);
|
|
94
|
+
return {
|
|
95
|
+
handled: true,
|
|
96
|
+
result: {
|
|
97
|
+
contents: [
|
|
98
|
+
{
|
|
99
|
+
uri,
|
|
100
|
+
mimeType,
|
|
101
|
+
text: html,
|
|
102
|
+
},
|
|
103
|
+
],
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
// Unknown UI resource URI format
|
|
108
|
+
return {
|
|
109
|
+
handled: true,
|
|
110
|
+
error: `Invalid UI resource URI format: ${uri}. Expected: ui://widget/{toolName}.html`,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Create a UI resource handler function
|
|
115
|
+
*
|
|
116
|
+
* @param options - Handler options
|
|
117
|
+
* @returns Handler function that can be used in the read-resource flow
|
|
118
|
+
*/
|
|
119
|
+
function createUIResourceHandler(options) {
|
|
120
|
+
const { registry, onError } = options;
|
|
121
|
+
return function handleUIResource(uri) {
|
|
122
|
+
const result = handleUIResourceRead(uri, registry);
|
|
123
|
+
if (result.handled && result.error && onError) {
|
|
124
|
+
onError(result.error, uri);
|
|
125
|
+
}
|
|
126
|
+
return result;
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=ui-resource.handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-resource.handler.js","sourceRoot":"","sources":["../../../../src/tool/ui/ui-resource.handler.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;;AAkEH,oDAgEC;AAkBD,0DAYC;AA5JD,qCAAyD;AACzD,oDAQ+B;AA0B/B;;;;;;;;;;;;;;GAcG;AACH,SAAS,yBAAyB,CAAC,QAAgB;IACjD,OAAO,IAAA,8BAAyB,EAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;AACjD,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,oBAAoB,CAClC,GAAW,EACX,QAAwB,EACxB,YAA6B;IAE7B,qCAAqC;IACrC,IAAI,CAAC,IAAA,0BAAe,EAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED,yCAAyC;IACzC,MAAM,QAAQ,GAAG,IAAA,gCAAqB,EAAC,YAAY,CAAC,CAAC;IAErD,sDAAsD;IACtD,2CAA2C;IAC3C,MAAM,YAAY,GAAG,IAAA,yBAAc,EAAC,GAAG,CAAC,CAAC;IACzC,IAAI,YAAY,EAAE,CAAC;QACjB,qEAAqE;QACrE,qFAAqF;QACrF,MAAM,YAAY,GAAG,QAAQ,CAAC,eAAe,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QACrE,IAAI,YAAY,EAAE,CAAC;YACjB,qEAAqE;YACrE,qEAAqE;YACrE,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE;oBACN,QAAQ,EAAE;wBACR;4BACE,GAAG;4BACH,QAAQ;4BACR,IAAI,EAAE,YAAY;yBACnB;qBACF;iBACF;aACF,CAAC;QACJ,CAAC;QAED,sEAAsE;QACtE,uEAAuE;QACvE,oCAAoC;QACpC,EAAE;QACF,uEAAuE;QACvE,kEAAkE;QAClE,MAAM,IAAI,GAAG,yBAAyB,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAE9D,OAAO;YACL,OAAO,EAAE,IAAI;YACb,MAAM,EAAE;gBACN,QAAQ,EAAE;oBACR;wBACE,GAAG;wBACH,QAAQ;wBACR,IAAI,EAAE,IAAI;qBACX;iBACF;aACF;SACF,CAAC;IACJ,CAAC;IAED,iCAAiC;IACjC,OAAO;QACL,OAAO,EAAE,IAAI;QACb,KAAK,EAAE,mCAAmC,GAAG,yCAAyC;KACvF,CAAC;AACJ,CAAC;AAYD;;;;;GAKG;AACH,SAAgB,uBAAuB,CAAC,OAAiC;IACvE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAEtC,OAAO,SAAS,gBAAgB,CAAC,GAAW;QAC1C,MAAM,MAAM,GAAG,oBAAoB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAEnD,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,IAAI,OAAO,EAAE,CAAC;YAC9C,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC7B,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC","sourcesContent":["/**\n * UI Resource Handler\n *\n * Handles resources/read requests for ui:// URIs, serving widget HTML\n * from the ToolUIRegistry.\n *\n * Supported URI format:\n * - ui://widget/{toolName}.html - Static widget HTML (pre-compiled at startup)\n *\n * The static widget is registered at server startup for tools with\n * `servingMode: 'static'`. The widget HTML includes the FrontMCP Bridge\n * which reads tool output from the platform context at runtime.\n *\n * @example\n * ```typescript\n * // Client requests widget HTML (OpenAI discovery)\n * const result = await client.readResource({\n * uri: 'ui://widget/get_weather.html'\n * });\n *\n * // Returns pre-compiled widget with FrontMCP Bridge\n * // Widget reads tool output from window.openai.toolOutput at runtime\n * ```\n */\n\nimport type { ReadResourceResult } from '@modelcontextprotocol/sdk/types.js';\nimport type { AIPlatformType } from '../../notification/notification.service';\nimport { createDefaultBaseTemplate } from '@frontmcp/ui';\nimport {\n type ToolUIRegistry,\n UI_RESOURCE_SCHEME,\n isUIResourceUri,\n isStaticWidgetUri,\n parseWidgetUri,\n getUIResourceMimeType,\n type ParsedWidgetUri,\n} from '@frontmcp/ui/registry';\n\n/**\n * Result of handling a UI resource request\n */\nexport interface UIResourceHandleResult {\n /** Whether the URI was handled */\n handled: boolean;\n /** The resource result if handled successfully */\n result?: ReadResourceResult;\n /** Error message if handling failed */\n error?: string;\n}\n\n/**\n * Options for handling a UI resource read request\n */\nexport interface HandleUIResourceOptions {\n /** The UI resource URI */\n uri: string;\n /** The ToolUIRegistry containing cached HTML */\n registry: ToolUIRegistry;\n /** Platform type of the connected client */\n platformType?: AIPlatformType;\n}\n\n/**\n * Generate a placeholder widget HTML that reads from window.openai.toolOutput.\n *\n * Delegates to @frontmcp/ui's createDefaultBaseTemplate which provides:\n * - Tailwind CSS with @theme configuration\n * - Platform polyfills (callTool, detectMcpSession, getToolOutput)\n * - Polling for toolOutput injection\n * - Default JSON renderer (data-type-specific renderers are in @frontmcp/ui)\n *\n * This is returned when the static widget URI is fetched before the tool is called.\n * OpenAI caches this HTML, so it must be dynamic (read toolOutput at runtime).\n *\n * @param toolName - The name of the tool\n * @returns HTML string with a dynamic widget that renders toolOutput\n */\nfunction generatePlaceholderWidget(toolName: string): string {\n return createDefaultBaseTemplate({ toolName });\n}\n\n/**\n * Handle a UI resource read request\n *\n * @param uri - The UI resource URI\n * @param registry - The ToolUIRegistry containing cached HTML\n * @param platformType - Optional platform type for dynamic MIME type selection\n * @returns Handle result with content or error\n */\nexport function handleUIResourceRead(\n uri: string,\n registry: ToolUIRegistry,\n platformType?: AIPlatformType,\n): UIResourceHandleResult {\n // Check if this is a UI resource URI\n if (!isUIResourceUri(uri)) {\n return { handled: false };\n }\n\n // Get the platform-appropriate MIME type\n const mimeType = getUIResourceMimeType(platformType);\n\n // Try static widget URI (ui://widget/{toolName}.html)\n // This is used by OpenAI at discovery time\n const widgetParsed = parseWidgetUri(uri);\n if (widgetParsed) {\n // Check for pre-compiled static widget from the developer's template\n // Static widgets are compiled at server startup for tools with servingMode: 'static'\n const cachedWidget = registry.getStaticWidget(widgetParsed.toolName);\n if (cachedWidget) {\n // Return the developer's actual template (SSR'd React/MDX component)\n // This template includes the FrontMCP Bridge for runtime data access\n return {\n handled: true,\n result: {\n contents: [\n {\n uri,\n mimeType,\n text: cachedWidget,\n },\n ],\n },\n };\n }\n\n // Fallback to dynamic placeholder widget if no pre-compiled template.\n // This is returned when the tool doesn't have a UI template configured\n // or uses a different serving mode.\n //\n // OpenAI caches widget HTML from outputTemplate URI, so we must return\n // a template that reads from window.openai.toolOutput at runtime.\n const html = generatePlaceholderWidget(widgetParsed.toolName);\n\n return {\n handled: true,\n result: {\n contents: [\n {\n uri,\n mimeType,\n text: html,\n },\n ],\n },\n };\n }\n\n // Unknown UI resource URI format\n return {\n handled: true,\n error: `Invalid UI resource URI format: ${uri}. Expected: ui://widget/{toolName}.html`,\n };\n}\n\n/**\n * Options for creating a UI resource handler\n */\nexport interface UIResourceHandlerOptions {\n /** ToolUIRegistry instance */\n registry: ToolUIRegistry;\n /** Optional custom error handler */\n onError?: (error: string, uri: string) => void;\n}\n\n/**\n * Create a UI resource handler function\n *\n * @param options - Handler options\n * @returns Handler function that can be used in the read-resource flow\n */\nexport function createUIResourceHandler(options: UIResourceHandlerOptions) {\n const { registry, onError } = options;\n\n return function handleUIResource(uri: string): UIResourceHandleResult {\n const result = handleUIResourceRead(uri, registry);\n\n if (result.handled && result.error && onError) {\n onError(result.error, uri);\n }\n\n return result;\n };\n}\n"]}
|
|
@@ -6,7 +6,7 @@ import { InMemoryEventStore } from '../transport.event-store';
|
|
|
6
6
|
import { AuthInfo } from '@modelcontextprotocol/sdk/server/auth/types.js';
|
|
7
7
|
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
8
8
|
import { SSEServerTransport } from '../legacy/legacy.sse.tranporter';
|
|
9
|
-
import {
|
|
9
|
+
import { ZodType } from 'zod';
|
|
10
10
|
import { FrontMcpLogger, ServerResponse } from '../../common';
|
|
11
11
|
import { Scope } from '../../scope';
|
|
12
12
|
export declare abstract class LocalTransportAdapter<T extends StreamableHTTPServerTransport | SSEServerTransport> {
|
|
@@ -26,7 +26,7 @@ export declare abstract class LocalTransportAdapter<T extends StreamableHTTPServ
|
|
|
26
26
|
constructor(scope: Scope, key: TransportKey, onDispose: () => void, res: ServerResponse);
|
|
27
27
|
abstract createTransport(sessionId: string, response: ServerResponse): T;
|
|
28
28
|
abstract initialize(req: AuthenticatedServerRequest, res: ServerResponse): Promise<void>;
|
|
29
|
-
abstract sendElicitRequest<T extends
|
|
29
|
+
abstract sendElicitRequest<T extends ZodType>(relatedRequestId: RequestId, message: string, requestedSchema: T): Promise<TypedElicitResult<T>>;
|
|
30
30
|
abstract handleRequest(req: AuthenticatedServerRequest, res: ServerResponse): Promise<void>;
|
|
31
31
|
connectServer(): Promise<void>;
|
|
32
32
|
get newRequestId(): RequestId;
|
|
@@ -27,17 +27,30 @@ class LocalTransportAdapter {
|
|
|
27
27
|
}
|
|
28
28
|
connectServer() {
|
|
29
29
|
const { info } = this.scope.metadata;
|
|
30
|
-
//
|
|
30
|
+
// Check if completions capability should be enabled (when prompts or resources are present)
|
|
31
|
+
const hasPrompts = this.scope.prompts.hasAny();
|
|
32
|
+
const hasResources = this.scope.resources.hasAny();
|
|
33
|
+
const hasTools = this.scope.tools.hasAny();
|
|
34
|
+
const completionsCapability = hasPrompts || hasResources ? { completions: {} } : {};
|
|
31
35
|
const serverOptions = {
|
|
32
36
|
instructions: '',
|
|
33
37
|
capabilities: {
|
|
34
|
-
tools
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
+
...this.scope.tools.getCapabilities(),
|
|
39
|
+
...this.scope.resources.getCapabilities(),
|
|
40
|
+
...this.scope.prompts.getCapabilities(),
|
|
41
|
+
...completionsCapability,
|
|
42
|
+
// MCP logging protocol support - allows clients to set log level via logging/setLevel
|
|
43
|
+
logging: {},
|
|
38
44
|
},
|
|
39
45
|
serverInfo: info,
|
|
40
46
|
};
|
|
47
|
+
this.logger.info('connectServer: advertising capabilities', {
|
|
48
|
+
hasTools,
|
|
49
|
+
hasResources,
|
|
50
|
+
hasPrompts,
|
|
51
|
+
capabilities: JSON.stringify(serverOptions.capabilities),
|
|
52
|
+
serverInfo: JSON.stringify(serverOptions.serverInfo),
|
|
53
|
+
});
|
|
41
54
|
this.server = new index_js_1.Server(info, serverOptions);
|
|
42
55
|
const handlers = (0, mcp_handlers_1.createMcpHandlers)({
|
|
43
56
|
scope: this.scope,
|
|
@@ -46,6 +59,8 @@ class LocalTransportAdapter {
|
|
|
46
59
|
for (const handler of handlers) {
|
|
47
60
|
this.server.setRequestHandler(handler.requestSchema, handler.handler);
|
|
48
61
|
}
|
|
62
|
+
// Register server with notification service for server→client notifications
|
|
63
|
+
this.scope.notifications.registerServer(this.key.sessionId, this.server);
|
|
49
64
|
return this.server.connect(this.transport);
|
|
50
65
|
}
|
|
51
66
|
get newRequestId() {
|
|
@@ -53,6 +68,8 @@ class LocalTransportAdapter {
|
|
|
53
68
|
}
|
|
54
69
|
async destroy(reason) {
|
|
55
70
|
console.log('destroying transporter, reason:', reason);
|
|
71
|
+
// Unregister server from notification service
|
|
72
|
+
this.scope.notifications.unregisterServer(this.key.sessionId);
|
|
56
73
|
try {
|
|
57
74
|
// if(!this.transport.closed){
|
|
58
75
|
// this.transport.close();
|
|
@@ -92,11 +109,15 @@ class LocalTransportAdapter {
|
|
|
92
109
|
}
|
|
93
110
|
ensureAuthInfo(req, transport) {
|
|
94
111
|
const { token, user, session } = req[common_1.ServerRequestTokens.auth];
|
|
112
|
+
// Session should always exist now (created in session.verify for public mode)
|
|
113
|
+
// But add defensive fallback for safety in case session is undefined
|
|
114
|
+
const sessionId = session?.id ?? `fallback:${Date.now()}`;
|
|
115
|
+
const sessionPayload = session?.payload ?? { protocol: 'streamable-http' };
|
|
95
116
|
req.auth = {
|
|
96
117
|
token,
|
|
97
118
|
user,
|
|
98
|
-
sessionId
|
|
99
|
-
sessionIdPayload:
|
|
119
|
+
sessionId,
|
|
120
|
+
sessionIdPayload: sessionPayload,
|
|
100
121
|
scopes: [],
|
|
101
122
|
clientId: user.sub ?? '',
|
|
102
123
|
transport,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.local.adapter.js","sourceRoot":"","sources":["../../../../src/transport/adapters/transport.local.adapter.ts"],"names":[],"mappings":"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","sourcesContent":["import {AuthenticatedServerRequest} from '../../server/server.types';\nimport {TransportKey, TypedElicitResult} from '../transport.types';\nimport {Server as McpServer} from '@modelcontextprotocol/sdk/server/index.js';\nimport {EmptyResultSchema, ElicitResult, RequestId, ElicitResultSchema} from '@modelcontextprotocol/sdk/types.js';\nimport {InMemoryEventStore} from '../transport.event-store';\nimport {AuthInfo} from '@modelcontextprotocol/sdk/server/auth/types.js';\nimport {StreamableHTTPServerTransport} from '@modelcontextprotocol/sdk/server/streamableHttp.js';\nimport {SSEServerTransport} from '../legacy/legacy.sse.tranporter';\nimport {ZodObject} from 'zod';\nimport {FrontMcpLogger, ServerRequestTokens, ServerResponse} from '../../common';\nimport {Scope} from '../../scope';\nimport {createMcpHandlers} from '../mcp-handlers';\n\nexport abstract class LocalTransportAdapter<T extends StreamableHTTPServerTransport | SSEServerTransport> {\n protected logger: FrontMcpLogger;\n protected transport: T;\n protected eventStore = new InMemoryEventStore();\n protected elicitHandler: { resolve: (result: ElicitResult) => void; reject: (err: unknown) => void } | undefined =\n undefined;\n #requestId = 1;\n ready: Promise<void>;\n server: McpServer;\n\n constructor(\n protected readonly scope: Scope,\n protected readonly key: TransportKey,\n protected readonly onDispose: () => void,\n res: ServerResponse,\n ) {\n this.logger = scope.logger.child('LocalTransportAdapter');\n this.transport = this.createTransport(key.sessionId, res);\n this.ready = this.connectServer();\n }\n\n abstract createTransport(sessionId: string, response: ServerResponse): T;\n\n abstract initialize(req: AuthenticatedServerRequest, res: ServerResponse): Promise<void>;\n\n abstract sendElicitRequest<T extends ZodObject<any>>(\n relatedRequestId: RequestId,\n message: string,\n requestedSchema: T,\n ): Promise<TypedElicitResult<T>>;\n\n abstract handleRequest(req: AuthenticatedServerRequest, res: ServerResponse): Promise<void>;\n\n connectServer() {\n const {info} = this.scope.metadata;\n\n // TODO: collect server options from scope\n const serverOptions = {\n instructions: '',\n capabilities: {\n tools: {\n subscribe: true,\n listChanged: true,\n },\n },\n serverInfo: info,\n };\n this.server = new McpServer(info, serverOptions);\n const handlers = createMcpHandlers({\n scope: this.scope,\n serverOptions,\n });\n\n for (const handler of handlers) {\n this.server.setRequestHandler(handler.requestSchema, handler.handler as any);\n }\n return this.server.connect(this.transport);\n }\n\n get newRequestId(): RequestId {\n return this.#requestId++;\n }\n\n async destroy(reason?: string): Promise<void> {\n console.log('destroying transporter, reason:', reason);\n\n try {\n // if(!this.transport.closed){\n // this.transport.close();\n // }\n } catch {\n /* empty */\n }\n if (reason) {\n console.warn(`Destroying transporter: ${reason}`);\n } else {\n try {\n this.onDispose?.();\n } catch {\n /* empty */\n }\n }\n }\n\n /**\n * Ping the connected client for this transport.\n * Returns true on success, false on timeout/error.\n */\n async ping(timeoutMs = 10_000): Promise<boolean> {\n try {\n await this.ready; // ensure server.connect(...) finished\n // Preferred if your SDK exposes it:\n // await this.server.ping({ timeout: timeoutMs });\n\n // Works on all versions (low-level request):\n await this.server.request({method: 'ping'}, EmptyResultSchema, {timeout: timeoutMs});\n return true;\n } catch {\n return false;\n }\n }\n\n protected ensureAuthInfo(req: AuthenticatedServerRequest, transport: LocalTransportAdapter<T>) {\n const {token, user, session} = req[ServerRequestTokens.auth];\n req.auth = {\n token,\n user,\n sessionId: session!.id,\n sessionIdPayload: session!.payload,\n scopes: [],\n clientId: user.sub ?? '',\n transport,\n } satisfies AuthInfo;\n return req.auth;\n }\n\n handleIfElicitResult(req: AuthenticatedServerRequest): boolean {\n\n if (!this.elicitHandler) {\n return false;\n }\n if (req.body.error) {\n const {code, message} = req.body.error;\n if (code === -32600 && message === 'Elicitation not supported') {\n this.elicitHandler.reject(req.body.error);\n return true;\n }\n return false;\n }\n\n const parsed = ElicitResultSchema.safeParse(req.body?.result);\n if (parsed.success) {\n this.elicitHandler.resolve(parsed.data);\n return true;\n }\n return false;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"transport.local.adapter.js","sourceRoot":"","sources":["../../../../src/transport/adapters/transport.local.adapter.ts"],"names":[],"mappings":"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","sourcesContent":["import { AuthenticatedServerRequest } from '../../server/server.types';\nimport { TransportKey, TypedElicitResult } from '../transport.types';\nimport { Server as McpServer } from '@modelcontextprotocol/sdk/server/index.js';\nimport { EmptyResultSchema, ElicitResult, RequestId, ElicitResultSchema } from '@modelcontextprotocol/sdk/types.js';\nimport { InMemoryEventStore } from '../transport.event-store';\nimport { AuthInfo } from '@modelcontextprotocol/sdk/server/auth/types.js';\nimport { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';\nimport { SSEServerTransport } from '../legacy/legacy.sse.tranporter';\nimport { ZodType } from 'zod';\nimport { FrontMcpLogger, ServerRequestTokens, ServerResponse } from '../../common';\nimport { Scope } from '../../scope';\nimport { createMcpHandlers } from '../mcp-handlers';\n\nexport abstract class LocalTransportAdapter<T extends StreamableHTTPServerTransport | SSEServerTransport> {\n protected logger: FrontMcpLogger;\n protected transport: T;\n protected eventStore = new InMemoryEventStore();\n protected elicitHandler: { resolve: (result: ElicitResult) => void; reject: (err: unknown) => void } | undefined =\n undefined;\n #requestId = 1;\n ready: Promise<void>;\n server: McpServer;\n\n constructor(\n protected readonly scope: Scope,\n protected readonly key: TransportKey,\n protected readonly onDispose: () => void,\n res: ServerResponse,\n ) {\n this.logger = scope.logger.child('LocalTransportAdapter');\n this.transport = this.createTransport(key.sessionId, res);\n this.ready = this.connectServer();\n }\n\n abstract createTransport(sessionId: string, response: ServerResponse): T;\n\n abstract initialize(req: AuthenticatedServerRequest, res: ServerResponse): Promise<void>;\n\n abstract sendElicitRequest<T extends ZodType>(\n relatedRequestId: RequestId,\n message: string,\n requestedSchema: T,\n ): Promise<TypedElicitResult<T>>;\n\n abstract handleRequest(req: AuthenticatedServerRequest, res: ServerResponse): Promise<void>;\n\n connectServer() {\n const { info } = this.scope.metadata;\n\n // Check if completions capability should be enabled (when prompts or resources are present)\n const hasPrompts = this.scope.prompts.hasAny();\n const hasResources = this.scope.resources.hasAny();\n const hasTools = this.scope.tools.hasAny();\n const completionsCapability = hasPrompts || hasResources ? { completions: {} } : {};\n\n const serverOptions = {\n instructions: '',\n capabilities: {\n ...this.scope.tools.getCapabilities(),\n ...this.scope.resources.getCapabilities(),\n ...this.scope.prompts.getCapabilities(),\n ...completionsCapability,\n // MCP logging protocol support - allows clients to set log level via logging/setLevel\n logging: {},\n },\n serverInfo: info,\n };\n\n this.logger.info('connectServer: advertising capabilities', {\n hasTools,\n hasResources,\n hasPrompts,\n capabilities: JSON.stringify(serverOptions.capabilities),\n serverInfo: JSON.stringify(serverOptions.serverInfo),\n });\n\n this.server = new McpServer(info, serverOptions);\n const handlers = createMcpHandlers({\n scope: this.scope,\n serverOptions,\n });\n\n for (const handler of handlers) {\n this.server.setRequestHandler(handler.requestSchema, handler.handler as any);\n }\n\n // Register server with notification service for server→client notifications\n this.scope.notifications.registerServer(this.key.sessionId, this.server);\n\n return this.server.connect(this.transport);\n }\n\n get newRequestId(): RequestId {\n return this.#requestId++;\n }\n\n async destroy(reason?: string): Promise<void> {\n console.log('destroying transporter, reason:', reason);\n\n // Unregister server from notification service\n this.scope.notifications.unregisterServer(this.key.sessionId);\n\n try {\n // if(!this.transport.closed){\n // this.transport.close();\n // }\n } catch {\n /* empty */\n }\n if (reason) {\n console.warn(`Destroying transporter: ${reason}`);\n } else {\n try {\n this.onDispose?.();\n } catch {\n /* empty */\n }\n }\n }\n\n /**\n * Ping the connected client for this transport.\n * Returns true on success, false on timeout/error.\n */\n async ping(timeoutMs = 10_000): Promise<boolean> {\n try {\n await this.ready; // ensure server.connect(...) finished\n // Preferred if your SDK exposes it:\n // await this.server.ping({ timeout: timeoutMs });\n\n // Works on all versions (low-level request):\n await this.server.request({ method: 'ping' }, EmptyResultSchema, { timeout: timeoutMs });\n return true;\n } catch {\n return false;\n }\n }\n\n protected ensureAuthInfo(req: AuthenticatedServerRequest, transport: LocalTransportAdapter<T>) {\n const { token, user, session } = req[ServerRequestTokens.auth];\n\n // Session should always exist now (created in session.verify for public mode)\n // But add defensive fallback for safety in case session is undefined\n const sessionId = session?.id ?? `fallback:${Date.now()}`;\n const sessionPayload = session?.payload ?? { protocol: 'streamable-http' as const };\n\n req.auth = {\n token,\n user,\n sessionId,\n sessionIdPayload: sessionPayload,\n scopes: [],\n clientId: user.sub ?? '',\n transport,\n } satisfies AuthInfo;\n return req.auth;\n }\n\n handleIfElicitResult(req: AuthenticatedServerRequest): boolean {\n if (!this.elicitHandler) {\n return false;\n }\n if (req.body.error) {\n const { code, message } = req.body.error;\n if (code === -32600 && message === 'Elicitation not supported') {\n this.elicitHandler.reject(req.body.error);\n return true;\n }\n return false;\n }\n\n const parsed = ElicitResultSchema.safeParse(req.body?.result);\n if (parsed.success) {\n this.elicitHandler.resolve(parsed.data);\n return true;\n }\n return false;\n }\n}\n"]}
|
|
@@ -3,12 +3,12 @@ import { TypedElicitResult } from '../transport.types';
|
|
|
3
3
|
import { SSEServerTransport } from '../legacy/legacy.sse.tranporter';
|
|
4
4
|
import { LocalTransportAdapter } from './transport.local.adapter';
|
|
5
5
|
import { RequestId } from '@modelcontextprotocol/sdk/types.js';
|
|
6
|
-
import {
|
|
6
|
+
import { ZodType } from 'zod';
|
|
7
7
|
import { ServerResponse } from '../../common';
|
|
8
8
|
export declare class TransportSSEAdapter extends LocalTransportAdapter<SSEServerTransport> {
|
|
9
9
|
sessionId: string;
|
|
10
10
|
createTransport(sessionId: string, res: ServerResponse): SSEServerTransport;
|
|
11
11
|
initialize(req: AuthenticatedServerRequest, res: ServerResponse): Promise<void>;
|
|
12
12
|
handleRequest(req: AuthenticatedServerRequest, res: ServerResponse): Promise<void>;
|
|
13
|
-
sendElicitRequest<T extends
|
|
13
|
+
sendElicitRequest<T extends ZodType>(relatedRequestId: RequestId, message: string, requestedSchema: T): Promise<TypedElicitResult<T>>;
|
|
14
14
|
}
|
|
@@ -3,8 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.TransportSSEAdapter = void 0;
|
|
4
4
|
const legacy_sse_tranporter_1 = require("../legacy/legacy.sse.tranporter");
|
|
5
5
|
const transport_local_adapter_1 = require("./transport.local.adapter");
|
|
6
|
+
const v4_1 = require("zod/v4");
|
|
6
7
|
const transport_error_1 = require("../transport.error");
|
|
7
|
-
const zod_to_json_schema_1 = require("zod-to-json-schema");
|
|
8
8
|
class TransportSSEAdapter extends transport_local_adapter_1.LocalTransportAdapter {
|
|
9
9
|
sessionId;
|
|
10
10
|
createTransport(sessionId, res) {
|
|
@@ -15,7 +15,8 @@ class TransportSSEAdapter extends transport_local_adapter_1.LocalTransportAdapte
|
|
|
15
15
|
sessionId: sessionId,
|
|
16
16
|
});
|
|
17
17
|
transport.onerror = (error) => {
|
|
18
|
-
|
|
18
|
+
// Use safe logging to avoid Node.js 24 util.inspect bug with Zod errors
|
|
19
|
+
console.error('SSE error:', error instanceof Error ? error.message : 'Unknown error');
|
|
19
20
|
};
|
|
20
21
|
transport.onclose = this.destroy.bind(this);
|
|
21
22
|
return transport;
|
|
@@ -44,7 +45,7 @@ class TransportSSEAdapter extends transport_local_adapter_1.LocalTransportAdapte
|
|
|
44
45
|
console.log('sendElicitRequest', { relatedRequestId });
|
|
45
46
|
await this.transport.send((0, transport_error_1.rpcRequest)(this.newRequestId, 'elicitation/create', {
|
|
46
47
|
message,
|
|
47
|
-
requestedSchema: (0,
|
|
48
|
+
requestedSchema: (0, v4_1.toJSONSchema)(requestedSchema),
|
|
48
49
|
}));
|
|
49
50
|
return new Promise((resolve, reject) => {
|
|
50
51
|
this.elicitHandler = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.sse.adapter.js","sourceRoot":"","sources":["../../../../src/transport/adapters/transport.sse.adapter.ts"],"names":[],"mappings":";;;AAEA,2EAAqE;AACrE,uEAAkE;AAGlE,wDAAgD;
|
|
1
|
+
{"version":3,"file":"transport.sse.adapter.js","sourceRoot":"","sources":["../../../../src/transport/adapters/transport.sse.adapter.ts"],"names":[],"mappings":"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","sourcesContent":["import { AuthenticatedServerRequest } from '../../server/server.types';\nimport { TypedElicitResult } from '../transport.types';\nimport { SSEServerTransport } from '../legacy/legacy.sse.tranporter';\nimport { LocalTransportAdapter } from './transport.local.adapter';\nimport { RequestId } from '@modelcontextprotocol/sdk/types.js';\nimport { ZodType } from 'zod';\nimport { toJSONSchema } from 'zod/v4';\nimport { rpcRequest } from '../transport.error';\nimport { ServerResponse } from '../../common';\n\nexport class TransportSSEAdapter extends LocalTransportAdapter<SSEServerTransport> {\n sessionId: string;\n\n override createTransport(sessionId: string, res: ServerResponse): SSEServerTransport {\n this.sessionId = sessionId;\n this.logger.info(`new transport session: ${sessionId.slice(0, 40)}`);\n const scopePath = this.scope.fullPath;\n const transport = new SSEServerTransport(`${scopePath}/message`, res, {\n sessionId: sessionId,\n });\n transport.onerror = (error) => {\n // Use safe logging to avoid Node.js 24 util.inspect bug with Zod errors\n console.error('SSE error:', error instanceof Error ? error.message : 'Unknown error');\n };\n transport.onclose = this.destroy.bind(this);\n return transport;\n }\n\n initialize(req: AuthenticatedServerRequest, res: ServerResponse): Promise<void> {\n this.logger.verbose(`[${this.sessionId}] handle initialize request`);\n this.ensureAuthInfo(req, this);\n return Promise.resolve();\n }\n\n async handleRequest(req: AuthenticatedServerRequest, res: ServerResponse): Promise<void> {\n const authInfo = this.ensureAuthInfo(req, this);\n\n if (this.handleIfElicitResult(req)) {\n this.logger.verbose(`[${this.sessionId}] handle get request`);\n return;\n }\n if (req.method === 'GET') {\n this.logger.verbose(`[${this.sessionId}] handle get request`);\n return this.transport.handleMessage(req.body, { requestInfo: req, authInfo });\n } else {\n this.logger.verbose(`[${this.sessionId}] handle post request`);\n return this.transport.handlePostMessage(req, res, req.body);\n }\n }\n\n async sendElicitRequest<T extends ZodType>(\n relatedRequestId: RequestId,\n message: string,\n requestedSchema: T,\n ): Promise<TypedElicitResult<T>> {\n console.log('sendElicitRequest', { relatedRequestId });\n await this.transport.send(\n rpcRequest(this.newRequestId, 'elicitation/create', {\n message,\n requestedSchema: toJSONSchema(requestedSchema as any),\n }),\n );\n\n return new Promise<TypedElicitResult<T>>((resolve, reject) => {\n this.elicitHandler = {\n resolve: (result) => {\n resolve(result as TypedElicitResult<T>);\n this.elicitHandler = undefined;\n },\n reject: (err) => {\n reject(err);\n this.elicitHandler = undefined;\n },\n };\n });\n }\n}\n"]}
|
|
@@ -1,13 +1,20 @@
|
|
|
1
1
|
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
2
|
-
import { TypedElicitResult } from '../transport.types';
|
|
2
|
+
import { TransportType, TypedElicitResult } from '../transport.types';
|
|
3
3
|
import { AuthenticatedServerRequest } from '../../server/server.types';
|
|
4
4
|
import { LocalTransportAdapter } from './transport.local.adapter';
|
|
5
5
|
import { RequestId } from '@modelcontextprotocol/sdk/types.js';
|
|
6
|
-
import {
|
|
6
|
+
import { ZodType } from 'zod';
|
|
7
7
|
import { ServerResponse } from '../../common';
|
|
8
|
+
/**
|
|
9
|
+
* Stateless HTTP requests must be able to send multiple initialize calls without
|
|
10
|
+
* tripping the MCP transport's "already initialized" guard. The upstream SDK
|
|
11
|
+
* treats any transport with a session ID generator as stateful, so we disable
|
|
12
|
+
* session generation entirely for stateless transports.
|
|
13
|
+
*/
|
|
14
|
+
export declare const resolveSessionIdGenerator: (transportType: TransportType, sessionId: string) => (() => string) | undefined;
|
|
8
15
|
export declare class TransportStreamableHttpAdapter extends LocalTransportAdapter<StreamableHTTPServerTransport> {
|
|
9
16
|
createTransport(sessionId: string, response: ServerResponse): StreamableHTTPServerTransport;
|
|
10
17
|
initialize(req: AuthenticatedServerRequest, res: ServerResponse): Promise<void>;
|
|
11
18
|
handleRequest(req: AuthenticatedServerRequest, res: ServerResponse): Promise<void>;
|
|
12
|
-
sendElicitRequest<T extends
|
|
19
|
+
sendElicitRequest<T extends ZodType>(relatedRequestId: RequestId, message: string, requestedSchema: T): Promise<TypedElicitResult<T>>;
|
|
13
20
|
}
|
|
@@ -1,27 +1,73 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.TransportStreamableHttpAdapter = void 0;
|
|
3
|
+
exports.TransportStreamableHttpAdapter = exports.resolveSessionIdGenerator = void 0;
|
|
4
4
|
const streamableHttp_js_1 = require("@modelcontextprotocol/sdk/server/streamableHttp.js");
|
|
5
5
|
const transport_local_adapter_1 = require("./transport.local.adapter");
|
|
6
|
-
const
|
|
6
|
+
const v4_1 = require("zod/v4");
|
|
7
7
|
const transport_error_1 = require("../transport.error");
|
|
8
|
+
/**
|
|
9
|
+
* Stateless HTTP requests must be able to send multiple initialize calls without
|
|
10
|
+
* tripping the MCP transport's "already initialized" guard. The upstream SDK
|
|
11
|
+
* treats any transport with a session ID generator as stateful, so we disable
|
|
12
|
+
* session generation entirely for stateless transports.
|
|
13
|
+
*/
|
|
14
|
+
const resolveSessionIdGenerator = (transportType, sessionId) => {
|
|
15
|
+
return transportType === 'stateless-http' ? undefined : () => sessionId;
|
|
16
|
+
};
|
|
17
|
+
exports.resolveSessionIdGenerator = resolveSessionIdGenerator;
|
|
8
18
|
class TransportStreamableHttpAdapter extends transport_local_adapter_1.LocalTransportAdapter {
|
|
9
19
|
createTransport(sessionId, response) {
|
|
20
|
+
const sessionIdGenerator = (0, exports.resolveSessionIdGenerator)(this.key.type, sessionId);
|
|
10
21
|
return new streamableHttp_js_1.StreamableHTTPServerTransport({
|
|
11
|
-
sessionIdGenerator
|
|
12
|
-
return sessionId;
|
|
13
|
-
},
|
|
22
|
+
sessionIdGenerator,
|
|
14
23
|
onsessionclosed: () => {
|
|
15
24
|
// this.destroy();
|
|
16
25
|
},
|
|
17
26
|
onsessioninitialized: (sessionId) => {
|
|
18
|
-
|
|
27
|
+
if (sessionId) {
|
|
28
|
+
console.log(`session initialized: ${sessionId.slice(0, 40)}`);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
console.log(`stateless session initialized`);
|
|
32
|
+
}
|
|
19
33
|
},
|
|
20
|
-
eventStore
|
|
34
|
+
// Disable eventStore to prevent priming events - Claude.ai's client doesn't handle them
|
|
35
|
+
// The priming event has empty data with no `event:` type, which violates MCP spec
|
|
36
|
+
// ("Event types MUST be message") and confuses some clients
|
|
37
|
+
eventStore: undefined,
|
|
21
38
|
});
|
|
22
39
|
}
|
|
23
40
|
initialize(req, res) {
|
|
24
41
|
this.ensureAuthInfo(req, this);
|
|
42
|
+
this.logger.info('[StreamableHttpAdapter] initialize() called', {
|
|
43
|
+
method: req.method,
|
|
44
|
+
sessionId: this.key.sessionId.slice(0, 30),
|
|
45
|
+
bodyMethod: req.body?.method,
|
|
46
|
+
});
|
|
47
|
+
// Intercept response to log what gets sent back to client
|
|
48
|
+
const originalWrite = res.write.bind(res);
|
|
49
|
+
const originalEnd = res.end.bind(res);
|
|
50
|
+
let responseBody = '';
|
|
51
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
52
|
+
res.write = function (chunk, encodingOrCb, cb) {
|
|
53
|
+
if (chunk) {
|
|
54
|
+
responseBody += typeof chunk === 'string' ? chunk : Buffer.isBuffer(chunk) ? chunk.toString() : String(chunk);
|
|
55
|
+
}
|
|
56
|
+
return originalWrite.call(this, chunk, encodingOrCb, cb);
|
|
57
|
+
};
|
|
58
|
+
const adapter = this;
|
|
59
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
60
|
+
res.end = function (chunk, encodingOrCb, cb) {
|
|
61
|
+
if (chunk) {
|
|
62
|
+
responseBody += typeof chunk === 'string' ? chunk : Buffer.isBuffer(chunk) ? chunk.toString() : String(chunk);
|
|
63
|
+
}
|
|
64
|
+
adapter.logger.info('[StreamableHttpAdapter] initialize response', {
|
|
65
|
+
statusCode: res.statusCode,
|
|
66
|
+
headers: res.getHeaders?.() ?? {},
|
|
67
|
+
bodyPreview: responseBody.slice(0, 1000),
|
|
68
|
+
});
|
|
69
|
+
return originalEnd.call(this, chunk, encodingOrCb, cb);
|
|
70
|
+
};
|
|
25
71
|
return this.transport.handleRequest(req, res, req.body);
|
|
26
72
|
}
|
|
27
73
|
async handleRequest(req, res) {
|
|
@@ -45,7 +91,7 @@ class TransportStreamableHttpAdapter extends transport_local_adapter_1.LocalTran
|
|
|
45
91
|
async sendElicitRequest(relatedRequestId, message, requestedSchema) {
|
|
46
92
|
await this.transport.send((0, transport_error_1.rpcRequest)(this.newRequestId, 'elicitation/create', {
|
|
47
93
|
message,
|
|
48
|
-
requestedSchema: (0,
|
|
94
|
+
requestedSchema: (0, v4_1.toJSONSchema)(requestedSchema),
|
|
49
95
|
}), { relatedRequestId });
|
|
50
96
|
return new Promise((resolve, reject) => {
|
|
51
97
|
this.elicitHandler = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.streamable-http.adapter.js","sourceRoot":"","sources":["../../../../src/transport/adapters/transport.streamable-http.adapter.ts"],"names":[],"mappings":";;;AAAA,0FAAmG;AAGnG,uEAAkE;
|
|
1
|
+
{"version":3,"file":"transport.streamable-http.adapter.js","sourceRoot":"","sources":["../../../../src/transport/adapters/transport.streamable-http.adapter.ts"],"names":[],"mappings":"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","sourcesContent":["import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';\nimport { TransportType, TypedElicitResult } from '../transport.types';\nimport { AuthenticatedServerRequest } from '../../server/server.types';\nimport { LocalTransportAdapter } from './transport.local.adapter';\nimport { RequestId } from '@modelcontextprotocol/sdk/types.js';\nimport { ZodType } from 'zod';\nimport { toJSONSchema } from 'zod/v4';\nimport { rpcRequest } from '../transport.error';\nimport { ServerResponse } from '../../common';\n\n/**\n * Stateless HTTP requests must be able to send multiple initialize calls without\n * tripping the MCP transport's \"already initialized\" guard. The upstream SDK\n * treats any transport with a session ID generator as stateful, so we disable\n * session generation entirely for stateless transports.\n */\nexport const resolveSessionIdGenerator = (\n transportType: TransportType,\n sessionId: string,\n): (() => string) | undefined => {\n return transportType === 'stateless-http' ? undefined : () => sessionId;\n};\n\nexport class TransportStreamableHttpAdapter extends LocalTransportAdapter<StreamableHTTPServerTransport> {\n override createTransport(sessionId: string, response: ServerResponse): StreamableHTTPServerTransport {\n const sessionIdGenerator = resolveSessionIdGenerator(this.key.type, sessionId);\n\n return new StreamableHTTPServerTransport({\n sessionIdGenerator,\n onsessionclosed: () => {\n // this.destroy();\n },\n onsessioninitialized: (sessionId) => {\n if (sessionId) {\n console.log(`session initialized: ${sessionId.slice(0, 40)}`);\n } else {\n console.log(`stateless session initialized`);\n }\n },\n // Disable eventStore to prevent priming events - Claude.ai's client doesn't handle them\n // The priming event has empty data with no `event:` type, which violates MCP spec\n // (\"Event types MUST be message\") and confuses some clients\n eventStore: undefined,\n });\n }\n\n initialize(req: AuthenticatedServerRequest, res: ServerResponse): Promise<void> {\n this.ensureAuthInfo(req, this);\n\n this.logger.info('[StreamableHttpAdapter] initialize() called', {\n method: req.method,\n sessionId: this.key.sessionId.slice(0, 30),\n bodyMethod: (req.body as { method?: string })?.method,\n });\n\n // Intercept response to log what gets sent back to client\n const originalWrite = res.write.bind(res) as typeof res.write;\n const originalEnd = res.end.bind(res) as typeof res.end;\n let responseBody = '';\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n res.write = function (this: ServerResponse, chunk: any, encodingOrCb?: any, cb?: any): boolean {\n if (chunk) {\n responseBody += typeof chunk === 'string' ? chunk : Buffer.isBuffer(chunk) ? chunk.toString() : String(chunk);\n }\n return originalWrite.call(this, chunk, encodingOrCb, cb);\n } as typeof res.write;\n\n const adapter = this;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n res.end = function (this: ServerResponse, chunk?: any, encodingOrCb?: any, cb?: any): ServerResponse {\n if (chunk) {\n responseBody += typeof chunk === 'string' ? chunk : Buffer.isBuffer(chunk) ? chunk.toString() : String(chunk);\n }\n adapter.logger.info('[StreamableHttpAdapter] initialize response', {\n statusCode: res.statusCode,\n headers: res.getHeaders?.() ?? {},\n bodyPreview: responseBody.slice(0, 1000),\n });\n return originalEnd.call(this, chunk, encodingOrCb, cb);\n } as typeof res.end;\n\n return this.transport.handleRequest(req, res, req.body);\n }\n\n async handleRequest(req: AuthenticatedServerRequest, res: ServerResponse): Promise<void> {\n this.ensureAuthInfo(req, this);\n //\n // if ((await this.isInitialized) && isInitializeRequest(req.body)) {\n // await this.transport.close();\n // this.isInitialized = this.connectStreamableTransport(req.authSession.session!.id);\n // await this.ready;\n // }\n\n if (req.method === 'GET') {\n return this.transport.handleRequest(req, res);\n } else {\n if (this.handleIfElicitResult(req)) {\n return;\n }\n return this.transport.handleRequest(req, res, req.body);\n }\n }\n\n async sendElicitRequest<T extends ZodType>(\n relatedRequestId: RequestId,\n message: string,\n requestedSchema: T,\n ): Promise<TypedElicitResult<T>> {\n await this.transport.send(\n rpcRequest(this.newRequestId, 'elicitation/create', {\n message,\n requestedSchema: toJSONSchema(requestedSchema as any),\n }),\n { relatedRequestId },\n );\n\n return new Promise<TypedElicitResult<T>>((resolve, reject) => {\n this.elicitHandler = {\n resolve: (result) => {\n resolve(result as TypedElicitResult<T>);\n this.elicitHandler = undefined;\n },\n reject: (err) => {\n reject(err);\n this.elicitHandler = undefined;\n },\n };\n });\n }\n}\n"]}
|
|
@@ -10,72 +10,38 @@ export declare const stateSchema: z.ZodObject<{
|
|
|
10
10
|
token: z.ZodString;
|
|
11
11
|
session: z.ZodObject<{
|
|
12
12
|
id: z.ZodString;
|
|
13
|
-
payload: z.ZodObject<{
|
|
13
|
+
payload: z.ZodOptional<z.ZodObject<{
|
|
14
14
|
nodeId: z.ZodString;
|
|
15
15
|
authSig: z.ZodString;
|
|
16
16
|
uuid: z.ZodString;
|
|
17
17
|
iat: z.ZodNumber;
|
|
18
|
-
protocol: z.ZodEnum<
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
nodeId: string;
|
|
46
|
-
authSig: string;
|
|
47
|
-
iat: number;
|
|
48
|
-
protocol: "sse" | "legacy-sse" | "streamable-http" | "stateful-http" | "stateless-http";
|
|
49
|
-
};
|
|
50
|
-
}>;
|
|
51
|
-
requestType: z.ZodOptional<z.ZodEnum<["initialize", "message", "elicitResult"]>>;
|
|
52
|
-
}, "strip", z.ZodTypeAny, {
|
|
53
|
-
session: {
|
|
54
|
-
id: string;
|
|
55
|
-
payload: {
|
|
56
|
-
uuid: string;
|
|
57
|
-
nodeId: string;
|
|
58
|
-
authSig: string;
|
|
59
|
-
iat: number;
|
|
60
|
-
protocol: "sse" | "legacy-sse" | "streamable-http" | "stateful-http" | "stateless-http";
|
|
61
|
-
};
|
|
62
|
-
};
|
|
63
|
-
token: string;
|
|
64
|
-
requestType?: "message" | "initialize" | "elicitResult" | undefined;
|
|
65
|
-
}, {
|
|
66
|
-
session: {
|
|
67
|
-
id: string;
|
|
68
|
-
payload: {
|
|
69
|
-
uuid: string;
|
|
70
|
-
nodeId: string;
|
|
71
|
-
authSig: string;
|
|
72
|
-
iat: number;
|
|
73
|
-
protocol: "sse" | "legacy-sse" | "streamable-http" | "stateful-http" | "stateless-http";
|
|
74
|
-
};
|
|
75
|
-
};
|
|
76
|
-
token: string;
|
|
77
|
-
requestType?: "message" | "initialize" | "elicitResult" | undefined;
|
|
78
|
-
}>;
|
|
18
|
+
protocol: z.ZodOptional<z.ZodEnum<{
|
|
19
|
+
"legacy-sse": "legacy-sse";
|
|
20
|
+
sse: "sse";
|
|
21
|
+
"streamable-http": "streamable-http";
|
|
22
|
+
"stateful-http": "stateful-http";
|
|
23
|
+
"stateless-http": "stateless-http";
|
|
24
|
+
}>>;
|
|
25
|
+
isPublic: z.ZodOptional<z.ZodBoolean>;
|
|
26
|
+
platformType: z.ZodOptional<z.ZodEnum<{
|
|
27
|
+
unknown: "unknown";
|
|
28
|
+
continue: "continue";
|
|
29
|
+
openai: "openai";
|
|
30
|
+
claude: "claude";
|
|
31
|
+
gemini: "gemini";
|
|
32
|
+
cursor: "cursor";
|
|
33
|
+
cody: "cody";
|
|
34
|
+
"generic-mcp": "generic-mcp";
|
|
35
|
+
"ext-apps": "ext-apps";
|
|
36
|
+
}>>;
|
|
37
|
+
}, z.core.$strip>>;
|
|
38
|
+
}, z.core.$strip>;
|
|
39
|
+
requestType: z.ZodOptional<z.ZodEnum<{
|
|
40
|
+
message: "message";
|
|
41
|
+
initialize: "initialize";
|
|
42
|
+
elicitResult: "elicitResult";
|
|
43
|
+
}>>;
|
|
44
|
+
}, z.core.$strip>;
|
|
79
45
|
declare const name: "handle:legacy-sse";
|
|
80
46
|
declare global {
|
|
81
47
|
interface ExtendFlows {
|
|
@@ -83,7 +49,7 @@ declare global {
|
|
|
83
49
|
}
|
|
84
50
|
}
|
|
85
51
|
export default class HandleSseFlow extends FlowBase<typeof name> {
|
|
86
|
-
|
|
52
|
+
parseInput(): Promise<void>;
|
|
87
53
|
router(): Promise<void>;
|
|
88
54
|
onInitialize(): Promise<void>;
|
|
89
55
|
onElicitResult(): Promise<void>;
|