@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
|
@@ -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');
|
|
@@ -1,8 +1,9 @@
|
|
|
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
|
-
const mockListTools = vi.fn();
|
|
6
|
+
const mockListTools = vi.fn().mockResolvedValue({ tools: [] });
|
|
6
7
|
vi.mock('@modelcontextprotocol/sdk/client/index.js', () => {
|
|
7
8
|
return {
|
|
8
9
|
Client: class {
|
|
@@ -29,22 +30,23 @@ vi.mock('@utils/transports/transport-factory.js', () => {
|
|
|
29
30
|
describe('MCP Protocol Contract - tools/list (with SDK)', () => {
|
|
30
31
|
const serverName = 'test-sdk-server';
|
|
31
32
|
let serverId;
|
|
33
|
+
let serverIndex;
|
|
32
34
|
beforeEach(async () => {
|
|
33
|
-
// Add to hub manager
|
|
35
|
+
// Add to hub manager (v1.1 format)
|
|
34
36
|
await hubManager.addServer(serverName, {
|
|
35
37
|
command: 'node',
|
|
36
38
|
args: [],
|
|
37
|
-
enabled: true,
|
|
38
39
|
type: 'stdio',
|
|
39
40
|
timeout: 60000,
|
|
40
|
-
|
|
41
|
+
aggregatedTools: []
|
|
41
42
|
});
|
|
42
43
|
// Add server instance
|
|
43
44
|
const instance = await hubManager.addServerInstance(serverName, {});
|
|
44
45
|
serverId = instance.id;
|
|
46
|
+
serverIndex = instance.index ?? 0;
|
|
45
47
|
});
|
|
46
48
|
afterEach(async () => {
|
|
47
|
-
await mcpConnectionManager.disconnect(
|
|
49
|
+
await mcpConnectionManager.disconnect(serverName, serverIndex);
|
|
48
50
|
hubManager.removeServer(serverName);
|
|
49
51
|
});
|
|
50
52
|
it('should return tools with correct MCP schema', async () => {
|
|
@@ -82,18 +84,17 @@ describe('MCP Protocol Contract - tools/list (with SDK)', () => {
|
|
|
82
84
|
if (!serverInfo) {
|
|
83
85
|
throw new Error('Server not found');
|
|
84
86
|
}
|
|
85
|
-
|
|
87
|
+
// Resolve the complete configuration using v1.1 resolveInstanceConfig
|
|
88
|
+
const resolvedConfig = resolveInstanceConfig(serverInfo.config, serverId);
|
|
89
|
+
if (!resolvedConfig) {
|
|
90
|
+
throw new Error('Failed to resolve server configuration');
|
|
91
|
+
}
|
|
92
|
+
await mcpConnectionManager.connect(serverName, serverIndex, {
|
|
93
|
+
...resolvedConfig,
|
|
86
94
|
id: serverId,
|
|
87
|
-
|
|
88
|
-
args: serverInfo.config.args,
|
|
89
|
-
enabled: serverInfo.config.enabled,
|
|
90
|
-
type: serverInfo.config.type,
|
|
91
|
-
timeout: serverInfo.config.timeout,
|
|
92
|
-
allowedTools: serverInfo.config.allowedTools,
|
|
93
|
-
timestamp: serverInfo.instance.timestamp,
|
|
94
|
-
hash: serverInfo.instance.hash
|
|
95
|
+
timestamp: Date.now()
|
|
95
96
|
});
|
|
96
|
-
const tools = mcpConnectionManager.getTools(
|
|
97
|
+
const tools = mcpConnectionManager.getTools(serverName, serverIndex);
|
|
97
98
|
expect(tools).toHaveLength(2);
|
|
98
99
|
// Verify calculator tool
|
|
99
100
|
const calculator = tools.find((t) => t.name === 'calculator');
|
|
@@ -114,19 +115,18 @@ describe('MCP Protocol Contract - tools/list (with SDK)', () => {
|
|
|
114
115
|
if (!serverInfo) {
|
|
115
116
|
throw new Error('Server not found');
|
|
116
117
|
}
|
|
117
|
-
|
|
118
|
+
// Resolve the complete configuration using v1.1 resolveInstanceConfig
|
|
119
|
+
const resolvedConfig = resolveInstanceConfig(serverInfo.config, serverId);
|
|
120
|
+
if (!resolvedConfig) {
|
|
121
|
+
throw new Error('Failed to resolve server configuration');
|
|
122
|
+
}
|
|
123
|
+
await mcpConnectionManager.connect(serverName, serverIndex, {
|
|
124
|
+
...resolvedConfig,
|
|
118
125
|
id: serverId,
|
|
119
|
-
|
|
120
|
-
args: serverInfo.config.args,
|
|
121
|
-
enabled: serverInfo.config.enabled,
|
|
122
|
-
type: serverInfo.config.type,
|
|
123
|
-
timeout: serverInfo.config.timeout,
|
|
124
|
-
allowedTools: serverInfo.config.allowedTools,
|
|
125
|
-
timestamp: serverInfo.instance.timestamp,
|
|
126
|
-
hash: serverInfo.instance.hash
|
|
126
|
+
timestamp: Date.now()
|
|
127
127
|
});
|
|
128
|
-
const tools1 = mcpConnectionManager.getTools(
|
|
129
|
-
const tools2 = mcpConnectionManager.getTools(
|
|
128
|
+
const tools1 = mcpConnectionManager.getTools(serverName, serverIndex);
|
|
129
|
+
const tools2 = mcpConnectionManager.getTools(serverName, serverIndex);
|
|
130
130
|
expect(tools1).toEqual(tools2);
|
|
131
131
|
expect(tools1[0]).toBe(tools2[0]); // Reference equality
|
|
132
132
|
});
|
|
@@ -138,18 +138,17 @@ describe('MCP Protocol Contract - tools/list (with SDK)', () => {
|
|
|
138
138
|
if (!serverInfo) {
|
|
139
139
|
throw new Error('Server not found');
|
|
140
140
|
}
|
|
141
|
-
|
|
141
|
+
// Resolve the complete configuration using v1.1 resolveInstanceConfig
|
|
142
|
+
const resolvedConfig = resolveInstanceConfig(serverInfo.config, serverId);
|
|
143
|
+
if (!resolvedConfig) {
|
|
144
|
+
throw new Error('Failed to resolve server configuration');
|
|
145
|
+
}
|
|
146
|
+
await mcpConnectionManager.connect(serverName, serverIndex, {
|
|
147
|
+
...resolvedConfig,
|
|
142
148
|
id: serverId,
|
|
143
|
-
|
|
144
|
-
args: serverInfo.config.args,
|
|
145
|
-
enabled: serverInfo.config.enabled,
|
|
146
|
-
type: serverInfo.config.type,
|
|
147
|
-
timeout: serverInfo.config.timeout,
|
|
148
|
-
allowedTools: serverInfo.config.allowedTools,
|
|
149
|
-
timestamp: serverInfo.instance.timestamp,
|
|
150
|
-
hash: serverInfo.instance.hash
|
|
149
|
+
timestamp: Date.now()
|
|
151
150
|
});
|
|
152
|
-
const tools = mcpConnectionManager.getTools(
|
|
151
|
+
const tools = mcpConnectionManager.getTools(serverName, serverIndex);
|
|
153
152
|
expect(tools).toHaveLength(0);
|
|
154
153
|
});
|
|
155
154
|
});
|
|
@@ -84,19 +84,20 @@ describe('MCP Evaluation Tests', () => {
|
|
|
84
84
|
expect(hasDestructiveIndicator, `Answer ${index + 1} may contain destructive operations: "${answer}"`).toBe(false);
|
|
85
85
|
});
|
|
86
86
|
});
|
|
87
|
-
it('should reference valid tools', () => {
|
|
87
|
+
it('should reference valid MCP tools', () => {
|
|
88
88
|
const validTools = [
|
|
89
|
-
'
|
|
90
|
-
'
|
|
91
|
-
'
|
|
92
|
-
'
|
|
93
|
-
'
|
|
94
|
-
'
|
|
95
|
-
'
|
|
89
|
+
'list_servers',
|
|
90
|
+
'find_servers',
|
|
91
|
+
'list_all_tools_in_server',
|
|
92
|
+
'find_tools_in_server',
|
|
93
|
+
'get_tool',
|
|
94
|
+
'call_tool',
|
|
95
|
+
'find_tools'
|
|
96
96
|
];
|
|
97
97
|
const content = fs.readFileSync(evaluationFile, 'utf-8');
|
|
98
|
+
const normalizedContent = content.replace(/\b[a-z]+(?:-[a-z]+)+\b/g, (match) => match.replace(/-/g, '_'));
|
|
98
99
|
validTools.forEach((tool) => {
|
|
99
|
-
expect(
|
|
100
|
+
expect(normalizedContent).toContain(tool);
|
|
100
101
|
});
|
|
101
102
|
});
|
|
102
103
|
});
|
|
@@ -127,7 +127,7 @@ describe('GatewayService', () => {
|
|
|
127
127
|
vi.mocked(mocks.getServerById).mockReturnValue({
|
|
128
128
|
name: 'Test Server',
|
|
129
129
|
id: 'server1',
|
|
130
|
-
config: {
|
|
130
|
+
config: { template: { aggregatedTools: ['testTool'] } },
|
|
131
131
|
instance: { id: 'server1', timestamp: Date.now(), hash: 'abc123' }
|
|
132
132
|
});
|
|
133
133
|
// Populate toolCache for the test
|
|
@@ -170,7 +170,7 @@ describe('GatewayService', () => {
|
|
|
170
170
|
vi.mocked(mocks.getServerById).mockReturnValue({
|
|
171
171
|
name: 'Test Server',
|
|
172
172
|
id: 'server1',
|
|
173
|
-
config: {
|
|
173
|
+
config: { template: { aggregatedTools: ['testTool'] } },
|
|
174
174
|
instance: { id: 'server1', timestamp: Date.now(), hash: 'abc123' }
|
|
175
175
|
});
|
|
176
176
|
// Find list tools handler to populate tool map
|