skybridge 0.0.0-dev.81fd90a → 0.0.0-dev.8226541
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 +14 -14
- package/dist/cli/build-helpers.d.ts +1 -1
- package/dist/cli/build-helpers.js +4 -4
- package/dist/cli/build-helpers.js.map +1 -1
- package/dist/cli/build-helpers.test.js +2 -2
- package/dist/cli/build-helpers.test.js.map +1 -1
- package/dist/cli/build-steps.js +1 -1
- package/dist/cli/build-steps.js.map +1 -1
- package/dist/cli/build-steps.test.js +3 -3
- package/dist/cli/build-steps.test.js.map +1 -1
- package/dist/cli/detect-port.js +0 -1
- package/dist/cli/detect-port.js.map +1 -1
- package/dist/cli/run-plain.js +2 -1
- package/dist/cli/run-plain.js.map +1 -1
- package/dist/cli/telemetry.js +2 -0
- package/dist/cli/telemetry.js.map +1 -1
- package/dist/cli/use-nodemon.d.ts +11 -1
- package/dist/cli/use-nodemon.js +30 -8
- package/dist/cli/use-nodemon.js.map +1 -1
- package/dist/cli/use-typescript-check.js +1 -1
- package/dist/cli/use-typescript-check.js.map +1 -1
- package/dist/commands/dev.js +4 -4
- 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/server/app.d.ts +194 -0
- package/dist/server/app.js +266 -0
- package/dist/server/app.js.map +1 -0
- package/dist/server/app.test.js +97 -0
- package/dist/server/app.test.js.map +1 -0
- package/dist/server/auth/discovery.d.ts +1 -1
- package/dist/server/auth/discovery.js +1 -1
- package/dist/server/auth/discovery.js.map +1 -1
- package/dist/server/auth/index.d.ts +19 -1
- package/dist/server/auth/index.js.map +1 -1
- package/dist/server/auth/providers/auth0.d.ts +2 -2
- package/dist/server/auth/providers/auth0.js +13 -8
- package/dist/server/auth/providers/auth0.js.map +1 -1
- package/dist/server/auth/providers/auth0.test.js +1 -1
- package/dist/server/auth/providers/auth0.test.js.map +1 -1
- package/dist/server/auth/providers/authplane.d.ts +2 -2
- package/dist/server/auth/providers/authplane.js.map +1 -1
- package/dist/server/auth/providers/authplane.test.js +10 -7
- package/dist/server/auth/providers/authplane.test.js.map +1 -1
- package/dist/server/auth/providers/clerk.d.ts +2 -2
- package/dist/server/auth/providers/clerk.js.map +1 -1
- package/dist/server/auth/providers/clerk.test.js +1 -1
- package/dist/server/auth/providers/clerk.test.js.map +1 -1
- package/dist/server/auth/providers/custom.d.ts +7 -5
- package/dist/server/auth/providers/custom.js +5 -2
- package/dist/server/auth/providers/custom.js.map +1 -1
- package/dist/server/auth/providers/custom.test.js +13 -10
- package/dist/server/auth/providers/custom.test.js.map +1 -1
- package/dist/server/auth/providers/descope.d.ts +2 -2
- package/dist/server/auth/providers/descope.js.map +1 -1
- package/dist/server/auth/providers/descope.test.js +3 -3
- package/dist/server/auth/providers/descope.test.js.map +1 -1
- package/dist/server/auth/providers/stytch.d.ts +2 -2
- package/dist/server/auth/providers/stytch.js.map +1 -1
- package/dist/server/auth/providers/workos.d.ts +5 -4
- package/dist/server/auth/providers/workos.js +2 -1
- package/dist/server/auth/providers/workos.js.map +1 -1
- package/dist/server/auth/setup.d.ts +1 -1
- package/dist/server/auth/setup.js.map +1 -1
- package/dist/server/auth/setup.test.js +74 -58
- package/dist/server/auth/setup.test.js.map +1 -1
- package/dist/server/auth/verify.d.ts +5 -3
- package/dist/server/auth/verify.js.map +1 -1
- package/dist/server/auth/verify.test.js +16 -0
- package/dist/server/auth/verify.test.js.map +1 -1
- package/dist/server/auth-extra.test-d.js +93 -34
- package/dist/server/auth-extra.test-d.js.map +1 -1
- package/dist/server/auth.d.ts +4 -4
- package/dist/server/auth.js +2 -2
- package/dist/server/auth.js.map +1 -1
- package/dist/server/build-manifest.test.js +7 -6
- package/dist/server/build-manifest.test.js.map +1 -1
- package/dist/server/events.d.ts +113 -0
- package/dist/server/events.js +318 -0
- package/dist/server/events.js.map +1 -0
- package/dist/server/events.test.js +172 -0
- package/dist/server/events.test.js.map +1 -0
- package/dist/server/express.d.ts +23 -3
- package/dist/server/express.js +40 -10
- package/dist/server/express.js.map +1 -1
- package/dist/server/express.test.js +193 -110
- package/dist/server/express.test.js.map +1 -1
- package/dist/server/file-ref.d.ts +1 -1
- package/dist/server/file-ref.js +1 -1
- package/dist/server/file-ref.js.map +1 -1
- package/dist/server/form-input.d.ts +120 -0
- package/dist/server/form-input.js +89 -0
- package/dist/server/form-input.js.map +1 -0
- package/dist/server/index.d.ts +8 -4
- package/dist/server/index.js +5 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/mcp-errors.test.js +9 -5
- package/dist/server/mcp-errors.test.js.map +1 -1
- package/dist/server/middleware.test.js +221 -148
- package/dist/server/middleware.test.js.map +1 -1
- package/dist/server/register-tool.test.js +212 -7
- package/dist/server/register-tool.test.js.map +1 -1
- package/dist/server/server.d.ts +323 -150
- package/dist/server/server.js +349 -324
- package/dist/server/server.js.map +1 -1
- package/dist/server/skills-integration.test.js +16 -9
- package/dist/server/skills-integration.test.js.map +1 -1
- package/dist/server/skills.js +1 -1
- package/dist/server/skills.js.map +1 -1
- package/dist/server/templateHelper.d.ts +0 -3
- package/dist/server/templateHelper.js.map +1 -1
- package/dist/server/templates.generated.js +4 -8
- package/dist/server/templates.generated.js.map +1 -1
- package/dist/server/tool-extra.test.js +115 -20
- package/dist/server/tool-extra.test.js.map +1 -1
- package/dist/server/view-resource-resolution.test.js +17 -10
- package/dist/server/view-resource-resolution.test.js.map +1 -1
- package/dist/test/utils.d.ts +7 -6
- package/dist/test/utils.js +212 -197
- package/dist/test/utils.js.map +1 -1
- package/dist/test/view.test.js +24 -20
- package/dist/test/view.test.js.map +1 -1
- package/dist/views/index.d.ts +10 -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.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.js.map +1 -0
- package/dist/web/bridges/adaptor.d.ts +14 -3
- package/dist/web/bridges/adaptor.js +157 -13
- package/dist/web/bridges/adaptor.js.map +1 -1
- package/dist/web/bridges/adaptor.test.js +46 -7
- package/dist/web/bridges/adaptor.test.js.map +1 -1
- package/dist/web/bridges/apps-sdk/bridge.js +1 -1
- package/dist/web/bridges/apps-sdk/bridge.js.map +1 -1
- package/dist/web/bridges/apps-sdk/use-apps-sdk-context.d.ts +3 -3
- package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js +3 -3
- package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js.map +1 -1
- package/dist/web/bridges/get-adaptor.test.js +2 -2
- package/dist/web/bridges/get-adaptor.test.js.map +1 -1
- package/dist/web/bridges/mcp-app/bridge.d.ts +1 -1
- package/dist/web/bridges/mcp-app/bridge.js +10 -3
- package/dist/web/bridges/mcp-app/bridge.js.map +1 -1
- package/dist/web/bridges/mcp-app/bridge.test.js +2 -2
- package/dist/web/bridges/mcp-app/bridge.test.js.map +1 -1
- package/dist/web/bridges/mcp-app/types.d.ts +18 -3
- package/dist/web/bridges/mcp-app/types.js.map +1 -1
- package/dist/web/bridges/mcp-app/use-mcp-app-context.d.ts +2 -2
- 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/use-mcp-app-context.test.js +1 -1
- package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js.map +1 -1
- package/dist/web/bridges/mcp-app/view-tools.test.js +1 -1
- package/dist/web/bridges/mcp-app/view-tools.test.js.map +1 -1
- package/dist/web/bridges/types.d.ts +63 -13
- package/dist/web/bridges/types.js +1 -1
- package/dist/web/bridges/types.js.map +1 -1
- package/dist/web/create-store.test.js +2 -2
- package/dist/web/create-store.test.js.map +1 -1
- package/dist/web/data-llm.js +3 -2
- package/dist/web/data-llm.js.map +1 -1
- package/dist/web/data-llm.test.js +8 -2
- package/dist/web/data-llm.test.js.map +1 -1
- package/dist/web/generate-helpers.d.ts +23 -19
- package/dist/web/generate-helpers.js +21 -17
- 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 +5 -1
- package/dist/web/hooks/index.js +5 -1
- package/dist/web/hooks/index.js.map +1 -1
- package/dist/web/hooks/openai-extensions.test.js +107 -0
- package/dist/web/hooks/openai-extensions.test.js.map +1 -0
- package/dist/web/hooks/use-call-tool.d.ts +2 -2
- package/dist/web/hooks/use-call-tool.js +15 -10
- package/dist/web/hooks/use-call-tool.js.map +1 -1
- package/dist/web/hooks/use-call-tool.test.js +15 -4
- package/dist/web/hooks/use-call-tool.test.js.map +1 -1
- package/dist/web/hooks/use-deep-link.d.ts +22 -0
- package/dist/web/hooks/use-deep-link.js +34 -0
- package/dist/web/hooks/use-deep-link.js.map +1 -0
- package/dist/web/hooks/use-display-mode.test.js +1 -1
- package/dist/web/hooks/use-display-mode.test.js.map +1 -1
- package/dist/web/hooks/use-download.test.js +3 -3
- package/dist/web/hooks/use-download.test.js.map +1 -1
- package/dist/web/hooks/use-file-resource.d.ts +37 -0
- package/dist/web/hooks/use-file-resource.js +98 -0
- package/dist/web/hooks/use-file-resource.js.map +1 -0
- package/dist/web/hooks/use-file-resource.test.js +65 -0
- package/dist/web/hooks/use-file-resource.test.js.map +1 -0
- package/dist/web/hooks/use-files.test.js +1 -1
- package/dist/web/hooks/use-files.test.js.map +1 -1
- package/dist/web/hooks/use-host.d.ts +27 -5
- package/dist/web/hooks/use-host.js +20 -5
- package/dist/web/hooks/use-host.js.map +1 -1
- package/dist/web/hooks/use-host.test.js +1 -1
- package/dist/web/hooks/use-host.test.js.map +1 -1
- package/dist/web/hooks/use-model-context.d.ts +44 -0
- package/dist/web/hooks/use-model-context.js +63 -0
- package/dist/web/hooks/use-model-context.js.map +1 -0
- package/dist/web/hooks/use-open-external.test.js +2 -2
- package/dist/web/hooks/use-open-external.test.js.map +1 -1
- package/dist/web/hooks/use-open-file.d.ts +20 -0
- package/dist/web/hooks/use-open-file.js +25 -0
- package/dist/web/hooks/use-open-file.js.map +1 -0
- package/dist/web/hooks/use-register-view-tool.d.ts +1 -1
- package/dist/web/hooks/use-register-view-tool.js +1 -1
- package/dist/web/hooks/use-register-view-tool.js.map +1 -1
- package/dist/web/hooks/use-request-close.test.js +1 -1
- package/dist/web/hooks/use-request-close.test.js.map +1 -1
- package/dist/web/hooks/use-request-modal.test.js +1 -1
- package/dist/web/hooks/use-request-modal.test.js.map +1 -1
- package/dist/web/hooks/use-request-size.test.js +1 -1
- package/dist/web/hooks/use-request-size.test.js.map +1 -1
- package/dist/web/hooks/use-send-follow-up-message.d.ts +8 -2
- package/dist/web/hooks/use-send-follow-up-message.js +6 -0
- package/dist/web/hooks/use-send-follow-up-message.js.map +1 -1
- package/dist/web/hooks/use-set-open-in-app-url.test.js +2 -8
- package/dist/web/hooks/use-set-open-in-app-url.test.js.map +1 -1
- package/dist/web/hooks/use-tool-info.test.js +2 -2
- package/dist/web/hooks/use-tool-info.test.js.map +1 -1
- package/dist/web/hooks/use-user.test.js +2 -2
- package/dist/web/hooks/use-user.test.js.map +1 -1
- package/dist/web/hooks/use-view-state.test.js +2 -2
- package/dist/web/hooks/use-view-state.test.js.map +1 -1
- package/dist/web/hooks/use-viewport.test.js +2 -2
- package/dist/web/hooks/use-viewport.test.js.map +1 -1
- package/dist/web/index.d.ts +0 -1
- package/dist/web/index.js.map +1 -1
- package/dist/web/mount-view.js +2 -6
- package/dist/web/mount-view.js.map +1 -1
- package/package.json +15 -15
- package/dist/standard-schema.d.ts +0 -3
- package/dist/standard-schema.js +0 -2
- package/dist/standard-schema.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-build.test.js +0 -54
- package/dist/web/plugin/plugin-build.test.js.map +0 -1
- package/dist/web/plugin/plugin.d.ts +0 -39
- package/dist/web/plugin/plugin.js +0 -200
- package/dist/web/plugin/plugin.js.map +0 -1
- package/dist/web/plugin/plugin.test.js +0 -61
- package/dist/web/plugin/plugin.test.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/plugin/data-llm.test.d.ts → server/app.test.d.ts} +0 -0
- /package/dist/{web/plugin/plugin-build.test.d.ts → server/events.test.d.ts} +0 -0
- /package/dist/{web/plugin → views}/scan-views.d.ts +0 -0
- /package/dist/{web/plugin → views}/scan-views.test.d.ts +0 -0
- /package/dist/{web/plugin → views}/scan-views.test.js +0 -0
- /package/dist/{web/plugin → views}/validate-view.test.d.ts +0 -0
- /package/dist/{web/plugin → views}/validate-view.test.js +0 -0
- /package/dist/web/{plugin/plugin.test.d.ts → hooks/openai-extensions.test.d.ts} +0 -0
- /package/dist/web/{plugin/transform-data-llm.test.d.ts → hooks/use-file-resource.test.d.ts} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-errors.test.js","sourceRoot":"","sources":["../../src/server/mcp-errors.test.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"mcp-errors.test.js","sourceRoot":"","sources":["../../src/server/mcp-errors.test.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,EAAE,CAAC,IAAI,CAAC,qBAAqB,EAAE,GAAG,EAAE,CAAC,CAAC;IACpC,oBAAoB,EAAE,GAAG,EAAE,CACzB,CAAC,CAAC,EAAW,EAAE,EAAW,EAAE,CAAa,EAAE,EAAE,CAAC,CAAC,EAAE,CAAmB;CACvE,CAAC,CAAC,CAAC;AACJ,EAAE,CAAC,IAAI,CAAC,qBAAqB,EAAE,GAAG,EAAE,CAAC,CAAC;IACpC,cAAc,EAAE,GAAG,EAAE,CACnB,CAAC,CAAC,EAAW,EAAE,EAAW,EAAE,CAAa,EAAE,EAAE,CAAC,CAAC,EAAE,CAAmB;CACvE,CAAC,CAAC,CAAC;AAEJ,IAAI,UAAmC,CAAC;AACxC,SAAS,CAAC,GAAG,EAAE;IACb,UAAU,EAAE,KAAK,EAAE,CAAC;IACpB,EAAE,CAAC,eAAe,EAAE,CAAC;AACvB,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;IAC7E,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;IACnD,MAAM,GAAG,GAAG,IAAI,SAAS,CAAC;QACxB,IAAI,EAAE,GAAG;QACT,OAAO,EAAE,OAAO;QAChB,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM;KAC5B,CAAC,CAAC;IACH,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE;QAC5D,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAEvE,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;IACvC,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;IAChD,MAAM,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACvD,UAAU,GAAG,SAAS,CAAC;IACvB,MAAM,IAAI,GAAI,SAAS,CAAC,OAAO,EAAuB,CAAC,IAAI,CAAC;IAE5D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,oBAAoB,IAAI,MAAM,EAAE;QACtD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;KACtE,CAAC,CAAC;IAEH,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC;IAC/C,MAAM,CACJ,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAC/B,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,4BAA4B,CAAC,CACnD,CACF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC,CAAC,CAAC","sourcesContent":["// @vitest-environment node\nimport http from \"node:http\";\nimport type { RequestHandler } from \"express\";\nimport { afterEach, expect, it, vi } from \"vitest\";\nimport { Skybridge } from \"./app.js\";\n\nvi.mock(\"@skybridge/devtools\", () => ({\n devtoolsStaticServer: () =>\n ((_r: unknown, _s: unknown, n: () => void) => n()) as RequestHandler,\n}));\nvi.mock(\"./viewsDevServer.js\", () => ({\n viewsDevServer: () =>\n ((_r: unknown, _s: unknown, n: () => void) => n()) as RequestHandler,\n}));\n\nlet openServer: http.Server | undefined;\nafterEach(() => {\n openServer?.close();\n vi.restoreAllMocks();\n});\n\nit(\"reports a failure inside the MCP leg instead of swallowing it\", async () => {\n const { createApp } = await import(\"./express.js\");\n const app = new Skybridge({\n name: \"t\",\n version: \"0.0.0\",\n handler: (server) => server,\n });\n vi.spyOn(app, \"createServerInstance\").mockImplementation(() => {\n throw new Error(\"boom\");\n });\n const errors = vi.spyOn(console, \"error\").mockImplementation(() => {});\n\n const httpServer = http.createServer();\n const expressApp = await createApp({ app, httpServer });\n const listening = http.createServer(expressApp);\n await new Promise<void>((r) => listening.listen(0, r));\n openServer = listening;\n const port = (listening.address() as { port: number }).port;\n\n const res = await fetch(`http://localhost:${port}/mcp`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ jsonrpc: \"2.0\", id: 1, method: \"initialize\" }),\n });\n\n expect(res.status).toBeGreaterThanOrEqual(500);\n expect(\n errors.mock.calls.some(([msg]) =>\n String(msg).includes(\"Error handling MCP request\"),\n ),\n ).toBe(true);\n});\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Client, InMemoryTransport } from "@modelcontextprotocol/client";
|
|
2
2
|
import { describe, expect, it, vi } from "vitest";
|
|
3
3
|
import { z } from "zod";
|
|
4
|
+
import { Skybridge } from "./app.js";
|
|
4
5
|
import { buildMiddlewareChain, getHandlerMaps, getToolError, matchesFilter, } from "./middleware.js";
|
|
5
|
-
import { McpServer } from "./server.js";
|
|
6
6
|
// ---------------------------------------------------------------------------
|
|
7
7
|
// matchesFilter
|
|
8
8
|
// ---------------------------------------------------------------------------
|
|
@@ -207,29 +207,42 @@ describe("McpServer.mcpMiddleware()", () => {
|
|
|
207
207
|
return new Client({ name: "test-client", version: "1.0.0" });
|
|
208
208
|
}
|
|
209
209
|
it("returns this for chaining", () => {
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
210
|
+
new Skybridge({
|
|
211
|
+
name: "test",
|
|
212
|
+
version: "1.0.0",
|
|
213
|
+
handler: (server) => {
|
|
214
|
+
const result = server.mcpMiddleware(async (_req, _extra, next) => next());
|
|
215
|
+
expect(result).toBe(server);
|
|
216
|
+
return server;
|
|
217
|
+
},
|
|
218
|
+
});
|
|
213
219
|
});
|
|
214
220
|
it("intercepts tools/call and exposes request params", async () => {
|
|
215
221
|
let capturedMethod = "";
|
|
216
222
|
let capturedParams = {};
|
|
217
|
-
const
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
223
|
+
const app = new Skybridge({
|
|
224
|
+
name: "test",
|
|
225
|
+
version: "1.0.0",
|
|
226
|
+
handler: (server) => {
|
|
227
|
+
server.registerTool({
|
|
228
|
+
name: "greet",
|
|
229
|
+
description: "greet",
|
|
230
|
+
inputSchema: { name: z.string() },
|
|
231
|
+
}, (args) => ({
|
|
232
|
+
content: [{ type: "text", text: `hi ${args.name}` }],
|
|
233
|
+
}));
|
|
234
|
+
server.mcpMiddleware("tools/call", async (request, _extra, next) => {
|
|
235
|
+
capturedMethod = request.method;
|
|
236
|
+
capturedParams = request.params;
|
|
237
|
+
return next();
|
|
238
|
+
});
|
|
239
|
+
return server;
|
|
240
|
+
},
|
|
229
241
|
});
|
|
230
242
|
const client = createClient();
|
|
231
243
|
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
|
|
232
|
-
await
|
|
244
|
+
const instance = await app.createServerInstance();
|
|
245
|
+
await instance.connect(serverTransport);
|
|
233
246
|
await client.connect(clientTransport);
|
|
234
247
|
const result = await client.callTool({
|
|
235
248
|
name: "greet",
|
|
@@ -242,59 +255,70 @@ describe("McpServer.mcpMiddleware()", () => {
|
|
|
242
255
|
});
|
|
243
256
|
expect(result.content).toEqual([{ type: "text", text: "hi World" }]);
|
|
244
257
|
await client.close();
|
|
245
|
-
await
|
|
258
|
+
await instance.close();
|
|
246
259
|
});
|
|
247
260
|
it("array filter works", async () => {
|
|
248
261
|
const matchedMethods = [];
|
|
249
|
-
const
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
262
|
+
const app = new Skybridge({
|
|
263
|
+
name: "test",
|
|
264
|
+
version: "1.0.0",
|
|
265
|
+
handler: (server) => {
|
|
266
|
+
server.registerTool({ name: "t1", description: "t1" }, () => ({
|
|
267
|
+
content: [{ type: "text", text: "ok" }],
|
|
268
|
+
}));
|
|
269
|
+
server.mcpMiddleware(["tools/call", "tools/list"], async (request, _extra, next) => {
|
|
270
|
+
matchedMethods.push(request.method);
|
|
271
|
+
return next();
|
|
272
|
+
});
|
|
273
|
+
return server;
|
|
274
|
+
},
|
|
256
275
|
});
|
|
257
276
|
const client = createClient();
|
|
258
277
|
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
|
|
259
|
-
await
|
|
278
|
+
const instance = await app.createServerInstance();
|
|
279
|
+
await instance.connect(serverTransport);
|
|
260
280
|
await client.connect(clientTransport);
|
|
261
281
|
await client.listTools();
|
|
262
282
|
await client.callTool({ name: "t1" });
|
|
263
283
|
expect(matchedMethods).toEqual(["tools/list", "tools/call"]);
|
|
264
284
|
await client.close();
|
|
265
|
-
await
|
|
266
|
-
});
|
|
267
|
-
it("throws
|
|
268
|
-
const
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
expect(() =>
|
|
277
|
-
// @ts-expect-error intentionally passing filter without handler
|
|
278
|
-
server.mcpMiddleware("tools/call")).toThrow("mcpMiddleware requires a handler function");
|
|
285
|
+
await instance.close();
|
|
286
|
+
});
|
|
287
|
+
it("throws when filter provided without handler", async () => {
|
|
288
|
+
const app = new Skybridge({
|
|
289
|
+
name: "test",
|
|
290
|
+
version: "1.0.0",
|
|
291
|
+
handler: (server) =>
|
|
292
|
+
// @ts-expect-error intentionally passing filter without handler
|
|
293
|
+
server.mcpMiddleware("tools/call"),
|
|
294
|
+
});
|
|
295
|
+
await expect(app.createServerInstance()).rejects.toThrow("mcpMiddleware requires a handler function");
|
|
279
296
|
});
|
|
280
297
|
it("catch-all middleware + filtered middleware stack correctly", async () => {
|
|
281
298
|
const calls = [];
|
|
282
|
-
const
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
299
|
+
const app = new Skybridge({
|
|
300
|
+
name: "test",
|
|
301
|
+
version: "1.0.0",
|
|
302
|
+
handler: (server) => {
|
|
303
|
+
server.registerTool({ name: "t1", description: "t1" }, () => ({
|
|
304
|
+
content: [{ type: "text", text: "ok" }],
|
|
305
|
+
}));
|
|
306
|
+
server
|
|
307
|
+
.mcpMiddleware(async (request, _extra, next) => {
|
|
308
|
+
calls.push(`global:${request.method}`);
|
|
309
|
+
return next();
|
|
310
|
+
})
|
|
311
|
+
.mcpMiddleware("tools/call", async (_req, _extra, next) => {
|
|
312
|
+
calls.push("tools-only");
|
|
313
|
+
return next();
|
|
314
|
+
});
|
|
315
|
+
return server;
|
|
316
|
+
},
|
|
294
317
|
});
|
|
295
318
|
const client = createClient();
|
|
296
319
|
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
|
|
297
|
-
await
|
|
320
|
+
const instance = await app.createServerInstance();
|
|
321
|
+
await instance.connect(serverTransport);
|
|
298
322
|
await client.connect(clientTransport);
|
|
299
323
|
await client.listTools();
|
|
300
324
|
await client.callTool({ name: "t1" });
|
|
@@ -308,41 +332,55 @@ describe("McpServer.mcpMiddleware()", () => {
|
|
|
308
332
|
const toolsCallIdx = calls.indexOf("global:tools/call");
|
|
309
333
|
expect(calls[toolsCallIdx + 1]).toBe("tools-only");
|
|
310
334
|
await client.close();
|
|
311
|
-
await
|
|
335
|
+
await instance.close();
|
|
312
336
|
});
|
|
313
337
|
it("notification middleware receives extra as undefined", async () => {
|
|
314
338
|
let capturedExtra = "sentinel";
|
|
315
|
-
const
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
339
|
+
const app = new Skybridge({
|
|
340
|
+
name: "test",
|
|
341
|
+
version: "1.0.0",
|
|
342
|
+
handler: (server) => {
|
|
343
|
+
server.registerTool({ name: "t1", description: "t1" }, () => ({
|
|
344
|
+
content: [{ type: "text", text: "ok" }],
|
|
345
|
+
}));
|
|
346
|
+
server.mcpMiddleware("notification", async (_request, extra, next) => {
|
|
347
|
+
capturedExtra = extra;
|
|
348
|
+
return next();
|
|
349
|
+
});
|
|
350
|
+
return server;
|
|
351
|
+
},
|
|
322
352
|
});
|
|
323
353
|
const client = createClient();
|
|
324
354
|
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
|
|
325
|
-
await
|
|
355
|
+
const instance = await app.createServerInstance();
|
|
356
|
+
await instance.connect(serverTransport);
|
|
326
357
|
await client.connect(clientTransport);
|
|
327
358
|
// The client sends notifications/initialized automatically on connect.
|
|
328
359
|
await client.listTools();
|
|
329
360
|
expect(capturedExtra).toBeUndefined();
|
|
330
361
|
await client.close();
|
|
331
|
-
await
|
|
362
|
+
await instance.close();
|
|
332
363
|
});
|
|
333
364
|
it("wildcard filter intercepts matching methods only", async () => {
|
|
334
365
|
const matchedMethods = [];
|
|
335
|
-
const
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
366
|
+
const app = new Skybridge({
|
|
367
|
+
name: "test",
|
|
368
|
+
version: "1.0.0",
|
|
369
|
+
handler: (server) => {
|
|
370
|
+
server.registerTool({ name: "t1", description: "t1" }, () => ({
|
|
371
|
+
content: [{ type: "text", text: "ok" }],
|
|
372
|
+
}));
|
|
373
|
+
server.mcpMiddleware("tools/*", async (request, _extra, next) => {
|
|
374
|
+
matchedMethods.push(request.method);
|
|
375
|
+
return next();
|
|
376
|
+
});
|
|
377
|
+
return server;
|
|
378
|
+
},
|
|
342
379
|
});
|
|
343
380
|
const client = createClient();
|
|
344
381
|
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
|
|
345
|
-
await
|
|
382
|
+
const instance = await app.createServerInstance();
|
|
383
|
+
await instance.connect(serverTransport);
|
|
346
384
|
await client.connect(clientTransport);
|
|
347
385
|
await client.listTools();
|
|
348
386
|
await client.callTool({ name: "t1" });
|
|
@@ -352,30 +390,37 @@ describe("McpServer.mcpMiddleware()", () => {
|
|
|
352
390
|
expect(matchedMethods).not.toContain("initialize");
|
|
353
391
|
expect(matchedMethods).not.toContain("notifications/initialized");
|
|
354
392
|
await client.close();
|
|
355
|
-
await
|
|
356
|
-
});
|
|
357
|
-
it("middleware can modify tool result via
|
|
358
|
-
const
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
393
|
+
await instance.close();
|
|
394
|
+
});
|
|
395
|
+
it("middleware can modify tool result via Skybridge integration", async () => {
|
|
396
|
+
const app = new Skybridge({
|
|
397
|
+
name: "test",
|
|
398
|
+
version: "1.0.0",
|
|
399
|
+
handler: (server) => {
|
|
400
|
+
server.registerTool({
|
|
401
|
+
name: "greet",
|
|
402
|
+
description: "greet",
|
|
403
|
+
inputSchema: { name: z.string() },
|
|
404
|
+
}, (args) => ({
|
|
405
|
+
content: [{ type: "text", text: `hi ${args.name}` }],
|
|
406
|
+
}));
|
|
407
|
+
server.mcpMiddleware("tools/call", async (_req, _extra, next) => {
|
|
408
|
+
const result = (await next());
|
|
409
|
+
return {
|
|
410
|
+
...result,
|
|
411
|
+
content: [
|
|
412
|
+
...result.content,
|
|
413
|
+
{ type: "text", text: " (modified)" },
|
|
414
|
+
],
|
|
415
|
+
};
|
|
416
|
+
});
|
|
417
|
+
return server;
|
|
418
|
+
},
|
|
375
419
|
});
|
|
376
420
|
const client = createClient();
|
|
377
421
|
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
|
|
378
|
-
await
|
|
422
|
+
const instance = await app.createServerInstance();
|
|
423
|
+
await instance.connect(serverTransport);
|
|
379
424
|
await client.connect(clientTransport);
|
|
380
425
|
const result = await client.callTool({
|
|
381
426
|
name: "greet",
|
|
@@ -386,53 +431,67 @@ describe("McpServer.mcpMiddleware()", () => {
|
|
|
386
431
|
{ type: "text", text: " (modified)" },
|
|
387
432
|
]);
|
|
388
433
|
await client.close();
|
|
389
|
-
await
|
|
434
|
+
await instance.close();
|
|
390
435
|
});
|
|
391
|
-
it("middleware can short-circuit via
|
|
436
|
+
it("middleware can short-circuit via Skybridge integration", async () => {
|
|
392
437
|
const handlerCalled = vi.fn();
|
|
393
|
-
const
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
438
|
+
const app = new Skybridge({
|
|
439
|
+
name: "test",
|
|
440
|
+
version: "1.0.0",
|
|
441
|
+
handler: (server) => {
|
|
442
|
+
server.registerTool({ name: "t1", description: "t1" }, () => {
|
|
443
|
+
handlerCalled();
|
|
444
|
+
return {
|
|
445
|
+
content: [{ type: "text", text: "original" }],
|
|
446
|
+
};
|
|
447
|
+
});
|
|
448
|
+
server.mcpMiddleware("tools/call", async () => ({
|
|
449
|
+
content: [{ type: "text", text: "short-circuited" }],
|
|
450
|
+
}));
|
|
451
|
+
return server;
|
|
452
|
+
},
|
|
399
453
|
});
|
|
400
|
-
server.mcpMiddleware("tools/call", async () => ({
|
|
401
|
-
content: [{ type: "text", text: "short-circuited" }],
|
|
402
|
-
}));
|
|
403
454
|
const client = createClient();
|
|
404
455
|
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
|
|
405
|
-
await
|
|
456
|
+
const instance = await app.createServerInstance();
|
|
457
|
+
await instance.connect(serverTransport);
|
|
406
458
|
await client.connect(clientTransport);
|
|
407
459
|
const result = await client.callTool({ name: "t1" });
|
|
408
460
|
expect(result.content).toEqual([{ type: "text", text: "short-circuited" }]);
|
|
409
461
|
expect(handlerCalled).not.toHaveBeenCalled();
|
|
410
462
|
await client.close();
|
|
411
|
-
await
|
|
463
|
+
await instance.close();
|
|
412
464
|
});
|
|
413
465
|
it("exposes a thrown tool error to middleware via getToolError", async () => {
|
|
414
466
|
const schemaError = new Error("boom with schema");
|
|
415
467
|
const schemalessError = new Error("boom without schema");
|
|
416
468
|
let captured;
|
|
417
|
-
const
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
469
|
+
const app = new Skybridge({
|
|
470
|
+
name: "test",
|
|
471
|
+
version: "1.0.0",
|
|
472
|
+
handler: (server) => {
|
|
473
|
+
server.registerTool({
|
|
474
|
+
name: "withSchema",
|
|
475
|
+
description: "withSchema",
|
|
476
|
+
inputSchema: { name: z.string() },
|
|
477
|
+
}, () => {
|
|
478
|
+
throw schemaError;
|
|
479
|
+
});
|
|
480
|
+
server.registerTool({ name: "withoutSchema", description: "withoutSchema" }, () => {
|
|
481
|
+
throw schemalessError;
|
|
482
|
+
});
|
|
483
|
+
server.mcpMiddleware("tools/call", async (_request, extra, next) => {
|
|
484
|
+
const result = await next();
|
|
485
|
+
captured = getToolError(extra);
|
|
486
|
+
return result;
|
|
487
|
+
});
|
|
488
|
+
return server;
|
|
489
|
+
},
|
|
432
490
|
});
|
|
433
491
|
const client = createClient();
|
|
434
492
|
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
|
|
435
|
-
await
|
|
493
|
+
const instance = await app.createServerInstance();
|
|
494
|
+
await instance.connect(serverTransport);
|
|
436
495
|
await client.connect(clientTransport);
|
|
437
496
|
const withSchema = await client.callTool({
|
|
438
497
|
name: "withSchema",
|
|
@@ -444,28 +503,35 @@ describe("McpServer.mcpMiddleware()", () => {
|
|
|
444
503
|
expect(withoutSchema.isError).toBe(true);
|
|
445
504
|
expect(captured).toBe(schemalessError);
|
|
446
505
|
await client.close();
|
|
447
|
-
await
|
|
506
|
+
await instance.close();
|
|
448
507
|
});
|
|
449
|
-
it("middleware can mutate tool call params via
|
|
508
|
+
it("middleware can mutate tool call params via Skybridge integration", async () => {
|
|
450
509
|
let receivedName = "";
|
|
451
|
-
const
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
510
|
+
const app = new Skybridge({
|
|
511
|
+
name: "test",
|
|
512
|
+
version: "1.0.0",
|
|
513
|
+
handler: (server) => {
|
|
514
|
+
server.registerTool({
|
|
515
|
+
name: "greet",
|
|
516
|
+
description: "greet",
|
|
517
|
+
inputSchema: { name: z.string() },
|
|
518
|
+
}, (args) => {
|
|
519
|
+
receivedName = args.name;
|
|
520
|
+
return {
|
|
521
|
+
content: [{ type: "text", text: `hi ${args.name}` }],
|
|
522
|
+
};
|
|
523
|
+
});
|
|
524
|
+
server.mcpMiddleware("tools/call", async (request, _extra, next) => {
|
|
525
|
+
request.params.arguments = { name: "Overridden" };
|
|
526
|
+
return next();
|
|
527
|
+
});
|
|
528
|
+
return server;
|
|
529
|
+
},
|
|
465
530
|
});
|
|
466
531
|
const client = createClient();
|
|
467
532
|
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
|
|
468
|
-
await
|
|
533
|
+
const instance = await app.createServerInstance();
|
|
534
|
+
await instance.connect(serverTransport);
|
|
469
535
|
await client.connect(clientTransport);
|
|
470
536
|
await client.callTool({
|
|
471
537
|
name: "greet",
|
|
@@ -473,21 +539,28 @@ describe("McpServer.mcpMiddleware()", () => {
|
|
|
473
539
|
});
|
|
474
540
|
expect(receivedName).toBe("Overridden");
|
|
475
541
|
await client.close();
|
|
476
|
-
await
|
|
542
|
+
await instance.close();
|
|
477
543
|
});
|
|
478
544
|
it("category 'request' filter matches requests but not notifications", async () => {
|
|
479
545
|
const matchedMethods = [];
|
|
480
|
-
const
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
546
|
+
const app = new Skybridge({
|
|
547
|
+
name: "test",
|
|
548
|
+
version: "1.0.0",
|
|
549
|
+
handler: (server) => {
|
|
550
|
+
server.registerTool({ name: "t1", description: "t1" }, () => ({
|
|
551
|
+
content: [{ type: "text", text: "ok" }],
|
|
552
|
+
}));
|
|
553
|
+
server.mcpMiddleware("request", async (request, _extra, next) => {
|
|
554
|
+
matchedMethods.push(request.method);
|
|
555
|
+
return next();
|
|
556
|
+
});
|
|
557
|
+
return server;
|
|
558
|
+
},
|
|
487
559
|
});
|
|
488
560
|
const client = createClient();
|
|
489
561
|
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
|
|
490
|
-
await
|
|
562
|
+
const instance = await app.createServerInstance();
|
|
563
|
+
await instance.connect(serverTransport);
|
|
491
564
|
await client.connect(clientTransport);
|
|
492
565
|
await client.listTools();
|
|
493
566
|
await client.callTool({ name: "t1" });
|
|
@@ -495,7 +568,7 @@ describe("McpServer.mcpMiddleware()", () => {
|
|
|
495
568
|
expect(matchedMethods).toContain("tools/call");
|
|
496
569
|
expect(matchedMethods).not.toContain("notifications/initialized");
|
|
497
570
|
await client.close();
|
|
498
|
-
await
|
|
571
|
+
await instance.close();
|
|
499
572
|
});
|
|
500
573
|
});
|
|
501
574
|
// ---------------------------------------------------------------------------
|