@loop_ouroboros/mcp-hub-lite 1.2.0 → 1.2.2

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 (83) hide show
  1. package/CHANGELOG.md +23 -4
  2. package/README.md +12 -8
  3. package/dist/client/assets/{HomeView-BBwvy1oj.js → HomeView-V1fKvWQ8.js} +1 -1
  4. package/dist/client/assets/{ResourceDetailView-CZ2aB73w.js → ResourceDetailView-DHGHssrh.js} +1 -1
  5. package/dist/client/assets/{ResourcesView-CN1NlhWs.js → ResourcesView-B1bvkmQD.js} +1 -1
  6. package/dist/client/assets/{ServerDashboard-k652Vw4Z.js → ServerDashboard-CZCByd7y.js} +1 -1
  7. package/dist/client/assets/{ServerDetail-BLQ-a4cO.js → ServerDetail-CI5UD8gj.js} +1 -1
  8. package/dist/client/assets/{ServerListView-BHrsFD5i.js → ServerListView-D8qv-xYg.js} +1 -1
  9. package/dist/client/assets/SettingsView-C-ae0-zz.js +1 -0
  10. package/dist/client/assets/{ToolCallDialog-BfPjLxfV.js → ToolCallDialog-BudOyGvS.js} +1 -1
  11. package/dist/client/assets/{ToolsView-CyuhYAE2.js → ToolsView-CbQkgTAu.js} +1 -1
  12. package/dist/client/assets/{_baseClone-DO5qfalW.js → _baseClone-e9R6V78L.js} +1 -1
  13. package/dist/client/assets/{el-form-item-CcGsD2K_.js → el-form-item-Dyx5MiWB.js} +1 -1
  14. package/dist/client/assets/{el-input-tYgeiaCT.js → el-input-CL9HPfdW.js} +1 -1
  15. package/dist/client/assets/{el-loading-Dwl9E_Vr.js → el-loading-2TW6JdfY.js} +1 -1
  16. package/dist/client/assets/{el-overlay-kqX_BABo.js → el-overlay-B5ZGCmXY.js} +1 -1
  17. package/dist/client/assets/{el-radio-group-D8aWBVOT.js → el-radio-group-Cr2ScjjJ.js} +1 -1
  18. package/dist/client/assets/{el-skeleton-item-BRwIFspE.js → el-skeleton-item-CdAfEgVR.js} +1 -1
  19. package/dist/client/assets/{el-switch-BF8c-xeU.js → el-switch-DnN1s0Wb.js} +1 -1
  20. package/dist/client/assets/{el-tab-pane-C4Ep94cd.js → el-tab-pane-BebZh0XF.js} +1 -1
  21. package/dist/client/assets/{el-table-column-Cog6uCh-.js → el-table-column-CV2zp3yI.js} +1 -1
  22. package/dist/client/assets/{index-ByNBhPAR.js → index-Ci5n5dA9.js} +1 -1
  23. package/dist/client/assets/index-DTZ9o3XO.js +2 -0
  24. package/dist/client/assets/{omit-CUnDT6sS.js → omit-DlmW8Yd6.js} +1 -1
  25. package/dist/client/assets/{raf-CmzeRPMd.js → raf-CeCd08aN.js} +1 -1
  26. package/dist/client/index.html +1 -1
  27. package/dist/server/shared/models/server.model.d.ts +22 -0
  28. package/dist/server/shared/models/server.model.d.ts.map +1 -1
  29. package/dist/server/shared/models/server.model.js +41 -5
  30. package/dist/server/src/api/mcp/gateway.d.ts.map +1 -1
  31. package/dist/server/src/api/mcp/gateway.js +13 -5
  32. package/dist/server/src/api/web/resources.d.ts.map +1 -1
  33. package/dist/server/src/api/web/resources.js +26 -2
  34. package/dist/server/src/cli/index.js +1 -1
  35. package/dist/server/src/config/config-loader.js +1 -1
  36. package/dist/server/src/config/config-migrator.d.ts.map +1 -1
  37. package/dist/server/src/config/config-migrator.js +1 -0
  38. package/dist/server/src/index.js +2 -7
  39. package/dist/server/src/server/dev-server.js +9 -48
  40. package/dist/server/src/server/runner.d.ts +12 -24
  41. package/dist/server/src/server/runner.d.ts.map +1 -1
  42. package/dist/server/src/server/runner.js +29 -109
  43. package/dist/server/src/server/startup.d.ts +43 -0
  44. package/dist/server/src/server/startup.d.ts.map +1 -0
  45. package/dist/server/src/server/startup.js +89 -0
  46. package/dist/server/src/services/connection/connection-manager.d.ts +52 -0
  47. package/dist/server/src/services/connection/connection-manager.d.ts.map +1 -1
  48. package/dist/server/src/services/connection/connection-manager.js +283 -193
  49. package/dist/server/src/services/gateway/gateway.service.d.ts.map +1 -1
  50. package/dist/server/src/services/gateway/gateway.service.js +31 -10
  51. package/dist/server/src/services/gateway/global-transport.d.ts.map +1 -1
  52. package/dist/server/src/services/gateway/global-transport.js +11 -5
  53. package/dist/server/src/services/hub-manager.service.d.ts +2 -0
  54. package/dist/server/src/services/hub-manager.service.d.ts.map +1 -1
  55. package/dist/server/src/services/hub-manager.service.js +3 -16
  56. package/dist/server/src/utils/json-utils.d.ts +7 -0
  57. package/dist/server/src/utils/json-utils.d.ts.map +1 -1
  58. package/dist/server/src/utils/json-utils.js +17 -0
  59. package/dist/server/src/utils/logger/log-modules.d.ts +3 -0
  60. package/dist/server/src/utils/logger/log-modules.d.ts.map +1 -1
  61. package/dist/server/src/utils/logger/log-modules.js +2 -0
  62. package/dist/server/src/utils/port-checker.d.ts +18 -0
  63. package/dist/server/src/utils/port-checker.d.ts.map +1 -1
  64. package/dist/server/src/utils/port-checker.js +38 -0
  65. package/dist/server/src/utils/transports/stdio-transport.d.ts +12 -0
  66. package/dist/server/src/utils/transports/stdio-transport.d.ts.map +1 -1
  67. package/dist/server/src/utils/transports/stdio-transport.js +51 -2
  68. package/dist/server/src/utils/transports/transport-factory.d.ts +5 -1
  69. package/dist/server/src/utils/transports/transport-factory.d.ts.map +1 -1
  70. package/dist/server/src/utils/transports/transport-factory.js +5 -2
  71. package/dist/server/tests/integration/gateway/fault-tolerance.test.js +13 -2
  72. package/dist/server/tests/integration/gateway/mcp-connection.test.js +13 -2
  73. package/dist/server/tests/unit/config/config-migrator.test.js +4 -2
  74. package/dist/server/tests/unit/config/config.schema.test.js +2 -1
  75. package/dist/server/tests/unit/server/runner.test.js +77 -92
  76. package/dist/server/tests/unit/services/hub-manager-service.test.js +3 -2
  77. package/dist/server/tests/unit/utils/config.test.js +14 -7
  78. package/dist/server/tests/unit/utils/json-utils.test.js +28 -14
  79. package/dist/server/vite.config.d.ts.map +1 -1
  80. package/dist/server/vite.config.js +1 -0
  81. package/package.json +1 -1
  82. package/dist/client/assets/SettingsView-CUOFNXrz.js +0 -1
  83. package/dist/client/assets/index-CTB6oe-9.js +0 -2
