@cyanheads/pubmed-mcp-server 1.3.4 → 1.4.1

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 (335) hide show
  1. package/README.md +21 -21
  2. package/dist/config/index.d.ts +10 -0
  3. package/dist/config/index.d.ts.map +1 -0
  4. package/dist/config/index.js +69 -12
  5. package/dist/config/index.js.map +1 -0
  6. package/dist/index.d.ts +1 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +2 -1
  9. package/dist/index.js.map +1 -0
  10. package/dist/mcp-server/core/managedMcpServer.d.ts +48 -0
  11. package/dist/mcp-server/core/managedMcpServer.d.ts.map +1 -0
  12. package/dist/mcp-server/core/managedMcpServer.js +58 -0
  13. package/dist/mcp-server/core/managedMcpServer.js.map +1 -0
  14. package/dist/mcp-server/server.d.ts +1 -0
  15. package/dist/mcp-server/server.d.ts.map +1 -0
  16. package/dist/mcp-server/server.js +12 -11
  17. package/dist/mcp-server/server.js.map +1 -0
  18. package/dist/mcp-server/tools/pubmedArticleConnections/index.d.ts +7 -0
  19. package/dist/mcp-server/tools/pubmedArticleConnections/index.d.ts.map +1 -0
  20. package/dist/mcp-server/tools/pubmedArticleConnections/index.js +7 -0
  21. package/dist/mcp-server/tools/pubmedArticleConnections/index.js.map +1 -0
  22. package/dist/mcp-server/tools/pubmedArticleConnections/logic/citationFormatter.d.ts +10 -0
  23. package/dist/mcp-server/tools/pubmedArticleConnections/logic/citationFormatter.d.ts.map +1 -0
  24. package/dist/mcp-server/tools/{getPubMedArticleConnections → pubmedArticleConnections}/logic/citationFormatter.js +3 -2
  25. package/dist/mcp-server/tools/pubmedArticleConnections/logic/citationFormatter.js.map +1 -0
  26. package/dist/mcp-server/tools/pubmedArticleConnections/logic/elinkHandler.d.ts +10 -0
  27. package/dist/mcp-server/tools/pubmedArticleConnections/logic/elinkHandler.d.ts.map +1 -0
  28. package/dist/mcp-server/tools/{getPubMedArticleConnections → pubmedArticleConnections}/logic/elinkHandler.js +3 -2
  29. package/dist/mcp-server/tools/pubmedArticleConnections/logic/elinkHandler.js.map +1 -0
  30. package/dist/mcp-server/tools/{getPubMedArticleConnections → pubmedArticleConnections}/logic/index.d.ts +10 -9
  31. package/dist/mcp-server/tools/pubmedArticleConnections/logic/index.d.ts.map +1 -0
  32. package/dist/mcp-server/tools/{getPubMedArticleConnections → pubmedArticleConnections}/logic/index.js +15 -14
  33. package/dist/mcp-server/tools/pubmedArticleConnections/logic/index.js.map +1 -0
  34. package/dist/mcp-server/tools/{getPubMedArticleConnections → pubmedArticleConnections}/logic/types.d.ts +5 -4
  35. package/dist/mcp-server/tools/pubmedArticleConnections/logic/types.d.ts.map +1 -0
  36. package/dist/mcp-server/tools/pubmedArticleConnections/logic/types.js +6 -0
  37. package/dist/mcp-server/tools/pubmedArticleConnections/logic/types.js.map +1 -0
  38. package/dist/mcp-server/tools/pubmedArticleConnections/registration.d.ts +12 -0
  39. package/dist/mcp-server/tools/pubmedArticleConnections/registration.d.ts.map +1 -0
  40. package/dist/mcp-server/tools/{getPubMedArticleConnections → pubmedArticleConnections}/registration.js +12 -11
  41. package/dist/mcp-server/tools/pubmedArticleConnections/registration.js.map +1 -0
  42. package/dist/mcp-server/tools/pubmedFetchContents/index.d.ts +7 -0
  43. package/dist/mcp-server/tools/pubmedFetchContents/index.d.ts.map +1 -0
  44. package/dist/mcp-server/tools/pubmedFetchContents/index.js +7 -0
  45. package/dist/mcp-server/tools/pubmedFetchContents/index.js.map +1 -0
  46. package/dist/mcp-server/tools/{fetchPubMedContent → pubmedFetchContents}/logic.d.ts +7 -6
  47. package/dist/mcp-server/tools/pubmedFetchContents/logic.d.ts.map +1 -0
  48. package/dist/mcp-server/tools/{fetchPubMedContent → pubmedFetchContents}/logic.js +20 -19
  49. package/dist/mcp-server/tools/pubmedFetchContents/logic.js.map +1 -0
  50. package/dist/mcp-server/tools/pubmedFetchContents/registration.d.ts +11 -0
  51. package/dist/mcp-server/tools/pubmedFetchContents/registration.d.ts.map +1 -0
  52. package/dist/mcp-server/tools/{fetchPubMedContent → pubmedFetchContents}/registration.js +13 -12
  53. package/dist/mcp-server/tools/pubmedFetchContents/registration.js.map +1 -0
  54. package/dist/mcp-server/tools/{generatePubMedChart → pubmedGenerateChart}/index.d.ts +3 -2
  55. package/dist/mcp-server/tools/pubmedGenerateChart/index.d.ts.map +1 -0
  56. package/dist/mcp-server/tools/{generatePubMedChart → pubmedGenerateChart}/index.js +3 -2
  57. package/dist/mcp-server/tools/pubmedGenerateChart/index.js.map +1 -0
  58. package/dist/mcp-server/tools/{generatePubMedChart → pubmedGenerateChart}/logic.d.ts +5 -4
  59. package/dist/mcp-server/tools/pubmedGenerateChart/logic.d.ts.map +1 -0
  60. package/dist/mcp-server/tools/{generatePubMedChart → pubmedGenerateChart}/logic.js +15 -14
  61. package/dist/mcp-server/tools/pubmedGenerateChart/logic.js.map +1 -0
  62. package/dist/mcp-server/tools/pubmedGenerateChart/registration.d.ts +8 -0
  63. package/dist/mcp-server/tools/pubmedGenerateChart/registration.d.ts.map +1 -0
  64. package/dist/mcp-server/tools/{generatePubMedChart → pubmedGenerateChart}/registration.js +10 -13
  65. package/dist/mcp-server/tools/pubmedGenerateChart/registration.js.map +1 -0
  66. package/dist/mcp-server/tools/pubmedResearchAgent/index.d.ts +1 -0
  67. package/dist/mcp-server/tools/pubmedResearchAgent/index.d.ts.map +1 -0
  68. package/dist/mcp-server/tools/pubmedResearchAgent/index.js +1 -0
  69. package/dist/mcp-server/tools/pubmedResearchAgent/index.js.map +1 -0
  70. package/dist/mcp-server/tools/pubmedResearchAgent/logic/index.d.ts +1 -0
  71. package/dist/mcp-server/tools/pubmedResearchAgent/logic/index.d.ts.map +1 -0
  72. package/dist/mcp-server/tools/pubmedResearchAgent/logic/index.js +1 -0
  73. package/dist/mcp-server/tools/pubmedResearchAgent/logic/index.js.map +1 -0
  74. package/dist/mcp-server/tools/pubmedResearchAgent/logic/inputSchema.d.ts +1 -0
  75. package/dist/mcp-server/tools/pubmedResearchAgent/logic/inputSchema.d.ts.map +1 -0
  76. package/dist/mcp-server/tools/pubmedResearchAgent/logic/inputSchema.js +1 -0
  77. package/dist/mcp-server/tools/pubmedResearchAgent/logic/inputSchema.js.map +1 -0
  78. package/dist/mcp-server/tools/pubmedResearchAgent/logic/outputTypes.d.ts +1 -0
  79. package/dist/mcp-server/tools/pubmedResearchAgent/logic/outputTypes.d.ts.map +1 -0
  80. package/dist/mcp-server/tools/pubmedResearchAgent/logic/outputTypes.js +1 -0
  81. package/dist/mcp-server/tools/pubmedResearchAgent/logic/outputTypes.js.map +1 -0
  82. package/dist/mcp-server/tools/pubmedResearchAgent/logic/planOrchestrator.d.ts +1 -0
  83. package/dist/mcp-server/tools/pubmedResearchAgent/logic/planOrchestrator.d.ts.map +1 -0
  84. package/dist/mcp-server/tools/pubmedResearchAgent/logic/planOrchestrator.js +1 -0
  85. package/dist/mcp-server/tools/pubmedResearchAgent/logic/planOrchestrator.js.map +1 -0
  86. package/dist/mcp-server/tools/pubmedResearchAgent/logic.d.ts +1 -0
  87. package/dist/mcp-server/tools/pubmedResearchAgent/logic.d.ts.map +1 -0
  88. package/dist/mcp-server/tools/pubmedResearchAgent/logic.js +1 -0
  89. package/dist/mcp-server/tools/pubmedResearchAgent/logic.js.map +1 -0
  90. package/dist/mcp-server/tools/pubmedResearchAgent/registration.d.ts +1 -0
  91. package/dist/mcp-server/tools/pubmedResearchAgent/registration.d.ts.map +1 -0
  92. package/dist/mcp-server/tools/pubmedResearchAgent/registration.js +1 -0
  93. package/dist/mcp-server/tools/pubmedResearchAgent/registration.js.map +1 -0
  94. package/dist/mcp-server/tools/pubmedSearchArticles/index.d.ts +7 -0
  95. package/dist/mcp-server/tools/pubmedSearchArticles/index.d.ts.map +1 -0
  96. package/dist/mcp-server/tools/pubmedSearchArticles/index.js +7 -0
  97. package/dist/mcp-server/tools/pubmedSearchArticles/index.js.map +1 -0
  98. package/dist/mcp-server/tools/{searchPubMedArticles → pubmedSearchArticles}/logic.d.ts +8 -7
  99. package/dist/mcp-server/tools/pubmedSearchArticles/logic.d.ts.map +1 -0
  100. package/dist/mcp-server/tools/{searchPubMedArticles → pubmedSearchArticles}/logic.js +12 -11
  101. package/dist/mcp-server/tools/pubmedSearchArticles/logic.js.map +1 -0
  102. package/dist/mcp-server/tools/pubmedSearchArticles/registration.d.ts +11 -0
  103. package/dist/mcp-server/tools/pubmedSearchArticles/registration.d.ts.map +1 -0
  104. package/dist/mcp-server/tools/{searchPubMedArticles → pubmedSearchArticles}/registration.js +13 -12
  105. package/dist/mcp-server/tools/pubmedSearchArticles/registration.js.map +1 -0
  106. package/dist/mcp-server/transports/auth/authFactory.d.ts +1 -0
  107. package/dist/mcp-server/transports/auth/authFactory.d.ts.map +1 -0
  108. package/dist/mcp-server/transports/auth/authFactory.js +1 -0
  109. package/dist/mcp-server/transports/auth/authFactory.js.map +1 -0
  110. package/dist/mcp-server/transports/auth/authMiddleware.d.ts +1 -0
  111. package/dist/mcp-server/transports/auth/authMiddleware.d.ts.map +1 -0
  112. package/dist/mcp-server/transports/auth/authMiddleware.js +1 -0
  113. package/dist/mcp-server/transports/auth/authMiddleware.js.map +1 -0
  114. package/dist/mcp-server/transports/auth/index.d.ts +2 -1
  115. package/dist/mcp-server/transports/auth/index.d.ts.map +1 -0
  116. package/dist/mcp-server/transports/auth/index.js +1 -0
  117. package/dist/mcp-server/transports/auth/index.js.map +1 -0
  118. package/dist/mcp-server/transports/auth/lib/authContext.d.ts +1 -0
  119. package/dist/mcp-server/transports/auth/lib/authContext.d.ts.map +1 -0
  120. package/dist/mcp-server/transports/auth/lib/authContext.js +1 -0
  121. package/dist/mcp-server/transports/auth/lib/authContext.js.map +1 -0
  122. package/dist/mcp-server/transports/auth/lib/authTypes.d.ts +1 -0
  123. package/dist/mcp-server/transports/auth/lib/authTypes.d.ts.map +1 -0
  124. package/dist/mcp-server/transports/auth/lib/authTypes.js +1 -0
  125. package/dist/mcp-server/transports/auth/lib/authTypes.js.map +1 -0
  126. package/dist/mcp-server/transports/auth/lib/authUtils.d.ts +1 -0
  127. package/dist/mcp-server/transports/auth/lib/authUtils.d.ts.map +1 -0
  128. package/dist/mcp-server/transports/auth/lib/authUtils.js +1 -0
  129. package/dist/mcp-server/transports/auth/lib/authUtils.js.map +1 -0
  130. package/dist/mcp-server/transports/auth/strategies/authStrategy.d.ts +1 -0
  131. package/dist/mcp-server/transports/auth/strategies/authStrategy.d.ts.map +1 -0
  132. package/dist/mcp-server/transports/auth/strategies/authStrategy.js +1 -0
  133. package/dist/mcp-server/transports/auth/strategies/authStrategy.js.map +1 -0
  134. package/dist/mcp-server/transports/auth/strategies/jwtStrategy.d.ts +1 -0
  135. package/dist/mcp-server/transports/auth/strategies/jwtStrategy.d.ts.map +1 -0
  136. package/dist/mcp-server/transports/auth/strategies/jwtStrategy.js +6 -0
  137. package/dist/mcp-server/transports/auth/strategies/jwtStrategy.js.map +1 -0
  138. package/dist/mcp-server/transports/auth/strategies/oauthStrategy.d.ts +1 -0
  139. package/dist/mcp-server/transports/auth/strategies/oauthStrategy.d.ts.map +1 -0
  140. package/dist/mcp-server/transports/auth/strategies/oauthStrategy.js +7 -0
  141. package/dist/mcp-server/transports/auth/strategies/oauthStrategy.js.map +1 -0
  142. package/dist/mcp-server/transports/core/baseTransportManager.d.ts +1 -0
  143. package/dist/mcp-server/transports/core/baseTransportManager.d.ts.map +1 -0
  144. package/dist/mcp-server/transports/core/baseTransportManager.js +2 -0
  145. package/dist/mcp-server/transports/core/baseTransportManager.js.map +1 -0
  146. package/dist/mcp-server/transports/core/headerUtils.d.ts +20 -0
  147. package/dist/mcp-server/transports/core/headerUtils.d.ts.map +1 -0
  148. package/dist/mcp-server/transports/core/headerUtils.js +38 -0
  149. package/dist/mcp-server/transports/core/headerUtils.js.map +1 -0
  150. package/dist/mcp-server/transports/core/honoNodeBridge.d.ts +61 -7
  151. package/dist/mcp-server/transports/core/honoNodeBridge.d.ts.map +1 -0
  152. package/dist/mcp-server/transports/core/honoNodeBridge.js +102 -14
  153. package/dist/mcp-server/transports/core/honoNodeBridge.js.map +1 -0
  154. package/dist/mcp-server/transports/core/statefulTransportManager.d.ts +54 -8
  155. package/dist/mcp-server/transports/core/statefulTransportManager.d.ts.map +1 -0
  156. package/dist/mcp-server/transports/core/statefulTransportManager.js +185 -120
  157. package/dist/mcp-server/transports/core/statefulTransportManager.js.map +1 -0
  158. package/dist/mcp-server/transports/core/statelessTransportManager.d.ts +45 -7
  159. package/dist/mcp-server/transports/core/statelessTransportManager.d.ts.map +1 -0
  160. package/dist/mcp-server/transports/core/statelessTransportManager.js +85 -24
  161. package/dist/mcp-server/transports/core/statelessTransportManager.js.map +1 -0
  162. package/dist/mcp-server/transports/core/transportTypes.d.ts +59 -21
  163. package/dist/mcp-server/transports/core/transportTypes.d.ts.map +1 -0
  164. package/dist/mcp-server/transports/core/transportTypes.js +4 -1
  165. package/dist/mcp-server/transports/core/transportTypes.js.map +1 -0
  166. package/dist/mcp-server/transports/http/httpErrorHandler.d.ts +1 -0
  167. package/dist/mcp-server/transports/http/httpErrorHandler.d.ts.map +1 -0
  168. package/dist/mcp-server/transports/http/httpErrorHandler.js +1 -0
  169. package/dist/mcp-server/transports/http/httpErrorHandler.js.map +1 -0
  170. package/dist/mcp-server/transports/http/httpTransport.d.ts +4 -3
  171. package/dist/mcp-server/transports/http/httpTransport.d.ts.map +1 -0
  172. package/dist/mcp-server/transports/http/httpTransport.js +52 -16
  173. package/dist/mcp-server/transports/http/httpTransport.js.map +1 -0
  174. package/dist/mcp-server/transports/http/httpTypes.d.ts +1 -0
  175. package/dist/mcp-server/transports/http/httpTypes.d.ts.map +1 -0
  176. package/dist/mcp-server/transports/http/httpTypes.js +1 -0
  177. package/dist/mcp-server/transports/http/httpTypes.js.map +1 -0
  178. package/dist/mcp-server/transports/http/index.d.ts +1 -0
  179. package/dist/mcp-server/transports/http/index.d.ts.map +1 -0
  180. package/dist/mcp-server/transports/http/index.js +1 -0
  181. package/dist/mcp-server/transports/http/index.js.map +1 -0
  182. package/dist/mcp-server/transports/http/mcpTransportMiddleware.d.ts +4 -2
  183. package/dist/mcp-server/transports/http/mcpTransportMiddleware.d.ts.map +1 -0
  184. package/dist/mcp-server/transports/http/mcpTransportMiddleware.js +27 -24
  185. package/dist/mcp-server/transports/http/mcpTransportMiddleware.js.map +1 -0
  186. package/dist/mcp-server/transports/stdio/index.d.ts +1 -0
  187. package/dist/mcp-server/transports/stdio/index.d.ts.map +1 -0
  188. package/dist/mcp-server/transports/stdio/index.js +1 -0
  189. package/dist/mcp-server/transports/stdio/index.js.map +1 -0
  190. package/dist/mcp-server/transports/stdio/stdioTransport.d.ts +1 -0
  191. package/dist/mcp-server/transports/stdio/stdioTransport.d.ts.map +1 -0
  192. package/dist/mcp-server/transports/stdio/stdioTransport.js +1 -0
  193. package/dist/mcp-server/transports/stdio/stdioTransport.js.map +1 -0
  194. package/dist/services/NCBI/core/ncbiConstants.d.ts +1 -0
  195. package/dist/services/NCBI/core/ncbiConstants.d.ts.map +1 -0
  196. package/dist/services/NCBI/core/ncbiConstants.js +1 -0
  197. package/dist/services/NCBI/core/ncbiConstants.js.map +1 -0
  198. package/dist/services/NCBI/core/ncbiCoreApiClient.d.ts +1 -0
  199. package/dist/services/NCBI/core/ncbiCoreApiClient.d.ts.map +1 -0
  200. package/dist/services/NCBI/core/ncbiCoreApiClient.js +2 -0
  201. package/dist/services/NCBI/core/ncbiCoreApiClient.js.map +1 -0
  202. package/dist/services/NCBI/core/ncbiRequestQueueManager.d.ts +1 -1
  203. package/dist/services/NCBI/core/ncbiRequestQueueManager.d.ts.map +1 -0
  204. package/dist/services/NCBI/core/ncbiRequestQueueManager.js +5 -8
  205. package/dist/services/NCBI/core/ncbiRequestQueueManager.js.map +1 -0
  206. package/dist/services/NCBI/core/ncbiResponseHandler.d.ts +1 -0
  207. package/dist/services/NCBI/core/ncbiResponseHandler.d.ts.map +1 -0
  208. package/dist/services/NCBI/core/ncbiResponseHandler.js +3 -1
  209. package/dist/services/NCBI/core/ncbiResponseHandler.js.map +1 -0
  210. package/dist/services/NCBI/core/ncbiService.d.ts +1 -0
  211. package/dist/services/NCBI/core/ncbiService.d.ts.map +1 -0
  212. package/dist/services/NCBI/core/ncbiService.js +4 -0
  213. package/dist/services/NCBI/core/ncbiService.js.map +1 -0
  214. package/dist/services/NCBI/parsing/eSummaryResultParser.d.ts +1 -0
  215. package/dist/services/NCBI/parsing/eSummaryResultParser.d.ts.map +1 -0
  216. package/dist/services/NCBI/parsing/eSummaryResultParser.js +2 -0
  217. package/dist/services/NCBI/parsing/eSummaryResultParser.js.map +1 -0
  218. package/dist/services/NCBI/parsing/index.d.ts +1 -0
  219. package/dist/services/NCBI/parsing/index.d.ts.map +1 -0
  220. package/dist/services/NCBI/parsing/index.js +1 -0
  221. package/dist/services/NCBI/parsing/index.js.map +1 -0
  222. package/dist/services/NCBI/parsing/pubmedArticleStructureParser.d.ts +1 -0
  223. package/dist/services/NCBI/parsing/pubmedArticleStructureParser.d.ts.map +1 -0
  224. package/dist/services/NCBI/parsing/pubmedArticleStructureParser.js +1 -0
  225. package/dist/services/NCBI/parsing/pubmedArticleStructureParser.js.map +1 -0
  226. package/dist/services/NCBI/parsing/xmlGenericHelpers.d.ts +1 -0
  227. package/dist/services/NCBI/parsing/xmlGenericHelpers.d.ts.map +1 -0
  228. package/dist/services/NCBI/parsing/xmlGenericHelpers.js +1 -0
  229. package/dist/services/NCBI/parsing/xmlGenericHelpers.js.map +1 -0
  230. package/dist/types-global/errors.d.ts +1 -0
  231. package/dist/types-global/errors.d.ts.map +1 -0
  232. package/dist/types-global/errors.js +10 -0
  233. package/dist/types-global/errors.js.map +1 -0
  234. package/dist/types-global/pubmedXml.d.ts +1 -0
  235. package/dist/types-global/pubmedXml.d.ts.map +1 -0
  236. package/dist/types-global/pubmedXml.js +1 -0
  237. package/dist/types-global/pubmedXml.js.map +1 -0
  238. package/dist/utils/index.d.ts +3 -0
  239. package/dist/utils/index.d.ts.map +1 -0
  240. package/dist/utils/index.js +3 -0
  241. package/dist/utils/index.js.map +1 -0
  242. package/dist/utils/internal/errorHandler.d.ts +1 -7
  243. package/dist/utils/internal/errorHandler.d.ts.map +1 -0
  244. package/dist/utils/internal/errorHandler.js +28 -6
  245. package/dist/utils/internal/errorHandler.js.map +1 -0
  246. package/dist/utils/internal/index.d.ts +2 -0
  247. package/dist/utils/internal/index.d.ts.map +1 -0
  248. package/dist/utils/internal/index.js +2 -0
  249. package/dist/utils/internal/index.js.map +1 -0
  250. package/dist/utils/internal/logger.d.ts +1 -0
  251. package/dist/utils/internal/logger.d.ts.map +1 -0
  252. package/dist/utils/internal/logger.js +14 -8
  253. package/dist/utils/internal/logger.js.map +1 -0
  254. package/dist/utils/internal/performance.d.ts +22 -0
  255. package/dist/utils/internal/performance.d.ts.map +1 -0
  256. package/dist/utils/internal/performance.js +104 -0
  257. package/dist/utils/internal/performance.js.map +1 -0
  258. package/dist/utils/internal/requestContext.d.ts +1 -0
  259. package/dist/utils/internal/requestContext.d.ts.map +1 -0
  260. package/dist/utils/internal/requestContext.js +11 -0
  261. package/dist/utils/internal/requestContext.js.map +1 -0
  262. package/dist/utils/metrics/index.d.ts +1 -0
  263. package/dist/utils/metrics/index.d.ts.map +1 -0
  264. package/dist/utils/metrics/index.js +1 -0
  265. package/dist/utils/metrics/index.js.map +1 -0
  266. package/dist/utils/metrics/tokenCounter.d.ts +1 -0
  267. package/dist/utils/metrics/tokenCounter.d.ts.map +1 -0
  268. package/dist/utils/metrics/tokenCounter.js +1 -0
  269. package/dist/utils/metrics/tokenCounter.js.map +1 -0
  270. package/dist/utils/network/fetchWithTimeout.d.ts +1 -0
  271. package/dist/utils/network/fetchWithTimeout.d.ts.map +1 -0
  272. package/dist/utils/network/fetchWithTimeout.js +19 -0
  273. package/dist/utils/network/fetchWithTimeout.js.map +1 -0
  274. package/dist/utils/network/index.d.ts +1 -0
  275. package/dist/utils/network/index.d.ts.map +1 -0
  276. package/dist/utils/network/index.js +1 -0
  277. package/dist/utils/network/index.js.map +1 -0
  278. package/dist/utils/parsing/dateParser.d.ts +3 -3
  279. package/dist/utils/parsing/dateParser.d.ts.map +1 -0
  280. package/dist/utils/parsing/dateParser.js +3 -2
  281. package/dist/utils/parsing/dateParser.js.map +1 -0
  282. package/dist/utils/parsing/index.d.ts +1 -0
  283. package/dist/utils/parsing/index.d.ts.map +1 -0
  284. package/dist/utils/parsing/index.js +1 -0
  285. package/dist/utils/parsing/index.js.map +1 -0
  286. package/dist/utils/parsing/jsonParser.d.ts +2 -1
  287. package/dist/utils/parsing/jsonParser.d.ts.map +1 -0
  288. package/dist/utils/parsing/jsonParser.js +5 -3
  289. package/dist/utils/parsing/jsonParser.js.map +1 -0
  290. package/dist/utils/scheduling/index.d.ts +1 -0
  291. package/dist/utils/scheduling/index.d.ts.map +1 -0
  292. package/dist/utils/scheduling/index.js +1 -0
  293. package/dist/utils/scheduling/index.js.map +1 -0
  294. package/dist/utils/scheduling/scheduler.d.ts +1 -0
  295. package/dist/utils/scheduling/scheduler.d.ts.map +1 -0
  296. package/dist/utils/scheduling/scheduler.js +3 -1
  297. package/dist/utils/scheduling/scheduler.js.map +1 -0
  298. package/dist/utils/security/idGenerator.d.ts +1 -0
  299. package/dist/utils/security/idGenerator.d.ts.map +1 -0
  300. package/dist/utils/security/idGenerator.js +32 -27
  301. package/dist/utils/security/idGenerator.js.map +1 -0
  302. package/dist/utils/security/index.d.ts +1 -0
  303. package/dist/utils/security/index.d.ts.map +1 -0
  304. package/dist/utils/security/index.js +1 -0
  305. package/dist/utils/security/index.js.map +1 -0
  306. package/dist/utils/security/rateLimiter.d.ts +1 -0
  307. package/dist/utils/security/rateLimiter.d.ts.map +1 -0
  308. package/dist/utils/security/rateLimiter.js +45 -22
  309. package/dist/utils/security/rateLimiter.js.map +1 -0
  310. package/dist/utils/security/sanitization.d.ts +1 -0
  311. package/dist/utils/security/sanitization.d.ts.map +1 -0
  312. package/dist/utils/security/sanitization.js +65 -63
  313. package/dist/utils/security/sanitization.js.map +1 -0
  314. package/dist/utils/telemetry/instrumentation.d.ts +8 -0
  315. package/dist/utils/telemetry/instrumentation.d.ts.map +1 -0
  316. package/dist/utils/telemetry/instrumentation.js +179 -0
  317. package/dist/utils/telemetry/instrumentation.js.map +1 -0
  318. package/dist/utils/telemetry/semconv.d.ts +16 -0
  319. package/dist/utils/telemetry/semconv.d.ts.map +1 -0
  320. package/dist/utils/telemetry/semconv.js +16 -0
  321. package/dist/utils/telemetry/semconv.js.map +1 -0
  322. package/package.json +31 -14
  323. package/dist/mcp-server/tools/fetchPubMedContent/index.d.ts +0 -6
  324. package/dist/mcp-server/tools/fetchPubMedContent/index.js +0 -6
  325. package/dist/mcp-server/tools/fetchPubMedContent/registration.d.ts +0 -10
  326. package/dist/mcp-server/tools/generatePubMedChart/registration.d.ts +0 -7
  327. package/dist/mcp-server/tools/getPubMedArticleConnections/index.d.ts +0 -6
  328. package/dist/mcp-server/tools/getPubMedArticleConnections/index.js +0 -6
  329. package/dist/mcp-server/tools/getPubMedArticleConnections/logic/citationFormatter.d.ts +0 -9
  330. package/dist/mcp-server/tools/getPubMedArticleConnections/logic/elinkHandler.d.ts +0 -9
  331. package/dist/mcp-server/tools/getPubMedArticleConnections/logic/types.js +0 -5
  332. package/dist/mcp-server/tools/getPubMedArticleConnections/registration.d.ts +0 -11
  333. package/dist/mcp-server/tools/searchPubMedArticles/index.d.ts +0 -6
  334. package/dist/mcp-server/tools/searchPubMedArticles/index.js +0 -6
  335. package/dist/mcp-server/tools/searchPubMedArticles/registration.d.ts +0 -10
