@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.
- package/LICENSE +642 -0
- package/README.md +57 -0
- package/lib/index.d.ts +23 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +41 -0
- package/lib/index.js.map +1 -0
- package/lib/prompts/handlers/describe-diagram-mcp-prompt-handler.d.ts +43 -0
- package/lib/prompts/handlers/describe-diagram-mcp-prompt-handler.d.ts.map +1 -0
- package/lib/prompts/handlers/describe-diagram-mcp-prompt-handler.js +96 -0
- package/lib/prompts/handlers/describe-diagram-mcp-prompt-handler.js.map +1 -0
- package/lib/prompts/handlers/suggest-improvements-mcp-prompt-handler.d.ts +43 -0
- package/lib/prompts/handlers/suggest-improvements-mcp-prompt-handler.d.ts.map +1 -0
- package/lib/prompts/handlers/suggest-improvements-mcp-prompt-handler.js +95 -0
- package/lib/prompts/handlers/suggest-improvements-mcp-prompt-handler.js.map +1 -0
- package/lib/prompts/index.d.ts +18 -0
- package/lib/prompts/index.d.ts.map +1 -0
- package/lib/prompts/index.js +34 -0
- package/lib/prompts/index.js.map +1 -0
- package/lib/resources/handlers/diagram-png-mcp-resource-handler.d.ts +81 -0
- package/lib/resources/handlers/diagram-png-mcp-resource-handler.d.ts.map +1 -0
- package/lib/resources/handlers/diagram-png-mcp-resource-handler.js +174 -0
- package/lib/resources/handlers/diagram-png-mcp-resource-handler.js.map +1 -0
- package/lib/resources/handlers/diagram-svg-mcp-resource-handler.d.ts +52 -0
- package/lib/resources/handlers/diagram-svg-mcp-resource-handler.d.ts.map +1 -0
- package/lib/resources/handlers/diagram-svg-mcp-resource-handler.js +96 -0
- package/lib/resources/handlers/diagram-svg-mcp-resource-handler.js.map +1 -0
- package/lib/resources/index.d.ts +20 -0
- package/lib/resources/index.d.ts.map +1 -0
- package/lib/resources/index.js +36 -0
- package/lib/resources/index.js.map +1 -0
- package/lib/resources/services/element-types-provider.d.ts +65 -0
- package/lib/resources/services/element-types-provider.d.ts.map +1 -0
- package/lib/resources/services/element-types-provider.js +81 -0
- package/lib/resources/services/element-types-provider.js.map +1 -0
- package/lib/resources/services/mcp-model-serializer.d.ts +78 -0
- package/lib/resources/services/mcp-model-serializer.d.ts.map +1 -0
- package/lib/resources/services/mcp-model-serializer.js +188 -0
- package/lib/resources/services/mcp-model-serializer.js.map +1 -0
- package/lib/server/glsp-mcp-server.d.ts +82 -0
- package/lib/server/glsp-mcp-server.d.ts.map +1 -0
- package/lib/server/glsp-mcp-server.js +140 -0
- package/lib/server/glsp-mcp-server.js.map +1 -0
- package/lib/server/index.d.ts +37 -0
- package/lib/server/index.d.ts.map +1 -0
- package/lib/server/index.js +57 -0
- package/lib/server/index.js.map +1 -0
- package/lib/server/lru-event-store.d.ts +53 -0
- package/lib/server/lru-event-store.d.ts.map +1 -0
- package/lib/server/lru-event-store.js +100 -0
- package/lib/server/lru-event-store.js.map +1 -0
- package/lib/server/mcp-diagram-handler-dispatcher.d.ts +144 -0
- package/lib/server/mcp-diagram-handler-dispatcher.d.ts.map +1 -0
- package/lib/server/mcp-diagram-handler-dispatcher.js +382 -0
- package/lib/server/mcp-diagram-handler-dispatcher.js.map +1 -0
- package/lib/server/mcp-diagram-module.d.ts +123 -0
- package/lib/server/mcp-diagram-module.d.ts.map +1 -0
- package/lib/server/mcp-diagram-module.js +186 -0
- package/lib/server/mcp-diagram-module.js.map +1 -0
- package/lib/server/mcp-diagram-prompt-handler-registry.d.ts +33 -0
- package/lib/server/mcp-diagram-prompt-handler-registry.d.ts.map +1 -0
- package/lib/server/mcp-diagram-prompt-handler-registry.js +76 -0
- package/lib/server/mcp-diagram-prompt-handler-registry.js.map +1 -0
- package/lib/server/mcp-diagram-resource-handler-registry.d.ts +35 -0
- package/lib/server/mcp-diagram-resource-handler-registry.d.ts.map +1 -0
- package/lib/server/mcp-diagram-resource-handler-registry.js +94 -0
- package/lib/server/mcp-diagram-resource-handler-registry.js.map +1 -0
- package/lib/server/mcp-diagram-tool-handler-registry.d.ts +57 -0
- package/lib/server/mcp-diagram-tool-handler-registry.d.ts.map +1 -0
- package/lib/server/mcp-diagram-tool-handler-registry.js +111 -0
- package/lib/server/mcp-diagram-tool-handler-registry.js.map +1 -0
- package/lib/server/mcp-handler-shared.d.ts +142 -0
- package/lib/server/mcp-handler-shared.d.ts.map +1 -0
- package/lib/server/mcp-handler-shared.js +199 -0
- package/lib/server/mcp-handler-shared.js.map +1 -0
- package/lib/server/mcp-http-transport.d.ts +93 -0
- package/lib/server/mcp-http-transport.d.ts.map +1 -0
- package/lib/server/mcp-http-transport.js +350 -0
- package/lib/server/mcp-http-transport.js.map +1 -0
- package/lib/server/mcp-id-alias-service.d.ts +70 -0
- package/lib/server/mcp-id-alias-service.d.ts.map +1 -0
- package/lib/server/mcp-id-alias-service.js +85 -0
- package/lib/server/mcp-id-alias-service.js.map +1 -0
- package/lib/server/mcp-input-schemas.d.ts +73 -0
- package/lib/server/mcp-input-schemas.d.ts.map +1 -0
- package/lib/server/mcp-input-schemas.js +67 -0
- package/lib/server/mcp-input-schemas.js.map +1 -0
- package/lib/server/mcp-label-provider.d.ts +45 -0
- package/lib/server/mcp-label-provider.d.ts.map +1 -0
- package/lib/server/mcp-label-provider.js +42 -0
- package/lib/server/mcp-label-provider.js.map +1 -0
- package/lib/server/mcp-log-level-registry.d.ts +54 -0
- package/lib/server/mcp-log-level-registry.d.ts.map +1 -0
- package/lib/server/mcp-log-level-registry.js +80 -0
- package/lib/server/mcp-log-level-registry.js.map +1 -0
- package/lib/server/mcp-logger.d.ts +59 -0
- package/lib/server/mcp-logger.d.ts.map +1 -0
- package/lib/server/mcp-logger.js +104 -0
- package/lib/server/mcp-logger.js.map +1 -0
- package/lib/server/mcp-mime-types.d.ts +28 -0
- package/lib/server/mcp-mime-types.d.ts.map +1 -0
- package/lib/server/mcp-mime-types.js +18 -0
- package/lib/server/mcp-mime-types.js.map +1 -0
- package/lib/server/mcp-options.d.ts +39 -0
- package/lib/server/mcp-options.d.ts.map +1 -0
- package/lib/server/mcp-options.js +53 -0
- package/lib/server/mcp-options.js.map +1 -0
- package/lib/server/mcp-progress-reporter.d.ts +48 -0
- package/lib/server/mcp-progress-reporter.d.ts.map +1 -0
- package/lib/server/mcp-progress-reporter.js +66 -0
- package/lib/server/mcp-progress-reporter.js.map +1 -0
- package/lib/server/mcp-prompt-handler.d.ts +120 -0
- package/lib/server/mcp-prompt-handler.d.ts.map +1 -0
- package/lib/server/mcp-prompt-handler.js +131 -0
- package/lib/server/mcp-prompt-handler.js.map +1 -0
- package/lib/server/mcp-request-context.d.ts +37 -0
- package/lib/server/mcp-request-context.d.ts.map +1 -0
- package/lib/server/mcp-request-context.js +37 -0
- package/lib/server/mcp-request-context.js.map +1 -0
- package/lib/server/mcp-resource-handler.d.ts +212 -0
- package/lib/server/mcp-resource-handler.d.ts.map +1 -0
- package/lib/server/mcp-resource-handler.js +298 -0
- package/lib/server/mcp-resource-handler.js.map +1 -0
- package/lib/server/mcp-server-launcher.d.ts +143 -0
- package/lib/server/mcp-server-launcher.d.ts.map +1 -0
- package/lib/server/mcp-server-launcher.js +355 -0
- package/lib/server/mcp-server-launcher.js.map +1 -0
- package/lib/server/mcp-server-module.d.ts +143 -0
- package/lib/server/mcp-server-module.d.ts.map +1 -0
- package/lib/server/mcp-server-module.js +249 -0
- package/lib/server/mcp-server-module.js.map +1 -0
- package/lib/server/mcp-session.d.ts +44 -0
- package/lib/server/mcp-session.d.ts.map +1 -0
- package/lib/server/mcp-session.js +18 -0
- package/lib/server/mcp-session.js.map +1 -0
- package/lib/server/mcp-tool-handler.d.ts +259 -0
- package/lib/server/mcp-tool-handler.d.ts.map +1 -0
- package/lib/server/mcp-tool-handler.js +355 -0
- package/lib/server/mcp-tool-handler.js.map +1 -0
- package/lib/tools/handlers/count-elements-mcp-tool-handler.d.ts +46 -0
- package/lib/tools/handlers/count-elements-mcp-tool-handler.d.ts.map +1 -0
- package/lib/tools/handlers/count-elements-mcp-tool-handler.js +76 -0
- package/lib/tools/handlers/count-elements-mcp-tool-handler.js.map +1 -0
- package/lib/tools/handlers/create-edges-mcp-tool-handler.d.ts +112 -0
- package/lib/tools/handlers/create-edges-mcp-tool-handler.d.ts.map +1 -0
- package/lib/tools/handlers/create-edges-mcp-tool-handler.js +190 -0
- package/lib/tools/handlers/create-edges-mcp-tool-handler.js.map +1 -0
- package/lib/tools/handlers/create-nodes-mcp-tool-handler.d.ts +81 -0
- package/lib/tools/handlers/create-nodes-mcp-tool-handler.d.ts.map +1 -0
- package/lib/tools/handlers/create-nodes-mcp-tool-handler.js +123 -0
- package/lib/tools/handlers/create-nodes-mcp-tool-handler.js.map +1 -0
- package/lib/tools/handlers/delete-elements-mcp-tool-handler.d.ts +52 -0
- package/lib/tools/handlers/delete-elements-mcp-tool-handler.d.ts.map +1 -0
- package/lib/tools/handlers/delete-elements-mcp-tool-handler.js +73 -0
- package/lib/tools/handlers/delete-elements-mcp-tool-handler.js.map +1 -0
- package/lib/tools/handlers/diagram-model-mcp-tool-handler.d.ts +59 -0
- package/lib/tools/handlers/diagram-model-mcp-tool-handler.d.ts.map +1 -0
- package/lib/tools/handlers/diagram-model-mcp-tool-handler.js +78 -0
- package/lib/tools/handlers/diagram-model-mcp-tool-handler.js.map +1 -0
- package/lib/tools/handlers/element-types-mcp-tool-handler.d.ts +97 -0
- package/lib/tools/handlers/element-types-mcp-tool-handler.d.ts.map +1 -0
- package/lib/tools/handlers/element-types-mcp-tool-handler.js +155 -0
- package/lib/tools/handlers/element-types-mcp-tool-handler.js.map +1 -0
- package/lib/tools/handlers/get-selection-mcp-tool-handler.d.ts +43 -0
- package/lib/tools/handlers/get-selection-mcp-tool-handler.d.ts.map +1 -0
- package/lib/tools/handlers/get-selection-mcp-tool-handler.js +68 -0
- package/lib/tools/handlers/get-selection-mcp-tool-handler.js.map +1 -0
- package/lib/tools/handlers/layout-mcp-tool-handler.d.ts +43 -0
- package/lib/tools/handlers/layout-mcp-tool-handler.d.ts.map +1 -0
- package/lib/tools/handlers/layout-mcp-tool-handler.js +71 -0
- package/lib/tools/handlers/layout-mcp-tool-handler.js.map +1 -0
- package/lib/tools/handlers/modify-edges-mcp-tool-handler.d.ts +78 -0
- package/lib/tools/handlers/modify-edges-mcp-tool-handler.d.ts.map +1 -0
- package/lib/tools/handlers/modify-edges-mcp-tool-handler.js +136 -0
- package/lib/tools/handlers/modify-edges-mcp-tool-handler.js.map +1 -0
- package/lib/tools/handlers/modify-nodes-mcp-tool-handler.d.ts +92 -0
- package/lib/tools/handlers/modify-nodes-mcp-tool-handler.d.ts.map +1 -0
- package/lib/tools/handlers/modify-nodes-mcp-tool-handler.js +125 -0
- package/lib/tools/handlers/modify-nodes-mcp-tool-handler.js.map +1 -0
- package/lib/tools/handlers/query-elements-mcp-tool-handler.d.ts +102 -0
- package/lib/tools/handlers/query-elements-mcp-tool-handler.d.ts.map +1 -0
- package/lib/tools/handlers/query-elements-mcp-tool-handler.js +158 -0
- package/lib/tools/handlers/query-elements-mcp-tool-handler.js.map +1 -0
- package/lib/tools/handlers/redo-mcp-tool-handler.d.ts +45 -0
- package/lib/tools/handlers/redo-mcp-tool-handler.d.ts.map +1 -0
- package/lib/tools/handlers/redo-mcp-tool-handler.js +73 -0
- package/lib/tools/handlers/redo-mcp-tool-handler.js.map +1 -0
- package/lib/tools/handlers/save-model-mcp-tool-handler.d.ts +55 -0
- package/lib/tools/handlers/save-model-mcp-tool-handler.d.ts.map +1 -0
- package/lib/tools/handlers/save-model-mcp-tool-handler.js +91 -0
- package/lib/tools/handlers/save-model-mcp-tool-handler.js.map +1 -0
- package/lib/tools/handlers/session-info-mcp-tool-handler.d.ts +65 -0
- package/lib/tools/handlers/session-info-mcp-tool-handler.d.ts.map +1 -0
- package/lib/tools/handlers/session-info-mcp-tool-handler.js +108 -0
- package/lib/tools/handlers/session-info-mcp-tool-handler.js.map +1 -0
- package/lib/tools/handlers/set-selection-mcp-tool-handler.d.ts +60 -0
- package/lib/tools/handlers/set-selection-mcp-tool-handler.d.ts.map +1 -0
- package/lib/tools/handlers/set-selection-mcp-tool-handler.js +103 -0
- package/lib/tools/handlers/set-selection-mcp-tool-handler.js.map +1 -0
- package/lib/tools/handlers/set-view-mcp-tool-handler.d.ts +110 -0
- package/lib/tools/handlers/set-view-mcp-tool-handler.d.ts.map +1 -0
- package/lib/tools/handlers/set-view-mcp-tool-handler.js +142 -0
- package/lib/tools/handlers/set-view-mcp-tool-handler.js.map +1 -0
- package/lib/tools/handlers/undo-mcp-tool-handler.d.ts +45 -0
- package/lib/tools/handlers/undo-mcp-tool-handler.d.ts.map +1 -0
- package/lib/tools/handlers/undo-mcp-tool-handler.js +74 -0
- package/lib/tools/handlers/undo-mcp-tool-handler.js.map +1 -0
- package/lib/tools/handlers/validate-diagram-mcp-tool-handler.d.ts +66 -0
- package/lib/tools/handlers/validate-diagram-mcp-tool-handler.d.ts.map +1 -0
- package/lib/tools/handlers/validate-diagram-mcp-tool-handler.js +0 -0
- package/lib/tools/handlers/validate-diagram-mcp-tool-handler.js.map +1 -0
- package/lib/tools/index.d.ts +34 -0
- package/lib/tools/index.d.ts.map +1 -0
- package/lib/tools/index.js +50 -0
- package/lib/tools/index.js.map +1 -0
- package/lib/util/index.d.ts +18 -0
- package/lib/util/index.d.ts.map +1 -0
- package/lib/util/index.js +34 -0
- package/lib/util/index.js.map +1 -0
- package/lib/util/markdown-util.d.ts +20 -0
- package/lib/util/markdown-util.d.ts.map +1 -0
- package/lib/util/markdown-util.js +45 -0
- package/lib/util/markdown-util.js.map +1 -0
- package/lib/util/mcp-util.d.ts +22 -0
- package/lib/util/mcp-util.d.ts.map +1 -0
- package/lib/util/mcp-util.js +29 -0
- package/lib/util/mcp-util.js.map +1 -0
- package/package.json +63 -0
- package/src/index.ts +24 -0
- package/src/prompts/handlers/describe-diagram-mcp-prompt-handler.ts +89 -0
- package/src/prompts/handlers/suggest-improvements-mcp-prompt-handler.ts +86 -0
- package/src/prompts/index.ts +18 -0
- package/src/resources/handlers/diagram-png-mcp-resource-handler.ts +181 -0
- package/src/resources/handlers/diagram-svg-mcp-resource-handler.ts +89 -0
- package/src/resources/index.ts +20 -0
- package/src/resources/services/element-types-provider.ts +105 -0
- package/src/resources/services/mcp-model-serializer.ts +211 -0
- package/src/server/glsp-mcp-server.spec.ts +73 -0
- package/src/server/glsp-mcp-server.ts +196 -0
- package/src/server/index.ts +42 -0
- package/src/server/lru-event-store.spec.ts +121 -0
- package/src/server/lru-event-store.ts +112 -0
- package/src/server/mcp-diagram-handler-dispatcher.spec.ts +231 -0
- package/src/server/mcp-diagram-handler-dispatcher.ts +459 -0
- package/src/server/mcp-diagram-module.ts +248 -0
- package/src/server/mcp-diagram-prompt-handler-registry.ts +59 -0
- package/src/server/mcp-diagram-resource-handler-registry.ts +73 -0
- package/src/server/mcp-diagram-tool-handler-registry.ts +97 -0
- package/src/server/mcp-handler-shared.spec.ts +53 -0
- package/src/server/mcp-handler-shared.ts +247 -0
- package/src/server/mcp-http-transport-e2e.spec.ts +151 -0
- package/src/server/mcp-http-transport.spec.ts +385 -0
- package/src/server/mcp-http-transport.ts +368 -0
- package/src/server/mcp-id-alias-service.spec.ts +106 -0
- package/src/server/mcp-id-alias-service.ts +104 -0
- package/src/server/mcp-input-schemas.ts +82 -0
- package/src/server/mcp-label-provider.ts +52 -0
- package/src/server/mcp-log-level-registry.spec.ts +75 -0
- package/src/server/mcp-log-level-registry.ts +90 -0
- package/src/server/mcp-logger.spec.ts +227 -0
- package/src/server/mcp-logger.ts +91 -0
- package/src/server/mcp-mime-types.ts +31 -0
- package/src/server/mcp-options.ts +43 -0
- package/src/server/mcp-progress-reporter.spec.ts +93 -0
- package/src/server/mcp-progress-reporter.ts +67 -0
- package/src/server/mcp-prompt-handler.ts +157 -0
- package/src/server/mcp-request-context.ts +39 -0
- package/src/server/mcp-resource-handler.ts +389 -0
- package/src/server/mcp-server-launcher.spec.ts +173 -0
- package/src/server/mcp-server-launcher.ts +369 -0
- package/src/server/mcp-server-module.ts +287 -0
- package/src/server/mcp-session.ts +45 -0
- package/src/server/mcp-tool-handler.spec.ts +182 -0
- package/src/server/mcp-tool-handler.ts +431 -0
- package/src/server/raw-http.spec.ts +59 -0
- package/src/tools/handlers/count-elements-mcp-tool-handler.spec.ts +99 -0
- package/src/tools/handlers/count-elements-mcp-tool-handler.ts +66 -0
- package/src/tools/handlers/create-edges-mcp-tool-handler.spec.ts +196 -0
- package/src/tools/handlers/create-edges-mcp-tool-handler.ts +205 -0
- package/src/tools/handlers/create-nodes-mcp-tool-handler.spec.ts +197 -0
- package/src/tools/handlers/create-nodes-mcp-tool-handler.ts +131 -0
- package/src/tools/handlers/delete-elements-mcp-tool-handler.ts +73 -0
- package/src/tools/handlers/diagram-model-mcp-tool-handler.ts +66 -0
- package/src/tools/handlers/element-types-mcp-tool-handler.ts +151 -0
- package/src/tools/handlers/get-selection-mcp-tool-handler.ts +54 -0
- package/src/tools/handlers/layout-mcp-tool-handler.ts +56 -0
- package/src/tools/handlers/modify-edges-mcp-tool-handler.ts +148 -0
- package/src/tools/handlers/modify-nodes-mcp-tool-handler.ts +140 -0
- package/src/tools/handlers/query-elements-mcp-tool-handler.spec.ts +210 -0
- package/src/tools/handlers/query-elements-mcp-tool-handler.ts +161 -0
- package/src/tools/handlers/redo-mcp-tool-handler.ts +62 -0
- package/src/tools/handlers/save-model-mcp-tool-handler.ts +71 -0
- package/src/tools/handlers/session-info-mcp-tool-handler.spec.ts +152 -0
- package/src/tools/handlers/session-info-mcp-tool-handler.ts +97 -0
- package/src/tools/handlers/set-selection-mcp-tool-handler.spec.ts +118 -0
- package/src/tools/handlers/set-selection-mcp-tool-handler.ts +90 -0
- package/src/tools/handlers/set-view-mcp-tool-handler.ts +162 -0
- package/src/tools/handlers/undo-mcp-tool-handler.ts +61 -0
- package/src/tools/handlers/validate-diagram-mcp-tool-handler.ts +0 -0
- package/src/tools/index.ts +34 -0
- package/src/tools/tool-annotations.spec.ts +141 -0
- package/src/util/index.ts +18 -0
- package/src/util/markdown-util.ts +44 -0
- 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
|
+
}
|