skybridge 0.0.0-dev.c2b3cec → 0.0.0-dev.c2c0f98
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 +3 -0
- package/dist/cli/build-helpers.d.ts +6 -2
- package/dist/cli/build-helpers.js +39 -14
- package/dist/cli/build-helpers.js.map +1 -1
- package/dist/cli/build-helpers.test.js +73 -5
- package/dist/cli/build-helpers.test.js.map +1 -1
- package/dist/cli/build-steps.d.ts +2 -0
- package/dist/cli/build-steps.js +73 -0
- package/dist/cli/build-steps.js.map +1 -0
- package/dist/cli/build-steps.test.js +52 -0
- package/dist/cli/build-steps.test.js.map +1 -0
- package/dist/cli/header.d.ts +1 -1
- package/dist/cli/resolve-skybridge-config.d.ts +5 -0
- package/dist/cli/{resolve-views-dir.js → resolve-skybridge-config.js} +4 -3
- package/dist/cli/resolve-skybridge-config.js.map +1 -0
- package/dist/cli/run-plain.d.ts +18 -0
- package/dist/cli/run-plain.js +89 -0
- package/dist/cli/run-plain.js.map +1 -0
- package/dist/cli/use-execute-steps.d.ts +1 -1
- package/dist/cli/use-nodemon.d.ts +14 -0
- package/dist/cli/use-nodemon.js +71 -60
- package/dist/cli/use-nodemon.js.map +1 -1
- package/dist/cli/use-typescript-check.d.ts +8 -2
- package/dist/cli/use-typescript-check.js +70 -67
- package/dist/cli/use-typescript-check.js.map +1 -1
- package/dist/commands/build.d.ts +0 -2
- package/dist/commands/build.js +2 -61
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/dev.d.ts +1 -0
- package/dist/commands/dev.js +35 -3
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/start.js +2 -2
- package/dist/commands/start.js.map +1 -1
- package/dist/context-warnings.d.ts +5 -0
- package/dist/context-warnings.js +31 -0
- package/dist/context-warnings.js.map +1 -0
- package/dist/context-warnings.test.js +28 -0
- package/dist/context-warnings.test.js.map +1 -0
- package/dist/server/app.d.ts +143 -0
- package/dist/server/app.js +229 -0
- package/dist/server/app.js.map +1 -0
- package/dist/server/auth/discovery.d.ts +33 -0
- package/dist/server/auth/discovery.js +56 -0
- package/dist/server/auth/discovery.js.map +1 -0
- package/dist/server/auth/discovery.test.js +93 -0
- package/dist/server/auth/discovery.test.js.map +1 -0
- package/dist/server/auth/index.d.ts +30 -0
- package/dist/server/auth/index.js +2 -0
- package/dist/server/auth/index.js.map +1 -0
- package/dist/server/auth/providers/auth0.d.ts +40 -0
- package/dist/server/auth/providers/auth0.js +31 -0
- package/dist/server/auth/providers/auth0.js.map +1 -0
- package/dist/server/auth/providers/auth0.test.js +50 -0
- package/dist/server/auth/providers/auth0.test.js.map +1 -0
- package/dist/server/auth/providers/authplane.d.ts +49 -0
- package/dist/server/auth/providers/authplane.js +57 -0
- package/dist/server/auth/providers/authplane.js.map +1 -0
- package/dist/server/auth/providers/authplane.test.d.ts +1 -0
- package/dist/server/auth/providers/authplane.test.js +140 -0
- package/dist/server/auth/providers/authplane.test.js.map +1 -0
- package/dist/server/auth/providers/clerk.d.ts +51 -0
- package/dist/server/auth/providers/clerk.js +19 -0
- package/dist/server/auth/providers/clerk.js.map +1 -0
- package/dist/server/auth/providers/clerk.test.d.ts +1 -0
- package/dist/server/auth/providers/clerk.test.js +30 -0
- package/dist/server/auth/providers/clerk.test.js.map +1 -0
- package/dist/server/auth/providers/custom.d.ts +40 -0
- package/dist/server/auth/providers/custom.js +56 -0
- package/dist/server/auth/providers/custom.js.map +1 -0
- package/dist/server/auth/providers/custom.test.d.ts +1 -0
- package/dist/server/auth/providers/custom.test.js +158 -0
- package/dist/server/auth/providers/custom.test.js.map +1 -0
- package/dist/server/auth/providers/descope.d.ts +44 -0
- package/dist/server/auth/providers/descope.js +44 -0
- package/dist/server/auth/providers/descope.js.map +1 -0
- package/dist/server/auth/providers/descope.test.d.ts +1 -0
- package/dist/server/auth/providers/descope.test.js +62 -0
- package/dist/server/auth/providers/descope.test.js.map +1 -0
- package/dist/server/auth/providers/shared.d.ts +2 -0
- package/dist/server/auth/providers/shared.js +6 -0
- package/dist/server/auth/providers/shared.js.map +1 -0
- package/dist/server/auth/providers/shared.test.d.ts +1 -0
- package/dist/server/auth/providers/shared.test.js +10 -0
- package/dist/server/auth/providers/shared.test.js.map +1 -0
- package/dist/server/auth/providers/stytch.d.ts +25 -0
- package/dist/server/auth/providers/stytch.js +16 -0
- package/dist/server/auth/providers/stytch.js.map +1 -0
- package/dist/server/auth/providers/verify-spy.d.ts +12 -0
- package/dist/server/auth/providers/verify-spy.js +21 -0
- package/dist/server/auth/providers/verify-spy.js.map +1 -0
- package/dist/server/auth/providers/workos.d.ts +33 -0
- package/dist/server/auth/providers/workos.js +15 -0
- package/dist/server/auth/providers/workos.js.map +1 -0
- package/dist/server/auth/security-schemes.d.ts +23 -0
- package/dist/server/auth/security-schemes.js +64 -0
- package/dist/server/auth/security-schemes.js.map +1 -0
- package/dist/server/auth/security-schemes.test.d.ts +1 -0
- package/dist/server/auth/security-schemes.test.js +99 -0
- package/dist/server/auth/security-schemes.test.js.map +1 -0
- package/dist/server/auth/setup.d.ts +6 -0
- package/dist/server/auth/setup.js +91 -0
- package/dist/server/auth/setup.js.map +1 -0
- package/dist/server/auth/setup.test.d.ts +1 -0
- package/dist/server/auth/setup.test.js +512 -0
- package/dist/server/auth/setup.test.js.map +1 -0
- package/dist/server/auth/verify.d.ts +46 -0
- package/dist/server/auth/verify.js +62 -0
- package/dist/server/auth/verify.js.map +1 -0
- package/dist/server/auth/verify.test.d.ts +1 -0
- package/dist/server/auth/verify.test.js +149 -0
- package/dist/server/auth/verify.test.js.map +1 -0
- package/dist/server/auth-extra.test-d.js +71 -0
- package/dist/server/auth-extra.test-d.js.map +1 -0
- package/dist/server/auth.d.ts +42 -5
- package/dist/server/auth.js +3 -4
- package/dist/server/auth.js.map +1 -1
- package/dist/server/build-manifest.test.js +6 -5
- package/dist/server/build-manifest.test.js.map +1 -1
- package/dist/server/content-helpers.d.ts +1 -1
- package/dist/server/content-helpers.js.map +1 -1
- package/dist/server/express.d.ts +14 -3
- package/dist/server/express.js +20 -32
- package/dist/server/express.js.map +1 -1
- package/dist/server/express.test.js +130 -102
- package/dist/server/express.test.js.map +1 -1
- package/dist/server/host.d.ts +2 -0
- package/dist/server/host.js +11 -0
- package/dist/server/host.js.map +1 -0
- package/dist/server/host.test.d.ts +1 -0
- package/dist/server/host.test.js +13 -0
- package/dist/server/host.test.js.map +1 -0
- package/dist/server/index.d.ts +17 -3
- package/dist/server/index.js +13 -2
- package/dist/server/index.js.map +1 -1
- package/dist/server/mcp-errors.test.d.ts +1 -0
- package/dist/server/mcp-errors.test.js +37 -0
- package/dist/server/mcp-errors.test.js.map +1 -0
- package/dist/server/middleware.d.ts +35 -10
- package/dist/server/middleware.js +33 -0
- package/dist/server/middleware.js.map +1 -1
- package/dist/server/middleware.test-d.js +1 -1
- package/dist/server/middleware.test-d.js.map +1 -1
- package/dist/server/middleware.test.js +190 -131
- package/dist/server/middleware.test.js.map +1 -1
- package/dist/server/register-tool.test.d.ts +1 -0
- package/dist/server/register-tool.test.js +23 -0
- package/dist/server/register-tool.test.js.map +1 -0
- package/dist/server/requestOrigin.d.ts +7 -0
- package/dist/server/requestOrigin.js +25 -0
- package/dist/server/requestOrigin.js.map +1 -0
- package/dist/server/server.d.ts +167 -114
- package/dist/server/server.js +288 -350
- package/dist/server/server.js.map +1 -1
- package/dist/server/skills-integration.test.d.ts +1 -0
- package/dist/server/skills-integration.test.js +79 -0
- package/dist/server/skills-integration.test.js.map +1 -0
- package/dist/server/skills.d.ts +27 -0
- package/dist/server/skills.js +188 -0
- package/dist/server/skills.js.map +1 -0
- package/dist/server/skills.test.d.ts +1 -0
- package/dist/server/skills.test.js +243 -0
- package/dist/server/skills.test.js.map +1 -0
- package/dist/server/tool-extra.test.d.ts +1 -0
- package/dist/server/tool-extra.test.js +72 -0
- package/dist/server/tool-extra.test.js.map +1 -0
- package/dist/server/view-name.test-d.d.ts +1 -0
- package/dist/server/view-name.test-d.js +8 -0
- package/dist/server/view-name.test-d.js.map +1 -0
- package/dist/server/view-resource-resolution.test.js +101 -17
- package/dist/server/view-resource-resolution.test.js.map +1 -1
- package/dist/server/viewsDevServer.js +4 -1
- package/dist/server/viewsDevServer.js.map +1 -1
- package/dist/standard-schema.d.ts +3 -0
- package/dist/standard-schema.js +2 -0
- package/dist/standard-schema.js.map +1 -0
- package/dist/test/utils.d.ts +9 -11
- package/dist/test/utils.js +18 -13
- package/dist/test/utils.js.map +1 -1
- package/dist/test/view.test.js +88 -120
- package/dist/test/view.test.js.map +1 -1
- package/dist/views/index.d.ts +3 -0
- package/dist/views/index.js +3 -0
- package/dist/views/index.js.map +1 -0
- package/dist/{web/plugin → views}/scan-views.js +1 -1
- package/dist/views/scan-views.js.map +1 -0
- package/dist/views/scan-views.test.d.ts +1 -0
- package/dist/views/scan-views.test.js.map +1 -0
- package/dist/views/validate-view.d.ts +1 -0
- package/dist/{web/plugin → views}/validate-view.js +2 -2
- package/dist/views/validate-view.js.map +1 -0
- package/dist/views/validate-view.test.d.ts +1 -0
- package/dist/views/validate-view.test.js.map +1 -0
- package/dist/web/bridges/adaptor.d.ts +51 -0
- package/dist/web/bridges/adaptor.js +327 -0
- package/dist/web/bridges/adaptor.js.map +1 -0
- package/dist/web/bridges/adaptor.test.d.ts +1 -0
- package/dist/web/bridges/adaptor.test.js +225 -0
- package/dist/web/bridges/adaptor.test.js.map +1 -0
- package/dist/web/bridges/apps-sdk/bridge.d.ts +6 -2
- package/dist/web/bridges/apps-sdk/bridge.js +15 -4
- package/dist/web/bridges/apps-sdk/bridge.js.map +1 -1
- package/dist/web/bridges/apps-sdk/index.d.ts +0 -1
- package/dist/web/bridges/apps-sdk/index.js +0 -1
- package/dist/web/bridges/apps-sdk/index.js.map +1 -1
- package/dist/web/bridges/apps-sdk/use-apps-sdk-context.d.ts +1 -1
- package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js +1 -1
- package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js.map +1 -1
- package/dist/web/bridges/get-adaptor.d.ts +4 -4
- package/dist/web/bridges/get-adaptor.js +6 -11
- package/dist/web/bridges/get-adaptor.js.map +1 -1
- package/dist/web/bridges/get-adaptor.test.d.ts +1 -0
- package/dist/web/bridges/get-adaptor.test.js +32 -0
- package/dist/web/bridges/get-adaptor.test.js.map +1 -0
- package/dist/web/bridges/mcp-app/bridge.d.ts +13 -2
- package/dist/web/bridges/mcp-app/bridge.js +51 -7
- package/dist/web/bridges/mcp-app/bridge.js.map +1 -1
- package/dist/web/bridges/mcp-app/bridge.test.d.ts +1 -0
- package/dist/web/bridges/mcp-app/bridge.test.js +17 -0
- package/dist/web/bridges/mcp-app/bridge.test.js.map +1 -0
- package/dist/web/bridges/mcp-app/index.d.ts +0 -1
- package/dist/web/bridges/mcp-app/index.js +0 -1
- package/dist/web/bridges/mcp-app/index.js.map +1 -1
- package/dist/web/bridges/mcp-app/types.d.ts +2 -0
- package/dist/web/bridges/mcp-app/types.js.map +1 -1
- package/dist/web/bridges/mcp-app/use-mcp-app-context.d.ts +1 -1
- package/dist/web/bridges/mcp-app/use-mcp-app-context.js +1 -1
- package/dist/web/bridges/mcp-app/use-mcp-app-context.js.map +1 -1
- package/dist/web/bridges/mcp-app/view-tools.test.js +5 -6
- package/dist/web/bridges/mcp-app/view-tools.test.js.map +1 -1
- package/dist/web/bridges/types.d.ts +27 -9
- package/dist/web/bridges/types.js +14 -1
- package/dist/web/bridges/types.js.map +1 -1
- package/dist/web/bridges/types.test.d.ts +1 -0
- package/dist/web/bridges/types.test.js +19 -0
- package/dist/web/bridges/types.test.js.map +1 -0
- package/dist/web/components/modal-provider.d.ts +1 -1
- package/dist/web/components/modal-provider.js +4 -3
- package/dist/web/components/modal-provider.js.map +1 -1
- package/dist/web/create-store.test.js +9 -6
- package/dist/web/create-store.test.js.map +1 -1
- package/dist/web/data-llm.d.ts +1 -1
- package/dist/web/data-llm.test.js +19 -6
- package/dist/web/data-llm.test.js.map +1 -1
- package/dist/web/generate-helpers.d.ts +13 -12
- package/dist/web/generate-helpers.js +10 -9
- package/dist/web/generate-helpers.js.map +1 -1
- package/dist/web/generate-helpers.test-d.js +3 -3
- package/dist/web/generate-helpers.test-d.js.map +1 -1
- package/dist/web/generate-helpers.test.js +2 -2
- package/dist/web/generate-helpers.test.js.map +1 -1
- package/dist/web/hooks/index.d.ts +2 -1
- package/dist/web/hooks/index.js +2 -1
- package/dist/web/hooks/index.js.map +1 -1
- package/dist/web/hooks/test/utils.d.ts +2 -1
- package/dist/web/hooks/test/utils.js +1 -1
- package/dist/web/hooks/test/utils.js.map +1 -1
- package/dist/web/hooks/use-call-tool.test.js +39 -25
- package/dist/web/hooks/use-call-tool.test.js.map +1 -1
- package/dist/web/hooks/use-display-mode.d.ts +1 -1
- package/dist/web/hooks/use-display-mode.js +1 -1
- package/dist/web/hooks/use-display-mode.js.map +1 -1
- package/dist/web/hooks/use-display-mode.test.js +57 -21
- package/dist/web/hooks/use-display-mode.test.js.map +1 -1
- package/dist/web/hooks/use-download.d.ts +1 -3
- package/dist/web/hooks/use-download.js +1 -2
- package/dist/web/hooks/use-download.js.map +1 -1
- package/dist/web/hooks/use-download.test.js +16 -8
- package/dist/web/hooks/use-download.test.js.map +1 -1
- package/dist/web/hooks/use-files.test.js +11 -3
- package/dist/web/hooks/use-files.test.js.map +1 -1
- package/dist/web/hooks/use-host.d.ts +22 -0
- package/dist/web/hooks/use-host.js +30 -0
- package/dist/web/hooks/use-host.js.map +1 -0
- package/dist/web/hooks/use-host.test.d.ts +1 -0
- package/dist/web/hooks/use-host.test.js +59 -0
- package/dist/web/hooks/use-host.test.js.map +1 -0
- package/dist/web/hooks/use-open-external.test.js +14 -4
- package/dist/web/hooks/use-open-external.test.js.map +1 -1
- package/dist/web/hooks/use-register-view-tool.d.ts +2 -3
- package/dist/web/hooks/use-register-view-tool.js.map +1 -1
- package/dist/web/hooks/use-request-close.test.js +35 -40
- package/dist/web/hooks/use-request-close.test.js.map +1 -1
- package/dist/web/hooks/use-request-modal.test.js +11 -1
- package/dist/web/hooks/use-request-modal.test.js.map +1 -1
- package/dist/web/hooks/use-request-size.d.ts +1 -1
- package/dist/web/hooks/use-request-size.js +1 -1
- package/dist/web/hooks/use-request-size.js.map +1 -1
- package/dist/web/hooks/use-request-size.test.js +35 -53
- package/dist/web/hooks/use-request-size.test.js.map +1 -1
- package/dist/web/hooks/use-set-open-in-app-url.test.js +29 -9
- package/dist/web/hooks/use-set-open-in-app-url.test.js.map +1 -1
- package/dist/web/hooks/use-tool-info.d.ts +1 -20
- package/dist/web/hooks/use-tool-info.js +0 -1
- package/dist/web/hooks/use-tool-info.js.map +1 -1
- package/dist/web/hooks/use-tool-info.test-d.js +0 -5
- package/dist/web/hooks/use-tool-info.test-d.js.map +1 -1
- package/dist/web/hooks/use-tool-info.test.js +37 -32
- package/dist/web/hooks/use-tool-info.test.js.map +1 -1
- package/dist/web/hooks/use-user.d.ts +3 -2
- package/dist/web/hooks/use-user.js +4 -3
- package/dist/web/hooks/use-user.js.map +1 -1
- package/dist/web/hooks/use-user.test.js +84 -36
- package/dist/web/hooks/use-user.test.js.map +1 -1
- package/dist/web/hooks/use-view-state.js +19 -9
- package/dist/web/hooks/use-view-state.js.map +1 -1
- package/dist/web/hooks/use-view-state.test.js +38 -3
- package/dist/web/hooks/use-view-state.test.js.map +1 -1
- package/dist/web/hooks/use-viewport.d.ts +20 -0
- package/dist/web/hooks/use-viewport.js +21 -0
- package/dist/web/hooks/use-viewport.js.map +1 -0
- package/dist/web/hooks/use-viewport.test.d.ts +1 -0
- package/dist/web/hooks/use-viewport.test.js +109 -0
- package/dist/web/hooks/use-viewport.test.js.map +1 -0
- package/dist/web/index.d.ts +1 -0
- package/dist/web/index.js.map +1 -1
- package/dist/web/mount-view.d.ts +3 -2
- package/dist/web/mount-view.js +3 -2
- package/dist/web/mount-view.js.map +1 -1
- package/package.json +30 -26
- package/dist/cli/resolve-views-dir.d.ts +0 -1
- package/dist/cli/resolve-views-dir.js.map +0 -1
- package/dist/web/bridges/apps-sdk/adaptor.d.ts +0 -29
- package/dist/web/bridges/apps-sdk/adaptor.js +0 -117
- package/dist/web/bridges/apps-sdk/adaptor.js.map +0 -1
- package/dist/web/bridges/mcp-app/adaptor.d.ts +0 -53
- package/dist/web/bridges/mcp-app/adaptor.js +0 -283
- package/dist/web/bridges/mcp-app/adaptor.js.map +0 -1
- package/dist/web/hooks/use-layout.d.ts +0 -24
- package/dist/web/hooks/use-layout.js +0 -25
- package/dist/web/hooks/use-layout.js.map +0 -1
- package/dist/web/hooks/use-layout.test.js +0 -96
- package/dist/web/hooks/use-layout.test.js.map +0 -1
- package/dist/web/plugin/data-llm.test.js +0 -81
- package/dist/web/plugin/data-llm.test.js.map +0 -1
- package/dist/web/plugin/plugin.d.ts +0 -33
- package/dist/web/plugin/plugin.js +0 -189
- package/dist/web/plugin/plugin.js.map +0 -1
- package/dist/web/plugin/scan-views.js.map +0 -1
- package/dist/web/plugin/scan-views.test.js.map +0 -1
- package/dist/web/plugin/transform-data-llm.d.ts +0 -12
- package/dist/web/plugin/transform-data-llm.js +0 -96
- package/dist/web/plugin/transform-data-llm.js.map +0 -1
- package/dist/web/plugin/transform-data-llm.test.js +0 -81
- package/dist/web/plugin/transform-data-llm.test.js.map +0 -1
- package/dist/web/plugin/validate-view.d.ts +0 -1
- package/dist/web/plugin/validate-view.js.map +0 -1
- package/dist/web/plugin/validate-view.test.js.map +0 -1
- /package/dist/{web/hooks/use-layout.test.d.ts → cli/build-steps.test.d.ts} +0 -0
- /package/dist/{web/plugin/data-llm.test.d.ts → context-warnings.test.d.ts} +0 -0
- /package/dist/{web/plugin/transform-data-llm.test.d.ts → server/auth/discovery.test.d.ts} +0 -0
- /package/dist/{web/plugin/validate-view.test.d.ts → server/auth/providers/auth0.test.d.ts} +0 -0
- /package/dist/{web/plugin/scan-views.test.d.ts → server/auth-extra.test-d.d.ts} +0 -0
- /package/dist/{web/plugin → views}/scan-views.d.ts +0 -0
- /package/dist/{web/plugin → views}/scan-views.test.js +0 -0
- /package/dist/{web/plugin → views}/validate-view.test.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.test-d.js","sourceRoot":"","sources":["../../src/server/middleware.test-d.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAQ5C,MAAM,MAAM,GAAG,IAA4B,CAAC;AAE5C,IAAI,CAAC,kDAAkD,EAAE,GAAG,EAAE;IAC5D,MAAM,CAAC,aAAa,CAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAC9D,YAAY,CAAC,KAAK,CAAC,CAAC,aAAa,EAAY,CAAC;QAC9C,KAAK,CAAC,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"middleware.test-d.js","sourceRoot":"","sources":["../../src/server/middleware.test-d.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n CallToolResult,\n ListToolsResult,\n ServerResult,\n} from \"@modelcontextprotocol/server\";\nimport { expectTypeOf, test } from \"vitest\";\nimport type {\n McpExtra,\n McpResultFor,\n McpTypedMiddlewareFn,\n} from \"./middleware.js\";\nimport type { McpServer } from \"./server.js\";\n\nconst server = null as unknown as McpServer;\n\ntest(\"request category narrows extra and next() result\", () => {\n server.mcpMiddleware(\"request\", async (_request, extra, next) => {\n expectTypeOf(extra).toEqualTypeOf<McpExtra>();\n extra.mcpReq.signal;\n const result = await next();\n expectTypeOf(result).toEqualTypeOf<ServerResult>();\n return result;\n });\n});\n\ntest(\"notification category narrows extra and next() result\", () => {\n server.mcpMiddleware(\"notification\", async (_request, extra, next) => {\n expectTypeOf(extra).toEqualTypeOf<undefined>();\n // @ts-expect-error extra is undefined, cannot access .signal\n extra.signal;\n const result = await next();\n expectTypeOf(result).toEqualTypeOf<undefined>();\n });\n});\n\ntest(\"exact method tools/call narrows params, extra, and next() result\", () => {\n server.mcpMiddleware(\"tools/call\", async (request, extra, next) => {\n expectTypeOf(request.params.name).toBeString();\n expectTypeOf(extra).toEqualTypeOf<McpExtra>();\n const result = await next();\n expectTypeOf(result).toEqualTypeOf<CallToolResult>();\n return result;\n });\n});\n\ntest(\"exact method tools/list narrows next() to ListToolsResult\", () => {\n server.mcpMiddleware(\"tools/list\", async (_request, _extra, next) => {\n const result = await next();\n expectTypeOf(result).toEqualTypeOf<ListToolsResult>();\n return result;\n });\n});\n\ntest(\"exact notification method narrows extra and next() result\", () => {\n server.mcpMiddleware(\n \"notifications/initialized\",\n async (_request, extra, next) => {\n expectTypeOf(extra).toEqualTypeOf<undefined>();\n // @ts-expect-error extra is undefined\n extra.signal;\n const result = await next();\n expectTypeOf(result).toEqualTypeOf<undefined>();\n },\n );\n});\n\ntest(\"McpTypedMiddlewareFn narrows params, extra, and next() per method\", () => {\n expectTypeOf<\n Parameters<McpTypedMiddlewareFn<\"tools/call\">>[0][\"params\"][\"name\"]\n >().toBeString();\n expectTypeOf<\n Parameters<McpTypedMiddlewareFn<\"tools/call\">>[1]\n >().toEqualTypeOf<McpExtra>();\n expectTypeOf<\n Parameters<McpTypedMiddlewareFn<\"notifications/initialized\">>[1]\n >().toEqualTypeOf<undefined>();\n expectTypeOf<\n ReturnType<Parameters<McpTypedMiddlewareFn<\"tools/list\">>[2]>\n >().toEqualTypeOf<Promise<ListToolsResult>>();\n expectTypeOf<\n ReturnType<Parameters<McpTypedMiddlewareFn<\"notifications/initialized\">>[2]>\n >().toEqualTypeOf<Promise<undefined>>();\n});\n\ntest(\"McpResultFor maps methods to correct result types\", () => {\n expectTypeOf<McpResultFor<\"tools/list\">>().toEqualTypeOf<ListToolsResult>();\n expectTypeOf<McpResultFor<\"tools/call\">>().toEqualTypeOf<CallToolResult>();\n expectTypeOf<\n McpResultFor<\"notifications/initialized\">\n >().toEqualTypeOf<undefined>();\n});\n\ntest(\"wildcard tools/* narrows next() to union of tools result types\", () => {\n server.mcpMiddleware(\"tools/*\", async (_request, _extra, next) => {\n const result = await next();\n expectTypeOf(result).toEqualTypeOf<ListToolsResult | CallToolResult>();\n return result;\n });\n});\n\ntest(\"McpResultFor resolves wildcards to union of matching result types\", () => {\n expectTypeOf<McpResultFor<\"tools/*\">>().toEqualTypeOf<\n ListToolsResult | CallToolResult\n >();\n});\n\ntest(\"catch-all middleware has no narrowing on extra or params\", () => {\n server.mcpMiddleware((_request, extra, next) => {\n expectTypeOf(extra).toEqualTypeOf<McpExtra | undefined>();\n expectTypeOf(_request.params).toEqualTypeOf<Record<string, unknown>>();\n return next();\n });\n});\n"]}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import { Client } from "@modelcontextprotocol/
|
|
2
|
-
import { InMemoryTransport } from "@modelcontextprotocol/sdk/inMemory.js";
|
|
1
|
+
import { Client, InMemoryTransport } from "@modelcontextprotocol/client";
|
|
3
2
|
import { describe, expect, it, vi } from "vitest";
|
|
4
3
|
import { z } from "zod";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
4
|
+
import { Skybridge } from "./app.js";
|
|
5
|
+
import { buildMiddlewareChain, getHandlerMaps, getToolError, matchesFilter, } from "./middleware.js";
|
|
7
6
|
// ---------------------------------------------------------------------------
|
|
8
7
|
// matchesFilter
|
|
9
8
|
// ---------------------------------------------------------------------------
|
|
@@ -208,29 +207,34 @@ describe("McpServer.mcpMiddleware()", () => {
|
|
|
208
207
|
return new Client({ name: "test-client", version: "1.0.0" });
|
|
209
208
|
}
|
|
210
209
|
it("returns this for chaining", () => {
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
210
|
+
new Skybridge({ name: "test", version: "1.0.0" }, (server) => {
|
|
211
|
+
const result = server.mcpMiddleware(async (_req, _extra, next) => next());
|
|
212
|
+
expect(result).toBe(server);
|
|
213
|
+
return server;
|
|
214
|
+
});
|
|
214
215
|
});
|
|
215
216
|
it("intercepts tools/call and exposes request params", async () => {
|
|
216
217
|
let capturedMethod = "";
|
|
217
218
|
let capturedParams = {};
|
|
218
|
-
const
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
219
|
+
const app = new Skybridge({ name: "test", version: "1.0.0" }, (server) => {
|
|
220
|
+
server.registerTool({
|
|
221
|
+
name: "greet",
|
|
222
|
+
description: "greet",
|
|
223
|
+
inputSchema: { name: z.string() },
|
|
224
|
+
}, (args) => ({
|
|
225
|
+
content: [{ type: "text", text: `hi ${args.name}` }],
|
|
226
|
+
}));
|
|
227
|
+
server.mcpMiddleware("tools/call", async (request, _extra, next) => {
|
|
228
|
+
capturedMethod = request.method;
|
|
229
|
+
capturedParams = request.params;
|
|
230
|
+
return next();
|
|
231
|
+
});
|
|
232
|
+
return server;
|
|
230
233
|
});
|
|
231
234
|
const client = createClient();
|
|
232
235
|
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
|
|
233
|
-
|
|
236
|
+
const instance = app.createServerInstance();
|
|
237
|
+
await instance.connect(serverTransport);
|
|
234
238
|
await client.connect(clientTransport);
|
|
235
239
|
const result = await client.callTool({
|
|
236
240
|
name: "greet",
|
|
@@ -243,59 +247,57 @@ describe("McpServer.mcpMiddleware()", () => {
|
|
|
243
247
|
});
|
|
244
248
|
expect(result.content).toEqual([{ type: "text", text: "hi World" }]);
|
|
245
249
|
await client.close();
|
|
246
|
-
await
|
|
250
|
+
await instance.close();
|
|
247
251
|
});
|
|
248
252
|
it("array filter works", async () => {
|
|
249
253
|
const matchedMethods = [];
|
|
250
|
-
const
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
254
|
+
const app = new Skybridge({ name: "test", version: "1.0.0" }, (server) => {
|
|
255
|
+
server.registerTool({ name: "t1", description: "t1" }, () => ({
|
|
256
|
+
content: [{ type: "text", text: "ok" }],
|
|
257
|
+
}));
|
|
258
|
+
server.mcpMiddleware(["tools/call", "tools/list"], async (request, _extra, next) => {
|
|
259
|
+
matchedMethods.push(request.method);
|
|
260
|
+
return next();
|
|
261
|
+
});
|
|
262
|
+
return server;
|
|
257
263
|
});
|
|
258
264
|
const client = createClient();
|
|
259
265
|
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
|
|
260
|
-
|
|
266
|
+
const instance = app.createServerInstance();
|
|
267
|
+
await instance.connect(serverTransport);
|
|
261
268
|
await client.connect(clientTransport);
|
|
262
269
|
await client.listTools();
|
|
263
270
|
await client.callTool({ name: "t1" });
|
|
264
271
|
expect(matchedMethods).toEqual(["tools/list", "tools/call"]);
|
|
265
272
|
await client.close();
|
|
266
|
-
await
|
|
267
|
-
});
|
|
268
|
-
it("throws if registered after connect()", async () => {
|
|
269
|
-
const server = new McpServer({ name: "test", version: "1.0.0" });
|
|
270
|
-
const [_clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
|
|
271
|
-
await server.connect(serverTransport);
|
|
272
|
-
expect(() => server.mcpMiddleware(async (_req, _extra, next) => next())).toThrow("Cannot register MCP middleware after run() or connect()");
|
|
273
|
-
await server.close();
|
|
273
|
+
await instance.close();
|
|
274
274
|
});
|
|
275
275
|
it("throws when filter provided without handler", () => {
|
|
276
|
-
|
|
277
|
-
expect(() =>
|
|
276
|
+
expect(() => new Skybridge({ name: "test", version: "1.0.0" }, (server) =>
|
|
278
277
|
// @ts-expect-error intentionally passing filter without handler
|
|
279
|
-
server.mcpMiddleware("tools/call")).toThrow("mcpMiddleware requires a handler function");
|
|
278
|
+
server.mcpMiddleware("tools/call"))).toThrow("mcpMiddleware requires a handler function");
|
|
280
279
|
});
|
|
281
280
|
it("catch-all middleware + filtered middleware stack correctly", async () => {
|
|
282
281
|
const calls = [];
|
|
283
|
-
const
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
282
|
+
const app = new Skybridge({ name: "test", version: "1.0.0" }, (server) => {
|
|
283
|
+
server.registerTool({ name: "t1", description: "t1" }, () => ({
|
|
284
|
+
content: [{ type: "text", text: "ok" }],
|
|
285
|
+
}));
|
|
286
|
+
server
|
|
287
|
+
.mcpMiddleware(async (request, _extra, next) => {
|
|
288
|
+
calls.push(`global:${request.method}`);
|
|
289
|
+
return next();
|
|
290
|
+
})
|
|
291
|
+
.mcpMiddleware("tools/call", async (_req, _extra, next) => {
|
|
292
|
+
calls.push("tools-only");
|
|
293
|
+
return next();
|
|
294
|
+
});
|
|
295
|
+
return server;
|
|
295
296
|
});
|
|
296
297
|
const client = createClient();
|
|
297
298
|
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
|
|
298
|
-
|
|
299
|
+
const instance = app.createServerInstance();
|
|
300
|
+
await instance.connect(serverTransport);
|
|
299
301
|
await client.connect(clientTransport);
|
|
300
302
|
await client.listTools();
|
|
301
303
|
await client.callTool({ name: "t1" });
|
|
@@ -309,41 +311,47 @@ describe("McpServer.mcpMiddleware()", () => {
|
|
|
309
311
|
const toolsCallIdx = calls.indexOf("global:tools/call");
|
|
310
312
|
expect(calls[toolsCallIdx + 1]).toBe("tools-only");
|
|
311
313
|
await client.close();
|
|
312
|
-
await
|
|
314
|
+
await instance.close();
|
|
313
315
|
});
|
|
314
316
|
it("notification middleware receives extra as undefined", async () => {
|
|
315
317
|
let capturedExtra = "sentinel";
|
|
316
|
-
const
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
318
|
+
const app = new Skybridge({ name: "test", version: "1.0.0" }, (server) => {
|
|
319
|
+
server.registerTool({ name: "t1", description: "t1" }, () => ({
|
|
320
|
+
content: [{ type: "text", text: "ok" }],
|
|
321
|
+
}));
|
|
322
|
+
server.mcpMiddleware("notification", async (_request, extra, next) => {
|
|
323
|
+
capturedExtra = extra;
|
|
324
|
+
return next();
|
|
325
|
+
});
|
|
326
|
+
return server;
|
|
323
327
|
});
|
|
324
328
|
const client = createClient();
|
|
325
329
|
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
|
|
326
|
-
|
|
330
|
+
const instance = app.createServerInstance();
|
|
331
|
+
await instance.connect(serverTransport);
|
|
327
332
|
await client.connect(clientTransport);
|
|
328
333
|
// The client sends notifications/initialized automatically on connect.
|
|
329
334
|
await client.listTools();
|
|
330
335
|
expect(capturedExtra).toBeUndefined();
|
|
331
336
|
await client.close();
|
|
332
|
-
await
|
|
337
|
+
await instance.close();
|
|
333
338
|
});
|
|
334
339
|
it("wildcard filter intercepts matching methods only", async () => {
|
|
335
340
|
const matchedMethods = [];
|
|
336
|
-
const
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
341
|
+
const app = new Skybridge({ name: "test", version: "1.0.0" }, (server) => {
|
|
342
|
+
server.registerTool({ name: "t1", description: "t1" }, () => ({
|
|
343
|
+
content: [{ type: "text", text: "ok" }],
|
|
344
|
+
}));
|
|
345
|
+
server.mcpMiddleware("tools/*", async (request, _extra, next) => {
|
|
346
|
+
matchedMethods.push(request.method);
|
|
347
|
+
return next();
|
|
348
|
+
});
|
|
349
|
+
return server;
|
|
343
350
|
});
|
|
344
351
|
const client = createClient();
|
|
345
352
|
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
|
|
346
|
-
|
|
353
|
+
const instance = app.createServerInstance();
|
|
354
|
+
await instance.connect(serverTransport);
|
|
347
355
|
await client.connect(clientTransport);
|
|
348
356
|
await client.listTools();
|
|
349
357
|
await client.callTool({ name: "t1" });
|
|
@@ -353,30 +361,33 @@ describe("McpServer.mcpMiddleware()", () => {
|
|
|
353
361
|
expect(matchedMethods).not.toContain("initialize");
|
|
354
362
|
expect(matchedMethods).not.toContain("notifications/initialized");
|
|
355
363
|
await client.close();
|
|
356
|
-
await
|
|
357
|
-
});
|
|
358
|
-
it("middleware can modify tool result via
|
|
359
|
-
const
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
364
|
+
await instance.close();
|
|
365
|
+
});
|
|
366
|
+
it("middleware can modify tool result via Skybridge integration", async () => {
|
|
367
|
+
const app = new Skybridge({ name: "test", version: "1.0.0" }, (server) => {
|
|
368
|
+
server.registerTool({
|
|
369
|
+
name: "greet",
|
|
370
|
+
description: "greet",
|
|
371
|
+
inputSchema: { name: z.string() },
|
|
372
|
+
}, (args) => ({
|
|
373
|
+
content: [{ type: "text", text: `hi ${args.name}` }],
|
|
374
|
+
}));
|
|
375
|
+
server.mcpMiddleware("tools/call", async (_req, _extra, next) => {
|
|
376
|
+
const result = (await next());
|
|
377
|
+
return {
|
|
378
|
+
...result,
|
|
379
|
+
content: [
|
|
380
|
+
...result.content,
|
|
381
|
+
{ type: "text", text: " (modified)" },
|
|
382
|
+
],
|
|
383
|
+
};
|
|
384
|
+
});
|
|
385
|
+
return server;
|
|
376
386
|
});
|
|
377
387
|
const client = createClient();
|
|
378
388
|
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
|
|
379
|
-
|
|
389
|
+
const instance = app.createServerInstance();
|
|
390
|
+
await instance.connect(serverTransport);
|
|
380
391
|
await client.connect(clientTransport);
|
|
381
392
|
const result = await client.callTool({
|
|
382
393
|
name: "greet",
|
|
@@ -387,50 +398,95 @@ describe("McpServer.mcpMiddleware()", () => {
|
|
|
387
398
|
{ type: "text", text: " (modified)" },
|
|
388
399
|
]);
|
|
389
400
|
await client.close();
|
|
390
|
-
await
|
|
401
|
+
await instance.close();
|
|
391
402
|
});
|
|
392
|
-
it("middleware can short-circuit via
|
|
403
|
+
it("middleware can short-circuit via Skybridge integration", async () => {
|
|
393
404
|
const handlerCalled = vi.fn();
|
|
394
|
-
const
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
405
|
+
const app = new Skybridge({ name: "test", version: "1.0.0" }, (server) => {
|
|
406
|
+
server.registerTool({ name: "t1", description: "t1" }, () => {
|
|
407
|
+
handlerCalled();
|
|
408
|
+
return {
|
|
409
|
+
content: [{ type: "text", text: "original" }],
|
|
410
|
+
};
|
|
411
|
+
});
|
|
412
|
+
server.mcpMiddleware("tools/call", async () => ({
|
|
413
|
+
content: [{ type: "text", text: "short-circuited" }],
|
|
414
|
+
}));
|
|
415
|
+
return server;
|
|
400
416
|
});
|
|
401
|
-
server.mcpMiddleware("tools/call", async () => ({
|
|
402
|
-
content: [{ type: "text", text: "short-circuited" }],
|
|
403
|
-
}));
|
|
404
417
|
const client = createClient();
|
|
405
418
|
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
|
|
406
|
-
|
|
419
|
+
const instance = app.createServerInstance();
|
|
420
|
+
await instance.connect(serverTransport);
|
|
407
421
|
await client.connect(clientTransport);
|
|
408
422
|
const result = await client.callTool({ name: "t1" });
|
|
409
423
|
expect(result.content).toEqual([{ type: "text", text: "short-circuited" }]);
|
|
410
424
|
expect(handlerCalled).not.toHaveBeenCalled();
|
|
411
425
|
await client.close();
|
|
412
|
-
await
|
|
426
|
+
await instance.close();
|
|
427
|
+
});
|
|
428
|
+
it("exposes a thrown tool error to middleware via getToolError", async () => {
|
|
429
|
+
const schemaError = new Error("boom with schema");
|
|
430
|
+
const schemalessError = new Error("boom without schema");
|
|
431
|
+
let captured;
|
|
432
|
+
const app = new Skybridge({ name: "test", version: "1.0.0" }, (server) => {
|
|
433
|
+
server.registerTool({
|
|
434
|
+
name: "withSchema",
|
|
435
|
+
description: "withSchema",
|
|
436
|
+
inputSchema: { name: z.string() },
|
|
437
|
+
}, () => {
|
|
438
|
+
throw schemaError;
|
|
439
|
+
});
|
|
440
|
+
server.registerTool({ name: "withoutSchema", description: "withoutSchema" }, () => {
|
|
441
|
+
throw schemalessError;
|
|
442
|
+
});
|
|
443
|
+
server.mcpMiddleware("tools/call", async (_request, extra, next) => {
|
|
444
|
+
const result = await next();
|
|
445
|
+
captured = getToolError(extra);
|
|
446
|
+
return result;
|
|
447
|
+
});
|
|
448
|
+
return server;
|
|
449
|
+
});
|
|
450
|
+
const client = createClient();
|
|
451
|
+
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
|
|
452
|
+
const instance = app.createServerInstance();
|
|
453
|
+
await instance.connect(serverTransport);
|
|
454
|
+
await client.connect(clientTransport);
|
|
455
|
+
const withSchema = await client.callTool({
|
|
456
|
+
name: "withSchema",
|
|
457
|
+
arguments: { name: "World" },
|
|
458
|
+
});
|
|
459
|
+
expect(withSchema.isError).toBe(true);
|
|
460
|
+
expect(captured).toBe(schemaError);
|
|
461
|
+
const withoutSchema = await client.callTool({ name: "withoutSchema" });
|
|
462
|
+
expect(withoutSchema.isError).toBe(true);
|
|
463
|
+
expect(captured).toBe(schemalessError);
|
|
464
|
+
await client.close();
|
|
465
|
+
await instance.close();
|
|
413
466
|
});
|
|
414
|
-
it("middleware can mutate tool call params via
|
|
467
|
+
it("middleware can mutate tool call params via Skybridge integration", async () => {
|
|
415
468
|
let receivedName = "";
|
|
416
|
-
const
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
469
|
+
const app = new Skybridge({ name: "test", version: "1.0.0" }, (server) => {
|
|
470
|
+
server.registerTool({
|
|
471
|
+
name: "greet",
|
|
472
|
+
description: "greet",
|
|
473
|
+
inputSchema: { name: z.string() },
|
|
474
|
+
}, (args) => {
|
|
475
|
+
receivedName = args.name;
|
|
476
|
+
return {
|
|
477
|
+
content: [{ type: "text", text: `hi ${args.name}` }],
|
|
478
|
+
};
|
|
479
|
+
});
|
|
480
|
+
server.mcpMiddleware("tools/call", async (request, _extra, next) => {
|
|
481
|
+
request.params.arguments = { name: "Overridden" };
|
|
482
|
+
return next();
|
|
483
|
+
});
|
|
484
|
+
return server;
|
|
430
485
|
});
|
|
431
486
|
const client = createClient();
|
|
432
487
|
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
|
|
433
|
-
|
|
488
|
+
const instance = app.createServerInstance();
|
|
489
|
+
await instance.connect(serverTransport);
|
|
434
490
|
await client.connect(clientTransport);
|
|
435
491
|
await client.callTool({
|
|
436
492
|
name: "greet",
|
|
@@ -438,21 +494,24 @@ describe("McpServer.mcpMiddleware()", () => {
|
|
|
438
494
|
});
|
|
439
495
|
expect(receivedName).toBe("Overridden");
|
|
440
496
|
await client.close();
|
|
441
|
-
await
|
|
497
|
+
await instance.close();
|
|
442
498
|
});
|
|
443
499
|
it("category 'request' filter matches requests but not notifications", async () => {
|
|
444
500
|
const matchedMethods = [];
|
|
445
|
-
const
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
501
|
+
const app = new Skybridge({ name: "test", version: "1.0.0" }, (server) => {
|
|
502
|
+
server.registerTool({ name: "t1", description: "t1" }, () => ({
|
|
503
|
+
content: [{ type: "text", text: "ok" }],
|
|
504
|
+
}));
|
|
505
|
+
server.mcpMiddleware("request", async (request, _extra, next) => {
|
|
506
|
+
matchedMethods.push(request.method);
|
|
507
|
+
return next();
|
|
508
|
+
});
|
|
509
|
+
return server;
|
|
452
510
|
});
|
|
453
511
|
const client = createClient();
|
|
454
512
|
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
|
|
455
|
-
|
|
513
|
+
const instance = app.createServerInstance();
|
|
514
|
+
await instance.connect(serverTransport);
|
|
456
515
|
await client.connect(clientTransport);
|
|
457
516
|
await client.listTools();
|
|
458
517
|
await client.callTool({ name: "t1" });
|
|
@@ -460,7 +519,7 @@ describe("McpServer.mcpMiddleware()", () => {
|
|
|
460
519
|
expect(matchedMethods).toContain("tools/call");
|
|
461
520
|
expect(matchedMethods).not.toContain("notifications/initialized");
|
|
462
521
|
await client.close();
|
|
463
|
-
await
|
|
522
|
+
await instance.close();
|
|
464
523
|
});
|
|
465
524
|
});
|
|
466
525
|
// ---------------------------------------------------------------------------
|