skybridge 0.0.0-dev.e9a7859 → 0.0.0-dev.e9ac102
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -14
- 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/detect-port.js +0 -1
- package/dist/cli/detect-port.js.map +1 -1
- 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 +90 -0
- package/dist/cli/run-plain.js.map +1 -0
- package/dist/cli/telemetry.js +2 -0
- package/dist/cli/telemetry.js.map +1 -1
- package/dist/cli/use-execute-steps.d.ts +1 -1
- package/dist/cli/use-nodemon.d.ts +25 -1
- package/dist/cli/use-nodemon.js +96 -63
- 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 +38 -6
- 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 +195 -0
- package/dist/server/app.js +268 -0
- package/dist/server/app.js.map +1 -0
- package/dist/server/app.test.js +196 -0
- package/dist/server/app.test.js.map +1 -0
- package/dist/server/auth/discovery.d.ts +2 -1
- package/dist/server/auth/discovery.js +2 -2
- package/dist/server/auth/discovery.js.map +1 -1
- package/dist/server/auth/index.d.ts +35 -5
- package/dist/server/auth/index.js.map +1 -1
- package/dist/server/auth/providers/auth0.d.ts +25 -3
- 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 +5 -3
- package/dist/server/auth/providers/auth0.test.js.map +1 -1
- 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.js +143 -0
- package/dist/server/auth/providers/authplane.test.js.map +1 -0
- package/dist/server/auth/providers/clerk.d.ts +40 -3
- package/dist/server/auth/providers/clerk.js +4 -1
- package/dist/server/auth/providers/clerk.js.map +1 -1
- package/dist/server/auth/providers/clerk.test.js +5 -3
- package/dist/server/auth/providers/clerk.test.js.map +1 -1
- package/dist/server/auth/providers/custom.d.ts +24 -6
- package/dist/server/auth/providers/custom.js +33 -11
- package/dist/server/auth/providers/custom.js.map +1 -1
- package/dist/server/auth/providers/custom.test.js +71 -17
- package/dist/server/auth/providers/custom.test.js.map +1 -1
- package/dist/server/auth/providers/descope.d.ts +32 -3
- package/dist/server/auth/providers/descope.js +12 -2
- package/dist/server/auth/providers/descope.js.map +1 -1
- package/dist/server/auth/providers/descope.test.js +42 -18
- package/dist/server/auth/providers/descope.test.js.map +1 -1
- package/dist/server/auth/providers/stytch.d.ts +16 -3
- package/dist/server/auth/providers/stytch.js +4 -1
- package/dist/server/auth/providers/stytch.js.map +1 -1
- 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 +28 -5
- package/dist/server/auth/providers/workos.js +6 -2
- package/dist/server/auth/providers/workos.js.map +1 -1
- 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 +3 -1
- package/dist/server/auth/setup.js +66 -26
- package/dist/server/auth/setup.js.map +1 -1
- package/dist/server/auth/setup.test.js +349 -20
- package/dist/server/auth/setup.test.js.map +1 -1
- package/dist/server/auth/verify.d.ts +42 -6
- package/dist/server/auth/verify.js +27 -3
- package/dist/server/auth/verify.js.map +1 -1
- package/dist/server/auth/verify.test.js +65 -0
- package/dist/server/auth/verify.test.js.map +1 -1
- package/dist/server/auth-extra.test-d.js +130 -0
- package/dist/server/auth-extra.test-d.js.map +1 -0
- package/dist/server/auth.d.ts +43 -6
- package/dist/server/auth.js +4 -5
- 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/content-helpers.d.ts +1 -1
- package/dist/server/content-helpers.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.d.ts +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 +43 -32
- package/dist/server/express.js.map +1 -1
- package/dist/server/express.test.js +221 -103
- 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/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 +18 -9
- package/dist/server/index.js +11 -3
- 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 +41 -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 +242 -134
- 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 +230 -0
- package/dist/server/register-tool.test.js.map +1 -0
- package/dist/server/server.d.ts +373 -128
- package/dist/server/server.js +441 -274
- 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 +86 -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/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.d.ts +1 -0
- package/dist/server/tool-extra.test.js +167 -0
- package/dist/server/tool-extra.test.js.map +1 -0
- package/dist/server/view-resource-resolution.test.js +18 -13
- 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/test/utils.d.ts +9 -11
- package/dist/test/utils.js +220 -201
- package/dist/test/utils.js.map +1 -1
- package/dist/test/view.test.js +44 -40
- 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.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 +14 -3
- package/dist/web/bridges/adaptor.js +181 -17
- package/dist/web/bridges/adaptor.js.map +1 -1
- package/dist/web/bridges/adaptor.test.js +95 -11
- 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/types.d.ts +2 -3
- package/dist/web/bridges/apps-sdk/types.js.map +1 -1
- package/dist/web/bridges/apps-sdk/use-apps-sdk-context.d.ts +4 -4
- package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js +4 -4
- 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 +15 -6
- 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 +19 -2
- 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 +74 -16
- package/dist/web/bridges/types.js +1 -1
- package/dist/web/bridges/types.js.map +1 -1
- package/dist/web/components/modal-provider.d.ts +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.d.ts +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 +17 -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 +6 -1
- package/dist/web/hooks/index.js +6 -1
- package/dist/web/hooks/index.js.map +1 -1
- package/dist/web/hooks/openai-extensions.test.d.ts +1 -0
- 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/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.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.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 +1 -1
- 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 +7 -7
- 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.d.ts +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 +44 -0
- package/dist/web/hooks/use-host.js +45 -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-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 +3 -4
- 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.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 +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.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 +2 -7
- 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 +5 -3
- 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 +33 -2
- 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-layout.test.js → use-viewport.test.js} +12 -32
- package/dist/web/hooks/use-viewport.test.js.map +1 -0
- package/dist/web/mount-view.d.ts +3 -2
- package/dist/web/mount-view.js +5 -8
- package/dist/web/mount-view.js.map +1 -1
- package/package.json +34 -29
- package/dist/cli/resolve-views-dir.d.ts +0 -1
- package/dist/cli/resolve-views-dir.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.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/scan-views.test.d.ts → server/app.test.d.ts} +0 -0
- /package/dist/{web/plugin/validate-view.test.d.ts → server/auth/providers/authplane.test.d.ts} +0 -0
- /package/dist/{web/plugin/transform-data-llm.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,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,36 +26,49 @@ 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
|
-
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
const app = new Skybridge({
|
|
32
|
+
name: "t",
|
|
33
|
+
version: "0.0.0",
|
|
34
|
+
handler: (server) => server,
|
|
35
|
+
});
|
|
36
|
+
expect(app.express).toBeDefined();
|
|
37
|
+
expect(typeof app.express.use).toBe("function");
|
|
38
|
+
expect(typeof app.express.get).toBe("function");
|
|
34
39
|
});
|
|
35
|
-
it("
|
|
40
|
+
it("app.express.get registers a route reachable alongside /mcp", async () => {
|
|
36
41
|
const { createApp } = await import("./express.js");
|
|
37
|
-
const
|
|
38
|
-
|
|
42
|
+
const app = new Skybridge({
|
|
43
|
+
name: "t",
|
|
44
|
+
version: "0.0.0",
|
|
45
|
+
handler: (server) => server,
|
|
46
|
+
});
|
|
47
|
+
app.express.get("/health", (_req, res) => {
|
|
39
48
|
res.json({ status: "ok" });
|
|
40
49
|
});
|
|
41
50
|
const httpServer = http.createServer();
|
|
42
|
-
await createApp({
|
|
43
|
-
const { port, server: listening } = await listen(
|
|
51
|
+
await createApp({ app, httpServer });
|
|
52
|
+
const { port, server: listening } = await listen(app.express);
|
|
44
53
|
openServer = listening;
|
|
45
54
|
const health = await fetch(`http://localhost:${port}/health`);
|
|
46
55
|
expect(health.status).toBe(200);
|
|
56
|
+
expect(health.headers.get("x-powered-by")).toBe("skybridge");
|
|
47
57
|
expect(await health.json()).toEqual({ status: "ok" });
|
|
48
58
|
// /mcp still works (POST returns 200/4xx, not 404)
|
|
49
59
|
const mcp = await postMcp(port);
|
|
50
60
|
expect(mcp.status).not.toBe(404);
|
|
51
61
|
});
|
|
52
|
-
it("
|
|
62
|
+
it("app.use and app.express.use produce the same registration order", async () => {
|
|
53
63
|
const { createApp } = await import("./express.js");
|
|
54
64
|
const callsA = [];
|
|
55
65
|
const callsB = [];
|
|
56
|
-
const
|
|
57
|
-
|
|
66
|
+
const buildApp = () => new Skybridge({
|
|
67
|
+
name: "t",
|
|
68
|
+
version: "0.0.0",
|
|
69
|
+
handler: (server) => server,
|
|
70
|
+
});
|
|
71
|
+
const sA = buildApp();
|
|
58
72
|
sA.use((_req, _res, next) => {
|
|
59
73
|
callsA.push("first");
|
|
60
74
|
next();
|
|
@@ -63,7 +77,7 @@ describe("McpServer.express", () => {
|
|
|
63
77
|
callsA.push("second");
|
|
64
78
|
next();
|
|
65
79
|
});
|
|
66
|
-
const sB =
|
|
80
|
+
const sB = buildApp();
|
|
67
81
|
sB.express.use((_req, _res, next) => {
|
|
68
82
|
callsB.push("first");
|
|
69
83
|
next();
|
|
@@ -75,7 +89,7 @@ describe("McpServer.express", () => {
|
|
|
75
89
|
for (const s of [sA, sB]) {
|
|
76
90
|
s.express.get("/probe", (_req, res) => res.json({ ok: true }));
|
|
77
91
|
const httpServer = http.createServer();
|
|
78
|
-
await createApp({
|
|
92
|
+
await createApp({ app: s, httpServer });
|
|
79
93
|
const { port, server: listening } = await listen(s.express);
|
|
80
94
|
openServer = listening;
|
|
81
95
|
await fetch(`http://localhost:${port}/probe`);
|
|
@@ -86,26 +100,32 @@ describe("McpServer.express", () => {
|
|
|
86
100
|
});
|
|
87
101
|
it("useOnError still wraps thrown /mcp errors after the route is mounted", async () => {
|
|
88
102
|
const { createApp } = await import("./express.js");
|
|
89
|
-
const
|
|
103
|
+
const app = new Skybridge({
|
|
104
|
+
name: "t",
|
|
105
|
+
version: "0.0.0",
|
|
106
|
+
handler: (server) => server,
|
|
107
|
+
});
|
|
90
108
|
// Register the error handler BEFORE createApp — useOnError should still
|
|
91
109
|
// apply it after /mcp, so /mcp errors hit it.
|
|
92
110
|
const seen = [];
|
|
93
|
-
|
|
111
|
+
app.useOnError((_err, _req, res, _next) => {
|
|
94
112
|
seen.push("useOnError");
|
|
95
113
|
res.status(503).json({ from: "useOnError" });
|
|
96
114
|
});
|
|
97
115
|
// Force the /mcp handler to throw so the error pipeline runs.
|
|
98
|
-
|
|
116
|
+
app.use("/mcp", () => {
|
|
117
|
+
throw new Error("boom");
|
|
118
|
+
});
|
|
99
119
|
const httpServer = http.createServer();
|
|
100
120
|
await createApp({
|
|
101
|
-
|
|
121
|
+
app,
|
|
102
122
|
httpServer,
|
|
103
|
-
// Mirror what run() does: forward the
|
|
123
|
+
// Mirror what run() does: forward the app's useOnError handlers
|
|
104
124
|
// to createApp so they get applied after /mcp.
|
|
105
125
|
// biome-ignore lint/complexity/useLiteralKeys: test mirrors run() internals to verify useOnError ordering
|
|
106
|
-
errorMiddleware:
|
|
126
|
+
errorMiddleware: app["errorMiddleware"],
|
|
107
127
|
});
|
|
108
|
-
const { port, server: listening } = await listen(
|
|
128
|
+
const { port, server: listening } = await listen(app.express);
|
|
109
129
|
openServer = listening;
|
|
110
130
|
const res = await postMcp(port);
|
|
111
131
|
expect(seen).toEqual(["useOnError"]);
|
|
@@ -113,7 +133,7 @@ describe("McpServer.express", () => {
|
|
|
113
133
|
expect(await res.json()).toEqual({ from: "useOnError" });
|
|
114
134
|
});
|
|
115
135
|
});
|
|
116
|
-
describe("
|
|
136
|
+
describe("Skybridge JSON body parser options", () => {
|
|
117
137
|
const largeBody = JSON.stringify({ data: "x".repeat(200 * 1024) });
|
|
118
138
|
async function postEcho(port, body) {
|
|
119
139
|
return fetch(`http://localhost:${port}/echo`, {
|
|
@@ -123,22 +143,31 @@ describe("McpServer JSON body parser options", () => {
|
|
|
123
143
|
});
|
|
124
144
|
}
|
|
125
145
|
it("forwards json options to express.json", async () => {
|
|
126
|
-
const
|
|
127
|
-
|
|
146
|
+
const app = new Skybridge({
|
|
147
|
+
name: "t",
|
|
148
|
+
version: "0.0.0",
|
|
149
|
+
json: { limit: "10mb" },
|
|
150
|
+
handler: (server) => server,
|
|
151
|
+
});
|
|
152
|
+
app.express.post("/echo", (req, res) => {
|
|
128
153
|
res.json({ received: req.body.data.length });
|
|
129
154
|
});
|
|
130
|
-
const { port, server: listening } = await listen(
|
|
155
|
+
const { port, server: listening } = await listen(app.express);
|
|
131
156
|
openServer = listening;
|
|
132
157
|
const res = await postEcho(port, largeBody);
|
|
133
158
|
expect(res.status).toBe(200);
|
|
134
159
|
expect(await res.json()).toEqual({ received: 200 * 1024 });
|
|
135
160
|
});
|
|
136
161
|
it("keeps the default 100kb limit when no options are passed", async () => {
|
|
137
|
-
const
|
|
138
|
-
|
|
162
|
+
const app = new Skybridge({
|
|
163
|
+
name: "t",
|
|
164
|
+
version: "0.0.0",
|
|
165
|
+
handler: (server) => server,
|
|
166
|
+
});
|
|
167
|
+
app.express.post("/echo", (_req, res) => {
|
|
139
168
|
res.json({ ok: true });
|
|
140
169
|
});
|
|
141
|
-
const { port, server: listening } = await listen(
|
|
170
|
+
const { port, server: listening } = await listen(app.express);
|
|
142
171
|
openServer = listening;
|
|
143
172
|
const res = await postEcho(port, largeBody);
|
|
144
173
|
expect(res.status).toBe(413);
|
|
@@ -152,11 +181,15 @@ describe("createApp", () => {
|
|
|
152
181
|
calls.push("custom");
|
|
153
182
|
next();
|
|
154
183
|
};
|
|
155
|
-
const
|
|
156
|
-
|
|
184
|
+
const app = new Skybridge({
|
|
185
|
+
name: "t",
|
|
186
|
+
version: "0.0.0",
|
|
187
|
+
handler: (server) => server,
|
|
188
|
+
});
|
|
189
|
+
app.use(mw);
|
|
157
190
|
const httpServer = http.createServer();
|
|
158
|
-
const
|
|
159
|
-
const { port, server: httpListening } = await listen(
|
|
191
|
+
const expressApp = await createApp({ app, httpServer });
|
|
192
|
+
const { port, server: httpListening } = await listen(expressApp);
|
|
160
193
|
openServer = httpListening;
|
|
161
194
|
await postMcp(port);
|
|
162
195
|
expect(calls).toEqual(["custom"]);
|
|
@@ -168,11 +201,15 @@ describe("createApp", () => {
|
|
|
168
201
|
calls.push("auth");
|
|
169
202
|
next();
|
|
170
203
|
};
|
|
171
|
-
const
|
|
172
|
-
|
|
204
|
+
const app = new Skybridge({
|
|
205
|
+
name: "t",
|
|
206
|
+
version: "0.0.0",
|
|
207
|
+
handler: (server) => server,
|
|
208
|
+
});
|
|
209
|
+
app.use("/mcp", mw);
|
|
173
210
|
const httpServer = http.createServer();
|
|
174
|
-
const
|
|
175
|
-
const { port, server: httpListening } = await listen(
|
|
211
|
+
const expressApp = await createApp({ app, httpServer });
|
|
212
|
+
const { port, server: httpListening } = await listen(expressApp);
|
|
176
213
|
openServer = httpListening;
|
|
177
214
|
await postMcp(port);
|
|
178
215
|
expect(calls).toEqual(["auth"]);
|
|
@@ -184,11 +221,15 @@ describe("createApp", () => {
|
|
|
184
221
|
calls.push("reject");
|
|
185
222
|
res.status(401).json({ error: "Unauthorized" });
|
|
186
223
|
};
|
|
187
|
-
const
|
|
188
|
-
|
|
224
|
+
const app = new Skybridge({
|
|
225
|
+
name: "t",
|
|
226
|
+
version: "0.0.0",
|
|
227
|
+
handler: (server) => server,
|
|
228
|
+
});
|
|
229
|
+
app.use("/mcp", reject);
|
|
189
230
|
const httpServer = http.createServer();
|
|
190
|
-
const
|
|
191
|
-
const { port, server: httpListening } = await listen(
|
|
231
|
+
const expressApp = await createApp({ app, httpServer });
|
|
232
|
+
const { port, server: httpListening } = await listen(expressApp);
|
|
192
233
|
openServer = httpListening;
|
|
193
234
|
const res = await postMcp(port);
|
|
194
235
|
expect(calls).toEqual(["reject"]);
|
|
@@ -206,12 +247,16 @@ describe("createApp", () => {
|
|
|
206
247
|
calls.push("B");
|
|
207
248
|
next();
|
|
208
249
|
};
|
|
209
|
-
const
|
|
210
|
-
|
|
211
|
-
|
|
250
|
+
const app = new Skybridge({
|
|
251
|
+
name: "t",
|
|
252
|
+
version: "0.0.0",
|
|
253
|
+
handler: (server) => server,
|
|
254
|
+
});
|
|
255
|
+
app.use(mwA);
|
|
256
|
+
app.use(mwB);
|
|
212
257
|
const httpServer = http.createServer();
|
|
213
|
-
const
|
|
214
|
-
const { port, server: httpListening } = await listen(
|
|
258
|
+
const expressApp = await createApp({ app, httpServer });
|
|
259
|
+
const { port, server: httpListening } = await listen(expressApp);
|
|
215
260
|
openServer = httpListening;
|
|
216
261
|
await postMcp(port);
|
|
217
262
|
expect(calls).toEqual(["A", "B"]);
|
|
@@ -223,11 +268,15 @@ describe("createApp", () => {
|
|
|
223
268
|
calls.push("api");
|
|
224
269
|
next();
|
|
225
270
|
};
|
|
226
|
-
const
|
|
227
|
-
|
|
271
|
+
const app = new Skybridge({
|
|
272
|
+
name: "t",
|
|
273
|
+
version: "0.0.0",
|
|
274
|
+
handler: (server) => server,
|
|
275
|
+
});
|
|
276
|
+
app.use("/api", apiMw);
|
|
228
277
|
const httpServer = http.createServer();
|
|
229
|
-
const
|
|
230
|
-
const { port, server: httpListening } = await listen(
|
|
278
|
+
const expressApp = await createApp({ app, httpServer });
|
|
279
|
+
const { port, server: httpListening } = await listen(expressApp);
|
|
231
280
|
openServer = httpListening;
|
|
232
281
|
// Hit /mcp — the /api middleware should NOT fire
|
|
233
282
|
await postMcp(port);
|
|
@@ -240,11 +289,15 @@ describe("createApp", () => {
|
|
|
240
289
|
router.get("/health", (_req, res) => {
|
|
241
290
|
res.json({ status: "ok" });
|
|
242
291
|
});
|
|
243
|
-
const
|
|
244
|
-
|
|
292
|
+
const app = new Skybridge({
|
|
293
|
+
name: "t",
|
|
294
|
+
version: "0.0.0",
|
|
295
|
+
handler: (server) => server,
|
|
296
|
+
});
|
|
297
|
+
app.use(router);
|
|
245
298
|
const httpServer = http.createServer();
|
|
246
|
-
const
|
|
247
|
-
const { port, server: httpListening } = await listen(
|
|
299
|
+
const expressApp = await createApp({ app, httpServer });
|
|
300
|
+
const { port, server: httpListening } = await listen(expressApp);
|
|
248
301
|
openServer = httpListening;
|
|
249
302
|
const res = await fetch(`http://localhost:${port}/health`);
|
|
250
303
|
expect(res.status).toBe(200);
|
|
@@ -257,11 +310,15 @@ describe("createApp", () => {
|
|
|
257
310
|
router.get("/data", (_req, res) => {
|
|
258
311
|
res.json({ value: 42 });
|
|
259
312
|
});
|
|
260
|
-
const
|
|
261
|
-
|
|
313
|
+
const app = new Skybridge({
|
|
314
|
+
name: "t",
|
|
315
|
+
version: "0.0.0",
|
|
316
|
+
handler: (server) => server,
|
|
317
|
+
});
|
|
318
|
+
app.use("/api", router);
|
|
262
319
|
const httpServer = http.createServer();
|
|
263
|
-
const
|
|
264
|
-
const { port, server: httpListening } = await listen(
|
|
320
|
+
const expressApp = await createApp({ app, httpServer });
|
|
321
|
+
const { port, server: httpListening } = await listen(expressApp);
|
|
265
322
|
openServer = httpListening;
|
|
266
323
|
const res = await fetch(`http://localhost:${port}/api/data`);
|
|
267
324
|
expect(res.status).toBe(200);
|
|
@@ -272,11 +329,15 @@ describe("createApp", () => {
|
|
|
272
329
|
const throwing = () => {
|
|
273
330
|
throw new Error("boom");
|
|
274
331
|
};
|
|
275
|
-
const
|
|
276
|
-
|
|
332
|
+
const app = new Skybridge({
|
|
333
|
+
name: "t",
|
|
334
|
+
version: "0.0.0",
|
|
335
|
+
handler: (server) => server,
|
|
336
|
+
});
|
|
337
|
+
app.use("/explode", throwing);
|
|
277
338
|
const httpServer = http.createServer();
|
|
278
|
-
const
|
|
279
|
-
const { port, server: httpListening } = await listen(
|
|
339
|
+
const expressApp = await createApp({ app, httpServer });
|
|
340
|
+
const { port, server: httpListening } = await listen(expressApp);
|
|
280
341
|
openServer = httpListening;
|
|
281
342
|
const res = await fetch(`http://localhost:${port}/explode`);
|
|
282
343
|
expect(res.status).toBe(500);
|
|
@@ -287,14 +348,19 @@ describe("createApp", () => {
|
|
|
287
348
|
it("returns 500 JSON-RPC error when the MCP handler throws and no error middleware is registered", async () => {
|
|
288
349
|
const { createApp } = await import("./express.js");
|
|
289
350
|
const consoleSpy = vi.spyOn(console, "error").mockImplementation(() => { });
|
|
290
|
-
const
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
351
|
+
const app = new Skybridge({
|
|
352
|
+
name: "t",
|
|
353
|
+
version: "0.0.0",
|
|
354
|
+
handler: (server) => server,
|
|
355
|
+
});
|
|
356
|
+
// Force the express-level error path: make a /mcp middleware throw so the
|
|
357
|
+
// error pipeline runs and lands in the default /mcp error handler.
|
|
358
|
+
app.use("/mcp", () => {
|
|
359
|
+
throw new Error("boom");
|
|
360
|
+
});
|
|
295
361
|
const httpServer = http.createServer();
|
|
296
|
-
const
|
|
297
|
-
const { port, server: httpListening } = await listen(
|
|
362
|
+
const expressApp = await createApp({ app, httpServer });
|
|
363
|
+
const { port, server: httpListening } = await listen(expressApp);
|
|
298
364
|
openServer = httpListening;
|
|
299
365
|
const res = await postMcp(port);
|
|
300
366
|
expect(res.status).toBe(500);
|
|
@@ -313,15 +379,21 @@ describe("createApp", () => {
|
|
|
313
379
|
calls.push("error-handler");
|
|
314
380
|
res.status(503).json({ custom: true });
|
|
315
381
|
};
|
|
316
|
-
const
|
|
317
|
-
|
|
382
|
+
const app = new Skybridge({
|
|
383
|
+
name: "t",
|
|
384
|
+
version: "0.0.0",
|
|
385
|
+
handler: (server) => server,
|
|
386
|
+
});
|
|
387
|
+
app.use("/mcp", () => {
|
|
388
|
+
throw new Error("boom");
|
|
389
|
+
});
|
|
318
390
|
const httpServer = http.createServer();
|
|
319
|
-
const
|
|
320
|
-
|
|
391
|
+
const expressApp = await createApp({
|
|
392
|
+
app,
|
|
321
393
|
httpServer,
|
|
322
394
|
errorMiddleware: [{ handlers: [errorHandler] }],
|
|
323
395
|
});
|
|
324
|
-
const { port, server: httpListening } = await listen(
|
|
396
|
+
const { port, server: httpListening } = await listen(expressApp);
|
|
325
397
|
openServer = httpListening;
|
|
326
398
|
const res = await postMcp(port);
|
|
327
399
|
expect(calls).toEqual(["error-handler"]);
|
|
@@ -338,16 +410,22 @@ describe("createApp", () => {
|
|
|
338
410
|
const throwingApiRoute = (_req, _res, next) => {
|
|
339
411
|
next(new Error("api error"));
|
|
340
412
|
};
|
|
341
|
-
const
|
|
342
|
-
|
|
343
|
-
|
|
413
|
+
const app = new Skybridge({
|
|
414
|
+
name: "t",
|
|
415
|
+
version: "0.0.0",
|
|
416
|
+
handler: (server) => server,
|
|
417
|
+
});
|
|
418
|
+
app.use("/mcp", () => {
|
|
419
|
+
throw new Error("boom");
|
|
420
|
+
});
|
|
421
|
+
app.use("/api/test", throwingApiRoute);
|
|
344
422
|
const httpServer = http.createServer();
|
|
345
|
-
const
|
|
346
|
-
|
|
423
|
+
const expressApp = await createApp({
|
|
424
|
+
app,
|
|
347
425
|
httpServer,
|
|
348
426
|
errorMiddleware: [{ path: "/mcp", handlers: [mcpErrorHandler] }],
|
|
349
427
|
});
|
|
350
|
-
const { port, server: httpListening } = await listen(
|
|
428
|
+
const { port, server: httpListening } = await listen(expressApp);
|
|
351
429
|
openServer = httpListening;
|
|
352
430
|
const mcpRes = await postMcp(port);
|
|
353
431
|
expect(calls).toEqual(["mcp-error-handler"]);
|
|
@@ -361,20 +439,20 @@ describe("createApp", () => {
|
|
|
361
439
|
});
|
|
362
440
|
it("handles concurrent /mcp requests without 'Already connected to a transport'", async () => {
|
|
363
441
|
const { createApp } = await import("./express.js");
|
|
364
|
-
const mcpServer = new McpServer({
|
|
365
|
-
name: "concurrent-test",
|
|
366
|
-
version: "0.0.0",
|
|
367
|
-
});
|
|
368
442
|
// Slow tool: keeps the underlying transport bound long enough to overlap
|
|
369
443
|
// with concurrent requests, exposing the shared-McpServer race.
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
444
|
+
const app = new Skybridge({
|
|
445
|
+
name: "concurrent-test",
|
|
446
|
+
version: "0.0.0",
|
|
447
|
+
handler: (server) => server.registerTool({ name: "slow", description: "slow" }, async () => {
|
|
448
|
+
await new Promise((r) => setTimeout(r, 50));
|
|
449
|
+
return { content: [{ type: "text", text: "done" }] };
|
|
450
|
+
}),
|
|
373
451
|
});
|
|
374
452
|
const consoleSpy = vi.spyOn(console, "error").mockImplementation(() => { });
|
|
375
453
|
const httpServer = http.createServer();
|
|
376
|
-
const
|
|
377
|
-
const { port, server } = await listen(
|
|
454
|
+
const expressApp = await createApp({ app, httpServer });
|
|
455
|
+
const { port, server } = await listen(expressApp);
|
|
378
456
|
openServer = server;
|
|
379
457
|
const callBody = (id) => JSON.stringify({
|
|
380
458
|
jsonrpc: "2.0",
|
|
@@ -397,19 +475,23 @@ describe("createApp", () => {
|
|
|
397
475
|
});
|
|
398
476
|
});
|
|
399
477
|
describe("createApp Vercel mode", () => {
|
|
400
|
-
it("
|
|
478
|
+
it("app.run() returns the Express app without binding a port when VERCEL=1", async () => {
|
|
401
479
|
const prevVercel = process.env.VERCEL;
|
|
402
480
|
const prevEnv = process.env.NODE_ENV;
|
|
403
481
|
process.env.VERCEL = "1";
|
|
404
482
|
process.env.NODE_ENV = "production";
|
|
405
483
|
try {
|
|
406
484
|
vi.resetModules();
|
|
407
|
-
const {
|
|
408
|
-
const
|
|
409
|
-
|
|
485
|
+
const { Skybridge: Reloaded } = await import("./app.js");
|
|
486
|
+
const app = new Reloaded({
|
|
487
|
+
name: "t",
|
|
488
|
+
version: "0.0.0",
|
|
489
|
+
handler: (server) => server,
|
|
490
|
+
});
|
|
491
|
+
const result = await app.run();
|
|
410
492
|
expect(typeof result).toBe("function");
|
|
411
|
-
expect(result).toBe(
|
|
412
|
-
const { port, server: listening } = await listen(
|
|
493
|
+
expect(result).toBe(app.express);
|
|
494
|
+
const { port, server: listening } = await listen(app.express);
|
|
413
495
|
openServer = listening;
|
|
414
496
|
const res = await postMcp(port);
|
|
415
497
|
expect(res.status).not.toBe(404);
|
|
@@ -444,10 +526,14 @@ describe("createApp tunnel routes", () => {
|
|
|
444
526
|
process.env.__TUNNEL_CONTROL_PORT = String(controlPort);
|
|
445
527
|
try {
|
|
446
528
|
const { createApp } = await import("./express.js");
|
|
447
|
-
const
|
|
529
|
+
const app = new Skybridge({
|
|
530
|
+
name: "t",
|
|
531
|
+
version: "0.0.0",
|
|
532
|
+
handler: (server) => server,
|
|
533
|
+
});
|
|
448
534
|
const httpServer = http.createServer();
|
|
449
|
-
const
|
|
450
|
-
const { port, server } = await listen(
|
|
535
|
+
const expressApp = await createApp({ app, httpServer });
|
|
536
|
+
const { port, server } = await listen(expressApp);
|
|
451
537
|
openServer = server;
|
|
452
538
|
const res = await fetch(`http://localhost:${port}/__skybridge/tunnel`, {
|
|
453
539
|
method: "POST",
|
|
@@ -471,11 +557,15 @@ describe("createApp tunnel routes", () => {
|
|
|
471
557
|
try {
|
|
472
558
|
vi.resetModules();
|
|
473
559
|
const { createApp } = await import("./express.js");
|
|
474
|
-
const {
|
|
475
|
-
const
|
|
560
|
+
const { Skybridge: ReloadedSkybridge } = await import("./app.js");
|
|
561
|
+
const app = new ReloadedSkybridge({
|
|
562
|
+
name: "t",
|
|
563
|
+
version: "0.0.0",
|
|
564
|
+
handler: (server) => server,
|
|
565
|
+
});
|
|
476
566
|
const httpServer = http.createServer();
|
|
477
|
-
const
|
|
478
|
-
const { port, server } = await listen(
|
|
567
|
+
const expressApp = await createApp({ app, httpServer });
|
|
568
|
+
const { port, server } = await listen(expressApp);
|
|
479
569
|
openServer = server;
|
|
480
570
|
const res = await fetch(`http://localhost:${port}/__skybridge/tunnel`, {
|
|
481
571
|
method: "POST",
|
|
@@ -488,4 +578,32 @@ describe("createApp tunnel routes", () => {
|
|
|
488
578
|
}
|
|
489
579
|
});
|
|
490
580
|
});
|
|
581
|
+
describe("createApp mount path", () => {
|
|
582
|
+
it("serves /mcp with the mount path intact on the request URL", async () => {
|
|
583
|
+
const { createApp } = await import("./express.js");
|
|
584
|
+
const app = new Skybridge({
|
|
585
|
+
name: "t",
|
|
586
|
+
version: "0.0.0",
|
|
587
|
+
handler: (server) => server.registerTool({
|
|
588
|
+
name: "echo-url",
|
|
589
|
+
description: "Echoes the request URL.",
|
|
590
|
+
inputSchema: {},
|
|
591
|
+
}, (_args, extra) => ({
|
|
592
|
+
content: [{ type: "text", text: extra.http?.req?.url ?? "" }],
|
|
593
|
+
})),
|
|
594
|
+
});
|
|
595
|
+
const httpServer = http.createServer();
|
|
596
|
+
const expressApp = await createApp({ app, httpServer });
|
|
597
|
+
const { port, server } = await listen(expressApp);
|
|
598
|
+
openServer = server;
|
|
599
|
+
const client = new Client({ name: "test-client", version: "0.0.0" });
|
|
600
|
+
await client.connect(new StreamableHTTPClientTransport(new URL(`http://localhost:${port}/mcp`)));
|
|
601
|
+
const result = (await client.callTool({
|
|
602
|
+
name: "echo-url",
|
|
603
|
+
arguments: {},
|
|
604
|
+
}));
|
|
605
|
+
await client.close();
|
|
606
|
+
expect(new URL(result.content[0]?.text ?? "").pathname).toBe("/mcp");
|
|
607
|
+
});
|
|
608
|
+
});
|
|
491
609
|
//# sourceMappingURL=express.test.js.map
|