@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.
Files changed (366) hide show
  1. package/AGENTS.md +28 -24
  2. package/CLAUDE.md +28 -24
  3. package/README.md +10 -10
  4. package/biome.json +1 -1
  5. package/changelog/0.11.x/0.11.5.md +28 -0
  6. package/changelog/0.12.x/0.12.0.md +96 -0
  7. package/changelog/template.md +55 -16
  8. package/dist/cli/init.js +1 -1
  9. package/dist/cli/init.js.map +1 -1
  10. package/dist/config/index.d.ts +0 -18
  11. package/dist/config/index.d.ts.map +1 -1
  12. package/dist/config/index.js +0 -25
  13. package/dist/config/index.js.map +1 -1
  14. package/dist/core/app.d.ts +5 -7
  15. package/dist/core/app.d.ts.map +1 -1
  16. package/dist/core/app.js +18 -27
  17. package/dist/core/app.js.map +1 -1
  18. package/dist/core/context.d.ts +90 -57
  19. package/dist/core/context.d.ts.map +1 -1
  20. package/dist/core/context.js +32 -33
  21. package/dist/core/context.js.map +1 -1
  22. package/dist/core/gcPressure.d.ts.map +1 -1
  23. package/dist/core/gcPressure.js +3 -4
  24. package/dist/core/gcPressure.js.map +1 -1
  25. package/dist/core/index.d.ts +6 -7
  26. package/dist/core/index.d.ts.map +1 -1
  27. package/dist/core/index.js +10 -2
  28. package/dist/core/index.js.map +1 -1
  29. package/dist/core/serverManifest.d.ts +1 -3
  30. package/dist/core/serverManifest.d.ts.map +1 -1
  31. package/dist/core/serverManifest.js +9 -4
  32. package/dist/core/serverManifest.js.map +1 -1
  33. package/dist/core/worker.d.ts.map +1 -1
  34. package/dist/core/worker.js +32 -35
  35. package/dist/core/worker.js.map +1 -1
  36. package/dist/logs/combined.log +10 -0
  37. package/dist/logs/error.log +6 -0
  38. package/dist/logs/interactions.log +0 -0
  39. package/dist/mcp-server/inputRequired.d.ts +52 -0
  40. package/dist/mcp-server/inputRequired.d.ts.map +1 -0
  41. package/dist/mcp-server/inputRequired.js +76 -0
  42. package/dist/mcp-server/inputRequired.js.map +1 -0
  43. package/dist/mcp-server/notifications.d.ts +33 -31
  44. package/dist/mcp-server/notifications.d.ts.map +1 -1
  45. package/dist/mcp-server/notifications.js +34 -26
  46. package/dist/mcp-server/notifications.js.map +1 -1
  47. package/dist/mcp-server/prompts/prompt-registration.d.ts +2 -2
  48. package/dist/mcp-server/prompts/prompt-registration.d.ts.map +1 -1
  49. package/dist/mcp-server/prompts/prompt-registration.js +15 -5
  50. package/dist/mcp-server/prompts/prompt-registration.js.map +1 -1
  51. package/dist/mcp-server/prompts/utils/promptDefinition.d.ts +1 -1
  52. package/dist/mcp-server/prompts/utils/promptDefinition.d.ts.map +1 -1
  53. package/dist/mcp-server/resources/resource-registration.d.ts +3 -3
  54. package/dist/mcp-server/resources/resource-registration.d.ts.map +1 -1
  55. package/dist/mcp-server/resources/resource-registration.js +8 -15
  56. package/dist/mcp-server/resources/resource-registration.js.map +1 -1
  57. package/dist/mcp-server/resources/resourceSubscriptions.d.ts +45 -0
  58. package/dist/mcp-server/resources/resourceSubscriptions.d.ts.map +1 -0
  59. package/dist/mcp-server/resources/resourceSubscriptions.js +51 -0
  60. package/dist/mcp-server/resources/resourceSubscriptions.js.map +1 -0
  61. package/dist/mcp-server/resources/utils/resourceDefinition.d.ts +3 -5
  62. package/dist/mcp-server/resources/utils/resourceDefinition.d.ts.map +1 -1
  63. package/dist/mcp-server/resources/utils/resourceDefinition.js +1 -1
  64. package/dist/mcp-server/resources/utils/resourceDefinition.js.map +1 -1
  65. package/dist/mcp-server/resources/utils/resourceHandlerFactory.d.ts +8 -15
  66. package/dist/mcp-server/resources/utils/resourceHandlerFactory.d.ts.map +1 -1
  67. package/dist/mcp-server/resources/utils/resourceHandlerFactory.js +21 -22
  68. package/dist/mcp-server/resources/utils/resourceHandlerFactory.js.map +1 -1
  69. package/dist/mcp-server/server.d.ts +12 -21
  70. package/dist/mcp-server/server.d.ts.map +1 -1
  71. package/dist/mcp-server/server.js +38 -28
  72. package/dist/mcp-server/server.js.map +1 -1
  73. package/dist/mcp-server/tools/tool-registration.d.ts +11 -33
  74. package/dist/mcp-server/tools/tool-registration.d.ts.map +1 -1
  75. package/dist/mcp-server/tools/tool-registration.js +17 -243
  76. package/dist/mcp-server/tools/tool-registration.js.map +1 -1
  77. package/dist/mcp-server/tools/utils/toolDefinition.d.ts +1 -3
  78. package/dist/mcp-server/tools/utils/toolDefinition.d.ts.map +1 -1
  79. package/dist/mcp-server/tools/utils/toolDefinition.js +48 -1
  80. package/dist/mcp-server/tools/utils/toolDefinition.js.map +1 -1
  81. package/dist/mcp-server/tools/utils/toolHandlerFactory.d.ts +46 -20
  82. package/dist/mcp-server/tools/utils/toolHandlerFactory.d.ts.map +1 -1
  83. package/dist/mcp-server/tools/utils/toolHandlerFactory.js +131 -25
  84. package/dist/mcp-server/tools/utils/toolHandlerFactory.js.map +1 -1
  85. package/dist/mcp-server/transports/ITransport.d.ts +2 -2
  86. package/dist/mcp-server/transports/ITransport.d.ts.map +1 -1
  87. package/dist/mcp-server/transports/auth/authFactory.js +1 -1
  88. package/dist/mcp-server/transports/auth/authFactory.js.map +1 -1
  89. package/dist/mcp-server/transports/auth/lib/authTypes.d.ts +1 -1
  90. package/dist/mcp-server/transports/auth/lib/authTypes.d.ts.map +1 -1
  91. package/dist/mcp-server/transports/auth/lib/authUtils.d.ts.map +1 -1
  92. package/dist/mcp-server/transports/auth/lib/authUtils.js +5 -13
  93. package/dist/mcp-server/transports/auth/lib/authUtils.js.map +1 -1
  94. package/dist/mcp-server/transports/auth/strategies/jwtStrategy.js +5 -11
  95. package/dist/mcp-server/transports/auth/strategies/jwtStrategy.js.map +1 -1
  96. package/dist/mcp-server/transports/auth/strategies/oauthStrategy.d.ts.map +1 -1
  97. package/dist/mcp-server/transports/auth/strategies/oauthStrategy.js +9 -22
  98. package/dist/mcp-server/transports/auth/strategies/oauthStrategy.js.map +1 -1
  99. package/dist/mcp-server/transports/heartbeat.d.ts.map +1 -1
  100. package/dist/mcp-server/transports/heartbeat.js +4 -8
  101. package/dist/mcp-server/transports/heartbeat.js.map +1 -1
  102. package/dist/mcp-server/transports/http/httpErrorHandler.d.ts.map +1 -1
  103. package/dist/mcp-server/transports/http/httpErrorHandler.js +6 -24
  104. package/dist/mcp-server/transports/http/httpErrorHandler.js.map +1 -1
  105. package/dist/mcp-server/transports/http/httpServer.d.ts +3 -3
  106. package/dist/mcp-server/transports/http/httpServer.d.ts.map +1 -1
  107. package/dist/mcp-server/transports/http/httpServer.js +15 -32
  108. package/dist/mcp-server/transports/http/httpServer.js.map +1 -1
  109. package/dist/mcp-server/transports/http/httpTransport.d.ts +25 -8
  110. package/dist/mcp-server/transports/http/httpTransport.d.ts.map +1 -1
  111. package/dist/mcp-server/transports/http/httpTransport.js +156 -310
  112. package/dist/mcp-server/transports/http/httpTransport.js.map +1 -1
  113. package/dist/mcp-server/transports/http/landing-page/assets/styles.d.ts.map +1 -1
  114. package/dist/mcp-server/transports/http/landing-page/assets/styles.js +0 -1
  115. package/dist/mcp-server/transports/http/landing-page/assets/styles.js.map +1 -1
  116. package/dist/mcp-server/transports/http/landing-page/handler.d.ts.map +1 -1
  117. package/dist/mcp-server/transports/http/landing-page/handler.js +4 -8
  118. package/dist/mcp-server/transports/http/landing-page/handler.js.map +1 -1
  119. package/dist/mcp-server/transports/http/landing-page/sections/tools.js +0 -2
  120. package/dist/mcp-server/transports/http/landing-page/sections/tools.js.map +1 -1
  121. package/dist/mcp-server/transports/http/protectedResourceMetadata.d.ts.map +1 -1
  122. package/dist/mcp-server/transports/http/protectedResourceMetadata.js +2 -6
  123. package/dist/mcp-server/transports/http/protectedResourceMetadata.js.map +1 -1
  124. package/dist/mcp-server/transports/http/robotsTxt.js +2 -2
  125. package/dist/mcp-server/transports/http/robotsTxt.js.map +1 -1
  126. package/dist/mcp-server/transports/http/serverCard.d.ts.map +1 -1
  127. package/dist/mcp-server/transports/http/serverCard.js +2 -6
  128. package/dist/mcp-server/transports/http/serverCard.js.map +1 -1
  129. package/dist/mcp-server/transports/http/sessionStore.d.ts +48 -45
  130. package/dist/mcp-server/transports/http/sessionStore.d.ts.map +1 -1
  131. package/dist/mcp-server/transports/http/sessionStore.js +141 -185
  132. package/dist/mcp-server/transports/http/sessionStore.js.map +1 -1
  133. package/dist/mcp-server/transports/manager.d.ts +12 -4
  134. package/dist/mcp-server/transports/manager.d.ts.map +1 -1
  135. package/dist/mcp-server/transports/manager.js +35 -33
  136. package/dist/mcp-server/transports/manager.js.map +1 -1
  137. package/dist/mcp-server/transports/stdio/stdioTransport.d.ts +24 -31
  138. package/dist/mcp-server/transports/stdio/stdioTransport.d.ts.map +1 -1
  139. package/dist/mcp-server/transports/stdio/stdioTransport.js +23 -38
  140. package/dist/mcp-server/transports/stdio/stdioTransport.js.map +1 -1
  141. package/dist/mcp-server/types.d.ts +25 -0
  142. package/dist/mcp-server/types.d.ts.map +1 -0
  143. package/dist/mcp-server/types.js +10 -0
  144. package/dist/mcp-server/types.js.map +1 -0
  145. package/dist/services/canvas/core/CanvasInstance.d.ts +2 -2
  146. package/dist/services/canvas/core/CanvasInstance.d.ts.map +1 -1
  147. package/dist/services/canvas/core/CanvasInstance.js.map +1 -1
  148. package/dist/services/canvas/core/CanvasRegistry.d.ts +4 -4
  149. package/dist/services/canvas/core/CanvasRegistry.d.ts.map +1 -1
  150. package/dist/services/canvas/core/CanvasRegistry.js +8 -18
  151. package/dist/services/canvas/core/CanvasRegistry.js.map +1 -1
  152. package/dist/services/canvas/core/DataCanvas.d.ts +5 -5
  153. package/dist/services/canvas/core/DataCanvas.d.ts.map +1 -1
  154. package/dist/services/canvas/core/DataCanvas.js +2 -3
  155. package/dist/services/canvas/core/DataCanvas.js.map +1 -1
  156. package/dist/services/canvas/core/IDataCanvasProvider.d.ts +11 -11
  157. package/dist/services/canvas/core/IDataCanvasProvider.d.ts.map +1 -1
  158. package/dist/services/canvas/providers/duckdb/DuckdbProvider.d.ts +11 -11
  159. package/dist/services/canvas/providers/duckdb/DuckdbProvider.d.ts.map +1 -1
  160. package/dist/services/canvas/providers/duckdb/DuckdbProvider.js +4 -10
  161. package/dist/services/canvas/providers/duckdb/DuckdbProvider.js.map +1 -1
  162. package/dist/services/llm/providers/openrouter.provider.d.ts.map +1 -1
  163. package/dist/services/llm/providers/openrouter.provider.js +2 -5
  164. package/dist/services/llm/providers/openrouter.provider.js.map +1 -1
  165. package/dist/services/mirror/core/defineMirror.js +1 -1
  166. package/dist/services/mirror/core/defineMirror.js.map +1 -1
  167. package/dist/services/mirror/types.d.ts +5 -5
  168. package/dist/services/mirror/types.d.ts.map +1 -1
  169. package/dist/services/speech/providers/elevenlabs.provider.js +1 -1
  170. package/dist/services/speech/providers/elevenlabs.provider.js.map +1 -1
  171. package/dist/services/speech/providers/whisper.provider.js +1 -1
  172. package/dist/services/speech/providers/whisper.provider.js.map +1 -1
  173. package/dist/storage/core/StorageService.d.ts +1 -1
  174. package/dist/storage/core/StorageService.d.ts.map +1 -1
  175. package/dist/storage/core/StorageService.js +12 -20
  176. package/dist/storage/core/StorageService.js.map +1 -1
  177. package/dist/storage/core/storageFactory.d.ts.map +1 -1
  178. package/dist/storage/core/storageFactory.js.map +1 -1
  179. package/dist/storage/core/storageValidation.d.ts +1 -1
  180. package/dist/storage/core/storageValidation.d.ts.map +1 -1
  181. package/dist/storage/core/storageValidation.js +2 -2
  182. package/dist/storage/core/storageValidation.js.map +1 -1
  183. package/dist/storage/providers/cloudflare/d1Provider.d.ts +1 -1
  184. package/dist/storage/providers/cloudflare/d1Provider.d.ts.map +1 -1
  185. package/dist/storage/providers/cloudflare/d1Provider.js +4 -12
  186. package/dist/storage/providers/cloudflare/d1Provider.js.map +1 -1
  187. package/dist/storage/providers/cloudflare/kvProvider.d.ts +1 -1
  188. package/dist/storage/providers/cloudflare/kvProvider.d.ts.map +1 -1
  189. package/dist/storage/providers/cloudflare/kvProvider.js +3 -8
  190. package/dist/storage/providers/cloudflare/kvProvider.js.map +1 -1
  191. package/dist/storage/providers/cloudflare/r2Provider.d.ts +1 -1
  192. package/dist/storage/providers/cloudflare/r2Provider.d.ts.map +1 -1
  193. package/dist/storage/providers/cloudflare/r2Provider.js +3 -8
  194. package/dist/storage/providers/cloudflare/r2Provider.js.map +1 -1
  195. package/dist/storage/providers/inMemory/inMemoryProvider.d.ts +1 -1
  196. package/dist/storage/providers/inMemory/inMemoryProvider.d.ts.map +1 -1
  197. package/dist/storage/providers/inMemory/inMemoryProvider.js +2 -4
  198. package/dist/storage/providers/inMemory/inMemoryProvider.js.map +1 -1
  199. package/dist/testing/index.d.ts +35 -12
  200. package/dist/testing/index.d.ts.map +1 -1
  201. package/dist/testing/index.js +53 -38
  202. package/dist/testing/index.js.map +1 -1
  203. package/dist/testing/vitest.d.ts +1 -1
  204. package/dist/testing/vitest.d.ts.map +1 -1
  205. package/dist/types-global/errors.d.ts +28 -15
  206. package/dist/types-global/errors.d.ts.map +1 -1
  207. package/dist/types-global/errors.js +8 -1
  208. package/dist/types-global/errors.js.map +1 -1
  209. package/dist/utils/formatting/diffFormatter.d.ts +5 -5
  210. package/dist/utils/formatting/diffFormatter.d.ts.map +1 -1
  211. package/dist/utils/formatting/diffFormatter.js +7 -20
  212. package/dist/utils/formatting/diffFormatter.js.map +1 -1
  213. package/dist/utils/formatting/tableFormatter.d.ts +3 -3
  214. package/dist/utils/formatting/tableFormatter.d.ts.map +1 -1
  215. package/dist/utils/formatting/tableFormatter.js +6 -17
  216. package/dist/utils/formatting/tableFormatter.js.map +1 -1
  217. package/dist/utils/formatting/treeFormatter.d.ts +3 -3
  218. package/dist/utils/formatting/treeFormatter.d.ts.map +1 -1
  219. package/dist/utils/formatting/treeFormatter.js +5 -18
  220. package/dist/utils/formatting/treeFormatter.js.map +1 -1
  221. package/dist/utils/index.d.ts +4 -2
  222. package/dist/utils/index.d.ts.map +1 -1
  223. package/dist/utils/index.js +2 -2
  224. package/dist/utils/index.js.map +1 -1
  225. package/dist/utils/internal/error-handler/errorHandler.d.ts +1 -1
  226. package/dist/utils/internal/error-handler/errorHandler.d.ts.map +1 -1
  227. package/dist/utils/internal/error-handler/errorHandler.js +23 -11
  228. package/dist/utils/internal/error-handler/errorHandler.js.map +1 -1
  229. package/dist/utils/internal/error-handler/types.d.ts +10 -13
  230. package/dist/utils/internal/error-handler/types.d.ts.map +1 -1
  231. package/dist/utils/internal/logger.d.ts +3 -3
  232. package/dist/utils/internal/logger.d.ts.map +1 -1
  233. package/dist/utils/internal/logger.js +11 -5
  234. package/dist/utils/internal/logger.js.map +1 -1
  235. package/dist/utils/internal/performance.d.ts +1 -1
  236. package/dist/utils/internal/performance.d.ts.map +1 -1
  237. package/dist/utils/internal/performance.js +57 -13
  238. package/dist/utils/internal/performance.js.map +1 -1
  239. package/dist/utils/internal/requestContext.d.ts +79 -55
  240. package/dist/utils/internal/requestContext.d.ts.map +1 -1
  241. package/dist/utils/internal/requestContext.js +77 -32
  242. package/dist/utils/internal/requestContext.js.map +1 -1
  243. package/dist/utils/metrics/tokenCounter.d.ts +3 -3
  244. package/dist/utils/metrics/tokenCounter.d.ts.map +1 -1
  245. package/dist/utils/metrics/tokenCounter.js.map +1 -1
  246. package/dist/utils/network/fetchWithTimeout.d.ts +2 -2
  247. package/dist/utils/network/fetchWithTimeout.d.ts.map +1 -1
  248. package/dist/utils/network/fetchWithTimeout.js +8 -24
  249. package/dist/utils/network/fetchWithTimeout.js.map +1 -1
  250. package/dist/utils/network/retry.d.ts +2 -2
  251. package/dist/utils/network/retry.d.ts.map +1 -1
  252. package/dist/utils/overflow/outlineOnOverflow.d.ts +1 -1
  253. package/dist/utils/overflow/outlineOnOverflow.d.ts.map +1 -1
  254. package/dist/utils/pagination/pagination.d.ts +3 -3
  255. package/dist/utils/pagination/pagination.d.ts.map +1 -1
  256. package/dist/utils/pagination/pagination.js +3 -3
  257. package/dist/utils/pagination/pagination.js.map +1 -1
  258. package/dist/utils/parsing/csvParser.d.ts +2 -2
  259. package/dist/utils/parsing/csvParser.d.ts.map +1 -1
  260. package/dist/utils/parsing/csvParser.js +4 -8
  261. package/dist/utils/parsing/csvParser.js.map +1 -1
  262. package/dist/utils/parsing/dateParser.d.ts +3 -3
  263. package/dist/utils/parsing/dateParser.d.ts.map +1 -1
  264. package/dist/utils/parsing/dateParser.js +3 -2
  265. package/dist/utils/parsing/dateParser.js.map +1 -1
  266. package/dist/utils/parsing/frontmatterParser.d.ts +2 -2
  267. package/dist/utils/parsing/frontmatterParser.d.ts.map +1 -1
  268. package/dist/utils/parsing/frontmatterParser.js +7 -10
  269. package/dist/utils/parsing/frontmatterParser.js.map +1 -1
  270. package/dist/utils/parsing/htmlExtractor.d.ts +2 -2
  271. package/dist/utils/parsing/htmlExtractor.d.ts.map +1 -1
  272. package/dist/utils/parsing/htmlExtractor.js +6 -11
  273. package/dist/utils/parsing/htmlExtractor.js.map +1 -1
  274. package/dist/utils/parsing/jsonParser.d.ts +2 -2
  275. package/dist/utils/parsing/jsonParser.d.ts.map +1 -1
  276. package/dist/utils/parsing/jsonParser.js +4 -8
  277. package/dist/utils/parsing/jsonParser.js.map +1 -1
  278. package/dist/utils/parsing/pdfParser.d.ts +10 -10
  279. package/dist/utils/parsing/pdfParser.d.ts.map +1 -1
  280. package/dist/utils/parsing/pdfParser.js +26 -89
  281. package/dist/utils/parsing/pdfParser.js.map +1 -1
  282. package/dist/utils/parsing/xmlParser.d.ts +2 -2
  283. package/dist/utils/parsing/xmlParser.d.ts.map +1 -1
  284. package/dist/utils/parsing/xmlParser.js +4 -8
  285. package/dist/utils/parsing/xmlParser.js.map +1 -1
  286. package/dist/utils/parsing/yamlParser.d.ts +2 -2
  287. package/dist/utils/parsing/yamlParser.d.ts.map +1 -1
  288. package/dist/utils/parsing/yamlParser.js +4 -8
  289. package/dist/utils/parsing/yamlParser.js.map +1 -1
  290. package/dist/utils/scheduling/scheduler.d.ts.map +1 -1
  291. package/dist/utils/scheduling/scheduler.js +5 -6
  292. package/dist/utils/scheduling/scheduler.js.map +1 -1
  293. package/dist/utils/security/rateLimiter.d.ts +2 -2
  294. package/dist/utils/security/rateLimiter.d.ts.map +1 -1
  295. package/dist/utils/security/rateLimiter.js +1 -1
  296. package/dist/utils/security/rateLimiter.js.map +1 -1
  297. package/dist/utils/telemetry/attributes.d.ts +23 -7
  298. package/dist/utils/telemetry/attributes.d.ts.map +1 -1
  299. package/dist/utils/telemetry/attributes.js +23 -10
  300. package/dist/utils/telemetry/attributes.js.map +1 -1
  301. package/dist/utils/telemetry/trace.d.ts +3 -3
  302. package/dist/utils/telemetry/trace.d.ts.map +1 -1
  303. package/dist/utils/telemetry/trace.js +4 -2
  304. package/dist/utils/telemetry/trace.js.map +1 -1
  305. package/package.json +22 -26
  306. package/scripts/lint-mcp.ts +1 -3
  307. package/scripts/lint-packaging.ts +1 -1
  308. package/skills/add-service/SKILL.md +2 -2
  309. package/skills/add-test/SKILL.md +42 -20
  310. package/skills/add-tool/SKILL.md +68 -19
  311. package/skills/api-canvas/SKILL.md +2 -2
  312. package/skills/api-config/SKILL.md +1 -11
  313. package/skills/api-context/SKILL.md +175 -111
  314. package/skills/api-linter/SKILL.md +2 -2
  315. package/skills/api-telemetry/SKILL.md +8 -12
  316. package/skills/api-testing/SKILL.md +53 -52
  317. package/skills/code-simplifier/SKILL.md +2 -2
  318. package/skills/design-mcp-server/SKILL.md +34 -18
  319. package/skills/field-test/SKILL.md +4 -2
  320. package/skills/git-wrapup/SKILL.md +3 -3
  321. package/skills/polish-docs-meta/SKILL.md +1 -1
  322. package/skills/polish-docs-meta/references/agent-protocol.md +2 -2
  323. package/skills/polish-docs-meta/references/readme.md +1 -1
  324. package/skills/release-and-publish/SKILL.md +3 -1
  325. package/skills/report-issue-framework/SKILL.md +2 -2
  326. package/skills/report-issue-local/SKILL.md +2 -2
  327. package/skills/security-pass/SKILL.md +16 -14
  328. package/templates/.github/CODE_OF_CONDUCT.md +28 -0
  329. package/templates/.github/CONTRIBUTING.md +50 -0
  330. package/templates/.github/SECURITY.md +24 -0
  331. package/templates/AGENTS.md +6 -6
  332. package/templates/CLAUDE.md +6 -6
  333. package/templates/changelog/template.md +55 -16
  334. package/templates/tests/resources/echo.resource.test.ts +16 -9
  335. package/dist/mcp-server/elicitation.d.ts +0 -64
  336. package/dist/mcp-server/elicitation.d.ts.map +0 -1
  337. package/dist/mcp-server/elicitation.js +0 -81
  338. package/dist/mcp-server/elicitation.js.map +0 -1
  339. package/dist/mcp-server/protocolSession.d.ts +0 -34
  340. package/dist/mcp-server/protocolSession.d.ts.map +0 -1
  341. package/dist/mcp-server/protocolSession.js +0 -13
  342. package/dist/mcp-server/protocolSession.js.map +0 -1
  343. package/dist/mcp-server/tasks/core/evictingTaskMessageQueue.d.ts +0 -53
  344. package/dist/mcp-server/tasks/core/evictingTaskMessageQueue.d.ts.map +0 -1
  345. package/dist/mcp-server/tasks/core/evictingTaskMessageQueue.js +0 -65
  346. package/dist/mcp-server/tasks/core/evictingTaskMessageQueue.js.map +0 -1
  347. package/dist/mcp-server/tasks/core/sessionAwareTaskStore.d.ts +0 -70
  348. package/dist/mcp-server/tasks/core/sessionAwareTaskStore.d.ts.map +0 -1
  349. package/dist/mcp-server/tasks/core/sessionAwareTaskStore.js +0 -130
  350. package/dist/mcp-server/tasks/core/sessionAwareTaskStore.js.map +0 -1
  351. package/dist/mcp-server/tasks/core/storageBackedTaskStore.d.ts +0 -109
  352. package/dist/mcp-server/tasks/core/storageBackedTaskStore.d.ts.map +0 -1
  353. package/dist/mcp-server/tasks/core/storageBackedTaskStore.js +0 -209
  354. package/dist/mcp-server/tasks/core/storageBackedTaskStore.js.map +0 -1
  355. package/dist/mcp-server/tasks/core/taskManager.d.ts +0 -91
  356. package/dist/mcp-server/tasks/core/taskManager.d.ts.map +0 -1
  357. package/dist/mcp-server/tasks/core/taskManager.js +0 -210
  358. package/dist/mcp-server/tasks/core/taskManager.js.map +0 -1
  359. package/dist/mcp-server/tasks/core/taskTypes.d.ts +0 -18
  360. package/dist/mcp-server/tasks/core/taskTypes.d.ts.map +0 -1
  361. package/dist/mcp-server/tasks/core/taskTypes.js +0 -20
  362. package/dist/mcp-server/tasks/core/taskTypes.js.map +0 -1
  363. package/dist/mcp-server/tasks/utils/taskToolDefinition.d.ts +0 -101
  364. package/dist/mcp-server/tasks/utils/taskToolDefinition.d.ts.map +0 -1
  365. package/dist/mcp-server/tasks/utils/taskToolDefinition.js +0 -14
  366. package/dist/mcp-server/tasks/utils/taskToolDefinition.js.map +0 -1
