@loop_ouroboros/mcp-hub-lite 1.0.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 +228 -0
- package/LICENSE +21 -0
- package/README.md +354 -0
- package/dist/client/assets/HomeView-f901HeKw.js +1 -0
- package/dist/client/assets/ResourceDetailView-BdOaL_-o.css +1 -0
- package/dist/client/assets/ResourceDetailView-Bz66ZjfY.js +1 -0
- package/dist/client/assets/ResourcesView-CjMklkyv.css +1 -0
- package/dist/client/assets/ResourcesView-lI_fItfA.js +1 -0
- package/dist/client/assets/ServerDashboard-7_8Og9JJ.css +1 -0
- package/dist/client/assets/ServerDashboard-Bgx8WVkx.js +2 -0
- package/dist/client/assets/ServerListView-Bws09jNR.css +1 -0
- package/dist/client/assets/ServerListView-CP6Ffkfx.js +30 -0
- package/dist/client/assets/ServerStatusTags.vue_vue_type_script_setup_true_lang-BHiTFM7-.js +1 -0
- package/dist/client/assets/SessionsView-D68qKR4D.js +1 -0
- package/dist/client/assets/SettingsView-BPYfO9BE.js +1 -0
- package/dist/client/assets/ToolCallDialog-Br8FNebN.js +1 -0
- package/dist/client/assets/ToolCallDialog-C7eh7jHE.css +1 -0
- package/dist/client/assets/ToolsView-B6hUiR43.js +1 -0
- package/dist/client/assets/ToolsView-BLnU8cV6.css +1 -0
- package/dist/client/assets/_baseClone-DCmK847M.js +1 -0
- package/dist/client/assets/_plugin-vue_export-helper-DlAUqK2U.js +1 -0
- package/dist/client/assets/el-form-item-BVMLpmVC.css +1 -0
- package/dist/client/assets/el-form-item-DM0q2hmO.js +12 -0
- package/dist/client/assets/el-input-BtI9NECe.js +1 -0
- package/dist/client/assets/el-input-CmuHb8HS.css +1 -0
- package/dist/client/assets/el-loading-CChNmKeI.js +1 -0
- package/dist/client/assets/el-loading-bpKhqqQq.css +1 -0
- package/dist/client/assets/el-overlay-B2ZKM6Up.css +1 -0
- package/dist/client/assets/el-overlay-lZZbPmsX.js +1 -0
- package/dist/client/assets/el-select-BXztu2b5.js +1 -0
- package/dist/client/assets/el-select-C0U_l4IZ.css +1 -0
- package/dist/client/assets/el-tab-pane-CnNoQHsR.css +1 -0
- package/dist/client/assets/el-tab-pane-Dy9ruaEX.js +1 -0
- package/dist/client/assets/el-table-column-98UyVgBH.js +1 -0
- package/dist/client/assets/el-table-column-T_mV9jNw.css +1 -0
- package/dist/client/assets/el-tag-B5lLT51E.js +1 -0
- package/dist/client/assets/el-tag-DjxZVOpb.css +1 -0
- package/dist/client/assets/event-BB_Ol6Sd.js +1 -0
- package/dist/client/assets/index-BgKcmWJr.js +1 -0
- package/dist/client/assets/index-BsDWtoIl.css +1 -0
- package/dist/client/assets/index-BzQXG7no.js +1 -0
- package/dist/client/assets/index-CSTs2jYk.js +2 -0
- package/dist/client/assets/omit-Bx5HJNV_.js +1 -0
- package/dist/client/assets/raf-B9VDMtMF.js +1 -0
- package/dist/client/assets/typescript-Bp3YSIOJ.js +1 -0
- package/dist/client/assets/vnode-B8aJx8u4.js +1 -0
- package/dist/client/assets/vue-vendor-6ny5zj9i.js +3 -0
- package/dist/client/index.html +15 -0
- package/dist/server/shared/index.d.ts +3 -0
- package/dist/server/shared/index.d.ts.map +1 -0
- package/dist/server/shared/index.js +2 -0
- package/dist/server/shared/models/index.d.ts +4 -0
- package/dist/server/shared/models/index.d.ts.map +1 -0
- package/dist/server/shared/models/index.js +3 -0
- package/dist/server/shared/models/resource.model.d.ts +8 -0
- package/dist/server/shared/models/resource.model.d.ts.map +1 -0
- package/dist/server/shared/models/resource.model.js +1 -0
- package/dist/server/shared/models/server.model.d.ts +57 -0
- package/dist/server/shared/models/server.model.d.ts.map +1 -0
- package/dist/server/shared/models/server.model.js +1 -0
- package/dist/server/shared/models/session.model.d.ts +73 -0
- package/dist/server/shared/models/session.model.d.ts.map +1 -0
- package/dist/server/shared/models/session.model.js +70 -0
- package/dist/server/shared/models/tool.model.d.ts +22 -0
- package/dist/server/shared/models/tool.model.d.ts.map +1 -0
- package/dist/server/shared/models/tool.model.js +1 -0
- package/dist/server/shared/types/client.types.d.ts +35 -0
- package/dist/server/shared/types/client.types.d.ts.map +1 -0
- package/dist/server/shared/types/client.types.js +5 -0
- package/dist/server/shared/types/common.types.d.ts +5 -0
- package/dist/server/shared/types/common.types.d.ts.map +1 -0
- package/dist/server/shared/types/common.types.js +2 -0
- package/dist/server/shared/types/index.d.ts +4 -0
- package/dist/server/shared/types/index.d.ts.map +1 -0
- package/dist/server/shared/types/index.js +3 -0
- package/dist/server/shared/types/session.types.d.ts +15 -0
- package/dist/server/shared/types/session.types.d.ts.map +1 -0
- package/dist/server/shared/types/session.types.js +5 -0
- package/dist/server/shared/types/websocket.types.d.ts +177 -0
- package/dist/server/shared/types/websocket.types.d.ts.map +1 -0
- package/dist/server/shared/types/websocket.types.js +25 -0
- package/dist/server/src/api/mcp/debug-response-wrapper.d.ts +13 -0
- package/dist/server/src/api/mcp/debug-response-wrapper.d.ts.map +1 -0
- package/dist/server/src/api/mcp/debug-response-wrapper.js +271 -0
- package/dist/server/src/api/mcp/gateway.d.ts +14 -0
- package/dist/server/src/api/mcp/gateway.d.ts.map +1 -0
- package/dist/server/src/api/mcp/gateway.js +116 -0
- package/dist/server/src/api/mcp/session-context-extractor.d.ts +47 -0
- package/dist/server/src/api/mcp/session-context-extractor.d.ts.map +1 -0
- package/dist/server/src/api/mcp/session-context-extractor.js +127 -0
- package/dist/server/src/api/mcp/sse-stream-manager.d.ts +13 -0
- package/dist/server/src/api/mcp/sse-stream-manager.d.ts.map +1 -0
- package/dist/server/src/api/mcp/sse-stream-manager.js +40 -0
- package/dist/server/src/api/web/clients.d.ts +30 -0
- package/dist/server/src/api/web/clients.d.ts.map +1 -0
- package/dist/server/src/api/web/clients.js +41 -0
- package/dist/server/src/api/web/config.d.ts +21 -0
- package/dist/server/src/api/web/config.d.ts.map +1 -0
- package/dist/server/src/api/web/config.js +119 -0
- package/dist/server/src/api/web/health.d.ts +21 -0
- package/dist/server/src/api/web/health.d.ts.map +1 -0
- package/dist/server/src/api/web/health.js +24 -0
- package/dist/server/src/api/web/hub-tools.d.ts +30 -0
- package/dist/server/src/api/web/hub-tools.d.ts.map +1 -0
- package/dist/server/src/api/web/hub-tools.js +202 -0
- package/dist/server/src/api/web/logs.d.ts +30 -0
- package/dist/server/src/api/web/logs.d.ts.map +1 -0
- package/dist/server/src/api/web/logs.js +141 -0
- package/dist/server/src/api/web/mcp-status.d.ts +29 -0
- package/dist/server/src/api/web/mcp-status.d.ts.map +1 -0
- package/dist/server/src/api/web/mcp-status.js +126 -0
- package/dist/server/src/api/web/resources.d.ts +28 -0
- package/dist/server/src/api/web/resources.d.ts.map +1 -0
- package/dist/server/src/api/web/resources.js +93 -0
- package/dist/server/src/api/web/search.d.ts +26 -0
- package/dist/server/src/api/web/search.d.ts.map +1 -0
- package/dist/server/src/api/web/search.js +62 -0
- package/dist/server/src/api/web/servers.d.ts +33 -0
- package/dist/server/src/api/web/servers.d.ts.map +1 -0
- package/dist/server/src/api/web/servers.js +235 -0
- package/dist/server/src/api/web/sessions.d.ts +29 -0
- package/dist/server/src/api/web/sessions.d.ts.map +1 -0
- package/dist/server/src/api/web/sessions.js +104 -0
- package/dist/server/src/api/ws/events.d.ts +29 -0
- package/dist/server/src/api/ws/events.d.ts.map +1 -0
- package/dist/server/src/api/ws/events.js +44 -0
- package/dist/server/src/api/ws/ws-handler.d.ts +83 -0
- package/dist/server/src/api/ws/ws-handler.d.ts.map +1 -0
- package/dist/server/src/api/ws/ws-handler.js +217 -0
- package/dist/server/src/app.d.ts +24 -0
- package/dist/server/src/app.d.ts.map +1 -0
- package/dist/server/src/app.js +108 -0
- package/dist/server/src/cli/commands/list.d.ts +71 -0
- package/dist/server/src/cli/commands/list.d.ts.map +1 -0
- package/dist/server/src/cli/commands/list.js +97 -0
- package/dist/server/src/cli/commands/restart.d.ts +42 -0
- package/dist/server/src/cli/commands/restart.d.ts.map +1 -0
- package/dist/server/src/cli/commands/restart.js +61 -0
- package/dist/server/src/cli/commands/start.d.ts +43 -0
- package/dist/server/src/cli/commands/start.d.ts.map +1 -0
- package/dist/server/src/cli/commands/start.js +160 -0
- package/dist/server/src/cli/commands/status.d.ts +39 -0
- package/dist/server/src/cli/commands/status.d.ts.map +1 -0
- package/dist/server/src/cli/commands/status.js +164 -0
- package/dist/server/src/cli/commands/stop.d.ts +34 -0
- package/dist/server/src/cli/commands/stop.d.ts.map +1 -0
- package/dist/server/src/cli/commands/stop.js +47 -0
- package/dist/server/src/cli/commands/ui.d.ts +44 -0
- package/dist/server/src/cli/commands/ui.d.ts.map +1 -0
- package/dist/server/src/cli/commands/ui.js +95 -0
- package/dist/server/src/cli/index.d.ts +62 -0
- package/dist/server/src/cli/index.d.ts.map +1 -0
- package/dist/server/src/cli/index.js +88 -0
- package/dist/server/src/cli/parse-args.d.ts +108 -0
- package/dist/server/src/cli/parse-args.d.ts.map +1 -0
- package/dist/server/src/cli/parse-args.js +131 -0
- package/dist/server/src/cli/server.d.ts +171 -0
- package/dist/server/src/cli/server.d.ts.map +1 -0
- package/dist/server/src/cli/server.js +246 -0
- package/dist/server/src/config/config-change-logger.d.ts +16 -0
- package/dist/server/src/config/config-change-logger.d.ts.map +1 -0
- package/dist/server/src/config/config-change-logger.js +43 -0
- package/dist/server/src/config/config-loader.d.ts +22 -0
- package/dist/server/src/config/config-loader.d.ts.map +1 -0
- package/dist/server/src/config/config-loader.js +66 -0
- package/dist/server/src/config/config-manager.d.ts +158 -0
- package/dist/server/src/config/config-manager.d.ts.map +1 -0
- package/dist/server/src/config/config-manager.js +246 -0
- package/dist/server/src/config/config-saver.d.ts +16 -0
- package/dist/server/src/config/config-saver.d.ts.map +1 -0
- package/dist/server/src/config/config-saver.js +28 -0
- package/dist/server/src/config/config.schema.d.ts +108 -0
- package/dist/server/src/config/config.schema.d.ts.map +1 -0
- package/dist/server/src/config/config.schema.js +103 -0
- package/dist/server/src/config/server-config-manager.d.ts +74 -0
- package/dist/server/src/config/server-config-manager.d.ts.map +1 -0
- package/dist/server/src/config/server-config-manager.js +157 -0
- package/dist/server/src/config/type-converter.d.ts +13 -0
- package/dist/server/src/config/type-converter.d.ts.map +1 -0
- package/dist/server/src/config/type-converter.js +37 -0
- package/dist/server/src/index.d.ts +3 -0
- package/dist/server/src/index.d.ts.map +1 -0
- package/dist/server/src/index.js +352 -0
- package/dist/server/src/models/event.model.d.ts +106 -0
- package/dist/server/src/models/event.model.d.ts.map +1 -0
- package/dist/server/src/models/event.model.js +5 -0
- package/dist/server/src/models/server.model.d.ts +19 -0
- package/dist/server/src/models/server.model.d.ts.map +1 -0
- package/dist/server/src/models/server.model.js +1 -0
- package/dist/server/src/models/system-tools.constants.d.ts +73 -0
- package/dist/server/src/models/system-tools.constants.d.ts.map +1 -0
- package/dist/server/src/models/system-tools.constants.js +31 -0
- package/dist/server/src/models/types.d.ts +84 -0
- package/dist/server/src/models/types.d.ts.map +1 -0
- package/dist/server/src/models/types.js +67 -0
- package/dist/server/src/pid/file.d.ts +26 -0
- package/dist/server/src/pid/file.d.ts.map +1 -0
- package/dist/server/src/pid/file.js +68 -0
- package/dist/server/src/pid/manager.d.ts +98 -0
- package/dist/server/src/pid/manager.d.ts.map +1 -0
- package/dist/server/src/pid/manager.js +158 -0
- package/dist/server/src/pid/types.d.ts +13 -0
- package/dist/server/src/pid/types.d.ts.map +1 -0
- package/dist/server/src/pid/types.js +4 -0
- package/dist/server/src/server/dev-server.d.ts +2 -0
- package/dist/server/src/server/dev-server.d.ts.map +1 -0
- package/dist/server/src/server/dev-server.js +171 -0
- package/dist/server/src/server/runner.d.ts +57 -0
- package/dist/server/src/server/runner.d.ts.map +1 -0
- package/dist/server/src/server/runner.js +163 -0
- package/dist/server/src/services/client-tracker.service.d.ts +132 -0
- package/dist/server/src/services/client-tracker.service.d.ts.map +1 -0
- package/dist/server/src/services/client-tracker.service.js +203 -0
- package/dist/server/src/services/connection/connection-manager.d.ts +478 -0
- package/dist/server/src/services/connection/connection-manager.d.ts.map +1 -0
- package/dist/server/src/services/connection/connection-manager.js +929 -0
- package/dist/server/src/services/connection/index.d.ts +6 -0
- package/dist/server/src/services/connection/index.d.ts.map +1 -0
- package/dist/server/src/services/connection/index.js +4 -0
- package/dist/server/src/services/connection/tool-cache.d.ts +122 -0
- package/dist/server/src/services/connection/tool-cache.d.ts.map +1 -0
- package/dist/server/src/services/connection/tool-cache.js +202 -0
- package/dist/server/src/services/connection/types.d.ts +30 -0
- package/dist/server/src/services/connection/types.d.ts.map +1 -0
- package/dist/server/src/services/connection/types.js +1 -0
- package/dist/server/src/services/event-bus.service.d.ts +169 -0
- package/dist/server/src/services/event-bus.service.d.ts.map +1 -0
- package/dist/server/src/services/event-bus.service.js +200 -0
- package/dist/server/src/services/gateway/gateway.service.d.ts +61 -0
- package/dist/server/src/services/gateway/gateway.service.d.ts.map +1 -0
- package/dist/server/src/services/gateway/gateway.service.js +107 -0
- package/dist/server/src/services/gateway/index.d.ts +8 -0
- package/dist/server/src/services/gateway/index.d.ts.map +1 -0
- package/dist/server/src/services/gateway/index.js +6 -0
- package/dist/server/src/services/gateway/log-formatter.d.ts +26 -0
- package/dist/server/src/services/gateway/log-formatter.d.ts.map +1 -0
- package/dist/server/src/services/gateway/log-formatter.js +66 -0
- package/dist/server/src/services/gateway/request-handlers/call-tool-handler.d.ts +13 -0
- package/dist/server/src/services/gateway/request-handlers/call-tool-handler.d.ts.map +1 -0
- package/dist/server/src/services/gateway/request-handlers/call-tool-handler.js +131 -0
- package/dist/server/src/services/gateway/request-handlers/index.d.ts +9 -0
- package/dist/server/src/services/gateway/request-handlers/index.d.ts.map +1 -0
- package/dist/server/src/services/gateway/request-handlers/index.js +8 -0
- package/dist/server/src/services/gateway/request-handlers/initialize-handler.d.ts +11 -0
- package/dist/server/src/services/gateway/request-handlers/initialize-handler.d.ts.map +1 -0
- package/dist/server/src/services/gateway/request-handlers/initialize-handler.js +85 -0
- package/dist/server/src/services/gateway/request-handlers/resources-handler.d.ts +11 -0
- package/dist/server/src/services/gateway/request-handlers/resources-handler.d.ts.map +1 -0
- package/dist/server/src/services/gateway/request-handlers/resources-handler.js +56 -0
- package/dist/server/src/services/gateway/request-handlers/system-tools-handler.d.ts +11 -0
- package/dist/server/src/services/gateway/request-handlers/system-tools-handler.d.ts.map +1 -0
- package/dist/server/src/services/gateway/request-handlers/system-tools-handler.js +228 -0
- package/dist/server/src/services/gateway/request-handlers/tools-handler.d.ts +11 -0
- package/dist/server/src/services/gateway/request-handlers/tools-handler.d.ts.map +1 -0
- package/dist/server/src/services/gateway/request-handlers/tools-handler.js +79 -0
- package/dist/server/src/services/gateway/tool-list-generator.d.ts +23 -0
- package/dist/server/src/services/gateway/tool-list-generator.d.ts.map +1 -0
- package/dist/server/src/services/gateway/tool-list-generator.js +115 -0
- package/dist/server/src/services/gateway/types.d.ts +27 -0
- package/dist/server/src/services/gateway/types.d.ts.map +1 -0
- package/dist/server/src/services/gateway/types.js +4 -0
- package/dist/server/src/services/gateway.service.d.ts +7 -0
- package/dist/server/src/services/gateway.service.d.ts.map +1 -0
- package/dist/server/src/services/gateway.service.js +6 -0
- package/dist/server/src/services/hub-manager.service.d.ts +299 -0
- package/dist/server/src/services/hub-manager.service.d.ts.map +1 -0
- package/dist/server/src/services/hub-manager.service.js +413 -0
- package/dist/server/src/services/hub-tools/index.d.ts +10 -0
- package/dist/server/src/services/hub-tools/index.d.ts.map +1 -0
- package/dist/server/src/services/hub-tools/index.js +6 -0
- package/dist/server/src/services/hub-tools/resource-generator.d.ts +63 -0
- package/dist/server/src/services/hub-tools/resource-generator.d.ts.map +1 -0
- package/dist/server/src/services/hub-tools/resource-generator.js +141 -0
- package/dist/server/src/services/hub-tools/server-selector.d.ts +63 -0
- package/dist/server/src/services/hub-tools/server-selector.d.ts.map +1 -0
- package/dist/server/src/services/hub-tools/server-selector.js +108 -0
- package/dist/server/src/services/hub-tools/system-tool-definitions.d.ts +47 -0
- package/dist/server/src/services/hub-tools/system-tool-definitions.d.ts.map +1 -0
- package/dist/server/src/services/hub-tools/system-tool-definitions.js +225 -0
- package/dist/server/src/services/hub-tools/tool-search.d.ts +85 -0
- package/dist/server/src/services/hub-tools/tool-search.d.ts.map +1 -0
- package/dist/server/src/services/hub-tools/tool-search.js +115 -0
- package/dist/server/src/services/hub-tools/types.d.ts +42 -0
- package/dist/server/src/services/hub-tools/types.d.ts.map +1 -0
- package/dist/server/src/services/hub-tools/types.js +1 -0
- package/dist/server/src/services/hub-tools.service.d.ts +235 -0
- package/dist/server/src/services/hub-tools.service.d.ts.map +1 -0
- package/dist/server/src/services/hub-tools.service.js +457 -0
- package/dist/server/src/services/log-storage.service.d.ts +177 -0
- package/dist/server/src/services/log-storage.service.d.ts.map +1 -0
- package/dist/server/src/services/log-storage.service.js +243 -0
- package/dist/server/src/services/mcp-connection-manager.d.ts +7 -0
- package/dist/server/src/services/mcp-connection-manager.d.ts.map +1 -0
- package/dist/server/src/services/mcp-connection-manager.js +6 -0
- package/dist/server/src/services/mcp-session-manager.d.ts +6 -0
- package/dist/server/src/services/mcp-session-manager.d.ts.map +1 -0
- package/dist/server/src/services/mcp-session-manager.js +4 -0
- package/dist/server/src/services/search/index.d.ts +5 -0
- package/dist/server/src/services/search/index.d.ts.map +1 -0
- package/dist/server/src/services/search/index.js +5 -0
- package/dist/server/src/services/search/search-cache.d.ts +132 -0
- package/dist/server/src/services/search/search-cache.d.ts.map +1 -0
- package/dist/server/src/services/search/search-cache.js +151 -0
- package/dist/server/src/services/search/search-core.service.d.ts +108 -0
- package/dist/server/src/services/search/search-core.service.d.ts.map +1 -0
- package/dist/server/src/services/search/search-core.service.js +187 -0
- package/dist/server/src/services/search/search-scorer.d.ts +54 -0
- package/dist/server/src/services/search/search-scorer.d.ts.map +1 -0
- package/dist/server/src/services/search/search-scorer.js +83 -0
- package/dist/server/src/services/search/types.d.ts +20 -0
- package/dist/server/src/services/search/types.d.ts.map +1 -0
- package/dist/server/src/services/search/types.js +1 -0
- package/dist/server/src/services/session/index.d.ts +6 -0
- package/dist/server/src/services/session/index.d.ts.map +1 -0
- package/dist/server/src/services/session/index.js +4 -0
- package/dist/server/src/services/session/session-manager.d.ts +352 -0
- package/dist/server/src/services/session/session-manager.d.ts.map +1 -0
- package/dist/server/src/services/session/session-manager.js +835 -0
- package/dist/server/src/services/session/types.d.ts +32 -0
- package/dist/server/src/services/session/types.d.ts.map +1 -0
- package/dist/server/src/services/session/types.js +1 -0
- package/dist/server/src/services/simple-search.service.d.ts +67 -0
- package/dist/server/src/services/simple-search.service.d.ts.map +1 -0
- package/dist/server/src/services/simple-search.service.js +82 -0
- package/dist/server/src/services/system-tool-handler.d.ts +10 -0
- package/dist/server/src/services/system-tool-handler.d.ts.map +1 -0
- package/dist/server/src/services/system-tool-handler.js +77 -0
- package/dist/server/src/utils/error-handler.d.ts +18 -0
- package/dist/server/src/utils/error-handler.d.ts.map +1 -0
- package/dist/server/src/utils/error-handler.js +59 -0
- package/dist/server/src/utils/format-utils.d.ts +23 -0
- package/dist/server/src/utils/format-utils.d.ts.map +1 -0
- package/dist/server/src/utils/format-utils.js +58 -0
- package/dist/server/src/utils/index.d.ts +2 -0
- package/dist/server/src/utils/index.d.ts.map +1 -0
- package/dist/server/src/utils/index.js +1 -0
- package/dist/server/src/utils/json-utils.d.ts +82 -0
- package/dist/server/src/utils/json-utils.d.ts.map +1 -0
- package/dist/server/src/utils/json-utils.js +204 -0
- package/dist/server/src/utils/log-rotator.d.ts +223 -0
- package/dist/server/src/utils/log-rotator.d.ts.map +1 -0
- package/dist/server/src/utils/log-rotator.js +306 -0
- package/dist/server/src/utils/logger/dev-logger.d.ts +39 -0
- package/dist/server/src/utils/logger/dev-logger.d.ts.map +1 -0
- package/dist/server/src/utils/logger/dev-logger.js +63 -0
- package/dist/server/src/utils/logger/index.d.ts +36 -0
- package/dist/server/src/utils/logger/index.d.ts.map +1 -0
- package/dist/server/src/utils/logger/index.js +46 -0
- package/dist/server/src/utils/logger/log-colors.d.ts +27 -0
- package/dist/server/src/utils/logger/log-colors.d.ts.map +1 -0
- package/dist/server/src/utils/logger/log-colors.js +41 -0
- package/dist/server/src/utils/logger/log-context.d.ts +13 -0
- package/dist/server/src/utils/logger/log-context.d.ts.map +1 -0
- package/dist/server/src/utils/logger/log-context.js +5 -0
- package/dist/server/src/utils/logger/log-formatter.d.ts +47 -0
- package/dist/server/src/utils/logger/log-formatter.d.ts.map +1 -0
- package/dist/server/src/utils/logger/log-formatter.js +150 -0
- package/dist/server/src/utils/logger/log-modules.d.ts +141 -0
- package/dist/server/src/utils/logger/log-modules.d.ts.map +1 -0
- package/dist/server/src/utils/logger/log-modules.js +81 -0
- package/dist/server/src/utils/logger/log-output.d.ts +68 -0
- package/dist/server/src/utils/logger/log-output.d.ts.map +1 -0
- package/dist/server/src/utils/logger/log-output.js +320 -0
- package/dist/server/src/utils/logger/logger.d.ts +190 -0
- package/dist/server/src/utils/logger/logger.d.ts.map +1 -0
- package/dist/server/src/utils/logger/logger.js +350 -0
- package/dist/server/src/utils/logger.d.ts +12 -0
- package/dist/server/src/utils/logger.d.ts.map +1 -0
- package/dist/server/src/utils/logger.js +12 -0
- package/dist/server/src/utils/mcp-error-handler.d.ts +162 -0
- package/dist/server/src/utils/mcp-error-handler.d.ts.map +1 -0
- package/dist/server/src/utils/mcp-error-handler.js +270 -0
- package/dist/server/src/utils/port-checker.d.ts +16 -0
- package/dist/server/src/utils/port-checker.d.ts.map +1 -0
- package/dist/server/src/utils/port-checker.js +242 -0
- package/dist/server/src/utils/request-context.d.ts +71 -0
- package/dist/server/src/utils/request-context.d.ts.map +1 -0
- package/dist/server/src/utils/request-context.js +73 -0
- package/dist/server/src/utils/tool-args-parser.d.ts +17 -0
- package/dist/server/src/utils/tool-args-parser.d.ts.map +1 -0
- package/dist/server/src/utils/tool-args-parser.js +34 -0
- package/dist/server/src/utils/transports/sse-transport.d.ts +104 -0
- package/dist/server/src/utils/transports/sse-transport.d.ts.map +1 -0
- package/dist/server/src/utils/transports/sse-transport.js +189 -0
- package/dist/server/src/utils/transports/stdio-transport.d.ts +122 -0
- package/dist/server/src/utils/transports/stdio-transport.d.ts.map +1 -0
- package/dist/server/src/utils/transports/stdio-transport.js +324 -0
- package/dist/server/src/utils/transports/streamable-http-transport.d.ts +146 -0
- package/dist/server/src/utils/transports/streamable-http-transport.d.ts.map +1 -0
- package/dist/server/src/utils/transports/streamable-http-transport.js +212 -0
- package/dist/server/src/utils/transports/transport-factory.d.ts +26 -0
- package/dist/server/src/utils/transports/transport-factory.d.ts.map +1 -0
- package/dist/server/src/utils/transports/transport-factory.js +104 -0
- package/dist/server/src/utils/transports/transport.interface.d.ts +35 -0
- package/dist/server/src/utils/transports/transport.interface.d.ts.map +1 -0
- package/dist/server/src/utils/transports/transport.interface.js +1 -0
- package/dist/server/tests/contract/mcp-protocol/initialize.test.d.ts +2 -0
- package/dist/server/tests/contract/mcp-protocol/initialize.test.d.ts.map +1 -0
- package/dist/server/tests/contract/mcp-protocol/initialize.test.js +103 -0
- package/dist/server/tests/contract/mcp-protocol/tools-call.test.d.ts +2 -0
- package/dist/server/tests/contract/mcp-protocol/tools-call.test.d.ts.map +1 -0
- package/dist/server/tests/contract/mcp-protocol/tools-call.test.js +181 -0
- package/dist/server/tests/contract/mcp-protocol/tools-list.test.d.ts +2 -0
- package/dist/server/tests/contract/mcp-protocol/tools-list.test.d.ts.map +1 -0
- package/dist/server/tests/contract/mcp-protocol/tools-list.test.js +155 -0
- package/dist/server/tests/evaluation/evaluation.test.d.ts +2 -0
- package/dist/server/tests/evaluation/evaluation.test.d.ts.map +1 -0
- package/dist/server/tests/evaluation/evaluation.test.js +102 -0
- package/dist/server/tests/helpers/sdk-test-helpers.d.ts +32 -0
- package/dist/server/tests/helpers/sdk-test-helpers.d.ts.map +1 -0
- package/dist/server/tests/helpers/sdk-test-helpers.js +82 -0
- package/dist/server/tests/integration/api/gateway.test.d.ts +2 -0
- package/dist/server/tests/integration/api/gateway.test.d.ts.map +1 -0
- package/dist/server/tests/integration/api/gateway.test.js +366 -0
- package/dist/server/tests/integration/gateway/fault-tolerance.test.d.ts +2 -0
- package/dist/server/tests/integration/gateway/fault-tolerance.test.d.ts.map +1 -0
- package/dist/server/tests/integration/gateway/fault-tolerance.test.js +109 -0
- package/dist/server/tests/integration/gateway/mcp-connection.test.d.ts +2 -0
- package/dist/server/tests/integration/gateway/mcp-connection.test.d.ts.map +1 -0
- package/dist/server/tests/integration/gateway/mcp-connection.test.js +149 -0
- package/dist/server/tests/server.test.d.ts +2 -0
- package/dist/server/tests/server.test.d.ts.map +1 -0
- package/dist/server/tests/server.test.js +95 -0
- package/dist/server/tests/setup.d.ts +7 -0
- package/dist/server/tests/setup.d.ts.map +1 -0
- package/dist/server/tests/setup.js +53 -0
- package/dist/server/tests/types/logger-test-helpers.d.ts +17 -0
- package/dist/server/tests/types/logger-test-helpers.d.ts.map +1 -0
- package/dist/server/tests/types/logger-test-helpers.js +4 -0
- package/dist/server/tests/types/test-helpers.d.ts +27 -0
- package/dist/server/tests/types/test-helpers.d.ts.map +1 -0
- package/dist/server/tests/types/test-helpers.js +4 -0
- package/dist/server/tests/unit/cli/basic-cli.test.d.ts +2 -0
- package/dist/server/tests/unit/cli/basic-cli.test.d.ts.map +1 -0
- package/dist/server/tests/unit/cli/basic-cli.test.js +33 -0
- package/dist/server/tests/unit/cli/cli.test.d.ts +2 -0
- package/dist/server/tests/unit/cli/cli.test.d.ts.map +1 -0
- package/dist/server/tests/unit/cli/cli.test.js +17 -0
- package/dist/server/tests/unit/cli/commands.test.d.ts +2 -0
- package/dist/server/tests/unit/cli/commands.test.d.ts.map +1 -0
- package/dist/server/tests/unit/cli/commands.test.js +75 -0
- package/dist/server/tests/unit/cli/server.test.d.ts +2 -0
- package/dist/server/tests/unit/cli/server.test.d.ts.map +1 -0
- package/dist/server/tests/unit/cli/server.test.js +68 -0
- package/dist/server/tests/unit/server/runner.test.d.ts +2 -0
- package/dist/server/tests/unit/server/runner.test.d.ts.map +1 -0
- package/dist/server/tests/unit/server/runner.test.js +488 -0
- package/dist/server/tests/unit/server/setup.d.ts +2 -0
- package/dist/server/tests/unit/server/setup.d.ts.map +1 -0
- package/dist/server/tests/unit/server/setup.js +21 -0
- package/dist/server/tests/unit/services/gateway-logging.test.d.ts +2 -0
- package/dist/server/tests/unit/services/gateway-logging.test.d.ts.map +1 -0
- package/dist/server/tests/unit/services/gateway-logging.test.js +47 -0
- package/dist/server/tests/unit/services/hub-manager-service.test.d.ts +2 -0
- package/dist/server/tests/unit/services/hub-manager-service.test.d.ts.map +1 -0
- package/dist/server/tests/unit/services/hub-manager-service.test.js +140 -0
- package/dist/server/tests/unit/services/hub-manager.test.d.ts +2 -0
- package/dist/server/tests/unit/services/hub-manager.test.d.ts.map +1 -0
- package/dist/server/tests/unit/services/hub-manager.test.js +98 -0
- package/dist/server/tests/unit/services/hub-tools.service.test.d.ts +2 -0
- package/dist/server/tests/unit/services/hub-tools.service.test.d.ts.map +1 -0
- package/dist/server/tests/unit/services/hub-tools.service.test.js +674 -0
- package/dist/server/tests/unit/services/search/search-cache.test.d.ts +2 -0
- package/dist/server/tests/unit/services/search/search-cache.test.d.ts.map +1 -0
- package/dist/server/tests/unit/services/search/search-cache.test.js +58 -0
- package/dist/server/tests/unit/services/search/search-core.service.test.d.ts +2 -0
- package/dist/server/tests/unit/services/search/search-core.service.test.d.ts.map +1 -0
- package/dist/server/tests/unit/services/search/search-core.service.test.js +84 -0
- package/dist/server/tests/unit/services/search/search-scorer.test.d.ts +2 -0
- package/dist/server/tests/unit/services/search/search-scorer.test.d.ts.map +1 -0
- package/dist/server/tests/unit/services/search/search-scorer.test.js +97 -0
- package/dist/server/tests/unit/services/session-manager.test.d.ts +2 -0
- package/dist/server/tests/unit/services/session-manager.test.d.ts.map +1 -0
- package/dist/server/tests/unit/services/session-manager.test.js +481 -0
- package/dist/server/tests/unit/utils/config.test.d.ts +2 -0
- package/dist/server/tests/unit/utils/config.test.d.ts.map +1 -0
- package/dist/server/tests/unit/utils/config.test.js +634 -0
- package/dist/server/tests/unit/utils/json-utils.test.d.ts +2 -0
- package/dist/server/tests/unit/utils/json-utils.test.d.ts.map +1 -0
- package/dist/server/tests/unit/utils/json-utils.test.js +296 -0
- package/dist/server/tests/unit/utils/log-rotator.test.d.ts +2 -0
- package/dist/server/tests/unit/utils/log-rotator.test.d.ts.map +1 -0
- package/dist/server/tests/unit/utils/log-rotator.test.js +296 -0
- package/dist/server/tests/unit/utils/logger.test.d.ts +2 -0
- package/dist/server/tests/unit/utils/logger.test.d.ts.map +1 -0
- package/dist/server/tests/unit/utils/logger.test.js +462 -0
- package/dist/server/tests/unit/utils/mcp-error-handler.test.d.ts +2 -0
- package/dist/server/tests/unit/utils/mcp-error-handler.test.d.ts.map +1 -0
- package/dist/server/tests/unit/utils/mcp-error-handler.test.js +163 -0
- package/dist/server/tests/unit/utils/request-context.test.d.ts +2 -0
- package/dist/server/tests/unit/utils/request-context.test.d.ts.map +1 -0
- package/dist/server/tests/unit/utils/request-context.test.js +82 -0
- package/dist/server/vite.config.d.ts +3 -0
- package/dist/server/vite.config.d.ts.map +1 -0
- package/dist/server/vite.config.js +160 -0
- package/dist/server/vitest.config.d.ts +3 -0
- package/dist/server/vitest.config.d.ts.map +1 -0
- package/dist/server/vitest.config.js +53 -0
- package/package.json +113 -0
|
@@ -0,0 +1,929 @@
|
|
|
1
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
2
|
+
import { TransportFactory } from '../../utils/transports/transport-factory.js';
|
|
3
|
+
import { logger, LOG_MODULES, formatMcpMessageForLogging, logNotificationMessage } from '../../utils/logger.js';
|
|
4
|
+
import { getMcpCommDebugSetting } from '../../utils/json-utils.js';
|
|
5
|
+
import { logStorage } from '../log-storage.service.js';
|
|
6
|
+
import { eventBus, EventTypes } from '../event-bus.service.js';
|
|
7
|
+
import { hubManager } from '../hub-manager.service.js';
|
|
8
|
+
import { MCP_HUB_LITE_SERVER } from '../../models/system-tools.constants.js';
|
|
9
|
+
import { ToolCache } from './tool-cache.js';
|
|
10
|
+
/**
|
|
11
|
+
* Manages MCP (Model Context Protocol) server connections and provides a unified interface
|
|
12
|
+
* for tool and resource operations across multiple connected servers.
|
|
13
|
+
*
|
|
14
|
+
* This service handles the complete lifecycle of MCP server connections including:
|
|
15
|
+
* - Establishing connections via various transport protocols (stdio, SSE, HTTP)
|
|
16
|
+
* - Managing client instances and transport layers
|
|
17
|
+
* - Caching tools and resources for performance optimization
|
|
18
|
+
* - Providing both server ID-based and server name-based access patterns
|
|
19
|
+
* - Handling connection events and error recovery
|
|
20
|
+
* - Supporting bidirectional communication for tool execution
|
|
21
|
+
*
|
|
22
|
+
* The manager uses ToolCache for both server ID-level and server name-level
|
|
23
|
+
* operations to optimize different access patterns while ensuring data consistency.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```typescript
|
|
27
|
+
* const manager = new McpConnectionManager();
|
|
28
|
+
* await manager.connect(serverConfig);
|
|
29
|
+
* const tools = await manager.getTools(serverId);
|
|
30
|
+
* const result = await manager.callTool(serverId, 'tool-name', { param: 'value' });
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export class McpConnectionManager {
|
|
34
|
+
clients = new Map();
|
|
35
|
+
transports = new Map();
|
|
36
|
+
serverStatus = new Map();
|
|
37
|
+
_toolCache = new ToolCache();
|
|
38
|
+
resourceCache = new Map();
|
|
39
|
+
constructor() {
|
|
40
|
+
// Listen for server deletion events and automatically disconnect
|
|
41
|
+
eventBus.subscribe(EventTypes.SERVER_DELETED, (data) => {
|
|
42
|
+
const serverName = data;
|
|
43
|
+
// Find all instances by server name and disconnect them
|
|
44
|
+
const serverInstances = hubManager.getServerInstanceByName(serverName);
|
|
45
|
+
serverInstances.forEach((instance) => {
|
|
46
|
+
this.disconnect(instance.id).catch((err) => {
|
|
47
|
+
logger.warn(`Failed to disconnect deleted server instance ${instance.id}:`, err, LOG_MODULES.CONNECTION_MANAGER);
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Establishes a connection to an MCP server using the specified configuration.
|
|
54
|
+
*
|
|
55
|
+
* This method handles the complete connection process including transport creation,
|
|
56
|
+
* client initialization, validation, and automatic tool/resource discovery.
|
|
57
|
+
* It supports multiple transport protocols (stdio, SSE, streamable-http, http)
|
|
58
|
+
* and provides comprehensive error handling with proper status tracking.
|
|
59
|
+
*
|
|
60
|
+
* For bidirectional transports (stdio, streamable-http, http), it automatically
|
|
61
|
+
* fetches and caches available tools and resources upon successful connection.
|
|
62
|
+
* SSE transports are unidirectional and skip this step for performance reasons.
|
|
63
|
+
*
|
|
64
|
+
* The method publishes SERVER_CONNECTED and SERVER_STATUS_CHANGE events upon
|
|
65
|
+
* successful connection, and SERVER_STATUS_CHANGE events with error details
|
|
66
|
+
* on failure.
|
|
67
|
+
*
|
|
68
|
+
* @param {ServerConfig & ServerInstanceConfig} server - Server configuration containing
|
|
69
|
+
* connection details, transport type, and instance-specific parameters
|
|
70
|
+
* @returns {Promise<boolean>} True if connection succeeds, false if it fails
|
|
71
|
+
* @throws {Error} If server ID is missing or required configuration is invalid
|
|
72
|
+
*
|
|
73
|
+
* @example
|
|
74
|
+
* ```typescript
|
|
75
|
+
* const serverConfig = {
|
|
76
|
+
* id: 'my-server-1',
|
|
77
|
+
* type: 'stdio' as const,
|
|
78
|
+
* command: 'npx my-mcp-server',
|
|
79
|
+
* name: 'My MCP Server'
|
|
80
|
+
* };
|
|
81
|
+
* const success = await manager.connect(serverConfig);
|
|
82
|
+
* if (success) {
|
|
83
|
+
* console.log('Connected successfully');
|
|
84
|
+
* }
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
async connect(server) {
|
|
88
|
+
let serverInfo;
|
|
89
|
+
try {
|
|
90
|
+
logger.info(`Connecting to server [${server.id || 'unknown'}]...`, LOG_MODULES.CONNECTION_MANAGER);
|
|
91
|
+
// Validate server configuration
|
|
92
|
+
if (!server.id) {
|
|
93
|
+
throw new Error('Server ID is required');
|
|
94
|
+
}
|
|
95
|
+
// First set starting state (connected: false, no error)
|
|
96
|
+
this.serverStatus.set(server.id, {
|
|
97
|
+
connected: false,
|
|
98
|
+
lastCheck: Date.now(),
|
|
99
|
+
toolsCount: 0,
|
|
100
|
+
resourcesCount: 0
|
|
101
|
+
});
|
|
102
|
+
// Get server name from server instance ID (via hubManager.getServerById)
|
|
103
|
+
serverInfo = hubManager.getServerById(server.id);
|
|
104
|
+
if (!serverInfo) {
|
|
105
|
+
throw new Error(`Server not found for instance: ${server.id}`);
|
|
106
|
+
}
|
|
107
|
+
if (server.type === 'stdio' && (!server.command || server.command.trim() === '')) {
|
|
108
|
+
throw new Error('STDIO server requires a valid command');
|
|
109
|
+
}
|
|
110
|
+
if ((server.type === 'sse' || server.type === 'streamable-http' || server.type === 'http') &&
|
|
111
|
+
(!server.url || server.url.trim() === '')) {
|
|
112
|
+
const displayType = server.type === 'http' ? 'streamable-http' : server.type;
|
|
113
|
+
throw new Error(`${displayType.toUpperCase()} server requires a valid URL`);
|
|
114
|
+
}
|
|
115
|
+
// Create transport based on server type
|
|
116
|
+
const serverName = serverInfo.name;
|
|
117
|
+
const transport = TransportFactory.createTransport({
|
|
118
|
+
...server,
|
|
119
|
+
name: serverName
|
|
120
|
+
}, server.id);
|
|
121
|
+
// Always set up message handler for notifications/message
|
|
122
|
+
transport.onmessage = (message) => {
|
|
123
|
+
// Communication debug logs: controlled by MCP_COMM_DEBUG environment variable
|
|
124
|
+
if (getMcpCommDebugSetting()) {
|
|
125
|
+
const logMessage = formatMcpMessageForLogging(message);
|
|
126
|
+
logger.debug(`MCP message received: ${logMessage}`, LOG_MODULES.CONNECTION_MANAGER);
|
|
127
|
+
}
|
|
128
|
+
// Log notifications/message to application logs (always enabled)
|
|
129
|
+
logNotificationMessage(message, serverName, server.id);
|
|
130
|
+
};
|
|
131
|
+
// Wrap send method for debug logging (if enabled)
|
|
132
|
+
if (getMcpCommDebugSetting()) {
|
|
133
|
+
const originalSend = transport.send;
|
|
134
|
+
transport.send = async (message, options) => {
|
|
135
|
+
try {
|
|
136
|
+
const logMessage = formatMcpMessageForLogging(message);
|
|
137
|
+
logger.debug(`MCP message sent: ${logMessage}`, LOG_MODULES.CONNECTION_MANAGER);
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
logger.debug(`MCP message sent: [Error formatting response]`, LOG_MODULES.CONNECTION_MANAGER);
|
|
141
|
+
}
|
|
142
|
+
// Call original send method
|
|
143
|
+
return await originalSend.call(transport, message, options);
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
// Handle transport close events
|
|
147
|
+
if ('onclose' in transport) {
|
|
148
|
+
transport.onclose = () => {
|
|
149
|
+
logger.info(`Transport closed for server [${server.id}]`, LOG_MODULES.CONNECTION_MANAGER);
|
|
150
|
+
const currentStatus = this.serverStatus.get(server.id);
|
|
151
|
+
// Only update status if it was previously connected or starting
|
|
152
|
+
if (currentStatus && (currentStatus.connected || !currentStatus.error)) {
|
|
153
|
+
this.serverStatus.set(server.id, {
|
|
154
|
+
connected: false,
|
|
155
|
+
lastCheck: Date.now(),
|
|
156
|
+
toolsCount: 0,
|
|
157
|
+
resourcesCount: 0,
|
|
158
|
+
error: 'Connection closed unexpectedly'
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
// Add log listeners
|
|
164
|
+
if ('onstdout' in transport) {
|
|
165
|
+
transport.onstdout = (data) => {
|
|
166
|
+
// Skip JSON-RPC communication to avoid log noise
|
|
167
|
+
const trimmedData = data.trim();
|
|
168
|
+
if (trimmedData) {
|
|
169
|
+
// Check if it's a valid JSON-RPC message
|
|
170
|
+
let isJsonRpc = false;
|
|
171
|
+
if (trimmedData.startsWith('{')) {
|
|
172
|
+
try {
|
|
173
|
+
const parsed = JSON.parse(trimmedData);
|
|
174
|
+
// Only consider it JSON-RPC if it has valid jsonrpc field
|
|
175
|
+
isJsonRpc =
|
|
176
|
+
typeof parsed.jsonrpc === 'string' &&
|
|
177
|
+
(parsed.jsonrpc === '2.0' || parsed.jsonrpc === '1.0');
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
// Not valid JSON, treat as log output
|
|
181
|
+
isJsonRpc = false;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
if (!isJsonRpc) {
|
|
185
|
+
// Use server ID and name for log storage
|
|
186
|
+
const serverId = server?.id ?? 'unknown';
|
|
187
|
+
logStorage.append(serverId, 'info', `[${serverName}] [STDOUT] ${data}`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
if ('onstderr' in transport) {
|
|
193
|
+
transport.onstderr = (data) => {
|
|
194
|
+
// Use server ID and name for log storage
|
|
195
|
+
const serverId = server?.id ?? 'unknown';
|
|
196
|
+
logStorage.append(serverId, 'error', `[${serverName}] [STDERR] ${data}`);
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
const client = new Client({
|
|
200
|
+
name: MCP_HUB_LITE_SERVER,
|
|
201
|
+
version: '1.0.0'
|
|
202
|
+
}, {
|
|
203
|
+
capabilities: {}
|
|
204
|
+
});
|
|
205
|
+
await client.connect(transport);
|
|
206
|
+
this.clients.set(server.id, client);
|
|
207
|
+
this.transports.set(server.id, transport);
|
|
208
|
+
this._toolCache.setNameMapping(serverInfo.name, server.id);
|
|
209
|
+
// Get PID if available (only for stdio transport)
|
|
210
|
+
let pid;
|
|
211
|
+
if ('pid' in transport && typeof transport.pid === 'number') {
|
|
212
|
+
pid = transport.pid;
|
|
213
|
+
}
|
|
214
|
+
// Get server version
|
|
215
|
+
const clientServerInfo = client.getServerVersion();
|
|
216
|
+
const serverVersion = clientServerInfo?.version || clientServerInfo?.name;
|
|
217
|
+
// Update server instance info (merge pid and startTime)
|
|
218
|
+
const instances = hubManager.getServerInstanceByName(serverName);
|
|
219
|
+
const instanceIndex = instances.findIndex((inst) => inst.id === server.id);
|
|
220
|
+
if (instanceIndex !== -1) {
|
|
221
|
+
hubManager.updateServerInstance(serverName, instanceIndex, {
|
|
222
|
+
pid: pid,
|
|
223
|
+
startTime: Date.now() // Startup time is the same as timestamp
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
this.serverStatus.set(server.id, {
|
|
227
|
+
connected: true,
|
|
228
|
+
lastCheck: Date.now(),
|
|
229
|
+
toolsCount: 0,
|
|
230
|
+
resourcesCount: 0,
|
|
231
|
+
pid: pid,
|
|
232
|
+
startTime: Date.now(),
|
|
233
|
+
version: serverVersion,
|
|
234
|
+
hash: server.hash
|
|
235
|
+
});
|
|
236
|
+
logger.info(`Connected to server [${server.id}]`, LOG_MODULES.CONNECTION_MANAGER);
|
|
237
|
+
// Publish server connected event
|
|
238
|
+
eventBus.publish(EventTypes.SERVER_CONNECTED, {
|
|
239
|
+
serverId: server.id,
|
|
240
|
+
status: 'online',
|
|
241
|
+
timestamp: Date.now()
|
|
242
|
+
});
|
|
243
|
+
// Publish server status change event
|
|
244
|
+
eventBus.publish(EventTypes.SERVER_STATUS_CHANGE, {
|
|
245
|
+
serverId: server.id,
|
|
246
|
+
status: 'online',
|
|
247
|
+
timestamp: Date.now()
|
|
248
|
+
});
|
|
249
|
+
// Fetch tools and resources immediately (only for bidirectional transports)
|
|
250
|
+
if (server.type !== 'sse') {
|
|
251
|
+
const tools = await this.refreshTools(server.id);
|
|
252
|
+
const resources = await this.refreshResources(server.id);
|
|
253
|
+
// Publish tools and resources updated event
|
|
254
|
+
eventBus.publish(EventTypes.TOOLS_UPDATED, {
|
|
255
|
+
serverId: server.id,
|
|
256
|
+
tools
|
|
257
|
+
});
|
|
258
|
+
eventBus.publish(EventTypes.RESOURCES_UPDATED, {
|
|
259
|
+
serverId: server.id,
|
|
260
|
+
resources
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
logger.info('SSE transport is unidirectional, skipping tool/resource refresh', LOG_MODULES.CONNECTION_MANAGER);
|
|
265
|
+
}
|
|
266
|
+
return true;
|
|
267
|
+
}
|
|
268
|
+
catch (error) {
|
|
269
|
+
logger.error(`Failed to connect to server ${serverInfo?.name || server.id || 'unknown'}:`, error, LOG_MODULES.CONNECTION_MANAGER);
|
|
270
|
+
const serverId = server.id || 'unknown';
|
|
271
|
+
this.serverStatus.set(serverId, {
|
|
272
|
+
connected: false,
|
|
273
|
+
error: error instanceof Error ? error.message : String(error),
|
|
274
|
+
lastCheck: Date.now(),
|
|
275
|
+
toolsCount: 0,
|
|
276
|
+
resourcesCount: 0
|
|
277
|
+
});
|
|
278
|
+
// Publish server status change event (error state)
|
|
279
|
+
eventBus.publish(EventTypes.SERVER_STATUS_CHANGE, {
|
|
280
|
+
serverId,
|
|
281
|
+
status: 'error',
|
|
282
|
+
error: error instanceof Error ? error.message : String(error),
|
|
283
|
+
timestamp: Date.now()
|
|
284
|
+
});
|
|
285
|
+
return false;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Disconnects from an MCP server and cleans up all associated resources.
|
|
290
|
+
*
|
|
291
|
+
* This method performs a graceful shutdown by closing the client connection,
|
|
292
|
+
* closing the transport layer, and removing all cached data including tools,
|
|
293
|
+
* resources, and status information. It also updates the server name-level
|
|
294
|
+
* tool cache to maintain consistency across multiple instances of the same server.
|
|
295
|
+
*
|
|
296
|
+
* The method publishes SERVER_DISCONNECTED and SERVER_STATUS_CHANGE events
|
|
297
|
+
* upon completion and handles any errors during the disconnection process
|
|
298
|
+
* without throwing exceptions.
|
|
299
|
+
*
|
|
300
|
+
* @param {string} serverId - Unique identifier of the server instance to disconnect
|
|
301
|
+
* @returns {Promise<void>} Resolves when disconnection is complete
|
|
302
|
+
*
|
|
303
|
+
* @example
|
|
304
|
+
* ```typescript
|
|
305
|
+
* await manager.disconnect('my-server-1');
|
|
306
|
+
* console.log('Server disconnected');
|
|
307
|
+
* ```
|
|
308
|
+
*/
|
|
309
|
+
async disconnect(serverId) {
|
|
310
|
+
logger.info(`Disconnecting from server [${serverId}]...`, LOG_MODULES.CONNECTION_MANAGER);
|
|
311
|
+
const client = this.clients.get(serverId);
|
|
312
|
+
const transport = this.transports.get(serverId);
|
|
313
|
+
try {
|
|
314
|
+
if (client) {
|
|
315
|
+
try {
|
|
316
|
+
await client.close();
|
|
317
|
+
}
|
|
318
|
+
catch (e) {
|
|
319
|
+
logger.warn(`Error closing client for [${serverId}]:`, e, LOG_MODULES.CONNECTION_MANAGER);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
if (transport && typeof transport.close === 'function') {
|
|
323
|
+
await transport.close();
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
catch (error) {
|
|
327
|
+
logger.error(`Error disconnecting server [${serverId}]:`, error, LOG_MODULES.CONNECTION_MANAGER);
|
|
328
|
+
}
|
|
329
|
+
finally {
|
|
330
|
+
this.clients.delete(serverId);
|
|
331
|
+
this.transports.delete(serverId);
|
|
332
|
+
this._toolCache.clearTools(serverId);
|
|
333
|
+
this.resourceCache.delete(serverId);
|
|
334
|
+
this._toolCache.removeNameMappingById(serverId);
|
|
335
|
+
this.serverStatus.set(serverId, {
|
|
336
|
+
connected: false,
|
|
337
|
+
lastCheck: Date.now(),
|
|
338
|
+
toolsCount: 0,
|
|
339
|
+
resourcesCount: 0
|
|
340
|
+
});
|
|
341
|
+
// Publish server disconnected event
|
|
342
|
+
eventBus.publish(EventTypes.SERVER_DISCONNECTED, {
|
|
343
|
+
serverId,
|
|
344
|
+
status: 'offline',
|
|
345
|
+
timestamp: Date.now()
|
|
346
|
+
});
|
|
347
|
+
// Publish server status change event
|
|
348
|
+
eventBus.publish(EventTypes.SERVER_STATUS_CHANGE, {
|
|
349
|
+
serverId,
|
|
350
|
+
status: 'offline',
|
|
351
|
+
timestamp: Date.now()
|
|
352
|
+
});
|
|
353
|
+
logger.info(`Disconnected from server [${serverId}]`, LOG_MODULES.CONNECTION_MANAGER);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Disconnects from all currently connected MCP servers concurrently.
|
|
358
|
+
*
|
|
359
|
+
* This method iterates through all active client connections and calls
|
|
360
|
+
* disconnect() on each one, handling errors individually to ensure
|
|
361
|
+
* that failure to disconnect from one server doesn't prevent disconnection
|
|
362
|
+
* from others. All disconnections are performed in parallel for efficiency.
|
|
363
|
+
*
|
|
364
|
+
* @returns {Promise<void>} Resolves when all disconnection attempts complete
|
|
365
|
+
*
|
|
366
|
+
* @example
|
|
367
|
+
* ```typescript
|
|
368
|
+
* await manager.disconnectAll();
|
|
369
|
+
* console.log('All servers disconnected');
|
|
370
|
+
* ```
|
|
371
|
+
*/
|
|
372
|
+
async disconnectAll() {
|
|
373
|
+
logger.info('Disconnecting all servers...', LOG_MODULES.CONNECTION_MANAGER);
|
|
374
|
+
const serverIds = Array.from(this.clients.keys());
|
|
375
|
+
logger.info(`Found ${serverIds.length} connected server(s)`, LOG_MODULES.CONNECTION_MANAGER);
|
|
376
|
+
const disconnectPromises = serverIds.map(async (id) => {
|
|
377
|
+
logger.info(`Disconnecting server [${id}]...`, LOG_MODULES.CONNECTION_MANAGER);
|
|
378
|
+
try {
|
|
379
|
+
await this.disconnect(id);
|
|
380
|
+
logger.info(`Successfully disconnected server [${id}]`, LOG_MODULES.CONNECTION_MANAGER);
|
|
381
|
+
}
|
|
382
|
+
catch (error) {
|
|
383
|
+
logger.error(`Failed to disconnect server [${id}]:`, error, LOG_MODULES.CONNECTION_MANAGER);
|
|
384
|
+
}
|
|
385
|
+
});
|
|
386
|
+
await Promise.all(disconnectPromises);
|
|
387
|
+
logger.info('All servers disconnected', LOG_MODULES.CONNECTION_MANAGER);
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Refreshes the tool cache for a specific server by fetching the latest tool list.
|
|
391
|
+
*
|
|
392
|
+
* This method queries the connected MCP server for its current set of available tools,
|
|
393
|
+
* updates both the server ID-level and server name-level caches, and maintains
|
|
394
|
+
* accurate tool counts in the server status. It handles server name resolution
|
|
395
|
+
* to ensure proper caching across multiple instances of the same server.
|
|
396
|
+
*
|
|
397
|
+
* @param {string} serverId - Unique identifier of the server instance to refresh
|
|
398
|
+
* @returns {Promise<Tool[]>} Array of updated tools with server context
|
|
399
|
+
* @throws {Error} If the server is not connected or tool listing fails
|
|
400
|
+
*
|
|
401
|
+
* @example
|
|
402
|
+
* ```typescript
|
|
403
|
+
* const tools = await manager.refreshTools('my-server-1');
|
|
404
|
+
* console.log(`Found ${tools.length} tools`);
|
|
405
|
+
* ```
|
|
406
|
+
*/
|
|
407
|
+
async refreshTools(serverId) {
|
|
408
|
+
const client = this.clients.get(serverId);
|
|
409
|
+
if (!client) {
|
|
410
|
+
throw new Error(`Server ${serverId} not connected`);
|
|
411
|
+
}
|
|
412
|
+
try {
|
|
413
|
+
const result = await client.listTools();
|
|
414
|
+
const serverName = this._toolCache.getServerNameById(serverId);
|
|
415
|
+
const tools = result.tools.map((t) => ({
|
|
416
|
+
name: t.name,
|
|
417
|
+
description: t.description,
|
|
418
|
+
inputSchema: t.inputSchema,
|
|
419
|
+
serverName: serverName
|
|
420
|
+
}));
|
|
421
|
+
this._toolCache.setTools(serverId, tools, serverName !== 'unknown' ? serverName : undefined);
|
|
422
|
+
// Update status
|
|
423
|
+
const status = this.serverStatus.get(serverId);
|
|
424
|
+
if (status) {
|
|
425
|
+
status.toolsCount = tools.length;
|
|
426
|
+
status.lastCheck = Date.now();
|
|
427
|
+
}
|
|
428
|
+
logger.info(`Refreshed tools for server [${serverId}]: ${tools.length} tools found`, LOG_MODULES.CONNECTION_MANAGER);
|
|
429
|
+
return tools;
|
|
430
|
+
}
|
|
431
|
+
catch (error) {
|
|
432
|
+
logger.error(`Failed to list tools for server [${serverId}]:`, error, LOG_MODULES.CONNECTION_MANAGER);
|
|
433
|
+
throw error;
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
/**
|
|
437
|
+
* Refreshes the resource cache for a specific server by fetching available resources.
|
|
438
|
+
*
|
|
439
|
+
* This method queries the connected MCP server for its current set of available resources,
|
|
440
|
+
* handling servers that don't support the resources functionality gracefully by returning
|
|
441
|
+
* an empty array. It updates the resource cache and maintains accurate resource counts
|
|
442
|
+
* in the server status.
|
|
443
|
+
*
|
|
444
|
+
* The method specifically handles "Method not found" errors (MCP error code -32601)
|
|
445
|
+
* which indicate that the server doesn't implement the resources protocol, treating
|
|
446
|
+
* this as a normal case rather than an error.
|
|
447
|
+
*
|
|
448
|
+
* @param {string} serverId - Unique identifier of the server instance to refresh
|
|
449
|
+
* @returns {Promise<Resource[]>} Array of available resources, empty if unsupported
|
|
450
|
+
* @throws {Error} If the server is not connected or resource listing fails unexpectedly
|
|
451
|
+
*
|
|
452
|
+
* @example
|
|
453
|
+
* ```typescript
|
|
454
|
+
* const resources = await manager.refreshResources('my-server-1');
|
|
455
|
+
* console.log(`Found ${resources.length} resources`);
|
|
456
|
+
* ```
|
|
457
|
+
*/
|
|
458
|
+
async refreshResources(serverId) {
|
|
459
|
+
const client = this.clients.get(serverId);
|
|
460
|
+
if (!client) {
|
|
461
|
+
throw new Error(`Server ${serverId} not connected`);
|
|
462
|
+
}
|
|
463
|
+
try {
|
|
464
|
+
// Check if client actually supports listResources method
|
|
465
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
466
|
+
if (typeof client.listResources !== 'function') {
|
|
467
|
+
logger.warn(`Server [${serverId}] does not support resources listing`, LOG_MODULES.CONNECTION_MANAGER);
|
|
468
|
+
return [];
|
|
469
|
+
}
|
|
470
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
471
|
+
const result = await client.listResources();
|
|
472
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
473
|
+
const resources = result.resources.map((r) => ({
|
|
474
|
+
name: r.name,
|
|
475
|
+
uri: r.uri,
|
|
476
|
+
mimeType: r.mimeType,
|
|
477
|
+
description: r.description
|
|
478
|
+
}));
|
|
479
|
+
this.resourceCache.set(serverId, resources);
|
|
480
|
+
// Update status
|
|
481
|
+
const status = this.serverStatus.get(serverId);
|
|
482
|
+
if (status) {
|
|
483
|
+
status.resourcesCount = resources.length;
|
|
484
|
+
status.lastCheck = Date.now();
|
|
485
|
+
}
|
|
486
|
+
logger.info(`Refreshed resources for server [${serverId}]: ${resources.length} resources found`, LOG_MODULES.CONNECTION_MANAGER);
|
|
487
|
+
return resources;
|
|
488
|
+
}
|
|
489
|
+
catch (error) {
|
|
490
|
+
// Check if error is "Method not found" (MCP error -32601), which means server doesn't implement resources
|
|
491
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
492
|
+
if (error && typeof error === 'object' && 'code' in error && error.code === -32601) {
|
|
493
|
+
logger.info(`Server [${serverId}] does not support resources functionality`, LOG_MODULES.CONNECTION_MANAGER);
|
|
494
|
+
}
|
|
495
|
+
else if (error &&
|
|
496
|
+
typeof error === 'object' &&
|
|
497
|
+
'message' in error &&
|
|
498
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
499
|
+
typeof error.message === 'string' &&
|
|
500
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
501
|
+
error.message.includes('Method not found')) {
|
|
502
|
+
logger.info(`Server [${serverId}] does not support resources functionality`, LOG_MODULES.CONNECTION_MANAGER);
|
|
503
|
+
}
|
|
504
|
+
else {
|
|
505
|
+
logger.warn(`Failed to list resources for server [${serverId}]:`, error, LOG_MODULES.CONNECTION_MANAGER);
|
|
506
|
+
}
|
|
507
|
+
// Even if server doesn't support resources, store empty array in cache to ensure subsequent calls hit cache
|
|
508
|
+
this.resourceCache.set(serverId, []);
|
|
509
|
+
// Update server status
|
|
510
|
+
const status = this.serverStatus.get(serverId);
|
|
511
|
+
if (status) {
|
|
512
|
+
status.resourcesCount = 0;
|
|
513
|
+
status.lastCheck = Date.now();
|
|
514
|
+
}
|
|
515
|
+
return [];
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
/**
|
|
519
|
+
* Retrieves the current connection status for a specific server instance.
|
|
520
|
+
*
|
|
521
|
+
* This method provides access to the server's operational state including connection
|
|
522
|
+
* status, error information, tool/resource counts, and process details.
|
|
523
|
+
*
|
|
524
|
+
* @param {string} serverId - Unique identifier of the server instance
|
|
525
|
+
* @returns {ServerStatus | undefined} Current status object or undefined if not found
|
|
526
|
+
*
|
|
527
|
+
* @example
|
|
528
|
+
* ```typescript
|
|
529
|
+
* const status = manager.getStatus('my-server-1');
|
|
530
|
+
* if (status?.connected) {
|
|
531
|
+
* console.log('Server is connected');
|
|
532
|
+
* }
|
|
533
|
+
* ```
|
|
534
|
+
*/
|
|
535
|
+
getStatus(serverId) {
|
|
536
|
+
return this.serverStatus.get(serverId);
|
|
537
|
+
}
|
|
538
|
+
/**
|
|
539
|
+
* Retrieves cached tools for a specific server instance.
|
|
540
|
+
*
|
|
541
|
+
* This method returns the currently cached tool list for the specified server,
|
|
542
|
+
* which may be empty if tools haven't been refreshed yet or if the server
|
|
543
|
+
* doesn't provide any tools. The method includes logging for debugging purposes.
|
|
544
|
+
*
|
|
545
|
+
* @param {string} serverId - Unique identifier of the server instance
|
|
546
|
+
* @returns {Tool[]} Array of cached tools, empty if none available
|
|
547
|
+
*
|
|
548
|
+
* @example
|
|
549
|
+
* ```typescript
|
|
550
|
+
* const tools = manager.getTools('my-server-1');
|
|
551
|
+
* console.log(`Server has ${tools.length} tools`);
|
|
552
|
+
* ```
|
|
553
|
+
*/
|
|
554
|
+
getTools(serverId) {
|
|
555
|
+
return this._toolCache.getTools(serverId);
|
|
556
|
+
}
|
|
557
|
+
/**
|
|
558
|
+
* Retrieves cached resources for a specific server instance.
|
|
559
|
+
*
|
|
560
|
+
* This method returns the currently cached resource list for the specified server,
|
|
561
|
+
* which may be empty if resources haven't been refreshed yet, if the server doesn't
|
|
562
|
+
* support resources, or if the server doesn't provide any resources. The method
|
|
563
|
+
* includes logging for debugging purposes.
|
|
564
|
+
*
|
|
565
|
+
* @param {string} serverId - Unique identifier of the server instance
|
|
566
|
+
* @returns {Resource[]} Array of cached resources, empty if none available
|
|
567
|
+
*
|
|
568
|
+
* @example
|
|
569
|
+
* ```typescript
|
|
570
|
+
* const resources = manager.getResources('my-server-1');
|
|
571
|
+
* console.log(`Server has ${resources.length} resources`);
|
|
572
|
+
* ```
|
|
573
|
+
*/
|
|
574
|
+
getResources(serverId) {
|
|
575
|
+
const resources = this.resourceCache.get(serverId) || [];
|
|
576
|
+
const fromCache = this.resourceCache.has(serverId);
|
|
577
|
+
logger.debug(`getResources for [${serverId}]: returned ${resources.length} resources (${fromCache ? 'from cache' : 'no cache'})`, LOG_MODULES.CONNECTION_MANAGER);
|
|
578
|
+
return resources;
|
|
579
|
+
}
|
|
580
|
+
/**
|
|
581
|
+
* Reads content from a specific resource URI on a connected MCP server.
|
|
582
|
+
*
|
|
583
|
+
* This method delegates the resource reading operation to the underlying MCP client,
|
|
584
|
+
* providing direct access to server-provided resources through their URIs.
|
|
585
|
+
*
|
|
586
|
+
* @param {string} serverId - Unique identifier of the connected server instance
|
|
587
|
+
* @param {string} uri - Resource URI to read (e.g., "file:///path/to/file")
|
|
588
|
+
* @returns {Promise<unknown>} Resource content as returned by the server
|
|
589
|
+
* @throws {Error} If the server is not connected or resource reading fails
|
|
590
|
+
*
|
|
591
|
+
* @example
|
|
592
|
+
* ```typescript
|
|
593
|
+
* const content = await manager.readResource('my-server-1', 'hub://config/settings.json');
|
|
594
|
+
* console.log('Resource content:', content);
|
|
595
|
+
* ```
|
|
596
|
+
*/
|
|
597
|
+
async readResource(serverId, uri) {
|
|
598
|
+
const client = this.clients.get(serverId);
|
|
599
|
+
if (!client) {
|
|
600
|
+
throw new Error(`Server ${serverId} not connected`);
|
|
601
|
+
}
|
|
602
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
603
|
+
return client.readResource({ uri });
|
|
604
|
+
}
|
|
605
|
+
/**
|
|
606
|
+
* Retrieves all cached tools from all connected server instances.
|
|
607
|
+
*
|
|
608
|
+
* This method aggregates tools from all server ID-level caches into a single array,
|
|
609
|
+
* providing a unified view of all available tools across all connected servers.
|
|
610
|
+
* The returned tools include server context information for proper identification.
|
|
611
|
+
*
|
|
612
|
+
* @returns {Tool[]} Array of all cached tools from all connected servers
|
|
613
|
+
*
|
|
614
|
+
* @example
|
|
615
|
+
* ```typescript
|
|
616
|
+
* const allTools = manager.getAllTools();
|
|
617
|
+
* console.log(`Total tools available: ${allTools.length}`);
|
|
618
|
+
* ```
|
|
619
|
+
*/
|
|
620
|
+
getAllTools() {
|
|
621
|
+
return this._toolCache.getAllTools();
|
|
622
|
+
}
|
|
623
|
+
/**
|
|
624
|
+
* Retrieves all tool cache entries as server ID to tools mapping.
|
|
625
|
+
*
|
|
626
|
+
* This method returns the raw tool cache structure as an array of [serverId, tools] tuples,
|
|
627
|
+
* providing direct access to the internal caching mechanism for debugging or advanced use cases.
|
|
628
|
+
*
|
|
629
|
+
* @returns {[string, Tool[]][]} Array of [serverId, tools] tuples representing the cache
|
|
630
|
+
*
|
|
631
|
+
* @example
|
|
632
|
+
* ```typescript
|
|
633
|
+
* const cacheEntries = manager.getToolCacheEntries();
|
|
634
|
+
* cacheEntries.forEach(([serverId, tools]) => {
|
|
635
|
+
* console.log(`Server ${serverId} has ${tools.length} tools`);
|
|
636
|
+
* });
|
|
637
|
+
* ```
|
|
638
|
+
*/
|
|
639
|
+
getToolCacheEntries() {
|
|
640
|
+
return this._toolCache.getToolCacheEntries();
|
|
641
|
+
}
|
|
642
|
+
/**
|
|
643
|
+
* Resolves a server name to its corresponding server instance ID.
|
|
644
|
+
*
|
|
645
|
+
* This method provides reverse lookup from server names (as defined in configuration)
|
|
646
|
+
* to the unique server instance IDs used internally for connection management.
|
|
647
|
+
* It's useful when you have a server name but need the instance ID for operations.
|
|
648
|
+
*
|
|
649
|
+
* @param {string} name - Server name as defined in the configuration
|
|
650
|
+
* @returns {string | undefined} Corresponding server instance ID or undefined if not found
|
|
651
|
+
*
|
|
652
|
+
* @example
|
|
653
|
+
* ```typescript
|
|
654
|
+
* const serverId = manager.getServerIdByName('my-mcp-server');
|
|
655
|
+
* if (serverId) {
|
|
656
|
+
* const status = manager.getStatus(serverId);
|
|
657
|
+
* }
|
|
658
|
+
* ```
|
|
659
|
+
*/
|
|
660
|
+
getServerIdByName(name) {
|
|
661
|
+
return this._toolCache.getServerIdByName(name);
|
|
662
|
+
}
|
|
663
|
+
/**
|
|
664
|
+
* Retrieves the MCP client instance for a server by its name.
|
|
665
|
+
*
|
|
666
|
+
* This method resolves a server name to its instance ID and returns the corresponding
|
|
667
|
+
* MCP client instance, providing direct access to the underlying SDK client for
|
|
668
|
+
* advanced operations that aren't covered by the manager's high-level methods.
|
|
669
|
+
*
|
|
670
|
+
* @param {string} name - Server name as defined in the configuration
|
|
671
|
+
* @returns {Client | undefined} MCP client instance or undefined if not connected
|
|
672
|
+
*
|
|
673
|
+
* @example
|
|
674
|
+
* ```typescript
|
|
675
|
+
* const client = manager.getClientByName('my-mcp-server');
|
|
676
|
+
* if (client) {
|
|
677
|
+
* // Use direct client methods for advanced operations
|
|
678
|
+
* const result = await client.listPrompts();
|
|
679
|
+
* }
|
|
680
|
+
* ```
|
|
681
|
+
*/
|
|
682
|
+
getClientByName(name) {
|
|
683
|
+
const serverId = this._toolCache.getServerIdByName(name);
|
|
684
|
+
if (!serverId) {
|
|
685
|
+
return undefined;
|
|
686
|
+
}
|
|
687
|
+
return this.clients.get(serverId);
|
|
688
|
+
}
|
|
689
|
+
/**
|
|
690
|
+
* Calls a tool on a connected server using the server name instead of instance ID.
|
|
691
|
+
*
|
|
692
|
+
* This method provides a convenient way to execute tools when you have a server name
|
|
693
|
+
* rather than an instance ID. It resolves the server name to its instance ID and
|
|
694
|
+
* delegates to the callTool method for actual execution.
|
|
695
|
+
*
|
|
696
|
+
* The method is wrapped in OpenTelemetry tracing for observability and includes
|
|
697
|
+
* comprehensive error handling with proper logging.
|
|
698
|
+
*
|
|
699
|
+
* @param {string} name - Server name as defined in the configuration
|
|
700
|
+
* @param {string} toolName - Name of the tool to execute
|
|
701
|
+
* @param {Record<string, unknown>} args - Arguments to pass to the tool
|
|
702
|
+
* @returns {Promise<unknown>} Tool execution result as returned by the server
|
|
703
|
+
* @throws {Error} If server is not connected, not found, or tool execution fails
|
|
704
|
+
*
|
|
705
|
+
* @example
|
|
706
|
+
* ```typescript
|
|
707
|
+
* const result = await manager.callToolByName('my-mcp-server', 'list-files', {
|
|
708
|
+
* directory: '/home/user'
|
|
709
|
+
* });
|
|
710
|
+
* console.log('Tool result:', result);
|
|
711
|
+
* ```
|
|
712
|
+
*/
|
|
713
|
+
async callToolByName(name, toolName, args) {
|
|
714
|
+
const serverId = this._toolCache.getServerIdByName(name);
|
|
715
|
+
if (!serverId) {
|
|
716
|
+
throw new Error(`Server ${name} not connected or not found`);
|
|
717
|
+
}
|
|
718
|
+
return this.callTool(serverId, toolName, args);
|
|
719
|
+
}
|
|
720
|
+
/**
|
|
721
|
+
* Retrieves the connection status for a server using its name instead of instance ID.
|
|
722
|
+
*
|
|
723
|
+
* This method resolves a server name to its instance ID and returns the corresponding
|
|
724
|
+
* server status, providing a convenient way to check server health when working with
|
|
725
|
+
* server names rather than instance IDs.
|
|
726
|
+
*
|
|
727
|
+
* @param {string} name - Server name as defined in the configuration
|
|
728
|
+
* @returns {ServerStatus | undefined} Current status object or undefined if not found/connected
|
|
729
|
+
*
|
|
730
|
+
* @example
|
|
731
|
+
* ```typescript
|
|
732
|
+
* const status = manager.getStatusByName('my-mcp-server');
|
|
733
|
+
* if (status?.connected) {
|
|
734
|
+
* console.log('Server is online');
|
|
735
|
+
* }
|
|
736
|
+
* ```
|
|
737
|
+
*/
|
|
738
|
+
getStatusByName(name) {
|
|
739
|
+
const serverId = this._toolCache.getServerIdByName(name);
|
|
740
|
+
if (!serverId) {
|
|
741
|
+
return undefined;
|
|
742
|
+
}
|
|
743
|
+
return this.serverStatus.get(serverId);
|
|
744
|
+
}
|
|
745
|
+
/**
|
|
746
|
+
* Retrieves cached tools for a server using its name instead of instance ID.
|
|
747
|
+
*
|
|
748
|
+
* This method resolves a server name to its instance ID and returns the corresponding
|
|
749
|
+
* cached tool list, providing a convenient way to access tools when working with
|
|
750
|
+
* server names rather than instance IDs.
|
|
751
|
+
*
|
|
752
|
+
* @param {string} name - Server name as defined in the configuration
|
|
753
|
+
* @returns {Tool[]} Array of cached tools, empty if none available or not connected
|
|
754
|
+
*
|
|
755
|
+
* @example
|
|
756
|
+
* ```typescript
|
|
757
|
+
* const tools = manager.getToolsByName('my-mcp-server');
|
|
758
|
+
* console.log(`Server has ${tools.length} tools`);
|
|
759
|
+
* ```
|
|
760
|
+
*/
|
|
761
|
+
getToolsByName(name) {
|
|
762
|
+
const serverId = this._toolCache.getServerIdByName(name);
|
|
763
|
+
if (!serverId) {
|
|
764
|
+
return [];
|
|
765
|
+
}
|
|
766
|
+
return this._toolCache.getTools(serverId);
|
|
767
|
+
}
|
|
768
|
+
/**
|
|
769
|
+
* Retrieves cached resources for a server using its name instead of instance ID.
|
|
770
|
+
*
|
|
771
|
+
* This method resolves a server name to its instance ID and returns the corresponding
|
|
772
|
+
* cached resource list, providing a convenient way to access resources when working with
|
|
773
|
+
* server names rather than instance IDs.
|
|
774
|
+
*
|
|
775
|
+
* @param {string} name - Server name as defined in the configuration
|
|
776
|
+
* @returns {Resource[]} Array of cached resources, empty if none available or not connected
|
|
777
|
+
*
|
|
778
|
+
* @example
|
|
779
|
+
* ```typescript
|
|
780
|
+
* const resources = manager.getResourcesByName('my-mcp-server');
|
|
781
|
+
* console.log(`Server has ${resources.length} resources`);
|
|
782
|
+
* ```
|
|
783
|
+
*/
|
|
784
|
+
getResourcesByName(name) {
|
|
785
|
+
const serverId = this._toolCache.getServerIdByName(name);
|
|
786
|
+
if (!serverId) {
|
|
787
|
+
return [];
|
|
788
|
+
}
|
|
789
|
+
return this.resourceCache.get(serverId) || [];
|
|
790
|
+
}
|
|
791
|
+
/**
|
|
792
|
+
* Retrieves a specific tool by name from a server's cached tools.
|
|
793
|
+
*
|
|
794
|
+
* This method searches the server name-level tool cache for a tool with the specified name,
|
|
795
|
+
* providing efficient lookup without needing to iterate through all tools manually.
|
|
796
|
+
*
|
|
797
|
+
* @param {string} serverName - Server name as defined in the configuration
|
|
798
|
+
* @param {string} toolName - Exact name of the tool to find
|
|
799
|
+
* @returns {Tool | undefined} Tool object if found, undefined otherwise
|
|
800
|
+
*
|
|
801
|
+
* @example
|
|
802
|
+
* ```typescript
|
|
803
|
+
* const tool = manager.getTool('my-mcp-server', 'list-files');
|
|
804
|
+
* if (tool) {
|
|
805
|
+
* console.log('Tool description:', tool.description);
|
|
806
|
+
* }
|
|
807
|
+
* ```
|
|
808
|
+
*/
|
|
809
|
+
getTool(serverName, toolName) {
|
|
810
|
+
return this._toolCache.getTool(serverName, toolName);
|
|
811
|
+
}
|
|
812
|
+
/**
|
|
813
|
+
* Retrieves all cached resources grouped by server name.
|
|
814
|
+
*
|
|
815
|
+
* This method aggregates resources from all server instances and groups them by their
|
|
816
|
+
* corresponding server names, providing a structured view of all available resources
|
|
817
|
+
* across the system organized by server origin.
|
|
818
|
+
*
|
|
819
|
+
* @returns {Record<string, Resource[]>} Object mapping server names to resource arrays
|
|
820
|
+
*
|
|
821
|
+
* @example
|
|
822
|
+
* ```typescript
|
|
823
|
+
* const allResources = manager.getAllResources();
|
|
824
|
+
* Object.entries(allResources).forEach(([serverName, resources]) => {
|
|
825
|
+
* console.log(`Server ${serverName} has ${resources.length} resources`);
|
|
826
|
+
* });
|
|
827
|
+
* ```
|
|
828
|
+
*/
|
|
829
|
+
getAllResources() {
|
|
830
|
+
const result = {};
|
|
831
|
+
// Group resources by server name
|
|
832
|
+
for (const [serverId, resources] of this.resourceCache.entries()) {
|
|
833
|
+
// Find server name for this ID
|
|
834
|
+
const serverName = this._toolCache.getServerNameById(serverId);
|
|
835
|
+
if (!result[serverName]) {
|
|
836
|
+
result[serverName] = [];
|
|
837
|
+
}
|
|
838
|
+
result[serverName].push(...resources);
|
|
839
|
+
}
|
|
840
|
+
return result;
|
|
841
|
+
}
|
|
842
|
+
/**
|
|
843
|
+
* Executes a tool on a connected MCP server using its instance ID.
|
|
844
|
+
*
|
|
845
|
+
* This is the primary method for executing tools on connected servers. It delegates
|
|
846
|
+
* the actual execution to the underlying MCP client and includes comprehensive
|
|
847
|
+
* error handling with proper logging. The method is wrapped in OpenTelemetry tracing
|
|
848
|
+
* for observability and monitoring.
|
|
849
|
+
*
|
|
850
|
+
* @param {string} serverId - Unique identifier of the connected server instance
|
|
851
|
+
* @param {string} toolName - Name of the tool to execute
|
|
852
|
+
* @param {Record<string, unknown>} args - Arguments to pass to the tool
|
|
853
|
+
* @returns {Promise<unknown>} Tool execution result as returned by the server
|
|
854
|
+
* @throws {Error} If server is not connected or tool execution fails
|
|
855
|
+
*
|
|
856
|
+
* @example
|
|
857
|
+
* ```typescript
|
|
858
|
+
* const result = await manager.callTool('my-server-1', 'list-files', {
|
|
859
|
+
* directory: '/home/user'
|
|
860
|
+
* });
|
|
861
|
+
* console.log('Tool result:', result);
|
|
862
|
+
* ```
|
|
863
|
+
*/
|
|
864
|
+
async callTool(serverId, toolName, args) {
|
|
865
|
+
const client = this.clients.get(serverId);
|
|
866
|
+
if (!client) {
|
|
867
|
+
throw new Error(`Server ${serverId} not connected`);
|
|
868
|
+
}
|
|
869
|
+
try {
|
|
870
|
+
const result = await client.callTool({
|
|
871
|
+
name: toolName,
|
|
872
|
+
arguments: args
|
|
873
|
+
});
|
|
874
|
+
return result;
|
|
875
|
+
}
|
|
876
|
+
catch (error) {
|
|
877
|
+
logger.error(`Failed to call tool ${toolName} on server [${serverId}]:`, error, LOG_MODULES.CONNECTION_MANAGER);
|
|
878
|
+
throw error;
|
|
879
|
+
}
|
|
880
|
+
}
|
|
881
|
+
/**
|
|
882
|
+
* Retrieves cached tools for a specific server name from the server name-level cache.
|
|
883
|
+
*
|
|
884
|
+
* This method provides access to the server name-level tool cache, which aggregates
|
|
885
|
+
* tools from all instances of the same server name. It's optimized for scenarios
|
|
886
|
+
* where you need to work with server names rather than individual instance IDs.
|
|
887
|
+
*
|
|
888
|
+
* @param {string} serverName - Server name as defined in the configuration
|
|
889
|
+
* @returns {Tool[]} Array of cached tools for the specified server name
|
|
890
|
+
*
|
|
891
|
+
* @example
|
|
892
|
+
* ```typescript
|
|
893
|
+
* const tools = manager.getToolsByServerName('my-mcp-server');
|
|
894
|
+
* console.log(`Server has ${tools.length} tools across all instances`);
|
|
895
|
+
* ```
|
|
896
|
+
*/
|
|
897
|
+
getToolsByServerName(serverName) {
|
|
898
|
+
return this._toolCache.getToolsByServerName(serverName);
|
|
899
|
+
}
|
|
900
|
+
/**
|
|
901
|
+
* Retrieves all cached tools from all servers using the server name-level cache.
|
|
902
|
+
*
|
|
903
|
+
* This method aggregates tools from the server name-level cache, providing a unified
|
|
904
|
+
* view of all available tools optimized for search operations and scenarios where
|
|
905
|
+
* server name context is more relevant than individual instance IDs.
|
|
906
|
+
*
|
|
907
|
+
* @returns {Tool[]} Array of all cached tools from all servers
|
|
908
|
+
*
|
|
909
|
+
* @example
|
|
910
|
+
* ```typescript
|
|
911
|
+
* const allTools = manager.getAllToolsByServerName();
|
|
912
|
+
* console.log(`Total tools available: ${allTools.length}`);
|
|
913
|
+
* ```
|
|
914
|
+
*/
|
|
915
|
+
getAllToolsByServerName() {
|
|
916
|
+
return this._toolCache.getAllToolsByServerName();
|
|
917
|
+
}
|
|
918
|
+
/**
|
|
919
|
+
* Backward compatibility: direct access to the underlying toolCache Map.
|
|
920
|
+
* This is maintained for backward compatibility with code that accesses
|
|
921
|
+
* mcpConnectionManager.toolCache directly.
|
|
922
|
+
*
|
|
923
|
+
* @deprecated Use the dedicated methods like getTools(), setTools(), etc. instead
|
|
924
|
+
*/
|
|
925
|
+
get toolCache() {
|
|
926
|
+
return this._toolCache.internalToolCache;
|
|
927
|
+
}
|
|
928
|
+
}
|
|
929
|
+
export const mcpConnectionManager = new McpConnectionManager();
|