@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,271 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Debug Response Wrapper for MCP Gateway.
|
|
3
|
+
* Wraps Fastify reply to capture and log response content in development mode.
|
|
4
|
+
*/
|
|
5
|
+
import { logger, LOG_MODULES, isToolsListResponse, simplifyToolsListResponse, hasImageContent, simplifyImageContent } from '../../utils/logger.js';
|
|
6
|
+
import { stringifyForLogging, getMcpCommDebugSetting } from '../../utils/json-utils.js';
|
|
7
|
+
/**
|
|
8
|
+
* Wraps Fastify reply to capture and log response content in development mode.
|
|
9
|
+
*
|
|
10
|
+
* @param reply - Fastify reply object to wrap
|
|
11
|
+
* @param sessionId - Current session ID for logging
|
|
12
|
+
*/
|
|
13
|
+
export function wrapReplyForDebug(reply, sessionId) {
|
|
14
|
+
// Only wrap for debug logging if MCP_COMM_DEBUG is enabled
|
|
15
|
+
if (!getMcpCommDebugSetting()) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const originalWrite = reply.raw.write.bind(reply.raw);
|
|
19
|
+
const originalEnd = reply.raw.end.bind(reply.raw);
|
|
20
|
+
let responseBuffer = '';
|
|
21
|
+
let socketBuffer = '';
|
|
22
|
+
let hasLoggedResponse = false;
|
|
23
|
+
let socketWrapped = false;
|
|
24
|
+
logger.debug(`Wrapping response - writable: ${reply.raw.writable}, destroyed: ${reply.raw.destroyed}, socket: ${!!reply.raw.socket}`, LOG_MODULES.COMMUNICATION);
|
|
25
|
+
// Wrap socket write if socket exists (for transports that bypass http.ServerResponse.write/end)
|
|
26
|
+
const wrapSocket = () => {
|
|
27
|
+
if (socketWrapped || !reply.raw.socket) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const socket = reply.raw.socket;
|
|
31
|
+
const originalSocketWrite = socket.write.bind(socket);
|
|
32
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
33
|
+
socket.write = function (data, encoding, callback) {
|
|
34
|
+
try {
|
|
35
|
+
if (typeof data === 'string') {
|
|
36
|
+
socketBuffer += data;
|
|
37
|
+
}
|
|
38
|
+
else if (data instanceof Buffer) {
|
|
39
|
+
socketBuffer += data.toString(encoding || 'utf8');
|
|
40
|
+
}
|
|
41
|
+
else if (data instanceof Uint8Array) {
|
|
42
|
+
try {
|
|
43
|
+
socketBuffer += new TextDecoder('utf-8').decode(data);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
socketBuffer += `[Binary data: ${data.length} bytes]`;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
logger.debug(`MCP Gateway: Error processing socket write: ${error}`, LOG_MODULES.COMMUNICATION);
|
|
52
|
+
}
|
|
53
|
+
return originalSocketWrite(data, encoding, callback);
|
|
54
|
+
};
|
|
55
|
+
// Also listen for socket finish to log any remaining data
|
|
56
|
+
socket.once('finish', () => {
|
|
57
|
+
if (!hasLoggedResponse && (socketBuffer.length > 0 || responseBuffer.length > 0)) {
|
|
58
|
+
logFinalResponse();
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
socketWrapped = true;
|
|
62
|
+
logger.debug(`MCP Gateway: Socket wrapped successfully for session ${sessionId}`, LOG_MODULES.COMMUNICATION);
|
|
63
|
+
};
|
|
64
|
+
// Helper function to format and log response
|
|
65
|
+
const logFinalResponse = () => {
|
|
66
|
+
if (hasLoggedResponse) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
hasLoggedResponse = true;
|
|
70
|
+
// Determine which buffer to use
|
|
71
|
+
const primaryBuffer = responseBuffer.length > 0 ? responseBuffer : socketBuffer;
|
|
72
|
+
const bufferSource = responseBuffer.length > 0 ? 'http.ServerResponse' : 'socket';
|
|
73
|
+
if (primaryBuffer.length === 0) {
|
|
74
|
+
logger.debug(`MCP Gateway response for ${sessionId}: [No response data captured - transport may have used direct socket operations]`, LOG_MODULES.COMMUNICATION);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
// Log response content, simplify tools/list responses and image content
|
|
78
|
+
let logResponse = primaryBuffer;
|
|
79
|
+
try {
|
|
80
|
+
if (isToolsListResponse(logResponse)) {
|
|
81
|
+
logResponse = simplifyToolsListResponse(logResponse);
|
|
82
|
+
}
|
|
83
|
+
else if (hasImageContent(logResponse)) {
|
|
84
|
+
// Simplify image content first
|
|
85
|
+
const simplified = simplifyImageContent(logResponse);
|
|
86
|
+
// Then format for logging
|
|
87
|
+
if (simplified.includes('event: message') && simplified.includes('data:')) {
|
|
88
|
+
const dataMatch = simplified.match(/data: ([^\n]+)/);
|
|
89
|
+
if (dataMatch) {
|
|
90
|
+
const jsonData = dataMatch[1].trim();
|
|
91
|
+
try {
|
|
92
|
+
const parsed = JSON.parse(jsonData);
|
|
93
|
+
const formattedData = stringifyForLogging(parsed);
|
|
94
|
+
logResponse = `event: message\ndata: ${formattedData}`;
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
logResponse = simplified;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
logResponse = simplified;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
const parsed = JSON.parse(simplified);
|
|
106
|
+
logResponse = stringifyForLogging(parsed);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
// Handle SSE format responses (event: message followed by data: JSON)
|
|
111
|
+
if (primaryBuffer.includes('event: message') && primaryBuffer.includes('data:')) {
|
|
112
|
+
const dataMatch = primaryBuffer.match(/data: ([^\n]+)/);
|
|
113
|
+
if (dataMatch) {
|
|
114
|
+
const jsonData = dataMatch[1].trim();
|
|
115
|
+
try {
|
|
116
|
+
const parsed = JSON.parse(jsonData);
|
|
117
|
+
const formattedData = stringifyForLogging(parsed);
|
|
118
|
+
logResponse = `event: message\ndata: ${formattedData}`;
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
logResponse = primaryBuffer;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
logResponse = primaryBuffer;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
// Try to format other JSON responses to improve readability
|
|
130
|
+
const parsed = JSON.parse(primaryBuffer);
|
|
131
|
+
logResponse = stringifyForLogging(parsed);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
// If not valid JSON, output as-is and truncate long content
|
|
137
|
+
logResponse =
|
|
138
|
+
primaryBuffer.length > 500 ? primaryBuffer.substring(0, 500) + '...' : primaryBuffer;
|
|
139
|
+
}
|
|
140
|
+
logger.debug(`MCP Gateway response for ${sessionId} (source: ${bufferSource}):\n${logResponse.trimEnd()}`, LOG_MODULES.COMMUNICATION);
|
|
141
|
+
};
|
|
142
|
+
// Try to wrap socket immediately
|
|
143
|
+
wrapSocket();
|
|
144
|
+
// Also try to wrap socket when it becomes available (in case it's not yet attached)
|
|
145
|
+
reply.raw.once('socket', () => {
|
|
146
|
+
wrapSocket();
|
|
147
|
+
});
|
|
148
|
+
// Wrap write method
|
|
149
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
150
|
+
reply.raw.write = function (chunk, encoding, callback) {
|
|
151
|
+
try {
|
|
152
|
+
let chunkStr = '';
|
|
153
|
+
if (typeof chunk === 'string') {
|
|
154
|
+
chunkStr = chunk;
|
|
155
|
+
}
|
|
156
|
+
else if (chunk instanceof Buffer) {
|
|
157
|
+
chunkStr = chunk.toString(encoding || 'utf8');
|
|
158
|
+
}
|
|
159
|
+
else if (chunk instanceof Uint8Array) {
|
|
160
|
+
// Try to convert Uint8Array to string (for SSE event streams)
|
|
161
|
+
try {
|
|
162
|
+
chunkStr = new TextDecoder('utf-8').decode(chunk);
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
// If unable to decode as text, provide binary summary
|
|
166
|
+
chunkStr = `[Binary data: ${chunk.length} bytes]`;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
else if (typeof chunk === 'object') {
|
|
170
|
+
chunkStr = JSON.stringify(chunk);
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
chunkStr = String(chunk);
|
|
174
|
+
}
|
|
175
|
+
responseBuffer += chunkStr;
|
|
176
|
+
}
|
|
177
|
+
catch (error) {
|
|
178
|
+
logger.debug(`MCP Gateway: Error processing write chunk: ${error}`, LOG_MODULES.COMMUNICATION);
|
|
179
|
+
}
|
|
180
|
+
return originalWrite(chunk, encoding, callback);
|
|
181
|
+
};
|
|
182
|
+
// Wrap end method
|
|
183
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
184
|
+
reply.raw.end = function (chunk, encoding, callback) {
|
|
185
|
+
try {
|
|
186
|
+
if (chunk !== undefined && chunk !== null) {
|
|
187
|
+
let chunkStr = '';
|
|
188
|
+
if (typeof chunk === 'string') {
|
|
189
|
+
chunkStr = chunk;
|
|
190
|
+
}
|
|
191
|
+
else if (chunk instanceof Buffer) {
|
|
192
|
+
chunkStr = chunk.toString(encoding || 'utf8');
|
|
193
|
+
}
|
|
194
|
+
else if (chunk instanceof Uint8Array) {
|
|
195
|
+
// Try to convert Uint8Array to string (for SSE event streams)
|
|
196
|
+
try {
|
|
197
|
+
chunkStr = new TextDecoder('utf-8').decode(chunk);
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
// If unable to decode as text, provide binary summary
|
|
201
|
+
chunkStr = `[Binary data: ${chunk.length} bytes]`;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
else if (typeof chunk === 'object') {
|
|
205
|
+
chunkStr = JSON.stringify(chunk);
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
chunkStr = String(chunk);
|
|
209
|
+
}
|
|
210
|
+
responseBuffer += chunkStr;
|
|
211
|
+
}
|
|
212
|
+
// Log response before calling original end
|
|
213
|
+
logFinalResponse();
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
logger.debug(`MCP Gateway: Error processing end chunk: ${error}`, LOG_MODULES.COMMUNICATION);
|
|
217
|
+
}
|
|
218
|
+
return originalEnd(chunk, encoding, callback);
|
|
219
|
+
};
|
|
220
|
+
// Also wrap writeHead method to capture error response headers
|
|
221
|
+
const originalWriteHead = reply.raw.writeHead.bind(reply.raw);
|
|
222
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
223
|
+
reply.raw.writeHead = function (statusCode, ...args) {
|
|
224
|
+
try {
|
|
225
|
+
// Ensure socket is wrapped before any response is sent
|
|
226
|
+
wrapSocket();
|
|
227
|
+
// If it's an error response, log status code and headers
|
|
228
|
+
if (statusCode >= 400) {
|
|
229
|
+
let statusMessage;
|
|
230
|
+
let headers;
|
|
231
|
+
// Handle multiple parameter forms of Node.js writeHead
|
|
232
|
+
if (args.length === 1) {
|
|
233
|
+
// writeHead(statusCode, headers)
|
|
234
|
+
headers = args[0];
|
|
235
|
+
}
|
|
236
|
+
else if (args.length === 2) {
|
|
237
|
+
// writeHead(statusCode, statusMessage, headers) or writeHead(statusCode, headers)
|
|
238
|
+
if (typeof args[0] === 'string') {
|
|
239
|
+
statusMessage = args[0];
|
|
240
|
+
headers = args[1];
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
headers = args[0];
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
if (headers) {
|
|
247
|
+
logger.debug(`MCP Gateway error response: ${statusCode} ${statusMessage || ''} Headers: ${stringifyForLogging(headers)}`, LOG_MODULES.COMMUNICATION);
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
logger.debug(`MCP Gateway error response: ${statusCode} ${statusMessage || ''}`, LOG_MODULES.COMMUNICATION);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
catch (error) {
|
|
255
|
+
logger.debug(`MCP Gateway: Error processing writeHead: ${error}`, LOG_MODULES.COMMUNICATION);
|
|
256
|
+
}
|
|
257
|
+
return originalWriteHead(statusCode, ...args);
|
|
258
|
+
};
|
|
259
|
+
// Set up fallback logging in case end() is never called
|
|
260
|
+
reply.raw.once('finish', () => {
|
|
261
|
+
if (!hasLoggedResponse) {
|
|
262
|
+
logFinalResponse();
|
|
263
|
+
}
|
|
264
|
+
});
|
|
265
|
+
// Also set up close event for fallback
|
|
266
|
+
reply.raw.once('close', () => {
|
|
267
|
+
if (!hasLoggedResponse) {
|
|
268
|
+
logFinalResponse();
|
|
269
|
+
}
|
|
270
|
+
});
|
|
271
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Gateway endpoint using Streamable HTTP Transport
|
|
3
|
+
* Handles all MCP protocol requests at /mcp endpoint
|
|
4
|
+
*
|
|
5
|
+
* This is a thin wrapper around modular utilities for better maintainability.
|
|
6
|
+
*/
|
|
7
|
+
import type { FastifyInstance } from 'fastify';
|
|
8
|
+
/**
|
|
9
|
+
* MCP Gateway routes registration.
|
|
10
|
+
*
|
|
11
|
+
* @param fastify - Fastify instance to register routes on
|
|
12
|
+
*/
|
|
13
|
+
export declare function mcpGatewayRoutes(fastify: FastifyInstance): Promise<void>;
|
|
14
|
+
//# sourceMappingURL=gateway.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../../../../../src/api/mcp/gateway.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AAU7E;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,eAAe,iBAmI9D"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Gateway endpoint using Streamable HTTP Transport
|
|
3
|
+
* Handles all MCP protocol requests at /mcp endpoint
|
|
4
|
+
*
|
|
5
|
+
* This is a thin wrapper around modular utilities for better maintainability.
|
|
6
|
+
*/
|
|
7
|
+
import { logger, LOG_MODULES } from '../../utils/logger.js';
|
|
8
|
+
import { stringifyForLogging } from '../../utils/json-utils.js';
|
|
9
|
+
import { requestContext } from '../../utils/request-context.js';
|
|
10
|
+
import { clientTrackerService } from '../../services/client-tracker.service.js';
|
|
11
|
+
import { mcpSessionManager } from '../../services/mcp-session-manager.js';
|
|
12
|
+
import { cleanupStaleSseStreams } from './sse-stream-manager.js';
|
|
13
|
+
import { extractSessionContext } from './session-context-extractor.js';
|
|
14
|
+
import { wrapReplyForDebug } from './debug-response-wrapper.js';
|
|
15
|
+
/**
|
|
16
|
+
* MCP Gateway routes registration.
|
|
17
|
+
*
|
|
18
|
+
* @param fastify - Fastify instance to register routes on
|
|
19
|
+
*/
|
|
20
|
+
export async function mcpGatewayRoutes(fastify) {
|
|
21
|
+
const handleMcpRequest = async (request, reply) => {
|
|
22
|
+
// First, log that we received the request (before extracting session context)
|
|
23
|
+
let initialLogMsg = `MCP Gateway ${request.method} ${request.url}`;
|
|
24
|
+
// Combine headers and body into one log block
|
|
25
|
+
initialLogMsg += `\n Request headers: ${stringifyForLogging(request.headers)}`;
|
|
26
|
+
if (request.body) {
|
|
27
|
+
try {
|
|
28
|
+
const preview = stringifyForLogging(request.body);
|
|
29
|
+
initialLogMsg += `\n Body: ${preview}`;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
initialLogMsg += `\n Body: [Unserializable]`;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
logger.debug(initialLogMsg, LOG_MODULES.GATEWAY);
|
|
36
|
+
const { sessionId, clientContext } = extractSessionContext(request);
|
|
37
|
+
logger.info(`MCP Gateway ${request.method} ${request.url} [Session: ${sessionId}]`, LOG_MODULES.GATEWAY);
|
|
38
|
+
// Update client tracking information
|
|
39
|
+
clientTrackerService.updateClient(clientContext);
|
|
40
|
+
// Log the session context after extraction
|
|
41
|
+
let sessionLogMsg = `MCP Gateway Session Context [Session: ${sessionId}]`;
|
|
42
|
+
if (clientContext.cwd)
|
|
43
|
+
sessionLogMsg += ` [CWD: ${clientContext.cwd}]`;
|
|
44
|
+
if (clientContext.clientName)
|
|
45
|
+
sessionLogMsg += ` [Client: ${clientContext.clientName}]`;
|
|
46
|
+
logger.debug(sessionLogMsg, LOG_MODULES.GATEWAY);
|
|
47
|
+
reply.header('Content-Type', 'application/json');
|
|
48
|
+
if (!request.headers['accept']) {
|
|
49
|
+
request.headers['accept'] = 'application/json, text/event-stream';
|
|
50
|
+
}
|
|
51
|
+
wrapReplyForDebug(reply, sessionId);
|
|
52
|
+
reply.hijack();
|
|
53
|
+
const startTime = Date.now();
|
|
54
|
+
try {
|
|
55
|
+
// Determine if initialize request is needed
|
|
56
|
+
// Only explicit initialize requests require SDK initialization handling
|
|
57
|
+
// For all other requests (tools/list, etc.), skip initialization checks
|
|
58
|
+
const isInitializeRequest = request.body?.method === 'initialize';
|
|
59
|
+
const hasRestoredState = !!mcpSessionManager.getSessionState(sessionId);
|
|
60
|
+
const requireInitialize = isInitializeRequest;
|
|
61
|
+
logger.debug(`Request for session: ${sessionId}, method: ${request.body?.method || 'GET'}, isInitialize: ${isInitializeRequest}, hasRestoredState: ${hasRestoredState}, requireInitialize: ${requireInitialize}`, LOG_MODULES.GATEWAY);
|
|
62
|
+
const session = await mcpSessionManager.getSession(sessionId, requireInitialize);
|
|
63
|
+
// Proactive cleanup: For GET requests (SSE connections), clean up stale streams first
|
|
64
|
+
// This prevents "Only one SSE stream is allowed per session" errors
|
|
65
|
+
if (request.method === 'GET') {
|
|
66
|
+
logger.debug(`Proactive SSE stream cleanup for session ${sessionId} before handling request`, LOG_MODULES.GATEWAY);
|
|
67
|
+
cleanupStaleSseStreams(session.transport, sessionId);
|
|
68
|
+
}
|
|
69
|
+
await requestContext.run(clientContext, async () => {
|
|
70
|
+
await session.transport.handleRequest(request.raw, reply.raw, request.body);
|
|
71
|
+
});
|
|
72
|
+
const duration = Date.now() - startTime;
|
|
73
|
+
logger.info(`MCP Gateway response for ${sessionId}: handled in ${duration}ms`, LOG_MODULES.GATEWAY);
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
77
|
+
logger.error(`Error handling MCP request for session ${sessionId}: ${errorMessage}`, error, LOG_MODULES.GATEWAY);
|
|
78
|
+
if (!reply.raw.headersSent) {
|
|
79
|
+
reply.raw.writeHead(500, { 'Content-Type': 'application/json' });
|
|
80
|
+
reply.raw.end(JSON.stringify({
|
|
81
|
+
jsonrpc: '2.0',
|
|
82
|
+
error: {
|
|
83
|
+
code: -32000,
|
|
84
|
+
message: 'Internal Server Error',
|
|
85
|
+
data: { sessionId }
|
|
86
|
+
},
|
|
87
|
+
id: null
|
|
88
|
+
}));
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
// Handle root /mcp endpoint (GET for SSE, POST for messages)
|
|
93
|
+
fastify.all('/mcp', {
|
|
94
|
+
bodyLimit: 10 * 1024 * 1024, // 10MB limit
|
|
95
|
+
preHandler: (request, _reply, done) => {
|
|
96
|
+
// Ensure we don't parse the body for SSE (GET) requests
|
|
97
|
+
if (request.method === 'GET') {
|
|
98
|
+
request.body = null;
|
|
99
|
+
}
|
|
100
|
+
done();
|
|
101
|
+
},
|
|
102
|
+
handler: handleMcpRequest
|
|
103
|
+
});
|
|
104
|
+
// Handle any subpaths if client appends them (e.g. session-specific URLs)
|
|
105
|
+
fastify.all('/mcp/*', {
|
|
106
|
+
bodyLimit: 10 * 1024 * 1024, // 10MB limit
|
|
107
|
+
preHandler: (request, _reply, done) => {
|
|
108
|
+
// Ensure we don't parse the body for SSE (GET) requests
|
|
109
|
+
if (request.method === 'GET') {
|
|
110
|
+
request.body = null;
|
|
111
|
+
}
|
|
112
|
+
done();
|
|
113
|
+
},
|
|
114
|
+
handler: handleMcpRequest
|
|
115
|
+
});
|
|
116
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Context Extractor for MCP Gateway.
|
|
3
|
+
* Extracts and resolves session context from incoming requests.
|
|
4
|
+
*/
|
|
5
|
+
import type { FastifyRequest } from 'fastify';
|
|
6
|
+
import type { ClientContext } from '../../../shared/types/client.types.js';
|
|
7
|
+
export interface RequestBody {
|
|
8
|
+
method?: string;
|
|
9
|
+
params?: {
|
|
10
|
+
clientInfo?: {
|
|
11
|
+
name: string;
|
|
12
|
+
version: string;
|
|
13
|
+
};
|
|
14
|
+
protocolVersion?: string;
|
|
15
|
+
[key: string]: unknown;
|
|
16
|
+
};
|
|
17
|
+
[key: string]: unknown;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Extracts session context from incoming MCP requests to establish client identity and session management.
|
|
21
|
+
*
|
|
22
|
+
* This function implements a simplified session ID resolution strategy with clear priority:
|
|
23
|
+
* 1. Header parameter mcp-session-id/Mcp-Session-Id (highest priority)
|
|
24
|
+
* 2. Query parameter sessionId (for SSE connections)
|
|
25
|
+
* 3. URL pattern match for sessionId
|
|
26
|
+
* 4. Initialize request: generate from clientInfo (only for initialize requests without sessionId)
|
|
27
|
+
* 5. Generate new unique session ID (fallback for non-initialize requests)
|
|
28
|
+
*
|
|
29
|
+
* The function also extracts and enriches client context including name, version, working directory,
|
|
30
|
+
* project information, IP address, and user agent for comprehensive session tracking.
|
|
31
|
+
*
|
|
32
|
+
* @param {FastifyRequest<{ Body: RequestBody | null }>} request - Incoming Fastify request object
|
|
33
|
+
* @returns {{ sessionId: string; clientContext: ClientContext }} Object containing resolved session ID and enriched client context
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```typescript
|
|
37
|
+
* const { sessionId, clientContext } = extractSessionContext(request);
|
|
38
|
+
* console.log(`Session: ${sessionId}, Client: ${clientContext.clientName}`);
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export declare function extractSessionContext(request: FastifyRequest<{
|
|
42
|
+
Body: RequestBody | null;
|
|
43
|
+
}>): {
|
|
44
|
+
sessionId: string;
|
|
45
|
+
clientContext: ClientContext;
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=session-context-extractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-context-extractor.d.ts","sourceRoot":"","sources":["../../../../../src/api/mcp/session-context-extractor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAG9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAInE,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE;QACP,UAAU,CAAC,EAAE;YACX,IAAI,EAAE,MAAM,CAAC;YACb,OAAO,EAAE,MAAM,CAAC;SACjB,CAAC;QACF,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;IACF,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,cAAc,CAAC;IAAE,IAAI,EAAE,WAAW,GAAG,IAAI,CAAA;CAAE,CAAC,GAAG;IAC5F,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,aAAa,CAAC;CAC9B,CAoHA"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Context Extractor for MCP Gateway.
|
|
3
|
+
* Extracts and resolves session context from incoming requests.
|
|
4
|
+
*/
|
|
5
|
+
import { logger, LOG_MODULES } from '../../utils/logger.js';
|
|
6
|
+
import { randomUUID } from 'crypto';
|
|
7
|
+
import { mcpSessionManager } from '../../services/mcp-session-manager.js';
|
|
8
|
+
/**
|
|
9
|
+
* Extracts session context from incoming MCP requests to establish client identity and session management.
|
|
10
|
+
*
|
|
11
|
+
* This function implements a simplified session ID resolution strategy with clear priority:
|
|
12
|
+
* 1. Header parameter mcp-session-id/Mcp-Session-Id (highest priority)
|
|
13
|
+
* 2. Query parameter sessionId (for SSE connections)
|
|
14
|
+
* 3. URL pattern match for sessionId
|
|
15
|
+
* 4. Initialize request: generate from clientInfo (only for initialize requests without sessionId)
|
|
16
|
+
* 5. Generate new unique session ID (fallback for non-initialize requests)
|
|
17
|
+
*
|
|
18
|
+
* The function also extracts and enriches client context including name, version, working directory,
|
|
19
|
+
* project information, IP address, and user agent for comprehensive session tracking.
|
|
20
|
+
*
|
|
21
|
+
* @param {FastifyRequest<{ Body: RequestBody | null }>} request - Incoming Fastify request object
|
|
22
|
+
* @returns {{ sessionId: string; clientContext: ClientContext }} Object containing resolved session ID and enriched client context
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```typescript
|
|
26
|
+
* const { sessionId, clientContext } = extractSessionContext(request);
|
|
27
|
+
* console.log(`Session: ${sessionId}, Client: ${clientContext.clientName}`);
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export function extractSessionContext(request) {
|
|
31
|
+
const headers = request.headers;
|
|
32
|
+
// Priority 1: Session ID from Header (highest priority)
|
|
33
|
+
let sessionId = headers['mcp-session-id'] || headers['Mcp-Session-Id'];
|
|
34
|
+
if (sessionId) {
|
|
35
|
+
logger.debug(`Extracted sessionId from header: ${sessionId}`, LOG_MODULES.CONTEXT);
|
|
36
|
+
}
|
|
37
|
+
// Priority 2: Session ID from Query (Standard MCP SSE)
|
|
38
|
+
if (!sessionId) {
|
|
39
|
+
sessionId = request.query?.sessionId;
|
|
40
|
+
if (sessionId) {
|
|
41
|
+
logger.debug(`Extracted sessionId from query: ${sessionId}`, LOG_MODULES.CONTEXT);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// Priority 3: URL pattern match for sessionId
|
|
45
|
+
if (!sessionId && request.url.includes('sessionId=')) {
|
|
46
|
+
const match = request.url.match(/sessionId=([^&]+)/);
|
|
47
|
+
if (match) {
|
|
48
|
+
sessionId = match[1];
|
|
49
|
+
logger.debug(`Extracted sessionId from URL: ${sessionId}`, LOG_MODULES.CONTEXT);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// If sessionId was extracted, check if it exists in persisted sessions (for debugging)
|
|
53
|
+
if (sessionId) {
|
|
54
|
+
const persistedSession = mcpSessionManager.getSessionState(sessionId);
|
|
55
|
+
if (persistedSession) {
|
|
56
|
+
logger.debug(`Session ${sessionId} found in persisted sessions`, LOG_MODULES.CONTEXT);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
logger.debug(`Session ${sessionId} not found in persisted sessions (will create new)`, LOG_MODULES.CONTEXT);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// Extract client info from headers and request body
|
|
63
|
+
let clientName = headers['x-mcp-client-id'] || headers['x-client-id'];
|
|
64
|
+
let clientVersion;
|
|
65
|
+
let protocolVersion;
|
|
66
|
+
// Priority 4: For initialize requests without sessionId, generate from clientInfo
|
|
67
|
+
const isInitializeRequest = request.body?.method === 'initialize';
|
|
68
|
+
if (!sessionId && isInitializeRequest && request.body?.params?.clientInfo) {
|
|
69
|
+
const { name, version } = request.body.params.clientInfo;
|
|
70
|
+
protocolVersion = request.body.params.protocolVersion;
|
|
71
|
+
const cwd = headers['x-mcp-cwd'] || headers['x-cwd'];
|
|
72
|
+
// Generate sessionId from client info
|
|
73
|
+
let baseId = `${name.replace(/[^a-zA-Z0-9-]/g, '')}-${version.replace(/[^a-zA-Z0-9-]/g, '')}`;
|
|
74
|
+
if (cwd) {
|
|
75
|
+
const cwdHash = cwd
|
|
76
|
+
.split('')
|
|
77
|
+
.reduce((acc, char) => {
|
|
78
|
+
acc = (acc << 5) - acc + char.charCodeAt(0);
|
|
79
|
+
return acc & acc;
|
|
80
|
+
}, 0)
|
|
81
|
+
.toString(16)
|
|
82
|
+
.replace('-', '');
|
|
83
|
+
baseId = `${baseId}-${cwdHash}`;
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
const randomHash = randomUUID().substring(0, 8);
|
|
87
|
+
baseId = `${baseId}-${randomHash}`;
|
|
88
|
+
}
|
|
89
|
+
sessionId = baseId;
|
|
90
|
+
logger.debug(`Generated sessionId from initialize params: ${sessionId}`, LOG_MODULES.CONTEXT);
|
|
91
|
+
// Save client version and protocol version information
|
|
92
|
+
clientVersion = version;
|
|
93
|
+
protocolVersion = request.body.params.protocolVersion;
|
|
94
|
+
// Set clientName directly since we get more accurate information from the initialize request
|
|
95
|
+
clientName = name;
|
|
96
|
+
}
|
|
97
|
+
// Priority 5: Generate new unique session ID for non-initialize requests
|
|
98
|
+
if (!sessionId) {
|
|
99
|
+
const prefix = clientName ? `${clientName.replace(/[^a-zA-Z0-9-]/g, '')}-` : 'session-';
|
|
100
|
+
sessionId = `${prefix}${randomUUID().substring(0, 8)}`;
|
|
101
|
+
if (!clientName && !request.body) {
|
|
102
|
+
logger.debug(`Initial StreamableHttp connection - created new sessionId: ${sessionId}`, LOG_MODULES.CONTEXT);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
logger.debug(`Generated new sessionId: ${sessionId}`, LOG_MODULES.CONTEXT);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// Add consistency check before returning session information
|
|
109
|
+
if (sessionId && mcpSessionManager.getSessionState(sessionId)) {
|
|
110
|
+
const hasSessionObject = mcpSessionManager.hasSession(sessionId);
|
|
111
|
+
if (!hasSessionObject) {
|
|
112
|
+
logger.warn(`Session state exists but session object missing for ${sessionId}`, LOG_MODULES.CONTEXT);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
const clientContext = {
|
|
116
|
+
sessionId,
|
|
117
|
+
clientName,
|
|
118
|
+
clientVersion,
|
|
119
|
+
protocolVersion,
|
|
120
|
+
cwd: headers['x-mcp-cwd'] || headers['x-cwd'],
|
|
121
|
+
project: headers['x-mcp-project'] || headers['x-project'],
|
|
122
|
+
ip: request.ip,
|
|
123
|
+
userAgent: headers['user-agent'],
|
|
124
|
+
timestamp: Date.now()
|
|
125
|
+
};
|
|
126
|
+
return { sessionId, clientContext };
|
|
127
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SSE Stream Management Utilities for MCP Gateway.
|
|
3
|
+
* Handles cleanup and management of Server-Sent Events streams.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Helper to clean up stale SSE streams before handling new requests.
|
|
7
|
+
* This preserves sessionId and only cleans up SDK-internal stream state.
|
|
8
|
+
*
|
|
9
|
+
* @param transport - The StreamableHTTPServerTransport instance from MCP SDK
|
|
10
|
+
* @param sessionId - The current session ID for logging purposes
|
|
11
|
+
*/
|
|
12
|
+
export declare function cleanupStaleSseStreams(transport: unknown, sessionId: string): void;
|
|
13
|
+
//# sourceMappingURL=sse-stream-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse-stream-manager.d.ts","sourceRoot":"","sources":["../../../../../src/api/mcp/sse-stream-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CA8ClF"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SSE Stream Management Utilities for MCP Gateway.
|
|
3
|
+
* Handles cleanup and management of Server-Sent Events streams.
|
|
4
|
+
*/
|
|
5
|
+
import { logger, LOG_MODULES } from '../../utils/logger.js';
|
|
6
|
+
/**
|
|
7
|
+
* Helper to clean up stale SSE streams before handling new requests.
|
|
8
|
+
* This preserves sessionId and only cleans up SDK-internal stream state.
|
|
9
|
+
*
|
|
10
|
+
* @param transport - The StreamableHTTPServerTransport instance from MCP SDK
|
|
11
|
+
* @param sessionId - The current session ID for logging purposes
|
|
12
|
+
*/
|
|
13
|
+
export function cleanupStaleSseStreams(transport, sessionId) {
|
|
14
|
+
try {
|
|
15
|
+
// Access internal SDK structures to clean up stream mapping
|
|
16
|
+
// The transport wraps a WebStandardStreamableHTTPServerTransport internally
|
|
17
|
+
const webTransport = transport._webStandardTransport;
|
|
18
|
+
if (webTransport?._streamMapping) {
|
|
19
|
+
const streamId = webTransport._standaloneSseStreamId || '_GET_stream';
|
|
20
|
+
const existingStream = webTransport._streamMapping.get(streamId);
|
|
21
|
+
if (existingStream) {
|
|
22
|
+
logger.debug(`Cleaning up stale SSE stream for session ${sessionId} (preserving session state)`, LOG_MODULES.GATEWAY);
|
|
23
|
+
// Try to call cleanup if available on the stream object
|
|
24
|
+
const streamWithCleanup = existingStream;
|
|
25
|
+
if (typeof streamWithCleanup.cleanup === 'function') {
|
|
26
|
+
streamWithCleanup.cleanup();
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
// Fallback: directly delete from mapping
|
|
30
|
+
webTransport._streamMapping.delete(streamId);
|
|
31
|
+
}
|
|
32
|
+
logger.debug(`Successfully cleaned up SSE stream mapping for session ${sessionId}`, LOG_MODULES.GATEWAY);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
// Non-critical error - if we can't clean up, just continue
|
|
38
|
+
logger.debug(`Error cleaning up SSE streams (non-critical, continuing): ${error}`, LOG_MODULES.GATEWAY);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { FastifyInstance } from 'fastify';
|
|
2
|
+
/**
|
|
3
|
+
* Registers web API routes for client management endpoints.
|
|
4
|
+
*
|
|
5
|
+
* This function sets up the HTTP routes that allow external clients to retrieve
|
|
6
|
+
* information about currently connected clients tracked by the system. The client
|
|
7
|
+
* tracking service maintains real-time information about all active connections,
|
|
8
|
+
* including session details, client metadata, and connection status.
|
|
9
|
+
*
|
|
10
|
+
* Primary Use Cases:
|
|
11
|
+
* - Monitoring dashboard to display active client connections
|
|
12
|
+
* - Debugging and diagnostics for client connectivity issues
|
|
13
|
+
* - Integration with external monitoring systems
|
|
14
|
+
* - Client lifecycle management and auditing
|
|
15
|
+
*
|
|
16
|
+
* The registered endpoint provides read-only access to client data and includes
|
|
17
|
+
* proper error handling with appropriate HTTP status codes and logging.
|
|
18
|
+
*
|
|
19
|
+
* @param fastify - The Fastify instance to register routes on
|
|
20
|
+
* @returns Promise<void> - Resolves when routes are registered
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* // Register client routes
|
|
24
|
+
* await webClientRoutes(app);
|
|
25
|
+
*
|
|
26
|
+
* // Client can then make GET request to /api/clients
|
|
27
|
+
* // Returns: Array of ClientContext objects with session and connection details
|
|
28
|
+
*/
|
|
29
|
+
export declare function webClientRoutes(fastify: FastifyInstance): Promise<void>;
|
|
30
|
+
//# sourceMappingURL=clients.d.ts.map
|