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