@eclipse-glsp/server-mcp 2.7.0-next.9 → 2.7.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
package/lib/util/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/util/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;kFAckF;AAElF,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC"}
|
package/lib/util/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/util/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;kFAckF;;;;;;;;;;;;;;;;AAElF,kDAAgC;AAChC,6CAA2B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"markdown-util.d.ts","sourceRoot":"","sources":["../../src/util/markdown-util.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;kFAckF;AAElF;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,MAAM,CAwB9E"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"markdown-util.js","sourceRoot":"","sources":["../../src/util/markdown-util.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;kFAckF;;AAKlF,gEAwBC;AA3BD;;GAEG;AACH,SAAgB,0BAA0B,CAAC,IAA2B;IAClE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACf,OAAO,EAAE,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,MAAM,SAAS,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IAC/C,MAAM,YAAY,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IAEnE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAwB,EAAE,EAAE;QACnD,MAAM,SAAS,GAAG,OAAO;aACpB,GAAG,CAAC,MAAM,CAAC,EAAE;;YACV,MAAM,KAAK,GAAG,MAAA,GAAG,CAAC,MAAM,CAAC,mCAAI,EAAE,CAAC;YAChC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC5B,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YACxD,CAAC;YACD,+EAA+E;YAC/E,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC/C,CAAC,CAAC;aACD,IAAI,CAAC,KAAK,CAAC,CAAC;QACjB,OAAO,KAAK,SAAS,IAAI,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,SAAS,EAAE,YAAY,EAAE,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7D,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-util.d.ts","sourceRoot":"","sources":["../../src/util/mcp-util.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;kFAckF;AAElF;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAGxE"}
|
package/lib/util/mcp-util.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-util.js","sourceRoot":"","sources":["../../src/util/mcp-util.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;kFAckF;;AAOlF,4CAGC;AARD;;;;GAIG;AACH,SAAgB,gBAAgB,CAAC,IAAY,EAAE,OAAiB;IAC5D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACpC,OAAO,mBAAmB,IAAI,eAAe,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AACnG,CAAC"}
|
package/src/index.ts
DELETED
|
@@ -1,24 +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
|
-
export * from './prompts';
|
|
17
|
-
export * from './resources';
|
|
18
|
-
export * from './server';
|
|
19
|
-
export * from './tools';
|
|
20
|
-
export * from './util';
|
|
21
|
-
// Module classes — exported here (not from `./server`) to avoid circular imports through
|
|
22
|
-
// the handler barrels which the modules consume.
|
|
23
|
-
export * from './server/mcp-diagram-module';
|
|
24
|
-
export * from './server/mcp-server-module';
|
package/src/server/index.ts
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
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 './glsp-mcp-server';
|
|
18
|
-
export * from './mcp-diagram-handler-dispatcher';
|
|
19
|
-
export * from './mcp-diagram-prompt-handler-registry';
|
|
20
|
-
export * from './mcp-diagram-resource-handler-registry';
|
|
21
|
-
export * from './mcp-diagram-tool-handler-registry';
|
|
22
|
-
export * from './mcp-handler-shared';
|
|
23
|
-
export * from './mcp-http-transport';
|
|
24
|
-
export * from './mcp-id-alias-service';
|
|
25
|
-
export * from './mcp-input-schemas';
|
|
26
|
-
export * from './mcp-label-provider';
|
|
27
|
-
export * from './mcp-log-level-registry';
|
|
28
|
-
export * from './mcp-logger';
|
|
29
|
-
export * from './mcp-mime-types';
|
|
30
|
-
export * from './mcp-options';
|
|
31
|
-
export * from './mcp-progress-reporter';
|
|
32
|
-
export * from './mcp-prompt-handler';
|
|
33
|
-
export * from './mcp-request-context';
|
|
34
|
-
export * from './mcp-resource-handler';
|
|
35
|
-
export * from './mcp-server-launcher';
|
|
36
|
-
export * from './mcp-session';
|
|
37
|
-
export * from './mcp-tool-handler';
|
|
38
|
-
|
|
39
|
-
// `mcp-diagram-module` and `mcp-server-module` are intentionally not re-exported here —
|
|
40
|
-
// they import handler classes from `../resources` / `../tools`, which would create a circular
|
|
41
|
-
// import chain through this barrel. They are re-exported from the package root (`src/index.ts`)
|
|
42
|
-
// after the handler barrels finish initializing.
|
|
@@ -1,151 +0,0 @@
|
|
|
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 { Logger, NullLogger } from '@eclipse-glsp/server';
|
|
18
|
-
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
19
|
-
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
20
|
-
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
21
|
-
import { expect } from 'chai';
|
|
22
|
-
import { Container, ContainerModule } from 'inversify';
|
|
23
|
-
import * as z from 'zod/v4';
|
|
24
|
-
import { McpHttpTransport } from './mcp-http-transport';
|
|
25
|
-
import { McpServerOptions } from './mcp-options';
|
|
26
|
-
import { rawHttpRequest } from './raw-http.spec';
|
|
27
|
-
|
|
28
|
-
function buildTransport(): McpHttpTransport {
|
|
29
|
-
const container = new Container();
|
|
30
|
-
container.load(
|
|
31
|
-
new ContainerModule(bind => {
|
|
32
|
-
bind(Logger).toConstantValue(new NullLogger());
|
|
33
|
-
const opts = new McpServerOptions();
|
|
34
|
-
opts.values = {};
|
|
35
|
-
bind(McpServerOptions).toConstantValue(opts);
|
|
36
|
-
bind(McpHttpTransport).toSelf().inSingletonScope();
|
|
37
|
-
})
|
|
38
|
-
);
|
|
39
|
-
return container.get<McpHttpTransport>(McpHttpTransport);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* WN-058 — End-to-end smoke test that boots {@link McpHttpTransport},
|
|
44
|
-
* connects a real SDK MCP client over Streamable HTTP, and exercises a tool
|
|
45
|
-
* round-trip (`echo`). Validates that the transport implements the protocol
|
|
46
|
-
* conformantly without depending on the GLSP handler stack.
|
|
47
|
-
*/
|
|
48
|
-
describe('McpHttpTransport (WN-058 e2e — real MCP SDK client over HTTP)', () => {
|
|
49
|
-
let httpServer: McpHttpTransport | undefined;
|
|
50
|
-
let client: Client | undefined;
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* Idempotent client close: a test that already tore the SDK client down (e.g. after a
|
|
54
|
-
* spec-mandated DELETE on the same session) leaves the local `client` ref pointing at a
|
|
55
|
-
* closed instance. `Client.close()` is safe to call twice on the SDK side, but we still
|
|
56
|
-
* swallow any throw so afterEach is robust under partial-progress failures too.
|
|
57
|
-
*/
|
|
58
|
-
async function safeClose(target: Client | undefined): Promise<void> {
|
|
59
|
-
if (!target) return;
|
|
60
|
-
try {
|
|
61
|
-
await target.close();
|
|
62
|
-
} catch {
|
|
63
|
-
/* ignore — best effort */
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
afterEach(async () => {
|
|
68
|
-
await safeClose(client);
|
|
69
|
-
client = undefined;
|
|
70
|
-
httpServer?.dispose();
|
|
71
|
-
httpServer = undefined;
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
it('round-trips tools/list and tools/call against a registered echo tool', async () => {
|
|
75
|
-
httpServer = buildTransport();
|
|
76
|
-
|
|
77
|
-
// Wire one fresh `McpServer` per accepted session, register an `echo` tool,
|
|
78
|
-
// and let the server attach to the transport. Mirrors what `McpServerLauncher`
|
|
79
|
-
// does; kept inline here so the test exercises only the transport path.
|
|
80
|
-
httpServer.onSessionInitialized(session => {
|
|
81
|
-
const mcpServer = new McpServer({ name: 'glsp-test', version: '1.0.0' }, { capabilities: {} });
|
|
82
|
-
mcpServer.registerTool(
|
|
83
|
-
'echo',
|
|
84
|
-
{ description: 'Returns the supplied message verbatim.', inputSchema: { message: z.string() } },
|
|
85
|
-
async ({ message }) => ({ content: [{ type: 'text', text: message }] })
|
|
86
|
-
);
|
|
87
|
-
mcpServer.connect(session);
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
const endpoint = await httpServer.start({
|
|
91
|
-
port: 0,
|
|
92
|
-
host: '127.0.0.1',
|
|
93
|
-
route: '/mcp',
|
|
94
|
-
name: 'glsp-test',
|
|
95
|
-
options: { dataMode: 'tools' }
|
|
96
|
-
});
|
|
97
|
-
expect(endpoint.url, 'transport must report a URL after start()').to.be.a('string');
|
|
98
|
-
|
|
99
|
-
client = new Client({ name: 'wn-058-test-client', version: '1.0.0' });
|
|
100
|
-
await client.connect(new StreamableHTTPClientTransport(new URL(endpoint.url!)));
|
|
101
|
-
|
|
102
|
-
const tools = await client.listTools();
|
|
103
|
-
expect(tools.tools.map(tool => tool.name)).to.include('echo');
|
|
104
|
-
|
|
105
|
-
const result = await client.callTool({ name: 'echo', arguments: { message: 'hello GLSP' } });
|
|
106
|
-
expect(result.isError).to.not.equal(true);
|
|
107
|
-
expect(result.content).to.have.lengthOf(1);
|
|
108
|
-
const [block] = result.content as Array<{ type: string; text?: string }>;
|
|
109
|
-
expect(block.type).to.equal('text');
|
|
110
|
-
expect(block.text).to.equal('hello GLSP');
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
it('DELETE /mcp terminates the session; subsequent POSTs with the same id return 404 (§ #5)', async () => {
|
|
114
|
-
httpServer = buildTransport();
|
|
115
|
-
httpServer.onSessionInitialized(session => {
|
|
116
|
-
const mcpServer = new McpServer({ name: 'glsp-test', version: '1.0.0' }, { capabilities: {} });
|
|
117
|
-
mcpServer.connect(session);
|
|
118
|
-
});
|
|
119
|
-
const endpoint = await httpServer.start({
|
|
120
|
-
port: 0,
|
|
121
|
-
host: '127.0.0.1',
|
|
122
|
-
route: '/mcp',
|
|
123
|
-
name: 'glsp-test',
|
|
124
|
-
options: { dataMode: 'tools' }
|
|
125
|
-
});
|
|
126
|
-
|
|
127
|
-
client = new Client({ name: 'delete-smoke-test', version: '1.0.0' });
|
|
128
|
-
const clientTransport = new StreamableHTTPClientTransport(new URL(endpoint.url!));
|
|
129
|
-
await client.connect(clientTransport);
|
|
130
|
-
const sessionId = clientTransport.sessionId;
|
|
131
|
-
expect(sessionId, 'SDK transport should expose the minted session id after initialize').to.be.a('string');
|
|
132
|
-
|
|
133
|
-
const { port } = await httpServer.getAddress();
|
|
134
|
-
|
|
135
|
-
// 1. Spec § Session Management #5 — DELETE terminates the session.
|
|
136
|
-
const deleteRes = await rawHttpRequest(port, 'DELETE', { 'mcp-session-id': sessionId! });
|
|
137
|
-
expect(deleteRes.status, 'DELETE should succeed for an active session').to.be.lessThan(300);
|
|
138
|
-
|
|
139
|
-
// 2. After termination, the same id MUST be rejected with 404 (§ #3) — proves the
|
|
140
|
-
// session was actually removed, not just acked.
|
|
141
|
-
const followUp = await rawHttpRequest(
|
|
142
|
-
port,
|
|
143
|
-
'POST',
|
|
144
|
-
{ 'mcp-session-id': sessionId! },
|
|
145
|
-
{ jsonrpc: '2.0', id: 1, method: 'tools/list', params: {} }
|
|
146
|
-
);
|
|
147
|
-
expect(followUp.status).to.equal(404);
|
|
148
|
-
const payload = JSON.parse(followUp.body);
|
|
149
|
-
expect(payload.error.code).to.equal(-32001);
|
|
150
|
-
});
|
|
151
|
-
});
|
|
@@ -1,385 +0,0 @@
|
|
|
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 { Logger, NullLogger } from '@eclipse-glsp/server';
|
|
18
|
-
import { expect } from 'chai';
|
|
19
|
-
import { Container, ContainerModule } from 'inversify';
|
|
20
|
-
import { McpHttpTransport } from './mcp-http-transport';
|
|
21
|
-
import { McpServerOptions } from './mcp-options';
|
|
22
|
-
import { rawHttpRequest } from './raw-http.spec';
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Builds a transport instance with a configurable `McpServerOptions` binding so tests can
|
|
26
|
-
* exercise the SDK-level host allowlist (forwarded via `createMcpExpressApp`) and our own
|
|
27
|
-
* Origin allowlist (installed in `configureExpressApp`).
|
|
28
|
-
*/
|
|
29
|
-
function buildTransport(optionValues: McpServerOptions['values'] = {}): McpHttpTransport {
|
|
30
|
-
const container = new Container();
|
|
31
|
-
container.load(
|
|
32
|
-
new ContainerModule(bind => {
|
|
33
|
-
bind(Logger).toConstantValue(new NullLogger());
|
|
34
|
-
const opts = new McpServerOptions();
|
|
35
|
-
opts.values = optionValues;
|
|
36
|
-
bind(McpServerOptions).toConstantValue(opts);
|
|
37
|
-
bind(McpHttpTransport).toSelf().inSingletonScope();
|
|
38
|
-
})
|
|
39
|
-
);
|
|
40
|
-
return container.get<McpHttpTransport>(McpHttpTransport);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
describe('McpHttpTransport (startup smoke test)', () => {
|
|
44
|
-
let httpServer: McpHttpTransport | undefined;
|
|
45
|
-
|
|
46
|
-
afterEach(() => {
|
|
47
|
-
// Always tear down so a failing assertion does not leak the listening socket.
|
|
48
|
-
httpServer?.dispose();
|
|
49
|
-
httpServer = undefined;
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
it('binds an HTTP server on a resolvable port and 127.0.0.1 host', async () => {
|
|
53
|
-
httpServer = buildTransport();
|
|
54
|
-
|
|
55
|
-
const endpoint = await httpServer.start({
|
|
56
|
-
port: 0,
|
|
57
|
-
host: '127.0.0.1',
|
|
58
|
-
route: '/mcp',
|
|
59
|
-
name: 'test',
|
|
60
|
-
options: { dataMode: 'tools' }
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
expect(endpoint.url).to.match(/^http:\/\/127\.0\.0\.1:\d+\/mcp$/);
|
|
64
|
-
|
|
65
|
-
const address = await httpServer.getAddress();
|
|
66
|
-
expect(address.address).to.equal('127.0.0.1');
|
|
67
|
-
expect(address.port).to.be.a('number');
|
|
68
|
-
expect(address.port).to.be.greaterThan(0);
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
it('exposes the underlying http.Server and Express app after start', async () => {
|
|
72
|
-
httpServer = buildTransport();
|
|
73
|
-
|
|
74
|
-
await httpServer.start({
|
|
75
|
-
port: 0,
|
|
76
|
-
host: '127.0.0.1',
|
|
77
|
-
route: '/mcp',
|
|
78
|
-
name: 'test',
|
|
79
|
-
options: { dataMode: 'tools' }
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
expect(httpServer.app).to.not.be.undefined;
|
|
83
|
-
expect(httpServer.server).to.not.be.undefined;
|
|
84
|
-
expect(httpServer.server!.listening).to.equal(true);
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
it('closes the underlying http.Server on dispose()', async () => {
|
|
88
|
-
const local = buildTransport();
|
|
89
|
-
|
|
90
|
-
await local.start({
|
|
91
|
-
port: 0,
|
|
92
|
-
host: '127.0.0.1',
|
|
93
|
-
route: '/mcp',
|
|
94
|
-
name: 'test',
|
|
95
|
-
options: { dataMode: 'tools' }
|
|
96
|
-
});
|
|
97
|
-
const underlying = local.server!;
|
|
98
|
-
expect(underlying.listening).to.equal(true);
|
|
99
|
-
|
|
100
|
-
local.dispose();
|
|
101
|
-
|
|
102
|
-
// `Server.close()` is asynchronous — wait for the actual close event.
|
|
103
|
-
await new Promise<void>(resolve => {
|
|
104
|
-
if (!underlying.listening) {
|
|
105
|
-
resolve();
|
|
106
|
-
return;
|
|
107
|
-
}
|
|
108
|
-
underlying.once('close', () => resolve());
|
|
109
|
-
});
|
|
110
|
-
expect(underlying.listening).to.equal(false);
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
it('rejects start() with an actionable error when the requested port is already in use', async () => {
|
|
114
|
-
// First transport: bind a random port so we know exactly which port is taken.
|
|
115
|
-
const first = buildTransport();
|
|
116
|
-
await first.start({
|
|
117
|
-
port: 0,
|
|
118
|
-
host: '127.0.0.1',
|
|
119
|
-
route: '/mcp',
|
|
120
|
-
name: 'first',
|
|
121
|
-
options: { dataMode: 'tools' }
|
|
122
|
-
});
|
|
123
|
-
const taken = (await first.getAddress()).port;
|
|
124
|
-
|
|
125
|
-
// Second transport: try to bind the same port → EADDRINUSE.
|
|
126
|
-
const second = buildTransport();
|
|
127
|
-
try {
|
|
128
|
-
await expectStartToReject(second, taken);
|
|
129
|
-
} finally {
|
|
130
|
-
first.dispose();
|
|
131
|
-
second.dispose();
|
|
132
|
-
}
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
async function expectStartToReject(transport: McpHttpTransport, takenPort: number): Promise<void> {
|
|
136
|
-
let error: Error | undefined;
|
|
137
|
-
try {
|
|
138
|
-
await transport.start({
|
|
139
|
-
port: takenPort,
|
|
140
|
-
host: '127.0.0.1',
|
|
141
|
-
route: '/mcp',
|
|
142
|
-
name: 'second',
|
|
143
|
-
options: { dataMode: 'tools' }
|
|
144
|
-
});
|
|
145
|
-
} catch (err: unknown) {
|
|
146
|
-
error = err as Error;
|
|
147
|
-
}
|
|
148
|
-
expect(error, 'expected start() to reject').to.not.equal(undefined);
|
|
149
|
-
// The actionable hint must name the offending host:port AND point at the override path.
|
|
150
|
-
expect(error!.message).to.include(`127.0.0.1:${takenPort}`);
|
|
151
|
-
expect(error!.message).to.include('mcpServer.port');
|
|
152
|
-
expect(error!.message).to.match(/already in use/);
|
|
153
|
-
}
|
|
154
|
-
});
|
|
155
|
-
|
|
156
|
-
describe('McpHttpTransport (Origin/Host validation — DNS-rebinding mitigation)', () => {
|
|
157
|
-
let httpServer: McpHttpTransport | undefined;
|
|
158
|
-
|
|
159
|
-
afterEach(() => {
|
|
160
|
-
httpServer?.dispose();
|
|
161
|
-
httpServer = undefined;
|
|
162
|
-
});
|
|
163
|
-
|
|
164
|
-
it('rejects requests with a Host header outside the allowlist', async () => {
|
|
165
|
-
httpServer = buildTransport({ allowedHosts: ['127.0.0.1', 'localhost'] });
|
|
166
|
-
await httpServer.start({ port: 0, host: '127.0.0.1', route: '/mcp', name: 'test', options: {} });
|
|
167
|
-
const port = (await httpServer.getAddress()).port;
|
|
168
|
-
|
|
169
|
-
const res = await rawHttpRequest(port, 'POST', { Host: 'evil.example' }, {});
|
|
170
|
-
|
|
171
|
-
expect(res.status).to.equal(403);
|
|
172
|
-
expect(res.body).to.match(/Host/);
|
|
173
|
-
});
|
|
174
|
-
|
|
175
|
-
it('accepts requests whose Host header matches the allowlist', async () => {
|
|
176
|
-
httpServer = buildTransport({ allowedHosts: ['127.0.0.1', 'localhost'] });
|
|
177
|
-
await httpServer.start({ port: 0, host: '127.0.0.1', route: '/mcp', name: 'test', options: {} });
|
|
178
|
-
const port = (await httpServer.getAddress()).port;
|
|
179
|
-
|
|
180
|
-
// No `mcp-session-id` header on a non-init body → session-id gate rejects with 400
|
|
181
|
-
// (not the middleware's 403). What matters here is that we got *past* the middleware.
|
|
182
|
-
const res = await rawHttpRequest(port, 'POST', { Host: `127.0.0.1:${port}` }, {});
|
|
183
|
-
|
|
184
|
-
expect(res.status).to.not.equal(403);
|
|
185
|
-
});
|
|
186
|
-
|
|
187
|
-
it('rejects requests whose Origin header is outside an explicit allowlist', async () => {
|
|
188
|
-
httpServer = buildTransport({
|
|
189
|
-
allowedHosts: ['127.0.0.1', 'localhost'],
|
|
190
|
-
allowedOrigins: ['https://my-frontend.example']
|
|
191
|
-
});
|
|
192
|
-
await httpServer.start({ port: 0, host: '127.0.0.1', route: '/mcp', name: 'test', options: {} });
|
|
193
|
-
const port = (await httpServer.getAddress()).port;
|
|
194
|
-
|
|
195
|
-
const res = await rawHttpRequest(port, 'POST', { Host: '127.0.0.1', Origin: 'https://evil.example' }, {});
|
|
196
|
-
|
|
197
|
-
expect(res.status).to.equal(403);
|
|
198
|
-
expect(res.body).to.match(/Origin/);
|
|
199
|
-
});
|
|
200
|
-
|
|
201
|
-
it('skips Origin checks when allowedOrigins is undefined (desktop-IDE default)', async () => {
|
|
202
|
-
httpServer = buildTransport({ allowedHosts: ['127.0.0.1', 'localhost'] });
|
|
203
|
-
await httpServer.start({ port: 0, host: '127.0.0.1', route: '/mcp', name: 'test', options: {} });
|
|
204
|
-
const port = (await httpServer.getAddress()).port;
|
|
205
|
-
|
|
206
|
-
// With allowedOrigins undefined, ANY Origin (or none) is allowed past the middleware.
|
|
207
|
-
const res = await rawHttpRequest(port, 'POST', { Host: '127.0.0.1', Origin: 'https://anything.example' }, {});
|
|
208
|
-
|
|
209
|
-
expect(res.status).to.not.equal(403);
|
|
210
|
-
});
|
|
211
|
-
});
|
|
212
|
-
|
|
213
|
-
describe('McpHttpTransport (session-id validation per MCP Streamable HTTP § Session Management)', () => {
|
|
214
|
-
let httpServer: McpHttpTransport | undefined;
|
|
215
|
-
|
|
216
|
-
afterEach(() => {
|
|
217
|
-
httpServer?.dispose();
|
|
218
|
-
httpServer = undefined;
|
|
219
|
-
});
|
|
220
|
-
|
|
221
|
-
async function startTransport(): Promise<number> {
|
|
222
|
-
httpServer = buildTransport({ allowedHosts: ['127.0.0.1', 'localhost'] });
|
|
223
|
-
await httpServer.start({ port: 0, host: '127.0.0.1', route: '/mcp', name: 'test', options: {} });
|
|
224
|
-
return (await httpServer.getAddress()).port;
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
it('rejects a non-initialize POST without an Mcp-Session-Id header with 400 (§ #2)', async () => {
|
|
228
|
-
const port = await startTransport();
|
|
229
|
-
|
|
230
|
-
const res = await rawHttpRequest(port, 'POST', {}, { jsonrpc: '2.0', id: 1, method: 'tools/list', params: {} });
|
|
231
|
-
|
|
232
|
-
expect(res.status).to.equal(400);
|
|
233
|
-
const payload = JSON.parse(res.body);
|
|
234
|
-
expect(payload.jsonrpc).to.equal('2.0');
|
|
235
|
-
// eslint-disable-next-line no-null/no-null -- JSON-RPC 2.0 § 5 mandates `null` for unattributable error responses.
|
|
236
|
-
expect(payload.id).to.equal(null);
|
|
237
|
-
expect(payload.error.code).to.equal(-32000);
|
|
238
|
-
expect(payload.error.message).to.match(/No valid session ID/);
|
|
239
|
-
});
|
|
240
|
-
|
|
241
|
-
it('rejects a POST with an unknown Mcp-Session-Id with 404 (§ #3)', async () => {
|
|
242
|
-
const port = await startTransport();
|
|
243
|
-
|
|
244
|
-
const res = await rawHttpRequest(
|
|
245
|
-
port,
|
|
246
|
-
'POST',
|
|
247
|
-
{ 'mcp-session-id': 'no-such-session' },
|
|
248
|
-
{ jsonrpc: '2.0', id: 1, method: 'tools/list', params: {} }
|
|
249
|
-
);
|
|
250
|
-
|
|
251
|
-
expect(res.status).to.equal(404);
|
|
252
|
-
const payload = JSON.parse(res.body);
|
|
253
|
-
expect(payload.jsonrpc).to.equal('2.0');
|
|
254
|
-
// eslint-disable-next-line no-null/no-null -- JSON-RPC 2.0 § 5 mandates `null` for unattributable error responses.
|
|
255
|
-
expect(payload.id).to.equal(null);
|
|
256
|
-
expect(payload.error.code).to.equal(-32001);
|
|
257
|
-
expect(payload.error.message).to.match(/Session not found/i);
|
|
258
|
-
});
|
|
259
|
-
|
|
260
|
-
it('rejects an initialize POST that carries an unknown Mcp-Session-Id with 404 (§ #3 — must not silently mint)', async () => {
|
|
261
|
-
const port = await startTransport();
|
|
262
|
-
|
|
263
|
-
const initBody = {
|
|
264
|
-
jsonrpc: '2.0',
|
|
265
|
-
id: 1,
|
|
266
|
-
method: 'initialize',
|
|
267
|
-
params: {
|
|
268
|
-
protocolVersion: '2025-06-18',
|
|
269
|
-
capabilities: {},
|
|
270
|
-
clientInfo: { name: 'test', version: '0.0.1' }
|
|
271
|
-
}
|
|
272
|
-
};
|
|
273
|
-
|
|
274
|
-
const res = await rawHttpRequest(port, 'POST', { 'mcp-session-id': 'stale-session' }, initBody);
|
|
275
|
-
|
|
276
|
-
expect(res.status).to.equal(404);
|
|
277
|
-
const payload = JSON.parse(res.body);
|
|
278
|
-
expect(payload.error.code).to.equal(-32001);
|
|
279
|
-
});
|
|
280
|
-
|
|
281
|
-
it('rejects a GET (SSE stream) with an unknown Mcp-Session-Id with the JSON-RPC envelope', async () => {
|
|
282
|
-
const port = await startTransport();
|
|
283
|
-
|
|
284
|
-
const res = await rawHttpRequest(port, 'GET', { 'mcp-session-id': 'no-such-session' });
|
|
285
|
-
|
|
286
|
-
expect(res.status).to.equal(404);
|
|
287
|
-
const payload = JSON.parse(res.body);
|
|
288
|
-
expect(payload.error.code).to.equal(-32001);
|
|
289
|
-
// eslint-disable-next-line no-null/no-null -- JSON-RPC 2.0 § 5 mandates `null` for unattributable error responses.
|
|
290
|
-
expect(payload.id).to.equal(null);
|
|
291
|
-
});
|
|
292
|
-
|
|
293
|
-
it('rejects a DELETE without an Mcp-Session-Id header with the JSON-RPC envelope', async () => {
|
|
294
|
-
const port = await startTransport();
|
|
295
|
-
|
|
296
|
-
const res = await rawHttpRequest(port, 'DELETE', {});
|
|
297
|
-
|
|
298
|
-
expect(res.status).to.equal(400);
|
|
299
|
-
const payload = JSON.parse(res.body);
|
|
300
|
-
expect(payload.error.code).to.equal(-32000);
|
|
301
|
-
// eslint-disable-next-line no-null/no-null -- JSON-RPC 2.0 § 5 mandates `null` for unattributable error responses.
|
|
302
|
-
expect(payload.id).to.equal(null);
|
|
303
|
-
});
|
|
304
|
-
|
|
305
|
-
// Happy path (initialize POST without session id ⇒ new session) is exercised end-to-end
|
|
306
|
-
// by `mcp-http-transport-e2e.spec.ts` against a real SDK client; not duplicated here
|
|
307
|
-
// because asserting it inline requires wiring up an `McpServer` to actually respond.
|
|
308
|
-
});
|
|
309
|
-
|
|
310
|
-
describe('McpHttpTransport (MCP-Protocol-Version header validation)', () => {
|
|
311
|
-
let httpServer: McpHttpTransport | undefined;
|
|
312
|
-
|
|
313
|
-
afterEach(() => {
|
|
314
|
-
httpServer?.dispose();
|
|
315
|
-
httpServer = undefined;
|
|
316
|
-
});
|
|
317
|
-
|
|
318
|
-
async function startTransport(): Promise<number> {
|
|
319
|
-
httpServer = buildTransport({ allowedHosts: ['127.0.0.1', 'localhost'] });
|
|
320
|
-
await httpServer.start({ port: 0, host: '127.0.0.1', route: '/mcp', name: 'test', options: {} });
|
|
321
|
-
return (await httpServer.getAddress()).port;
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
it('rejects a non-initialize POST whose MCP-Protocol-Version is unsupported with HTTP 400', async () => {
|
|
325
|
-
const port = await startTransport();
|
|
326
|
-
|
|
327
|
-
const res = await rawHttpRequest(
|
|
328
|
-
port,
|
|
329
|
-
'POST',
|
|
330
|
-
{ 'mcp-session-id': 'doesnt-matter', 'mcp-protocol-version': '1999-01-01' },
|
|
331
|
-
{ jsonrpc: '2.0', id: 1, method: 'tools/list', params: {} }
|
|
332
|
-
);
|
|
333
|
-
|
|
334
|
-
expect(res.status).to.equal(400);
|
|
335
|
-
const payload = JSON.parse(res.body);
|
|
336
|
-
expect(payload.jsonrpc).to.equal('2.0');
|
|
337
|
-
// eslint-disable-next-line no-null/no-null -- JSON-RPC 2.0 § 5 mandates `null` for unattributable error responses.
|
|
338
|
-
expect(payload.id).to.equal(null);
|
|
339
|
-
expect(payload.error.code).to.equal(-32000);
|
|
340
|
-
expect(payload.error.message).to.match(/Unsupported MCP-Protocol-Version/);
|
|
341
|
-
expect(payload.error.message).to.match(/1999-01-01/);
|
|
342
|
-
expect(payload.error.message).to.match(/Supported versions/);
|
|
343
|
-
});
|
|
344
|
-
|
|
345
|
-
it('rejects a GET whose MCP-Protocol-Version is unsupported with HTTP 400 (header validated before session lookup)', async () => {
|
|
346
|
-
const port = await startTransport();
|
|
347
|
-
|
|
348
|
-
const res = await rawHttpRequest(port, 'GET', { 'mcp-session-id': 'any', 'mcp-protocol-version': 'bogus' });
|
|
349
|
-
|
|
350
|
-
expect(res.status).to.equal(400);
|
|
351
|
-
const payload = JSON.parse(res.body);
|
|
352
|
-
expect(payload.error.message).to.match(/Unsupported MCP-Protocol-Version/);
|
|
353
|
-
});
|
|
354
|
-
|
|
355
|
-
it('passes a non-initialize POST through when the MCP-Protocol-Version header is absent (spec defaults to 2025-03-26)', async () => {
|
|
356
|
-
// Without the header, the protocol-version middleware must let the request through to
|
|
357
|
-
// the next layer (which then enforces session-id rules). Asserting we hit the 400
|
|
358
|
-
// session-id error — not the 400 protocol-version error — proves the middleware
|
|
359
|
-
// didn't short-circuit.
|
|
360
|
-
const port = await startTransport();
|
|
361
|
-
|
|
362
|
-
const res = await rawHttpRequest(port, 'POST', {}, { jsonrpc: '2.0', id: 1, method: 'tools/list', params: {} });
|
|
363
|
-
|
|
364
|
-
expect(res.status).to.equal(400);
|
|
365
|
-
const payload = JSON.parse(res.body);
|
|
366
|
-
expect(payload.error.message).to.match(/No valid session ID/);
|
|
367
|
-
});
|
|
368
|
-
|
|
369
|
-
it('passes a non-initialize POST through when the MCP-Protocol-Version is one of the supported versions', async () => {
|
|
370
|
-
// Header is supported → middleware passes → we hit the 400 session-id check, not the
|
|
371
|
-
// 400 protocol-version check.
|
|
372
|
-
const port = await startTransport();
|
|
373
|
-
|
|
374
|
-
const res = await rawHttpRequest(
|
|
375
|
-
port,
|
|
376
|
-
'POST',
|
|
377
|
-
{ 'mcp-protocol-version': '2025-06-18' },
|
|
378
|
-
{ jsonrpc: '2.0', id: 1, method: 'tools/list', params: {} }
|
|
379
|
-
);
|
|
380
|
-
|
|
381
|
-
expect(res.status).to.equal(400);
|
|
382
|
-
const payload = JSON.parse(res.body);
|
|
383
|
-
expect(payload.error.message).to.match(/No valid session ID/);
|
|
384
|
-
});
|
|
385
|
-
});
|