@@ -1,9 +1,17 @@
1
1
  /**
2
- * @fileoverview Stateful Transport Manager implementation for MCP SDK.
3
- * This manager handles multiple, persistent sessions, creating a dedicated
4
- * McpServer and StreamableHTTPServerTransport instance for each one.
5
- * This version is adapted for Hono by bridging the SDK's Node.js-style
6
- * request handling with Hono's stream-based response model.
2
+ * @fileoverview Implements a stateful transport manager for the MCP SDK.
3
+ *
4
+ * This manager handles multiple, persistent MCP sessions. It creates and maintains
5
+ * a dedicated McpServer and StreamableHTTPServerTransport instance for each session,
6
+ * allowing for stateful, multi-turn interactions. It includes robust mechanisms for
7
+ * session lifecycle management, including garbage collection of stale sessions and
8
+ * concurrency controls to prevent race conditions.
9
+ *
10
+ * SCALABILITY NOTE: This manager maintains all session state in local process memory.
11
+ * For horizontal scaling across multiple server instances, a load balancer with
12
+ * sticky sessions (session affinity) is required to ensure that all requests for a
13
+ * given session are routed to the same process instance that holds that session's state.
14
+ *
7
15
  * @module src/mcp-server/transports/core/statefulTransportManager
8
16
  */
