@loop_ouroboros/mcp-hub-lite 1.2.9 → 1.3.1
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 +82 -0
- package/README.md +405 -331
- package/dist/client/assets/{HomeView-CGezWc0j.js → HomeView-DplI3V-h.js} +1 -1
- package/dist/client/assets/{ResourceDetailView-CDmWGdAK.css → ResourceDetailView-BkTSg91z.css} +1 -1
- package/dist/client/assets/ResourceDetailView-CeHPn99Y.js +1 -0
- package/dist/client/assets/ResourcesView-C1ObRhYS.js +1 -0
- package/dist/client/assets/ResourcesView-zgV8Nq7w.css +1 -0
- package/dist/client/assets/{ServerDashboard-g5p4VC_-.js → ServerDashboard-D7wG4Gvt.js} +1 -1
- package/dist/client/assets/{ServerDetail-DCQH8HIb.css → ServerDetail-CPNAFBPM.css} +1 -1
- package/dist/client/assets/ServerDetail-G23phOcJ.js +2 -0
- package/dist/client/assets/{ServerListView-DZsy2gaQ.js → ServerListView-BFiZLtPO.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-Deb_SbFw.js} +1 -1
- package/dist/client/assets/SettingsView-QBFLZ6fP.js +1 -0
- package/dist/client/assets/ToolCallDialog-BQ9UJZ_-.css +1 -0
- package/dist/client/assets/ToolCallDialog-DYS-ADCL.js +1 -0
- package/dist/client/assets/ToolsView-DYwgtm7W.js +1 -0
- package/dist/client/assets/ToolsView-cO61nMNr.css +1 -0
- package/dist/client/assets/_baseClone-DQno9YO3.js +1 -0
- package/dist/client/assets/{el-form-item-CTsVV8sm.js → el-form-item-DF0zzQdH.js} +2 -2
- package/dist/client/assets/el-input-C_p2Qw42.js +1 -0
- package/dist/client/assets/el-loading-BaenpNzU.js +1 -0
- package/dist/client/assets/el-overlay-MbIUXSQ7.js +1 -0
- package/dist/client/assets/el-radio-group-COnCjCcz.js +1 -0
- package/dist/client/assets/el-skeleton-item-qj0eQP4s.js +1 -0
- package/dist/client/assets/el-switch-BZbXqB3_.js +1 -0
- package/dist/client/assets/el-tab-pane-w7RltRLd.js +1 -0
- package/dist/client/assets/el-table-column-OD8zhFcD.js +1 -0
- package/dist/client/assets/index-DwhULJXZ.js +2 -0
- package/dist/client/assets/{index-BNmwPGMT.css → index-UtsV0Cvh.css} +1 -1
- package/dist/client/assets/{omit-Btci9mp3.js → omit-BAJQlviJ.js} +1 -1
- package/dist/client/assets/raf-B1Ry7ruA.js +1 -0
- package/dist/client/assets/{vue-vendor-Dwcr0jep.js → vue-vendor-ClSvefnQ.js} +1 -1
- package/dist/client/index.html +3 -3
- package/dist/server/shared/models/constants.d.ts +8 -0
- package/dist/server/shared/models/constants.d.ts.map +1 -0
- package/dist/server/shared/models/constants.js +6 -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/models/server.model.d.ts +14 -0
- package/dist/server/shared/models/server.model.d.ts.map +1 -1
- package/dist/server/shared/models/server.model.js +27 -4
- 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 +10 -6
- package/dist/server/src/api/mcp/gateway.d.ts.map +1 -1
- package/dist/server/src/api/mcp/gateway.js +235 -87
- 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/web/sessions.d.ts +1 -27
- package/dist/server/src/api/web/sessions.d.ts.map +1 -1
- package/dist/server/src/api/web/sessions.js +8 -97
- 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.d.ts.map +1 -1
- package/dist/server/src/app.js +6 -1
- package/dist/server/src/cli/commands/status.js +39 -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/cli/commands/use-guide.d.ts +0 -8
- package/dist/server/src/cli/commands/use-guide.d.ts.map +1 -1
- package/dist/server/src/cli/commands/use-guide.js +28 -170
- package/dist/server/src/cli/server.d.ts +10 -0
- package/dist/server/src/cli/server.d.ts.map +1 -1
- package/dist/server/src/cli/server.js +31 -1
- 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 +4 -2
- package/dist/server/src/server/runner.d.ts.map +1 -1
- package/dist/server/src/server/runner.js +4 -2
- package/dist/server/src/server/startup.js +2 -2
- package/dist/server/src/services/connection/connection-manager.d.ts +2 -0
- package/dist/server/src/services/connection/connection-manager.d.ts.map +1 -1
- package/dist/server/src/services/connection/connection-manager.js +27 -25
- 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 +14 -0
- package/dist/server/src/services/gateway/gateway.service.d.ts.map +1 -1
- package/dist/server/src/services/gateway/gateway.service.js +101 -7
- package/dist/server/src/services/gateway/global-transport.d.ts +20 -10
- package/dist/server/src/services/gateway/global-transport.d.ts.map +1 -1
- package/dist/server/src/services/gateway/global-transport.js +50 -34
- 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/initialize-handler.d.ts.map +1 -1
- package/dist/server/src/services/gateway/request-handlers/initialize-handler.js +22 -6
- 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 +12 -4
- package/dist/server/src/services/gateway/session-manager.d.ts +101 -0
- package/dist/server/src/services/gateway/session-manager.d.ts.map +1 -0
- package/dist/server/src/services/gateway/session-manager.js +256 -0
- 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 +1 -22
- package/dist/server/src/services/hub-tools/resource-generator.d.ts.map +1 -1
- package/dist/server/src/services/hub-tools/resource-generator.js +24 -22
- 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 +18 -13
- 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.d.ts +9 -0
- package/dist/server/src/utils/json-utils.d.ts.map +1 -1
- package/dist/server/src/utils/json-utils.js +23 -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/logger/index.d.ts +1 -1
- package/dist/server/src/utils/logger/index.d.ts.map +1 -1
- package/dist/server/src/utils/logger/index.js +1 -1
- package/dist/server/src/utils/logger/log-context.d.ts +1 -0
- package/dist/server/src/utils/logger/log-context.d.ts.map +1 -1
- package/dist/server/src/utils/logger/log-formatter.d.ts.map +1 -1
- package/dist/server/src/utils/logger/log-formatter.js +25 -11
- package/dist/server/src/utils/logger/log-output.d.ts +17 -1
- package/dist/server/src/utils/logger/log-output.d.ts.map +1 -1
- package/dist/server/src/utils/logger/log-output.js +46 -40
- package/dist/server/src/utils/logger/logger.d.ts.map +1 -1
- package/dist/server/src/utils/logger/logger.js +18 -2
- package/dist/server/src/utils/port-checker.js +1 -1
- package/dist/server/src/utils/request-context.d.ts +8 -70
- package/dist/server/src/utils/request-context.d.ts.map +1 -1
- package/dist/server/src/utils/request-context.js +11 -70
- 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/config/config.schema.test.js +2 -1
- package/dist/server/tests/unit/server/runner.test.js +19 -13
- package/dist/server/tests/unit/services/gateway-logging.test.js +1 -1
- package/dist/server/tests/unit/services/gateway-session-mode.test.d.ts +2 -0
- package/dist/server/tests/unit/services/gateway-session-mode.test.d.ts.map +1 -0
- package/dist/server/tests/unit/services/gateway-session-mode.test.js +174 -0
- package/dist/server/tests/unit/services/hub-manager-service.test.js +4 -5
- package/dist/server/tests/unit/services/hub-tools.service.test.js +82 -6
- package/dist/server/tests/unit/utils/config.test.js +14 -7
- package/dist/server/tests/unit/utils/log-output.test.d.ts +2 -0
- package/dist/server/tests/unit/utils/log-output.test.d.ts.map +1 -0
- package/dist/server/tests/unit/utils/log-output.test.js +198 -0
- package/dist/server/tests/unit/utils/log-rotator.test.js +1 -15
- package/dist/server/tests/unit/utils/logger.test.js +1 -1
- package/dist/server/vitest.config.d.ts.map +1 -1
- package/dist/server/vitest.config.js +0 -2
- 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/SettingsView-DQSWb9xM.js +0 -1
- 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
- package/dist/client/assets/_baseClone-DsVtZfPm.js +0 -1
- package/dist/client/assets/el-input-Bh1VGJTU.js +0 -1
- package/dist/client/assets/el-loading-huOeK9cW.js +0 -1
- package/dist/client/assets/el-overlay-CR_KVhLU.js +0 -1
- package/dist/client/assets/el-radio-group-BSbtAW4k.js +0 -1
- package/dist/client/assets/el-skeleton-item-BSxOLPFM.js +0 -1
- package/dist/client/assets/el-switch-BaQUQWTL.js +0 -1
- package/dist/client/assets/el-tab-pane-9JxLgdS7.js +0 -1
- package/dist/client/assets/el-table-column-Du1l9Ww3.js +0 -1
- package/dist/client/assets/index-CsZoFRv1.js +0 -2
- package/dist/client/assets/raf-tUu4BwZS.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection-manager.d.ts","sourceRoot":"","sources":["../../../../../src/services/connection/connection-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAanE,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,8BAA8B,CAAC;AACrE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAKjE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAG1E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAI/C;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,OAAO,CAAkC;IACjD,OAAO,CAAC,UAAU,CAAqC;IACvD,OAAO,CAAC,YAAY,CAAwC;IAC5D,OAAO,CAAC,UAAU,CAA8B;IAChD,OAAO,CAAC,aAAa,CAAsC;IAE3D,OAAO,CAAC,yBAAyB,CAAuC;;IAuBxE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAoCG;IACU,OAAO,CAClB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC,GAC1D,OAAO,CAAC,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"connection-manager.d.ts","sourceRoot":"","sources":["../../../../../src/services/connection/connection-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
|
2
2
|
import { TransportFactory } from '../../utils/transports/transport-factory.js';
|
|
3
3
|
import { UnauthorizedError, auth } from '@modelcontextprotocol/sdk/client/auth.js';
|
|
4
4
|
import { StreamableHttpTransport } from '../../utils/transports/streamable-http-transport.js';
|
|
5
|
-
import { logger, LOG_MODULES, formatMcpMessageForLogging, logNotificationMessage } from '../../utils/logger.js';
|
|
5
|
+
import { logger, LOG_MODULES, formatMcpMessageForLogging, logNotificationMessage } from '../../utils/logger/index.js';
|
|
6
6
|
import { getAppVersion } from '../../utils/version.js';
|
|
7
7
|
import { getMcpCommDebugSetting } from '../../utils/json-utils.js';
|
|
8
8
|
import { logStorage } from '../log-storage.service.js';
|
|
@@ -117,7 +117,7 @@ export class McpConnectionManager {
|
|
|
117
117
|
// 4. Get server info
|
|
118
118
|
const serverInfo = this.getServerInfo(serverId);
|
|
119
119
|
// 5. Create transport and set up callbacks
|
|
120
|
-
const { transport
|
|
120
|
+
const { transport } = this.initializeTransport(server, serverInfo, compositeKey, serverName, serverIndex, oauthProvider ?? undefined);
|
|
121
121
|
// Capture OAuth provider from the transport (reuse across retries)
|
|
122
122
|
if (!oauthProvider && transport instanceof StreamableHttpTransport) {
|
|
123
123
|
const provider = transport.getOAuthProvider();
|
|
@@ -134,16 +134,28 @@ export class McpConnectionManager {
|
|
|
134
134
|
}
|
|
135
135
|
// 6. Establish client connection
|
|
136
136
|
const client = await this.establishClientConnection(transport);
|
|
137
|
-
// 7.
|
|
137
|
+
// 7. Extract PID after transport is started
|
|
138
|
+
const pid = (() => {
|
|
139
|
+
if ('pid' in transport && typeof transport.pid === 'number') {
|
|
140
|
+
return transport.pid;
|
|
141
|
+
}
|
|
142
|
+
return undefined;
|
|
143
|
+
})();
|
|
144
|
+
// 8. Register connection
|
|
138
145
|
this.registerConnection(compositeKey, serverName, client, transport);
|
|
139
|
-
//
|
|
146
|
+
// 9. Update connected status
|
|
140
147
|
this.updateConnectedStatus(compositeKey, client, pid);
|
|
141
148
|
// 9. Publish connection events
|
|
142
149
|
this.publishConnectionEvents(serverName, serverIndex);
|
|
143
|
-
// 10. Refresh resources
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
150
|
+
// 10. Refresh tools and resources (skip resources if server capability is absent)
|
|
151
|
+
const capabilities = typeof client.getServerCapabilities === 'function'
|
|
152
|
+
? client.getServerCapabilities()
|
|
153
|
+
: undefined;
|
|
154
|
+
await this.refreshServerResources(serverName, serverIndex, !capabilities?.resources);
|
|
155
|
+
// 11. Request log notifications from downstream server (only if logging capability present)
|
|
156
|
+
if (capabilities?.logging) {
|
|
157
|
+
await this.requestLoggingFromServer(compositeKey, client);
|
|
158
|
+
}
|
|
147
159
|
return true;
|
|
148
160
|
}
|
|
149
161
|
catch (error) {
|
|
@@ -249,7 +261,7 @@ export class McpConnectionManager {
|
|
|
249
261
|
transport.send = async (message, options) => {
|
|
250
262
|
try {
|
|
251
263
|
const logMessage = formatMcpMessageForLogging(message);
|
|
252
|
-
logger.debug(`MCP message sent: ${logMessage}`, LOG_MODULES.CONNECTION_MANAGER);
|
|
264
|
+
logger.debug(`MCP message sent to [${compositeKey}]: ${logMessage}`, LOG_MODULES.CONNECTION_MANAGER);
|
|
253
265
|
}
|
|
254
266
|
catch {
|
|
255
267
|
logger.debug(`MCP message sent: [Error formatting response]`, LOG_MODULES.CONNECTION_MANAGER);
|
|
@@ -308,12 +320,7 @@ export class McpConnectionManager {
|
|
|
308
320
|
logStorage.append(compositeKey, 'error', `[${serverName}] [STDERR] ${data}`);
|
|
309
321
|
};
|
|
310
322
|
}
|
|
311
|
-
|
|
312
|
-
let pid;
|
|
313
|
-
if ('pid' in transport && typeof transport.pid === 'number') {
|
|
314
|
-
pid = transport.pid;
|
|
315
|
-
}
|
|
316
|
-
return { transport, pid };
|
|
323
|
+
return { transport };
|
|
317
324
|
}
|
|
318
325
|
/**
|
|
319
326
|
* Creates Client and connects to transport.
|
|
@@ -377,14 +384,12 @@ export class McpConnectionManager {
|
|
|
377
384
|
}
|
|
378
385
|
/**
|
|
379
386
|
* Refreshes server tools and resources (only for bidirectional transports).
|
|
387
|
+
*
|
|
388
|
+
* @param skipResources - Skip resources/list request when server doesn't support resources capability
|
|
380
389
|
*/
|
|
381
|
-
async refreshServerResources(serverName, serverIndex,
|
|
382
|
-
if (serverType === 'sse') {
|
|
383
|
-
logger.info('SSE transport is unidirectional, skipping tool/resource refresh', LOG_MODULES.CONNECTION_MANAGER);
|
|
384
|
-
return;
|
|
385
|
-
}
|
|
390
|
+
async refreshServerResources(serverName, serverIndex, skipResources = false) {
|
|
386
391
|
const tools = await this.refreshTools(serverName, serverIndex);
|
|
387
|
-
const resources = await this.refreshResources(serverName, serverIndex);
|
|
392
|
+
const resources = skipResources ? [] : await this.refreshResources(serverName, serverIndex);
|
|
388
393
|
eventBus.publish(EventTypes.TOOLS_UPDATED, {
|
|
389
394
|
serverName,
|
|
390
395
|
serverIndex,
|
|
@@ -400,10 +405,7 @@ export class McpConnectionManager {
|
|
|
400
405
|
* Sends logging/setLevel request to downstream server to start receiving log notifications.
|
|
401
406
|
* This is a best-effort request — servers that don't support logging will silently ignore it.
|
|
402
407
|
*/
|
|
403
|
-
async requestLoggingFromServer(compositeKey, client
|
|
404
|
-
// SSE is unidirectional — cannot send requests to the server
|
|
405
|
-
if (serverType === 'sse')
|
|
406
|
-
return;
|
|
408
|
+
async requestLoggingFromServer(compositeKey, client) {
|
|
407
409
|
try {
|
|
408
410
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
409
411
|
await client.request({ method: 'logging/setLevel', params: { level: 'info' } }, { timeout: 5000 });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-cache.d.ts","sourceRoot":"","sources":["../../../../../src/services/connection/tool-cache.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,8BAA8B,CAAC;AAIzD;;;;;;GAMG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,SAAS,CAAkC;IACnD,OAAO,CAAC,mBAAmB,CAAkC;IAC7D,OAAO,CAAC,qBAAqB,CAAkC;IAE/D;;;;;OAKG;IACH,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAI9D;;;;OAIG;IACH,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAI3C;;;;OAIG;IACH,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IASjD;;;;;OAKG;IACH,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIvD;;;;;OAKG;IACH,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM;IAS/C;;;;;;OAMG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI;IAWtE;;;;;;OAMG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,EAAE;IAWzD;;;;;OAKG;IACH,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,EAAE;IAIhD;;;;;;OAMG;IACH,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;IAM/D;;;;OAIG;IACH,WAAW,IAAI,IAAI,EAAE;
|
|
1
|
+
{"version":3,"file":"tool-cache.d.ts","sourceRoot":"","sources":["../../../../../src/services/connection/tool-cache.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,8BAA8B,CAAC;AAIzD;;;;;;GAMG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,SAAS,CAAkC;IACnD,OAAO,CAAC,mBAAmB,CAAkC;IAC7D,OAAO,CAAC,qBAAqB,CAAkC;IAE/D;;;;;OAKG;IACH,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAI9D;;;;OAIG;IACH,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAI3C;;;;OAIG;IACH,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IASjD;;;;;OAKG;IACH,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIvD;;;;;OAKG;IACH,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM;IAS/C;;;;;;OAMG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI;IAWtE;;;;;;OAMG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,EAAE;IAWzD;;;;;OAKG;IACH,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,EAAE;IAIhD;;;;;;OAMG;IACH,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;IAM/D;;;;OAIG;IACH,WAAW,IAAI,IAAI,EAAE;IAIrB;;;;OAIG;IACH,uBAAuB,IAAI,IAAI,EAAE;IAQjC;;;;OAIG;IACH,mBAAmB,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE;IAIzC;;;;;;OAMG;IACH,OAAO,IAAI,gBAAgB,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAI7C;;;;;OAKG;IACH,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;IAWzD;;;;;OAKG;IACH,OAAO,CAAC,qBAAqB;IAuB7B;;;;OAIG;IACH,IAAI,iBAAiB,IAAI,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAE3C;CACF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { logger, LOG_MODULES } from '../../utils/logger.js';
|
|
1
|
+
import { logger, LOG_MODULES } from '../../utils/logger/index.js';
|
|
2
2
|
import { getCompositeKey } from '../../utils/composite-key.js';
|
|
3
3
|
import { normalizeToolName } from '../../utils/name-converter.js';
|
|
4
4
|
/**
|
|
@@ -119,11 +119,7 @@ export class ToolCache {
|
|
|
119
119
|
* @returns Array of all tools from all servers
|
|
120
120
|
*/
|
|
121
121
|
getAllTools() {
|
|
122
|
-
|
|
123
|
-
for (const tools of this.toolCache.values()) {
|
|
124
|
-
allTools.push(...tools);
|
|
125
|
-
}
|
|
126
|
-
return allTools;
|
|
122
|
+
return this.getAllToolsByServerName();
|
|
127
123
|
}
|
|
128
124
|
/**
|
|
129
125
|
* Gets all tools from the server name-level cache.
|
|
@@ -174,13 +170,19 @@ export class ToolCache {
|
|
|
174
170
|
* @param serverName - The server name to update
|
|
175
171
|
*/
|
|
176
172
|
updateServerNameCache(serverName) {
|
|
177
|
-
const
|
|
173
|
+
const toolMap = new Map();
|
|
178
174
|
for (const [compositeKey, cachedTools] of this.toolCache.entries()) {
|
|
179
175
|
const instanceServerName = this.getServerNameById(compositeKey);
|
|
180
176
|
if (instanceServerName === serverName) {
|
|
181
|
-
|
|
177
|
+
for (const tool of cachedTools) {
|
|
178
|
+
const key = normalizeToolName(tool.name);
|
|
179
|
+
if (!toolMap.has(key)) {
|
|
180
|
+
toolMap.set(key, tool);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
182
183
|
}
|
|
183
184
|
}
|
|
185
|
+
const allToolsForServer = Array.from(toolMap.values());
|
|
184
186
|
if (allToolsForServer.length > 0) {
|
|
185
187
|
this.serverNameToolCache.set(serverName, allToolsForServer);
|
|
186
188
|
}
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
* automatically manages memory by cleaning up empty event type entries when all listeners
|
|
23
23
|
* are unsubscribed.
|
|
24
24
|
*/
|
|
25
|
-
|
|
25
|
+
type EventData = unknown;
|
|
26
26
|
/**
|
|
27
27
|
* Interface representing a published event with its type and associated data.
|
|
28
28
|
*
|
|
@@ -154,6 +154,7 @@ export declare const EventTypes: {
|
|
|
154
154
|
readonly SERVER_INSTANCE_UPDATED: "server-instance-updated";
|
|
155
155
|
readonly SERVER_INSTANCE_DELETED: "server-instance-deleted";
|
|
156
156
|
readonly TOOLS_UPDATED: "tools";
|
|
157
|
+
readonly AGGREGATED_TOOLS_CHANGED: "aggregated-tools-changed";
|
|
157
158
|
readonly TOOL_CALL_STARTED: "tool-call-started";
|
|
158
159
|
readonly TOOL_CALL_COMPLETED: "tool-call-completed";
|
|
159
160
|
readonly TOOL_CALL_ERROR: "tool-call-error";
|
|
@@ -162,4 +163,5 @@ export declare const EventTypes: {
|
|
|
162
163
|
readonly CONFIGURATION_UPDATED: "configuration-updated";
|
|
163
164
|
};
|
|
164
165
|
export declare const eventBus: EventBusService;
|
|
166
|
+
export {};
|
|
165
167
|
//# sourceMappingURL=event-bus.service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-bus.service.d.ts","sourceRoot":"","sources":["../../../../src/services/event-bus.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,
|
|
1
|
+
{"version":3,"file":"event-bus.service.d.ts","sourceRoot":"","sources":["../../../../src/services/event-bus.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,KAAK,SAAS,GAAG,OAAO,CAAC;AAEzB;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,SAAS,CAAqD;IAEtE;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI;IAajD;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,GAAG,MAAM,IAAI;IAU7E;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,WAAW;IAWnB;;;;;;;;;;;;;;OAcG;IACH,cAAc,IAAI,IAAI;IAItB;;;;;;;;;;;;;;OAcG;IACH,aAAa,IAAI,MAAM,EAAE;IAIzB;;;;;;;;;;;;;;;OAeG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;CAI5C;AAGD,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;CA6Bb,CAAC;AAGX,eAAO,MAAM,QAAQ,iBAAwB,CAAC"}
|
|
@@ -181,6 +181,7 @@ export const EventTypes = {
|
|
|
181
181
|
SERVER_INSTANCE_DELETED: 'server-instance-deleted',
|
|
182
182
|
// Tool related events
|
|
183
183
|
TOOLS_UPDATED: 'tools',
|
|
184
|
+
AGGREGATED_TOOLS_CHANGED: 'aggregated-tools-changed',
|
|
184
185
|
TOOL_CALL_STARTED: 'tool-call-started',
|
|
185
186
|
TOOL_CALL_COMPLETED: 'tool-call-completed',
|
|
186
187
|
TOOL_CALL_ERROR: 'tool-call-error',
|
|
@@ -23,6 +23,7 @@ export declare class GatewayService {
|
|
|
23
23
|
private transport;
|
|
24
24
|
private readonly appVersion;
|
|
25
25
|
constructor();
|
|
26
|
+
private initToolCache;
|
|
26
27
|
private createServerWithHandlers;
|
|
27
28
|
private registerHandlers;
|
|
28
29
|
/**
|
|
@@ -52,6 +53,19 @@ export declare class GatewayService {
|
|
|
52
53
|
* @returns {McpServer} New MCP server instance with all handlers registered
|
|
53
54
|
*/
|
|
54
55
|
createConnectionServer(): McpServer;
|
|
56
|
+
/**
|
|
57
|
+
* Returns the singleton McpServer instance used for HTTP transport.
|
|
58
|
+
*/
|
|
59
|
+
getServer(): McpServer;
|
|
60
|
+
/**
|
|
61
|
+
* Subscribes to EventBus events and pushes MCP notifications
|
|
62
|
+
* (notifications/resources/list_changed, notifications/tools/list_changed)
|
|
63
|
+
* to connected SSE clients via the singleton transport.
|
|
64
|
+
*
|
|
65
|
+
* Tools are aggregated by ServerName (multi-instance deduplication).
|
|
66
|
+
* Resources are per-instance (Category 1: hub://servers/{name}, Category 2: hub://servers/{name}/{idx}/{path}).
|
|
67
|
+
*/
|
|
68
|
+
private initNotifications;
|
|
55
69
|
/**
|
|
56
70
|
* Starts the MCP gateway service on stdio transport.
|
|
57
71
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway.service.d.ts","sourceRoot":"","sources":["../../../../../src/services/gateway/gateway.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"gateway.service.d.ts","sourceRoot":"","sources":["../../../../../src/services/gateway/gateway.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAwBpE,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE5D,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,SAAS,CAAqC;IACtD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;;IASpC,OAAO,CAAC,aAAa;IA0BrB,OAAO,CAAC,wBAAwB;IA2BhC,OAAO,CAAC,gBAAgB;IAkDxB;;;;;OAKG;IACI,wBAAwB,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC;IAIvF;;;;;OAKG;IACI,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM;IAI5C;;;;;OAKG;IACI,kBAAkB,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM;IAIpD;;;;OAIG;IACI,sBAAsB,IAAI,SAAS;IAI1C;;OAEG;IACI,SAAS,IAAI,SAAS;IAI7B;;;;;;;OAOG;IACH,OAAO,CAAC,iBAAiB;IAgEzB;;;;OAIG;IACU,KAAK;CAKnB;AAED,eAAO,MAAM,OAAO,gBAAuB,CAAC"}
|
|
@@ -24,7 +24,11 @@ import { getGatewayDebugSetting } from '../../utils/json-utils.js';
|
|
|
24
24
|
import { MCP_HUB_LITE_SERVER } from '../../models/system-tools.constants.js';
|
|
25
25
|
import { registerInitializeHandlers, registerResourcesHandlers, registerSystemToolsHandlers, registerCallToolHandler } from './request-handlers/index.js';
|
|
26
26
|
import { getAppVersion } from '../../utils/version.js';
|
|
27
|
-
import {
|
|
27
|
+
import { eventBus, EventTypes } from '../event-bus.service.js';
|
|
28
|
+
import { hubManager } from '../hub-manager.service.js';
|
|
29
|
+
import { mcpConnectionManager } from '../connection/index.js';
|
|
30
|
+
import { sessionManager } from './session-manager.js';
|
|
31
|
+
import { generateGatewayToolsList, rebuildFromScratch, addToCache, removeFromCache } from './tool-list-generator.js';
|
|
28
32
|
import { formatToolArgs, formatToolResponse } from './log-formatter.js';
|
|
29
33
|
export class GatewayService {
|
|
30
34
|
server;
|
|
@@ -33,6 +37,32 @@ export class GatewayService {
|
|
|
33
37
|
constructor() {
|
|
34
38
|
this.appVersion = getAppVersion();
|
|
35
39
|
this.server = this.createServerWithHandlers();
|
|
40
|
+
this.initToolCache();
|
|
41
|
+
this.initNotifications();
|
|
42
|
+
}
|
|
43
|
+
initToolCache() {
|
|
44
|
+
rebuildFromScratch();
|
|
45
|
+
eventBus.subscribe(EventTypes.TOOLS_UPDATED, (rawData) => {
|
|
46
|
+
const data = rawData;
|
|
47
|
+
const serverConfig = hubManager.getServerByName(data.serverName);
|
|
48
|
+
if (serverConfig?.template?.aggregatedTools?.length) {
|
|
49
|
+
rebuildFromScratch();
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
eventBus.subscribe(EventTypes.SERVER_DISCONNECTED, (rawData) => {
|
|
53
|
+
const data = rawData;
|
|
54
|
+
const serverConfig = hubManager.getServerByName(data.serverName);
|
|
55
|
+
if (!serverConfig || serverConfig.template?.aggregatedTools?.length) {
|
|
56
|
+
rebuildFromScratch();
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
eventBus.subscribe(EventTypes.AGGREGATED_TOOLS_CHANGED, (rawData) => {
|
|
60
|
+
const data = rawData;
|
|
61
|
+
if (data.added.length > 0)
|
|
62
|
+
addToCache(data.name, data.added);
|
|
63
|
+
if (data.removed.length > 0)
|
|
64
|
+
removeFromCache(data.name, data.removed);
|
|
65
|
+
});
|
|
36
66
|
}
|
|
37
67
|
createServerWithHandlers() {
|
|
38
68
|
if (getGatewayDebugSetting()) {
|
|
@@ -60,11 +90,6 @@ export class GatewayService {
|
|
|
60
90
|
if (getGatewayDebugSetting()) {
|
|
61
91
|
logger.debug('Registering handlers on MCP server', LOG_MODULES.GATEWAY_SERVICE);
|
|
62
92
|
}
|
|
63
|
-
// Local toolMap for this connection
|
|
64
|
-
const toolMap = new Map();
|
|
65
|
-
if (getGatewayDebugSetting()) {
|
|
66
|
-
logger.debug('Created local toolMap for connection', LOG_MODULES.GATEWAY_SERVICE);
|
|
67
|
-
}
|
|
68
93
|
try {
|
|
69
94
|
registerInitializeHandlers(server);
|
|
70
95
|
if (getGatewayDebugSetting()) {
|
|
@@ -96,7 +121,7 @@ export class GatewayService {
|
|
|
96
121
|
throw error;
|
|
97
122
|
}
|
|
98
123
|
try {
|
|
99
|
-
registerCallToolHandler(server
|
|
124
|
+
registerCallToolHandler(server);
|
|
100
125
|
if (getGatewayDebugSetting()) {
|
|
101
126
|
logger.debug('Call tool handler registered successfully', LOG_MODULES.GATEWAY_SERVICE);
|
|
102
127
|
}
|
|
@@ -144,6 +169,75 @@ export class GatewayService {
|
|
|
144
169
|
createConnectionServer() {
|
|
145
170
|
return this.createServerWithHandlers();
|
|
146
171
|
}
|
|
172
|
+
/**
|
|
173
|
+
* Returns the singleton McpServer instance used for HTTP transport.
|
|
174
|
+
*/
|
|
175
|
+
getServer() {
|
|
176
|
+
return this.server;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Subscribes to EventBus events and pushes MCP notifications
|
|
180
|
+
* (notifications/resources/list_changed, notifications/tools/list_changed)
|
|
181
|
+
* to connected SSE clients via the singleton transport.
|
|
182
|
+
*
|
|
183
|
+
* Tools are aggregated by ServerName (multi-instance deduplication).
|
|
184
|
+
* Resources are per-instance (Category 1: hub://servers/{name}, Category 2: hub://servers/{name}/{idx}/{path}).
|
|
185
|
+
*/
|
|
186
|
+
initNotifications() {
|
|
187
|
+
// --- Resources list_changed ---
|
|
188
|
+
// Category 1: new/removed server config
|
|
189
|
+
eventBus.subscribe(EventTypes.SERVER_ADDED, () => {
|
|
190
|
+
sessionManager.broadcastNotification('resources');
|
|
191
|
+
});
|
|
192
|
+
eventBus.subscribe(EventTypes.SERVER_DELETED, () => {
|
|
193
|
+
sessionManager.broadcastNotification('resources');
|
|
194
|
+
});
|
|
195
|
+
// Category 1 + 2: any instance connect/disconnect changes resource list
|
|
196
|
+
eventBus.subscribe(EventTypes.SERVER_CONNECTED, () => {
|
|
197
|
+
sessionManager.broadcastNotification('resources');
|
|
198
|
+
});
|
|
199
|
+
eventBus.subscribe(EventTypes.SERVER_DISCONNECTED, () => {
|
|
200
|
+
sessionManager.broadcastNotification('resources');
|
|
201
|
+
});
|
|
202
|
+
// Category 2: backend server resources refreshed
|
|
203
|
+
eventBus.subscribe(EventTypes.RESOURCES_UPDATED, () => {
|
|
204
|
+
sessionManager.broadcastNotification('resources');
|
|
205
|
+
});
|
|
206
|
+
// --- Tools list_changed ---
|
|
207
|
+
// Only notify when the first instance connects or last instance disconnects
|
|
208
|
+
eventBus.subscribe(EventTypes.SERVER_CONNECTED, (rawData) => {
|
|
209
|
+
const data = rawData;
|
|
210
|
+
const indexes = mcpConnectionManager.getConnectedIndexes(data.serverName);
|
|
211
|
+
if (indexes.length === 1) {
|
|
212
|
+
const serverConfig = hubManager.getServerByName(data.serverName);
|
|
213
|
+
if (serverConfig?.template?.aggregatedTools?.length) {
|
|
214
|
+
sessionManager.broadcastNotification('tools');
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
});
|
|
218
|
+
eventBus.subscribe(EventTypes.SERVER_DISCONNECTED, (rawData) => {
|
|
219
|
+
const data = rawData;
|
|
220
|
+
const indexes = mcpConnectionManager.getConnectedIndexes(data.serverName);
|
|
221
|
+
if (indexes.length === 0) {
|
|
222
|
+
const serverConfig = hubManager.getServerByName(data.serverName);
|
|
223
|
+
if (serverConfig?.template?.aggregatedTools?.length) {
|
|
224
|
+
sessionManager.broadcastNotification('tools');
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
// Backend server tools refreshed while connected
|
|
229
|
+
eventBus.subscribe(EventTypes.TOOLS_UPDATED, (rawData) => {
|
|
230
|
+
const data = rawData;
|
|
231
|
+
const serverConfig = hubManager.getServerByName(data.serverName);
|
|
232
|
+
if (serverConfig?.template?.aggregatedTools?.length) {
|
|
233
|
+
sessionManager.broadcastNotification('tools');
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
// Aggregated tools config changed
|
|
237
|
+
eventBus.subscribe(EventTypes.AGGREGATED_TOOLS_CHANGED, () => {
|
|
238
|
+
sessionManager.broadcastNotification('tools');
|
|
239
|
+
});
|
|
240
|
+
}
|
|
147
241
|
/**
|
|
148
242
|
* Starts the MCP gateway service on stdio transport.
|
|
149
243
|
*
|
|
@@ -1,19 +1,29 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* MCP transport
|
|
2
|
+
* MCP transport utilities — stateful session-based mode.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Each client session owns a StreamableHTTPServerTransport + McpServer pair.
|
|
5
|
+
* SDK's stateful mode (sessionIdGenerator) handles SSE stream setup and session management.
|
|
6
|
+
* Notifications are broadcast via SessionManager across all active sessions.
|
|
6
7
|
*/
|
|
7
8
|
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
8
9
|
/**
|
|
9
|
-
*
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
*
|
|
10
|
+
* Sets up debug logging on a transport instance.
|
|
11
|
+
*/
|
|
12
|
+
export declare function setupTransportLogging(transport: StreamableHTTPServerTransport): void;
|
|
13
|
+
/**
|
|
14
|
+
* Initializes the global transport layer.
|
|
15
|
+
* With stateful session-based transport, this is a no-op.
|
|
16
|
+
* Kept for backward compatibility with app.ts startup sequence.
|
|
17
|
+
*/
|
|
18
|
+
export declare function initGlobalTransport(): void;
|
|
19
|
+
/**
|
|
20
|
+
* Creates a new MCP transport and server instance for a single request (stateless mode).
|
|
21
|
+
* Each call returns isolated instances that should be GC'd after the request completes.
|
|
22
|
+
* This restores the v1.3.0 per-request transport pattern for clients like CherryStudio
|
|
23
|
+
* that do not properly support stateful sessions.
|
|
14
24
|
*/
|
|
15
|
-
export declare function
|
|
25
|
+
export declare function createPerRequestTransport(): Promise<{
|
|
16
26
|
transport: StreamableHTTPServerTransport;
|
|
17
|
-
server: import(
|
|
27
|
+
server: import('@modelcontextprotocol/sdk/server/mcp.js').McpServer;
|
|
18
28
|
}>;
|
|
19
29
|
//# sourceMappingURL=global-transport.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"global-transport.d.ts","sourceRoot":"","sources":["../../../../../src/services/gateway/global-transport.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"global-transport.d.ts","sourceRoot":"","sources":["../../../../../src/services/gateway/global-transport.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AAuBnG;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,6BAA6B,GAAG,IAAI,CAmCpF;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAI1C;AAED;;;;;GAKG;AACH,wBAAsB,yBAAyB,IAAI,OAAO,CAAC;IACzD,SAAS,EAAE,6BAA6B,CAAC;IACzC,MAAM,EAAE,OAAO,yCAAyC,EAAE,SAAS,CAAC;CACrE,CAAC,CAWD"}
|
|
@@ -1,72 +1,88 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* MCP transport
|
|
2
|
+
* MCP transport utilities — stateful session-based mode.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Each client session owns a StreamableHTTPServerTransport + McpServer pair.
|
|
5
|
+
* SDK's stateful mode (sessionIdGenerator) handles SSE stream setup and session management.
|
|
6
|
+
* Notifications are broadcast via SessionManager across all active sessions.
|
|
6
7
|
*/
|
|
7
8
|
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
8
|
-
import { gateway } from './gateway.service.js';
|
|
9
9
|
import { logger, LOG_MODULES } from '../../utils/logger/index.js';
|
|
10
10
|
import { stringifyForLogging, getMcpCommDebugSetting, getGatewayDebugSetting } from '../../utils/json-utils.js';
|
|
11
11
|
import { formatMcpMessageForLogging, logNotificationMessage } from '../../utils/logger/log-output.js';
|
|
12
|
+
import { gateway } from './gateway.service.js';
|
|
12
13
|
/**
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* @returns {Promise<{ transport: StreamableHTTPServerTransport, server: import('@modelcontextprotocol/sdk/server/mcp.js').McpServer }>}
|
|
17
|
-
* Object containing the transport and server instances
|
|
14
|
+
* Build log options from trace context stored on transport.
|
|
15
|
+
* Trace context is injected by gateway.ts before handleRequest() as an ALS fallback
|
|
16
|
+
* because the MCP SDK defers send()/onmessage calls and ALS context is lost.
|
|
18
17
|
*/
|
|
19
|
-
|
|
20
|
-
const
|
|
21
|
-
const
|
|
22
|
-
|
|
18
|
+
function traceLogOpts(transport) {
|
|
19
|
+
const ctx = transport;
|
|
20
|
+
const sid = ctx._traceSessionId;
|
|
21
|
+
const tid = ctx._traceId;
|
|
22
|
+
if (!sid && !tid)
|
|
23
|
+
return LOG_MODULES.COMMUNICATION;
|
|
24
|
+
return { module: 'Communication', ...(sid && { sessionId: sid }), ...(tid && { traceId: tid }) };
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Sets up debug logging on a transport instance.
|
|
28
|
+
*/
|
|
29
|
+
export function setupTransportLogging(transport) {
|
|
23
30
|
transport.onmessage = (message) => {
|
|
24
31
|
try {
|
|
25
32
|
if (getMcpCommDebugSetting()) {
|
|
26
|
-
|
|
33
|
+
const opts = traceLogOpts(transport);
|
|
34
|
+
logger.debug(`Transport onmessage: ${stringifyForLogging(message)}`, opts);
|
|
27
35
|
const logMessage = formatMcpMessageForLogging(message);
|
|
28
|
-
logger.debug(`MCP message received: ${logMessage}`,
|
|
36
|
+
logger.debug(`MCP message received: ${logMessage}`, opts);
|
|
29
37
|
}
|
|
30
|
-
logNotificationMessage(message, '');
|
|
38
|
+
logNotificationMessage(message, '');
|
|
31
39
|
if (getGatewayDebugSetting()) {
|
|
32
|
-
logger.debug(
|
|
40
|
+
logger.debug('Transport onmessage completed', LOG_MODULES.GATEWAY);
|
|
33
41
|
}
|
|
34
42
|
}
|
|
35
43
|
catch (error) {
|
|
36
44
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
37
|
-
logger.error(`Error in
|
|
45
|
+
logger.error(`Error in transport onmessage: ${errorMessage}`, LOG_MODULES.GATEWAY);
|
|
38
46
|
logger.error(`Message that caused error: ${stringifyForLogging(message)}`, LOG_MODULES.GATEWAY);
|
|
39
47
|
}
|
|
40
48
|
};
|
|
41
|
-
// Wrap send method for debug logging
|
|
42
49
|
if (getMcpCommDebugSetting()) {
|
|
43
50
|
const originalSend = transport.send;
|
|
44
51
|
transport.send = async (message, options) => {
|
|
45
52
|
try {
|
|
46
53
|
const logMessage = formatMcpMessageForLogging(message);
|
|
47
|
-
logger.debug(`MCP message sent: ${logMessage}`,
|
|
54
|
+
logger.debug(`MCP message sent: ${logMessage}`, traceLogOpts(transport));
|
|
48
55
|
}
|
|
49
56
|
catch {
|
|
50
|
-
logger.debug(
|
|
57
|
+
logger.debug('MCP message sent: [Error formatting response]', LOG_MODULES.COMMUNICATION);
|
|
51
58
|
}
|
|
52
59
|
return await originalSend.call(transport, message, options);
|
|
53
60
|
};
|
|
54
61
|
}
|
|
55
|
-
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Initializes the global transport layer.
|
|
65
|
+
* With stateful session-based transport, this is a no-op.
|
|
66
|
+
* Kept for backward compatibility with app.ts startup sequence.
|
|
67
|
+
*/
|
|
68
|
+
export function initGlobalTransport() {
|
|
56
69
|
if (getGatewayDebugSetting()) {
|
|
57
|
-
logger.debug('
|
|
58
|
-
}
|
|
59
|
-
try {
|
|
60
|
-
await server.connect(transport);
|
|
61
|
-
if (getGatewayDebugSetting()) {
|
|
62
|
-
logger.debug('MCP session transport initialized (per-request mode)', LOG_MODULES.GATEWAY);
|
|
63
|
-
}
|
|
70
|
+
logger.debug('Global transport layer initialized (stateful session mode)', LOG_MODULES.GATEWAY);
|
|
64
71
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Creates a new MCP transport and server instance for a single request (stateless mode).
|
|
75
|
+
* Each call returns isolated instances that should be GC'd after the request completes.
|
|
76
|
+
* This restores the v1.3.0 per-request transport pattern for clients like CherryStudio
|
|
77
|
+
* that do not properly support stateful sessions.
|
|
78
|
+
*/
|
|
79
|
+
export async function createPerRequestTransport() {
|
|
80
|
+
const transport = new StreamableHTTPServerTransport();
|
|
81
|
+
const server = gateway.createConnectionServer();
|
|
82
|
+
setupTransportLogging(transport);
|
|
83
|
+
await server.connect(transport);
|
|
84
|
+
if (getGatewayDebugSetting()) {
|
|
85
|
+
logger.debug('MCP per-request transport initialized (stateless mode)', LOG_MODULES.GATEWAY);
|
|
70
86
|
}
|
|
71
87
|
return { transport, server };
|
|
72
88
|
}
|
|
@@ -2,12 +2,11 @@
|
|
|
2
2
|
* Call tool request handler for Gateway service.
|
|
3
3
|
*/
|
|
4
4
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
5
|
-
import type { ToolMapEntry } from '../types.js';
|
|
6
5
|
/**
|
|
7
6
|
* Register call tool handler on the MCP server.
|
|
8
7
|
*
|
|
9
8
|
* @param server - MCP server instance to register handlers on
|
|
10
9
|
* @param toolMap - Tool map for routing tool calls
|
|
11
10
|
*/
|
|
12
|
-
export declare function registerCallToolHandler(server: McpServer
|
|
11
|
+
export declare function registerCallToolHandler(server: McpServer): void;
|
|
13
12
|
//# sourceMappingURL=call-tool-handler.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"call-tool-handler.d.ts","sourceRoot":"","sources":["../../../../../../src/services/gateway/request-handlers/call-tool-handler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"call-tool-handler.d.ts","sourceRoot":"","sources":["../../../../../../src/services/gateway/request-handlers/call-tool-handler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA4FzE;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwG/D"}
|