@@ -1,13 +1,23 @@
1
1
  /**
2
- * @fileoverview Simple in-memory session store for MCP HTTP transport.
3
- * Implements session management as per MCP Spec 2025-06-18.
4
- * @see {@link https://modelcontextprotocol.io/specification/2025-06-18/basic/transports#session-management | MCP Session Management}
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 clears all sessions.
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
- for (const session of this.sessions.values())
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
- * Creates or retrieves a session with optional identity binding.
54
- * If identity is provided, binds the session to prevent cross-tenant/client hijacking.
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
- * @param sessionId - The session identifier
57
- * @param identity - Optional identity info (tenantId, clientId, subject)
58
- * @returns The session object
59
- * @throws {McpError} If session ID format is invalid
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
- getOrCreate(sessionId, identity) {
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.getOrCreate',
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
- let session = this.sessions.get(sessionId);
72
- if (!session) {
73
- // Enforce maximum session capacity to prevent unbounded memory growth
74
- if (this.sessions.size >= this.maxSessions) {
75
- const context = requestContextService.createRequestContext({
76
- operation: 'SessionStore.getOrCreate',
77
- currentSessions: this.sessions.size,
78
- maxSessions: this.maxSessions,
79
- });
80
- logger.warning('Session capacity reached, rejecting new session', context);
81
- throw serviceUnavailable(`Maximum session capacity reached (${this.maxSessions}). Try again later.`, context);
82
- }
83
- // Build session object conditionally to satisfy exactOptionalPropertyTypes.
84
- // Identity is bound atomically as a snapshot on creation.
85
- const hasIdentity = !!(identity?.tenantId || identity?.clientId || identity?.subject);
86
- const now = new Date();
87
- const newSession = {
88
- id: sessionId,
89
- createdAt: now,
90
- lastAccessedAt: now,
91
- identityBound: hasIdentity,
92
- inFlightRequests: new Map(),
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
- * Builds the minimal state hooks restored onto the next per-request server.
145
- * The session ID remains the isolation boundary for both capability state
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
- createProtocolSessionHooks(sessionId) {
122
+ getConnection(sessionId) {
149
123
  const session = this.sessions.get(sessionId);
150
124
  if (!session)
151
125
  return;
152
- return {
153
- ...(session.clientCapabilities && { clientCapabilities: session.clientCapabilities }),
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 ? { ...context, ...extra } : context);
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
- * @param sessionId - The session identifier
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
- this.abortSessionRequests(session);
283
- this.sessions.delete(sessionId);
284
- const metrics = getSessionMetrics();
285
- metrics.sessionEventCounter.add(1, { [ATTR_MCP_SESSION_EVENT]: 'terminated' });
286
- metrics.sessionDuration.record((Date.now() - session.createdAt.getTime()) / 1000);
287
- const context = requestContextService.createRequestContext({
288
- operation: 'SessionStore.terminate',
289
- sessionId,
290
- });
291
- logger.info('Session terminated', context);
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
- * Cleans up stale sessions that haven't been accessed recently.
296
- */
297
- cleanupStaleSessions() {
243
+ /** Cleans up stale sessions that haven't been accessed recently. */
244
+ async cleanupStaleSessions() {
298
245
  const now = Date.now();
299
- let cleanedCount = 0;
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
- cleanedCount++;
252
+ stale.push(session);
307
253
  }
308
254
  }
