@cyanheads/mcp-ts-core 0.11.4 → 0.12.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/AGENTS.md +28 -24
- package/CLAUDE.md +28 -24
- package/README.md +10 -10
- package/biome.json +1 -1
- package/changelog/0.11.x/0.11.5.md +28 -0
- package/changelog/0.12.x/0.12.0.md +96 -0
- package/changelog/template.md +55 -16
- package/dist/cli/init.js +1 -1
- package/dist/cli/init.js.map +1 -1
- package/dist/config/index.d.ts +0 -18
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +0 -25
- package/dist/config/index.js.map +1 -1
- package/dist/core/app.d.ts +5 -7
- package/dist/core/app.d.ts.map +1 -1
- package/dist/core/app.js +18 -27
- package/dist/core/app.js.map +1 -1
- package/dist/core/context.d.ts +90 -57
- package/dist/core/context.d.ts.map +1 -1
- package/dist/core/context.js +32 -33
- package/dist/core/context.js.map +1 -1
- package/dist/core/gcPressure.d.ts.map +1 -1
- package/dist/core/gcPressure.js +3 -4
- package/dist/core/gcPressure.js.map +1 -1
- package/dist/core/index.d.ts +6 -7
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +10 -2
- package/dist/core/index.js.map +1 -1
- package/dist/core/serverManifest.d.ts +1 -3
- package/dist/core/serverManifest.d.ts.map +1 -1
- package/dist/core/serverManifest.js +9 -4
- package/dist/core/serverManifest.js.map +1 -1
- package/dist/core/worker.d.ts.map +1 -1
- package/dist/core/worker.js +32 -35
- package/dist/core/worker.js.map +1 -1
- package/dist/logs/combined.log +10 -0
- package/dist/logs/error.log +6 -0
- package/dist/logs/interactions.log +0 -0
- package/dist/mcp-server/inputRequired.d.ts +52 -0
- package/dist/mcp-server/inputRequired.d.ts.map +1 -0
- package/dist/mcp-server/inputRequired.js +76 -0
- package/dist/mcp-server/inputRequired.js.map +1 -0
- package/dist/mcp-server/notifications.d.ts +33 -31
- package/dist/mcp-server/notifications.d.ts.map +1 -1
- package/dist/mcp-server/notifications.js +34 -26
- package/dist/mcp-server/notifications.js.map +1 -1
- package/dist/mcp-server/prompts/prompt-registration.d.ts +2 -2
- package/dist/mcp-server/prompts/prompt-registration.d.ts.map +1 -1
- package/dist/mcp-server/prompts/prompt-registration.js +15 -5
- package/dist/mcp-server/prompts/prompt-registration.js.map +1 -1
- package/dist/mcp-server/prompts/utils/promptDefinition.d.ts +1 -1
- package/dist/mcp-server/prompts/utils/promptDefinition.d.ts.map +1 -1
- package/dist/mcp-server/resources/resource-registration.d.ts +3 -3
- package/dist/mcp-server/resources/resource-registration.d.ts.map +1 -1
- package/dist/mcp-server/resources/resource-registration.js +8 -15
- package/dist/mcp-server/resources/resource-registration.js.map +1 -1
- package/dist/mcp-server/resources/resourceSubscriptions.d.ts +45 -0
- package/dist/mcp-server/resources/resourceSubscriptions.d.ts.map +1 -0
- package/dist/mcp-server/resources/resourceSubscriptions.js +51 -0
- package/dist/mcp-server/resources/resourceSubscriptions.js.map +1 -0
- package/dist/mcp-server/resources/utils/resourceDefinition.d.ts +3 -5
- package/dist/mcp-server/resources/utils/resourceDefinition.d.ts.map +1 -1
- package/dist/mcp-server/resources/utils/resourceDefinition.js +1 -1
- package/dist/mcp-server/resources/utils/resourceDefinition.js.map +1 -1
- package/dist/mcp-server/resources/utils/resourceHandlerFactory.d.ts +8 -15
- package/dist/mcp-server/resources/utils/resourceHandlerFactory.d.ts.map +1 -1
- package/dist/mcp-server/resources/utils/resourceHandlerFactory.js +21 -22
- package/dist/mcp-server/resources/utils/resourceHandlerFactory.js.map +1 -1
- package/dist/mcp-server/server.d.ts +12 -21
- package/dist/mcp-server/server.d.ts.map +1 -1
- package/dist/mcp-server/server.js +38 -28
- package/dist/mcp-server/server.js.map +1 -1
- package/dist/mcp-server/tools/tool-registration.d.ts +11 -33
- package/dist/mcp-server/tools/tool-registration.d.ts.map +1 -1
- package/dist/mcp-server/tools/tool-registration.js +17 -243
- package/dist/mcp-server/tools/tool-registration.js.map +1 -1
- package/dist/mcp-server/tools/utils/toolDefinition.d.ts +1 -3
- package/dist/mcp-server/tools/utils/toolDefinition.d.ts.map +1 -1
- package/dist/mcp-server/tools/utils/toolDefinition.js +48 -1
- package/dist/mcp-server/tools/utils/toolDefinition.js.map +1 -1
- package/dist/mcp-server/tools/utils/toolHandlerFactory.d.ts +46 -20
- package/dist/mcp-server/tools/utils/toolHandlerFactory.d.ts.map +1 -1
- package/dist/mcp-server/tools/utils/toolHandlerFactory.js +131 -25
- package/dist/mcp-server/tools/utils/toolHandlerFactory.js.map +1 -1
- package/dist/mcp-server/transports/ITransport.d.ts +2 -2
- package/dist/mcp-server/transports/ITransport.d.ts.map +1 -1
- package/dist/mcp-server/transports/auth/authFactory.js +1 -1
- package/dist/mcp-server/transports/auth/authFactory.js.map +1 -1
- package/dist/mcp-server/transports/auth/lib/authTypes.d.ts +1 -1
- package/dist/mcp-server/transports/auth/lib/authTypes.d.ts.map +1 -1
- package/dist/mcp-server/transports/auth/lib/authUtils.d.ts.map +1 -1
- package/dist/mcp-server/transports/auth/lib/authUtils.js +5 -13
- package/dist/mcp-server/transports/auth/lib/authUtils.js.map +1 -1
- package/dist/mcp-server/transports/auth/strategies/jwtStrategy.js +5 -11
- package/dist/mcp-server/transports/auth/strategies/jwtStrategy.js.map +1 -1
- package/dist/mcp-server/transports/auth/strategies/oauthStrategy.d.ts.map +1 -1
- package/dist/mcp-server/transports/auth/strategies/oauthStrategy.js +9 -22
- package/dist/mcp-server/transports/auth/strategies/oauthStrategy.js.map +1 -1
- package/dist/mcp-server/transports/heartbeat.d.ts.map +1 -1
- package/dist/mcp-server/transports/heartbeat.js +4 -8
- package/dist/mcp-server/transports/heartbeat.js.map +1 -1
- package/dist/mcp-server/transports/http/httpErrorHandler.d.ts.map +1 -1
- package/dist/mcp-server/transports/http/httpErrorHandler.js +6 -24
- package/dist/mcp-server/transports/http/httpErrorHandler.js.map +1 -1
- package/dist/mcp-server/transports/http/httpServer.d.ts +3 -3
- package/dist/mcp-server/transports/http/httpServer.d.ts.map +1 -1
- package/dist/mcp-server/transports/http/httpServer.js +15 -32
- package/dist/mcp-server/transports/http/httpServer.js.map +1 -1
- package/dist/mcp-server/transports/http/httpTransport.d.ts +25 -8
- package/dist/mcp-server/transports/http/httpTransport.d.ts.map +1 -1
- package/dist/mcp-server/transports/http/httpTransport.js +156 -310
- package/dist/mcp-server/transports/http/httpTransport.js.map +1 -1
- package/dist/mcp-server/transports/http/landing-page/assets/styles.d.ts.map +1 -1
- package/dist/mcp-server/transports/http/landing-page/assets/styles.js +0 -1
- package/dist/mcp-server/transports/http/landing-page/assets/styles.js.map +1 -1
- package/dist/mcp-server/transports/http/landing-page/handler.d.ts.map +1 -1
- package/dist/mcp-server/transports/http/landing-page/handler.js +4 -8
- package/dist/mcp-server/transports/http/landing-page/handler.js.map +1 -1
- package/dist/mcp-server/transports/http/landing-page/sections/tools.js +0 -2
- package/dist/mcp-server/transports/http/landing-page/sections/tools.js.map +1 -1
- package/dist/mcp-server/transports/http/protectedResourceMetadata.d.ts.map +1 -1
- package/dist/mcp-server/transports/http/protectedResourceMetadata.js +2 -6
- package/dist/mcp-server/transports/http/protectedResourceMetadata.js.map +1 -1
- package/dist/mcp-server/transports/http/robotsTxt.js +2 -2
- package/dist/mcp-server/transports/http/robotsTxt.js.map +1 -1
- package/dist/mcp-server/transports/http/serverCard.d.ts.map +1 -1
- package/dist/mcp-server/transports/http/serverCard.js +2 -6
- package/dist/mcp-server/transports/http/serverCard.js.map +1 -1
- package/dist/mcp-server/transports/http/sessionStore.d.ts +48 -45
- package/dist/mcp-server/transports/http/sessionStore.d.ts.map +1 -1
- package/dist/mcp-server/transports/http/sessionStore.js +141 -185
- package/dist/mcp-server/transports/http/sessionStore.js.map +1 -1
- package/dist/mcp-server/transports/manager.d.ts +12 -4
- package/dist/mcp-server/transports/manager.d.ts.map +1 -1
- package/dist/mcp-server/transports/manager.js +35 -33
- package/dist/mcp-server/transports/manager.js.map +1 -1
- package/dist/mcp-server/transports/stdio/stdioTransport.d.ts +24 -31
- package/dist/mcp-server/transports/stdio/stdioTransport.d.ts.map +1 -1
- package/dist/mcp-server/transports/stdio/stdioTransport.js +23 -38
- package/dist/mcp-server/transports/stdio/stdioTransport.js.map +1 -1
- package/dist/mcp-server/types.d.ts +25 -0
- package/dist/mcp-server/types.d.ts.map +1 -0
- package/dist/mcp-server/types.js +10 -0
- package/dist/mcp-server/types.js.map +1 -0
- package/dist/services/canvas/core/CanvasInstance.d.ts +2 -2
- package/dist/services/canvas/core/CanvasInstance.d.ts.map +1 -1
- package/dist/services/canvas/core/CanvasInstance.js.map +1 -1
- package/dist/services/canvas/core/CanvasRegistry.d.ts +4 -4
- package/dist/services/canvas/core/CanvasRegistry.d.ts.map +1 -1
- package/dist/services/canvas/core/CanvasRegistry.js +8 -18
- package/dist/services/canvas/core/CanvasRegistry.js.map +1 -1
- package/dist/services/canvas/core/DataCanvas.d.ts +5 -5
- package/dist/services/canvas/core/DataCanvas.d.ts.map +1 -1
- package/dist/services/canvas/core/DataCanvas.js +2 -3
- package/dist/services/canvas/core/DataCanvas.js.map +1 -1
- package/dist/services/canvas/core/IDataCanvasProvider.d.ts +11 -11
- package/dist/services/canvas/core/IDataCanvasProvider.d.ts.map +1 -1
- package/dist/services/canvas/providers/duckdb/DuckdbProvider.d.ts +11 -11
- package/dist/services/canvas/providers/duckdb/DuckdbProvider.d.ts.map +1 -1
- package/dist/services/canvas/providers/duckdb/DuckdbProvider.js +4 -10
- package/dist/services/canvas/providers/duckdb/DuckdbProvider.js.map +1 -1
- package/dist/services/llm/providers/openrouter.provider.d.ts.map +1 -1
- package/dist/services/llm/providers/openrouter.provider.js +2 -5
- package/dist/services/llm/providers/openrouter.provider.js.map +1 -1
- package/dist/services/mirror/core/defineMirror.js +1 -1
- package/dist/services/mirror/core/defineMirror.js.map +1 -1
- package/dist/services/mirror/types.d.ts +5 -5
- package/dist/services/mirror/types.d.ts.map +1 -1
- package/dist/services/speech/providers/elevenlabs.provider.js +1 -1
- package/dist/services/speech/providers/elevenlabs.provider.js.map +1 -1
- package/dist/services/speech/providers/whisper.provider.js +1 -1
- package/dist/services/speech/providers/whisper.provider.js.map +1 -1
- package/dist/storage/core/StorageService.d.ts +1 -1
- package/dist/storage/core/StorageService.d.ts.map +1 -1
- package/dist/storage/core/StorageService.js +12 -20
- package/dist/storage/core/StorageService.js.map +1 -1
- package/dist/storage/core/storageFactory.d.ts.map +1 -1
- package/dist/storage/core/storageFactory.js.map +1 -1
- package/dist/storage/core/storageValidation.d.ts +1 -1
- package/dist/storage/core/storageValidation.d.ts.map +1 -1
- package/dist/storage/core/storageValidation.js +2 -2
- package/dist/storage/core/storageValidation.js.map +1 -1
- package/dist/storage/providers/cloudflare/d1Provider.d.ts +1 -1
- package/dist/storage/providers/cloudflare/d1Provider.d.ts.map +1 -1
- package/dist/storage/providers/cloudflare/d1Provider.js +4 -12
- package/dist/storage/providers/cloudflare/d1Provider.js.map +1 -1
- package/dist/storage/providers/cloudflare/kvProvider.d.ts +1 -1
- package/dist/storage/providers/cloudflare/kvProvider.d.ts.map +1 -1
- package/dist/storage/providers/cloudflare/kvProvider.js +3 -8
- package/dist/storage/providers/cloudflare/kvProvider.js.map +1 -1
- package/dist/storage/providers/cloudflare/r2Provider.d.ts +1 -1
- package/dist/storage/providers/cloudflare/r2Provider.d.ts.map +1 -1
- package/dist/storage/providers/cloudflare/r2Provider.js +3 -8
- package/dist/storage/providers/cloudflare/r2Provider.js.map +1 -1
- package/dist/storage/providers/inMemory/inMemoryProvider.d.ts +1 -1
- package/dist/storage/providers/inMemory/inMemoryProvider.d.ts.map +1 -1
- package/dist/storage/providers/inMemory/inMemoryProvider.js +2 -4
- package/dist/storage/providers/inMemory/inMemoryProvider.js.map +1 -1
- package/dist/testing/index.d.ts +35 -12
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +53 -38
- package/dist/testing/index.js.map +1 -1
- package/dist/testing/vitest.d.ts +1 -1
- package/dist/testing/vitest.d.ts.map +1 -1
- package/dist/types-global/errors.d.ts +28 -15
- package/dist/types-global/errors.d.ts.map +1 -1
- package/dist/types-global/errors.js +8 -1
- package/dist/types-global/errors.js.map +1 -1
- package/dist/utils/formatting/diffFormatter.d.ts +5 -5
- package/dist/utils/formatting/diffFormatter.d.ts.map +1 -1
- package/dist/utils/formatting/diffFormatter.js +7 -20
- package/dist/utils/formatting/diffFormatter.js.map +1 -1
- package/dist/utils/formatting/tableFormatter.d.ts +3 -3
- package/dist/utils/formatting/tableFormatter.d.ts.map +1 -1
- package/dist/utils/formatting/tableFormatter.js +6 -17
- package/dist/utils/formatting/tableFormatter.js.map +1 -1
- package/dist/utils/formatting/treeFormatter.d.ts +3 -3
- package/dist/utils/formatting/treeFormatter.d.ts.map +1 -1
- package/dist/utils/formatting/treeFormatter.js +5 -18
- package/dist/utils/formatting/treeFormatter.js.map +1 -1
- package/dist/utils/index.d.ts +4 -2
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +2 -2
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/internal/error-handler/errorHandler.d.ts +1 -1
- package/dist/utils/internal/error-handler/errorHandler.d.ts.map +1 -1
- package/dist/utils/internal/error-handler/errorHandler.js +23 -11
- package/dist/utils/internal/error-handler/errorHandler.js.map +1 -1
- package/dist/utils/internal/error-handler/types.d.ts +10 -13
- package/dist/utils/internal/error-handler/types.d.ts.map +1 -1
- package/dist/utils/internal/logger.d.ts +3 -3
- package/dist/utils/internal/logger.d.ts.map +1 -1
- package/dist/utils/internal/logger.js +11 -5
- package/dist/utils/internal/logger.js.map +1 -1
- package/dist/utils/internal/performance.d.ts +1 -1
- package/dist/utils/internal/performance.d.ts.map +1 -1
- package/dist/utils/internal/performance.js +57 -13
- package/dist/utils/internal/performance.js.map +1 -1
- package/dist/utils/internal/requestContext.d.ts +79 -55
- package/dist/utils/internal/requestContext.d.ts.map +1 -1
- package/dist/utils/internal/requestContext.js +77 -32
- package/dist/utils/internal/requestContext.js.map +1 -1
- package/dist/utils/metrics/tokenCounter.d.ts +3 -3
- package/dist/utils/metrics/tokenCounter.d.ts.map +1 -1
- package/dist/utils/metrics/tokenCounter.js.map +1 -1
- package/dist/utils/network/fetchWithTimeout.d.ts +2 -2
- package/dist/utils/network/fetchWithTimeout.d.ts.map +1 -1
- package/dist/utils/network/fetchWithTimeout.js +8 -24
- package/dist/utils/network/fetchWithTimeout.js.map +1 -1
- package/dist/utils/network/retry.d.ts +2 -2
- package/dist/utils/network/retry.d.ts.map +1 -1
- package/dist/utils/overflow/outlineOnOverflow.d.ts +1 -1
- package/dist/utils/overflow/outlineOnOverflow.d.ts.map +1 -1
- package/dist/utils/pagination/pagination.d.ts +3 -3
- package/dist/utils/pagination/pagination.d.ts.map +1 -1
- package/dist/utils/pagination/pagination.js +3 -3
- package/dist/utils/pagination/pagination.js.map +1 -1
- package/dist/utils/parsing/csvParser.d.ts +2 -2
- package/dist/utils/parsing/csvParser.d.ts.map +1 -1
- package/dist/utils/parsing/csvParser.js +4 -8
- package/dist/utils/parsing/csvParser.js.map +1 -1
- package/dist/utils/parsing/dateParser.d.ts +3 -3
- package/dist/utils/parsing/dateParser.d.ts.map +1 -1
- package/dist/utils/parsing/dateParser.js +3 -2
- package/dist/utils/parsing/dateParser.js.map +1 -1
- package/dist/utils/parsing/frontmatterParser.d.ts +2 -2
- package/dist/utils/parsing/frontmatterParser.d.ts.map +1 -1
- package/dist/utils/parsing/frontmatterParser.js +7 -10
- package/dist/utils/parsing/frontmatterParser.js.map +1 -1
- package/dist/utils/parsing/htmlExtractor.d.ts +2 -2
- package/dist/utils/parsing/htmlExtractor.d.ts.map +1 -1
- package/dist/utils/parsing/htmlExtractor.js +6 -11
- package/dist/utils/parsing/htmlExtractor.js.map +1 -1
- package/dist/utils/parsing/jsonParser.d.ts +2 -2
- package/dist/utils/parsing/jsonParser.d.ts.map +1 -1
- package/dist/utils/parsing/jsonParser.js +4 -8
- package/dist/utils/parsing/jsonParser.js.map +1 -1
- package/dist/utils/parsing/pdfParser.d.ts +10 -10
- package/dist/utils/parsing/pdfParser.d.ts.map +1 -1
- package/dist/utils/parsing/pdfParser.js +26 -89
- package/dist/utils/parsing/pdfParser.js.map +1 -1
- package/dist/utils/parsing/xmlParser.d.ts +2 -2
- package/dist/utils/parsing/xmlParser.d.ts.map +1 -1
- package/dist/utils/parsing/xmlParser.js +4 -8
- package/dist/utils/parsing/xmlParser.js.map +1 -1
- package/dist/utils/parsing/yamlParser.d.ts +2 -2
- package/dist/utils/parsing/yamlParser.d.ts.map +1 -1
- package/dist/utils/parsing/yamlParser.js +4 -8
- package/dist/utils/parsing/yamlParser.js.map +1 -1
- package/dist/utils/scheduling/scheduler.d.ts.map +1 -1
- package/dist/utils/scheduling/scheduler.js +5 -6
- package/dist/utils/scheduling/scheduler.js.map +1 -1
- package/dist/utils/security/rateLimiter.d.ts +2 -2
- package/dist/utils/security/rateLimiter.d.ts.map +1 -1
- package/dist/utils/security/rateLimiter.js +1 -1
- package/dist/utils/security/rateLimiter.js.map +1 -1
- package/dist/utils/telemetry/attributes.d.ts +23 -7
- package/dist/utils/telemetry/attributes.d.ts.map +1 -1
- package/dist/utils/telemetry/attributes.js +23 -10
- package/dist/utils/telemetry/attributes.js.map +1 -1
- package/dist/utils/telemetry/trace.d.ts +3 -3
- package/dist/utils/telemetry/trace.d.ts.map +1 -1
- package/dist/utils/telemetry/trace.js +4 -2
- package/dist/utils/telemetry/trace.js.map +1 -1
- package/package.json +22 -26
- package/scripts/lint-mcp.ts +1 -3
- package/scripts/lint-packaging.ts +1 -1
- package/skills/add-service/SKILL.md +2 -2
- package/skills/add-test/SKILL.md +42 -20
- package/skills/add-tool/SKILL.md +68 -19
- package/skills/api-canvas/SKILL.md +2 -2
- package/skills/api-config/SKILL.md +1 -11
- package/skills/api-context/SKILL.md +175 -111
- package/skills/api-linter/SKILL.md +2 -2
- package/skills/api-telemetry/SKILL.md +8 -12
- package/skills/api-testing/SKILL.md +53 -52
- package/skills/code-simplifier/SKILL.md +2 -2
- package/skills/design-mcp-server/SKILL.md +34 -18
- package/skills/field-test/SKILL.md +4 -2
- package/skills/git-wrapup/SKILL.md +3 -3
- package/skills/polish-docs-meta/SKILL.md +1 -1
- package/skills/polish-docs-meta/references/agent-protocol.md +2 -2
- package/skills/polish-docs-meta/references/readme.md +1 -1
- package/skills/release-and-publish/SKILL.md +3 -1
- package/skills/report-issue-framework/SKILL.md +2 -2
- package/skills/report-issue-local/SKILL.md +2 -2
- package/skills/security-pass/SKILL.md +16 -14
- package/templates/.github/CODE_OF_CONDUCT.md +28 -0
- package/templates/.github/CONTRIBUTING.md +50 -0
- package/templates/.github/SECURITY.md +24 -0
- package/templates/AGENTS.md +6 -6
- package/templates/CLAUDE.md +6 -6
- package/templates/changelog/template.md +55 -16
- package/templates/tests/resources/echo.resource.test.ts +16 -9
- package/dist/mcp-server/elicitation.d.ts +0 -64
- package/dist/mcp-server/elicitation.d.ts.map +0 -1
- package/dist/mcp-server/elicitation.js +0 -81
- package/dist/mcp-server/elicitation.js.map +0 -1
- package/dist/mcp-server/protocolSession.d.ts +0 -34
- package/dist/mcp-server/protocolSession.d.ts.map +0 -1
- package/dist/mcp-server/protocolSession.js +0 -13
- package/dist/mcp-server/protocolSession.js.map +0 -1
- package/dist/mcp-server/tasks/core/evictingTaskMessageQueue.d.ts +0 -53
- package/dist/mcp-server/tasks/core/evictingTaskMessageQueue.d.ts.map +0 -1
- package/dist/mcp-server/tasks/core/evictingTaskMessageQueue.js +0 -65
- package/dist/mcp-server/tasks/core/evictingTaskMessageQueue.js.map +0 -1
- package/dist/mcp-server/tasks/core/sessionAwareTaskStore.d.ts +0 -70
- package/dist/mcp-server/tasks/core/sessionAwareTaskStore.d.ts.map +0 -1
- package/dist/mcp-server/tasks/core/sessionAwareTaskStore.js +0 -130
- package/dist/mcp-server/tasks/core/sessionAwareTaskStore.js.map +0 -1
- package/dist/mcp-server/tasks/core/storageBackedTaskStore.d.ts +0 -109
- package/dist/mcp-server/tasks/core/storageBackedTaskStore.d.ts.map +0 -1
- package/dist/mcp-server/tasks/core/storageBackedTaskStore.js +0 -209
- package/dist/mcp-server/tasks/core/storageBackedTaskStore.js.map +0 -1
- package/dist/mcp-server/tasks/core/taskManager.d.ts +0 -91
- package/dist/mcp-server/tasks/core/taskManager.d.ts.map +0 -1
- package/dist/mcp-server/tasks/core/taskManager.js +0 -210
- package/dist/mcp-server/tasks/core/taskManager.js.map +0 -1
- package/dist/mcp-server/tasks/core/taskTypes.d.ts +0 -18
- package/dist/mcp-server/tasks/core/taskTypes.d.ts.map +0 -1
- package/dist/mcp-server/tasks/core/taskTypes.js +0 -20
- package/dist/mcp-server/tasks/core/taskTypes.js.map +0 -1
- package/dist/mcp-server/tasks/utils/taskToolDefinition.d.ts +0 -101
- package/dist/mcp-server/tasks/utils/taskToolDefinition.d.ts.map +0 -1
- package/dist/mcp-server/tasks/utils/taskToolDefinition.js +0 -14
- package/dist/mcp-server/tasks/utils/taskToolDefinition.js.map +0 -1
|
@@ -1,13 +1,23 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @fileoverview
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* @fileoverview In-memory session registry for the HTTP transport's sessionful
|
|
3
|
+
* (2025-era) arm.
|
|
4
|
+
*
|
|
5
|
+
* The SDK's streamable HTTP transport owns the protocol side of a session — it
|
|
6
|
+
* mints the ID, rejects unknown ones, stamps `Mcp-Session-Id`, and answers
|
|
7
|
+
* DELETE. This store owns what the SDK deliberately does not: binding a session
|
|
8
|
+
* to the authenticated identity that created it, capping concurrent sessions,
|
|
9
|
+
* expiring idle ones, and holding the `McpServer` + transport pair that serves
|
|
10
|
+
* the session for its lifetime.
|
|
11
|
+
*
|
|
12
|
+
* The 2026-07-28 revision has no session at all, so nothing here applies to it.
|
|
13
|
+
*
|
|
14
|
+
* @see {@link https://modelcontextprotocol.io/specification/2026-07-28/basic/transports | MCP Transports}
|
|
5
15
|
* @module src/mcp-server/transports/http/sessionStore
|
|
6
16
|
*/
|
|
7
17
|
import { validateSessionIdFormat } from '../../../mcp-server/transports/http/sessionIdUtils.js';
|
|
8
18
|
import { invalidParams, serviceUnavailable } from '../../../types-global/errors.js';
|
|
9
19
|
import { logger } from '../../../utils/internal/logger.js';
|
|
10
|
-
import { requestContextService } from '../../../utils/internal/requestContext.js';
|
|
20
|
+
import { requestContextService, withExtra } from '../../../utils/internal/requestContext.js';
|
|
11
21
|
import { ATTR_MCP_SESSION_EVENT } from '../../../utils/telemetry/attributes.js';
|
|
12
22
|
import { createCounter, createHistogram } from '../../../utils/telemetry/metrics.js';
|
|
13
23
|
let sessionEventCounter;
|
|
@@ -21,10 +31,6 @@ function getSessionMetrics() {
|
|
|
21
31
|
export function initSessionMetrics() {
|
|
22
32
|
getSessionMetrics();
|
|
23
33
|
}
|
|
24
|
-
/**
|
|
25
|
-
* Simple in-memory session store for stateful MCP sessions.
|
|
26
|
-
* In production, consider using Redis or another persistent store.
|
|
27
|
-
*/
|
|
28
34
|
/** Default maximum number of concurrent sessions before new ones are rejected. */
|
|
29
35
|
const DEFAULT_MAX_SESSIONS = 10_000;
|
|
30
36
|
export class SessionStore {
|
|
@@ -36,169 +42,89 @@ export class SessionStore {
|
|
|
36
42
|
this.staleTimeout = staleTimeoutMs;
|
|
37
43
|
this.maxSessions = maxSessions;
|
|
38
44
|
// Clean up stale sessions every minute. unref() prevents blocking graceful shutdown.
|
|
39
|
-
this.cleanupInterval = setInterval(() => this.cleanupStaleSessions(), 60_000);
|
|
45
|
+
this.cleanupInterval = setInterval(() => void this.cleanupStaleSessions(), 60_000);
|
|
40
46
|
this.cleanupInterval.unref?.();
|
|
41
47
|
}
|
|
42
48
|
/**
|
|
43
|
-
* Stops the cleanup interval and
|
|
49
|
+
* Stops the cleanup interval and closes every live connection.
|
|
44
50
|
* Call this during transport shutdown to prevent resource leaks.
|
|
45
51
|
*/
|
|
46
|
-
destroy() {
|
|
52
|
+
async destroy() {
|
|
47
53
|
clearInterval(this.cleanupInterval);
|
|
48
|
-
|
|
49
|
-
this.abortSessionRequests(session);
|
|
54
|
+
const connections = [...this.sessions.values()].map((session) => session.connection);
|
|
50
55
|
this.sessions.clear();
|
|
56
|
+
await Promise.allSettled(connections.map((connection) => closeConnection(connection)));
|
|
51
57
|
}
|
|
52
58
|
/**
|
|
53
|
-
*
|
|
54
|
-
*
|
|
59
|
+
* Throws before a new session's protocol instances are built when the server
|
|
60
|
+
* is already at capacity — allocating them first and discarding them is the
|
|
61
|
+
* expensive way to answer 503.
|
|
55
62
|
*
|
|
56
|
-
* @
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
63
|
+
* @throws {McpError} `ServiceUnavailable` when at `maxSessions`.
|
|
64
|
+
*/
|
|
65
|
+
assertCapacity() {
|
|
66
|
+
if (this.sessions.size < this.maxSessions)
|
|
67
|
+
return;
|
|
68
|
+
const context = requestContextService.createRequestContext({
|
|
69
|
+
operation: 'SessionStore.assertCapacity',
|
|
70
|
+
additionalContext: {
|
|
71
|
+
currentSessions: this.sessions.size,
|
|
72
|
+
maxSessions: this.maxSessions,
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
logger.warning('Session capacity reached, rejecting new session', context);
|
|
76
|
+
throw serviceUnavailable(`Maximum session capacity reached (${this.maxSessions}). Try again later.`, context);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Records a session the SDK transport just initialized, binding it to the
|
|
80
|
+
* identity that created it.
|
|
81
|
+
*
|
|
82
|
+
* @throws {McpError} `InvalidParams` when the session ID format is invalid,
|
|
83
|
+
* `ServiceUnavailable` when at capacity.
|
|
60
84
|
*/
|
|
61
|
-
|
|
62
|
-
// Validate session ID format to prevent injection attacks
|
|
85
|
+
register(sessionId, connection, identity) {
|
|
63
86
|
if (!validateSessionIdFormat(sessionId)) {
|
|
64
87
|
const context = requestContextService.createRequestContext({
|
|
65
|
-
operation: 'SessionStore.
|
|
66
|
-
sessionIdPrefix: sessionId.substring(0, 16),
|
|
88
|
+
operation: 'SessionStore.register',
|
|
89
|
+
additionalContext: { sessionIdPrefix: sessionId.substring(0, 16) },
|
|
67
90
|
});
|
|
68
91
|
logger.warning('Invalid session ID format rejected', context);
|
|
69
92
|
throw invalidParams('Invalid session ID format. Session IDs must be 64 hexadecimal characters.', context);
|
|
70
93
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
// Only set identity fields if they have actual values (not undefined)
|
|
95
|
-
if (identity?.tenantId)
|
|
96
|
-
newSession.tenantId = identity.tenantId;
|
|
97
|
-
if (identity?.clientId)
|
|
98
|
-
newSession.clientId = identity.clientId;
|
|
99
|
-
if (identity?.subject)
|
|
100
|
-
newSession.subject = identity.subject;
|
|
101
|
-
session = newSession;
|
|
102
|
-
this.sessions.set(sessionId, session);
|
|
103
|
-
getSessionMetrics().sessionEventCounter.add(1, { [ATTR_MCP_SESSION_EVENT]: 'created' });
|
|
104
|
-
const context = requestContextService.createRequestContext({
|
|
105
|
-
operation: 'SessionStore.create',
|
|
106
|
-
sessionId,
|
|
107
|
-
tenantId: identity?.tenantId,
|
|
108
|
-
});
|
|
109
|
-
logger.debug('Session created with identity binding', context);
|
|
110
|
-
}
|
|
111
|
-
else {
|
|
112
|
-
session.lastAccessedAt = new Date();
|
|
113
|
-
// Bind identity atomically on first authenticated request after an
|
|
114
|
-
// unauthenticated session creation. All fields are snapshotted together
|
|
115
|
-
// to prevent chimeric identities from per-field races.
|
|
116
|
-
if (identity && !session.identityBound) {
|
|
117
|
-
const hasIdentity = !!(identity.tenantId || identity.clientId || identity.subject);
|
|
118
|
-
if (hasIdentity) {
|
|
119
|
-
if (identity.tenantId)
|
|
120
|
-
session.tenantId = identity.tenantId;
|
|
121
|
-
if (identity.clientId)
|
|
122
|
-
session.clientId = identity.clientId;
|
|
123
|
-
if (identity.subject)
|
|
124
|
-
session.subject = identity.subject;
|
|
125
|
-
session.identityBound = true;
|
|
126
|
-
const context = requestContextService.createRequestContext({
|
|
127
|
-
operation: 'SessionStore.bindIdentity',
|
|
128
|
-
sessionId,
|
|
129
|
-
tenantId: identity.tenantId,
|
|
130
|
-
});
|
|
131
|
-
logger.debug('Session identity bound atomically on authenticated request', context);
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
return session;
|
|
136
|
-
}
|
|
137
|
-
/** Stores capabilities only after the initialize response succeeded. */
|
|
138
|
-
setClientCapabilities(sessionId, capabilities) {
|
|
139
|
-
const session = this.sessions.get(sessionId);
|
|
140
|
-
if (session)
|
|
141
|
-
session.clientCapabilities = capabilities;
|
|
94
|
+
this.assertCapacity();
|
|
95
|
+
// Identity is bound atomically as a snapshot on creation.
|
|
96
|
+
const hasIdentity = !!(identity?.tenantId || identity?.clientId || identity?.subject);
|
|
97
|
+
const now = new Date();
|
|
98
|
+
const session = {
|
|
99
|
+
connection,
|
|
100
|
+
createdAt: now,
|
|
101
|
+
lastAccessedAt: now,
|
|
102
|
+
identityBound: hasIdentity,
|
|
103
|
+
};
|
|
104
|
+
if (identity?.tenantId)
|
|
105
|
+
session.tenantId = identity.tenantId;
|
|
106
|
+
if (identity?.clientId)
|
|
107
|
+
session.clientId = identity.clientId;
|
|
108
|
+
if (identity?.subject)
|
|
109
|
+
session.subject = identity.subject;
|
|
110
|
+
this.sessions.set(sessionId, session);
|
|
111
|
+
getSessionMetrics().sessionEventCounter.add(1, { [ATTR_MCP_SESSION_EVENT]: 'created' });
|
|
112
|
+
logger.debug('Session created with identity binding', requestContextService.createRequestContext({
|
|
113
|
+
operation: 'SessionStore.register',
|
|
114
|
+
parentContext: { sessionId },
|
|
115
|
+
...(identity?.tenantId && { tenantId: identity.tenantId }),
|
|
116
|
+
}));
|
|
142
117
|
}
|
|
143
118
|
/**
|
|
144
|
-
*
|
|
145
|
-
*
|
|
146
|
-
* and cancellation routing.
|
|
119
|
+
* The live connection for a session, touching its access time.
|
|
120
|
+
* Call {@link isValidForIdentity} first — this performs no ownership check.
|
|
147
121
|
*/
|
|
148
|
-
|
|
122
|
+
getConnection(sessionId) {
|
|
149
123
|
const session = this.sessions.get(sessionId);
|
|
150
124
|
if (!session)
|
|
151
125
|
return;
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
registerRequest: (requestId) => this.registerRequest(sessionId, requestId),
|
|
155
|
-
};
|
|
156
|
-
}
|
|
157
|
-
/** Aborts all active handlers with the matching JSON-RPC request ID. */
|
|
158
|
-
cancelRequest(sessionId, requestId, reason) {
|
|
159
|
-
const controllers = this.sessions
|
|
160
|
-
.get(sessionId)
|
|
161
|
-
?.inFlightRequests.get(this.requestKey(requestId));
|
|
162
|
-
if (!controllers || controllers.size === 0)
|
|
163
|
-
return false;
|
|
164
|
-
const abortReason = new DOMException(reason || 'MCP request cancelled', 'AbortError');
|
|
165
|
-
for (const controller of controllers)
|
|
166
|
-
controller.abort(abortReason);
|
|
167
|
-
return true;
|
|
168
|
-
}
|
|
169
|
-
requestKey(requestId) {
|
|
170
|
-
return `${typeof requestId}:${String(requestId)}`;
|
|
171
|
-
}
|
|
172
|
-
registerRequest(sessionId, requestId) {
|
|
173
|
-
const session = this.sessions.get(sessionId);
|
|
174
|
-
const controller = new AbortController();
|
|
175
|
-
if (!session) {
|
|
176
|
-
return { signal: controller.signal, unregister: () => undefined };
|
|
177
|
-
}
|
|
178
|
-
const key = this.requestKey(requestId);
|
|
179
|
-
const controllers = session.inFlightRequests.get(key) ?? new Set();
|
|
180
|
-
controllers.add(controller);
|
|
181
|
-
session.inFlightRequests.set(key, controllers);
|
|
182
|
-
let registered = true;
|
|
183
|
-
return {
|
|
184
|
-
signal: controller.signal,
|
|
185
|
-
unregister: () => {
|
|
186
|
-
if (!registered)
|
|
187
|
-
return;
|
|
188
|
-
registered = false;
|
|
189
|
-
controllers.delete(controller);
|
|
190
|
-
if (controllers.size === 0)
|
|
191
|
-
session.inFlightRequests.delete(key);
|
|
192
|
-
},
|
|
193
|
-
};
|
|
194
|
-
}
|
|
195
|
-
abortSessionRequests(session) {
|
|
196
|
-
const reason = new DOMException('MCP session ended', 'AbortError');
|
|
197
|
-
for (const controllers of session.inFlightRequests.values()) {
|
|
198
|
-
for (const controller of controllers)
|
|
199
|
-
controller.abort(reason);
|
|
200
|
-
}
|
|
201
|
-
session.inFlightRequests.clear();
|
|
126
|
+
session.lastAccessedAt = new Date();
|
|
127
|
+
return session.connection;
|
|
202
128
|
}
|
|
203
129
|
/**
|
|
204
130
|
* Validates a session with identity binding checks.
|
|
@@ -211,6 +137,9 @@ export class SessionStore {
|
|
|
211
137
|
* 4. Client ID match (if session has clientId)
|
|
212
138
|
* 5. Subject match (if session has subject)
|
|
213
139
|
*
|
|
140
|
+
* Binds the identity atomically on the first authenticated request when the
|
|
141
|
+
* session was created unauthenticated.
|
|
142
|
+
*
|
|
214
143
|
* @param sessionId - The session identifier
|
|
215
144
|
* @param identity - The identity to validate against (from auth)
|
|
216
145
|
* @returns True if session is valid and matches identity
|
|
@@ -222,20 +151,40 @@ export class SessionStore {
|
|
|
222
151
|
}
|
|
223
152
|
// Check staleness
|
|
224
153
|
if (Date.now() - session.lastAccessedAt.getTime() > this.staleTimeout) {
|
|
225
|
-
this.terminate(sessionId);
|
|
154
|
+
void this.terminate(sessionId);
|
|
226
155
|
return false;
|
|
227
156
|
}
|
|
228
157
|
// If session has no identity bound, allow (backwards compatibility / no-auth mode)
|
|
229
158
|
if (!session.tenantId && !session.clientId && !session.subject) {
|
|
159
|
+
// Bind atomically on the first authenticated request after an
|
|
160
|
+
// unauthenticated creation. All fields are snapshotted together to
|
|
161
|
+
// prevent chimeric identities from per-field races.
|
|
162
|
+
if (identity && !session.identityBound) {
|
|
163
|
+
const hasIdentity = !!(identity.tenantId || identity.clientId || identity.subject);
|
|
164
|
+
if (hasIdentity) {
|
|
165
|
+
if (identity.tenantId)
|
|
166
|
+
session.tenantId = identity.tenantId;
|
|
167
|
+
if (identity.clientId)
|
|
168
|
+
session.clientId = identity.clientId;
|
|
169
|
+
if (identity.subject)
|
|
170
|
+
session.subject = identity.subject;
|
|
171
|
+
session.identityBound = true;
|
|
172
|
+
logger.debug('Session identity bound atomically on authenticated request', requestContextService.createRequestContext({
|
|
173
|
+
operation: 'SessionStore.bindIdentity',
|
|
174
|
+
parentContext: { sessionId },
|
|
175
|
+
...(identity.tenantId && { tenantId: identity.tenantId }),
|
|
176
|
+
}));
|
|
177
|
+
}
|
|
178
|
+
}
|
|
230
179
|
return true;
|
|
231
180
|
}
|
|
232
181
|
// Lazy-create context only when a warning is likely
|
|
233
182
|
const warn = (message, extra) => {
|
|
234
183
|
const context = requestContextService.createRequestContext({
|
|
235
184
|
operation: 'SessionStore.isValidForIdentity',
|
|
236
|
-
sessionId,
|
|
185
|
+
parentContext: { sessionId },
|
|
237
186
|
});
|
|
238
|
-
logger.warning(message, extra ?
|
|
187
|
+
logger.warning(message, extra ? withExtra(context, extra) : context);
|
|
239
188
|
};
|
|
240
189
|
// If request has no identity but session does, reject (security: session was authenticated)
|
|
241
190
|
if (!identity) {
|
|
@@ -273,51 +222,46 @@ export class SessionStore {
|
|
|
273
222
|
return true;
|
|
274
223
|
}
|
|
275
224
|
/**
|
|
276
|
-
* Terminates a session.
|
|
277
|
-
*
|
|
225
|
+
* Terminates a session and closes its connection.
|
|
226
|
+
* Idempotent — the SDK transport's own DELETE path also calls this via
|
|
227
|
+
* `onsessionclosed`, after the request that triggered it already removed it.
|
|
278
228
|
*/
|
|
279
|
-
terminate(sessionId) {
|
|
229
|
+
async terminate(sessionId) {
|
|
280
230
|
const session = this.sessions.get(sessionId);
|
|
281
|
-
if (session)
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
}
|
|
231
|
+
if (!session)
|
|
232
|
+
return;
|
|
233
|
+
this.sessions.delete(sessionId);
|
|
234
|
+
const metrics = getSessionMetrics();
|
|
235
|
+
metrics.sessionEventCounter.add(1, { [ATTR_MCP_SESSION_EVENT]: 'terminated' });
|
|
236
|
+
metrics.sessionDuration.record((Date.now() - session.createdAt.getTime()) / 1000);
|
|
237
|
+
logger.info('Session terminated', requestContextService.createRequestContext({
|
|
238
|
+
operation: 'SessionStore.terminate',
|
|
239
|
+
parentContext: { sessionId },
|
|
240
|
+
}));
|
|
241
|
+
await closeConnection(session.connection);
|
|
293
242
|
}
|
|
294
|
-
/**
|
|
295
|
-
|
|
296
|
-
*/
|
|
297
|
-
cleanupStaleSessions() {
|
|
243
|
+
/** Cleans up stale sessions that haven't been accessed recently. */
|
|
244
|
+
async cleanupStaleSessions() {
|
|
298
245
|
const now = Date.now();
|
|
299
|
-
|
|
246
|
+
const stale = [];
|
|
300
247
|
const metrics = getSessionMetrics();
|
|
301
248
|
for (const [id, session] of this.sessions.entries()) {
|
|
302
249
|
if (now - session.lastAccessedAt.getTime() > this.staleTimeout) {
|
|
303
|
-
this.abortSessionRequests(session);
|
|
304
250
|
metrics.sessionDuration.record((now - session.createdAt.getTime()) / 1000);
|
|
305
251
|
this.sessions.delete(id);
|
|
306
|
-
|
|
252
|
+
stale.push(session);
|
|
307
253
|
}
|
|
308
254
|
}
|
|
309
|
-
if (
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
});
|
|
320
|
-
}
|
|
255
|
+
if (stale.length === 0)
|
|
256
|
+
return;
|
|
257
|
+
metrics.sessionEventCounter.add(stale.length, {
|
|
258
|
+
[ATTR_MCP_SESSION_EVENT]: 'stale_cleanup',
|
|
259
|
+
});
|
|
260
|
+
logger.debug('Cleaned up stale sessions', requestContextService.createRequestContext({
|
|
261
|
+
operation: 'SessionStore.cleanup',
|
|
262
|
+
additionalContext: { count: stale.length },
|
|
263
|
+
}));
|
|
264
|
+
await Promise.allSettled(stale.map((session) => closeConnection(session.connection)));
|
|
321
265
|
}
|
|
322
266
|
/**
|
|
323
267
|
* Gets the current number of active sessions.
|
|
@@ -327,4 +271,16 @@ export class SessionStore {
|
|
|
327
271
|
return this.sessions.size;
|
|
328
272
|
}
|
|
329
273
|
}
|
|
274
|
+
/** Closes a session's server and transport, tolerating either one throwing. */
|
|
275
|
+
export async function closeConnection(connection) {
|
|
276
|
+
const results = await Promise.allSettled([
|
|
277
|
+
connection.transport.close(),
|
|
278
|
+
connection.server.close(),
|
|
279
|
+
]);
|
|
280
|
+
for (const result of results) {
|
|
281
|
+
if (result.status === 'rejected') {
|
|
282
|
+
logger.warning(`Failed to close a session surface: ${result.reason instanceof Error ? result.reason.message : String(result.reason)}`);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
330
286
|
//# sourceMappingURL=sessionStore.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessionStore.js","sourceRoot":"","sources":["../../../../src/mcp-server/transports/http/sessionStore.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"sessionStore.js","sourceRoot":"","sources":["../../../../src/mcp-server/transports/http/sessionStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +1,28 @@
|
|
|
1
1
|
import type { AppConfig as AppConfigType } from '../../config/index.js';
|
|
2
2
|
import type { ServerManifest } from '../../core/serverManifest.js';
|
|
3
|
-
import type { McpServerFactory } from '../../mcp-server/protocolSession.js';
|
|
4
|
-
import type { TaskManager } from '../../mcp-server/tasks/core/taskManager.js';
|
|
5
3
|
import type { TransportServer } from '../../mcp-server/transports/ITransport.js';
|
|
4
|
+
import type { FrameworkServerFactory } from '../../mcp-server/types.js';
|
|
6
5
|
import type { logger as LoggerType } from '../../utils/internal/logger.js';
|
|
7
6
|
export declare class TransportManager {
|
|
8
7
|
private config;
|
|
9
8
|
private logger;
|
|
10
9
|
private createMcpServer;
|
|
11
|
-
private taskManager;
|
|
12
10
|
private manifest;
|
|
13
11
|
private serverInstance;
|
|
14
12
|
private shutdown;
|
|
15
13
|
private heartbeat;
|
|
16
|
-
constructor(config: AppConfigType, logger: typeof LoggerType, createMcpServer:
|
|
14
|
+
constructor(config: AppConfigType, logger: typeof LoggerType, createMcpServer: FrameworkServerFactory, manifest: ServerManifest);
|
|
17
15
|
start(): Promise<void>;
|
|
16
|
+
/**
|
|
17
|
+
* Periodically pings the client to detect dead connections (orphaned child
|
|
18
|
+
* processes, crashed hosts).
|
|
19
|
+
*
|
|
20
|
+
* Legacy-era connections only: the 2026-07-28 revision removes the
|
|
21
|
+
* server-to-client request channel, so a server-initiated `ping` has nowhere
|
|
22
|
+
* to go there. Guarded against re-entry because the factory also runs for a
|
|
23
|
+
* discarded `server/discover` probe.
|
|
24
|
+
*/
|
|
25
|
+
private startStdioHeartbeat;
|
|
18
26
|
stop(signal: string): Promise<void>;
|
|
19
27
|
getServer(): TransportServer | null;
|
|
20
28
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/mcp-server/transports/manager.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/mcp-server/transports/manager.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAK7E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAIvE,qBAAa,gBAAgB;IAMzB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,eAAe;IACvB,OAAO,CAAC,QAAQ;IARlB,OAAO,CAAC,cAAc,CAAgC;IACtD,OAAO,CAAC,QAAQ,CAA6D;IAC7E,OAAO,CAAC,SAAS,CAAiC;IAElD,YACU,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,OAAO,UAAU,EACzB,eAAe,EAAE,sBAAsB,EACvC,QAAQ,EAAE,cAAc,EAC9B;IAEE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAiC3B;IAED;;;;;;;;OAQG;IACH,OAAO,CAAC,mBAAmB;IAiBrB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAexC;IAED,SAAS,IAAI,eAAe,GAAG,IAAI,CAElC;CACF"}
|
|
@@ -1,8 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview Manages the lifecycle of the configured MCP transport.
|
|
3
|
-
* @module src/mcp-server/transports/manager
|
|
4
|
-
*/
|
|
5
|
-
import { EmptyResultSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
6
1
|
import { HeartbeatMonitor } from '../../mcp-server/transports/heartbeat.js';
|
|
7
2
|
import { startHttpTransport } from '../../mcp-server/transports/http/httpServer.js';
|
|
8
3
|
import { startStdioTransport, stopStdioTransport, } from '../../mcp-server/transports/stdio/stdioTransport.js';
|
|
@@ -11,54 +6,41 @@ export class TransportManager {
|
|
|
11
6
|
config;
|
|
12
7
|
logger;
|
|
13
8
|
createMcpServer;
|
|
14
|
-
taskManager;
|
|
15
9
|
manifest;
|
|
16
10
|
serverInstance = null;
|
|
17
11
|
shutdown = null;
|
|
18
12
|
heartbeat = null;
|
|
19
|
-
constructor(config, logger, createMcpServer,
|
|
13
|
+
constructor(config, logger, createMcpServer, manifest) {
|
|
20
14
|
this.config = config;
|
|
21
15
|
this.logger = logger;
|
|
22
16
|
this.createMcpServer = createMcpServer;
|
|
23
|
-
this.taskManager = taskManager;
|
|
24
17
|
this.manifest = manifest;
|
|
25
18
|
}
|
|
26
19
|
async start() {
|
|
27
20
|
const context = requestContextService.createRequestContext({
|
|
28
21
|
operation: 'TransportManager.start',
|
|
29
|
-
transport: this.config.mcpTransportType,
|
|
22
|
+
additionalContext: { transport: this.config.mcpTransportType },
|
|
30
23
|
});
|
|
31
24
|
this.logger.info(`Starting transport: ${this.config.mcpTransportType}`, context);
|
|
32
25
|
if (this.config.mcpTransportType === 'http') {
|
|
33
|
-
// HTTP: pass factory so each request gets a fresh McpServer+transport pair
|
|
34
|
-
// (SDK 1.26.0 security fix — GHSA-345p-7cg4-v4c7)
|
|
35
26
|
const handle = await startHttpTransport(this.createMcpServer, context, this.manifest);
|
|
36
27
|
this.serverInstance = handle.server;
|
|
37
28
|
this.shutdown = (ctx) => handle.stop(ctx);
|
|
38
29
|
}
|
|
39
30
|
else if (this.config.mcpTransportType === 'stdio') {
|
|
40
|
-
//
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
missThreshold: this.config.mcpHeartbeatMissThreshold,
|
|
50
|
-
sendPing: () => mcpServer.server.request({ method: 'ping' }, EmptyResultSchema, {
|
|
51
|
-
timeout: timeoutMs,
|
|
52
|
-
}),
|
|
53
|
-
onDead: () => void this.stop('heartbeat_timeout'),
|
|
54
|
-
transport: 'stdio',
|
|
55
|
-
}, context);
|
|
56
|
-
this.heartbeat.start();
|
|
57
|
-
}
|
|
31
|
+
// `serveStdio` owns the era decision and pins one instance for the
|
|
32
|
+
// connection, so the factory is where the pinned server becomes visible.
|
|
33
|
+
const handle = startStdioTransport(async (requestContext) => {
|
|
34
|
+
const mcpServer = await this.createMcpServer(requestContext);
|
|
35
|
+
if (requestContext.era === 'legacy')
|
|
36
|
+
this.startStdioHeartbeat(mcpServer, context);
|
|
37
|
+
return mcpServer;
|
|
38
|
+
}, context);
|
|
39
|
+
this.serverInstance = handle;
|
|
58
40
|
this.shutdown = async (ctx) => {
|
|
59
41
|
this.heartbeat?.stop();
|
|
60
42
|
this.heartbeat = null;
|
|
61
|
-
await stopStdioTransport(
|
|
43
|
+
await stopStdioTransport(handle, ctx);
|
|
62
44
|
};
|
|
63
45
|
}
|
|
64
46
|
else {
|
|
@@ -68,18 +50,38 @@ export class TransportManager {
|
|
|
68
50
|
throw error;
|
|
69
51
|
}
|
|
70
52
|
}
|
|
53
|
+
/**
|
|
54
|
+
* Periodically pings the client to detect dead connections (orphaned child
|
|
55
|
+
* processes, crashed hosts).
|
|
56
|
+
*
|
|
57
|
+
* Legacy-era connections only: the 2026-07-28 revision removes the
|
|
58
|
+
* server-to-client request channel, so a server-initiated `ping` has nowhere
|
|
59
|
+
* to go there. Guarded against re-entry because the factory also runs for a
|
|
60
|
+
* discarded `server/discover` probe.
|
|
61
|
+
*/
|
|
62
|
+
startStdioHeartbeat(mcpServer, context) {
|
|
63
|
+
if (this.heartbeat || this.config.mcpHeartbeatIntervalMs <= 0)
|
|
64
|
+
return;
|
|
65
|
+
const timeoutMs = Math.min(this.config.mcpHeartbeatIntervalMs, 10_000);
|
|
66
|
+
this.heartbeat = new HeartbeatMonitor({
|
|
67
|
+
intervalMs: this.config.mcpHeartbeatIntervalMs,
|
|
68
|
+
missThreshold: this.config.mcpHeartbeatMissThreshold,
|
|
69
|
+
sendPing: () => mcpServer.server.request({ method: 'ping' }, { timeout: timeoutMs }),
|
|
70
|
+
onDead: () => void this.stop('heartbeat_timeout'),
|
|
71
|
+
transport: 'stdio',
|
|
72
|
+
}, context);
|
|
73
|
+
this.heartbeat.start();
|
|
74
|
+
}
|
|
71
75
|
async stop(signal) {
|
|
72
76
|
const context = requestContextService.createRequestContext({
|
|
73
77
|
operation: 'TransportManager.stop',
|
|
74
|
-
signal,
|
|
78
|
+
additionalContext: { signal },
|
|
75
79
|
});
|
|
76
80
|
if (!this.shutdown) {
|
|
77
81
|
this.logger.warning('Stop called but no active server instance found.', context);
|
|
78
82
|
return;
|
|
79
83
|
}
|
|
80
84
|
await this.shutdown(context);
|
|
81
|
-
// Clean up task manager timers to allow clean process exit
|
|
82
|
-
this.taskManager.cleanup();
|
|
83
85
|
this.serverInstance = null;
|
|
84
86
|
this.shutdown = null;
|
|
85
87
|
}
|