@loop_ouroboros/mcp-hub-lite 1.0.1 → 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 +47 -0
- package/dist/client/assets/{HomeView-Cr1jX73N.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-Bp9Rjwd7.js +1 -0
- 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-Csv24uBk.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-CqPQN3XP.js +1 -0
- package/dist/client/assets/{raf-DDfJOMYh.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 +363 -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 +2 -56
- package/dist/server/shared/models/session.model.d.ts.map +1 -1
- package/dist/server/shared/models/session.model.js +2 -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/client.types.d.ts +4 -32
- package/dist/server/shared/types/client.types.d.ts.map +1 -1
- package/dist/server/shared/types/client.types.js +3 -2
- package/dist/server/shared/types/index.d.ts +3 -3
- package/dist/server/shared/types/index.d.ts.map +1 -1
- package/dist/server/shared/types/index.js +3 -3
- package/dist/server/shared/types/session-context.types.d.ts +35 -0
- package/dist/server/shared/types/session-context.types.d.ts.map +1 -0
- package/dist/server/shared/types/session-context.types.js +5 -0
- 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.d.ts.map +1 -1
- package/dist/server/src/api/mcp/debug-response-wrapper.js +26 -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 +34 -61
- package/dist/server/src/api/mcp/session-context-extractor.d.ts +5 -5
- package/dist/server/src/api/mcp/session-context-extractor.d.ts.map +1 -1
- package/dist/server/src/api/mcp/session-context-extractor.js +15 -39
- package/dist/server/src/api/web/clients.js +2 -2
- 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/web/sessions.js +1 -1
- 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 -4
- 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 -102
- package/dist/server/src/config/config.schema.d.ts.map +1 -1
- package/dist/server/src/config/config.schema.js +15 -98
- 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/index.js +1 -1
- 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/client-tracker.service.d.ts +3 -128
- package/dist/server/src/services/client-tracker.service.d.ts.map +1 -1
- package/dist/server/src/services/client-tracker.service.js +4 -200
- 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 +16 -55
- 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 +25 -5
- 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 -64
- 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-cache.d.ts +0 -19
- package/dist/server/src/services/search/search-cache.d.ts.map +1 -1
- package/dist/server/src/services/search/search-cache.js +0 -24
- 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 -583
- package/dist/server/src/services/session-tracker.service.d.ts +124 -0
- package/dist/server/src/services/session-tracker.service.d.ts.map +1 -0
- package/dist/server/src/services/session-tracker.service.js +176 -0
- 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 +10 -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-colors.d.ts +1 -0
- package/dist/server/src/utils/logger/log-colors.d.ts.map +1 -1
- package/dist/server/src/utils/logger/log-colors.js +2 -1
- package/dist/server/src/utils/logger/log-context.d.ts +1 -0
- package/dist/server/src/utils/logger/log-context.d.ts.map +1 -1
- package/dist/server/src/utils/logger/log-formatter.d.ts +28 -0
- package/dist/server/src/utils/logger/log-formatter.d.ts.map +1 -1
- package/dist/server/src/utils/logger/log-formatter.js +287 -5
- package/dist/server/src/utils/logger/log-modules.d.ts +15 -12
- package/dist/server/src/utils/logger/log-modules.d.ts.map +1 -1
- package/dist/server/src/utils/logger/log-modules.js +8 -8
- package/dist/server/src/utils/logger/log-output.d.ts +2 -2
- package/dist/server/src/utils/logger/log-output.d.ts.map +1 -1
- package/dist/server/src/utils/logger/log-output.js +27 -6
- package/dist/server/src/utils/logger/logger.d.ts +13 -0
- package/dist/server/src/utils/logger/logger.d.ts.map +1 -1
- package/dist/server/src/utils/logger/logger.js +42 -7
- 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 +12 -30
- package/dist/server/src/utils/request-context.d.ts.map +1 -1
- package/dist/server/src/utils/request-context.js +10 -30
- 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/tool-args-parser.d.ts +0 -4
- package/dist/server/src/utils/tool-args-parser.d.ts.map +1 -1
- package/dist/server/src/utils/tool-args-parser.js +0 -7
- 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 +33 -13
- 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 +24 -39
- 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/temp/test-stack.d.ts +6 -0
- package/dist/server/tests/temp/test-stack.d.ts.map +1 -0
- package/dist/server/tests/temp/test-stack.js +40 -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 -334
- 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 +107 -13
- 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/logger.test.js +101 -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 +9 -28
- 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-BQ49hk0c.js +0 -1
- package/dist/client/assets/ResourcesView-BYZfWtia.js +0 -1
- package/dist/client/assets/ResourcesView-CjMklkyv.css +0 -1
- package/dist/client/assets/ServerDashboard-7_8Og9JJ.css +0 -1
- package/dist/client/assets/ServerDashboard-DHcxwKeh.js +0 -2
- package/dist/client/assets/ServerListView-DralUL71.js +0 -30
- package/dist/client/assets/ServerStatusTags.vue_vue_type_script_setup_true_lang-BHiTFM7-.js +0 -1
- package/dist/client/assets/SessionsView-BCGRTqem.js +0 -1
- package/dist/client/assets/SettingsView-BLfxa6PZ.js +0 -1
- package/dist/client/assets/ToolCallDialog-DQ0OQ1mD.js +0 -1
- package/dist/client/assets/ToolsView-BLB6x3tC.js +0 -1
- package/dist/client/assets/_baseClone-Bo5mBgsT.js +0 -1
- package/dist/client/assets/el-form-item-BVMLpmVC.css +0 -1
- package/dist/client/assets/el-form-item-BmeJKVSi.js +0 -12
- package/dist/client/assets/el-input-CeZiq23m.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-iw_hrrlC.js +0 -1
- package/dist/client/assets/el-select-B73uRP_Y.js +0 -1
- package/dist/client/assets/el-tab-pane-BgOTBn4X.js +0 -1
- package/dist/client/assets/el-table-column-Ld4GSD3x.js +0 -1
- package/dist/client/assets/el-table-column-T_mV9jNw.css +0 -1
- package/dist/client/assets/el-tag-DYmSo8Bx.js +0 -1
- package/dist/client/assets/el-tag-DjxZVOpb.css +0 -1
- package/dist/client/assets/index-COYaYRbH.js +0 -1
- package/dist/client/assets/index-Cfcvxyee.js +0 -2
- package/dist/client/assets/index-PhuI36Zi.js +0 -1
- package/dist/client/assets/omit-7EL6VJO4.js +0 -1
- package/dist/client/assets/vnode-upjuIlvm.js +0 -1
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import { FastifyInstance } from 'fastify';
|
|
2
2
|
/**
|
|
3
|
-
* MCP Server Management API Routes
|
|
3
|
+
* MCP Server Management API Routes (v1.1 format)
|
|
4
4
|
*
|
|
5
5
|
* Provides comprehensive CRUD (Create, Read, Update, Delete) operations for managing MCP (Model Context Protocol) servers
|
|
6
6
|
* and their runtime instances within the MCP Hub Lite system. This module serves as the primary interface for
|
|
7
7
|
* server configuration management, process control, and bulk operations.
|
|
8
8
|
*
|
|
9
|
-
* The API supports both static server configuration
|
|
9
|
+
* The API supports both static server template configuration and dynamic
|
|
10
10
|
* instance management (controlling actual running server processes). It includes sophisticated validation
|
|
11
11
|
* using Zod schemas to ensure configuration integrity and provides detailed error handling with appropriate
|
|
12
12
|
* HTTP status codes.
|
|
13
13
|
*
|
|
14
14
|
* Key features include:
|
|
15
|
-
* - Full CRUD operations for server
|
|
15
|
+
* - Full CRUD operations for server templates
|
|
16
16
|
* - Instance-level management for running server processes
|
|
17
17
|
* - Batch import/export capabilities for server configurations
|
|
18
18
|
* - Automatic server startup based on enabled status
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"servers.d.ts","sourceRoot":"","sources":["../../../../../src/api/web/servers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"servers.d.ts","sourceRoot":"","sources":["../../../../../src/api/web/servers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAmB1C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,iBAwS7D"}
|
|
@@ -1,21 +1,27 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { hubManager } from '../../services/hub-manager.service.js';
|
|
3
|
-
import {
|
|
3
|
+
import { ServerTemplateSchema, ServerInstanceUpdateSchema } from '../../config/config.schema.js';
|
|
4
4
|
import { logger } from '../../utils/logger.js';
|
|
5
|
+
import { LOG_MODULES } from '../../utils/logger/log-modules.js';
|
|
6
|
+
import { stringifyForLogging, getApiDebugSetting } from '../../utils/json-utils.js';
|
|
5
7
|
/**
|
|
6
|
-
*
|
|
8
|
+
* Server update schema that supports template fields
|
|
9
|
+
*/
|
|
10
|
+
const ServerUpdateSchema = ServerTemplateSchema.partial();
|
|
11
|
+
/**
|
|
12
|
+
* MCP Server Management API Routes (v1.1 format)
|
|
7
13
|
*
|
|
8
14
|
* Provides comprehensive CRUD (Create, Read, Update, Delete) operations for managing MCP (Model Context Protocol) servers
|
|
9
15
|
* and their runtime instances within the MCP Hub Lite system. This module serves as the primary interface for
|
|
10
16
|
* server configuration management, process control, and bulk operations.
|
|
11
17
|
*
|
|
12
|
-
* The API supports both static server configuration
|
|
18
|
+
* The API supports both static server template configuration and dynamic
|
|
13
19
|
* instance management (controlling actual running server processes). It includes sophisticated validation
|
|
14
20
|
* using Zod schemas to ensure configuration integrity and provides detailed error handling with appropriate
|
|
15
21
|
* HTTP status codes.
|
|
16
22
|
*
|
|
17
23
|
* Key features include:
|
|
18
|
-
* - Full CRUD operations for server
|
|
24
|
+
* - Full CRUD operations for server templates
|
|
19
25
|
* - Instance-level management for running server processes
|
|
20
26
|
* - Batch import/export capabilities for server configurations
|
|
21
27
|
* - Automatic server startup based on enabled status
|
|
@@ -47,34 +53,44 @@ export async function webServerRoutes(fastify) {
|
|
|
47
53
|
});
|
|
48
54
|
// GET /web/server-instances
|
|
49
55
|
fastify.get('/web/server-instances', async () => {
|
|
50
|
-
|
|
56
|
+
const allServers = hubManager.getAllServers();
|
|
57
|
+
const instances = {};
|
|
58
|
+
for (const { name, config } of allServers) {
|
|
59
|
+
instances[name] = config.instances;
|
|
60
|
+
}
|
|
61
|
+
return instances;
|
|
51
62
|
});
|
|
52
63
|
// GET /web/server-instances/:name
|
|
53
64
|
fastify.get('/web/server-instances/:name', async (request, reply) => {
|
|
54
|
-
const instances = hubManager.
|
|
65
|
+
const instances = hubManager.getServerInstancesByName(request.params.name);
|
|
55
66
|
if (instances.length === 0) {
|
|
56
|
-
|
|
67
|
+
// Check if server exists but has no instances
|
|
68
|
+
const server = hubManager.getServerByName(request.params.name);
|
|
69
|
+
if (!server) {
|
|
70
|
+
return reply.code(404).send({ error: 'Server not found' });
|
|
71
|
+
}
|
|
57
72
|
}
|
|
58
73
|
return instances;
|
|
59
74
|
});
|
|
60
75
|
// POST /web/servers
|
|
61
76
|
fastify.post('/web/servers', async (request, reply) => {
|
|
62
77
|
try {
|
|
63
|
-
// Accept server name and configuration as request body
|
|
78
|
+
// Accept server name and template configuration as request body
|
|
64
79
|
const postSchema = z.object({
|
|
65
80
|
name: z.string().min(1).max(100),
|
|
66
|
-
config:
|
|
81
|
+
config: ServerTemplateSchema.partial()
|
|
67
82
|
});
|
|
68
83
|
const body = postSchema.parse(request.body);
|
|
69
84
|
const newServer = await hubManager.addServer(body.name, body.config);
|
|
70
|
-
// If auto-start is enabled,
|
|
71
|
-
|
|
85
|
+
// If auto-start is enabled, check if we need to start the instance
|
|
86
|
+
const firstInstance = newServer.instances[0];
|
|
87
|
+
if (firstInstance && firstInstance.enabled !== false) {
|
|
72
88
|
try {
|
|
73
|
-
|
|
89
|
+
// Instance is already created by addServer, no need to create again
|
|
74
90
|
}
|
|
75
91
|
catch (error) {
|
|
76
92
|
// Auto-start failure does not affect server addition operation
|
|
77
|
-
logger.warn(`Failed to auto-start server instance for ${body.name}:`, error);
|
|
93
|
+
logger.warn(`Failed to auto-start server instance for ${body.name}:`, error, LOG_MODULES.SERVER_API);
|
|
78
94
|
}
|
|
79
95
|
}
|
|
80
96
|
return reply.code(201).send({ name: body.name, config: newServer });
|
|
@@ -89,8 +105,13 @@ export async function webServerRoutes(fastify) {
|
|
|
89
105
|
// POST /web/server-instances/:name
|
|
90
106
|
fastify.post('/web/server-instances/:name', async (request, reply) => {
|
|
91
107
|
try {
|
|
92
|
-
|
|
93
|
-
|
|
108
|
+
if (getApiDebugSetting()) {
|
|
109
|
+
logger.debug(`[API] POST /web/server-instances/${request.params.name} - raw body: ${stringifyForLogging(request.body)}`, LOG_MODULES.SERVER_API);
|
|
110
|
+
}
|
|
111
|
+
const body = ServerInstanceUpdateSchema.parse(request.body);
|
|
112
|
+
if (getApiDebugSetting()) {
|
|
113
|
+
logger.debug(`[API] POST /web/server-instances/${request.params.name} - parsed body: ${stringifyForLogging(body)}`, LOG_MODULES.SERVER_API);
|
|
114
|
+
}
|
|
94
115
|
// Check if server exists
|
|
95
116
|
const server = hubManager.getServerByName(request.params.name);
|
|
96
117
|
if (!server) {
|
|
@@ -109,9 +130,10 @@ export async function webServerRoutes(fastify) {
|
|
|
109
130
|
// PUT /web/servers/:name
|
|
110
131
|
fastify.put('/web/servers/:name', async (request, reply) => {
|
|
111
132
|
try {
|
|
112
|
-
const
|
|
113
|
-
|
|
114
|
-
|
|
133
|
+
const body = ServerUpdateSchema.parse(request.body);
|
|
134
|
+
// Update server template (includes instanceSelectionStrategy in template)
|
|
135
|
+
await hubManager.updateServer(request.params.name, body);
|
|
136
|
+
const updatedServer = hubManager.getServerByName(request.params.name);
|
|
115
137
|
if (!updatedServer) {
|
|
116
138
|
return reply.code(404).send({ error: 'Server not found' });
|
|
117
139
|
}
|
|
@@ -127,8 +149,13 @@ export async function webServerRoutes(fastify) {
|
|
|
127
149
|
// PUT /web/server-instances/:name/:index
|
|
128
150
|
fastify.put('/web/server-instances/:name/:index', async (request, reply) => {
|
|
129
151
|
try {
|
|
130
|
-
|
|
131
|
-
|
|
152
|
+
if (getApiDebugSetting()) {
|
|
153
|
+
logger.debug(`[API] PUT /web/server-instances/${request.params.name}/${request.params.index} - raw body: ${stringifyForLogging(request.body)}`, LOG_MODULES.SERVER_API);
|
|
154
|
+
}
|
|
155
|
+
const body = ServerInstanceUpdateSchema.parse(request.body);
|
|
156
|
+
if (getApiDebugSetting()) {
|
|
157
|
+
logger.debug(`[API] PUT /web/server-instances/${request.params.name}/${request.params.index} - parsed body: ${stringifyForLogging(body)}`, LOG_MODULES.SERVER_API);
|
|
158
|
+
}
|
|
132
159
|
await hubManager.updateServerInstance(request.params.name, request.params.index, body);
|
|
133
160
|
return reply.code(200).send({ message: 'Server instance updated' });
|
|
134
161
|
}
|
|
@@ -160,6 +187,24 @@ export async function webServerRoutes(fastify) {
|
|
|
160
187
|
return reply.code(500).send({ error: 'Internal Server Error' });
|
|
161
188
|
}
|
|
162
189
|
});
|
|
190
|
+
// POST /web/server-instances/:name/reassign-indexes
|
|
191
|
+
fastify.post('/web/server-instances/:name/reassign-indexes', async (request, reply) => {
|
|
192
|
+
try {
|
|
193
|
+
// Check if server exists
|
|
194
|
+
const server = hubManager.getServerByName(request.params.name);
|
|
195
|
+
if (!server) {
|
|
196
|
+
return reply.code(404).send({ error: 'Server not found' });
|
|
197
|
+
}
|
|
198
|
+
const success = await hubManager.reassignInstanceIndexes(request.params.name);
|
|
199
|
+
if (!success) {
|
|
200
|
+
return reply.code(404).send({ error: 'No server instances found' });
|
|
201
|
+
}
|
|
202
|
+
return reply.code(200).send({ message: 'Server instance indexes reassigned successfully' });
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
return reply.code(500).send({ error: 'Internal Server Error' });
|
|
206
|
+
}
|
|
207
|
+
});
|
|
163
208
|
// POST /web/servers/batch
|
|
164
209
|
fastify.post('/web/servers/batch', async (request, reply) => {
|
|
165
210
|
try {
|
|
@@ -167,7 +212,7 @@ export async function webServerRoutes(fastify) {
|
|
|
167
212
|
const batchSchema = z.object({
|
|
168
213
|
mcpServers: z.array(z.object({
|
|
169
214
|
name: z.string().min(1).max(100),
|
|
170
|
-
config:
|
|
215
|
+
config: ServerTemplateSchema.partial()
|
|
171
216
|
}))
|
|
172
217
|
});
|
|
173
218
|
const body = batchSchema.parse(request.body);
|
|
@@ -192,11 +237,11 @@ export async function webServerRoutes(fastify) {
|
|
|
192
237
|
continue;
|
|
193
238
|
}
|
|
194
239
|
// Validate server configuration using Zod (now supports "http" type)
|
|
195
|
-
const validatedConfig =
|
|
240
|
+
const validatedConfig = ServerTemplateSchema.partial().parse(serverConfig);
|
|
196
241
|
serversToAdd.push({ name: processedName, config: validatedConfig });
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
242
|
+
// In v1.1, enabled is at instance level, not template level
|
|
243
|
+
// We'll connect all instances by default
|
|
244
|
+
serversToConnect.push(processedName);
|
|
200
245
|
results.success.push({ name: processedName, config: validatedConfig });
|
|
201
246
|
existingNames.add(processedName); // Prevent duplicates within the same batch
|
|
202
247
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ws-handler.d.ts","sourceRoot":"","sources":["../../../../../src/api/ws/ws-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAc,MAAM,gCAAgC,CAAC;AAgC7E,qBAAa,gBAAgB;IAKzB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,QAAQ;IALlB,OAAO,CAAC,aAAa,CAAkD;IACvE,OAAO,CAAC,iBAAiB,CAAC,CAAiB;gBAGjC,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,eAAe;IAGnC;;OAEG;IACH,UAAU,IAAI,IAAI;IAWlB;;OAEG;IACH,OAAO,CAAC,aAAa;IA6BrB;;OAEG;IACH,OAAO,CAAC,eAAe;
|
|
1
|
+
{"version":3,"file":"ws-handler.d.ts","sourceRoot":"","sources":["../../../../../src/api/ws/ws-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAc,MAAM,gCAAgC,CAAC;AAgC7E,qBAAa,gBAAgB;IAKzB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,QAAQ;IALlB,OAAO,CAAC,aAAa,CAAkD;IACvE,OAAO,CAAC,iBAAiB,CAAC,CAAiB;gBAGjC,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,eAAe;IAGnC;;OAEG;IACH,UAAU,IAAI,IAAI;IAWlB;;OAEG;IACH,OAAO,CAAC,aAAa;IA6BrB;;OAEG;IACH,OAAO,CAAC,eAAe;IAiBvB;;OAEG;IACH,OAAO,CAAC,eAAe;IA6BvB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAsBzB;;OAEG;IACH,OAAO,CAAC,WAAW;IAWnB;;OAEG;IACH,OAAO,CAAC,UAAU;IAOlB;;OAEG;IACH,OAAO,CAAC,WAAW;IAInB;;OAEG;IACH,OAAO,CAAC,IAAI;IAMZ;;OAEG;IACH,OAAO,CAAC,SAAS;IAOjB;;OAEG;IACH,OAAO,CAAC,cAAc;IAStB;;OAEG;IACH,OAAO,CAAC,aAAa;CAKtB"}
|
|
@@ -99,14 +99,16 @@ export class WebSocketHandler {
|
|
|
99
99
|
* Handle fetch historical logs request
|
|
100
100
|
*/
|
|
101
101
|
handleFetchLogs(message) {
|
|
102
|
-
const
|
|
102
|
+
const compositeKey = `${message.serverName}-${message.serverIndex}`;
|
|
103
|
+
const logs = logStorage.getLogs(compositeKey, {
|
|
103
104
|
limit: message.limit || 100,
|
|
104
105
|
since: message.since
|
|
105
106
|
});
|
|
106
107
|
this.send({
|
|
107
108
|
type: 'log',
|
|
108
109
|
data: {
|
|
109
|
-
|
|
110
|
+
serverName: message.serverName,
|
|
111
|
+
serverIndex: message.serverIndex,
|
|
110
112
|
logs: logs
|
|
111
113
|
}
|
|
112
114
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/app.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/app.ts"],"names":[],"mappings":"AA2BA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,QAAQ,mWAmE7B"}
|
package/dist/server/src/app.js
CHANGED
|
@@ -14,9 +14,7 @@ import { webMcpStatusRoutes } from './api/web/mcp-status.js';
|
|
|
14
14
|
import { configRoutes } from './api/web/config.js';
|
|
15
15
|
import { webLogRoutes } from './api/web/logs.js';
|
|
16
16
|
import { webHubToolsRoutes } from './api/web/hub-tools.js';
|
|
17
|
-
import { webClientRoutes } from './api/web/clients.js';
|
|
18
17
|
import { webResourceRoutes } from './api/web/resources.js';
|
|
19
|
-
import { webSessionRoutes } from './api/web/sessions.js';
|
|
20
18
|
// WebSocket Routes
|
|
21
19
|
import { webSocketRoutes } from './api/ws/events.js';
|
|
22
20
|
// Get __dirname equivalent in ESM
|
|
@@ -77,9 +75,7 @@ export async function buildApp() {
|
|
|
77
75
|
fastify.register(configRoutes);
|
|
78
76
|
fastify.register(webLogRoutes);
|
|
79
77
|
fastify.register(webHubToolsRoutes);
|
|
80
|
-
fastify.register(webClientRoutes);
|
|
81
78
|
fastify.register(webResourceRoutes);
|
|
82
|
-
fastify.register(webSessionRoutes);
|
|
83
79
|
fastify.register(webSocketRoutes);
|
|
84
80
|
// Serve static files from dist/client (frontend build output)
|
|
85
81
|
const clientPath = path.join(__dirname, '../../client');
|
|
@@ -84,8 +84,8 @@ export const listCommand = new Command('list')
|
|
|
84
84
|
Name: server.name,
|
|
85
85
|
// Now need to display server instance information
|
|
86
86
|
Instances: server.instances?.length || 0,
|
|
87
|
-
Type: server.config.type,
|
|
88
|
-
Enabled: server.config.enabled
|
|
87
|
+
Type: server.config.template.type,
|
|
88
|
+
Enabled: server.config.instances.some((i) => i.enabled !== false)
|
|
89
89
|
})));
|
|
90
90
|
}
|
|
91
91
|
process.exit(0);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,eAAO,MAAM,aAAa,SAYtB,CAAC"}
|
|
@@ -82,38 +82,49 @@ function printFormattedStatus(status) {
|
|
|
82
82
|
console.log(`📡 Web UI: ${cyan}${webUiUrl}${reset}`);
|
|
83
83
|
console.log(`🔗 MCP Endpoint: ${cyan}${mcpEndpoint}${reset}`);
|
|
84
84
|
console.log(`📄 PID File: ${dim}${formatPath(status.pidFilePath)}${reset}`);
|
|
85
|
-
// MCP Servers section
|
|
85
|
+
// MCP Servers section - split into connected and disconnected
|
|
86
86
|
if (status.mcpServers && status.mcpServers.length > 0) {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
console.log(`${dim}${'─'.repeat(maxNameLen + maxTypeLen + maxStatusLen + 20)}${reset}`);
|
|
104
|
-
for (const server of status.mcpServers) {
|
|
105
|
-
const name = (server.name || '').padEnd(maxNameLen);
|
|
106
|
-
const type = (server.type || '').padEnd(maxTypeLen);
|
|
107
|
-
const statusText = server.connected
|
|
108
|
-
? `${green}Connected${reset}`.padEnd(maxStatusLen + 9)
|
|
109
|
-
: `${red}Disconnected${reset}`.padEnd(maxStatusLen + 9);
|
|
110
|
-
const tools = server.toolsCount.toString().padStart(5);
|
|
111
|
-
const resources = server.resourcesCount.toString().padStart(9);
|
|
112
|
-
console.log(`${name} ${type} ${statusText} ${tools} ${resources}`);
|
|
113
|
-
if (server.error) {
|
|
114
|
-
console.log(` ${red}Error: ${server.error}${reset}`);
|
|
87
|
+
const connectedServers = status.mcpServers.filter((s) => s.connected);
|
|
88
|
+
const disconnectedServers = status.mcpServers.filter((s) => !s.connected);
|
|
89
|
+
// Function to display a server list
|
|
90
|
+
const displayServerList = (servers, title, titleColor) => {
|
|
91
|
+
if (servers.length === 0)
|
|
92
|
+
return;
|
|
93
|
+
console.log('');
|
|
94
|
+
console.log(`${titleColor}${title}${reset}`);
|
|
95
|
+
console.log(`${dim}${'═'.repeat(title.length)}${reset}`);
|
|
96
|
+
// Calculate column widths
|
|
97
|
+
let maxNameLen = 'Server Name'.length;
|
|
98
|
+
let maxTypeLen = 'Type'.length;
|
|
99
|
+
const maxStatusLen = 'Disconnected'.length;
|
|
100
|
+
for (const server of servers) {
|
|
101
|
+
maxNameLen = Math.max(maxNameLen, (server.name || '').length);
|
|
102
|
+
maxTypeLen = Math.max(maxTypeLen, (server.type || '').length);
|
|
115
103
|
}
|
|
116
|
-
|
|
104
|
+
// Simple table without complex borders
|
|
105
|
+
const headerName = 'Server Name'.padEnd(maxNameLen);
|
|
106
|
+
const headerType = 'Type'.padEnd(maxTypeLen);
|
|
107
|
+
const headerStatus = 'Status'.padEnd(maxStatusLen);
|
|
108
|
+
console.log(`${cyan}${headerName} ${headerType} ${headerStatus} Tools Resources${reset}`);
|
|
109
|
+
console.log(`${dim}${'─'.repeat(maxNameLen + maxTypeLen + maxStatusLen + 20)}${reset}`);
|
|
110
|
+
for (const server of servers) {
|
|
111
|
+
const name = (server.name || '').padEnd(maxNameLen);
|
|
112
|
+
const type = (server.type || '').padEnd(maxTypeLen);
|
|
113
|
+
const statusText = server.connected
|
|
114
|
+
? `${green}Connected${reset}`.padEnd(maxStatusLen + 9)
|
|
115
|
+
: `${red}Disconnected${reset}`.padEnd(maxStatusLen + 9);
|
|
116
|
+
const tools = server.toolsCount.toString().padStart(5);
|
|
117
|
+
const resources = server.resourcesCount.toString().padStart(9);
|
|
118
|
+
console.log(`${name} ${type} ${statusText} ${tools} ${resources}`);
|
|
119
|
+
if (server.error) {
|
|
120
|
+
console.log(` ${red}Error: ${server.error}${reset}`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
// Display connected servers first
|
|
125
|
+
displayServerList(connectedServers, 'MCP Servers (Connected):', green);
|
|
126
|
+
// Then display disconnected servers
|
|
127
|
+
displayServerList(disconnectedServers, 'MCP Servers (Disconnected):', red);
|
|
117
128
|
}
|
|
118
129
|
// MCP Client Configuration
|
|
119
130
|
console.log('');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cli/index.ts"],"names":[],"mappings":";AAEA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cli/index.ts"],"names":[],"mappings":";AAEA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AACH,wBAAgB,SAAS,IAAI,OAAO,CAiBnC"}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
import { Command } from 'commander';
|
|
7
7
|
import { argv } from 'node:process';
|
|
8
8
|
import { pathToFileURL } from 'node:url';
|
|
9
|
+
import { getAppVersion } from '../utils/version.js';
|
|
9
10
|
import { startCommand } from './commands/start.js';
|
|
10
11
|
import { stopCommand } from './commands/stop.js';
|
|
11
12
|
import { statusCommand } from './commands/status.js';
|
|
@@ -71,7 +72,7 @@ export function createCli() {
|
|
|
71
72
|
program
|
|
72
73
|
.name('mcp-hub-lite')
|
|
73
74
|
.description('Lightweight MCP Gateway for managing MCP servers')
|
|
74
|
-
.version(
|
|
75
|
+
.version(process.env.npm_package_version ?? getAppVersion(), '-v, --version');
|
|
75
76
|
// Register all core commands
|
|
76
77
|
program.addCommand(startCommand);
|
|
77
78
|
program.addCommand(stopCommand);
|
|
@@ -159,10 +159,19 @@ export declare function restartServer(options: ServerOptions): Promise<void>;
|
|
|
159
159
|
export declare function listServers(): Promise<{
|
|
160
160
|
instances: {
|
|
161
161
|
id: string;
|
|
162
|
-
|
|
163
|
-
|
|
162
|
+
enabled: boolean;
|
|
163
|
+
args: string[];
|
|
164
|
+
env: Record<string, string>;
|
|
165
|
+
headers: Record<string, string>;
|
|
166
|
+
tags: Record<string, string>;
|
|
167
|
+
index?: number | undefined;
|
|
168
|
+
displayName?: string | undefined;
|
|
169
|
+
timestamp?: number | undefined;
|
|
164
170
|
pid?: number | undefined;
|
|
165
171
|
startTime?: number | undefined;
|
|
172
|
+
proxy?: {
|
|
173
|
+
url: string;
|
|
174
|
+
} | undefined;
|
|
166
175
|
}[];
|
|
167
176
|
name: string;
|
|
168
177
|
config: import("../config/config-manager.js").ServerConfig;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../../src/cli/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,eAAe,EAAE,CAAC;CAChC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAMvE;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM,iBAO5C;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,eAAe,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA0CjF;AAgED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAGzE;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,WAAW
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../../src/cli/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,eAAe,EAAE,CAAC;CAChC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAMvE;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM,iBAO5C;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,eAAe,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA0CjF;AAgED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAGzE;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,WAAW;;;;;;;;;;;;;;;;;;;KAUhC"}
|
|
@@ -3,6 +3,28 @@
|
|
|
3
3
|
* Handles comparison and logging of configuration changes.
|
|
4
4
|
*/
|
|
5
5
|
import type { SystemConfig } from './config.schema.js';
|
|
6
|
+
/**
|
|
7
|
+
* Gets the changes between two objects.
|
|
8
|
+
*
|
|
9
|
+
* This function performs a deep comparison of two objects
|
|
10
|
+
* and returns all changes at the field level.
|
|
11
|
+
*
|
|
12
|
+
* @param oldObj - The original object
|
|
13
|
+
* @param newObj - The new object
|
|
14
|
+
* @returns An array of change strings
|
|
15
|
+
*/
|
|
16
|
+
export declare function getObjectChanges(oldObj: unknown, newObj: unknown): string[];
|
|
17
|
+
/**
|
|
18
|
+
* Logs object changes with a custom title.
|
|
19
|
+
*
|
|
20
|
+
* @param title - The title to display before the changes
|
|
21
|
+
* @param oldObj - The original object
|
|
22
|
+
* @param newObj - The new object
|
|
23
|
+
* @param logModule - The log module to use
|
|
24
|
+
*/
|
|
25
|
+
export declare function logObjectChangesWithTitle(title: string, oldObj: unknown, newObj: unknown, logModule?: {
|
|
26
|
+
module: string;
|
|
27
|
+
}): void;
|
|
6
28
|
/**
|
|
7
29
|
* Logs the differences between two system configurations.
|
|
8
30
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-change-logger.d.ts","sourceRoot":"","sources":["../../../../src/config/config-change-logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"config-change-logger.d.ts","sourceRoot":"","sources":["../../../../src/config/config-change-logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAgGvD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,EAAE,CAwC3E;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,OAAO,EACf,SAAS,GAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAA+B,GACzD,IAAI,CAON;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,GAAG,IAAI,CAOvF"}
|
|
@@ -4,15 +4,102 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { logger, LOG_MODULES } from '../utils/logger.js';
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
7
|
+
* Sensitive KEY patterns (case-insensitive).
|
|
8
|
+
* Fields whose key contains any of these patterns will have their values masked.
|
|
9
|
+
*/
|
|
10
|
+
const SENSITIVE_KEY_PATTERNS = [
|
|
11
|
+
'token',
|
|
12
|
+
'key',
|
|
13
|
+
'authorization',
|
|
14
|
+
'secret',
|
|
15
|
+
'password',
|
|
16
|
+
'credential'
|
|
17
|
+
];
|
|
18
|
+
/**
|
|
19
|
+
* Sensitive VALUE patterns.
|
|
20
|
+
* String values containing any of these patterns will be masked.
|
|
21
|
+
*/
|
|
22
|
+
const SENSITIVE_VALUE_PATTERNS = ['Bearer', 'sk-', 'sk_', 'api_key', 'apikey'];
|
|
23
|
+
/**
|
|
24
|
+
* Checks if a key looks sensitive based on its name.
|
|
8
25
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
26
|
+
* @param key - The key to check
|
|
27
|
+
* @returns True if the key is sensitive
|
|
28
|
+
*/
|
|
29
|
+
function isSensitiveKey(key) {
|
|
30
|
+
const lowerKey = key.toLowerCase();
|
|
31
|
+
return SENSITIVE_KEY_PATTERNS.some((pattern) => lowerKey.includes(pattern));
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Checks if a value looks sensitive based on its content.
|
|
11
35
|
*
|
|
12
|
-
* @param
|
|
13
|
-
* @
|
|
36
|
+
* @param value - The value to check
|
|
37
|
+
* @returns True if the value is sensitive
|
|
14
38
|
*/
|
|
15
|
-
|
|
39
|
+
function isSensitiveValue(value) {
|
|
40
|
+
return SENSITIVE_VALUE_PATTERNS.some((pattern) => value.includes(pattern));
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Masks a sensitive value while preserving partial visibility.
|
|
44
|
+
* - For values with length < 8: preserves first and last character
|
|
45
|
+
* - For values with length >= 8: preserves first 4 and last 4 characters
|
|
46
|
+
*
|
|
47
|
+
* @param value - The value to mask
|
|
48
|
+
* @returns The masked value
|
|
49
|
+
*/
|
|
50
|
+
function maskSensitiveValue(value) {
|
|
51
|
+
if (value.length < 8) {
|
|
52
|
+
return value[0] + '****' + value[value.length - 1];
|
|
53
|
+
}
|
|
54
|
+
return value.substring(0, 4) + '********' + value.substring(value.length - 4);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Normalizes a URL string by removing trailing slashes.
|
|
58
|
+
*
|
|
59
|
+
* @param url - The URL to normalize
|
|
60
|
+
* @returns Normalized URL
|
|
61
|
+
*/
|
|
62
|
+
function normalizeUrl(url) {
|
|
63
|
+
return url.replace(/\/+$/, '');
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Checks if a path looks like a URL field.
|
|
67
|
+
*
|
|
68
|
+
* @param path - The field path to check
|
|
69
|
+
* @returns True if the path looks like a URL field
|
|
70
|
+
*/
|
|
71
|
+
function isUrlField(path) {
|
|
72
|
+
const urlPatterns = [/\.url$/, /^url$/, /\.proxy\.url$/];
|
|
73
|
+
return urlPatterns.some((pattern) => pattern.test(path));
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Compares two values with URL normalization support.
|
|
77
|
+
*
|
|
78
|
+
* @param val1 - First value
|
|
79
|
+
* @param val2 - Second value
|
|
80
|
+
* @param path - The field path for context
|
|
81
|
+
* @returns True if values are considered equal
|
|
82
|
+
*/
|
|
83
|
+
function areValuesEqual(val1, val2, path) {
|
|
84
|
+
// Special handling for URL fields
|
|
85
|
+
if (isUrlField(path)) {
|
|
86
|
+
if (typeof val1 === 'string' && typeof val2 === 'string') {
|
|
87
|
+
return normalizeUrl(val1) === normalizeUrl(val2);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return JSON.stringify(val1) === JSON.stringify(val2);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Gets the changes between two objects.
|
|
94
|
+
*
|
|
95
|
+
* This function performs a deep comparison of two objects
|
|
96
|
+
* and returns all changes at the field level.
|
|
97
|
+
*
|
|
98
|
+
* @param oldObj - The original object
|
|
99
|
+
* @param newObj - The new object
|
|
100
|
+
* @returns An array of change strings
|
|
101
|
+
*/
|
|
102
|
+
export function getObjectChanges(oldObj, newObj) {
|
|
16
103
|
const changes = [];
|
|
17
104
|
const compare = (obj1, obj2, path) => {
|
|
18
105
|
const allKeys = new Set([...Object.keys(obj1 || {}), ...Object.keys(obj2 || {})]);
|
|
@@ -20,7 +107,7 @@ export function logConfigChanges(oldConfig, newConfig) {
|
|
|
20
107
|
const currentPath = path ? `${path}.${key}` : key;
|
|
21
108
|
const val1 = obj1 && typeof obj1 === 'object' ? obj1[key] : undefined;
|
|
22
109
|
const val2 = obj2 && typeof obj2 === 'object' ? obj2[key] : undefined;
|
|
23
|
-
if (
|
|
110
|
+
if (areValuesEqual(val1, val2, currentPath))
|
|
24
111
|
continue;
|
|
25
112
|
if (typeof val1 === 'object' &&
|
|
26
113
|
val1 !== null &&
|
|
@@ -31,13 +118,50 @@ export function logConfigChanges(oldConfig, newConfig) {
|
|
|
31
118
|
compare(val1, val2, currentPath);
|
|
32
119
|
}
|
|
33
120
|
else {
|
|
34
|
-
const formatVal = (v) =>
|
|
35
|
-
|
|
121
|
+
const formatVal = (key, v) => {
|
|
122
|
+
if (v === undefined)
|
|
123
|
+
return 'undefined';
|
|
124
|
+
const str = JSON.stringify(v);
|
|
125
|
+
if (typeof v === 'string' && (isSensitiveKey(key) || isSensitiveValue(v))) {
|
|
126
|
+
return `"${maskSensitiveValue(v)}"`;
|
|
127
|
+
}
|
|
128
|
+
return str;
|
|
129
|
+
};
|
|
130
|
+
changes.push(`${currentPath} = ${formatVal(key, val1)} -> ${formatVal(key, val2)}`);
|
|
36
131
|
}
|
|
37
132
|
}
|
|
38
133
|
};
|
|
39
|
-
compare(
|
|
134
|
+
compare(oldObj, newObj, '');
|
|
135
|
+
return changes;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Logs object changes with a custom title.
|
|
139
|
+
*
|
|
140
|
+
* @param title - The title to display before the changes
|
|
141
|
+
* @param oldObj - The original object
|
|
142
|
+
* @param newObj - The new object
|
|
143
|
+
* @param logModule - The log module to use
|
|
144
|
+
*/
|
|
145
|
+
export function logObjectChangesWithTitle(title, oldObj, newObj, logModule = LOG_MODULES.CONFIG_CHANGES) {
|
|
146
|
+
const changes = getObjectChanges(oldObj, newObj);
|
|
147
|
+
if (changes.length > 0) {
|
|
148
|
+
const message = `${title}\n${changes.join('\n')}`;
|
|
149
|
+
logger.info(message, logModule);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Logs the differences between two system configurations.
|
|
154
|
+
*
|
|
155
|
+
* This function performs a deep comparison of two configuration objects
|
|
156
|
+
* and logs all changes at the field level for audit purposes.
|
|
157
|
+
*
|
|
158
|
+
* @param oldConfig - The original configuration
|
|
159
|
+
* @param newConfig - The new configuration
|
|
160
|
+
*/
|
|
161
|
+
export function logConfigChanges(oldConfig, newConfig) {
|
|
162
|
+
const changes = getObjectChanges(oldConfig, newConfig);
|
|
40
163
|
if (changes.length > 0) {
|
|
41
|
-
|
|
164
|
+
const message = `System Config Changes:\n${changes.join('\n')}`;
|
|
165
|
+
logger.info(message, LOG_MODULES.CONFIG_CHANGES);
|
|
42
166
|
}
|
|
43
167
|
}
|