@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,248 @@
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 { applyBindingTarget, BindingTarget, ClientSessionInitializer, GLSPModule, InstanceMultiBinding } from '@eclipse-glsp/server';
18
+ import { interfaces } from 'inversify';
19
+ import { DiagramPngMcpResourceHandler, DiagramSvgMcpResourceHandler } from '../resources';
20
+ import { DefaultElementTypesProvider, ElementTypesProvider } from '../resources/services/element-types-provider';
21
+ import { MarkdownMcpModelSerializer, McpModelSerializer } from '../resources/services/mcp-model-serializer';
22
+ import {
23
+ CountElementsMcpToolHandler,
24
+ CreateEdgesMcpToolHandler,
25
+ CreateNodesMcpToolHandler,
26
+ DeleteElementsMcpToolHandler,
27
+ DiagramModelMcpToolHandler,
28
+ GetSelectionMcpToolHandler,
29
+ LayoutMcpToolHandler,
30
+ ModifyEdgesMcpToolHandler,
31
+ ModifyNodesMcpToolHandler,
32
+ QueryElementsMcpToolHandler,
33
+ RedoMcpToolHandler,
34
+ SaveModelMcpToolHandler,
35
+ SetSelectionMcpToolHandler,
36
+ SetViewMcpToolHandler,
37
+ UndoMcpToolHandler,
38
+ ValidateDiagramMcpToolHandler
39
+ } from '../tools';
40
+ import {
41
+ McpDiagramPromptHandlerFactory,
42
+ McpDiagramPromptHandlerRegistry,
43
+ McpDiagramPromptHandlerRegistryInitializer
44
+ } from './mcp-diagram-prompt-handler-registry';
45
+ import {
46
+ McpDiagramResourceHandlerFactory,
47
+ McpDiagramResourceHandlerRegistry,
48
+ McpDiagramResourceHandlerRegistryInitializer
49
+ } from './mcp-diagram-resource-handler-registry';
50
+ import {
51
+ McpDiagramToolHandlerFactory,
52
+ McpDiagramToolHandlerRegistry,
53
+ McpDiagramToolHandlerRegistryInitializer
54
+ } from './mcp-diagram-tool-handler-registry';
55
+ import { DefaultMcpIdAliasService, McpIdAliasService } from './mcp-id-alias-service';
56
+ import { McpDiagramScopedInput } from './mcp-input-schemas';
57
+ import { DefaultMcpLabelProvider, McpLabelProvider } from './mcp-label-provider';
58
+ import { AbstractMcpDiagramPromptHandler, McpDiagramPromptHandlerConstructor } from './mcp-prompt-handler';
59
+ import { AbstractMcpDiagramResourceHandler, McpDiagramResourceHandlerConstructor } from './mcp-resource-handler';
60
+ import { BaseMcpDiagramToolHandler, McpDiagramToolHandlerConstructor } from './mcp-tool-handler';
61
+
62
+ /**
63
+ * Per-GLSP-client-session DI module for the MCP server. Loaded inside `configureDiagramModule`
64
+ * so each `ClientSession.container` gets its own instance of session-scoped services.
65
+ *
66
+ * Binds the {@link McpIdAliasService}, the {@link McpModelSerializer}, the
67
+ * {@link ElementTypesProvider}, and the diagram-scope handler-constructor multi-bindings
68
+ * (`McpDiagram*HandlerConstructor`). Adopters subclass and override the `bind*` hooks to swap
69
+ * single-instance services and the `configure*` hooks to extend the multi-binding handler sets.
70
+ *
71
+ * @example
72
+ * ```ts
73
+ * class WorkflowMcpDiagramModule extends DefaultMcpDiagramModule {
74
+ * // Single-instance binding: return the class.
75
+ * protected override bindModelSerializer(): BindingTarget<McpModelSerializer> {
76
+ * return WorkflowMcpModelSerializer;
77
+ * }
78
+ * // Multi-binding: extend or rebind the default set.
79
+ * protected override configureToolHandlers(binding) {
80
+ * super.configureToolHandlers(binding);
81
+ * binding.add(WorkflowExtraTool);
82
+ * binding.rebind(CreateNodesMcpToolHandler, WorkflowCreateNodesMcpToolHandler);
83
+ * }
84
+ * }
85
+ * new WorkflowServerModule().configureDiagramModule(
86
+ * new WorkflowDiagramModule(...),
87
+ * elkLayoutModule,
88
+ * new WorkflowMcpDiagramModule()
89
+ * );
90
+ * ```
91
+ */
92
+ export abstract class AbstractMcpDiagramModule extends GLSPModule {
93
+ protected bind!: interfaces.Bind;
94
+ protected rebind!: interfaces.Rebind;
95
+
96
+ protected override configure(
97
+ bind: interfaces.Bind,
98
+ _unbind: interfaces.Unbind,
99
+ isBound: interfaces.IsBound,
100
+ rebind: interfaces.Rebind
101
+ ): void {
102
+ this.bind = bind;
103
+ this.rebind = rebind;
104
+ const context = { bind, isBound };
105
+ applyBindingTarget(context, McpIdAliasService, this.bindIdAliasService()).inSingletonScope();
106
+ applyBindingTarget(context, McpLabelProvider, this.bindLabelProvider()).inSingletonScope();
107
+ applyBindingTarget(context, McpModelSerializer, this.bindModelSerializer()).inSingletonScope();
108
+ applyBindingTarget(context, ElementTypesProvider, this.bindElementTypesProvider()).inSingletonScope();
109
+ this.configureMultiBinding(new InstanceMultiBinding<McpDiagramToolHandlerConstructor>(McpDiagramToolHandlerConstructor), binding =>
110
+ this.configureToolHandlers(binding as InstanceMultiBinding<McpDiagramToolHandlerConstructor>)
111
+ );
112
+ this.configureMultiBinding(
113
+ new InstanceMultiBinding<McpDiagramResourceHandlerConstructor>(McpDiagramResourceHandlerConstructor),
114
+ binding => this.configureResourceHandlers(binding as InstanceMultiBinding<McpDiagramResourceHandlerConstructor>)
115
+ );
116
+ this.configureMultiBinding(
117
+ new InstanceMultiBinding<McpDiagramPromptHandlerConstructor>(McpDiagramPromptHandlerConstructor),
118
+ binding => this.configurePromptHandlers(binding as InstanceMultiBinding<McpDiagramPromptHandlerConstructor>)
119
+ );
120
+ this.configureHandlerRegistries();
121
+ }
122
+
123
+ /**
124
+ * Bind the per-GLSP-session handler registries, factories, and {@link ClientSessionInitializer}s
125
+ * that populate the registries at session-open. Adopters typically don't override.
126
+ *
127
+ * Each kind (tool / resource / prompt) follows the same shape:
128
+ * - `Registry` — singleton-per-session, holds instantiated handlers keyed by `name`.
129
+ * - `Factory` — `dynamicValue` that calls `ctx.container.resolve(constructor)`, so the
130
+ * handler's `@inject(...)` fields resolve against the live `ClientSession.container`.
131
+ * - `RegistryInitializer` — at session-open, reads the constructor multi-binding (added by
132
+ * adopter `configure*Handlers` overrides) and instantiates each via the factory.
133
+ * Picked up by Inversify alongside core's own `ClientSessionInitializer`s
134
+ * (`OperationHandlerRegistryInitializer` etc.).
135
+ */
136
+ protected configureHandlerRegistries(): void {
137
+ this.bind(McpDiagramToolHandlerRegistry).toSelf().inSingletonScope();
138
+ this.bind<McpDiagramToolHandlerFactory>(McpDiagramToolHandlerFactory).toDynamicValue(
139
+ ctx => (constructor: McpDiagramToolHandlerConstructor) =>
140
+ ctx.container.resolve<BaseMcpDiagramToolHandler<McpDiagramScopedInput>>(constructor)
141
+ );
142
+ this.bind(McpDiagramToolHandlerRegistryInitializer).toSelf().inSingletonScope();
143
+ this.bind(ClientSessionInitializer).toService(McpDiagramToolHandlerRegistryInitializer);
144
+
145
+ this.bind(McpDiagramResourceHandlerRegistry).toSelf().inSingletonScope();
146
+ this.bind<McpDiagramResourceHandlerFactory>(McpDiagramResourceHandlerFactory).toDynamicValue(
147
+ ctx => (constructor: McpDiagramResourceHandlerConstructor) =>
148
+ ctx.container.resolve<AbstractMcpDiagramResourceHandler<McpDiagramScopedInput>>(constructor)
149
+ );
150
+ this.bind(McpDiagramResourceHandlerRegistryInitializer).toSelf().inSingletonScope();
151
+ this.bind(ClientSessionInitializer).toService(McpDiagramResourceHandlerRegistryInitializer);
152
+
153
+ this.bind(McpDiagramPromptHandlerRegistry).toSelf().inSingletonScope();
154
+ this.bind<McpDiagramPromptHandlerFactory>(McpDiagramPromptHandlerFactory).toDynamicValue(
155
+ ctx => (constructor: McpDiagramPromptHandlerConstructor) =>
156
+ ctx.container.resolve<AbstractMcpDiagramPromptHandler<McpDiagramScopedInput>>(constructor)
157
+ );
158
+ this.bind(McpDiagramPromptHandlerRegistryInitializer).toSelf().inSingletonScope();
159
+ this.bind(ClientSessionInitializer).toService(McpDiagramPromptHandlerRegistryInitializer);
160
+ }
161
+
162
+ /**
163
+ * {@link McpIdAliasService} binding. Override to swap in a custom alias strategy. Bind the
164
+ * shipped `NullMcpIdAliasService` (passthrough) to expose raw GLSP ids on the wire — useful
165
+ * for diagnostic readability or when token cost isn't a concern.
166
+ */
167
+ protected bindIdAliasService(): BindingTarget<McpIdAliasService> {
168
+ return DefaultMcpIdAliasService;
169
+ }
170
+
171
+ /**
172
+ * {@link McpLabelProvider} binding. Override to teach MCP about adopter-specific label
173
+ * locations (e.g., labels nested in header components or compartments). One override here
174
+ * covers every read-side echo and every write-side label-edit operation.
175
+ */
176
+ protected bindLabelProvider(): BindingTarget<McpLabelProvider> {
177
+ return DefaultMcpLabelProvider;
178
+ }
179
+
180
+ /**
181
+ * {@link McpModelSerializer} binding. Override to swap in a diagram-type-specific serializer
182
+ * (e.g. one that emits JSON, or knows the adopter's element schema). Per-session scope means
183
+ * each diagram type provides its own serializer without a server-level rebind.
184
+ */
185
+ protected bindModelSerializer(): BindingTarget<McpModelSerializer> {
186
+ return MarkdownMcpModelSerializer;
187
+ }
188
+
189
+ /**
190
+ * {@link ElementTypesProvider} binding. Override to ship a constant-value list of creatable
191
+ * element types for the adopter's diagram type instead of the default impl that scrapes
192
+ * {@link OperationHandlerRegistry} (noisy for non-trivial diagrams).
193
+ */
194
+ protected bindElementTypesProvider(): BindingTarget<ElementTypesProvider> {
195
+ return DefaultElementTypesProvider;
196
+ }
197
+
198
+ /**
199
+ * Override to add or replace diagram-scope tool handlers. Adopters typically
200
+ * `super.configureToolHandlers(binding)` to keep the defaults, then `binding.add(MyTool)`
201
+ * for additions or `binding.rebind(StandardTool, MyTool)` for overrides.
202
+ */
203
+ protected configureToolHandlers(binding: InstanceMultiBinding<McpDiagramToolHandlerConstructor>): void {
204
+ binding.add(CreateNodesMcpToolHandler);
205
+ binding.add(CreateEdgesMcpToolHandler);
206
+ binding.add(DeleteElementsMcpToolHandler);
207
+ binding.add(SaveModelMcpToolHandler);
208
+ binding.add(ValidateDiagramMcpToolHandler);
209
+ binding.add(DiagramModelMcpToolHandler);
210
+ binding.add(QueryElementsMcpToolHandler);
211
+ binding.add(CountElementsMcpToolHandler);
212
+ binding.add(ModifyNodesMcpToolHandler);
213
+ binding.add(ModifyEdgesMcpToolHandler);
214
+ binding.add(UndoMcpToolHandler);
215
+ binding.add(RedoMcpToolHandler);
216
+ binding.add(GetSelectionMcpToolHandler);
217
+ binding.add(SetSelectionMcpToolHandler);
218
+ binding.add(SetViewMcpToolHandler);
219
+ // Auto-skips at session-open via `canRegister()` when no `LayoutEngine` is bound.
220
+ binding.add(LayoutMcpToolHandler);
221
+ }
222
+
223
+ /** See {@link configureToolHandlers}. */
224
+ protected configureResourceHandlers(binding: InstanceMultiBinding<McpDiagramResourceHandlerConstructor>): void {
225
+ binding.add(DiagramPngMcpResourceHandler);
226
+ binding.add(DiagramSvgMcpResourceHandler);
227
+ }
228
+
229
+ /**
230
+ * See {@link configureToolHandlers}. No diagram-scope prompts ship by default — the shipped
231
+ * `describe-diagram` and `suggest-improvements` prompts are diagram-type-agnostic and bound
232
+ * server-scope. Adopters add their own diagram-type-specific prompts here.
233
+ */
234
+ protected configurePromptHandlers(_binding: InstanceMultiBinding<McpDiagramPromptHandlerConstructor>): void {
235
+ // empty by default
236
+ }
237
+ }
238
+
239
+ /**
240
+ * Default {@link AbstractMcpDiagramModule} entry point. Adopters who don't need overrides
241
+ * use it directly: `new DefaultMcpDiagramModule()`. Adopters with customizations subclass
242
+ * `AbstractMcpDiagramModule` (or this class) and override the `bind*` / `configure*` hooks.
243
+ *
244
+ * @experimental The MCP integration is under active development. Option names, schema shapes,
245
+ * and handler contracts MAY change in minor releases until the feature graduates from
246
+ * experimental status.
247
+ */
248
+ export class DefaultMcpDiagramModule extends AbstractMcpDiagramModule {}
@@ -0,0 +1,59 @@
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 { Args, ClientSessionInitializer, Registry } from '@eclipse-glsp/server';
18
+ import { inject, injectable, optional } from 'inversify';
19
+ import { McpDiagramScopedInput } from './mcp-input-schemas';
20
+ import { AbstractMcpDiagramPromptHandler, McpDiagramPromptHandlerConstructor } from './mcp-prompt-handler';
21
+
22
+ /** See {@link McpDiagramToolHandlerFactory} — same lifecycle pattern, applied to prompt handlers. */
23
+ export type McpDiagramPromptHandlerFactory = (
24
+ constructor: McpDiagramPromptHandlerConstructor
25
+ ) => AbstractMcpDiagramPromptHandler<McpDiagramScopedInput>;
26
+ export const McpDiagramPromptHandlerFactory = Symbol('McpDiagramPromptHandlerFactory');
27
+
28
+ /** See {@link McpDiagramToolHandlerRegistry} — same lifecycle pattern, applied to prompt handlers. */
29
+ @injectable()
30
+ export class McpDiagramPromptHandlerRegistry extends Registry<string, AbstractMcpDiagramPromptHandler<McpDiagramScopedInput>> {
31
+ registerHandler(handler: AbstractMcpDiagramPromptHandler<McpDiagramScopedInput>): boolean {
32
+ return this.register(handler.name, handler);
33
+ }
34
+ }
35
+
36
+ /** See {@link McpDiagramToolHandlerRegistryInitializer} — same lifecycle pattern, applied to prompt handlers. */
37
+ @injectable()
38
+ export class McpDiagramPromptHandlerRegistryInitializer implements ClientSessionInitializer {
39
+ @inject(McpDiagramPromptHandlerFactory) protected factory: McpDiagramPromptHandlerFactory;
40
+
41
+ @inject(McpDiagramPromptHandlerConstructor)
42
+ @optional()
43
+ protected constructors: McpDiagramPromptHandlerConstructor[] = [];
44
+
45
+ @inject(McpDiagramPromptHandlerRegistry) protected registry: McpDiagramPromptHandlerRegistry;
46
+
47
+ initialize(_args?: Args): void {
48
+ for (const constructor of this.constructors) {
49
+ try {
50
+ this.registry.registerHandler(this.factory(constructor));
51
+ } catch (err: unknown) {
52
+ throw new Error(
53
+ `Failed to instantiate MCP diagram prompt handler '${constructor.name}': ${(err as Error).message}. ` +
54
+ 'Check your DiagramModule bindings.'
55
+ );
56
+ }
57
+ }
58
+ }
59
+ }
@@ -0,0 +1,73 @@
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 { Args, ClientId, ClientSessionInitializer, Logger, Registry, TEMPORARY_CLIENT_ID } from '@eclipse-glsp/server';
18
+ import { inject, injectable, optional } from 'inversify';
19
+ import { McpDiagramScopedInput } from './mcp-input-schemas';
20
+ import { AbstractMcpDiagramResourceHandler, McpDiagramResourceHandlerConstructor } from './mcp-resource-handler';
21
+
22
+ /** See {@link McpDiagramToolHandlerFactory} — same lifecycle pattern, applied to resource handlers. */
23
+ export type McpDiagramResourceHandlerFactory = (
24
+ constructor: McpDiagramResourceHandlerConstructor
25
+ ) => AbstractMcpDiagramResourceHandler<McpDiagramScopedInput>;
26
+ export const McpDiagramResourceHandlerFactory = Symbol('McpDiagramResourceHandlerFactory');
27
+
28
+ /** See {@link McpDiagramToolHandlerRegistry} — same lifecycle pattern, applied to resource handlers. */
29
+ @injectable()
30
+ export class McpDiagramResourceHandlerRegistry extends Registry<string, AbstractMcpDiagramResourceHandler<McpDiagramScopedInput>> {
31
+ registerHandler(handler: AbstractMcpDiagramResourceHandler<McpDiagramScopedInput>): boolean {
32
+ return this.register(handler.name, handler);
33
+ }
34
+ }
35
+
36
+ /** See {@link McpDiagramToolHandlerRegistryInitializer} — same lifecycle pattern, applied to resource handlers. */
37
+ @injectable()
38
+ export class McpDiagramResourceHandlerRegistryInitializer implements ClientSessionInitializer {
39
+ @inject(McpDiagramResourceHandlerFactory) protected factory: McpDiagramResourceHandlerFactory;
40
+
41
+ @inject(McpDiagramResourceHandlerConstructor)
42
+ @optional()
43
+ protected constructors: McpDiagramResourceHandlerConstructor[] = [];
44
+
45
+ @inject(McpDiagramResourceHandlerRegistry) protected registry: McpDiagramResourceHandlerRegistry;
46
+
47
+ @inject(ClientId) protected clientId: string;
48
+
49
+ @inject(Logger) protected logger: Logger;
50
+
51
+ initialize(_args?: Args): void {
52
+ // See {@link McpDiagramToolHandlerRegistryInitializer.initialize} for the probe rationale.
53
+ const isProbe = this.clientId === TEMPORARY_CLIENT_ID;
54
+ for (const constructor of this.constructors) {
55
+ let handler: AbstractMcpDiagramResourceHandler<McpDiagramScopedInput>;
56
+ try {
57
+ handler = this.factory(constructor);
58
+ } catch (err: unknown) {
59
+ throw new Error(
60
+ `Failed to instantiate MCP diagram resource handler '${constructor.name}': ${(err as Error).message}. ` +
61
+ 'Check your DiagramModule bindings.'
62
+ );
63
+ }
64
+ if (!handler.canRegister()) {
65
+ if (!isProbe) {
66
+ this.logger.warn(`Skipping MCP diagram resource handler '${handler.name}': canRegister() returned false.`);
67
+ }
68
+ continue;
69
+ }
70
+ this.registry.registerHandler(handler);
71
+ }
72
+ }
73
+ }
@@ -0,0 +1,97 @@
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 { Args, ClientId, ClientSessionInitializer, Logger, Registry, TEMPORARY_CLIENT_ID } from '@eclipse-glsp/server';
18
+ import { inject, injectable, optional } from 'inversify';
19
+ import { McpDiagramScopedInput } from './mcp-input-schemas';
20
+ import { BaseMcpDiagramToolHandler, McpDiagramToolHandlerConstructor } from './mcp-tool-handler';
21
+
22
+ /**
23
+ * Per-GLSP-session factory that resolves a {@link McpDiagramToolHandlerConstructor} against the
24
+ * per-session Inversify container. Calls `container.resolve(ctor)` so `@inject(...)` fields on
25
+ * the handler are filled from the live `ClientSession.container` (alias service, model state,
26
+ * action dispatcher, etc.).
27
+ *
28
+ * Mirrors core's {@link OperationHandlerFactory} pattern in `DiagramModule`.
29
+ */
30
+ export type McpDiagramToolHandlerFactory = (
31
+ constructor: McpDiagramToolHandlerConstructor
32
+ ) => BaseMcpDiagramToolHandler<McpDiagramScopedInput>;
33
+ export const McpDiagramToolHandlerFactory = Symbol('McpDiagramToolHandlerFactory');
34
+
35
+ /**
36
+ * Per-GLSP-session registry holding one {@link BaseMcpDiagramToolHandler} instance per
37
+ * `metadata.name`. Populated at GLSP-session-open by {@link McpDiagramToolHandlerRegistryInitializer},
38
+ * read at MCP-tool-call time by the launcher's dispatcher (looks up the right session, gets its
39
+ * registry, resolves the handler by name, invokes `createResult`).
40
+ *
41
+ * Bound singleton-per-session on the diagram container.
42
+ */
43
+ @injectable()
44
+ export class McpDiagramToolHandlerRegistry extends Registry<string, BaseMcpDiagramToolHandler<McpDiagramScopedInput>> {
45
+ /** Convenience that derives the key from `handler.name` so callers don't repeat themselves. */
46
+ registerHandler(handler: BaseMcpDiagramToolHandler<McpDiagramScopedInput>): boolean {
47
+ return this.register(handler.name, handler);
48
+ }
49
+ }
50
+
51
+ /**
52
+ * {@link ClientSessionInitializer} that runs at GLSP-session-open. Reads the per-session
53
+ * constructor multi-binding ({@link McpDiagramToolHandlerConstructor}) and instantiates each
54
+ * handler via the {@link McpDiagramToolHandlerFactory}, registering the instance with the
55
+ * per-session {@link McpDiagramToolHandlerRegistry}.
56
+ *
57
+ * Same shape as core's `OperationHandlerRegistryInitializer`.
58
+ */
59
+ @injectable()
60
+ export class McpDiagramToolHandlerRegistryInitializer implements ClientSessionInitializer {
61
+ @inject(McpDiagramToolHandlerFactory) protected factory: McpDiagramToolHandlerFactory;
62
+
63
+ @inject(McpDiagramToolHandlerConstructor)
64
+ @optional()
65
+ protected constructors: McpDiagramToolHandlerConstructor[] = [];
66
+
67
+ @inject(McpDiagramToolHandlerRegistry) protected registry: McpDiagramToolHandlerRegistry;
68
+
69
+ @inject(ClientId) protected clientId: string;
70
+
71
+ @inject(Logger) protected logger: Logger;
72
+
73
+ initialize(_args?: Args): void {
74
+ // Suppress the canRegister-false warn during core's `DefaultGlobalActionProvider`
75
+ // startup probe — that probe runs on a throwaway container with empty action-kind set,
76
+ // so `canRegister()` returning false there is structural, not a real opt-out.
77
+ const isProbe = this.clientId === TEMPORARY_CLIENT_ID;
78
+ for (const constructor of this.constructors) {
79
+ let handler: BaseMcpDiagramToolHandler<McpDiagramScopedInput>;
80
+ try {
81
+ handler = this.factory(constructor);
82
+ } catch (err: unknown) {
83
+ throw new Error(
84
+ `Failed to instantiate MCP diagram tool handler '${constructor.name}': ${(err as Error).message}. ` +
85
+ 'Check your DiagramModule bindings.'
86
+ );
87
+ }
88
+ if (!handler.canRegister()) {
89
+ if (!isProbe) {
90
+ this.logger.warn(`Skipping MCP diagram tool handler '${handler.name}': canRegister() returned false.`);
91
+ }
92
+ continue;
93
+ }
94
+ this.registry.registerHandler(handler);
95
+ }
96
+ }
97
+ }
@@ -0,0 +1,53 @@
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 { ClientSessionManager } from '@eclipse-glsp/server';
18
+ import { expect } from 'chai';
19
+ import { McpToolError, resolveActiveSessionId } from './mcp-handler-shared';
20
+
21
+ function stubSessionManager(sessionIds: string[]): ClientSessionManager {
22
+ return { getSessions: () => sessionIds.map(id => ({ id })) } as unknown as ClientSessionManager;
23
+ }
24
+
25
+ describe('resolveActiveSessionId', () => {
26
+ it('returns the explicit session id when it matches an open session', () => {
27
+ const result = resolveActiveSessionId(stubSessionManager(['alpha', 'beta']), 'alpha');
28
+ expect(result).to.equal('alpha');
29
+ });
30
+
31
+ it('defaults to the only open session when sessionId is omitted', () => {
32
+ const result = resolveActiveSessionId(stubSessionManager(['solo']), undefined);
33
+ expect(result).to.equal('solo');
34
+ });
35
+
36
+ it('throws McpToolError listing the open sessions when ambiguous', () => {
37
+ expect(() => resolveActiveSessionId(stubSessionManager(['session-a', 'session-b']), undefined)).to.throw(
38
+ McpToolError,
39
+ /Multiple sessions open.*session-a.*session-b/
40
+ );
41
+ });
42
+
43
+ it('throws McpToolError when no sessions are open', () => {
44
+ expect(() => resolveActiveSessionId(stubSessionManager([]), undefined)).to.throw(McpToolError, /No open diagram sessions/);
45
+ });
46
+
47
+ it('throws McpToolError when an explicit sessionId does not match any open session', () => {
48
+ expect(() => resolveActiveSessionId(stubSessionManager(['real-session']), 'ghost')).to.throw(
49
+ McpToolError,
50
+ /Unknown sessionId: ghost/
51
+ );
52
+ });
53
+ });