@loop_ouroboros/mcp-hub-lite 1.0.1 → 1.1.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 (374) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/dist/client/assets/{HomeView-Cr1jX73N.js → HomeView-Bu2joUvW.js} +1 -1
  3. package/dist/client/assets/ResourceDetailView-BvrhDCD1.js +1 -0
  4. package/dist/client/assets/ResourceDetailView-DUJZbegl.css +1 -0
  5. package/dist/client/assets/ResourcesView-Cc8RHtia.css +1 -0
  6. package/dist/client/assets/ResourcesView-LjqioF_s.js +1 -0
  7. package/dist/client/assets/ServerDashboard-BfLeFDGw.css +1 -0
  8. package/dist/client/assets/ServerDashboard-FhHJFvUi.js +1 -0
  9. package/dist/client/assets/ServerDetail-BKV-M4qT.js +2 -0
  10. package/dist/client/assets/ServerDetail-CtnNKJGx.css +1 -0
  11. package/dist/client/assets/{ServerListView-Bws09jNR.css → ServerListView-B-bPljsO.css} +1 -1
  12. package/dist/client/assets/ServerListView-BXgtDyt3.js +36 -0
  13. package/dist/client/assets/ServerStatusTags.vue_vue_type_script_setup_true_lang-D-ooYNdN.js +1 -0
  14. package/dist/client/assets/SettingsView-CMFG91Z4.js +1 -0
  15. package/dist/client/assets/SettingsView-GkBOKL0V.css +1 -0
  16. package/dist/client/assets/ToolCallDialog-Bf4Xe4gH.js +1 -0
  17. package/dist/client/assets/ToolsView-DFpha1z0.js +1 -0
  18. package/dist/client/assets/_baseClone-Bp9Rjwd7.js +1 -0
  19. package/dist/client/assets/el-form-item-B4LbJ6OO.css +1 -0
  20. package/dist/client/assets/el-form-item-DdSUWYsl.js +12 -0
  21. package/dist/client/assets/el-input-99gMrutP.js +1 -0
  22. package/dist/client/assets/el-input-BH4BZKnG.css +1 -0
  23. package/dist/client/assets/{el-loading-Csv24uBk.js → el-loading-CIQ5pD5u.js} +1 -1
  24. package/dist/client/assets/el-overlay-BVM6msGX.js +1 -0
  25. package/dist/client/assets/{el-select-C0U_l4IZ.css → el-overlay-CBvdpA69.css} +1 -1
  26. package/dist/client/assets/{ResourceDetailView-BdOaL_-o.css → el-radio-group-B0bauIRR.css} +1 -1
  27. package/dist/client/assets/el-radio-group-DhXWy7ry.js +1 -0
  28. package/dist/client/assets/el-skeleton-item-BLY1jEuR.css +1 -0
  29. package/dist/client/assets/el-skeleton-item-DJz-Us12.js +1 -0
  30. package/dist/client/assets/el-switch-BBrS-_6y.css +1 -0
  31. package/dist/client/assets/el-switch-Bu8AQ5uM.js +1 -0
  32. package/dist/client/assets/el-tab-pane-BnGMaV56.js +1 -0
  33. package/dist/client/assets/el-table-column-BMWOaLS_.js +1 -0
  34. package/dist/client/assets/el-table-column-BdvRS9Y2.css +1 -0
  35. package/dist/client/assets/index-C2V-ZGji.js +1 -0
  36. package/dist/client/assets/{index-BsDWtoIl.css → index-DpH6ZSbs.css} +1 -1
  37. package/dist/client/assets/index-vhkqgpmN.js +2 -0
  38. package/dist/client/assets/omit-CqPQN3XP.js +1 -0
  39. package/dist/client/assets/{raf-DDfJOMYh.js → raf-C2wXzaVU.js} +1 -1
  40. package/dist/client/assets/{vue-vendor-6ny5zj9i.js → vue-vendor-BLHLXXJK.js} +1 -1
  41. package/dist/client/index.html +3 -3
  42. package/dist/server/shared/models/resource.model.d.ts +2 -1
  43. package/dist/server/shared/models/resource.model.d.ts.map +1 -1
  44. package/dist/server/shared/models/server.model.d.ts +363 -5
  45. package/dist/server/shared/models/server.model.d.ts.map +1 -1
  46. package/dist/server/shared/models/server.model.js +220 -1
  47. package/dist/server/shared/models/session.model.d.ts +2 -56
  48. package/dist/server/shared/models/session.model.d.ts.map +1 -1
  49. package/dist/server/shared/models/session.model.js +2 -55
  50. package/dist/server/shared/models/tool.model.d.ts +4 -2
  51. package/dist/server/shared/models/tool.model.d.ts.map +1 -1
  52. package/dist/server/shared/types/client.types.d.ts +4 -32
  53. package/dist/server/shared/types/client.types.d.ts.map +1 -1
  54. package/dist/server/shared/types/client.types.js +3 -2
  55. package/dist/server/shared/types/index.d.ts +3 -3
  56. package/dist/server/shared/types/index.d.ts.map +1 -1
  57. package/dist/server/shared/types/index.js +3 -3
  58. package/dist/server/shared/types/session-context.types.d.ts +35 -0
  59. package/dist/server/shared/types/session-context.types.d.ts.map +1 -0
  60. package/dist/server/shared/types/session-context.types.js +5 -0
  61. package/dist/server/shared/types/websocket.types.d.ts +17 -10
  62. package/dist/server/shared/types/websocket.types.d.ts.map +1 -1
  63. package/dist/server/src/api/mcp/debug-response-wrapper.d.ts.map +1 -1
  64. package/dist/server/src/api/mcp/debug-response-wrapper.js +26 -1
  65. package/dist/server/src/api/mcp/gateway.d.ts +1 -3
  66. package/dist/server/src/api/mcp/gateway.d.ts.map +1 -1
  67. package/dist/server/src/api/mcp/gateway.js +34 -61
  68. package/dist/server/src/api/mcp/session-context-extractor.d.ts +5 -5
  69. package/dist/server/src/api/mcp/session-context-extractor.d.ts.map +1 -1
  70. package/dist/server/src/api/mcp/session-context-extractor.js +15 -39
  71. package/dist/server/src/api/web/clients.js +2 -2
  72. package/dist/server/src/api/web/hub-tools.d.ts +2 -2
  73. package/dist/server/src/api/web/hub-tools.d.ts.map +1 -1
  74. package/dist/server/src/api/web/hub-tools.js +3 -54
  75. package/dist/server/src/api/web/mcp-status.d.ts +1 -1
  76. package/dist/server/src/api/web/mcp-status.d.ts.map +1 -1
  77. package/dist/server/src/api/web/mcp-status.js +71 -30
  78. package/dist/server/src/api/web/resources.d.ts.map +1 -1
  79. package/dist/server/src/api/web/resources.js +28 -22
  80. package/dist/server/src/api/web/search.d.ts +2 -16
  81. package/dist/server/src/api/web/search.d.ts.map +1 -1
  82. package/dist/server/src/api/web/search.js +24 -45
  83. package/dist/server/src/api/web/servers.d.ts +3 -3
  84. package/dist/server/src/api/web/servers.d.ts.map +1 -1
  85. package/dist/server/src/api/web/servers.js +70 -25
  86. package/dist/server/src/api/web/sessions.js +1 -1
  87. package/dist/server/src/api/ws/ws-handler.d.ts.map +1 -1
  88. package/dist/server/src/api/ws/ws-handler.js +4 -2
  89. package/dist/server/src/app.d.ts.map +1 -1
  90. package/dist/server/src/app.js +0 -4
  91. package/dist/server/src/cli/commands/list.js +2 -2
  92. package/dist/server/src/cli/commands/status.d.ts.map +1 -1
  93. package/dist/server/src/cli/commands/status.js +41 -30
  94. package/dist/server/src/cli/index.d.ts.map +1 -1
  95. package/dist/server/src/cli/index.js +2 -1
  96. package/dist/server/src/cli/server.d.ts +11 -2
  97. package/dist/server/src/cli/server.d.ts.map +1 -1
  98. package/dist/server/src/config/config-change-logger.d.ts +22 -0
  99. package/dist/server/src/config/config-change-logger.d.ts.map +1 -1
  100. package/dist/server/src/config/config-change-logger.js +135 -11
  101. package/dist/server/src/config/config-loader.d.ts +6 -5
  102. package/dist/server/src/config/config-loader.d.ts.map +1 -1
  103. package/dist/server/src/config/config-loader.js +54 -16
  104. package/dist/server/src/config/config-manager.d.ts +51 -43
  105. package/dist/server/src/config/config-manager.d.ts.map +1 -1
  106. package/dist/server/src/config/config-manager.js +84 -66
  107. package/dist/server/src/config/config-migrator.d.ts +82 -0
  108. package/dist/server/src/config/config-migrator.d.ts.map +1 -0
  109. package/dist/server/src/config/config-migrator.js +348 -0
  110. package/dist/server/src/config/config-saver.d.ts +2 -0
  111. package/dist/server/src/config/config-saver.d.ts.map +1 -1
  112. package/dist/server/src/config/config-saver.js +8 -2
  113. package/dist/server/src/config/config.schema.d.ts +10 -102
  114. package/dist/server/src/config/config.schema.d.ts.map +1 -1
  115. package/dist/server/src/config/config.schema.js +15 -98
  116. package/dist/server/src/config/path-validator.d.ts +27 -0
  117. package/dist/server/src/config/path-validator.d.ts.map +1 -0
  118. package/dist/server/src/config/path-validator.js +53 -0
  119. package/dist/server/src/config/server-config-manager.d.ts +37 -31
  120. package/dist/server/src/config/server-config-manager.d.ts.map +1 -1
  121. package/dist/server/src/config/server-config-manager.js +222 -66
  122. package/dist/server/src/config/type-converter.d.ts.map +1 -1
  123. package/dist/server/src/config/type-converter.js +3 -2
  124. package/dist/server/src/index.js +1 -1
  125. package/dist/server/src/models/event.model.d.ts +17 -10
  126. package/dist/server/src/models/event.model.d.ts.map +1 -1
  127. package/dist/server/src/models/server.model.d.ts +17 -3
  128. package/dist/server/src/models/server.model.d.ts.map +1 -1
  129. package/dist/server/src/models/server.model.js +2 -1
  130. package/dist/server/src/models/system-tools.constants.d.ts +10 -27
  131. package/dist/server/src/models/system-tools.constants.d.ts.map +1 -1
  132. package/dist/server/src/models/system-tools.constants.js +4 -8
  133. package/dist/server/src/pid/manager.d.ts.map +1 -1
  134. package/dist/server/src/pid/manager.js +2 -1
  135. package/dist/server/src/server/dev-server.js +34 -20
  136. package/dist/server/src/server/runner.d.ts.map +1 -1
  137. package/dist/server/src/server/runner.js +41 -26
  138. package/dist/server/src/services/client-tracker.service.d.ts +3 -128
  139. package/dist/server/src/services/client-tracker.service.d.ts.map +1 -1
  140. package/dist/server/src/services/client-tracker.service.js +4 -200
  141. package/dist/server/src/services/connection/connection-manager.d.ts +85 -103
  142. package/dist/server/src/services/connection/connection-manager.d.ts.map +1 -1
  143. package/dist/server/src/services/connection/connection-manager.js +286 -241
  144. package/dist/server/src/services/connection/tool-cache.d.ts +27 -25
  145. package/dist/server/src/services/connection/tool-cache.d.ts.map +1 -1
  146. package/dist/server/src/services/connection/tool-cache.js +50 -55
  147. package/dist/server/src/services/gateway/gateway.service.d.ts +2 -0
  148. package/dist/server/src/services/gateway/gateway.service.d.ts.map +1 -1
  149. package/dist/server/src/services/gateway/gateway.service.js +15 -19
  150. package/dist/server/src/services/gateway/global-transport.d.ts +10 -0
  151. package/dist/server/src/services/gateway/global-transport.d.ts.map +1 -0
  152. package/dist/server/src/services/gateway/global-transport.js +42 -0
  153. package/dist/server/src/services/gateway/request-handlers/call-tool-handler.d.ts.map +1 -1
  154. package/dist/server/src/services/gateway/request-handlers/call-tool-handler.js +67 -65
  155. package/dist/server/src/services/gateway/request-handlers/index.d.ts +1 -1
  156. package/dist/server/src/services/gateway/request-handlers/index.d.ts.map +1 -1
  157. package/dist/server/src/services/gateway/request-handlers/index.js +1 -1
  158. package/dist/server/src/services/gateway/request-handlers/initialize-handler.d.ts +1 -4
  159. package/dist/server/src/services/gateway/request-handlers/initialize-handler.d.ts.map +1 -1
  160. package/dist/server/src/services/gateway/request-handlers/initialize-handler.js +16 -55
  161. package/dist/server/src/services/gateway/request-handlers/initialize.constants.d.ts +35 -0
  162. package/dist/server/src/services/gateway/request-handlers/initialize.constants.d.ts.map +1 -0
  163. package/dist/server/src/services/gateway/request-handlers/initialize.constants.js +44 -0
  164. package/dist/server/src/services/gateway/request-handlers/resources-handler.d.ts.map +1 -1
  165. package/dist/server/src/services/gateway/request-handlers/resources-handler.js +5 -4
  166. package/dist/server/src/services/gateway/request-handlers/system-tools-handler.d.ts.map +1 -1
  167. package/dist/server/src/services/gateway/request-handlers/system-tools-handler.js +32 -77
  168. package/dist/server/src/services/gateway/request-handlers/tools-handler.d.ts.map +1 -1
  169. package/dist/server/src/services/gateway/request-handlers/tools-handler.js +4 -3
  170. package/dist/server/src/services/gateway/tool-list-generator.d.ts.map +1 -1
  171. package/dist/server/src/services/gateway/tool-list-generator.js +37 -16
  172. package/dist/server/src/services/gateway/types.d.ts +2 -1
  173. package/dist/server/src/services/gateway/types.d.ts.map +1 -1
  174. package/dist/server/src/services/hub-manager.service.d.ts +32 -238
  175. package/dist/server/src/services/hub-manager.service.d.ts.map +1 -1
  176. package/dist/server/src/services/hub-manager.service.js +89 -267
  177. package/dist/server/src/services/hub-tools/index.d.ts +1 -3
  178. package/dist/server/src/services/hub-tools/index.d.ts.map +1 -1
  179. package/dist/server/src/services/hub-tools/index.js +1 -2
  180. package/dist/server/src/services/hub-tools/instance-matcher.d.ts +62 -0
  181. package/dist/server/src/services/hub-tools/instance-matcher.d.ts.map +1 -0
  182. package/dist/server/src/services/hub-tools/instance-matcher.js +132 -0
  183. package/dist/server/src/services/hub-tools/instance-selector.d.ts +29 -0
  184. package/dist/server/src/services/hub-tools/instance-selector.d.ts.map +1 -0
  185. package/dist/server/src/services/hub-tools/instance-selector.js +103 -0
  186. package/dist/server/src/services/hub-tools/resource-generator.d.ts +25 -5
  187. package/dist/server/src/services/hub-tools/resource-generator.d.ts.map +1 -1
  188. package/dist/server/src/services/hub-tools/resource-generator.js +259 -64
  189. package/dist/server/src/services/hub-tools/server-selector.d.ts +26 -13
  190. package/dist/server/src/services/hub-tools/server-selector.d.ts.map +1 -1
  191. package/dist/server/src/services/hub-tools/server-selector.js +44 -37
  192. package/dist/server/src/services/hub-tools/system-tool-definitions.d.ts +1 -4
  193. package/dist/server/src/services/hub-tools/system-tool-definitions.d.ts.map +1 -1
  194. package/dist/server/src/services/hub-tools/system-tool-definitions.js +17 -80
  195. package/dist/server/src/services/hub-tools/tool-search.d.ts +7 -7
  196. package/dist/server/src/services/hub-tools/tool-search.d.ts.map +1 -1
  197. package/dist/server/src/services/hub-tools/tool-search.js +10 -4
  198. package/dist/server/src/services/hub-tools/types.d.ts +2 -2
  199. package/dist/server/src/services/hub-tools/types.d.ts.map +1 -1
  200. package/dist/server/src/services/hub-tools.service.d.ts +43 -72
  201. package/dist/server/src/services/hub-tools.service.d.ts.map +1 -1
  202. package/dist/server/src/services/hub-tools.service.js +185 -110
  203. package/dist/server/src/services/search/search-cache.d.ts +0 -19
  204. package/dist/server/src/services/search/search-cache.d.ts.map +1 -1
  205. package/dist/server/src/services/search/search-cache.js +0 -24
  206. package/dist/server/src/services/search/search-core.service.d.ts +5 -5
  207. package/dist/server/src/services/search/search-core.service.js +11 -11
  208. package/dist/server/src/services/session/session-manager.d.ts +12 -256
  209. package/dist/server/src/services/session/session-manager.d.ts.map +1 -1
  210. package/dist/server/src/services/session/session-manager.js +23 -583
  211. package/dist/server/src/services/session-tracker.service.d.ts +124 -0
  212. package/dist/server/src/services/session-tracker.service.d.ts.map +1 -0
  213. package/dist/server/src/services/session-tracker.service.js +176 -0
  214. package/dist/server/src/services/system-tool-handler.d.ts.map +1 -1
  215. package/dist/server/src/services/system-tool-handler.js +7 -17
  216. package/dist/server/src/utils/composite-key.d.ts +29 -0
  217. package/dist/server/src/utils/composite-key.d.ts.map +1 -0
  218. package/dist/server/src/utils/composite-key.js +39 -0
  219. package/dist/server/src/utils/error-handler.d.ts.map +1 -1
  220. package/dist/server/src/utils/error-handler.js +3 -2
  221. package/dist/server/src/utils/index.d.ts +2 -0
  222. package/dist/server/src/utils/index.d.ts.map +1 -1
  223. package/dist/server/src/utils/index.js +2 -0
  224. package/dist/server/src/utils/instance-id.d.ts +22 -0
  225. package/dist/server/src/utils/instance-id.d.ts.map +1 -0
  226. package/dist/server/src/utils/instance-id.js +59 -0
  227. package/dist/server/src/utils/json-utils.d.ts +4 -4
  228. package/dist/server/src/utils/json-utils.d.ts.map +1 -1
  229. package/dist/server/src/utils/json-utils.js +10 -4
  230. package/dist/server/src/utils/logger/dev-logger.d.ts +2 -1
  231. package/dist/server/src/utils/logger/dev-logger.d.ts.map +1 -1
  232. package/dist/server/src/utils/logger/log-colors.d.ts +1 -0
  233. package/dist/server/src/utils/logger/log-colors.d.ts.map +1 -1
  234. package/dist/server/src/utils/logger/log-colors.js +2 -1
  235. package/dist/server/src/utils/logger/log-context.d.ts +1 -0
  236. package/dist/server/src/utils/logger/log-context.d.ts.map +1 -1
  237. package/dist/server/src/utils/logger/log-formatter.d.ts +28 -0
  238. package/dist/server/src/utils/logger/log-formatter.d.ts.map +1 -1
  239. package/dist/server/src/utils/logger/log-formatter.js +287 -5
  240. package/dist/server/src/utils/logger/log-modules.d.ts +15 -12
  241. package/dist/server/src/utils/logger/log-modules.d.ts.map +1 -1
  242. package/dist/server/src/utils/logger/log-modules.js +8 -8
  243. package/dist/server/src/utils/logger/log-output.d.ts +2 -2
  244. package/dist/server/src/utils/logger/log-output.d.ts.map +1 -1
  245. package/dist/server/src/utils/logger/log-output.js +27 -6
  246. package/dist/server/src/utils/logger/logger.d.ts +13 -0
  247. package/dist/server/src/utils/logger/logger.d.ts.map +1 -1
  248. package/dist/server/src/utils/logger/logger.js +42 -7
  249. package/dist/server/src/utils/parameter-validator.d.ts +10 -0
  250. package/dist/server/src/utils/parameter-validator.d.ts.map +1 -0
  251. package/dist/server/src/utils/parameter-validator.js +53 -0
  252. package/dist/server/src/utils/process-tree.d.ts +49 -0
  253. package/dist/server/src/utils/process-tree.d.ts.map +1 -0
  254. package/dist/server/src/utils/process-tree.js +285 -0
  255. package/dist/server/src/utils/request-context.d.ts +12 -30
  256. package/dist/server/src/utils/request-context.d.ts.map +1 -1
  257. package/dist/server/src/utils/request-context.js +10 -30
  258. package/dist/server/src/utils/sort-utils.d.ts +40 -0
  259. package/dist/server/src/utils/sort-utils.d.ts.map +1 -0
  260. package/dist/server/src/utils/sort-utils.js +131 -0
  261. package/dist/server/src/utils/tool-args-parser.d.ts +0 -4
  262. package/dist/server/src/utils/tool-args-parser.d.ts.map +1 -1
  263. package/dist/server/src/utils/tool-args-parser.js +0 -7
  264. package/dist/server/src/utils/transports/sse-transport.d.ts +16 -1
  265. package/dist/server/src/utils/transports/sse-transport.d.ts.map +1 -1
  266. package/dist/server/src/utils/transports/sse-transport.js +55 -9
  267. package/dist/server/src/utils/transports/stdio-transport.d.ts +24 -53
  268. package/dist/server/src/utils/transports/stdio-transport.d.ts.map +1 -1
  269. package/dist/server/src/utils/transports/stdio-transport.js +66 -247
  270. package/dist/server/src/utils/transports/streamable-http-transport.d.ts +24 -1
  271. package/dist/server/src/utils/transports/streamable-http-transport.d.ts.map +1 -1
  272. package/dist/server/src/utils/transports/streamable-http-transport.js +68 -8
  273. package/dist/server/src/utils/transports/transport-factory.d.ts +9 -4
  274. package/dist/server/src/utils/transports/transport-factory.d.ts.map +1 -1
  275. package/dist/server/src/utils/transports/transport-factory.js +33 -13
  276. package/dist/server/src/utils/transports/transport.interface.d.ts +6 -0
  277. package/dist/server/src/utils/transports/transport.interface.d.ts.map +1 -1
  278. package/dist/server/src/utils/version.d.ts +11 -0
  279. package/dist/server/src/utils/version.d.ts.map +1 -0
  280. package/dist/server/src/utils/version.js +57 -0
  281. package/dist/server/tests/contract/mcp-protocol/initialize.test.js +24 -24
  282. package/dist/server/tests/contract/mcp-protocol/tools-call.test.js +49 -45
  283. package/dist/server/tests/contract/mcp-protocol/tools-list.test.js +35 -36
  284. package/dist/server/tests/evaluation/evaluation.test.js +10 -9
  285. package/dist/server/tests/integration/api/gateway.test.js +24 -39
  286. package/dist/server/tests/integration/gateway/fault-tolerance.test.js +65 -25
  287. package/dist/server/tests/integration/gateway/mcp-connection.test.js +53 -61
  288. package/dist/server/tests/server.test.js +27 -16
  289. package/dist/server/tests/temp/temp-run-docling.d.ts +2 -0
  290. package/dist/server/tests/temp/temp-run-docling.d.ts.map +1 -0
  291. package/dist/server/tests/temp/temp-run-docling.js +53 -0
  292. package/dist/server/tests/temp/test-stack.d.ts +6 -0
  293. package/dist/server/tests/temp/test-stack.d.ts.map +1 -0
  294. package/dist/server/tests/temp/test-stack.js +40 -0
  295. package/dist/server/tests/types/test-helpers.d.ts +1 -2
  296. package/dist/server/tests/types/test-helpers.d.ts.map +1 -1
  297. package/dist/server/tests/unit/config/config-loader-automatic-migration.test.d.ts +2 -0
  298. package/dist/server/tests/unit/config/config-loader-automatic-migration.test.d.ts.map +1 -0
  299. package/dist/server/tests/unit/config/config-loader-automatic-migration.test.js +199 -0
  300. package/dist/server/tests/unit/config/config-migrator.test.d.ts +2 -0
  301. package/dist/server/tests/unit/config/config-migrator.test.d.ts.map +1 -0
  302. package/dist/server/tests/unit/config/config-migrator.test.js +316 -0
  303. package/dist/server/tests/unit/config/config-saver.test.d.ts +2 -0
  304. package/dist/server/tests/unit/config/config-saver.test.d.ts.map +1 -0
  305. package/dist/server/tests/unit/config/config-saver.test.js +200 -0
  306. package/dist/server/tests/unit/config/config.schema.test.d.ts +2 -0
  307. package/dist/server/tests/unit/config/config.schema.test.d.ts.map +1 -0
  308. package/dist/server/tests/unit/config/config.schema.test.js +347 -0
  309. package/dist/server/tests/unit/server/runner.test.js +86 -62
  310. package/dist/server/tests/unit/services/connection/connection-manager.test.d.ts +2 -0
  311. package/dist/server/tests/unit/services/connection/connection-manager.test.d.ts.map +1 -0
  312. package/dist/server/tests/unit/services/connection/connection-manager.test.js +112 -0
  313. package/dist/server/tests/unit/services/hub-manager-service.test.js +112 -46
  314. package/dist/server/tests/unit/services/hub-manager.test.js +25 -15
  315. package/dist/server/tests/unit/services/hub-tools/instance-selector.test.d.ts +2 -0
  316. package/dist/server/tests/unit/services/hub-tools/instance-selector.test.d.ts.map +1 -0
  317. package/dist/server/tests/unit/services/hub-tools/instance-selector.test.js +195 -0
  318. package/dist/server/tests/unit/services/hub-tools/server-selector.test.d.ts +2 -0
  319. package/dist/server/tests/unit/services/hub-tools/server-selector.test.d.ts.map +1 -0
  320. package/dist/server/tests/unit/services/hub-tools/server-selector.test.js +190 -0
  321. package/dist/server/tests/unit/services/hub-tools.service.test.js +560 -334
  322. package/dist/server/tests/unit/services/instance-matcher.test.d.ts +2 -0
  323. package/dist/server/tests/unit/services/instance-matcher.test.d.ts.map +1 -0
  324. package/dist/server/tests/unit/services/instance-matcher.test.js +256 -0
  325. package/dist/server/tests/unit/services/session-manager.test.js +26 -436
  326. package/dist/server/tests/unit/utils/config.test.js +88 -186
  327. package/dist/server/tests/unit/utils/json-utils.test.js +107 -13
  328. package/dist/server/tests/unit/utils/logger-formatter.test.d.ts +2 -0
  329. package/dist/server/tests/unit/utils/logger-formatter.test.d.ts.map +1 -0
  330. package/dist/server/tests/unit/utils/logger-formatter.test.js +66 -0
  331. package/dist/server/tests/unit/utils/logger.test.js +101 -0
  332. package/dist/server/tests/unit/utils/parameter-validator.test.d.ts +2 -0
  333. package/dist/server/tests/unit/utils/parameter-validator.test.d.ts.map +1 -0
  334. package/dist/server/tests/unit/utils/parameter-validator.test.js +63 -0
  335. package/dist/server/tests/unit/utils/process-tree.test.d.ts +2 -0
  336. package/dist/server/tests/unit/utils/process-tree.test.d.ts.map +1 -0
  337. package/dist/server/tests/unit/utils/process-tree.test.js +129 -0
  338. package/dist/server/tests/unit/utils/request-context.test.js +9 -28
  339. package/dist/server/tests/unit/utils/sort-utils.test.d.ts +2 -0
  340. package/dist/server/tests/unit/utils/sort-utils.test.d.ts.map +1 -0
  341. package/dist/server/tests/unit/utils/sort-utils.test.js +220 -0
  342. package/dist/server/tests/unit/utils/transport-factory.test.d.ts +2 -0
  343. package/dist/server/tests/unit/utils/transport-factory.test.d.ts.map +1 -0
  344. package/dist/server/tests/unit/utils/transport-factory.test.js +55 -0
  345. package/package.json +1 -1
  346. package/dist/client/assets/ResourceDetailView-BQ49hk0c.js +0 -1
  347. package/dist/client/assets/ResourcesView-BYZfWtia.js +0 -1
  348. package/dist/client/assets/ResourcesView-CjMklkyv.css +0 -1
  349. package/dist/client/assets/ServerDashboard-7_8Og9JJ.css +0 -1
  350. package/dist/client/assets/ServerDashboard-DHcxwKeh.js +0 -2
  351. package/dist/client/assets/ServerListView-DralUL71.js +0 -30
  352. package/dist/client/assets/ServerStatusTags.vue_vue_type_script_setup_true_lang-BHiTFM7-.js +0 -1
  353. package/dist/client/assets/SessionsView-BCGRTqem.js +0 -1
  354. package/dist/client/assets/SettingsView-BLfxa6PZ.js +0 -1
  355. package/dist/client/assets/ToolCallDialog-DQ0OQ1mD.js +0 -1
  356. package/dist/client/assets/ToolsView-BLB6x3tC.js +0 -1
  357. package/dist/client/assets/_baseClone-Bo5mBgsT.js +0 -1
  358. package/dist/client/assets/el-form-item-BVMLpmVC.css +0 -1
  359. package/dist/client/assets/el-form-item-BmeJKVSi.js +0 -12
  360. package/dist/client/assets/el-input-CeZiq23m.js +0 -1
  361. package/dist/client/assets/el-input-CmuHb8HS.css +0 -1
  362. package/dist/client/assets/el-overlay-B2ZKM6Up.css +0 -1
  363. package/dist/client/assets/el-overlay-iw_hrrlC.js +0 -1
  364. package/dist/client/assets/el-select-B73uRP_Y.js +0 -1
  365. package/dist/client/assets/el-tab-pane-BgOTBn4X.js +0 -1
  366. package/dist/client/assets/el-table-column-Ld4GSD3x.js +0 -1
  367. package/dist/client/assets/el-table-column-T_mV9jNw.css +0 -1
  368. package/dist/client/assets/el-tag-DYmSo8Bx.js +0 -1
  369. package/dist/client/assets/el-tag-DjxZVOpb.css +0 -1
  370. package/dist/client/assets/index-COYaYRbH.js +0 -1
  371. package/dist/client/assets/index-Cfcvxyee.js +0 -2
  372. package/dist/client/assets/index-PhuI36Zi.js +0 -1
  373. package/dist/client/assets/omit-7EL6VJO4.js +0 -1
  374. package/dist/client/assets/vnode-upjuIlvm.js +0 -1
