@loop_ouroboros/mcp-hub-lite 1.0.2 → 1.1.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 +32 -0
- package/dist/client/assets/{HomeView-7rMg9C6t.js → HomeView-BBwvy1oj.js} +1 -1
- package/dist/client/assets/ResourceDetailView-CZ2aB73w.js +1 -0
- package/dist/client/assets/ResourceDetailView-DUJZbegl.css +1 -0
- package/dist/client/assets/ResourcesView-CN1NlhWs.js +1 -0
- package/dist/client/assets/ResourcesView-Cc8RHtia.css +1 -0
- package/dist/client/assets/ServerDashboard-BfLeFDGw.css +1 -0
- package/dist/client/assets/ServerDashboard-k652Vw4Z.js +1 -0
- package/dist/client/assets/ServerDetail-BLQ-a4cO.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-BHrsFD5i.js +36 -0
- package/dist/client/assets/ServerStatusTags.vue_vue_type_script_setup_true_lang-BHhwEuGe.js +1 -0
- package/dist/client/assets/SettingsView-CUOFNXrz.js +1 -0
- package/dist/client/assets/SettingsView-GkBOKL0V.css +1 -0
- package/dist/client/assets/ToolCallDialog-BfPjLxfV.js +1 -0
- package/dist/client/assets/ToolsView-BxgXvPC3.css +1 -0
- package/dist/client/assets/ToolsView-CyuhYAE2.js +1 -0
- package/dist/client/assets/{_baseClone-5q1b0P3O.js → _baseClone-DO5qfalW.js} +1 -1
- package/dist/client/assets/el-form-item-B4LbJ6OO.css +1 -0
- package/dist/client/assets/el-form-item-CcGsD2K_.js +12 -0
- package/dist/client/assets/el-input-BH4BZKnG.css +1 -0
- package/dist/client/assets/el-input-tYgeiaCT.js +1 -0
- package/dist/client/assets/{el-loading-H85n3BUC.js → el-loading-Dwl9E_Vr.js} +1 -1
- package/dist/client/assets/{el-select-C0U_l4IZ.css → el-overlay-CBvdpA69.css} +1 -1
- package/dist/client/assets/el-overlay-kqX_BABo.js +1 -0
- package/dist/client/assets/{ResourceDetailView-BdOaL_-o.css → el-radio-group-B0bauIRR.css} +1 -1
- package/dist/client/assets/el-radio-group-D8aWBVOT.js +1 -0
- package/dist/client/assets/el-skeleton-item-BLY1jEuR.css +1 -0
- package/dist/client/assets/el-skeleton-item-BRwIFspE.js +1 -0
- package/dist/client/assets/el-switch-BBrS-_6y.css +1 -0
- package/dist/client/assets/el-switch-BF8c-xeU.js +1 -0
- package/dist/client/assets/el-tab-pane-C4Ep94cd.js +1 -0
- package/dist/client/assets/el-table-column-BdvRS9Y2.css +1 -0
- package/dist/client/assets/el-table-column-Cog6uCh-.js +1 -0
- package/dist/client/assets/index-ByNBhPAR.js +1 -0
- package/dist/client/assets/index-CTB6oe-9.js +2 -0
- package/dist/client/assets/{index-BsDWtoIl.css → index-DpH6ZSbs.css} +1 -1
- package/dist/client/assets/omit-CUnDT6sS.js +1 -0
- package/dist/client/assets/{raf-DY5mgbuB.js → raf-CmzeRPMd.js} +1 -1
- package/dist/client/assets/{vue-vendor-6ny5zj9i.js → vue-vendor-CbgVSHIh.js} +3 -3
- 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/debug-response-wrapper.js +2 -2
- 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 +32 -49
- 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/server.d.ts +57 -0
- package/dist/server/src/cli/commands/server.d.ts.map +1 -0
- package/dist/server/src/cli/commands/server.js +169 -0
- 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 +53 -23
- package/dist/server/src/services/gateway/global-transport.d.ts +19 -0
- package/dist/server/src/services/gateway/global-transport.d.ts.map +1 -0
- package/dist/server/src/services/gateway/global-transport.js +66 -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 +20 -80
- 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/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/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/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/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/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 +3 -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/ToolsView-E3Ps9c7i.css +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/omit-DPsOVNIJ.js +0 -1
- package/dist/client/assets/vnode-CHomNjgN.js +0 -1
|
@@ -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"}
|
|
@@ -9,11 +9,11 @@ export class TransportFactory {
|
|
|
9
9
|
/**
|
|
10
10
|
* Create transport client
|
|
11
11
|
* @param server Server configuration, including base configuration and instance configuration
|
|
12
|
-
* @param
|
|
12
|
+
* @param compositeKey Optional composite key (serverName-serverIndex) for log storage integration
|
|
13
13
|
* @returns Transport client instance
|
|
14
14
|
* @throws Error if server type is not supported or configuration is invalid
|
|
15
15
|
*/
|
|
16
|
-
static createTransport(server,
|
|
16
|
+
static createTransport(server, compositeKey) {
|
|
17
17
|
const transportConfig = this.validateAndConvertConfig(server);
|
|
18
18
|
// Use type assertion to ensure TypeScript can correctly infer types
|
|
19
19
|
const config = transportConfig;
|
|
@@ -29,20 +29,20 @@ export class TransportFactory {
|
|
|
29
29
|
cwd: process.cwd(),
|
|
30
30
|
stderr: 'pipe'
|
|
31
31
|
}, server.name, {
|
|
32
|
-
|
|
33
|
-
logStorage:
|
|
32
|
+
compositeKey,
|
|
33
|
+
logStorage: compositeKey ? logStorage : undefined
|
|
34
34
|
});
|
|
35
35
|
case 'sse':
|
|
36
36
|
if (!config.url) {
|
|
37
37
|
throw new Error('SSE transport requires a URL');
|
|
38
38
|
}
|
|
39
|
-
return new SseTransport(config.url, config.headers, config.reconnectInterval, config.maxReconnectAttempts);
|
|
39
|
+
return new SseTransport(config.url, config.headers, config.reconnectInterval, config.maxReconnectAttempts, config.proxy, server.name, compositeKey);
|
|
40
40
|
case 'streamable-http':
|
|
41
41
|
case 'http': // Compatibility with http type, treat as streamable-http
|
|
42
42
|
if (!config.url) {
|
|
43
43
|
throw new Error('Streamable HTTP transport requires a URL');
|
|
44
44
|
}
|
|
45
|
-
return new StreamableHttpTransport(config.url, config.headers, config.timeout);
|
|
45
|
+
return new StreamableHttpTransport(config.url, config.headers, config.timeout, config.proxy, server.name, compositeKey);
|
|
46
46
|
default:
|
|
47
47
|
throw new Error(`Unsupported transport type: ${config.type || 'undefined'}`);
|
|
48
48
|
}
|
|
@@ -51,8 +51,26 @@ export class TransportFactory {
|
|
|
51
51
|
* Build system environment variables
|
|
52
52
|
* Add necessary system environment variables for stdio transport
|
|
53
53
|
*/
|
|
54
|
-
static buildSystemEnv() {
|
|
55
|
-
|
|
54
|
+
static buildSystemEnv(command) {
|
|
55
|
+
const env = {};
|
|
56
|
+
// For Python-related commands, set PYTHONUTF8=1 to ensure proper UTF-8 handling
|
|
57
|
+
if (command && this.isPythonCommand(command)) {
|
|
58
|
+
env.PYTHONUTF8 = '1';
|
|
59
|
+
}
|
|
60
|
+
return env;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Check if a command is related to Python execution
|
|
64
|
+
* Detects python, python3, py, uv, uvx, and similar commands
|
|
65
|
+
*/
|
|
66
|
+
static isPythonCommand(command) {
|
|
67
|
+
const trimmedCommand = command.trim();
|
|
68
|
+
if (!trimmedCommand)
|
|
69
|
+
return false;
|
|
70
|
+
// Extract the basename (last part after / or \)
|
|
71
|
+
const parts = trimmedCommand.split(/[\\/]/);
|
|
72
|
+
const basename = parts[parts.length - 1].toLowerCase();
|
|
73
|
+
return basename.includes('python') || basename.startsWith('uv') || basename.startsWith('py');
|
|
56
74
|
}
|
|
57
75
|
/**
|
|
58
76
|
* Validate and convert server configuration to transport configuration
|
|
@@ -65,7 +83,7 @@ export class TransportFactory {
|
|
|
65
83
|
command: server.command || '',
|
|
66
84
|
args: server.args,
|
|
67
85
|
env: {
|
|
68
|
-
...this.buildSystemEnv(), // System environment variables
|
|
86
|
+
...this.buildSystemEnv(server.command), // System environment variables
|
|
69
87
|
...(server.env || {}) // User-defined environment variables (can override system defaults)
|
|
70
88
|
},
|
|
71
89
|
cwd: process.cwd(),
|
|
@@ -78,7 +96,8 @@ export class TransportFactory {
|
|
|
78
96
|
url: server.url || '',
|
|
79
97
|
headers: server.headers || server.env, // Prefer headers, fallback to env for backward compatibility
|
|
80
98
|
reconnectInterval: 3000,
|
|
81
|
-
maxReconnectAttempts: 5
|
|
99
|
+
maxReconnectAttempts: 5,
|
|
100
|
+
proxy: server.proxy
|
|
82
101
|
};
|
|
83
102
|
}
|
|
84
103
|
else if (type === 'streamable-http' || type === 'http') {
|
|
@@ -86,7 +105,8 @@ export class TransportFactory {
|
|
|
86
105
|
type: 'streamable-http', // Unified conversion to streamable-http
|
|
87
106
|
url: server.url || '',
|
|
88
107
|
headers: server.headers || server.env, // Prefer headers, fallback to env for backward compatibility
|
|
89
|
-
timeout: server.timeout || 30000
|
|
108
|
+
timeout: server.timeout || 30000,
|
|
109
|
+
proxy: server.proxy
|
|
90
110
|
};
|
|
91
111
|
}
|
|
92
112
|
else {
|
|
@@ -18,6 +18,9 @@ export interface SseTransportConfig {
|
|
|
18
18
|
headers?: Record<string, string>;
|
|
19
19
|
reconnectInterval?: number;
|
|
20
20
|
maxReconnectAttempts?: number;
|
|
21
|
+
proxy?: {
|
|
22
|
+
url: string;
|
|
23
|
+
};
|
|
21
24
|
}
|
|
22
25
|
/**
|
|
23
26
|
* Streamable HTTP transport configuration
|
|
@@ -27,6 +30,9 @@ export interface StreamableHttpTransportConfig {
|
|
|
27
30
|
url: string;
|
|
28
31
|
headers?: Record<string, string>;
|
|
29
32
|
timeout?: number;
|
|
33
|
+
proxy?: {
|
|
34
|
+
url: string;
|
|
35
|
+
};
|
|
30
36
|
}
|
|
31
37
|
/**
|
|
32
38
|
* Generic server configuration
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.interface.d.ts","sourceRoot":"","sources":["../../../../../src/utils/transports/transport.interface.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;CACxC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,KAAK,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,oBAAoB,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"transport.interface.d.ts","sourceRoot":"","sources":["../../../../../src/utils/transports/transport.interface.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;CACxC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,KAAK,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,KAAK,CAAC,EAAE;QACN,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC5C,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAAC;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE;QACN,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;CACH;AAED;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAC7B,oBAAoB,GACpB,kBAAkB,GAClB,6BAA6B,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Get the application version from package.json.
|
|
3
|
+
*
|
|
4
|
+
* @returns The package version string or a safe fallback on failure.
|
|
5
|
+
*/
|
|
6
|
+
export declare function getAppVersion(): string;
|
|
7
|
+
/**
|
|
8
|
+
* Get the MCP protocol version used by the gateway.
|
|
9
|
+
*/
|
|
10
|
+
export declare function getProtocolVersion(): string;
|
|
11
|
+
//# sourceMappingURL=version.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../../../src/utils/version.ts"],"names":[],"mappings":"AA8CA;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAMtC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
const FALLBACK_VERSION = '0.0.0';
|
|
5
|
+
const MCP_PROTOCOL_VERSION = '2024-11-05';
|
|
6
|
+
let cachedAppVersion;
|
|
7
|
+
/**
|
|
8
|
+
* Resolve package version from package.json with multiple fallback paths.
|
|
9
|
+
*/
|
|
10
|
+
function resolvePackageVersion() {
|
|
11
|
+
const baseDirs = [
|
|
12
|
+
process.cwd(),
|
|
13
|
+
path.dirname(fileURLToPath(import.meta.url)),
|
|
14
|
+
path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..')
|
|
15
|
+
];
|
|
16
|
+
for (const baseDir of baseDirs) {
|
|
17
|
+
let currentDir = baseDir;
|
|
18
|
+
for (let depth = 0; depth < 6; depth += 1) {
|
|
19
|
+
const candidate = path.join(currentDir, 'package.json');
|
|
20
|
+
try {
|
|
21
|
+
if (fs.existsSync(candidate)) {
|
|
22
|
+
const packageText = fs.readFileSync(candidate, 'utf-8');
|
|
23
|
+
const parsed = JSON.parse(packageText);
|
|
24
|
+
if (parsed.version && typeof parsed.version === 'string') {
|
|
25
|
+
return parsed.version;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// Ignore parsing/file read errors and continue searching.
|
|
31
|
+
}
|
|
32
|
+
const parent = path.dirname(currentDir);
|
|
33
|
+
if (parent === currentDir) {
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
currentDir = parent;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return FALLBACK_VERSION;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Get the application version from package.json.
|
|
43
|
+
*
|
|
44
|
+
* @returns The package version string or a safe fallback on failure.
|
|
45
|
+
*/
|
|
46
|
+
export function getAppVersion() {
|
|
47
|
+
if (!cachedAppVersion) {
|
|
48
|
+
cachedAppVersion = resolvePackageVersion();
|
|
49
|
+
}
|
|
50
|
+
return cachedAppVersion;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Get the MCP protocol version used by the gateway.
|
|
54
|
+
*/
|
|
55
|
+
export function getProtocolVersion() {
|
|
56
|
+
return MCP_PROTOCOL_VERSION;
|
|
57
|
+
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
2
2
|
import { mcpConnectionManager } from '../../../src/services/mcp-connection-manager.js';
|
|
3
3
|
import { hubManager } from '../../../src/services/hub-manager.service.js';
|
|
4
|
+
import { resolveInstanceConfig } from '../../../src/config/config-migrator.js';
|
|
4
5
|
// Mock MCP SDK
|
|
5
6
|
vi.mock('@modelcontextprotocol/sdk/client/index.js', () => {
|
|
6
7
|
return {
|
|
@@ -39,22 +40,23 @@ vi.mock('@utils/transports/transport-factory.js', () => {
|
|
|
39
40
|
describe('MCP Protocol Contract - initialize (with SDK)', () => {
|
|
40
41
|
const serverName = 'test-sdk-server';
|
|
41
42
|
let serverId;
|
|
43
|
+
let serverIndex;
|
|
42
44
|
beforeEach(async () => {
|
|
43
|
-
// Add to hub manager
|
|
45
|
+
// Add to hub manager (v1.1 format)
|
|
44
46
|
await hubManager.addServer(serverName, {
|
|
45
47
|
command: 'node',
|
|
46
48
|
args: [],
|
|
47
|
-
enabled: true,
|
|
48
49
|
type: 'stdio',
|
|
49
50
|
timeout: 60000,
|
|
50
|
-
|
|
51
|
+
aggregatedTools: []
|
|
51
52
|
});
|
|
52
53
|
// Add server instance
|
|
53
54
|
const instance = await hubManager.addServerInstance(serverName, {});
|
|
54
55
|
serverId = instance.id;
|
|
56
|
+
serverIndex = instance.index ?? 0;
|
|
55
57
|
});
|
|
56
58
|
afterEach(async () => {
|
|
57
|
-
await mcpConnectionManager.disconnect(
|
|
59
|
+
await mcpConnectionManager.disconnect(serverName, serverIndex);
|
|
58
60
|
hubManager.removeServer(serverName);
|
|
59
61
|
});
|
|
60
62
|
it('should correctly initialize MCP connection with SDK', async () => {
|
|
@@ -63,18 +65,17 @@ describe('MCP Protocol Contract - initialize (with SDK)', () => {
|
|
|
63
65
|
if (!serverInfo) {
|
|
64
66
|
throw new Error('Server not found');
|
|
65
67
|
}
|
|
66
|
-
|
|
68
|
+
// Resolve the complete configuration using v1.1 resolveInstanceConfig
|
|
69
|
+
const resolvedConfig = resolveInstanceConfig(serverInfo.config, serverId);
|
|
70
|
+
if (!resolvedConfig) {
|
|
71
|
+
throw new Error('Failed to resolve server configuration');
|
|
72
|
+
}
|
|
73
|
+
await mcpConnectionManager.connect(serverName, serverIndex, {
|
|
74
|
+
...resolvedConfig,
|
|
67
75
|
id: serverId,
|
|
68
|
-
|
|
69
|
-
args: serverInfo.config.args,
|
|
70
|
-
enabled: serverInfo.config.enabled,
|
|
71
|
-
type: serverInfo.config.type,
|
|
72
|
-
timeout: serverInfo.config.timeout,
|
|
73
|
-
allowedTools: serverInfo.config.allowedTools,
|
|
74
|
-
timestamp: serverInfo.instance.timestamp,
|
|
75
|
-
hash: serverInfo.instance.hash
|
|
76
|
+
timestamp: Date.now()
|
|
76
77
|
});
|
|
77
|
-
const status = mcpConnectionManager.getStatus(
|
|
78
|
+
const status = mcpConnectionManager.getStatus(serverName, serverIndex);
|
|
78
79
|
expect(status?.connected).toBe(true);
|
|
79
80
|
expect(status?.version).toBe('1.0.0');
|
|
80
81
|
});
|
|
@@ -84,18 +85,17 @@ describe('MCP Protocol Contract - initialize (with SDK)', () => {
|
|
|
84
85
|
if (!serverInfo) {
|
|
85
86
|
throw new Error('Server not found');
|
|
86
87
|
}
|
|
87
|
-
|
|
88
|
+
// Resolve the complete configuration using v1.1 resolveInstanceConfig
|
|
89
|
+
const resolvedConfig = resolveInstanceConfig(serverInfo.config, serverId);
|
|
90
|
+
if (!resolvedConfig) {
|
|
91
|
+
throw new Error('Failed to resolve server configuration');
|
|
92
|
+
}
|
|
93
|
+
await mcpConnectionManager.connect(serverName, serverIndex, {
|
|
94
|
+
...resolvedConfig,
|
|
88
95
|
id: serverId,
|
|
89
|
-
|
|
90
|
-
args: serverInfo.config.args,
|
|
91
|
-
enabled: serverInfo.config.enabled,
|
|
92
|
-
type: serverInfo.config.type,
|
|
93
|
-
timeout: serverInfo.config.timeout,
|
|
94
|
-
allowedTools: serverInfo.config.allowedTools,
|
|
95
|
-
timestamp: serverInfo.instance.timestamp,
|
|
96
|
-
hash: serverInfo.instance.hash
|
|
96
|
+
timestamp: Date.now()
|
|
97
97
|
});
|
|
98
|
-
const tools = mcpConnectionManager.getTools(
|
|
98
|
+
const tools = mcpConnectionManager.getTools(serverName, serverIndex);
|
|
99
99
|
expect(tools).toHaveLength(1);
|
|
100
100
|
expect(tools[0].name).toBe('echo');
|
|
101
101
|
expect(tools[0].description).toBe('Echo the input');
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
2
2
|
import { mcpConnectionManager } from '../../../src/services/mcp-connection-manager.js';
|
|
3
3
|
import { hubManager } from '../../../src/services/hub-manager.service.js';
|
|
4
|
+
import { resolveInstanceConfig } from '../../../src/config/config-migrator.js';
|
|
4
5
|
// Mock MCP SDK
|
|
6
|
+
const mockListTools = vi.fn().mockResolvedValue({ tools: [] });
|
|
5
7
|
vi.mock('@modelcontextprotocol/sdk/client/index.js', () => {
|
|
6
8
|
return {
|
|
7
9
|
Client: class {
|
|
8
10
|
connect = vi.fn().mockResolvedValue(undefined);
|
|
9
11
|
close = vi.fn().mockResolvedValue(undefined);
|
|
12
|
+
listTools = mockListTools;
|
|
10
13
|
callTool = vi.fn().mockImplementation((toolCall) => {
|
|
11
14
|
if (toolCall.name === 'calculator') {
|
|
12
15
|
const { a, b, operation } = toolCall.arguments;
|
|
@@ -67,22 +70,23 @@ vi.mock('@utils/transports/transport-factory.js', () => {
|
|
|
67
70
|
describe('MCP Protocol Contract - tools/call (with SDK)', () => {
|
|
68
71
|
const serverName = 'test-sdk-server';
|
|
69
72
|
let serverId;
|
|
73
|
+
let serverIndex;
|
|
70
74
|
beforeEach(async () => {
|
|
71
|
-
// Add to hub manager
|
|
75
|
+
// Add to hub manager (v1.1 format)
|
|
72
76
|
await hubManager.addServer(serverName, {
|
|
73
77
|
command: 'node',
|
|
74
78
|
args: [],
|
|
75
|
-
enabled: true,
|
|
76
79
|
type: 'stdio',
|
|
77
80
|
timeout: 60000,
|
|
78
|
-
|
|
81
|
+
aggregatedTools: []
|
|
79
82
|
});
|
|
80
83
|
// Add server instance
|
|
81
84
|
const instance = await hubManager.addServerInstance(serverName, {});
|
|
82
85
|
serverId = instance.id;
|
|
86
|
+
serverIndex = instance.index ?? 0;
|
|
83
87
|
});
|
|
84
88
|
afterEach(async () => {
|
|
85
|
-
await mcpConnectionManager.disconnect(
|
|
89
|
+
await mcpConnectionManager.disconnect(serverName, serverIndex);
|
|
86
90
|
hubManager.removeServer(serverName);
|
|
87
91
|
});
|
|
88
92
|
it('should execute tool with correct arguments', async () => {
|
|
@@ -91,18 +95,17 @@ describe('MCP Protocol Contract - tools/call (with SDK)', () => {
|
|
|
91
95
|
if (!serverInfo) {
|
|
92
96
|
throw new Error('Server not found');
|
|
93
97
|
}
|
|
94
|
-
|
|
98
|
+
// Resolve the complete configuration using v1.1 resolveInstanceConfig
|
|
99
|
+
const resolvedConfig = resolveInstanceConfig(serverInfo.config, serverId);
|
|
100
|
+
if (!resolvedConfig) {
|
|
101
|
+
throw new Error('Failed to resolve server configuration');
|
|
102
|
+
}
|
|
103
|
+
await mcpConnectionManager.connect(serverName, serverIndex, {
|
|
104
|
+
...resolvedConfig,
|
|
95
105
|
id: serverId,
|
|
96
|
-
|
|
97
|
-
args: serverInfo.config.args,
|
|
98
|
-
enabled: serverInfo.config.enabled,
|
|
99
|
-
type: serverInfo.config.type,
|
|
100
|
-
timeout: serverInfo.config.timeout,
|
|
101
|
-
allowedTools: serverInfo.config.allowedTools,
|
|
102
|
-
timestamp: serverInfo.instance.timestamp,
|
|
103
|
-
hash: serverInfo.instance.hash
|
|
106
|
+
timestamp: Date.now()
|
|
104
107
|
});
|
|
105
|
-
const result = (await mcpConnectionManager.callTool(
|
|
108
|
+
const result = (await mcpConnectionManager.callTool(serverName, serverIndex, 'calculator', {
|
|
106
109
|
a: 5,
|
|
107
110
|
b: 3,
|
|
108
111
|
operation: 'add'
|
|
@@ -116,18 +119,17 @@ describe('MCP Protocol Contract - tools/call (with SDK)', () => {
|
|
|
116
119
|
if (!serverInfo) {
|
|
117
120
|
throw new Error('Server not found');
|
|
118
121
|
}
|
|
119
|
-
|
|
122
|
+
// Resolve the complete configuration using v1.1 resolveInstanceConfig
|
|
123
|
+
const resolvedConfig = resolveInstanceConfig(serverInfo.config, serverId);
|
|
124
|
+
if (!resolvedConfig) {
|
|
125
|
+
throw new Error('Failed to resolve server configuration');
|
|
126
|
+
}
|
|
127
|
+
await mcpConnectionManager.connect(serverName, serverIndex, {
|
|
128
|
+
...resolvedConfig,
|
|
120
129
|
id: serverId,
|
|
121
|
-
|
|
122
|
-
args: serverInfo.config.args,
|
|
123
|
-
enabled: serverInfo.config.enabled,
|
|
124
|
-
type: serverInfo.config.type,
|
|
125
|
-
timeout: serverInfo.config.timeout,
|
|
126
|
-
allowedTools: serverInfo.config.allowedTools,
|
|
127
|
-
timestamp: serverInfo.instance.timestamp,
|
|
128
|
-
hash: serverInfo.instance.hash
|
|
130
|
+
timestamp: Date.now()
|
|
129
131
|
});
|
|
130
|
-
await expect(mcpConnectionManager.callTool(
|
|
132
|
+
await expect(mcpConnectionManager.callTool(serverName, serverIndex, 'calculator', {
|
|
131
133
|
a: 'invalid',
|
|
132
134
|
b: 3,
|
|
133
135
|
operation: 'add'
|
|
@@ -139,18 +141,17 @@ describe('MCP Protocol Contract - tools/call (with SDK)', () => {
|
|
|
139
141
|
if (!serverInfo) {
|
|
140
142
|
throw new Error('Server not found');
|
|
141
143
|
}
|
|
142
|
-
|
|
144
|
+
// Resolve the complete configuration using v1.1 resolveInstanceConfig
|
|
145
|
+
const resolvedConfig = resolveInstanceConfig(serverInfo.config, serverId);
|
|
146
|
+
if (!resolvedConfig) {
|
|
147
|
+
throw new Error('Failed to resolve server configuration');
|
|
148
|
+
}
|
|
149
|
+
await mcpConnectionManager.connect(serverName, serverIndex, {
|
|
150
|
+
...resolvedConfig,
|
|
143
151
|
id: serverId,
|
|
144
|
-
|
|
145
|
-
args: serverInfo.config.args,
|
|
146
|
-
enabled: serverInfo.config.enabled,
|
|
147
|
-
type: serverInfo.config.type,
|
|
148
|
-
timeout: serverInfo.config.timeout,
|
|
149
|
-
allowedTools: serverInfo.config.allowedTools,
|
|
150
|
-
timestamp: serverInfo.instance.timestamp,
|
|
151
|
-
hash: serverInfo.instance.hash
|
|
152
|
+
timestamp: Date.now()
|
|
152
153
|
});
|
|
153
|
-
await expect(mcpConnectionManager.callTool(
|
|
154
|
+
await expect(mcpConnectionManager.callTool(serverName, serverIndex, 'unknown_tool', {})).rejects.toThrow();
|
|
154
155
|
});
|
|
155
156
|
it('should support multiple concurrent tool calls', async () => {
|
|
156
157
|
// Get server configuration and instance configuration
|
|
@@ -158,20 +159,23 @@ describe('MCP Protocol Contract - tools/call (with SDK)', () => {
|
|
|
158
159
|
if (!serverInfo) {
|
|
159
160
|
throw new Error('Server not found');
|
|
160
161
|
}
|
|
161
|
-
|
|
162
|
+
// Resolve the complete configuration using v1.1 resolveInstanceConfig
|
|
163
|
+
const resolvedConfig = resolveInstanceConfig(serverInfo.config, serverId);
|
|
164
|
+
if (!resolvedConfig) {
|
|
165
|
+
throw new Error('Failed to resolve server configuration');
|
|
166
|
+
}
|
|
167
|
+
await mcpConnectionManager.connect(serverName, serverIndex, {
|
|
168
|
+
...resolvedConfig,
|
|
162
169
|
id: serverId,
|
|
163
|
-
|
|
164
|
-
args: serverInfo.config.args,
|
|
165
|
-
enabled: serverInfo.config.enabled,
|
|
166
|
-
type: serverInfo.config.type,
|
|
167
|
-
timeout: serverInfo.config.timeout,
|
|
168
|
-
allowedTools: serverInfo.config.allowedTools,
|
|
169
|
-
timestamp: serverInfo.instance.timestamp,
|
|
170
|
-
hash: serverInfo.instance.hash
|
|
170
|
+
timestamp: Date.now()
|
|
171
171
|
});
|
|
172
172
|
const [result1, result2] = await Promise.all([
|
|
173
|
-
mcpConnectionManager.callTool(
|
|
174
|
-
|
|
173
|
+
mcpConnectionManager.callTool(serverName, serverIndex, 'get_weather', {
|
|
174
|
+
location: 'New York'
|
|
175
|
+
}),
|
|
176
|
+
mcpConnectionManager.callTool(serverName, serverIndex, 'search_news', {
|
|
177
|
+
query: 'technology'
|
|
178
|
+
})
|
|
175
179
|
]);
|
|
176
180
|
expect(result1).toHaveProperty('temperature');
|
|
177
181
|
expect(result1).toHaveProperty('condition');
|