@loop_ouroboros/mcp-hub-lite 1.2.1 → 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.
- package/CHANGELOG.md +20 -0
- package/README.md +4 -0
- package/dist/client/assets/{HomeView-BBwvy1oj.js → HomeView-V1fKvWQ8.js} +1 -1
- package/dist/client/assets/{ResourceDetailView-CZ2aB73w.js → ResourceDetailView-DHGHssrh.js} +1 -1
- package/dist/client/assets/{ResourcesView-CN1NlhWs.js → ResourcesView-B1bvkmQD.js} +1 -1
- package/dist/client/assets/{ServerDashboard-k652Vw4Z.js → ServerDashboard-CZCByd7y.js} +1 -1
- package/dist/client/assets/{ServerDetail-BLQ-a4cO.js → ServerDetail-CI5UD8gj.js} +1 -1
- package/dist/client/assets/{ServerListView-BHrsFD5i.js → ServerListView-D8qv-xYg.js} +1 -1
- package/dist/client/assets/SettingsView-C-ae0-zz.js +1 -0
- package/dist/client/assets/{ToolCallDialog-BfPjLxfV.js → ToolCallDialog-BudOyGvS.js} +1 -1
- package/dist/client/assets/{ToolsView-CyuhYAE2.js → ToolsView-CbQkgTAu.js} +1 -1
- package/dist/client/assets/{_baseClone-DO5qfalW.js → _baseClone-e9R6V78L.js} +1 -1
- package/dist/client/assets/{el-form-item-CcGsD2K_.js → el-form-item-Dyx5MiWB.js} +1 -1
- package/dist/client/assets/{el-input-tYgeiaCT.js → el-input-CL9HPfdW.js} +1 -1
- package/dist/client/assets/{el-loading-Dwl9E_Vr.js → el-loading-2TW6JdfY.js} +1 -1
- package/dist/client/assets/{el-overlay-kqX_BABo.js → el-overlay-B5ZGCmXY.js} +1 -1
- package/dist/client/assets/{el-radio-group-D8aWBVOT.js → el-radio-group-Cr2ScjjJ.js} +1 -1
- package/dist/client/assets/{el-skeleton-item-BRwIFspE.js → el-skeleton-item-CdAfEgVR.js} +1 -1
- package/dist/client/assets/{el-switch-BF8c-xeU.js → el-switch-DnN1s0Wb.js} +1 -1
- package/dist/client/assets/{el-tab-pane-C4Ep94cd.js → el-tab-pane-BebZh0XF.js} +1 -1
- package/dist/client/assets/{el-table-column-Cog6uCh-.js → el-table-column-CV2zp3yI.js} +1 -1
- package/dist/client/assets/{index-ByNBhPAR.js → index-Ci5n5dA9.js} +1 -1
- package/dist/client/assets/index-DTZ9o3XO.js +2 -0
- package/dist/client/assets/{omit-CUnDT6sS.js → omit-DlmW8Yd6.js} +1 -1
- package/dist/client/assets/{raf-CmzeRPMd.js → raf-CeCd08aN.js} +1 -1
- package/dist/client/index.html +1 -1
- package/dist/server/shared/models/server.model.d.ts +22 -0
- package/dist/server/shared/models/server.model.d.ts.map +1 -1
- package/dist/server/shared/models/server.model.js +41 -5
- package/dist/server/src/api/mcp/gateway.d.ts.map +1 -1
- package/dist/server/src/api/mcp/gateway.js +13 -5
- package/dist/server/src/api/web/resources.d.ts.map +1 -1
- package/dist/server/src/api/web/resources.js +26 -2
- package/dist/server/src/config/config-loader.js +1 -1
- package/dist/server/src/config/config-migrator.d.ts.map +1 -1
- package/dist/server/src/config/config-migrator.js +1 -0
- package/dist/server/src/index.js +2 -7
- package/dist/server/src/server/dev-server.js +9 -48
- package/dist/server/src/server/runner.d.ts +12 -24
- package/dist/server/src/server/runner.d.ts.map +1 -1
- package/dist/server/src/server/runner.js +29 -109
- package/dist/server/src/server/startup.d.ts +43 -0
- package/dist/server/src/server/startup.d.ts.map +1 -0
- package/dist/server/src/server/startup.js +89 -0
- package/dist/server/src/services/connection/connection-manager.d.ts +52 -0
- package/dist/server/src/services/connection/connection-manager.d.ts.map +1 -1
- package/dist/server/src/services/connection/connection-manager.js +283 -193
- package/dist/server/src/services/gateway/gateway.service.d.ts.map +1 -1
- package/dist/server/src/services/gateway/gateway.service.js +31 -10
- package/dist/server/src/services/gateway/global-transport.d.ts.map +1 -1
- package/dist/server/src/services/gateway/global-transport.js +11 -5
- package/dist/server/src/services/hub-manager.service.d.ts +2 -0
- package/dist/server/src/services/hub-manager.service.d.ts.map +1 -1
- package/dist/server/src/services/hub-manager.service.js +3 -16
- package/dist/server/src/utils/json-utils.d.ts +7 -0
- package/dist/server/src/utils/json-utils.d.ts.map +1 -1
- package/dist/server/src/utils/json-utils.js +17 -0
- package/dist/server/src/utils/logger/log-modules.d.ts +3 -0
- package/dist/server/src/utils/logger/log-modules.d.ts.map +1 -1
- package/dist/server/src/utils/logger/log-modules.js +2 -0
- package/dist/server/src/utils/port-checker.d.ts +18 -0
- package/dist/server/src/utils/port-checker.d.ts.map +1 -1
- package/dist/server/src/utils/port-checker.js +38 -0
- package/dist/server/src/utils/transports/stdio-transport.d.ts +12 -0
- package/dist/server/src/utils/transports/stdio-transport.d.ts.map +1 -1
- package/dist/server/src/utils/transports/stdio-transport.js +51 -2
- package/dist/server/src/utils/transports/transport-factory.d.ts +5 -1
- package/dist/server/src/utils/transports/transport-factory.d.ts.map +1 -1
- package/dist/server/src/utils/transports/transport-factory.js +5 -2
- package/dist/server/tests/integration/gateway/fault-tolerance.test.js +13 -2
- package/dist/server/tests/integration/gateway/mcp-connection.test.js +13 -2
- package/dist/server/tests/unit/config/config-migrator.test.js +4 -2
- package/dist/server/tests/unit/config/config.schema.test.js +2 -1
- package/dist/server/tests/unit/server/runner.test.js +77 -92
- package/dist/server/tests/unit/services/hub-manager-service.test.js +3 -2
- package/dist/server/tests/unit/utils/config.test.js +14 -7
- package/dist/server/tests/unit/utils/json-utils.test.js +28 -14
- package/dist/server/vite.config.d.ts.map +1 -1
- package/dist/server/vite.config.js +1 -0
- package/package.json +1 -1
- package/dist/client/assets/SettingsView-CUOFNXrz.js +0 -1
- 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
|
|
1
|
+
{"version":3,"file":"server.model.d.ts","sourceRoot":"","sources":["../../../../shared/models/server.model.ts"],"names":[],"mappings":"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"}
|
|
@@ -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;
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
68
|
-
|
|
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;
|
|
@@ -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;
|
|
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"}
|
package/dist/server/src/index.js
CHANGED
|
@@ -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
|
|
73
|
-
if (!options.foreground
|
|
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
|
-
//
|
|
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
|
|
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
|
|
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
|
|
16
|
-
* -
|
|
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.
|
|
23
|
-
* @param options.
|
|
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
|
|
27
|
+
* // Start with default config
|
|
34
28
|
* await runServer();
|
|
35
29
|
*
|
|
36
30
|
* @example
|
|
37
|
-
* // Start
|
|
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
|
-
* -
|
|
46
|
-
*
|
|
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":"
|
|
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"}
|