@@ -1,37 +1,10 @@
1
- import { spawn } from 'child_process';
2
- import { PassThrough } from 'stream';
1
+ import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
3
2
  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
- }
3
+ import { PassThrough } from 'stream';
31
4
  /**
32
5
  * 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.
6
+ * via standard input/output streams. This transport wraps the official SDK's StdioClientTransport
7
+ * and provides consistent logging and integration with the MCP Hub Lite system.
35
8
  *
36
9
  * The StdioTransport handles:
37
10
  * - Cross-platform process spawning (including Windows batch file compatibility)
@@ -46,21 +19,11 @@ class ReadBuffer {
46
19
  * @implements {Transport}
47
20
  */
48
21
  export class StdioTransport {
49
- _process;
50
- _readBuffer = new ReadBuffer();
51
- _stderrStream = null;
52
- _serverParams;
22
+ _transport;
53
23
  _serverName;
54
- _serverId;
24
+ _compositeKey;
55
25
  _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
- }
26
+ _stderrStream = null;
64
27
  onclose;
65
28
  onerror;
66
29
  onmessage;
@@ -74,251 +37,107 @@ export class StdioTransport {
74
37
  * @param {StdioTransportOptions} [options] - Additional options for the transport
75
38
  */
76
39
  constructor(server, serverName, options) {
77
- this._serverParams = server;
40
+ // Convert our server parameters to match SDK format
41
+ const sdkParams = {
42
+ command: server.command,
43
+ args: server.args,
44
+ env: server.env,
45
+ stderr: 'pipe', // Always use pipe for stderr to enable logging
46
+ cwd: server.cwd
47
+ };
48
+ this._transport = new StdioClientTransport(sdkParams);
78
49
  this._serverName = serverName;
79
- this._serverId = options?.serverId;
50
+ this._compositeKey = options?.compositeKey;
80
51
  this._logStorage = options?.logStorage;
81
- if (server.stderr === 'pipe') {
82
- this._stderrStream = new PassThrough();
83
- }
52
+ this._stderrStream = new PassThrough();
84
53
  }
85
54
  /**
86
55
  * Starts the transport by spawning the child process and establishing communication channels.
87
56
  *
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
57
+ * This method delegates to the SDK's StdioClientTransport.start() method which handles:
58
+ * - Platform-specific process spawning (including Windows batch file compatibility)
59
+ * - Proper stdio configuration
60
+ * - Event listeners for process lifecycle events
61
+ * - Data flow for stdout and stderr handling
93
62
  *
94
63
  * @returns {Promise<void>} Resolves when the child process is successfully spawned
95
64
  * @throws {Error} If the transport is already started
96
65
  */
97
66
  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');
67
+ // Set up event handlers before starting
68
+ this._transport.onmessage = (message) => {
69
+ this.onmessage?.(message);
70
+ };
71
+ this._transport.onerror = (error) => {
72
+ this.onerror?.(error);
73
+ };
74
+ this._transport.onclose = () => {
75
+ this.onclose?.();
76
+ };
77
+ // Start the underlying transport
78
+ await this._transport.start();
79
+ // Handle stderr data by listening to the transport's stderr stream
80
+ if (this._transport.stderr) {
81
+ this._transport.stderr.on('data', (chunk) => {
82
+ const dataStr = chunk.toString('utf8').trim();
83
+ if (!dataStr)
84
+ return;
161
85
  // Forward raw stderr data
162
86
  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';
87
+ // Log stderr output (per MCP spec, stderr is not necessarily errors)
88
+ const serverIdentifier = this._compositeKey || this._serverName || 'Unknown Server';
89
+ logger.serverLog('info', serverIdentifier, dataStr, { pid: this.pid });
90
+ if (this._logStorage && this._compositeKey) {
91
+ this._logStorage.append(this._compositeKey, 'info', dataStr);
183
92
  }
184
- if (this._serverName) {
185
- logger.serverLog(logLevel, this._serverName, trimmedData, {
186
- pid: this._process?.pid
187
- });
93
+ // Also write to our PassThrough stream for compatibility
94
+ // Guard against write after end during close() race condition
95
+ if (this._stderrStream && !this._stderrStream.writableEnded) {
96
+ this._stderrStream.write(chunk);
188
97
  }
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
- });
98
+ });
99
+ }
215
100
  }