@@ -160,6 +160,7 @@ export declare const ServerTemplateSchema: z.ZodObject<{
160
160
  "round-robin": "round-robin";
161
161
  "tag-match-unique": "tag-match-unique";
162
162
  }>>;
163
+ readyPatterns: z.ZodOptional<z.ZodArray<z.ZodString>>;
163
164
  }, z.core.$strip>;
164
165
  export type ServerTemplate = z.infer<typeof ServerTemplateSchema>;
165
166
  /**
@@ -190,6 +191,7 @@ export declare const ServerConfigSchema: z.ZodObject<{
190
191
  "round-robin": "round-robin";
191
192
  "tag-match-unique": "tag-match-unique";
192
193
  }>>;
194
+ readyPatterns: z.ZodOptional<z.ZodArray<z.ZodString>>;
193
195
  }, z.core.$strip>;
194
196
  instances: z.ZodDefault<z.ZodArray<z.ZodObject<{
195
197
  id: z.ZodString;
@@ -229,6 +231,7 @@ export declare const LoggingConfigSchema: z.ZodDefault<z.ZodObject<{
229
231
  jsonPretty: z.ZodDefault<z.ZodBoolean>;
230
232
  mcpCommDebug: z.ZodDefault<z.ZodBoolean>;
231
233
  apiDebug: z.ZodDefault<z.ZodBoolean>;
234
+ gatewayDebug: z.ZodDefault<z.ZodBoolean>;
232
235
  }, z.core.$strip>>;
233
236
  export type LoggingConfig = z.infer<typeof LoggingConfigSchema>;
234
237
  /**
@@ -242,6 +245,17 @@ export declare const SecurityConfigSchema: z.ZodDefault<z.ZodObject<{
242
245
  maxConnections: z.ZodDefault<z.ZodNumber>;
243
246
  }, z.core.$strip>>;
244
247
  export type SecurityConfig = z.infer<typeof SecurityConfigSchema>;
248
+ /**
249
+ * Startup Configuration Schema
250
+ * Unified configuration for server startup behavior
251
+ */
252
+ export declare const StartupConfigSchema: z.ZodDefault<z.ZodObject<{
253
+ startupDelay: z.ZodDefault<z.ZodNumber>;
254
+ readyTimeout: z.ZodDefault<z.ZodNumber>;
255
+ maxConnectRetries: z.ZodDefault<z.ZodNumber>;
256
+ connectRetryDelay: z.ZodDefault<z.ZodNumber>;
257
+ }, z.core.$strip>>;
258
+ export type StartupConfig = z.infer<typeof StartupConfigSchema>;
245
259
  /**
246
260
  * System Configuration Schema (v1.1 - Primary)
247
261
  */
