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