@eclipse-glsp/server-mcp 2.7.0-next.10 → 2.7.0-next.11

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 (443) hide show
  1. package/README.md +17 -3
  2. package/browser.d.ts +16 -0
  3. package/browser.js +18 -0
  4. package/common.d.ts +16 -0
  5. package/common.js +18 -0
  6. package/lib/browser/index.d.ts +21 -0
  7. package/lib/browser/index.d.ts.map +1 -0
  8. package/lib/browser/index.js +37 -0
  9. package/lib/browser/index.js.map +1 -0
  10. package/lib/browser/modules/browser-mcp-server-module.d.ts +42 -0
  11. package/lib/browser/modules/browser-mcp-server-module.d.ts.map +1 -0
  12. package/lib/browser/modules/browser-mcp-server-module.js +50 -0
  13. package/lib/browser/modules/browser-mcp-server-module.js.map +1 -0
  14. package/lib/browser/reexport.d.ts +17 -0
  15. package/lib/browser/reexport.d.ts.map +1 -0
  16. package/lib/browser/reexport.js +33 -0
  17. package/lib/browser/reexport.js.map +1 -0
  18. package/lib/browser/server/browser-mcp-request-context.d.ts +27 -0
  19. package/lib/browser/server/browser-mcp-request-context.d.ts.map +1 -0
  20. package/lib/browser/server/browser-mcp-request-context.js +67 -0
  21. package/lib/browser/server/browser-mcp-request-context.js.map +1 -0
  22. package/lib/browser/server/mcp-worker-bridge.d.ts +81 -0
  23. package/lib/browser/server/mcp-worker-bridge.d.ts.map +1 -0
  24. package/lib/browser/server/mcp-worker-bridge.js +159 -0
  25. package/lib/browser/server/mcp-worker-bridge.js.map +1 -0
  26. package/lib/browser/server/web-mcp-server-launcher.d.ts +34 -0
  27. package/lib/browser/server/web-mcp-server-launcher.d.ts.map +1 -0
  28. package/lib/browser/server/web-mcp-server-launcher.js +50 -0
  29. package/lib/browser/server/web-mcp-server-launcher.js.map +1 -0
  30. package/lib/{index.d.ts → common/index.d.ts} +3 -4
  31. package/lib/common/index.d.ts.map +1 -0
  32. package/lib/{index.js → common/index.js} +17 -18
  33. package/lib/common/index.js.map +1 -0
  34. package/lib/{modules/mcp-server-module.d.ts → common/modules/abstract-mcp-server-module.d.ts} +46 -37
  35. package/lib/common/modules/abstract-mcp-server-module.d.ts.map +1 -0
  36. package/lib/{modules/mcp-server-module.js → common/modules/abstract-mcp-server-module.js} +43 -66
  37. package/lib/common/modules/abstract-mcp-server-module.js.map +1 -0
  38. package/lib/common/modules/mcp-diagram-module.d.ts.map +1 -0
  39. package/lib/common/modules/mcp-diagram-module.js.map +1 -0
  40. package/lib/common/prompts/handlers/describe-diagram-mcp-prompt-handler.d.ts.map +1 -0
  41. package/lib/common/prompts/handlers/describe-diagram-mcp-prompt-handler.js.map +1 -0
  42. package/lib/common/prompts/handlers/suggest-improvements-mcp-prompt-handler.d.ts.map +1 -0
  43. package/lib/common/prompts/handlers/suggest-improvements-mcp-prompt-handler.js.map +1 -0
  44. package/lib/common/resources/handlers/diagram-png-mcp-resource-handler.d.ts.map +1 -0
  45. package/lib/common/resources/handlers/diagram-png-mcp-resource-handler.js.map +1 -0
  46. package/lib/common/resources/handlers/diagram-svg-mcp-resource-handler.d.ts.map +1 -0
  47. package/lib/common/resources/handlers/diagram-svg-mcp-resource-handler.js.map +1 -0
  48. package/lib/common/resources/services/element-types-provider.d.ts.map +1 -0
  49. package/lib/common/resources/services/element-types-provider.js.map +1 -0
  50. package/lib/common/resources/services/mcp-model-serializer.d.ts.map +1 -0
  51. package/lib/common/resources/services/mcp-model-serializer.js.map +1 -0
  52. package/lib/common/server/abstract-mcp-server-launcher.d.ts +168 -0
  53. package/lib/common/server/abstract-mcp-server-launcher.d.ts.map +1 -0
  54. package/lib/{server/mcp-server-launcher.js → common/server/abstract-mcp-server-launcher.js} +235 -121
  55. package/lib/common/server/abstract-mcp-server-launcher.js.map +1 -0
  56. package/lib/{server → common/server}/glsp-mcp-server.d.ts +1 -1
  57. package/lib/common/server/glsp-mcp-server.d.ts.map +1 -0
  58. package/lib/{server → common/server}/glsp-mcp-server.js +6 -1
  59. package/lib/common/server/glsp-mcp-server.js.map +1 -0
  60. package/lib/{server → common/server}/lru-event-store.d.ts +1 -1
  61. package/lib/common/server/lru-event-store.d.ts.map +1 -0
  62. package/lib/common/server/lru-event-store.js.map +1 -0
  63. package/lib/{server → common/server}/mcp-diagram-handler-dispatcher.d.ts +3 -1
  64. package/lib/common/server/mcp-diagram-handler-dispatcher.d.ts.map +1 -0
  65. package/lib/{server → common/server}/mcp-diagram-handler-dispatcher.js +12 -6
  66. package/lib/common/server/mcp-diagram-handler-dispatcher.js.map +1 -0
  67. package/lib/common/server/mcp-diagram-prompt-handler-registry.d.ts.map +1 -0
  68. package/lib/common/server/mcp-diagram-prompt-handler-registry.js.map +1 -0
  69. package/lib/common/server/mcp-diagram-resource-handler-registry.d.ts.map +1 -0
  70. package/lib/{server → common/server}/mcp-diagram-resource-handler-registry.js +4 -1
  71. package/lib/common/server/mcp-diagram-resource-handler-registry.js.map +1 -0
  72. package/lib/common/server/mcp-diagram-tool-handler-registry.d.ts.map +1 -0
  73. package/lib/{server → common/server}/mcp-diagram-tool-handler-registry.js +3 -1
  74. package/lib/common/server/mcp-diagram-tool-handler-registry.js.map +1 -0
  75. package/lib/common/server/mcp-handler-shared.d.ts.map +1 -0
  76. package/lib/common/server/mcp-handler-shared.js.map +1 -0
  77. package/lib/common/server/mcp-id-alias-service.d.ts.map +1 -0
  78. package/lib/common/server/mcp-id-alias-service.js.map +1 -0
  79. package/lib/{server → common/server}/mcp-input-schemas.d.ts +8 -0
  80. package/lib/common/server/mcp-input-schemas.d.ts.map +1 -0
  81. package/lib/{server → common/server}/mcp-input-schemas.js +13 -1
  82. package/lib/common/server/mcp-input-schemas.js.map +1 -0
  83. package/lib/common/server/mcp-label-provider.d.ts.map +1 -0
  84. package/lib/common/server/mcp-label-provider.js.map +1 -0
  85. package/lib/{server → common/server}/mcp-log-level-registry.d.ts +1 -1
  86. package/lib/common/server/mcp-log-level-registry.d.ts.map +1 -0
  87. package/lib/common/server/mcp-log-level-registry.js.map +1 -0
  88. package/lib/{server → common/server}/mcp-logger.d.ts +4 -2
  89. package/lib/common/server/mcp-logger.d.ts.map +1 -0
  90. package/lib/{server → common/server}/mcp-logger.js +11 -3
  91. package/lib/common/server/mcp-logger.js.map +1 -0
  92. package/lib/common/server/mcp-mime-types.d.ts.map +1 -0
  93. package/lib/common/server/mcp-mime-types.js.map +1 -0
  94. package/lib/{server → common/server}/mcp-options.d.ts +1 -1
  95. package/lib/common/server/mcp-options.d.ts.map +1 -0
  96. package/lib/{server → common/server}/mcp-options.js +1 -1
  97. package/lib/common/server/mcp-options.js.map +1 -0
  98. package/lib/{server → common/server}/mcp-progress-reporter.d.ts +4 -2
  99. package/lib/common/server/mcp-progress-reporter.d.ts.map +1 -0
  100. package/lib/{server → common/server}/mcp-progress-reporter.js +14 -3
  101. package/lib/common/server/mcp-progress-reporter.js.map +1 -0
  102. package/lib/{server → common/server}/mcp-prompt-handler.d.ts +3 -1
  103. package/lib/common/server/mcp-prompt-handler.d.ts.map +1 -0
  104. package/lib/{server → common/server}/mcp-prompt-handler.js +10 -2
  105. package/lib/common/server/mcp-prompt-handler.js.map +1 -0
  106. package/lib/common/server/mcp-request-context.d.ts +35 -0
  107. package/lib/common/server/mcp-request-context.d.ts.map +1 -0
  108. package/lib/common/server/mcp-request-context.js +30 -0
  109. package/lib/common/server/mcp-request-context.js.map +1 -0
  110. package/lib/{server → common/server}/mcp-resource-handler.d.ts +3 -1
  111. package/lib/common/server/mcp-resource-handler.d.ts.map +1 -0
  112. package/lib/{server → common/server}/mcp-resource-handler.js +13 -5
  113. package/lib/common/server/mcp-resource-handler.js.map +1 -0
  114. package/lib/common/server/mcp-session.d.ts.map +1 -0
  115. package/lib/common/server/mcp-session.js.map +1 -0
  116. package/lib/{server → common/server}/mcp-tool-handler.d.ts +3 -1
  117. package/lib/common/server/mcp-tool-handler.d.ts.map +1 -0
  118. package/lib/{server → common/server}/mcp-tool-handler.js +7 -1
  119. package/lib/{server → common/server}/mcp-tool-handler.js.map +1 -1
  120. package/lib/common/tools/handlers/count-elements-mcp-tool-handler.d.ts.map +1 -0
  121. package/lib/common/tools/handlers/count-elements-mcp-tool-handler.js.map +1 -0
  122. package/lib/{tools → common/tools}/handlers/create-edges-mcp-tool-handler.d.ts +2 -0
  123. package/lib/common/tools/handlers/create-edges-mcp-tool-handler.d.ts.map +1 -0
  124. package/lib/{tools → common/tools}/handlers/create-edges-mcp-tool-handler.js +2 -1
  125. package/lib/common/tools/handlers/create-edges-mcp-tool-handler.js.map +1 -0
  126. package/lib/{tools → common/tools}/handlers/create-nodes-mcp-tool-handler.d.ts +2 -0
  127. package/lib/common/tools/handlers/create-nodes-mcp-tool-handler.d.ts.map +1 -0
  128. package/lib/{tools → common/tools}/handlers/create-nodes-mcp-tool-handler.js +2 -1
  129. package/lib/common/tools/handlers/create-nodes-mcp-tool-handler.js.map +1 -0
  130. package/lib/{tools → common/tools}/handlers/delete-elements-mcp-tool-handler.d.ts +2 -0
  131. package/lib/common/tools/handlers/delete-elements-mcp-tool-handler.d.ts.map +1 -0
  132. package/lib/{tools → common/tools}/handlers/delete-elements-mcp-tool-handler.js +4 -2
  133. package/lib/common/tools/handlers/delete-elements-mcp-tool-handler.js.map +1 -0
  134. package/lib/common/tools/handlers/diagram-model-mcp-tool-handler.d.ts.map +1 -0
  135. package/lib/common/tools/handlers/diagram-model-mcp-tool-handler.js.map +1 -0
  136. package/lib/common/tools/handlers/element-types-mcp-tool-handler.d.ts.map +1 -0
  137. package/lib/common/tools/handlers/element-types-mcp-tool-handler.js.map +1 -0
  138. package/lib/common/tools/handlers/get-selection-mcp-tool-handler.d.ts.map +1 -0
  139. package/lib/common/tools/handlers/get-selection-mcp-tool-handler.js.map +1 -0
  140. package/lib/{tools → common/tools}/handlers/layout-mcp-tool-handler.d.ts +2 -0
  141. package/lib/common/tools/handlers/layout-mcp-tool-handler.d.ts.map +1 -0
  142. package/lib/{tools → common/tools}/handlers/layout-mcp-tool-handler.js +3 -2
  143. package/lib/common/tools/handlers/layout-mcp-tool-handler.js.map +1 -0
  144. package/lib/common/tools/handlers/modify-edges-mcp-tool-handler.d.ts.map +1 -0
  145. package/lib/{tools → common/tools}/handlers/modify-edges-mcp-tool-handler.js +1 -1
  146. package/lib/common/tools/handlers/modify-edges-mcp-tool-handler.js.map +1 -0
  147. package/lib/common/tools/handlers/modify-nodes-mcp-tool-handler.d.ts.map +1 -0
  148. package/lib/{tools → common/tools}/handlers/modify-nodes-mcp-tool-handler.js +1 -1
  149. package/lib/common/tools/handlers/modify-nodes-mcp-tool-handler.js.map +1 -0
  150. package/lib/common/tools/handlers/query-elements-mcp-tool-handler.d.ts.map +1 -0
  151. package/lib/common/tools/handlers/query-elements-mcp-tool-handler.js.map +1 -0
  152. package/lib/common/tools/handlers/redo-mcp-tool-handler.d.ts.map +1 -0
  153. package/lib/common/tools/handlers/redo-mcp-tool-handler.js.map +1 -0
  154. package/lib/common/tools/handlers/save-model-mcp-tool-handler.d.ts.map +1 -0
  155. package/lib/common/tools/handlers/save-model-mcp-tool-handler.js.map +1 -0
  156. package/lib/common/tools/handlers/session-info-mcp-tool-handler.d.ts.map +1 -0
  157. package/lib/common/tools/handlers/session-info-mcp-tool-handler.js.map +1 -0
  158. package/lib/common/tools/handlers/set-selection-mcp-tool-handler.d.ts.map +1 -0
  159. package/lib/common/tools/handlers/set-selection-mcp-tool-handler.js.map +1 -0
  160. package/lib/common/tools/handlers/set-view-mcp-tool-handler.d.ts.map +1 -0
  161. package/lib/common/tools/handlers/set-view-mcp-tool-handler.js.map +1 -0
  162. package/lib/common/tools/handlers/undo-mcp-tool-handler.d.ts.map +1 -0
  163. package/lib/common/tools/handlers/undo-mcp-tool-handler.js.map +1 -0
  164. package/lib/common/tools/handlers/validate-diagram-mcp-tool-handler.d.ts.map +1 -0
  165. package/lib/common/tools/handlers/validate-diagram-mcp-tool-handler.js.map +1 -0
  166. package/lib/common/util/markdown-util.d.ts.map +1 -0
  167. package/lib/common/util/markdown-util.js.map +1 -0
  168. package/lib/common/util/mcp-util.d.ts.map +1 -0
  169. package/lib/common/util/mcp-util.js.map +1 -0
  170. package/lib/node/index.d.ts +20 -0
  171. package/lib/node/index.d.ts.map +1 -0
  172. package/lib/node/index.js +36 -0
  173. package/lib/node/index.js.map +1 -0
  174. package/lib/node/modules/node-mcp-server-module.d.ts +37 -0
  175. package/lib/node/modules/node-mcp-server-module.d.ts.map +1 -0
  176. package/lib/node/modules/node-mcp-server-module.js +52 -0
  177. package/lib/node/modules/node-mcp-server-module.js.map +1 -0
  178. package/lib/node/reexport.d.ts +17 -0
  179. package/lib/node/reexport.d.ts.map +1 -0
  180. package/lib/node/reexport.js +33 -0
  181. package/lib/node/reexport.js.map +1 -0
  182. package/lib/node/server/node-mcp-request-context.d.ts +24 -0
  183. package/lib/node/server/node-mcp-request-context.d.ts.map +1 -0
  184. package/lib/node/server/node-mcp-request-context.js +43 -0
  185. package/lib/node/server/node-mcp-request-context.js.map +1 -0
  186. package/lib/node/server/node-mcp-server-launcher.d.ts +55 -0
  187. package/lib/node/server/node-mcp-server-launcher.d.ts.map +1 -0
  188. package/lib/node/server/node-mcp-server-launcher.js +123 -0
  189. package/lib/node/server/node-mcp-server-launcher.js.map +1 -0
  190. package/node.d.ts +16 -0
  191. package/node.js +18 -0
  192. package/package.json +19 -13
  193. package/src/browser/index.ts +21 -0
  194. package/src/browser/modules/browser-mcp-server-module.ts +54 -0
  195. package/src/browser/reexport.ts +16 -0
  196. package/src/browser/server/browser-mcp-request-context.ts +59 -0
  197. package/src/browser/server/mcp-worker-bridge.ts +200 -0
  198. package/src/browser/server/web-mcp-server-launcher.ts +39 -0
  199. package/src/{index.ts → common/index.ts} +4 -4
  200. package/src/{modules/mcp-server-module.ts → common/modules/abstract-mcp-server-module.ts} +54 -68
  201. package/src/common/server/abstract-mcp-server-launcher.spec.ts +458 -0
  202. package/src/common/server/abstract-mcp-server-launcher.ts +524 -0
  203. package/src/{server → common/server}/glsp-mcp-server.ts +7 -2
  204. package/src/{server → common/server}/lru-event-store.ts +1 -1
  205. package/src/{server → common/server}/mcp-diagram-handler-dispatcher.ts +13 -9
  206. package/src/{server → common/server}/mcp-diagram-resource-handler-registry.ts +4 -1
  207. package/src/{server → common/server}/mcp-diagram-tool-handler-registry.ts +3 -1
  208. package/src/{server → common/server}/mcp-input-schemas.ts +13 -0
  209. package/src/{server → common/server}/mcp-log-level-registry.ts +1 -1
  210. package/src/{server → common/server}/mcp-logger.spec.ts +26 -18
  211. package/src/{server → common/server}/mcp-logger.ts +9 -5
  212. package/src/{server → common/server}/mcp-options.ts +1 -1
  213. package/src/{server → common/server}/mcp-progress-reporter.spec.ts +19 -9
  214. package/src/{server → common/server}/mcp-progress-reporter.ts +9 -5
  215. package/src/{server → common/server}/mcp-prompt-handler.ts +8 -4
  216. package/src/{server → common/server}/mcp-request-context.ts +20 -16
  217. package/src/{server → common/server}/mcp-resource-handler.ts +11 -7
  218. package/src/{server → common/server}/mcp-tool-handler.spec.ts +4 -4
  219. package/src/{server → common/server}/mcp-tool-handler.ts +8 -4
  220. package/src/{tools → common/tools}/handlers/create-edges-mcp-tool-handler.ts +9 -2
  221. package/src/{tools → common/tools}/handlers/create-nodes-mcp-tool-handler.ts +9 -2
  222. package/src/{tools → common/tools}/handlers/delete-elements-mcp-tool-handler.ts +5 -3
  223. package/src/{tools → common/tools}/handlers/layout-mcp-tool-handler.ts +4 -3
  224. package/src/{tools → common/tools}/handlers/modify-edges-mcp-tool-handler.ts +8 -2
  225. package/src/{tools → common/tools}/handlers/modify-nodes-mcp-tool-handler.ts +8 -2
  226. package/src/node/index.ts +20 -0
  227. package/src/node/modules/node-mcp-server-module.ts +56 -0
  228. package/src/node/reexport.ts +16 -0
  229. package/src/node/server/mcp-http-transport-e2e.spec.ts +297 -0
  230. package/src/node/server/node-mcp-request-context.ts +33 -0
  231. package/src/{server/mcp-server-launcher.spec.ts → node/server/node-mcp-server-launcher.spec.ts} +19 -8
  232. package/src/node/server/node-mcp-server-launcher.ts +130 -0
  233. package/lib/index.d.ts.map +0 -1
  234. package/lib/index.js.map +0 -1
  235. package/lib/modules/mcp-diagram-module.d.ts.map +0 -1
  236. package/lib/modules/mcp-diagram-module.js.map +0 -1
  237. package/lib/modules/mcp-server-module.d.ts.map +0 -1
  238. package/lib/modules/mcp-server-module.js.map +0 -1
  239. package/lib/prompts/handlers/describe-diagram-mcp-prompt-handler.d.ts.map +0 -1
  240. package/lib/prompts/handlers/describe-diagram-mcp-prompt-handler.js.map +0 -1
  241. package/lib/prompts/handlers/suggest-improvements-mcp-prompt-handler.d.ts.map +0 -1
  242. package/lib/prompts/handlers/suggest-improvements-mcp-prompt-handler.js.map +0 -1
  243. package/lib/resources/handlers/diagram-png-mcp-resource-handler.d.ts.map +0 -1
  244. package/lib/resources/handlers/diagram-png-mcp-resource-handler.js.map +0 -1
  245. package/lib/resources/handlers/diagram-svg-mcp-resource-handler.d.ts.map +0 -1
  246. package/lib/resources/handlers/diagram-svg-mcp-resource-handler.js.map +0 -1
  247. package/lib/resources/services/element-types-provider.d.ts.map +0 -1
  248. package/lib/resources/services/element-types-provider.js.map +0 -1
  249. package/lib/resources/services/mcp-model-serializer.d.ts.map +0 -1
  250. package/lib/resources/services/mcp-model-serializer.js.map +0 -1
  251. package/lib/server/glsp-mcp-server.d.ts.map +0 -1
  252. package/lib/server/glsp-mcp-server.js.map +0 -1
  253. package/lib/server/lru-event-store.d.ts.map +0 -1
  254. package/lib/server/lru-event-store.js.map +0 -1
  255. package/lib/server/mcp-diagram-handler-dispatcher.d.ts.map +0 -1
  256. package/lib/server/mcp-diagram-handler-dispatcher.js.map +0 -1
  257. package/lib/server/mcp-diagram-prompt-handler-registry.d.ts.map +0 -1
  258. package/lib/server/mcp-diagram-prompt-handler-registry.js.map +0 -1
  259. package/lib/server/mcp-diagram-resource-handler-registry.d.ts.map +0 -1
  260. package/lib/server/mcp-diagram-resource-handler-registry.js.map +0 -1
  261. package/lib/server/mcp-diagram-tool-handler-registry.d.ts.map +0 -1
  262. package/lib/server/mcp-diagram-tool-handler-registry.js.map +0 -1
  263. package/lib/server/mcp-handler-shared.d.ts.map +0 -1
  264. package/lib/server/mcp-handler-shared.js.map +0 -1
  265. package/lib/server/mcp-http-transport.d.ts +0 -93
  266. package/lib/server/mcp-http-transport.d.ts.map +0 -1
  267. package/lib/server/mcp-http-transport.js +0 -350
  268. package/lib/server/mcp-http-transport.js.map +0 -1
  269. package/lib/server/mcp-id-alias-service.d.ts.map +0 -1
  270. package/lib/server/mcp-id-alias-service.js.map +0 -1
  271. package/lib/server/mcp-input-schemas.d.ts.map +0 -1
  272. package/lib/server/mcp-input-schemas.js.map +0 -1
  273. package/lib/server/mcp-label-provider.d.ts.map +0 -1
  274. package/lib/server/mcp-label-provider.js.map +0 -1
  275. package/lib/server/mcp-log-level-registry.d.ts.map +0 -1
  276. package/lib/server/mcp-log-level-registry.js.map +0 -1
  277. package/lib/server/mcp-logger.d.ts.map +0 -1
  278. package/lib/server/mcp-logger.js.map +0 -1
  279. package/lib/server/mcp-mime-types.d.ts.map +0 -1
  280. package/lib/server/mcp-mime-types.js.map +0 -1
  281. package/lib/server/mcp-options.d.ts.map +0 -1
  282. package/lib/server/mcp-options.js.map +0 -1
  283. package/lib/server/mcp-progress-reporter.d.ts.map +0 -1
  284. package/lib/server/mcp-progress-reporter.js.map +0 -1
  285. package/lib/server/mcp-prompt-handler.d.ts.map +0 -1
  286. package/lib/server/mcp-prompt-handler.js.map +0 -1
  287. package/lib/server/mcp-request-context.d.ts +0 -37
  288. package/lib/server/mcp-request-context.d.ts.map +0 -1
  289. package/lib/server/mcp-request-context.js +0 -37
  290. package/lib/server/mcp-request-context.js.map +0 -1
  291. package/lib/server/mcp-resource-handler.d.ts.map +0 -1
  292. package/lib/server/mcp-resource-handler.js.map +0 -1
  293. package/lib/server/mcp-server-launcher.d.ts +0 -143
  294. package/lib/server/mcp-server-launcher.d.ts.map +0 -1
  295. package/lib/server/mcp-server-launcher.js.map +0 -1
  296. package/lib/server/mcp-session.d.ts.map +0 -1
  297. package/lib/server/mcp-session.js.map +0 -1
  298. package/lib/server/mcp-tool-handler.d.ts.map +0 -1
  299. package/lib/tools/handlers/count-elements-mcp-tool-handler.d.ts.map +0 -1
  300. package/lib/tools/handlers/count-elements-mcp-tool-handler.js.map +0 -1
  301. package/lib/tools/handlers/create-edges-mcp-tool-handler.d.ts.map +0 -1
  302. package/lib/tools/handlers/create-edges-mcp-tool-handler.js.map +0 -1
  303. package/lib/tools/handlers/create-nodes-mcp-tool-handler.d.ts.map +0 -1
  304. package/lib/tools/handlers/create-nodes-mcp-tool-handler.js.map +0 -1
  305. package/lib/tools/handlers/delete-elements-mcp-tool-handler.d.ts.map +0 -1
  306. package/lib/tools/handlers/delete-elements-mcp-tool-handler.js.map +0 -1
  307. package/lib/tools/handlers/diagram-model-mcp-tool-handler.d.ts.map +0 -1
  308. package/lib/tools/handlers/diagram-model-mcp-tool-handler.js.map +0 -1
  309. package/lib/tools/handlers/element-types-mcp-tool-handler.d.ts.map +0 -1
  310. package/lib/tools/handlers/element-types-mcp-tool-handler.js.map +0 -1
  311. package/lib/tools/handlers/get-selection-mcp-tool-handler.d.ts.map +0 -1
  312. package/lib/tools/handlers/get-selection-mcp-tool-handler.js.map +0 -1
  313. package/lib/tools/handlers/layout-mcp-tool-handler.d.ts.map +0 -1
  314. package/lib/tools/handlers/layout-mcp-tool-handler.js.map +0 -1
  315. package/lib/tools/handlers/modify-edges-mcp-tool-handler.d.ts.map +0 -1
  316. package/lib/tools/handlers/modify-edges-mcp-tool-handler.js.map +0 -1
  317. package/lib/tools/handlers/modify-nodes-mcp-tool-handler.d.ts.map +0 -1
  318. package/lib/tools/handlers/modify-nodes-mcp-tool-handler.js.map +0 -1
  319. package/lib/tools/handlers/query-elements-mcp-tool-handler.d.ts.map +0 -1
  320. package/lib/tools/handlers/query-elements-mcp-tool-handler.js.map +0 -1
  321. package/lib/tools/handlers/redo-mcp-tool-handler.d.ts.map +0 -1
  322. package/lib/tools/handlers/redo-mcp-tool-handler.js.map +0 -1
  323. package/lib/tools/handlers/save-model-mcp-tool-handler.d.ts.map +0 -1
  324. package/lib/tools/handlers/save-model-mcp-tool-handler.js.map +0 -1
  325. package/lib/tools/handlers/session-info-mcp-tool-handler.d.ts.map +0 -1
  326. package/lib/tools/handlers/session-info-mcp-tool-handler.js.map +0 -1
  327. package/lib/tools/handlers/set-selection-mcp-tool-handler.d.ts.map +0 -1
  328. package/lib/tools/handlers/set-selection-mcp-tool-handler.js.map +0 -1
  329. package/lib/tools/handlers/set-view-mcp-tool-handler.d.ts.map +0 -1
  330. package/lib/tools/handlers/set-view-mcp-tool-handler.js.map +0 -1
  331. package/lib/tools/handlers/undo-mcp-tool-handler.d.ts.map +0 -1
  332. package/lib/tools/handlers/undo-mcp-tool-handler.js.map +0 -1
  333. package/lib/tools/handlers/validate-diagram-mcp-tool-handler.d.ts.map +0 -1
  334. package/lib/tools/handlers/validate-diagram-mcp-tool-handler.js.map +0 -1
  335. package/lib/util/markdown-util.d.ts.map +0 -1
  336. package/lib/util/markdown-util.js.map +0 -1
  337. package/lib/util/mcp-util.d.ts.map +0 -1
  338. package/lib/util/mcp-util.js.map +0 -1
  339. package/src/server/mcp-http-transport-e2e.spec.ts +0 -151
  340. package/src/server/mcp-http-transport.spec.ts +0 -385
  341. package/src/server/mcp-http-transport.ts +0 -368
  342. package/src/server/mcp-server-launcher.ts +0 -369
  343. /package/lib/{modules → common/modules}/mcp-diagram-module.d.ts +0 -0
  344. /package/lib/{modules → common/modules}/mcp-diagram-module.js +0 -0
  345. /package/lib/{prompts → common/prompts}/handlers/describe-diagram-mcp-prompt-handler.d.ts +0 -0
  346. /package/lib/{prompts → common/prompts}/handlers/describe-diagram-mcp-prompt-handler.js +0 -0
  347. /package/lib/{prompts → common/prompts}/handlers/suggest-improvements-mcp-prompt-handler.d.ts +0 -0
  348. /package/lib/{prompts → common/prompts}/handlers/suggest-improvements-mcp-prompt-handler.js +0 -0
  349. /package/lib/{resources → common/resources}/handlers/diagram-png-mcp-resource-handler.d.ts +0 -0
  350. /package/lib/{resources → common/resources}/handlers/diagram-png-mcp-resource-handler.js +0 -0
  351. /package/lib/{resources → common/resources}/handlers/diagram-svg-mcp-resource-handler.d.ts +0 -0
  352. /package/lib/{resources → common/resources}/handlers/diagram-svg-mcp-resource-handler.js +0 -0
  353. /package/lib/{resources → common/resources}/services/element-types-provider.d.ts +0 -0
  354. /package/lib/{resources → common/resources}/services/element-types-provider.js +0 -0
  355. /package/lib/{resources → common/resources}/services/mcp-model-serializer.d.ts +0 -0
  356. /package/lib/{resources → common/resources}/services/mcp-model-serializer.js +0 -0
  357. /package/lib/{server → common/server}/lru-event-store.js +0 -0
  358. /package/lib/{server → common/server}/mcp-diagram-prompt-handler-registry.d.ts +0 -0
  359. /package/lib/{server → common/server}/mcp-diagram-prompt-handler-registry.js +0 -0
  360. /package/lib/{server → common/server}/mcp-diagram-resource-handler-registry.d.ts +0 -0
  361. /package/lib/{server → common/server}/mcp-diagram-tool-handler-registry.d.ts +0 -0
  362. /package/lib/{server → common/server}/mcp-handler-shared.d.ts +0 -0
  363. /package/lib/{server → common/server}/mcp-handler-shared.js +0 -0
  364. /package/lib/{server → common/server}/mcp-id-alias-service.d.ts +0 -0
  365. /package/lib/{server → common/server}/mcp-id-alias-service.js +0 -0
  366. /package/lib/{server → common/server}/mcp-label-provider.d.ts +0 -0
  367. /package/lib/{server → common/server}/mcp-label-provider.js +0 -0
  368. /package/lib/{server → common/server}/mcp-log-level-registry.js +0 -0
  369. /package/lib/{server → common/server}/mcp-mime-types.d.ts +0 -0
  370. /package/lib/{server → common/server}/mcp-mime-types.js +0 -0
  371. /package/lib/{server → common/server}/mcp-session.d.ts +0 -0
  372. /package/lib/{server → common/server}/mcp-session.js +0 -0
  373. /package/lib/{tools → common/tools}/handlers/count-elements-mcp-tool-handler.d.ts +0 -0
  374. /package/lib/{tools → common/tools}/handlers/count-elements-mcp-tool-handler.js +0 -0
  375. /package/lib/{tools → common/tools}/handlers/diagram-model-mcp-tool-handler.d.ts +0 -0
  376. /package/lib/{tools → common/tools}/handlers/diagram-model-mcp-tool-handler.js +0 -0
  377. /package/lib/{tools → common/tools}/handlers/element-types-mcp-tool-handler.d.ts +0 -0
  378. /package/lib/{tools → common/tools}/handlers/element-types-mcp-tool-handler.js +0 -0
  379. /package/lib/{tools → common/tools}/handlers/get-selection-mcp-tool-handler.d.ts +0 -0
  380. /package/lib/{tools → common/tools}/handlers/get-selection-mcp-tool-handler.js +0 -0
  381. /package/lib/{tools → common/tools}/handlers/modify-edges-mcp-tool-handler.d.ts +0 -0
  382. /package/lib/{tools → common/tools}/handlers/modify-nodes-mcp-tool-handler.d.ts +0 -0
  383. /package/lib/{tools → common/tools}/handlers/query-elements-mcp-tool-handler.d.ts +0 -0
  384. /package/lib/{tools → common/tools}/handlers/query-elements-mcp-tool-handler.js +0 -0
  385. /package/lib/{tools → common/tools}/handlers/redo-mcp-tool-handler.d.ts +0 -0
  386. /package/lib/{tools → common/tools}/handlers/redo-mcp-tool-handler.js +0 -0
  387. /package/lib/{tools → common/tools}/handlers/save-model-mcp-tool-handler.d.ts +0 -0
  388. /package/lib/{tools → common/tools}/handlers/save-model-mcp-tool-handler.js +0 -0
  389. /package/lib/{tools → common/tools}/handlers/session-info-mcp-tool-handler.d.ts +0 -0
  390. /package/lib/{tools → common/tools}/handlers/session-info-mcp-tool-handler.js +0 -0
  391. /package/lib/{tools → common/tools}/handlers/set-selection-mcp-tool-handler.d.ts +0 -0
  392. /package/lib/{tools → common/tools}/handlers/set-selection-mcp-tool-handler.js +0 -0
  393. /package/lib/{tools → common/tools}/handlers/set-view-mcp-tool-handler.d.ts +0 -0
  394. /package/lib/{tools → common/tools}/handlers/set-view-mcp-tool-handler.js +0 -0
  395. /package/lib/{tools → common/tools}/handlers/undo-mcp-tool-handler.d.ts +0 -0
  396. /package/lib/{tools → common/tools}/handlers/undo-mcp-tool-handler.js +0 -0
  397. /package/lib/{tools → common/tools}/handlers/validate-diagram-mcp-tool-handler.d.ts +0 -0
  398. /package/lib/{tools → common/tools}/handlers/validate-diagram-mcp-tool-handler.js +0 -0
  399. /package/lib/{util → common/util}/markdown-util.d.ts +0 -0
  400. /package/lib/{util → common/util}/markdown-util.js +0 -0
  401. /package/lib/{util → common/util}/mcp-util.d.ts +0 -0
  402. /package/lib/{util → common/util}/mcp-util.js +0 -0
  403. /package/src/{modules → common/modules}/mcp-diagram-module.ts +0 -0
  404. /package/src/{prompts → common/prompts}/handlers/describe-diagram-mcp-prompt-handler.ts +0 -0
  405. /package/src/{prompts → common/prompts}/handlers/suggest-improvements-mcp-prompt-handler.ts +0 -0
  406. /package/src/{resources → common/resources}/handlers/diagram-png-mcp-resource-handler.ts +0 -0
  407. /package/src/{resources → common/resources}/handlers/diagram-svg-mcp-resource-handler.ts +0 -0
  408. /package/src/{resources → common/resources}/services/element-types-provider.ts +0 -0
  409. /package/src/{resources → common/resources}/services/mcp-model-serializer.ts +0 -0
  410. /package/src/{server → common/server}/glsp-mcp-server.spec.ts +0 -0
  411. /package/src/{server → common/server}/lru-event-store.spec.ts +0 -0
  412. /package/src/{server → common/server}/mcp-diagram-handler-dispatcher.spec.ts +0 -0
  413. /package/src/{server → common/server}/mcp-diagram-prompt-handler-registry.ts +0 -0
  414. /package/src/{server → common/server}/mcp-handler-shared.spec.ts +0 -0
  415. /package/src/{server → common/server}/mcp-handler-shared.ts +0 -0
  416. /package/src/{server → common/server}/mcp-id-alias-service.spec.ts +0 -0
  417. /package/src/{server → common/server}/mcp-id-alias-service.ts +0 -0
  418. /package/src/{server → common/server}/mcp-label-provider.ts +0 -0
  419. /package/src/{server → common/server}/mcp-log-level-registry.spec.ts +0 -0
  420. /package/src/{server → common/server}/mcp-mime-types.ts +0 -0
  421. /package/src/{server → common/server}/mcp-session.ts +0 -0
  422. /package/src/{tools → common/tools}/handlers/count-elements-mcp-tool-handler.spec.ts +0 -0
  423. /package/src/{tools → common/tools}/handlers/count-elements-mcp-tool-handler.ts +0 -0
  424. /package/src/{tools → common/tools}/handlers/create-edges-mcp-tool-handler.spec.ts +0 -0
  425. /package/src/{tools → common/tools}/handlers/create-nodes-mcp-tool-handler.spec.ts +0 -0
  426. /package/src/{tools → common/tools}/handlers/diagram-model-mcp-tool-handler.ts +0 -0
  427. /package/src/{tools → common/tools}/handlers/element-types-mcp-tool-handler.ts +0 -0
  428. /package/src/{tools → common/tools}/handlers/get-selection-mcp-tool-handler.ts +0 -0
  429. /package/src/{tools → common/tools}/handlers/query-elements-mcp-tool-handler.spec.ts +0 -0
  430. /package/src/{tools → common/tools}/handlers/query-elements-mcp-tool-handler.ts +0 -0
  431. /package/src/{tools → common/tools}/handlers/redo-mcp-tool-handler.ts +0 -0
  432. /package/src/{tools → common/tools}/handlers/save-model-mcp-tool-handler.ts +0 -0
  433. /package/src/{tools → common/tools}/handlers/session-info-mcp-tool-handler.spec.ts +0 -0
  434. /package/src/{tools → common/tools}/handlers/session-info-mcp-tool-handler.ts +0 -0
  435. /package/src/{tools → common/tools}/handlers/set-selection-mcp-tool-handler.spec.ts +0 -0
  436. /package/src/{tools → common/tools}/handlers/set-selection-mcp-tool-handler.ts +0 -0
  437. /package/src/{tools → common/tools}/handlers/set-view-mcp-tool-handler.ts +0 -0
  438. /package/src/{tools → common/tools}/handlers/undo-mcp-tool-handler.ts +0 -0
  439. /package/src/{tools → common/tools}/handlers/validate-diagram-mcp-tool-handler.ts +0 -0
  440. /package/src/{tools → common/tools}/tool-annotations.spec.ts +0 -0
  441. /package/src/{util → common/util}/markdown-util.ts +0 -0
  442. /package/src/{util → common/util}/mcp-util.ts +0 -0
  443. /package/src/{server → node/server}/raw-http.spec.ts +0 -0
