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":"express.js","sourceRoot":"","sources":["../../src/server/express.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"express.js","sourceRoot":"","sources":["../../src/server/express.ts"],"names":[],"mappings":"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","sourcesContent":["import type http from \"node:http\";\nimport path from \"node:path\";\nimport { toNodeHandler } from \"@modelcontextprotocol/node\";\nimport cors from \"cors\";\nimport express from \"express\";\nimport type { Skybridge } from \"./app.js\";\nimport type { JsonOptions } from \"./server.js\";\n\ntype SkybridgeApp = Pick<Skybridge, \"express\" | \"fetchHandler\">;\n\n/**\n * Build the bare Express app a {@link Skybridge} instance owns: the instance\n * plus the built-in `express.json()` body parser, tuned by the `json` config\n * field.\n *\n * @internal\n */\nexport function createBaseApp(json?: JsonOptions): express.Express {\n const app = express();\n app.use(express.json(json));\n return app;\n}\n\nfunction parseControlPort(raw: string | undefined): number | null {\n if (raw === undefined) {\n return null;\n }\n const n = Number.parseInt(raw, 10);\n if (!Number.isFinite(n) || n <= 0 || n >= 65536) {\n return null;\n }\n return n;\n}\n\nfunction applyMiddlewares(\n app: express.Express,\n middlewares: Array<{\n path?: string;\n handlers: express.ErrorRequestHandler[];\n }>,\n): void {\n for (const middleware of middlewares) {\n if (middleware.path) {\n app.use(middleware.path, ...middleware.handlers);\n } else {\n app.use(...middleware.handlers);\n }\n }\n}\n\nfunction defaultErrorHandler(\n err: unknown,\n _req: express.Request,\n res: express.Response,\n _next: express.NextFunction,\n) {\n console.error(\"Error handling MCP request:\", err);\n if (!res.headersSent) {\n res.status(500).json({\n jsonrpc: \"2.0\",\n error: { code: -32603, message: \"Internal server error\" },\n id: null,\n });\n }\n}\n\nexport async function createApp({\n app: skybridgeApp,\n httpServer,\n errorMiddleware = [],\n}: {\n app: SkybridgeApp;\n httpServer: http.Server;\n errorMiddleware?: {\n path?: string;\n handlers: express.ErrorRequestHandler[];\n }[];\n}): Promise<express.Express> {\n const app = skybridgeApp.express;\n\n // Read `process.env.NODE_ENV` inline: wrangler/esbuild only substitute the literal expression,\n // so a local const would defeat dead-code elimination of the dev-only imports below.\n if (process.env.NODE_ENV !== \"production\") {\n const { devtoolsStaticServer } = await import(\"@skybridge/devtools\");\n app.use(await devtoolsStaticServer());\n const { viewsDevServer } = await import(\"./viewsDevServer.js\");\n app.use(await viewsDevServer(httpServer));\n\n const controlPort = parseControlPort(process.env.__TUNNEL_CONTROL_PORT);\n if (controlPort !== null) {\n const { createTunnelProxyRouter } = await import(\n \"./tunnel-proxy-router.js\"\n );\n app.use(createTunnelProxyRouter(controlPort));\n } else if (process.env.__TUNNEL_CONTROL_PORT !== undefined) {\n console.warn(\n `Ignoring invalid __TUNNEL_CONTROL_PORT=${process.env.__TUNNEL_CONTROL_PORT}`,\n );\n }\n } else {\n const assetsPath = path.join(process.cwd(), \"dist\", \"assets\");\n\n app.use(\"/assets\", cors());\n app.use(\"/assets\", express.static(assetsPath));\n }\n\n app.use(\"/mcp\", mcpMiddleware(skybridgeApp));\n\n applyMiddlewares(app, errorMiddleware);\n\n app.use(\"/mcp\", defaultErrorHandler);\n\n return app;\n}\n\nconst mcpMiddleware = (skybridgeApp: SkybridgeApp): express.RequestHandler => {\n const handler = toNodeHandler(skybridgeApp.fetchHandler);\n\n return async (\n req: express.Request,\n res: express.Response,\n next: express.NextFunction,\n ) => {\n try {\n // Express strips the mount path from req.url (e.g. \"/mcp\" becomes \"/\").\n // Restore it so the SDK builds the correct request URL.\n req.url = req.originalUrl;\n await handler(req, res, req.body);\n } catch (error) {\n next(error);\n }\n };\n};\n"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import http from "node:http";
|
|
2
|
+
import { Client, StreamableHTTPClientTransport, } from "@modelcontextprotocol/client";
|
|
2
3
|
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
3
|
-
import {
|
|
4
|
+
import { Skybridge } from "./app.js";
|
|
4
5
|
vi.mock("@skybridge/devtools", () => ({
|
|
5
6
|
devtoolsStaticServer: () => ((_req, _res, next) => next()),
|
|
6
7
|
}));
|
|
@@ -25,22 +26,22 @@ async function postMcp(port) {
|
|
|
25
26
|
async function postApi(port) {
|
|
26
27
|
return fetch(`http://localhost:${port}/api/test`, { method: "POST" });
|
|
27
28
|
}
|
|
28
|
-
describe("
|
|
29
|
+
describe("Skybridge.express", () => {
|
|
29
30
|
it("exposes a ready Express app immediately after construction", () => {
|
|
30
|
-
const
|
|
31
|
-
expect(
|
|
32
|
-
expect(typeof
|
|
33
|
-
expect(typeof
|
|
31
|
+
const app = new Skybridge({ name: "t", version: "0.0.0" }, (server) => server);
|
|
32
|
+
expect(app.express).toBeDefined();
|
|
33
|
+
expect(typeof app.express.use).toBe("function");
|
|
34
|
+
expect(typeof app.express.get).toBe("function");
|
|
34
35
|
});
|
|
35
|
-
it("
|
|
36
|
+
it("app.express.get registers a route reachable alongside /mcp", async () => {
|
|
36
37
|
const { createApp } = await import("./express.js");
|
|
37
|
-
const
|
|
38
|
-
|
|
38
|
+
const app = new Skybridge({ name: "t", version: "0.0.0" }, (server) => server);
|
|
39
|
+
app.express.get("/health", (_req, res) => {
|
|
39
40
|
res.json({ status: "ok" });
|
|
40
41
|
});
|
|
41
42
|
const httpServer = http.createServer();
|
|
42
|
-
await createApp({
|
|
43
|
-
const { port, server: listening } = await listen(
|
|
43
|
+
await createApp({ app, httpServer });
|
|
44
|
+
const { port, server: listening } = await listen(app.express);
|
|
44
45
|
openServer = listening;
|
|
45
46
|
const health = await fetch(`http://localhost:${port}/health`);
|
|
46
47
|
expect(health.status).toBe(200);
|
|
@@ -49,12 +50,12 @@ describe("McpServer.express", () => {
|
|
|
49
50
|
const mcp = await postMcp(port);
|
|
50
51
|
expect(mcp.status).not.toBe(404);
|
|
51
52
|
});
|
|
52
|
-
it("
|
|
53
|
+
it("app.use and app.express.use produce the same registration order", async () => {
|
|
53
54
|
const { createApp } = await import("./express.js");
|
|
54
55
|
const callsA = [];
|
|
55
56
|
const callsB = [];
|
|
56
|
-
const
|
|
57
|
-
const sA =
|
|
57
|
+
const buildApp = () => new Skybridge({ name: "t", version: "0.0.0" }, (server) => server);
|
|
58
|
+
const sA = buildApp();
|
|
58
59
|
sA.use((_req, _res, next) => {
|
|
59
60
|
callsA.push("first");
|
|
60
61
|
next();
|
|
@@ -63,7 +64,7 @@ describe("McpServer.express", () => {
|
|
|
63
64
|
callsA.push("second");
|
|
64
65
|
next();
|
|
65
66
|
});
|
|
66
|
-
const sB =
|
|
67
|
+
const sB = buildApp();
|
|
67
68
|
sB.express.use((_req, _res, next) => {
|
|
68
69
|
callsB.push("first");
|
|
69
70
|
next();
|
|
@@ -75,7 +76,7 @@ describe("McpServer.express", () => {
|
|
|
75
76
|
for (const s of [sA, sB]) {
|
|
76
77
|
s.express.get("/probe", (_req, res) => res.json({ ok: true }));
|
|
77
78
|
const httpServer = http.createServer();
|
|
78
|
-
await createApp({
|
|
79
|
+
await createApp({ app: s, httpServer });
|
|
79
80
|
const { port, server: listening } = await listen(s.express);
|
|
80
81
|
openServer = listening;
|
|
81
82
|
await fetch(`http://localhost:${port}/probe`);
|
|
@@ -86,26 +87,28 @@ describe("McpServer.express", () => {
|
|
|
86
87
|
});
|
|
87
88
|
it("useOnError still wraps thrown /mcp errors after the route is mounted", async () => {
|
|
88
89
|
const { createApp } = await import("./express.js");
|
|
89
|
-
const
|
|
90
|
+
const app = new Skybridge({ name: "t", version: "0.0.0" }, (server) => server);
|
|
90
91
|
// Register the error handler BEFORE createApp — useOnError should still
|
|
91
92
|
// apply it after /mcp, so /mcp errors hit it.
|
|
92
93
|
const seen = [];
|
|
93
|
-
|
|
94
|
+
app.useOnError((_err, _req, res, _next) => {
|
|
94
95
|
seen.push("useOnError");
|
|
95
96
|
res.status(503).json({ from: "useOnError" });
|
|
96
97
|
});
|
|
97
98
|
// Force the /mcp handler to throw so the error pipeline runs.
|
|
98
|
-
|
|
99
|
+
app.use("/mcp", () => {
|
|
100
|
+
throw new Error("boom");
|
|
101
|
+
});
|
|
99
102
|
const httpServer = http.createServer();
|
|
100
103
|
await createApp({
|
|
101
|
-
|
|
104
|
+
app,
|
|
102
105
|
httpServer,
|
|
103
|
-
// Mirror what run() does: forward the
|
|
106
|
+
// Mirror what run() does: forward the app's useOnError handlers
|
|
104
107
|
// to createApp so they get applied after /mcp.
|
|
105
108
|
// biome-ignore lint/complexity/useLiteralKeys: test mirrors run() internals to verify useOnError ordering
|
|
106
|
-
errorMiddleware:
|
|
109
|
+
errorMiddleware: app["errorMiddleware"],
|
|
107
110
|
});
|
|
108
|
-
const { port, server: listening } = await listen(
|
|
111
|
+
const { port, server: listening } = await listen(app.express);
|
|
109
112
|
openServer = listening;
|
|
110
113
|
const res = await postMcp(port);
|
|
111
114
|
expect(seen).toEqual(["useOnError"]);
|
|
@@ -113,7 +116,7 @@ describe("McpServer.express", () => {
|
|
|
113
116
|
expect(await res.json()).toEqual({ from: "useOnError" });
|
|
114
117
|
});
|
|
115
118
|
});
|
|
116
|
-
describe("
|
|
119
|
+
describe("Skybridge JSON body parser options", () => {
|
|
117
120
|
const largeBody = JSON.stringify({ data: "x".repeat(200 * 1024) });
|
|
118
121
|
async function postEcho(port, body) {
|
|
119
122
|
return fetch(`http://localhost:${port}/echo`, {
|
|
@@ -123,22 +126,22 @@ describe("McpServer JSON body parser options", () => {
|
|
|
123
126
|
});
|
|
124
127
|
}
|
|
125
128
|
it("forwards json options to express.json", async () => {
|
|
126
|
-
const
|
|
127
|
-
|
|
129
|
+
const app = new Skybridge({ name: "t", version: "0.0.0", json: { limit: "10mb" } }, (server) => server);
|
|
130
|
+
app.express.post("/echo", (req, res) => {
|
|
128
131
|
res.json({ received: req.body.data.length });
|
|
129
132
|
});
|
|
130
|
-
const { port, server: listening } = await listen(
|
|
133
|
+
const { port, server: listening } = await listen(app.express);
|
|
131
134
|
openServer = listening;
|
|
132
135
|
const res = await postEcho(port, largeBody);
|
|
133
136
|
expect(res.status).toBe(200);
|
|
134
137
|
expect(await res.json()).toEqual({ received: 200 * 1024 });
|
|
135
138
|
});
|
|
136
139
|
it("keeps the default 100kb limit when no options are passed", async () => {
|
|
137
|
-
const
|
|
138
|
-
|
|
140
|
+
const app = new Skybridge({ name: "t", version: "0.0.0" }, (server) => server);
|
|
141
|
+
app.express.post("/echo", (_req, res) => {
|
|
139
142
|
res.json({ ok: true });
|
|
140
143
|
});
|
|
141
|
-
const { port, server: listening } = await listen(
|
|
144
|
+
const { port, server: listening } = await listen(app.express);
|
|
142
145
|
openServer = listening;
|
|
143
146
|
const res = await postEcho(port, largeBody);
|
|
144
147
|
expect(res.status).toBe(413);
|
|
@@ -152,11 +155,11 @@ describe("createApp", () => {
|
|
|
152
155
|
calls.push("custom");
|
|
153
156
|
next();
|
|
154
157
|
};
|
|
155
|
-
const
|
|
156
|
-
|
|
158
|
+
const app = new Skybridge({ name: "t", version: "0.0.0" }, (server) => server);
|
|
159
|
+
app.use(mw);
|
|
157
160
|
const httpServer = http.createServer();
|
|
158
|
-
const
|
|
159
|
-
const { port, server: httpListening } = await listen(
|
|
161
|
+
const expressApp = await createApp({ app, httpServer });
|
|
162
|
+
const { port, server: httpListening } = await listen(expressApp);
|
|
160
163
|
openServer = httpListening;
|
|
161
164
|
await postMcp(port);
|
|
162
165
|
expect(calls).toEqual(["custom"]);
|
|
@@ -168,11 +171,11 @@ describe("createApp", () => {
|
|
|
168
171
|
calls.push("auth");
|
|
169
172
|
next();
|
|
170
173
|
};
|
|
171
|
-
const
|
|
172
|
-
|
|
174
|
+
const app = new Skybridge({ name: "t", version: "0.0.0" }, (server) => server);
|
|
175
|
+
app.use("/mcp", mw);
|
|
173
176
|
const httpServer = http.createServer();
|
|
174
|
-
const
|
|
175
|
-
const { port, server: httpListening } = await listen(
|
|
177
|
+
const expressApp = await createApp({ app, httpServer });
|
|
178
|
+
const { port, server: httpListening } = await listen(expressApp);
|
|
176
179
|
openServer = httpListening;
|
|
177
180
|
await postMcp(port);
|
|
178
181
|
expect(calls).toEqual(["auth"]);
|
|
@@ -184,11 +187,11 @@ describe("createApp", () => {
|
|
|
184
187
|
calls.push("reject");
|
|
185
188
|
res.status(401).json({ error: "Unauthorized" });
|
|
186
189
|
};
|
|
187
|
-
const
|
|
188
|
-
|
|
190
|
+
const app = new Skybridge({ name: "t", version: "0.0.0" }, (server) => server);
|
|
191
|
+
app.use("/mcp", reject);
|
|
189
192
|
const httpServer = http.createServer();
|
|
190
|
-
const
|
|
191
|
-
const { port, server: httpListening } = await listen(
|
|
193
|
+
const expressApp = await createApp({ app, httpServer });
|
|
194
|
+
const { port, server: httpListening } = await listen(expressApp);
|
|
192
195
|
openServer = httpListening;
|
|
193
196
|
const res = await postMcp(port);
|
|
194
197
|
expect(calls).toEqual(["reject"]);
|
|
@@ -206,12 +209,12 @@ describe("createApp", () => {
|
|
|
206
209
|
calls.push("B");
|
|
207
210
|
next();
|
|
208
211
|
};
|
|
209
|
-
const
|
|
210
|
-
|
|
211
|
-
|
|
212
|
+
const app = new Skybridge({ name: "t", version: "0.0.0" }, (server) => server);
|
|
213
|
+
app.use(mwA);
|
|
214
|
+
app.use(mwB);
|
|
212
215
|
const httpServer = http.createServer();
|
|
213
|
-
const
|
|
214
|
-
const { port, server: httpListening } = await listen(
|
|
216
|
+
const expressApp = await createApp({ app, httpServer });
|
|
217
|
+
const { port, server: httpListening } = await listen(expressApp);
|
|
215
218
|
openServer = httpListening;
|
|
216
219
|
await postMcp(port);
|
|
217
220
|
expect(calls).toEqual(["A", "B"]);
|
|
@@ -223,11 +226,11 @@ describe("createApp", () => {
|
|
|
223
226
|
calls.push("api");
|
|
224
227
|
next();
|
|
225
228
|
};
|
|
226
|
-
const
|
|
227
|
-
|
|
229
|
+
const app = new Skybridge({ name: "t", version: "0.0.0" }, (server) => server);
|
|
230
|
+
app.use("/api", apiMw);
|
|
228
231
|
const httpServer = http.createServer();
|
|
229
|
-
const
|
|
230
|
-
const { port, server: httpListening } = await listen(
|
|
232
|
+
const expressApp = await createApp({ app, httpServer });
|
|
233
|
+
const { port, server: httpListening } = await listen(expressApp);
|
|
231
234
|
openServer = httpListening;
|
|
232
235
|
// Hit /mcp — the /api middleware should NOT fire
|
|
233
236
|
await postMcp(port);
|
|
@@ -240,11 +243,11 @@ describe("createApp", () => {
|
|
|
240
243
|
router.get("/health", (_req, res) => {
|
|
241
244
|
res.json({ status: "ok" });
|
|
242
245
|
});
|
|
243
|
-
const
|
|
244
|
-
|
|
246
|
+
const app = new Skybridge({ name: "t", version: "0.0.0" }, (server) => server);
|
|
247
|
+
app.use(router);
|
|
245
248
|
const httpServer = http.createServer();
|
|
246
|
-
const
|
|
247
|
-
const { port, server: httpListening } = await listen(
|
|
249
|
+
const expressApp = await createApp({ app, httpServer });
|
|
250
|
+
const { port, server: httpListening } = await listen(expressApp);
|
|
248
251
|
openServer = httpListening;
|
|
249
252
|
const res = await fetch(`http://localhost:${port}/health`);
|
|
250
253
|
expect(res.status).toBe(200);
|
|
@@ -257,11 +260,11 @@ describe("createApp", () => {
|
|
|
257
260
|
router.get("/data", (_req, res) => {
|
|
258
261
|
res.json({ value: 42 });
|
|
259
262
|
});
|
|
260
|
-
const
|
|
261
|
-
|
|
263
|
+
const app = new Skybridge({ name: "t", version: "0.0.0" }, (server) => server);
|
|
264
|
+
app.use("/api", router);
|
|
262
265
|
const httpServer = http.createServer();
|
|
263
|
-
const
|
|
264
|
-
const { port, server: httpListening } = await listen(
|
|
266
|
+
const expressApp = await createApp({ app, httpServer });
|
|
267
|
+
const { port, server: httpListening } = await listen(expressApp);
|
|
265
268
|
openServer = httpListening;
|
|
266
269
|
const res = await fetch(`http://localhost:${port}/api/data`);
|
|
267
270
|
expect(res.status).toBe(200);
|
|
@@ -272,11 +275,11 @@ describe("createApp", () => {
|
|
|
272
275
|
const throwing = () => {
|
|
273
276
|
throw new Error("boom");
|
|
274
277
|
};
|
|
275
|
-
const
|
|
276
|
-
|
|
278
|
+
const app = new Skybridge({ name: "t", version: "0.0.0" }, (server) => server);
|
|
279
|
+
app.use("/explode", throwing);
|
|
277
280
|
const httpServer = http.createServer();
|
|
278
|
-
const
|
|
279
|
-
const { port, server: httpListening } = await listen(
|
|
281
|
+
const expressApp = await createApp({ app, httpServer });
|
|
282
|
+
const { port, server: httpListening } = await listen(expressApp);
|
|
280
283
|
openServer = httpListening;
|
|
281
284
|
const res = await fetch(`http://localhost:${port}/explode`);
|
|
282
285
|
expect(res.status).toBe(500);
|
|
@@ -287,14 +290,15 @@ describe("createApp", () => {
|
|
|
287
290
|
it("returns 500 JSON-RPC error when the MCP handler throws and no error middleware is registered", async () => {
|
|
288
291
|
const { createApp } = await import("./express.js");
|
|
289
292
|
const consoleSpy = vi.spyOn(console, "error").mockImplementation(() => { });
|
|
290
|
-
const
|
|
291
|
-
// Force the express-level error path: make
|
|
292
|
-
//
|
|
293
|
-
|
|
294
|
-
|
|
293
|
+
const app = new Skybridge({ name: "t", version: "0.0.0" }, (server) => server);
|
|
294
|
+
// Force the express-level error path: make a /mcp middleware throw so the
|
|
295
|
+
// error pipeline runs and lands in the default /mcp error handler.
|
|
296
|
+
app.use("/mcp", () => {
|
|
297
|
+
throw new Error("boom");
|
|
298
|
+
});
|
|
295
299
|
const httpServer = http.createServer();
|
|
296
|
-
const
|
|
297
|
-
const { port, server: httpListening } = await listen(
|
|
300
|
+
const expressApp = await createApp({ app, httpServer });
|
|
301
|
+
const { port, server: httpListening } = await listen(expressApp);
|
|
298
302
|
openServer = httpListening;
|
|
299
303
|
const res = await postMcp(port);
|
|
300
304
|
expect(res.status).toBe(500);
|
|
@@ -313,15 +317,17 @@ describe("createApp", () => {
|
|
|
313
317
|
calls.push("error-handler");
|
|
314
318
|
res.status(503).json({ custom: true });
|
|
315
319
|
};
|
|
316
|
-
const
|
|
317
|
-
|
|
320
|
+
const app = new Skybridge({ name: "t", version: "0.0.0" }, (server) => server);
|
|
321
|
+
app.use("/mcp", () => {
|
|
322
|
+
throw new Error("boom");
|
|
323
|
+
});
|
|
318
324
|
const httpServer = http.createServer();
|
|
319
|
-
const
|
|
320
|
-
|
|
325
|
+
const expressApp = await createApp({
|
|
326
|
+
app,
|
|
321
327
|
httpServer,
|
|
322
328
|
errorMiddleware: [{ handlers: [errorHandler] }],
|
|
323
329
|
});
|
|
324
|
-
const { port, server: httpListening } = await listen(
|
|
330
|
+
const { port, server: httpListening } = await listen(expressApp);
|
|
325
331
|
openServer = httpListening;
|
|
326
332
|
const res = await postMcp(port);
|
|
327
333
|
expect(calls).toEqual(["error-handler"]);
|
|
@@ -338,16 +344,18 @@ describe("createApp", () => {
|
|
|
338
344
|
const throwingApiRoute = (_req, _res, next) => {
|
|
339
345
|
next(new Error("api error"));
|
|
340
346
|
};
|
|
341
|
-
const
|
|
342
|
-
|
|
343
|
-
|
|
347
|
+
const app = new Skybridge({ name: "t", version: "0.0.0" }, (server) => server);
|
|
348
|
+
app.use("/mcp", () => {
|
|
349
|
+
throw new Error("boom");
|
|
350
|
+
});
|
|
351
|
+
app.use("/api/test", throwingApiRoute);
|
|
344
352
|
const httpServer = http.createServer();
|
|
345
|
-
const
|
|
346
|
-
|
|
353
|
+
const expressApp = await createApp({
|
|
354
|
+
app,
|
|
347
355
|
httpServer,
|
|
348
356
|
errorMiddleware: [{ path: "/mcp", handlers: [mcpErrorHandler] }],
|
|
349
357
|
});
|
|
350
|
-
const { port, server: httpListening } = await listen(
|
|
358
|
+
const { port, server: httpListening } = await listen(expressApp);
|
|
351
359
|
openServer = httpListening;
|
|
352
360
|
const mcpRes = await postMcp(port);
|
|
353
361
|
expect(calls).toEqual(["mcp-error-handler"]);
|
|
@@ -361,20 +369,16 @@ describe("createApp", () => {
|
|
|
361
369
|
});
|
|
362
370
|
it("handles concurrent /mcp requests without 'Already connected to a transport'", async () => {
|
|
363
371
|
const { createApp } = await import("./express.js");
|
|
364
|
-
const mcpServer = new McpServer({
|
|
365
|
-
name: "concurrent-test",
|
|
366
|
-
version: "0.0.0",
|
|
367
|
-
});
|
|
368
372
|
// Slow tool: keeps the underlying transport bound long enough to overlap
|
|
369
373
|
// with concurrent requests, exposing the shared-McpServer race.
|
|
370
|
-
|
|
374
|
+
const app = new Skybridge({ name: "concurrent-test", version: "0.0.0" }, (server) => server.registerTool({ name: "slow", description: "slow" }, async () => {
|
|
371
375
|
await new Promise((r) => setTimeout(r, 50));
|
|
372
376
|
return { content: [{ type: "text", text: "done" }] };
|
|
373
|
-
});
|
|
377
|
+
}));
|
|
374
378
|
const consoleSpy = vi.spyOn(console, "error").mockImplementation(() => { });
|
|
375
379
|
const httpServer = http.createServer();
|
|
376
|
-
const
|
|
377
|
-
const { port, server } = await listen(
|
|
380
|
+
const expressApp = await createApp({ app, httpServer });
|
|
381
|
+
const { port, server } = await listen(expressApp);
|
|
378
382
|
openServer = server;
|
|
379
383
|
const callBody = (id) => JSON.stringify({
|
|
380
384
|
jsonrpc: "2.0",
|
|
@@ -397,19 +401,19 @@ describe("createApp", () => {
|
|
|
397
401
|
});
|
|
398
402
|
});
|
|
399
403
|
describe("createApp Vercel mode", () => {
|
|
400
|
-
it("
|
|
404
|
+
it("app.run() returns the Express app without binding a port when VERCEL=1", async () => {
|
|
401
405
|
const prevVercel = process.env.VERCEL;
|
|
402
406
|
const prevEnv = process.env.NODE_ENV;
|
|
403
407
|
process.env.VERCEL = "1";
|
|
404
408
|
process.env.NODE_ENV = "production";
|
|
405
409
|
try {
|
|
406
410
|
vi.resetModules();
|
|
407
|
-
const {
|
|
408
|
-
const
|
|
409
|
-
const result = await
|
|
411
|
+
const { Skybridge: Reloaded } = await import("./app.js");
|
|
412
|
+
const app = new Reloaded({ name: "t", version: "0.0.0" }, (server) => server);
|
|
413
|
+
const result = await app.run();
|
|
410
414
|
expect(typeof result).toBe("function");
|
|
411
|
-
expect(result).toBe(
|
|
412
|
-
const { port, server: listening } = await listen(
|
|
415
|
+
expect(result).toBe(app.express);
|
|
416
|
+
const { port, server: listening } = await listen(app.express);
|
|
413
417
|
openServer = listening;
|
|
414
418
|
const res = await postMcp(port);
|
|
415
419
|
expect(res.status).not.toBe(404);
|
|
@@ -444,10 +448,10 @@ describe("createApp tunnel routes", () => {
|
|
|
444
448
|
process.env.__TUNNEL_CONTROL_PORT = String(controlPort);
|
|
445
449
|
try {
|
|
446
450
|
const { createApp } = await import("./express.js");
|
|
447
|
-
const
|
|
451
|
+
const app = new Skybridge({ name: "t", version: "0.0.0" }, (server) => server);
|
|
448
452
|
const httpServer = http.createServer();
|
|
449
|
-
const
|
|
450
|
-
const { port, server } = await listen(
|
|
453
|
+
const expressApp = await createApp({ app, httpServer });
|
|
454
|
+
const { port, server } = await listen(expressApp);
|
|
451
455
|
openServer = server;
|
|
452
456
|
const res = await fetch(`http://localhost:${port}/__skybridge/tunnel`, {
|
|
453
457
|
method: "POST",
|
|
@@ -471,11 +475,11 @@ describe("createApp tunnel routes", () => {
|
|
|
471
475
|
try {
|
|
472
476
|
vi.resetModules();
|
|
473
477
|
const { createApp } = await import("./express.js");
|
|
474
|
-
const {
|
|
475
|
-
const
|
|
478
|
+
const { Skybridge: ReloadedSkybridge } = await import("./app.js");
|
|
479
|
+
const app = new ReloadedSkybridge({ name: "t", version: "0.0.0" }, (server) => server);
|
|
476
480
|
const httpServer = http.createServer();
|
|
477
|
-
const
|
|
478
|
-
const { port, server } = await listen(
|
|
481
|
+
const expressApp = await createApp({ app, httpServer });
|
|
482
|
+
const { port, server } = await listen(expressApp);
|
|
479
483
|
openServer = server;
|
|
480
484
|
const res = await fetch(`http://localhost:${port}/__skybridge/tunnel`, {
|
|
481
485
|
method: "POST",
|
|
@@ -488,4 +492,28 @@ describe("createApp tunnel routes", () => {
|
|
|
488
492
|
}
|
|
489
493
|
});
|
|
490
494
|
});
|
|
495
|
+
describe("createApp mount path", () => {
|
|
496
|
+
it("serves /mcp with the mount path intact on the request URL", async () => {
|
|
497
|
+
const { createApp } = await import("./express.js");
|
|
498
|
+
const app = new Skybridge({ name: "t", version: "0.0.0" }, (server) => server.registerTool({
|
|
499
|
+
name: "echo-url",
|
|
500
|
+
description: "Echoes the request URL.",
|
|
501
|
+
inputSchema: {},
|
|
502
|
+
}, (_args, extra) => ({
|
|
503
|
+
content: [{ type: "text", text: extra.http?.req?.url ?? "" }],
|
|
504
|
+
})));
|
|
505
|
+
const httpServer = http.createServer();
|
|
506
|
+
const expressApp = await createApp({ app, httpServer });
|
|
507
|
+
const { port, server } = await listen(expressApp);
|
|
508
|
+
openServer = server;
|
|
509
|
+
const client = new Client({ name: "test-client", version: "0.0.0" });
|
|
510
|
+
await client.connect(new StreamableHTTPClientTransport(new URL(`http://localhost:${port}/mcp`)));
|
|
511
|
+
const result = (await client.callTool({
|
|
512
|
+
name: "echo-url",
|
|
513
|
+
arguments: {},
|
|
514
|
+
}));
|
|
515
|
+
await client.close();
|
|
516
|
+
expect(new URL(result.content[0]?.text ?? "").pathname).toBe("/mcp");
|
|
517
|
+
});
|
|
518
|
+
});
|
|
491
519
|
//# sourceMappingURL=express.test.js.map
|