@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,89 @@
|
|
|
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 { ClientActionKinds, RequestExportAction } from '@eclipse-glsp/server';
|
|
18
|
+
import { Role } from '@modelcontextprotocol/sdk/types.js';
|
|
19
|
+
import { inject, injectable } from 'inversify';
|
|
20
|
+
import * as z from 'zod/v4';
|
|
21
|
+
import {
|
|
22
|
+
AbstractMcpDiagramResourceHandler,
|
|
23
|
+
McpDiagramScopedInputSchema,
|
|
24
|
+
McpMimeType,
|
|
25
|
+
McpProgressReporter,
|
|
26
|
+
McpResourceContent,
|
|
27
|
+
McpResourceUri,
|
|
28
|
+
McpToolError
|
|
29
|
+
} from '../../server';
|
|
30
|
+
|
|
31
|
+
export const DiagramSvgInputSchema = McpDiagramScopedInputSchema.extend({
|
|
32
|
+
timeoutMs: z
|
|
33
|
+
.number()
|
|
34
|
+
.int()
|
|
35
|
+
.min(100)
|
|
36
|
+
.max(60000)
|
|
37
|
+
.optional()
|
|
38
|
+
.describe('Override the default render timeout in milliseconds (100–60000). Useful for very large diagrams.')
|
|
39
|
+
});
|
|
40
|
+
export type DiagramSvgInput = z.infer<typeof DiagramSvgInputSchema>;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Vector counterpart of {@link DiagramPngMcpResourceHandler}. Emits the diagram as raw SVG
|
|
44
|
+
* markup (text-encoded). No `width`/`height` knobs because SVG is vector — clients (and
|
|
45
|
+
* downstream rasterisers) scale it freely.
|
|
46
|
+
*/
|
|
47
|
+
@injectable()
|
|
48
|
+
export class DiagramSvgMcpResourceHandler extends AbstractMcpDiagramResourceHandler<DiagramSvgInput> {
|
|
49
|
+
/** Default timeout (in ms) used when the call doesn't override `timeoutMs`. Override via subclass + rebind. */
|
|
50
|
+
protected readonly defaultTimeoutMs: number = 5000;
|
|
51
|
+
|
|
52
|
+
static readonly NAME = 'diagram-svg';
|
|
53
|
+
readonly name = DiagramSvgMcpResourceHandler.NAME;
|
|
54
|
+
override readonly title = 'Diagram Model SVG';
|
|
55
|
+
readonly description =
|
|
56
|
+
'Render the session diagram as SVG markup of its current visible state. ' +
|
|
57
|
+
'Vector format — scales without quality loss, ideal for embedding in documentation, ' +
|
|
58
|
+
'further programmatic processing, or post-export rasterisation at arbitrary resolutions. ' +
|
|
59
|
+
'Requires a connected frontend client to perform the render and is subject to a timeout if no response arrives. ' +
|
|
60
|
+
'Use `diagram-png` instead when you need a ready-to-display raster image; ' +
|
|
61
|
+
'`diagram-model` is the structured-text alternative for content-only reasoning.';
|
|
62
|
+
readonly mimeType: McpMimeType = 'image/svg+xml';
|
|
63
|
+
readonly uri: McpResourceUri = { template: 'glsp://diagrams/{sessionId}/svg' };
|
|
64
|
+
/** Both the user (visual artifact) and the assistant (visual reasoning) consume the rendered diagram. */
|
|
65
|
+
override readonly audience: Role[] = ['user', 'assistant'];
|
|
66
|
+
/** Useful when relevant, but not always-relevant — clients may skip when text-only reasoning suffices. */
|
|
67
|
+
override readonly priority = 0.6;
|
|
68
|
+
override readonly toolAlternativeInputSchema = DiagramSvgInputSchema;
|
|
69
|
+
|
|
70
|
+
@inject(McpProgressReporter) protected progress: McpProgressReporter;
|
|
71
|
+
|
|
72
|
+
@inject(ClientActionKinds) protected clientActionKinds: Set<string>;
|
|
73
|
+
|
|
74
|
+
/** Skip-bind when the GLSP client doesn't speak `RequestExportAction`. */
|
|
75
|
+
override canRegister(): boolean {
|
|
76
|
+
return this.clientActionKinds.has(RequestExportAction.KIND);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
protected async createResult({ timeoutMs }: DiagramSvgInput): Promise<McpResourceContent> {
|
|
80
|
+
// Best-effort beat for clients that opted in via `_meta.progressToken`; no-ops otherwise.
|
|
81
|
+
await this.progress.emit({ progress: 0, message: 'Awaiting client-side SVG render…' });
|
|
82
|
+
const response = await this.requestAction(RequestExportAction.create('svg'), timeoutMs ?? this.defaultTimeoutMs);
|
|
83
|
+
// SVG is text-encoded — base64 encoding here would mean an exporter mis-classified its payload.
|
|
84
|
+
if (response.encoding !== 'text') {
|
|
85
|
+
throw new McpToolError(`SVG export returned unexpected encoding '${response.encoding}'; expected 'text'.`);
|
|
86
|
+
}
|
|
87
|
+
return { text: response.data };
|
|
88
|
+
}
|
|
89
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
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
|
+
export * from './handlers/diagram-png-mcp-resource-handler';
|
|
18
|
+
export * from './handlers/diagram-svg-mcp-resource-handler';
|
|
19
|
+
export * from './services/element-types-provider';
|
|
20
|
+
export * from './services/mcp-model-serializer';
|
|
@@ -0,0 +1,105 @@
|
|
|
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 { CreateEdgeOperation, CreateNodeOperation } from '@eclipse-glsp/protocol';
|
|
18
|
+
import {
|
|
19
|
+
CreateEdgeOperationHandler,
|
|
20
|
+
CreateNodeOperationHandler,
|
|
21
|
+
CreateOperationHandler,
|
|
22
|
+
Logger,
|
|
23
|
+
OperationHandlerRegistry
|
|
24
|
+
} from '@eclipse-glsp/server';
|
|
25
|
+
import { inject, injectable } from 'inversify';
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* A discoverable creatable element type emitted by the `element-types` tool handler. Adopters
|
|
29
|
+
* may add further passthrough fields beyond these — the tool handler's structured output schema
|
|
30
|
+
* is `loose()`.
|
|
31
|
+
*
|
|
32
|
+
* @experimental
|
|
33
|
+
*/
|
|
34
|
+
export interface ElementTypeEntry {
|
|
35
|
+
id: string;
|
|
36
|
+
/** Human-readable display name for the element TYPE (e.g. `Manual Task`). */
|
|
37
|
+
label: string;
|
|
38
|
+
/** Adopter-supplied human-readable description; absent on the default scrape impl. */
|
|
39
|
+
description?: string;
|
|
40
|
+
/** Whether create-* / modify-* tools should pass a `text` arg for this type. Absent ⇒ unknown. */
|
|
41
|
+
acceptsText?: boolean;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** Node + edge types creatable in a given diagram type. */
|
|
45
|
+
export interface ElementTypes {
|
|
46
|
+
nodeTypes: ElementTypeEntry[];
|
|
47
|
+
edgeTypes: ElementTypeEntry[];
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Per-diagram-type provider of creatable element types. Bound on the diagram (per-GLSP-session)
|
|
52
|
+
* container so each diagram type can supply its own list. Adopters with explicit type info
|
|
53
|
+
* typically rebind to a constant-value provider; the default scrapes
|
|
54
|
+
* {@link OperationHandlerRegistry} for backwards compatibility with adopters that haven't
|
|
55
|
+
* declared their types yet.
|
|
56
|
+
*
|
|
57
|
+
* @experimental
|
|
58
|
+
*/
|
|
59
|
+
export interface ElementTypesProvider {
|
|
60
|
+
get(): ElementTypes;
|
|
61
|
+
}
|
|
62
|
+
export const ElementTypesProvider = Symbol('ElementTypesProvider');
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Default {@link ElementTypesProvider} that scrapes the per-session {@link OperationHandlerRegistry}
|
|
66
|
+
* for {@link CreateNodeOperationHandler} / {@link CreateEdgeOperationHandler} instances and reads
|
|
67
|
+
* their `elementTypeIds`.
|
|
68
|
+
*/
|
|
69
|
+
@injectable()
|
|
70
|
+
export class DefaultElementTypesProvider implements ElementTypesProvider {
|
|
71
|
+
@inject(OperationHandlerRegistry) protected operationHandlerRegistry: OperationHandlerRegistry;
|
|
72
|
+
|
|
73
|
+
@inject(Logger) protected logger: Logger;
|
|
74
|
+
|
|
75
|
+
/** Already-warned operation types, deduped so the warn fires once per type. */
|
|
76
|
+
protected readonly warnedTypes = new Set<string>();
|
|
77
|
+
|
|
78
|
+
get(): ElementTypes {
|
|
79
|
+
const nodeTypes: ElementTypeEntry[] = [];
|
|
80
|
+
const edgeTypes: ElementTypeEntry[] = [];
|
|
81
|
+
for (const handler of this.operationHandlerRegistry.getAll()) {
|
|
82
|
+
if (CreateNodeOperationHandler.is(handler)) {
|
|
83
|
+
handler.elementTypeIds.forEach(id => nodeTypes.push({ id, label: handler.label }));
|
|
84
|
+
} else if (CreateEdgeOperationHandler.is(handler)) {
|
|
85
|
+
handler.elementTypeIds.forEach(id => edgeTypes.push({ id, label: handler.label }));
|
|
86
|
+
} else if (CreateOperationHandler.is(handler)) {
|
|
87
|
+
this.warnUnrecognizedOperationType(handler);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return { nodeTypes, edgeTypes };
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** Once-per-type warn when a `CreateOperationHandler` carries an unrecognized `operationType`. */
|
|
94
|
+
protected warnUnrecognizedOperationType(handler: CreateOperationHandler): void {
|
|
95
|
+
const operationType = handler.operationType;
|
|
96
|
+
if (this.warnedTypes.has(operationType)) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
this.warnedTypes.add(operationType);
|
|
100
|
+
this.logger.warn(
|
|
101
|
+
`DefaultElementTypesProvider: ignoring CreateOperationHandler with operationType '${operationType}' — ` +
|
|
102
|
+
`expected '${CreateNodeOperation.KIND}' or '${CreateEdgeOperation.KIND}'. Rebind ElementTypesProvider for custom operation types.`
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
@@ -0,0 +1,211 @@
|
|
|
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 { GModelElement } from '@eclipse-glsp/graph';
|
|
18
|
+
import { Dimension, GModelSerializer, Logger, Point } from '@eclipse-glsp/server';
|
|
19
|
+
import { inject, injectable, postConstruct } from 'inversify';
|
|
20
|
+
import { McpStructuredContent } from '../../server/mcp-handler-shared';
|
|
21
|
+
import { McpIdAliasService } from '../../server/mcp-id-alias-service';
|
|
22
|
+
import { objectArrayToMarkdownTable } from '../../util';
|
|
23
|
+
|
|
24
|
+
export const McpModelSerializer = Symbol('McpModelSerializer');
|
|
25
|
+
|
|
26
|
+
/** Loose JSON-object shape mirroring `GModelSerializer.createSchema` output — open-keyed because
|
|
27
|
+
* GModel attributes vary per element type. Reads must narrow before use. */
|
|
28
|
+
export interface SerializedElement {
|
|
29
|
+
[key: string]: unknown;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Transforms a graphical model into a representation suitable for LLM consumption. Markdown and
|
|
34
|
+
* JSON are both reasonable formats; the default impl ({@link MarkdownMcpModelSerializer}) emits
|
|
35
|
+
* Markdown for {@link serialize}/{@link serializeArray} and an object payload for
|
|
36
|
+
* {@link serializeStructured} (the dual-emit `structuredContent` counterpart). Aliasing of element
|
|
37
|
+
* ids happens internally via the per-session {@link McpIdAliasService}.
|
|
38
|
+
*
|
|
39
|
+
* @experimental
|
|
40
|
+
*/
|
|
41
|
+
export interface McpModelSerializer {
|
|
42
|
+
/** Serializes a single element (and its descendants). */
|
|
43
|
+
serialize(element: GModelElement): string;
|
|
44
|
+
|
|
45
|
+
/** Serializes an array of elements; duplicates introduced by hierarchy are removed. */
|
|
46
|
+
serializeArray(elements: GModelElement[]): string;
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Structured-content counterpart of {@link serialize} for dual-emit
|
|
50
|
+
* (`CallToolResult.structuredContent`). The shape is intentionally open: `{ elements: [...] }`
|
|
51
|
+
* with each entry carrying `id` + `type` + adopter-specific attrs (passthrough).
|
|
52
|
+
*/
|
|
53
|
+
serializeStructured(element: GModelElement): McpStructuredContent;
|
|
54
|
+
|
|
55
|
+
/** Structured-content counterpart of {@link serializeArray}. */
|
|
56
|
+
serializeStructuredArray(elements: GModelElement[]): McpStructuredContent;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Default {@link McpModelSerializer} — emits Markdown with one H1 section per element type
|
|
61
|
+
* followed by a table of all elements of that type. Flattens the GModel tree, drops keys with
|
|
62
|
+
* no LLM value (`cssClasses`, `revision`, `layout`, etc., see {@link keysToRemove}), truncates
|
|
63
|
+
* position+size to integers and derives a `bounds` rectangle so the LLM doesn't redo arithmetic.
|
|
64
|
+
*
|
|
65
|
+
* Generic: no control over element order or per-type attribute order, since no specific GLSP
|
|
66
|
+
* adopter is known. Adopters override (see workflow's `WorkflowMcpModelSerializer`) when
|
|
67
|
+
* semantic ordering matters.
|
|
68
|
+
*/
|
|
69
|
+
@injectable()
|
|
70
|
+
export class MarkdownMcpModelSerializer implements McpModelSerializer {
|
|
71
|
+
@inject(GModelSerializer) protected gModelSerializer: GModelSerializer;
|
|
72
|
+
@inject(McpIdAliasService) protected aliasService: McpIdAliasService;
|
|
73
|
+
@inject(Logger) protected logger: Logger;
|
|
74
|
+
|
|
75
|
+
protected keysToRemove: string[] = [
|
|
76
|
+
'cssClasses',
|
|
77
|
+
'revision',
|
|
78
|
+
'layout',
|
|
79
|
+
'args',
|
|
80
|
+
'layoutOptions',
|
|
81
|
+
'alignment',
|
|
82
|
+
'children',
|
|
83
|
+
'routingPoints',
|
|
84
|
+
'resizeLocations',
|
|
85
|
+
'parent'
|
|
86
|
+
];
|
|
87
|
+
|
|
88
|
+
/** Warn once per binding when the bare default is used — subclasses suppress via the constructor check. */
|
|
89
|
+
@postConstruct()
|
|
90
|
+
protected warnIfGenericDefault(): void {
|
|
91
|
+
if (this.constructor === MarkdownMcpModelSerializer) {
|
|
92
|
+
this.logger.warn(
|
|
93
|
+
'Using generic MarkdownMcpModelSerializer; bind a diagram-specific subclass via ' +
|
|
94
|
+
'DefaultMcpDiagramModule.bindModelSerializer() for richer LLM output.'
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
serialize(element: GModelElement): string {
|
|
100
|
+
return this.serializeArray([element]);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
serializeArray(elements: GModelElement[]): string {
|
|
104
|
+
return Object.entries(this.buildAliasedTypeBuckets(elements))
|
|
105
|
+
.filter(([, bucket]) => bucket.length > 0)
|
|
106
|
+
.flatMap(([type, bucket]) => [`# ${type}`, objectArrayToMarkdownTable(bucket)])
|
|
107
|
+
.join('\n');
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
serializeStructured(element: GModelElement): McpStructuredContent {
|
|
111
|
+
return this.serializeStructuredArray([element]);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
serializeStructuredArray(elements: GModelElement[]): McpStructuredContent {
|
|
115
|
+
return {
|
|
116
|
+
elements: Object.values(this.buildAliasedTypeBuckets(elements))
|
|
117
|
+
.filter(bucket => bucket.length > 0)
|
|
118
|
+
.flat()
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/** Common pipeline: prepare, dedupe by id, group by type, alias ids — used by both renders. */
|
|
123
|
+
protected buildAliasedTypeBuckets(elements: GModelElement[]): Record<string, SerializedElement[]> {
|
|
124
|
+
const elementsByTypeArray = elements.map(element => this.prepareElement(element));
|
|
125
|
+
const result: Record<string, SerializedElement[]> = {};
|
|
126
|
+
const allKeys = new Set(elementsByTypeArray.flatMap(obj => Object.keys(obj)));
|
|
127
|
+
allKeys.forEach(key => {
|
|
128
|
+
const combined = elementsByTypeArray.flatMap(obj => obj[key] ?? []);
|
|
129
|
+
result[key] = Array.from(new Map(combined.map(item => [item.id, item])).values()).map(item => this.applyAlias(item));
|
|
130
|
+
});
|
|
131
|
+
return result;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
protected applyAlias(element: SerializedElement): SerializedElement {
|
|
135
|
+
for (const field of ['id', 'sourceId', 'targetId', 'parentId'] as const) {
|
|
136
|
+
const value = element[field];
|
|
137
|
+
if (typeof value === 'string') {
|
|
138
|
+
element[field] = this.aliasService.alias(value);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return element;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
protected prepareElement(element: GModelElement): Record<string, SerializedElement[]> {
|
|
145
|
+
const schema = this.gModelSerializer.createSchema(element) as unknown as SerializedElement;
|
|
146
|
+
const elements = this.flattenStructure(schema, element.parent?.id);
|
|
147
|
+
|
|
148
|
+
const result: Record<string, SerializedElement[]> = {};
|
|
149
|
+
elements.forEach(elem => {
|
|
150
|
+
this.removeKeys(elem);
|
|
151
|
+
this.combinePositionAndSize(elem);
|
|
152
|
+
const type = typeof elem.type === 'string' ? elem.type : 'unknown';
|
|
153
|
+
(result[type] ??= []).push(elem);
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
return result;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
protected flattenStructure(element: SerializedElement, parentId?: string): SerializedElement[] {
|
|
160
|
+
const newElement: SerializedElement = { ...element };
|
|
161
|
+
const result: SerializedElement[] = [newElement];
|
|
162
|
+
const children = newElement.children;
|
|
163
|
+
if (Array.isArray(children)) {
|
|
164
|
+
const ownId = typeof newElement.id === 'string' ? newElement.id : undefined;
|
|
165
|
+
children.forEach(child =>
|
|
166
|
+
this.flattenStructure(child as SerializedElement, ownId).forEach(descendant => result.push(descendant))
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
newElement.parentId = parentId;
|
|
170
|
+
return result;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
protected removeKeys(element: SerializedElement): void {
|
|
174
|
+
for (const key of Object.keys(element)) {
|
|
175
|
+
if (this.keysToRemove.includes(key)) {
|
|
176
|
+
delete element[key];
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
protected combinePositionAndSize(element: SerializedElement): void {
|
|
182
|
+
const position = element.position;
|
|
183
|
+
if (!Point.is(position)) {
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
const x = Math.trunc(position.x);
|
|
187
|
+
const y = Math.trunc(position.y);
|
|
188
|
+
element.position = { x, y };
|
|
189
|
+
|
|
190
|
+
// Omit `size` and `bounds` when an element has no explicit geometry yet (e.g., a freshly
|
|
191
|
+
// created node whose `.size()` has not been applied). Emitting `{width: 0, height: 0}`
|
|
192
|
+
// would mislead an LLM consumer into "fixing" placeholder bounds. Visual rendering on
|
|
193
|
+
// the GLSP/sprotty client is unaffected — those nodes are laid out via CSS regardless.
|
|
194
|
+
const size = element.size;
|
|
195
|
+
if (!Dimension.is(size) || (Math.trunc(size.width) === 0 && Math.trunc(size.height) === 0)) {
|
|
196
|
+
delete element.size;
|
|
197
|
+
delete element.bounds;
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
const width = Math.trunc(size.width);
|
|
202
|
+
const height = Math.trunc(size.height);
|
|
203
|
+
element.size = { width, height };
|
|
204
|
+
element.bounds = {
|
|
205
|
+
left: x,
|
|
206
|
+
right: x + width,
|
|
207
|
+
top: y,
|
|
208
|
+
bottom: y + height
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
}
|
|
@@ -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 { NullLogger } from '@eclipse-glsp/server';
|
|
18
|
+
import { McpServer, RegisteredResource } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
19
|
+
import { expect } from 'chai';
|
|
20
|
+
import * as sinon from 'sinon';
|
|
21
|
+
import * as z from 'zod/v4';
|
|
22
|
+
import { DefaultGLSPMcpServer } from './glsp-mcp-server';
|
|
23
|
+
|
|
24
|
+
describe('DefaultGLSPMcpServer', () => {
|
|
25
|
+
function makeServer(): { wrapper: DefaultGLSPMcpServer; sdk: McpServer } {
|
|
26
|
+
const sdk = new McpServer({ name: 'test', version: '1.0.0' }, { capabilities: {} });
|
|
27
|
+
const wrapper = new DefaultGLSPMcpServer(sdk, { dataMode: 'tools' }, new NullLogger());
|
|
28
|
+
return { wrapper, sdk };
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
it('tracks every registerTool call so listTools returns the registered set', () => {
|
|
32
|
+
const { wrapper } = makeServer();
|
|
33
|
+
wrapper.registerTool('alpha', { description: 'first', inputSchema: { x: z.string() } }, async () => ({ content: [] }));
|
|
34
|
+
wrapper.registerTool('beta', { description: 'second' }, async () => ({ content: [] }));
|
|
35
|
+
|
|
36
|
+
const names = wrapper.listTools().map(tool => tool.description);
|
|
37
|
+
expect(names).to.have.members(['first', 'second']);
|
|
38
|
+
expect(wrapper.listTools()).to.have.lengthOf(2);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('tracks registerResource (static URI) and listResources reflects it by name', () => {
|
|
42
|
+
const { wrapper } = makeServer();
|
|
43
|
+
wrapper.registerResource('my-resource', 'glsp://test', { title: 'res', mimeType: 'text/plain' }, async () => ({
|
|
44
|
+
contents: [{ uri: 'glsp://test', text: 'ok' }]
|
|
45
|
+
}));
|
|
46
|
+
|
|
47
|
+
const resources = wrapper.listResources();
|
|
48
|
+
expect(resources).to.have.lengthOf(1);
|
|
49
|
+
expect((resources[0] as RegisteredResource).name).to.equal('my-resource');
|
|
50
|
+
expect((resources[0] as RegisteredResource).title).to.equal('res');
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it('tracks registerPrompt and listPrompts reflects it by description', () => {
|
|
54
|
+
const { wrapper } = makeServer();
|
|
55
|
+
wrapper.registerPrompt('describe', { description: 'desc' }, async () => ({ messages: [] }));
|
|
56
|
+
|
|
57
|
+
const prompts = wrapper.listPrompts();
|
|
58
|
+
expect(prompts).to.have.lengthOf(1);
|
|
59
|
+
expect(prompts[0].description).to.equal('desc');
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it('getRawServer() returns the exact SDK instance passed in (escape hatch identity)', () => {
|
|
63
|
+
const { wrapper, sdk } = makeServer();
|
|
64
|
+
expect(wrapper.getRawServer()).to.equal(sdk);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it('dispose() invokes close() on the underlying SDK server', () => {
|
|
68
|
+
const { wrapper, sdk } = makeServer();
|
|
69
|
+
const closeSpy = sinon.spy(sdk, 'close');
|
|
70
|
+
wrapper.dispose();
|
|
71
|
+
expect(closeSpy.calledOnce).to.be.true;
|
|
72
|
+
});
|
|
73
|
+
});
|