@eclipse-glsp/server-mcp 2.7.0-next.9

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 (303) hide show
  1. package/LICENSE +642 -0
  2. package/README.md +57 -0
  3. package/lib/index.d.ts +23 -0
  4. package/lib/index.d.ts.map +1 -0
  5. package/lib/index.js +41 -0
  6. package/lib/index.js.map +1 -0
  7. package/lib/prompts/handlers/describe-diagram-mcp-prompt-handler.d.ts +43 -0
  8. package/lib/prompts/handlers/describe-diagram-mcp-prompt-handler.d.ts.map +1 -0
  9. package/lib/prompts/handlers/describe-diagram-mcp-prompt-handler.js +96 -0
  10. package/lib/prompts/handlers/describe-diagram-mcp-prompt-handler.js.map +1 -0
  11. package/lib/prompts/handlers/suggest-improvements-mcp-prompt-handler.d.ts +43 -0
  12. package/lib/prompts/handlers/suggest-improvements-mcp-prompt-handler.d.ts.map +1 -0
  13. package/lib/prompts/handlers/suggest-improvements-mcp-prompt-handler.js +95 -0
  14. package/lib/prompts/handlers/suggest-improvements-mcp-prompt-handler.js.map +1 -0
  15. package/lib/prompts/index.d.ts +18 -0
  16. package/lib/prompts/index.d.ts.map +1 -0
  17. package/lib/prompts/index.js +34 -0
  18. package/lib/prompts/index.js.map +1 -0
  19. package/lib/resources/handlers/diagram-png-mcp-resource-handler.d.ts +81 -0
  20. package/lib/resources/handlers/diagram-png-mcp-resource-handler.d.ts.map +1 -0
  21. package/lib/resources/handlers/diagram-png-mcp-resource-handler.js +174 -0
  22. package/lib/resources/handlers/diagram-png-mcp-resource-handler.js.map +1 -0
  23. package/lib/resources/handlers/diagram-svg-mcp-resource-handler.d.ts +52 -0
  24. package/lib/resources/handlers/diagram-svg-mcp-resource-handler.d.ts.map +1 -0
  25. package/lib/resources/handlers/diagram-svg-mcp-resource-handler.js +96 -0
  26. package/lib/resources/handlers/diagram-svg-mcp-resource-handler.js.map +1 -0
  27. package/lib/resources/index.d.ts +20 -0
  28. package/lib/resources/index.d.ts.map +1 -0
  29. package/lib/resources/index.js +36 -0
  30. package/lib/resources/index.js.map +1 -0
  31. package/lib/resources/services/element-types-provider.d.ts +65 -0
  32. package/lib/resources/services/element-types-provider.d.ts.map +1 -0
  33. package/lib/resources/services/element-types-provider.js +81 -0
  34. package/lib/resources/services/element-types-provider.js.map +1 -0
  35. package/lib/resources/services/mcp-model-serializer.d.ts +78 -0
  36. package/lib/resources/services/mcp-model-serializer.d.ts.map +1 -0
  37. package/lib/resources/services/mcp-model-serializer.js +188 -0
  38. package/lib/resources/services/mcp-model-serializer.js.map +1 -0
  39. package/lib/server/glsp-mcp-server.d.ts +82 -0
  40. package/lib/server/glsp-mcp-server.d.ts.map +1 -0
  41. package/lib/server/glsp-mcp-server.js +140 -0
  42. package/lib/server/glsp-mcp-server.js.map +1 -0
  43. package/lib/server/index.d.ts +37 -0
  44. package/lib/server/index.d.ts.map +1 -0
  45. package/lib/server/index.js +57 -0
  46. package/lib/server/index.js.map +1 -0
  47. package/lib/server/lru-event-store.d.ts +53 -0
  48. package/lib/server/lru-event-store.d.ts.map +1 -0
  49. package/lib/server/lru-event-store.js +100 -0
  50. package/lib/server/lru-event-store.js.map +1 -0
  51. package/lib/server/mcp-diagram-handler-dispatcher.d.ts +144 -0
  52. package/lib/server/mcp-diagram-handler-dispatcher.d.ts.map +1 -0
  53. package/lib/server/mcp-diagram-handler-dispatcher.js +382 -0
  54. package/lib/server/mcp-diagram-handler-dispatcher.js.map +1 -0
  55. package/lib/server/mcp-diagram-module.d.ts +123 -0
  56. package/lib/server/mcp-diagram-module.d.ts.map +1 -0
  57. package/lib/server/mcp-diagram-module.js +186 -0
  58. package/lib/server/mcp-diagram-module.js.map +1 -0
  59. package/lib/server/mcp-diagram-prompt-handler-registry.d.ts +33 -0
  60. package/lib/server/mcp-diagram-prompt-handler-registry.d.ts.map +1 -0
  61. package/lib/server/mcp-diagram-prompt-handler-registry.js +76 -0
  62. package/lib/server/mcp-diagram-prompt-handler-registry.js.map +1 -0
  63. package/lib/server/mcp-diagram-resource-handler-registry.d.ts +35 -0
  64. package/lib/server/mcp-diagram-resource-handler-registry.d.ts.map +1 -0
  65. package/lib/server/mcp-diagram-resource-handler-registry.js +94 -0
  66. package/lib/server/mcp-diagram-resource-handler-registry.js.map +1 -0
  67. package/lib/server/mcp-diagram-tool-handler-registry.d.ts +57 -0
  68. package/lib/server/mcp-diagram-tool-handler-registry.d.ts.map +1 -0
  69. package/lib/server/mcp-diagram-tool-handler-registry.js +111 -0
  70. package/lib/server/mcp-diagram-tool-handler-registry.js.map +1 -0
  71. package/lib/server/mcp-handler-shared.d.ts +142 -0
  72. package/lib/server/mcp-handler-shared.d.ts.map +1 -0
  73. package/lib/server/mcp-handler-shared.js +199 -0
  74. package/lib/server/mcp-handler-shared.js.map +1 -0
  75. package/lib/server/mcp-http-transport.d.ts +93 -0
  76. package/lib/server/mcp-http-transport.d.ts.map +1 -0
  77. package/lib/server/mcp-http-transport.js +350 -0
  78. package/lib/server/mcp-http-transport.js.map +1 -0
  79. package/lib/server/mcp-id-alias-service.d.ts +70 -0
  80. package/lib/server/mcp-id-alias-service.d.ts.map +1 -0
  81. package/lib/server/mcp-id-alias-service.js +85 -0
  82. package/lib/server/mcp-id-alias-service.js.map +1 -0
  83. package/lib/server/mcp-input-schemas.d.ts +73 -0
  84. package/lib/server/mcp-input-schemas.d.ts.map +1 -0
  85. package/lib/server/mcp-input-schemas.js +67 -0
  86. package/lib/server/mcp-input-schemas.js.map +1 -0
  87. package/lib/server/mcp-label-provider.d.ts +45 -0
  88. package/lib/server/mcp-label-provider.d.ts.map +1 -0
  89. package/lib/server/mcp-label-provider.js +42 -0
  90. package/lib/server/mcp-label-provider.js.map +1 -0
  91. package/lib/server/mcp-log-level-registry.d.ts +54 -0
  92. package/lib/server/mcp-log-level-registry.d.ts.map +1 -0
  93. package/lib/server/mcp-log-level-registry.js +80 -0
  94. package/lib/server/mcp-log-level-registry.js.map +1 -0
  95. package/lib/server/mcp-logger.d.ts +59 -0
  96. package/lib/server/mcp-logger.d.ts.map +1 -0
  97. package/lib/server/mcp-logger.js +104 -0
  98. package/lib/server/mcp-logger.js.map +1 -0
  99. package/lib/server/mcp-mime-types.d.ts +28 -0
  100. package/lib/server/mcp-mime-types.d.ts.map +1 -0
  101. package/lib/server/mcp-mime-types.js +18 -0
  102. package/lib/server/mcp-mime-types.js.map +1 -0
  103. package/lib/server/mcp-options.d.ts +39 -0
  104. package/lib/server/mcp-options.d.ts.map +1 -0
  105. package/lib/server/mcp-options.js +53 -0
  106. package/lib/server/mcp-options.js.map +1 -0
  107. package/lib/server/mcp-progress-reporter.d.ts +48 -0
  108. package/lib/server/mcp-progress-reporter.d.ts.map +1 -0
  109. package/lib/server/mcp-progress-reporter.js +66 -0
  110. package/lib/server/mcp-progress-reporter.js.map +1 -0
  111. package/lib/server/mcp-prompt-handler.d.ts +120 -0
  112. package/lib/server/mcp-prompt-handler.d.ts.map +1 -0
  113. package/lib/server/mcp-prompt-handler.js +131 -0
  114. package/lib/server/mcp-prompt-handler.js.map +1 -0
  115. package/lib/server/mcp-request-context.d.ts +37 -0
  116. package/lib/server/mcp-request-context.d.ts.map +1 -0
  117. package/lib/server/mcp-request-context.js +37 -0
  118. package/lib/server/mcp-request-context.js.map +1 -0
  119. package/lib/server/mcp-resource-handler.d.ts +212 -0
  120. package/lib/server/mcp-resource-handler.d.ts.map +1 -0
  121. package/lib/server/mcp-resource-handler.js +298 -0
  122. package/lib/server/mcp-resource-handler.js.map +1 -0
  123. package/lib/server/mcp-server-launcher.d.ts +143 -0
  124. package/lib/server/mcp-server-launcher.d.ts.map +1 -0
  125. package/lib/server/mcp-server-launcher.js +355 -0
  126. package/lib/server/mcp-server-launcher.js.map +1 -0
  127. package/lib/server/mcp-server-module.d.ts +143 -0
  128. package/lib/server/mcp-server-module.d.ts.map +1 -0
  129. package/lib/server/mcp-server-module.js +249 -0
  130. package/lib/server/mcp-server-module.js.map +1 -0
  131. package/lib/server/mcp-session.d.ts +44 -0
  132. package/lib/server/mcp-session.d.ts.map +1 -0
  133. package/lib/server/mcp-session.js +18 -0
  134. package/lib/server/mcp-session.js.map +1 -0
  135. package/lib/server/mcp-tool-handler.d.ts +259 -0
  136. package/lib/server/mcp-tool-handler.d.ts.map +1 -0
  137. package/lib/server/mcp-tool-handler.js +355 -0
  138. package/lib/server/mcp-tool-handler.js.map +1 -0
  139. package/lib/tools/handlers/count-elements-mcp-tool-handler.d.ts +46 -0
  140. package/lib/tools/handlers/count-elements-mcp-tool-handler.d.ts.map +1 -0
  141. package/lib/tools/handlers/count-elements-mcp-tool-handler.js +76 -0
  142. package/lib/tools/handlers/count-elements-mcp-tool-handler.js.map +1 -0
  143. package/lib/tools/handlers/create-edges-mcp-tool-handler.d.ts +112 -0
  144. package/lib/tools/handlers/create-edges-mcp-tool-handler.d.ts.map +1 -0
  145. package/lib/tools/handlers/create-edges-mcp-tool-handler.js +190 -0
  146. package/lib/tools/handlers/create-edges-mcp-tool-handler.js.map +1 -0
  147. package/lib/tools/handlers/create-nodes-mcp-tool-handler.d.ts +81 -0
  148. package/lib/tools/handlers/create-nodes-mcp-tool-handler.d.ts.map +1 -0
  149. package/lib/tools/handlers/create-nodes-mcp-tool-handler.js +123 -0
  150. package/lib/tools/handlers/create-nodes-mcp-tool-handler.js.map +1 -0
  151. package/lib/tools/handlers/delete-elements-mcp-tool-handler.d.ts +52 -0
  152. package/lib/tools/handlers/delete-elements-mcp-tool-handler.d.ts.map +1 -0
  153. package/lib/tools/handlers/delete-elements-mcp-tool-handler.js +73 -0
  154. package/lib/tools/handlers/delete-elements-mcp-tool-handler.js.map +1 -0
  155. package/lib/tools/handlers/diagram-model-mcp-tool-handler.d.ts +59 -0
  156. package/lib/tools/handlers/diagram-model-mcp-tool-handler.d.ts.map +1 -0
  157. package/lib/tools/handlers/diagram-model-mcp-tool-handler.js +78 -0
  158. package/lib/tools/handlers/diagram-model-mcp-tool-handler.js.map +1 -0
  159. package/lib/tools/handlers/element-types-mcp-tool-handler.d.ts +97 -0
  160. package/lib/tools/handlers/element-types-mcp-tool-handler.d.ts.map +1 -0
  161. package/lib/tools/handlers/element-types-mcp-tool-handler.js +155 -0
  162. package/lib/tools/handlers/element-types-mcp-tool-handler.js.map +1 -0
  163. package/lib/tools/handlers/get-selection-mcp-tool-handler.d.ts +43 -0
  164. package/lib/tools/handlers/get-selection-mcp-tool-handler.d.ts.map +1 -0
  165. package/lib/tools/handlers/get-selection-mcp-tool-handler.js +68 -0
  166. package/lib/tools/handlers/get-selection-mcp-tool-handler.js.map +1 -0
  167. package/lib/tools/handlers/layout-mcp-tool-handler.d.ts +43 -0
  168. package/lib/tools/handlers/layout-mcp-tool-handler.d.ts.map +1 -0
  169. package/lib/tools/handlers/layout-mcp-tool-handler.js +71 -0
  170. package/lib/tools/handlers/layout-mcp-tool-handler.js.map +1 -0
  171. package/lib/tools/handlers/modify-edges-mcp-tool-handler.d.ts +78 -0
  172. package/lib/tools/handlers/modify-edges-mcp-tool-handler.d.ts.map +1 -0
  173. package/lib/tools/handlers/modify-edges-mcp-tool-handler.js +136 -0
  174. package/lib/tools/handlers/modify-edges-mcp-tool-handler.js.map +1 -0
  175. package/lib/tools/handlers/modify-nodes-mcp-tool-handler.d.ts +92 -0
  176. package/lib/tools/handlers/modify-nodes-mcp-tool-handler.d.ts.map +1 -0
  177. package/lib/tools/handlers/modify-nodes-mcp-tool-handler.js +125 -0
  178. package/lib/tools/handlers/modify-nodes-mcp-tool-handler.js.map +1 -0
  179. package/lib/tools/handlers/query-elements-mcp-tool-handler.d.ts +102 -0
  180. package/lib/tools/handlers/query-elements-mcp-tool-handler.d.ts.map +1 -0
  181. package/lib/tools/handlers/query-elements-mcp-tool-handler.js +158 -0
  182. package/lib/tools/handlers/query-elements-mcp-tool-handler.js.map +1 -0
  183. package/lib/tools/handlers/redo-mcp-tool-handler.d.ts +45 -0
  184. package/lib/tools/handlers/redo-mcp-tool-handler.d.ts.map +1 -0
  185. package/lib/tools/handlers/redo-mcp-tool-handler.js +73 -0
  186. package/lib/tools/handlers/redo-mcp-tool-handler.js.map +1 -0
  187. package/lib/tools/handlers/save-model-mcp-tool-handler.d.ts +55 -0
  188. package/lib/tools/handlers/save-model-mcp-tool-handler.d.ts.map +1 -0
  189. package/lib/tools/handlers/save-model-mcp-tool-handler.js +91 -0
  190. package/lib/tools/handlers/save-model-mcp-tool-handler.js.map +1 -0
  191. package/lib/tools/handlers/session-info-mcp-tool-handler.d.ts +65 -0
  192. package/lib/tools/handlers/session-info-mcp-tool-handler.d.ts.map +1 -0
  193. package/lib/tools/handlers/session-info-mcp-tool-handler.js +108 -0
  194. package/lib/tools/handlers/session-info-mcp-tool-handler.js.map +1 -0
  195. package/lib/tools/handlers/set-selection-mcp-tool-handler.d.ts +60 -0
  196. package/lib/tools/handlers/set-selection-mcp-tool-handler.d.ts.map +1 -0
  197. package/lib/tools/handlers/set-selection-mcp-tool-handler.js +103 -0
  198. package/lib/tools/handlers/set-selection-mcp-tool-handler.js.map +1 -0
  199. package/lib/tools/handlers/set-view-mcp-tool-handler.d.ts +110 -0
  200. package/lib/tools/handlers/set-view-mcp-tool-handler.d.ts.map +1 -0
  201. package/lib/tools/handlers/set-view-mcp-tool-handler.js +142 -0
  202. package/lib/tools/handlers/set-view-mcp-tool-handler.js.map +1 -0
  203. package/lib/tools/handlers/undo-mcp-tool-handler.d.ts +45 -0
  204. package/lib/tools/handlers/undo-mcp-tool-handler.d.ts.map +1 -0
  205. package/lib/tools/handlers/undo-mcp-tool-handler.js +74 -0
  206. package/lib/tools/handlers/undo-mcp-tool-handler.js.map +1 -0
  207. package/lib/tools/handlers/validate-diagram-mcp-tool-handler.d.ts +66 -0
  208. package/lib/tools/handlers/validate-diagram-mcp-tool-handler.d.ts.map +1 -0
  209. package/lib/tools/handlers/validate-diagram-mcp-tool-handler.js +0 -0
  210. package/lib/tools/handlers/validate-diagram-mcp-tool-handler.js.map +1 -0
  211. package/lib/tools/index.d.ts +34 -0
  212. package/lib/tools/index.d.ts.map +1 -0
  213. package/lib/tools/index.js +50 -0
  214. package/lib/tools/index.js.map +1 -0
  215. package/lib/util/index.d.ts +18 -0
  216. package/lib/util/index.d.ts.map +1 -0
  217. package/lib/util/index.js +34 -0
  218. package/lib/util/index.js.map +1 -0
  219. package/lib/util/markdown-util.d.ts +20 -0
  220. package/lib/util/markdown-util.d.ts.map +1 -0
  221. package/lib/util/markdown-util.js +45 -0
  222. package/lib/util/markdown-util.js.map +1 -0
  223. package/lib/util/mcp-util.d.ts +22 -0
  224. package/lib/util/mcp-util.d.ts.map +1 -0
  225. package/lib/util/mcp-util.js +29 -0
  226. package/lib/util/mcp-util.js.map +1 -0
  227. package/package.json +63 -0
  228. package/src/index.ts +24 -0
  229. package/src/prompts/handlers/describe-diagram-mcp-prompt-handler.ts +89 -0
  230. package/src/prompts/handlers/suggest-improvements-mcp-prompt-handler.ts +86 -0
  231. package/src/prompts/index.ts +18 -0
  232. package/src/resources/handlers/diagram-png-mcp-resource-handler.ts +181 -0
  233. package/src/resources/handlers/diagram-svg-mcp-resource-handler.ts +89 -0
  234. package/src/resources/index.ts +20 -0
  235. package/src/resources/services/element-types-provider.ts +105 -0
  236. package/src/resources/services/mcp-model-serializer.ts +211 -0
  237. package/src/server/glsp-mcp-server.spec.ts +73 -0
  238. package/src/server/glsp-mcp-server.ts +196 -0
  239. package/src/server/index.ts +42 -0
  240. package/src/server/lru-event-store.spec.ts +121 -0
  241. package/src/server/lru-event-store.ts +112 -0
  242. package/src/server/mcp-diagram-handler-dispatcher.spec.ts +231 -0
  243. package/src/server/mcp-diagram-handler-dispatcher.ts +459 -0
  244. package/src/server/mcp-diagram-module.ts +248 -0
  245. package/src/server/mcp-diagram-prompt-handler-registry.ts +59 -0
  246. package/src/server/mcp-diagram-resource-handler-registry.ts +73 -0
  247. package/src/server/mcp-diagram-tool-handler-registry.ts +97 -0
  248. package/src/server/mcp-handler-shared.spec.ts +53 -0
  249. package/src/server/mcp-handler-shared.ts +247 -0
  250. package/src/server/mcp-http-transport-e2e.spec.ts +151 -0
  251. package/src/server/mcp-http-transport.spec.ts +385 -0
  252. package/src/server/mcp-http-transport.ts +368 -0
  253. package/src/server/mcp-id-alias-service.spec.ts +106 -0
  254. package/src/server/mcp-id-alias-service.ts +104 -0
  255. package/src/server/mcp-input-schemas.ts +82 -0
  256. package/src/server/mcp-label-provider.ts +52 -0
  257. package/src/server/mcp-log-level-registry.spec.ts +75 -0
  258. package/src/server/mcp-log-level-registry.ts +90 -0
  259. package/src/server/mcp-logger.spec.ts +227 -0
  260. package/src/server/mcp-logger.ts +91 -0
  261. package/src/server/mcp-mime-types.ts +31 -0
  262. package/src/server/mcp-options.ts +43 -0
  263. package/src/server/mcp-progress-reporter.spec.ts +93 -0
  264. package/src/server/mcp-progress-reporter.ts +67 -0
  265. package/src/server/mcp-prompt-handler.ts +157 -0
  266. package/src/server/mcp-request-context.ts +39 -0
  267. package/src/server/mcp-resource-handler.ts +389 -0
  268. package/src/server/mcp-server-launcher.spec.ts +173 -0
  269. package/src/server/mcp-server-launcher.ts +369 -0
  270. package/src/server/mcp-server-module.ts +287 -0
  271. package/src/server/mcp-session.ts +45 -0
  272. package/src/server/mcp-tool-handler.spec.ts +182 -0
  273. package/src/server/mcp-tool-handler.ts +431 -0
  274. package/src/server/raw-http.spec.ts +59 -0
  275. package/src/tools/handlers/count-elements-mcp-tool-handler.spec.ts +99 -0
  276. package/src/tools/handlers/count-elements-mcp-tool-handler.ts +66 -0
  277. package/src/tools/handlers/create-edges-mcp-tool-handler.spec.ts +196 -0
  278. package/src/tools/handlers/create-edges-mcp-tool-handler.ts +205 -0
  279. package/src/tools/handlers/create-nodes-mcp-tool-handler.spec.ts +197 -0
  280. package/src/tools/handlers/create-nodes-mcp-tool-handler.ts +131 -0
  281. package/src/tools/handlers/delete-elements-mcp-tool-handler.ts +73 -0
  282. package/src/tools/handlers/diagram-model-mcp-tool-handler.ts +66 -0
  283. package/src/tools/handlers/element-types-mcp-tool-handler.ts +151 -0
  284. package/src/tools/handlers/get-selection-mcp-tool-handler.ts +54 -0
  285. package/src/tools/handlers/layout-mcp-tool-handler.ts +56 -0
  286. package/src/tools/handlers/modify-edges-mcp-tool-handler.ts +148 -0
  287. package/src/tools/handlers/modify-nodes-mcp-tool-handler.ts +140 -0
  288. package/src/tools/handlers/query-elements-mcp-tool-handler.spec.ts +210 -0
  289. package/src/tools/handlers/query-elements-mcp-tool-handler.ts +161 -0
  290. package/src/tools/handlers/redo-mcp-tool-handler.ts +62 -0
  291. package/src/tools/handlers/save-model-mcp-tool-handler.ts +71 -0
  292. package/src/tools/handlers/session-info-mcp-tool-handler.spec.ts +152 -0
  293. package/src/tools/handlers/session-info-mcp-tool-handler.ts +97 -0
  294. package/src/tools/handlers/set-selection-mcp-tool-handler.spec.ts +118 -0
  295. package/src/tools/handlers/set-selection-mcp-tool-handler.ts +90 -0
  296. package/src/tools/handlers/set-view-mcp-tool-handler.ts +162 -0
  297. package/src/tools/handlers/undo-mcp-tool-handler.ts +61 -0
  298. package/src/tools/handlers/validate-diagram-mcp-tool-handler.ts +0 -0
  299. package/src/tools/index.ts +34 -0
  300. package/src/tools/tool-annotations.spec.ts +141 -0
  301. package/src/util/index.ts +18 -0
  302. package/src/util/markdown-util.ts +44 -0
  303. package/src/util/mcp-util.ts +25 -0
