@loop_ouroboros/mcp-hub-lite 1.2.8 → 1.3.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 (165) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/dist/client/assets/{HomeView-CgEri1kD.js → HomeView-Bi2bkUKf.js} +1 -1
  3. package/dist/client/assets/{ResourceDetailView-DUJZbegl.css → ResourceDetailView-BkTSg91z.css} +1 -1
  4. package/dist/client/assets/ResourceDetailView-DyuSovH9.js +1 -0
  5. package/dist/client/assets/ResourcesView-CU0VbNy5.js +1 -0
  6. package/dist/client/assets/ResourcesView-zgV8Nq7w.css +1 -0
  7. package/dist/client/assets/{ServerDashboard-B3O-crvv.js → ServerDashboard-BGyyZAti.js} +1 -1
  8. package/dist/client/assets/{ServerDetail-CXg8rI3q.css → ServerDetail-CPNAFBPM.css} +1 -1
  9. package/dist/client/assets/ServerDetail-bcQ8BVXR.js +2 -0
  10. package/dist/client/assets/{ServerListView-SlZN8ppC.js → ServerListView-yQPVJFHG.js} +1 -1
  11. package/dist/client/assets/{ServerStatusTags.vue_vue_type_script_setup_true_lang-DmGg4uuV.js → ServerStatusTags.vue_vue_type_script_setup_true_lang-C8gQlxGE.js} +1 -1
  12. package/dist/client/assets/{SettingsView-D8fiOG0O.js → SettingsView-B1DxbFP3.js} +1 -1
  13. package/dist/client/assets/ToolCallDialog-BQ9UJZ_-.css +1 -0
  14. package/dist/client/assets/ToolCallDialog-DEapCO06.js +1 -0
  15. package/dist/client/assets/ToolsView-DA0u_bCw.js +1 -0
  16. package/dist/client/assets/ToolsView-cO61nMNr.css +1 -0
  17. package/dist/client/assets/{_baseClone-BYxCbA_9.js → _baseClone-B991Lvrt.js} +1 -1
  18. package/dist/client/assets/{el-form-item-ySymCPMr.js → el-form-item-DfWq_kSy.js} +1 -1
  19. package/dist/client/assets/{el-input-C85p6Nqj.js → el-input-5YzZrwir.js} +1 -1
  20. package/dist/client/assets/{el-loading-DIjKEx81.js → el-loading-DE3FcxNH.js} +1 -1
  21. package/dist/client/assets/{el-overlay-B_CxiSem.js → el-overlay-BTeTueuN.js} +1 -1
  22. package/dist/client/assets/{el-radio-group-BjkTCPRf.js → el-radio-group-Y1E2bxIW.js} +1 -1
  23. package/dist/client/assets/{el-skeleton-item-CupTKK6n.js → el-skeleton-item-DhgR50Jx.js} +1 -1
  24. package/dist/client/assets/{el-switch-BosIJ9jf.js → el-switch-fF--nMSD.js} +1 -1
  25. package/dist/client/assets/{el-tab-pane-BydxdJoc.js → el-tab-pane-rvS_KTwP.js} +1 -1
  26. package/dist/client/assets/{el-table-column-DV5TZOUW.js → el-table-column-B1O8mY47.js} +1 -1
  27. package/dist/client/assets/{index-xJkq2euk.css → index-Bzz3tYbS.css} +1 -1
  28. package/dist/client/assets/index-DkqV9kH4.js +2 -0
  29. package/dist/client/assets/{omit-DxDGRttI.js → omit-BIIebEYo.js} +1 -1
  30. package/dist/client/assets/{raf-Y9AoxecD.js → raf-Cj-gATZv.js} +1 -1
  31. package/dist/client/index.html +2 -2
  32. package/dist/server/shared/models/constants.d.ts +3 -0
  33. package/dist/server/shared/models/constants.d.ts.map +1 -0
  34. package/dist/server/shared/models/constants.js +2 -0
  35. package/dist/server/shared/models/index.d.ts +1 -0
  36. package/dist/server/shared/models/index.d.ts.map +1 -1
  37. package/dist/server/shared/models/index.js +1 -0
  38. package/dist/server/shared/types/index.d.ts +0 -1
  39. package/dist/server/shared/types/index.d.ts.map +1 -1
  40. package/dist/server/shared/types/index.js +0 -1
  41. package/dist/server/src/api/mcp/debug-response-wrapper.js +1 -1
  42. package/dist/server/src/api/mcp/gateway.d.ts.map +1 -1
  43. package/dist/server/src/api/mcp/gateway.js +23 -41
  44. package/dist/server/src/api/web/hub-tools.d.ts.map +1 -1
  45. package/dist/server/src/api/web/hub-tools.js +11 -0
  46. package/dist/server/src/api/web/mcp-status.js +2 -2
  47. package/dist/server/src/api/web/search.d.ts +2 -1
  48. package/dist/server/src/api/web/search.d.ts.map +1 -1
  49. package/dist/server/src/api/web/search.js +23 -10
  50. package/dist/server/src/api/web/servers.js +1 -1
  51. package/dist/server/src/api/ws/events.js +1 -1
  52. package/dist/server/src/api/ws/ws-handler.js +1 -1
  53. package/dist/server/src/app.js +1 -1
  54. package/dist/server/src/cli/commands/tool-use.d.ts +10 -3
  55. package/dist/server/src/cli/commands/tool-use.d.ts.map +1 -1
  56. package/dist/server/src/cli/commands/tool-use.js +69 -30
  57. package/dist/server/src/config/config-change-logger.js +1 -1
  58. package/dist/server/src/config/config-loader.js +1 -1
  59. package/dist/server/src/config/config-manager.js +1 -1
  60. package/dist/server/src/config/config-migrator.d.ts +4 -48
  61. package/dist/server/src/config/config-migrator.d.ts.map +1 -1
  62. package/dist/server/src/config/config-migrator.js +2 -103
  63. package/dist/server/src/config/config-saver.js +1 -1
  64. package/dist/server/src/config/server-config-manager.js +1 -1
  65. package/dist/server/src/models/event.model.d.ts +0 -98
  66. package/dist/server/src/models/event.model.d.ts.map +1 -1
  67. package/dist/server/src/models/event.model.js +0 -4
  68. package/dist/server/src/models/server.model.d.ts +0 -2
  69. package/dist/server/src/models/server.model.d.ts.map +1 -1
  70. package/dist/server/src/models/system-tools.constants.d.ts +8 -3
  71. package/dist/server/src/models/system-tools.constants.d.ts.map +1 -1
  72. package/dist/server/src/models/system-tools.constants.js +5 -2
  73. package/dist/server/src/pid/manager.js +1 -1
  74. package/dist/server/src/pid/types.d.ts +0 -5
  75. package/dist/server/src/pid/types.d.ts.map +1 -1
  76. package/dist/server/src/server/dev-server.js +2 -2
  77. package/dist/server/src/server/runner.js +2 -2
  78. package/dist/server/src/server/startup.js +2 -2
  79. package/dist/server/src/services/connection/connection-manager.d.ts.map +1 -1
  80. package/dist/server/src/services/connection/connection-manager.js +16 -21
  81. package/dist/server/src/services/connection/tool-cache.d.ts.map +1 -1
  82. package/dist/server/src/services/connection/tool-cache.js +10 -8
  83. package/dist/server/src/services/event-bus.service.d.ts +3 -1
  84. package/dist/server/src/services/event-bus.service.d.ts.map +1 -1
  85. package/dist/server/src/services/event-bus.service.js +1 -0
  86. package/dist/server/src/services/gateway/gateway.service.d.ts +1 -0
  87. package/dist/server/src/services/gateway/gateway.service.d.ts.map +1 -1
  88. package/dist/server/src/services/gateway/gateway.service.js +29 -7
  89. package/dist/server/src/services/gateway/request-handlers/call-tool-handler.d.ts +1 -2
  90. package/dist/server/src/services/gateway/request-handlers/call-tool-handler.d.ts.map +1 -1
  91. package/dist/server/src/services/gateway/request-handlers/call-tool-handler.js +24 -13
  92. package/dist/server/src/services/gateway/request-handlers/resources-handler.d.ts.map +1 -1
  93. package/dist/server/src/services/gateway/request-handlers/resources-handler.js +7 -3
  94. package/dist/server/src/services/gateway/request-handlers/system-tools-handler.d.ts.map +1 -1
  95. package/dist/server/src/services/gateway/request-handlers/system-tools-handler.js +28 -1
  96. package/dist/server/src/services/gateway/tool-list-generator.d.ts +14 -19
  97. package/dist/server/src/services/gateway/tool-list-generator.d.ts.map +1 -1
  98. package/dist/server/src/services/gateway/tool-list-generator.js +221 -80
  99. package/dist/server/src/services/hub-manager.service.d.ts.map +1 -1
  100. package/dist/server/src/services/hub-manager.service.js +21 -4
  101. package/dist/server/src/services/hub-tools/instance-selector.js +1 -1
  102. package/dist/server/src/services/hub-tools/resource-generator.d.ts +0 -21
  103. package/dist/server/src/services/hub-tools/resource-generator.d.ts.map +1 -1
  104. package/dist/server/src/services/hub-tools/resource-generator.js +15 -15
  105. package/dist/server/src/services/hub-tools/server-selector.js +1 -1
  106. package/dist/server/src/services/hub-tools/system-tool-definitions.d.ts +1 -0
  107. package/dist/server/src/services/hub-tools/system-tool-definitions.d.ts.map +1 -1
  108. package/dist/server/src/services/hub-tools/system-tool-definitions.js +25 -1
  109. package/dist/server/src/services/hub-tools.service.d.ts +21 -4
  110. package/dist/server/src/services/hub-tools.service.d.ts.map +1 -1
  111. package/dist/server/src/services/hub-tools.service.js +74 -13
  112. package/dist/server/src/services/log-storage.service.js +1 -1
  113. package/dist/server/src/services/system-tool-handler.d.ts.map +1 -1
  114. package/dist/server/src/services/system-tool-handler.js +10 -2
  115. package/dist/server/src/utils/error-handler.js +1 -1
  116. package/dist/server/src/utils/index.d.ts +1 -1
  117. package/dist/server/src/utils/index.d.ts.map +1 -1
  118. package/dist/server/src/utils/index.js +1 -1
  119. package/dist/server/src/utils/instance-id.d.ts +0 -8
  120. package/dist/server/src/utils/instance-id.d.ts.map +1 -1
  121. package/dist/server/src/utils/instance-id.js +1 -1
  122. package/dist/server/src/utils/json-utils.js +4 -4
  123. package/dist/server/src/utils/log-rotator.d.ts +0 -15
  124. package/dist/server/src/utils/log-rotator.d.ts.map +1 -1
  125. package/dist/server/src/utils/log-rotator.js +0 -18
  126. package/dist/server/src/utils/logger/index.d.ts +0 -22
  127. package/dist/server/src/utils/logger/index.d.ts.map +1 -1
  128. package/dist/server/src/utils/logger/index.js +0 -29
  129. package/dist/server/src/utils/port-checker.js +1 -1
  130. package/dist/server/src/utils/sort-utils.d.ts +0 -16
  131. package/dist/server/src/utils/sort-utils.d.ts.map +1 -1
  132. package/dist/server/src/utils/sort-utils.js +0 -42
  133. package/dist/server/src/utils/transports/stdio-transport.js +1 -1
  134. package/dist/server/src/utils/transports/streamable-http-transport.js +1 -1
  135. package/dist/server/src/utils/transports/transport-factory.d.ts.map +1 -1
  136. package/dist/server/src/utils/transports/transport-factory.js +26 -3
  137. package/dist/server/tests/contract/mcp-protocol/initialize.test.js +1 -1
  138. package/dist/server/tests/contract/mcp-protocol/tools-call.test.js +1 -1
  139. package/dist/server/tests/contract/mcp-protocol/tools-list.test.js +1 -1
  140. package/dist/server/tests/integration/gateway/fault-tolerance.test.js +1 -1
  141. package/dist/server/tests/integration/gateway/mcp-connection.test.js +1 -1
  142. package/dist/server/tests/types/logger-test-helpers.d.ts +1 -1
  143. package/dist/server/tests/types/logger-test-helpers.d.ts.map +1 -1
  144. package/dist/server/tests/unit/api/search.test.d.ts +2 -0
  145. package/dist/server/tests/unit/api/search.test.d.ts.map +1 -0
  146. package/dist/server/tests/unit/api/search.test.js +61 -0
  147. package/dist/server/tests/unit/config/config-migrator.test.js +45 -105
  148. package/dist/server/tests/unit/config/config-saver.test.js +1 -1
  149. package/dist/server/tests/unit/server/runner.test.js +5 -6
  150. package/dist/server/tests/unit/services/gateway-logging.test.js +1 -1
  151. package/dist/server/tests/unit/services/hub-manager-service.test.js +4 -5
  152. package/dist/server/tests/unit/services/hub-tools.service.test.js +80 -3
  153. package/dist/server/tests/unit/utils/log-rotator.test.js +1 -15
  154. package/dist/server/tests/unit/utils/logger.test.js +1 -23
  155. package/dist/server/tests/unit/utils/sort-utils.test.js +1 -92
  156. package/package.json +1 -3
  157. package/dist/client/assets/ResourceDetailView-B8Qo1_jK.js +0 -1
  158. package/dist/client/assets/ResourcesView-B12FzUdo.js +0 -1
  159. package/dist/client/assets/ResourcesView-Cc8RHtia.css +0 -1
  160. package/dist/client/assets/ServerDetail-Bz5_9yOY.js +0 -2
  161. package/dist/client/assets/ToolCallDialog-BhdPX-Kf.css +0 -1
  162. package/dist/client/assets/ToolCallDialog-DYEdhnCk.js +0 -1
  163. package/dist/client/assets/ToolsView-BreAl-yn.js +0 -1
  164. package/dist/client/assets/ToolsView-BxgXvPC3.css +0 -1
  165. package/dist/client/assets/index-kC4mf0Vo.js +0 -2
