@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,929 @@
1
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
2
+ import { TransportFactory } from '../../utils/transports/transport-factory.js';
3
+ import { logger, LOG_MODULES, formatMcpMessageForLogging, logNotificationMessage } from '../../utils/logger.js';
4
+ import { getMcpCommDebugSetting } from '../../utils/json-utils.js';
5
+ import { logStorage } from '../log-storage.service.js';
6
+ import { eventBus, EventTypes } from '../event-bus.service.js';
7
+ import { hubManager } from '../hub-manager.service.js';
8
+ import { MCP_HUB_LITE_SERVER } from '../../models/system-tools.constants.js';
9
+ import { ToolCache } from './tool-cache.js';
10
+ /**
11
+ * Manages MCP (Model Context Protocol) server connections and provides a unified interface
12
+ * for tool and resource operations across multiple connected servers.
13
+ *
14
+ * This service handles the complete lifecycle of MCP server connections including:
15
+ * - Establishing connections via various transport protocols (stdio, SSE, HTTP)
16
+ * - Managing client instances and transport layers
17
+ * - Caching tools and resources for performance optimization
18
+ * - Providing both server ID-based and server name-based access patterns
19
+ * - Handling connection events and error recovery
20
+ * - Supporting bidirectional communication for tool execution
21
+ *
22
+ * The manager uses ToolCache for both server ID-level and server name-level
23
+ * operations to optimize different access patterns while ensuring data consistency.
24
+ *
25
+ * @example
26
+ * ```typescript
27
+ * const manager = new McpConnectionManager();
28
+ * await manager.connect(serverConfig);
29
+ * const tools = await manager.getTools(serverId);
30
+ * const result = await manager.callTool(serverId, 'tool-name', { param: 'value' });
31
+ * ```
32
+ */
33
+ export class McpConnectionManager {
34
+ clients = new Map();
35
+ transports = new Map();
36
+ serverStatus = new Map();
37
+ _toolCache = new ToolCache();
38
+ resourceCache = new Map();
39
+ constructor() {
40
+ // Listen for server deletion events and automatically disconnect
41
+ eventBus.subscribe(EventTypes.SERVER_DELETED, (data) => {
42
+ const serverName = data;
43
+ // Find all instances by server name and disconnect them
44
+ const serverInstances = hubManager.getServerInstanceByName(serverName);
45
+ serverInstances.forEach((instance) => {
46
+ this.disconnect(instance.id).catch((err) => {
47
+ logger.warn(`Failed to disconnect deleted server instance ${instance.id}:`, err, LOG_MODULES.CONNECTION_MANAGER);
48
+ });
49
+ });
50
+ });
51
+ }
52
+ /**
53
+ * Establishes a connection to an MCP server using the specified configuration.
54
+ *
55
+ * This method handles the complete connection process including transport creation,
56
+ * client initialization, validation, and automatic tool/resource discovery.
57
+ * It supports multiple transport protocols (stdio, SSE, streamable-http, http)
58
+ * and provides comprehensive error handling with proper status tracking.
59
+ *
60
+ * For bidirectional transports (stdio, streamable-http, http), it automatically
61
+ * fetches and caches available tools and resources upon successful connection.
62
+ * SSE transports are unidirectional and skip this step for performance reasons.
63
+ *
64
+ * The method publishes SERVER_CONNECTED and SERVER_STATUS_CHANGE events upon
65
+ * successful connection, and SERVER_STATUS_CHANGE events with error details
66
+ * on failure.
67
+ *
68
+ * @param {ServerConfig & ServerInstanceConfig} server - Server configuration containing
69
+ * connection details, transport type, and instance-specific parameters
70
+ * @returns {Promise<boolean>} True if connection succeeds, false if it fails
71
+ * @throws {Error} If server ID is missing or required configuration is invalid
72
+ *
73
+ * @example
74
+ * ```typescript
75
+ * const serverConfig = {
76
+ * id: 'my-server-1',
77
+ * type: 'stdio' as const,
78
+ * command: 'npx my-mcp-server',
79
+ * name: 'My MCP Server'
80
+ * };
81
+ * const success = await manager.connect(serverConfig);
82
+ * if (success) {
83
+ * console.log('Connected successfully');
84
+ * }
85
+ * ```
86
+ */
87
+ async connect(server) {
88
+ let serverInfo;
89
+ try {
90
+ logger.info(`Connecting to server [${server.id || 'unknown'}]...`, LOG_MODULES.CONNECTION_MANAGER);
91
+ // Validate server configuration
92
+ if (!server.id) {
93
+ throw new Error('Server ID is required');
94
+ }
95
+ // First set starting state (connected: false, no error)
96
+ this.serverStatus.set(server.id, {
97
+ connected: false,
98
+ lastCheck: Date.now(),
99
+ toolsCount: 0,
100
+ resourcesCount: 0
101
+ });
102
+ // Get server name from server instance ID (via hubManager.getServerById)
103
+ serverInfo = hubManager.getServerById(server.id);
104
+ if (!serverInfo) {
105
+ throw new Error(`Server not found for instance: ${server.id}`);
106
+ }
107
+ if (server.type === 'stdio' && (!server.command || server.command.trim() === '')) {
108
+ throw new Error('STDIO server requires a valid command');
109
+ }
110
+ if ((server.type === 'sse' || server.type === 'streamable-http' || server.type === 'http') &&
111
+ (!server.url || server.url.trim() === '')) {
112
+ const displayType = server.type === 'http' ? 'streamable-http' : server.type;
113
+ throw new Error(`${displayType.toUpperCase()} server requires a valid URL`);
114
+ }
115
+ // Create transport based on server type
116
+ const serverName = serverInfo.name;
117
+ const transport = TransportFactory.createTransport({
118
+ ...server,
119
+ name: serverName
120
+ }, server.id);
121
+ // Always set up message handler for notifications/message
122
+ transport.onmessage = (message) => {
123
+ // Communication debug logs: controlled by MCP_COMM_DEBUG environment variable
124
+ if (getMcpCommDebugSetting()) {
125
+ const logMessage = formatMcpMessageForLogging(message);
126
+ logger.debug(`MCP message received: ${logMessage}`, LOG_MODULES.CONNECTION_MANAGER);
127
+ }
128
+ // Log notifications/message to application logs (always enabled)
129
+ logNotificationMessage(message, serverName, server.id);
130
+ };
131
+ // Wrap send method for debug logging (if enabled)
132
+ if (getMcpCommDebugSetting()) {
133
+ const originalSend = transport.send;
134
+ transport.send = async (message, options) => {
135
+ try {
136
+ const logMessage = formatMcpMessageForLogging(message);
137
+ logger.debug(`MCP message sent: ${logMessage}`, LOG_MODULES.CONNECTION_MANAGER);
138
+ }
139
+ catch {
140
+ logger.debug(`MCP message sent: [Error formatting response]`, LOG_MODULES.CONNECTION_MANAGER);
141
+ }
142
+ // Call original send method
143
+ return await originalSend.call(transport, message, options);
144
+ };
145
+ }
146
+ // Handle transport close events
147
+ if ('onclose' in transport) {
148
+ transport.onclose = () => {
149
+ logger.info(`Transport closed for server [${server.id}]`, LOG_MODULES.CONNECTION_MANAGER);
150
+ const currentStatus = this.serverStatus.get(server.id);
151
+ // Only update status if it was previously connected or starting
152
+ if (currentStatus && (currentStatus.connected || !currentStatus.error)) {
153
+ this.serverStatus.set(server.id, {
154
+ connected: false,
155
+ lastCheck: Date.now(),
156
+ toolsCount: 0,
157
+ resourcesCount: 0,
158
+ error: 'Connection closed unexpectedly'
159
+ });
160
+ }
161
+ };
162
+ }
163
+ // Add log listeners
164
+ if ('onstdout' in transport) {
165
+ transport.onstdout = (data) => {
166
+ // Skip JSON-RPC communication to avoid log noise
167
+ const trimmedData = data.trim();
168
+ if (trimmedData) {
169
+ // Check if it's a valid JSON-RPC message
170
+ let isJsonRpc = false;
171
+ if (trimmedData.startsWith('{')) {
172
+ try {
173
+ const parsed = JSON.parse(trimmedData);
174
+ // Only consider it JSON-RPC if it has valid jsonrpc field
175
+ isJsonRpc =
176
+ typeof parsed.jsonrpc === 'string' &&
177
+ (parsed.jsonrpc === '2.0' || parsed.jsonrpc === '1.0');
178
+ }
179
+ catch {
180
+ // Not valid JSON, treat as log output
181
+ isJsonRpc = false;
182
+ }
183
+ }
184
+ if (!isJsonRpc) {
185
+ // Use server ID and name for log storage
186
+ const serverId = server?.id ?? 'unknown';
187
+ logStorage.append(serverId, 'info', `[${serverName}] [STDOUT] ${data}`);
188
+ }
189
+ }
190
+ };
191
+ }
192
+ if ('onstderr' in transport) {
193
+ transport.onstderr = (data) => {
194
+ // Use server ID and name for log storage
195
+ const serverId = server?.id ?? 'unknown';
196
+ logStorage.append(serverId, 'error', `[${serverName}] [STDERR] ${data}`);
197
+ };
198
+ }
199
+ const client = new Client({
200
+ name: MCP_HUB_LITE_SERVER,
201
+ version: '1.0.0'
202
+ }, {
203
+ capabilities: {}
204
+ });
205
+ await client.connect(transport);
206
+ this.clients.set(server.id, client);
207
+ this.transports.set(server.id, transport);
208
+ this._toolCache.setNameMapping(serverInfo.name, server.id);
209
+ // Get PID if available (only for stdio transport)
210
+ let pid;
211
+ if ('pid' in transport && typeof transport.pid === 'number') {
212
+ pid = transport.pid;
213
+ }
214
+ // Get server version
215
+ const clientServerInfo = client.getServerVersion();
216
+ const serverVersion = clientServerInfo?.version || clientServerInfo?.name;
217
+ // Update server instance info (merge pid and startTime)
218
+ const instances = hubManager.getServerInstanceByName(serverName);
219
+ const instanceIndex = instances.findIndex((inst) => inst.id === server.id);
220
+ if (instanceIndex !== -1) {
221
+ hubManager.updateServerInstance(serverName, instanceIndex, {
222
+ pid: pid,
223
+ startTime: Date.now() // Startup time is the same as timestamp
224
+ });
225
+ }
226
+ this.serverStatus.set(server.id, {
227
+ connected: true,
228
+ lastCheck: Date.now(),
229
+ toolsCount: 0,
230
+ resourcesCount: 0,
231
+ pid: pid,
232
+ startTime: Date.now(),
233
+ version: serverVersion,
234
+ hash: server.hash
235
+ });
236
+ logger.info(`Connected to server [${server.id}]`, LOG_MODULES.CONNECTION_MANAGER);
237
+ // Publish server connected event
238
+ eventBus.publish(EventTypes.SERVER_CONNECTED, {
239
+ serverId: server.id,
240
+ status: 'online',
241
+ timestamp: Date.now()
242
+ });
243
+ // Publish server status change event
244
+ eventBus.publish(EventTypes.SERVER_STATUS_CHANGE, {
245
+ serverId: server.id,
246
+ status: 'online',
247
+ timestamp: Date.now()
248
+ });
249
+ // Fetch tools and resources immediately (only for bidirectional transports)
250
+ if (server.type !== 'sse') {
251
+ const tools = await this.refreshTools(server.id);
252
+ const resources = await this.refreshResources(server.id);
253
+ // Publish tools and resources updated event
254
+ eventBus.publish(EventTypes.TOOLS_UPDATED, {
255
+ serverId: server.id,
256
+ tools
257
+ });
258
+ eventBus.publish(EventTypes.RESOURCES_UPDATED, {
259
+ serverId: server.id,
260
+ resources
261
+ });
262
+ }
263
+ else {
264
+ logger.info('SSE transport is unidirectional, skipping tool/resource refresh', LOG_MODULES.CONNECTION_MANAGER);
265
+ }
266
+ return true;
267
+ }
268
+ catch (error) {
269
+ logger.error(`Failed to connect to server ${serverInfo?.name || server.id || 'unknown'}:`, error, LOG_MODULES.CONNECTION_MANAGER);
270
+ const serverId = server.id || 'unknown';
271
+ this.serverStatus.set(serverId, {
272
+ connected: false,
273
+ error: error instanceof Error ? error.message : String(error),
274
+ lastCheck: Date.now(),
275
+ toolsCount: 0,
276
+ resourcesCount: 0
277
+ });
278
+ // Publish server status change event (error state)
279
+ eventBus.publish(EventTypes.SERVER_STATUS_CHANGE, {
280
+ serverId,
281
+ status: 'error',
282
+ error: error instanceof Error ? error.message : String(error),
283
+ timestamp: Date.now()
284
+ });
285
+ return false;
286
+ }
287
+ }
288
+ /**
289
+ * Disconnects from an MCP server and cleans up all associated resources.
290
+ *
291
+ * This method performs a graceful shutdown by closing the client connection,
292
+ * closing the transport layer, and removing all cached data including tools,
293
+ * resources, and status information. It also updates the server name-level
294
+ * tool cache to maintain consistency across multiple instances of the same server.
295
+ *
296
+ * The method publishes SERVER_DISCONNECTED and SERVER_STATUS_CHANGE events
297
+ * upon completion and handles any errors during the disconnection process
298
+ * without throwing exceptions.
299
+ *
300
+ * @param {string} serverId - Unique identifier of the server instance to disconnect
301
+ * @returns {Promise<void>} Resolves when disconnection is complete
302
+ *
303
+ * @example
304
+ * ```typescript
305
+ * await manager.disconnect('my-server-1');
306
+ * console.log('Server disconnected');
307
+ * ```
308
+ */
309
+ async disconnect(serverId) {
310
+ logger.info(`Disconnecting from server [${serverId}]...`, LOG_MODULES.CONNECTION_MANAGER);
311
+ const client = this.clients.get(serverId);
312
+ const transport = this.transports.get(serverId);
313
+ try {
314
+ if (client) {
315
+ try {
316
+ await client.close();
317
+ }
318
+ catch (e) {
319
+ logger.warn(`Error closing client for [${serverId}]:`, e, LOG_MODULES.CONNECTION_MANAGER);
320
+ }
321
+ }
322
+ if (transport && typeof transport.close === 'function') {
323
+ await transport.close();
324
+ }
325
+ }
326
+ catch (error) {
327
+ logger.error(`Error disconnecting server [${serverId}]:`, error, LOG_MODULES.CONNECTION_MANAGER);
328
+ }
329
+ finally {
330
+ this.clients.delete(serverId);
331
+ this.transports.delete(serverId);
332
+ this._toolCache.clearTools(serverId);
333
+ this.resourceCache.delete(serverId);
334
+ this._toolCache.removeNameMappingById(serverId);
335
+ this.serverStatus.set(serverId, {
336
+ connected: false,
337
+ lastCheck: Date.now(),
338
+ toolsCount: 0,
339
+ resourcesCount: 0
340
+ });
341
+ // Publish server disconnected event
342
+ eventBus.publish(EventTypes.SERVER_DISCONNECTED, {
343
+ serverId,
344
+ status: 'offline',
345
+ timestamp: Date.now()
346
+ });
347
+ // Publish server status change event
348
+ eventBus.publish(EventTypes.SERVER_STATUS_CHANGE, {
349
+ serverId,
350
+ status: 'offline',
351
+ timestamp: Date.now()
352
+ });
353
+ logger.info(`Disconnected from server [${serverId}]`, LOG_MODULES.CONNECTION_MANAGER);
354
+ }
355
+ }
356
+ /**
357
+ * Disconnects from all currently connected MCP servers concurrently.
358
+ *
359
+ * This method iterates through all active client connections and calls
360
+ * disconnect() on each one, handling errors individually to ensure
361
+ * that failure to disconnect from one server doesn't prevent disconnection
362
+ * from others. All disconnections are performed in parallel for efficiency.
363
+ *
364
+ * @returns {Promise<void>} Resolves when all disconnection attempts complete
365
+ *
366
+ * @example
367
+ * ```typescript
368
+ * await manager.disconnectAll();
369
+ * console.log('All servers disconnected');
370
+ * ```
371
+ */
372
+ async disconnectAll() {
373
+ logger.info('Disconnecting all servers...', LOG_MODULES.CONNECTION_MANAGER);
374
+ const serverIds = Array.from(this.clients.keys());
375
+ logger.info(`Found ${serverIds.length} connected server(s)`, LOG_MODULES.CONNECTION_MANAGER);
376
+ const disconnectPromises = serverIds.map(async (id) => {
377
+ logger.info(`Disconnecting server [${id}]...`, LOG_MODULES.CONNECTION_MANAGER);
378
+ try {
379
+ await this.disconnect(id);
380
+ logger.info(`Successfully disconnected server [${id}]`, LOG_MODULES.CONNECTION_MANAGER);
381
+ }
382
+ catch (error) {
383
+ logger.error(`Failed to disconnect server [${id}]:`, error, LOG_MODULES.CONNECTION_MANAGER);
384
+ }
385
+ });
386
+ await Promise.all(disconnectPromises);
387
+ logger.info('All servers disconnected', LOG_MODULES.CONNECTION_MANAGER);
388
+ }
389
+ /**
390
+ * Refreshes the tool cache for a specific server by fetching the latest tool list.
391
+ *
392
+ * This method queries the connected MCP server for its current set of available tools,
393
+ * updates both the server ID-level and server name-level caches, and maintains
394
+ * accurate tool counts in the server status. It handles server name resolution
395
+ * to ensure proper caching across multiple instances of the same server.
396
+ *
397
+ * @param {string} serverId - Unique identifier of the server instance to refresh
398
+ * @returns {Promise<Tool[]>} Array of updated tools with server context
399
+ * @throws {Error} If the server is not connected or tool listing fails
400
+ *
401
+ * @example
402
+ * ```typescript
403
+ * const tools = await manager.refreshTools('my-server-1');
404
+ * console.log(`Found ${tools.length} tools`);
405
+ * ```
406
+ */
407
+ async refreshTools(serverId) {
408
+ const client = this.clients.get(serverId);
409
+ if (!client) {
410
+ throw new Error(`Server ${serverId} not connected`);
411
+ }
412
+ try {
413
+ const result = await client.listTools();
414
+ const serverName = this._toolCache.getServerNameById(serverId);
415
+ const tools = result.tools.map((t) => ({
416
+ name: t.name,
417
+ description: t.description,
418
+ inputSchema: t.inputSchema,
419
+ serverName: serverName
420
+ }));
421
+ this._toolCache.setTools(serverId, tools, serverName !== 'unknown' ? serverName : undefined);
422
+ // Update status
423
+ const status = this.serverStatus.get(serverId);
424
+ if (status) {
425
+ status.toolsCount = tools.length;
426
+ status.lastCheck = Date.now();
427
+ }
428
+ logger.info(`Refreshed tools for server [${serverId}]: ${tools.length} tools found`, LOG_MODULES.CONNECTION_MANAGER);
429
+ return tools;
430
+ }
431
+ catch (error) {
432
+ logger.error(`Failed to list tools for server [${serverId}]:`, error, LOG_MODULES.CONNECTION_MANAGER);
433
+ throw error;
434
+ }
435
+ }
436
+ /**
437
+ * Refreshes the resource cache for a specific server by fetching available resources.
438
+ *
439
+ * This method queries the connected MCP server for its current set of available resources,
440
+ * handling servers that don't support the resources functionality gracefully by returning
441
+ * an empty array. It updates the resource cache and maintains accurate resource counts
442
+ * in the server status.
443
+ *
444
+ * The method specifically handles "Method not found" errors (MCP error code -32601)
445
+ * which indicate that the server doesn't implement the resources protocol, treating
446
+ * this as a normal case rather than an error.
447
+ *
448
+ * @param {string} serverId - Unique identifier of the server instance to refresh
449
+ * @returns {Promise<Resource[]>} Array of available resources, empty if unsupported
450
+ * @throws {Error} If the server is not connected or resource listing fails unexpectedly
451
+ *
452
+ * @example
453
+ * ```typescript
454
+ * const resources = await manager.refreshResources('my-server-1');
455
+ * console.log(`Found ${resources.length} resources`);
456
+ * ```
457
+ */
458
+ async refreshResources(serverId) {
459
+ const client = this.clients.get(serverId);
460
+ if (!client) {
461
+ throw new Error(`Server ${serverId} not connected`);
462
+ }
463
+ try {
464
+ // Check if client actually supports listResources method
465
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
466
+ if (typeof client.listResources !== 'function') {
467
+ logger.warn(`Server [${serverId}] does not support resources listing`, LOG_MODULES.CONNECTION_MANAGER);
468
+ return [];
469
+ }
470
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
471
+ const result = await client.listResources();
472
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
473
+ const resources = result.resources.map((r) => ({
474
+ name: r.name,
475
+ uri: r.uri,
476
+ mimeType: r.mimeType,
477
+ description: r.description
478
+ }));
479
+ this.resourceCache.set(serverId, resources);
480
+ // Update status
481
+ const status = this.serverStatus.get(serverId);
482
+ if (status) {
483
+ status.resourcesCount = resources.length;
484
+ status.lastCheck = Date.now();
485
+ }
486
+ logger.info(`Refreshed resources for server [${serverId}]: ${resources.length} resources found`, LOG_MODULES.CONNECTION_MANAGER);
487
+ return resources;
488
+ }
489
+ catch (error) {
490
+ // Check if error is "Method not found" (MCP error -32601), which means server doesn't implement resources
491
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
492
+ if (error && typeof error === 'object' && 'code' in error && error.code === -32601) {
493
+ logger.info(`Server [${serverId}] does not support resources functionality`, LOG_MODULES.CONNECTION_MANAGER);
494
+ }
495
+ else if (error &&
496
+ typeof error === 'object' &&
497
+ 'message' in error &&
498
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
499
+ typeof error.message === 'string' &&
500
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
501
+ error.message.includes('Method not found')) {
502
+ logger.info(`Server [${serverId}] does not support resources functionality`, LOG_MODULES.CONNECTION_MANAGER);
503
+ }
504
+ else {
505
+ logger.warn(`Failed to list resources for server [${serverId}]:`, error, LOG_MODULES.CONNECTION_MANAGER);
506
+ }
507
+ // Even if server doesn't support resources, store empty array in cache to ensure subsequent calls hit cache
508
+ this.resourceCache.set(serverId, []);
509
+ // Update server status
510
+ const status = this.serverStatus.get(serverId);
511
+ if (status) {
512
+ status.resourcesCount = 0;
513
+ status.lastCheck = Date.now();
514
+ }
515
+ return [];
516
+ }
517
+ }
518
+ /**
519
+ * Retrieves the current connection status for a specific server instance.
520
+ *
521
+ * This method provides access to the server's operational state including connection
522
+ * status, error information, tool/resource counts, and process details.
523
+ *
524
+ * @param {string} serverId - Unique identifier of the server instance
525
+ * @returns {ServerStatus | undefined} Current status object or undefined if not found
526
+ *
527
+ * @example
528
+ * ```typescript
529
+ * const status = manager.getStatus('my-server-1');
530
+ * if (status?.connected) {
531
+ * console.log('Server is connected');
532
+ * }
533
+ * ```
534
+ */
535
+ getStatus(serverId) {
536
+ return this.serverStatus.get(serverId);
537
+ }
538
+ /**
539
+ * Retrieves cached tools for a specific server instance.
540
+ *
541
+ * This method returns the currently cached tool list for the specified server,
542
+ * which may be empty if tools haven't been refreshed yet or if the server
543
+ * doesn't provide any tools. The method includes logging for debugging purposes.
544
+ *
545
+ * @param {string} serverId - Unique identifier of the server instance
546
+ * @returns {Tool[]} Array of cached tools, empty if none available
547
+ *
548
+ * @example
549
+ * ```typescript
550
+ * const tools = manager.getTools('my-server-1');
551
+ * console.log(`Server has ${tools.length} tools`);
552
+ * ```
553
+ */
554
+ getTools(serverId) {
555
+ return this._toolCache.getTools(serverId);
556
+ }
557
+ /**
558
+ * Retrieves cached resources for a specific server instance.
559
+ *
560
+ * This method returns the currently cached resource list for the specified server,
561
+ * which may be empty if resources haven't been refreshed yet, if the server doesn't
562
+ * support resources, or if the server doesn't provide any resources. The method
563
+ * includes logging for debugging purposes.
564
+ *
565
+ * @param {string} serverId - Unique identifier of the server instance
566
+ * @returns {Resource[]} Array of cached resources, empty if none available
567
+ *
568
+ * @example
569
+ * ```typescript
570
+ * const resources = manager.getResources('my-server-1');
571
+ * console.log(`Server has ${resources.length} resources`);
572
+ * ```
573
+ */
574
+ getResources(serverId) {
575
+ const resources = this.resourceCache.get(serverId) || [];
576
+ const fromCache = this.resourceCache.has(serverId);
577
+ logger.debug(`getResources for [${serverId}]: returned ${resources.length} resources (${fromCache ? 'from cache' : 'no cache'})`, LOG_MODULES.CONNECTION_MANAGER);
578
+ return resources;
579
+ }
580
+ /**
581
+ * Reads content from a specific resource URI on a connected MCP server.
582
+ *
583
+ * This method delegates the resource reading operation to the underlying MCP client,
584
+ * providing direct access to server-provided resources through their URIs.
585
+ *
586
+ * @param {string} serverId - Unique identifier of the connected server instance
587
+ * @param {string} uri - Resource URI to read (e.g., "file:///path/to/file")
588
+ * @returns {Promise<unknown>} Resource content as returned by the server
589
+ * @throws {Error} If the server is not connected or resource reading fails
590
+ *
591
+ * @example
592
+ * ```typescript
593
+ * const content = await manager.readResource('my-server-1', 'hub://config/settings.json');
594
+ * console.log('Resource content:', content);
595
+ * ```
596
+ */
597
+ async readResource(serverId, uri) {
598
+ const client = this.clients.get(serverId);
599
+ if (!client) {
600
+ throw new Error(`Server ${serverId} not connected`);
601
+ }
602
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
603
+ return client.readResource({ uri });
604
+ }
605
+ /**
606
+ * Retrieves all cached tools from all connected server instances.
607
+ *
608
+ * This method aggregates tools from all server ID-level caches into a single array,
609
+ * providing a unified view of all available tools across all connected servers.
610
+ * The returned tools include server context information for proper identification.
611
+ *
612
+ * @returns {Tool[]} Array of all cached tools from all connected servers
613
+ *
614
+ * @example
615
+ * ```typescript
616
+ * const allTools = manager.getAllTools();
617
+ * console.log(`Total tools available: ${allTools.length}`);
618
+ * ```
619
+ */
620
+ getAllTools() {
621
+ return this._toolCache.getAllTools();
622
+ }
623
+ /**
624
+ * Retrieves all tool cache entries as server ID to tools mapping.
625
+ *
626
+ * This method returns the raw tool cache structure as an array of [serverId, tools] tuples,
627
+ * providing direct access to the internal caching mechanism for debugging or advanced use cases.
628
+ *
629
+ * @returns {[string, Tool[]][]} Array of [serverId, tools] tuples representing the cache
630
+ *
631
+ * @example
632
+ * ```typescript
633
+ * const cacheEntries = manager.getToolCacheEntries();
634
+ * cacheEntries.forEach(([serverId, tools]) => {
635
+ * console.log(`Server ${serverId} has ${tools.length} tools`);
636
+ * });
637
+ * ```
638
+ */
639
+ getToolCacheEntries() {
640
+ return this._toolCache.getToolCacheEntries();
641
+ }
642
+ /**
643
+ * Resolves a server name to its corresponding server instance ID.
644
+ *
645
+ * This method provides reverse lookup from server names (as defined in configuration)
646
+ * to the unique server instance IDs used internally for connection management.
647
+ * It's useful when you have a server name but need the instance ID for operations.
648
+ *
649
+ * @param {string} name - Server name as defined in the configuration
650
+ * @returns {string | undefined} Corresponding server instance ID or undefined if not found
651
+ *
652
+ * @example
653
+ * ```typescript
654
+ * const serverId = manager.getServerIdByName('my-mcp-server');
655
+ * if (serverId) {
656
+ * const status = manager.getStatus(serverId);
657
+ * }
658
+ * ```
659
+ */
660
+ getServerIdByName(name) {
661
+ return this._toolCache.getServerIdByName(name);
662
+ }
663
+ /**
664
+ * Retrieves the MCP client instance for a server by its name.
665
+ *
666
+ * This method resolves a server name to its instance ID and returns the corresponding
667
+ * MCP client instance, providing direct access to the underlying SDK client for
668
+ * advanced operations that aren't covered by the manager's high-level methods.
669
+ *
670
+ * @param {string} name - Server name as defined in the configuration
671
+ * @returns {Client | undefined} MCP client instance or undefined if not connected
672
+ *
673
+ * @example
674
+ * ```typescript
675
+ * const client = manager.getClientByName('my-mcp-server');
676
+ * if (client) {
677
+ * // Use direct client methods for advanced operations
678
+ * const result = await client.listPrompts();
679
+ * }
680
+ * ```
681
+ */
682
+ getClientByName(name) {
683
+ const serverId = this._toolCache.getServerIdByName(name);
684
+ if (!serverId) {
685
+ return undefined;
686
+ }
687
+ return this.clients.get(serverId);
688
+ }
689
+ /**
690
+ * Calls a tool on a connected server using the server name instead of instance ID.
691
+ *
692
+ * This method provides a convenient way to execute tools when you have a server name
693
+ * rather than an instance ID. It resolves the server name to its instance ID and
694
+ * delegates to the callTool method for actual execution.
695
+ *
696
+ * The method is wrapped in OpenTelemetry tracing for observability and includes
697
+ * comprehensive error handling with proper logging.
698
+ *
699
+ * @param {string} name - Server name as defined in the configuration
700
+ * @param {string} toolName - Name of the tool to execute
701
+ * @param {Record<string, unknown>} args - Arguments to pass to the tool
702
+ * @returns {Promise<unknown>} Tool execution result as returned by the server
703
+ * @throws {Error} If server is not connected, not found, or tool execution fails
704
+ *
705
+ * @example
706
+ * ```typescript
707
+ * const result = await manager.callToolByName('my-mcp-server', 'list-files', {
708
+ * directory: '/home/user'
709
+ * });
710
+ * console.log('Tool result:', result);
711
+ * ```
712
+ */
713
+ async callToolByName(name, toolName, args) {
714
+ const serverId = this._toolCache.getServerIdByName(name);
715
+ if (!serverId) {
716
+ throw new Error(`Server ${name} not connected or not found`);
717
+ }
718
+ return this.callTool(serverId, toolName, args);
719
+ }
720
+ /**
721
+ * Retrieves the connection status for a server using its name instead of instance ID.
722
+ *
723
+ * This method resolves a server name to its instance ID and returns the corresponding
724
+ * server status, providing a convenient way to check server health when working with
725
+ * server names rather than instance IDs.
726
+ *
727
+ * @param {string} name - Server name as defined in the configuration
728
+ * @returns {ServerStatus | undefined} Current status object or undefined if not found/connected
729
+ *
730
+ * @example
731
+ * ```typescript
732
+ * const status = manager.getStatusByName('my-mcp-server');
733
+ * if (status?.connected) {
734
+ * console.log('Server is online');
735
+ * }
736
+ * ```
737
+ */
738
+ getStatusByName(name) {
739
+ const serverId = this._toolCache.getServerIdByName(name);
740
+ if (!serverId) {
741
+ return undefined;
742
+ }
743
+ return this.serverStatus.get(serverId);
744
+ }
745
+ /**
746
+ * Retrieves cached tools for a server using its name instead of instance ID.
747
+ *
748
+ * This method resolves a server name to its instance ID and returns the corresponding
749
+ * cached tool list, providing a convenient way to access tools when working with
750
+ * server names rather than instance IDs.
751
+ *
752
+ * @param {string} name - Server name as defined in the configuration
753
+ * @returns {Tool[]} Array of cached tools, empty if none available or not connected
754
+ *
755
+ * @example
756
+ * ```typescript
757
+ * const tools = manager.getToolsByName('my-mcp-server');
758
+ * console.log(`Server has ${tools.length} tools`);
759
+ * ```
760
+ */
761
+ getToolsByName(name) {
762
+ const serverId = this._toolCache.getServerIdByName(name);
763
+ if (!serverId) {
764
+ return [];
765
+ }
766
+ return this._toolCache.getTools(serverId);
767
+ }
768
+ /**
769
+ * Retrieves cached resources for a server using its name instead of instance ID.
770
+ *
771
+ * This method resolves a server name to its instance ID and returns the corresponding
772
+ * cached resource list, providing a convenient way to access resources when working with
773
+ * server names rather than instance IDs.
774
+ *
775
+ * @param {string} name - Server name as defined in the configuration
776
+ * @returns {Resource[]} Array of cached resources, empty if none available or not connected
777
+ *
778
+ * @example
779
+ * ```typescript
780
+ * const resources = manager.getResourcesByName('my-mcp-server');
781
+ * console.log(`Server has ${resources.length} resources`);
782
+ * ```
783
+ */
784
+ getResourcesByName(name) {
785
+ const serverId = this._toolCache.getServerIdByName(name);
786
+ if (!serverId) {
787
+ return [];
788
+ }
789
+ return this.resourceCache.get(serverId) || [];
790
+ }
791
+ /**
792
+ * Retrieves a specific tool by name from a server's cached tools.
793
+ *
794
+ * This method searches the server name-level tool cache for a tool with the specified name,
795
+ * providing efficient lookup without needing to iterate through all tools manually.
796
+ *
797
+ * @param {string} serverName - Server name as defined in the configuration
798
+ * @param {string} toolName - Exact name of the tool to find
799
+ * @returns {Tool | undefined} Tool object if found, undefined otherwise
800
+ *
801
+ * @example
802
+ * ```typescript
803
+ * const tool = manager.getTool('my-mcp-server', 'list-files');
804
+ * if (tool) {
805
+ * console.log('Tool description:', tool.description);
806
+ * }
807
+ * ```
808
+ */
809
+ getTool(serverName, toolName) {
810
+ return this._toolCache.getTool(serverName, toolName);
811
+ }
812
+ /**
813
+ * Retrieves all cached resources grouped by server name.
814
+ *
815
+ * This method aggregates resources from all server instances and groups them by their
816
+ * corresponding server names, providing a structured view of all available resources
817
+ * across the system organized by server origin.
818
+ *
819
+ * @returns {Record<string, Resource[]>} Object mapping server names to resource arrays
820
+ *
821
+ * @example
822
+ * ```typescript
823
+ * const allResources = manager.getAllResources();
824
+ * Object.entries(allResources).forEach(([serverName, resources]) => {
825
+ * console.log(`Server ${serverName} has ${resources.length} resources`);
826
+ * });
827
+ * ```
828
+ */
829
+ getAllResources() {
830
+ const result = {};
831
+ // Group resources by server name
832
+ for (const [serverId, resources] of this.resourceCache.entries()) {
833
+ // Find server name for this ID
834
+ const serverName = this._toolCache.getServerNameById(serverId);
835
+ if (!result[serverName]) {
836
+ result[serverName] = [];
837
+ }
838
+ result[serverName].push(...resources);
839
+ }
840
+ return result;
841
+ }
842
+ /**
843
+ * Executes a tool on a connected MCP server using its instance ID.
844
+ *
845
+ * This is the primary method for executing tools on connected servers. It delegates
846
+ * the actual execution to the underlying MCP client and includes comprehensive
847
+ * error handling with proper logging. The method is wrapped in OpenTelemetry tracing
848
+ * for observability and monitoring.
849
+ *
850
+ * @param {string} serverId - Unique identifier of the connected server instance
851
+ * @param {string} toolName - Name of the tool to execute
852
+ * @param {Record<string, unknown>} args - Arguments to pass to the tool
853
+ * @returns {Promise<unknown>} Tool execution result as returned by the server
854
+ * @throws {Error} If server is not connected or tool execution fails
855
+ *
856
+ * @example
857
+ * ```typescript
858
+ * const result = await manager.callTool('my-server-1', 'list-files', {
859
+ * directory: '/home/user'
860
+ * });
861
+ * console.log('Tool result:', result);
862
+ * ```
863
+ */
864
+ async callTool(serverId, toolName, args) {
865
+ const client = this.clients.get(serverId);
866
+ if (!client) {
867
+ throw new Error(`Server ${serverId} not connected`);
868
+ }
869
+ try {
870
+ const result = await client.callTool({
871
+ name: toolName,
872
+ arguments: args
873
+ });
874
+ return result;
875
+ }
876
+ catch (error) {
877
+ logger.error(`Failed to call tool ${toolName} on server [${serverId}]:`, error, LOG_MODULES.CONNECTION_MANAGER);
878
+ throw error;
879
+ }
880
+ }
881
+ /**
882
+ * Retrieves cached tools for a specific server name from the server name-level cache.
883
+ *
884
+ * This method provides access to the server name-level tool cache, which aggregates
885
+ * tools from all instances of the same server name. It's optimized for scenarios
886
+ * where you need to work with server names rather than individual instance IDs.
887
+ *
888
+ * @param {string} serverName - Server name as defined in the configuration
889
+ * @returns {Tool[]} Array of cached tools for the specified server name
890
+ *
891
+ * @example
892
+ * ```typescript
893
+ * const tools = manager.getToolsByServerName('my-mcp-server');
894
+ * console.log(`Server has ${tools.length} tools across all instances`);
895
+ * ```
896
+ */
897
+ getToolsByServerName(serverName) {
898
+ return this._toolCache.getToolsByServerName(serverName);
899
+ }
900
+ /**
901
+ * Retrieves all cached tools from all servers using the server name-level cache.
902
+ *
903
+ * This method aggregates tools from the server name-level cache, providing a unified
904
+ * view of all available tools optimized for search operations and scenarios where
905
+ * server name context is more relevant than individual instance IDs.
906
+ *
907
+ * @returns {Tool[]} Array of all cached tools from all servers
908
+ *
909
+ * @example
910
+ * ```typescript
911
+ * const allTools = manager.getAllToolsByServerName();
912
+ * console.log(`Total tools available: ${allTools.length}`);
913
+ * ```
914
+ */
915
+ getAllToolsByServerName() {
916
+ return this._toolCache.getAllToolsByServerName();
917
+ }
918
+ /**
919
+ * Backward compatibility: direct access to the underlying toolCache Map.
920
+ * This is maintained for backward compatibility with code that accesses
921
+ * mcpConnectionManager.toolCache directly.
922
+ *
923
+ * @deprecated Use the dedicated methods like getTools(), setTools(), etc. instead
924
+ */
925
+ get toolCache() {
926
+ return this._toolCache.internalToolCache;
927
+ }
928
+ }
929
+ export const mcpConnectionManager = new McpConnectionManager();