9
17
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
@@ -12,20 +20,58 @@ import { RequestContext } from "../../../utils/index.js";
12
20
  import { BaseTransportManager } from "./baseTransportManager.js";
13
21
  import { StatefulTransportManager as IStatefulTransportManager, TransportResponse, TransportSession } from "./transportTypes.js";
14
22
  /**
15
- * Stateful Transport Manager that handles MCP SDK integration and session management
16
- * for a Hono-based HTTP server.
23
+ * Defines the configuration options for the StatefulTransportManager.
24
+ */
25
+ export interface StatefulTransportOptions {
26
+ staleSessionTimeoutMs: number;
27
+ mcpHttpEndpointPath: string;
28
+ }
29
+ /**
30
+ * Manages persistent, stateful MCP sessions.
17
31
  */
18
32
  export declare class StatefulTransportManager extends BaseTransportManager implements IStatefulTransportManager {
19
33
  private readonly transports;
20
34
  private readonly servers;
21
35
  private readonly sessions;
22
36
  private readonly garbageCollector;
23
- constructor(createServerInstanceFn: () => Promise<McpServer>);
37
+ private readonly options;
38
+ /**
39
+ * @param createServerInstanceFn - A factory function to create new McpServer instances.
40
+ * @param options - Configuration options for the manager.
41
+ */
42
+ constructor(createServerInstanceFn: () => Promise<McpServer>, options: StatefulTransportOptions);
43
+ /**
44
+ * Initializes a new stateful session and handles the first request.
45
+ *
46
+ * @param headers - The incoming request headers.
47
+ * @param body - The parsed body of the request.
48
+ * @param context - The request context.
49
+ * @returns A promise resolving to a streaming TransportResponse with a session ID.
50
+ */
24
51
  initializeAndHandle(headers: IncomingHttpHeaders, body: unknown, context: RequestContext): Promise<TransportResponse>;
52
+ /**
53
+ * Handles a subsequent request for an existing stateful session.
54
+ */
25
55
  handleRequest(headers: IncomingHttpHeaders, body: unknown, context: RequestContext, sessionId?: string): Promise<TransportResponse>;
56
+ /**
57
+ * Handles a request to explicitly delete a session.
58
+ */
26
59
  handleDeleteRequest(sessionId: string, context: RequestContext): Promise<TransportResponse>;
60
+ /**
61
+ * Retrieves information about a specific session.
62
+ */
27
63
  getSession(sessionId: string): TransportSession | undefined;
64
+ /**
65
+ * Gracefully shuts down the manager, closing all active sessions.
66
+ */
28
67
  shutdown(): Promise<void>;
68
+ /**
69
+ * Closes a single session and releases its associated resources.
70
+ */
29
71
  private closeSession;
72
+ /**
73
+ * Periodically runs to find and clean up stale, inactive sessions.
74
+ */
30
75
  private cleanupStaleSessions;
31
76
  }