216
101
  /**
217
102
  * Gets the stderr stream for the child process.
218
103
  *
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.
104
+ * Returns our PassThrough stream that captures stderr data.
221
105
  *
222
- * @returns {PassThrough | NodeJS.ReadableStream | null} The stderr stream or null
106
+ * @returns {PassThrough | null} The stderr stream or null
223
107
  */
224
108
  get stderr() {
225
- return this._stderrStream ?? this._process?.stderr ?? null;
109
+ return this._stderrStream;
226
110
  }
227
111
  /**
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.
112
+ * Gets the process ID of the spawned child process.
236
113
  *
237
- * @private
114
+ * @returns {number | undefined} The PID of the child process, or undefined if not started
238
115
  */
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
- }
116
+ get pid() {
117
+ return this._transport.pid ?? undefined;
252
118
  }
253
119
  /**
254
120
  * Closes the transport by gracefully terminating the child process.
255
121
  *
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.
122
+ * This method delegates to the SDK's StdioClientTransport.close() method which handles:
123
+ * - Graceful shutdown sequence with SIGTERM/SIGKILL
124
+ * - Proper cleanup of internal state
264
125
  *
265
126
  * @returns {Promise<void>} Resolves when the transport is fully closed
266
127
  */
267
128
  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();
129
+ await this._transport.close();
130
+ this._stderrStream?.end();
305
131
  }
