@loop_ouroboros/mcp-hub-lite 1.0.2 → 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 (333) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/dist/client/assets/{HomeView-7rMg9C6t.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-5q1b0P3O.js → _baseClone-Bp9Rjwd7.js} +1 -1
  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-H85n3BUC.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-DPsOVNIJ.js → omit-CqPQN3XP.js} +1 -1
  39. package/dist/client/assets/{raf-DY5mgbuB.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 +362 -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 +1 -57
  48. package/dist/server/shared/models/session.model.d.ts.map +1 -1
  49. package/dist/server/shared/models/session.model.js +1 -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/session-context.types.d.ts +0 -2
  53. package/dist/server/shared/types/session-context.types.d.ts.map +1 -1
  54. package/dist/server/shared/types/websocket.types.d.ts +17 -10
  55. package/dist/server/shared/types/websocket.types.d.ts.map +1 -1
  56. package/dist/server/src/api/mcp/gateway.d.ts +1 -3
  57. package/dist/server/src/api/mcp/gateway.d.ts.map +1 -1
  58. package/dist/server/src/api/mcp/gateway.js +19 -50
  59. package/dist/server/src/api/mcp/session-context-extractor.d.ts.map +1 -1
  60. package/dist/server/src/api/mcp/session-context-extractor.js +5 -14
  61. package/dist/server/src/api/web/hub-tools.d.ts +2 -2
  62. package/dist/server/src/api/web/hub-tools.d.ts.map +1 -1
  63. package/dist/server/src/api/web/hub-tools.js +3 -54
  64. package/dist/server/src/api/web/mcp-status.d.ts +1 -1
  65. package/dist/server/src/api/web/mcp-status.d.ts.map +1 -1
  66. package/dist/server/src/api/web/mcp-status.js +71 -30
  67. package/dist/server/src/api/web/resources.d.ts.map +1 -1
  68. package/dist/server/src/api/web/resources.js +28 -22
  69. package/dist/server/src/api/web/search.d.ts +2 -16
  70. package/dist/server/src/api/web/search.d.ts.map +1 -1
  71. package/dist/server/src/api/web/search.js +24 -45
  72. package/dist/server/src/api/web/servers.d.ts +3 -3
  73. package/dist/server/src/api/web/servers.d.ts.map +1 -1
  74. package/dist/server/src/api/web/servers.js +70 -25
  75. package/dist/server/src/api/ws/ws-handler.d.ts.map +1 -1
  76. package/dist/server/src/api/ws/ws-handler.js +4 -2
  77. package/dist/server/src/app.d.ts.map +1 -1
  78. package/dist/server/src/app.js +0 -2
  79. package/dist/server/src/cli/commands/list.js +2 -2
  80. package/dist/server/src/cli/commands/status.d.ts.map +1 -1
  81. package/dist/server/src/cli/commands/status.js +41 -30
  82. package/dist/server/src/cli/index.d.ts.map +1 -1
  83. package/dist/server/src/cli/index.js +2 -1
  84. package/dist/server/src/cli/server.d.ts +11 -2
  85. package/dist/server/src/cli/server.d.ts.map +1 -1
  86. package/dist/server/src/config/config-change-logger.d.ts +22 -0
  87. package/dist/server/src/config/config-change-logger.d.ts.map +1 -1
  88. package/dist/server/src/config/config-change-logger.js +135 -11
  89. package/dist/server/src/config/config-loader.d.ts +6 -5
  90. package/dist/server/src/config/config-loader.d.ts.map +1 -1
  91. package/dist/server/src/config/config-loader.js +54 -16
  92. package/dist/server/src/config/config-manager.d.ts +51 -43
  93. package/dist/server/src/config/config-manager.d.ts.map +1 -1
  94. package/dist/server/src/config/config-manager.js +84 -66
  95. package/dist/server/src/config/config-migrator.d.ts +82 -0
  96. package/dist/server/src/config/config-migrator.d.ts.map +1 -0
  97. package/dist/server/src/config/config-migrator.js +348 -0
  98. package/dist/server/src/config/config-saver.d.ts +2 -0
  99. package/dist/server/src/config/config-saver.d.ts.map +1 -1
  100. package/dist/server/src/config/config-saver.js +8 -2
  101. package/dist/server/src/config/config.schema.d.ts +10 -104
  102. package/dist/server/src/config/config.schema.d.ts.map +1 -1
  103. package/dist/server/src/config/config.schema.js +15 -99
  104. package/dist/server/src/config/path-validator.d.ts +27 -0
  105. package/dist/server/src/config/path-validator.d.ts.map +1 -0
  106. package/dist/server/src/config/path-validator.js +53 -0
  107. package/dist/server/src/config/server-config-manager.d.ts +37 -31
  108. package/dist/server/src/config/server-config-manager.d.ts.map +1 -1
  109. package/dist/server/src/config/server-config-manager.js +222 -66
  110. package/dist/server/src/config/type-converter.d.ts.map +1 -1
  111. package/dist/server/src/config/type-converter.js +3 -2
  112. package/dist/server/src/models/event.model.d.ts +17 -10
  113. package/dist/server/src/models/event.model.d.ts.map +1 -1
  114. package/dist/server/src/models/server.model.d.ts +17 -3
  115. package/dist/server/src/models/server.model.d.ts.map +1 -1
  116. package/dist/server/src/models/server.model.js +2 -1
  117. package/dist/server/src/models/system-tools.constants.d.ts +10 -27
  118. package/dist/server/src/models/system-tools.constants.d.ts.map +1 -1
  119. package/dist/server/src/models/system-tools.constants.js +4 -8
  120. package/dist/server/src/pid/manager.d.ts.map +1 -1
  121. package/dist/server/src/pid/manager.js +2 -1
  122. package/dist/server/src/server/dev-server.js +34 -20
  123. package/dist/server/src/server/runner.d.ts.map +1 -1
  124. package/dist/server/src/server/runner.js +41 -26
  125. package/dist/server/src/services/connection/connection-manager.d.ts +85 -103
  126. package/dist/server/src/services/connection/connection-manager.d.ts.map +1 -1
  127. package/dist/server/src/services/connection/connection-manager.js +286 -241
  128. package/dist/server/src/services/connection/tool-cache.d.ts +27 -25
  129. package/dist/server/src/services/connection/tool-cache.d.ts.map +1 -1
  130. package/dist/server/src/services/connection/tool-cache.js +50 -55
  131. package/dist/server/src/services/gateway/gateway.service.d.ts +2 -0
  132. package/dist/server/src/services/gateway/gateway.service.d.ts.map +1 -1
  133. package/dist/server/src/services/gateway/gateway.service.js +15 -19
  134. package/dist/server/src/services/gateway/global-transport.d.ts +10 -0
  135. package/dist/server/src/services/gateway/global-transport.d.ts.map +1 -0
  136. package/dist/server/src/services/gateway/global-transport.js +42 -0
  137. package/dist/server/src/services/gateway/request-handlers/call-tool-handler.d.ts.map +1 -1
  138. package/dist/server/src/services/gateway/request-handlers/call-tool-handler.js +67 -65
  139. package/dist/server/src/services/gateway/request-handlers/index.d.ts +1 -1
  140. package/dist/server/src/services/gateway/request-handlers/index.d.ts.map +1 -1
  141. package/dist/server/src/services/gateway/request-handlers/index.js +1 -1
  142. package/dist/server/src/services/gateway/request-handlers/initialize-handler.d.ts +1 -4
  143. package/dist/server/src/services/gateway/request-handlers/initialize-handler.d.ts.map +1 -1
  144. package/dist/server/src/services/gateway/request-handlers/initialize-handler.js +10 -81
  145. package/dist/server/src/services/gateway/request-handlers/initialize.constants.d.ts +35 -0
  146. package/dist/server/src/services/gateway/request-handlers/initialize.constants.d.ts.map +1 -0
  147. package/dist/server/src/services/gateway/request-handlers/initialize.constants.js +44 -0
  148. package/dist/server/src/services/gateway/request-handlers/resources-handler.d.ts.map +1 -1
  149. package/dist/server/src/services/gateway/request-handlers/resources-handler.js +5 -4
  150. package/dist/server/src/services/gateway/request-handlers/system-tools-handler.d.ts.map +1 -1
  151. package/dist/server/src/services/gateway/request-handlers/system-tools-handler.js +32 -77
  152. package/dist/server/src/services/gateway/request-handlers/tools-handler.d.ts.map +1 -1
  153. package/dist/server/src/services/gateway/request-handlers/tools-handler.js +4 -3
  154. package/dist/server/src/services/gateway/tool-list-generator.d.ts.map +1 -1
  155. package/dist/server/src/services/gateway/tool-list-generator.js +37 -16
  156. package/dist/server/src/services/gateway/types.d.ts +2 -1
  157. package/dist/server/src/services/gateway/types.d.ts.map +1 -1
  158. package/dist/server/src/services/hub-manager.service.d.ts +32 -238
  159. package/dist/server/src/services/hub-manager.service.d.ts.map +1 -1
  160. package/dist/server/src/services/hub-manager.service.js +89 -267
  161. package/dist/server/src/services/hub-tools/index.d.ts +1 -3
  162. package/dist/server/src/services/hub-tools/index.d.ts.map +1 -1
  163. package/dist/server/src/services/hub-tools/index.js +1 -2
  164. package/dist/server/src/services/hub-tools/instance-matcher.d.ts +62 -0
  165. package/dist/server/src/services/hub-tools/instance-matcher.d.ts.map +1 -0
  166. package/dist/server/src/services/hub-tools/instance-matcher.js +132 -0
  167. package/dist/server/src/services/hub-tools/instance-selector.d.ts +29 -0
  168. package/dist/server/src/services/hub-tools/instance-selector.d.ts.map +1 -0
  169. package/dist/server/src/services/hub-tools/instance-selector.js +103 -0
  170. package/dist/server/src/services/hub-tools/resource-generator.d.ts +24 -1
  171. package/dist/server/src/services/hub-tools/resource-generator.d.ts.map +1 -1
  172. package/dist/server/src/services/hub-tools/resource-generator.js +259 -39
  173. package/dist/server/src/services/hub-tools/server-selector.d.ts +26 -13
  174. package/dist/server/src/services/hub-tools/server-selector.d.ts.map +1 -1
  175. package/dist/server/src/services/hub-tools/server-selector.js +44 -37
  176. package/dist/server/src/services/hub-tools/system-tool-definitions.d.ts +1 -4
  177. package/dist/server/src/services/hub-tools/system-tool-definitions.d.ts.map +1 -1
  178. package/dist/server/src/services/hub-tools/system-tool-definitions.js +17 -80
  179. package/dist/server/src/services/hub-tools/tool-search.d.ts +7 -7
  180. package/dist/server/src/services/hub-tools/tool-search.d.ts.map +1 -1
  181. package/dist/server/src/services/hub-tools/tool-search.js +10 -4
  182. package/dist/server/src/services/hub-tools/types.d.ts +2 -2
  183. package/dist/server/src/services/hub-tools/types.d.ts.map +1 -1
  184. package/dist/server/src/services/hub-tools.service.d.ts +43 -72
  185. package/dist/server/src/services/hub-tools.service.d.ts.map +1 -1
  186. package/dist/server/src/services/hub-tools.service.js +185 -110
  187. package/dist/server/src/services/search/search-core.service.d.ts +5 -5
  188. package/dist/server/src/services/search/search-core.service.js +11 -11
  189. package/dist/server/src/services/session/session-manager.d.ts +12 -256
  190. package/dist/server/src/services/session/session-manager.d.ts.map +1 -1
  191. package/dist/server/src/services/session/session-manager.js +23 -585
  192. package/dist/server/src/services/session-tracker.service.d.ts +2 -10
  193. package/dist/server/src/services/session-tracker.service.d.ts.map +1 -1
  194. package/dist/server/src/services/session-tracker.service.js +2 -53
  195. package/dist/server/src/services/system-tool-handler.d.ts.map +1 -1
  196. package/dist/server/src/services/system-tool-handler.js +7 -17
  197. package/dist/server/src/utils/composite-key.d.ts +29 -0
  198. package/dist/server/src/utils/composite-key.d.ts.map +1 -0
  199. package/dist/server/src/utils/composite-key.js +39 -0
  200. package/dist/server/src/utils/error-handler.d.ts.map +1 -1
  201. package/dist/server/src/utils/error-handler.js +3 -2
  202. package/dist/server/src/utils/index.d.ts +2 -0
  203. package/dist/server/src/utils/index.d.ts.map +1 -1
  204. package/dist/server/src/utils/index.js +2 -0
  205. package/dist/server/src/utils/instance-id.d.ts +22 -0
  206. package/dist/server/src/utils/instance-id.d.ts.map +1 -0
  207. package/dist/server/src/utils/instance-id.js +59 -0
  208. package/dist/server/src/utils/json-utils.d.ts +4 -4
  209. package/dist/server/src/utils/json-utils.d.ts.map +1 -1
  210. package/dist/server/src/utils/json-utils.js +4 -4
  211. package/dist/server/src/utils/logger/dev-logger.d.ts +2 -1
  212. package/dist/server/src/utils/logger/dev-logger.d.ts.map +1 -1
  213. package/dist/server/src/utils/logger/log-formatter.d.ts.map +1 -1
  214. package/dist/server/src/utils/logger/log-formatter.js +82 -5
  215. package/dist/server/src/utils/logger/log-modules.d.ts +15 -9
  216. package/dist/server/src/utils/logger/log-modules.d.ts.map +1 -1
  217. package/dist/server/src/utils/logger/log-modules.js +8 -6
  218. package/dist/server/src/utils/parameter-validator.d.ts +10 -0
  219. package/dist/server/src/utils/parameter-validator.d.ts.map +1 -0
  220. package/dist/server/src/utils/parameter-validator.js +53 -0
  221. package/dist/server/src/utils/process-tree.d.ts +49 -0
  222. package/dist/server/src/utils/process-tree.d.ts.map +1 -0
  223. package/dist/server/src/utils/process-tree.js +285 -0
  224. package/dist/server/src/utils/request-context.d.ts +0 -18
  225. package/dist/server/src/utils/request-context.d.ts.map +1 -1
  226. package/dist/server/src/utils/request-context.js +0 -20
  227. package/dist/server/src/utils/sort-utils.d.ts +40 -0
  228. package/dist/server/src/utils/sort-utils.d.ts.map +1 -0
  229. package/dist/server/src/utils/sort-utils.js +131 -0
  230. package/dist/server/src/utils/transports/sse-transport.d.ts +16 -1
  231. package/dist/server/src/utils/transports/sse-transport.d.ts.map +1 -1
  232. package/dist/server/src/utils/transports/sse-transport.js +55 -9
  233. package/dist/server/src/utils/transports/stdio-transport.d.ts +24 -53
  234. package/dist/server/src/utils/transports/stdio-transport.d.ts.map +1 -1
  235. package/dist/server/src/utils/transports/stdio-transport.js +66 -247
  236. package/dist/server/src/utils/transports/streamable-http-transport.d.ts +24 -1
  237. package/dist/server/src/utils/transports/streamable-http-transport.d.ts.map +1 -1
  238. package/dist/server/src/utils/transports/streamable-http-transport.js +68 -8
  239. package/dist/server/src/utils/transports/transport-factory.d.ts +9 -4
  240. package/dist/server/src/utils/transports/transport-factory.d.ts.map +1 -1
  241. package/dist/server/src/utils/transports/transport-factory.js +31 -11
  242. package/dist/server/src/utils/transports/transport.interface.d.ts +6 -0
  243. package/dist/server/src/utils/transports/transport.interface.d.ts.map +1 -1
  244. package/dist/server/src/utils/version.d.ts +11 -0
  245. package/dist/server/src/utils/version.d.ts.map +1 -0
  246. package/dist/server/src/utils/version.js +57 -0
  247. package/dist/server/tests/contract/mcp-protocol/initialize.test.js +24 -24
  248. package/dist/server/tests/contract/mcp-protocol/tools-call.test.js +49 -45
  249. package/dist/server/tests/contract/mcp-protocol/tools-list.test.js +35 -36
  250. package/dist/server/tests/evaluation/evaluation.test.js +10 -9
  251. package/dist/server/tests/integration/api/gateway.test.js +2 -2
  252. package/dist/server/tests/integration/gateway/fault-tolerance.test.js +65 -25
  253. package/dist/server/tests/integration/gateway/mcp-connection.test.js +53 -61
  254. package/dist/server/tests/server.test.js +27 -16
  255. package/dist/server/tests/temp/temp-run-docling.d.ts +2 -0
  256. package/dist/server/tests/temp/temp-run-docling.d.ts.map +1 -0
  257. package/dist/server/tests/temp/temp-run-docling.js +53 -0
  258. package/dist/server/tests/types/test-helpers.d.ts +1 -2
  259. package/dist/server/tests/types/test-helpers.d.ts.map +1 -1
  260. package/dist/server/tests/unit/config/config-loader-automatic-migration.test.d.ts +2 -0
  261. package/dist/server/tests/unit/config/config-loader-automatic-migration.test.d.ts.map +1 -0
  262. package/dist/server/tests/unit/config/config-loader-automatic-migration.test.js +199 -0
  263. package/dist/server/tests/unit/config/config-migrator.test.d.ts +2 -0
  264. package/dist/server/tests/unit/config/config-migrator.test.d.ts.map +1 -0
  265. package/dist/server/tests/unit/config/config-migrator.test.js +316 -0
  266. package/dist/server/tests/unit/config/config-saver.test.d.ts +2 -0
  267. package/dist/server/tests/unit/config/config-saver.test.d.ts.map +1 -0
  268. package/dist/server/tests/unit/config/config-saver.test.js +200 -0
  269. package/dist/server/tests/unit/config/config.schema.test.d.ts +2 -0
  270. package/dist/server/tests/unit/config/config.schema.test.d.ts.map +1 -0
  271. package/dist/server/tests/unit/config/config.schema.test.js +347 -0
  272. package/dist/server/tests/unit/server/runner.test.js +86 -62
  273. package/dist/server/tests/unit/services/connection/connection-manager.test.d.ts +2 -0
  274. package/dist/server/tests/unit/services/connection/connection-manager.test.d.ts.map +1 -0
  275. package/dist/server/tests/unit/services/connection/connection-manager.test.js +112 -0
  276. package/dist/server/tests/unit/services/hub-manager-service.test.js +112 -46
  277. package/dist/server/tests/unit/services/hub-manager.test.js +25 -15
  278. package/dist/server/tests/unit/services/hub-tools/instance-selector.test.d.ts +2 -0
  279. package/dist/server/tests/unit/services/hub-tools/instance-selector.test.d.ts.map +1 -0
  280. package/dist/server/tests/unit/services/hub-tools/instance-selector.test.js +195 -0
  281. package/dist/server/tests/unit/services/hub-tools/server-selector.test.d.ts +2 -0
  282. package/dist/server/tests/unit/services/hub-tools/server-selector.test.d.ts.map +1 -0
  283. package/dist/server/tests/unit/services/hub-tools/server-selector.test.js +190 -0
  284. package/dist/server/tests/unit/services/hub-tools.service.test.js +560 -320
  285. package/dist/server/tests/unit/services/instance-matcher.test.d.ts +2 -0
  286. package/dist/server/tests/unit/services/instance-matcher.test.d.ts.map +1 -0
  287. package/dist/server/tests/unit/services/instance-matcher.test.js +256 -0
  288. package/dist/server/tests/unit/services/session-manager.test.js +26 -436
  289. package/dist/server/tests/unit/utils/config.test.js +88 -186
  290. package/dist/server/tests/unit/utils/json-utils.test.js +18 -18
  291. package/dist/server/tests/unit/utils/logger-formatter.test.d.ts +2 -0
  292. package/dist/server/tests/unit/utils/logger-formatter.test.d.ts.map +1 -0
  293. package/dist/server/tests/unit/utils/logger-formatter.test.js +66 -0
  294. package/dist/server/tests/unit/utils/parameter-validator.test.d.ts +2 -0
  295. package/dist/server/tests/unit/utils/parameter-validator.test.d.ts.map +1 -0
  296. package/dist/server/tests/unit/utils/parameter-validator.test.js +63 -0
  297. package/dist/server/tests/unit/utils/process-tree.test.d.ts +2 -0
  298. package/dist/server/tests/unit/utils/process-tree.test.d.ts.map +1 -0
  299. package/dist/server/tests/unit/utils/process-tree.test.js +129 -0
  300. package/dist/server/tests/unit/utils/request-context.test.js +5 -24
  301. package/dist/server/tests/unit/utils/sort-utils.test.d.ts +2 -0
  302. package/dist/server/tests/unit/utils/sort-utils.test.d.ts.map +1 -0
  303. package/dist/server/tests/unit/utils/sort-utils.test.js +220 -0
  304. package/dist/server/tests/unit/utils/transport-factory.test.d.ts +2 -0
  305. package/dist/server/tests/unit/utils/transport-factory.test.d.ts.map +1 -0
  306. package/dist/server/tests/unit/utils/transport-factory.test.js +55 -0
  307. package/package.json +1 -1
  308. package/dist/client/assets/ResourceDetailView-Bf-1ffbk.js +0 -1
  309. package/dist/client/assets/ResourcesView-CjMklkyv.css +0 -1
  310. package/dist/client/assets/ResourcesView-g5x4xCPh.js +0 -1
  311. package/dist/client/assets/ServerDashboard-Chpne8Q0.css +0 -1
  312. package/dist/client/assets/ServerDashboard-G8Wmp4hF.js +0 -2
  313. package/dist/client/assets/ServerListView-dV2XrPjo.js +0 -32
  314. package/dist/client/assets/ServerStatusTags.vue_vue_type_script_setup_true_lang-BHiTFM7-.js +0 -1
  315. package/dist/client/assets/SessionsView-Ckd38lj1.js +0 -1
  316. package/dist/client/assets/SettingsView-BJUdepEQ.js +0 -1
  317. package/dist/client/assets/ToolCallDialog-C_bTCpHC.js +0 -1
  318. package/dist/client/assets/ToolsView-0c2eputu.js +0 -1
  319. package/dist/client/assets/el-form-item-BVMLpmVC.css +0 -1
  320. package/dist/client/assets/el-form-item-ClFnj49k.js +0 -12
  321. package/dist/client/assets/el-input-CDnuSKVZ.js +0 -1
  322. package/dist/client/assets/el-input-CmuHb8HS.css +0 -1
  323. package/dist/client/assets/el-overlay-B2ZKM6Up.css +0 -1
  324. package/dist/client/assets/el-overlay-CzMkXyYy.js +0 -1
  325. package/dist/client/assets/el-select-DvjGddk_.js +0 -1
  326. package/dist/client/assets/el-tab-pane-C_DQMcwe.js +0 -1
  327. package/dist/client/assets/el-table-column-CASRIbZM.js +0 -1
  328. package/dist/client/assets/el-table-column-T_mV9jNw.css +0 -1
  329. package/dist/client/assets/el-tag-DjxZVOpb.css +0 -1
  330. package/dist/client/assets/el-tag-npbwux4f.js +0 -1
  331. package/dist/client/assets/index-CCnAxNF8.js +0 -2
  332. package/dist/client/assets/index-d1DZeSfz.js +0 -1
  333. package/dist/client/assets/vnode-CHomNjgN.js +0 -1
@@ -9,11 +9,11 @@ export class TransportFactory {
9
9
  /**
10
10
  * Create transport client
11
11
  * @param server Server configuration, including base configuration and instance configuration
12
- * @param serverId Optional server ID for log storage integration
12
+ * @param compositeKey Optional composite key (serverName-serverIndex) for log storage integration
13
13
  * @returns Transport client instance
14
14
  * @throws Error if server type is not supported or configuration is invalid
15
15
  */
16
- static createTransport(server, serverId) {
16
+ static createTransport(server, compositeKey) {
17
17
  const transportConfig = this.validateAndConvertConfig(server);
18
18
  // Use type assertion to ensure TypeScript can correctly infer types
19
19
  const config = transportConfig;
@@ -29,20 +29,20 @@ export class TransportFactory {
29
29
  cwd: process.cwd(),
30
30
  stderr: 'pipe'
31
31
  }, server.name, {
32
- serverId,
33
- logStorage: serverId ? logStorage : undefined
32
+ compositeKey,
33
+ logStorage: compositeKey ? logStorage : undefined
34
34
  });
35
35
  case 'sse':
36
36
  if (!config.url) {
37
37
  throw new Error('SSE transport requires a URL');
38
38
  }
39
- return new SseTransport(config.url, config.headers, config.reconnectInterval, config.maxReconnectAttempts);
39
+ return new SseTransport(config.url, config.headers, config.reconnectInterval, config.maxReconnectAttempts, config.proxy, server.name, compositeKey);
40
40
  case 'streamable-http':
41
41
  case 'http': // Compatibility with http type, treat as streamable-http
42
42
  if (!config.url) {
43
43
  throw new Error('Streamable HTTP transport requires a URL');
44
44
  }
45
- return new StreamableHttpTransport(config.url, config.headers, config.timeout);
45
+ return new StreamableHttpTransport(config.url, config.headers, config.timeout, config.proxy, server.name, compositeKey);
46
46
  default:
47
47
  throw new Error(`Unsupported transport type: ${config.type || 'undefined'}`);
48
48
  }
@@ -51,8 +51,26 @@ export class TransportFactory {
51
51
  * Build system environment variables
52
52
  * Add necessary system environment variables for stdio transport
53
53
  */
54
- static buildSystemEnv() {
55
- return {};
54
+ static buildSystemEnv(command) {
55
+ const env = {};
56
+ // For Python-related commands, set PYTHONUTF8=1 to ensure proper UTF-8 handling
57
+ if (command && this.isPythonCommand(command)) {
58
+ env.PYTHONUTF8 = '1';
59
+ }
60
+ return env;
61
+ }
62
+ /**
63
+ * Check if a command is related to Python execution
64
+ * Detects python, python3, py, uv, uvx, and similar commands
65
+ */
66
+ static isPythonCommand(command) {
67
+ const trimmedCommand = command.trim();
68
+ if (!trimmedCommand)
69
+ return false;
70
+ // Extract the basename (last part after / or \)
71
+ const parts = trimmedCommand.split(/[\\/]/);
72
+ const basename = parts[parts.length - 1].toLowerCase();
73
+ return basename.includes('python') || basename.startsWith('uv') || basename.startsWith('py');
56
74
  }
57
75
  /**
58
76
  * Validate and convert server configuration to transport configuration
@@ -65,7 +83,7 @@ export class TransportFactory {
65
83
  command: server.command || '',
66
84
  args: server.args,
67
85
  env: {
68
- ...this.buildSystemEnv(), // System environment variables
86
+ ...this.buildSystemEnv(server.command), // System environment variables
69
87
  ...(server.env || {}) // User-defined environment variables (can override system defaults)
70
88
  },
71
89
  cwd: process.cwd(),
@@ -78,7 +96,8 @@ export class TransportFactory {
78
96
  url: server.url || '',
79
97
  headers: server.headers || server.env, // Prefer headers, fallback to env for backward compatibility
80
98
  reconnectInterval: 3000,
81
- maxReconnectAttempts: 5
99
+ maxReconnectAttempts: 5,
100
+ proxy: server.proxy
82
101
  };
83
102
  }
84
103
  else if (type === 'streamable-http' || type === 'http') {
@@ -86,7 +105,8 @@ export class TransportFactory {
86
105
  type: 'streamable-http', // Unified conversion to streamable-http
87
106
  url: server.url || '',
88
107
  headers: server.headers || server.env, // Prefer headers, fallback to env for backward compatibility
89
- timeout: server.timeout || 30000
108
+ timeout: server.timeout || 30000,
109
+ proxy: server.proxy
90
110
  };
91
111
  }
92
112
  else {
@@ -18,6 +18,9 @@ export interface SseTransportConfig {
18
18
  headers?: Record<string, string>;
19
19
  reconnectInterval?: number;
20
20
  maxReconnectAttempts?: number;
21
+ proxy?: {
22
+ url: string;
23
+ };
21
24
  }
22
25
  /**
23
26
  * Streamable HTTP transport configuration
@@ -27,6 +30,9 @@ export interface StreamableHttpTransportConfig {
27
30
  url: string;
28
31
  headers?: Record<string, string>;
29
32
  timeout?: number;
33
+ proxy?: {
34
+ url: string;
35
+ };
30
36
  }
31
37
  /**
32
38
  * Generic server configuration
@@ -1 +1 @@
1
- {"version":3,"file":"transport.interface.d.ts","sourceRoot":"","sources":["../../../../../src/utils/transports/transport.interface.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;CACxC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,KAAK,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC5C,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAAC;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAC7B,oBAAoB,GACpB,kBAAkB,GAClB,6BAA6B,CAAC"}
1
+ {"version":3,"file":"transport.interface.d.ts","sourceRoot":"","sources":["../../../../../src/utils/transports/transport.interface.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;CACxC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,KAAK,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,KAAK,CAAC,EAAE;QACN,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC5C,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAAC;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE;QACN,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;CACH;AAED;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAC7B,oBAAoB,GACpB,kBAAkB,GAClB,6BAA6B,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Get the application version from package.json.
3
+ *
4
+ * @returns The package version string or a safe fallback on failure.
5
+ */
6
+ export declare function getAppVersion(): string;
7
+ /**
8
+ * Get the MCP protocol version used by the gateway.
9
+ */
10
+ export declare function getProtocolVersion(): string;
11
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../../../src/utils/version.ts"],"names":[],"mappings":"AA8CA;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAMtC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C"}
@@ -0,0 +1,57 @@
1
+ import fs from 'fs';
2
+ import { fileURLToPath } from 'node:url';
3
+ import path from 'node:path';
4
+ const FALLBACK_VERSION = '0.0.0';
5
+ const MCP_PROTOCOL_VERSION = '2024-11-05';
6
+ let cachedAppVersion;
7
+ /**
8
+ * Resolve package version from package.json with multiple fallback paths.
9
+ */
10
+ function resolvePackageVersion() {
11
+ const baseDirs = [
12
+ process.cwd(),
13
+ path.dirname(fileURLToPath(import.meta.url)),
14
+ path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..')
15
+ ];
16
+ for (const baseDir of baseDirs) {
17
+ let currentDir = baseDir;
18
+ for (let depth = 0; depth < 6; depth += 1) {
19
+ const candidate = path.join(currentDir, 'package.json');
20
+ try {
21
+ if (fs.existsSync(candidate)) {
22
+ const packageText = fs.readFileSync(candidate, 'utf-8');
23
+ const parsed = JSON.parse(packageText);
24
+ if (parsed.version && typeof parsed.version === 'string') {
25
+ return parsed.version;
26
+ }
27
+ }
28
+ }
29
+ catch {
30
+ // Ignore parsing/file read errors and continue searching.
31
+ }
32
+ const parent = path.dirname(currentDir);
33
+ if (parent === currentDir) {
34
+ break;
35
+ }
36
+ currentDir = parent;
37
+ }
38
+ }
39
+ return FALLBACK_VERSION;
40
+ }
41
+ /**
42
+ * Get the application version from package.json.
43
+ *
44
+ * @returns The package version string or a safe fallback on failure.
45
+ */
46
+ export function getAppVersion() {
47
+ if (!cachedAppVersion) {
48
+ cachedAppVersion = resolvePackageVersion();
49
+ }
50
+ return cachedAppVersion;
51
+ }
52
+ /**
53
+ * Get the MCP protocol version used by the gateway.
54
+ */
55
+ export function getProtocolVersion() {
56
+ return MCP_PROTOCOL_VERSION;
57
+ }
@@ -1,6 +1,7 @@
1
1
  import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
2
  import { mcpConnectionManager } from '../../../src/services/mcp-connection-manager.js';
3
3
  import { hubManager } from '../../../src/services/hub-manager.service.js';
4
+ import { resolveInstanceConfig } from '../../../src/config/config-migrator.js';
4
5
  // Mock MCP SDK
5
6
  vi.mock('@modelcontextprotocol/sdk/client/index.js', () => {
6
7
  return {
@@ -39,22 +40,23 @@ vi.mock('@utils/transports/transport-factory.js', () => {
39
40
  describe('MCP Protocol Contract - initialize (with SDK)', () => {
40
41
  const serverName = 'test-sdk-server';
41
42
  let serverId;
43
+ let serverIndex;
42
44
  beforeEach(async () => {
43
- // Add to hub manager
45
+ // Add to hub manager (v1.1 format)
44
46
  await hubManager.addServer(serverName, {
45
47
  command: 'node',
46
48
  args: [],
47
- enabled: true,
48
49
  type: 'stdio',
49
50
  timeout: 60000,
50
- allowedTools: []
51
+ aggregatedTools: []
51
52
  });
52
53
  // Add server instance
53
54
  const instance = await hubManager.addServerInstance(serverName, {});
54
55
  serverId = instance.id;
56
+ serverIndex = instance.index ?? 0;
55
57
  });
56
58
  afterEach(async () => {
57
- await mcpConnectionManager.disconnect(serverId);
59
+ await mcpConnectionManager.disconnect(serverName, serverIndex);
58
60
  hubManager.removeServer(serverName);
59
61
  });
60
62
  it('should correctly initialize MCP connection with SDK', async () => {
@@ -63,18 +65,17 @@ describe('MCP Protocol Contract - initialize (with SDK)', () => {
63
65
  if (!serverInfo) {
64
66
  throw new Error('Server not found');
65
67
  }
66
- await mcpConnectionManager.connect({
68
+ // Resolve the complete configuration using v1.1 resolveInstanceConfig
69
+ const resolvedConfig = resolveInstanceConfig(serverInfo.config, serverId);
70
+ if (!resolvedConfig) {
71
+ throw new Error('Failed to resolve server configuration');
72
+ }
73
+ await mcpConnectionManager.connect(serverName, serverIndex, {
74
+ ...resolvedConfig,
67
75
  id: serverId,
68
- command: serverInfo.config.command,
69
- args: serverInfo.config.args,
70
- enabled: serverInfo.config.enabled,
71
- type: serverInfo.config.type,
72
- timeout: serverInfo.config.timeout,
73
- allowedTools: serverInfo.config.allowedTools,
74
- timestamp: serverInfo.instance.timestamp,
75
- hash: serverInfo.instance.hash
76
+ timestamp: Date.now()
76
77
  });
77
- const status = mcpConnectionManager.getStatus(serverId);
78
+ const status = mcpConnectionManager.getStatus(serverName, serverIndex);
78
79
  expect(status?.connected).toBe(true);
79
80
  expect(status?.version).toBe('1.0.0');
80
81
  });
@@ -84,18 +85,17 @@ describe('MCP Protocol Contract - initialize (with SDK)', () => {
84
85
  if (!serverInfo) {
85
86
  throw new Error('Server not found');
86
87
  }
87
- await mcpConnectionManager.connect({
88
+ // Resolve the complete configuration using v1.1 resolveInstanceConfig
89
+ const resolvedConfig = resolveInstanceConfig(serverInfo.config, serverId);
90
+ if (!resolvedConfig) {
91
+ throw new Error('Failed to resolve server configuration');
92
+ }
93
+ await mcpConnectionManager.connect(serverName, serverIndex, {
94
+ ...resolvedConfig,
88
95
  id: serverId,
89
- command: serverInfo.config.command,
90
- args: serverInfo.config.args,
91
- enabled: serverInfo.config.enabled,
92
- type: serverInfo.config.type,
93
- timeout: serverInfo.config.timeout,
94
- allowedTools: serverInfo.config.allowedTools,
95
- timestamp: serverInfo.instance.timestamp,
96
- hash: serverInfo.instance.hash
96
+ timestamp: Date.now()
97
97
  });
98
- const tools = mcpConnectionManager.getTools(serverId);
98
+ const tools = mcpConnectionManager.getTools(serverName, serverIndex);
99
99
  expect(tools).toHaveLength(1);
100
100
  expect(tools[0].name).toBe('echo');
101
101
  expect(tools[0].description).toBe('Echo the input');
@@ -1,12 +1,15 @@
1
1
  import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
2
  import { mcpConnectionManager } from '../../../src/services/mcp-connection-manager.js';
3
3
  import { hubManager } from '../../../src/services/hub-manager.service.js';
4
+ import { resolveInstanceConfig } from '../../../src/config/config-migrator.js';
4
5
  // Mock MCP SDK
6
+ const mockListTools = vi.fn().mockResolvedValue({ tools: [] });
5
7
  vi.mock('@modelcontextprotocol/sdk/client/index.js', () => {
6
8
  return {
7
9
  Client: class {
8
10
  connect = vi.fn().mockResolvedValue(undefined);
9
11
  close = vi.fn().mockResolvedValue(undefined);
12
+ listTools = mockListTools;
10
13
  callTool = vi.fn().mockImplementation((toolCall) => {
11
14
  if (toolCall.name === 'calculator') {
12
15
  const { a, b, operation } = toolCall.arguments;
@@ -67,22 +70,23 @@ vi.mock('@utils/transports/transport-factory.js', () => {
67
70
  describe('MCP Protocol Contract - tools/call (with SDK)', () => {
68
71
  const serverName = 'test-sdk-server';
69
72
  let serverId;
73
+ let serverIndex;
70
74
  beforeEach(async () => {
71
- // Add to hub manager
75
+ // Add to hub manager (v1.1 format)
72
76
  await hubManager.addServer(serverName, {
73
77
  command: 'node',
74
78
  args: [],
75
- enabled: true,
76
79
  type: 'stdio',
77
80
  timeout: 60000,
78
- allowedTools: []
81
+ aggregatedTools: []
79
82
  });
80
83
  // Add server instance
81
84
  const instance = await hubManager.addServerInstance(serverName, {});
82
85
  serverId = instance.id;
86
+ serverIndex = instance.index ?? 0;
83
87
  });
84
88
  afterEach(async () => {
85
- await mcpConnectionManager.disconnect(serverId);
89
+ await mcpConnectionManager.disconnect(serverName, serverIndex);
86
90
  hubManager.removeServer(serverName);
87
91
  });
88
92
  it('should execute tool with correct arguments', async () => {
@@ -91,18 +95,17 @@ describe('MCP Protocol Contract - tools/call (with SDK)', () => {
91
95
  if (!serverInfo) {
92
96
  throw new Error('Server not found');
93
97
  }
94
- await mcpConnectionManager.connect({
98
+ // Resolve the complete configuration using v1.1 resolveInstanceConfig
99
+ const resolvedConfig = resolveInstanceConfig(serverInfo.config, serverId);
100
+ if (!resolvedConfig) {
101
+ throw new Error('Failed to resolve server configuration');
102
+ }
103
+ await mcpConnectionManager.connect(serverName, serverIndex, {
104
+ ...resolvedConfig,
95
105
  id: serverId,
96
- command: serverInfo.config.command,
97
- args: serverInfo.config.args,
98
- enabled: serverInfo.config.enabled,
99
- type: serverInfo.config.type,
100
- timeout: serverInfo.config.timeout,
101
- allowedTools: serverInfo.config.allowedTools,
102
- timestamp: serverInfo.instance.timestamp,
103
- hash: serverInfo.instance.hash
106
+ timestamp: Date.now()
104
107
  });
105
- const result = (await mcpConnectionManager.callTool(serverId, 'calculator', {
108
+ const result = (await mcpConnectionManager.callTool(serverName, serverIndex, 'calculator', {
106
109
  a: 5,
107
110
  b: 3,
108
111
  operation: 'add'
@@ -116,18 +119,17 @@ describe('MCP Protocol Contract - tools/call (with SDK)', () => {
116
119
  if (!serverInfo) {
117
120
  throw new Error('Server not found');
118
121
  }
119
- await mcpConnectionManager.connect({
122
+ // Resolve the complete configuration using v1.1 resolveInstanceConfig
123
+ const resolvedConfig = resolveInstanceConfig(serverInfo.config, serverId);
124
+ if (!resolvedConfig) {
125
+ throw new Error('Failed to resolve server configuration');
126
+ }
127
+ await mcpConnectionManager.connect(serverName, serverIndex, {
128
+ ...resolvedConfig,
120
129
  id: serverId,
121
- command: serverInfo.config.command,
122
- args: serverInfo.config.args,
123
- enabled: serverInfo.config.enabled,
124
- type: serverInfo.config.type,
125
- timeout: serverInfo.config.timeout,
126
- allowedTools: serverInfo.config.allowedTools,
127
- timestamp: serverInfo.instance.timestamp,
128
- hash: serverInfo.instance.hash
130
+ timestamp: Date.now()
129
131
  });
130
- await expect(mcpConnectionManager.callTool(serverId, 'calculator', {
132
+ await expect(mcpConnectionManager.callTool(serverName, serverIndex, 'calculator', {
131
133
  a: 'invalid',
132
134
  b: 3,
133
135
  operation: 'add'
@@ -139,18 +141,17 @@ describe('MCP Protocol Contract - tools/call (with SDK)', () => {
139
141
  if (!serverInfo) {
140
142
  throw new Error('Server not found');
141
143
  }
142
- await mcpConnectionManager.connect({
144
+ // Resolve the complete configuration using v1.1 resolveInstanceConfig
145
+ const resolvedConfig = resolveInstanceConfig(serverInfo.config, serverId);
146
+ if (!resolvedConfig) {
147
+ throw new Error('Failed to resolve server configuration');
148
+ }
149
+ await mcpConnectionManager.connect(serverName, serverIndex, {
150
+ ...resolvedConfig,
143
151
  id: serverId,
144
- command: serverInfo.config.command,
145
- args: serverInfo.config.args,
146
- enabled: serverInfo.config.enabled,
147
- type: serverInfo.config.type,
148
- timeout: serverInfo.config.timeout,
149
- allowedTools: serverInfo.config.allowedTools,
150
- timestamp: serverInfo.instance.timestamp,
151
- hash: serverInfo.instance.hash
152
+ timestamp: Date.now()
152
153
  });
153
- await expect(mcpConnectionManager.callTool(serverId, 'unknown_tool', {})).rejects.toThrow();
154
+ await expect(mcpConnectionManager.callTool(serverName, serverIndex, 'unknown_tool', {})).rejects.toThrow();
154
155
  });
155
156
  it('should support multiple concurrent tool calls', async () => {
156
157
  // Get server configuration and instance configuration
@@ -158,20 +159,23 @@ describe('MCP Protocol Contract - tools/call (with SDK)', () => {
158
159
  if (!serverInfo) {
159
160
  throw new Error('Server not found');
160
161
  }
161
- await mcpConnectionManager.connect({
162
+ // Resolve the complete configuration using v1.1 resolveInstanceConfig
163
+ const resolvedConfig = resolveInstanceConfig(serverInfo.config, serverId);
164
+ if (!resolvedConfig) {
165
+ throw new Error('Failed to resolve server configuration');
166
+ }
167
+ await mcpConnectionManager.connect(serverName, serverIndex, {
168
+ ...resolvedConfig,
162
169
  id: serverId,
163
- command: serverInfo.config.command,
164
- args: serverInfo.config.args,
165
- enabled: serverInfo.config.enabled,
166
- type: serverInfo.config.type,
167
- timeout: serverInfo.config.timeout,
168
- allowedTools: serverInfo.config.allowedTools,
169
- timestamp: serverInfo.instance.timestamp,
170
- hash: serverInfo.instance.hash
170
+ timestamp: Date.now()
171
171
  });
172
172
  const [result1, result2] = await Promise.all([
173
- mcpConnectionManager.callTool(serverId, 'get_weather', { location: 'New York' }),
174
- mcpConnectionManager.callTool(serverId, 'search_news', { query: 'technology' })
173
+ mcpConnectionManager.callTool(serverName, serverIndex, 'get_weather', {
174
+ location: 'New York'
175
+ }),
176
+ mcpConnectionManager.callTool(serverName, serverIndex, 'search_news', {
177
+ query: 'technology'
178
+ })
175
179
  ]);
176
180
  expect(result1).toHaveProperty('temperature');
177
181
  expect(result1).toHaveProperty('condition');
@@ -1,8 +1,9 @@
1
1
  import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
2
  import { mcpConnectionManager } from '../../../src/services/mcp-connection-manager.js';
3
3
  import { hubManager } from '../../../src/services/hub-manager.service.js';
4
+ import { resolveInstanceConfig } from '../../../src/config/config-migrator.js';
4
5
  // Mock MCP SDK
5
- const mockListTools = vi.fn();
6
+ const mockListTools = vi.fn().mockResolvedValue({ tools: [] });
6
7
  vi.mock('@modelcontextprotocol/sdk/client/index.js', () => {
7
8
  return {
8
9
  Client: class {
@@ -29,22 +30,23 @@ vi.mock('@utils/transports/transport-factory.js', () => {
29
30
  describe('MCP Protocol Contract - tools/list (with SDK)', () => {
30
31
  const serverName = 'test-sdk-server';
31
32
  let serverId;
33
+ let serverIndex;
32
34
  beforeEach(async () => {
33
- // Add to hub manager
35
+ // Add to hub manager (v1.1 format)
34
36
  await hubManager.addServer(serverName, {
35
37
  command: 'node',
36
38
  args: [],
37
- enabled: true,
38
39
  type: 'stdio',
39
40
  timeout: 60000,
40
- allowedTools: []
41
+ aggregatedTools: []
41
42
  });
42
43
  // Add server instance
43
44
  const instance = await hubManager.addServerInstance(serverName, {});
44
45
  serverId = instance.id;
46
+ serverIndex = instance.index ?? 0;
45
47
  });
46
48
  afterEach(async () => {
47
- await mcpConnectionManager.disconnect(serverId);
49
+ await mcpConnectionManager.disconnect(serverName, serverIndex);
48
50
  hubManager.removeServer(serverName);
49
51
  });
50
52
  it('should return tools with correct MCP schema', async () => {
@@ -82,18 +84,17 @@ describe('MCP Protocol Contract - tools/list (with SDK)', () => {
82
84
  if (!serverInfo) {
83
85
  throw new Error('Server not found');
84
86
  }
85
- await mcpConnectionManager.connect({
87
+ // Resolve the complete configuration using v1.1 resolveInstanceConfig
88
+ const resolvedConfig = resolveInstanceConfig(serverInfo.config, serverId);
89
+ if (!resolvedConfig) {
90
+ throw new Error('Failed to resolve server configuration');
91
+ }
92
+ await mcpConnectionManager.connect(serverName, serverIndex, {
93
+ ...resolvedConfig,
86
94
  id: serverId,
87
- command: serverInfo.config.command,
88
- args: serverInfo.config.args,
89
- enabled: serverInfo.config.enabled,
90
- type: serverInfo.config.type,
91
- timeout: serverInfo.config.timeout,
92
- allowedTools: serverInfo.config.allowedTools,
93
- timestamp: serverInfo.instance.timestamp,
94
- hash: serverInfo.instance.hash
95
+ timestamp: Date.now()
95
96
  });
96
- const tools = mcpConnectionManager.getTools(serverId);
97
+ const tools = mcpConnectionManager.getTools(serverName, serverIndex);
97
98
  expect(tools).toHaveLength(2);
98
99
  // Verify calculator tool
99
100
  const calculator = tools.find((t) => t.name === 'calculator');
@@ -114,19 +115,18 @@ describe('MCP Protocol Contract - tools/list (with SDK)', () => {
114
115
  if (!serverInfo) {
115
116
  throw new Error('Server not found');
116
117
  }
117
- await mcpConnectionManager.connect({
118
+ // Resolve the complete configuration using v1.1 resolveInstanceConfig
119
+ const resolvedConfig = resolveInstanceConfig(serverInfo.config, serverId);
120
+ if (!resolvedConfig) {
121
+ throw new Error('Failed to resolve server configuration');
122
+ }
123
+ await mcpConnectionManager.connect(serverName, serverIndex, {
124
+ ...resolvedConfig,
118
125
  id: serverId,
119
- command: serverInfo.config.command,
120
- args: serverInfo.config.args,
121
- enabled: serverInfo.config.enabled,
122
- type: serverInfo.config.type,
123
- timeout: serverInfo.config.timeout,
124
- allowedTools: serverInfo.config.allowedTools,
125
- timestamp: serverInfo.instance.timestamp,
126
- hash: serverInfo.instance.hash
126
+ timestamp: Date.now()
127
127
  });
128
- const tools1 = mcpConnectionManager.getTools(serverId);
129
- const tools2 = mcpConnectionManager.getTools(serverId);
128
+ const tools1 = mcpConnectionManager.getTools(serverName, serverIndex);
129
+ const tools2 = mcpConnectionManager.getTools(serverName, serverIndex);
130
130
  expect(tools1).toEqual(tools2);
131
131
  expect(tools1[0]).toBe(tools2[0]); // Reference equality
132
132
  });
@@ -138,18 +138,17 @@ describe('MCP Protocol Contract - tools/list (with SDK)', () => {
138
138
  if (!serverInfo) {
139
139
  throw new Error('Server not found');
140
140
  }
141
- await mcpConnectionManager.connect({
141
+ // Resolve the complete configuration using v1.1 resolveInstanceConfig
142
+ const resolvedConfig = resolveInstanceConfig(serverInfo.config, serverId);
143
+ if (!resolvedConfig) {
144
+ throw new Error('Failed to resolve server configuration');
145
+ }
146
+ await mcpConnectionManager.connect(serverName, serverIndex, {
147
+ ...resolvedConfig,
142
148
  id: serverId,
143
- command: serverInfo.config.command,
144
- args: serverInfo.config.args,
145
- enabled: serverInfo.config.enabled,
146
- type: serverInfo.config.type,
147
- timeout: serverInfo.config.timeout,
148
- allowedTools: serverInfo.config.allowedTools,
149
- timestamp: serverInfo.instance.timestamp,
150
- hash: serverInfo.instance.hash
149
+ timestamp: Date.now()
151
150
  });
152
- const tools = mcpConnectionManager.getTools(serverId);
151
+ const tools = mcpConnectionManager.getTools(serverName, serverIndex);
153
152
  expect(tools).toHaveLength(0);
154
153
  });
155
154
  });
@@ -84,19 +84,20 @@ describe('MCP Evaluation Tests', () => {
84
84
  expect(hasDestructiveIndicator, `Answer ${index + 1} may contain destructive operations: "${answer}"`).toBe(false);
85
85
  });
86
86
  });
87
- it('should reference valid tools', () => {
87
+ it('should reference valid MCP tools', () => {
88
88
  const validTools = [
89
- 'list-servers',
90
- 'find-servers',
91
- 'list-all-tools-in-server',
92
- 'find-tools-in-server',
93
- 'get-tool',
94
- 'call-tool',
95
- 'find-tools'
89
+ 'list_servers',
90
+ 'find_servers',
91
+ 'list_all_tools_in_server',
92
+ 'find_tools_in_server',
93
+ 'get_tool',
94
+ 'call_tool',
95
+ 'find_tools'
96
96
  ];
97
97
  const content = fs.readFileSync(evaluationFile, 'utf-8');
98
+ const normalizedContent = content.replace(/\b[a-z]+(?:-[a-z]+)+\b/g, (match) => match.replace(/-/g, '_'));
98
99
  validTools.forEach((tool) => {
99
- expect(content).toContain(tool);
100
+ expect(normalizedContent).toContain(tool);
100
101
  });
101
102
  });
102
103
  });
@@ -127,7 +127,7 @@ describe('GatewayService', () => {
127
127
  vi.mocked(mocks.getServerById).mockReturnValue({
128
128
  name: 'Test Server',
129
129
  id: 'server1',
130
- config: { allowedTools: ['testTool'] },
130
+ config: { template: { aggregatedTools: ['testTool'] } },
131
131
  instance: { id: 'server1', timestamp: Date.now(), hash: 'abc123' }
132
132
  });
133
133
  // Populate toolCache for the test
@@ -170,7 +170,7 @@ describe('GatewayService', () => {
170
170
  vi.mocked(mocks.getServerById).mockReturnValue({
171
171
  name: 'Test Server',
172
172
  id: 'server1',
173
- config: { allowedTools: ['testTool'] },
173
+ config: { template: { aggregatedTools: ['testTool'] } },
174
174
  instance: { id: 'server1', timestamp: Date.now(), hash: 'abc123' }
175
175
  });
176
176
  // Find list tools handler to populate tool map