@@ -0,0 +1,459 @@
1
+ /********************************************************************************
2
+ * Copyright (c) 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 {
18
+ ClientSessionManager,
19
+ DiagramModules,
20
+ InjectionContainer,
21
+ Logger,
22
+ TEMPORARY_CLIENT_ID,
23
+ createClientSessionModule
24
+ } from '@eclipse-glsp/server';
25
+ import { CompleteResourceTemplateCallback, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
26
+ import { Variables } from '@modelcontextprotocol/sdk/shared/uriTemplate.js';
27
+ import { CallToolResult, GetPromptResult, ListResourcesResult, ReadResourceResult } from '@modelcontextprotocol/sdk/types.js';
28
+ import { Container, ContainerModule, inject, injectable, interfaces } from 'inversify';
29
+ import { GLSPMcpServer } from './glsp-mcp-server';
30
+ import { McpDiagramPromptHandlerRegistry } from './mcp-diagram-prompt-handler-registry';
31
+ import { McpDiagramResourceHandlerRegistry } from './mcp-diagram-resource-handler-registry';
32
+ import { McpDiagramToolHandlerRegistry } from './mcp-diagram-tool-handler-registry';
33
+ import { McpMissingParamError, McpSessionNotFoundError, McpToolError, runWithToolErrorEnvelope } from './mcp-handler-shared';
34
+ import { McpDiagramScopedInput } from './mcp-input-schemas';
35
+ import { AbstractMcpDiagramPromptHandler, McpDiagramPromptHandlerConstructor } from './mcp-prompt-handler';
36
+ import { mcpRequestContext } from './mcp-request-context';
37
+ import { AbstractMcpDiagramResourceHandler, McpDiagramResourceHandlerConstructor, toParams } from './mcp-resource-handler';
38
+ import { BaseMcpDiagramToolHandler, McpDiagramToolHandlerConstructor } from './mcp-tool-handler';
39
+
40
+ /**
41
+ * Per-diagram-type catalog of constructor lists, harvested at MCP-server start by loading each
42
+ * diagram type's modules onto a temporary child container — same pattern as
43
+ * `DefaultGlobalActionProvider` (`packages/server/src/common/actions/global-action-provider.ts:36-48`).
44
+ * The constructors stay across MCP-session inits; the temporary container lives just long enough
45
+ * for `getAll(...)` to read the `InstanceMultiBinding` constant value.
46
+ */
47
+ export interface DiagramTypeCatalog {
48
+ readonly diagramType: string;
49
+ readonly toolConstructors: McpDiagramToolHandlerConstructor[];
50
+ readonly resourceConstructors: McpDiagramResourceHandlerConstructor[];
51
+ readonly promptConstructors: McpDiagramPromptHandlerConstructor[];
52
+ }
53
+
54
+ /**
55
+ * Owns diagram-scope handler discovery, SDK registration, and per-MCP-call dispatch routing.
56
+ * Extracted from {@link McpServerLauncher} so adopters can `rebind(McpDiagramHandlerDispatcher)`
57
+ * to a custom implementation without subclassing the entire launcher lifecycle.
58
+ *
59
+ * Responsibilities:
60
+ * - Harvest per-diagram-type constructor catalogs from the diagram modules ({@link harvest}).
61
+ * - Register one SDK tool/resource/prompt per metadata `name` against a per-MCP-session
62
+ * {@link GLSPMcpServer}, deduping across diagram types ({@link registerAll}).
63
+ * - Dispatch each registered SDK callback to the per-GLSP-session handler instance, resolved
64
+ * from the GLSP session container by the {@link McpDiagramScopedInput.sessionId} input.
65
+ */
66
+ export interface McpDiagramHandlerDispatcher {
67
+ /** Build the diagram-type catalog from registered diagram modules. Idempotent until {@link reset}. */
68
+ harvest(): void;
69
+ /** Drop the cached catalog so a subsequent {@link harvest} re-reads the diagram modules. */
70
+ reset(): void;
71
+
72
+ /** True when at least one diagram type has at least one tool handler bound. */
73
+ hasDiagramTools(): boolean;
74
+ /** True when at least one diagram type has at least one resource handler bound. */
75
+ hasDiagramResources(): boolean;
76
+ /** True when at least one diagram type has at least one prompt handler bound. */
77
+ hasDiagramPrompts(): boolean;
78
+
79
+ /** Register all diagram-scope tools/resources/prompts on the supplied per-MCP-session server. */
80
+ registerAll(glspMcpServer: GLSPMcpServer, resourcesAsResources: boolean): void;
81
+ }
82
+
83
+ export const McpDiagramHandlerDispatcher = Symbol('McpDiagramHandlerDispatcher');
84
+
85
+ @injectable()
86
+ export class DefaultMcpDiagramHandlerDispatcher implements McpDiagramHandlerDispatcher {
87
+ @inject(InjectionContainer) protected serverContainer: Container;
88
+ @inject(DiagramModules) protected diagramModules: Map<string, ContainerModule[]>;
89
+ @inject(ClientSessionManager) protected clientSessionManager: ClientSessionManager;
90
+ @inject(Logger) protected logger: Logger;
91
+
92
+ protected diagramCatalogs: DiagramTypeCatalog[] = [];
93
+
94
+ /**
95
+ * Build the per-diagram-type catalog by inspecting each diagram type's module set. We don't
96
+ * have a real GLSP session yet — and we don't want one, because we only need the bound
97
+ * constructor *lists*, not instances. So we spin up a throwaway child container per diagram
98
+ * type, load its modules plus a placeholder session module, and read out the multi-binding
99
+ * constants. No handler is instantiated; the temporary container is unbound immediately
100
+ * after.
101
+ *
102
+ * The placeholder session module is bound with the synthetic {@link TEMPORARY_CLIENT_ID} so
103
+ * any session-scoped `@inject(ClientId)` in module-load wiring resolves cleanly. Diagram
104
+ * modules must therefore treat `ClientId` as opaque at `configure()` time — the value they
105
+ * see at harvest is a placeholder, not the GLSP session that will later receive a call.
106
+ *
107
+ * Idempotent until {@link reset}.
108
+ */
109
+ harvest(): void {
110
+ if (this.diagramCatalogs.length > 0) {
111
+ return;
112
+ }
113
+ const catalogs: DiagramTypeCatalog[] = [];
114
+ const placeholderSessionModule = createClientSessionModule({
115
+ clientId: TEMPORARY_CLIENT_ID,
116
+ glspClient: { process: () => {} },
117
+ clientActionKinds: []
118
+ });
119
+ for (const [diagramType, modules] of this.diagramModules) {
120
+ const tempContainer = this.serverContainer.createChild();
121
+ tempContainer.load(...modules, placeholderSessionModule);
122
+ const tools = getConstructorList<McpDiagramToolHandlerConstructor>(tempContainer, McpDiagramToolHandlerConstructor);
123
+ const resources = getConstructorList<McpDiagramResourceHandlerConstructor>(tempContainer, McpDiagramResourceHandlerConstructor);
124
+ const prompts = getConstructorList<McpDiagramPromptHandlerConstructor>(tempContainer, McpDiagramPromptHandlerConstructor);
125
+ tempContainer.unbindAll();
126
+ catalogs.push({ diagramType, toolConstructors: tools, resourceConstructors: resources, promptConstructors: prompts });
127
+ }
128
+ this.diagramCatalogs = catalogs;
129
+ }
130
+
131
+ /** True when at least one diagram type has at least one tool handler bound. */
132
+ hasDiagramTools(): boolean {
133
+ return this.diagramCatalogs.some(catalog => catalog.toolConstructors.length > 0);
134
+ }
135
+
136
+ /** True when at least one diagram type has at least one resource handler bound. */
137
+ hasDiagramResources(): boolean {
138
+ return this.diagramCatalogs.some(catalog => catalog.resourceConstructors.length > 0);
139
+ }
140
+
141
+ /** True when at least one diagram type has at least one prompt handler bound. */
142
+ hasDiagramPrompts(): boolean {
143
+ return this.diagramCatalogs.some(catalog => catalog.promptConstructors.length > 0);
144
+ }
145
+
146
+ /**
147
+ * Registers all diagram-scope tools/resources/prompts on the supplied per-MCP-session
148
+ * {@link GLSPMcpServer}. Resource registration shape depends on `dataMode`: `resources`
149
+ * registers them as URI-addressable resources; `tools` (default) registers each
150
+ * `toolAlternativeInputSchema`-bearing resource as a tool.
151
+ */
152
+ registerAll(glspMcpServer: GLSPMcpServer, resourcesAsResources: boolean): void {
153
+ this.registerDiagramScopeTools(glspMcpServer);
154
+ this.registerDiagramScopeResources(glspMcpServer, resourcesAsResources);
155
+ this.registerDiagramScopePrompts(glspMcpServer);
156
+ }
157
+
158
+ protected registerDiagramScopeTools(glspMcpServer: GLSPMcpServer): void {
159
+ const seen = new Map<string, { description: string; inputKeys: string; diagramType: string }>();
160
+ for (const catalog of this.diagramCatalogs) {
161
+ for (const Constructor of catalog.toolConstructors) {
162
+ const probe = new Constructor();
163
+ const fingerprint = {
164
+ description: probe.description,
165
+ inputKeys: Object.keys(probe.inputSchema?.shape ?? {})
166
+ .sort()
167
+ .join(','),
168
+ diagramType: catalog.diagramType
169
+ };
170
+ const existing = seen.get(probe.name);
171
+ if (existing) {
172
+ if (existing.description !== fingerprint.description || existing.inputKeys !== fingerprint.inputKeys) {
173
+ this.logger.warn(
174
+ `Diagram-scope tool '${probe.name}' is registered by multiple diagram types with diverging schemas: ` +
175
+ `first registered by '${existing.diagramType}', shadowed registration from '${catalog.diagramType}' ` +
176
+ 'is silently dropped. Either align schemas (description + inputSchema.shape keys must match) or ' +
177
+ 'pick distinct tool names.'
178
+ );
179
+ }
180
+ continue;
181
+ }
182
+ seen.set(probe.name, fingerprint);
183
+ glspMcpServer.registerTool(probe.name, probe.toRegistrationConfig(), (params, extra) =>
184
+ mcpRequestContext.run(extra, () => this.dispatchDiagramTool(probe.name, params))
185
+ );
186
+ }
187
+ }
188
+ }
189
+
190
+ protected registerDiagramScopeResources(glspMcpServer: GLSPMcpServer, resourcesAsResources: boolean): void {
191
+ const seenNames = new Set<string>();
192
+ for (const catalog of this.diagramCatalogs) {
193
+ for (const Constructor of catalog.resourceConstructors) {
194
+ const probe = new Constructor();
195
+ if (seenNames.has(probe.name)) {
196
+ continue;
197
+ }
198
+ seenNames.add(probe.name);
199
+ if (resourcesAsResources) {
200
+ this.registerOneDiagramResource(glspMcpServer, probe);
201
+ } else if (probe.toolAlternativeInputSchema) {
202
+ this.registerOneDiagramResourceAsTool(glspMcpServer, probe);
203
+ }
204
+ }
205
+ }
206
+ }
207
+
208
+ protected registerOneDiagramResource(
209
+ glspMcpServer: GLSPMcpServer,
210
+ probe: AbstractMcpDiagramResourceHandler<McpDiagramScopedInput>
211
+ ): void {
212
+ const name = probe.name;
213
+ const annotations = probe.toAnnotations();
214
+ const config = {
215
+ title: probe.title,
216
+ description: probe.description,
217
+ mimeType: probe.mimeType,
218
+ ...(annotations ? { annotations } : {})
219
+ };
220
+ if (typeof probe.uri === 'string') {
221
+ const uri = probe.uri;
222
+ glspMcpServer.registerResource(name, uri, config, (_uri, extra) =>
223
+ mcpRequestContext.run(extra, () => this.dispatchStaticDiagramRead(name, uri))
224
+ );
225
+ } else {
226
+ const template = this.buildAggregatingResourceTemplate(probe.uri.template, name);
227
+ glspMcpServer.registerResource(name, template, config, (uri, params, extra) =>
228
+ mcpRequestContext.run(extra, () => this.dispatchTemplatedDiagramRead(name, uri, params))
229
+ );
230
+ }
231
+ }
232
+
233
+ protected registerOneDiagramResourceAsTool(
234
+ glspMcpServer: GLSPMcpServer,
235
+ probe: AbstractMcpDiagramResourceHandler<McpDiagramScopedInput>
236
+ ): void {
237
+ const name = probe.name;
238
+ const inputSchema = probe.toolAlternativeInputSchema!;
239
+ // `.strict()` matches the tool-handler policy — see `BaseMcpToolHandler.toRegistrationConfig`
240
+ // for the full rationale (LLM-typoed fields surface as JSON-RPC validation errors instead
241
+ // of being silently stripped).
242
+ glspMcpServer.registerTool(
243
+ name,
244
+ {
245
+ title: probe.title,
246
+ description: probe.description,
247
+ inputSchema: inputSchema.strict(),
248
+ outputSchema: probe.toolAlternativeOutputSchema
249
+ },
250
+ (params, extra) => mcpRequestContext.run(extra, () => this.dispatchDiagramResourceAsTool(name, params))
251
+ );
252
+ }
253
+
254
+ protected registerDiagramScopePrompts(glspMcpServer: GLSPMcpServer): void {
255
+ const seenNames = new Set<string>();
256
+ for (const catalog of this.diagramCatalogs) {
257
+ for (const Constructor of catalog.promptConstructors) {
258
+ const probe = new Constructor();
259
+ if (seenNames.has(probe.name)) {
260
+ continue;
261
+ }
262
+ seenNames.add(probe.name);
263
+ // Prompt errors propagate as JSON-RPC errors per spec — no `runWithToolErrorEnvelope` wrap.
264
+ glspMcpServer.registerPrompt(probe.name, probe.toRegistrationConfig(), (args, extra) =>
265
+ mcpRequestContext.run(extra, () => this.dispatchDiagramPrompt(probe.name, args))
266
+ );
267
+ }
268
+ }
269
+ }
270
+
271
+ /**
272
+ * Builds an SDK `ResourceTemplate` whose `list`/`complete` walk all open GLSP sessions and
273
+ * aggregate the per-session handler results. The cross-GLSP-session-pollution guard for
274
+ * `complete` (auto-empty for non-matching sessions) is applied at the handler base level
275
+ * via {@link AbstractMcpDiagramResourceHandler.glspSessionScopedComplete}.
276
+ */
277
+ protected buildAggregatingResourceTemplate(uriTemplate: string, name: string): ResourceTemplate {
278
+ return new ResourceTemplate(uriTemplate, {
279
+ list: extra => mcpRequestContext.run(extra, () => this.aggregateList(name)),
280
+ complete: this.buildAggregatedCompleters(name)
281
+ });
282
+ }
283
+
284
+ protected async aggregateList(name: string): Promise<ListResourcesResult> {
285
+ const aggregated: ListResourcesResult['resources'] = [];
286
+ const seenUris = new Set<string>();
287
+ for (const sessionId of this.clientSessionManager.getSessions().map(session => session.id)) {
288
+ const handler = this.findDiagramResourceHandler(name, sessionId);
289
+ const partial = await handler?.list?.();
290
+ if (!partial) {
291
+ continue;
292
+ }
293
+ for (const entry of partial.resources) {
294
+ if (!seenUris.has(entry.uri)) {
295
+ seenUris.add(entry.uri);
296
+ aggregated.push(entry);
297
+ }
298
+ }
299
+ }
300
+ return { resources: aggregated };
301
+ }
302
+
303
+ protected buildAggregatedCompleters(name: string): Record<string, CompleteResourceTemplateCallback> {
304
+ const variableNames = this.collectCompleterVariableNames(name);
305
+ const completers: Record<string, CompleteResourceTemplateCallback> = {};
306
+ for (const variable of variableNames) {
307
+ completers[variable] = async (value, ctx) => {
308
+ const aggregated = new Set<string>();
309
+ for (const sessionId of this.clientSessionManager.getSessions().map(session => session.id)) {
310
+ const handler = this.findDiagramResourceHandler(name, sessionId);
311
+ if (!handler) {
312
+ continue;
313
+ }
314
+ const sessionScoped = handler.glspSessionScopedComplete();
315
+ const completer = sessionScoped[variable];
316
+ if (!completer) {
317
+ continue;
318
+ }
319
+ const partial = await completer(value, ctx);
320
+ partial.forEach(item => aggregated.add(item));
321
+ }
322
+ return [...aggregated];
323
+ };
324
+ }
325
+ return completers;
326
+ }
327
+
328
+ /** Probe each diagram type's resource constructor for `complete()` keys to wire SDK-side. */
329
+ protected collectCompleterVariableNames(name: string): Set<string> {
330
+ const variables = new Set<string>();
331
+ for (const catalog of this.diagramCatalogs) {
332
+ for (const Constructor of catalog.resourceConstructors) {
333
+ const probe = new Constructor();
334
+ if (probe.name !== name) {
335
+ continue;
336
+ }
337
+ Object.keys(probe.complete?.() ?? {}).forEach(key => variables.add(key));
338
+ }
339
+ }
340
+ return variables;
341
+ }
342
+
343
+ // ── Dispatch entry points ──────────────────────────────────────────────────
344
+
345
+ /** SDK-validated `params` against the registered Zod schema before this callback fires. */
346
+ protected dispatchDiagramTool(name: string, params: unknown): Promise<CallToolResult> {
347
+ return runWithToolErrorEnvelope(async () => {
348
+ const handler = this.requireDiagramToolHandler(name, params);
349
+ return handler.handle(params as McpDiagramScopedInput);
350
+ });
351
+ }
352
+
353
+ /**
354
+ * Dispatch a read against a diagram-scope resource registered with a *static* (non-templated)
355
+ * URI. The URI carries no session id, so we pick the first open GLSP session as the source —
356
+ * adopters that need session-aware routing should register a templated URI instead.
357
+ */
358
+ protected dispatchStaticDiagramRead(name: string, uri: string): Promise<ReadResourceResult> {
359
+ const sessionId = this.clientSessionManager.getSessions()[0]?.id;
360
+ if (!sessionId) {
361
+ throw new McpToolError(`No open GLSP session can serve resource '${name}'.`);
362
+ }
363
+ const handler = this.requireDiagramResourceHandler(name, sessionId);
364
+ return handler.handleRead(uri, { sessionId });
365
+ }
366
+
367
+ protected dispatchTemplatedDiagramRead(name: string, uri: URL, params: Variables): Promise<ReadResourceResult> {
368
+ const flat = toParams(params);
369
+ const handler = this.requireDiagramResourceHandler(name, flat.sessionId);
370
+ return handler.handleRead(uri.toString(), flat as McpDiagramScopedInput);
371
+ }
372
+
373
+ protected dispatchDiagramResourceAsTool(name: string, params: unknown): Promise<CallToolResult> {
374
+ return runWithToolErrorEnvelope(async () => {
375
+ const handler = this.requireDiagramResourceHandler(name, this.extractSessionId(params));
376
+ return handler.handleAsTool(params as McpDiagramScopedInput);
377
+ });
378
+ }
379
+
380
+ protected dispatchDiagramPrompt(name: string, args: unknown): Promise<GetPromptResult> {
381
+ const handler = this.requireDiagramPromptHandler(name, args);
382
+ return handler.handle(args as McpDiagramScopedInput);
383
+ }
384
+
385
+ // ── Handler resolution ─────────────────────────────────────────────────────
386
+
387
+ /** Reads `sessionId` from a JSON-shaped tool/resource/prompt input without committing to the full schema. */
388
+ protected extractSessionId(params: unknown): string | undefined {
389
+ return (params as Partial<McpDiagramScopedInput>).sessionId;
390
+ }
391
+
392
+ /** Resolves the per-GLSP-session tool handler for `params.sessionId`, throwing on miss. */
393
+ protected requireDiagramToolHandler(name: string, params: unknown): BaseMcpDiagramToolHandler<McpDiagramScopedInput> {
394
+ const session = this.requireGlspSession(this.extractSessionId(params));
395
+ const registry = session.container.get<McpDiagramToolHandlerRegistry>(McpDiagramToolHandlerRegistry);
396
+ const handler = registry.get(name);
397
+ if (!handler) {
398
+ throw new McpToolError(`No tool handler '${name}' registered for diagram type '${session.diagramType}'.`);
399
+ }
400
+ return handler;
401
+ }
402
+
403
+ /** Resolves the per-GLSP-session resource handler for `sessionId`, throwing on miss. */
404
+ protected requireDiagramResourceHandler(
405
+ name: string,
406
+ sessionId: string | undefined
407
+ ): AbstractMcpDiagramResourceHandler<McpDiagramScopedInput> {
408
+ const session = this.requireGlspSession(sessionId);
409
+ const registry = session.container.get<McpDiagramResourceHandlerRegistry>(McpDiagramResourceHandlerRegistry);
410
+ const handler = registry.get(name);
411
+ if (!handler) {
412
+ throw new McpToolError(`No resource handler '${name}' registered for diagram type '${session.diagramType}'.`);
413
+ }
414
+ return handler;
415
+ }
416
+
417
+ /** Looks up the per-GLSP-session resource handler — returns `undefined` for an unknown id. */
418
+ protected findDiagramResourceHandler(
419
+ name: string,
420
+ sessionId: string
421
+ ): AbstractMcpDiagramResourceHandler<McpDiagramScopedInput> | undefined {
422
+ const session = this.clientSessionManager.getSession(sessionId);
423
+ if (!session) {
424
+ return undefined;
425
+ }
426
+ return session.container.get<McpDiagramResourceHandlerRegistry>(McpDiagramResourceHandlerRegistry).get(name);
427
+ }
428
+
429
+ protected requireDiagramPromptHandler(name: string, args: unknown): AbstractMcpDiagramPromptHandler<McpDiagramScopedInput> {
430
+ const session = this.requireGlspSession(this.extractSessionId(args));
431
+ const registry = session.container.get<McpDiagramPromptHandlerRegistry>(McpDiagramPromptHandlerRegistry);
432
+ const handler = registry.get(name);
433
+ if (!handler) {
434
+ throw new McpToolError(`No prompt handler '${name}' registered for diagram type '${session.diagramType}'.`);
435
+ }
436
+ return handler;
437
+ }
438
+
439
+ protected requireGlspSession(sessionId: string | undefined): { container: Container; diagramType: string } {
440
+ if (!sessionId) {
441
+ throw new McpMissingParamError('sessionId');
442
+ }
443
+ const session = this.clientSessionManager.getSession(sessionId);
444
+ if (!session) {
445
+ throw new McpSessionNotFoundError(sessionId);
446
+ }
447
+ return session;
448
+ }
449
+
450
+ /** Disposes the catalog so a subsequent {@link harvest} call re-reads the diagram modules. */
451
+ reset(): void {
452
+ this.diagramCatalogs = [];
453
+ }
454
+ }
455
+
456
+ /** Read an optional constructor-list multi-binding. Returns `[]` when no module bound the symbol. */
457
+ function getConstructorList<T>(container: Container, identifier: interfaces.ServiceIdentifier<T[]>): T[] {
458
+ return container.isBound(identifier) ? container.get<T[]>(identifier) : [];
459
+ }