@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,189 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authorization Required Error
|
|
3
|
+
*
|
|
4
|
+
* Thrown when a tool requires app-level authorization that the user has not granted.
|
|
5
|
+
* Used for progressive/incremental authorization flow where users can skip apps
|
|
6
|
+
* during initial auth and authorize later when needed.
|
|
7
|
+
*
|
|
8
|
+
* Behavior depends on session mode:
|
|
9
|
+
* - Stateful: Returns auth_url link for incremental authorization
|
|
10
|
+
* - Stateless: Returns unauthorized error (no link, must re-auth from scratch)
|
|
11
|
+
*
|
|
12
|
+
* Supports MCP elicit flow for clients that support it.
|
|
13
|
+
*/
|
|
14
|
+
import { z } from 'zod';
|
|
15
|
+
import { PublicMcpError } from './mcp.error';
|
|
16
|
+
/**
|
|
17
|
+
* Session mode determines how authorization state is stored
|
|
18
|
+
*/
|
|
19
|
+
export type SessionMode = 'stateful' | 'stateless';
|
|
20
|
+
/**
|
|
21
|
+
* Elicit response type for clients that support elicit flow
|
|
22
|
+
*/
|
|
23
|
+
export declare const elicitResponseSchema: z.ZodObject<{
|
|
24
|
+
elicitId: z.ZodString;
|
|
25
|
+
authUrl: z.ZodString;
|
|
26
|
+
message: z.ZodString;
|
|
27
|
+
appId: z.ZodString;
|
|
28
|
+
toolId: z.ZodString;
|
|
29
|
+
}, z.core.$strip>;
|
|
30
|
+
export type ElicitResponse = z.infer<typeof elicitResponseSchema>;
|
|
31
|
+
/**
|
|
32
|
+
* Schema for authorization required response data (stateful mode with link)
|
|
33
|
+
*/
|
|
34
|
+
export declare const authorizationRequiredDataSchema: z.ZodObject<{
|
|
35
|
+
error: z.ZodLiteral<"authorization_required">;
|
|
36
|
+
app: z.ZodString;
|
|
37
|
+
tool: z.ZodString;
|
|
38
|
+
auth_url: z.ZodOptional<z.ZodString>;
|
|
39
|
+
message: z.ZodString;
|
|
40
|
+
required_scopes: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
41
|
+
session_mode: z.ZodOptional<z.ZodEnum<{
|
|
42
|
+
stateful: "stateful";
|
|
43
|
+
stateless: "stateless";
|
|
44
|
+
}>>;
|
|
45
|
+
elicit_id: z.ZodOptional<z.ZodString>;
|
|
46
|
+
supports_incremental: z.ZodOptional<z.ZodBoolean>;
|
|
47
|
+
}, z.core.$strip>;
|
|
48
|
+
/**
|
|
49
|
+
* Schema for authorization required error constructor params
|
|
50
|
+
*/
|
|
51
|
+
export declare const authorizationRequiredParamsSchema: z.ZodObject<{
|
|
52
|
+
appId: z.ZodString;
|
|
53
|
+
toolId: z.ZodString;
|
|
54
|
+
authUrl: z.ZodOptional<z.ZodString>;
|
|
55
|
+
requiredScopes: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
56
|
+
message: z.ZodOptional<z.ZodString>;
|
|
57
|
+
sessionMode: z.ZodOptional<z.ZodEnum<{
|
|
58
|
+
stateful: "stateful";
|
|
59
|
+
stateless: "stateless";
|
|
60
|
+
}>>;
|
|
61
|
+
elicitId: z.ZodOptional<z.ZodString>;
|
|
62
|
+
vaultId: z.ZodOptional<z.ZodString>;
|
|
63
|
+
pendingAuthId: z.ZodOptional<z.ZodString>;
|
|
64
|
+
}, z.core.$strip>;
|
|
65
|
+
/**
|
|
66
|
+
* Schema for the _meta field in MCP error response
|
|
67
|
+
*/
|
|
68
|
+
export declare const authorizationRequiredMetaSchema: z.ZodObject<{
|
|
69
|
+
errorId: z.ZodString;
|
|
70
|
+
code: z.ZodString;
|
|
71
|
+
timestamp: z.ZodString;
|
|
72
|
+
authorization_required: z.ZodLiteral<true>;
|
|
73
|
+
app: z.ZodString;
|
|
74
|
+
tool: z.ZodString;
|
|
75
|
+
auth_url: z.ZodOptional<z.ZodString>;
|
|
76
|
+
required_scopes: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
77
|
+
session_mode: z.ZodEnum<{
|
|
78
|
+
stateful: "stateful";
|
|
79
|
+
stateless: "stateless";
|
|
80
|
+
}>;
|
|
81
|
+
supports_incremental: z.ZodBoolean;
|
|
82
|
+
elicit_id: z.ZodOptional<z.ZodString>;
|
|
83
|
+
pending_auth_id: z.ZodOptional<z.ZodString>;
|
|
84
|
+
}, z.core.$strip>;
|
|
85
|
+
/**
|
|
86
|
+
* Data structure for authorization required responses
|
|
87
|
+
*/
|
|
88
|
+
export type AuthorizationRequiredData = z.infer<typeof authorizationRequiredDataSchema>;
|
|
89
|
+
/**
|
|
90
|
+
* Constructor params for AuthorizationRequiredError
|
|
91
|
+
*/
|
|
92
|
+
export type AuthorizationRequiredParams = z.infer<typeof authorizationRequiredParamsSchema>;
|
|
93
|
+
/**
|
|
94
|
+
* Meta field type for MCP error response
|
|
95
|
+
*/
|
|
96
|
+
export type AuthorizationRequiredMeta = z.infer<typeof authorizationRequiredMetaSchema>;
|
|
97
|
+
/**
|
|
98
|
+
* Error thrown when a tool's parent app requires authorization.
|
|
99
|
+
* This enables progressive authorization where users can authorize apps
|
|
100
|
+
* incrementally as needed rather than all at once.
|
|
101
|
+
*
|
|
102
|
+
* Behavior depends on session mode:
|
|
103
|
+
* - **Stateful**: Returns auth_url link for incremental authorization
|
|
104
|
+
* - User can click link to authorize without full re-authentication
|
|
105
|
+
* - Supports elicit flow for interactive authorization
|
|
106
|
+
* - **Stateless**: Returns unauthorized error only
|
|
107
|
+
* - No link provided (all state in JWT, cannot extend)
|
|
108
|
+
* - User must re-authenticate from scratch
|
|
109
|
+
*
|
|
110
|
+
* @example
|
|
111
|
+
* ```typescript
|
|
112
|
+
* // Stateful mode - can provide auth link
|
|
113
|
+
* throw new AuthorizationRequiredError({
|
|
114
|
+
* appId: 'slack',
|
|
115
|
+
* toolId: 'slack:send_message',
|
|
116
|
+
* authUrl: '/oauth/authorize?app=slack',
|
|
117
|
+
* sessionMode: 'stateful',
|
|
118
|
+
* message: 'Please authorize Slack to use this tool.',
|
|
119
|
+
* });
|
|
120
|
+
*
|
|
121
|
+
* // Stateless mode - no link, must re-auth
|
|
122
|
+
* throw new AuthorizationRequiredError({
|
|
123
|
+
* appId: 'slack',
|
|
124
|
+
* toolId: 'slack:send_message',
|
|
125
|
+
* sessionMode: 'stateless',
|
|
126
|
+
* message: 'You are not authorized to use this tool.',
|
|
127
|
+
* });
|
|
128
|
+
* ```
|
|
129
|
+
*/
|
|
130
|
+
export declare class AuthorizationRequiredError extends PublicMcpError {
|
|
131
|
+
/** App ID that requires authorization */
|
|
132
|
+
readonly appId: string;
|
|
133
|
+
/** Tool ID that triggered the authorization requirement */
|
|
134
|
+
readonly toolId: string;
|
|
135
|
+
/** URL to authorize the app (only available in stateful mode) */
|
|
136
|
+
readonly authUrl?: string;
|
|
137
|
+
/** Scopes required by the tool (optional) */
|
|
138
|
+
readonly requiredScopes?: string[];
|
|
139
|
+
/** Session mode determines if incremental auth is supported */
|
|
140
|
+
readonly sessionMode: SessionMode;
|
|
141
|
+
/** Elicit ID if using elicit flow */
|
|
142
|
+
readonly elicitId?: string;
|
|
143
|
+
/** Vault ID for stateful sessions */
|
|
144
|
+
readonly vaultId?: string;
|
|
145
|
+
/** Pending auth ID for tracking */
|
|
146
|
+
readonly pendingAuthId?: string;
|
|
147
|
+
/** Whether incremental authorization is supported */
|
|
148
|
+
readonly supportsIncremental: boolean;
|
|
149
|
+
constructor(params: AuthorizationRequiredParams);
|
|
150
|
+
/**
|
|
151
|
+
* Convert to MCP error response format with authorization metadata.
|
|
152
|
+
* The _meta field includes structured data that AI agents can use
|
|
153
|
+
* to prompt users for authorization.
|
|
154
|
+
*
|
|
155
|
+
* In stateful mode: includes auth_url for AI to display
|
|
156
|
+
* In stateless mode: no auth_url, AI should inform user to re-authenticate
|
|
157
|
+
*/
|
|
158
|
+
toMcpError(isDevelopment?: boolean): {
|
|
159
|
+
content: Array<{
|
|
160
|
+
type: 'text';
|
|
161
|
+
text: string;
|
|
162
|
+
}>;
|
|
163
|
+
isError: true;
|
|
164
|
+
_meta: AuthorizationRequiredMeta;
|
|
165
|
+
};
|
|
166
|
+
/**
|
|
167
|
+
* Convert to structured authorization required data
|
|
168
|
+
*/
|
|
169
|
+
toAuthorizationRequiredData(): AuthorizationRequiredData;
|
|
170
|
+
/**
|
|
171
|
+
* Create an elicit response for clients that support it
|
|
172
|
+
* Only available in stateful mode
|
|
173
|
+
*/
|
|
174
|
+
toElicitResponse(): ElicitResponse | null;
|
|
175
|
+
/**
|
|
176
|
+
* Check if this error can be resolved via incremental auth link
|
|
177
|
+
*/
|
|
178
|
+
canUseIncrementalAuth(): boolean;
|
|
179
|
+
/**
|
|
180
|
+
* Get user-facing message based on mode
|
|
181
|
+
* - Stateful: includes link text
|
|
182
|
+
* - Stateless: tells user to re-authenticate
|
|
183
|
+
*/
|
|
184
|
+
getUserFacingMessage(): string;
|
|
185
|
+
/**
|
|
186
|
+
* Get message for cancelled authorization
|
|
187
|
+
*/
|
|
188
|
+
static getCancelledMessage(appId: string, toolId: string, authUrl?: string): string;
|
|
189
|
+
}
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AuthorizationRequiredError = exports.authorizationRequiredMetaSchema = exports.authorizationRequiredParamsSchema = exports.authorizationRequiredDataSchema = exports.elicitResponseSchema = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Authorization Required Error
|
|
6
|
+
*
|
|
7
|
+
* Thrown when a tool requires app-level authorization that the user has not granted.
|
|
8
|
+
* Used for progressive/incremental authorization flow where users can skip apps
|
|
9
|
+
* during initial auth and authorize later when needed.
|
|
10
|
+
*
|
|
11
|
+
* Behavior depends on session mode:
|
|
12
|
+
* - Stateful: Returns auth_url link for incremental authorization
|
|
13
|
+
* - Stateless: Returns unauthorized error (no link, must re-auth from scratch)
|
|
14
|
+
*
|
|
15
|
+
* Supports MCP elicit flow for clients that support it.
|
|
16
|
+
*/
|
|
17
|
+
const zod_1 = require("zod");
|
|
18
|
+
const mcp_error_1 = require("./mcp.error");
|
|
19
|
+
/**
|
|
20
|
+
* Elicit response type for clients that support elicit flow
|
|
21
|
+
*/
|
|
22
|
+
exports.elicitResponseSchema = zod_1.z.object({
|
|
23
|
+
/** Elicit request ID for tracking */
|
|
24
|
+
elicitId: zod_1.z.string(),
|
|
25
|
+
/** Authorization URL to display */
|
|
26
|
+
authUrl: zod_1.z.string().url(),
|
|
27
|
+
/** Message to display to user */
|
|
28
|
+
message: zod_1.z.string(),
|
|
29
|
+
/** App being authorized */
|
|
30
|
+
appId: zod_1.z.string(),
|
|
31
|
+
/** Tool that triggered auth */
|
|
32
|
+
toolId: zod_1.z.string(),
|
|
33
|
+
});
|
|
34
|
+
// ============================================
|
|
35
|
+
// Schemas
|
|
36
|
+
// ============================================
|
|
37
|
+
/**
|
|
38
|
+
* Schema for authorization required response data (stateful mode with link)
|
|
39
|
+
*/
|
|
40
|
+
exports.authorizationRequiredDataSchema = zod_1.z.object({
|
|
41
|
+
/** Error type identifier */
|
|
42
|
+
error: zod_1.z.literal('authorization_required'),
|
|
43
|
+
/** App ID that requires authorization */
|
|
44
|
+
app: zod_1.z.string().min(1),
|
|
45
|
+
/** Tool ID that triggered the authorization requirement */
|
|
46
|
+
tool: zod_1.z.string().min(1),
|
|
47
|
+
/** URL to authorize the app (only in stateful mode) */
|
|
48
|
+
auth_url: zod_1.z.string().url().optional(),
|
|
49
|
+
/** Human-readable message */
|
|
50
|
+
message: zod_1.z.string(),
|
|
51
|
+
/** Scopes required by the tool (optional) */
|
|
52
|
+
required_scopes: zod_1.z.array(zod_1.z.string()).optional(),
|
|
53
|
+
/** Session mode that determines behavior */
|
|
54
|
+
session_mode: zod_1.z.enum(['stateful', 'stateless']).optional(),
|
|
55
|
+
/** Whether elicit flow is being used */
|
|
56
|
+
elicit_id: zod_1.z.string().optional(),
|
|
57
|
+
/** Whether client can use incremental auth link */
|
|
58
|
+
supports_incremental: zod_1.z.boolean().optional(),
|
|
59
|
+
});
|
|
60
|
+
/**
|
|
61
|
+
* Schema for authorization required error constructor params
|
|
62
|
+
*/
|
|
63
|
+
exports.authorizationRequiredParamsSchema = zod_1.z.object({
|
|
64
|
+
appId: zod_1.z.string().min(1),
|
|
65
|
+
toolId: zod_1.z.string().min(1),
|
|
66
|
+
authUrl: zod_1.z.string().optional(),
|
|
67
|
+
requiredScopes: zod_1.z.array(zod_1.z.string()).optional(),
|
|
68
|
+
message: zod_1.z.string().optional(),
|
|
69
|
+
/** Session mode - determines if auth link is included */
|
|
70
|
+
sessionMode: zod_1.z.enum(['stateful', 'stateless']).optional(),
|
|
71
|
+
/** Elicit ID if using elicit flow */
|
|
72
|
+
elicitId: zod_1.z.string().optional(),
|
|
73
|
+
/** Vault ID for stateful sessions */
|
|
74
|
+
vaultId: zod_1.z.string().optional(),
|
|
75
|
+
/** Pending auth ID for tracking */
|
|
76
|
+
pendingAuthId: zod_1.z.string().optional(),
|
|
77
|
+
});
|
|
78
|
+
/**
|
|
79
|
+
* Schema for the _meta field in MCP error response
|
|
80
|
+
*/
|
|
81
|
+
exports.authorizationRequiredMetaSchema = zod_1.z.object({
|
|
82
|
+
errorId: zod_1.z.string(),
|
|
83
|
+
code: zod_1.z.string(),
|
|
84
|
+
timestamp: zod_1.z.string(),
|
|
85
|
+
authorization_required: zod_1.z.literal(true),
|
|
86
|
+
app: zod_1.z.string(),
|
|
87
|
+
tool: zod_1.z.string(),
|
|
88
|
+
auth_url: zod_1.z.string().optional(),
|
|
89
|
+
required_scopes: zod_1.z.array(zod_1.z.string()).optional(),
|
|
90
|
+
session_mode: zod_1.z.enum(['stateful', 'stateless']),
|
|
91
|
+
supports_incremental: zod_1.z.boolean(),
|
|
92
|
+
elicit_id: zod_1.z.string().optional(),
|
|
93
|
+
pending_auth_id: zod_1.z.string().optional(),
|
|
94
|
+
});
|
|
95
|
+
// ============================================
|
|
96
|
+
// Error Class
|
|
97
|
+
// ============================================
|
|
98
|
+
/**
|
|
99
|
+
* Error thrown when a tool's parent app requires authorization.
|
|
100
|
+
* This enables progressive authorization where users can authorize apps
|
|
101
|
+
* incrementally as needed rather than all at once.
|
|
102
|
+
*
|
|
103
|
+
* Behavior depends on session mode:
|
|
104
|
+
* - **Stateful**: Returns auth_url link for incremental authorization
|
|
105
|
+
* - User can click link to authorize without full re-authentication
|
|
106
|
+
* - Supports elicit flow for interactive authorization
|
|
107
|
+
* - **Stateless**: Returns unauthorized error only
|
|
108
|
+
* - No link provided (all state in JWT, cannot extend)
|
|
109
|
+
* - User must re-authenticate from scratch
|
|
110
|
+
*
|
|
111
|
+
* @example
|
|
112
|
+
* ```typescript
|
|
113
|
+
* // Stateful mode - can provide auth link
|
|
114
|
+
* throw new AuthorizationRequiredError({
|
|
115
|
+
* appId: 'slack',
|
|
116
|
+
* toolId: 'slack:send_message',
|
|
117
|
+
* authUrl: '/oauth/authorize?app=slack',
|
|
118
|
+
* sessionMode: 'stateful',
|
|
119
|
+
* message: 'Please authorize Slack to use this tool.',
|
|
120
|
+
* });
|
|
121
|
+
*
|
|
122
|
+
* // Stateless mode - no link, must re-auth
|
|
123
|
+
* throw new AuthorizationRequiredError({
|
|
124
|
+
* appId: 'slack',
|
|
125
|
+
* toolId: 'slack:send_message',
|
|
126
|
+
* sessionMode: 'stateless',
|
|
127
|
+
* message: 'You are not authorized to use this tool.',
|
|
128
|
+
* });
|
|
129
|
+
* ```
|
|
130
|
+
*/
|
|
131
|
+
class AuthorizationRequiredError extends mcp_error_1.PublicMcpError {
|
|
132
|
+
/** App ID that requires authorization */
|
|
133
|
+
appId;
|
|
134
|
+
/** Tool ID that triggered the authorization requirement */
|
|
135
|
+
toolId;
|
|
136
|
+
/** URL to authorize the app (only available in stateful mode) */
|
|
137
|
+
authUrl;
|
|
138
|
+
/** Scopes required by the tool (optional) */
|
|
139
|
+
requiredScopes;
|
|
140
|
+
/** Session mode determines if incremental auth is supported */
|
|
141
|
+
sessionMode;
|
|
142
|
+
/** Elicit ID if using elicit flow */
|
|
143
|
+
elicitId;
|
|
144
|
+
/** Vault ID for stateful sessions */
|
|
145
|
+
vaultId;
|
|
146
|
+
/** Pending auth ID for tracking */
|
|
147
|
+
pendingAuthId;
|
|
148
|
+
/** Whether incremental authorization is supported */
|
|
149
|
+
supportsIncremental;
|
|
150
|
+
constructor(params) {
|
|
151
|
+
const sessionMode = params.sessionMode ?? 'stateful';
|
|
152
|
+
const supportsIncremental = sessionMode === 'stateful';
|
|
153
|
+
// Message differs based on mode
|
|
154
|
+
const defaultMessage = supportsIncremental
|
|
155
|
+
? `Authorization required for ${params.appId}. Please authorize to use ${params.toolId}.`
|
|
156
|
+
: `You are not authorized to use ${params.toolId}. Please re-authenticate to access this tool.`;
|
|
157
|
+
super(params.message || defaultMessage, 'AUTHORIZATION_REQUIRED', 403);
|
|
158
|
+
this.appId = params.appId;
|
|
159
|
+
this.toolId = params.toolId;
|
|
160
|
+
this.sessionMode = sessionMode;
|
|
161
|
+
this.supportsIncremental = supportsIncremental;
|
|
162
|
+
// Only set authUrl in stateful mode
|
|
163
|
+
if (supportsIncremental && params.authUrl) {
|
|
164
|
+
this.authUrl = params.authUrl;
|
|
165
|
+
}
|
|
166
|
+
this.requiredScopes = params.requiredScopes;
|
|
167
|
+
this.elicitId = params.elicitId;
|
|
168
|
+
this.vaultId = params.vaultId;
|
|
169
|
+
this.pendingAuthId = params.pendingAuthId;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Convert to MCP error response format with authorization metadata.
|
|
173
|
+
* The _meta field includes structured data that AI agents can use
|
|
174
|
+
* to prompt users for authorization.
|
|
175
|
+
*
|
|
176
|
+
* In stateful mode: includes auth_url for AI to display
|
|
177
|
+
* In stateless mode: no auth_url, AI should inform user to re-authenticate
|
|
178
|
+
*/
|
|
179
|
+
toMcpError(isDevelopment) {
|
|
180
|
+
// Build content text based on mode
|
|
181
|
+
let contentText = this.getPublicMessage();
|
|
182
|
+
if (this.supportsIncremental && this.authUrl) {
|
|
183
|
+
contentText += `\n\nTo authorize, click: ${this.authUrl}`;
|
|
184
|
+
}
|
|
185
|
+
else if (!this.supportsIncremental) {
|
|
186
|
+
contentText += '\n\nPlease re-authenticate to access this tool.';
|
|
187
|
+
}
|
|
188
|
+
return {
|
|
189
|
+
content: [
|
|
190
|
+
{
|
|
191
|
+
type: 'text',
|
|
192
|
+
text: contentText,
|
|
193
|
+
},
|
|
194
|
+
],
|
|
195
|
+
isError: true,
|
|
196
|
+
_meta: {
|
|
197
|
+
errorId: this.errorId,
|
|
198
|
+
code: this.code,
|
|
199
|
+
timestamp: new Date().toISOString(),
|
|
200
|
+
// Progressive auth specific fields for AI agents to use
|
|
201
|
+
authorization_required: true,
|
|
202
|
+
app: this.appId,
|
|
203
|
+
tool: this.toolId,
|
|
204
|
+
auth_url: this.authUrl,
|
|
205
|
+
required_scopes: this.requiredScopes,
|
|
206
|
+
session_mode: this.sessionMode,
|
|
207
|
+
supports_incremental: this.supportsIncremental,
|
|
208
|
+
elicit_id: this.elicitId,
|
|
209
|
+
pending_auth_id: this.pendingAuthId,
|
|
210
|
+
},
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Convert to structured authorization required data
|
|
215
|
+
*/
|
|
216
|
+
toAuthorizationRequiredData() {
|
|
217
|
+
return {
|
|
218
|
+
error: 'authorization_required',
|
|
219
|
+
app: this.appId,
|
|
220
|
+
tool: this.toolId,
|
|
221
|
+
auth_url: this.authUrl,
|
|
222
|
+
message: this.getPublicMessage(),
|
|
223
|
+
required_scopes: this.requiredScopes,
|
|
224
|
+
session_mode: this.sessionMode,
|
|
225
|
+
elicit_id: this.elicitId,
|
|
226
|
+
supports_incremental: this.supportsIncremental,
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Create an elicit response for clients that support it
|
|
231
|
+
* Only available in stateful mode
|
|
232
|
+
*/
|
|
233
|
+
toElicitResponse() {
|
|
234
|
+
if (!this.supportsIncremental || !this.authUrl || !this.elicitId) {
|
|
235
|
+
return null;
|
|
236
|
+
}
|
|
237
|
+
return {
|
|
238
|
+
elicitId: this.elicitId,
|
|
239
|
+
authUrl: this.authUrl,
|
|
240
|
+
message: this.getPublicMessage(),
|
|
241
|
+
appId: this.appId,
|
|
242
|
+
toolId: this.toolId,
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Check if this error can be resolved via incremental auth link
|
|
247
|
+
*/
|
|
248
|
+
canUseIncrementalAuth() {
|
|
249
|
+
return this.supportsIncremental && !!this.authUrl;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Get user-facing message based on mode
|
|
253
|
+
* - Stateful: includes link text
|
|
254
|
+
* - Stateless: tells user to re-authenticate
|
|
255
|
+
*/
|
|
256
|
+
getUserFacingMessage() {
|
|
257
|
+
if (this.supportsIncremental && this.authUrl) {
|
|
258
|
+
return `${this.getPublicMessage()}\n\nClick here to authorize: ${this.authUrl}`;
|
|
259
|
+
}
|
|
260
|
+
return `${this.getPublicMessage()}\n\nYou are not authorized to use this tool. Please re-authenticate to access it.`;
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Get message for cancelled authorization
|
|
264
|
+
*/
|
|
265
|
+
static getCancelledMessage(appId, toolId, authUrl) {
|
|
266
|
+
const baseMsg = `Authorization was cancelled. You are not authorized to use ${toolId}.`;
|
|
267
|
+
if (authUrl) {
|
|
268
|
+
return `${baseMsg}\n\nIf you still want to use this tool, click this link to authorize: ${authUrl}\n\nThen re-prompt your request to try again.`;
|
|
269
|
+
}
|
|
270
|
+
return `${baseMsg}\n\nPlease re-authenticate and try again.`;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
exports.AuthorizationRequiredError = AuthorizationRequiredError;
|
|
274
|
+
//# sourceMappingURL=authorization-required.error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authorization-required.error.js","sourceRoot":"","sources":["../../../src/errors/authorization-required.error.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Authorization Required Error\n *\n * Thrown when a tool requires app-level authorization that the user has not granted.\n * Used for progressive/incremental authorization flow where users can skip apps\n * during initial auth and authorize later when needed.\n *\n * Behavior depends on session mode:\n * - Stateful: Returns auth_url link for incremental authorization\n * - Stateless: Returns unauthorized error (no link, must re-auth from scratch)\n *\n * Supports MCP elicit flow for clients that support it.\n */\nimport { z } from 'zod';\nimport { PublicMcpError } from './mcp.error';\n\n// ============================================\n// Session Mode Types\n// ============================================\n\n/**\n * Session mode determines how authorization state is stored\n */\nexport type SessionMode = 'stateful' | 'stateless';\n\n/**\n * Elicit response type for clients that support elicit flow\n */\nexport const elicitResponseSchema = z.object({\n /** Elicit request ID for tracking */\n elicitId: z.string(),\n /** Authorization URL to display */\n authUrl: z.string().url(),\n /** Message to display to user */\n message: z.string(),\n /** App being authorized */\n appId: z.string(),\n /** Tool that triggered auth */\n toolId: z.string(),\n});\n\nexport type ElicitResponse = z.infer<typeof elicitResponseSchema>;\n\n// ============================================\n// Schemas\n// ============================================\n\n/**\n * Schema for authorization required response data (stateful mode with link)\n */\nexport const authorizationRequiredDataSchema = z.object({\n /** Error type identifier */\n error: z.literal('authorization_required'),\n /** App ID that requires authorization */\n app: z.string().min(1),\n /** Tool ID that triggered the authorization requirement */\n tool: z.string().min(1),\n /** URL to authorize the app (only in stateful mode) */\n auth_url: z.string().url().optional(),\n /** Human-readable message */\n message: z.string(),\n /** Scopes required by the tool (optional) */\n required_scopes: z.array(z.string()).optional(),\n /** Session mode that determines behavior */\n session_mode: z.enum(['stateful', 'stateless']).optional(),\n /** Whether elicit flow is being used */\n elicit_id: z.string().optional(),\n /** Whether client can use incremental auth link */\n supports_incremental: z.boolean().optional(),\n});\n\n/**\n * Schema for authorization required error constructor params\n */\nexport const authorizationRequiredParamsSchema = z.object({\n appId: z.string().min(1),\n toolId: z.string().min(1),\n authUrl: z.string().optional(),\n requiredScopes: z.array(z.string()).optional(),\n message: z.string().optional(),\n /** Session mode - determines if auth link is included */\n sessionMode: z.enum(['stateful', 'stateless']).optional(),\n /** Elicit ID if using elicit flow */\n elicitId: z.string().optional(),\n /** Vault ID for stateful sessions */\n vaultId: z.string().optional(),\n /** Pending auth ID for tracking */\n pendingAuthId: z.string().optional(),\n});\n\n/**\n * Schema for the _meta field in MCP error response\n */\nexport const authorizationRequiredMetaSchema = z.object({\n errorId: z.string(),\n code: z.string(),\n timestamp: z.string(),\n authorization_required: z.literal(true),\n app: z.string(),\n tool: z.string(),\n auth_url: z.string().optional(),\n required_scopes: z.array(z.string()).optional(),\n session_mode: z.enum(['stateful', 'stateless']),\n supports_incremental: z.boolean(),\n elicit_id: z.string().optional(),\n pending_auth_id: z.string().optional(),\n});\n\n// ============================================\n// Types (inferred from schemas)\n// ============================================\n\n/**\n * Data structure for authorization required responses\n */\nexport type AuthorizationRequiredData = z.infer<typeof authorizationRequiredDataSchema>;\n\n/**\n * Constructor params for AuthorizationRequiredError\n */\nexport type AuthorizationRequiredParams = z.infer<typeof authorizationRequiredParamsSchema>;\n\n/**\n * Meta field type for MCP error response\n */\nexport type AuthorizationRequiredMeta = z.infer<typeof authorizationRequiredMetaSchema>;\n\n// ============================================\n// Error Class\n// ============================================\n\n/**\n * Error thrown when a tool's parent app requires authorization.\n * This enables progressive authorization where users can authorize apps\n * incrementally as needed rather than all at once.\n *\n * Behavior depends on session mode:\n * - **Stateful**: Returns auth_url link for incremental authorization\n * - User can click link to authorize without full re-authentication\n * - Supports elicit flow for interactive authorization\n * - **Stateless**: Returns unauthorized error only\n * - No link provided (all state in JWT, cannot extend)\n * - User must re-authenticate from scratch\n *\n * @example\n * ```typescript\n * // Stateful mode - can provide auth link\n * throw new AuthorizationRequiredError({\n * appId: 'slack',\n * toolId: 'slack:send_message',\n * authUrl: '/oauth/authorize?app=slack',\n * sessionMode: 'stateful',\n * message: 'Please authorize Slack to use this tool.',\n * });\n *\n * // Stateless mode - no link, must re-auth\n * throw new AuthorizationRequiredError({\n * appId: 'slack',\n * toolId: 'slack:send_message',\n * sessionMode: 'stateless',\n * message: 'You are not authorized to use this tool.',\n * });\n * ```\n */\nexport class AuthorizationRequiredError extends PublicMcpError {\n /** App ID that requires authorization */\n readonly appId: string;\n\n /** Tool ID that triggered the authorization requirement */\n readonly toolId: string;\n\n /** URL to authorize the app (only available in stateful mode) */\n readonly authUrl?: string;\n\n /** Scopes required by the tool (optional) */\n readonly requiredScopes?: string[];\n\n /** Session mode determines if incremental auth is supported */\n readonly sessionMode: SessionMode;\n\n /** Elicit ID if using elicit flow */\n readonly elicitId?: string;\n\n /** Vault ID for stateful sessions */\n readonly vaultId?: string;\n\n /** Pending auth ID for tracking */\n readonly pendingAuthId?: string;\n\n /** Whether incremental authorization is supported */\n readonly supportsIncremental: boolean;\n\n constructor(params: AuthorizationRequiredParams) {\n const sessionMode = params.sessionMode ?? 'stateful';\n const supportsIncremental = sessionMode === 'stateful';\n\n // Message differs based on mode\n const defaultMessage = supportsIncremental\n ? `Authorization required for ${params.appId}. Please authorize to use ${params.toolId}.`\n : `You are not authorized to use ${params.toolId}. Please re-authenticate to access this tool.`;\n\n super(params.message || defaultMessage, 'AUTHORIZATION_REQUIRED', 403);\n this.appId = params.appId;\n this.toolId = params.toolId;\n this.sessionMode = sessionMode;\n this.supportsIncremental = supportsIncremental;\n\n // Only set authUrl in stateful mode\n if (supportsIncremental && params.authUrl) {\n this.authUrl = params.authUrl;\n }\n\n this.requiredScopes = params.requiredScopes;\n this.elicitId = params.elicitId;\n this.vaultId = params.vaultId;\n this.pendingAuthId = params.pendingAuthId;\n }\n\n /**\n * Convert to MCP error response format with authorization metadata.\n * The _meta field includes structured data that AI agents can use\n * to prompt users for authorization.\n *\n * In stateful mode: includes auth_url for AI to display\n * In stateless mode: no auth_url, AI should inform user to re-authenticate\n */\n override toMcpError(isDevelopment?: boolean): {\n content: Array<{ type: 'text'; text: string }>;\n isError: true;\n _meta: AuthorizationRequiredMeta;\n } {\n // Build content text based on mode\n let contentText = this.getPublicMessage();\n if (this.supportsIncremental && this.authUrl) {\n contentText += `\\n\\nTo authorize, click: ${this.authUrl}`;\n } else if (!this.supportsIncremental) {\n contentText += '\\n\\nPlease re-authenticate to access this tool.';\n }\n\n return {\n content: [\n {\n type: 'text' as const,\n text: contentText,\n },\n ],\n isError: true as const,\n _meta: {\n errorId: this.errorId,\n code: this.code,\n timestamp: new Date().toISOString(),\n // Progressive auth specific fields for AI agents to use\n authorization_required: true as const,\n app: this.appId,\n tool: this.toolId,\n auth_url: this.authUrl,\n required_scopes: this.requiredScopes,\n session_mode: this.sessionMode,\n supports_incremental: this.supportsIncremental,\n elicit_id: this.elicitId,\n pending_auth_id: this.pendingAuthId,\n },\n };\n }\n\n /**\n * Convert to structured authorization required data\n */\n toAuthorizationRequiredData(): AuthorizationRequiredData {\n return {\n error: 'authorization_required',\n app: this.appId,\n tool: this.toolId,\n auth_url: this.authUrl,\n message: this.getPublicMessage(),\n required_scopes: this.requiredScopes,\n session_mode: this.sessionMode,\n elicit_id: this.elicitId,\n supports_incremental: this.supportsIncremental,\n };\n }\n\n /**\n * Create an elicit response for clients that support it\n * Only available in stateful mode\n */\n toElicitResponse(): ElicitResponse | null {\n if (!this.supportsIncremental || !this.authUrl || !this.elicitId) {\n return null;\n }\n\n return {\n elicitId: this.elicitId,\n authUrl: this.authUrl,\n message: this.getPublicMessage(),\n appId: this.appId,\n toolId: this.toolId,\n };\n }\n\n /**\n * Check if this error can be resolved via incremental auth link\n */\n canUseIncrementalAuth(): boolean {\n return this.supportsIncremental && !!this.authUrl;\n }\n\n /**\n * Get user-facing message based on mode\n * - Stateful: includes link text\n * - Stateless: tells user to re-authenticate\n */\n getUserFacingMessage(): string {\n if (this.supportsIncremental && this.authUrl) {\n return `${this.getPublicMessage()}\\n\\nClick here to authorize: ${this.authUrl}`;\n }\n return `${this.getPublicMessage()}\\n\\nYou are not authorized to use this tool. Please re-authenticate to access it.`;\n }\n\n /**\n * Get message for cancelled authorization\n */\n static getCancelledMessage(appId: string, toolId: string, authUrl?: string): string {\n const baseMsg = `Authorization was cancelled. You are not authorized to use ${toolId}.`;\n if (authUrl) {\n return `${baseMsg}\\n\\nIf you still want to use this tool, click this link to authorize: ${authUrl}\\n\\nThen re-prompt your request to try again.`;\n }\n return `${baseMsg}\\n\\nPlease re-authenticate and try again.`;\n }\n}\n"]}
|
package/src/errors/index.d.ts
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
export { McpError, PublicMcpError, InternalMcpError, ToolNotFoundError, InvalidInputError, InvalidOutputError, InvalidMethodError, ToolExecutionError, RateLimitError, QuotaExceededError, UnauthorizedError, GenericServerError, isPublicError, toMcpError, formatMcpErrorResponse, } from './mcp.error';
|
|
1
|
+
export { McpError, PublicMcpError, InternalMcpError, ToolNotFoundError, ResourceNotFoundError, ResourceReadError, InvalidResourceUriError, InvalidInputError, InvalidOutputError, InvalidMethodError, ToolExecutionError, RateLimitError, QuotaExceededError, UnauthorizedError, GenericServerError, DependencyNotFoundError, InvalidHookFlowError, AuthConfigurationError, PromptNotFoundError, PromptExecutionError, isPublicError, toMcpError, formatMcpErrorResponse, } from './mcp.error';
|
|
2
|
+
export { authorizationRequiredDataSchema, authorizationRequiredParamsSchema, authorizationRequiredMetaSchema, AuthorizationRequiredData, AuthorizationRequiredParams, AuthorizationRequiredMeta, AuthorizationRequiredError, } from './authorization-required.error';
|
|
2
3
|
export { ErrorHandler, ErrorHandlerOptions, createErrorHandler, shouldStopExecution } from './error-handler';
|
package/src/errors/index.js
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.shouldStopExecution = exports.createErrorHandler = exports.ErrorHandler = exports.formatMcpErrorResponse = exports.toMcpError = exports.isPublicError = exports.GenericServerError = exports.UnauthorizedError = exports.QuotaExceededError = exports.RateLimitError = exports.ToolExecutionError = exports.InvalidMethodError = exports.InvalidOutputError = exports.InvalidInputError = exports.ToolNotFoundError = exports.InternalMcpError = exports.PublicMcpError = exports.McpError = void 0;
|
|
3
|
+
exports.shouldStopExecution = exports.createErrorHandler = exports.ErrorHandler = exports.AuthorizationRequiredError = exports.authorizationRequiredMetaSchema = exports.authorizationRequiredParamsSchema = exports.authorizationRequiredDataSchema = exports.formatMcpErrorResponse = exports.toMcpError = exports.isPublicError = exports.PromptExecutionError = exports.PromptNotFoundError = exports.AuthConfigurationError = exports.InvalidHookFlowError = exports.DependencyNotFoundError = exports.GenericServerError = exports.UnauthorizedError = exports.QuotaExceededError = exports.RateLimitError = exports.ToolExecutionError = exports.InvalidMethodError = exports.InvalidOutputError = exports.InvalidInputError = exports.InvalidResourceUriError = exports.ResourceReadError = exports.ResourceNotFoundError = exports.ToolNotFoundError = exports.InternalMcpError = exports.PublicMcpError = exports.McpError = void 0;
|
|
4
4
|
// Export all error classes
|
|
5
5
|
var mcp_error_1 = require("./mcp.error");
|
|
6
6
|
Object.defineProperty(exports, "McpError", { enumerable: true, get: function () { return mcp_error_1.McpError; } });
|
|
7
7
|
Object.defineProperty(exports, "PublicMcpError", { enumerable: true, get: function () { return mcp_error_1.PublicMcpError; } });
|
|
8
8
|
Object.defineProperty(exports, "InternalMcpError", { enumerable: true, get: function () { return mcp_error_1.InternalMcpError; } });
|
|
9
9
|
Object.defineProperty(exports, "ToolNotFoundError", { enumerable: true, get: function () { return mcp_error_1.ToolNotFoundError; } });
|
|
10
|
+
Object.defineProperty(exports, "ResourceNotFoundError", { enumerable: true, get: function () { return mcp_error_1.ResourceNotFoundError; } });
|
|
11
|
+
Object.defineProperty(exports, "ResourceReadError", { enumerable: true, get: function () { return mcp_error_1.ResourceReadError; } });
|
|
12
|
+
Object.defineProperty(exports, "InvalidResourceUriError", { enumerable: true, get: function () { return mcp_error_1.InvalidResourceUriError; } });
|
|
10
13
|
Object.defineProperty(exports, "InvalidInputError", { enumerable: true, get: function () { return mcp_error_1.InvalidInputError; } });
|
|
11
14
|
Object.defineProperty(exports, "InvalidOutputError", { enumerable: true, get: function () { return mcp_error_1.InvalidOutputError; } });
|
|
12
15
|
Object.defineProperty(exports, "InvalidMethodError", { enumerable: true, get: function () { return mcp_error_1.InvalidMethodError; } });
|
|
@@ -15,9 +18,22 @@ Object.defineProperty(exports, "RateLimitError", { enumerable: true, get: functi
|
|
|
15
18
|
Object.defineProperty(exports, "QuotaExceededError", { enumerable: true, get: function () { return mcp_error_1.QuotaExceededError; } });
|
|
16
19
|
Object.defineProperty(exports, "UnauthorizedError", { enumerable: true, get: function () { return mcp_error_1.UnauthorizedError; } });
|
|
17
20
|
Object.defineProperty(exports, "GenericServerError", { enumerable: true, get: function () { return mcp_error_1.GenericServerError; } });
|
|
21
|
+
Object.defineProperty(exports, "DependencyNotFoundError", { enumerable: true, get: function () { return mcp_error_1.DependencyNotFoundError; } });
|
|
22
|
+
Object.defineProperty(exports, "InvalidHookFlowError", { enumerable: true, get: function () { return mcp_error_1.InvalidHookFlowError; } });
|
|
23
|
+
Object.defineProperty(exports, "AuthConfigurationError", { enumerable: true, get: function () { return mcp_error_1.AuthConfigurationError; } });
|
|
24
|
+
Object.defineProperty(exports, "PromptNotFoundError", { enumerable: true, get: function () { return mcp_error_1.PromptNotFoundError; } });
|
|
25
|
+
Object.defineProperty(exports, "PromptExecutionError", { enumerable: true, get: function () { return mcp_error_1.PromptExecutionError; } });
|
|
18
26
|
Object.defineProperty(exports, "isPublicError", { enumerable: true, get: function () { return mcp_error_1.isPublicError; } });
|
|
19
27
|
Object.defineProperty(exports, "toMcpError", { enumerable: true, get: function () { return mcp_error_1.toMcpError; } });
|
|
20
28
|
Object.defineProperty(exports, "formatMcpErrorResponse", { enumerable: true, get: function () { return mcp_error_1.formatMcpErrorResponse; } });
|
|
29
|
+
// Export authorization required error for progressive auth
|
|
30
|
+
var authorization_required_error_1 = require("./authorization-required.error");
|
|
31
|
+
// Schemas
|
|
32
|
+
Object.defineProperty(exports, "authorizationRequiredDataSchema", { enumerable: true, get: function () { return authorization_required_error_1.authorizationRequiredDataSchema; } });
|
|
33
|
+
Object.defineProperty(exports, "authorizationRequiredParamsSchema", { enumerable: true, get: function () { return authorization_required_error_1.authorizationRequiredParamsSchema; } });
|
|
34
|
+
Object.defineProperty(exports, "authorizationRequiredMetaSchema", { enumerable: true, get: function () { return authorization_required_error_1.authorizationRequiredMetaSchema; } });
|
|
35
|
+
// Error class
|
|
36
|
+
Object.defineProperty(exports, "AuthorizationRequiredError", { enumerable: true, get: function () { return authorization_required_error_1.AuthorizationRequiredError; } });
|
|
21
37
|
// Export error handler utilities
|
|
22
38
|
var error_handler_1 = require("./error-handler");
|
|
23
39
|
Object.defineProperty(exports, "ErrorHandler", { enumerable: true, get: function () { return error_handler_1.ErrorHandler; } });
|
package/src/errors/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/errors/index.ts"],"names":[],"mappings":";;;AAAA,2BAA2B;AAC3B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/errors/index.ts"],"names":[],"mappings":";;;AAAA,2BAA2B;AAC3B,yCAwBqB;AAvBnB,qGAAA,QAAQ,OAAA;AACR,2GAAA,cAAc,OAAA;AACd,6GAAA,gBAAgB,OAAA;AAChB,8GAAA,iBAAiB,OAAA;AACjB,kHAAA,qBAAqB,OAAA;AACrB,8GAAA,iBAAiB,OAAA;AACjB,oHAAA,uBAAuB,OAAA;AACvB,8GAAA,iBAAiB,OAAA;AACjB,+GAAA,kBAAkB,OAAA;AAClB,+GAAA,kBAAkB,OAAA;AAClB,+GAAA,kBAAkB,OAAA;AAClB,2GAAA,cAAc,OAAA;AACd,+GAAA,kBAAkB,OAAA;AAClB,8GAAA,iBAAiB,OAAA;AACjB,+GAAA,kBAAkB,OAAA;AAClB,oHAAA,uBAAuB,OAAA;AACvB,iHAAA,oBAAoB,OAAA;AACpB,mHAAA,sBAAsB,OAAA;AACtB,gHAAA,mBAAmB,OAAA;AACnB,iHAAA,oBAAoB,OAAA;AACpB,0GAAA,aAAa,OAAA;AACb,uGAAA,UAAU,OAAA;AACV,mHAAA,sBAAsB,OAAA;AAGxB,2DAA2D;AAC3D,+EAWwC;AAVtC,UAAU;AACV,+IAAA,+BAA+B,OAAA;AAC/B,iJAAA,iCAAiC,OAAA;AACjC,+IAAA,+BAA+B,OAAA;AAK/B,cAAc;AACd,0IAAA,0BAA0B,OAAA;AAG5B,iCAAiC;AACjC,iDAA6G;AAApG,6GAAA,YAAY,OAAA;AAAuB,mHAAA,kBAAkB,OAAA;AAAE,oHAAA,mBAAmB,OAAA","sourcesContent":["// Export all error classes\nexport {\n McpError,\n PublicMcpError,\n InternalMcpError,\n ToolNotFoundError,\n ResourceNotFoundError,\n ResourceReadError,\n InvalidResourceUriError,\n InvalidInputError,\n InvalidOutputError,\n InvalidMethodError,\n ToolExecutionError,\n RateLimitError,\n QuotaExceededError,\n UnauthorizedError,\n GenericServerError,\n DependencyNotFoundError,\n InvalidHookFlowError,\n AuthConfigurationError,\n PromptNotFoundError,\n PromptExecutionError,\n isPublicError,\n toMcpError,\n formatMcpErrorResponse,\n} from './mcp.error';\n\n// Export authorization required error for progressive auth\nexport {\n // Schemas\n authorizationRequiredDataSchema,\n authorizationRequiredParamsSchema,\n authorizationRequiredMetaSchema,\n // Types (inferred from schemas)\n AuthorizationRequiredData,\n AuthorizationRequiredParams,\n AuthorizationRequiredMeta,\n // Error class\n AuthorizationRequiredError,\n} from './authorization-required.error';\n\n// Export error handler utilities\nexport { ErrorHandler, ErrorHandlerOptions, createErrorHandler, shouldStopExecution } from './error-handler';\n"]}
|