skybridge 0.0.0-dev.e70ae5d → 0.0.0-dev.e7408e9

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.
Files changed (187) hide show
  1. package/README.md +15 -11
  2. package/dist/cli/header.js +1 -1
  3. package/dist/cli/header.js.map +1 -1
  4. package/dist/cli/tunnel-control-server.d.ts +9 -0
  5. package/dist/cli/tunnel-control-server.js +31 -0
  6. package/dist/cli/tunnel-control-server.js.map +1 -0
  7. package/dist/cli/tunnel-control-server.test.js +39 -0
  8. package/dist/cli/tunnel-control-server.test.js.map +1 -0
  9. package/dist/cli/tunnel-handler.d.ts +3 -0
  10. package/dist/cli/tunnel-handler.js +48 -0
  11. package/dist/cli/tunnel-handler.js.map +1 -0
  12. package/dist/cli/tunnel-handler.test.js +105 -0
  13. package/dist/cli/tunnel-handler.test.js.map +1 -0
  14. package/dist/cli/tunnel.d.ts +57 -0
  15. package/dist/cli/tunnel.js +154 -0
  16. package/dist/cli/tunnel.js.map +1 -0
  17. package/dist/cli/tunnel.test.js +190 -0
  18. package/dist/cli/tunnel.test.js.map +1 -0
  19. package/dist/cli/types.d.ts +5 -0
  20. package/dist/cli/types.js +2 -0
  21. package/dist/cli/types.js.map +1 -0
  22. package/dist/cli/use-messages.d.ts +3 -0
  23. package/dist/cli/use-messages.js +11 -0
  24. package/dist/cli/use-messages.js.map +1 -0
  25. package/dist/cli/use-nodemon.d.ts +2 -7
  26. package/dist/cli/use-nodemon.js +8 -20
  27. package/dist/cli/use-nodemon.js.map +1 -1
  28. package/dist/cli/use-tunnel.d.ts +14 -0
  29. package/dist/cli/use-tunnel.js +131 -0
  30. package/dist/cli/use-tunnel.js.map +1 -0
  31. package/dist/cli/use-typescript-check.d.ts +1 -0
  32. package/dist/cli/use-typescript-check.js +41 -6
  33. package/dist/cli/use-typescript-check.js.map +1 -1
  34. package/dist/commands/build.js +28 -7
  35. package/dist/commands/build.js.map +1 -1
  36. package/dist/commands/dev.d.ts +2 -0
  37. package/dist/commands/dev.js +40 -3
  38. package/dist/commands/dev.js.map +1 -1
  39. package/dist/commands/start.js +7 -10
  40. package/dist/commands/start.js.map +1 -1
  41. package/dist/server/asset-base-url-transform-plugin.d.ts +5 -6
  42. package/dist/server/asset-base-url-transform-plugin.js +9 -10
  43. package/dist/server/asset-base-url-transform-plugin.js.map +1 -1
  44. package/dist/server/asset-base-url-transform-plugin.test.js +41 -13
  45. package/dist/server/asset-base-url-transform-plugin.test.js.map +1 -1
  46. package/dist/server/content-helpers.d.ts +27 -0
  47. package/dist/server/content-helpers.js +46 -0
  48. package/dist/server/content-helpers.js.map +1 -0
  49. package/dist/server/content-helpers.test.d.ts +1 -0
  50. package/dist/server/content-helpers.test.js +70 -0
  51. package/dist/server/content-helpers.test.js.map +1 -0
  52. package/dist/server/express.d.ts +6 -2
  53. package/dist/server/express.js +43 -20
  54. package/dist/server/express.js.map +1 -1
  55. package/dist/server/express.test.js +170 -2
  56. package/dist/server/express.test.js.map +1 -1
  57. package/dist/server/index.d.ts +4 -3
  58. package/dist/server/index.js +3 -2
  59. package/dist/server/index.js.map +1 -1
  60. package/dist/server/inferUtilityTypes.d.ts +6 -6
  61. package/dist/server/metric.d.ts +14 -0
  62. package/dist/server/metric.js +62 -0
  63. package/dist/server/metric.js.map +1 -0
  64. package/dist/server/middleware.test.js +12 -9
  65. package/dist/server/middleware.test.js.map +1 -1
  66. package/dist/server/server.d.ts +99 -73
  67. package/dist/server/server.js +227 -66
  68. package/dist/server/server.js.map +1 -1
  69. package/dist/server/templateHelper.d.ts +5 -5
  70. package/dist/server/templates/development.hbs +2 -2
  71. package/dist/server/templates/production.hbs +1 -1
  72. package/dist/server/tunnel-proxy-router.d.ts +7 -0
  73. package/dist/server/tunnel-proxy-router.js +110 -0
  74. package/dist/server/tunnel-proxy-router.js.map +1 -0
  75. package/dist/server/tunnel-proxy-router.test.d.ts +1 -0
  76. package/dist/server/tunnel-proxy-router.test.js +229 -0
  77. package/dist/server/tunnel-proxy-router.test.js.map +1 -0
  78. package/dist/server/viewsDevServer.d.ts +14 -0
  79. package/dist/server/viewsDevServer.js +45 -0
  80. package/dist/server/viewsDevServer.js.map +1 -0
  81. package/dist/test/utils.d.ts +13 -21
  82. package/dist/test/utils.js +42 -37
  83. package/dist/test/utils.js.map +1 -1
  84. package/dist/test/view.test.d.ts +1 -0
  85. package/dist/test/view.test.js +523 -0
  86. package/dist/test/view.test.js.map +1 -0
  87. package/dist/version.d.ts +1 -0
  88. package/dist/version.js +5 -0
  89. package/dist/version.js.map +1 -0
  90. package/dist/web/bridges/apps-sdk/adaptor.d.ts +5 -3
  91. package/dist/web/bridges/apps-sdk/adaptor.js +32 -14
  92. package/dist/web/bridges/apps-sdk/adaptor.js.map +1 -1
  93. package/dist/web/bridges/apps-sdk/types.d.ts +10 -5
  94. package/dist/web/bridges/apps-sdk/types.js.map +1 -1
  95. package/dist/web/bridges/mcp-app/adaptor.d.ts +15 -5
  96. package/dist/web/bridges/mcp-app/adaptor.js +106 -22
  97. package/dist/web/bridges/mcp-app/adaptor.js.map +1 -1
  98. package/dist/web/bridges/types.d.ts +15 -8
  99. package/dist/web/components/modal-provider.js +2 -2
  100. package/dist/web/components/modal-provider.js.map +1 -1
  101. package/dist/web/create-store.js +17 -3
  102. package/dist/web/create-store.js.map +1 -1
  103. package/dist/web/create-store.test.js +14 -16
  104. package/dist/web/create-store.test.js.map +1 -1
  105. package/dist/web/data-llm.d.ts +1 -1
  106. package/dist/web/data-llm.js +3 -3
  107. package/dist/web/data-llm.js.map +1 -1
  108. package/dist/web/data-llm.test.js +22 -22
  109. package/dist/web/data-llm.test.js.map +1 -1
  110. package/dist/web/generate-helpers.d.ts +20 -18
  111. package/dist/web/generate-helpers.js +20 -18
  112. package/dist/web/generate-helpers.js.map +1 -1
  113. package/dist/web/generate-helpers.test-d.js +26 -26
  114. package/dist/web/generate-helpers.test-d.js.map +1 -1
  115. package/dist/web/helpers/state.d.ts +2 -2
  116. package/dist/web/helpers/state.js +11 -11
  117. package/dist/web/helpers/state.js.map +1 -1
  118. package/dist/web/helpers/state.test.js +9 -9
  119. package/dist/web/helpers/state.test.js.map +1 -1
  120. package/dist/web/hooks/index.d.ts +1 -1
  121. package/dist/web/hooks/index.js +1 -1
  122. package/dist/web/hooks/index.js.map +1 -1
  123. package/dist/web/hooks/use-files.d.ts +2 -1
  124. package/dist/web/hooks/use-files.js +1 -0
  125. package/dist/web/hooks/use-files.js.map +1 -1
  126. package/dist/web/hooks/use-files.test.js +22 -2
  127. package/dist/web/hooks/use-files.test.js.map +1 -1
  128. package/dist/web/hooks/use-request-modal.d.ts +1 -1
  129. package/dist/web/hooks/use-request-modal.js +4 -4
  130. package/dist/web/hooks/use-request-modal.js.map +1 -1
  131. package/dist/web/hooks/use-request-modal.test.js +5 -1
  132. package/dist/web/hooks/use-request-modal.test.js.map +1 -1
  133. package/dist/web/hooks/use-user.js +18 -2
  134. package/dist/web/hooks/use-user.js.map +1 -1
  135. package/dist/web/hooks/use-user.test.js +28 -0
  136. package/dist/web/hooks/use-user.test.js.map +1 -1
  137. package/dist/web/hooks/use-view-state.d.ts +4 -0
  138. package/dist/web/hooks/use-view-state.js +32 -0
  139. package/dist/web/hooks/use-view-state.js.map +1 -0
  140. package/dist/web/hooks/use-view-state.test.d.ts +1 -0
  141. package/dist/web/hooks/use-view-state.test.js +177 -0
  142. package/dist/web/hooks/use-view-state.test.js.map +1 -0
  143. package/dist/web/index.d.ts +1 -2
  144. package/dist/web/index.js +1 -2
  145. package/dist/web/index.js.map +1 -1
  146. package/dist/web/mount-view.d.ts +1 -0
  147. package/dist/web/{mount-widget.js → mount-view.js} +2 -2
  148. package/dist/web/mount-view.js.map +1 -0
  149. package/dist/web/plugin/plugin.d.ts +4 -1
  150. package/dist/web/plugin/plugin.js +134 -25
  151. package/dist/web/plugin/plugin.js.map +1 -1
  152. package/dist/web/plugin/scan-views.d.ts +16 -0
  153. package/dist/web/plugin/scan-views.js +88 -0
  154. package/dist/web/plugin/scan-views.js.map +1 -0
  155. package/dist/web/plugin/scan-views.test.d.ts +1 -0
  156. package/dist/web/plugin/scan-views.test.js +99 -0
  157. package/dist/web/plugin/scan-views.test.js.map +1 -0
  158. package/dist/web/plugin/transform-data-llm.js +1 -1
  159. package/dist/web/plugin/transform-data-llm.js.map +1 -1
  160. package/dist/web/plugin/validate-view.d.ts +1 -0
  161. package/dist/web/plugin/validate-view.js +9 -0
  162. package/dist/web/plugin/validate-view.js.map +1 -0
  163. package/dist/web/plugin/validate-view.test.d.ts +1 -0
  164. package/dist/web/plugin/validate-view.test.js +24 -0
  165. package/dist/web/plugin/validate-view.test.js.map +1 -0
  166. package/package.json +20 -13
  167. package/tsconfig.base.json +2 -0
  168. package/dist/server/widgetsDevServer.d.ts +0 -13
  169. package/dist/server/widgetsDevServer.js +0 -57
  170. package/dist/server/widgetsDevServer.js.map +0 -1
  171. package/dist/test/widget.test.js +0 -263
  172. package/dist/test/widget.test.js.map +0 -1
  173. package/dist/web/hooks/use-widget-state.d.ts +0 -4
  174. package/dist/web/hooks/use-widget-state.js +0 -32
  175. package/dist/web/hooks/use-widget-state.js.map +0 -1
  176. package/dist/web/hooks/use-widget-state.test.js +0 -64
  177. package/dist/web/hooks/use-widget-state.test.js.map +0 -1
  178. package/dist/web/mount-widget.d.ts +0 -1
  179. package/dist/web/mount-widget.js.map +0 -1
  180. package/dist/web/plugin/validate-widget.d.ts +0 -5
  181. package/dist/web/plugin/validate-widget.js +0 -27
  182. package/dist/web/plugin/validate-widget.js.map +0 -1
  183. package/dist/web/plugin/validate-widget.test.js +0 -42
  184. package/dist/web/plugin/validate-widget.test.js.map +0 -1
  185. /package/dist/{test/widget.test.d.ts → cli/tunnel-control-server.test.d.ts} +0 -0
  186. /package/dist/{web/hooks/use-widget-state.test.d.ts → cli/tunnel-handler.test.d.ts} +0 -0
  187. /package/dist/{web/plugin/validate-widget.test.d.ts → cli/tunnel.test.d.ts} +0 -0