309
- if (cleanedCount > 0) {
310
- metrics.sessionEventCounter.add(cleanedCount, {
311
- [ATTR_MCP_SESSION_EVENT]: 'stale_cleanup',
312
- });
313
- const context = requestContextService.createRequestContext({
314
- operation: 'SessionStore.cleanup',
315
- });
316
- logger.debug('Cleaned up stale sessions', {
317
- ...context,
318
- count: cleanedCount,
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":"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"}
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: McpServerFactory, taskManager: TaskManager, manifest: ServerManifest);
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;AAC/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wCAAwC,CAAC;AAG1E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAK7E,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,WAAW;IACnB,OAAO,CAAC,QAAQ;IATlB,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,gBAAgB,EACjC,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,cAAc,EAC9B;IAEE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAkD3B;IAEK,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBxC;IAED,SAAS,IAAI,eAAe,GAAG,IAAI,CAElC;CACF"}
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, taskManager, manifest) {
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
- // Stdio: single client, single connection — one server instance is correct
41
- const mcpServer = await this.createMcpServer();
42
- this.serverInstance = await startStdioTransport(mcpServer, context);
43
- // Start heartbeat for stdio transport — periodically pings the client
44
- // to detect dead connections (orphaned child processes, crashed hosts).
45
- if (this.config.mcpHeartbeatIntervalMs > 0) {
46
- const timeoutMs = Math.min(this.config.mcpHeartbeatIntervalMs, 10_000);
47
- this.heartbeat = new HeartbeatMonitor({
48
- intervalMs: this.config.mcpHeartbeatIntervalMs,
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(mcpServer, ctx);
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
  }