@@ -22,7 +22,7 @@
22
22
  * automatically manages memory by cleaning up empty event type entries when all listeners
23
23
  * are unsubscribed.
24
24
  */
25
- import type { EventData } from '../models/event.model.js';
25
+ type EventData = unknown;
26
26
  /**
27
27
  * Interface representing a published event with its type and associated data.
28
28
  *
@@ -154,6 +154,7 @@ export declare const EventTypes: {
154
154
  readonly SERVER_INSTANCE_UPDATED: "server-instance-updated";
155
155
  readonly SERVER_INSTANCE_DELETED: "server-instance-deleted";
156
156
  readonly TOOLS_UPDATED: "tools";
157
+ readonly AGGREGATED_TOOLS_CHANGED: "aggregated-tools-changed";
157
158
  readonly TOOL_CALL_STARTED: "tool-call-started";
158
159
  readonly TOOL_CALL_COMPLETED: "tool-call-completed";
159
160
  readonly TOOL_CALL_ERROR: "tool-call-error";
@@ -162,4 +163,5 @@ export declare const EventTypes: {
162
163
  readonly CONFIGURATION_UPDATED: "configuration-updated";
163
164
  };
164
165
  export declare const eventBus: EventBusService;
166
+ export {};
165
167
  //# sourceMappingURL=event-bus.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"event-bus.service.d.ts","sourceRoot":"","sources":["../../../../src/services/event-bus.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAExD;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,SAAS,CAAqD;IAEtE;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI;IAajD;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,GAAG,MAAM,IAAI;IAU7E;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,WAAW;IAWnB;;;;;;;;;;;;;;OAcG;IACH,cAAc,IAAI,IAAI;IAItB;;;;;;;;;;;;;;OAcG;IACH,aAAa,IAAI,MAAM,EAAE;IAIzB;;;;;;;;;;;;;;;OAeG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;CAI5C;AAGD,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;CA4Bb,CAAC;AAGX,eAAO,MAAM,QAAQ,iBAAwB,CAAC"}
1
+ {"version":3,"file":"event-bus.service.d.ts","sourceRoot":"","sources":["../../../../src/services/event-bus.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,KAAK,SAAS,GAAG,OAAO,CAAC;AAEzB;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,SAAS,CAAqD;IAEtE;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI;IAajD;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,GAAG,MAAM,IAAI;IAU7E;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,WAAW;IAWnB;;;;;;;;;;;;;;OAcG;IACH,cAAc,IAAI,IAAI;IAItB;;;;;;;;;;;;;;OAcG;IACH,aAAa,IAAI,MAAM,EAAE;IAIzB;;;;;;;;;;;;;;;OAeG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;CAI5C;AAGD,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;CA6Bb,CAAC;AAGX,eAAO,MAAM,QAAQ,iBAAwB,CAAC"}
@@ -181,6 +181,7 @@ export const EventTypes = {
181
181
  SERVER_INSTANCE_DELETED: 'server-instance-deleted',
182
182
  // Tool related events
183
183
  TOOLS_UPDATED: 'tools',
184
+ AGGREGATED_TOOLS_CHANGED: 'aggregated-tools-changed',
184
185
  TOOL_CALL_STARTED: 'tool-call-started',
185
186
  TOOL_CALL_COMPLETED: 'tool-call-completed',
186
187
  TOOL_CALL_ERROR: 'tool-call-error',
@@ -23,6 +23,7 @@ export declare class GatewayService {
23
23
  private transport;
24
24
  private readonly appVersion;
25
25
  constructor();
26
+ private initToolCache;
26
27
  private createServerWithHandlers;
27
28
  private registerHandlers;
28
29
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"gateway.service.d.ts","sourceRoot":"","sources":["../../../../../src/services/gateway/gateway.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAepE,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE5D,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,SAAS,CAAqC;IACtD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;;IAOpC,OAAO,CAAC,wBAAwB;IA2BhC,OAAO,CAAC,gBAAgB;IAuDxB;;;;;OAKG;IACI,wBAAwB,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC;IAIvF;;;;;OAKG;IACI,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM;IAI5C;;;;;OAKG;IACI,kBAAkB,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM;IAIpD;;;;OAIG;IACI,sBAAsB,IAAI,SAAS;IAI1C;;;;OAIG;IACU,KAAK;CAKnB;AAED,eAAO,MAAM,OAAO,gBAAuB,CAAC"}
1
+ {"version":3,"file":"gateway.service.d.ts","sourceRoot":"","sources":["../../../../../src/services/gateway/gateway.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAsBpE,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE5D,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,SAAS,CAAqC;IACtD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;;IAQpC,OAAO,CAAC,aAAa;IA0BrB,OAAO,CAAC,wBAAwB;IA2BhC,OAAO,CAAC,gBAAgB;IAkDxB;;;;;OAKG;IACI,wBAAwB,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC;IAIvF;;;;;OAKG;IACI,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM;IAI5C;;;;;OAKG;IACI,kBAAkB,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM;IAIpD;;;;OAIG;IACI,sBAAsB,IAAI,SAAS;IAI1C;;;;OAIG;IACU,KAAK;CAKnB;AAED,eAAO,MAAM,OAAO,gBAAuB,CAAC"}
@@ -24,7 +24,9 @@ import { getGatewayDebugSetting } from '../../utils/json-utils.js';
24
24
  import { MCP_HUB_LITE_SERVER } from '../../models/system-tools.constants.js';
25
25
  import { registerInitializeHandlers, registerResourcesHandlers, registerSystemToolsHandlers, registerCallToolHandler } from './request-handlers/index.js';
26
26
  import { getAppVersion } from '../../utils/version.js';
27
- import { generateGatewayToolsList } from './tool-list-generator.js';
27
+ import { eventBus, EventTypes } from '../event-bus.service.js';
28
+ import { hubManager } from '../hub-manager.service.js';
29
+ import { generateGatewayToolsList, rebuildFromScratch, addToCache, removeFromCache } from './tool-list-generator.js';
28
30
  import { formatToolArgs, formatToolResponse } from './log-formatter.js';
29
31
  export class GatewayService {
30
32
  server;
@@ -33,6 +35,31 @@ export class GatewayService {
33
35
  constructor() {
34
36
  this.appVersion = getAppVersion();
35
37
  this.server = this.createServerWithHandlers();
38
+ this.initToolCache();
39
+ }
40
+ initToolCache() {
41
+ rebuildFromScratch();
42
+ eventBus.subscribe(EventTypes.TOOLS_UPDATED, (rawData) => {
43
+ const data = rawData;
44
+ const serverConfig = hubManager.getServerByName(data.serverName);
45
+ if (serverConfig?.template?.aggregatedTools?.length) {
46
+ rebuildFromScratch();
47
+ }
48
+ });
49
+ eventBus.subscribe(EventTypes.SERVER_DISCONNECTED, (rawData) => {
50
+ const data = rawData;
51
+ const serverConfig = hubManager.getServerByName(data.serverName);
52
+ if (!serverConfig || serverConfig.template?.aggregatedTools?.length) {
53
+ rebuildFromScratch();
54
+ }
55
+ });
56
+ eventBus.subscribe(EventTypes.AGGREGATED_TOOLS_CHANGED, (rawData) => {
57
+ const data = rawData;
58
+ if (data.added.length > 0)
59
+ addToCache(data.name, data.added);
60
+ if (data.removed.length > 0)
61
+ removeFromCache(data.name, data.removed);
62
+ });
36
63
  }
37
64
  createServerWithHandlers() {
38
65
  if (getGatewayDebugSetting()) {
@@ -60,11 +87,6 @@ export class GatewayService {
60
87
  if (getGatewayDebugSetting()) {
61
88
  logger.debug('Registering handlers on MCP server', LOG_MODULES.GATEWAY_SERVICE);
62
89
  }
63
- // Local toolMap for this connection
64
- const toolMap = new Map();
65
- if (getGatewayDebugSetting()) {
66
- logger.debug('Created local toolMap for connection', LOG_MODULES.GATEWAY_SERVICE);
67
- }
68
90
  try {
69
91
  registerInitializeHandlers(server);
70
92
  if (getGatewayDebugSetting()) {
@@ -96,7 +118,7 @@ export class GatewayService {
96
118
  throw error;
97
119
  }
98
120
  try {
99
- registerCallToolHandler(server, toolMap);
121
+ registerCallToolHandler(server);
100
122
  if (getGatewayDebugSetting()) {
101
123
  logger.debug('Call tool handler registered successfully', LOG_MODULES.GATEWAY_SERVICE);
102
124
  }
@@ -2,12 +2,11 @@
2
2
  * Call tool request handler for Gateway service.
3
3
  */