@@ -2,11 +2,18 @@ import path from "node:path";
2
2
  import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
3
3
  import cors from "cors";
4
4
  import express from "express";
5
- export async function createApp({ mcpServer, httpServer, customMiddleware = [], }) {
6
- const app = express();
7
- app.use(express.json());
8
- const env = process.env.NODE_ENV || "development";
9
- for (const middleware of customMiddleware) {
5
+ function parseControlPort(raw) {
6
+ if (raw === undefined) {
7
+ return null;
8
+ }
9
+ const n = Number.parseInt(raw, 10);
10
+ if (!Number.isFinite(n) || n <= 0 || n >= 65536) {
11
+ return null;
12
+ }
13
+ return n;
14
+ }
15
+ function applyMiddlewares(app, middlewares) {
16
+ for (const middleware of middlewares) {
10
17
  if (middleware.path) {
11
18
  app.use(middleware.path, ...middleware.handlers);
12
19
  }
@@ -14,11 +21,35 @@ export async function createApp({ mcpServer, httpServer, customMiddleware = [],
14
21
  app.use(...middleware.handlers);
15
22
  }
16
23
  }
24
+ }
25
+ function defaultErrorHandler(err, _req, res, _next) {
26
+ console.error("Error handling MCP request:", err);
27
+ if (!res.headersSent) {
28
+ res.status(500).json({
29
+ jsonrpc: "2.0",
30
+ error: { code: -32603, message: "Internal server error" },
31
+ id: null,
32
+ });
33
+ }
34
+ }
35
+ export async function createApp({ mcpServer, httpServer, customMiddleware = [], errorMiddleware = [], }) {
36
+ const app = express();
37
+ app.use(express.json());
38
+ const env = process.env.NODE_ENV || "development";
39
+ applyMiddlewares(app, customMiddleware);
17
40
  if (env !== "production") {
18
41
  const { devtoolsStaticServer } = await import("@skybridge/devtools");
19
42
  app.use(await devtoolsStaticServer());
20
- const { widgetsDevServer } = await import("./widgetsDevServer.js");
21
- app.use(await widgetsDevServer(httpServer));
43
+ const { viewsDevServer } = await import("./viewsDevServer.js");
44
+ app.use(await viewsDevServer(httpServer));
45
+ const controlPort = parseControlPort(process.env.__TUNNEL_CONTROL_PORT);
46
+ if (controlPort !== null) {
47
+ const { createTunnelProxyRouter } = await import("./tunnel-proxy-router.js");
48
+ app.use(createTunnelProxyRouter(controlPort));
49
+ }
50
+ else if (process.env.__TUNNEL_CONTROL_PORT !== undefined) {
51
+ console.warn(`Ignoring invalid __TUNNEL_CONTROL_PORT=${process.env.__TUNNEL_CONTROL_PORT}`);
52
+ }
22
53
  }
23
54
  if (env === "production") {
24
55
  const assetsPath = path.join(process.cwd(), "dist", "assets");
@@ -26,10 +57,12 @@ export async function createApp({ mcpServer, httpServer, customMiddleware = [],
26
57
  app.use("/assets", express.static(assetsPath));
27
58
  }
28
59
  app.use("/mcp", mcpMiddleware(mcpServer));
60
+ applyMiddlewares(app, errorMiddleware);
61
+ app.use("/mcp", defaultErrorHandler);
29
62
  return app;
30
63
  }
31
64
  const mcpMiddleware = (server) => {
32
- return async (req, res, _next) => {
65
+ return async (req, res, next) => {
33
66
  if (req.method !== "POST") {
34
67
  res.writeHead(405).end(JSON.stringify({
35
68
  jsonrpc: "2.0",
@@ -48,24 +81,14 @@ const mcpMiddleware = (server) => {
48
81
  res.on("close", () => {
49
82
  transport.close();
50
83
  });
51
- await server.connect(transport);
84
+ await server.connectStatelessTransport(transport);
52
85
  // Express strips the mount path from req.url (e.g. "/mcp" becomes "/").
53
86
  // Restore it so the SDK builds the correct requestInfo.url.
54
87
  req.url = req.originalUrl;
55
88
  await transport.handleRequest(req, res, req.body);
56
89
  }
57
90
  catch (error) {
58
- console.error("Error handling MCP request:", error);
59
- if (!res.headersSent) {
60
- res.status(500).json({
61
- jsonrpc: "2.0",
62
- error: {
63
- code: -32603,
64
- message: "Internal server error",
65
- },
66
- id: null,
67
- });
68
- }
91
+ next(error);
69
92
  }
70
93
  };
71
94
  };
@@ -1 +1 @@
1
- {"version":3,"file":"express.js","sourceRoot":"","sources":["../../src/server/express.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"express.js","sourceRoot":"","sources":["../../src/server/express.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,11 @@
1
1
  import http from "node:http";
2
2
  import { afterEach, describe, expect, it, vi } from "vitest";
3
+ import { McpServer } from "./server.js";
3
4
  vi.mock("@skybridge/devtools", () => ({
4
5
  devtoolsStaticServer: () => ((_req, _res, next) => next()),
5
6
  }));
6
- vi.mock("./widgetsDevServer.js", () => ({
7
- widgetsDevServer: (_httpServer) => ((_req, _res, next) => next()),
7
+ vi.mock("./viewsDevServer.js", () => ({
8
+ viewsDevServer: (_httpServer) => ((_req, _res, next) => next()),
8
9
  }));
9
10
  const fakeServer = {};
10
11
  async function listen(app) {
@@ -22,6 +23,9 @@ async function postMcp(port) {
22
23
  body: JSON.stringify({ jsonrpc: "2.0", method: "initialize", id: 1 }),
23
24
  });
24
25
  }
26
+ async function postApi(port) {
27
+ return fetch(`http://localhost:${port}/api/test`, { method: "POST" });
28
+ }
25
29
  describe("createApp", () => {
26
30
  it("runs global custom middleware before the /mcp handler", async () => {
27
31
  const { createApp } = await import("./express.js");
@@ -61,7 +65,9 @@ describe("createApp", () => {
61
65
  });
62
66
  it("allows middleware to short-circuit with 401", async () => {
63
67
  const { createApp } = await import("./express.js");
68
+ const calls = [];
64
69
  const reject = (_req, res) => {
70
+ calls.push("reject");
65
71
  res.status(401).json({ error: "Unauthorized" });
66
72
  };
67
73
  const httpServer = http.createServer();
@@ -73,6 +79,7 @@ describe("createApp", () => {
73
79
  const { port, server } = await listen(app);
74
80
  openServer = server;
75
81
  const res = await postMcp(port);
82
+ expect(calls).toEqual(["reject"]);
76
83
  expect(res.status).toBe(401);
77
84
  expect(await res.json()).toEqual({ error: "Unauthorized" });
78
85
  });
@@ -176,5 +183,166 @@ describe("createApp", () => {
176
183
  const followUp = await fetch(`http://localhost:${port}/explode`);
177
184
  expect(followUp.status).toBe(500);
178
185
  });
186
+ it("returns 500 JSON-RPC error when the MCP handler throws and no error middleware is registered", async () => {
187
+ const { createApp } = await import("./express.js");
188
+ const consoleSpy = vi.spyOn(console, "error").mockImplementation(() => { });
189
+ const httpServer = http.createServer();
190
+ const app = await createApp({ mcpServer: fakeServer, httpServer });
191
+ const { port, server } = await listen(app);
192
+ openServer = server;
193
+ const res = await postMcp(port);
194
+ expect(res.status).toBe(500);
195
+ expect(await res.json()).toEqual({
196
+ jsonrpc: "2.0",
197
+ error: { code: -32603, message: "Internal server error" },
198
+ id: null,
199
+ });
200
+ expect(consoleSpy).toHaveBeenCalledWith("Error handling MCP request:", expect.any(Error));
201
+ consoleSpy.mockRestore();
202
+ });
203
+ it("invokes a custom error handler when the MCP handler throws", async () => {
204
+ const { createApp } = await import("./express.js");
205
+ const calls = [];
206
+ const errorHandler = (_err, _req, res, _next) => {
207
+ calls.push("error-handler");
208
+ res.status(503).json({ custom: true });
209
+ };
210
+ const httpServer = http.createServer();
211
+ const app = await createApp({
212
+ mcpServer: fakeServer,
213
+ httpServer,
214
+ errorMiddleware: [{ handlers: [errorHandler] }],
215
+ });
216
+ const { port, server } = await listen(app);
217
+ openServer = server;
218
+ const res = await postMcp(port);
219
+ expect(calls).toEqual(["error-handler"]);
220
+ expect(res.status).toBe(503);
221
+ expect(await res.json()).toEqual({ custom: true });
222
+ });
223
+ it("invokes a path-scoped error handler only for matching routes", async () => {
224
+ const { createApp } = await import("./express.js");
225
+ const calls = [];
226
+ const mcpErrorHandler = (_err, _req, res, _next) => {
227
+ calls.push("mcp-error-handler");
228
+ res.status(503).json({ from: "mcp-error-handler" });
229
+ };
230
+ const throwingApiRoute = (_req, _res, next) => {
231
+ next(new Error("api error"));
232
+ };
233
+ const httpServer = http.createServer();
234
+ const app = await createApp({
235
+ mcpServer: fakeServer,
236
+ httpServer,
237
+ customMiddleware: [{ path: "/api/test", handlers: [throwingApiRoute] }],
238
+ errorMiddleware: [{ path: "/mcp", handlers: [mcpErrorHandler] }],
239
+ });
240
+ const { port, server } = await listen(app);
241
+ openServer = server;
242
+ const mcpRes = await postMcp(port);
243
+ expect(calls).toEqual(["mcp-error-handler"]);
244
+ expect(mcpRes.status).toBe(503);
245
+ expect(await mcpRes.json()).toEqual({ from: "mcp-error-handler" });
246
+ const consoleSpy = vi.spyOn(console, "error").mockImplementation(() => { });
247
+ const apiRes = await postApi(port);
248
+ expect(calls).toEqual(["mcp-error-handler"]);
249
+ expect(apiRes.status).toBe(500);
250
+ consoleSpy.mockRestore();
251
+ });
252
+ it("handles concurrent /mcp requests without 'Already connected to a transport'", async () => {
253
+ const { createApp } = await import("./express.js");
254
+ const mcpServer = new McpServer({
255
+ name: "concurrent-test",
256
+ version: "0.0.0",
257
+ });
258
+ // Slow tool: keeps the underlying transport bound long enough to overlap
259
+ // with concurrent requests, exposing the shared-McpServer race.
260
+ mcpServer.registerTool({ name: "slow", description: "slow" }, async () => {
261
+ await new Promise((r) => setTimeout(r, 50));
262
+ return { content: [{ type: "text", text: "done" }] };
263
+ });
264
+ const consoleSpy = vi.spyOn(console, "error").mockImplementation(() => { });
265
+ const httpServer = http.createServer();
266
+ const app = await createApp({ mcpServer, httpServer });
267
+ const { port, server } = await listen(app);
268
+ openServer = server;
269
+ const callBody = (id) => JSON.stringify({
270
+ jsonrpc: "2.0",
271
+ method: "tools/call",
272
+ id,
273
+ params: { name: "slow", arguments: {} },
274
+ });
275
+ const N = 10;
276
+ const responses = await Promise.all(Array.from({ length: N }, (_, i) => fetch(`http://localhost:${port}/mcp`, {
277
+ method: "POST",
278
+ headers: {
279
+ "Content-Type": "application/json",
280
+ Accept: "application/json, text/event-stream",
281
+ },
282
+ body: callBody(i + 1),
283
+ })));
284
+ expect(responses.map((r) => r.status)).toEqual(Array(N).fill(200));
285
+ expect(consoleSpy).not.toHaveBeenCalledWith("Error handling MCP request:", expect.any(Error));
286
+ consoleSpy.mockRestore();
287
+ });
288
+ });
289
+ describe("createApp tunnel routes", () => {
290
+ it("proxies POST /__skybridge/tunnel to the cli control server in dev mode", async () => {
291
+ // Stand up a fake control listener that returns a known JSON body.
292
+ const control = http.createServer((_req, res) => {
293
+ res.writeHead(200, { "Content-Type": "application/json" });
294
+ res.end('{"status":"idle"}');
295
+ });
296
+ await new Promise((resolve) => control.listen(0, "127.0.0.1", resolve));
297
+ const controlAddr = control.address();
298
+ if (typeof controlAddr === "string" || controlAddr === null) {
299
+ control.close();
300
+ throw new Error("control server has no address");
301
+ }
302
+ const controlPort = controlAddr.port;
303
+ const prev = process.env.__TUNNEL_CONTROL_PORT;
304
+ process.env.__TUNNEL_CONTROL_PORT = String(controlPort);
305
+ try {
306
+ const { createApp } = await import("./express.js");
307
+ const httpServer = http.createServer();
308
+ const app = await createApp({ mcpServer: fakeServer, httpServer });
309
+ const { port, server } = await listen(app);
310
+ openServer = server;
311
+ const res = await fetch(`http://localhost:${port}/__skybridge/tunnel`, {
312
+ method: "POST",
313
+ });
314
+ expect(res.status).toBe(200);
315
+ expect(await res.json()).toEqual({ status: "idle" });
316
+ }
317
+ finally {
318
+ if (prev === undefined) {
319
+ delete process.env.__TUNNEL_CONTROL_PORT;
320
+ }
321
+ else {
322
+ process.env.__TUNNEL_CONTROL_PORT = prev;
323
+ }
324
+ await new Promise((resolve) => control.close(() => resolve()));
325
+ }
326
+ });
327
+ it("does not expose /__skybridge/tunnel in production mode", async () => {
328
+ const prevEnv = process.env.NODE_ENV;
329
+ process.env.NODE_ENV = "production";
330
+ try {
331
+ vi.resetModules();
332
+ const { createApp } = await import("./express.js");
333
+ const httpServer = http.createServer();
334
+ const app = await createApp({ mcpServer: fakeServer, httpServer });
335
+ const { port, server } = await listen(app);
336
+ openServer = server;
337
+ const res = await fetch(`http://localhost:${port}/__skybridge/tunnel`, {
338
+ method: "POST",
339
+ });
340
+ expect(res.status).toBe(404);
341
+ }
342
+ finally {
343
+ process.env.NODE_ENV = prevEnv;
344
+ vi.resetModules();
345
+ }
346
+ });
179
347
  });
180
348
  //# sourceMappingURL=express.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"express.test.js","sourceRoot":"","sources":["../../src/server/express.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"express.test.js","sourceRoot":"","sources":["../../src/server/express.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,EAAE,CAAC,IAAI,CAAC,qBAAqB,EAAE,GAAG,EAAE,CAAC,CAAC;IACpC,oBAAoB,EAAE,GAAG,EAAE,CACzB,CAAC,CAAC,IAAa,EAAE,IAAa,EAAE,IAAgB,EAAE,EAAE,CAClD,IAAI,EAAE,CAAmB;CAC9B,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,qBAAqB,EAAE,GAAG,EAAE,CAAC,CAAC;IACpC,cAAc,EAAE,CAAC,WAAoB,EAAE,EAAE,CACvC,CAAC,CAAC,IAAa,EAAE,IAAa,EAAE,IAAgB,EAAE,EAAE,CAClD,IAAI,EAAE,CAAmB;CAC9B,CAAC,CAAC,CAAC;AAEJ,MAAM,UAAU,GAAG,EAAe,CAAC;AAEnC,KAAK,UAAU,MAAM,CAAC,GAA4C;IAChE,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IAChE,MAAM,IAAI,GAAI,MAAM,CAAC,OAAO,EAAuB,CAAC,IAAI,CAAC;IACzD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC1B,CAAC;AAED,IAAI,UAAmC,CAAC;AACxC,SAAS,CAAC,GAAG,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;AAErC,KAAK,UAAU,OAAO,CAAC,IAAY;IACjC,OAAO,KAAK,CAAC,oBAAoB,IAAI,MAAM,EAAE;QAC3C,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;KACtE,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,IAAY;IACjC,OAAO,KAAK,CAAC,oBAAoB,IAAI,WAAW,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;AACxE,CAAC;AAED,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QACnD,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,MAAM,EAAE,GAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;YAC9C,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrB,IAAI,EAAE,CAAC;QACT,CAAC,CAAC;QAEF,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC;YAC1B,SAAS,EAAE,UAAU;YACrB,UAAU;YACV,gBAAgB,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;SACvC,CAAC,CAAC;QAEH,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3C,UAAU,GAAG,MAAM,CAAC;QAEpB,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;QACpB,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QACnD,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,MAAM,EAAE,GAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;YAC9C,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACnB,IAAI,EAAE,CAAC;QACT,CAAC,CAAC;QAEF,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC;YAC1B,SAAS,EAAE,UAAU;YACrB,UAAU;YACV,gBAAgB,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;SACrD,CAAC,CAAC;QAEH,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3C,UAAU,GAAG,MAAM,CAAC;QAEpB,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;QACpB,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QACnD,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,MAAM,MAAM,GAAmB,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;YAC3C,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;QAClD,CAAC,CAAC;QAEF,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC;YAC1B,SAAS,EAAE,UAAU;YACrB,UAAU;YACV,gBAAgB,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;SACzD,CAAC,CAAC;QAEH,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3C,UAAU,GAAG,MAAM,CAAC;QAEpB,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAClC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QACnD,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,MAAM,GAAG,GAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;YAC/C,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChB,IAAI,EAAE,CAAC;QACT,CAAC,CAAC;QACF,MAAM,GAAG,GAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;YAC/C,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChB,IAAI,EAAE,CAAC;QACT,CAAC,CAAC;QAEF,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC;YAC1B,SAAS,EAAE,UAAU;YACrB,UAAU;YACV,gBAAgB,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;SAC7D,CAAC,CAAC;QAEH,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3C,UAAU,GAAG,MAAM,CAAC;QAEpB,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;QACpB,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QACnD,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,MAAM,KAAK,GAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;YACjD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAClB,IAAI,EAAE,CAAC;QACT,CAAC,CAAC;QAEF,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC;YAC1B,SAAS,EAAE,UAAU;YACrB,UAAU;YACV,gBAAgB,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;SACxD,CAAC,CAAC;QAEH,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3C,UAAU,GAAG,MAAM,CAAC;QAEpB,iDAAiD;QACjD,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;QACpB,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QACnD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;QAE3C,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;YAClC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC;YAC1B,SAAS,EAAE,UAAU;YACrB,UAAU;YACV,gBAAgB,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,MAAwB,CAAC,EAAE,CAAC;SAC7D,CAAC,CAAC;QAEH,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3C,UAAU,GAAG,MAAM,CAAC;QAEpB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,oBAAoB,IAAI,SAAS,CAAC,CAAC;QAC3D,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QACnD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;QAE3C,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;YAChC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC;YAC1B,SAAS,EAAE,UAAU;YACrB,UAAU;YACV,gBAAgB,EAAE;gBAChB,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,MAAwB,CAAC,EAAE;aACvD;SACF,CAAC,CAAC;QAEH,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3C,UAAU,GAAG,MAAM,CAAC;QAEpB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,oBAAoB,IAAI,WAAW,CAAC,CAAC;QAC7D,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QAEnD,MAAM,QAAQ,GAAmB,GAAG,EAAE;YACpC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC,CAAC;QAEF,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC;YAC1B,SAAS,EAAE,UAAU;YACrB,UAAU;YACV,gBAAgB,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;SAC/D,CAAC,CAAC;QAEH,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3C,UAAU,GAAG,MAAM,CAAC;QAEpB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,oBAAoB,IAAI,UAAU,CAAC,CAAC;QAC5D,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAE7B,8DAA8D;QAC9D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,oBAAoB,IAAI,UAAU,CAAC,CAAC;QACjE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8FAA8F,EAAE,KAAK,IAAI,EAAE;QAC5G,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QACnD,MAAM,UAAU,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAE3E,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC;QACnE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3C,UAAU,GAAG,MAAM,CAAC;QAEpB,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC;YAC/B,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,uBAAuB,EAAE;YACzD,EAAE,EAAE,IAAI;SACT,CAAC,CAAC;QACH,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CACrC,6BAA6B,EAC7B,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAClB,CAAC;QACF,UAAU,CAAC,WAAW,EAAE,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC1E,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QACnD,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,MAAM,YAAY,GAAwB,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;YACnE,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAC5B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC,CAAC;QAEF,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC;YAC1B,SAAS,EAAE,UAAU;YACrB,UAAU;YACV,eAAe,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC;SAChD,CAAC,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3C,UAAU,GAAG,MAAM,CAAC;QAEpB,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QACnD,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,MAAM,eAAe,GAAwB,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;YACtE,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YAChC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAC;QACtD,CAAC,CAAC;QAEF,MAAM,gBAAgB,GAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;YAC5D,IAAI,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;QAC/B,CAAC,CAAC;QAEF,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC;YAC1B,SAAS,EAAE,UAAU;YACrB,UAAU;YACV,gBAAgB,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACvE,eAAe,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC;SACjE,CAAC,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3C,UAAU,GAAG,MAAM,CAAC;QAEpB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAC;QAEnE,MAAM,UAAU,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC3E,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChC,UAAU,CAAC,WAAW,EAAE,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6EAA6E,EAAE,KAAK,IAAI,EAAE;QAC3F,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QAEnD,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC;YAC9B,IAAI,EAAE,iBAAiB;YACvB,OAAO,EAAE,OAAO;SACjB,CAAC,CAAC;QACH,yEAAyE;QACzE,gEAAgE;QAChE,SAAS,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,KAAK,IAAI,EAAE;YACvE,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAC5C,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAChE,CAAC,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAE3E,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;QACvD,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3C,UAAU,GAAG,MAAM,CAAC;QAEpB,MAAM,QAAQ,GAAG,CAAC,EAAU,EAAE,EAAE,CAC9B,IAAI,CAAC,SAAS,CAAC;YACb,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,YAAY;YACpB,EAAE;YACF,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE;SACxC,CAAC,CAAC;QAEL,MAAM,CAAC,GAAG,EAAE,CAAC;QACb,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,CACjC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACjC,KAAK,CAAC,oBAAoB,IAAI,MAAM,EAAE;YACpC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,MAAM,EAAE,qCAAqC;aAC9C;YACD,IAAI,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC;SACtB,CAAC,CACH,CACF,CAAC;QAEF,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACnE,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,oBAAoB,CACzC,6BAA6B,EAC7B,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAClB,CAAC;QACF,UAAU,CAAC,WAAW,EAAE,CAAC;IAC3B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;QACtF,mEAAmE;QACnE,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;YAC9C,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC3D,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QACH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAClC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,CACxC,CAAC;QACF,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;QACtC,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;YAC5D,OAAO,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;QACD,MAAM,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC;QAErC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,qBAAqB,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;QACxD,IAAI,CAAC;YACH,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;YACnD,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;YACvC,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC;YACnE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC;YAC3C,UAAU,GAAG,MAAM,CAAC;YAEpB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,oBAAoB,IAAI,qBAAqB,EAAE;gBACrE,MAAM,EAAE,MAAM;aACf,CAAC,CAAC;YACH,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC7B,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACvD,CAAC;gBAAS,CAAC;YACT,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,OAAO,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;YAC3C,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,qBAAqB,GAAG,IAAI,CAAC;YAC3C,CAAC;YACD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACvE,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,YAAY,CAAC;QACpC,IAAI,CAAC;YACH,EAAE,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;YACnD,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;YACvC,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC;YACnE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC;YAC3C,UAAU,GAAG,MAAM,CAAC;YAEpB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,oBAAoB,IAAI,qBAAqB,EAAE;gBACrE,MAAM,EAAE,MAAM;aACf,CAAC,CAAC;YACH,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/B,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,OAAO,CAAC;YAC/B,EAAE,CAAC,YAAY,EAAE,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,5 +1,6 @@
1
+ export { audio, embeddedResource, image, resourceLink, text, } from "./content-helpers.js";
1
2
  export type { AnyToolRegistry, InferTools, ToolInput, ToolNames, ToolOutput, ToolResponseMetadata, } from "./inferUtilityTypes.js";
2
3
  export type { McpExtra, McpMethodString, McpMiddlewareFilter, McpMiddlewareFn, McpResultFor, McpTypedMiddlewareFn, McpWildcard, } from "./middleware.js";
3
- export type { McpServerTypes, ToolDef, WidgetHostType } from "./server.js";
4
- export { McpServer } from "./server.js";
5
- export { widgetsDevServer } from "./widgetsDevServer.js";
4
+ export type { HandlerContent, KnownToolMeta, McpServerTypes, ToolDef, ToolMeta, ViewConfig, ViewCsp, ViewHostType, ViewName, ViewNameRegistry, } from "./server.js";
5
+ export { McpServer, normalizeContent, } from "./server.js";
6
+ export { viewsDevServer } from "./viewsDevServer.js";
@@ -1,3 +1,4 @@
1
- export { McpServer } from "./server.js";
2
- export { widgetsDevServer } from "./widgetsDevServer.js";
1
+ export { audio, embeddedResource, image, resourceLink, text, } from "./content-helpers.js";
2
+ export { McpServer, normalizeContent, } from "./server.js";
3
+ export { viewsDevServer } from "./viewsDevServer.js";
3
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,gBAAgB,EAChB,KAAK,EACL,YAAY,EACZ,IAAI,GACL,MAAM,sBAAsB,CAAC;AA8B9B,OAAO,EACL,SAAS,EACT,gBAAgB,GACjB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
@@ -1,12 +1,12 @@
1
1
  import type { McpServerTypes, ToolDef } from "./server.js";
2
2
  /**
3
- * Any tool registry shape (includes both widgets and regular tools).
3
+ * Any tool registry shape (includes both views and regular tools).
4
4
  * Used as a constraint for type parameters that accept tool registries.
5
5
  */
6
6
  export type AnyToolRegistry = Record<string, ToolDef>;
7
7
  /**
8
8
  * Extract the tool registry type from an McpServer instance.
9
- * This includes both widgets (registered via widget()) and regular tools (registered via registerTool()).
9
+ * This includes both views (registered via view()) and regular tools (registered via registerTool()).
10
10
  *
11
11
  * Uses the `$types` property pattern for cross-package type inference.
12
12
  * This works across package boundaries because TypeScript uses structural typing
@@ -24,7 +24,7 @@ export type InferTools<ServerType> = ServerType extends {
24
24
  type ExtractTool<ServerType, K extends ToolNames<ServerType>> = InferTools<ServerType>[K];
25
25
  /**
26
26
  * Get a union of all tool names from an McpServer instance.
27
- * This includes both widgets and regular tools.
27
+ * This includes both views and regular tools.
28
28
  *
29
29
  * @example
30
30
  * ```ts
@@ -34,7 +34,7 @@ type ExtractTool<ServerType, K extends ToolNames<ServerType>> = InferTools<Serve
34
34
  */
35
35
  export type ToolNames<ServerType> = keyof InferTools<ServerType> & string;
36
36
  /**
37
- * Get the input type for a specific tool (widget or regular tool).
37
+ * Get the input type for a specific tool (view or regular tool).
38
38
  *
39
39
  * @example
40
40
  * ```ts
@@ -43,7 +43,7 @@ export type ToolNames<ServerType> = keyof InferTools<ServerType> & string;
43
43
  */
44
44
  export type ToolInput<ServerType, ToolName extends ToolNames<ServerType>> = ExtractTool<ServerType, ToolName>["input"];
45
45
  /**
46
- * Get the output type for a specific tool (widget or regular tool).
46
+ * Get the output type for a specific tool (view or regular tool).
47
47
  *
48
48
  * @example
49
49
  * ```ts
@@ -52,7 +52,7 @@ export type ToolInput<ServerType, ToolName extends ToolNames<ServerType>> = Extr
52
52
  */
53
53
  export type ToolOutput<ServerType, ToolName extends ToolNames<ServerType>> = ExtractTool<ServerType, ToolName>["output"];
54
54
  /**
55
- * Get the responseMetadata type for a specific tool (widget or regular tool).
55
+ * Get the responseMetadata type for a specific tool (view or regular tool).
56
56
  * This is inferred from the `_meta` property of the tool callback's return value.
57
57
  *
58
58
  * @example
@@ -0,0 +1,14 @@
1
+ import type { McpMiddlewareEntry } from "./middleware.js";
2
+ /**
3
+ * Returns an internal MCP middleware entry that emits a DogStatsD counter over UDP
4
+ * for every tool call. Enabled by default; respects the existing telemetry
5
+ * opt-out (SKYBRIDGE_TELEMETRY_DISABLED, DO_NOT_TRACK, or `skybridge telemetry disable`).
6
+ *
7
+ * Returns `null` when the version string contains "-dev" (e.g. development
8
+ * builds) or when the version cannot be parsed into major.minor, so that
9
+ * malformed data does not pollute production metrics.
10
+ *
11
+ * Metric (DogStatsD counter format with tags):
12
+ * Requests:1|c|#version:<major>.<minor> — every tools/call
13
+ */
14
+ export declare function createMiddlewareEntry(): McpMiddlewareEntry | null;
@@ -0,0 +1,62 @@
1
+ import { createSocket } from "node:dgram";
2
+ import { isEnabled } from "../cli/telemetry.js";
3
+ import { VERSION } from "../version.js";
4
+ function parseMajorMinor(version) {
5
+ const parts = version.split(".");
6
+ if (parts.length < 2) {
7
+ return null;
8
+ }
9
+ return `${parts[0]}.${parts[1]}`;
10
+ }
11
+ const isDev = VERSION.includes("-dev");
12
+ const versionTag = parseMajorMinor(VERSION);
13
+ const STATSD_HOST = "18.208.242.161";
14
+ const STATSD_PORT = 8125;
15
+ let socket = null;
16
+ function getSocket() {
17
+ if (!socket) {
18
+ socket = createSocket("udp4");
19
+ socket.unref();
20
+ }
21
+ return socket;
22
+ }
23
+ function sendMetric(metric) {
24
+ if (!STATSD_HOST) {
25
+ return;
26
+ }
27
+ const payload = Buffer.from(metric);
28
+ getSocket().send(payload, STATSD_PORT, STATSD_HOST, () => {
29
+ // fire-and-forget: errors are intentionally silenced
30
+ });
31
+ }
32
+ /**
33
+ * Returns an internal MCP middleware entry that emits a DogStatsD counter over UDP
34
+ * for every tool call. Enabled by default; respects the existing telemetry
35
+ * opt-out (SKYBRIDGE_TELEMETRY_DISABLED, DO_NOT_TRACK, or `skybridge telemetry disable`).
36
+ *
37
+ * Returns `null` when the version string contains "-dev" (e.g. development
38
+ * builds) or when the version cannot be parsed into major.minor, so that
39
+ * malformed data does not pollute production metrics.
40
+ *
41
+ * Metric (DogStatsD counter format with tags):
42
+ * Requests:1|c|#version:<major>.<minor> — every tools/call
43
+ */
44
+ export function createMiddlewareEntry() {
45
+ if (isDev || !versionTag) {
46
+ return null;
47
+ }
48
+ const handler = async (_req, _extra, next) => {
49
+ // Check on every call so opt-out takes effect immediately without restart.
50
+ if (!isEnabled()) {
51
+ return next();
52
+ }
53
+ try {
54
+ return await next();
55
+ }
56
+ finally {
57
+ sendMetric(`Requests:1|c|#version:${versionTag}`);
58
+ }
59
+ };
60
+ return { filter: "tools/call", handler };
61
+ }
62
+ //# sourceMappingURL=metric.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metric.js","sourceRoot":"","sources":["../../src/server/metric.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAGxC,SAAS,eAAe,CAAC,OAAe;IACtC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AACnC,CAAC;AAED,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACvC,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;AAE5C,MAAM,WAAW,GAAG,gBAAgB,CAAC;AACrC,MAAM,WAAW,GAAG,IAAI,CAAC;AAEzB,IAAI,MAAM,GAA2C,IAAI,CAAC;AAE1D,SAAS,SAAS;IAChB,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QAC9B,MAAM,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,UAAU,CAAC,MAAc;IAChC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO;IACT,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpC,SAAS,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,EAAE;QACvD,qDAAqD;IACvD,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,qBAAqB;IACnC,IAAI,KAAK,IAAI,CAAC,UAAU,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAoB,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;QAC5D,2EAA2E;QAC3E,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;YACjB,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;QAED,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,EAAE,CAAC;QACtB,CAAC;gBAAS,CAAC;YACT,UAAU,CAAC,yBAAyB,UAAU,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;AAC3C,CAAC"}
@@ -216,7 +216,8 @@ describe("McpServer.mcpMiddleware()", () => {
216
216
  let capturedMethod = "";
217
217
  let capturedParams = {};
218
218
  const server = new McpServer({ name: "test", version: "1.0.0" });
219
- server.registerTool("greet", {
219
+ server.registerTool({
220
+ name: "greet",
220
221
  description: "greet",
221
222
  inputSchema: { name: z.string() },
222
223
  }, (args) => ({
@@ -247,7 +248,7 @@ describe("McpServer.mcpMiddleware()", () => {
247
248
  it("array filter works", async () => {
248
249
  const matchedMethods = [];
249
250
  const server = new McpServer({ name: "test", version: "1.0.0" });
250
- server.registerTool("t1", { description: "t1" }, () => ({
251
+ server.registerTool({ name: "t1", description: "t1" }, () => ({
251
252
  content: [{ type: "text", text: "ok" }],
252
253
  }));
253
254
  server.mcpMiddleware(["tools/call", "tools/list"], async (request, _extra, next) => {
@@ -280,7 +281,7 @@ describe("McpServer.mcpMiddleware()", () => {
280
281
  it("catch-all middleware + filtered middleware stack correctly", async () => {
281
282
  const calls = [];
282
283
  const server = new McpServer({ name: "test", version: "1.0.0" });
283
- server.registerTool("t1", { description: "t1" }, () => ({
284
+ server.registerTool({ name: "t1", description: "t1" }, () => ({
284
285
  content: [{ type: "text", text: "ok" }],
285
286
  }));
286
287
  server
@@ -313,7 +314,7 @@ describe("McpServer.mcpMiddleware()", () => {
313
314
  it("notification middleware receives extra as undefined", async () => {
314
315
  let capturedExtra = "sentinel";
315
316
  const server = new McpServer({ name: "test", version: "1.0.0" });
316
- server.registerTool("t1", { description: "t1" }, () => ({
317
+ server.registerTool({ name: "t1", description: "t1" }, () => ({
317
318
  content: [{ type: "text", text: "ok" }],
318
319
  }));
319
320
  server.mcpMiddleware("notification", async (_request, extra, next) => {
@@ -333,7 +334,7 @@ describe("McpServer.mcpMiddleware()", () => {
333
334
  it("wildcard filter intercepts matching methods only", async () => {
334
335
  const matchedMethods = [];
335
336
  const server = new McpServer({ name: "test", version: "1.0.0" });
336
- server.registerTool("t1", { description: "t1" }, () => ({
337
+ server.registerTool({ name: "t1", description: "t1" }, () => ({
337
338
  content: [{ type: "text", text: "ok" }],
338
339
  }));
339
340
  server.mcpMiddleware("tools/*", async (request, _extra, next) => {
@@ -356,7 +357,8 @@ describe("McpServer.mcpMiddleware()", () => {
356
357
  });
357
358
  it("middleware can modify tool result via McpServer integration", async () => {
358
359
  const server = new McpServer({ name: "test", version: "1.0.0" });
359
- server.registerTool("greet", {
360
+ server.registerTool({
361
+ name: "greet",
360
362
  description: "greet",
361
363
  inputSchema: { name: z.string() },
362
364
  }, (args) => ({
@@ -390,7 +392,7 @@ describe("McpServer.mcpMiddleware()", () => {
390
392
  it("middleware can short-circuit via McpServer integration", async () => {
391
393
  const handlerCalled = vi.fn();
392
394
  const server = new McpServer({ name: "test", version: "1.0.0" });
393
- server.registerTool("t1", { description: "t1" }, () => {
395
+ server.registerTool({ name: "t1", description: "t1" }, () => {
394
396
  handlerCalled();
395
397
  return {
396
398
  content: [{ type: "text", text: "original" }],
@@ -412,7 +414,8 @@ describe("McpServer.mcpMiddleware()", () => {
412
414
  it("middleware can mutate tool call params via McpServer integration", async () => {
413
415
  let receivedName = "";
414
416
  const server = new McpServer({ name: "test", version: "1.0.0" });
415
- server.registerTool("greet", {
417
+ server.registerTool({
418
+ name: "greet",
416
419
  description: "greet",
417
420
  inputSchema: { name: z.string() },
418
421
  }, (args) => {
@@ -440,7 +443,7 @@ describe("McpServer.mcpMiddleware()", () => {
440
443
  it("category 'request' filter matches requests but not notifications", async () => {
441
444
  const matchedMethods = [];
442
445
  const server = new McpServer({ name: "test", version: "1.0.0" });
443
- server.registerTool("t1", { description: "t1" }, () => ({
446
+ server.registerTool({ name: "t1", description: "t1" }, () => ({
444
447
  content: [{ type: "text", text: "ok" }],
445
448
  }));
446
449
  server.mcpMiddleware("request", async (request, _extra, next) => {