@@ -265,7 +279,14 @@ export declare const SystemConfigSchema: z.ZodObject<{
265
279
  jsonPretty: z.ZodDefault<z.ZodBoolean>;
266
280
  mcpCommDebug: z.ZodDefault<z.ZodBoolean>;
267
281
  apiDebug: z.ZodDefault<z.ZodBoolean>;
282
+ gatewayDebug: z.ZodDefault<z.ZodBoolean>;
268
283
  }, z.core.$strip>>;
284
+ startup: z.ZodOptional<z.ZodDefault<z.ZodObject<{
285
+ startupDelay: z.ZodDefault<z.ZodNumber>;
286
+ readyTimeout: z.ZodDefault<z.ZodNumber>;
287
+ maxConnectRetries: z.ZodDefault<z.ZodNumber>;
288
+ connectRetryDelay: z.ZodDefault<z.ZodNumber>;
289
+ }, z.core.$strip>>>;
269
290
  }, z.core.$strip>>;
270
291
  security: z.ZodDefault<z.ZodObject<{
271
292
  allowedNetworks: z.ZodDefault<z.ZodArray<z.ZodString>>;
@@ -298,6 +319,7 @@ export declare const SystemConfigSchema: z.ZodObject<{
298
319
  "round-robin": "round-robin";
299
320
  "tag-match-unique": "tag-match-unique";
300
321
  }>>;
322
+ readyPatterns: z.ZodOptional<z.ZodArray<z.ZodString>>;
301
323
  }, z.core.$strip>;
