@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.
Files changed (499) hide show
  1. package/CHANGELOG.md +228 -0
  2. package/LICENSE +21 -0
  3. package/README.md +354 -0
  4. package/dist/client/assets/HomeView-f901HeKw.js +1 -0
  5. package/dist/client/assets/ResourceDetailView-BdOaL_-o.css +1 -0
  6. package/dist/client/assets/ResourceDetailView-Bz66ZjfY.js +1 -0
  7. package/dist/client/assets/ResourcesView-CjMklkyv.css +1 -0
  8. package/dist/client/assets/ResourcesView-lI_fItfA.js +1 -0
  9. package/dist/client/assets/ServerDashboard-7_8Og9JJ.css +1 -0
  10. package/dist/client/assets/ServerDashboard-Bgx8WVkx.js +2 -0
  11. package/dist/client/assets/ServerListView-Bws09jNR.css +1 -0
  12. package/dist/client/assets/ServerListView-CP6Ffkfx.js +30 -0
  13. package/dist/client/assets/ServerStatusTags.vue_vue_type_script_setup_true_lang-BHiTFM7-.js +1 -0
  14. package/dist/client/assets/SessionsView-D68qKR4D.js +1 -0
  15. package/dist/client/assets/SettingsView-BPYfO9BE.js +1 -0
  16. package/dist/client/assets/ToolCallDialog-Br8FNebN.js +1 -0
  17. package/dist/client/assets/ToolCallDialog-C7eh7jHE.css +1 -0
  18. package/dist/client/assets/ToolsView-B6hUiR43.js +1 -0
  19. package/dist/client/assets/ToolsView-BLnU8cV6.css +1 -0
  20. package/dist/client/assets/_baseClone-DCmK847M.js +1 -0
  21. package/dist/client/assets/_plugin-vue_export-helper-DlAUqK2U.js +1 -0
  22. package/dist/client/assets/el-form-item-BVMLpmVC.css +1 -0
  23. package/dist/client/assets/el-form-item-DM0q2hmO.js +12 -0
  24. package/dist/client/assets/el-input-BtI9NECe.js +1 -0
  25. package/dist/client/assets/el-input-CmuHb8HS.css +1 -0
  26. package/dist/client/assets/el-loading-CChNmKeI.js +1 -0
  27. package/dist/client/assets/el-loading-bpKhqqQq.css +1 -0
  28. package/dist/client/assets/el-overlay-B2ZKM6Up.css +1 -0
  29. package/dist/client/assets/el-overlay-lZZbPmsX.js +1 -0
  30. package/dist/client/assets/el-select-BXztu2b5.js +1 -0
  31. package/dist/client/assets/el-select-C0U_l4IZ.css +1 -0
  32. package/dist/client/assets/el-tab-pane-CnNoQHsR.css +1 -0
  33. package/dist/client/assets/el-tab-pane-Dy9ruaEX.js +1 -0
  34. package/dist/client/assets/el-table-column-98UyVgBH.js +1 -0
  35. package/dist/client/assets/el-table-column-T_mV9jNw.css +1 -0
  36. package/dist/client/assets/el-tag-B5lLT51E.js +1 -0
  37. package/dist/client/assets/el-tag-DjxZVOpb.css +1 -0
  38. package/dist/client/assets/event-BB_Ol6Sd.js +1 -0
  39. package/dist/client/assets/index-BgKcmWJr.js +1 -0
  40. package/dist/client/assets/index-BsDWtoIl.css +1 -0
  41. package/dist/client/assets/index-BzQXG7no.js +1 -0
  42. package/dist/client/assets/index-CSTs2jYk.js +2 -0
  43. package/dist/client/assets/omit-Bx5HJNV_.js +1 -0
  44. package/dist/client/assets/raf-B9VDMtMF.js +1 -0
  45. package/dist/client/assets/typescript-Bp3YSIOJ.js +1 -0
  46. package/dist/client/assets/vnode-B8aJx8u4.js +1 -0
  47. package/dist/client/assets/vue-vendor-6ny5zj9i.js +3 -0
  48. package/dist/client/index.html +15 -0
  49. package/dist/server/shared/index.d.ts +3 -0
  50. package/dist/server/shared/index.d.ts.map +1 -0
  51. package/dist/server/shared/index.js +2 -0
  52. package/dist/server/shared/models/index.d.ts +4 -0
  53. package/dist/server/shared/models/index.d.ts.map +1 -0
  54. package/dist/server/shared/models/index.js +3 -0
  55. package/dist/server/shared/models/resource.model.d.ts +8 -0
  56. package/dist/server/shared/models/resource.model.d.ts.map +1 -0
  57. package/dist/server/shared/models/resource.model.js +1 -0
  58. package/dist/server/shared/models/server.model.d.ts +57 -0
  59. package/dist/server/shared/models/server.model.d.ts.map +1 -0
  60. package/dist/server/shared/models/server.model.js +1 -0
  61. package/dist/server/shared/models/session.model.d.ts +73 -0
  62. package/dist/server/shared/models/session.model.d.ts.map +1 -0
  63. package/dist/server/shared/models/session.model.js +70 -0
  64. package/dist/server/shared/models/tool.model.d.ts +22 -0
  65. package/dist/server/shared/models/tool.model.d.ts.map +1 -0
  66. package/dist/server/shared/models/tool.model.js +1 -0
  67. package/dist/server/shared/types/client.types.d.ts +35 -0
  68. package/dist/server/shared/types/client.types.d.ts.map +1 -0
  69. package/dist/server/shared/types/client.types.js +5 -0
  70. package/dist/server/shared/types/common.types.d.ts +5 -0
  71. package/dist/server/shared/types/common.types.d.ts.map +1 -0
  72. package/dist/server/shared/types/common.types.js +2 -0
  73. package/dist/server/shared/types/index.d.ts +4 -0
  74. package/dist/server/shared/types/index.d.ts.map +1 -0
  75. package/dist/server/shared/types/index.js +3 -0
  76. package/dist/server/shared/types/session.types.d.ts +15 -0
  77. package/dist/server/shared/types/session.types.d.ts.map +1 -0
  78. package/dist/server/shared/types/session.types.js +5 -0
  79. package/dist/server/shared/types/websocket.types.d.ts +177 -0
  80. package/dist/server/shared/types/websocket.types.d.ts.map +1 -0
  81. package/dist/server/shared/types/websocket.types.js +25 -0
  82. package/dist/server/src/api/mcp/debug-response-wrapper.d.ts +13 -0
  83. package/dist/server/src/api/mcp/debug-response-wrapper.d.ts.map +1 -0
  84. package/dist/server/src/api/mcp/debug-response-wrapper.js +271 -0
  85. package/dist/server/src/api/mcp/gateway.d.ts +14 -0
  86. package/dist/server/src/api/mcp/gateway.d.ts.map +1 -0
  87. package/dist/server/src/api/mcp/gateway.js +116 -0
  88. package/dist/server/src/api/mcp/session-context-extractor.d.ts +47 -0
  89. package/dist/server/src/api/mcp/session-context-extractor.d.ts.map +1 -0
  90. package/dist/server/src/api/mcp/session-context-extractor.js +127 -0
  91. package/dist/server/src/api/mcp/sse-stream-manager.d.ts +13 -0
  92. package/dist/server/src/api/mcp/sse-stream-manager.d.ts.map +1 -0
  93. package/dist/server/src/api/mcp/sse-stream-manager.js +40 -0
  94. package/dist/server/src/api/web/clients.d.ts +30 -0
  95. package/dist/server/src/api/web/clients.d.ts.map +1 -0
  96. package/dist/server/src/api/web/clients.js +41 -0
  97. package/dist/server/src/api/web/config.d.ts +21 -0
  98. package/dist/server/src/api/web/config.d.ts.map +1 -0
  99. package/dist/server/src/api/web/config.js +119 -0
  100. package/dist/server/src/api/web/health.d.ts +21 -0
  101. package/dist/server/src/api/web/health.d.ts.map +1 -0
  102. package/dist/server/src/api/web/health.js +24 -0
  103. package/dist/server/src/api/web/hub-tools.d.ts +30 -0
  104. package/dist/server/src/api/web/hub-tools.d.ts.map +1 -0
  105. package/dist/server/src/api/web/hub-tools.js +202 -0
  106. package/dist/server/src/api/web/logs.d.ts +30 -0
  107. package/dist/server/src/api/web/logs.d.ts.map +1 -0
  108. package/dist/server/src/api/web/logs.js +141 -0
  109. package/dist/server/src/api/web/mcp-status.d.ts +29 -0
  110. package/dist/server/src/api/web/mcp-status.d.ts.map +1 -0
  111. package/dist/server/src/api/web/mcp-status.js +126 -0
  112. package/dist/server/src/api/web/resources.d.ts +28 -0
  113. package/dist/server/src/api/web/resources.d.ts.map +1 -0
  114. package/dist/server/src/api/web/resources.js +93 -0
  115. package/dist/server/src/api/web/search.d.ts +26 -0
  116. package/dist/server/src/api/web/search.d.ts.map +1 -0
  117. package/dist/server/src/api/web/search.js +62 -0
  118. package/dist/server/src/api/web/servers.d.ts +33 -0
  119. package/dist/server/src/api/web/servers.d.ts.map +1 -0
  120. package/dist/server/src/api/web/servers.js +235 -0
  121. package/dist/server/src/api/web/sessions.d.ts +29 -0
  122. package/dist/server/src/api/web/sessions.d.ts.map +1 -0
  123. package/dist/server/src/api/web/sessions.js +104 -0
  124. package/dist/server/src/api/ws/events.d.ts +29 -0
  125. package/dist/server/src/api/ws/events.d.ts.map +1 -0
  126. package/dist/server/src/api/ws/events.js +44 -0
  127. package/dist/server/src/api/ws/ws-handler.d.ts +83 -0
  128. package/dist/server/src/api/ws/ws-handler.d.ts.map +1 -0
  129. package/dist/server/src/api/ws/ws-handler.js +217 -0
  130. package/dist/server/src/app.d.ts +24 -0
  131. package/dist/server/src/app.d.ts.map +1 -0
  132. package/dist/server/src/app.js +108 -0
  133. package/dist/server/src/cli/commands/list.d.ts +71 -0
  134. package/dist/server/src/cli/commands/list.d.ts.map +1 -0
  135. package/dist/server/src/cli/commands/list.js +97 -0
  136. package/dist/server/src/cli/commands/restart.d.ts +42 -0
  137. package/dist/server/src/cli/commands/restart.d.ts.map +1 -0
  138. package/dist/server/src/cli/commands/restart.js +61 -0
  139. package/dist/server/src/cli/commands/start.d.ts +43 -0
  140. package/dist/server/src/cli/commands/start.d.ts.map +1 -0
  141. package/dist/server/src/cli/commands/start.js +160 -0
  142. package/dist/server/src/cli/commands/status.d.ts +39 -0
  143. package/dist/server/src/cli/commands/status.d.ts.map +1 -0
  144. package/dist/server/src/cli/commands/status.js +164 -0
  145. package/dist/server/src/cli/commands/stop.d.ts +34 -0
  146. package/dist/server/src/cli/commands/stop.d.ts.map +1 -0
  147. package/dist/server/src/cli/commands/stop.js +47 -0
  148. package/dist/server/src/cli/commands/ui.d.ts +44 -0
  149. package/dist/server/src/cli/commands/ui.d.ts.map +1 -0
  150. package/dist/server/src/cli/commands/ui.js +95 -0
  151. package/dist/server/src/cli/index.d.ts +62 -0
  152. package/dist/server/src/cli/index.d.ts.map +1 -0
  153. package/dist/server/src/cli/index.js +88 -0
  154. package/dist/server/src/cli/parse-args.d.ts +108 -0
  155. package/dist/server/src/cli/parse-args.d.ts.map +1 -0
  156. package/dist/server/src/cli/parse-args.js +131 -0
  157. package/dist/server/src/cli/server.d.ts +171 -0
  158. package/dist/server/src/cli/server.d.ts.map +1 -0
  159. package/dist/server/src/cli/server.js +246 -0
  160. package/dist/server/src/config/config-change-logger.d.ts +16 -0
  161. package/dist/server/src/config/config-change-logger.d.ts.map +1 -0
  162. package/dist/server/src/config/config-change-logger.js +43 -0
  163. package/dist/server/src/config/config-loader.d.ts +22 -0
  164. package/dist/server/src/config/config-loader.d.ts.map +1 -0
  165. package/dist/server/src/config/config-loader.js +66 -0
  166. package/dist/server/src/config/config-manager.d.ts +158 -0
  167. package/dist/server/src/config/config-manager.d.ts.map +1 -0
  168. package/dist/server/src/config/config-manager.js +246 -0
  169. package/dist/server/src/config/config-saver.d.ts +16 -0
  170. package/dist/server/src/config/config-saver.d.ts.map +1 -0
  171. package/dist/server/src/config/config-saver.js +28 -0
  172. package/dist/server/src/config/config.schema.d.ts +108 -0
  173. package/dist/server/src/config/config.schema.d.ts.map +1 -0
  174. package/dist/server/src/config/config.schema.js +103 -0
  175. package/dist/server/src/config/server-config-manager.d.ts +74 -0
  176. package/dist/server/src/config/server-config-manager.d.ts.map +1 -0
  177. package/dist/server/src/config/server-config-manager.js +157 -0
  178. package/dist/server/src/config/type-converter.d.ts +13 -0
  179. package/dist/server/src/config/type-converter.d.ts.map +1 -0
  180. package/dist/server/src/config/type-converter.js +37 -0
  181. package/dist/server/src/index.d.ts +3 -0
  182. package/dist/server/src/index.d.ts.map +1 -0
  183. package/dist/server/src/index.js +352 -0
  184. package/dist/server/src/models/event.model.d.ts +106 -0
  185. package/dist/server/src/models/event.model.d.ts.map +1 -0
  186. package/dist/server/src/models/event.model.js +5 -0
  187. package/dist/server/src/models/server.model.d.ts +19 -0
  188. package/dist/server/src/models/server.model.d.ts.map +1 -0
  189. package/dist/server/src/models/server.model.js +1 -0
  190. package/dist/server/src/models/system-tools.constants.d.ts +73 -0
  191. package/dist/server/src/models/system-tools.constants.d.ts.map +1 -0
  192. package/dist/server/src/models/system-tools.constants.js +31 -0
  193. package/dist/server/src/models/types.d.ts +84 -0
  194. package/dist/server/src/models/types.d.ts.map +1 -0
  195. package/dist/server/src/models/types.js +67 -0
  196. package/dist/server/src/pid/file.d.ts +26 -0
  197. package/dist/server/src/pid/file.d.ts.map +1 -0
  198. package/dist/server/src/pid/file.js +68 -0
  199. package/dist/server/src/pid/manager.d.ts +98 -0
  200. package/dist/server/src/pid/manager.d.ts.map +1 -0
  201. package/dist/server/src/pid/manager.js +158 -0
  202. package/dist/server/src/pid/types.d.ts +13 -0
  203. package/dist/server/src/pid/types.d.ts.map +1 -0
  204. package/dist/server/src/pid/types.js +4 -0
  205. package/dist/server/src/server/dev-server.d.ts +2 -0
  206. package/dist/server/src/server/dev-server.d.ts.map +1 -0
  207. package/dist/server/src/server/dev-server.js +171 -0
  208. package/dist/server/src/server/runner.d.ts +57 -0
  209. package/dist/server/src/server/runner.d.ts.map +1 -0
  210. package/dist/server/src/server/runner.js +163 -0
  211. package/dist/server/src/services/client-tracker.service.d.ts +132 -0
  212. package/dist/server/src/services/client-tracker.service.d.ts.map +1 -0
  213. package/dist/server/src/services/client-tracker.service.js +203 -0
  214. package/dist/server/src/services/connection/connection-manager.d.ts +478 -0
  215. package/dist/server/src/services/connection/connection-manager.d.ts.map +1 -0
  216. package/dist/server/src/services/connection/connection-manager.js +929 -0
  217. package/dist/server/src/services/connection/index.d.ts +6 -0
  218. package/dist/server/src/services/connection/index.d.ts.map +1 -0
  219. package/dist/server/src/services/connection/index.js +4 -0
  220. package/dist/server/src/services/connection/tool-cache.d.ts +122 -0
  221. package/dist/server/src/services/connection/tool-cache.d.ts.map +1 -0
  222. package/dist/server/src/services/connection/tool-cache.js +202 -0
  223. package/dist/server/src/services/connection/types.d.ts +30 -0
  224. package/dist/server/src/services/connection/types.d.ts.map +1 -0
  225. package/dist/server/src/services/connection/types.js +1 -0
  226. package/dist/server/src/services/event-bus.service.d.ts +169 -0
  227. package/dist/server/src/services/event-bus.service.d.ts.map +1 -0
  228. package/dist/server/src/services/event-bus.service.js +200 -0
  229. package/dist/server/src/services/gateway/gateway.service.d.ts +61 -0
  230. package/dist/server/src/services/gateway/gateway.service.d.ts.map +1 -0
  231. package/dist/server/src/services/gateway/gateway.service.js +107 -0
  232. package/dist/server/src/services/gateway/index.d.ts +8 -0
  233. package/dist/server/src/services/gateway/index.d.ts.map +1 -0
  234. package/dist/server/src/services/gateway/index.js +6 -0
  235. package/dist/server/src/services/gateway/log-formatter.d.ts +26 -0
  236. package/dist/server/src/services/gateway/log-formatter.d.ts.map +1 -0
  237. package/dist/server/src/services/gateway/log-formatter.js +66 -0
  238. package/dist/server/src/services/gateway/request-handlers/call-tool-handler.d.ts +13 -0
  239. package/dist/server/src/services/gateway/request-handlers/call-tool-handler.d.ts.map +1 -0
  240. package/dist/server/src/services/gateway/request-handlers/call-tool-handler.js +131 -0
  241. package/dist/server/src/services/gateway/request-handlers/index.d.ts +9 -0
  242. package/dist/server/src/services/gateway/request-handlers/index.d.ts.map +1 -0
  243. package/dist/server/src/services/gateway/request-handlers/index.js +8 -0
  244. package/dist/server/src/services/gateway/request-handlers/initialize-handler.d.ts +11 -0
  245. package/dist/server/src/services/gateway/request-handlers/initialize-handler.d.ts.map +1 -0
  246. package/dist/server/src/services/gateway/request-handlers/initialize-handler.js +85 -0
  247. package/dist/server/src/services/gateway/request-handlers/resources-handler.d.ts +11 -0
  248. package/dist/server/src/services/gateway/request-handlers/resources-handler.d.ts.map +1 -0
  249. package/dist/server/src/services/gateway/request-handlers/resources-handler.js +56 -0
  250. package/dist/server/src/services/gateway/request-handlers/system-tools-handler.d.ts +11 -0
  251. package/dist/server/src/services/gateway/request-handlers/system-tools-handler.d.ts.map +1 -0
  252. package/dist/server/src/services/gateway/request-handlers/system-tools-handler.js +228 -0
  253. package/dist/server/src/services/gateway/request-handlers/tools-handler.d.ts +11 -0
  254. package/dist/server/src/services/gateway/request-handlers/tools-handler.d.ts.map +1 -0
  255. package/dist/server/src/services/gateway/request-handlers/tools-handler.js +79 -0
  256. package/dist/server/src/services/gateway/tool-list-generator.d.ts +23 -0
  257. package/dist/server/src/services/gateway/tool-list-generator.d.ts.map +1 -0
  258. package/dist/server/src/services/gateway/tool-list-generator.js +115 -0
  259. package/dist/server/src/services/gateway/types.d.ts +27 -0
  260. package/dist/server/src/services/gateway/types.d.ts.map +1 -0
  261. package/dist/server/src/services/gateway/types.js +4 -0
  262. package/dist/server/src/services/gateway.service.d.ts +7 -0
  263. package/dist/server/src/services/gateway.service.d.ts.map +1 -0
  264. package/dist/server/src/services/gateway.service.js +6 -0
  265. package/dist/server/src/services/hub-manager.service.d.ts +299 -0
  266. package/dist/server/src/services/hub-manager.service.d.ts.map +1 -0
  267. package/dist/server/src/services/hub-manager.service.js +413 -0
  268. package/dist/server/src/services/hub-tools/index.d.ts +10 -0
  269. package/dist/server/src/services/hub-tools/index.d.ts.map +1 -0
  270. package/dist/server/src/services/hub-tools/index.js +6 -0
  271. package/dist/server/src/services/hub-tools/resource-generator.d.ts +63 -0
  272. package/dist/server/src/services/hub-tools/resource-generator.d.ts.map +1 -0
  273. package/dist/server/src/services/hub-tools/resource-generator.js +141 -0
  274. package/dist/server/src/services/hub-tools/server-selector.d.ts +63 -0
  275. package/dist/server/src/services/hub-tools/server-selector.d.ts.map +1 -0
  276. package/dist/server/src/services/hub-tools/server-selector.js +108 -0
  277. package/dist/server/src/services/hub-tools/system-tool-definitions.d.ts +47 -0
  278. package/dist/server/src/services/hub-tools/system-tool-definitions.d.ts.map +1 -0
  279. package/dist/server/src/services/hub-tools/system-tool-definitions.js +225 -0
  280. package/dist/server/src/services/hub-tools/tool-search.d.ts +85 -0
  281. package/dist/server/src/services/hub-tools/tool-search.d.ts.map +1 -0
  282. package/dist/server/src/services/hub-tools/tool-search.js +115 -0
  283. package/dist/server/src/services/hub-tools/types.d.ts +42 -0
  284. package/dist/server/src/services/hub-tools/types.d.ts.map +1 -0
  285. package/dist/server/src/services/hub-tools/types.js +1 -0
  286. package/dist/server/src/services/hub-tools.service.d.ts +235 -0
  287. package/dist/server/src/services/hub-tools.service.d.ts.map +1 -0
  288. package/dist/server/src/services/hub-tools.service.js +457 -0
  289. package/dist/server/src/services/log-storage.service.d.ts +177 -0
  290. package/dist/server/src/services/log-storage.service.d.ts.map +1 -0
  291. package/dist/server/src/services/log-storage.service.js +243 -0
  292. package/dist/server/src/services/mcp-connection-manager.d.ts +7 -0
  293. package/dist/server/src/services/mcp-connection-manager.d.ts.map +1 -0
  294. package/dist/server/src/services/mcp-connection-manager.js +6 -0
  295. package/dist/server/src/services/mcp-session-manager.d.ts +6 -0
  296. package/dist/server/src/services/mcp-session-manager.d.ts.map +1 -0
  297. package/dist/server/src/services/mcp-session-manager.js +4 -0
  298. package/dist/server/src/services/search/index.d.ts +5 -0
  299. package/dist/server/src/services/search/index.d.ts.map +1 -0
  300. package/dist/server/src/services/search/index.js +5 -0
  301. package/dist/server/src/services/search/search-cache.d.ts +132 -0
  302. package/dist/server/src/services/search/search-cache.d.ts.map +1 -0
  303. package/dist/server/src/services/search/search-cache.js +151 -0
  304. package/dist/server/src/services/search/search-core.service.d.ts +108 -0
  305. package/dist/server/src/services/search/search-core.service.d.ts.map +1 -0
  306. package/dist/server/src/services/search/search-core.service.js +187 -0
  307. package/dist/server/src/services/search/search-scorer.d.ts +54 -0
  308. package/dist/server/src/services/search/search-scorer.d.ts.map +1 -0
  309. package/dist/server/src/services/search/search-scorer.js +83 -0
  310. package/dist/server/src/services/search/types.d.ts +20 -0
  311. package/dist/server/src/services/search/types.d.ts.map +1 -0
  312. package/dist/server/src/services/search/types.js +1 -0
  313. package/dist/server/src/services/session/index.d.ts +6 -0
  314. package/dist/server/src/services/session/index.d.ts.map +1 -0
  315. package/dist/server/src/services/session/index.js +4 -0
  316. package/dist/server/src/services/session/session-manager.d.ts +352 -0
  317. package/dist/server/src/services/session/session-manager.d.ts.map +1 -0
  318. package/dist/server/src/services/session/session-manager.js +835 -0
  319. package/dist/server/src/services/session/types.d.ts +32 -0
  320. package/dist/server/src/services/session/types.d.ts.map +1 -0
  321. package/dist/server/src/services/session/types.js +1 -0
  322. package/dist/server/src/services/simple-search.service.d.ts +67 -0
  323. package/dist/server/src/services/simple-search.service.d.ts.map +1 -0
  324. package/dist/server/src/services/simple-search.service.js +82 -0
  325. package/dist/server/src/services/system-tool-handler.d.ts +10 -0
  326. package/dist/server/src/services/system-tool-handler.d.ts.map +1 -0
  327. package/dist/server/src/services/system-tool-handler.js +77 -0
  328. package/dist/server/src/utils/error-handler.d.ts +18 -0
  329. package/dist/server/src/utils/error-handler.d.ts.map +1 -0
  330. package/dist/server/src/utils/error-handler.js +59 -0
  331. package/dist/server/src/utils/format-utils.d.ts +23 -0
  332. package/dist/server/src/utils/format-utils.d.ts.map +1 -0
  333. package/dist/server/src/utils/format-utils.js +58 -0
  334. package/dist/server/src/utils/index.d.ts +2 -0
  335. package/dist/server/src/utils/index.d.ts.map +1 -0
  336. package/dist/server/src/utils/index.js +1 -0
  337. package/dist/server/src/utils/json-utils.d.ts +82 -0
  338. package/dist/server/src/utils/json-utils.d.ts.map +1 -0
  339. package/dist/server/src/utils/json-utils.js +204 -0
  340. package/dist/server/src/utils/log-rotator.d.ts +223 -0
  341. package/dist/server/src/utils/log-rotator.d.ts.map +1 -0
  342. package/dist/server/src/utils/log-rotator.js +306 -0
  343. package/dist/server/src/utils/logger/dev-logger.d.ts +39 -0
  344. package/dist/server/src/utils/logger/dev-logger.d.ts.map +1 -0
  345. package/dist/server/src/utils/logger/dev-logger.js +63 -0
  346. package/dist/server/src/utils/logger/index.d.ts +36 -0
  347. package/dist/server/src/utils/logger/index.d.ts.map +1 -0
  348. package/dist/server/src/utils/logger/index.js +46 -0
  349. package/dist/server/src/utils/logger/log-colors.d.ts +27 -0
  350. package/dist/server/src/utils/logger/log-colors.d.ts.map +1 -0
  351. package/dist/server/src/utils/logger/log-colors.js +41 -0
  352. package/dist/server/src/utils/logger/log-context.d.ts +13 -0
  353. package/dist/server/src/utils/logger/log-context.d.ts.map +1 -0
  354. package/dist/server/src/utils/logger/log-context.js +5 -0
  355. package/dist/server/src/utils/logger/log-formatter.d.ts +47 -0
  356. package/dist/server/src/utils/logger/log-formatter.d.ts.map +1 -0
  357. package/dist/server/src/utils/logger/log-formatter.js +150 -0
  358. package/dist/server/src/utils/logger/log-modules.d.ts +141 -0
  359. package/dist/server/src/utils/logger/log-modules.d.ts.map +1 -0
  360. package/dist/server/src/utils/logger/log-modules.js +81 -0
  361. package/dist/server/src/utils/logger/log-output.d.ts +68 -0
  362. package/dist/server/src/utils/logger/log-output.d.ts.map +1 -0
  363. package/dist/server/src/utils/logger/log-output.js +320 -0
  364. package/dist/server/src/utils/logger/logger.d.ts +190 -0
  365. package/dist/server/src/utils/logger/logger.d.ts.map +1 -0
  366. package/dist/server/src/utils/logger/logger.js +350 -0
  367. package/dist/server/src/utils/logger.d.ts +12 -0
  368. package/dist/server/src/utils/logger.d.ts.map +1 -0
  369. package/dist/server/src/utils/logger.js +12 -0
  370. package/dist/server/src/utils/mcp-error-handler.d.ts +162 -0
  371. package/dist/server/src/utils/mcp-error-handler.d.ts.map +1 -0
  372. package/dist/server/src/utils/mcp-error-handler.js +270 -0
  373. package/dist/server/src/utils/port-checker.d.ts +16 -0
  374. package/dist/server/src/utils/port-checker.d.ts.map +1 -0
  375. package/dist/server/src/utils/port-checker.js +242 -0
  376. package/dist/server/src/utils/request-context.d.ts +71 -0
  377. package/dist/server/src/utils/request-context.d.ts.map +1 -0
  378. package/dist/server/src/utils/request-context.js +73 -0
  379. package/dist/server/src/utils/tool-args-parser.d.ts +17 -0
  380. package/dist/server/src/utils/tool-args-parser.d.ts.map +1 -0
  381. package/dist/server/src/utils/tool-args-parser.js +34 -0
  382. package/dist/server/src/utils/transports/sse-transport.d.ts +104 -0
  383. package/dist/server/src/utils/transports/sse-transport.d.ts.map +1 -0
  384. package/dist/server/src/utils/transports/sse-transport.js +189 -0
  385. package/dist/server/src/utils/transports/stdio-transport.d.ts +122 -0
  386. package/dist/server/src/utils/transports/stdio-transport.d.ts.map +1 -0
  387. package/dist/server/src/utils/transports/stdio-transport.js +324 -0
  388. package/dist/server/src/utils/transports/streamable-http-transport.d.ts +146 -0
  389. package/dist/server/src/utils/transports/streamable-http-transport.d.ts.map +1 -0
  390. package/dist/server/src/utils/transports/streamable-http-transport.js +212 -0
  391. package/dist/server/src/utils/transports/transport-factory.d.ts +26 -0
  392. package/dist/server/src/utils/transports/transport-factory.d.ts.map +1 -0
  393. package/dist/server/src/utils/transports/transport-factory.js +104 -0
  394. package/dist/server/src/utils/transports/transport.interface.d.ts +35 -0
  395. package/dist/server/src/utils/transports/transport.interface.d.ts.map +1 -0
  396. package/dist/server/src/utils/transports/transport.interface.js +1 -0
  397. package/dist/server/tests/contract/mcp-protocol/initialize.test.d.ts +2 -0
  398. package/dist/server/tests/contract/mcp-protocol/initialize.test.d.ts.map +1 -0
  399. package/dist/server/tests/contract/mcp-protocol/initialize.test.js +103 -0
  400. package/dist/server/tests/contract/mcp-protocol/tools-call.test.d.ts +2 -0
  401. package/dist/server/tests/contract/mcp-protocol/tools-call.test.d.ts.map +1 -0
  402. package/dist/server/tests/contract/mcp-protocol/tools-call.test.js +181 -0
  403. package/dist/server/tests/contract/mcp-protocol/tools-list.test.d.ts +2 -0
  404. package/dist/server/tests/contract/mcp-protocol/tools-list.test.d.ts.map +1 -0
  405. package/dist/server/tests/contract/mcp-protocol/tools-list.test.js +155 -0
  406. package/dist/server/tests/evaluation/evaluation.test.d.ts +2 -0
  407. package/dist/server/tests/evaluation/evaluation.test.d.ts.map +1 -0
  408. package/dist/server/tests/evaluation/evaluation.test.js +102 -0
  409. package/dist/server/tests/helpers/sdk-test-helpers.d.ts +32 -0
  410. package/dist/server/tests/helpers/sdk-test-helpers.d.ts.map +1 -0
  411. package/dist/server/tests/helpers/sdk-test-helpers.js +82 -0
  412. package/dist/server/tests/integration/api/gateway.test.d.ts +2 -0
  413. package/dist/server/tests/integration/api/gateway.test.d.ts.map +1 -0
  414. package/dist/server/tests/integration/api/gateway.test.js +366 -0
  415. package/dist/server/tests/integration/gateway/fault-tolerance.test.d.ts +2 -0
  416. package/dist/server/tests/integration/gateway/fault-tolerance.test.d.ts.map +1 -0
  417. package/dist/server/tests/integration/gateway/fault-tolerance.test.js +109 -0
  418. package/dist/server/tests/integration/gateway/mcp-connection.test.d.ts +2 -0
  419. package/dist/server/tests/integration/gateway/mcp-connection.test.d.ts.map +1 -0
  420. package/dist/server/tests/integration/gateway/mcp-connection.test.js +149 -0
  421. package/dist/server/tests/server.test.d.ts +2 -0
  422. package/dist/server/tests/server.test.d.ts.map +1 -0
  423. package/dist/server/tests/server.test.js +95 -0
  424. package/dist/server/tests/setup.d.ts +7 -0
  425. package/dist/server/tests/setup.d.ts.map +1 -0
  426. package/dist/server/tests/setup.js +53 -0
  427. package/dist/server/tests/types/logger-test-helpers.d.ts +17 -0
  428. package/dist/server/tests/types/logger-test-helpers.d.ts.map +1 -0
  429. package/dist/server/tests/types/logger-test-helpers.js +4 -0
  430. package/dist/server/tests/types/test-helpers.d.ts +27 -0
  431. package/dist/server/tests/types/test-helpers.d.ts.map +1 -0
  432. package/dist/server/tests/types/test-helpers.js +4 -0
  433. package/dist/server/tests/unit/cli/basic-cli.test.d.ts +2 -0
  434. package/dist/server/tests/unit/cli/basic-cli.test.d.ts.map +1 -0
  435. package/dist/server/tests/unit/cli/basic-cli.test.js +33 -0
  436. package/dist/server/tests/unit/cli/cli.test.d.ts +2 -0
  437. package/dist/server/tests/unit/cli/cli.test.d.ts.map +1 -0
  438. package/dist/server/tests/unit/cli/cli.test.js +17 -0
  439. package/dist/server/tests/unit/cli/commands.test.d.ts +2 -0
  440. package/dist/server/tests/unit/cli/commands.test.d.ts.map +1 -0
  441. package/dist/server/tests/unit/cli/commands.test.js +75 -0
  442. package/dist/server/tests/unit/cli/server.test.d.ts +2 -0
  443. package/dist/server/tests/unit/cli/server.test.d.ts.map +1 -0
  444. package/dist/server/tests/unit/cli/server.test.js +68 -0
  445. package/dist/server/tests/unit/server/runner.test.d.ts +2 -0
  446. package/dist/server/tests/unit/server/runner.test.d.ts.map +1 -0
  447. package/dist/server/tests/unit/server/runner.test.js +488 -0
  448. package/dist/server/tests/unit/server/setup.d.ts +2 -0
  449. package/dist/server/tests/unit/server/setup.d.ts.map +1 -0
  450. package/dist/server/tests/unit/server/setup.js +21 -0
  451. package/dist/server/tests/unit/services/gateway-logging.test.d.ts +2 -0
  452. package/dist/server/tests/unit/services/gateway-logging.test.d.ts.map +1 -0
  453. package/dist/server/tests/unit/services/gateway-logging.test.js +47 -0
  454. package/dist/server/tests/unit/services/hub-manager-service.test.d.ts +2 -0
  455. package/dist/server/tests/unit/services/hub-manager-service.test.d.ts.map +1 -0
  456. package/dist/server/tests/unit/services/hub-manager-service.test.js +140 -0
  457. package/dist/server/tests/unit/services/hub-manager.test.d.ts +2 -0
  458. package/dist/server/tests/unit/services/hub-manager.test.d.ts.map +1 -0
  459. package/dist/server/tests/unit/services/hub-manager.test.js +98 -0
  460. package/dist/server/tests/unit/services/hub-tools.service.test.d.ts +2 -0
  461. package/dist/server/tests/unit/services/hub-tools.service.test.d.ts.map +1 -0
  462. package/dist/server/tests/unit/services/hub-tools.service.test.js +674 -0
  463. package/dist/server/tests/unit/services/search/search-cache.test.d.ts +2 -0
  464. package/dist/server/tests/unit/services/search/search-cache.test.d.ts.map +1 -0
  465. package/dist/server/tests/unit/services/search/search-cache.test.js +58 -0
  466. package/dist/server/tests/unit/services/search/search-core.service.test.d.ts +2 -0
  467. package/dist/server/tests/unit/services/search/search-core.service.test.d.ts.map +1 -0
  468. package/dist/server/tests/unit/services/search/search-core.service.test.js +84 -0
  469. package/dist/server/tests/unit/services/search/search-scorer.test.d.ts +2 -0
  470. package/dist/server/tests/unit/services/search/search-scorer.test.d.ts.map +1 -0
  471. package/dist/server/tests/unit/services/search/search-scorer.test.js +97 -0
  472. package/dist/server/tests/unit/services/session-manager.test.d.ts +2 -0
  473. package/dist/server/tests/unit/services/session-manager.test.d.ts.map +1 -0
  474. package/dist/server/tests/unit/services/session-manager.test.js +481 -0
  475. package/dist/server/tests/unit/utils/config.test.d.ts +2 -0
  476. package/dist/server/tests/unit/utils/config.test.d.ts.map +1 -0
  477. package/dist/server/tests/unit/utils/config.test.js +634 -0
  478. package/dist/server/tests/unit/utils/json-utils.test.d.ts +2 -0
  479. package/dist/server/tests/unit/utils/json-utils.test.d.ts.map +1 -0
  480. package/dist/server/tests/unit/utils/json-utils.test.js +296 -0
  481. package/dist/server/tests/unit/utils/log-rotator.test.d.ts +2 -0
  482. package/dist/server/tests/unit/utils/log-rotator.test.d.ts.map +1 -0
  483. package/dist/server/tests/unit/utils/log-rotator.test.js +296 -0
  484. package/dist/server/tests/unit/utils/logger.test.d.ts +2 -0
  485. package/dist/server/tests/unit/utils/logger.test.d.ts.map +1 -0
  486. package/dist/server/tests/unit/utils/logger.test.js +462 -0
  487. package/dist/server/tests/unit/utils/mcp-error-handler.test.d.ts +2 -0
  488. package/dist/server/tests/unit/utils/mcp-error-handler.test.d.ts.map +1 -0
  489. package/dist/server/tests/unit/utils/mcp-error-handler.test.js +163 -0
  490. package/dist/server/tests/unit/utils/request-context.test.d.ts +2 -0
  491. package/dist/server/tests/unit/utils/request-context.test.d.ts.map +1 -0
  492. package/dist/server/tests/unit/utils/request-context.test.js +82 -0
  493. package/dist/server/vite.config.d.ts +3 -0
  494. package/dist/server/vite.config.d.ts.map +1 -0
  495. package/dist/server/vite.config.js +160 -0
  496. package/dist/server/vitest.config.d.ts +3 -0
  497. package/dist/server/vitest.config.d.ts.map +1 -0
  498. package/dist/server/vitest.config.js +53 -0
  499. 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