77
+ //# sourceMappingURL=statefulTransportManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statefulTransportManager.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/transports/core/statefulTransportManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,mBAAmB,EAAkB,MAAM,MAAM,CAAC;AAIhE,OAAO,EAGL,cAAc,EAEf,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAGjE,OAAO,EAEL,wBAAwB,IAAI,yBAAyB,EACrD,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,qBAAqB,CAAC;AAE7B;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,qBAAqB,EAAE,MAAM,CAAC;IAC9B,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED;;GAEG;AACH,qBAAa,wBACX,SAAQ,oBACR,YAAW,yBAAyB;IAEpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAGvB;IACJ,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgC;IACxD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAuC;IAChE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAiB;IAClD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2B;IAEnD;;;OAGG;gBAED,sBAAsB,EAAE,MAAM,OAAO,CAAC,SAAS,CAAC,EAChD,OAAO,EAAE,wBAAwB;IAcnC;;;;;;;OAOG;IACG,mBAAmB,CACvB,OAAO,EAAE,mBAAmB,EAC5B,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,iBAAiB,CAAC;IAwG7B;;OAEG;IACG,aAAa,CACjB,OAAO,EAAE,mBAAmB,EAC5B,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,cAAc,EACvB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,iBAAiB,CAAC;IAgF7B;;OAEG;IACG,mBAAmB,CACvB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,iBAAiB,CAAC;IA8B7B;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAI3D;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAuB/B;;OAEG;YACW,YAAY;IAgC1B;;OAEG;YACW,oBAAoB;CA8CnC"}
@@ -1,88 +1,138 @@
1
1
  /**
2
- * @fileoverview Stateful Transport Manager implementation for MCP SDK.
3
- * This manager handles multiple, persistent sessions, creating a dedicated
4
- * McpServer and StreamableHTTPServerTransport instance for each one.
5
- * This version is adapted for Hono by bridging the SDK's Node.js-style
6
- * request handling with Hono's stream-based response model.
2
+ * @fileoverview Implements a stateful transport manager for the MCP SDK.
3
+ *
4
+ * This manager handles multiple, persistent MCP sessions. It creates and maintains
5
+ * a dedicated McpServer and StreamableHTTPServerTransport instance for each session,
6
+ * allowing for stateful, multi-turn interactions. It includes robust mechanisms for
7
+ * session lifecycle management, including garbage collection of stale sessions and
8
+ * concurrency controls to prevent race conditions.
9
+ *
10
+ * SCALABILITY NOTE: This manager maintains all session state in local process memory.
11
+ * For horizontal scaling across multiple server instances, a load balancer with
12
+ * sticky sessions (session affinity) is required to ensure that all requests for a
13
+ * given session are routed to the same process instance that holds that session's state.
14
+ *
7
15
  * @module src/mcp-server/transports/core/statefulTransportManager
8
16
  */
