mcp-server-framework 1.0.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/CHANGELOG.md +174 -0
- package/LICENSE-GPL.md +219 -0
- package/LICENSE.md +187 -0
- package/README.md +439 -0
- package/build/config/config-cache.d.ts +120 -0
- package/build/config/config-cache.d.ts.map +1 -0
- package/build/config/config-cache.js +310 -0
- package/build/config/config-cache.js.map +1 -0
- package/build/config/env.d.ts +476 -0
- package/build/config/env.d.ts.map +1 -0
- package/build/config/env.js +441 -0
- package/build/config/env.js.map +1 -0
- package/build/config/extensions.d.ts +107 -0
- package/build/config/extensions.d.ts.map +1 -0
- package/build/config/extensions.js +152 -0
- package/build/config/extensions.js.map +1 -0
- package/build/config/file/index.d.ts +8 -0
- package/build/config/file/index.d.ts.map +1 -0
- package/build/config/file/index.js +10 -0
- package/build/config/file/index.js.map +1 -0
- package/build/config/file/loader.d.ts +31 -0
- package/build/config/file/loader.d.ts.map +1 -0
- package/build/config/file/loader.js +313 -0
- package/build/config/file/loader.js.map +1 -0
- package/build/config/file/schema.d.ts +583 -0
- package/build/config/file/schema.d.ts.map +1 -0
- package/build/config/file/schema.js +388 -0
- package/build/config/file/schema.js.map +1 -0
- package/build/config/index.d.ts +15 -0
- package/build/config/index.d.ts.map +1 -0
- package/build/config/index.js +27 -0
- package/build/config/index.js.map +1 -0
- package/build/config/startup-warnings.d.ts +46 -0
- package/build/config/startup-warnings.d.ts.map +1 -0
- package/build/config/startup-warnings.js +61 -0
- package/build/config/startup-warnings.js.map +1 -0
- package/build/connection/connection-state.d.ts +196 -0
- package/build/connection/connection-state.d.ts.map +1 -0
- package/build/connection/connection-state.js +426 -0
- package/build/connection/connection-state.js.map +1 -0
- package/build/connection/core/base.d.ts +43 -0
- package/build/connection/core/base.d.ts.map +1 -0
- package/build/connection/core/base.js +82 -0
- package/build/connection/core/base.js.map +1 -0
- package/build/connection/core/constants.d.ts +121 -0
- package/build/connection/core/constants.d.ts.map +1 -0
- package/build/connection/core/constants.js +151 -0
- package/build/connection/core/constants.js.map +1 -0
- package/build/connection/core/index.d.ts +13 -0
- package/build/connection/core/index.d.ts.map +1 -0
- package/build/connection/core/index.js +14 -0
- package/build/connection/core/index.js.map +1 -0
- package/build/connection/core/types.d.ts +102 -0
- package/build/connection/core/types.d.ts.map +1 -0
- package/build/connection/core/types.js +31 -0
- package/build/connection/core/types.js.map +1 -0
- package/build/connection/index.d.ts +19 -0
- package/build/connection/index.d.ts.map +1 -0
- package/build/connection/index.js +22 -0
- package/build/connection/index.js.map +1 -0
- package/build/connection/types.d.ts +125 -0
- package/build/connection/types.d.ts.map +1 -0
- package/build/connection/types.js +39 -0
- package/build/connection/types.js.map +1 -0
- package/build/errors/categories/auth.d.ts +59 -0
- package/build/errors/categories/auth.d.ts.map +1 -0
- package/build/errors/categories/auth.js +111 -0
- package/build/errors/categories/auth.js.map +1 -0
- package/build/errors/categories/connection.d.ts +70 -0
- package/build/errors/categories/connection.d.ts.map +1 -0
- package/build/errors/categories/connection.js +120 -0
- package/build/errors/categories/connection.js.map +1 -0
- package/build/errors/categories/index.d.ts +14 -0
- package/build/errors/categories/index.d.ts.map +1 -0
- package/build/errors/categories/index.js +20 -0
- package/build/errors/categories/index.js.map +1 -0
- package/build/errors/categories/operation.d.ts +83 -0
- package/build/errors/categories/operation.d.ts.map +1 -0
- package/build/errors/categories/operation.js +149 -0
- package/build/errors/categories/operation.js.map +1 -0
- package/build/errors/categories/protocol.d.ts +68 -0
- package/build/errors/categories/protocol.d.ts.map +1 -0
- package/build/errors/categories/protocol.js +135 -0
- package/build/errors/categories/protocol.js.map +1 -0
- package/build/errors/categories/session.d.ts +50 -0
- package/build/errors/categories/session.d.ts.map +1 -0
- package/build/errors/categories/session.js +97 -0
- package/build/errors/categories/session.js.map +1 -0
- package/build/errors/categories/system.d.ts +95 -0
- package/build/errors/categories/system.d.ts.map +1 -0
- package/build/errors/categories/system.js +190 -0
- package/build/errors/categories/system.js.map +1 -0
- package/build/errors/categories/transport.d.ts +70 -0
- package/build/errors/categories/transport.d.ts.map +1 -0
- package/build/errors/categories/transport.js +148 -0
- package/build/errors/categories/transport.js.map +1 -0
- package/build/errors/categories/validation.d.ts +140 -0
- package/build/errors/categories/validation.d.ts.map +1 -0
- package/build/errors/categories/validation.js +311 -0
- package/build/errors/categories/validation.js.map +1 -0
- package/build/errors/core/base.d.ts +103 -0
- package/build/errors/core/base.d.ts.map +1 -0
- package/build/errors/core/base.js +219 -0
- package/build/errors/core/base.js.map +1 -0
- package/build/errors/core/constants.d.ts +40 -0
- package/build/errors/core/constants.d.ts.map +1 -0
- package/build/errors/core/constants.js +49 -0
- package/build/errors/core/constants.js.map +1 -0
- package/build/errors/core/error-codes.d.ts +72 -0
- package/build/errors/core/error-codes.d.ts.map +1 -0
- package/build/errors/core/error-codes.js +88 -0
- package/build/errors/core/error-codes.js.map +1 -0
- package/build/errors/core/http.d.ts +69 -0
- package/build/errors/core/http.d.ts.map +1 -0
- package/build/errors/core/http.js +106 -0
- package/build/errors/core/http.js.map +1 -0
- package/build/errors/core/index.d.ts +23 -0
- package/build/errors/core/index.d.ts.map +1 -0
- package/build/errors/core/index.js +41 -0
- package/build/errors/core/index.js.map +1 -0
- package/build/errors/core/json-rpc.d.ts +69 -0
- package/build/errors/core/json-rpc.d.ts.map +1 -0
- package/build/errors/core/json-rpc.js +79 -0
- package/build/errors/core/json-rpc.js.map +1 -0
- package/build/errors/core/messages.d.ts +51 -0
- package/build/errors/core/messages.d.ts.map +1 -0
- package/build/errors/core/messages.js +59 -0
- package/build/errors/core/messages.js.map +1 -0
- package/build/errors/core/types.d.ts +80 -0
- package/build/errors/core/types.d.ts.map +1 -0
- package/build/errors/core/types.js +10 -0
- package/build/errors/core/types.js.map +1 -0
- package/build/errors/factory.d.ts +199 -0
- package/build/errors/factory.d.ts.map +1 -0
- package/build/errors/factory.js +244 -0
- package/build/errors/factory.js.map +1 -0
- package/build/errors/index.d.ts +35 -0
- package/build/errors/index.d.ts.map +1 -0
- package/build/errors/index.js +67 -0
- package/build/errors/index.js.map +1 -0
- package/build/index.d.ts +93 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +107 -0
- package/build/index.js.map +1 -0
- package/build/logger/core/constants.d.ts +143 -0
- package/build/logger/core/constants.d.ts.map +1 -0
- package/build/logger/core/constants.js +206 -0
- package/build/logger/core/constants.js.map +1 -0
- package/build/logger/core/context.d.ts +170 -0
- package/build/logger/core/context.d.ts.map +1 -0
- package/build/logger/core/context.js +237 -0
- package/build/logger/core/context.js.map +1 -0
- package/build/logger/core/errors.d.ts +101 -0
- package/build/logger/core/errors.d.ts.map +1 -0
- package/build/logger/core/errors.js +128 -0
- package/build/logger/core/errors.js.map +1 -0
- package/build/logger/core/format.d.ts +40 -0
- package/build/logger/core/format.d.ts.map +1 -0
- package/build/logger/core/format.js +47 -0
- package/build/logger/core/format.js.map +1 -0
- package/build/logger/core/index.d.ts +19 -0
- package/build/logger/core/index.d.ts.map +1 -0
- package/build/logger/core/index.js +47 -0
- package/build/logger/core/index.js.map +1 -0
- package/build/logger/core/trace-context.d.ts +51 -0
- package/build/logger/core/trace-context.d.ts.map +1 -0
- package/build/logger/core/trace-context.js +42 -0
- package/build/logger/core/trace-context.js.map +1 -0
- package/build/logger/core/types.d.ts +233 -0
- package/build/logger/core/types.d.ts.map +1 -0
- package/build/logger/core/types.js +10 -0
- package/build/logger/core/types.js.map +1 -0
- package/build/logger/factory.d.ts +150 -0
- package/build/logger/factory.d.ts.map +1 -0
- package/build/logger/factory.js +236 -0
- package/build/logger/factory.js.map +1 -0
- package/build/logger/formatters/index.d.ts +12 -0
- package/build/logger/formatters/index.d.ts.map +1 -0
- package/build/logger/formatters/index.js +15 -0
- package/build/logger/formatters/index.js.map +1 -0
- package/build/logger/formatters/json-formatter.d.ts +54 -0
- package/build/logger/formatters/json-formatter.d.ts.map +1 -0
- package/build/logger/formatters/json-formatter.js +80 -0
- package/build/logger/formatters/json-formatter.js.map +1 -0
- package/build/logger/formatters/schema.d.ts +230 -0
- package/build/logger/formatters/schema.d.ts.map +1 -0
- package/build/logger/formatters/schema.js +278 -0
- package/build/logger/formatters/schema.js.map +1 -0
- package/build/logger/formatters/text-formatter.d.ts +50 -0
- package/build/logger/formatters/text-formatter.d.ts.map +1 -0
- package/build/logger/formatters/text-formatter.js +93 -0
- package/build/logger/formatters/text-formatter.js.map +1 -0
- package/build/logger/index.d.ts +39 -0
- package/build/logger/index.d.ts.map +1 -0
- package/build/logger/index.js +43 -0
- package/build/logger/index.js.map +1 -0
- package/build/logger/logger.d.ts +278 -0
- package/build/logger/logger.d.ts.map +1 -0
- package/build/logger/logger.js +459 -0
- package/build/logger/logger.js.map +1 -0
- package/build/logger/mcp-logger.d.ts +177 -0
- package/build/logger/mcp-logger.d.ts.map +1 -0
- package/build/logger/mcp-logger.js +294 -0
- package/build/logger/mcp-logger.js.map +1 -0
- package/build/logger/scrubbing/index.d.ts +14 -0
- package/build/logger/scrubbing/index.d.ts.map +1 -0
- package/build/logger/scrubbing/index.js +16 -0
- package/build/logger/scrubbing/index.js.map +1 -0
- package/build/logger/scrubbing/injection-guard.d.ts +69 -0
- package/build/logger/scrubbing/injection-guard.d.ts.map +1 -0
- package/build/logger/scrubbing/injection-guard.js +102 -0
- package/build/logger/scrubbing/injection-guard.js.map +1 -0
- package/build/logger/scrubbing/secret-scrubber.d.ts +72 -0
- package/build/logger/scrubbing/secret-scrubber.d.ts.map +1 -0
- package/build/logger/scrubbing/secret-scrubber.js +177 -0
- package/build/logger/scrubbing/secret-scrubber.js.map +1 -0
- package/build/logger/writers/base-writer.d.ts +45 -0
- package/build/logger/writers/base-writer.d.ts.map +1 -0
- package/build/logger/writers/base-writer.js +41 -0
- package/build/logger/writers/base-writer.js.map +1 -0
- package/build/logger/writers/composite-writer.d.ts +83 -0
- package/build/logger/writers/composite-writer.d.ts.map +1 -0
- package/build/logger/writers/composite-writer.js +121 -0
- package/build/logger/writers/composite-writer.js.map +1 -0
- package/build/logger/writers/console-writer.d.ts +59 -0
- package/build/logger/writers/console-writer.d.ts.map +1 -0
- package/build/logger/writers/console-writer.js +73 -0
- package/build/logger/writers/console-writer.js.map +1 -0
- package/build/logger/writers/file-writer.d.ts +160 -0
- package/build/logger/writers/file-writer.d.ts.map +1 -0
- package/build/logger/writers/file-writer.js +345 -0
- package/build/logger/writers/file-writer.js.map +1 -0
- package/build/logger/writers/index.d.ts +15 -0
- package/build/logger/writers/index.d.ts.map +1 -0
- package/build/logger/writers/index.js +19 -0
- package/build/logger/writers/index.js.map +1 -0
- package/build/mcp/capabilities/apps/define-app.d.ts +68 -0
- package/build/mcp/capabilities/apps/define-app.d.ts.map +1 -0
- package/build/mcp/capabilities/apps/define-app.js +127 -0
- package/build/mcp/capabilities/apps/define-app.js.map +1 -0
- package/build/mcp/capabilities/apps/index.d.ts +10 -0
- package/build/mcp/capabilities/apps/index.d.ts.map +1 -0
- package/build/mcp/capabilities/apps/index.js +10 -0
- package/build/mcp/capabilities/apps/index.js.map +1 -0
- package/build/mcp/capabilities/capabilities.d.ts +24 -0
- package/build/mcp/capabilities/capabilities.d.ts.map +1 -0
- package/build/mcp/capabilities/capabilities.js +50 -0
- package/build/mcp/capabilities/capabilities.js.map +1 -0
- package/build/mcp/capabilities/index.d.ts +17 -0
- package/build/mcp/capabilities/index.d.ts.map +1 -0
- package/build/mcp/capabilities/index.js +20 -0
- package/build/mcp/capabilities/index.js.map +1 -0
- package/build/mcp/capabilities/prompts/define-prompt.d.ts +95 -0
- package/build/mcp/capabilities/prompts/define-prompt.d.ts.map +1 -0
- package/build/mcp/capabilities/prompts/define-prompt.js +109 -0
- package/build/mcp/capabilities/prompts/define-prompt.js.map +1 -0
- package/build/mcp/capabilities/prompts/index.d.ts +10 -0
- package/build/mcp/capabilities/prompts/index.d.ts.map +1 -0
- package/build/mcp/capabilities/prompts/index.js +10 -0
- package/build/mcp/capabilities/prompts/index.js.map +1 -0
- package/build/mcp/capabilities/registry/base-registry.d.ts +95 -0
- package/build/mcp/capabilities/registry/base-registry.d.ts.map +1 -0
- package/build/mcp/capabilities/registry/base-registry.js +149 -0
- package/build/mcp/capabilities/registry/base-registry.js.map +1 -0
- package/build/mcp/capabilities/registry/index.d.ts +16 -0
- package/build/mcp/capabilities/registry/index.d.ts.map +1 -0
- package/build/mcp/capabilities/registry/index.js +34 -0
- package/build/mcp/capabilities/registry/index.js.map +1 -0
- package/build/mcp/capabilities/registry/prompt-registry.d.ts +116 -0
- package/build/mcp/capabilities/registry/prompt-registry.d.ts.map +1 -0
- package/build/mcp/capabilities/registry/prompt-registry.js +232 -0
- package/build/mcp/capabilities/registry/prompt-registry.js.map +1 -0
- package/build/mcp/capabilities/registry/reset.d.ts +30 -0
- package/build/mcp/capabilities/registry/reset.d.ts.map +1 -0
- package/build/mcp/capabilities/registry/reset.js +48 -0
- package/build/mcp/capabilities/registry/reset.js.map +1 -0
- package/build/mcp/capabilities/registry/resource-registry.d.ts +152 -0
- package/build/mcp/capabilities/registry/resource-registry.d.ts.map +1 -0
- package/build/mcp/capabilities/registry/resource-registry.js +430 -0
- package/build/mcp/capabilities/registry/resource-registry.js.map +1 -0
- package/build/mcp/capabilities/registry/scope-enforcement.d.ts +48 -0
- package/build/mcp/capabilities/registry/scope-enforcement.d.ts.map +1 -0
- package/build/mcp/capabilities/registry/scope-enforcement.js +62 -0
- package/build/mcp/capabilities/registry/scope-enforcement.js.map +1 -0
- package/build/mcp/capabilities/registry/task-tool-registry.d.ts +96 -0
- package/build/mcp/capabilities/registry/task-tool-registry.d.ts.map +1 -0
- package/build/mcp/capabilities/registry/task-tool-registry.js +190 -0
- package/build/mcp/capabilities/registry/task-tool-registry.js.map +1 -0
- package/build/mcp/capabilities/registry/tool-registry.d.ts +100 -0
- package/build/mcp/capabilities/registry/tool-registry.d.ts.map +1 -0
- package/build/mcp/capabilities/registry/tool-registry.js +242 -0
- package/build/mcp/capabilities/registry/tool-registry.js.map +1 -0
- package/build/mcp/capabilities/resources/define-resource.d.ts +103 -0
- package/build/mcp/capabilities/resources/define-resource.d.ts.map +1 -0
- package/build/mcp/capabilities/resources/define-resource.js +137 -0
- package/build/mcp/capabilities/resources/define-resource.js.map +1 -0
- package/build/mcp/capabilities/resources/index.d.ts +10 -0
- package/build/mcp/capabilities/resources/index.d.ts.map +1 -0
- package/build/mcp/capabilities/resources/index.js +10 -0
- package/build/mcp/capabilities/resources/index.js.map +1 -0
- package/build/mcp/capabilities/server-capabilities.d.ts +33 -0
- package/build/mcp/capabilities/server-capabilities.d.ts.map +1 -0
- package/build/mcp/capabilities/server-capabilities.js +16 -0
- package/build/mcp/capabilities/server-capabilities.js.map +1 -0
- package/build/mcp/capabilities/tasks/define-task.d.ts +75 -0
- package/build/mcp/capabilities/tasks/define-task.d.ts.map +1 -0
- package/build/mcp/capabilities/tasks/define-task.js +93 -0
- package/build/mcp/capabilities/tasks/define-task.js.map +1 -0
- package/build/mcp/capabilities/tasks/index.d.ts +11 -0
- package/build/mcp/capabilities/tasks/index.d.ts.map +1 -0
- package/build/mcp/capabilities/tasks/index.js +11 -0
- package/build/mcp/capabilities/tasks/index.js.map +1 -0
- package/build/mcp/capabilities/tools/define-tool.d.ts +62 -0
- package/build/mcp/capabilities/tools/define-tool.d.ts.map +1 -0
- package/build/mcp/capabilities/tools/define-tool.js +73 -0
- package/build/mcp/capabilities/tools/define-tool.js.map +1 -0
- package/build/mcp/capabilities/tools/index.d.ts +10 -0
- package/build/mcp/capabilities/tools/index.d.ts.map +1 -0
- package/build/mcp/capabilities/tools/index.js +10 -0
- package/build/mcp/capabilities/tools/index.js.map +1 -0
- package/build/mcp/handlers/index.d.ts +19 -0
- package/build/mcp/handlers/index.d.ts.map +1 -0
- package/build/mcp/handlers/index.js +26 -0
- package/build/mcp/handlers/index.js.map +1 -0
- package/build/mcp/handlers/ping.d.ts +27 -0
- package/build/mcp/handlers/ping.d.ts.map +1 -0
- package/build/mcp/handlers/ping.js +61 -0
- package/build/mcp/handlers/ping.js.map +1 -0
- package/build/mcp/handlers/progress.d.ts +41 -0
- package/build/mcp/handlers/progress.d.ts.map +1 -0
- package/build/mcp/handlers/progress.js +79 -0
- package/build/mcp/handlers/progress.js.map +1 -0
- package/build/mcp/index.d.ts +28 -0
- package/build/mcp/index.d.ts.map +1 -0
- package/build/mcp/index.js +34 -0
- package/build/mcp/index.js.map +1 -0
- package/build/mcp/responses/helpers.d.ts +146 -0
- package/build/mcp/responses/helpers.d.ts.map +1 -0
- package/build/mcp/responses/helpers.js +197 -0
- package/build/mcp/responses/helpers.js.map +1 -0
- package/build/mcp/responses/index.d.ts +9 -0
- package/build/mcp/responses/index.d.ts.map +1 -0
- package/build/mcp/responses/index.js +12 -0
- package/build/mcp/responses/index.js.map +1 -0
- package/build/mcp/types/context.d.ts +371 -0
- package/build/mcp/types/context.d.ts.map +1 -0
- package/build/mcp/types/context.js +17 -0
- package/build/mcp/types/context.js.map +1 -0
- package/build/mcp/types/definition.d.ts +727 -0
- package/build/mcp/types/definition.d.ts.map +1 -0
- package/build/mcp/types/definition.js +29 -0
- package/build/mcp/types/definition.js.map +1 -0
- package/build/mcp/types/handler.d.ts +58 -0
- package/build/mcp/types/handler.d.ts.map +1 -0
- package/build/mcp/types/handler.js +10 -0
- package/build/mcp/types/handler.js.map +1 -0
- package/build/mcp/types/index.d.ts +21 -0
- package/build/mcp/types/index.d.ts.map +1 -0
- package/build/mcp/types/index.js +18 -0
- package/build/mcp/types/index.js.map +1 -0
- package/build/mcp/types/response.d.ts +79 -0
- package/build/mcp/types/response.d.ts.map +1 -0
- package/build/mcp/types/response.js +10 -0
- package/build/mcp/types/response.js.map +1 -0
- package/build/server/auth/auth-context.d.ts +52 -0
- package/build/server/auth/auth-context.d.ts.map +1 -0
- package/build/server/auth/auth-context.js +45 -0
- package/build/server/auth/auth-context.js.map +1 -0
- package/build/server/auth/guards.d.ts +72 -0
- package/build/server/auth/guards.d.ts.map +1 -0
- package/build/server/auth/guards.js +103 -0
- package/build/server/auth/guards.js.map +1 -0
- package/build/server/auth/index.d.ts +21 -0
- package/build/server/auth/index.d.ts.map +1 -0
- package/build/server/auth/index.js +20 -0
- package/build/server/auth/index.js.map +1 -0
- package/build/server/auth/oidc-discovery.d.ts +68 -0
- package/build/server/auth/oidc-discovery.d.ts.map +1 -0
- package/build/server/auth/oidc-discovery.js +234 -0
- package/build/server/auth/oidc-discovery.js.map +1 -0
- package/build/server/auth/oidc-provider.d.ts +96 -0
- package/build/server/auth/oidc-provider.d.ts.map +1 -0
- package/build/server/auth/oidc-provider.js +126 -0
- package/build/server/auth/oidc-provider.js.map +1 -0
- package/build/server/auth/types.d.ts +204 -0
- package/build/server/auth/types.d.ts.map +1 -0
- package/build/server/auth/types.js +29 -0
- package/build/server/auth/types.js.map +1 -0
- package/build/server/auth/upstream-provider.d.ts +161 -0
- package/build/server/auth/upstream-provider.d.ts.map +1 -0
- package/build/server/auth/upstream-provider.js +411 -0
- package/build/server/auth/upstream-provider.js.map +1 -0
- package/build/server/builder/constants.d.ts +45 -0
- package/build/server/builder/constants.d.ts.map +1 -0
- package/build/server/builder/constants.js +54 -0
- package/build/server/builder/constants.js.map +1 -0
- package/build/server/builder/index.d.ts +24 -0
- package/build/server/builder/index.d.ts.map +1 -0
- package/build/server/builder/index.js +25 -0
- package/build/server/builder/index.js.map +1 -0
- package/build/server/builder/primitive-collector.d.ts +24 -0
- package/build/server/builder/primitive-collector.d.ts.map +1 -0
- package/build/server/builder/primitive-collector.js +89 -0
- package/build/server/builder/primitive-collector.js.map +1 -0
- package/build/server/builder/server-builder.d.ts +53 -0
- package/build/server/builder/server-builder.d.ts.map +1 -0
- package/build/server/builder/server-builder.js +132 -0
- package/build/server/builder/server-builder.js.map +1 -0
- package/build/server/builder/types.d.ts +93 -0
- package/build/server/builder/types.d.ts.map +1 -0
- package/build/server/builder/types.js +25 -0
- package/build/server/builder/types.js.map +1 -0
- package/build/server/builder/validation.d.ts +36 -0
- package/build/server/builder/validation.d.ts.map +1 -0
- package/build/server/builder/validation.js +44 -0
- package/build/server/builder/validation.js.map +1 -0
- package/build/server/create-server.d.ts +57 -0
- package/build/server/create-server.d.ts.map +1 -0
- package/build/server/create-server.js +104 -0
- package/build/server/create-server.js.map +1 -0
- package/build/server/http/express-app.d.ts +103 -0
- package/build/server/http/express-app.d.ts.map +1 -0
- package/build/server/http/express-app.js +391 -0
- package/build/server/http/express-app.js.map +1 -0
- package/build/server/http/http-server.d.ts +67 -0
- package/build/server/http/http-server.d.ts.map +1 -0
- package/build/server/http/http-server.js +188 -0
- package/build/server/http/http-server.js.map +1 -0
- package/build/server/http/http-transport.d.ts +33 -0
- package/build/server/http/http-transport.d.ts.map +1 -0
- package/build/server/http/http-transport.js +84 -0
- package/build/server/http/http-transport.js.map +1 -0
- package/build/server/http/index.d.ts +15 -0
- package/build/server/http/index.d.ts.map +1 -0
- package/build/server/http/index.js +11 -0
- package/build/server/http/index.js.map +1 -0
- package/build/server/index.d.ts +25 -0
- package/build/server/index.d.ts.map +1 -0
- package/build/server/index.js +41 -0
- package/build/server/index.js.map +1 -0
- package/build/server/lifecycle.d.ts +114 -0
- package/build/server/lifecycle.d.ts.map +1 -0
- package/build/server/lifecycle.js +30 -0
- package/build/server/lifecycle.js.map +1 -0
- package/build/server/middleware/bearer-auth.d.ts +43 -0
- package/build/server/middleware/bearer-auth.d.ts.map +1 -0
- package/build/server/middleware/bearer-auth.js +75 -0
- package/build/server/middleware/bearer-auth.js.map +1 -0
- package/build/server/middleware/custom-header-auth.d.ts +40 -0
- package/build/server/middleware/custom-header-auth.d.ts.map +1 -0
- package/build/server/middleware/custom-header-auth.js +90 -0
- package/build/server/middleware/custom-header-auth.js.map +1 -0
- package/build/server/middleware/dns-rebinding.d.ts +25 -0
- package/build/server/middleware/dns-rebinding.d.ts.map +1 -0
- package/build/server/middleware/dns-rebinding.js +94 -0
- package/build/server/middleware/dns-rebinding.js.map +1 -0
- package/build/server/middleware/index.d.ts +69 -0
- package/build/server/middleware/index.d.ts.map +1 -0
- package/build/server/middleware/index.js +68 -0
- package/build/server/middleware/index.js.map +1 -0
- package/build/server/middleware/logging.d.ts +21 -0
- package/build/server/middleware/logging.d.ts.map +1 -0
- package/build/server/middleware/logging.js +36 -0
- package/build/server/middleware/logging.js.map +1 -0
- package/build/server/middleware/oauth-router.d.ts +50 -0
- package/build/server/middleware/oauth-router.d.ts.map +1 -0
- package/build/server/middleware/oauth-router.js +53 -0
- package/build/server/middleware/oauth-router.js.map +1 -0
- package/build/server/middleware/protocol-version.d.ts +13 -0
- package/build/server/middleware/protocol-version.d.ts.map +1 -0
- package/build/server/middleware/protocol-version.js +48 -0
- package/build/server/middleware/protocol-version.js.map +1 -0
- package/build/server/middleware/rate-limit.d.ts +47 -0
- package/build/server/middleware/rate-limit.d.ts.map +1 -0
- package/build/server/middleware/rate-limit.js +109 -0
- package/build/server/middleware/rate-limit.js.map +1 -0
- package/build/server/middleware/trust-proxy.d.ts +37 -0
- package/build/server/middleware/trust-proxy.d.ts.map +1 -0
- package/build/server/middleware/trust-proxy.js +154 -0
- package/build/server/middleware/trust-proxy.js.map +1 -0
- package/build/server/option-overrides.d.ts +25 -0
- package/build/server/option-overrides.d.ts.map +1 -0
- package/build/server/option-overrides.js +85 -0
- package/build/server/option-overrides.js.map +1 -0
- package/build/server/routes/health.d.ts +87 -0
- package/build/server/routes/health.d.ts.map +1 -0
- package/build/server/routes/health.js +183 -0
- package/build/server/routes/health.js.map +1 -0
- package/build/server/routes/index.d.ts +16 -0
- package/build/server/routes/index.d.ts.map +1 -0
- package/build/server/routes/index.js +18 -0
- package/build/server/routes/index.js.map +1 -0
- package/build/server/routes/metrics.d.ts +40 -0
- package/build/server/routes/metrics.d.ts.map +1 -0
- package/build/server/routes/metrics.js +81 -0
- package/build/server/routes/metrics.js.map +1 -0
- package/build/server/routes/oauth-router.d.ts +50 -0
- package/build/server/routes/oauth-router.d.ts.map +1 -0
- package/build/server/routes/oauth-router.js +53 -0
- package/build/server/routes/oauth-router.js.map +1 -0
- package/build/server/routes/readiness-status.d.ts +25 -0
- package/build/server/routes/readiness-status.d.ts.map +1 -0
- package/build/server/routes/readiness-status.js +27 -0
- package/build/server/routes/readiness-status.js.map +1 -0
- package/build/server/routes/sse-router.d.ts +43 -0
- package/build/server/routes/sse-router.d.ts.map +1 -0
- package/build/server/routes/sse-router.js +92 -0
- package/build/server/routes/sse-router.js.map +1 -0
- package/build/server/routes/streamable-http-router.d.ts +36 -0
- package/build/server/routes/streamable-http-router.d.ts.map +1 -0
- package/build/server/routes/streamable-http-router.js +59 -0
- package/build/server/routes/streamable-http-router.js.map +1 -0
- package/build/server/server-instance.d.ts +185 -0
- package/build/server/server-instance.d.ts.map +1 -0
- package/build/server/server-instance.js +615 -0
- package/build/server/server-instance.js.map +1 -0
- package/build/server/server-options.d.ts +411 -0
- package/build/server/server-options.d.ts.map +1 -0
- package/build/server/server-options.js +17 -0
- package/build/server/server-options.js.map +1 -0
- package/build/server/session/in-memory-store.d.ts +128 -0
- package/build/server/session/in-memory-store.d.ts.map +1 -0
- package/build/server/session/in-memory-store.js +312 -0
- package/build/server/session/in-memory-store.js.map +1 -0
- package/build/server/session/index.d.ts +43 -0
- package/build/server/session/index.d.ts.map +1 -0
- package/build/server/session/index.js +47 -0
- package/build/server/session/index.js.map +1 -0
- package/build/server/session/mcp-session.d.ts +210 -0
- package/build/server/session/mcp-session.d.ts.map +1 -0
- package/build/server/session/mcp-session.js +428 -0
- package/build/server/session/mcp-session.js.map +1 -0
- package/build/server/session/session-factory.d.ts +119 -0
- package/build/server/session/session-factory.d.ts.map +1 -0
- package/build/server/session/session-factory.js +131 -0
- package/build/server/session/session-factory.js.map +1 -0
- package/build/server/session/session-housekeeper.d.ts +100 -0
- package/build/server/session/session-housekeeper.d.ts.map +1 -0
- package/build/server/session/session-housekeeper.js +217 -0
- package/build/server/session/session-housekeeper.js.map +1 -0
- package/build/server/session/session-manager.d.ts +227 -0
- package/build/server/session/session-manager.d.ts.map +1 -0
- package/build/server/session/session-manager.js +282 -0
- package/build/server/session/session-manager.js.map +1 -0
- package/build/server/session/session-store.d.ts +95 -0
- package/build/server/session/session-store.d.ts.map +1 -0
- package/build/server/session/session-store.js +13 -0
- package/build/server/session/session-store.js.map +1 -0
- package/build/server/session/session.d.ts +132 -0
- package/build/server/session/session.d.ts.map +1 -0
- package/build/server/session/session.js +61 -0
- package/build/server/session/session.js.map +1 -0
- package/build/server/transport/constants.d.ts +85 -0
- package/build/server/transport/constants.d.ts.map +1 -0
- package/build/server/transport/constants.js +103 -0
- package/build/server/transport/constants.js.map +1 -0
- package/build/server/transport/index.d.ts +21 -0
- package/build/server/transport/index.d.ts.map +1 -0
- package/build/server/transport/index.js +28 -0
- package/build/server/transport/index.js.map +1 -0
- package/build/server/transport/sse/handler.d.ts +46 -0
- package/build/server/transport/sse/handler.d.ts.map +1 -0
- package/build/server/transport/sse/handler.js +189 -0
- package/build/server/transport/sse/handler.js.map +1 -0
- package/build/server/transport/sse/index.d.ts +15 -0
- package/build/server/transport/sse/index.d.ts.map +1 -0
- package/build/server/transport/sse/index.js +14 -0
- package/build/server/transport/sse/index.js.map +1 -0
- package/build/server/transport/sse/transport.d.ts +94 -0
- package/build/server/transport/sse/transport.d.ts.map +1 -0
- package/build/server/transport/sse/transport.js +175 -0
- package/build/server/transport/sse/transport.js.map +1 -0
- package/build/server/transport/stdio-transport.d.ts +23 -0
- package/build/server/transport/stdio-transport.d.ts.map +1 -0
- package/build/server/transport/stdio-transport.js +59 -0
- package/build/server/transport/stdio-transport.js.map +1 -0
- package/build/server/transport/streamable-http/index.d.ts +9 -0
- package/build/server/transport/streamable-http/index.d.ts.map +1 -0
- package/build/server/transport/streamable-http/index.js +9 -0
- package/build/server/transport/streamable-http/index.js.map +1 -0
- package/build/server/transport/streamable-http/stateful-handler.d.ts +41 -0
- package/build/server/transport/streamable-http/stateful-handler.d.ts.map +1 -0
- package/build/server/transport/streamable-http/stateful-handler.js +264 -0
- package/build/server/transport/streamable-http/stateful-handler.js.map +1 -0
- package/build/server/transport/streamable-http/stateless-handler.d.ts +28 -0
- package/build/server/transport/streamable-http/stateless-handler.d.ts.map +1 -0
- package/build/server/transport/streamable-http/stateless-handler.js +81 -0
- package/build/server/transport/streamable-http/stateless-handler.js.map +1 -0
- package/build/server/transport/streamable-http/transport.d.ts +110 -0
- package/build/server/transport/streamable-http/transport.d.ts.map +1 -0
- package/build/server/transport/streamable-http/transport.js +118 -0
- package/build/server/transport/streamable-http/transport.js.map +1 -0
- package/build/server/transport/transport-context.d.ts +67 -0
- package/build/server/transport/transport-context.d.ts.map +1 -0
- package/build/server/transport/transport-context.js +38 -0
- package/build/server/transport/transport-context.js.map +1 -0
- package/build/server/transport/types.d.ts +56 -0
- package/build/server/transport/types.d.ts.map +1 -0
- package/build/server/transport/types.js +11 -0
- package/build/server/transport/types.js.map +1 -0
- package/build/server/transport-options.d.ts +248 -0
- package/build/server/transport-options.d.ts.map +1 -0
- package/build/server/transport-options.js +18 -0
- package/build/server/transport-options.js.map +1 -0
- package/build/server/types.d.ts +172 -0
- package/build/server/types.d.ts.map +1 -0
- package/build/server/types.js +9 -0
- package/build/server/types.js.map +1 -0
- package/build/telemetry/connection-telemetry-bridge.d.ts +30 -0
- package/build/telemetry/connection-telemetry-bridge.d.ts.map +1 -0
- package/build/telemetry/connection-telemetry-bridge.js +54 -0
- package/build/telemetry/connection-telemetry-bridge.js.map +1 -0
- package/build/telemetry/core/config.d.ts +38 -0
- package/build/telemetry/core/config.d.ts.map +1 -0
- package/build/telemetry/core/config.js +54 -0
- package/build/telemetry/core/config.js.map +1 -0
- package/build/telemetry/core/constants.d.ts +183 -0
- package/build/telemetry/core/constants.d.ts.map +1 -0
- package/build/telemetry/core/constants.js +207 -0
- package/build/telemetry/core/constants.js.map +1 -0
- package/build/telemetry/core/diag-logger.d.ts +35 -0
- package/build/telemetry/core/diag-logger.d.ts.map +1 -0
- package/build/telemetry/core/diag-logger.js +54 -0
- package/build/telemetry/core/diag-logger.js.map +1 -0
- package/build/telemetry/core/index.d.ts +12 -0
- package/build/telemetry/core/index.d.ts.map +1 -0
- package/build/telemetry/core/index.js +32 -0
- package/build/telemetry/core/index.js.map +1 -0
- package/build/telemetry/core/types.d.ts +106 -0
- package/build/telemetry/core/types.d.ts.map +1 -0
- package/build/telemetry/core/types.js +10 -0
- package/build/telemetry/core/types.js.map +1 -0
- package/build/telemetry/index.d.ts +59 -0
- package/build/telemetry/index.d.ts.map +1 -0
- package/build/telemetry/index.js +79 -0
- package/build/telemetry/index.js.map +1 -0
- package/build/telemetry/metrics.d.ts +127 -0
- package/build/telemetry/metrics.d.ts.map +1 -0
- package/build/telemetry/metrics.js +337 -0
- package/build/telemetry/metrics.js.map +1 -0
- package/build/telemetry/sdk.d.ts +110 -0
- package/build/telemetry/sdk.d.ts.map +1 -0
- package/build/telemetry/sdk.js +547 -0
- package/build/telemetry/sdk.js.map +1 -0
- package/build/telemetry/tracing.d.ts +78 -0
- package/build/telemetry/tracing.d.ts.map +1 -0
- package/build/telemetry/tracing.js +257 -0
- package/build/telemetry/tracing.js.map +1 -0
- package/build/utils/env-helpers.d.ts +46 -0
- package/build/utils/env-helpers.d.ts.map +1 -0
- package/build/utils/env-helpers.js +54 -0
- package/build/utils/env-helpers.js.map +1 -0
- package/build/utils/index.d.ts +14 -0
- package/build/utils/index.d.ts.map +1 -0
- package/build/utils/index.js +19 -0
- package/build/utils/index.js.map +1 -0
- package/build/utils/sensitive-keys.d.ts +48 -0
- package/build/utils/sensitive-keys.d.ts.map +1 -0
- package/build/utils/sensitive-keys.js +131 -0
- package/build/utils/sensitive-keys.js.map +1 -0
- package/build/utils/string-helpers.d.ts +126 -0
- package/build/utils/string-helpers.d.ts.map +1 -0
- package/build/utils/string-helpers.js +189 -0
- package/build/utils/string-helpers.js.map +1 -0
- package/build/utils/validation.d.ts +84 -0
- package/build/utils/validation.d.ts.map +1 -0
- package/build/utils/validation.js +111 -0
- package/build/utils/validation.js.map +1 -0
- package/build/utils/zod-helpers.d.ts +92 -0
- package/build/utils/zod-helpers.d.ts.map +1 -0
- package/build/utils/zod-helpers.js +120 -0
- package/build/utils/zod-helpers.js.map +1 -0
- package/package.json +133 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stateful Streamable HTTP Handler
|
|
3
|
+
*
|
|
4
|
+
* Manages persistent sessions with one SDK transport per client.
|
|
5
|
+
* Session lifecycle is tracked via SessionManager.
|
|
6
|
+
*
|
|
7
|
+
* @module server/transport/streamable-http/stateful-handler
|
|
8
|
+
*/
|
|
9
|
+
import type { Request, Response } from "express";
|
|
10
|
+
import type { EventStore } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
11
|
+
import type { SessionManager } from "../../session/index.js";
|
|
12
|
+
import type { SessionFactory } from "../types.js";
|
|
13
|
+
import type { TransportRequestHandler } from "./transport.js";
|
|
14
|
+
/**
|
|
15
|
+
* Stateful request handler — one SDK transport per persistent session.
|
|
16
|
+
*
|
|
17
|
+
* Manages session creation, lookup, and cleanup via SessionManager.
|
|
18
|
+
*/
|
|
19
|
+
export declare class StatefulHandler implements TransportRequestHandler {
|
|
20
|
+
private readonly sessionFactory;
|
|
21
|
+
private readonly sessionManager;
|
|
22
|
+
private readonly enableJsonResponse;
|
|
23
|
+
private readonly eventStore?;
|
|
24
|
+
/**
|
|
25
|
+
* Tracks in-flight session creations that have passed the capacity check
|
|
26
|
+
* but haven't yet called sessionManager.create() in the onsessioninitialized callback.
|
|
27
|
+
* Prevents race conditions where concurrent InitializeRequests both pass
|
|
28
|
+
* hasCapacity() before either creates a session.
|
|
29
|
+
*/
|
|
30
|
+
private pendingCreations;
|
|
31
|
+
constructor(sessionFactory: SessionFactory, sessionManager: SessionManager, enableJsonResponse: boolean, eventStore?: EventStore | undefined);
|
|
32
|
+
handlePost(req: Request, res: Response): Promise<void>;
|
|
33
|
+
handleGet(req: Request, res: Response): Promise<void>;
|
|
34
|
+
handleDelete(req: Request, res: Response): Promise<void>;
|
|
35
|
+
private createSession;
|
|
36
|
+
private getSessionId;
|
|
37
|
+
private resolveSessionId;
|
|
38
|
+
private getTransport;
|
|
39
|
+
private injectSessionIdHeader;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=stateful-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stateful-handler.d.ts","sourceRoot":"","sources":["../../../../src/server/transport/streamable-http/stateful-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oDAAoD,CAAC;AAKrF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAIlD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAyB9D;;;;GAIG;AACH,qBAAa,eAAgB,YAAW,uBAAuB;IAU3D,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;IAZ9B;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB,CAAK;gBAGV,cAAc,EAAE,cAAc,EAC9B,cAAc,EAAE,cAAc,EAC9B,kBAAkB,EAAE,OAAO,EAC3B,UAAU,CAAC,EAAE,UAAU,YAAA;IAGpC,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAgCtD,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IA6CrD,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;YAiChD,aAAa;IAuH3B,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,gBAAgB;IAiBxB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,qBAAqB;CAQ9B"}
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stateful Streamable HTTP Handler
|
|
3
|
+
*
|
|
4
|
+
* Manages persistent sessions with one SDK transport per client.
|
|
5
|
+
* Session lifecycle is tracked via SessionManager.
|
|
6
|
+
*
|
|
7
|
+
* @module server/transport/streamable-http/stateful-handler
|
|
8
|
+
*/
|
|
9
|
+
import { randomUUID } from "node:crypto";
|
|
10
|
+
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
11
|
+
import { isInitializeRequest } from "@modelcontextprotocol/sdk/types.js";
|
|
12
|
+
import { SESSION_CLOSE_REASONS } from "../../session/index.js";
|
|
13
|
+
import { JsonRpcErrorCode, HttpStatus, TransportErrorMessage } from "../../../errors/index.js";
|
|
14
|
+
import { logger as baseLogger } from "../../../logger/index.js";
|
|
15
|
+
import { TRANSPORT_LOG_COMPONENTS, MCP_HEADERS, SESSION_ID_QUERY_PARAMS } from "../constants.js";
|
|
16
|
+
import { sendError, shortId } from "./transport.js";
|
|
17
|
+
const logger = baseLogger.child({
|
|
18
|
+
component: TRANSPORT_LOG_COMPONENTS.STREAMABLE_HTTP,
|
|
19
|
+
});
|
|
20
|
+
/** @internal Log messages for stateful handler */
|
|
21
|
+
const LogMessages = {
|
|
22
|
+
POST_NO_SESSION: "POST /mcp rejected: missing session ID for non-initialize request",
|
|
23
|
+
POST_SESSION_NOT_FOUND: "POST /mcp rejected: session not found [%s]",
|
|
24
|
+
POST_MESSAGE: "POST /mcp [%s] method=%s",
|
|
25
|
+
SESSION_CREATING: "Creating new session from %s",
|
|
26
|
+
SESSION_INITIALIZED: "Session initialized: %s",
|
|
27
|
+
SESSION_CAPACITY_REACHED: "Session capacity reached, closing transport for %s",
|
|
28
|
+
SESSION_CLOSED: "Session closed: %s",
|
|
29
|
+
GET_SSE_OPENED: "GET /mcp SSE stream opened [%s]",
|
|
30
|
+
GET_SESSION_NOT_FOUND: "GET /mcp rejected: session not found [%s]",
|
|
31
|
+
GET_SESSION_ID_FROM_QUERY: "Session ID received via query parameter — prefer Mcp-Session-Id header to avoid URL leakage via Referer/logs",
|
|
32
|
+
SESSION_ID_INJECTED: "Injected session ID into rawHeaders for SSE request",
|
|
33
|
+
GET_ERROR: "Error handling GET for session %s: %s",
|
|
34
|
+
DELETE_ERROR: "Error handling DELETE for session %s: %s",
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Stateful request handler — one SDK transport per persistent session.
|
|
38
|
+
*
|
|
39
|
+
* Manages session creation, lookup, and cleanup via SessionManager.
|
|
40
|
+
*/
|
|
41
|
+
export class StatefulHandler {
|
|
42
|
+
sessionFactory;
|
|
43
|
+
sessionManager;
|
|
44
|
+
enableJsonResponse;
|
|
45
|
+
eventStore;
|
|
46
|
+
/**
|
|
47
|
+
* Tracks in-flight session creations that have passed the capacity check
|
|
48
|
+
* but haven't yet called sessionManager.create() in the onsessioninitialized callback.
|
|
49
|
+
* Prevents race conditions where concurrent InitializeRequests both pass
|
|
50
|
+
* hasCapacity() before either creates a session.
|
|
51
|
+
*/
|
|
52
|
+
pendingCreations = 0;
|
|
53
|
+
constructor(sessionFactory, sessionManager, enableJsonResponse, eventStore) {
|
|
54
|
+
this.sessionFactory = sessionFactory;
|
|
55
|
+
this.sessionManager = sessionManager;
|
|
56
|
+
this.enableJsonResponse = enableJsonResponse;
|
|
57
|
+
this.eventStore = eventStore;
|
|
58
|
+
}
|
|
59
|
+
async handlePost(req, res) {
|
|
60
|
+
const sessionId = this.getSessionId(req);
|
|
61
|
+
// No session + InitializeRequest → create new session
|
|
62
|
+
if (!sessionId && isInitializeRequest(req.body)) {
|
|
63
|
+
await this.createSession(req, res);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
// No session + non-init request → error
|
|
67
|
+
if (!sessionId) {
|
|
68
|
+
logger.warn(LogMessages.POST_NO_SESSION);
|
|
69
|
+
sendError(res, HttpStatus.BAD_REQUEST, JsonRpcErrorCode.SERVER_ERROR, TransportErrorMessage.SESSION_ID_REQUIRED);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
// Existing session → delegate to SDK transport
|
|
73
|
+
const transport = this.getTransport(sessionId);
|
|
74
|
+
if (!transport) {
|
|
75
|
+
logger.warn(LogMessages.POST_SESSION_NOT_FOUND, shortId(sessionId));
|
|
76
|
+
sendError(res, HttpStatus.NOT_FOUND, JsonRpcErrorCode.SESSION_NOT_FOUND, TransportErrorMessage.SESSION_NOT_FOUND);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
this.sessionManager.touch(sessionId);
|
|
80
|
+
const method = req.body?.method || "unknown";
|
|
81
|
+
logger.trace(LogMessages.POST_MESSAGE, shortId(sessionId), method);
|
|
82
|
+
await transport.handleRequest(req, res, req.body);
|
|
83
|
+
}
|
|
84
|
+
async handleGet(req, res) {
|
|
85
|
+
const sessionId = this.resolveSessionId(req);
|
|
86
|
+
if (!sessionId) {
|
|
87
|
+
sendError(res, HttpStatus.BAD_REQUEST, JsonRpcErrorCode.SERVER_ERROR, TransportErrorMessage.SESSION_ID_OR_PARAM_REQUIRED);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const transport = this.getTransport(sessionId);
|
|
91
|
+
if (!transport) {
|
|
92
|
+
logger.warn(LogMessages.GET_SESSION_NOT_FOUND, shortId(sessionId));
|
|
93
|
+
sendError(res, HttpStatus.NOT_FOUND, JsonRpcErrorCode.SESSION_NOT_FOUND, TransportErrorMessage.SESSION_NOT_FOUND_REINIT);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
this.sessionManager.touch(sessionId);
|
|
97
|
+
logger.trace(LogMessages.GET_SSE_OPENED, shortId(sessionId));
|
|
98
|
+
/* v8 ignore start - SDK SSE stream handling */
|
|
99
|
+
try {
|
|
100
|
+
this.injectSessionIdHeader(req, sessionId);
|
|
101
|
+
await transport.handleRequest(req, res);
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
logger.error(LogMessages.GET_ERROR, sessionId, error);
|
|
105
|
+
sendError(res, HttpStatus.INTERNAL_SERVER_ERROR, JsonRpcErrorCode.INTERNAL_ERROR, TransportErrorMessage.INTERNAL_ERROR);
|
|
106
|
+
}
|
|
107
|
+
/* v8 ignore stop */
|
|
108
|
+
}
|
|
109
|
+
async handleDelete(req, res) {
|
|
110
|
+
const sessionId = this.getSessionId(req);
|
|
111
|
+
if (!sessionId) {
|
|
112
|
+
sendError(res, HttpStatus.BAD_REQUEST, JsonRpcErrorCode.SERVER_ERROR, TransportErrorMessage.SESSION_ID_REQUIRED);
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
const transport = this.getTransport(sessionId);
|
|
116
|
+
if (!transport) {
|
|
117
|
+
sendError(res, HttpStatus.NOT_FOUND, JsonRpcErrorCode.SESSION_NOT_FOUND, TransportErrorMessage.SESSION_NOT_FOUND);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
/* v8 ignore start - SDK DELETE handling */
|
|
121
|
+
try {
|
|
122
|
+
await transport.handleRequest(req, res);
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
logger.error(LogMessages.DELETE_ERROR, sessionId, error);
|
|
126
|
+
sendError(res, HttpStatus.INTERNAL_SERVER_ERROR, JsonRpcErrorCode.INTERNAL_ERROR, TransportErrorMessage.INTERNAL_ERROR);
|
|
127
|
+
}
|
|
128
|
+
/* v8 ignore stop */
|
|
129
|
+
}
|
|
130
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
131
|
+
// Session Creation
|
|
132
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
133
|
+
async createSession(req, res) {
|
|
134
|
+
// Atomic capacity check accounting for in-flight session creations.
|
|
135
|
+
// Without this, concurrent InitializeRequests can both pass hasCapacity()
|
|
136
|
+
// before either calls sessionManager.create(), leading to wasted SDK connections.
|
|
137
|
+
// Node.js is single-threaded: no await between stats read and increment → atomic.
|
|
138
|
+
const { activeCount, maxSessions } = this.sessionManager.stats;
|
|
139
|
+
if (activeCount + this.pendingCreations >= maxSessions) {
|
|
140
|
+
logger.warn(LogMessages.SESSION_CAPACITY_REACHED, "pre-check");
|
|
141
|
+
sendError(res, HttpStatus.SERVICE_UNAVAILABLE, JsonRpcErrorCode.SERVER_ERROR, TransportErrorMessage.TOO_MANY_SESSIONS);
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
// Check per-transport limits (e.g., maxStreamableHttpSessions) before SDK handshake.
|
|
145
|
+
// Without this, the SDK sends InitializeResponse but sessionManager.create() rejects
|
|
146
|
+
// in the onsessioninitialized callback, leaving the client with a stale session ID.
|
|
147
|
+
if (!this.sessionManager.hasCapacityForTransport("http")) {
|
|
148
|
+
logger.warn(LogMessages.SESSION_CAPACITY_REACHED, "pre-check (per-transport)");
|
|
149
|
+
sendError(res, HttpStatus.SERVICE_UNAVAILABLE, JsonRpcErrorCode.SERVER_ERROR, TransportErrorMessage.TOO_MANY_SESSIONS);
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
this.pendingCreations++;
|
|
153
|
+
// Idempotent slot release — safe to call multiple times (onsessioninitialized, onclose, finally).
|
|
154
|
+
let slotReleased = false;
|
|
155
|
+
const releaseSlot = () => {
|
|
156
|
+
if (!slotReleased) {
|
|
157
|
+
slotReleased = true;
|
|
158
|
+
this.pendingCreations--;
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
logger.debug(LogMessages.SESSION_CREATING, req.ip || "unknown");
|
|
162
|
+
try {
|
|
163
|
+
const mcpSession = this.sessionFactory();
|
|
164
|
+
const transport = new StreamableHTTPServerTransport({
|
|
165
|
+
sessionIdGenerator: () => randomUUID(),
|
|
166
|
+
enableJsonResponse: this.enableJsonResponse,
|
|
167
|
+
...(this.eventStore !== undefined && { eventStore: this.eventStore }),
|
|
168
|
+
onsessioninitialized: (sessionId) => {
|
|
169
|
+
releaseSlot();
|
|
170
|
+
logger.debug(LogMessages.SESSION_INITIALIZED, shortId(sessionId));
|
|
171
|
+
const session = this.sessionManager.create({
|
|
172
|
+
id: sessionId,
|
|
173
|
+
transportType: "http",
|
|
174
|
+
transport: transport, // @sdk-constraint — StreamableHTTPServerTransport.onclose is optional, Transport.onclose is not
|
|
175
|
+
mcpSession,
|
|
176
|
+
});
|
|
177
|
+
if (!session) {
|
|
178
|
+
logger.warn(LogMessages.SESSION_CAPACITY_REACHED, shortId(sessionId));
|
|
179
|
+
void transport.close().catch((err) => {
|
|
180
|
+
logger.warn("Failed to close transport after capacity rejection: %s", err instanceof Error ? err.message : String(err));
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
},
|
|
184
|
+
});
|
|
185
|
+
/* v8 ignore start - SDK callback registration */
|
|
186
|
+
transport.onclose = () => {
|
|
187
|
+
releaseSlot();
|
|
188
|
+
const sid = transport.sessionId;
|
|
189
|
+
if (sid) {
|
|
190
|
+
logger.info(LogMessages.SESSION_CLOSED, shortId(sid));
|
|
191
|
+
void this.sessionManager.close(sid, SESSION_CLOSE_REASONS.CLIENT_DISCONNECT).catch((err) => {
|
|
192
|
+
logger.warn("Error closing session on client disconnect: %s", err instanceof Error ? err.message : String(err));
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
/* v8 ignore stop */
|
|
197
|
+
try {
|
|
198
|
+
await mcpSession.sdk.connect(transport); // @sdk-constraint — StreamableHTTPServerTransport.onclose is optional, Transport.onclose is not
|
|
199
|
+
await transport.handleRequest(req, res, req.body);
|
|
200
|
+
}
|
|
201
|
+
catch (connectError) {
|
|
202
|
+
// Cleanup transport and session on connect/handleRequest failure
|
|
203
|
+
// to prevent resource leaks (transport stays open, session never closed).
|
|
204
|
+
try {
|
|
205
|
+
await transport.close();
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
// Best-effort — transport may already be closed
|
|
209
|
+
}
|
|
210
|
+
const sid = transport.sessionId;
|
|
211
|
+
if (sid) {
|
|
212
|
+
try {
|
|
213
|
+
await this.sessionManager.close(sid, SESSION_CLOSE_REASONS.ERROR);
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
// Best-effort — session may not have been fully created
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
throw connectError;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
finally {
|
|
223
|
+
releaseSlot();
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
227
|
+
// Helpers
|
|
228
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
229
|
+
getSessionId(req) {
|
|
230
|
+
const value = req.headers[MCP_HEADERS.SESSION_ID];
|
|
231
|
+
return typeof value === "string" ? value : undefined;
|
|
232
|
+
}
|
|
233
|
+
resolveSessionId(req) {
|
|
234
|
+
const headerValue = this.getSessionId(req);
|
|
235
|
+
if (headerValue)
|
|
236
|
+
return headerValue;
|
|
237
|
+
if (req.query) {
|
|
238
|
+
for (const param of SESSION_ID_QUERY_PARAMS) {
|
|
239
|
+
const value = req.query[param];
|
|
240
|
+
if (typeof value === "string" && value) {
|
|
241
|
+
logger.warn(LogMessages.GET_SESSION_ID_FROM_QUERY);
|
|
242
|
+
return value;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
return undefined;
|
|
247
|
+
}
|
|
248
|
+
getTransport(sessionId) {
|
|
249
|
+
const session = this.sessionManager.get(sessionId);
|
|
250
|
+
if (!session)
|
|
251
|
+
return undefined;
|
|
252
|
+
// @transport-downcast — Sessions in this handler are exclusively created with StreamableHTTP transport
|
|
253
|
+
return session.transport.instance;
|
|
254
|
+
}
|
|
255
|
+
injectSessionIdHeader(req, sessionId) {
|
|
256
|
+
if (!req.headers[MCP_HEADERS.SESSION_ID] && sessionId) {
|
|
257
|
+
req.rawHeaders.push(MCP_HEADERS.SESSION_ID, sessionId);
|
|
258
|
+
// @express-api — IncomingHttpHeaders lacks writable string index; safe mutation for framework-internal header injection
|
|
259
|
+
req.headers[MCP_HEADERS.SESSION_ID] = sessionId;
|
|
260
|
+
logger.trace(LogMessages.SESSION_ID_INJECTED);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
//# sourceMappingURL=stateful-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stateful-handler.js","sourceRoot":"","sources":["../../../../src/server/transport/streamable-http/stateful-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stateless Streamable HTTP Handler
|
|
3
|
+
*
|
|
4
|
+
* Creates a fresh McpSession + SDK transport per request.
|
|
5
|
+
* No session tracking, no persistent connections.
|
|
6
|
+
*
|
|
7
|
+
* @module server/transport/streamable-http/stateless-handler
|
|
8
|
+
*/
|
|
9
|
+
import type { Request, Response } from "express";
|
|
10
|
+
import type { SessionFactory } from "../types.js";
|
|
11
|
+
import type { TransportRequestHandler } from "./transport.js";
|
|
12
|
+
/**
|
|
13
|
+
* Stateless request handler — fresh McpSession + transport per request.
|
|
14
|
+
*
|
|
15
|
+
* Per MCP specification, stateless transports:
|
|
16
|
+
* - Do not emit Mcp-Session-Id headers
|
|
17
|
+
* - Do not support GET SSE streams or DELETE
|
|
18
|
+
* - Cannot be reused across requests (SDK constraint)
|
|
19
|
+
*/
|
|
20
|
+
export declare class StatelessHandler implements TransportRequestHandler {
|
|
21
|
+
private readonly sessionFactory;
|
|
22
|
+
private readonly enableJsonResponse;
|
|
23
|
+
constructor(sessionFactory: SessionFactory, enableJsonResponse: boolean);
|
|
24
|
+
handlePost(req: Request, res: Response): Promise<void>;
|
|
25
|
+
handleGet(_req: Request, res: Response): Promise<void>;
|
|
26
|
+
handleDelete(_req: Request, res: Response): Promise<void>;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=stateless-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stateless-handler.d.ts","sourceRoot":"","sources":["../../../../src/server/transport/streamable-http/stateless-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAIjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAIlD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAe9D;;;;;;;GAOG;AACH,qBAAa,gBAAiB,YAAW,uBAAuB;IAE5D,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,kBAAkB;gBADlB,cAAc,EAAE,cAAc,EAC9B,kBAAkB,EAAE,OAAO;IAGxC,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAwCtD,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAUtD,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CAShE"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stateless Streamable HTTP Handler
|
|
3
|
+
*
|
|
4
|
+
* Creates a fresh McpSession + SDK transport per request.
|
|
5
|
+
* No session tracking, no persistent connections.
|
|
6
|
+
*
|
|
7
|
+
* @module server/transport/streamable-http/stateless-handler
|
|
8
|
+
*/
|
|
9
|
+
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
10
|
+
import { JsonRpcErrorCode, HttpStatus, TransportErrorMessage } from "../../../errors/index.js";
|
|
11
|
+
import { logger as baseLogger } from "../../../logger/index.js";
|
|
12
|
+
import { TRANSPORT_LOG_COMPONENTS } from "../constants.js";
|
|
13
|
+
import { sendError } from "./transport.js";
|
|
14
|
+
const logger = baseLogger.child({
|
|
15
|
+
component: TRANSPORT_LOG_COMPONENTS.STREAMABLE_HTTP,
|
|
16
|
+
});
|
|
17
|
+
/** @internal Log messages for stateless handler */
|
|
18
|
+
const LogMessages = {
|
|
19
|
+
STATELESS_POST: "Stateless POST /mcp method=%s",
|
|
20
|
+
STATELESS_ERROR: "Stateless request error: %s",
|
|
21
|
+
STATELESS_CLEANUP_ERROR: "Stateless cleanup error: %s",
|
|
22
|
+
STATELESS_NOT_ALLOWED: "%s not supported in stateless mode",
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Stateless request handler — fresh McpSession + transport per request.
|
|
26
|
+
*
|
|
27
|
+
* Per MCP specification, stateless transports:
|
|
28
|
+
* - Do not emit Mcp-Session-Id headers
|
|
29
|
+
* - Do not support GET SSE streams or DELETE
|
|
30
|
+
* - Cannot be reused across requests (SDK constraint)
|
|
31
|
+
*/
|
|
32
|
+
export class StatelessHandler {
|
|
33
|
+
sessionFactory;
|
|
34
|
+
enableJsonResponse;
|
|
35
|
+
constructor(sessionFactory, enableJsonResponse) {
|
|
36
|
+
this.sessionFactory = sessionFactory;
|
|
37
|
+
this.enableJsonResponse = enableJsonResponse;
|
|
38
|
+
}
|
|
39
|
+
async handlePost(req, res) {
|
|
40
|
+
const method = req.body?.method || "unknown";
|
|
41
|
+
logger.trace(LogMessages.STATELESS_POST, method);
|
|
42
|
+
try {
|
|
43
|
+
const mcpSession = this.sessionFactory();
|
|
44
|
+
// @ts-expect-error @sdk-constraint — SDK sessionIdGenerator? doesn't accept undefined with exactOptionalPropertyTypes; undefined is the documented mechanism for stateless mode
|
|
45
|
+
const transport = new StreamableHTTPServerTransport({
|
|
46
|
+
sessionIdGenerator: undefined,
|
|
47
|
+
enableJsonResponse: this.enableJsonResponse,
|
|
48
|
+
});
|
|
49
|
+
try {
|
|
50
|
+
// @sdk-constraint — StreamableHTTPServerTransport structurally differs from Transport with exactOptionalPropertyTypes
|
|
51
|
+
await mcpSession.sdk.connect(transport);
|
|
52
|
+
await transport.handleRequest(req, res, req.body);
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
// Cleanup transport + session after the request completes (or fails).
|
|
56
|
+
// Runs even if connect() throws — prevents resource leaks on initialization failure.
|
|
57
|
+
// Use Promise.allSettled to ensure both cleanup steps run even if one fails.
|
|
58
|
+
const results = await Promise.allSettled([transport.close(), mcpSession.dispose()]);
|
|
59
|
+
for (const result of results) {
|
|
60
|
+
if (result.status === "rejected") {
|
|
61
|
+
const reason = result.reason instanceof Error ? result.reason.message : String(result.reason);
|
|
62
|
+
logger.warn(LogMessages.STATELESS_CLEANUP_ERROR, reason);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
logger.error(LogMessages.STATELESS_ERROR, error);
|
|
69
|
+
sendError(res, HttpStatus.INTERNAL_SERVER_ERROR, JsonRpcErrorCode.INTERNAL_ERROR, TransportErrorMessage.INTERNAL_ERROR);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
async handleGet(_req, res) {
|
|
73
|
+
logger.warn(LogMessages.STATELESS_NOT_ALLOWED, "GET");
|
|
74
|
+
sendError(res, HttpStatus.METHOD_NOT_ALLOWED, JsonRpcErrorCode.METHOD_NOT_FOUND, "GET not supported in stateless mode");
|
|
75
|
+
}
|
|
76
|
+
async handleDelete(_req, res) {
|
|
77
|
+
logger.warn(LogMessages.STATELESS_NOT_ALLOWED, "DELETE");
|
|
78
|
+
sendError(res, HttpStatus.METHOD_NOT_ALLOWED, JsonRpcErrorCode.METHOD_NOT_FOUND, "DELETE not supported in stateless mode");
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=stateless-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stateless-handler.js","sourceRoot":"","sources":["../../../../src/server/transport/streamable-http/stateless-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Streamable HTTP Transport
|
|
3
|
+
*
|
|
4
|
+
* Facade that delegates HTTP requests to the appropriate strategy handler
|
|
5
|
+
* based on the configured mode (stateful or stateless).
|
|
6
|
+
*
|
|
7
|
+
* Architecture:
|
|
8
|
+
* Express Route → StreamableHttpTransport → Strategy Handler → SDK Transport → McpServer
|
|
9
|
+
*
|
|
10
|
+
* The SDK transport handles all MCP protocol concerns:
|
|
11
|
+
* - JSON-RPC 2.0 parsing and validation
|
|
12
|
+
* - Content-Type and Accept header validation
|
|
13
|
+
* - Session ID management (header setting/checking)
|
|
14
|
+
* - SSE stream setup for server-to-client notifications
|
|
15
|
+
* - Session termination
|
|
16
|
+
*
|
|
17
|
+
* This transport manages:
|
|
18
|
+
* - Strategy selection (stateful vs stateless)
|
|
19
|
+
* - HTTP method routing (POST, GET, DELETE)
|
|
20
|
+
* - Error responses for unsupported methods
|
|
21
|
+
*
|
|
22
|
+
* @see https://modelcontextprotocol.io/specification/2025-03-26/basic/transports
|
|
23
|
+
* @module server/transport/streamable-http/transport
|
|
24
|
+
*/
|
|
25
|
+
import type { Request, Response } from "express";
|
|
26
|
+
import type { EventStore } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
27
|
+
import type { SessionManager } from "../../session/index.js";
|
|
28
|
+
import type { SessionFactory } from "../types.js";
|
|
29
|
+
/**
|
|
30
|
+
* Strategy interface for handling Streamable HTTP transport requests.
|
|
31
|
+
*
|
|
32
|
+
* Implemented by:
|
|
33
|
+
* - {@link StatefulHandler} — one SDK transport per persistent session
|
|
34
|
+
* - {@link StatelessHandler} — fresh McpSession + transport per request
|
|
35
|
+
*/
|
|
36
|
+
export interface TransportRequestHandler {
|
|
37
|
+
handlePost(req: Request, res: Response): Promise<void>;
|
|
38
|
+
handleGet(req: Request, res: Response): Promise<void>;
|
|
39
|
+
handleDelete(req: Request, res: Response): Promise<void>;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Sends a JSON-RPC error response if headers haven't been sent.
|
|
43
|
+
*/
|
|
44
|
+
export declare function sendError(res: Response, status: number, code: number, message: string): void;
|
|
45
|
+
/**
|
|
46
|
+
* Shortens a session ID for log display.
|
|
47
|
+
*/
|
|
48
|
+
export declare function shortId(sessionId: string): string;
|
|
49
|
+
/**
|
|
50
|
+
* Configuration options for the Streamable HTTP transport.
|
|
51
|
+
*/
|
|
52
|
+
export interface StreamableHttpTransportOptions {
|
|
53
|
+
/** Operate in stateless mode (no session IDs). Default: false */
|
|
54
|
+
readonly stateless?: boolean | undefined;
|
|
55
|
+
/**
|
|
56
|
+
* Optional event store for stream resumability.
|
|
57
|
+
*
|
|
58
|
+
* When provided, the SDK transport stores SSE events and supports
|
|
59
|
+
* client reconnection via the `Last-Event-ID` header. Only meaningful
|
|
60
|
+
* in stateful mode — stateless requests have no persistent streams.
|
|
61
|
+
*
|
|
62
|
+
* The SDK provides {@link InMemoryEventStore} as a reference implementation.
|
|
63
|
+
* For production horizontal scaling, implement the {@link EventStore} interface
|
|
64
|
+
* with Redis, PostgreSQL, or another shared backend.
|
|
65
|
+
*
|
|
66
|
+
* @see https://modelcontextprotocol.io/specification/2025-03-26/basic/transports
|
|
67
|
+
*/
|
|
68
|
+
readonly eventStore?: EventStore | undefined;
|
|
69
|
+
/**
|
|
70
|
+
* Prefer JSON responses over SSE for simple request-response.
|
|
71
|
+
*
|
|
72
|
+
* When true, the SDK returns `application/json` for non-streaming
|
|
73
|
+
* responses instead of `text/event-stream` SSE envelopes.
|
|
74
|
+
*
|
|
75
|
+
* MCP spec: "If the server is only sending one response with no
|
|
76
|
+
* notifications, it SHOULD prefer application/json."
|
|
77
|
+
*
|
|
78
|
+
* @default true
|
|
79
|
+
*/
|
|
80
|
+
readonly enableJsonResponse?: boolean | undefined;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Routes HTTP requests to the appropriate strategy handler.
|
|
84
|
+
*
|
|
85
|
+
* In stateful mode (default): delegates to {@link StatefulHandler}
|
|
86
|
+
* In stateless mode: delegates to {@link StatelessHandler}
|
|
87
|
+
*
|
|
88
|
+
* All MCP protocol handling is delegated through the handler chain
|
|
89
|
+
* to the SDK's StreamableHTTPServerTransport.
|
|
90
|
+
*/
|
|
91
|
+
export declare class StreamableHttpTransport {
|
|
92
|
+
private readonly handler;
|
|
93
|
+
private readonly sessionManager;
|
|
94
|
+
constructor(sessionFactory: SessionFactory, sessionManager: SessionManager, options?: StreamableHttpTransportOptions);
|
|
95
|
+
/**
|
|
96
|
+
* Handle an incoming HTTP request by delegating to the appropriate
|
|
97
|
+
* strategy handler.
|
|
98
|
+
*
|
|
99
|
+
* This is the single entry point called by Express route handlers.
|
|
100
|
+
* Security middleware (DNS rebinding, rate limiting, protocol version)
|
|
101
|
+
* runs BEFORE this method is called.
|
|
102
|
+
*/
|
|
103
|
+
handleRequest(req: Request, res: Response): Promise<void>;
|
|
104
|
+
/**
|
|
105
|
+
* Number of active stateful sessions.
|
|
106
|
+
* Returns 0 in stateless mode (no session tracking).
|
|
107
|
+
*/
|
|
108
|
+
get activeSessionCount(): number;
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../../../src/server/transport/streamable-http/transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oDAAoD,CAAC;AAErF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAgBlD;;;;;;GAMG;AACH,MAAM,WAAW,uBAAuB;IACtC,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1D;AAMD;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAI5F;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEjD;AAYD;;GAEG;AACH,MAAM,WAAW,8BAA8B;IAC7C,iEAAiE;IACjE,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAEzC;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IAE7C;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACnD;AAMD;;;;;;;;GAQG;AACH,qBAAa,uBAAuB;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;IAClD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;gBAG9C,cAAc,EAAE,cAAc,EAC9B,cAAc,EAAE,cAAc,EAC9B,OAAO,GAAE,8BAAmC;IAc9C;;;;;;;OAOG;IACG,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAgC/D;;;OAGG;IACH,IAAI,kBAAkB,IAAI,MAAM,CAE/B;CACF"}
|