@@ -1,368 +0,0 @@
1
- /********************************************************************************
2
- * Copyright (c) 2025-2026 EclipseSource and others.
3
- *
4
- * This program and the accompanying materials are made available under the
5
- * terms of the Eclipse Public License v. 2.0 which is available at
6
- * http://www.eclipse.org/legal/epl-2.0.
7
- *
8
- * This Source Code may also be made available under the following Secondary
9
- * Licenses when the conditions for such availability set forth in the Eclipse
10
- * Public License v. 2.0 are satisfied: GNU General Public License, version 2
11
- * with the GNU Classpath Exception which is available at
12
- * https://www.gnu.org/software/classpath/license.html.
13
- *
14
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
15
- ********************************************************************************/
16
-
17
- import { Deferred, Disposable, Emitter, Logger } from '@eclipse-glsp/server';
18
- import { createMcpExpressApp } from '@modelcontextprotocol/sdk/server/express.js';
19
- import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
20
- import { SUPPORTED_PROTOCOL_VERSIONS, isInitializeRequest } from '@modelcontextprotocol/sdk/types.js';
21
- import type { Express } from 'express';
22
- import * as express from 'express';
23
- import * as http from 'http';
24
- import { inject, injectable } from 'inversify';
25
- import { AddressInfo } from 'net';
26
- import { randomUUID } from 'node:crypto';
27
- import { LruEventStore } from './lru-event-store';
28
- import { McpServerOptions } from './mcp-options';
29
- import type { FullMcpServerConfiguration } from './mcp-server-launcher';
30
- import { McpSession, McpSessionId, WithSessionId } from './mcp-session';
31
-
32
- /**
33
- * Where this transport can be reached. Network transports populate `url`;
34
- * future in-process or stdio transports would leave it undefined.
35
- */
36
- export interface TransportEndpoint {
37
- url?: string;
38
- headers?: Record<string, string>;
39
- }
40
-
41
- @injectable()
42
- export class McpHttpTransport implements Disposable {
43
- protected _app?: Express;
44
- protected _server?: http.Server;
45
- protected _addressInfo = new Deferred<AddressInfo>();
46
-
47
- protected sessions = new Map<string, StreamableHTTPServerTransport>();
48
- protected onSessionInitializedEmitter = new Emitter<McpSession>();
49
- onSessionInitialized = this.onSessionInitializedEmitter.event;
50
- protected onSessionClosedEmitter = new Emitter<McpSessionId>();
51
- onSessionClosed = this.onSessionClosedEmitter.event;
52
-
53
- @inject(McpServerOptions) protected serverOptions: McpServerOptions;
54
-
55
- constructor(@inject(Logger) protected logger: Logger) {}
56
-
57
- get app(): Express | undefined {
58
- return this._app;
59
- }
60
-
61
- get server(): http.Server | undefined {
62
- return this._server;
63
- }
64
-
65
- getAddress(): Promise<AddressInfo> {
66
- return this._addressInfo.promise;
67
- }
68
-
69
- async start(config: FullMcpServerConfiguration): Promise<TransportEndpoint> {
70
- const { route, host, port } = config;
71
- // `createMcpExpressApp` gives us (a) a base Express app, (b) `express.json()` body
72
- // parsing — load-bearing; without it `req.body` is undefined and `isInitializeRequest`
73
- // can't tell init from non-init — and (c) DNS-rebinding host-header validation for
74
- // the configured allowlist. We forward our `allowedHosts` so the SDK's validator and
75
- // any explicit policy share one source of truth.
76
- this._app = createMcpExpressApp({ host, allowedHosts: this.serverOptions.values.allowedHosts });
77
- // Allow subclasses to install Express middleware (auth, CORS, rate-limiting,
78
- // request logging) before the MCP routes are registered. Default: origin allowlist.
79
- this.configureExpressApp(this._app);
80
- // MCP-Protocol-Version validation runs after subclass middleware so adopter-installed
81
- // gates (auth, CORS) get first cut, but before the SDK route handlers so an unsupported
82
- // header rejects with HTTP 400 cleanly per spec.
83
- this._app.use(route, this.validateProtocolVersionHeader.bind(this));
84
- this._app.post(route, this.handlePostRequest.bind(this));
85
- this._app.get(route, this.handleGetRequest.bind(this));
86
- this._app.delete(route, this.handleDeleteRequest.bind(this));
87
- this._server = this._app.listen(port, host);
88
- // Disable the per-request timeout so long-lived SSE GET streams aren't killed during
89
- // chat idle periods. From Node's perspective an SSE response is a single in-progress
90
- // request that lasts as long as the client stays connected, so the default 5-minute
91
- // `requestTimeout` (Node 18.1+) terminates the socket whenever no events flow for
92
- // ≥5 min — the client surfaces this as `TypeError: terminated`. We rely on the MCP
93
- // session-id handshake + `onclose` to detect gone clients.
94
- this._server.requestTimeout = 0;
95
- this._server.on('listening', () => this.listening());
96
- // Pre-listen errors (typically `EADDRINUSE`) fire on the http.Server. Without a
97
- // listener the deferred address never resolves and `start()` hangs; with it we
98
- // surface an actionable message naming the offending port + the override path.
99
- this._server.on('error', err => this.handleListenError(err, host, port));
100
- const addressInfo = await this.getAddress();
101
- return { url: this.toServerUrl(addressInfo, route) };
102
- }
103
-
104
- /**
105
- * Translate a pre-listen failure into an actionable error and reject the address-info
106
- * deferred so `start()` propagates it to the caller. `EADDRINUSE` gets a tailored hint
107
- * about overriding via `mcpServer.port`; other codes pass through unchanged.
108
- */
109
- protected handleListenError(err: NodeJS.ErrnoException, host: string, port: number): void {
110
- if (err.code === 'EADDRINUSE') {
111
- const portLabel = port === 0 ? 'requested address' : `${host}:${port}`;
112
- this._addressInfo.reject(
113
- new Error(
114
- `MCP server cannot bind ${portLabel}: address already in use. ` +
115
- 'Pass a different `mcpServer.port` in the GLSP `initialize` call, or omit the port to get a random one.'
116
- )
117
- );
118
- return;
119
- }
120
- this._addressInfo.reject(err);
121
- }
122
-
123
- /**
124
- * Hook for subclasses to register middleware on the Express app before the MCP routes
125
- * are mounted. Called once during {@link start}, after the app is created and before
126
- * `POST` / `GET` / `DELETE` handlers are added.
127
- *
128
- * Default behavior: install an Origin allowlist if one is configured. Host-header
129
- * validation is already wired by the SDK's `createMcpExpressApp` (using the same
130
- * `allowedHosts` we forward in {@link start}); we don't duplicate it here. Subclasses
131
- * that override SHOULD `super.configureExpressApp(app)` to keep the origin gate in place;
132
- * pre-existing security middleware can run before or after by calling super at the
133
- * appropriate point.
134
- */
135
- protected configureExpressApp(app: Express): void {
136
- const allowedOrigins = this.serverOptions.values.allowedOrigins;
137
- if (!allowedOrigins) {
138
- return;
139
- }
140
- app.use((req, res, next) => {
141
- const origin = req.headers.origin;
142
- if (origin && !allowedOrigins.includes(origin)) {
143
- res.status(403).json({ error: `Forbidden: Origin '${origin}' not allowed` });
144
- return;
145
- }
146
- next();
147
- });
148
- }
149
-
150
- /**
151
- * Validate the `MCP-Protocol-Version` header per the Streamable HTTP transport spec.
152
- * Initialize POSTs negotiate the version in the body — the header isn't expected there.
153
- * For every other request: absent header → pass through (the spec mandates the server
154
- * default to `2025-03-26`); present-but-unsupported → respond `400` with a JSON-RPC error
155
- * envelope so the client knows which versions to retry with.
156
- */
157
- protected validateProtocolVersionHeader(req: express.Request, res: express.Response, next: express.NextFunction): void {
158
- if (req.method === 'POST' && isInitializeRequest(req.body)) {
159
- return next();
160
- }
161
- const headerValue = req.headers['mcp-protocol-version'];
162
- const version = Array.isArray(headerValue) ? headerValue[0] : headerValue;
163
- if (version === undefined) {
164
- return next();
165
- }
166
- if (!SUPPORTED_PROTOCOL_VERSIONS.includes(version)) {
167
- res.status(400).json({
168
- jsonrpc: '2.0',
169
- error: {
170
- code: -32000,
171
- message:
172
- `Unsupported MCP-Protocol-Version: '${version}'. ` +
173
- `Supported versions: ${SUPPORTED_PROTOCOL_VERSIONS.join(', ')}.`
174
- },
175
- id: JSON_RPC_NULL_ID
176
- });
177
- return;
178
- }
179
- next();
180
- }
181
-
182
- protected toServerUrl({ address, family, port }: AddressInfo, route: string, protocol = 'http'): string {
183
- const host = address === '::' || address === '0.0.0.0' ? 'localhost' : family === 'IPv6' ? `[${address}]` : address;
184
- return `${protocol}://${host}:${port}${route}`;
185
- }
186
-
187
- protected listening(): void {
188
- const addressInfo = this.server?.address();
189
- if (!addressInfo) {
190
- this.logger.error('Could not resolve MCP Server address info. Shutting down.');
191
- this._server?.close();
192
- return;
193
- } else if (typeof addressInfo === 'string') {
194
- this.logger.error(`MCP Server is unexpectedly listening to pipe or domain socket "${addressInfo}". Shutting down.`);
195
- this._server?.close();
196
- return;
197
- }
198
- this._addressInfo.resolve(addressInfo);
199
- }
200
-
201
- protected async handlePostRequest(req: express.Request, res: express.Response): Promise<void> {
202
- const client = this.getOrCreateClient(req, res);
203
- if (!client) {
204
- return;
205
- }
206
- this.logger.debug(`Handling POST request for session ${client.sessionId}`);
207
- try {
208
- await client.handleRequest(req, res, req.body);
209
- } catch (err: unknown) {
210
- this.logger.error('Error handling MCP request:', err);
211
- if (!res.headersSent) {
212
- res.status(500).json({ jsonrpc: '2.0', error: { code: -32603, message: 'Internal server error' }, id: JSON_RPC_NULL_ID });
213
- }
214
- }
215
- }
216
-
217
- /**
218
- * Handle GET requests for SSE streams (using built-in support from StreamableHTTP)
219
- */
220
- protected async handleGetRequest(req: express.Request, res: express.Response): Promise<void> {
221
- const client = this.getClient(req, res);
222
- if (!client) {
223
- return;
224
- }
225
-
226
- // Check for Last-Event-ID header for resumability
227
- const lastEventId = req.headers['last-event-id'] as string | undefined;
228
- if (lastEventId) {
229
- this.logger.info(`Client reconnecting with Last-Event-ID: ${lastEventId}`);
230
- } else {
231
- this.logger.info(`Establishing new SSE stream for session ${client.sessionId}`);
232
- }
233
- await client.handleRequest(req, res);
234
- }
235
-
236
- /**
237
- * Handle DELETE requests for session termination (according to MCP spec).
238
- */
239
- protected async handleDeleteRequest(req: express.Request, res: express.Response): Promise<void> {
240
- const client = this.getClient(req, res);
241
- if (!client) {
242
- return;
243
- }
244
-
245
- this.logger.info(`Received session termination request for session ${client.sessionId}`);
246
- try {
247
- // SDK transport closes the session as part of handleRequest.
248
- await client.handleRequest(req, res);
249
- } catch (err: unknown) {
250
- this.logger.error('Error handling session termination:', err);
251
- if (!res.headersSent) {
252
- res.status(500).json({ jsonrpc: '2.0', error: { code: -32603, message: 'Internal server error' }, id: JSON_RPC_NULL_ID });
253
- }
254
- }
255
- }
256
-
257
- protected getOrCreateClient(req: express.Request, res: express.Response): StreamableHTTPServerTransport | undefined {
258
- // A brand-new session is born on an initialize POST that doesn't assert a session id.
259
- // Every other case falls through to `getClient`, which enforces the spec-mandated
260
- // 400/404 errors — including the case where an initialize POST carries an unknown
261
- // session id (§ #3 — must not silently mint a replacement).
262
- if (!getSessionIdHeader(req) && isInitializeRequest(req.body)) {
263
- return this.createClient();
264
- }
265
- return this.getClient(req, res);
266
- }
267
-
268
- protected getClient(req: express.Request, res: express.Response): StreamableHTTPServerTransport | undefined {
269
- const sessionId = getSessionIdHeader(req);
270
- if (!sessionId) {
271
- // MCP Streamable HTTP § Session Management #2: a non-initialize request without
272
- // a session id MUST be rejected with HTTP 400.
273
- res.status(400).json({
274
- jsonrpc: '2.0',
275
- error: { code: -32000, message: 'Bad Request: No valid session ID provided' },
276
- id: JSON_RPC_NULL_ID
277
- });
278
- return undefined;
279
- }
280
- const client = this.sessions.get(sessionId);
281
- if (!client) {
282
- // MCP Streamable HTTP § Session Management #3: requests bearing an unknown or
283
- // terminated session id MUST be answered with HTTP 404 so the client knows to
284
- // re-initialize.
285
- res.status(404).json({
286
- jsonrpc: '2.0',
287
- error: { code: -32001, message: 'Session not found' },
288
- id: JSON_RPC_NULL_ID
289
- });
290
- return undefined;
291
- }
292
- return client;
293
- }
294
-
295
- protected createClient(): StreamableHTTPServerTransport {
296
- const client = new StreamableHTTPServerTransport({
297
- sessionIdGenerator: () => randomUUID(),
298
- // Bounded LRU store so resumability via `Last-Event-ID` works without leaking
299
- // memory in long-running deployments. Cap configurable via `eventStoreLimit`.
300
- eventStore: new LruEventStore(this.serverOptions.values.eventStoreLimit, this.logger),
301
- onsessioninitialized: sessionId => {
302
- // Store the transport by session ID when session is initialized
303
- // This avoids race conditions where requests might come in before the session is stored
304
- this.logger.info(`Session initialized with ID: ${sessionId}`);
305
- this.sessions.set(sessionId, client);
306
- this.onSessionInitializedEmitter.fire(client as WithSessionId<StreamableHTTPServerTransport>);
307
- }
308
- });
309
- client.onclose = () => this.closeClient(client.sessionId);
310
- // Surface transport errors to the GLSP logger. SDK 1.27.1 routes previously-swallowed
311
- // errors here; without an explicit handler they go undiagnosed.
312
- client.onerror = err => this.logger.error(`MCP transport error (session ${client.sessionId ?? '<pre-init>'}):`, err);
313
- return client;
314
- }
315
-
316
- protected closeClient(sessionId?: string): void {
317
- if (!sessionId) {
318
- return;
319
- }
320
- const client = this.sessions.get(sessionId);
321
- if (client) {
322
- this.sessions.delete(sessionId);
323
- client.close();
324
- this.logger.info(`Closed and removed client with session ID ${sessionId}`);
325
- this.onSessionClosedEmitter.fire(sessionId);
326
- }
327
- }
328
-
329
- dispose(): void {
330
- // Close session transports first so their SSE responses end cleanly. `http.Server.close()`
331
- // only stops accepting new connections — existing sockets stay open until they drain — so
332
- // closing the server first would leave streams hanging until the per-session `client.close()`
333
- // catches up.
334
- // `Transport.close()` is async (returns Promise<void>) but `Disposable.dispose()` is sync,
335
- // so we attach a catch handler to keep stray rejections out of the unhandled-rejection log.
336
- Array.from(this.sessions.values()).forEach(client =>
337
- client.close().catch(err => this.logger.warn(`Error closing MCP session ${client.sessionId}: ${err}`))
338
- );
339
- this.sessions.clear();
340
- this._server?.close();
341
- // Reset transient state so a subsequent `start()` call boots cleanly. Required because
342
- // the transport is bound `inSingletonScope()` — without the reset, dispose-then-restart
343
- // (e.g., GLSP server shutdown followed by a fresh `initializeServer`) would reuse the
344
- // dead `_addressInfo` deferred and the closed Express app.
345
- this._app = undefined;
346
- this._server = undefined;
347
- this._addressInfo = new Deferred<AddressInfo>();
348
- this.logger.info('Server shutdown complete');
349
- }
350
- }
351
-
352
- /**
353
- * Read the `mcp-session-id` header. Node's `IncomingHttpHeaders` types unknown headers as
354
- * `string | string[] | undefined`; if a misbehaving client sends the header twice we pick
355
- * the first value rather than coercing the array to `"a,b"` and silently failing the lookup.
356
- */
357
- function getSessionIdHeader(req: express.Request): string | undefined {
358
- const value = req.headers['mcp-session-id'];
359
- return Array.isArray(value) ? value[0] : value;
360
- }
361
-
362
- /**
363
- * JSON-RPC 2.0 § 5 mandates `null` for error responses where the request id cannot be
364
- * determined (e.g., parse errors, batch-level rejection, missing session id). Centralised so
365
- * the unavoidable `null` literal lives behind one eslint exception instead of many.
366
- */
367
- // eslint-disable-next-line no-null/no-null
368
- const JSON_RPC_NULL_ID = null;