@loop_ouroboros/mcp-hub-lite 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (499) hide show
  1. package/CHANGELOG.md +228 -0
  2. package/LICENSE +21 -0
  3. package/README.md +354 -0
  4. package/dist/client/assets/HomeView-f901HeKw.js +1 -0
  5. package/dist/client/assets/ResourceDetailView-BdOaL_-o.css +1 -0
  6. package/dist/client/assets/ResourceDetailView-Bz66ZjfY.js +1 -0
  7. package/dist/client/assets/ResourcesView-CjMklkyv.css +1 -0
  8. package/dist/client/assets/ResourcesView-lI_fItfA.js +1 -0
  9. package/dist/client/assets/ServerDashboard-7_8Og9JJ.css +1 -0
  10. package/dist/client/assets/ServerDashboard-Bgx8WVkx.js +2 -0
  11. package/dist/client/assets/ServerListView-Bws09jNR.css +1 -0
  12. package/dist/client/assets/ServerListView-CP6Ffkfx.js +30 -0
  13. package/dist/client/assets/ServerStatusTags.vue_vue_type_script_setup_true_lang-BHiTFM7-.js +1 -0
  14. package/dist/client/assets/SessionsView-D68qKR4D.js +1 -0
  15. package/dist/client/assets/SettingsView-BPYfO9BE.js +1 -0
  16. package/dist/client/assets/ToolCallDialog-Br8FNebN.js +1 -0
  17. package/dist/client/assets/ToolCallDialog-C7eh7jHE.css +1 -0
  18. package/dist/client/assets/ToolsView-B6hUiR43.js +1 -0
  19. package/dist/client/assets/ToolsView-BLnU8cV6.css +1 -0
  20. package/dist/client/assets/_baseClone-DCmK847M.js +1 -0
  21. package/dist/client/assets/_plugin-vue_export-helper-DlAUqK2U.js +1 -0
  22. package/dist/client/assets/el-form-item-BVMLpmVC.css +1 -0
  23. package/dist/client/assets/el-form-item-DM0q2hmO.js +12 -0
  24. package/dist/client/assets/el-input-BtI9NECe.js +1 -0
  25. package/dist/client/assets/el-input-CmuHb8HS.css +1 -0
  26. package/dist/client/assets/el-loading-CChNmKeI.js +1 -0
  27. package/dist/client/assets/el-loading-bpKhqqQq.css +1 -0
  28. package/dist/client/assets/el-overlay-B2ZKM6Up.css +1 -0
  29. package/dist/client/assets/el-overlay-lZZbPmsX.js +1 -0
  30. package/dist/client/assets/el-select-BXztu2b5.js +1 -0
  31. package/dist/client/assets/el-select-C0U_l4IZ.css +1 -0
  32. package/dist/client/assets/el-tab-pane-CnNoQHsR.css +1 -0
  33. package/dist/client/assets/el-tab-pane-Dy9ruaEX.js +1 -0
  34. package/dist/client/assets/el-table-column-98UyVgBH.js +1 -0
  35. package/dist/client/assets/el-table-column-T_mV9jNw.css +1 -0
  36. package/dist/client/assets/el-tag-B5lLT51E.js +1 -0
  37. package/dist/client/assets/el-tag-DjxZVOpb.css +1 -0
  38. package/dist/client/assets/event-BB_Ol6Sd.js +1 -0
  39. package/dist/client/assets/index-BgKcmWJr.js +1 -0
  40. package/dist/client/assets/index-BsDWtoIl.css +1 -0
  41. package/dist/client/assets/index-BzQXG7no.js +1 -0
  42. package/dist/client/assets/index-CSTs2jYk.js +2 -0
  43. package/dist/client/assets/omit-Bx5HJNV_.js +1 -0
  44. package/dist/client/assets/raf-B9VDMtMF.js +1 -0
  45. package/dist/client/assets/typescript-Bp3YSIOJ.js +1 -0
  46. package/dist/client/assets/vnode-B8aJx8u4.js +1 -0
  47. package/dist/client/assets/vue-vendor-6ny5zj9i.js +3 -0
  48. package/dist/client/index.html +15 -0
  49. package/dist/server/shared/index.d.ts +3 -0
  50. package/dist/server/shared/index.d.ts.map +1 -0
  51. package/dist/server/shared/index.js +2 -0
  52. package/dist/server/shared/models/index.d.ts +4 -0
  53. package/dist/server/shared/models/index.d.ts.map +1 -0
  54. package/dist/server/shared/models/index.js +3 -0
  55. package/dist/server/shared/models/resource.model.d.ts +8 -0
  56. package/dist/server/shared/models/resource.model.d.ts.map +1 -0
  57. package/dist/server/shared/models/resource.model.js +1 -0
  58. package/dist/server/shared/models/server.model.d.ts +57 -0
  59. package/dist/server/shared/models/server.model.d.ts.map +1 -0
  60. package/dist/server/shared/models/server.model.js +1 -0
  61. package/dist/server/shared/models/session.model.d.ts +73 -0
  62. package/dist/server/shared/models/session.model.d.ts.map +1 -0
  63. package/dist/server/shared/models/session.model.js +70 -0
  64. package/dist/server/shared/models/tool.model.d.ts +22 -0
  65. package/dist/server/shared/models/tool.model.d.ts.map +1 -0
  66. package/dist/server/shared/models/tool.model.js +1 -0
  67. package/dist/server/shared/types/client.types.d.ts +35 -0
  68. package/dist/server/shared/types/client.types.d.ts.map +1 -0
  69. package/dist/server/shared/types/client.types.js +5 -0
  70. package/dist/server/shared/types/common.types.d.ts +5 -0
  71. package/dist/server/shared/types/common.types.d.ts.map +1 -0
  72. package/dist/server/shared/types/common.types.js +2 -0
  73. package/dist/server/shared/types/index.d.ts +4 -0
  74. package/dist/server/shared/types/index.d.ts.map +1 -0
  75. package/dist/server/shared/types/index.js +3 -0
  76. package/dist/server/shared/types/session.types.d.ts +15 -0
  77. package/dist/server/shared/types/session.types.d.ts.map +1 -0
  78. package/dist/server/shared/types/session.types.js +5 -0
  79. package/dist/server/shared/types/websocket.types.d.ts +177 -0
  80. package/dist/server/shared/types/websocket.types.d.ts.map +1 -0
  81. package/dist/server/shared/types/websocket.types.js +25 -0
  82. package/dist/server/src/api/mcp/debug-response-wrapper.d.ts +13 -0
  83. package/dist/server/src/api/mcp/debug-response-wrapper.d.ts.map +1 -0
  84. package/dist/server/src/api/mcp/debug-response-wrapper.js +271 -0
  85. package/dist/server/src/api/mcp/gateway.d.ts +14 -0
  86. package/dist/server/src/api/mcp/gateway.d.ts.map +1 -0
  87. package/dist/server/src/api/mcp/gateway.js +116 -0
  88. package/dist/server/src/api/mcp/session-context-extractor.d.ts +47 -0
  89. package/dist/server/src/api/mcp/session-context-extractor.d.ts.map +1 -0
  90. package/dist/server/src/api/mcp/session-context-extractor.js +127 -0
  91. package/dist/server/src/api/mcp/sse-stream-manager.d.ts +13 -0
  92. package/dist/server/src/api/mcp/sse-stream-manager.d.ts.map +1 -0
  93. package/dist/server/src/api/mcp/sse-stream-manager.js +40 -0
  94. package/dist/server/src/api/web/clients.d.ts +30 -0
  95. package/dist/server/src/api/web/clients.d.ts.map +1 -0
  96. package/dist/server/src/api/web/clients.js +41 -0
  97. package/dist/server/src/api/web/config.d.ts +21 -0
  98. package/dist/server/src/api/web/config.d.ts.map +1 -0
  99. package/dist/server/src/api/web/config.js +119 -0
  100. package/dist/server/src/api/web/health.d.ts +21 -0
  101. package/dist/server/src/api/web/health.d.ts.map +1 -0
  102. package/dist/server/src/api/web/health.js +24 -0
  103. package/dist/server/src/api/web/hub-tools.d.ts +30 -0
  104. package/dist/server/src/api/web/hub-tools.d.ts.map +1 -0
  105. package/dist/server/src/api/web/hub-tools.js +202 -0
  106. package/dist/server/src/api/web/logs.d.ts +30 -0
  107. package/dist/server/src/api/web/logs.d.ts.map +1 -0
  108. package/dist/server/src/api/web/logs.js +141 -0
  109. package/dist/server/src/api/web/mcp-status.d.ts +29 -0
  110. package/dist/server/src/api/web/mcp-status.d.ts.map +1 -0
  111. package/dist/server/src/api/web/mcp-status.js +126 -0
  112. package/dist/server/src/api/web/resources.d.ts +28 -0
  113. package/dist/server/src/api/web/resources.d.ts.map +1 -0
  114. package/dist/server/src/api/web/resources.js +93 -0
  115. package/dist/server/src/api/web/search.d.ts +26 -0
  116. package/dist/server/src/api/web/search.d.ts.map +1 -0
  117. package/dist/server/src/api/web/search.js +62 -0
  118. package/dist/server/src/api/web/servers.d.ts +33 -0
  119. package/dist/server/src/api/web/servers.d.ts.map +1 -0
  120. package/dist/server/src/api/web/servers.js +235 -0
  121. package/dist/server/src/api/web/sessions.d.ts +29 -0
  122. package/dist/server/src/api/web/sessions.d.ts.map +1 -0
  123. package/dist/server/src/api/web/sessions.js +104 -0
  124. package/dist/server/src/api/ws/events.d.ts +29 -0
  125. package/dist/server/src/api/ws/events.d.ts.map +1 -0
  126. package/dist/server/src/api/ws/events.js +44 -0
  127. package/dist/server/src/api/ws/ws-handler.d.ts +83 -0
  128. package/dist/server/src/api/ws/ws-handler.d.ts.map +1 -0
  129. package/dist/server/src/api/ws/ws-handler.js +217 -0
  130. package/dist/server/src/app.d.ts +24 -0
  131. package/dist/server/src/app.d.ts.map +1 -0
  132. package/dist/server/src/app.js +108 -0
  133. package/dist/server/src/cli/commands/list.d.ts +71 -0
  134. package/dist/server/src/cli/commands/list.d.ts.map +1 -0
  135. package/dist/server/src/cli/commands/list.js +97 -0
  136. package/dist/server/src/cli/commands/restart.d.ts +42 -0
  137. package/dist/server/src/cli/commands/restart.d.ts.map +1 -0
  138. package/dist/server/src/cli/commands/restart.js +61 -0
  139. package/dist/server/src/cli/commands/start.d.ts +43 -0
  140. package/dist/server/src/cli/commands/start.d.ts.map +1 -0
  141. package/dist/server/src/cli/commands/start.js +160 -0
  142. package/dist/server/src/cli/commands/status.d.ts +39 -0
  143. package/dist/server/src/cli/commands/status.d.ts.map +1 -0
  144. package/dist/server/src/cli/commands/status.js +164 -0
  145. package/dist/server/src/cli/commands/stop.d.ts +34 -0
  146. package/dist/server/src/cli/commands/stop.d.ts.map +1 -0
  147. package/dist/server/src/cli/commands/stop.js +47 -0
  148. package/dist/server/src/cli/commands/ui.d.ts +44 -0
  149. package/dist/server/src/cli/commands/ui.d.ts.map +1 -0
  150. package/dist/server/src/cli/commands/ui.js +95 -0
  151. package/dist/server/src/cli/index.d.ts +62 -0
  152. package/dist/server/src/cli/index.d.ts.map +1 -0
  153. package/dist/server/src/cli/index.js +88 -0
  154. package/dist/server/src/cli/parse-args.d.ts +108 -0
  155. package/dist/server/src/cli/parse-args.d.ts.map +1 -0
  156. package/dist/server/src/cli/parse-args.js +131 -0
  157. package/dist/server/src/cli/server.d.ts +171 -0
  158. package/dist/server/src/cli/server.d.ts.map +1 -0
  159. package/dist/server/src/cli/server.js +246 -0
  160. package/dist/server/src/config/config-change-logger.d.ts +16 -0
  161. package/dist/server/src/config/config-change-logger.d.ts.map +1 -0
  162. package/dist/server/src/config/config-change-logger.js +43 -0
  163. package/dist/server/src/config/config-loader.d.ts +22 -0
  164. package/dist/server/src/config/config-loader.d.ts.map +1 -0
  165. package/dist/server/src/config/config-loader.js +66 -0
  166. package/dist/server/src/config/config-manager.d.ts +158 -0
  167. package/dist/server/src/config/config-manager.d.ts.map +1 -0
  168. package/dist/server/src/config/config-manager.js +246 -0
  169. package/dist/server/src/config/config-saver.d.ts +16 -0
  170. package/dist/server/src/config/config-saver.d.ts.map +1 -0
  171. package/dist/server/src/config/config-saver.js +28 -0
  172. package/dist/server/src/config/config.schema.d.ts +108 -0
  173. package/dist/server/src/config/config.schema.d.ts.map +1 -0
  174. package/dist/server/src/config/config.schema.js +103 -0
  175. package/dist/server/src/config/server-config-manager.d.ts +74 -0
  176. package/dist/server/src/config/server-config-manager.d.ts.map +1 -0
  177. package/dist/server/src/config/server-config-manager.js +157 -0
  178. package/dist/server/src/config/type-converter.d.ts +13 -0
  179. package/dist/server/src/config/type-converter.d.ts.map +1 -0
  180. package/dist/server/src/config/type-converter.js +37 -0
  181. package/dist/server/src/index.d.ts +3 -0
  182. package/dist/server/src/index.d.ts.map +1 -0
  183. package/dist/server/src/index.js +352 -0
  184. package/dist/server/src/models/event.model.d.ts +106 -0
  185. package/dist/server/src/models/event.model.d.ts.map +1 -0
  186. package/dist/server/src/models/event.model.js +5 -0
  187. package/dist/server/src/models/server.model.d.ts +19 -0
  188. package/dist/server/src/models/server.model.d.ts.map +1 -0
  189. package/dist/server/src/models/server.model.js +1 -0
  190. package/dist/server/src/models/system-tools.constants.d.ts +73 -0
  191. package/dist/server/src/models/system-tools.constants.d.ts.map +1 -0
  192. package/dist/server/src/models/system-tools.constants.js +31 -0
  193. package/dist/server/src/models/types.d.ts +84 -0
  194. package/dist/server/src/models/types.d.ts.map +1 -0
  195. package/dist/server/src/models/types.js +67 -0
  196. package/dist/server/src/pid/file.d.ts +26 -0
  197. package/dist/server/src/pid/file.d.ts.map +1 -0
  198. package/dist/server/src/pid/file.js +68 -0
  199. package/dist/server/src/pid/manager.d.ts +98 -0
  200. package/dist/server/src/pid/manager.d.ts.map +1 -0
  201. package/dist/server/src/pid/manager.js +158 -0
  202. package/dist/server/src/pid/types.d.ts +13 -0
  203. package/dist/server/src/pid/types.d.ts.map +1 -0
  204. package/dist/server/src/pid/types.js +4 -0
  205. package/dist/server/src/server/dev-server.d.ts +2 -0
  206. package/dist/server/src/server/dev-server.d.ts.map +1 -0
  207. package/dist/server/src/server/dev-server.js +171 -0
  208. package/dist/server/src/server/runner.d.ts +57 -0
  209. package/dist/server/src/server/runner.d.ts.map +1 -0
  210. package/dist/server/src/server/runner.js +163 -0
  211. package/dist/server/src/services/client-tracker.service.d.ts +132 -0
  212. package/dist/server/src/services/client-tracker.service.d.ts.map +1 -0
  213. package/dist/server/src/services/client-tracker.service.js +203 -0
  214. package/dist/server/src/services/connection/connection-manager.d.ts +478 -0
  215. package/dist/server/src/services/connection/connection-manager.d.ts.map +1 -0
  216. package/dist/server/src/services/connection/connection-manager.js +929 -0
  217. package/dist/server/src/services/connection/index.d.ts +6 -0
  218. package/dist/server/src/services/connection/index.d.ts.map +1 -0
  219. package/dist/server/src/services/connection/index.js +4 -0
  220. package/dist/server/src/services/connection/tool-cache.d.ts +122 -0
  221. package/dist/server/src/services/connection/tool-cache.d.ts.map +1 -0
  222. package/dist/server/src/services/connection/tool-cache.js +202 -0
  223. package/dist/server/src/services/connection/types.d.ts +30 -0
  224. package/dist/server/src/services/connection/types.d.ts.map +1 -0
  225. package/dist/server/src/services/connection/types.js +1 -0
  226. package/dist/server/src/services/event-bus.service.d.ts +169 -0
  227. package/dist/server/src/services/event-bus.service.d.ts.map +1 -0
  228. package/dist/server/src/services/event-bus.service.js +200 -0
  229. package/dist/server/src/services/gateway/gateway.service.d.ts +61 -0
  230. package/dist/server/src/services/gateway/gateway.service.d.ts.map +1 -0
  231. package/dist/server/src/services/gateway/gateway.service.js +107 -0
  232. package/dist/server/src/services/gateway/index.d.ts +8 -0
  233. package/dist/server/src/services/gateway/index.d.ts.map +1 -0
  234. package/dist/server/src/services/gateway/index.js +6 -0
  235. package/dist/server/src/services/gateway/log-formatter.d.ts +26 -0
  236. package/dist/server/src/services/gateway/log-formatter.d.ts.map +1 -0
  237. package/dist/server/src/services/gateway/log-formatter.js +66 -0
  238. package/dist/server/src/services/gateway/request-handlers/call-tool-handler.d.ts +13 -0
  239. package/dist/server/src/services/gateway/request-handlers/call-tool-handler.d.ts.map +1 -0
  240. package/dist/server/src/services/gateway/request-handlers/call-tool-handler.js +131 -0
  241. package/dist/server/src/services/gateway/request-handlers/index.d.ts +9 -0
  242. package/dist/server/src/services/gateway/request-handlers/index.d.ts.map +1 -0
  243. package/dist/server/src/services/gateway/request-handlers/index.js +8 -0
  244. package/dist/server/src/services/gateway/request-handlers/initialize-handler.d.ts +11 -0
  245. package/dist/server/src/services/gateway/request-handlers/initialize-handler.d.ts.map +1 -0
  246. package/dist/server/src/services/gateway/request-handlers/initialize-handler.js +85 -0
  247. package/dist/server/src/services/gateway/request-handlers/resources-handler.d.ts +11 -0
  248. package/dist/server/src/services/gateway/request-handlers/resources-handler.d.ts.map +1 -0
  249. package/dist/server/src/services/gateway/request-handlers/resources-handler.js +56 -0
  250. package/dist/server/src/services/gateway/request-handlers/system-tools-handler.d.ts +11 -0
  251. package/dist/server/src/services/gateway/request-handlers/system-tools-handler.d.ts.map +1 -0
  252. package/dist/server/src/services/gateway/request-handlers/system-tools-handler.js +228 -0
  253. package/dist/server/src/services/gateway/request-handlers/tools-handler.d.ts +11 -0
  254. package/dist/server/src/services/gateway/request-handlers/tools-handler.d.ts.map +1 -0
  255. package/dist/server/src/services/gateway/request-handlers/tools-handler.js +79 -0
  256. package/dist/server/src/services/gateway/tool-list-generator.d.ts +23 -0
  257. package/dist/server/src/services/gateway/tool-list-generator.d.ts.map +1 -0
  258. package/dist/server/src/services/gateway/tool-list-generator.js +115 -0
  259. package/dist/server/src/services/gateway/types.d.ts +27 -0
  260. package/dist/server/src/services/gateway/types.d.ts.map +1 -0
  261. package/dist/server/src/services/gateway/types.js +4 -0
  262. package/dist/server/src/services/gateway.service.d.ts +7 -0
  263. package/dist/server/src/services/gateway.service.d.ts.map +1 -0
  264. package/dist/server/src/services/gateway.service.js +6 -0
  265. package/dist/server/src/services/hub-manager.service.d.ts +299 -0
  266. package/dist/server/src/services/hub-manager.service.d.ts.map +1 -0
  267. package/dist/server/src/services/hub-manager.service.js +413 -0
  268. package/dist/server/src/services/hub-tools/index.d.ts +10 -0
  269. package/dist/server/src/services/hub-tools/index.d.ts.map +1 -0
  270. package/dist/server/src/services/hub-tools/index.js +6 -0
  271. package/dist/server/src/services/hub-tools/resource-generator.d.ts +63 -0
  272. package/dist/server/src/services/hub-tools/resource-generator.d.ts.map +1 -0
  273. package/dist/server/src/services/hub-tools/resource-generator.js +141 -0
  274. package/dist/server/src/services/hub-tools/server-selector.d.ts +63 -0
  275. package/dist/server/src/services/hub-tools/server-selector.d.ts.map +1 -0
  276. package/dist/server/src/services/hub-tools/server-selector.js +108 -0
  277. package/dist/server/src/services/hub-tools/system-tool-definitions.d.ts +47 -0
  278. package/dist/server/src/services/hub-tools/system-tool-definitions.d.ts.map +1 -0
  279. package/dist/server/src/services/hub-tools/system-tool-definitions.js +225 -0
  280. package/dist/server/src/services/hub-tools/tool-search.d.ts +85 -0
  281. package/dist/server/src/services/hub-tools/tool-search.d.ts.map +1 -0
  282. package/dist/server/src/services/hub-tools/tool-search.js +115 -0
  283. package/dist/server/src/services/hub-tools/types.d.ts +42 -0
  284. package/dist/server/src/services/hub-tools/types.d.ts.map +1 -0
  285. package/dist/server/src/services/hub-tools/types.js +1 -0
  286. package/dist/server/src/services/hub-tools.service.d.ts +235 -0
  287. package/dist/server/src/services/hub-tools.service.d.ts.map +1 -0
  288. package/dist/server/src/services/hub-tools.service.js +457 -0
  289. package/dist/server/src/services/log-storage.service.d.ts +177 -0
  290. package/dist/server/src/services/log-storage.service.d.ts.map +1 -0
  291. package/dist/server/src/services/log-storage.service.js +243 -0
  292. package/dist/server/src/services/mcp-connection-manager.d.ts +7 -0
  293. package/dist/server/src/services/mcp-connection-manager.d.ts.map +1 -0
  294. package/dist/server/src/services/mcp-connection-manager.js +6 -0
  295. package/dist/server/src/services/mcp-session-manager.d.ts +6 -0
  296. package/dist/server/src/services/mcp-session-manager.d.ts.map +1 -0
  297. package/dist/server/src/services/mcp-session-manager.js +4 -0
  298. package/dist/server/src/services/search/index.d.ts +5 -0
  299. package/dist/server/src/services/search/index.d.ts.map +1 -0
  300. package/dist/server/src/services/search/index.js +5 -0
  301. package/dist/server/src/services/search/search-cache.d.ts +132 -0
  302. package/dist/server/src/services/search/search-cache.d.ts.map +1 -0
  303. package/dist/server/src/services/search/search-cache.js +151 -0
  304. package/dist/server/src/services/search/search-core.service.d.ts +108 -0
  305. package/dist/server/src/services/search/search-core.service.d.ts.map +1 -0
  306. package/dist/server/src/services/search/search-core.service.js +187 -0
  307. package/dist/server/src/services/search/search-scorer.d.ts +54 -0
  308. package/dist/server/src/services/search/search-scorer.d.ts.map +1 -0
  309. package/dist/server/src/services/search/search-scorer.js +83 -0
  310. package/dist/server/src/services/search/types.d.ts +20 -0
  311. package/dist/server/src/services/search/types.d.ts.map +1 -0
  312. package/dist/server/src/services/search/types.js +1 -0
  313. package/dist/server/src/services/session/index.d.ts +6 -0
  314. package/dist/server/src/services/session/index.d.ts.map +1 -0
  315. package/dist/server/src/services/session/index.js +4 -0
  316. package/dist/server/src/services/session/session-manager.d.ts +352 -0
  317. package/dist/server/src/services/session/session-manager.d.ts.map +1 -0
  318. package/dist/server/src/services/session/session-manager.js +835 -0
  319. package/dist/server/src/services/session/types.d.ts +32 -0
  320. package/dist/server/src/services/session/types.d.ts.map +1 -0
  321. package/dist/server/src/services/session/types.js +1 -0
  322. package/dist/server/src/services/simple-search.service.d.ts +67 -0
  323. package/dist/server/src/services/simple-search.service.d.ts.map +1 -0
  324. package/dist/server/src/services/simple-search.service.js +82 -0
  325. package/dist/server/src/services/system-tool-handler.d.ts +10 -0
  326. package/dist/server/src/services/system-tool-handler.d.ts.map +1 -0
  327. package/dist/server/src/services/system-tool-handler.js +77 -0
  328. package/dist/server/src/utils/error-handler.d.ts +18 -0
  329. package/dist/server/src/utils/error-handler.d.ts.map +1 -0
  330. package/dist/server/src/utils/error-handler.js +59 -0
  331. package/dist/server/src/utils/format-utils.d.ts +23 -0
  332. package/dist/server/src/utils/format-utils.d.ts.map +1 -0
  333. package/dist/server/src/utils/format-utils.js +58 -0
  334. package/dist/server/src/utils/index.d.ts +2 -0
  335. package/dist/server/src/utils/index.d.ts.map +1 -0
  336. package/dist/server/src/utils/index.js +1 -0
  337. package/dist/server/src/utils/json-utils.d.ts +82 -0
  338. package/dist/server/src/utils/json-utils.d.ts.map +1 -0
  339. package/dist/server/src/utils/json-utils.js +204 -0
  340. package/dist/server/src/utils/log-rotator.d.ts +223 -0
  341. package/dist/server/src/utils/log-rotator.d.ts.map +1 -0
  342. package/dist/server/src/utils/log-rotator.js +306 -0
  343. package/dist/server/src/utils/logger/dev-logger.d.ts +39 -0
  344. package/dist/server/src/utils/logger/dev-logger.d.ts.map +1 -0
  345. package/dist/server/src/utils/logger/dev-logger.js +63 -0
  346. package/dist/server/src/utils/logger/index.d.ts +36 -0
  347. package/dist/server/src/utils/logger/index.d.ts.map +1 -0
  348. package/dist/server/src/utils/logger/index.js +46 -0
  349. package/dist/server/src/utils/logger/log-colors.d.ts +27 -0
  350. package/dist/server/src/utils/logger/log-colors.d.ts.map +1 -0
  351. package/dist/server/src/utils/logger/log-colors.js +41 -0
  352. package/dist/server/src/utils/logger/log-context.d.ts +13 -0
  353. package/dist/server/src/utils/logger/log-context.d.ts.map +1 -0
  354. package/dist/server/src/utils/logger/log-context.js +5 -0
  355. package/dist/server/src/utils/logger/log-formatter.d.ts +47 -0
  356. package/dist/server/src/utils/logger/log-formatter.d.ts.map +1 -0
  357. package/dist/server/src/utils/logger/log-formatter.js +150 -0
  358. package/dist/server/src/utils/logger/log-modules.d.ts +141 -0
  359. package/dist/server/src/utils/logger/log-modules.d.ts.map +1 -0
  360. package/dist/server/src/utils/logger/log-modules.js +81 -0
  361. package/dist/server/src/utils/logger/log-output.d.ts +68 -0
  362. package/dist/server/src/utils/logger/log-output.d.ts.map +1 -0
  363. package/dist/server/src/utils/logger/log-output.js +320 -0
  364. package/dist/server/src/utils/logger/logger.d.ts +190 -0
  365. package/dist/server/src/utils/logger/logger.d.ts.map +1 -0
  366. package/dist/server/src/utils/logger/logger.js +350 -0
  367. package/dist/server/src/utils/logger.d.ts +12 -0
  368. package/dist/server/src/utils/logger.d.ts.map +1 -0
  369. package/dist/server/src/utils/logger.js +12 -0
  370. package/dist/server/src/utils/mcp-error-handler.d.ts +162 -0
  371. package/dist/server/src/utils/mcp-error-handler.d.ts.map +1 -0
  372. package/dist/server/src/utils/mcp-error-handler.js +270 -0
  373. package/dist/server/src/utils/port-checker.d.ts +16 -0
  374. package/dist/server/src/utils/port-checker.d.ts.map +1 -0
  375. package/dist/server/src/utils/port-checker.js +242 -0
  376. package/dist/server/src/utils/request-context.d.ts +71 -0
  377. package/dist/server/src/utils/request-context.d.ts.map +1 -0
  378. package/dist/server/src/utils/request-context.js +73 -0
  379. package/dist/server/src/utils/tool-args-parser.d.ts +17 -0
  380. package/dist/server/src/utils/tool-args-parser.d.ts.map +1 -0
  381. package/dist/server/src/utils/tool-args-parser.js +34 -0
  382. package/dist/server/src/utils/transports/sse-transport.d.ts +104 -0
  383. package/dist/server/src/utils/transports/sse-transport.d.ts.map +1 -0
  384. package/dist/server/src/utils/transports/sse-transport.js +189 -0
  385. package/dist/server/src/utils/transports/stdio-transport.d.ts +122 -0
  386. package/dist/server/src/utils/transports/stdio-transport.d.ts.map +1 -0
  387. package/dist/server/src/utils/transports/stdio-transport.js +324 -0
  388. package/dist/server/src/utils/transports/streamable-http-transport.d.ts +146 -0
  389. package/dist/server/src/utils/transports/streamable-http-transport.d.ts.map +1 -0
  390. package/dist/server/src/utils/transports/streamable-http-transport.js +212 -0
  391. package/dist/server/src/utils/transports/transport-factory.d.ts +26 -0
  392. package/dist/server/src/utils/transports/transport-factory.d.ts.map +1 -0
  393. package/dist/server/src/utils/transports/transport-factory.js +104 -0
  394. package/dist/server/src/utils/transports/transport.interface.d.ts +35 -0
  395. package/dist/server/src/utils/transports/transport.interface.d.ts.map +1 -0
  396. package/dist/server/src/utils/transports/transport.interface.js +1 -0
  397. package/dist/server/tests/contract/mcp-protocol/initialize.test.d.ts +2 -0
  398. package/dist/server/tests/contract/mcp-protocol/initialize.test.d.ts.map +1 -0
  399. package/dist/server/tests/contract/mcp-protocol/initialize.test.js +103 -0
  400. package/dist/server/tests/contract/mcp-protocol/tools-call.test.d.ts +2 -0
  401. package/dist/server/tests/contract/mcp-protocol/tools-call.test.d.ts.map +1 -0
  402. package/dist/server/tests/contract/mcp-protocol/tools-call.test.js +181 -0
  403. package/dist/server/tests/contract/mcp-protocol/tools-list.test.d.ts +2 -0
  404. package/dist/server/tests/contract/mcp-protocol/tools-list.test.d.ts.map +1 -0
  405. package/dist/server/tests/contract/mcp-protocol/tools-list.test.js +155 -0
  406. package/dist/server/tests/evaluation/evaluation.test.d.ts +2 -0
  407. package/dist/server/tests/evaluation/evaluation.test.d.ts.map +1 -0
  408. package/dist/server/tests/evaluation/evaluation.test.js +102 -0
  409. package/dist/server/tests/helpers/sdk-test-helpers.d.ts +32 -0
  410. package/dist/server/tests/helpers/sdk-test-helpers.d.ts.map +1 -0
  411. package/dist/server/tests/helpers/sdk-test-helpers.js +82 -0
  412. package/dist/server/tests/integration/api/gateway.test.d.ts +2 -0
  413. package/dist/server/tests/integration/api/gateway.test.d.ts.map +1 -0
  414. package/dist/server/tests/integration/api/gateway.test.js +366 -0
  415. package/dist/server/tests/integration/gateway/fault-tolerance.test.d.ts +2 -0
  416. package/dist/server/tests/integration/gateway/fault-tolerance.test.d.ts.map +1 -0
  417. package/dist/server/tests/integration/gateway/fault-tolerance.test.js +109 -0
  418. package/dist/server/tests/integration/gateway/mcp-connection.test.d.ts +2 -0
  419. package/dist/server/tests/integration/gateway/mcp-connection.test.d.ts.map +1 -0
  420. package/dist/server/tests/integration/gateway/mcp-connection.test.js +149 -0
  421. package/dist/server/tests/server.test.d.ts +2 -0
  422. package/dist/server/tests/server.test.d.ts.map +1 -0
  423. package/dist/server/tests/server.test.js +95 -0
  424. package/dist/server/tests/setup.d.ts +7 -0
  425. package/dist/server/tests/setup.d.ts.map +1 -0
  426. package/dist/server/tests/setup.js +53 -0
  427. package/dist/server/tests/types/logger-test-helpers.d.ts +17 -0
  428. package/dist/server/tests/types/logger-test-helpers.d.ts.map +1 -0
  429. package/dist/server/tests/types/logger-test-helpers.js +4 -0
  430. package/dist/server/tests/types/test-helpers.d.ts +27 -0
  431. package/dist/server/tests/types/test-helpers.d.ts.map +1 -0
  432. package/dist/server/tests/types/test-helpers.js +4 -0
  433. package/dist/server/tests/unit/cli/basic-cli.test.d.ts +2 -0
  434. package/dist/server/tests/unit/cli/basic-cli.test.d.ts.map +1 -0
  435. package/dist/server/tests/unit/cli/basic-cli.test.js +33 -0
  436. package/dist/server/tests/unit/cli/cli.test.d.ts +2 -0
  437. package/dist/server/tests/unit/cli/cli.test.d.ts.map +1 -0
  438. package/dist/server/tests/unit/cli/cli.test.js +17 -0
  439. package/dist/server/tests/unit/cli/commands.test.d.ts +2 -0
  440. package/dist/server/tests/unit/cli/commands.test.d.ts.map +1 -0
  441. package/dist/server/tests/unit/cli/commands.test.js +75 -0
  442. package/dist/server/tests/unit/cli/server.test.d.ts +2 -0
  443. package/dist/server/tests/unit/cli/server.test.d.ts.map +1 -0
  444. package/dist/server/tests/unit/cli/server.test.js +68 -0
  445. package/dist/server/tests/unit/server/runner.test.d.ts +2 -0
  446. package/dist/server/tests/unit/server/runner.test.d.ts.map +1 -0
  447. package/dist/server/tests/unit/server/runner.test.js +488 -0
  448. package/dist/server/tests/unit/server/setup.d.ts +2 -0
  449. package/dist/server/tests/unit/server/setup.d.ts.map +1 -0
  450. package/dist/server/tests/unit/server/setup.js +21 -0
  451. package/dist/server/tests/unit/services/gateway-logging.test.d.ts +2 -0
  452. package/dist/server/tests/unit/services/gateway-logging.test.d.ts.map +1 -0
  453. package/dist/server/tests/unit/services/gateway-logging.test.js +47 -0
  454. package/dist/server/tests/unit/services/hub-manager-service.test.d.ts +2 -0
  455. package/dist/server/tests/unit/services/hub-manager-service.test.d.ts.map +1 -0
  456. package/dist/server/tests/unit/services/hub-manager-service.test.js +140 -0
  457. package/dist/server/tests/unit/services/hub-manager.test.d.ts +2 -0
  458. package/dist/server/tests/unit/services/hub-manager.test.d.ts.map +1 -0
  459. package/dist/server/tests/unit/services/hub-manager.test.js +98 -0
  460. package/dist/server/tests/unit/services/hub-tools.service.test.d.ts +2 -0
  461. package/dist/server/tests/unit/services/hub-tools.service.test.d.ts.map +1 -0
  462. package/dist/server/tests/unit/services/hub-tools.service.test.js +674 -0
  463. package/dist/server/tests/unit/services/search/search-cache.test.d.ts +2 -0
  464. package/dist/server/tests/unit/services/search/search-cache.test.d.ts.map +1 -0
  465. package/dist/server/tests/unit/services/search/search-cache.test.js +58 -0
  466. package/dist/server/tests/unit/services/search/search-core.service.test.d.ts +2 -0
  467. package/dist/server/tests/unit/services/search/search-core.service.test.d.ts.map +1 -0
  468. package/dist/server/tests/unit/services/search/search-core.service.test.js +84 -0
  469. package/dist/server/tests/unit/services/search/search-scorer.test.d.ts +2 -0
  470. package/dist/server/tests/unit/services/search/search-scorer.test.d.ts.map +1 -0
  471. package/dist/server/tests/unit/services/search/search-scorer.test.js +97 -0
  472. package/dist/server/tests/unit/services/session-manager.test.d.ts +2 -0
  473. package/dist/server/tests/unit/services/session-manager.test.d.ts.map +1 -0
  474. package/dist/server/tests/unit/services/session-manager.test.js +481 -0
  475. package/dist/server/tests/unit/utils/config.test.d.ts +2 -0
  476. package/dist/server/tests/unit/utils/config.test.d.ts.map +1 -0
  477. package/dist/server/tests/unit/utils/config.test.js +634 -0
  478. package/dist/server/tests/unit/utils/json-utils.test.d.ts +2 -0
  479. package/dist/server/tests/unit/utils/json-utils.test.d.ts.map +1 -0
  480. package/dist/server/tests/unit/utils/json-utils.test.js +296 -0
  481. package/dist/server/tests/unit/utils/log-rotator.test.d.ts +2 -0
  482. package/dist/server/tests/unit/utils/log-rotator.test.d.ts.map +1 -0
  483. package/dist/server/tests/unit/utils/log-rotator.test.js +296 -0
  484. package/dist/server/tests/unit/utils/logger.test.d.ts +2 -0
  485. package/dist/server/tests/unit/utils/logger.test.d.ts.map +1 -0
  486. package/dist/server/tests/unit/utils/logger.test.js +462 -0
  487. package/dist/server/tests/unit/utils/mcp-error-handler.test.d.ts +2 -0
  488. package/dist/server/tests/unit/utils/mcp-error-handler.test.d.ts.map +1 -0
  489. package/dist/server/tests/unit/utils/mcp-error-handler.test.js +163 -0
  490. package/dist/server/tests/unit/utils/request-context.test.d.ts +2 -0
  491. package/dist/server/tests/unit/utils/request-context.test.d.ts.map +1 -0
  492. package/dist/server/tests/unit/utils/request-context.test.js +82 -0
  493. package/dist/server/vite.config.d.ts +3 -0
  494. package/dist/server/vite.config.d.ts.map +1 -0
  495. package/dist/server/vite.config.js +160 -0
  496. package/dist/server/vitest.config.d.ts +3 -0
  497. package/dist/server/vitest.config.d.ts.map +1 -0
  498. package/dist/server/vitest.config.js +53 -0
  499. package/package.json +113 -0