4
4
  import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
- import type { ToolMapEntry } from '../types.js';
6
5
  /**
7
6
  * Register call tool handler on the MCP server.
8
7
  *
9
8
  * @param server - MCP server instance to register handlers on
10
9
  * @param toolMap - Tool map for routing tool calls
11
10
  */
12
- export declare function registerCallToolHandler(server: McpServer, toolMap: Map<string, ToolMapEntry>): void;
11
+ export declare function registerCallToolHandler(server: McpServer): void;
13
12
  //# sourceMappingURL=call-tool-handler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"call-tool-handler.d.ts","sourceRoot":"","sources":["../../../../../../src/services/gateway/request-handlers/call-tool-handler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAezE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAgFhD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GACjC,IAAI,CA8FN"}
1
+ {"version":3,"file":"call-tool-handler.d.ts","sourceRoot":"","sources":["../../../../../../src/services/gateway/request-handlers/call-tool-handler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA4FzE;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwG/D"}
@@ -3,14 +3,13 @@
3
3
  */
4
4
  import { CallToolRequestSchema, ListToolsRequestSchema, McpError } from '@modelcontextprotocol/sdk/types.js';
5
5
  import { logger, LOG_MODULES } from '../../../utils/index.js';
6
- import { stringifyForLogging } from '../../../utils/json-utils.js';
7
- import { mcpConnectionManager } from '../../mcp-connection-manager.js';
6
+ import { hubToolsService } from '../../hub-tools.service.js';
8
7
  import { SystemToolHandler } from '../../system-tool-handler.js';
9
8
  import { ErrorHandler } from '../../../utils/error-handler.js';
10
9
  import { ToolArgsParser } from '../../../utils/tool-args-parser.js';
11
10
  import { SYSTEM_TOOL_NAMES, MCP_HUB_LITE_SERVER } from '../../../models/system-tools.constants.js';
12
11
  import { formatToolArgs, formatToolResponse } from '../log-formatter.js';
13
- import { generateGatewayToolsList } from '../tool-list-generator.js';
12
+ import { getOrBuildGatewayToolMap, getOrBuildGatewayToolsList } from '../tool-list-generator.js';
14
13
  /**
15
14
  * Type guard to check if a result is a valid CallToolResult.
16
15
  *
@@ -37,7 +36,7 @@ async function executeSystemToolCall(toolName, toolArgs) {
37
36
  content: [
38
37
  {
39
38
  type: 'text',
40
- text: stringifyForLogging(result)
39
+ text: JSON.stringify(result, null, 2)
41
40
  }
42
41
  ]
43
42
  };
@@ -75,10 +74,10 @@ function getSystemToolName(toolName) {
75
74
  * @param server - MCP server instance to register handlers on
76
75
  * @param toolMap - Tool map for routing tool calls
77
76
  */
78
- export function registerCallToolHandler(server, toolMap) {
77
+ export function registerCallToolHandler(server) {
79
78
  // Original list tools handler (for compatibility)
80
79
  server.server.setRequestHandler(ListToolsRequestSchema, async () => {
81
- const gatewayTools = generateGatewayToolsList(toolMap);
80
+ const gatewayTools = getOrBuildGatewayToolsList();
82
81
  return {
83
82
  tools: gatewayTools
84
83
  };
@@ -88,26 +87,38 @@ export function registerCallToolHandler(server, toolMap) {
88
87
  const toolName = request.params.name;
89
88
  const toolArgs = request.params.arguments || {};
90
89
  const systemToolName = getSystemToolName(toolName);
90
+ const gwToolMap = getOrBuildGatewayToolMap();
91
91
  // Log incoming tool request with full context
92
92
  logger.info(`Tool call REQUEST received: toolName=${toolName}, args=${formatToolArgs(toolArgs)}`, LOG_MODULES.GATEWAY);
93
- logger.debug(`Tool context: toolMap size=${toolMap.size}, available tools=${Array.from(toolMap.keys()).slice(0, 10).join(', ')}${toolMap.size > 10 ? '...' : ''}`, LOG_MODULES.GATEWAY);
93
+ logger.debug(`Tool context: toolMap size=${gwToolMap.size}, available tools=${Array.from(gwToolMap.keys()).slice(0, 10).join(', ')}${gwToolMap.size > 10 ? '...' : ''}`, LOG_MODULES.GATEWAY);
94
94
  // Handle system tools
95
95
  if (systemToolName) {
96
96
  logger.debug(`System tool called: ${systemToolName}, args=${formatToolArgs(toolArgs)}`, LOG_MODULES.GATEWAY);
97
97
  return await executeSystemToolCall(systemToolName, toolArgs);
98
98
  }
99
- const target = toolMap.get(toolName);
99
+ const target = gwToolMap.get(toolName);
100
100
  logger.debug(`Tool lookup SUCCESS: toolName=${toolName} -> serverName=${target?.serverName}, serverIndex=${target?.serverIndex}, realToolName=${target?.realToolName}`, LOG_MODULES.GATEWAY);
101
101
  if (!target) {
102
- logger.error(`Tool NOT FOUND: toolName=${toolName}, available tools=${Array.from(toolMap.keys()).join(', ')}`, LOG_MODULES.GATEWAY);
102
+ logger.error(`Tool NOT FOUND: toolName=${toolName}, available tools=${Array.from(gwToolMap.keys()).join(', ')}`, LOG_MODULES.GATEWAY);
103
103
  throw new McpError(-32801, `Tool ${toolName} not found`);
104
104
  }
105
+ // Extract wrapped arguments (LLM provides serverName/toolName per schema guidance)
106
+ const wrappedArgs = toolArgs;
107
+ const callServerName = wrappedArgs.serverName || target.serverName;
108
+ const callToolName = wrappedArgs.toolName || target.realToolName;
109
+ const callArgs = wrappedArgs.toolArgs || {};
110
+ const callOptions = wrappedArgs.requestOptions || {};
105
111
  const startTime = Date.now();
106
112
  try {
107
- logger.debug(`Tool call EXECUTING: serverName=${target.serverName}, serverIndex=${target.serverIndex}, realToolName=${target.realToolName}, args=${formatToolArgs(toolArgs)}`, LOG_MODULES.GATEWAY);
108
- const result = await mcpConnectionManager.callTool(target.serverName, target.serverIndex, target.realToolName, toolArgs);
113
+ logger.debug(`Tool call EXECUTING: serverName=${callServerName}, toolName=${callToolName}, args=${formatToolArgs(callArgs)}`, LOG_MODULES.GATEWAY);
114
+ const result = await hubToolsService.callTool({
115
+ serverName: callServerName,
116
+ toolName: callToolName,
117
+ toolArgs: callArgs,
118
+ requestOptions: callOptions
119
+ });
109
120
  const duration = Date.now() - startTime;
110
- logger.info(`Tool call SUCCESS: serverName=${target.serverName}, serverIndex=${target.serverIndex}, realToolName=${target.realToolName}, duration=${duration}ms, response=${formatToolResponse(result)}`, LOG_MODULES.GATEWAY);
121
+ logger.info(`Tool call SUCCESS: serverName=${callServerName}, toolName=${callToolName}, duration=${duration}ms, response=${formatToolResponse(result)}`, LOG_MODULES.GATEWAY);
111
122
  // Wrap the result in a valid CallToolResult structure
112
123
  if (typeof result === 'object' && result !== null) {
113
124
  return {
@@ -127,7 +138,7 @@ export function registerCallToolHandler(server, toolMap) {
127
138
  }
128
139
  }
129
140
  catch (error) {
130
- ErrorHandler.handleToolCallError(`${target.serverName}-${target.serverIndex}`, target.realToolName, error);
141
+ ErrorHandler.handleToolCallError(callServerName, callToolName, error);
131
142
  }
132
143
  });
133
144
  }
@@ -1 +1 @@
1
- {"version":3,"file":"resources-handler.d.ts","sourceRoot":"","sources":["../../../../../../src/services/gateway/request-handlers/resources-handler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwCjE"}
1
+ {"version":3,"file":"resources-handler.d.ts","sourceRoot":"","sources":["../../../../../../src/services/gateway/request-handlers/resources-handler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAiDjE"}
@@ -4,7 +4,6 @@
4
4
  import { ListResourcesRequestSchema, ReadResourceRequestSchema, McpError } from '@modelcontextprotocol/sdk/types.js';
5
5
  import { logger } from '../../../utils/index.js';
6
6
  import { LOG_MODULES } from '../../../utils/logger/log-modules.js';
7
- import { stringifyForLogging } from '../../../utils/json-utils.js';
8
7
  import { hubToolsService } from '../../hub-tools.service.js';
9
8
  /**
10
9
  * Register resources-related handlers on the MCP server.
@@ -32,13 +31,18 @@ export function registerResourcesHandlers(server) {
32
31
  try {
33
32
  const { uri } = request.params;
34
33
  const content = await hubToolsService.readResource(uri);
34
+ // Preserve original mimeType if content is already in MCP ReadResourceResult format
35
+ const mcpResult = content && typeof content === 'object' && 'contents' in content
36
+ ? content
37
+ : null;
38
+ const mimeType = mcpResult?.contents?.[0]?.mimeType || 'application/json';
35
39
  // Convert to official MCP format: contents array with required uri field
36
40
  return {
37
41
  contents: [
38
42
  {
39
43
  uri,
40
- mimeType: 'application/json',
41
- text: typeof content === 'string' ? content : stringifyForLogging(content)
44
+ mimeType,
45
+ text: typeof content === 'string' ? content : JSON.stringify(content, null, 2)
42
46
  }
43
47
  ]
44
48
  };
@@ -1 +1 @@
1
- {"version":3,"file":"system-tools-handler.d.ts","sourceRoot":"","sources":["../../../../../../src/services/gateway/request-handlers/system-tools-handler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAazE;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAmNnE"}
1
+ {"version":3,"file":"system-tools-handler.d.ts","sourceRoot":"","sources":["../../../../../../src/services/gateway/request-handlers/system-tools-handler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAczE;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6OnE"}
@@ -6,7 +6,7 @@ import { McpError } from '@modelcontextprotocol/sdk/types.js';
6
6
  import { logger } from '../../../utils/index.js';
7
7
  import { LOG_MODULES } from '../../../utils/logger/log-modules.js';
8
8
  import { hubToolsService } from '../../hub-tools.service.js';
9
- import { LIST_SERVERS_TOOL, LIST_TOOLS_TOOL, GET_TOOL_TOOL, CALL_TOOL_TOOL, UPDATE_SERVER_DESCRIPTION_TOOL, LIST_TAGS_TOOL } from '../../../models/system-tools.constants.js';
9
+ import { LIST_SERVERS_TOOL, LIST_TOOLS_TOOL, GET_TOOL_TOOL, CALL_TOOL_TOOL, UPDATE_SERVER_DESCRIPTION_TOOL, LIST_TAGS_TOOL, SEARCH_TOOLS_TOOL } from '../../../models/system-tools.constants.js';
10
10
  /**
11
11
  * Register system tools handlers on the MCP server.
12
12
  *
@@ -219,4 +219,31 @@ export function registerSystemToolsHandlers(server) {
219
219
  }
220
220
  }
221
221
  });
222
+ // Search tools across all servers
223
+ const SearchToolsRequestSchema = z.object({
224
+ method: z.literal(SEARCH_TOOLS_TOOL),
225
+ params: z.object({
226
+ query: z.string()
227
+ }),
228
+ id: z.union([z.string(), z.number()]),
229
+ jsonrpc: z.literal('2.0')
230
+ });
231
+ server.server.setRequestHandler(SearchToolsRequestSchema, async (request) => {
232
+ try {
233
+ const result = await hubToolsService.searchTools(request.params.query);
234
+ return result;
235
+ }
236
+ catch (error) {
237
+ logger.error(`Search tools error:`, error, LOG_MODULES.SYSTEM_TOOLS_HANDLER);
238
+ if (error instanceof McpError) {
239
+ throw error;
240
+ }
241
+ else if (error instanceof Error) {
242
+ throw new McpError(-32802, error.message);
243
+ }
244
+ else {
245
+ throw new McpError(-32802, String(error));
246
+ }
247
+ }
248
+ });
222
249
  }
@@ -1,23 +1,18 @@
1
1
  /**
2
- * Gateway tool list generator with collision resolution.
2
+ * Gateway tool list generator with collision resolution and global caching.
3
3
  */
4
4
  import type { ToolMapEntry, GatewayTool } from './types.js';
5
- /**
6
- * Generates a unified list of gateway tools with proper naming and collision resolution.
7
- *
8
- * This method creates a comprehensive tool list that includes both system tools and
9
- * aggregated tools from all connected MCP servers. It implements sophisticated
10
- * naming collision resolution by:
11
- * - Adding server hash suffixes to non-unique tool names
12
- * - Handling conflicts with system tool names
13
- * - Ensuring names don't exceed 60 characters
14
- * - Providing final uniqueness guarantees through counter suffixes
15
- *
16
- * The method also populates the provided toolMap with mappings from gateway tool names
17
- * to actual server IDs and real tool names for efficient routing during tool execution.
18
- *
19
- * @param {Map<string, ToolMapEntry>} toolMap - Map to populate with gateway tool name to actual tool mappings
20
- * @returns {Array<GatewayTool>} Array of gateway tools with resolved names and descriptions
21
- */
22
- export declare function generateGatewayToolsList(toolMap: Map<string, ToolMapEntry>): Array<GatewayTool>;
5
+ export declare function generateGatewayToolsList(toolMap: Map<string, ToolMapEntry>): GatewayTool[];
6
+ /** Lazy get first-request fallback when cache hasn't been built yet */
7
+ export declare function getOrBuildGatewayToolMap(): Map<string, ToolMapEntry>;
8
+ /** Lazy get first-request fallback when cache hasn't been built yet */
9
+ export declare function getOrBuildGatewayToolsList(): GatewayTool[];
10
+ /** Lazy get returns only aggregated external tools (excludes system tools) */
11
+ export declare function getExternalGatewayTools(): GatewayTool[];
12
+ /** Full rebuild from global state used by TOOLS_UPDATED / SERVER_DISCONNECTED */
13
+ export declare function rebuildFromScratch(): void;
14
+ /** Incremental add update raw data layer, re-resolve names only */
15
+ export declare function addToCache(serverName: string, toolNames: string[]): void;
16
+ /** Incremental remove update raw data layer, re-resolve names only */
17
+ export declare function removeFromCache(serverName: string, toolNames: string[]): void;
23
18
  //# sourceMappingURL=tool-list-generator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tool-list-generator.d.ts","sourceRoot":"","sources":["../../../../../src/services/gateway/tool-list-generator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE5D;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC,CAkI/F"}
1
+ {"version":3,"file":"tool-list-generator.d.ts","sourceRoot":"","sources":["../../../../../src/services/gateway/tool-list-generator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAwM5D,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,WAAW,EAAE,CAG1F;AAID,yEAAyE;AACzE,wBAAgB,wBAAwB,IAAI,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAKpE;AAED,yEAAyE;AACzE,wBAAgB,0BAA0B,IAAI,WAAW,EAAE,CAK1D;AAED,gFAAgF;AAChF,wBAAgB,uBAAuB,IAAI,WAAW,EAAE,CAEvD;AAED,mFAAmF;AACnF,wBAAgB,kBAAkB,IAAI,IAAI,CASzC;AAED,qEAAqE;AACrE,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI,CAoDxE;AAED,wEAAwE;AACxE,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI,CAqC7E"}