@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,419 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @file template.ts
|
|
4
|
+
* @description MCP Apps HTML template generator.
|
|
5
|
+
*
|
|
6
|
+
* Generates standard HTML5 documents with embedded MCP bridge for MCP Apps spec compliance.
|
|
7
|
+
*
|
|
8
|
+
* @module @frontmcp/sdk/mcp-apps/template
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.generateMcpAppsTemplate = generateMcpAppsTemplate;
|
|
12
|
+
exports.wrapInMcpAppsTemplate = wrapInMcpAppsTemplate;
|
|
13
|
+
exports.createSimpleMcpAppsTemplate = createSimpleMcpAppsTemplate;
|
|
14
|
+
exports.extractBodyContent = extractBodyContent;
|
|
15
|
+
const types_1 = require("./types");
|
|
16
|
+
const csp_1 = require("./csp");
|
|
17
|
+
// ============================================
|
|
18
|
+
// Template Generator
|
|
19
|
+
// ============================================
|
|
20
|
+
/**
|
|
21
|
+
* Generate MCP Apps compliant HTML5 document.
|
|
22
|
+
*
|
|
23
|
+
* @param options - Template options
|
|
24
|
+
* @returns Complete HTML5 document string
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```typescript
|
|
28
|
+
* const html = generateMcpAppsTemplate({
|
|
29
|
+
* title: 'Weather Dashboard',
|
|
30
|
+
* bodyContent: '<div id="weather">Loading...</div>',
|
|
31
|
+
* toolInfo: { tool: { name: 'get_weather' } },
|
|
32
|
+
* input: { city: 'San Francisco' },
|
|
33
|
+
* output: { temperature: 72, condition: 'sunny' },
|
|
34
|
+
* csp: { connectDomains: ['https://api.weather.com'] },
|
|
35
|
+
* });
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
function generateMcpAppsTemplate(options) {
|
|
39
|
+
const { toolInfo, input, output, structuredContent, csp, title = 'MCP App', headContent = '', bodyContent, scripts = [], includeBridge = true, bridgeConfig, theme = 'light', debug = false, } = options;
|
|
40
|
+
// Build CSP meta tag
|
|
41
|
+
const cspMeta = (0, csp_1.buildCSPMetaTag)(csp);
|
|
42
|
+
// Build data attributes for initial state
|
|
43
|
+
const dataAttrs = buildDataAttributes({ toolInfo, input, output, structuredContent });
|
|
44
|
+
// Build bridge script
|
|
45
|
+
const bridgeScript = includeBridge ? generateBridgeScript({ ...bridgeConfig, debug }) : '';
|
|
46
|
+
// Build additional scripts
|
|
47
|
+
const additionalScripts = scripts.map((s) => `<script>${s}</script>`).join('\n');
|
|
48
|
+
return `<!DOCTYPE html>
|
|
49
|
+
<html lang="en" data-theme="${escapeAttr(theme)}">
|
|
50
|
+
<head>
|
|
51
|
+
<meta charset="UTF-8">
|
|
52
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
53
|
+
${cspMeta}
|
|
54
|
+
<meta name="mcp-apps-version" content="${types_1.MCP_APPS_PROTOCOL_VERSION}">
|
|
55
|
+
<meta name="mcp-apps-mime-type" content="${types_1.MCP_APPS_MIME_TYPE}">
|
|
56
|
+
<title>${escapeHtml(title)}</title>
|
|
57
|
+
<style>
|
|
58
|
+
:root {
|
|
59
|
+
--mcp-bg: #ffffff;
|
|
60
|
+
--mcp-text: #1a1a1a;
|
|
61
|
+
--mcp-border: #e5e5e5;
|
|
62
|
+
--mcp-primary: #0969da;
|
|
63
|
+
--mcp-error: #cf222e;
|
|
64
|
+
--mcp-success: #1a7f37;
|
|
65
|
+
}
|
|
66
|
+
[data-theme="dark"] {
|
|
67
|
+
--mcp-bg: #0d1117;
|
|
68
|
+
--mcp-text: #c9d1d9;
|
|
69
|
+
--mcp-border: #30363d;
|
|
70
|
+
--mcp-primary: #58a6ff;
|
|
71
|
+
--mcp-error: #f85149;
|
|
72
|
+
--mcp-success: #3fb950;
|
|
73
|
+
}
|
|
74
|
+
* { box-sizing: border-box; }
|
|
75
|
+
body {
|
|
76
|
+
margin: 0;
|
|
77
|
+
padding: 16px;
|
|
78
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
79
|
+
background: var(--mcp-bg);
|
|
80
|
+
color: var(--mcp-text);
|
|
81
|
+
line-height: 1.5;
|
|
82
|
+
}
|
|
83
|
+
</style>
|
|
84
|
+
${headContent}
|
|
85
|
+
</head>
|
|
86
|
+
<body ${dataAttrs}>
|
|
87
|
+
${bodyContent}
|
|
88
|
+
${bridgeScript}
|
|
89
|
+
${additionalScripts}
|
|
90
|
+
</body>
|
|
91
|
+
</html>`;
|
|
92
|
+
}
|
|
93
|
+
// ============================================
|
|
94
|
+
// Bridge Script Generator
|
|
95
|
+
// ============================================
|
|
96
|
+
/**
|
|
97
|
+
* Generate the MCP Apps bridge runtime script.
|
|
98
|
+
*/
|
|
99
|
+
function generateBridgeScript(config) {
|
|
100
|
+
const { protocolVersion = types_1.MCP_APPS_PROTOCOL_VERSION, trustedOrigin = '*', requestTimeout = 30000, debug = false, } = config || {};
|
|
101
|
+
return `<script>
|
|
102
|
+
(function() {
|
|
103
|
+
'use strict';
|
|
104
|
+
|
|
105
|
+
// MCP Apps Bridge Runtime
|
|
106
|
+
const MCP_PROTOCOL_VERSION = '${protocolVersion}';
|
|
107
|
+
const REQUEST_TIMEOUT = ${requestTimeout};
|
|
108
|
+
const DEBUG = ${debug};
|
|
109
|
+
|
|
110
|
+
// State
|
|
111
|
+
let initialized = false;
|
|
112
|
+
let hostContext = {};
|
|
113
|
+
let pendingRequests = new Map();
|
|
114
|
+
let messageId = 0;
|
|
115
|
+
let trustedOrigin = '${trustedOrigin}';
|
|
116
|
+
|
|
117
|
+
// Logging
|
|
118
|
+
function log(...args) {
|
|
119
|
+
if (DEBUG) console.log('[MCP Bridge]', ...args);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Generate unique message ID
|
|
123
|
+
function nextId() {
|
|
124
|
+
return ++messageId;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Send JSON-RPC message to host
|
|
128
|
+
function sendMessage(message) {
|
|
129
|
+
log('Sending:', message);
|
|
130
|
+
parent.postMessage(message, trustedOrigin);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Send JSON-RPC request and wait for response
|
|
134
|
+
function sendRequest(method, params) {
|
|
135
|
+
return new Promise((resolve, reject) => {
|
|
136
|
+
const id = nextId();
|
|
137
|
+
const request = {
|
|
138
|
+
jsonrpc: '2.0',
|
|
139
|
+
id: id,
|
|
140
|
+
method: method,
|
|
141
|
+
params: params
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
const timeout = setTimeout(() => {
|
|
145
|
+
pendingRequests.delete(id);
|
|
146
|
+
reject(new Error('Request timeout: ' + method));
|
|
147
|
+
}, REQUEST_TIMEOUT);
|
|
148
|
+
|
|
149
|
+
pendingRequests.set(id, { resolve, reject, timeout });
|
|
150
|
+
sendMessage(request);
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// Send JSON-RPC notification (no response expected)
|
|
155
|
+
function sendNotification(method, params) {
|
|
156
|
+
sendMessage({
|
|
157
|
+
jsonrpc: '2.0',
|
|
158
|
+
method: method,
|
|
159
|
+
params: params
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Handle incoming messages from host
|
|
164
|
+
function handleMessage(event) {
|
|
165
|
+
// Validate origin on first message (trust-on-first-use)
|
|
166
|
+
if (trustedOrigin === '*' && event.origin) {
|
|
167
|
+
trustedOrigin = event.origin;
|
|
168
|
+
log('Trusted origin set to:', trustedOrigin);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
const data = event.data;
|
|
172
|
+
if (!data || data.jsonrpc !== '2.0') return;
|
|
173
|
+
|
|
174
|
+
log('Received:', data);
|
|
175
|
+
|
|
176
|
+
// Handle response to our request
|
|
177
|
+
if (data.id !== undefined && pendingRequests.has(data.id)) {
|
|
178
|
+
const { resolve, reject, timeout } = pendingRequests.get(data.id);
|
|
179
|
+
clearTimeout(timeout);
|
|
180
|
+
pendingRequests.delete(data.id);
|
|
181
|
+
|
|
182
|
+
if (data.error) {
|
|
183
|
+
reject(new Error(data.error.message || 'Unknown error'));
|
|
184
|
+
} else {
|
|
185
|
+
resolve(data.result);
|
|
186
|
+
}
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// Handle notifications from host
|
|
191
|
+
if (data.method) {
|
|
192
|
+
handleNotification(data.method, data.params);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// Handle notifications from host
|
|
197
|
+
function handleNotification(method, params) {
|
|
198
|
+
switch (method) {
|
|
199
|
+
case '${types_1.MCP_APPS_METHODS.TOOL_INPUT}':
|
|
200
|
+
window.dispatchEvent(new CustomEvent('mcp:tool-input', { detail: params }));
|
|
201
|
+
break;
|
|
202
|
+
case '${types_1.MCP_APPS_METHODS.TOOL_INPUT_PARTIAL}':
|
|
203
|
+
window.dispatchEvent(new CustomEvent('mcp:tool-input-partial', { detail: params }));
|
|
204
|
+
break;
|
|
205
|
+
case '${types_1.MCP_APPS_METHODS.TOOL_RESULT}':
|
|
206
|
+
window.dispatchEvent(new CustomEvent('mcp:tool-result', { detail: params }));
|
|
207
|
+
break;
|
|
208
|
+
case '${types_1.MCP_APPS_METHODS.TOOL_CANCELLED}':
|
|
209
|
+
window.dispatchEvent(new CustomEvent('mcp:tool-cancelled', { detail: params }));
|
|
210
|
+
break;
|
|
211
|
+
case '${types_1.MCP_APPS_METHODS.SIZE_CHANGE}':
|
|
212
|
+
window.dispatchEvent(new CustomEvent('mcp:size-change', { detail: params }));
|
|
213
|
+
break;
|
|
214
|
+
case '${types_1.MCP_APPS_METHODS.HOST_CONTEXT_CHANGE}':
|
|
215
|
+
Object.assign(hostContext, params.changes);
|
|
216
|
+
window.dispatchEvent(new CustomEvent('mcp:context-change', { detail: params.changes }));
|
|
217
|
+
// Update theme if changed
|
|
218
|
+
if (params.changes.theme) {
|
|
219
|
+
document.documentElement.setAttribute('data-theme', params.changes.theme);
|
|
220
|
+
}
|
|
221
|
+
break;
|
|
222
|
+
case '${types_1.MCP_APPS_METHODS.RESOURCE_TEARDOWN}':
|
|
223
|
+
window.dispatchEvent(new CustomEvent('mcp:teardown', { detail: params }));
|
|
224
|
+
break;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
// Initialize connection with host
|
|
229
|
+
async function initialize() {
|
|
230
|
+
if (initialized) return hostContext;
|
|
231
|
+
|
|
232
|
+
try {
|
|
233
|
+
const result = await sendRequest('${types_1.MCP_APPS_METHODS.INITIALIZE}', {
|
|
234
|
+
protocolVersion: MCP_PROTOCOL_VERSION,
|
|
235
|
+
capabilities: {
|
|
236
|
+
messages: ['${types_1.MCP_APPS_METHODS.TOOL_INPUT}', '${types_1.MCP_APPS_METHODS.TOOL_RESULT}']
|
|
237
|
+
}
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
hostContext = result.hostContext || {};
|
|
241
|
+
initialized = true;
|
|
242
|
+
|
|
243
|
+
// Apply initial theme
|
|
244
|
+
if (hostContext.theme) {
|
|
245
|
+
document.documentElement.setAttribute('data-theme', hostContext.theme);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// Send initialized notification
|
|
249
|
+
sendNotification('${types_1.MCP_APPS_METHODS.INITIALIZED}', {});
|
|
250
|
+
|
|
251
|
+
log('Initialized with context:', hostContext);
|
|
252
|
+
window.dispatchEvent(new CustomEvent('mcp:initialized', { detail: hostContext }));
|
|
253
|
+
|
|
254
|
+
return hostContext;
|
|
255
|
+
} catch (error) {
|
|
256
|
+
console.error('[MCP Bridge] Initialization failed:', error);
|
|
257
|
+
throw error;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// Public API
|
|
262
|
+
window.mcpBridge = {
|
|
263
|
+
// Initialize connection
|
|
264
|
+
initialize: initialize,
|
|
265
|
+
|
|
266
|
+
// Get current host context
|
|
267
|
+
getHostContext: function() {
|
|
268
|
+
return { ...hostContext };
|
|
269
|
+
},
|
|
270
|
+
|
|
271
|
+
// Get tool info
|
|
272
|
+
getToolInfo: function() {
|
|
273
|
+
return hostContext.toolInfo;
|
|
274
|
+
},
|
|
275
|
+
|
|
276
|
+
// Call a tool on the MCP server
|
|
277
|
+
callTool: function(name, args) {
|
|
278
|
+
return sendRequest('${types_1.MCP_APPS_METHODS.TOOLS_CALL}', { name, arguments: args });
|
|
279
|
+
},
|
|
280
|
+
|
|
281
|
+
// Read a resource
|
|
282
|
+
readResource: function(uri) {
|
|
283
|
+
return sendRequest('${types_1.MCP_APPS_METHODS.RESOURCES_READ}', { uri });
|
|
284
|
+
},
|
|
285
|
+
|
|
286
|
+
// Request host to open a link
|
|
287
|
+
openLink: function(url) {
|
|
288
|
+
return sendRequest('${types_1.MCP_APPS_METHODS.OPEN_LINK}', { url });
|
|
289
|
+
},
|
|
290
|
+
|
|
291
|
+
// Send message to host's chat
|
|
292
|
+
sendMessage: function(content) {
|
|
293
|
+
return sendRequest('${types_1.MCP_APPS_METHODS.MESSAGE}', { content });
|
|
294
|
+
},
|
|
295
|
+
|
|
296
|
+
// Log message to host
|
|
297
|
+
log: function(level, message, data) {
|
|
298
|
+
sendNotification('${types_1.MCP_APPS_METHODS.NOTIFICATIONS_MESSAGE}', {
|
|
299
|
+
level: level,
|
|
300
|
+
logger: 'mcp-app',
|
|
301
|
+
data: { message, ...data }
|
|
302
|
+
});
|
|
303
|
+
},
|
|
304
|
+
|
|
305
|
+
// Ping host
|
|
306
|
+
ping: function() {
|
|
307
|
+
return sendRequest('${types_1.MCP_APPS_METHODS.PING}', {});
|
|
308
|
+
},
|
|
309
|
+
|
|
310
|
+
// Check if initialized
|
|
311
|
+
isInitialized: function() {
|
|
312
|
+
return initialized;
|
|
313
|
+
},
|
|
314
|
+
|
|
315
|
+
// Protocol version
|
|
316
|
+
protocolVersion: MCP_PROTOCOL_VERSION
|
|
317
|
+
};
|
|
318
|
+
|
|
319
|
+
// Listen for messages
|
|
320
|
+
window.addEventListener('message', handleMessage);
|
|
321
|
+
|
|
322
|
+
// Auto-initialize when DOM is ready
|
|
323
|
+
if (document.readyState === 'loading') {
|
|
324
|
+
document.addEventListener('DOMContentLoaded', function() {
|
|
325
|
+
initialize().catch(function(err) {
|
|
326
|
+
log('Auto-init failed:', err);
|
|
327
|
+
});
|
|
328
|
+
});
|
|
329
|
+
} else {
|
|
330
|
+
initialize().catch(function(err) {
|
|
331
|
+
log('Auto-init failed:', err);
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
log('Bridge loaded');
|
|
336
|
+
})();
|
|
337
|
+
</script>`;
|
|
338
|
+
}
|
|
339
|
+
// ============================================
|
|
340
|
+
// Helper Functions
|
|
341
|
+
// ============================================
|
|
342
|
+
/**
|
|
343
|
+
* Build data attributes for initial state injection.
|
|
344
|
+
*/
|
|
345
|
+
function buildDataAttributes(options) {
|
|
346
|
+
const attrs = [];
|
|
347
|
+
if (options.toolInfo) {
|
|
348
|
+
attrs.push(`data-mcp-tool="${escapeAttr(JSON.stringify(options.toolInfo))}"`);
|
|
349
|
+
}
|
|
350
|
+
if (options.input) {
|
|
351
|
+
attrs.push(`data-mcp-input="${escapeAttr(JSON.stringify(options.input))}"`);
|
|
352
|
+
}
|
|
353
|
+
if (options.output !== undefined) {
|
|
354
|
+
attrs.push(`data-mcp-output="${escapeAttr(JSON.stringify(options.output))}"`);
|
|
355
|
+
}
|
|
356
|
+
if (options.structuredContent !== undefined) {
|
|
357
|
+
attrs.push(`data-mcp-structured="${escapeAttr(JSON.stringify(options.structuredContent))}"`);
|
|
358
|
+
}
|
|
359
|
+
return attrs.join(' ');
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* Escape HTML content.
|
|
363
|
+
*/
|
|
364
|
+
function escapeHtml(str) {
|
|
365
|
+
return str.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* Escape HTML attribute value.
|
|
369
|
+
*/
|
|
370
|
+
function escapeAttr(str) {
|
|
371
|
+
return str
|
|
372
|
+
.replace(/&/g, '&')
|
|
373
|
+
.replace(/"/g, '"')
|
|
374
|
+
.replace(/'/g, ''')
|
|
375
|
+
.replace(/</g, '<')
|
|
376
|
+
.replace(/>/g, '>');
|
|
377
|
+
}
|
|
378
|
+
// ============================================
|
|
379
|
+
// Utility Functions
|
|
380
|
+
// ============================================
|
|
381
|
+
/**
|
|
382
|
+
* Wrap existing HTML content in MCP Apps template.
|
|
383
|
+
*
|
|
384
|
+
* @param html - Existing HTML content
|
|
385
|
+
* @param options - Template options (without bodyContent)
|
|
386
|
+
* @returns Complete MCP Apps HTML document
|
|
387
|
+
*/
|
|
388
|
+
function wrapInMcpAppsTemplate(html, options) {
|
|
389
|
+
return generateMcpAppsTemplate({
|
|
390
|
+
...options,
|
|
391
|
+
bodyContent: html,
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Create a minimal MCP Apps template for simple content.
|
|
396
|
+
*
|
|
397
|
+
* @param content - Simple text or HTML content
|
|
398
|
+
* @param title - Page title
|
|
399
|
+
* @returns Complete MCP Apps HTML document
|
|
400
|
+
*/
|
|
401
|
+
function createSimpleMcpAppsTemplate(content, title) {
|
|
402
|
+
return generateMcpAppsTemplate({
|
|
403
|
+
title: title || 'MCP App',
|
|
404
|
+
bodyContent: `<div class="mcp-content">${content}</div>`,
|
|
405
|
+
includeBridge: true,
|
|
406
|
+
});
|
|
407
|
+
}
|
|
408
|
+
/**
|
|
409
|
+
* Extract body content from MCP Apps template.
|
|
410
|
+
* Useful for testing.
|
|
411
|
+
*
|
|
412
|
+
* @param html - Complete HTML document
|
|
413
|
+
* @returns Body content string or null
|
|
414
|
+
*/
|
|
415
|
+
function extractBodyContent(html) {
|
|
416
|
+
const match = html.match(/<body[^>]*>([\s\S]*?)<script/);
|
|
417
|
+
return match ? match[1].trim() : null;
|
|
418
|
+
}
|
|
419
|
+
//# sourceMappingURL=template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../../src/mcp-apps/template.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @file template.ts\n * @description MCP Apps HTML template generator.\n *\n * Generates standard HTML5 documents with embedded MCP bridge for MCP Apps spec compliance.\n *\n * @module @frontmcp/sdk/mcp-apps/template\n */\n\nimport type { McpAppsCSP, McpAppsHostContext, ToolInfo } from './types';\nimport { MCP_APPS_MIME_TYPE, MCP_APPS_PROTOCOL_VERSION, MCP_APPS_METHODS } from './types';\nimport { buildCSPMetaTag } from './csp';\n\n// ============================================\n// Template Options\n// ============================================\n\n/**\n * Options for generating MCP Apps HTML template.\n */\nexport interface McpAppsTemplateOptions {\n /** Tool information */\n toolInfo?: ToolInfo;\n /** Tool input arguments */\n input?: Record<string, unknown>;\n /** Tool output/result */\n output?: unknown;\n /** Structured content for UI rendering */\n structuredContent?: unknown;\n /** Content Security Policy */\n csp?: McpAppsCSP;\n /** Page title */\n title?: string;\n /** Additional head content (styles, meta tags) */\n headContent?: string;\n /** Main body content (HTML) */\n bodyContent: string;\n /** Additional scripts to include */\n scripts?: string[];\n /** Whether to include the MCP bridge runtime */\n includeBridge?: boolean;\n /** Custom bridge configuration */\n bridgeConfig?: McpAppsBridgeConfig;\n /** Initial theme */\n theme?: 'light' | 'dark';\n /** Debug mode - adds console logging */\n debug?: boolean;\n}\n\n/**\n * MCP Apps bridge configuration.\n */\nexport interface McpAppsBridgeConfig {\n /** Protocol version */\n protocolVersion?: string;\n /** Trusted origin for postMessage */\n trustedOrigin?: string;\n /** Request timeout in milliseconds */\n requestTimeout?: number;\n}\n\n// ============================================\n// Template Generator\n// ============================================\n\n/**\n * Generate MCP Apps compliant HTML5 document.\n *\n * @param options - Template options\n * @returns Complete HTML5 document string\n *\n * @example\n * ```typescript\n * const html = generateMcpAppsTemplate({\n * title: 'Weather Dashboard',\n * bodyContent: '<div id=\"weather\">Loading...</div>',\n * toolInfo: { tool: { name: 'get_weather' } },\n * input: { city: 'San Francisco' },\n * output: { temperature: 72, condition: 'sunny' },\n * csp: { connectDomains: ['https://api.weather.com'] },\n * });\n * ```\n */\nexport function generateMcpAppsTemplate(options: McpAppsTemplateOptions): string {\n const {\n toolInfo,\n input,\n output,\n structuredContent,\n csp,\n title = 'MCP App',\n headContent = '',\n bodyContent,\n scripts = [],\n includeBridge = true,\n bridgeConfig,\n theme = 'light',\n debug = false,\n } = options;\n\n // Build CSP meta tag\n const cspMeta = buildCSPMetaTag(csp);\n\n // Build data attributes for initial state\n const dataAttrs = buildDataAttributes({ toolInfo, input, output, structuredContent });\n\n // Build bridge script\n const bridgeScript = includeBridge ? generateBridgeScript({ ...bridgeConfig, debug }) : '';\n\n // Build additional scripts\n const additionalScripts = scripts.map((s) => `<script>${s}</script>`).join('\\n');\n\n return `<!DOCTYPE html>\n<html lang=\"en\" data-theme=\"${escapeAttr(theme)}\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n ${cspMeta}\n <meta name=\"mcp-apps-version\" content=\"${MCP_APPS_PROTOCOL_VERSION}\">\n <meta name=\"mcp-apps-mime-type\" content=\"${MCP_APPS_MIME_TYPE}\">\n <title>${escapeHtml(title)}</title>\n <style>\n :root {\n --mcp-bg: #ffffff;\n --mcp-text: #1a1a1a;\n --mcp-border: #e5e5e5;\n --mcp-primary: #0969da;\n --mcp-error: #cf222e;\n --mcp-success: #1a7f37;\n }\n [data-theme=\"dark\"] {\n --mcp-bg: #0d1117;\n --mcp-text: #c9d1d9;\n --mcp-border: #30363d;\n --mcp-primary: #58a6ff;\n --mcp-error: #f85149;\n --mcp-success: #3fb950;\n }\n * { box-sizing: border-box; }\n body {\n margin: 0;\n padding: 16px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n background: var(--mcp-bg);\n color: var(--mcp-text);\n line-height: 1.5;\n }\n </style>\n ${headContent}\n</head>\n<body ${dataAttrs}>\n ${bodyContent}\n ${bridgeScript}\n ${additionalScripts}\n</body>\n</html>`;\n}\n\n// ============================================\n// Bridge Script Generator\n// ============================================\n\n/**\n * Generate the MCP Apps bridge runtime script.\n */\nfunction generateBridgeScript(config?: McpAppsBridgeConfig & { debug?: boolean }): string {\n const {\n protocolVersion = MCP_APPS_PROTOCOL_VERSION,\n trustedOrigin = '*',\n requestTimeout = 30000,\n debug = false,\n } = config || {};\n\n return `<script>\n(function() {\n 'use strict';\n\n // MCP Apps Bridge Runtime\n const MCP_PROTOCOL_VERSION = '${protocolVersion}';\n const REQUEST_TIMEOUT = ${requestTimeout};\n const DEBUG = ${debug};\n\n // State\n let initialized = false;\n let hostContext = {};\n let pendingRequests = new Map();\n let messageId = 0;\n let trustedOrigin = '${trustedOrigin}';\n\n // Logging\n function log(...args) {\n if (DEBUG) console.log('[MCP Bridge]', ...args);\n }\n\n // Generate unique message ID\n function nextId() {\n return ++messageId;\n }\n\n // Send JSON-RPC message to host\n function sendMessage(message) {\n log('Sending:', message);\n parent.postMessage(message, trustedOrigin);\n }\n\n // Send JSON-RPC request and wait for response\n function sendRequest(method, params) {\n return new Promise((resolve, reject) => {\n const id = nextId();\n const request = {\n jsonrpc: '2.0',\n id: id,\n method: method,\n params: params\n };\n\n const timeout = setTimeout(() => {\n pendingRequests.delete(id);\n reject(new Error('Request timeout: ' + method));\n }, REQUEST_TIMEOUT);\n\n pendingRequests.set(id, { resolve, reject, timeout });\n sendMessage(request);\n });\n }\n\n // Send JSON-RPC notification (no response expected)\n function sendNotification(method, params) {\n sendMessage({\n jsonrpc: '2.0',\n method: method,\n params: params\n });\n }\n\n // Handle incoming messages from host\n function handleMessage(event) {\n // Validate origin on first message (trust-on-first-use)\n if (trustedOrigin === '*' && event.origin) {\n trustedOrigin = event.origin;\n log('Trusted origin set to:', trustedOrigin);\n }\n\n const data = event.data;\n if (!data || data.jsonrpc !== '2.0') return;\n\n log('Received:', data);\n\n // Handle response to our request\n if (data.id !== undefined && pendingRequests.has(data.id)) {\n const { resolve, reject, timeout } = pendingRequests.get(data.id);\n clearTimeout(timeout);\n pendingRequests.delete(data.id);\n\n if (data.error) {\n reject(new Error(data.error.message || 'Unknown error'));\n } else {\n resolve(data.result);\n }\n return;\n }\n\n // Handle notifications from host\n if (data.method) {\n handleNotification(data.method, data.params);\n }\n }\n\n // Handle notifications from host\n function handleNotification(method, params) {\n switch (method) {\n case '${MCP_APPS_METHODS.TOOL_INPUT}':\n window.dispatchEvent(new CustomEvent('mcp:tool-input', { detail: params }));\n break;\n case '${MCP_APPS_METHODS.TOOL_INPUT_PARTIAL}':\n window.dispatchEvent(new CustomEvent('mcp:tool-input-partial', { detail: params }));\n break;\n case '${MCP_APPS_METHODS.TOOL_RESULT}':\n window.dispatchEvent(new CustomEvent('mcp:tool-result', { detail: params }));\n break;\n case '${MCP_APPS_METHODS.TOOL_CANCELLED}':\n window.dispatchEvent(new CustomEvent('mcp:tool-cancelled', { detail: params }));\n break;\n case '${MCP_APPS_METHODS.SIZE_CHANGE}':\n window.dispatchEvent(new CustomEvent('mcp:size-change', { detail: params }));\n break;\n case '${MCP_APPS_METHODS.HOST_CONTEXT_CHANGE}':\n Object.assign(hostContext, params.changes);\n window.dispatchEvent(new CustomEvent('mcp:context-change', { detail: params.changes }));\n // Update theme if changed\n if (params.changes.theme) {\n document.documentElement.setAttribute('data-theme', params.changes.theme);\n }\n break;\n case '${MCP_APPS_METHODS.RESOURCE_TEARDOWN}':\n window.dispatchEvent(new CustomEvent('mcp:teardown', { detail: params }));\n break;\n }\n }\n\n // Initialize connection with host\n async function initialize() {\n if (initialized) return hostContext;\n\n try {\n const result = await sendRequest('${MCP_APPS_METHODS.INITIALIZE}', {\n protocolVersion: MCP_PROTOCOL_VERSION,\n capabilities: {\n messages: ['${MCP_APPS_METHODS.TOOL_INPUT}', '${MCP_APPS_METHODS.TOOL_RESULT}']\n }\n });\n\n hostContext = result.hostContext || {};\n initialized = true;\n\n // Apply initial theme\n if (hostContext.theme) {\n document.documentElement.setAttribute('data-theme', hostContext.theme);\n }\n\n // Send initialized notification\n sendNotification('${MCP_APPS_METHODS.INITIALIZED}', {});\n\n log('Initialized with context:', hostContext);\n window.dispatchEvent(new CustomEvent('mcp:initialized', { detail: hostContext }));\n\n return hostContext;\n } catch (error) {\n console.error('[MCP Bridge] Initialization failed:', error);\n throw error;\n }\n }\n\n // Public API\n window.mcpBridge = {\n // Initialize connection\n initialize: initialize,\n\n // Get current host context\n getHostContext: function() {\n return { ...hostContext };\n },\n\n // Get tool info\n getToolInfo: function() {\n return hostContext.toolInfo;\n },\n\n // Call a tool on the MCP server\n callTool: function(name, args) {\n return sendRequest('${MCP_APPS_METHODS.TOOLS_CALL}', { name, arguments: args });\n },\n\n // Read a resource\n readResource: function(uri) {\n return sendRequest('${MCP_APPS_METHODS.RESOURCES_READ}', { uri });\n },\n\n // Request host to open a link\n openLink: function(url) {\n return sendRequest('${MCP_APPS_METHODS.OPEN_LINK}', { url });\n },\n\n // Send message to host's chat\n sendMessage: function(content) {\n return sendRequest('${MCP_APPS_METHODS.MESSAGE}', { content });\n },\n\n // Log message to host\n log: function(level, message, data) {\n sendNotification('${MCP_APPS_METHODS.NOTIFICATIONS_MESSAGE}', {\n level: level,\n logger: 'mcp-app',\n data: { message, ...data }\n });\n },\n\n // Ping host\n ping: function() {\n return sendRequest('${MCP_APPS_METHODS.PING}', {});\n },\n\n // Check if initialized\n isInitialized: function() {\n return initialized;\n },\n\n // Protocol version\n protocolVersion: MCP_PROTOCOL_VERSION\n };\n\n // Listen for messages\n window.addEventListener('message', handleMessage);\n\n // Auto-initialize when DOM is ready\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', function() {\n initialize().catch(function(err) {\n log('Auto-init failed:', err);\n });\n });\n } else {\n initialize().catch(function(err) {\n log('Auto-init failed:', err);\n });\n }\n\n log('Bridge loaded');\n})();\n</script>`;\n}\n\n// ============================================\n// Helper Functions\n// ============================================\n\n/**\n * Build data attributes for initial state injection.\n */\nfunction buildDataAttributes(options: {\n toolInfo?: ToolInfo;\n input?: Record<string, unknown>;\n output?: unknown;\n structuredContent?: unknown;\n}): string {\n const attrs: string[] = [];\n\n if (options.toolInfo) {\n attrs.push(`data-mcp-tool=\"${escapeAttr(JSON.stringify(options.toolInfo))}\"`);\n }\n\n if (options.input) {\n attrs.push(`data-mcp-input=\"${escapeAttr(JSON.stringify(options.input))}\"`);\n }\n\n if (options.output !== undefined) {\n attrs.push(`data-mcp-output=\"${escapeAttr(JSON.stringify(options.output))}\"`);\n }\n\n if (options.structuredContent !== undefined) {\n attrs.push(`data-mcp-structured=\"${escapeAttr(JSON.stringify(options.structuredContent))}\"`);\n }\n\n return attrs.join(' ');\n}\n\n/**\n * Escape HTML content.\n */\nfunction escapeHtml(str: string): string {\n return str.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\n}\n\n/**\n * Escape HTML attribute value.\n */\nfunction escapeAttr(str: string): string {\n return str\n .replace(/&/g, '&')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(/</g, '<')\n .replace(/>/g, '>');\n}\n\n// ============================================\n// Utility Functions\n// ============================================\n\n/**\n * Wrap existing HTML content in MCP Apps template.\n *\n * @param html - Existing HTML content\n * @param options - Template options (without bodyContent)\n * @returns Complete MCP Apps HTML document\n */\nexport function wrapInMcpAppsTemplate(html: string, options: Omit<McpAppsTemplateOptions, 'bodyContent'>): string {\n return generateMcpAppsTemplate({\n ...options,\n bodyContent: html,\n });\n}\n\n/**\n * Create a minimal MCP Apps template for simple content.\n *\n * @param content - Simple text or HTML content\n * @param title - Page title\n * @returns Complete MCP Apps HTML document\n */\nexport function createSimpleMcpAppsTemplate(content: string, title?: string): string {\n return generateMcpAppsTemplate({\n title: title || 'MCP App',\n bodyContent: `<div class=\"mcp-content\">${content}</div>`,\n includeBridge: true,\n });\n}\n\n/**\n * Extract body content from MCP Apps template.\n * Useful for testing.\n *\n * @param html - Complete HTML document\n * @returns Body content string or null\n */\nexport function extractBodyContent(html: string): string | null {\n const match = html.match(/<body[^>]*>([\\s\\S]*?)<script/);\n return match ? match[1].trim() : null;\n}\n"]}
|