306
132
  /**
307
133
  * Sends a JSON-RPC message to the child process via stdin.
308
134
  *
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.
135
+ * This method delegates to the SDK's StdioClientTransport.send() method.
312
136
  *
313
137
  * @param {JSONRPCMessage} message - The JSON-RPC message to send
314
138
  * @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
139
  */
317
140
  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);
141
+ await this._transport.send(message);
323
142
  }
324
143
  }
@@ -29,6 +29,7 @@ export declare class StreamableHttpTransport implements Transport {
29
29
  private url;
30
30
  private headers;
31
31
  private timeout;
32
+ private proxy?;
32
33
  /**
33
34
  * Internal reference to the underlying MCP SDK transport instance
34
35
  * @private
@@ -40,6 +41,16 @@ export declare class StreamableHttpTransport implements Transport {
40
41
  * @private
41
42
  */
42
43
  private isClosing;
44
+ /**
45
+ * Server name for logging context
46
+ * @private
47
+ */
48
+ private _serverName?;
49
+ /**
50
+ * Composite key (serverName-serverIndex) for logging context
51
+ * @private
52
+ */
53
+ private _compositeKey?;
43
54
  /**
44
55
  * Event handler called when a JSON-RPC message is received from the server
45
56
  * @public
@@ -63,8 +74,20 @@ export declare class StreamableHttpTransport implements Transport {
63
74
  * Commonly used for authentication tokens, API keys, or custom headers
64
75
  * @param timeout - Request timeout in milliseconds (default: 30000 = 30 seconds)
65
76
  * Controls how long to wait for HTTP responses before timing out
77
+ * @param proxy - Optional proxy configuration
78
+ * @param serverName - Optional server name for logging
79
+ * @param compositeKey - Optional composite key (serverName-serverIndex) for logging
80
+ */
81
+ constructor(url: string, headers?: Record<string, string>, timeout?: number, proxy?: {
82
+ url: string;
83
+ } | undefined, serverName?: string, compositeKey?: string);
84
+ /**
85
+ * Helper method to format log messages with server context.
86
+ *
87
+ * @param message - The base message
88
+ * @returns Formatted message with server context if available
66
89
  */
67
- constructor(url: string, headers?: Record<string, string>, timeout?: number);
90
+ private formatLogMessage;
68
91
  /**
69
92
  * Initializes and starts the Streamable HTTP transport connection
70
93
  *
@@ -1 +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"}
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;AAM1E;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,uBAAwB,YAAW,SAAS;IAyDrD,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,KAAK,CAAC;IA3DhB;;;OAGG;IACH,OAAO,CAAC,SAAS,CAA8C;IAE/D;;;;OAIG;IACH,OAAO,CAAC,SAAS,CAAS;IAE1B;;;OAGG;IACH,OAAO,CAAC,WAAW,CAAC,CAAS;IAE7B;;;OAGG;IACH,OAAO,CAAC,aAAa,CAAC,CAAS;IAE/B;;;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;;;;;;;;;;;OAWG;gBAEO,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,EACpC,OAAO,GAAE,MAAc,EACvB,KAAK,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,YAAA,EAC/B,UAAU,CAAC,EAAE,MAAM,EACnB,YAAY,CAAC,EAAE,MAAM;IAMvB;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IAUxB;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA6G5B;;;;;;;;;;;;;;;;;;;OAmBG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACG,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CA6BnD"}
@@ -1,6 +1,7 @@
1
1
  import { logger, LOG_MODULES } from '../logger.js';
2
2
  import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
3
3
  import { URL } from 'url';
4
+ import { ProxyAgent, fetch as undiciFetch } from 'undici';
4
5
  /**
5
6
  * Streamable HTTP Transport implementation for MCP (Model Context Protocol)
6
7
  *
@@ -30,6 +31,7 @@ export class StreamableHttpTransport {
30
31
  url;
31
32
  headers;
32
33
  timeout;
34
+ proxy;
33
35
  /**
34
36
  * Internal reference to the underlying MCP SDK transport instance
35
37
  * @private
@@ -41,6 +43,16 @@ export class StreamableHttpTransport {
41
43
  * @private
42
44
  */
43
45
  isClosing = false;
46
+ /**
47
+ * Server name for logging context
48
+ * @private
49
+ */
50
+ _serverName;
51
+ /**
52
+ * Composite key (serverName-serverIndex) for logging context
53
+ * @private
54
+ */
55
+ _compositeKey;
44
56
  /**
45
57
  * Event handler called when a JSON-RPC message is received from the server
46
58
  * @public
@@ -64,11 +76,34 @@ export class StreamableHttpTransport {
64
76
  * Commonly used for authentication tokens, API keys, or custom headers
65
77
  * @param timeout - Request timeout in milliseconds (default: 30000 = 30 seconds)
66
78
  * Controls how long to wait for HTTP responses before timing out
79
+ * @param proxy - Optional proxy configuration
80
+ * @param serverName - Optional server name for logging
81
+ * @param compositeKey - Optional composite key (serverName-serverIndex) for logging
67
82
  */
68
- constructor(url, headers = {}, timeout = 30000) {
83
+ constructor(url, headers = {}, timeout = 30000, proxy, serverName, compositeKey) {
69
84
  this.url = url;
70
85
  this.headers = headers;
71
86
  this.timeout = timeout;
87
+ this.proxy = proxy;
88
+ this._serverName = serverName;
89
+ this._compositeKey = compositeKey;
90
+ }
91
+ /**
92
+ * Helper method to format log messages with server context.
93
+ *
94
+ * @param message - The base message
95
+ * @returns Formatted message with server context if available
96
+ */
97
+ formatLogMessage(message) {
98
+ if (this._compositeKey) {
99
+ return `${message} (compositeKey=${this._compositeKey}, url=${this.url})`;
100
+ }
101
+ else if (this._serverName) {
102
+ return `${message} (server=${this._serverName}, url=${this.url})`;
103
+ }
104
+ else {
105
+ return `${message} (url=${this.url})`;
106
+ }
72
107
  }
73
108
  /**
74
109
  * Initializes and starts the Streamable HTTP transport connection
@@ -101,6 +136,8 @@ export class StreamableHttpTransport {
101
136
  throw new Error('Streamable HTTP Transport already started!');
102
137
  }
103
138
  this.isClosing = false;
139
+ const proxyInfo = this.proxy?.url ? `, proxy=${this.proxy.url}` : '';
140
+ logger.info(this.formatLogMessage(`Attempting to connect to Streamable HTTP server: timeout=${this.timeout}ms, headers=${JSON.stringify(Object.keys(this.headers))}${proxyInfo}`), LOG_MODULES.HTTP_TRANSPORT);
104
141
  try {
105
142
  const url = new URL(this.url);
106
143
  const requestInit = {
@@ -110,19 +147,37 @@ export class StreamableHttpTransport {
110
147
  },
111
148
  signal: AbortSignal.timeout(this.timeout)
112
149
  };
113
- this.transport = new StreamableHTTPClientTransport(url, {
150
+ // Create transport options
151
+ const transportOptions = {
114
152
  requestInit
115
- });
153
+ };
154
+ // Add proxy support if configured
155
+ if (this.proxy?.url) {
156
+ const agent = new ProxyAgent(this.proxy.url);
157
+ // Create custom fetch function with proxy
158
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
159
+ const customFetch = (input, init) => {
160
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
161
+ const fetchOptions = {
162
+ ...init,
163
+ dispatcher: agent
164
+ };
165
+ return undiciFetch(input, fetchOptions);
166
+ };
167
+ transportOptions.fetch = customFetch;
168
+ logger.info(this.formatLogMessage(`Streamable HTTP transport configured with proxy: ${this.proxy.url}`), LOG_MODULES.HTTP_TRANSPORT);
169
+ }
170
+ this.transport = new StreamableHTTPClientTransport(url, transportOptions);
116
171
  // Set up event handlers
117
172
  this.transport.onmessage = (message) => {
118
173
  this.onmessage?.(message);
119
174
  };
120
175
  this.transport.onerror = (error) => {
121
- logger.error('Streamable HTTP transport error:', error, LOG_MODULES.HTTP_TRANSPORT);
176
+ logger.error(this.formatLogMessage(`Streamable HTTP transport error occurred: errorType=${error.name || 'unknown'}, message=${error.message || 'no message'}`), error, LOG_MODULES.HTTP_TRANSPORT);
122
177
  this.onerror?.(error);
123
178
  };
124
179
  this.transport.onclose = () => {
125
- logger.info('Streamable HTTP transport closed', LOG_MODULES.HTTP_TRANSPORT);
180
+ logger.info(this.formatLogMessage('Streamable HTTP transport closed'), LOG_MODULES.HTTP_TRANSPORT);
126
181
  if (!this.isClosing) {
127
182
  // Unexpected close, trigger error
128
183
  const error = new Error('Streamable HTTP transport closed unexpectedly');
@@ -130,11 +185,13 @@ export class StreamableHttpTransport {
130
185
  }
131
186
  this.onclose?.();
132
187
  };
188
+ logger.debug(this.formatLogMessage('Starting underlying transport connection...'), LOG_MODULES.HTTP_TRANSPORT);
133
189
  await this.transport.start();
134
- logger.info(`Streamable HTTP transport initialized for ${this.url}`, LOG_MODULES.HTTP_TRANSPORT);
190
+ logger.info(this.formatLogMessage('Streamable HTTP transport successfully initialized'), LOG_MODULES.HTTP_TRANSPORT);
135
191
  }
136
192
  catch (error) {
137
- logger.error('Failed to create Streamable HTTP transport:', error, LOG_MODULES.HTTP_TRANSPORT);
193
+ logger.error(this.formatLogMessage(`Failed to create Streamable HTTP transport: error=${error instanceof Error ? error.message : String(error)}`), LOG_MODULES.HTTP_TRANSPORT);
194
+ logger.error('Complete error details:', error, LOG_MODULES.HTTP_TRANSPORT);
138
195
  throw error;
139
196
  }
140
197
  }
@@ -201,11 +258,14 @@ export class StreamableHttpTransport {
201
258
  if (!this.transport) {
202
259
  throw new Error('Streamable HTTP transport not started');
203
260
  }
261
+ const method = 'method' in message ? message.method : 'notification';
262
+ const proxyInfo = this.proxy?.url ? `, proxy=${this.proxy.url}` : '';
263
+ logger.debug(this.formatLogMessage(`Sending message via Streamable HTTP: method=${method}${proxyInfo}`), LOG_MODULES.HTTP_TRANSPORT);
204
264
  try {
205
265
  await this.transport.send(message);
206
266
  }
207
267
  catch (error) {
208
- logger.error('Failed to send message via Streamable HTTP:', error, LOG_MODULES.HTTP_TRANSPORT);
268
+ logger.error(this.formatLogMessage(`Failed to send message via Streamable HTTP: method=${method}${proxyInfo}, error=${error instanceof Error ? error.message : String(error)}`), error, LOG_MODULES.HTTP_TRANSPORT);
209
269
  throw error;
210
270
  }
211
271
  }
@@ -1,4 +1,4 @@
1
- import type { ServerConfig } from '../../config/config.schema.js';
1
+ import type { ServerRuntimeConfig } from '../../../shared/models/server.model.js';
2
2
  /**
3
3
  * Transport Factory - creates appropriate transport client based on server configuration
4
4
  */
@@ -6,18 +6,23 @@ export declare class TransportFactory {
6
6
  /**
7
7
  * Create transport client
8
8
  * @param server Server configuration, including base configuration and instance configuration
9
- * @param serverId Optional server ID for log storage integration
9
+ * @param compositeKey Optional composite key (serverName-serverIndex) for log storage integration
10
10
  * @returns Transport client instance
11
11
  * @throws Error if server type is not supported or configuration is invalid
12
12
  */
13
- static createTransport(server: ServerConfig & {
13
+ static createTransport(server: ServerRuntimeConfig & {
14
14
  name: string;
15
- }, serverId?: string): import('@modelcontextprotocol/sdk/shared/transport.js').Transport;
15
+ }, compositeKey?: string): import('@modelcontextprotocol/sdk/shared/transport.js').Transport;
16
16
  /**
17
17
  * Build system environment variables
18
18
  * Add necessary system environment variables for stdio transport
19
19
  */
20
20
  private static buildSystemEnv;
21
+ /**
22
+ * Check if a command is related to Python execution
23
+ * Detects python, python3, py, uv, uvx, and similar commands
24
+ */
25
+ private static isPythonCommand;
21
26
  /**
22
27
  * Validate and convert server configuration to transport configuration
23
28
  */
@@ -1 +1 @@
1
- {"version":3,"file":"transport-factory.d.ts","sourceRoot":"","sources":["../../../../../src/utils/transports/transport-factory.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAG7D;;GAEG;AACH,qBAAa,gBAAgB;IAC3B;;;;;;OAMG;IACH,MAAM,CAAC,eAAe,CACpB,MAAM,EAAE,YAAY,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,EACvC,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,+CAA+C,EAAE,SAAS;IAmDpE;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IAI7B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,wBAAwB;CA4CxC"}
1
+ {"version":3,"file":"transport-factory.d.ts","sourceRoot":"","sources":["../../../../../src/utils/transports/transport-factory.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAG1E;;GAEG;AACH,qBAAa,gBAAgB;IAC3B;;;;;;OAMG;IACH,MAAM,CAAC,eAAe,CACpB,MAAM,EAAE,mBAAmB,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,EAC9C,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,+CAA+C,EAAE,SAAS;IA6DpE;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IAW7B;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,eAAe;IAW9B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,wBAAwB;CA8CxC"}