302
324
  instances: z.ZodDefault<z.ZodArray<z.ZodObject<{
303
325
  id: z.ZodString;
@@ -1 +1 @@
1
- {"version":3,"file":"server.model.d.ts","sourceRoot":"","sources":["../../../../shared/models/server.model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjG,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAIjD;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,IAAI,EAAE,eAAe,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE;QACN,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;CACH;AAID;;GAEG;AACH,eAAO,MAAM,yBAAyB;;;;CAI5B,CAAC;AAEX,MAAM,MAAM,yBAAyB,GACnC,CAAC,OAAO,yBAAyB,CAAC,CAAC,MAAM,OAAO,yBAAyB,CAAC,CAAC;AAE7E;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;CAKhB,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,OAAO,aAAa,CAAC,CAAC;AAI/E;;;GAGG;AACH,eAAO,MAAM,qBAAqB;;;;;;;iBAShC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE;;;GAGG;AACH,eAAO,MAAM,4BAA4B;;;;iBAIvC,CAAC;AAEH,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAElF;;;GAGG;AACH,eAAO,MAAM,2BAA2B;;;;iBAItC,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAIhF;;;GAGG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;iBAK9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAIhE;;;GAGG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;iBAe/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE;;;;GAIG;AACH,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;iBAiBrC,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAI9E;;;GAGG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;iBAsB/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAIlE;;;GAGG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAI7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAI9D;;GAEG;AACH,eAAO,MAAM,mBAAmB;;;;;;kBAc5B,CAAC;AAEL,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAIhE;;GAEG;AACH,eAAO,MAAM,oBAAoB;;;;;;kBAgB7B,CAAC;AAEL,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAIlE;;GAEG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA0B7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAI9D;;;GAGG;AACH,eAAO,MAAM,0BAA0B;;;;;;;iBAEtC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAI9E;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAID;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,QAAQ,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAID;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE;QACN,SAAS,EAAE,OAAO,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,cAAc,EAAE,MAAM,CAAC;QACvB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAID;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,SAAS,CAAC,EAAE,CAAC,oBAAoB,GAAG;QAAE,MAAM,EAAE,YAAY,CAAA;KAAE,CAAC,EAAE,CAAC;IAChE,IAAI,EAAE,QAAQ,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;IACf,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B"}
1
+ {"version":3,"file":"server.model.d.ts","sourceRoot":"","sources":["../../../../shared/models/server.model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjG,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAIjD;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,IAAI,EAAE,eAAe,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE;QACN,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;CACH;AAID;;GAEG;AACH,eAAO,MAAM,yBAAyB;;;;CAI5B,CAAC;AAEX,MAAM,MAAM,yBAAyB,GACnC,CAAC,OAAO,yBAAyB,CAAC,CAAC,MAAM,OAAO,yBAAyB,CAAC,CAAC;AAE7E;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;CAKhB,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,OAAO,aAAa,CAAC,CAAC;AAI/E;;;GAGG;AACH,eAAO,MAAM,qBAAqB;;;;;;;iBAShC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE;;;GAGG;AACH,eAAO,MAAM,4BAA4B;;;;iBAIvC,CAAC;AAEH,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAElF;;;GAGG;AACH,eAAO,MAAM,2BAA2B;;;;iBAItC,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAIhF;;;GAGG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;iBAK9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAIhE;;;GAGG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;iBAe/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE;;;;GAIG;AACH,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;iBAiBrC,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAI9E;;;GAGG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;iBAyB/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAIlE;;;GAGG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAI7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAI9D;;GAEG;AACH,eAAO,MAAM,mBAAmB;;;;;;;kBAgB5B,CAAC;AAEL,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAIhE;;GAEG;AACH,eAAO,MAAM,oBAAoB;;;;;;kBAgB7B,CAAC;AAEL,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAIlE;;;GAGG;AACH,eAAO,MAAM,mBAAmB;;;;;kBAgB5B,CAAC;AAEL,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAIhE;;GAEG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAmC7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAI9D;;;GAGG;AACH,eAAO,MAAM,0BAA0B;;;;;;;iBAEtC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAI9E;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAID;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,QAAQ,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAID;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE;QACN,SAAS,EAAE,OAAO,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,cAAc,EAAE,MAAM,CAAC;QACvB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAID;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,SAAS,CAAC,EAAE,CAAC,oBAAoB,GAAG;QAAE,MAAM,EAAE,YAAY,CAAA;KAAE,CAAC,EAAE,CAAC;IAChE,IAAI,EAAE,QAAQ,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;IACf,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B"}
@@ -129,7 +129,10 @@ export const ServerTemplateSchema = ServerEnvConfigSchema.extend({
129
129
  InstanceSelectionStrategy.ROUND_ROBIN,
130
130
  InstanceSelectionStrategy.TAG_MATCH_UNIQUE
131
131
  ])
132
- .optional()
132
+ .optional(),
133
+ // Ready patterns for startup detection (stdout/stderr output containing any pattern = server ready)
134
+ // Using .optional() without .default() - code should use readyPatterns ?? [] for default value
135
+ readyPatterns: z.array(z.string()).optional()
133
136
  });
134
137
  // ====== Server Config Schema (v1.1) ======
135
138
  /**
@@ -151,14 +154,16 @@ export const LoggingConfigSchema = z
151
154
  rotationAge: z.string().default('7d'),
152
155
  jsonPretty: z.boolean().default(true),
153
156
  mcpCommDebug: z.boolean().default(false),
154
- apiDebug: z.boolean().default(false)
157
+ apiDebug: z.boolean().default(false),
158
+ gatewayDebug: z.boolean().default(false)
155
159
  })
156
160
  .default({
157
161
  level: 'info',
158
162
  rotationAge: '7d',
159
163
  jsonPretty: true,
160
164
  mcpCommDebug: false,
161
- apiDebug: false
165
+ apiDebug: false,
166
+ gatewayDebug: false
162
167
  });
163
168
  // ====== Security Configuration Schema ======
164
169
  /**
@@ -181,6 +186,28 @@ export const SecurityConfigSchema = z
181
186
  idleConnectionTimeout: 300000,
182
187
  maxConnections: 50
183
188
  });
189
+ // ====== Startup Configuration Schema ======
190
+ /**
191
+ * Startup Configuration Schema
192
+ * Unified configuration for server startup behavior
193
+ */
194
+ export const StartupConfigSchema = z
195
+ .object({
196
+ // Sequential startup delay between instances (ms)
197
+ startupDelay: z.number().min(0).max(60000).default(3000),
198
+ // Ready pattern detection timeout (ms)
199
+ readyTimeout: z.number().min(10000).max(300000).default(120000),
200
+ // Maximum connection retry attempts
201
+ maxConnectRetries: z.number().min(0).max(10).default(3),
202
+ // Base delay for exponential backoff retry (ms)
203
+ connectRetryDelay: z.number().min(1000).max(30000).default(5000)
204
+ })
205
+ .default({
206
+ startupDelay: 3000,
207
+ readyTimeout: 120000,
208
+ maxConnectRetries: 3,
209
+ connectRetryDelay: 5000
210
+ });
184
211
  // ====== System Configuration Schema ======
185
212
  /**
186
213
  * System Configuration Schema (v1.1 - Primary)
@@ -193,7 +220,9 @@ export const SystemConfigSchema = z.object({
193
220
  port: z.number().default(7788),
194
221
  language: z.enum(['zh', 'en']).default('zh'),
195
222
  theme: z.enum(['light', 'dark', 'system']).default('system'),
196
- logging: LoggingConfigSchema
223
+ logging: LoggingConfigSchema,
224
+ // Using .optional() without .default() - code should use startup ?? {defaults} for default value
225
+ startup: StartupConfigSchema.optional()
197
226
  })
198
227
  .default({
199
228
  host: 'localhost',
@@ -205,7 +234,14 @@ export const SystemConfigSchema = z.object({
205
234
  rotationAge: '7d',
206
235
  jsonPretty: true,
207
236
  mcpCommDebug: false,
208
- apiDebug: false
237
+ apiDebug: false,
238
+ gatewayDebug: false
239
+ },
240
+ startup: {
241
+ startupDelay: 3000,
242
+ readyTimeout: 120000,
243
+ maxConnectRetries: 3,
244
+ connectRetryDelay: 5000
209
245
  }
210
246
  }),
211
247
  security: SecurityConfigSchema,
@@ -1 +1 @@
1
- {"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../../../../../src/api/mcp/gateway.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AAM7E;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,eAAe,iBAqH9D"}
1
+ {"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../../../../../src/api/mcp/gateway.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AAU7E;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,eAAe,iBA6H9D"}
@@ -3,7 +3,7 @@
3
3
  * Handles all MCP protocol requests at /mcp endpoint
4
4
  */
5
5
  import { logger, LOG_MODULES } from '../../utils/logger/index.js';
6
- import { stringifyForLogging, getMcpCommDebugSetting } from '../../utils/json-utils.js';
6
+ import { stringifyForLogging, getMcpCommDebugSetting, getGatewayDebugSetting } from '../../utils/json-utils.js';
7
7
  import { wrapReplyForDebug } from './debug-response-wrapper.js';
8
8
  import { createSessionTransport } from '../../services/gateway/global-transport.js';
9
9
  /**
@@ -44,17 +44,25 @@ export async function mcpGatewayRoutes(fastify) {
44
44
  wrapReplyForDebug(reply, '');
45
45
  reply.hijack();
46
46
  try {
47
- logger.debug(`About to create session transport for MCP request`, LOG_MODULES.GATEWAY);
47
+ if (getGatewayDebugSetting()) {
48
+ logger.debug(`About to create session transport for MCP request`, LOG_MODULES.GATEWAY);
49
+ }
48
50
  const { transport, server } = await createSessionTransport();
49
- logger.debug(`Created session transport successfully, handling MCP request`, LOG_MODULES.GATEWAY);
51
+ if (getGatewayDebugSetting()) {
52
+ logger.debug(`Created session transport successfully, handling MCP request`, LOG_MODULES.GATEWAY);
53
+ }
50
54
  try {
51
55
  await transport.handleRequest(request.raw, reply.raw, request.body);
52
- logger.debug(`Successfully handled MCP request with server: ${server.constructor.name}`, LOG_MODULES.GATEWAY);
56
+ if (getGatewayDebugSetting()) {
57
+ logger.debug(`Successfully handled MCP request with server: ${server.constructor.name}`, LOG_MODULES.GATEWAY);
58
+ }
53
59
  }
54
60
  finally {
55
61
  // Resources will be automatically cleaned up by garbage collection
56
62
  // since transport and server are local to this request scope
57
- logger.debug(`Session transport request completed, resources will be GC'd`, LOG_MODULES.GATEWAY);
63
+ if (getGatewayDebugSetting()) {
64
+ logger.debug(`Session transport request completed, resources will be GC'd`, LOG_MODULES.GATEWAY);
65
+ }
58
66
  }
59
67
  }
60
68
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../../../../src/api/web/resources.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAK1C;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,eAAe,iBAkF/D"}
1
+ {"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../../../../src/api/web/resources.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAK1C;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,eAAe,iBA6G/D"}
@@ -64,8 +64,32 @@ export async function webResourceRoutes(fastify) {
64
64
  // Use hubToolsService.readResource to handle Hub URI -> MCP URI conversion
65
65
  // This properly maps hub://servers/{name}/{instanceIndex}/{mcpPath} to MCP native URI
66
66
  try {
67
- // hubToolsService.readResource already returns MCP format for forwarding case
68
- return await hubToolsService.readResource(uri);
67
+ const result = await hubToolsService.readResource(uri);
68
+ // Check if result is already in MCP ReadResourceResult format { contents: [...] }
69
+ if (result && typeof result === 'object' && 'contents' in result) {
70
+ return result;
71
+ }
72
+ // Wrap non-MCP format results into { contents: [...] } format
73
+ // This handles: ServerMetadata, Tool[], Resource[], string (use-guide), etc.
74
+ let mimeType = 'application/json';
75
+ let text;
76
+ if (typeof result === 'string') {
77
+ mimeType = 'text/markdown';
78
+ text = result;
79
+ }
80
+ else {
81
+ mimeType = 'application/json';
82
+ text = JSON.stringify(result, null, 2);
83
+ }
84
+ return {
85
+ contents: [
86
+ {
87
+ uri,
88
+ mimeType,
89
+ text
90
+ }
91
+ ]
92
+ };
69
93
  }
70
94
  catch (error) {
71
95
  const errorObj = error;
@@ -35,7 +35,7 @@ function isCliEntry() {
35
35
  // Extract package path suffix for comparison
36
36
  // Both paths contain mcp-hub-lite/dist, extract that common suffix
37
37
  const getPackagePath = (path) => {
38
- const match = path.match(/mcp-hub-lite[\/\\]dist/);
38
+ const match = path.match(/mcp-hub-lite[/\\]dist/);
39
39
  return match ? match[0] : null;
40
40
  };
41
41
  const currentPackagePath = getPackagePath(currentPath);
@@ -75,7 +75,7 @@ export function loadConfig(configPath, autoMigrate = true) {
75
75
  if (parsed.success) {
76
76
  const configWithSortedServers = {
77
77
  ...parsed.data,
78
- servers: Object.fromEntries(Object.entries(parsed.data.servers).sort(([a], [b]) => a.localeCompare(b)))
78
+ servers: Object.fromEntries(Object.entries(parsed.data.servers).sort(([a], [b]) => a[0].localeCompare(b[0])))
79
79
  };
80
80
  // Ensure all server instances have proper indexes
81
81
  for (const serverName of Object.keys(configWithSortedServers.servers)) {
@@ -1 +1 @@
1
- {"version":3,"file":"config-migrator.d.ts","sourceRoot":"","sources":["../../../../src/config/config-migrator.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAkB,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAG1E;;;GAGG;AACH,MAAM,MAAM,oBAAoB,GAAG,mBAAmB,CAAC;AAEvD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,YAAY,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC;AAyMD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,eAAe,CAwDjG;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,CAMnE;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB;IACD,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAyBA;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG;IACxD,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS,CAAC;IACnC,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB,CAsCA;AAID;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,EAC7C,UAAU,CAAC,EAAE,MAAM,GAClB,mBAAmB,GAAG,IAAI,CA+B5B;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,GAC5C,KAAK,CAAC;IAAE,QAAQ,EAAE,cAAc,CAAC;IAAC,QAAQ,EAAE,mBAAmB,CAAA;CAAE,CAAC,CAapE"}
1
+ {"version":3,"file":"config-migrator.d.ts","sourceRoot":"","sources":["../../../../src/config/config-migrator.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAkB,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAG1E;;;GAGG;AACH,MAAM,MAAM,oBAAoB,GAAG,mBAAmB,CAAC;AAEvD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,YAAY,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC;AA0MD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,eAAe,CAwDjG;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,CAMnE;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB;IACD,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAyBA;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG;IACxD,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS,CAAC;IACnC,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB,CAsCA;AAID;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,EAC7C,UAAU,CAAC,EAAE,MAAM,GAClB,mBAAmB,GAAG,IAAI,CA+B5B;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,GAC5C,KAAK,CAAC;IAAE,QAAQ,EAAE,cAAc,CAAC;IAAC,QAAQ,EAAE,mBAAmB,CAAA;CAAE,CAAC,CAapE"}
@@ -53,6 +53,7 @@ function convertToServerTemplate(v1Config) {
53
53
  url: v1Config.url,
54
54
  aggregatedTools: v1Config.allowedTools || [],
55
55
  description: v1Config.description
56
+ // readyPatterns is optional and will default to undefined
56
57
  };
57
58
  }
58
59
  /**
@@ -27,9 +27,6 @@
27
27
  * # Start server in foreground for debugging
28
28
  * mcp-hub-lite start --foreground
29
29
  *
30
- * # Start in STDIO mode for MCP protocol
31
- * mcp-hub-lite start --stdio
32
- *
33
30
  * # Stop the running server
34
31
  * mcp-hub-lite stop
35
32
  *
@@ -64,13 +61,12 @@ program.name('mcp-hub-lite').description('MCP Hub Lite CLI').version('0.0.1');
64
61
  program
65
62
  .command('start')
66
63
  .description('Start the MCP Hub Lite server')
67
- .option('--stdio', 'Run in stdio mode for MCP protocol')
68
64
  .option('-p, --port <number>', 'Port to run on')
69
65
  .option('-h, --host <string>', 'Host to bind to')
70
66
  .option('-f, --foreground', 'Run in foreground (blocking)')
71
67
  .action(async (options) => {
72
- // Daemon mode by default unless --foreground or --stdio is specified
73
- if (!options.foreground && !options.stdio) {
68
+ // Daemon mode by default unless --foreground is specified
69
+ if (!options.foreground) {
74
70
  const args = [process.argv[1], 'start', '--foreground'];
75
71
  if (options.port)
76
72
  args.push('--port', options.port);
@@ -145,7 +141,6 @@ program
145
141
  process.exit(0);
146
142
  }
147
143
  await runServer({
148
- stdio: options.stdio,
149
144
  port: options.port ? parseInt(options.port) : undefined,
150
145
  host: options.host
151
146
  });
@@ -1,9 +1,9 @@
1
1
  import { buildApp } from '../app.js';
2
2
  import { configManager } from '../config/config-manager.js';
3
- import { resolveInstanceConfig } from '../config/config-migrator.js';
4
3
  import { logger, LOG_MODULES } from '../utils/logger.js';
5
4
  import { mcpConnectionManager } from '../services/mcp-connection-manager.js';
6
5
  import { PidManager } from '../pid/manager.js';
6
+ import { collectConnectTasks, executeConnectTasks, ensureServerInstances } from './startup.js';
7
7
  // Set log level to debug for development server
8
8
  logger.setLevel('debug');
9
9
  // Enable dev logging to file (this also enables communication debug logging)
@@ -17,7 +17,6 @@ let app = null;
17
17
  * - Debug-level logging enabled for detailed development insights
18
18
  * - Development log file output for persistent debugging information
19
19
  * - Automatic connection to all enabled MCP servers configured in the system
20
- * - OpenTelemetry tracing initialization for observability
21
20
  * - PID file management for process tracking
22
21
  * - Graceful shutdown handling for SIGTERM and SIGINT signals
23
22
  *
@@ -55,7 +54,6 @@ let app = null;
55
54
  * @see {@link buildApp} - Creates the Fastify application instance
56
55
  * @see {@link configManager} - Manages server configuration and MCP server instances
57
56
  * @see {@link mcpConnectionManager} - Handles MCP server connections and communication
58
- * @see {@link telemetryManager} - Manages OpenTelemetry tracing and observability
59
57
  * @see {@link PidManager} - Handles PID file creation and cleanup
60
58
  */
61
59
  async function startDevServer() {
@@ -67,50 +65,7 @@ async function startDevServer() {
67
65
  logger.info('------------------------------------------------', LOG_MODULES.DEV_SERVER);
68
66
  app = await buildApp();
69
67
  const config = configManager.getConfig();
70
- // Auto-connect to enabled servers
71
- logger.info('Initializing server connections...', LOG_MODULES.DEV_SERVER);
72
- const serverConfigs = configManager.getServers();
73
- for (const { name: serverName, config: serverConfig } of serverConfigs) {
74
- // Check if there are existing instances
75
- const existingInstances = configManager.getServerInstancesByName(serverName);
76
- if (existingInstances.length === 0) {
77
- // Auto-create instance for enabled servers
78
- try {
79
- const newInstance = await configManager.addServerInstance(serverName, {});
80
- // Connect the new instance
81
- const resolvedConfig = resolveInstanceConfig(serverConfig, newInstance.id);
82
- if (resolvedConfig && resolvedConfig.enabled !== false) {
83
- mcpConnectionManager
84
- .connect(serverName, newInstance.index ?? 0, {
85
- ...resolvedConfig,
86
- id: newInstance.id
87
- })
88
- .catch((err) => {
89
- logger.error(`Failed to auto-connect to ${serverName}:`, err, LOG_MODULES.DEV_SERVER);
90
- });
91
- }
92
- }
93
- catch (err) {
94
- logger.error(`Failed to create instance for ${serverName}:`, err, LOG_MODULES.DEV_SERVER);
95
- }
96
- }
97
- else {
98
- // Connect existing instances
99
- existingInstances.forEach((instance) => {
100
- if (instance.enabled !== false) {
101
- const resolvedConfig = resolveInstanceConfig(serverConfig, instance.id);
102
- if (resolvedConfig) {
103
- mcpConnectionManager
104
- .connect(serverName, instance.index ?? 0, { ...resolvedConfig, id: instance.id })
105
- .catch((err) => {
106
- logger.error(`Failed to auto-connect to ${serverName}:`, err, LOG_MODULES.DEV_SERVER);
107
- });
108
- }
109
- }
110
- });
111
- }
112
- }
113
- // Listen on configured port
68
+ // Start listening FIRST, then trigger connection tasks
114
69
  await app.listen({
115
70
  port: config.system.port,
116
71
  host: config.system.host
@@ -118,6 +73,13 @@ async function startDevServer() {
118
73
  logger.info(`MCP Hub Lite Dev Server running at http://${config.system.host}:${config.system.port}`, LOG_MODULES.DEV_SERVER);
119
74
  // Write PID file after server starts successfully
120
75
  PidManager.writePid();
76
+ // Auto-create instances for enabled servers without existing instances
77
+ await ensureServerInstances(LOG_MODULES.DEV_SERVER);
78
+ // Trigger connection tasks (fire-and-forget, with sequential delay)
79
+ logger.info('Initializing server connections...', LOG_MODULES.DEV_SERVER);
80
+ const tasks = collectConnectTasks();
81
+ const baseDelay = config.system.startup?.startupDelay ?? 3000;
82
+ executeConnectTasks(tasks, baseDelay, LOG_MODULES.DEV_SERVER);
121
83
  }
122
84
  catch (err) {
123
85
  logger.error('Failed to start dev server:', err, LOG_MODULES.DEV_SERVER);
@@ -132,7 +94,6 @@ async function startDevServer() {
132
94
  * This function performs a clean shutdown sequence to ensure:
133
95
  * - All MCP server connections are properly disconnected
134
96
  * - The Fastify HTTP server is closed gracefully
135
- * - OpenTelemetry tracing resources are properly shut down
136
97
  * - PID file is removed to prevent stale process detection
137
98
  * - All resources are cleaned up before process exit
138
99
  *
@@ -1,27 +1,21 @@
1
1
  /**
2
- * Starts the MCP Hub Lite server in either HTTP mode or stdio MCP gateway mode.
2
+ * Starts the MCP Hub Lite server.
3
3
  *
4
4
  * This function is the main entry point for running the MCP Hub Lite server in production.
5
- * It handles two distinct operational modes:
6
- *
7
- * 1. **HTTP Server Mode** (default): Runs a full Fastify HTTP server with REST API,
8
- * WebSocket support, and web interface on the specified host and port.
9
- *
10
- * 2. **Stdio MCP Gateway Mode**: Runs as an MCP (Model Context Protocol) gateway
11
- * that communicates via stdin/stdout streams, suitable for integration with
12
- * MCP-compatible clients like IDEs or AI assistants.
5
+ * It handles the HTTP server mode with REST API, WebSocket support, and web interface
6
+ * on the specified host and port.
13
7
  *
14
8
  * The function performs the following key operations:
15
- * - Validates and checks port availability (HTTP mode only)
16
- * - Automatically connects to all enabled MCP servers from configuration
9
+ * - Validates and checks port availability
10
+ * - Starts the Fastify HTTP server
11
+ * - Triggers connection to all enabled MCP servers from configuration
17
12
  * - Sets up graceful shutdown handlers for SIGTERM and SIGINT signals
18
13
  * - Manages PID file creation and cleanup for process tracking
19
14
  * - Handles both successful startup and error scenarios with appropriate logging
20
15
  *
21
16
  * @param options - Configuration options for server startup
22
- * @param options.stdio - When true, runs in stdio MCP gateway mode instead of HTTP server mode
23
- * @param options.port - Override the configured port number (HTTP mode only)
24
- * @param options.host - Override the configured host address (HTTP mode only)
17
+ * @param options.port - Override the configured port number
18
+ * @param options.host - Override the configured host address
25
19
  *
26
20
  * @returns Promise that resolves when the server is successfully started,
27
21
  * or rejects with an error if startup fails
@@ -30,27 +24,21 @@
30
24
  * or other critical issues. The process will exit with code 1 in such cases.
31
25
  *
32
26
  * @example
33
- * // Start in default HTTP mode
27
+ * // Start with default config
34
28
  * await runServer();
35
29
  *
36
30
  * @example
37
- * // Start in stdio MCP gateway mode
38
- * await runServer({ stdio: true });
39
- *
40
- * @example
41
- * // Start HTTP server on custom port and host
31
+ * // Start on custom port and host
42
32
  * await runServer({ port: 8080, host: '0.0.0.0' });
43
33
  *
44
34
  * @remarks
45
- * - In HTTP mode, the function will check if the specified port is already in use
46
- * and provide detailed error messages for port conflicts
47
- * - In stdio mode, port checking is skipped as no network ports are used
35
+ * - The function will check if the specified port is already in use and provide
36
+ * detailed error messages for port conflicts
48
37
  * - The function automatically connects to all enabled servers configured in .mcp-hub.json
49
38
  * - Graceful shutdown ensures proper cleanup of connections and PID files when receiving termination signals
50
39
  * - This function is typically called from the CLI entry point (`src/index.ts`)
51
40
  */
52
41
  export declare function runServer(options?: {
53
- stdio?: boolean;
54
42
  port?: number;
55
43
  host?: string;
56
44
  }): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../../src/server/runner.ts"],"names":[],"mappings":"AAWA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,wBAAsB,SAAS,CAAC,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,iBAuI9F"}
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../../src/server/runner.ts"],"names":[],"mappings":"AAUA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,wBAAsB,SAAS,CAAC,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,iBAuD7E"}