@@ -0,0 +1,324 @@
1
+ import { spawn } from 'child_process';
2
+ import { PassThrough } from 'stream';
3
+ import { logger } from '../logger.js';
4
+ // Re-implement ReadBuffer as it is not exported from SDK root
5
+ class ReadBuffer {
6
+ _buffer;
7
+ append(chunk) {
8
+ this._buffer = this._buffer ? Buffer.concat([this._buffer, chunk]) : chunk;
9
+ }
10
+ readMessage() {
11
+ if (!this._buffer) {
12
+ return null;
13
+ }
14
+ const index = this._buffer.indexOf('\n');
15
+ if (index === -1) {
16
+ return null;
17
+ }
18
+ const line = this._buffer.toString('utf8', 0, index).replace(/\r$/, '');
19
+ this._buffer = this._buffer.subarray(index + 1);
20
+ try {
21
+ return JSON.parse(line);
22
+ }
23
+ catch {
24
+ return JSON.parse(line);
25
+ }
26
+ }
27
+ clear() {
28
+ this._buffer = undefined;
29
+ }
30
+ }
31
+ /**
32
+ * A transport implementation for communicating with MCP (Model Context Protocol) servers
33
+ * via standard input/output streams. This transport spawns a child process and establishes
34
+ * bidirectional communication using stdin/stdout for JSON-RPC message exchange.
35
+ *
36
+ * The StdioTransport handles:
37
+ * - Cross-platform process spawning (including Windows batch file compatibility)
38
+ * - JSON-RPC message parsing and serialization
39
+ * - Proper process lifecycle management with graceful shutdown
40
+ * - Error handling and logging
41
+ * - Separate handling of stdout (for JSON-RPC) and stderr (for logging)
42
+ *
43
+ * This transport is primarily used for local MCP servers that communicate through
44
+ * standard I/O streams, such as those launched via npx, npm, or other package managers.
45
+ *
46
+ * @implements {Transport}
47
+ */
48
+ export class StdioTransport {
49
+ _process;
50
+ _readBuffer = new ReadBuffer();
51
+ _stderrStream = null;
52
+ _serverParams;
53
+ _serverName;
54
+ _serverId;
55
+ _logStorage;
56
+ /**
57
+ * Gets the process ID of the spawned child process.
58
+ *
59
+ * @returns {number | undefined} The PID of the child process, or undefined if not started
60
+ */
61
+ get pid() {
62
+ return this._process?.pid;
63
+ }
64
+ onclose;
65
+ onerror;
66
+ onmessage;
67
+ onstdout;
68
+ onstderr;
69
+ /**
70
+ * Creates a new StdioTransport instance.
71
+ *
72
+ * @param {StdioServerParameters} server - Configuration parameters for the child process
73
+ * @param {string} [serverName] - Optional name for the server used in logging
74
+ * @param {StdioTransportOptions} [options] - Additional options for the transport
75
+ */
76
+ constructor(server, serverName, options) {
77
+ this._serverParams = server;
78
+ this._serverName = serverName;
79
+ this._serverId = options?.serverId;
80
+ this._logStorage = options?.logStorage;
81
+ if (server.stderr === 'pipe') {
82
+ this._stderrStream = new PassThrough();
83
+ }
84
+ }
85
+ /**
86
+ * Starts the transport by spawning the child process and establishing communication channels.
87
+ *
88
+ * This method handles platform-specific considerations:
89
+ * - On Windows, it automatically wraps batch commands (like npx, npm, etc.) with cmd.exe /c
90
+ * - Sets up proper stdio configuration based on the server parameters
91
+ * - Configures event listeners for process lifecycle events
92
+ * - Establishes data flow for stdout and stderr handling
93
+ *
94
+ * @returns {Promise<void>} Resolves when the child process is successfully spawned
95
+ * @throws {Error} If the transport is already started
96
+ */
97
+ async start() {
98
+ if (this._process) {
99
+ throw new Error('StdioTransport already started!');
100
+ }
101
+ let command = this._serverParams.command;
102
+ let args = this._serverParams.args ?? [];
103
+ // Windows compatibility: Batch files (npx, npm, etc.) need cmd.exe /c to run with shell: false
104
+ if (process.platform === 'win32') {
105
+ const knownBatchCommands = ['npx', 'npm', 'pnpm', 'yarn', 'uvx'];
106
+ if (knownBatchCommands.includes(command) ||
107
+ command.endsWith('.cmd') ||
108
+ command.endsWith('.bat')) {
109
+ // Use cmd.exe /c to execute the batch file
110
+ args = ['/c', command, ...args];
111
+ command = 'cmd.exe';
112
+ }
113
+ }
114
+ return new Promise((resolve, reject) => {
115
+ this._process = spawn(command, args, {
116
+ env: { ...process.env, ...this._serverParams.env },
117
+ stdio: [
118
+ 'pipe',
119
+ 'pipe',
120
+ this._serverParams.stderr === 'pipe' ? 'pipe' : this._serverParams.stderr || 'inherit'
121
+ ],
122
+ shell: false,
123
+ windowsHide: true, // Force hide window on Windows
124
+ cwd: this._serverParams.cwd
125
+ });
126
+ this._process.on('error', (error) => {
127
+ reject(error);
128
+ this.onerror?.(error);
129
+ });
130
+ this._process.on('spawn', () => {
131
+ resolve();
132
+ });
133
+ this._process.on('close', () => {
134
+ this._process = undefined;
135
+ this.onclose?.();
136
+ });
137
+ this._process.stdin?.on('error', (error) => {
138
+ this.onerror?.(error);
139
+ });
140
+ this._process.stdout?.on('data', (chunk) => {
141
+ const dataStr = chunk.toString('utf8');
142
+ // Forward raw stdout data
143
+ this.onstdout?.(dataStr);
144
+ // Don't log raw JSON-RPC communication to avoid log noise
145
+ // Only need to view raw communication during development debugging
146
+ // Parse JSON-RPC messages
147
+ this._readBuffer.append(chunk);
148
+ this.processReadBuffer();
149
+ });
150
+ this._process.stdout?.on('error', (error) => {
151
+ this.onerror?.(error);
152
+ });
153
+ /**
154
+ * Handles stderr data with common processing logic.
155
+ *
156
+ * @param chunk - The stderr data chunk
157
+ * @param writeToStream - Whether to write data to the PassThrough stream
158
+ */
159
+ const handleStderrData = (chunk, writeToStream = false) => {
160
+ const dataStr = chunk.toString('utf8');
161
+ // Forward raw stderr data
162
+ this.onstderr?.(dataStr);
163
+ const trimmedData = dataStr.trim();
164
+ let logLevel = 'info';
165
+ // Identify log levels by keywords: only explicit error/warning markers
166
+ // use corresponding levels, everything else defaults to info
167
+ const lowerData = trimmedData.toLowerCase();
168
+ // Error level keywords
169
+ if (lowerData.includes('error') ||
170
+ lowerData.includes('err') ||
171
+ lowerData.includes('exception') ||
172
+ lowerData.includes('fatal') ||
173
+ lowerData.includes('critical')) {
174
+ logLevel = 'error';
175
+ }
176
+ // Warn level keywords
177
+ else if (lowerData.includes('warn') ||
178
+ lowerData.includes('wrn') ||
179
+ lowerData.includes('warning') ||
180
+ lowerData.includes('deprecation') ||
181
+ lowerData.includes('deprecated')) {
182
+ logLevel = 'warn';
183
+ }
184
+ if (this._serverName) {
185
+ logger.serverLog(logLevel, this._serverName, trimmedData, {
186
+ pid: this._process?.pid
187
+ });
188
+ }
189
+ else {
190
+ logger.serverLog(logLevel, 'Unknown Server', trimmedData, {
191
+ pid: this._process?.pid
192
+ });
193
+ }
194
+ // Store in logStorage for frontend display if available
195
+ if (this._logStorage && this._serverId) {
196
+ this._logStorage.append(this._serverId, logLevel, `[${this._serverName || 'Unknown Server'}] [STDERR] ${trimmedData}`);
197
+ }
198
+ // Optionally write to PassThrough stream if configured
199
+ if (writeToStream) {
200
+ this._stderrStream?.write(chunk);
201
+ }
202
+ };
203
+ if (this._stderrStream && this._process.stderr) {
204
+ this._process.stderr.on('data', (chunk) => {
205
+ handleStderrData(chunk, true); // Write to PassThrough stream for piped stderr
206
+ });
207
+ }
208
+ else if (this._process.stderr) {
209
+ // If stderr is not in pipe mode, listen directly
210
+ this._process.stderr.on('data', (chunk) => {
211
+ handleStderrData(chunk, false); // No PassThrough stream for non-piped stderr
212
+ });
213
+ }
214
+ });
215
+ }
216
+ /**
217
+ * Gets the stderr stream for the child process.
218
+ *
219
+ * Returns a PassThrough stream if stderr is configured as 'pipe', otherwise returns
220
+ * the actual stderr stream from the child process, or null if no stderr is available.
221
+ *
222
+ * @returns {PassThrough | NodeJS.ReadableStream | null} The stderr stream or null
223
+ */
224
+ get stderr() {
225
+ return this._stderrStream ?? this._process?.stderr ?? null;
226
+ }
227
+ /**
228
+ * Processes the internal read buffer to extract and dispatch JSON-RPC messages.
229
+ *
230
+ * This method continuously reads complete JSON-RPC messages from the buffer
231
+ * and dispatches them to the onmessage callback. It handles partial messages
232
+ * by leaving incomplete data in the buffer for future processing.
233
+ *
234
+ * The method uses a while loop to process all available complete messages
235
+ * in a single call, ensuring efficient message handling without blocking.
236
+ *
237
+ * @private
238
+ */
239
+ processReadBuffer() {
240
+ while (true) {
241
+ try {
242
+ const message = this._readBuffer.readMessage();
243
+ if (message === null) {
244
+ break;
245
+ }
246
+ this.onmessage?.(message);
247
+ }
248
+ catch (error) {
249
+ this.onerror?.(error);
250
+ }
251
+ }
252
+ }
253
+ /**
254
+ * Closes the transport by gracefully terminating the child process.
255
+ *
256
+ * This method implements a graceful shutdown sequence:
257
+ * 1. Sends SIGTERM to allow the child process to clean up
258
+ * 2. Waits up to 5 seconds for graceful termination
259
+ * 3. Forces termination with SIGKILL if the process doesn't exit
260
+ * 4. Cleans up internal state and resolves the promise
261
+ *
262
+ * The method ensures proper cleanup of the read buffer and handles
263
+ * any errors that occur during the shutdown process.
264
+ *
265
+ * @returns {Promise<void>} Resolves when the transport is fully closed
266
+ */
267
+ async close() {
268
+ if (this._process) {
269
+ return new Promise((resolve) => {
270
+ // Listen for child process exit events
271
+ const cleanup = () => {
272
+ this._process = undefined;
273
+ this._readBuffer.clear();
274
+ resolve();
275
+ };
276
+ if (this._process) {
277
+ this._process.once('close', cleanup);
278
+ this._process.once('exit', cleanup);
279
+ // Send SIGTERM signal to give child process a chance to shut down gracefully
280
+ try {
281
+ this._process.kill('SIGTERM');
282
+ // Set timeout protection to force kill if child process doesn't exit within 5 seconds
283
+ const timeout = setTimeout(() => {
284
+ if (this._process) {
285
+ logger.warn('Child process did not exit gracefully, force killing...');
286
+ this._process.kill('SIGKILL');
287
+ }
288
+ }, 5000);
289
+ // Ensure timeout timer is cleared after process exits
290
+ this._process.once('close', () => clearTimeout(timeout));
291
+ this._process.once('exit', () => clearTimeout(timeout));
292
+ }
293
+ catch (error) {
294
+ logger.error('Error closing stdio transport:', error);
295
+ cleanup();
296
+ }
297
+ }
298
+ else {
299
+ // Process is already undefined, just resolve
300
+ resolve();
301
+ }
302
+ });
303
+ }
304
+ this._readBuffer.clear();
305
+ }
306
+ /**
307
+ * Sends a JSON-RPC message to the child process via stdin.
308
+ *
309
+ * This method serializes the message to JSON, appends a newline character,
310
+ * and writes it to the child process's stdin stream. It validates that
311
+ * the transport is connected before attempting to send the message.
312
+ *
313
+ * @param {JSONRPCMessage} message - The JSON-RPC message to send
314
+ * @returns {Promise<void>} Resolves when the message is written to stdin
315
+ * @throws {Error} If the transport is not connected (no active child process)
316
+ */
317
+ async send(message) {
318
+ if (!this._process?.stdin) {
319
+ throw new Error('Not connected');
320
+ }
321
+ const json = JSON.stringify(message) + '\n';
322
+ this._process.stdin.write(json);
323
+ }
324
+ }
@@ -0,0 +1,146 @@
1
+ import { JSONRPCMessage } from '@modelcontextprotocol/sdk/types.js';
2
+ import { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
3
+ /**
4
+ * Streamable HTTP Transport implementation for MCP (Model Context Protocol)
5
+ *
6
+ * This transport enables communication with MCP servers that support the Streamable HTTP protocol,
7
+ * which provides bidirectional communication over HTTP using a combination of POST requests for
8
+ * sending messages and Server-Sent Events (SSE) for receiving streamed responses.
9
+ *
10
+ * The Streamable HTTP protocol is particularly useful for:
11
+ * - Remote MCP servers accessible via HTTP/HTTPS
12
+ * - Scenarios requiring streaming responses from tools
13
+ * - Environments where WebSocket connections are restricted
14
+ * - Integration with existing HTTP infrastructure
15
+ *
16
+ * Protocol Details:
17
+ * - **Outbound Messages**: Sent via HTTP POST requests with JSON-RPC 2.0 formatted payloads
18
+ * - **Inbound Messages**: Received via HTTP GET requests using Server-Sent Events (SSE) for real-time streaming
19
+ * - **Headers**: Custom headers can be provided for authentication, authorization, or other HTTP requirements
20
+ * - **Timeout**: Configurable request timeout to prevent hanging connections
21
+ *
22
+ * This transport wraps the official MCP SDK's StreamableHTTPClientTransport and provides
23
+ * consistent error handling, logging, and lifecycle management integrated with the MCP Hub Lite system.
24
+ *
25
+ * @implements {Transport}
26
+ * @see {@link https://modelcontextprotocol.io/transports/streamable-http} - Official MCP Streamable HTTP specification
27
+ */
28
+ export declare class StreamableHttpTransport implements Transport {
29
+ private url;
30
+ private headers;
31
+ private timeout;
32
+ /**
33
+ * Internal reference to the underlying MCP SDK transport instance
34
+ * @private
35
+ */
36
+ private transport;
37
+ /**
38
+ * Flag indicating whether the transport is in the process of closing
39
+ * Prevents sending messages during shutdown and handles unexpected closures
40
+ * @private
41
+ */
42
+ private isClosing;
43
+ /**
44
+ * Event handler called when a JSON-RPC message is received from the server
45
+ * @public
46
+ */
47
+ onmessage?: (message: JSONRPCMessage) => void;
48
+ /**
49
+ * Event handler called when an error occurs in the transport connection
50
+ * @public
51
+ */
52
+ onerror?: (error: Error) => void;
53
+ /**
54
+ * Event handler called when the transport connection is closed
55
+ * @public
56
+ */
57
+ onclose?: () => void;
58
+ /**
59
+ * Creates a new Streamable HTTP Transport instance
60
+ *
61
+ * @param url - The base URL of the MCP server endpoint (e.g., "https://api.example.com/mcp")
62
+ * @param headers - Optional HTTP headers to include with all requests (default: {})
63
+ * Commonly used for authentication tokens, API keys, or custom headers
64
+ * @param timeout - Request timeout in milliseconds (default: 30000 = 30 seconds)
65
+ * Controls how long to wait for HTTP responses before timing out
66
+ */
67
+ constructor(url: string, headers?: Record<string, string>, timeout?: number);
68
+ /**
69
+ * Initializes and starts the Streamable HTTP transport connection
70
+ *
71
+ * This method establishes the connection to the MCP server by:
72
+ * 1. Validating that the transport hasn't already been started
73
+ * 2. Creating a new StreamableHTTPClientTransport instance from the MCP SDK
74
+ * 3. Configuring HTTP request options including headers and timeout
75
+ * 4. Setting up event handlers for message, error, and close events
76
+ * 5. Starting the underlying transport connection
77
+ *
78
+ * The transport will automatically handle:
79
+ * - Message routing to the onmessage handler
80
+ * - Error logging and propagation to the onerror handler
81
+ * - Connection lifecycle management with proper cleanup
82
+ *
83
+ * @returns {Promise<void>} Resolves when the transport is successfully started
84
+ * @throws {Error} If the transport is already started or if connection fails
85
+ *
86
+ * @example
87
+ * ```typescript
88
+ * const transport = new StreamableHttpTransport('https://api.example.com/mcp', {
89
+ * 'Authorization': 'Bearer your-token'
90
+ * });
91
+ * await transport.start();
92
+ * ```
93
+ */
94
+ start(): Promise<void>;
95
+ /**
96
+ * Gracefully closes the Streamable HTTP transport connection
97
+ *
98
+ * This method performs a clean shutdown of the transport by:
99
+ * 1. Setting the closing flag to prevent new message sends
100
+ * 2. Closing the underlying MCP SDK transport connection
101
+ * 3. Cleaning up the internal transport reference
102
+ * 4. Triggering the onclose event handler
103
+ *
104
+ * The method is idempotent and can be called multiple times safely.
105
+ * It ensures proper resource cleanup and prevents memory leaks.
106
+ *
107
+ * @returns {Promise<void>} Resolves when the transport is successfully closed
108
+ *
109
+ * @example
110
+ * ```typescript
111
+ * await transport.close();
112
+ * // Transport is now closed and cannot send/receive messages
113
+ * ```
114
+ */
115
+ close(): Promise<void>;
116
+ /**
117
+ * Sends a JSON-RPC message to the connected MCP server
118
+ *
119
+ * This method transmits the provided JSON-RPC message to the server using the
120
+ * Streamable HTTP protocol. The message is sent as an HTTP POST request with
121
+ * the appropriate Content-Type header and any configured custom headers.
122
+ *
123
+ * The method includes comprehensive validation and error handling:
124
+ * - Prevents sending messages when the transport is closing
125
+ * - Ensures the transport has been properly initialized
126
+ * - Logs transmission errors for debugging purposes
127
+ * - Re-throws errors to allow caller error handling
128
+ *
129
+ * @param message - The JSON-RPC 2.0 formatted message to send to the server
130
+ * @returns {Promise<void>} Resolves when the message is successfully sent
131
+ * @throws {Error} If the transport is closing, not started, or if sending fails
132
+ *
133
+ * @example
134
+ * ```typescript
135
+ * const request: JSONRPCMessage = {
136
+ * jsonrpc: '2.0',
137
+ * id: 1,
138
+ * method: 'textDocument/completion',
139
+ * params: { /* completion parameters *\/ }
140
+ * };
141
+ * await transport.send(request);
142
+ * ```
143
+ */
144
+ send(message: JSONRPCMessage): Promise<void>;
145
+ }
146
+ //# sourceMappingURL=streamable-http-transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streamable-http-transport.d.ts","sourceRoot":"","sources":["../../../../../src/utils/transports/streamable-http-transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAK1E;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,uBAAwB,YAAW,SAAS;IA0CrD,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,OAAO;IA3CjB;;;OAGG;IACH,OAAO,CAAC,SAAS,CAA8C;IAE/D;;;;OAIG;IACH,OAAO,CAAC,SAAS,CAAS;IAE1B;;;OAGG;IACI,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;IAErD;;;OAGG;IACI,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAExC;;;OAGG;IACI,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAE5B;;;;;;;;OAQG;gBAEO,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,EACpC,OAAO,GAAE,MAAc;IAGjC;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAwD5B;;;;;;;;;;;;;;;;;;;OAmBG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACG,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAoBnD"}
@@ -0,0 +1,212 @@
1
+ import { logger, LOG_MODULES } from '../logger.js';
2
+ import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
3
+ import { URL } from 'url';
4
+ /**
5
+ * Streamable HTTP Transport implementation for MCP (Model Context Protocol)
6
+ *
7
+ * This transport enables communication with MCP servers that support the Streamable HTTP protocol,
8
+ * which provides bidirectional communication over HTTP using a combination of POST requests for
9
+ * sending messages and Server-Sent Events (SSE) for receiving streamed responses.
10
+ *
11
+ * The Streamable HTTP protocol is particularly useful for:
12
+ * - Remote MCP servers accessible via HTTP/HTTPS
13
+ * - Scenarios requiring streaming responses from tools
14
+ * - Environments where WebSocket connections are restricted
15
+ * - Integration with existing HTTP infrastructure
16
+ *
17
+ * Protocol Details:
18
+ * - **Outbound Messages**: Sent via HTTP POST requests with JSON-RPC 2.0 formatted payloads
19
+ * - **Inbound Messages**: Received via HTTP GET requests using Server-Sent Events (SSE) for real-time streaming
20
+ * - **Headers**: Custom headers can be provided for authentication, authorization, or other HTTP requirements
21
+ * - **Timeout**: Configurable request timeout to prevent hanging connections
22
+ *
23
+ * This transport wraps the official MCP SDK's StreamableHTTPClientTransport and provides
24
+ * consistent error handling, logging, and lifecycle management integrated with the MCP Hub Lite system.
25
+ *
26
+ * @implements {Transport}
27
+ * @see {@link https://modelcontextprotocol.io/transports/streamable-http} - Official MCP Streamable HTTP specification
28
+ */
29
+ export class StreamableHttpTransport {
30
+ url;
31
+ headers;
32
+ timeout;
33
+ /**
34
+ * Internal reference to the underlying MCP SDK transport instance
35
+ * @private
36
+ */
37
+ transport = null;
38
+ /**
39
+ * Flag indicating whether the transport is in the process of closing
40
+ * Prevents sending messages during shutdown and handles unexpected closures
41
+ * @private
42
+ */
43
+ isClosing = false;
44
+ /**
45
+ * Event handler called when a JSON-RPC message is received from the server
46
+ * @public
47
+ */
48
+ onmessage;
49
+ /**
50
+ * Event handler called when an error occurs in the transport connection
51
+ * @public
52
+ */
53
+ onerror;
54
+ /**
55
+ * Event handler called when the transport connection is closed
56
+ * @public
57
+ */
58
+ onclose;
59
+ /**
60
+ * Creates a new Streamable HTTP Transport instance
61
+ *
62
+ * @param url - The base URL of the MCP server endpoint (e.g., "https://api.example.com/mcp")
63
+ * @param headers - Optional HTTP headers to include with all requests (default: {})
64
+ * Commonly used for authentication tokens, API keys, or custom headers
65
+ * @param timeout - Request timeout in milliseconds (default: 30000 = 30 seconds)
66
+ * Controls how long to wait for HTTP responses before timing out
67
+ */
68
+ constructor(url, headers = {}, timeout = 30000) {
69
+ this.url = url;
70
+ this.headers = headers;
71
+ this.timeout = timeout;
72
+ }
73
+ /**
74
+ * Initializes and starts the Streamable HTTP transport connection
75
+ *
76
+ * This method establishes the connection to the MCP server by:
77
+ * 1. Validating that the transport hasn't already been started
78
+ * 2. Creating a new StreamableHTTPClientTransport instance from the MCP SDK
79
+ * 3. Configuring HTTP request options including headers and timeout
80
+ * 4. Setting up event handlers for message, error, and close events
81
+ * 5. Starting the underlying transport connection
82
+ *
83
+ * The transport will automatically handle:
84
+ * - Message routing to the onmessage handler
85
+ * - Error logging and propagation to the onerror handler
86
+ * - Connection lifecycle management with proper cleanup
87
+ *
88
+ * @returns {Promise<void>} Resolves when the transport is successfully started
89
+ * @throws {Error} If the transport is already started or if connection fails
90
+ *
91
+ * @example
92
+ * ```typescript
93
+ * const transport = new StreamableHttpTransport('https://api.example.com/mcp', {
94
+ * 'Authorization': 'Bearer your-token'
95
+ * });
96
+ * await transport.start();
97
+ * ```
98
+ */
99
+ async start() {
100
+ if (this.transport) {
101
+ throw new Error('Streamable HTTP Transport already started!');
102
+ }
103
+ this.isClosing = false;
104
+ try {
105
+ const url = new URL(this.url);
106
+ const requestInit = {
107
+ headers: {
108
+ 'Content-Type': 'application/json',
109
+ ...this.headers
110
+ },
111
+ signal: AbortSignal.timeout(this.timeout)
112
+ };
113
+ this.transport = new StreamableHTTPClientTransport(url, {
114
+ requestInit
115
+ });
116
+ // Set up event handlers
117
+ this.transport.onmessage = (message) => {
118
+ this.onmessage?.(message);
119
+ };
120
+ this.transport.onerror = (error) => {
121
+ logger.error('Streamable HTTP transport error:', error, LOG_MODULES.HTTP_TRANSPORT);
122
+ this.onerror?.(error);
123
+ };
124
+ this.transport.onclose = () => {
125
+ logger.info('Streamable HTTP transport closed', LOG_MODULES.HTTP_TRANSPORT);
126
+ if (!this.isClosing) {
127
+ // Unexpected close, trigger error
128
+ const error = new Error('Streamable HTTP transport closed unexpectedly');
129
+ this.onerror?.(error);
130
+ }
131
+ this.onclose?.();
132
+ };
133
+ await this.transport.start();
134
+ logger.info(`Streamable HTTP transport initialized for ${this.url}`, LOG_MODULES.HTTP_TRANSPORT);
135
+ }
136
+ catch (error) {
137
+ logger.error('Failed to create Streamable HTTP transport:', error, LOG_MODULES.HTTP_TRANSPORT);
138
+ throw error;
139
+ }
140
+ }
141
+ /**
142
+ * Gracefully closes the Streamable HTTP transport connection
143
+ *
144
+ * This method performs a clean shutdown of the transport by:
145
+ * 1. Setting the closing flag to prevent new message sends
146
+ * 2. Closing the underlying MCP SDK transport connection
147
+ * 3. Cleaning up the internal transport reference
148
+ * 4. Triggering the onclose event handler
149
+ *
150
+ * The method is idempotent and can be called multiple times safely.
151
+ * It ensures proper resource cleanup and prevents memory leaks.
152
+ *
153
+ * @returns {Promise<void>} Resolves when the transport is successfully closed
154
+ *
155
+ * @example
156
+ * ```typescript
157
+ * await transport.close();
158
+ * // Transport is now closed and cannot send/receive messages
159
+ * ```
160
+ */
161
+ async close() {
162
+ this.isClosing = true;
163
+ if (this.transport) {
164
+ await this.transport.close();
165
+ this.transport = null;
166
+ }
167
+ this.onclose?.();
168
+ }
169
+ /**
170
+ * Sends a JSON-RPC message to the connected MCP server
171
+ *
172
+ * This method transmits the provided JSON-RPC message to the server using the
173
+ * Streamable HTTP protocol. The message is sent as an HTTP POST request with
174
+ * the appropriate Content-Type header and any configured custom headers.
175
+ *
176
+ * The method includes comprehensive validation and error handling:
177
+ * - Prevents sending messages when the transport is closing
178
+ * - Ensures the transport has been properly initialized
179
+ * - Logs transmission errors for debugging purposes
180
+ * - Re-throws errors to allow caller error handling
181
+ *
182
+ * @param message - The JSON-RPC 2.0 formatted message to send to the server
183
+ * @returns {Promise<void>} Resolves when the message is successfully sent
184
+ * @throws {Error} If the transport is closing, not started, or if sending fails
185
+ *
186
+ * @example
187
+ * ```typescript
188
+ * const request: JSONRPCMessage = {
189
+ * jsonrpc: '2.0',
190
+ * id: 1,
191
+ * method: 'textDocument/completion',
192
+ * params: { /* completion parameters *\/ }
193
+ * };
194
+ * await transport.send(request);
195
+ * ```
196
+ */
197
+ async send(message) {
198
+ if (this.isClosing) {
199
+ throw new Error('Transport is closing');
200
+ }
201
+ if (!this.transport) {
202
+ throw new Error('Streamable HTTP transport not started');
203
+ }
204
+ try {
205
+ await this.transport.send(message);
206
+ }
207
+ catch (error) {
208
+ logger.error('Failed to send message via Streamable HTTP:', error, LOG_MODULES.HTTP_TRANSPORT);
209
+ throw error;
210
+ }
211
+ }
212
+ }