@loop_ouroboros/mcp-hub-lite 1.0.2 → 1.1.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 +32 -0
- package/dist/client/assets/{HomeView-7rMg9C6t.js → HomeView-Bu2joUvW.js} +1 -1
- package/dist/client/assets/ResourceDetailView-BvrhDCD1.js +1 -0
- package/dist/client/assets/ResourceDetailView-DUJZbegl.css +1 -0
- package/dist/client/assets/ResourcesView-Cc8RHtia.css +1 -0
- package/dist/client/assets/ResourcesView-LjqioF_s.js +1 -0
- package/dist/client/assets/ServerDashboard-BfLeFDGw.css +1 -0
- package/dist/client/assets/ServerDashboard-FhHJFvUi.js +1 -0
- package/dist/client/assets/ServerDetail-BKV-M4qT.js +2 -0
- package/dist/client/assets/ServerDetail-CtnNKJGx.css +1 -0
- package/dist/client/assets/{ServerListView-Bws09jNR.css → ServerListView-B-bPljsO.css} +1 -1
- package/dist/client/assets/ServerListView-BXgtDyt3.js +36 -0
- package/dist/client/assets/ServerStatusTags.vue_vue_type_script_setup_true_lang-D-ooYNdN.js +1 -0
- package/dist/client/assets/SettingsView-CMFG91Z4.js +1 -0
- package/dist/client/assets/SettingsView-GkBOKL0V.css +1 -0
- package/dist/client/assets/ToolCallDialog-Bf4Xe4gH.js +1 -0
- package/dist/client/assets/ToolsView-DFpha1z0.js +1 -0
- package/dist/client/assets/{_baseClone-5q1b0P3O.js → _baseClone-Bp9Rjwd7.js} +1 -1
- package/dist/client/assets/el-form-item-B4LbJ6OO.css +1 -0
- package/dist/client/assets/el-form-item-DdSUWYsl.js +12 -0
- package/dist/client/assets/el-input-99gMrutP.js +1 -0
- package/dist/client/assets/el-input-BH4BZKnG.css +1 -0
- package/dist/client/assets/{el-loading-H85n3BUC.js → el-loading-CIQ5pD5u.js} +1 -1
- package/dist/client/assets/el-overlay-BVM6msGX.js +1 -0
- package/dist/client/assets/{el-select-C0U_l4IZ.css → el-overlay-CBvdpA69.css} +1 -1
- package/dist/client/assets/{ResourceDetailView-BdOaL_-o.css → el-radio-group-B0bauIRR.css} +1 -1
- package/dist/client/assets/el-radio-group-DhXWy7ry.js +1 -0
- package/dist/client/assets/el-skeleton-item-BLY1jEuR.css +1 -0
- package/dist/client/assets/el-skeleton-item-DJz-Us12.js +1 -0
- package/dist/client/assets/el-switch-BBrS-_6y.css +1 -0
- package/dist/client/assets/el-switch-Bu8AQ5uM.js +1 -0
- package/dist/client/assets/el-tab-pane-BnGMaV56.js +1 -0
- package/dist/client/assets/el-table-column-BMWOaLS_.js +1 -0
- package/dist/client/assets/el-table-column-BdvRS9Y2.css +1 -0
- package/dist/client/assets/index-C2V-ZGji.js +1 -0
- package/dist/client/assets/{index-BsDWtoIl.css → index-DpH6ZSbs.css} +1 -1
- package/dist/client/assets/index-vhkqgpmN.js +2 -0
- package/dist/client/assets/{omit-DPsOVNIJ.js → omit-CqPQN3XP.js} +1 -1
- package/dist/client/assets/{raf-DY5mgbuB.js → raf-C2wXzaVU.js} +1 -1
- package/dist/client/assets/{vue-vendor-6ny5zj9i.js → vue-vendor-BLHLXXJK.js} +1 -1
- package/dist/client/index.html +3 -3
- package/dist/server/shared/models/resource.model.d.ts +2 -1
- package/dist/server/shared/models/resource.model.d.ts.map +1 -1
- package/dist/server/shared/models/server.model.d.ts +362 -5
- package/dist/server/shared/models/server.model.d.ts.map +1 -1
- package/dist/server/shared/models/server.model.js +220 -1
- package/dist/server/shared/models/session.model.d.ts +1 -57
- package/dist/server/shared/models/session.model.d.ts.map +1 -1
- package/dist/server/shared/models/session.model.js +1 -55
- package/dist/server/shared/models/tool.model.d.ts +4 -2
- package/dist/server/shared/models/tool.model.d.ts.map +1 -1
- package/dist/server/shared/types/session-context.types.d.ts +0 -2
- package/dist/server/shared/types/session-context.types.d.ts.map +1 -1
- package/dist/server/shared/types/websocket.types.d.ts +17 -10
- package/dist/server/shared/types/websocket.types.d.ts.map +1 -1
- package/dist/server/src/api/mcp/gateway.d.ts +1 -3
- package/dist/server/src/api/mcp/gateway.d.ts.map +1 -1
- package/dist/server/src/api/mcp/gateway.js +19 -50
- package/dist/server/src/api/mcp/session-context-extractor.d.ts.map +1 -1
- package/dist/server/src/api/mcp/session-context-extractor.js +5 -14
- package/dist/server/src/api/web/hub-tools.d.ts +2 -2
- package/dist/server/src/api/web/hub-tools.d.ts.map +1 -1
- package/dist/server/src/api/web/hub-tools.js +3 -54
- package/dist/server/src/api/web/mcp-status.d.ts +1 -1
- package/dist/server/src/api/web/mcp-status.d.ts.map +1 -1
- package/dist/server/src/api/web/mcp-status.js +71 -30
- package/dist/server/src/api/web/resources.d.ts.map +1 -1
- package/dist/server/src/api/web/resources.js +28 -22
- 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 +24 -45
- package/dist/server/src/api/web/servers.d.ts +3 -3
- package/dist/server/src/api/web/servers.d.ts.map +1 -1
- package/dist/server/src/api/web/servers.js +70 -25
- package/dist/server/src/api/ws/ws-handler.d.ts.map +1 -1
- package/dist/server/src/api/ws/ws-handler.js +4 -2
- package/dist/server/src/app.d.ts.map +1 -1
- package/dist/server/src/app.js +0 -2
- package/dist/server/src/cli/commands/list.js +2 -2
- package/dist/server/src/cli/commands/status.d.ts.map +1 -1
- package/dist/server/src/cli/commands/status.js +41 -30
- package/dist/server/src/cli/index.d.ts.map +1 -1
- package/dist/server/src/cli/index.js +2 -1
- package/dist/server/src/cli/server.d.ts +11 -2
- package/dist/server/src/cli/server.d.ts.map +1 -1
- package/dist/server/src/config/config-change-logger.d.ts +22 -0
- package/dist/server/src/config/config-change-logger.d.ts.map +1 -1
- package/dist/server/src/config/config-change-logger.js +135 -11
- package/dist/server/src/config/config-loader.d.ts +6 -5
- package/dist/server/src/config/config-loader.d.ts.map +1 -1
- package/dist/server/src/config/config-loader.js +54 -16
- package/dist/server/src/config/config-manager.d.ts +51 -43
- package/dist/server/src/config/config-manager.d.ts.map +1 -1
- package/dist/server/src/config/config-manager.js +84 -66
- package/dist/server/src/config/config-migrator.d.ts +82 -0
- package/dist/server/src/config/config-migrator.d.ts.map +1 -0
- package/dist/server/src/config/config-migrator.js +348 -0
- package/dist/server/src/config/config-saver.d.ts +2 -0
- package/dist/server/src/config/config-saver.d.ts.map +1 -1
- package/dist/server/src/config/config-saver.js +8 -2
- package/dist/server/src/config/config.schema.d.ts +10 -104
- package/dist/server/src/config/config.schema.d.ts.map +1 -1
- package/dist/server/src/config/config.schema.js +15 -99
- package/dist/server/src/config/path-validator.d.ts +27 -0
- package/dist/server/src/config/path-validator.d.ts.map +1 -0
- package/dist/server/src/config/path-validator.js +53 -0
- package/dist/server/src/config/server-config-manager.d.ts +37 -31
- package/dist/server/src/config/server-config-manager.d.ts.map +1 -1
- package/dist/server/src/config/server-config-manager.js +222 -66
- package/dist/server/src/config/type-converter.d.ts.map +1 -1
- package/dist/server/src/config/type-converter.js +3 -2
- package/dist/server/src/models/event.model.d.ts +17 -10
- package/dist/server/src/models/event.model.d.ts.map +1 -1
- package/dist/server/src/models/server.model.d.ts +17 -3
- package/dist/server/src/models/server.model.d.ts.map +1 -1
- package/dist/server/src/models/server.model.js +2 -1
- package/dist/server/src/models/system-tools.constants.d.ts +10 -27
- package/dist/server/src/models/system-tools.constants.d.ts.map +1 -1
- package/dist/server/src/models/system-tools.constants.js +4 -8
- package/dist/server/src/pid/manager.d.ts.map +1 -1
- package/dist/server/src/pid/manager.js +2 -1
- package/dist/server/src/server/dev-server.js +34 -20
- package/dist/server/src/server/runner.d.ts.map +1 -1
- package/dist/server/src/server/runner.js +41 -26
- package/dist/server/src/services/connection/connection-manager.d.ts +85 -103
- package/dist/server/src/services/connection/connection-manager.d.ts.map +1 -1
- package/dist/server/src/services/connection/connection-manager.js +286 -241
- package/dist/server/src/services/connection/tool-cache.d.ts +27 -25
- package/dist/server/src/services/connection/tool-cache.d.ts.map +1 -1
- package/dist/server/src/services/connection/tool-cache.js +50 -55
- package/dist/server/src/services/gateway/gateway.service.d.ts +2 -0
- package/dist/server/src/services/gateway/gateway.service.d.ts.map +1 -1
- package/dist/server/src/services/gateway/gateway.service.js +15 -19
- package/dist/server/src/services/gateway/global-transport.d.ts +10 -0
- package/dist/server/src/services/gateway/global-transport.d.ts.map +1 -0
- package/dist/server/src/services/gateway/global-transport.js +42 -0
- 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 +67 -65
- package/dist/server/src/services/gateway/request-handlers/index.d.ts +1 -1
- package/dist/server/src/services/gateway/request-handlers/index.d.ts.map +1 -1
- package/dist/server/src/services/gateway/request-handlers/index.js +1 -1
- package/dist/server/src/services/gateway/request-handlers/initialize-handler.d.ts +1 -4
- 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 +10 -81
- package/dist/server/src/services/gateway/request-handlers/initialize.constants.d.ts +35 -0
- package/dist/server/src/services/gateway/request-handlers/initialize.constants.d.ts.map +1 -0
- package/dist/server/src/services/gateway/request-handlers/initialize.constants.js +44 -0
- 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 +5 -4
- package/dist/server/src/services/gateway/request-handlers/system-tools-handler.d.ts.map +1 -1
- package/dist/server/src/services/gateway/request-handlers/system-tools-handler.js +32 -77
- package/dist/server/src/services/gateway/request-handlers/tools-handler.d.ts.map +1 -1
- package/dist/server/src/services/gateway/request-handlers/tools-handler.js +4 -3
- package/dist/server/src/services/gateway/tool-list-generator.d.ts.map +1 -1
- package/dist/server/src/services/gateway/tool-list-generator.js +37 -16
- package/dist/server/src/services/gateway/types.d.ts +2 -1
- package/dist/server/src/services/gateway/types.d.ts.map +1 -1
- package/dist/server/src/services/hub-manager.service.d.ts +32 -238
- package/dist/server/src/services/hub-manager.service.d.ts.map +1 -1
- package/dist/server/src/services/hub-manager.service.js +89 -267
- package/dist/server/src/services/hub-tools/index.d.ts +1 -3
- package/dist/server/src/services/hub-tools/index.d.ts.map +1 -1
- package/dist/server/src/services/hub-tools/index.js +1 -2
- package/dist/server/src/services/hub-tools/instance-matcher.d.ts +62 -0
- package/dist/server/src/services/hub-tools/instance-matcher.d.ts.map +1 -0
- package/dist/server/src/services/hub-tools/instance-matcher.js +132 -0
- package/dist/server/src/services/hub-tools/instance-selector.d.ts +29 -0
- package/dist/server/src/services/hub-tools/instance-selector.d.ts.map +1 -0
- package/dist/server/src/services/hub-tools/instance-selector.js +103 -0
- package/dist/server/src/services/hub-tools/resource-generator.d.ts +24 -1
- package/dist/server/src/services/hub-tools/resource-generator.d.ts.map +1 -1
- package/dist/server/src/services/hub-tools/resource-generator.js +259 -39
- package/dist/server/src/services/hub-tools/server-selector.d.ts +26 -13
- package/dist/server/src/services/hub-tools/server-selector.d.ts.map +1 -1
- package/dist/server/src/services/hub-tools/server-selector.js +44 -37
- package/dist/server/src/services/hub-tools/system-tool-definitions.d.ts +1 -4
- package/dist/server/src/services/hub-tools/system-tool-definitions.d.ts.map +1 -1
- package/dist/server/src/services/hub-tools/system-tool-definitions.js +17 -80
- package/dist/server/src/services/hub-tools/tool-search.d.ts +7 -7
- package/dist/server/src/services/hub-tools/tool-search.d.ts.map +1 -1
- package/dist/server/src/services/hub-tools/tool-search.js +10 -4
- package/dist/server/src/services/hub-tools/types.d.ts +2 -2
- package/dist/server/src/services/hub-tools/types.d.ts.map +1 -1
- package/dist/server/src/services/hub-tools.service.d.ts +43 -72
- package/dist/server/src/services/hub-tools.service.d.ts.map +1 -1
- package/dist/server/src/services/hub-tools.service.js +185 -110
- package/dist/server/src/services/search/search-core.service.d.ts +5 -5
- package/dist/server/src/services/search/search-core.service.js +11 -11
- package/dist/server/src/services/session/session-manager.d.ts +12 -256
- package/dist/server/src/services/session/session-manager.d.ts.map +1 -1
- package/dist/server/src/services/session/session-manager.js +23 -585
- package/dist/server/src/services/session-tracker.service.d.ts +2 -10
- package/dist/server/src/services/session-tracker.service.d.ts.map +1 -1
- package/dist/server/src/services/session-tracker.service.js +2 -53
- package/dist/server/src/services/system-tool-handler.d.ts.map +1 -1
- package/dist/server/src/services/system-tool-handler.js +7 -17
- package/dist/server/src/utils/composite-key.d.ts +29 -0
- package/dist/server/src/utils/composite-key.d.ts.map +1 -0
- package/dist/server/src/utils/composite-key.js +39 -0
- package/dist/server/src/utils/error-handler.d.ts.map +1 -1
- package/dist/server/src/utils/error-handler.js +3 -2
- package/dist/server/src/utils/index.d.ts +2 -0
- package/dist/server/src/utils/index.d.ts.map +1 -1
- package/dist/server/src/utils/index.js +2 -0
- package/dist/server/src/utils/instance-id.d.ts +22 -0
- package/dist/server/src/utils/instance-id.d.ts.map +1 -0
- package/dist/server/src/utils/instance-id.js +59 -0
- package/dist/server/src/utils/json-utils.d.ts +4 -4
- package/dist/server/src/utils/json-utils.d.ts.map +1 -1
- package/dist/server/src/utils/json-utils.js +4 -4
- package/dist/server/src/utils/logger/dev-logger.d.ts +2 -1
- package/dist/server/src/utils/logger/dev-logger.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 +82 -5
- package/dist/server/src/utils/logger/log-modules.d.ts +15 -9
- package/dist/server/src/utils/logger/log-modules.d.ts.map +1 -1
- package/dist/server/src/utils/logger/log-modules.js +8 -6
- package/dist/server/src/utils/parameter-validator.d.ts +10 -0
- package/dist/server/src/utils/parameter-validator.d.ts.map +1 -0
- package/dist/server/src/utils/parameter-validator.js +53 -0
- package/dist/server/src/utils/process-tree.d.ts +49 -0
- package/dist/server/src/utils/process-tree.d.ts.map +1 -0
- package/dist/server/src/utils/process-tree.js +285 -0
- package/dist/server/src/utils/request-context.d.ts +0 -18
- package/dist/server/src/utils/request-context.d.ts.map +1 -1
- package/dist/server/src/utils/request-context.js +0 -20
- package/dist/server/src/utils/sort-utils.d.ts +40 -0
- package/dist/server/src/utils/sort-utils.d.ts.map +1 -0
- package/dist/server/src/utils/sort-utils.js +131 -0
- package/dist/server/src/utils/transports/sse-transport.d.ts +16 -1
- package/dist/server/src/utils/transports/sse-transport.d.ts.map +1 -1
- package/dist/server/src/utils/transports/sse-transport.js +55 -9
- package/dist/server/src/utils/transports/stdio-transport.d.ts +24 -53
- package/dist/server/src/utils/transports/stdio-transport.d.ts.map +1 -1
- package/dist/server/src/utils/transports/stdio-transport.js +66 -247
- package/dist/server/src/utils/transports/streamable-http-transport.d.ts +24 -1
- package/dist/server/src/utils/transports/streamable-http-transport.d.ts.map +1 -1
- package/dist/server/src/utils/transports/streamable-http-transport.js +68 -8
- package/dist/server/src/utils/transports/transport-factory.d.ts +9 -4
- package/dist/server/src/utils/transports/transport-factory.d.ts.map +1 -1
- package/dist/server/src/utils/transports/transport-factory.js +31 -11
- package/dist/server/src/utils/transports/transport.interface.d.ts +6 -0
- package/dist/server/src/utils/transports/transport.interface.d.ts.map +1 -1
- package/dist/server/src/utils/version.d.ts +11 -0
- package/dist/server/src/utils/version.d.ts.map +1 -0
- package/dist/server/src/utils/version.js +57 -0
- package/dist/server/tests/contract/mcp-protocol/initialize.test.js +24 -24
- package/dist/server/tests/contract/mcp-protocol/tools-call.test.js +49 -45
- package/dist/server/tests/contract/mcp-protocol/tools-list.test.js +35 -36
- package/dist/server/tests/evaluation/evaluation.test.js +10 -9
- package/dist/server/tests/integration/api/gateway.test.js +2 -2
- package/dist/server/tests/integration/gateway/fault-tolerance.test.js +65 -25
- package/dist/server/tests/integration/gateway/mcp-connection.test.js +53 -61
- package/dist/server/tests/server.test.js +27 -16
- package/dist/server/tests/temp/temp-run-docling.d.ts +2 -0
- package/dist/server/tests/temp/temp-run-docling.d.ts.map +1 -0
- package/dist/server/tests/temp/temp-run-docling.js +53 -0
- package/dist/server/tests/types/test-helpers.d.ts +1 -2
- package/dist/server/tests/types/test-helpers.d.ts.map +1 -1
- package/dist/server/tests/unit/config/config-loader-automatic-migration.test.d.ts +2 -0
- package/dist/server/tests/unit/config/config-loader-automatic-migration.test.d.ts.map +1 -0
- package/dist/server/tests/unit/config/config-loader-automatic-migration.test.js +199 -0
- package/dist/server/tests/unit/config/config-migrator.test.d.ts +2 -0
- package/dist/server/tests/unit/config/config-migrator.test.d.ts.map +1 -0
- package/dist/server/tests/unit/config/config-migrator.test.js +316 -0
- package/dist/server/tests/unit/config/config-saver.test.d.ts +2 -0
- package/dist/server/tests/unit/config/config-saver.test.d.ts.map +1 -0
- package/dist/server/tests/unit/config/config-saver.test.js +200 -0
- package/dist/server/tests/unit/config/config.schema.test.d.ts +2 -0
- package/dist/server/tests/unit/config/config.schema.test.d.ts.map +1 -0
- package/dist/server/tests/unit/config/config.schema.test.js +347 -0
- package/dist/server/tests/unit/server/runner.test.js +86 -62
- package/dist/server/tests/unit/services/connection/connection-manager.test.d.ts +2 -0
- package/dist/server/tests/unit/services/connection/connection-manager.test.d.ts.map +1 -0
- package/dist/server/tests/unit/services/connection/connection-manager.test.js +112 -0
- package/dist/server/tests/unit/services/hub-manager-service.test.js +112 -46
- package/dist/server/tests/unit/services/hub-manager.test.js +25 -15
- package/dist/server/tests/unit/services/hub-tools/instance-selector.test.d.ts +2 -0
- package/dist/server/tests/unit/services/hub-tools/instance-selector.test.d.ts.map +1 -0
- package/dist/server/tests/unit/services/hub-tools/instance-selector.test.js +195 -0
- package/dist/server/tests/unit/services/hub-tools/server-selector.test.d.ts +2 -0
- package/dist/server/tests/unit/services/hub-tools/server-selector.test.d.ts.map +1 -0
- package/dist/server/tests/unit/services/hub-tools/server-selector.test.js +190 -0
- package/dist/server/tests/unit/services/hub-tools.service.test.js +560 -320
- package/dist/server/tests/unit/services/instance-matcher.test.d.ts +2 -0
- package/dist/server/tests/unit/services/instance-matcher.test.d.ts.map +1 -0
- package/dist/server/tests/unit/services/instance-matcher.test.js +256 -0
- package/dist/server/tests/unit/services/session-manager.test.js +26 -436
- package/dist/server/tests/unit/utils/config.test.js +88 -186
- package/dist/server/tests/unit/utils/json-utils.test.js +18 -18
- package/dist/server/tests/unit/utils/logger-formatter.test.d.ts +2 -0
- package/dist/server/tests/unit/utils/logger-formatter.test.d.ts.map +1 -0
- package/dist/server/tests/unit/utils/logger-formatter.test.js +66 -0
- package/dist/server/tests/unit/utils/parameter-validator.test.d.ts +2 -0
- package/dist/server/tests/unit/utils/parameter-validator.test.d.ts.map +1 -0
- package/dist/server/tests/unit/utils/parameter-validator.test.js +63 -0
- package/dist/server/tests/unit/utils/process-tree.test.d.ts +2 -0
- package/dist/server/tests/unit/utils/process-tree.test.d.ts.map +1 -0
- package/dist/server/tests/unit/utils/process-tree.test.js +129 -0
- package/dist/server/tests/unit/utils/request-context.test.js +5 -24
- package/dist/server/tests/unit/utils/sort-utils.test.d.ts +2 -0
- package/dist/server/tests/unit/utils/sort-utils.test.d.ts.map +1 -0
- package/dist/server/tests/unit/utils/sort-utils.test.js +220 -0
- package/dist/server/tests/unit/utils/transport-factory.test.d.ts +2 -0
- package/dist/server/tests/unit/utils/transport-factory.test.d.ts.map +1 -0
- package/dist/server/tests/unit/utils/transport-factory.test.js +55 -0
- package/package.json +1 -1
- package/dist/client/assets/ResourceDetailView-Bf-1ffbk.js +0 -1
- package/dist/client/assets/ResourcesView-CjMklkyv.css +0 -1
- package/dist/client/assets/ResourcesView-g5x4xCPh.js +0 -1
- package/dist/client/assets/ServerDashboard-Chpne8Q0.css +0 -1
- package/dist/client/assets/ServerDashboard-G8Wmp4hF.js +0 -2
- package/dist/client/assets/ServerListView-dV2XrPjo.js +0 -32
- package/dist/client/assets/ServerStatusTags.vue_vue_type_script_setup_true_lang-BHiTFM7-.js +0 -1
- package/dist/client/assets/SessionsView-Ckd38lj1.js +0 -1
- package/dist/client/assets/SettingsView-BJUdepEQ.js +0 -1
- package/dist/client/assets/ToolCallDialog-C_bTCpHC.js +0 -1
- package/dist/client/assets/ToolsView-0c2eputu.js +0 -1
- package/dist/client/assets/el-form-item-BVMLpmVC.css +0 -1
- package/dist/client/assets/el-form-item-ClFnj49k.js +0 -12
- package/dist/client/assets/el-input-CDnuSKVZ.js +0 -1
- package/dist/client/assets/el-input-CmuHb8HS.css +0 -1
- package/dist/client/assets/el-overlay-B2ZKM6Up.css +0 -1
- package/dist/client/assets/el-overlay-CzMkXyYy.js +0 -1
- package/dist/client/assets/el-select-DvjGddk_.js +0 -1
- package/dist/client/assets/el-tab-pane-C_DQMcwe.js +0 -1
- package/dist/client/assets/el-table-column-CASRIbZM.js +0 -1
- package/dist/client/assets/el-table-column-T_mV9jNw.css +0 -1
- package/dist/client/assets/el-tag-DjxZVOpb.css +0 -1
- package/dist/client/assets/el-tag-npbwux4f.js +0 -1
- package/dist/client/assets/index-CCnAxNF8.js +0 -2
- package/dist/client/assets/index-d1DZeSfz.js +0 -1
- package/dist/client/assets/vnode-CHomNjgN.js +0 -1
|
@@ -1,37 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { PassThrough } from 'stream';
|
|
1
|
+
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
|
|
3
2
|
import { logger } from '../logger.js';
|
|
4
|
-
|
|
5
|
-
class ReadBuffer {
|
|
6
|
-
_buffer;
|
|
7
|
-
append(chunk) {
|
|
8
|
-
this._buffer = this._buffer ? Buffer.concat([this._buffer, chunk]) : chunk;
|
|
9
|
-
}
|
|
10
|
-
readMessage() {
|
|
11
|
-
if (!this._buffer) {
|
|
12
|
-
return null;
|
|
13
|
-
}
|
|
14
|
-
const index = this._buffer.indexOf('\n');
|
|
15
|
-
if (index === -1) {
|
|
16
|
-
return null;
|
|
17
|
-
}
|
|
18
|
-
const line = this._buffer.toString('utf8', 0, index).replace(/\r$/, '');
|
|
19
|
-
this._buffer = this._buffer.subarray(index + 1);
|
|
20
|
-
try {
|
|
21
|
-
return JSON.parse(line);
|
|
22
|
-
}
|
|
23
|
-
catch {
|
|
24
|
-
return null;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
clear() {
|
|
28
|
-
this._buffer = undefined;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
3
|
+
import { PassThrough } from 'stream';
|
|
31
4
|
/**
|
|
32
5
|
* A transport implementation for communicating with MCP (Model Context Protocol) servers
|
|
33
|
-
* via standard input/output streams. This transport
|
|
34
|
-
*
|
|
6
|
+
* via standard input/output streams. This transport wraps the official SDK's StdioClientTransport
|
|
7
|
+
* and provides consistent logging and integration with the MCP Hub Lite system.
|
|
35
8
|
*
|
|
36
9
|
* The StdioTransport handles:
|
|
37
10
|
* - Cross-platform process spawning (including Windows batch file compatibility)
|
|
@@ -46,21 +19,11 @@ class ReadBuffer {
|
|
|
46
19
|
* @implements {Transport}
|
|
47
20
|
*/
|
|
48
21
|
export class StdioTransport {
|
|
49
|
-
|
|
50
|
-
_readBuffer = new ReadBuffer();
|
|
51
|
-
_stderrStream = null;
|
|
52
|
-
_serverParams;
|
|
22
|
+
_transport;
|
|
53
23
|
_serverName;
|
|
54
|
-
|
|
24
|
+
_compositeKey;
|
|
55
25
|
_logStorage;
|
|
56
|
-
|
|
57
|
-
* Gets the process ID of the spawned child process.
|
|
58
|
-
*
|
|
59
|
-
* @returns {number | undefined} The PID of the child process, or undefined if not started
|
|
60
|
-
*/
|
|
61
|
-
get pid() {
|
|
62
|
-
return this._process?.pid;
|
|
63
|
-
}
|
|
26
|
+
_stderrStream = null;
|
|
64
27
|
onclose;
|
|
65
28
|
onerror;
|
|
66
29
|
onmessage;
|
|
@@ -74,251 +37,107 @@ export class StdioTransport {
|
|
|
74
37
|
* @param {StdioTransportOptions} [options] - Additional options for the transport
|
|
75
38
|
*/
|
|
76
39
|
constructor(server, serverName, options) {
|
|
77
|
-
|
|
40
|
+
// Convert our server parameters to match SDK format
|
|
41
|
+
const sdkParams = {
|
|
42
|
+
command: server.command,
|
|
43
|
+
args: server.args,
|
|
44
|
+
env: server.env,
|
|
45
|
+
stderr: 'pipe', // Always use pipe for stderr to enable logging
|
|
46
|
+
cwd: server.cwd
|
|
47
|
+
};
|
|
48
|
+
this._transport = new StdioClientTransport(sdkParams);
|
|
78
49
|
this._serverName = serverName;
|
|
79
|
-
this.
|
|
50
|
+
this._compositeKey = options?.compositeKey;
|
|
80
51
|
this._logStorage = options?.logStorage;
|
|
81
|
-
|
|
82
|
-
this._stderrStream = new PassThrough();
|
|
83
|
-
}
|
|
52
|
+
this._stderrStream = new PassThrough();
|
|
84
53
|
}
|
|
85
54
|
/**
|
|
86
55
|
* Starts the transport by spawning the child process and establishing communication channels.
|
|
87
56
|
*
|
|
88
|
-
* This method
|
|
89
|
-
* -
|
|
90
|
-
* -
|
|
91
|
-
* -
|
|
92
|
-
* -
|
|
57
|
+
* This method delegates to the SDK's StdioClientTransport.start() method which handles:
|
|
58
|
+
* - Platform-specific process spawning (including Windows batch file compatibility)
|
|
59
|
+
* - Proper stdio configuration
|
|
60
|
+
* - Event listeners for process lifecycle events
|
|
61
|
+
* - Data flow for stdout and stderr handling
|
|
93
62
|
*
|
|
94
63
|
* @returns {Promise<void>} Resolves when the child process is successfully spawned
|
|
95
64
|
* @throws {Error} If the transport is already started
|
|
96
65
|
*/
|
|
97
66
|
async start() {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
env: { ...process.env, ...this._serverParams.env },
|
|
117
|
-
stdio: [
|
|
118
|
-
'pipe',
|
|
119
|
-
'pipe',
|
|
120
|
-
this._serverParams.stderr === 'pipe' ? 'pipe' : this._serverParams.stderr || 'inherit'
|
|
121
|
-
],
|
|
122
|
-
shell: false,
|
|
123
|
-
windowsHide: true, // Force hide window on Windows
|
|
124
|
-
cwd: this._serverParams.cwd
|
|
125
|
-
});
|
|
126
|
-
this._process.on('error', (error) => {
|
|
127
|
-
reject(error);
|
|
128
|
-
this.onerror?.(error);
|
|
129
|
-
});
|
|
130
|
-
this._process.on('spawn', () => {
|
|
131
|
-
resolve();
|
|
132
|
-
});
|
|
133
|
-
this._process.on('close', () => {
|
|
134
|
-
this._process = undefined;
|
|
135
|
-
this.onclose?.();
|
|
136
|
-
});
|
|
137
|
-
this._process.stdin?.on('error', (error) => {
|
|
138
|
-
this.onerror?.(error);
|
|
139
|
-
});
|
|
140
|
-
this._process.stdout?.on('data', (chunk) => {
|
|
141
|
-
const dataStr = chunk.toString('utf8');
|
|
142
|
-
// Forward raw stdout data
|
|
143
|
-
this.onstdout?.(dataStr);
|
|
144
|
-
// Don't log raw JSON-RPC communication to avoid log noise
|
|
145
|
-
// Only need to view raw communication during development debugging
|
|
146
|
-
// Parse JSON-RPC messages
|
|
147
|
-
this._readBuffer.append(chunk);
|
|
148
|
-
this.processReadBuffer();
|
|
149
|
-
});
|
|
150
|
-
this._process.stdout?.on('error', (error) => {
|
|
151
|
-
this.onerror?.(error);
|
|
152
|
-
});
|
|
153
|
-
/**
|
|
154
|
-
* Handles stderr data with common processing logic.
|
|
155
|
-
*
|
|
156
|
-
* @param chunk - The stderr data chunk
|
|
157
|
-
* @param writeToStream - Whether to write data to the PassThrough stream
|
|
158
|
-
*/
|
|
159
|
-
const handleStderrData = (chunk, writeToStream = false) => {
|
|
160
|
-
const dataStr = chunk.toString('utf8');
|
|
67
|
+
// Set up event handlers before starting
|
|
68
|
+
this._transport.onmessage = (message) => {
|
|
69
|
+
this.onmessage?.(message);
|
|
70
|
+
};
|
|
71
|
+
this._transport.onerror = (error) => {
|
|
72
|
+
this.onerror?.(error);
|
|
73
|
+
};
|
|
74
|
+
this._transport.onclose = () => {
|
|
75
|
+
this.onclose?.();
|
|
76
|
+
};
|
|
77
|
+
// Start the underlying transport
|
|
78
|
+
await this._transport.start();
|
|
79
|
+
// Handle stderr data by listening to the transport's stderr stream
|
|
80
|
+
if (this._transport.stderr) {
|
|
81
|
+
this._transport.stderr.on('data', (chunk) => {
|
|
82
|
+
const dataStr = chunk.toString('utf8').trim();
|
|
83
|
+
if (!dataStr)
|
|
84
|
+
return;
|
|
161
85
|
// Forward raw stderr data
|
|
162
86
|
this.onstderr?.(dataStr);
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
// Error level keywords
|
|
169
|
-
if (lowerData.includes('error') ||
|
|
170
|
-
lowerData.includes('err') ||
|
|
171
|
-
lowerData.includes('exception') ||
|
|
172
|
-
lowerData.includes('fatal') ||
|
|
173
|
-
lowerData.includes('critical')) {
|
|
174
|
-
logLevel = 'error';
|
|
175
|
-
}
|
|
176
|
-
// Warn level keywords
|
|
177
|
-
else if (lowerData.includes('warn') ||
|
|
178
|
-
lowerData.includes('wrn') ||
|
|
179
|
-
lowerData.includes('warning') ||
|
|
180
|
-
lowerData.includes('deprecation') ||
|
|
181
|
-
lowerData.includes('deprecated')) {
|
|
182
|
-
logLevel = 'warn';
|
|
87
|
+
// Log stderr output (per MCP spec, stderr is not necessarily errors)
|
|
88
|
+
const serverIdentifier = this._compositeKey || this._serverName || 'Unknown Server';
|
|
89
|
+
logger.serverLog('info', serverIdentifier, dataStr, { pid: this.pid });
|
|
90
|
+
if (this._logStorage && this._compositeKey) {
|
|
91
|
+
this._logStorage.append(this._compositeKey, 'info', dataStr);
|
|
183
92
|
}
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
93
|
+
// Also write to our PassThrough stream for compatibility
|
|
94
|
+
// Guard against write after end during close() race condition
|
|
95
|
+
if (this._stderrStream && !this._stderrStream.writableEnded) {
|
|
96
|
+
this._stderrStream.write(chunk);
|
|
188
97
|
}
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
pid: this._process?.pid
|
|
192
|
-
});
|
|
193
|
-
}
|
|
194
|
-
// Store in logStorage for frontend display if available
|
|
195
|
-
if (this._logStorage && this._serverId) {
|
|
196
|
-
this._logStorage.append(this._serverId, logLevel, `[${this._serverName || 'Unknown Server'}] [STDERR] ${trimmedData}`);
|
|
197
|
-
}
|
|
198
|
-
// Optionally write to PassThrough stream if configured
|
|
199
|
-
if (writeToStream) {
|
|
200
|
-
this._stderrStream?.write(chunk);
|
|
201
|
-
}
|
|
202
|
-
};
|
|
203
|
-
if (this._stderrStream && this._process.stderr) {
|
|
204
|
-
this._process.stderr.on('data', (chunk) => {
|
|
205
|
-
handleStderrData(chunk, true); // Write to PassThrough stream for piped stderr
|
|
206
|
-
});
|
|
207
|
-
}
|
|
208
|
-
else if (this._process.stderr) {
|
|
209
|
-
// If stderr is not in pipe mode, listen directly
|
|
210
|
-
this._process.stderr.on('data', (chunk) => {
|
|
211
|
-
handleStderrData(chunk, false); // No PassThrough stream for non-piped stderr
|
|
212
|
-
});
|
|
213
|
-
}
|
|
214
|
-
});
|
|
98
|
+
});
|
|
99
|
+
}
|
|
215
100
|
}
|
|
216
101
|
/**
|
|
217
102
|
* Gets the stderr stream for the child process.
|
|
218
103
|
*
|
|
219
|
-
* Returns
|
|
220
|
-
* the actual stderr stream from the child process, or null if no stderr is available.
|
|
104
|
+
* Returns our PassThrough stream that captures stderr data.
|
|
221
105
|
*
|
|
222
|
-
* @returns {PassThrough |
|
|
106
|
+
* @returns {PassThrough | null} The stderr stream or null
|
|
223
107
|
*/
|
|
224
108
|
get stderr() {
|
|
225
|
-
return this._stderrStream
|
|
109
|
+
return this._stderrStream;
|
|
226
110
|
}
|
|
227
111
|
/**
|
|
228
|
-
*
|
|
229
|
-
*
|
|
230
|
-
* This method continuously reads complete JSON-RPC messages from the buffer
|
|
231
|
-
* and dispatches them to the onmessage callback. It handles partial messages
|
|
232
|
-
* by leaving incomplete data in the buffer for future processing.
|
|
233
|
-
*
|
|
234
|
-
* The method uses a while loop to process all available complete messages
|
|
235
|
-
* in a single call, ensuring efficient message handling without blocking.
|
|
112
|
+
* Gets the process ID of the spawned child process.
|
|
236
113
|
*
|
|
237
|
-
* @
|
|
114
|
+
* @returns {number | undefined} The PID of the child process, or undefined if not started
|
|
238
115
|
*/
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
try {
|
|
242
|
-
const message = this._readBuffer.readMessage();
|
|
243
|
-
if (message === null) {
|
|
244
|
-
break;
|
|
245
|
-
}
|
|
246
|
-
this.onmessage?.(message);
|
|
247
|
-
}
|
|
248
|
-
catch (error) {
|
|
249
|
-
this.onerror?.(error);
|
|
250
|
-
}
|
|
251
|
-
}
|
|
116
|
+
get pid() {
|
|
117
|
+
return this._transport.pid ?? undefined;
|
|
252
118
|
}
|
|
253
119
|
/**
|
|
254
120
|
* Closes the transport by gracefully terminating the child process.
|
|
255
121
|
*
|
|
256
|
-
* This method
|
|
257
|
-
*
|
|
258
|
-
*
|
|
259
|
-
* 3. Forces termination with SIGKILL if the process doesn't exit
|
|
260
|
-
* 4. Cleans up internal state and resolves the promise
|
|
261
|
-
*
|
|
262
|
-
* The method ensures proper cleanup of the read buffer and handles
|
|
263
|
-
* any errors that occur during the shutdown process.
|
|
122
|
+
* This method delegates to the SDK's StdioClientTransport.close() method which handles:
|
|
123
|
+
* - Graceful shutdown sequence with SIGTERM/SIGKILL
|
|
124
|
+
* - Proper cleanup of internal state
|
|
264
125
|
*
|
|
265
126
|
* @returns {Promise<void>} Resolves when the transport is fully closed
|
|
266
127
|
*/
|
|
267
128
|
async close() {
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
// Listen for child process exit events
|
|
271
|
-
const cleanup = () => {
|
|
272
|
-
this._process = undefined;
|
|
273
|
-
this._readBuffer.clear();
|
|
274
|
-
resolve();
|
|
275
|
-
};
|
|
276
|
-
if (this._process) {
|
|
277
|
-
this._process.once('close', cleanup);
|
|
278
|
-
this._process.once('exit', cleanup);
|
|
279
|
-
// Send SIGTERM signal to give child process a chance to shut down gracefully
|
|
280
|
-
try {
|
|
281
|
-
this._process.kill('SIGTERM');
|
|
282
|
-
// Set timeout protection to force kill if child process doesn't exit within 5 seconds
|
|
283
|
-
const timeout = setTimeout(() => {
|
|
284
|
-
if (this._process) {
|
|
285
|
-
logger.warn('Child process did not exit gracefully, force killing...');
|
|
286
|
-
this._process.kill('SIGKILL');
|
|
287
|
-
}
|
|
288
|
-
}, 5000);
|
|
289
|
-
// Ensure timeout timer is cleared after process exits
|
|
290
|
-
this._process.once('close', () => clearTimeout(timeout));
|
|
291
|
-
this._process.once('exit', () => clearTimeout(timeout));
|
|
292
|
-
}
|
|
293
|
-
catch (error) {
|
|
294
|
-
logger.error('Error closing stdio transport:', error);
|
|
295
|
-
cleanup();
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
else {
|
|
299
|
-
// Process is already undefined, just resolve
|
|
300
|
-
resolve();
|
|
301
|
-
}
|
|
302
|
-
});
|
|
303
|
-
}
|
|
304
|
-
this._readBuffer.clear();
|
|
129
|
+
await this._transport.close();
|
|
130
|
+
this._stderrStream?.end();
|
|
305
131
|
}
|
|
306
132
|
/**
|
|
307
133
|
* Sends a JSON-RPC message to the child process via stdin.
|
|
308
134
|
*
|
|
309
|
-
* This method
|
|
310
|
-
* and writes it to the child process's stdin stream. It validates that
|
|
311
|
-
* the transport is connected before attempting to send the message.
|
|
135
|
+
* This method delegates to the SDK's StdioClientTransport.send() method.
|
|
312
136
|
*
|
|
313
137
|
* @param {JSONRPCMessage} message - The JSON-RPC message to send
|
|
314
138
|
* @returns {Promise<void>} Resolves when the message is written to stdin
|
|
315
|
-
* @throws {Error} If the transport is not connected (no active child process)
|
|
316
139
|
*/
|
|
317
140
|
async send(message) {
|
|
318
|
-
|
|
319
|
-
throw new Error('Not connected');
|
|
320
|
-
}
|
|
321
|
-
const json = JSON.stringify(message) + '\n';
|
|
322
|
-
this._process.stdin.write(json);
|
|
141
|
+
await this._transport.send(message);
|
|
323
142
|
}
|
|
324
143
|
}
|
|
@@ -29,6 +29,7 @@ export declare class StreamableHttpTransport implements Transport {
|
|
|
29
29
|
private url;
|
|
30
30
|
private headers;
|
|
31
31
|
private timeout;
|
|
32
|
+
private proxy?;
|
|
32
33
|
/**
|
|
33
34
|
* Internal reference to the underlying MCP SDK transport instance
|
|
34
35
|
* @private
|
|
@@ -40,6 +41,16 @@ export declare class StreamableHttpTransport implements Transport {
|
|
|
40
41
|
* @private
|
|
41
42
|
*/
|
|
42
43
|
private isClosing;
|
|
44
|
+
/**
|
|
45
|
+
* Server name for logging context
|
|
46
|
+
* @private
|
|
47
|
+
*/
|
|
48
|
+
private _serverName?;
|
|
49
|
+
/**
|
|
50
|
+
* Composite key (serverName-serverIndex) for logging context
|
|
51
|
+
* @private
|
|
52
|
+
*/
|
|
53
|
+
private _compositeKey?;
|
|
43
54
|
/**
|
|
44
55
|
* Event handler called when a JSON-RPC message is received from the server
|
|
45
56
|
* @public
|
|
@@ -63,8 +74,20 @@ export declare class StreamableHttpTransport implements Transport {
|
|
|
63
74
|
* Commonly used for authentication tokens, API keys, or custom headers
|
|
64
75
|
* @param timeout - Request timeout in milliseconds (default: 30000 = 30 seconds)
|
|
65
76
|
* Controls how long to wait for HTTP responses before timing out
|
|
77
|
+
* @param proxy - Optional proxy configuration
|
|
78
|
+
* @param serverName - Optional server name for logging
|
|
79
|
+
* @param compositeKey - Optional composite key (serverName-serverIndex) for logging
|
|
80
|
+
*/
|
|
81
|
+
constructor(url: string, headers?: Record<string, string>, timeout?: number, proxy?: {
|
|
82
|
+
url: string;
|
|
83
|
+
} | undefined, serverName?: string, compositeKey?: string);
|
|
84
|
+
/**
|
|
85
|
+
* Helper method to format log messages with server context.
|
|
86
|
+
*
|
|
87
|
+
* @param message - The base message
|
|
88
|
+
* @returns Formatted message with server context if available
|
|
66
89
|
*/
|
|
67
|
-
|
|
90
|
+
private formatLogMessage;
|
|
68
91
|
/**
|
|
69
92
|
* Initializes and starts the Streamable HTTP transport connection
|
|
70
93
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streamable-http-transport.d.ts","sourceRoot":"","sources":["../../../../../src/utils/transports/streamable-http-transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;
|
|
1
|
+
{"version":3,"file":"streamable-http-transport.d.ts","sourceRoot":"","sources":["../../../../../src/utils/transports/streamable-http-transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAM1E;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,uBAAwB,YAAW,SAAS;IAyDrD,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,KAAK,CAAC;IA3DhB;;;OAGG;IACH,OAAO,CAAC,SAAS,CAA8C;IAE/D;;;;OAIG;IACH,OAAO,CAAC,SAAS,CAAS;IAE1B;;;OAGG;IACH,OAAO,CAAC,WAAW,CAAC,CAAS;IAE7B;;;OAGG;IACH,OAAO,CAAC,aAAa,CAAC,CAAS;IAE/B;;;OAGG;IACI,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;IAErD;;;OAGG;IACI,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAExC;;;OAGG;IACI,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAE5B;;;;;;;;;;;OAWG;gBAEO,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,EACpC,OAAO,GAAE,MAAc,EACvB,KAAK,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,YAAA,EAC/B,UAAU,CAAC,EAAE,MAAM,EACnB,YAAY,CAAC,EAAE,MAAM;IAMvB;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IAUxB;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA6G5B;;;;;;;;;;;;;;;;;;;OAmBG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACG,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CA6BnD"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { logger, LOG_MODULES } from '../logger.js';
|
|
2
2
|
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
3
3
|
import { URL } from 'url';
|
|
4
|
+
import { ProxyAgent, fetch as undiciFetch } from 'undici';
|
|
4
5
|
/**
|
|
5
6
|
* Streamable HTTP Transport implementation for MCP (Model Context Protocol)
|
|
6
7
|
*
|
|
@@ -30,6 +31,7 @@ export class StreamableHttpTransport {
|
|
|
30
31
|
url;
|
|
31
32
|
headers;
|
|
32
33
|
timeout;
|
|
34
|
+
proxy;
|
|
33
35
|
/**
|
|
34
36
|
* Internal reference to the underlying MCP SDK transport instance
|
|
35
37
|
* @private
|
|
@@ -41,6 +43,16 @@ export class StreamableHttpTransport {
|
|
|
41
43
|
* @private
|
|
42
44
|
*/
|
|
43
45
|
isClosing = false;
|
|
46
|
+
/**
|
|
47
|
+
* Server name for logging context
|
|
48
|
+
* @private
|
|
49
|
+
*/
|
|
50
|
+
_serverName;
|
|
51
|
+
/**
|
|
52
|
+
* Composite key (serverName-serverIndex) for logging context
|
|
53
|
+
* @private
|
|
54
|
+
*/
|
|
55
|
+
_compositeKey;
|
|
44
56
|
/**
|
|
45
57
|
* Event handler called when a JSON-RPC message is received from the server
|
|
46
58
|
* @public
|
|
@@ -64,11 +76,34 @@ export class StreamableHttpTransport {
|
|
|
64
76
|
* Commonly used for authentication tokens, API keys, or custom headers
|
|
65
77
|
* @param timeout - Request timeout in milliseconds (default: 30000 = 30 seconds)
|
|
66
78
|
* Controls how long to wait for HTTP responses before timing out
|
|
79
|
+
* @param proxy - Optional proxy configuration
|
|
80
|
+
* @param serverName - Optional server name for logging
|
|
81
|
+
* @param compositeKey - Optional composite key (serverName-serverIndex) for logging
|
|
67
82
|
*/
|
|
68
|
-
constructor(url, headers = {}, timeout = 30000) {
|
|
83
|
+
constructor(url, headers = {}, timeout = 30000, proxy, serverName, compositeKey) {
|
|
69
84
|
this.url = url;
|
|
70
85
|
this.headers = headers;
|
|
71
86
|
this.timeout = timeout;
|
|
87
|
+
this.proxy = proxy;
|
|
88
|
+
this._serverName = serverName;
|
|
89
|
+
this._compositeKey = compositeKey;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Helper method to format log messages with server context.
|
|
93
|
+
*
|
|
94
|
+
* @param message - The base message
|
|
95
|
+
* @returns Formatted message with server context if available
|
|
96
|
+
*/
|
|
97
|
+
formatLogMessage(message) {
|
|
98
|
+
if (this._compositeKey) {
|
|
99
|
+
return `${message} (compositeKey=${this._compositeKey}, url=${this.url})`;
|
|
100
|
+
}
|
|
101
|
+
else if (this._serverName) {
|
|
102
|
+
return `${message} (server=${this._serverName}, url=${this.url})`;
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
return `${message} (url=${this.url})`;
|
|
106
|
+
}
|
|
72
107
|
}
|
|
73
108
|
/**
|
|
74
109
|
* Initializes and starts the Streamable HTTP transport connection
|
|
@@ -101,6 +136,8 @@ export class StreamableHttpTransport {
|
|
|
101
136
|
throw new Error('Streamable HTTP Transport already started!');
|
|
102
137
|
}
|
|
103
138
|
this.isClosing = false;
|
|
139
|
+
const proxyInfo = this.proxy?.url ? `, proxy=${this.proxy.url}` : '';
|
|
140
|
+
logger.info(this.formatLogMessage(`Attempting to connect to Streamable HTTP server: timeout=${this.timeout}ms, headers=${JSON.stringify(Object.keys(this.headers))}${proxyInfo}`), LOG_MODULES.HTTP_TRANSPORT);
|
|
104
141
|
try {
|
|
105
142
|
const url = new URL(this.url);
|
|
106
143
|
const requestInit = {
|
|
@@ -110,19 +147,37 @@ export class StreamableHttpTransport {
|
|
|
110
147
|
},
|
|
111
148
|
signal: AbortSignal.timeout(this.timeout)
|
|
112
149
|
};
|
|
113
|
-
|
|
150
|
+
// Create transport options
|
|
151
|
+
const transportOptions = {
|
|
114
152
|
requestInit
|
|
115
|
-
}
|
|
153
|
+
};
|
|
154
|
+
// Add proxy support if configured
|
|
155
|
+
if (this.proxy?.url) {
|
|
156
|
+
const agent = new ProxyAgent(this.proxy.url);
|
|
157
|
+
// Create custom fetch function with proxy
|
|
158
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
159
|
+
const customFetch = (input, init) => {
|
|
160
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
161
|
+
const fetchOptions = {
|
|
162
|
+
...init,
|
|
163
|
+
dispatcher: agent
|
|
164
|
+
};
|
|
165
|
+
return undiciFetch(input, fetchOptions);
|
|
166
|
+
};
|
|
167
|
+
transportOptions.fetch = customFetch;
|
|
168
|
+
logger.info(this.formatLogMessage(`Streamable HTTP transport configured with proxy: ${this.proxy.url}`), LOG_MODULES.HTTP_TRANSPORT);
|
|
169
|
+
}
|
|
170
|
+
this.transport = new StreamableHTTPClientTransport(url, transportOptions);
|
|
116
171
|
// Set up event handlers
|
|
117
172
|
this.transport.onmessage = (message) => {
|
|
118
173
|
this.onmessage?.(message);
|
|
119
174
|
};
|
|
120
175
|
this.transport.onerror = (error) => {
|
|
121
|
-
logger.error(
|
|
176
|
+
logger.error(this.formatLogMessage(`Streamable HTTP transport error occurred: errorType=${error.name || 'unknown'}, message=${error.message || 'no message'}`), error, LOG_MODULES.HTTP_TRANSPORT);
|
|
122
177
|
this.onerror?.(error);
|
|
123
178
|
};
|
|
124
179
|
this.transport.onclose = () => {
|
|
125
|
-
logger.info('Streamable HTTP transport closed', LOG_MODULES.HTTP_TRANSPORT);
|
|
180
|
+
logger.info(this.formatLogMessage('Streamable HTTP transport closed'), LOG_MODULES.HTTP_TRANSPORT);
|
|
126
181
|
if (!this.isClosing) {
|
|
127
182
|
// Unexpected close, trigger error
|
|
128
183
|
const error = new Error('Streamable HTTP transport closed unexpectedly');
|
|
@@ -130,11 +185,13 @@ export class StreamableHttpTransport {
|
|
|
130
185
|
}
|
|
131
186
|
this.onclose?.();
|
|
132
187
|
};
|
|
188
|
+
logger.debug(this.formatLogMessage('Starting underlying transport connection...'), LOG_MODULES.HTTP_TRANSPORT);
|
|
133
189
|
await this.transport.start();
|
|
134
|
-
logger.info(
|
|
190
|
+
logger.info(this.formatLogMessage('Streamable HTTP transport successfully initialized'), LOG_MODULES.HTTP_TRANSPORT);
|
|
135
191
|
}
|
|
136
192
|
catch (error) {
|
|
137
|
-
logger.error(
|
|
193
|
+
logger.error(this.formatLogMessage(`Failed to create Streamable HTTP transport: error=${error instanceof Error ? error.message : String(error)}`), LOG_MODULES.HTTP_TRANSPORT);
|
|
194
|
+
logger.error('Complete error details:', error, LOG_MODULES.HTTP_TRANSPORT);
|
|
138
195
|
throw error;
|
|
139
196
|
}
|
|
140
197
|
}
|
|
@@ -201,11 +258,14 @@ export class StreamableHttpTransport {
|
|
|
201
258
|
if (!this.transport) {
|
|
202
259
|
throw new Error('Streamable HTTP transport not started');
|
|
203
260
|
}
|
|
261
|
+
const method = 'method' in message ? message.method : 'notification';
|
|
262
|
+
const proxyInfo = this.proxy?.url ? `, proxy=${this.proxy.url}` : '';
|
|
263
|
+
logger.debug(this.formatLogMessage(`Sending message via Streamable HTTP: method=${method}${proxyInfo}`), LOG_MODULES.HTTP_TRANSPORT);
|
|
204
264
|
try {
|
|
205
265
|
await this.transport.send(message);
|
|
206
266
|
}
|
|
207
267
|
catch (error) {
|
|
208
|
-
logger.error(
|
|
268
|
+
logger.error(this.formatLogMessage(`Failed to send message via Streamable HTTP: method=${method}${proxyInfo}, error=${error instanceof Error ? error.message : String(error)}`), error, LOG_MODULES.HTTP_TRANSPORT);
|
|
209
269
|
throw error;
|
|
210
270
|
}
|
|
211
271
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { ServerRuntimeConfig } from '../../../shared/models/server.model.js';
|
|
2
2
|
/**
|
|
3
3
|
* Transport Factory - creates appropriate transport client based on server configuration
|
|
4
4
|
*/
|
|
@@ -6,18 +6,23 @@ export declare class TransportFactory {
|
|
|
6
6
|
/**
|
|
7
7
|
* Create transport client
|
|
8
8
|
* @param server Server configuration, including base configuration and instance configuration
|
|
9
|
-
* @param
|
|
9
|
+
* @param compositeKey Optional composite key (serverName-serverIndex) for log storage integration
|
|
10
10
|
* @returns Transport client instance
|
|
11
11
|
* @throws Error if server type is not supported or configuration is invalid
|
|
12
12
|
*/
|
|
13
|
-
static createTransport(server:
|
|
13
|
+
static createTransport(server: ServerRuntimeConfig & {
|
|
14
14
|
name: string;
|
|
15
|
-
},
|
|
15
|
+
}, compositeKey?: string): import('@modelcontextprotocol/sdk/shared/transport.js').Transport;
|
|
16
16
|
/**
|
|
17
17
|
* Build system environment variables
|
|
18
18
|
* Add necessary system environment variables for stdio transport
|
|
19
19
|
*/
|
|
20
20
|
private static buildSystemEnv;
|
|
21
|
+
/**
|
|
22
|
+
* Check if a command is related to Python execution
|
|
23
|
+
* Detects python, python3, py, uv, uvx, and similar commands
|
|
24
|
+
*/
|
|
25
|
+
private static isPythonCommand;
|
|
21
26
|
/**
|
|
22
27
|
* Validate and convert server configuration to transport configuration
|
|
23
28
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport-factory.d.ts","sourceRoot":"","sources":["../../../../../src/utils/transports/transport-factory.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,
|
|
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;AAG1E;;GAEG;AACH,qBAAa,gBAAgB;IAC3B;;;;;;OAMG;IACH,MAAM,CAAC,eAAe,CACpB,MAAM,EAAE,mBAAmB,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,EAC9C,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,+CAA+C,EAAE,SAAS;IA6DpE;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IAW7B;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,eAAe;IAW9B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,wBAAwB;CA8CxC"}
|