9
17
  import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
10
18
  import { randomUUID } from "node:crypto";
11
19
  import { Readable } from "stream";
12
- import { config } from "../../../config/index.js";
13
20
  import { BaseErrorCode, McpError } from "../../../types-global/errors.js";
14
21
  import { ErrorHandler, logger, requestContextService, } from "../../../utils/index.js";
15
22
  import { BaseTransportManager } from "./baseTransportManager.js";
16
23
  import { HonoStreamResponse } from "./honoNodeBridge.js";
24
+ import { convertNodeHeadersToWebHeaders } from "./headerUtils.js";
17
25
  /**
18
- * Stateful Transport Manager that handles MCP SDK integration and session management
19
- * for a Hono-based HTTP server.
26
+ * Manages persistent, stateful MCP sessions.
20
27
  */
21
28
  export class StatefulTransportManager extends BaseTransportManager {
22
- constructor(createServerInstanceFn) {
29
+ transports = new Map();
30
+ servers = new Map();
31
+ sessions = new Map();
32
+ garbageCollector;
33
+ options;
34
+ /**
35
+ * @param createServerInstanceFn - A factory function to create new McpServer instances.
36
+ * @param options - Configuration options for the manager.
37
+ */
38
+ constructor(createServerInstanceFn, options) {
23
39
  super(createServerInstanceFn);
24
- this.transports = new Map();
25
- this.servers = new Map();
26
- this.sessions = new Map();
40
+ this.options = options;
27
41
  const context = requestContextService.createRequestContext({
28
42
  operation: "StatefulTransportManager.constructor",
29
43
  });
30
44
  logger.info("Starting session garbage collector.", context);
31
- this.garbageCollector = setInterval(() => this.cleanupStaleSessions(), config.mcpStatefulSessionStaleTimeoutMs);
45
+ this.garbageCollector = setInterval(() => this.cleanupStaleSessions(), this.options.staleSessionTimeoutMs);
32
46
  }
47
+ /**
48
+ * Initializes a new stateful session and handles the first request.
49
+ *
50
+ * @param headers - The incoming request headers.
51
+ * @param body - The parsed body of the request.
52
+ * @param context - The request context.
53
+ * @returns A promise resolving to a streaming TransportResponse with a session ID.
54
+ */
33
55
  async initializeAndHandle(headers, body, context) {
34
- const operationName = "StatefulTransportManager.initializeAndHandle";
35
- const opContext = { ...context, operation: operationName };
56
+ const opContext = {
57
+ ...context,
58
+ operation: "StatefulTransportManager.initializeAndHandle",
59
+ };
36
60
  logger.debug("Initializing new stateful session.", opContext);
37
- const server = await this.createServerInstanceFn();
38
- const mockRes = new HonoStreamResponse();
39
- const transport = new StreamableHTTPServerTransport({
40
- sessionIdGenerator: () => randomUUID(),
41
- onsessioninitialized: (sessionId) => {
42
- const sessionContext = { ...opContext, sessionId };
43
- this.transports.set(sessionId, transport);
44
- this.servers.set(sessionId, server);
45
- this.sessions.set(sessionId, {
46
- id: sessionId,
47
- createdAt: new Date(),
48
- lastAccessedAt: new Date(),
49
- });
50
- logger.info(`MCP Session created: ${sessionId}`, sessionContext);
51
- },
52
- });
53
- transport.onclose = () => {
54
- const sessionId = transport.sessionId;
55
- if (sessionId) {
56
- const closeContext = requestContextService.createRequestContext({
57
- operation: "StatefulTransportManager.transport.onclose",
58
- sessionId,
59
- });
60
- this.closeSession(sessionId, closeContext).catch((err) => logger.error(`Error during transport.onclose cleanup for session ${sessionId}`, err, closeContext));
61
+ let server;
62
+ let transport;
63
+ try {
64
+ server = await this.createServerInstanceFn();
65
+ const mockRes = new HonoStreamResponse();
66
+ const currentServer = server;
67
+ transport = new StreamableHTTPServerTransport({
68
+ sessionIdGenerator: () => randomUUID(),
69
+ onsessioninitialized: (sessionId) => {
70
+ const sessionContext = { ...opContext, sessionId };
71
+ this.transports.set(sessionId, transport);
72
+ this.servers.set(sessionId, currentServer);
73
+ this.sessions.set(sessionId, {
74
+ id: sessionId,
75
+ createdAt: new Date(),
76
+ lastAccessedAt: new Date(),
77
+ activeRequests: 0,
78
+ });
79
+ logger.info(`MCP Session created: ${sessionId}`, sessionContext);
80
+ },
81
+ });
82
+ transport.onclose = () => {
83
+ const sessionId = transport.sessionId;
84
+ if (sessionId) {
85
+ const closeContext = { ...opContext, sessionId };
86
+ this.closeSession(sessionId, closeContext).catch((err) => logger.error(`Error during transport.onclose cleanup for session ${sessionId}`, err, closeContext));
87
+ }
88
+ };
89
+ await server.connect(transport);
90
+ logger.debug("Server connected, handling initial request.", opContext);
91
+ const mockReq = {
92
+ headers,
93
+ method: "POST",
94
+ url: this.options.mcpHttpEndpointPath,
95
+ };
96
+ await transport.handleRequest(mockReq, mockRes, body);
97
+ const responseHeaders = convertNodeHeadersToWebHeaders(mockRes.getHeaders());
98
+ if (transport.sessionId) {
99
+ responseHeaders.set("Mcp-Session-Id", transport.sessionId);
61
100
  }
62
- };
63
- await server.connect(transport);
64
- logger.debug("Server connected to transport, handling initial request.", opContext);
65
- const mockReq = {
66
- headers,
67
- method: "POST",
68
- url: config.mcpHttpEndpointPath,
69
- };
70
- await transport.handleRequest(mockReq, mockRes, body);
71
- const responseHeaders = new Headers();
72
- for (const [key, value] of Object.entries(mockRes.getHeaders())) {
73
- responseHeaders.set(key, Array.isArray(value) ? value.join(", ") : String(value));
101
+ const webStream = Readable.toWeb(mockRes);
102
+ return {
103
+ type: "stream",
104
+ headers: responseHeaders,
105
+ statusCode: mockRes.statusCode,
106
+ stream: webStream,
107
+ sessionId: transport.sessionId,
108
+ };
74
109
  }
75
- if (transport.sessionId) {
76
- responseHeaders.set("Mcp-Session-Id", transport.sessionId);
110
+ catch (error) {
111
+ logger.error("Failed to initialize stateful session. Cleaning up orphaned resources.", error instanceof Error ? error : undefined, { ...opContext, error: String(error) });
112
+ const sessionInitialized = transport?.sessionId && this.transports.has(transport.sessionId);
113
+ if (!sessionInitialized) {
114
+ (async () => {
115
+ await ErrorHandler.tryCatch(async () => {
116
+ if (transport)
117
+ await transport.close();
118
+ if (server)
119
+ await server.close();
120
+ }, {
121
+ operation: "initializeAndHandle.cleanupOrphaned",
122
+ context: opContext,
123
+ });
124
+ })();
125
+ }
126
+ throw ErrorHandler.handleError(error, {
127
+ operation: opContext.operation,
128
+ context: opContext,
129
+ rethrow: true,
130
+ });
77
131
  }
78
- const webStream = Readable.toWeb(mockRes);
79
- return {
80
- headers: responseHeaders,
81
- statusCode: mockRes.statusCode,
82
- stream: webStream,
83
- sessionId: transport.sessionId,
84
- };
85
132
  }
133
+ /**
134
+ * Handles a subsequent request for an existing stateful session.
135
+ */
86
136
  async handleRequest(headers, body, context, sessionId) {
87
137
  if (!sessionId) {
88
138
  throw new McpError(BaseErrorCode.INVALID_INPUT, "Session ID is required for stateful requests.", context);
@@ -92,14 +142,12 @@ export class StatefulTransportManager extends BaseTransportManager {
92
142
  sessionId,
93
143
  operation: "StatefulTransportManager.handleRequest",
94
144
  };
95
- logger.debug(`Handling request for session: ${sessionId}`, {
96
- ...sessionContext,
97
- method: headers["x-forwarded-proto"] || "http",
98
- });
99
145
  const transport = this.transports.get(sessionId);
100
- if (!transport) {
146
+ const session = this.sessions.get(sessionId);
147
+ if (!transport || !session) {
101
148
  logger.warning(`Request for non-existent session: ${sessionId}`, sessionContext);
102
149
  return {
150
+ type: "buffered",
103
151
  headers: new Headers({ "Content-Type": "application/json" }),
104
152
  statusCode: 404,
105
153
  body: {
@@ -108,29 +156,43 @@ export class StatefulTransportManager extends BaseTransportManager {
108
156
  },
109
157
  };
110
158
  }
111
- const session = this.sessions.get(sessionId);
112
- if (session) {
113
- session.lastAccessedAt = new Date();
114
- logger.debug(`Updated lastAccessedAt for session ${sessionId}.`, sessionContext);
159
+ session.lastAccessedAt = new Date();
160
+ session.activeRequests += 1;
161
+ logger.debug(`Incremented activeRequests for session ${sessionId}. Count: ${session.activeRequests}`, sessionContext);
162
+ try {
163
+ const mockReq = {
164
+ headers,
165
+ method: "POST",
166
+ url: this.options.mcpHttpEndpointPath,
167
+ };
168
+ const mockRes = new HonoStreamResponse();
169
+ await transport.handleRequest(mockReq, mockRes, body);
170
+ const responseHeaders = convertNodeHeadersToWebHeaders(mockRes.getHeaders());
171
+ const webStream = Readable.toWeb(mockRes);
172
+ return {
173
+ type: "stream",
174
+ headers: responseHeaders,
175
+ statusCode: mockRes.statusCode,
176
+ stream: webStream,
177
+ sessionId: transport.sessionId,
178
+ };
115
179
  }
116
- const mockReq = {
117
- headers,
118
- method: "POST",
119
- };
120
- const mockRes = new HonoStreamResponse();
121
- await transport.handleRequest(mockReq, mockRes, body);
122
- const responseHeaders = new Headers();
123
- for (const [key, value] of Object.entries(mockRes.getHeaders())) {
124
- responseHeaders.set(key, Array.isArray(value) ? value.join(", ") : String(value));
180
+ catch (error) {
181
+ throw ErrorHandler.handleError(error, {
182
+ operation: sessionContext.operation,
183
+ context: sessionContext,
184
+ rethrow: true,
185
+ });
186
+ }
187
+ finally {
188
+ session.activeRequests -= 1;
189
+ session.lastAccessedAt = new Date();
190
+ logger.debug(`Decremented activeRequests for session ${sessionId}. Count: ${session.activeRequests}`, sessionContext);
125
191
  }
126
- const webStream = Readable.toWeb(mockRes);
127
- return {
128
- headers: responseHeaders,
129
- statusCode: mockRes.statusCode,
130
- stream: webStream,
131
- sessionId: transport.sessionId,
132
- };
133
192
  }
193
+ /**
194
+ * Handles a request to explicitly delete a session.
195
+ */
134
196
  async handleDeleteRequest(sessionId, context) {
135
197
  const sessionContext = {
136
198
  ...context,
@@ -138,28 +200,27 @@ export class StatefulTransportManager extends BaseTransportManager {
138
200
  operation: "StatefulTransportManager.handleDeleteRequest",
139
201
  };
140
202
  logger.info(`Attempting to delete session: ${sessionId}`, sessionContext);
141
- const transport = this.transports.get(sessionId);
142
- if (!transport) {
203
+ if (!this.transports.has(sessionId)) {
143
204
  logger.warning(`Attempted to delete non-existent session: ${sessionId}`, sessionContext);
144
205
  throw new McpError(BaseErrorCode.NOT_FOUND, "Session not found or expired.", sessionContext);
145
206
  }
146
207
  await this.closeSession(sessionId, sessionContext);
147
- const headers = new Headers();
148
- headers.set("Content-Type", "application/json");
149
208
  return {
150
- headers,
209
+ type: "buffered",
210
+ headers: new Headers({ "Content-Type": "application/json" }),
151
211
  statusCode: 200,
152
212
  body: { status: "session_closed", sessionId },
153
213
  };
154
214
  }
215
+ /**
216
+ * Retrieves information about a specific session.
217
+ */
155
218
  getSession(sessionId) {
156
- const context = requestContextService.createRequestContext({
157
- operation: "StatefulTransportManager.getSession",
158
- sessionId,
159
- });
160
- logger.debug(`Retrieving session: ${sessionId}`, context);
161
219
  return this.sessions.get(sessionId);
162
220
  }
221
+ /**
222
+ * Gracefully shuts down the manager, closing all active sessions.
223
+ */
163
224
  async shutdown() {
164
225
  const context = requestContextService.createRequestContext({
165
226
  operation: "StatefulTransportManager.shutdown",
@@ -168,14 +229,19 @@ export class StatefulTransportManager extends BaseTransportManager {
168
229
  clearInterval(this.garbageCollector);
169
230
  logger.debug("Garbage collector stopped.", context);
170
231
  const sessionIds = Array.from(this.transports.keys());
171
- logger.info(`Closing ${sessionIds.length} active sessions.`, context);
172
- const closePromises = sessionIds.map((sessionId) => this.closeSession(sessionId, context));
173
- await Promise.all(closePromises);
232
+ if (sessionIds.length > 0) {
233
+ logger.info(`Closing ${sessionIds.length} active sessions.`, context);
234
+ const closePromises = sessionIds.map((sessionId) => this.closeSession(sessionId, context));
235
+ await Promise.all(closePromises);
236
+ }
174
237
  this.transports.clear();
175
238
  this.sessions.clear();
176
239
  this.servers.clear();
177
240
  logger.info("All active sessions closed and manager shut down.", context);
178
241
  }
242
+ /**
243
+ * Closes a single session and releases its associated resources.
244
+ */
179
245
  async closeSession(sessionId, context) {
180
246
  const sessionContext = {
181
247
  ...context,
@@ -186,48 +252,47 @@ export class StatefulTransportManager extends BaseTransportManager {
186
252
  const transport = this.transports.get(sessionId);
187
253
  const server = this.servers.get(sessionId);
188
254
  await ErrorHandler.tryCatch(async () => {
189
- if (transport) {
255
+ if (transport)
190
256
  await transport.close();
191
- logger.debug(`Transport closed for session ${sessionId}.`, sessionContext);
192
- }
193
- if (server) {
257
+ if (server)
194
258
  await server.close();
195
- logger.debug(`Server instance closed for session ${sessionId}.`, sessionContext);
196
- }
197
- }, {
198
- operation: "closeSession.cleanup",
199
- context: sessionContext,
200
- });
259
+ }, { operation: "closeSession.cleanup", context: sessionContext });
201
260
  this.transports.delete(sessionId);
202
261
  this.servers.delete(sessionId);
203
262
  this.sessions.delete(sessionId);
204
263
  logger.info(`MCP Session closed and resources released: ${sessionId}`, sessionContext);
205
264
  }
265
+ /**
266
+ * Periodically runs to find and clean up stale, inactive sessions.
267
+ */
206
268
  async cleanupStaleSessions() {
207
269
  const context = requestContextService.createRequestContext({
208
270
  operation: "StatefulTransportManager.cleanupStaleSessions",
209
271
  });
210
272
  logger.debug("Running stale session cleanup...", context);
211
273
  const now = Date.now();
212
- const STALE_TIMEOUT_MS = config.mcpStatefulSessionStaleTimeoutMs;
213
- let staleCount = 0;
274
+ const STALE_TIMEOUT_MS = this.options.staleSessionTimeoutMs;
275
+ const staleSessionIds = [];
214
276
  for (const [sessionId, session] of this.sessions.entries()) {
215
277
  if (now - session.lastAccessedAt.getTime() > STALE_TIMEOUT_MS) {
216
- staleCount++;
217
- const sessionContext = {
218
- ...context,
219
- sessionId,
220
- lastAccessed: session.lastAccessedAt.toISOString(),
221
- };
222
- logger.info(`Found stale session, closing: ${sessionId}`, sessionContext);
223
- await this.closeSession(sessionId, sessionContext);
278
+ if (session.activeRequests > 0) {
279
+ logger.info(`Session ${sessionId} is stale but has ${session.activeRequests} active requests. Skipping cleanup.`, { ...context, sessionId });
280
+ continue;
281
+ }
282
+ staleSessionIds.push(sessionId);
224
283
  }
225
284
  }
226
- if (staleCount > 0) {
227
- logger.info(`Stale session cleanup complete. Closed ${staleCount} sessions.`, context);
285
+ if (staleSessionIds.length > 0) {
286
+ logger.info(`Found ${staleSessionIds.length} stale sessions. Closing concurrently.`, context);
287
+ const closePromises = staleSessionIds.map((sessionId) => this.closeSession(sessionId, context).catch((err) => {
288
+ logger.error(`Error during concurrent stale session cleanup for ${sessionId}`, err, { ...context, sessionId });
289
+ }));
290
+ await Promise.all(closePromises);
291
+ logger.info(`Stale session cleanup complete. Closed ${staleSessionIds.length} sessions.`, context);
228
292
  }
229
293
  else {
230
294
  logger.debug("No stale sessions found.", context);
231
295
  }
232
296
  }
233
297
  }
298
+ //# sourceMappingURL=statefulTransportManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statefulTransportManager.js","sourceRoot":"","sources":["../../../../src/mcp-server/transports/core/statefulTransportManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AAEnG,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EACL,YAAY,EACZ,MAAM,EAEN,qBAAqB,GACtB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,8BAA8B,EAAE,MAAM,kBAAkB,CAAC;AAgBlE;;GAEG;AACH,MAAM,OAAO,wBACX,SAAQ,oBAAoB;IAGX,UAAU,GAAG,IAAI,GAAG,EAGlC,CAAC;IACa,OAAO,GAAG,IAAI,GAAG,EAAqB,CAAC;IACvC,QAAQ,GAAG,IAAI,GAAG,EAA4B,CAAC;IAC/C,gBAAgB,CAAiB;IACjC,OAAO,CAA2B;IAEnD;;;OAGG;IACH,YACE,sBAAgD,EAChD,OAAiC;QAEjC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC9B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,MAAM,OAAO,GAAG,qBAAqB,CAAC,oBAAoB,CAAC;YACzD,SAAS,EAAE,sCAAsC;SAClD,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,qCAAqC,EAAE,OAAO,CAAC,CAAC;QAC5D,IAAI,CAAC,gBAAgB,GAAG,WAAW,CACjC,GAAG,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,EACjC,IAAI,CAAC,OAAO,CAAC,qBAAqB,CACnC,CAAC;IACJ,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,mBAAmB,CACvB,OAA4B,EAC5B,IAAa,EACb,OAAuB;QAEvB,MAAM,SAAS,GAAG;YAChB,GAAG,OAAO;YACV,SAAS,EAAE,8CAA8C;SAC1D,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,oCAAoC,EAAE,SAAS,CAAC,CAAC;QAE9D,IAAI,MAA6B,CAAC;QAClC,IAAI,SAAoD,CAAC;QAEzD,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC7C,MAAM,OAAO,GAAG,IAAI,kBAAkB,EAA+B,CAAC;YACtE,MAAM,aAAa,GAAG,MAAM,CAAC;YAE7B,SAAS,GAAG,IAAI,6BAA6B,CAAC;gBAC5C,kBAAkB,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE;gBACtC,oBAAoB,EAAE,CAAC,SAAS,EAAE,EAAE;oBAClC,MAAM,cAAc,GAAG,EAAE,GAAG,SAAS,EAAE,SAAS,EAAE,CAAC;oBACnD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,EAAE,SAAU,CAAC,CAAC;oBAC3C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;oBAC3C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE;wBAC3B,EAAE,EAAE,SAAS;wBACb,SAAS,EAAE,IAAI,IAAI,EAAE;wBACrB,cAAc,EAAE,IAAI,IAAI,EAAE;wBAC1B,cAAc,EAAE,CAAC;qBAClB,CAAC,CAAC;oBACH,MAAM,CAAC,IAAI,CAAC,wBAAwB,SAAS,EAAE,EAAE,cAAc,CAAC,CAAC;gBACnE,CAAC;aACF,CAAC,CAAC;YAEH,SAAS,CAAC,OAAO,GAAG,GAAG,EAAE;gBACvB,MAAM,SAAS,GAAG,SAAU,CAAC,SAAS,CAAC;gBACvC,IAAI,SAAS,EAAE,CAAC;oBACd,MAAM,YAAY,GAAG,EAAE,GAAG,SAAS,EAAE,SAAS,EAAE,CAAC;oBACjD,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CACvD,MAAM,CAAC,KAAK,CACV,sDAAsD,SAAS,EAAE,EACjE,GAAG,EACH,YAAY,CACb,CACF,CAAC;gBACJ,CAAC;YACH,CAAC,CAAC;YAEF,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAChC,MAAM,CAAC,KAAK,CAAC,6CAA6C,EAAE,SAAS,CAAC,CAAC;YAEvE,MAAM,OAAO,GAAG;gBACd,OAAO;gBACP,MAAM,EAAE,MAAM;gBACd,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,mBAAmB;aACJ,CAAC;YACpC,MAAM,SAAS,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YAEtD,MAAM,eAAe,GAAG,8BAA8B,CACpD,OAAO,CAAC,UAAU,EAAE,CACrB,CAAC;YACF,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;gBACxB,eAAe,CAAC,GAAG,CAAC,gBAAgB,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;YAC7D,CAAC;YAED,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAC9B,OAAwC,CACX,CAAC;YAEhC,OAAO;gBACL,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,eAAe;gBACxB,UAAU,EAAE,OAAO,CAAC,UAA4B;gBAChD,MAAM,EAAE,SAAS;gBACjB,SAAS,EAAE,SAAS,CAAC,SAAS;aAC/B,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CACV,wEAAwE,EACxE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,EAC1C,EAAE,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CACvC,CAAC;YAEF,MAAM,kBAAkB,GACtB,SAAS,EAAE,SAAS,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YACnE,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBACxB,CAAC,KAAK,IAAI,EAAE;oBACV,MAAM,YAAY,CAAC,QAAQ,CACzB,KAAK,IAAI,EAAE;wBACT,IAAI,SAAS;4BAAE,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;wBACvC,IAAI,MAAM;4BAAE,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;oBACnC,CAAC,EACD;wBACE,SAAS,EAAE,qCAAqC;wBAChD,OAAO,EAAE,SAAS;qBACnB,CACF,CAAC;gBACJ,CAAC,CAAC,EAAE,CAAC;YACP,CAAC;YACD,MAAM,YAAY,CAAC,WAAW,CAAC,KAAK,EAAE;gBACpC,SAAS,EAAE,SAAS,CAAC,SAAS;gBAC9B,OAAO,EAAE,SAAS;gBAClB,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CACjB,OAA4B,EAC5B,IAAa,EACb,OAAuB,EACvB,SAAkB;QAElB,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,QAAQ,CAChB,aAAa,CAAC,aAAa,EAC3B,+CAA+C,EAC/C,OAAO,CACR,CAAC;QACJ,CAAC;QACD,MAAM,cAAc,GAAG;YACrB,GAAG,OAAO;YACV,SAAS;YACT,SAAS,EAAE,wCAAwC;SACpD,CAAC;QAEF,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAE7C,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO,EAAE,CAAC;YAC3B,MAAM,CAAC,OAAO,CACZ,qCAAqC,SAAS,EAAE,EAChD,cAAc,CACf,CAAC;YACF,OAAO;gBACL,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,IAAI,OAAO,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;gBAC5D,UAAU,EAAE,GAAG;gBACf,IAAI,EAAE;oBACJ,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE;iBACtD;aACF,CAAC;QACJ,CAAC;QAED,OAAO,CAAC,cAAc,GAAG,IAAI,IAAI,EAAE,CAAC;QACpC,OAAO,CAAC,cAAc,IAAI,CAAC,CAAC;QAC5B,MAAM,CAAC,KAAK,CACV,0CAA0C,SAAS,YAAY,OAAO,CAAC,cAAc,EAAE,EACvF,cAAc,CACf,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,OAAO,GAAG;gBACd,OAAO;gBACP,MAAM,EAAE,MAAM;gBACd,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,mBAAmB;aACJ,CAAC;YACpC,MAAM,OAAO,GAAG,IAAI,kBAAkB,EAA+B,CAAC;YAEtE,MAAM,SAAS,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YAEtD,MAAM,eAAe,GAAG,8BAA8B,CACpD,OAAO,CAAC,UAAU,EAAE,CACrB,CAAC;YACF,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAC9B,OAAwC,CACX,CAAC;YAEhC,OAAO;gBACL,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,eAAe;gBACxB,UAAU,EAAE,OAAO,CAAC,UAA4B;gBAChD,MAAM,EAAE,SAAS;gBACjB,SAAS,EAAE,SAAS,CAAC,SAAS;aAC/B,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,CAAC,WAAW,CAAC,KAAK,EAAE;gBACpC,SAAS,EAAE,cAAc,CAAC,SAAS;gBACnC,OAAO,EAAE,cAAc;gBACvB,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,cAAc,IAAI,CAAC,CAAC;YAC5B,OAAO,CAAC,cAAc,GAAG,IAAI,IAAI,EAAE,CAAC;YACpC,MAAM,CAAC,KAAK,CACV,0CAA0C,SAAS,YAAY,OAAO,CAAC,cAAc,EAAE,EACvF,cAAc,CACf,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,mBAAmB,CACvB,SAAiB,EACjB,OAAuB;QAEvB,MAAM,cAAc,GAAG;YACrB,GAAG,OAAO;YACV,SAAS;YACT,SAAS,EAAE,8CAA8C;SAC1D,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,iCAAiC,SAAS,EAAE,EAAE,cAAc,CAAC,CAAC;QAE1E,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACpC,MAAM,CAAC,OAAO,CACZ,6CAA6C,SAAS,EAAE,EACxD,cAAc,CACf,CAAC;YACF,MAAM,IAAI,QAAQ,CAChB,aAAa,CAAC,SAAS,EACvB,+BAA+B,EAC/B,cAAc,CACf,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;QAEnD,OAAO;YACL,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,IAAI,OAAO,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;YAC5D,UAAU,EAAE,GAAqB;YACjC,IAAI,EAAE,EAAE,MAAM,EAAE,gBAAgB,EAAE,SAAS,EAAE;SAC9C,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,SAAiB;QAC1B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ;QACZ,MAAM,OAAO,GAAG,qBAAqB,CAAC,oBAAoB,CAAC;YACzD,SAAS,EAAE,mCAAmC;SAC/C,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,6CAA6C,EAAE,OAAO,CAAC,CAAC;QACpE,aAAa,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,4BAA4B,EAAE,OAAO,CAAC,CAAC;QAEpD,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;QACtD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC,WAAW,UAAU,CAAC,MAAM,mBAAmB,EAAE,OAAO,CAAC,CAAC;YACtE,MAAM,aAAa,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CACjD,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CACtC,CAAC;YACF,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACnC,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACxB,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,MAAM,CAAC,IAAI,CAAC,mDAAmD,EAAE,OAAO,CAAC,CAAC;IAC5E,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,YAAY,CACxB,SAAiB,EACjB,OAAuB;QAEvB,MAAM,cAAc,GAAG;YACrB,GAAG,OAAO;YACV,SAAS;YACT,SAAS,EAAE,uCAAuC;SACnD,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,oBAAoB,SAAS,EAAE,EAAE,cAAc,CAAC,CAAC;QAE9D,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAE3C,MAAM,YAAY,CAAC,QAAQ,CACzB,KAAK,IAAI,EAAE;YACT,IAAI,SAAS;gBAAE,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;YACvC,IAAI,MAAM;gBAAE,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACnC,CAAC,EACD,EAAE,SAAS,EAAE,sBAAsB,EAAE,OAAO,EAAE,cAAc,EAAE,CAC/D,CAAC;QAEF,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAClC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC/B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAEhC,MAAM,CAAC,IAAI,CACT,8CAA8C,SAAS,EAAE,EACzD,cAAc,CACf,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,oBAAoB;QAChC,MAAM,OAAO,GAAG,qBAAqB,CAAC,oBAAoB,CAAC;YACzD,SAAS,EAAE,+CAA+C;SAC3D,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,kCAAkC,EAAE,OAAO,CAAC,CAAC;QAE1D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC;QAC5D,MAAM,eAAe,GAAa,EAAE,CAAC;QAErC,KAAK,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;YAC3D,IAAI,GAAG,GAAG,OAAO,CAAC,cAAc,CAAC,OAAO,EAAE,GAAG,gBAAgB,EAAE,CAAC;gBAC9D,IAAI,OAAO,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC;oBAC/B,MAAM,CAAC,IAAI,CACT,WAAW,SAAS,qBAAqB,OAAO,CAAC,cAAc,qCAAqC,EACpG,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,CAC1B,CAAC;oBACF,SAAS;gBACX,CAAC;gBACD,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;QAED,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,CAAC,IAAI,CACT,SAAS,eAAe,CAAC,MAAM,wCAAwC,EACvE,OAAO,CACR,CAAC;YACF,MAAM,aAAa,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CACtD,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBAClD,MAAM,CAAC,KAAK,CACV,qDAAqD,SAAS,EAAE,EAChE,GAAG,EACH,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,CAC1B,CAAC;YACJ,CAAC,CAAC,CACH,CAAC;YACF,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YACjC,MAAM,CAAC,IAAI,CACT,0CAA0C,eAAe,CAAC,MAAM,YAAY,EAC5E,OAAO,CACR,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE,OAAO,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;CACF"}
@@ -1,9 +1,16 @@
1
1
  /**
2
- * @fileoverview Stateless Transport Manager implementation for MCP SDK.
3
- * This manager handles single-request operations without maintaining sessions.
4
- * Each request creates a temporary server instance that is cleaned up immediately.
5
- * This version is adapted for Hono by bridging the SDK's Node.js-style
6
- * request handling with Hono's stream-based response model.
2
+ * @fileoverview Implements a stateless transport manager for the MCP SDK.
3
+ *
4
+ * This manager handles single, ephemeral MCP operations. For each incoming request,
5
+ * it dynamically creates a temporary McpServer and transport instance, processes the
6
+ * request, and then immediately schedules the resources for cleanup. This approach
7
+ * is ideal for simple, one-off tool calls that do not require persistent session state.
8
+ *
9
+ * The key challenge addressed here is bridging the Node.js-centric MCP SDK with
10
+ * modern, Web Standards-based frameworks like Hono. This is achieved by deferring
11
+ * resource cleanup until the response stream has been fully consumed by the web
12
+ * framework, preventing premature closure and truncated responses.
13
+ *
7
14
  * @module src/mcp-server/transports/core/statelessTransportManager
8
15
  */
9
16
  import type { IncomingHttpHeaders } from "http";
@@ -11,10 +18,41 @@ import { RequestContext } from "../../../utils/index.js";
11
18
  import { BaseTransportManager } from "./baseTransportManager.js";
12
19
  import { TransportResponse } from "./transportTypes.js";
13
20
  /**
14
- * Stateless Transport Manager that handles ephemeral MCP operations.
21
+ * Manages ephemeral, single-request MCP operations.
15
22
  */
16
23
  export declare class StatelessTransportManager extends BaseTransportManager {
24
+ /**
25
+ * Handles a single, stateless MCP request.
26
+ *
27
+ * This method orchestrates the creation of temporary server and transport instances,
28
+ * handles the request, and ensures resources are cleaned up only after the
29
+ * response stream is closed.
30
+ *
31
+ * @param headers - The incoming request headers.
32
+ * @param body - The parsed body of the request.
33
+ * @param context - The request context for logging and tracing.
34
+ * @returns A promise resolving to a streaming TransportResponse.
35
+ */
17
36
  handleRequest(headers: IncomingHttpHeaders, body: unknown, context: RequestContext): Promise<TransportResponse>;
18
- shutdown(): Promise<void>;
37
+ /**
38
+ * Attaches listeners to the response stream to trigger resource cleanup
39
+ * only after the stream has been fully consumed or has errored.
40
+ *
41
+ * @param stream - The response stream bridge.
42
+ * @param server - The ephemeral McpServer instance.
43
+ * @param transport - The ephemeral transport instance.
44
+ * @param context - The request context for logging.
45
+ */
46
+ private setupDeferredCleanup;
47
+ /**
48
+ * Performs the actual cleanup of ephemeral resources.
49
+ * This method is designed to be "fire-and-forget".
50
+ */
19
51
  private cleanup;
52
+ /**
53
+ * Shuts down the manager. For the stateless manager, this is a no-op
54
+ * as there are no persistent resources to manage.
55
+ */
56
+ shutdown(): Promise<void>;
20
57
  }
58
+ //# sourceMappingURL=statelessTransportManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statelessTransportManager.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/transports/core/statelessTransportManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,KAAK,EAAE,mBAAmB,EAAkB,MAAM,MAAM,CAAC;AAEhE,OAAO,EAGL,cAAc,EAEf,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAGjE,OAAO,EAAkB,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExE;;GAEG;AACH,qBAAa,yBAA0B,SAAQ,oBAAoB;IACjE;;;;;;;;;;;OAWG;IACG,aAAa,CACjB,OAAO,EAAE,mBAAmB,EAC5B,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,iBAAiB,CAAC;IAoE7B;;;;;;;;OAQG;IACH,OAAO,CAAC,oBAAoB;IA0B5B;;;OAGG;IACH,OAAO,CAAC,OAAO;IA0Bf;;;OAGG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAUhC"}