@loop_ouroboros/mcp-hub-lite 1.2.9 → 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.
- package/CHANGELOG.md +33 -0
- package/dist/client/assets/{HomeView-CGezWc0j.js → HomeView-Bi2bkUKf.js} +1 -1
- package/dist/client/assets/{ResourceDetailView-CDmWGdAK.css → ResourceDetailView-BkTSg91z.css} +1 -1
- package/dist/client/assets/ResourceDetailView-DyuSovH9.js +1 -0
- package/dist/client/assets/ResourcesView-CU0VbNy5.js +1 -0
- package/dist/client/assets/ResourcesView-zgV8Nq7w.css +1 -0
- package/dist/client/assets/{ServerDashboard-g5p4VC_-.js → ServerDashboard-BGyyZAti.js} +1 -1
- package/dist/client/assets/{ServerDetail-DCQH8HIb.css → ServerDetail-CPNAFBPM.css} +1 -1
- package/dist/client/assets/ServerDetail-bcQ8BVXR.js +2 -0
- package/dist/client/assets/{ServerListView-DZsy2gaQ.js → ServerListView-yQPVJFHG.js} +1 -1
- 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
- package/dist/client/assets/{SettingsView-DQSWb9xM.js → SettingsView-B1DxbFP3.js} +1 -1
- package/dist/client/assets/ToolCallDialog-BQ9UJZ_-.css +1 -0
- package/dist/client/assets/ToolCallDialog-DEapCO06.js +1 -0
- package/dist/client/assets/ToolsView-DA0u_bCw.js +1 -0
- package/dist/client/assets/ToolsView-cO61nMNr.css +1 -0
- package/dist/client/assets/{_baseClone-DsVtZfPm.js → _baseClone-B991Lvrt.js} +1 -1
- package/dist/client/assets/{el-form-item-CTsVV8sm.js → el-form-item-DfWq_kSy.js} +1 -1
- package/dist/client/assets/{el-input-Bh1VGJTU.js → el-input-5YzZrwir.js} +1 -1
- package/dist/client/assets/{el-loading-huOeK9cW.js → el-loading-DE3FcxNH.js} +1 -1
- package/dist/client/assets/{el-overlay-CR_KVhLU.js → el-overlay-BTeTueuN.js} +1 -1
- package/dist/client/assets/{el-radio-group-BSbtAW4k.js → el-radio-group-Y1E2bxIW.js} +1 -1
- package/dist/client/assets/{el-skeleton-item-BSxOLPFM.js → el-skeleton-item-DhgR50Jx.js} +1 -1
- package/dist/client/assets/{el-switch-BaQUQWTL.js → el-switch-fF--nMSD.js} +1 -1
- package/dist/client/assets/{el-tab-pane-9JxLgdS7.js → el-tab-pane-rvS_KTwP.js} +1 -1
- package/dist/client/assets/{el-table-column-Du1l9Ww3.js → el-table-column-B1O8mY47.js} +1 -1
- package/dist/client/assets/{index-BNmwPGMT.css → index-Bzz3tYbS.css} +1 -1
- package/dist/client/assets/{index-CsZoFRv1.js → index-DkqV9kH4.js} +2 -2
- package/dist/client/assets/{omit-Btci9mp3.js → omit-BIIebEYo.js} +1 -1
- package/dist/client/assets/{raf-tUu4BwZS.js → raf-Cj-gATZv.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/server/shared/models/constants.d.ts +3 -0
- package/dist/server/shared/models/constants.d.ts.map +1 -0
- package/dist/server/shared/models/constants.js +2 -0
- package/dist/server/shared/models/index.d.ts +1 -0
- package/dist/server/shared/models/index.d.ts.map +1 -1
- package/dist/server/shared/models/index.js +1 -0
- package/dist/server/shared/types/index.d.ts +0 -1
- package/dist/server/shared/types/index.d.ts.map +1 -1
- package/dist/server/shared/types/index.js +0 -1
- package/dist/server/src/api/mcp/debug-response-wrapper.js +1 -1
- package/dist/server/src/api/mcp/gateway.d.ts.map +1 -1
- package/dist/server/src/api/mcp/gateway.js +23 -41
- package/dist/server/src/api/web/hub-tools.d.ts.map +1 -1
- package/dist/server/src/api/web/hub-tools.js +11 -0
- package/dist/server/src/api/web/mcp-status.js +2 -2
- package/dist/server/src/api/web/search.d.ts +2 -16
- package/dist/server/src/api/web/search.d.ts.map +1 -1
- package/dist/server/src/api/web/search.js +22 -30
- package/dist/server/src/api/web/servers.js +1 -1
- package/dist/server/src/api/ws/events.js +1 -1
- package/dist/server/src/api/ws/ws-handler.js +1 -1
- package/dist/server/src/app.js +1 -1
- package/dist/server/src/cli/commands/tool-use.d.ts +10 -3
- package/dist/server/src/cli/commands/tool-use.d.ts.map +1 -1
- package/dist/server/src/cli/commands/tool-use.js +69 -30
- package/dist/server/src/config/config-change-logger.js +1 -1
- package/dist/server/src/config/config-loader.js +1 -1
- package/dist/server/src/config/config-manager.js +1 -1
- package/dist/server/src/config/config-migrator.d.ts +4 -48
- package/dist/server/src/config/config-migrator.d.ts.map +1 -1
- package/dist/server/src/config/config-migrator.js +2 -103
- package/dist/server/src/config/config-saver.js +1 -1
- package/dist/server/src/config/server-config-manager.js +1 -1
- package/dist/server/src/models/system-tools.constants.d.ts +2 -1
- package/dist/server/src/models/system-tools.constants.d.ts.map +1 -1
- package/dist/server/src/models/system-tools.constants.js +2 -1
- package/dist/server/src/pid/manager.js +1 -1
- package/dist/server/src/server/dev-server.js +2 -2
- package/dist/server/src/server/runner.js +2 -2
- package/dist/server/src/server/startup.js +2 -2
- package/dist/server/src/services/connection/connection-manager.d.ts.map +1 -1
- package/dist/server/src/services/connection/connection-manager.js +16 -21
- package/dist/server/src/services/connection/tool-cache.d.ts.map +1 -1
- package/dist/server/src/services/connection/tool-cache.js +10 -8
- package/dist/server/src/services/event-bus.service.d.ts +3 -1
- package/dist/server/src/services/event-bus.service.d.ts.map +1 -1
- package/dist/server/src/services/event-bus.service.js +1 -0
- package/dist/server/src/services/gateway/gateway.service.d.ts +1 -0
- package/dist/server/src/services/gateway/gateway.service.d.ts.map +1 -1
- package/dist/server/src/services/gateway/gateway.service.js +29 -7
- package/dist/server/src/services/gateway/request-handlers/call-tool-handler.d.ts +1 -2
- package/dist/server/src/services/gateway/request-handlers/call-tool-handler.d.ts.map +1 -1
- package/dist/server/src/services/gateway/request-handlers/call-tool-handler.js +24 -13
- package/dist/server/src/services/gateway/request-handlers/resources-handler.d.ts.map +1 -1
- package/dist/server/src/services/gateway/request-handlers/resources-handler.js +7 -3
- package/dist/server/src/services/gateway/tool-list-generator.d.ts +14 -19
- package/dist/server/src/services/gateway/tool-list-generator.d.ts.map +1 -1
- package/dist/server/src/services/gateway/tool-list-generator.js +221 -80
- package/dist/server/src/services/hub-manager.service.d.ts.map +1 -1
- package/dist/server/src/services/hub-manager.service.js +15 -2
- package/dist/server/src/services/hub-tools/instance-selector.js +1 -1
- package/dist/server/src/services/hub-tools/resource-generator.d.ts +0 -21
- package/dist/server/src/services/hub-tools/resource-generator.d.ts.map +1 -1
- package/dist/server/src/services/hub-tools/resource-generator.js +15 -15
- package/dist/server/src/services/hub-tools/server-selector.js +1 -1
- package/dist/server/src/services/hub-tools.service.d.ts.map +1 -1
- package/dist/server/src/services/hub-tools.service.js +15 -12
- package/dist/server/src/services/log-storage.service.js +1 -1
- package/dist/server/src/services/system-tool-handler.js +1 -1
- package/dist/server/src/utils/error-handler.js +1 -1
- package/dist/server/src/utils/index.d.ts +1 -1
- package/dist/server/src/utils/index.d.ts.map +1 -1
- package/dist/server/src/utils/index.js +1 -1
- package/dist/server/src/utils/json-utils.js +4 -4
- package/dist/server/src/utils/log-rotator.d.ts +0 -15
- package/dist/server/src/utils/log-rotator.d.ts.map +1 -1
- package/dist/server/src/utils/log-rotator.js +0 -18
- package/dist/server/src/utils/port-checker.js +1 -1
- package/dist/server/src/utils/transports/stdio-transport.js +1 -1
- package/dist/server/src/utils/transports/streamable-http-transport.js +1 -1
- package/dist/server/src/utils/transports/transport-factory.d.ts.map +1 -1
- package/dist/server/src/utils/transports/transport-factory.js +26 -3
- package/dist/server/tests/contract/mcp-protocol/initialize.test.js +1 -1
- package/dist/server/tests/contract/mcp-protocol/tools-call.test.js +1 -1
- package/dist/server/tests/contract/mcp-protocol/tools-list.test.js +1 -1
- package/dist/server/tests/integration/gateway/fault-tolerance.test.js +1 -1
- package/dist/server/tests/integration/gateway/mcp-connection.test.js +1 -1
- package/dist/server/tests/types/logger-test-helpers.d.ts +1 -1
- package/dist/server/tests/types/logger-test-helpers.d.ts.map +1 -1
- package/dist/server/tests/unit/config/config-migrator.test.js +45 -105
- package/dist/server/tests/unit/config/config-saver.test.js +1 -1
- package/dist/server/tests/unit/server/runner.test.js +5 -6
- package/dist/server/tests/unit/services/gateway-logging.test.js +1 -1
- package/dist/server/tests/unit/services/hub-manager-service.test.js +4 -5
- package/dist/server/tests/unit/services/hub-tools.service.test.js +78 -2
- package/dist/server/tests/unit/utils/log-rotator.test.js +1 -15
- package/dist/server/tests/unit/utils/logger.test.js +1 -1
- package/package.json +1 -3
- package/dist/client/assets/ResourceDetailView-Bi5UsbFq.js +0 -1
- package/dist/client/assets/ResourcesView-B9anSm85.js +0 -1
- package/dist/client/assets/ResourcesView-Cc8RHtia.css +0 -1
- package/dist/client/assets/ServerDetail-DMoFqWCp.js +0 -2
- package/dist/client/assets/ToolCallDialog-BEyRp_J3.js +0 -1
- package/dist/client/assets/ToolCallDialog-BhdPX-Kf.css +0 -1
- package/dist/client/assets/ToolsView-BU7PKJwt.js +0 -1
- package/dist/client/assets/ToolsView-BkrQLjH9.css +0 -1
|
@@ -2,7 +2,7 @@ import { fileURLToPath } from 'url';
|
|
|
2
2
|
import { dirname, join } from 'path';
|
|
3
3
|
import fs from 'fs';
|
|
4
4
|
import { hubManager } from '../hub-manager.service.js';
|
|
5
|
-
import { mcpConnectionManager } from '../
|
|
5
|
+
import { mcpConnectionManager } from '../connection/index.js';
|
|
6
6
|
import { hasValidId, selectBestInstance, getServerDescription } from './server-selector.js';
|
|
7
7
|
/**
|
|
8
8
|
* Maps Hub URI to original MCP URI for resource forwarding.
|
|
@@ -14,7 +14,7 @@ const hubToMcpUriMap = new Map();
|
|
|
14
14
|
* Clears the Hub to MCP URI mapping.
|
|
15
15
|
* Should be called before regenerating resources.
|
|
16
16
|
*/
|
|
17
|
-
|
|
17
|
+
function clearHubToMcpUriMap() {
|
|
18
18
|
hubToMcpUriMap.clear();
|
|
19
19
|
}
|
|
20
20
|
/**
|
|
@@ -116,34 +116,34 @@ function loadUseGuideContent() {
|
|
|
116
116
|
}
|
|
117
117
|
catch {
|
|
118
118
|
// Fallback in case the file can't be read
|
|
119
|
-
return `# MCP Hub Lite Use Guide
|
|
120
|
-
|
|
121
|
-
## Overview
|
|
122
|
-
|
|
123
|
-
MCP Hub Lite is a lightweight MCP (Model Context Protocol) gateway that acts as a unified interface between AI assistants and multiple backend MCP servers.
|
|
124
|
-
|
|
125
|
-
## Note
|
|
126
|
-
|
|
127
|
-
The complete use guide is currently unavailable. Please check the MCP Hub Lite documentation at https://github.com/your-org/mcp-hub-lite for more information.
|
|
119
|
+
return `# MCP Hub Lite Use Guide
|
|
120
|
+
|
|
121
|
+
## Overview
|
|
122
|
+
|
|
123
|
+
MCP Hub Lite is a lightweight MCP (Model Context Protocol) gateway that acts as a unified interface between AI assistants and multiple backend MCP servers.
|
|
124
|
+
|
|
125
|
+
## Note
|
|
126
|
+
|
|
127
|
+
The complete use guide is currently unavailable. Please check the MCP Hub Lite documentation at https://github.com/your-org/mcp-hub-lite for more information.
|
|
128
128
|
`;
|
|
129
129
|
}
|
|
130
130
|
}
|
|
131
131
|
/**
|
|
132
132
|
* URI for the use guide resource.
|
|
133
133
|
*/
|
|
134
|
-
|
|
134
|
+
const USE_GUIDE_URI = 'hub://use-guide';
|
|
135
135
|
/**
|
|
136
136
|
* Name of the use guide resource.
|
|
137
137
|
*/
|
|
138
|
-
|
|
138
|
+
const USE_GUIDE_NAME = 'MCP Hub Lite Use Guide';
|
|
139
139
|
/**
|
|
140
140
|
* Description of the use guide resource.
|
|
141
141
|
*/
|
|
142
|
-
|
|
142
|
+
const USE_GUIDE_DESCRIPTION = 'Comprehensive guide to using MCP Hub Lite gateway and its features';
|
|
143
143
|
/**
|
|
144
144
|
* MIME type for the use guide resource.
|
|
145
145
|
*/
|
|
146
|
-
|
|
146
|
+
const USE_GUIDE_MIME_TYPE = 'text/markdown';
|
|
147
147
|
/**
|
|
148
148
|
* Generates dynamic Hub resources based on currently connected MCP servers.
|
|
149
149
|
*
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { hubManager } from '../hub-manager.service.js';
|
|
2
2
|
import { InstanceSelector, TagMatchUniqueError } from './instance-selector.js';
|
|
3
|
-
import { logger } from '../../utils/logger.js';
|
|
3
|
+
import { logger } from '../../utils/logger/index.js';
|
|
4
4
|
import { LOG_MODULES } from '../../utils/logger/log-modules.js';
|
|
5
5
|
/**
|
|
6
6
|
* Gets the description for a server, using the server name as default if none is provided.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hub-tools.service.d.ts","sourceRoot":"","sources":["../../../../src/services/hub-tools.service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAOjE,OAAO,EAEL,iBAAiB,EACjB,eAAe,EACf,aAAa,EACb,cAAc,EACd,8BAA8B,EAC9B,cAAc,EACd,iBAAiB,EAElB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EACV,cAAc,EACd,iBAAiB,EACjB,uBAAuB,EACvB,aAAa,EACb,cAAc,EACd,6BAA6B,EAC7B,cAAc,EACd,iBAAiB,EAClB,MAAM,mCAAmC,CAAC;AAa3C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,qBAAa,eAAe;;IAM1B;;;;;;;;;OASG;IACH,cAAc;IAId;;;;;;;;;OASG;IACG,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"hub-tools.service.d.ts","sourceRoot":"","sources":["../../../../src/services/hub-tools.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { hubManager } from './hub-manager.service.js';
|
|
2
|
-
import { mcpConnectionManager } from './
|
|
2
|
+
import { mcpConnectionManager } from './connection/index.js';
|
|
3
3
|
import { eventBus, EventTypes } from './event-bus.service.js';
|
|
4
|
-
import {
|
|
5
|
-
import { logger, LOG_MODULES } from '../utils/logger.js';
|
|
4
|
+
import { generateGatewayToolsList } from './gateway/tool-list-generator.js';
|
|
5
|
+
import { logger, LOG_MODULES } from '../utils/logger/index.js';
|
|
6
6
|
import { stringifyForLogging } from '../utils/json-utils.js';
|
|
7
7
|
import { normalizeToolName } from '../utils/name-converter.js';
|
|
8
8
|
import { McpError } from '@modelcontextprotocol/sdk/types.js';
|
|
@@ -96,12 +96,6 @@ export class HubToolsService {
|
|
|
96
96
|
if (indexes.length === 0) {
|
|
97
97
|
continue;
|
|
98
98
|
}
|
|
99
|
-
// Use non-strict mode for management operations to avoid tag-match-unique errors
|
|
100
|
-
const serverInfo = selectBestInstance(server.name, undefined, false);
|
|
101
|
-
if (!serverInfo) {
|
|
102
|
-
// Skip servers that can't be selected (e.g., tag-match-unique without tags)
|
|
103
|
-
continue;
|
|
104
|
-
}
|
|
105
99
|
const description = getServerDescription(server.config, server.name);
|
|
106
100
|
result[server.name] = description;
|
|
107
101
|
}
|
|
@@ -127,7 +121,7 @@ export class HubToolsService {
|
|
|
127
121
|
if (typeof args.serverName === 'string' && args.serverName === MCP_HUB_LITE_SERVER) {
|
|
128
122
|
// Generate tool list using the same logic as tools/list
|
|
129
123
|
const toolMap = new Map();
|
|
130
|
-
const gatewayTools =
|
|
124
|
+
const gatewayTools = generateGatewayToolsList(toolMap);
|
|
131
125
|
// Convert to ToolSummary format (without inputSchema)
|
|
132
126
|
const toolSummaries = gatewayTools.map((tool) => ({
|
|
133
127
|
name: tool.name,
|
|
@@ -344,8 +338,17 @@ export class HubToolsService {
|
|
|
344
338
|
async callTool(args) {
|
|
345
339
|
let { serverName, toolName } = args;
|
|
346
340
|
// Support both toolArgs and arguments for backward compatibility
|
|
347
|
-
|
|
348
|
-
|
|
341
|
+
let toolArgs = (args.toolArgs || args.arguments || {});
|
|
342
|
+
let { requestOptions } = args;
|
|
343
|
+
// Unwrap gateway-wrapped arguments: if toolArgs itself contains a nested
|
|
344
|
+
// toolArgs property (the wrapped schema), extract the real tool arguments.
|
|
345
|
+
if (toolArgs && typeof toolArgs.toolArgs === 'object' && toolArgs.toolArgs !== null) {
|
|
346
|
+
const wrapped = toolArgs;
|
|
347
|
+
toolArgs = wrapped.toolArgs;
|
|
348
|
+
if (wrapped.requestOptions && !requestOptions) {
|
|
349
|
+
requestOptions = wrapped.requestOptions;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
349
352
|
// Parse prefixed tool names (like mcp__mcp-hub-lite__xxx) if applicable
|
|
350
353
|
const parsedTool = ToolArgsParser.parsePrefixedToolName(toolName);
|
|
351
354
|
if (parsedTool) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { hubToolsService } from './hub-tools.service.js';
|
|
2
2
|
import { McpError } from '@modelcontextprotocol/sdk/types.js';
|
|
3
|
-
import { logger, LOG_MODULES } from '../utils/logger.js';
|
|
3
|
+
import { logger, LOG_MODULES } from '../utils/logger/index.js';
|
|
4
4
|
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';
|
|
5
5
|
import { stringifyForLogging } from '../utils/json-utils.js';
|
|
6
6
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACxD,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -207,9 +207,9 @@ export function stringifyForLogging(obj) {
|
|
|
207
207
|
const jsonPretty = getJsonPrettySetting();
|
|
208
208
|
if (jsonPretty) {
|
|
209
209
|
const jsonStr = JSON.stringify(obj, null, 2);
|
|
210
|
-
return processPrettyJsonForLogging(jsonStr);
|
|
210
|
+
return '\n' + processPrettyJsonForLogging(jsonStr);
|
|
211
211
|
}
|
|
212
|
-
return JSON.stringify(obj);
|
|
212
|
+
return '\n' + JSON.stringify(obj);
|
|
213
213
|
}
|
|
214
214
|
/**
|
|
215
215
|
* Stringify object for logging with replacer and dynamic pretty formatting based on LOG_JSON_PRETTY environment variable
|
|
@@ -221,7 +221,7 @@ export function stringifyForLoggingWithReplacer(obj, replacer) {
|
|
|
221
221
|
const jsonPretty = getJsonPrettySetting();
|
|
222
222
|
if (jsonPretty) {
|
|
223
223
|
const jsonStr = JSON.stringify(obj, replacer, 2);
|
|
224
|
-
return processPrettyJsonForLogging(jsonStr);
|
|
224
|
+
return '\n' + processPrettyJsonForLogging(jsonStr);
|
|
225
225
|
}
|
|
226
|
-
return JSON.stringify(obj, replacer);
|
|
226
|
+
return '\n' + JSON.stringify(obj, replacer);
|
|
227
227
|
}
|
|
@@ -128,21 +128,6 @@ export declare class LogRotator {
|
|
|
128
128
|
* ```
|
|
129
129
|
*/
|
|
130
130
|
getLatestLogFilePath(): string | null;
|
|
131
|
-
/**
|
|
132
|
-
* Gets the current log file path (backward compatibility).
|
|
133
|
-
*
|
|
134
|
-
* This method is maintained for backward compatibility. It first tries to get
|
|
135
|
-
* the latest existing log file. If none exists, it creates a new one.
|
|
136
|
-
*
|
|
137
|
-
* @returns {string} The absolute file path for the current log file.
|
|
138
|
-
* @deprecated Use createNewLogFilePath() or getLatestLogFilePath() instead
|
|
139
|
-
* @example
|
|
140
|
-
* ```typescript
|
|
141
|
-
* const rotator = new LogRotator('/var/log/mcp-hub', 'mcp-hub');
|
|
142
|
-
* const logPath = rotator.getCurrentLogFilePath();
|
|
143
|
-
* ```
|
|
144
|
-
*/
|
|
145
|
-
getCurrentLogFilePath(): string;
|
|
146
131
|
/**
|
|
147
132
|
* Performs log rotation by cleaning up old log files beyond the retention period.
|
|
148
133
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log-rotator.d.ts","sourceRoot":"","sources":["../../../../src/utils/log-rotator.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,KAAK,YAAY,GAAG,MAAM;IAAE,MAAM,EAAE;QAAE,OAAO,EAAE;YAAE,WAAW,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAA;CAAE,CAAC;AAE3E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,YAAY,CAAsB;IAE1C;;;;;;;OAOG;gBAED,MAAM,EAAE,MAAM,EACd,WAAW,GAAE,MAAkB,EAC/B,YAAY,CAAC,EAAE,aAAa,EAC5B,YAAY,CAAC,EAAE,YAAY;IAa7B;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,gBAAgB;IAwBxB;;;;;;OAMG;IACH,OAAO,CAAC,eAAe;IAWvB;;;;;;;;;;;;;;;;;OAiBG;IACI,oBAAoB,IAAI,MAAM;IAKrC;;;;;;;;;;;;;;OAcG;IACI,oBAAoB,IAAI,MAAM,GAAG,IAAI;IAK5C
|
|
1
|
+
{"version":3,"file":"log-rotator.d.ts","sourceRoot":"","sources":["../../../../src/utils/log-rotator.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,KAAK,YAAY,GAAG,MAAM;IAAE,MAAM,EAAE;QAAE,OAAO,EAAE;YAAE,WAAW,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAA;CAAE,CAAC;AAE3E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,YAAY,CAAsB;IAE1C;;;;;;;OAOG;gBAED,MAAM,EAAE,MAAM,EACd,WAAW,GAAE,MAAkB,EAC/B,YAAY,CAAC,EAAE,aAAa,EAC5B,YAAY,CAAC,EAAE,YAAY;IAa7B;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,gBAAgB;IAwBxB;;;;;;OAMG;IACH,OAAO,CAAC,eAAe;IAWvB;;;;;;;;;;;;;;;;;OAiBG;IACI,oBAAoB,IAAI,MAAM;IAKrC;;;;;;;;;;;;;;OAcG;IACI,oBAAoB,IAAI,MAAM,GAAG,IAAI;IAK5C;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACI,UAAU,IAAI,IAAI;IAwBzB;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACI,WAAW,IAAI,MAAM,EAAE;IAqB9B;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,uBAAuB;CA8BhC"}
|
|
@@ -159,24 +159,6 @@ export class LogRotator {
|
|
|
159
159
|
const logFiles = this.getLogFiles();
|
|
160
160
|
return logFiles.length > 0 ? logFiles[0] : null;
|
|
161
161
|
}
|
|
162
|
-
/**
|
|
163
|
-
* Gets the current log file path (backward compatibility).
|
|
164
|
-
*
|
|
165
|
-
* This method is maintained for backward compatibility. It first tries to get
|
|
166
|
-
* the latest existing log file. If none exists, it creates a new one.
|
|
167
|
-
*
|
|
168
|
-
* @returns {string} The absolute file path for the current log file.
|
|
169
|
-
* @deprecated Use createNewLogFilePath() or getLatestLogFilePath() instead
|
|
170
|
-
* @example
|
|
171
|
-
* ```typescript
|
|
172
|
-
* const rotator = new LogRotator('/var/log/mcp-hub', 'mcp-hub');
|
|
173
|
-
* const logPath = rotator.getCurrentLogFilePath();
|
|
174
|
-
* ```
|
|
175
|
-
*/
|
|
176
|
-
getCurrentLogFilePath() {
|
|
177
|
-
const latest = this.getLatestLogFilePath();
|
|
178
|
-
return latest ?? this.createNewLogFilePath();
|
|
179
|
-
}
|
|
180
162
|
/**
|
|
181
163
|
* Performs log rotation by cleaning up old log files beyond the retention period.
|
|
182
164
|
*
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
import { exec } from 'child_process';
|
|
6
6
|
import { promisify } from 'util';
|
|
7
7
|
import { PidManager } from '../pid/manager.js';
|
|
8
|
-
import { logger, LOG_MODULES } from './logger.js';
|
|
8
|
+
import { logger, LOG_MODULES } from './logger/index.js';
|
|
9
9
|
const execAsync = promisify(exec);
|
|
10
10
|
/**
|
|
11
11
|
* Check if port is in use
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
|
|
2
|
-
import { logger, LOG_MODULES } from '../logger.js';
|
|
2
|
+
import { logger, LOG_MODULES } from '../logger/index.js';
|
|
3
3
|
import { PassThrough } from 'stream';
|
|
4
4
|
/**
|
|
5
5
|
* A transport implementation for communicating with MCP (Model Context Protocol) servers
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { logger, LOG_MODULES } from '../logger.js';
|
|
1
|
+
import { logger, LOG_MODULES } from '../logger/index.js';
|
|
2
2
|
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
3
3
|
import { URL } from 'url';
|
|
4
4
|
import { ProxyAgent, fetch as undiciFetch } from 'undici';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport-factory.d.ts","sourceRoot":"","sources":["../../../../../src/utils/transports/transport-factory.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAE1E,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"transport-factory.d.ts","sourceRoot":"","sources":["../../../../../src/utils/transports/transport-factory.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAE1E,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAMtE;;GAEG;AACH,qBAAa,gBAAgB;IAC3B;;;;;;;OAOG;IACH,MAAM,CAAC,eAAe,CACpB,MAAM,EAAE,mBAAmB,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,EAC9C,YAAY,CAAC,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE;QACR,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;QACzB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,YAAY,CAAC,EAAE,sBAAsB,CAAC;KACvC,GACA,OAAO,+CAA+C,EAAE,SAAS;IA8FpE;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IAW7B;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,eAAe;IAW9B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,wBAAwB;CA8CxC"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { StdioTransport } from './stdio-transport.js';
|
|
2
|
-
import {
|
|
2
|
+
import { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';
|
|
3
3
|
import { StreamableHttpTransport } from './streamable-http-transport.js';
|
|
4
4
|
import { logStorage } from '../../services/log-storage.service.js';
|
|
5
5
|
import { McpOAuthClientProvider } from '../../services/mcp-oauth/index.js';
|
|
6
|
+
import { ProxyAgent, fetch as undiciFetch } from 'undici';
|
|
6
7
|
import { createHash } from 'node:crypto';
|
|
7
8
|
import path from 'node:path';
|
|
8
9
|
import os from 'node:os';
|
|
@@ -39,11 +40,33 @@ export class TransportFactory {
|
|
|
39
40
|
readyPatterns: options?.readyPatterns,
|
|
40
41
|
readyTimeout: options?.readyTimeout ?? 120000
|
|
41
42
|
});
|
|
42
|
-
case 'sse':
|
|
43
|
+
case 'sse': {
|
|
43
44
|
if (!config.url) {
|
|
44
45
|
throw new Error('SSE transport requires a URL');
|
|
45
46
|
}
|
|
46
|
-
|
|
47
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
48
|
+
const sseOpts = {};
|
|
49
|
+
// Headers shared between SSE GET (eventSourceInit) and POST (requestInit)
|
|
50
|
+
if (config.headers && Object.keys(config.headers).length > 0) {
|
|
51
|
+
sseOpts.requestInit = { headers: config.headers };
|
|
52
|
+
sseOpts.eventSourceInit = { headers: config.headers };
|
|
53
|
+
}
|
|
54
|
+
// OAuth provider
|
|
55
|
+
if (options?.authProvider) {
|
|
56
|
+
sseOpts.authProvider = options.authProvider;
|
|
57
|
+
}
|
|
58
|
+
// Proxy support via custom fetch
|
|
59
|
+
if (config.proxy?.url) {
|
|
60
|
+
const agent = new ProxyAgent(config.proxy.url);
|
|
61
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
62
|
+
sseOpts.fetch = (input, init) => {
|
|
63
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
64
|
+
const fetchOptions = { ...init, dispatcher: agent };
|
|
65
|
+
return undiciFetch(input, fetchOptions);
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
return new SSEClientTransport(new URL(config.url), sseOpts);
|
|
69
|
+
}
|
|
47
70
|
case 'streamable-http':
|
|
48
71
|
case 'http': {
|
|
49
72
|
// Compatibility with http type, treat as streamable-http
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
2
|
-
import { mcpConnectionManager } from '../../../src/services/
|
|
2
|
+
import { mcpConnectionManager } from '../../../src/services/connection/index.js';
|
|
3
3
|
import { hubManager } from '../../../src/services/hub-manager.service.js';
|
|
4
4
|
import { resolveInstanceConfig } from '../../../src/config/config-migrator.js';
|
|
5
5
|
// Mock MCP SDK
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
2
|
-
import { mcpConnectionManager } from '../../../src/services/
|
|
2
|
+
import { mcpConnectionManager } from '../../../src/services/connection/index.js';
|
|
3
3
|
import { hubManager } from '../../../src/services/hub-manager.service.js';
|
|
4
4
|
import { resolveInstanceConfig } from '../../../src/config/config-migrator.js';
|
|
5
5
|
// Mock MCP SDK
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
2
|
-
import { mcpConnectionManager } from '../../../src/services/
|
|
2
|
+
import { mcpConnectionManager } from '../../../src/services/connection/index.js';
|
|
3
3
|
import { hubManager } from '../../../src/services/hub-manager.service.js';
|
|
4
4
|
import { resolveInstanceConfig } from '../../../src/config/config-migrator.js';
|
|
5
5
|
// Mock MCP SDK
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, it, expect, beforeEach, vi } from 'vitest';
|
|
2
|
-
import { mcpConnectionManager } from '../../../src/services/
|
|
2
|
+
import { mcpConnectionManager } from '../../../src/services/connection/index.js';
|
|
3
3
|
import { hubManager } from '../../../src/services/hub-manager.service.js';
|
|
4
4
|
import { configManager } from '../../../src/config/config-manager.js';
|
|
5
5
|
import { resolveInstanceConfig } from '../../../src/config/config-migrator.js';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
2
|
-
import { mcpConnectionManager } from '../../../src/services/
|
|
2
|
+
import { mcpConnectionManager } from '../../../src/services/connection/index.js';
|
|
3
3
|
import { hubManager } from '../../../src/services/hub-manager.service.js';
|
|
4
4
|
import { configManager } from '../../../src/config/config-manager.js';
|
|
5
5
|
import { resolveInstanceConfig } from '../../../src/config/config-migrator.js';
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Logger test helper types for accessing private methods in tests
|
|
3
3
|
*/
|
|
4
4
|
import type { LogLevel } from '../../shared/types/common.types.js';
|
|
5
|
-
import type { LogContext } from '../../src/utils/logger.js';
|
|
5
|
+
import type { LogContext } from '../../src/utils/logger/index.js';
|
|
6
6
|
import type { WriteStream } from 'node:fs';
|
|
7
7
|
export interface LoggerWithPrivateMethods {
|
|
8
8
|
shouldLog: (level: string) => boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger-test-helpers.d.ts","sourceRoot":"","sources":["../../../../tests/types/logger-test-helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"logger-test-helpers.d.ts","sourceRoot":"","sources":["../../../../tests/types/logger-test-helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAG3C,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IACtC,eAAe,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC;IACxC,cAAc,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,MAAM,CAAC;IAC5C,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IACnC,uBAAuB,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,KAAK,MAAM,CAAC;IAC5F,gBAAgB,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,KAAK,MAAM,CAAC;IACrF,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IACxC,aAAa,EAAE,WAAW,GAAG,IAAI,CAAC;CACnC"}
|