skybridge 0.0.0-dev.ca5fa02 → 0.0.0-dev.ca8493f

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 (300) hide show
  1. package/LICENSE +21 -674
  2. package/README.md +89 -142
  3. package/bin/run.js +5 -0
  4. package/dist/cli/detect-port.d.ts +18 -0
  5. package/dist/cli/detect-port.js +61 -0
  6. package/dist/cli/detect-port.js.map +1 -0
  7. package/dist/cli/header.d.ts +4 -0
  8. package/dist/cli/header.js +6 -0
  9. package/dist/cli/header.js.map +1 -0
  10. package/dist/cli/run-command.d.ts +2 -0
  11. package/dist/cli/run-command.js +43 -0
  12. package/dist/cli/run-command.js.map +1 -0
  13. package/dist/cli/telemetry.d.ts +7 -0
  14. package/dist/cli/telemetry.js +123 -0
  15. package/dist/cli/telemetry.js.map +1 -0
  16. package/dist/cli/use-execute-steps.d.ts +11 -0
  17. package/dist/cli/use-execute-steps.js +36 -0
  18. package/dist/cli/use-execute-steps.js.map +1 -0
  19. package/dist/cli/use-nodemon.d.ts +6 -0
  20. package/dist/cli/use-nodemon.js +69 -0
  21. package/dist/cli/use-nodemon.js.map +1 -0
  22. package/dist/cli/use-typescript-check.d.ts +8 -0
  23. package/dist/cli/use-typescript-check.js +59 -0
  24. package/dist/cli/use-typescript-check.js.map +1 -0
  25. package/dist/commands/build.d.ts +9 -0
  26. package/dist/commands/build.js +46 -0
  27. package/dist/commands/build.js.map +1 -0
  28. package/dist/commands/dev.d.ts +10 -0
  29. package/dist/commands/dev.js +42 -0
  30. package/dist/commands/dev.js.map +1 -0
  31. package/dist/commands/start.d.ts +9 -0
  32. package/dist/commands/start.js +52 -0
  33. package/dist/commands/start.js.map +1 -0
  34. package/dist/commands/telemetry/disable.d.ts +5 -0
  35. package/dist/commands/telemetry/disable.js +14 -0
  36. package/dist/commands/telemetry/disable.js.map +1 -0
  37. package/dist/commands/telemetry/enable.d.ts +5 -0
  38. package/dist/commands/telemetry/enable.js +14 -0
  39. package/dist/commands/telemetry/enable.js.map +1 -0
  40. package/dist/commands/telemetry/status.d.ts +5 -0
  41. package/dist/commands/telemetry/status.js +14 -0
  42. package/dist/commands/telemetry/status.js.map +1 -0
  43. package/dist/server/asset-base-url-transform-plugin.d.ts +11 -0
  44. package/dist/server/asset-base-url-transform-plugin.js +34 -0
  45. package/dist/server/asset-base-url-transform-plugin.js.map +1 -0
  46. package/dist/server/asset-base-url-transform-plugin.test.js +56 -0
  47. package/dist/server/asset-base-url-transform-plugin.test.js.map +1 -0
  48. package/dist/server/const.d.ts +1 -0
  49. package/dist/server/const.js +2 -0
  50. package/dist/server/const.js.map +1 -0
  51. package/dist/server/express.d.ts +9 -0
  52. package/dist/server/express.js +72 -0
  53. package/dist/server/express.js.map +1 -0
  54. package/dist/server/express.test.js +74 -0
  55. package/dist/server/express.test.js.map +1 -0
  56. package/dist/server/index.d.ts +4 -0
  57. package/dist/server/index.js.map +1 -0
  58. package/dist/server/inferUtilityTypes.d.ts +64 -0
  59. package/dist/server/inferUtilityTypes.js +2 -0
  60. package/dist/server/inferUtilityTypes.js.map +1 -0
  61. package/dist/server/server.d.ts +105 -0
  62. package/dist/server/server.js +204 -0
  63. package/dist/server/server.js.map +1 -0
  64. package/dist/server/templateHelper.d.ts +19 -0
  65. package/dist/{src/server → server}/templateHelper.js +5 -12
  66. package/dist/server/templateHelper.js.map +1 -0
  67. package/dist/server/templates/development.hbs +67 -0
  68. package/dist/server/templates/production.hbs +6 -0
  69. package/dist/{src/server → server}/widgetsDevServer.d.ts +2 -2
  70. package/dist/server/widgetsDevServer.js +63 -0
  71. package/dist/server/widgetsDevServer.js.map +1 -0
  72. package/dist/test/utils.d.ts +135 -0
  73. package/dist/test/utils.js +242 -0
  74. package/dist/test/utils.js.map +1 -0
  75. package/dist/test/widget.test.js +261 -0
  76. package/dist/test/widget.test.js.map +1 -0
  77. package/dist/web/bridges/apps-sdk/adaptor.d.ts +22 -0
  78. package/dist/web/bridges/apps-sdk/adaptor.js +71 -0
  79. package/dist/web/bridges/apps-sdk/adaptor.js.map +1 -0
  80. package/dist/web/bridges/apps-sdk/bridge.d.ts +10 -0
  81. package/dist/web/bridges/apps-sdk/bridge.js +46 -0
  82. package/dist/web/bridges/apps-sdk/bridge.js.map +1 -0
  83. package/dist/web/bridges/apps-sdk/index.d.ts +5 -0
  84. package/dist/web/bridges/apps-sdk/index.js +5 -0
  85. package/dist/web/bridges/apps-sdk/index.js.map +1 -0
  86. package/dist/web/bridges/apps-sdk/types.d.ts +118 -0
  87. package/dist/web/bridges/apps-sdk/types.js.map +1 -0
  88. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.d.ts +2 -0
  89. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js +7 -0
  90. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js.map +1 -0
  91. package/dist/web/bridges/get-adaptor.d.ts +2 -0
  92. package/dist/web/bridges/get-adaptor.js +8 -0
  93. package/dist/web/bridges/get-adaptor.js.map +1 -0
  94. package/dist/web/bridges/index.d.ts +5 -0
  95. package/dist/web/bridges/index.js +6 -0
  96. package/dist/web/bridges/index.js.map +1 -0
  97. package/dist/web/bridges/mcp-app/adaptor.d.ts +36 -0
  98. package/dist/web/bridges/mcp-app/adaptor.js +190 -0
  99. package/dist/web/bridges/mcp-app/adaptor.js.map +1 -0
  100. package/dist/web/bridges/mcp-app/bridge.d.ts +43 -0
  101. package/dist/web/bridges/mcp-app/bridge.js +260 -0
  102. package/dist/web/bridges/mcp-app/bridge.js.map +1 -0
  103. package/dist/web/bridges/mcp-app/index.d.ts +4 -0
  104. package/dist/web/bridges/mcp-app/index.js +4 -0
  105. package/dist/web/bridges/mcp-app/index.js.map +1 -0
  106. package/dist/web/bridges/mcp-app/types.d.ts +8 -0
  107. package/dist/web/bridges/mcp-app/types.js +2 -0
  108. package/dist/web/bridges/mcp-app/types.js.map +1 -0
  109. package/dist/web/bridges/mcp-app/use-mcp-app-context.d.ts +5 -0
  110. package/dist/web/bridges/mcp-app/use-mcp-app-context.js +7 -0
  111. package/dist/web/bridges/mcp-app/use-mcp-app-context.js.map +1 -0
  112. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.d.ts +1 -0
  113. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js +66 -0
  114. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js.map +1 -0
  115. package/dist/web/bridges/types.d.ts +98 -0
  116. package/dist/web/bridges/types.js +2 -0
  117. package/dist/web/bridges/types.js.map +1 -0
  118. package/dist/web/bridges/use-host-context.d.ts +2 -0
  119. package/dist/web/bridges/use-host-context.js +8 -0
  120. package/dist/web/bridges/use-host-context.js.map +1 -0
  121. package/dist/web/components/modal-provider.d.ts +4 -0
  122. package/dist/web/components/modal-provider.js +47 -0
  123. package/dist/web/components/modal-provider.js.map +1 -0
  124. package/dist/web/create-store.d.ts +3 -0
  125. package/dist/web/create-store.js +24 -0
  126. package/dist/web/create-store.js.map +1 -0
  127. package/dist/web/create-store.test.d.ts +1 -0
  128. package/dist/web/create-store.test.js +126 -0
  129. package/dist/web/create-store.test.js.map +1 -0
  130. package/dist/web/data-llm.d.ts +14 -0
  131. package/dist/web/data-llm.js +72 -0
  132. package/dist/web/data-llm.js.map +1 -0
  133. package/dist/web/data-llm.test.d.ts +1 -0
  134. package/dist/web/data-llm.test.js +141 -0
  135. package/dist/web/data-llm.test.js.map +1 -0
  136. package/dist/web/generate-helpers.d.ts +116 -0
  137. package/dist/web/generate-helpers.js +111 -0
  138. package/dist/web/generate-helpers.js.map +1 -0
  139. package/dist/web/generate-helpers.test-d.d.ts +1 -0
  140. package/dist/web/generate-helpers.test-d.js +209 -0
  141. package/dist/web/generate-helpers.test-d.js.map +1 -0
  142. package/dist/web/generate-helpers.test.d.ts +1 -0
  143. package/dist/web/generate-helpers.test.js +17 -0
  144. package/dist/web/generate-helpers.test.js.map +1 -0
  145. package/dist/web/helpers/state.d.ts +7 -0
  146. package/dist/web/helpers/state.js +45 -0
  147. package/dist/web/helpers/state.js.map +1 -0
  148. package/dist/web/helpers/state.test.d.ts +1 -0
  149. package/dist/web/helpers/state.test.js +53 -0
  150. package/dist/web/helpers/state.test.js.map +1 -0
  151. package/dist/web/hooks/index.d.ts +11 -0
  152. package/dist/web/hooks/index.js +12 -0
  153. package/dist/web/hooks/index.js.map +1 -0
  154. package/dist/web/hooks/test/utils.d.ts +16 -0
  155. package/dist/web/hooks/test/utils.js +60 -0
  156. package/dist/web/hooks/test/utils.js.map +1 -0
  157. package/dist/web/hooks/use-call-tool.d.ts +101 -0
  158. package/dist/web/hooks/use-call-tool.js +68 -0
  159. package/dist/web/hooks/use-call-tool.js.map +1 -0
  160. package/dist/web/hooks/use-call-tool.test-d.d.ts +1 -0
  161. package/dist/web/hooks/use-call-tool.test-d.js +104 -0
  162. package/dist/web/hooks/use-call-tool.test-d.js.map +1 -0
  163. package/dist/web/hooks/use-call-tool.test.d.ts +1 -0
  164. package/dist/web/hooks/use-call-tool.test.js +190 -0
  165. package/dist/web/hooks/use-call-tool.test.js.map +1 -0
  166. package/dist/web/hooks/use-display-mode.d.ts +4 -0
  167. package/dist/web/hooks/use-display-mode.js +9 -0
  168. package/dist/web/hooks/use-display-mode.js.map +1 -0
  169. package/dist/web/hooks/use-display-mode.test.d.ts +1 -0
  170. package/dist/web/hooks/use-display-mode.test.js +41 -0
  171. package/dist/web/hooks/use-display-mode.test.js.map +1 -0
  172. package/dist/web/hooks/use-files.d.ts +6 -0
  173. package/dist/web/hooks/use-files.js +9 -0
  174. package/dist/web/hooks/use-files.js.map +1 -0
  175. package/dist/web/hooks/use-files.test.d.ts +1 -0
  176. package/dist/web/hooks/use-files.test.js +34 -0
  177. package/dist/web/hooks/use-files.test.js.map +1 -0
  178. package/dist/web/hooks/use-layout.d.ts +22 -0
  179. package/dist/web/hooks/use-layout.js +23 -0
  180. package/dist/web/hooks/use-layout.js.map +1 -0
  181. package/dist/web/hooks/use-layout.test.d.ts +1 -0
  182. package/dist/web/hooks/use-layout.test.js +96 -0
  183. package/dist/web/hooks/use-layout.test.js.map +1 -0
  184. package/dist/web/hooks/use-open-external.d.ts +1 -0
  185. package/dist/web/hooks/use-open-external.js +8 -0
  186. package/dist/web/hooks/use-open-external.js.map +1 -0
  187. package/dist/web/hooks/use-open-external.test.d.ts +1 -0
  188. package/dist/web/hooks/use-open-external.test.js +50 -0
  189. package/dist/web/hooks/use-open-external.test.js.map +1 -0
  190. package/dist/web/hooks/use-request-modal.d.ts +9 -0
  191. package/dist/web/hooks/use-request-modal.js +16 -0
  192. package/dist/web/hooks/use-request-modal.js.map +1 -0
  193. package/dist/web/hooks/use-request-modal.test.d.ts +1 -0
  194. package/dist/web/hooks/use-request-modal.test.js +57 -0
  195. package/dist/web/hooks/use-request-modal.test.js.map +1 -0
  196. package/dist/web/hooks/use-send-follow-up-message.d.ts +1 -0
  197. package/dist/web/hooks/use-send-follow-up-message.js +8 -0
  198. package/dist/web/hooks/use-send-follow-up-message.js.map +1 -0
  199. package/dist/web/hooks/use-set-open-in-app-url.d.ts +1 -0
  200. package/dist/web/hooks/use-set-open-in-app-url.js +8 -0
  201. package/dist/web/hooks/use-set-open-in-app-url.js.map +1 -0
  202. package/dist/web/hooks/use-set-open-in-app-url.test.d.ts +1 -0
  203. package/dist/web/hooks/use-set-open-in-app-url.test.js +43 -0
  204. package/dist/web/hooks/use-set-open-in-app-url.test.js.map +1 -0
  205. package/dist/web/hooks/use-tool-info.d.ts +36 -0
  206. package/dist/web/hooks/use-tool-info.js +26 -0
  207. package/dist/web/hooks/use-tool-info.js.map +1 -0
  208. package/dist/web/hooks/use-tool-info.test-d.d.ts +1 -0
  209. package/dist/web/hooks/use-tool-info.test-d.js +109 -0
  210. package/dist/web/hooks/use-tool-info.test-d.js.map +1 -0
  211. package/dist/web/hooks/use-tool-info.test.d.ts +1 -0
  212. package/dist/web/hooks/use-tool-info.test.js +130 -0
  213. package/dist/web/hooks/use-tool-info.test.js.map +1 -0
  214. package/dist/web/hooks/use-user.d.ts +18 -0
  215. package/dist/web/hooks/use-user.js +19 -0
  216. package/dist/web/hooks/use-user.js.map +1 -0
  217. package/dist/web/hooks/use-user.test.d.ts +1 -0
  218. package/dist/web/hooks/use-user.test.js +94 -0
  219. package/dist/web/hooks/use-user.test.js.map +1 -0
  220. package/dist/web/hooks/use-widget-state.d.ts +4 -0
  221. package/dist/web/hooks/use-widget-state.js +32 -0
  222. package/dist/web/hooks/use-widget-state.js.map +1 -0
  223. package/dist/web/hooks/use-widget-state.test.d.ts +1 -0
  224. package/dist/web/hooks/use-widget-state.test.js +62 -0
  225. package/dist/web/hooks/use-widget-state.test.js.map +1 -0
  226. package/dist/web/index.d.ts +8 -0
  227. package/dist/web/index.js +9 -0
  228. package/dist/web/index.js.map +1 -0
  229. package/dist/web/mount-widget.js +27 -0
  230. package/dist/web/mount-widget.js.map +1 -0
  231. package/dist/web/plugin/data-llm.test.d.ts +1 -0
  232. package/dist/web/plugin/data-llm.test.js +81 -0
  233. package/dist/web/plugin/data-llm.test.js.map +1 -0
  234. package/dist/web/plugin/plugin.js +46 -0
  235. package/dist/web/plugin/plugin.js.map +1 -0
  236. package/dist/web/plugin/transform-data-llm.d.ts +12 -0
  237. package/dist/web/plugin/transform-data-llm.js +96 -0
  238. package/dist/web/plugin/transform-data-llm.js.map +1 -0
  239. package/dist/web/plugin/transform-data-llm.test.d.ts +1 -0
  240. package/dist/web/plugin/transform-data-llm.test.js +81 -0
  241. package/dist/web/plugin/transform-data-llm.test.js.map +1 -0
  242. package/dist/web/proxy.d.ts +1 -0
  243. package/dist/web/proxy.js +52 -0
  244. package/dist/web/proxy.js.map +1 -0
  245. package/dist/web/types.d.ts +16 -0
  246. package/dist/web/types.js +2 -0
  247. package/dist/web/types.js.map +1 -0
  248. package/package.json +69 -32
  249. package/tsconfig.base.json +28 -0
  250. package/dist/src/server/index.d.ts +0 -2
  251. package/dist/src/server/index.js.map +0 -1
  252. package/dist/src/server/server.d.ts +0 -12
  253. package/dist/src/server/server.js +0 -45
  254. package/dist/src/server/server.js.map +0 -1
  255. package/dist/src/server/templateHelper.d.ts +0 -14
  256. package/dist/src/server/templateHelper.js.map +0 -1
  257. package/dist/src/server/templates/development.hbs +0 -11
  258. package/dist/src/server/templates/production.hbs +0 -5
  259. package/dist/src/server/widgetsDevServer.js +0 -39
  260. package/dist/src/server/widgetsDevServer.js.map +0 -1
  261. package/dist/src/test/setup.js +0 -9
  262. package/dist/src/test/setup.js.map +0 -1
  263. package/dist/src/test/utils.d.ts +0 -28
  264. package/dist/src/test/utils.js +0 -43
  265. package/dist/src/test/utils.js.map +0 -1
  266. package/dist/src/test/widget.test.js +0 -69
  267. package/dist/src/test/widget.test.js.map +0 -1
  268. package/dist/src/web/index.d.ts +0 -7
  269. package/dist/src/web/index.js +0 -8
  270. package/dist/src/web/index.js.map +0 -1
  271. package/dist/src/web/mount-widget.js +0 -14
  272. package/dist/src/web/mount-widget.js.map +0 -1
  273. package/dist/src/web/plugin.js +0 -30
  274. package/dist/src/web/plugin.js.map +0 -1
  275. package/dist/src/web/types.d.ts +0 -103
  276. package/dist/src/web/types.js.map +0 -1
  277. package/dist/src/web/use-call-tool.d.ts +0 -54
  278. package/dist/src/web/use-call-tool.js +0 -44
  279. package/dist/src/web/use-call-tool.js.map +0 -1
  280. package/dist/src/web/use-call-tool.test.js +0 -66
  281. package/dist/src/web/use-call-tool.test.js.map +0 -1
  282. package/dist/src/web/use-openai-global.d.ts +0 -2
  283. package/dist/src/web/use-openai-global.js +0 -21
  284. package/dist/src/web/use-openai-global.js.map +0 -1
  285. package/dist/src/web/use-tool-output.d.ts +0 -3
  286. package/dist/src/web/use-tool-output.js +0 -5
  287. package/dist/src/web/use-tool-output.js.map +0 -1
  288. package/dist/src/web/use-tool-response-metadata.d.ts +0 -3
  289. package/dist/src/web/use-tool-response-metadata.js +0 -5
  290. package/dist/src/web/use-tool-response-metadata.js.map +0 -1
  291. package/dist/vitest.config.d.ts +0 -2
  292. package/dist/vitest.config.js +0 -9
  293. package/dist/vitest.config.js.map +0 -1
  294. /package/dist/{src/test/setup.d.ts → server/asset-base-url-transform-plugin.test.d.ts} +0 -0
  295. /package/dist/{src/test/widget.test.d.ts → server/express.test.d.ts} +0 -0
  296. /package/dist/{src/server → server}/index.js +0 -0
  297. /package/dist/{src/web/use-call-tool.test.d.ts → test/widget.test.d.ts} +0 -0
  298. /package/dist/{src/web → web/bridges/apps-sdk}/types.js +0 -0
  299. /package/dist/{src/web → web}/mount-widget.d.ts +0 -0
  300. /package/dist/{src/web → web/plugin}/plugin.d.ts +0 -0
@@ -0,0 +1,72 @@
1
+ import path from "node:path";
2
+ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
3
+ import cors from "cors";
4
+ import express from "express";
5
+ export async function createServer({ server, customMiddleware = [], }) {
6
+ const app = express();
7
+ app.use(express.json());
8
+ const env = process.env.NODE_ENV || "development";
9
+ for (const middleware of customMiddleware) {
10
+ if (middleware.path) {
11
+ app.use(middleware.path, ...middleware.handlers);
12
+ }
13
+ else {
14
+ app.use(...middleware.handlers);
15
+ }
16
+ }
17
+ if (env !== "production") {
18
+ const { devtoolsStaticServer } = await import("@skybridge/devtools");
19
+ app.use(await devtoolsStaticServer());
20
+ const { widgetsDevServer } = await import("./widgetsDevServer.js");
21
+ app.use(await widgetsDevServer());
22
+ }
23
+ if (env === "production") {
24
+ const assetsPath = path.join(process.cwd(), "dist", "assets");
25
+ app.use("/assets", cors());
26
+ app.use("/assets", express.static(assetsPath));
27
+ }
28
+ app.use("/mcp", mcpMiddleware(server));
29
+ return app;
30
+ }
31
+ const mcpMiddleware = (server) => {
32
+ return async (req, res, _next) => {
33
+ if (req.method !== "POST") {
34
+ res.writeHead(405).end(JSON.stringify({
35
+ jsonrpc: "2.0",
36
+ error: {
37
+ code: -32000,
38
+ message: "Method not allowed.",
39
+ },
40
+ id: null,
41
+ }));
42
+ return;
43
+ }
44
+ try {
45
+ const transport = new StreamableHTTPServerTransport({
46
+ sessionIdGenerator: undefined,
47
+ });
48
+ res.on("close", () => {
49
+ transport.close();
50
+ });
51
+ await server.connect(transport);
52
+ // Express strips the mount path from req.url (e.g. "/mcp" becomes "/").
53
+ // Restore it so the SDK builds the correct requestInfo.url.
54
+ req.url = req.originalUrl;
55
+ await transport.handleRequest(req, res, req.body);
56
+ }
57
+ 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
+ }
69
+ }
70
+ };
71
+ };
72
+ //# sourceMappingURL=express.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"express.js","sourceRoot":"","sources":["../../src/server/express.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ import http from "node:http";
2
+ import { afterEach, describe, expect, it, vi } from "vitest";
3
+ vi.mock("@skybridge/devtools", () => ({
4
+ devtoolsStaticServer: () => ((_req, _res, next) => next()),
5
+ }));
6
+ vi.mock("./widgetsDevServer.js", () => ({
7
+ widgetsDevServer: () => ((_req, _res, next) => next()),
8
+ }));
9
+ const fakeServer = {};
10
+ async function listen(app) {
11
+ const server = http.createServer(app);
12
+ await new Promise((resolve) => server.listen(0, resolve));
13
+ const port = server.address().port;
14
+ return { port, server };
15
+ }
16
+ let openServer;
17
+ afterEach(() => openServer?.close());
18
+ async function postMcp(port) {
19
+ return fetch(`http://localhost:${port}/mcp`, {
20
+ method: "POST",
21
+ headers: { "Content-Type": "application/json" },
22
+ body: JSON.stringify({ jsonrpc: "2.0", method: "initialize", id: 1 }),
23
+ });
24
+ }
25
+ describe("createServer", () => {
26
+ it("runs global custom middleware before the /mcp handler", async () => {
27
+ const { createServer } = await import("./express.js");
28
+ const calls = [];
29
+ const mw = (_req, _res, next) => {
30
+ calls.push("custom");
31
+ next();
32
+ };
33
+ const app = await createServer({
34
+ server: fakeServer,
35
+ customMiddleware: [{ handlers: [mw] }],
36
+ });
37
+ const { port, server } = await listen(app);
38
+ openServer = server;
39
+ await postMcp(port);
40
+ expect(calls).toEqual(["custom"]);
41
+ });
42
+ it("runs path-scoped middleware on /mcp", async () => {
43
+ const { createServer } = await import("./express.js");
44
+ const calls = [];
45
+ const mw = (_req, _res, next) => {
46
+ calls.push("auth");
47
+ next();
48
+ };
49
+ const app = await createServer({
50
+ server: fakeServer,
51
+ customMiddleware: [{ path: "/mcp", handlers: [mw] }],
52
+ });
53
+ const { port, server } = await listen(app);
54
+ openServer = server;
55
+ await postMcp(port);
56
+ expect(calls).toEqual(["auth"]);
57
+ });
58
+ it("allows middleware to short-circuit with 401", async () => {
59
+ const { createServer } = await import("./express.js");
60
+ const reject = (_req, res) => {
61
+ res.status(401).json({ error: "Unauthorized" });
62
+ };
63
+ const app = await createServer({
64
+ server: fakeServer,
65
+ customMiddleware: [{ path: "/mcp", handlers: [reject] }],
66
+ });
67
+ const { port, server } = await listen(app);
68
+ openServer = server;
69
+ const res = await postMcp(port);
70
+ expect(res.status).toBe(401);
71
+ expect(await res.json()).toEqual({ error: "Unauthorized" });
72
+ });
73
+ });
74
+ //# sourceMappingURL=express.test.js.map
@@ -0,0 +1 @@
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;AAG7D,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,uBAAuB,EAAE,GAAG,EAAE,CAAC,CAAC;IACtC,gBAAgB,EAAE,GAAG,EAAE,CACrB,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,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QACtD,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,GAAG,GAAG,MAAM,YAAY,CAAC;YAC7B,MAAM,EAAE,UAAU;YAClB,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,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QACtD,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,GAAG,GAAG,MAAM,YAAY,CAAC;YAC7B,MAAM,EAAE,UAAU;YAClB,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,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QAEtD,MAAM,MAAM,GAAmB,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;YAC3C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;QAClD,CAAC,CAAC;QAEF,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC;YAC7B,MAAM,EAAE,UAAU;YAClB,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,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;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export type { AnyToolRegistry, InferTools, ToolInput, ToolNames, ToolOutput, ToolResponseMetadata, } from "./inferUtilityTypes.js";
2
+ export type { McpServerTypes, ToolDef, WidgetHostType } from "./server.js";
3
+ export { McpServer } from "./server.js";
4
+ export { widgetsDevServer } from "./widgetsDevServer.js";
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,64 @@
1
+ import type { McpServerTypes, ToolDef } from "./server.js";
2
+ /**
3
+ * Any tool registry shape (includes both widgets and regular tools).
4
+ * Used as a constraint for type parameters that accept tool registries.
5
+ */
6
+ export type AnyToolRegistry = Record<string, ToolDef>;
7
+ /**
8
+ * Extract the tool registry type from an McpServer instance.
9
+ * This includes both widgets (registered via widget()) and regular tools (registered via registerTool()).
10
+ *
11
+ * Uses the `$types` property pattern for cross-package type inference.
12
+ * This works across package boundaries because TypeScript uses structural typing
13
+ * on the shape of `$types`, rather than nominal typing on the McpServer class itself.
14
+ *
15
+ * @example
16
+ * ```ts
17
+ * type MyTools = InferTools<MyServer>;
18
+ * // { "search": ToolDef<...>, "calculate": ToolDef<...> }
19
+ * ```
20
+ */
21
+ export type InferTools<ServerType> = ServerType extends {
22
+ $types: McpServerTypes<infer W>;
23
+ } ? W : never;
24
+ type ExtractTool<ServerType, K extends ToolNames<ServerType>> = InferTools<ServerType>[K];
25
+ /**
26
+ * Get a union of all tool names from an McpServer instance.
27
+ * This includes both widgets and regular tools.
28
+ *
29
+ * @example
30
+ * ```ts
31
+ * type Names = ToolNames<MyServer>;
32
+ * // "search" | "calculate" | "details"
33
+ * ```
34
+ */
35
+ export type ToolNames<ServerType> = keyof InferTools<ServerType> & string;
36
+ /**
37
+ * Get the input type for a specific tool (widget or regular tool).
38
+ *
39
+ * @example
40
+ * ```ts
41
+ * type SearchInput = ToolInput<MyServer, "search">;
42
+ * ```
43
+ */
44
+ export type ToolInput<ServerType, ToolName extends ToolNames<ServerType>> = ExtractTool<ServerType, ToolName>["input"];
45
+ /**
46
+ * Get the output type for a specific tool (widget or regular tool).
47
+ *
48
+ * @example
49
+ * ```ts
50
+ * type SearchOutput = ToolOutput<MyServer, "search">;
51
+ * ```
52
+ */
53
+ export type ToolOutput<ServerType, ToolName extends ToolNames<ServerType>> = ExtractTool<ServerType, ToolName>["output"];
54
+ /**
55
+ * Get the responseMetadata type for a specific tool (widget or regular tool).
56
+ * This is inferred from the `_meta` property of the tool callback's return value.
57
+ *
58
+ * @example
59
+ * ```ts
60
+ * type SearchMeta = ToolResponseMetadata<MyServer, "search">;
61
+ * ```
62
+ */
63
+ export type ToolResponseMetadata<ServerType, ToolName extends ToolNames<ServerType>> = ExtractTool<ServerType, ToolName>["responseMetadata"];
64
+ export {};
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=inferUtilityTypes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inferUtilityTypes.js","sourceRoot":"","sources":["../../src/server/inferUtilityTypes.ts"],"names":[],"mappings":""}
@@ -0,0 +1,105 @@
1
+ import type { McpUiResourceMeta } from "@modelcontextprotocol/ext-apps";
2
+ import { McpServer as McpServerBase, type RegisteredTool } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import type { AnySchema, SchemaOutput, ZodRawShapeCompat } from "@modelcontextprotocol/sdk/server/zod-compat.js";
4
+ import type { RequestHandlerExtra } from "@modelcontextprotocol/sdk/shared/protocol.js";
5
+ import type { CallToolResult, Resource, ServerNotification, ServerRequest, ToolAnnotations } from "@modelcontextprotocol/sdk/types.js";
6
+ import type { RequestHandler } from "express";
7
+ export type ToolDef<TInput = unknown, TOutput = unknown, TResponseMetadata = unknown> = {
8
+ input: TInput;
9
+ output: TOutput;
10
+ responseMetadata: TResponseMetadata;
11
+ };
12
+ /**
13
+ * Extended MCP Apps CSP with upcoming fields from ext-apps PR #158
14
+ * and Skybridge-specific fields for OpenAI compatibility
15
+ * @see https://github.com/modelcontextprotocol/ext-apps/pull/158
16
+ */
17
+ type ExtendedMcpUiResourceCsp = McpUiResourceMeta["csp"] & {
18
+ /**
19
+ * Origins that can receive openExternal redirects without safe-link modal (OpenAI-specific)
20
+ * @see https://developers.openai.com/apps-sdk/reference#component-resource-_meta-fields
21
+ */
22
+ redirectDomains?: string[];
23
+ };
24
+ /** Extended MCP Apps resource metadata with upcoming CSP fields */
25
+ type ExtendedMcpUiResourceMeta = Omit<McpUiResourceMeta, "csp"> & {
26
+ csp?: ExtendedMcpUiResourceCsp;
27
+ };
28
+ /** User-provided resource configuration with optional CSP override */
29
+ export type WidgetResourceMeta = {
30
+ ui?: ExtendedMcpUiResourceMeta;
31
+ } & Resource["_meta"];
32
+ export type WidgetHostType = "apps-sdk" | "mcp-app";
33
+ type McpServerOriginalResourceConfig = Omit<Resource, "uri" | "name" | "mimeType" | "_meta"> & {
34
+ _meta?: WidgetResourceMeta;
35
+ /** Restrict host types to a specific subset */
36
+ hosts?: WidgetHostType[];
37
+ };
38
+ type McpServerOriginalToolConfig = Omit<Parameters<typeof McpServerBase.prototype.registerTool<ZodRawShapeCompat, ZodRawShapeCompat>>[1], "inputSchema" | "outputSchema">;
39
+ type Simplify<T> = {
40
+ [K in keyof T]: T[K];
41
+ };
42
+ type ExtractStructuredContent<T> = T extends {
43
+ structuredContent: infer SC;
44
+ } ? Simplify<SC> : never;
45
+ type ExtractMeta<T> = [Extract<T, {
46
+ _meta: unknown;
47
+ }>] extends [never] ? unknown : Extract<T, {
48
+ _meta: unknown;
49
+ }> extends {
50
+ _meta: infer M;
51
+ } ? Simplify<M> : unknown;
52
+ /**
53
+ * Type-level marker interface for cross-package type inference.
54
+ * This enables TypeScript to infer tool types across package boundaries
55
+ * using structural typing on the $types property, rather than relying on
56
+ * class generic inference which fails when McpServer comes from different
57
+ * package installations.
58
+ *
59
+ * Inspired by tRPC's _def pattern and Hono's type markers.
60
+ */
61
+ export interface McpServerTypes<TTools extends Record<string, ToolDef>> {
62
+ readonly tools: TTools;
63
+ }
64
+ type ShapeOutput<Shape extends ZodRawShapeCompat> = Simplify<{
65
+ [K in keyof Shape as undefined extends SchemaOutput<Shape[K]> ? never : K]: SchemaOutput<Shape[K]>;
66
+ } & {
67
+ [K in keyof Shape as undefined extends SchemaOutput<Shape[K]> ? K : never]?: SchemaOutput<Shape[K]>;
68
+ }>;
69
+ type AddTool<TTools, TName extends string, TInput extends ZodRawShapeCompat, TOutput, TResponseMetadata = unknown> = McpServer<TTools & {
70
+ [K in TName]: ToolDef<ShapeOutput<TInput>, TOutput, TResponseMetadata>;
71
+ }>;
72
+ type ToolConfig<TInput extends ZodRawShapeCompat | AnySchema> = {
73
+ title?: string;
74
+ description?: string;
75
+ inputSchema?: TInput;
76
+ outputSchema?: ZodRawShapeCompat | AnySchema;
77
+ annotations?: ToolAnnotations;
78
+ _meta?: Record<string, unknown>;
79
+ };
80
+ type ToolHandler<TInput extends ZodRawShapeCompat, TReturn extends {
81
+ content: CallToolResult["content"];
82
+ } = CallToolResult> = (args: ShapeOutput<TInput>, extra: RequestHandlerExtra<ServerRequest, ServerNotification>) => TReturn | Promise<TReturn>;
83
+ export declare class McpServer<TTools extends Record<string, ToolDef> = Record<never, ToolDef>> extends McpServerBase {
84
+ readonly $types: McpServerTypes<TTools>;
85
+ private express?;
86
+ private customMiddleware;
87
+ use(...handlers: RequestHandler[]): this;
88
+ use(path: string, ...handlers: RequestHandler[]): this;
89
+ run(): Promise<void>;
90
+ registerWidget<TName extends string, TInput extends ZodRawShapeCompat, TReturn extends {
91
+ content: CallToolResult["content"];
92
+ }>(name: TName, resourceConfig: McpServerOriginalResourceConfig, toolConfig: McpServerOriginalToolConfig & {
93
+ inputSchema?: TInput;
94
+ outputSchema?: ZodRawShapeCompat | AnySchema;
95
+ }, toolCallback: ToolHandler<TInput, TReturn>): AddTool<TTools, TName, TInput, ExtractStructuredContent<TReturn>, ExtractMeta<TReturn>>;
96
+ registerTool<TName extends string, InputArgs extends ZodRawShapeCompat, TReturn extends {
97
+ content: CallToolResult["content"];
98
+ }>(name: TName, config: ToolConfig<InputArgs>, cb: ToolHandler<InputArgs, TReturn>): AddTool<TTools, TName, InputArgs, ExtractStructuredContent<TReturn>, ExtractMeta<TReturn>>;
99
+ registerTool<InputArgs extends ZodRawShapeCompat>(name: string, config: ToolConfig<InputArgs>, cb: ToolHandler<InputArgs>): RegisteredTool;
100
+ private registerWidgetResource;
101
+ private lookupDistFile;
102
+ private lookupDistFileWithIndexFallback;
103
+ private readManifest;
104
+ }
105
+ export {};
@@ -0,0 +1,204 @@
1
+ import crypto from "node:crypto";
2
+ import { readFileSync } from "node:fs";
3
+ import http from "node:http";
4
+ import path from "node:path";
5
+ import { McpServer as McpServerBase, } from "@modelcontextprotocol/sdk/server/mcp.js";
6
+ import { mergeWith, union } from "es-toolkit";
7
+ import { DEFAULT_HMR_PORT } from "./const.js";
8
+ import { createServer } from "./express.js";
9
+ import { templateHelper } from "./templateHelper.js";
10
+ const mergeWithUnion = (target, source) => {
11
+ return mergeWith(target, source, (targetVal, sourceVal) => {
12
+ if (Array.isArray(targetVal) && Array.isArray(sourceVal)) {
13
+ return union(targetVal, sourceVal);
14
+ }
15
+ });
16
+ };
17
+ export class McpServer extends McpServerBase {
18
+ express;
19
+ customMiddleware = [];
20
+ use(pathOrHandler, ...handlers) {
21
+ if (typeof pathOrHandler === "string") {
22
+ this.customMiddleware.push({
23
+ path: pathOrHandler,
24
+ handlers,
25
+ });
26
+ }
27
+ else {
28
+ this.customMiddleware.push({
29
+ handlers: [pathOrHandler, ...handlers],
30
+ });
31
+ }
32
+ return this;
33
+ }
34
+ async run() {
35
+ if (!this.express) {
36
+ this.express = await createServer({
37
+ server: this,
38
+ customMiddleware: this.customMiddleware,
39
+ });
40
+ }
41
+ const express = this.express;
42
+ return new Promise((resolve, reject) => {
43
+ const server = http.createServer(express);
44
+ server.on("error", (error) => {
45
+ console.error("Failed to start server:", error);
46
+ reject(error);
47
+ });
48
+ const port = parseInt(process.env.__PORT ?? "3000", 10);
49
+ server.listen(port, () => {
50
+ resolve();
51
+ });
52
+ });
53
+ }
54
+ registerWidget(name, resourceConfig, toolConfig, toolCallback) {
55
+ const userMeta = resourceConfig._meta;
56
+ const toolMeta = {
57
+ ...toolConfig._meta,
58
+ };
59
+ if (!resourceConfig.hosts || resourceConfig.hosts.includes("apps-sdk")) {
60
+ const widgetConfig = {
61
+ hostType: "apps-sdk",
62
+ uri: `ui://widgets/apps-sdk/${name}.html`,
63
+ mimeType: "text/html+skybridge",
64
+ buildContentMeta: ({ resourceDomains, connectDomains, domain }, overrides) => {
65
+ const userUi = userMeta?.ui;
66
+ const userCsp = userUi?.csp;
67
+ const defaults = {
68
+ "openai/widgetCSP": {
69
+ resource_domains: resourceDomains,
70
+ connect_domains: connectDomains,
71
+ },
72
+ "openai/widgetDomain": domain,
73
+ "openai/widgetDescription": resourceConfig.description,
74
+ };
75
+ const fromUi = {
76
+ "openai/widgetCSP": {
77
+ resource_domains: userCsp?.resourceDomains,
78
+ connect_domains: userCsp?.connectDomains,
79
+ frame_domains: userCsp?.frameDomains,
80
+ redirect_domains: userCsp?.redirectDomains,
81
+ },
82
+ "openai/widgetDomain": userUi?.domain,
83
+ "openai/widgetPrefersBorder": userUi?.prefersBorder,
84
+ };
85
+ const directOpenaiKeys = Object.fromEntries(Object.entries(userMeta ?? {}).filter(([key]) => key.startsWith("openai/")));
86
+ return mergeWithUnion(mergeWithUnion(mergeWithUnion(defaults, fromUi), directOpenaiKeys), { "openai/widgetDomain": overrides.domain });
87
+ },
88
+ };
89
+ this.registerWidgetResource({
90
+ name,
91
+ widgetConfig,
92
+ resourceConfig,
93
+ });
94
+ toolMeta["openai/outputTemplate"] = widgetConfig.uri;
95
+ }
96
+ if (!resourceConfig.hosts || resourceConfig.hosts.includes("mcp-app")) {
97
+ const widgetConfig = {
98
+ hostType: "mcp-app",
99
+ uri: `ui://widgets/ext-apps/${name}.html`,
100
+ mimeType: "text/html;profile=mcp-app",
101
+ buildContentMeta: ({ resourceDomains, connectDomains, domain }, overrides) => {
102
+ const defaults = {
103
+ ui: {
104
+ csp: {
105
+ resourceDomains,
106
+ connectDomains,
107
+ },
108
+ domain,
109
+ },
110
+ };
111
+ return mergeWithUnion(defaults, {
112
+ ui: { ...userMeta?.ui, ...overrides },
113
+ });
114
+ },
115
+ };
116
+ this.registerWidgetResource({
117
+ name,
118
+ widgetConfig,
119
+ resourceConfig,
120
+ });
121
+ // @ts-expect-error - For backwards compatibility with Claude current implementation of the specs
122
+ toolMeta["ui/resourceUri"] = widgetConfig.uri;
123
+ toolMeta.ui = { resourceUri: widgetConfig.uri };
124
+ }
125
+ this.registerTool(name, {
126
+ ...toolConfig,
127
+ _meta: toolMeta,
128
+ }, toolCallback);
129
+ return this;
130
+ }
131
+ registerTool(name, config, cb) {
132
+ super.registerTool(name, config, cb);
133
+ return this;
134
+ }
135
+ registerWidgetResource({ name, widgetConfig, resourceConfig, }) {
136
+ const { hostType, uri: widgetUri, mimeType, buildContentMeta, } = widgetConfig;
137
+ this.registerResource(name, widgetUri, { ...resourceConfig, _meta: resourceConfig._meta }, async (uri, extra) => {
138
+ const isProduction = process.env.NODE_ENV === "production";
139
+ const useForwardedHost = process.env.SKYBRIDGE_USE_FORWARDED_HOST === "true";
140
+ const isClaude = extra?.requestInfo?.headers?.["user-agent"] === "Claude-User";
141
+ const hostFromHeaders = extra?.requestInfo?.headers?.["x-forwarded-host"] ??
142
+ extra?.requestInfo?.headers?.host;
143
+ const useExternalHost = isProduction || useForwardedHost || isClaude;
144
+ const devPort = process.env.__PORT || "3000";
145
+ const serverUrl = useExternalHost
146
+ ? `https://${hostFromHeaders}`
147
+ : `http://localhost:${devPort}`;
148
+ const html = isProduction
149
+ ? templateHelper.renderProduction({
150
+ hostType,
151
+ serverUrl,
152
+ widgetFile: this.lookupDistFileWithIndexFallback(`src/widgets/${name}`),
153
+ styleFile: this.lookupDistFile("style.css"),
154
+ })
155
+ : templateHelper.renderDevelopment({
156
+ hostType,
157
+ serverUrl,
158
+ useLocalNetworkAccess: !useExternalHost,
159
+ widgetName: name,
160
+ });
161
+ const connectDomains = [serverUrl];
162
+ if (!isProduction) {
163
+ const hmrPort = process.env.__SKYBRIDGE_HMR_PORT ?? DEFAULT_HMR_PORT;
164
+ const VITE_HMR_WEBSOCKET_DEFAULT_URL = `ws://localhost:${hmrPort}`;
165
+ connectDomains.push(VITE_HMR_WEBSOCKET_DEFAULT_URL);
166
+ }
167
+ const contentMetaOverrides = isClaude
168
+ ? {
169
+ domain: `${crypto
170
+ .createHash("sha256")
171
+ .update(extra.requestInfo?.url?.href ||
172
+ `https://${hostFromHeaders}/mcp`)
173
+ .digest("hex")
174
+ .slice(0, 32)}.claudemcpcontent.com`,
175
+ }
176
+ : {};
177
+ const contentMeta = buildContentMeta({
178
+ resourceDomains: [serverUrl],
179
+ connectDomains,
180
+ domain: serverUrl,
181
+ baseUriDomains: [serverUrl],
182
+ }, contentMetaOverrides);
183
+ return {
184
+ contents: [
185
+ { uri: uri.href, mimeType, text: html, _meta: contentMeta },
186
+ ],
187
+ };
188
+ });
189
+ }
190
+ lookupDistFile(key) {
191
+ const manifest = this.readManifest();
192
+ return manifest[key]?.file;
193
+ }
194
+ lookupDistFileWithIndexFallback(basePath) {
195
+ const manifest = this.readManifest();
196
+ const flatFileKey = `${basePath}.tsx`;
197
+ const indexFileKey = `${basePath}/index.tsx`;
198
+ return manifest[flatFileKey]?.file ?? manifest[indexFileKey]?.file;
199
+ }
200
+ readManifest() {
201
+ return JSON.parse(readFileSync(path.join(process.cwd(), "dist", "assets", ".vite", "manifest.json"), "utf-8"));
202
+ }
203
+ }
204
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { WidgetHostType } from "./server.js";
2
+ declare class TemplateHelper {
3
+ private templateCache;
4
+ private loadTemplate;
5
+ renderProduction(data: {
6
+ hostType: WidgetHostType;
7
+ serverUrl: string;
8
+ widgetFile: string;
9
+ styleFile: string;
10
+ }): string;
11
+ renderDevelopment(data: {
12
+ hostType: WidgetHostType;
13
+ serverUrl: string;
14
+ useLocalNetworkAccess: boolean;
15
+ widgetName: string;
16
+ }): string;
17
+ }
18
+ export declare const templateHelper: TemplateHelper;
19
+ export {};
@@ -1,14 +1,15 @@
1
- import Handlebars from "handlebars";
2
1
  import { readFileSync } from "node:fs";
3
- import { join, dirname } from "node:path";
2
+ import { dirname, join } from "node:path";
4
3
  import { fileURLToPath } from "node:url";
4
+ import Handlebars from "handlebars";
5
5
  const __filename = fileURLToPath(import.meta.url);
6
6
  const __dirname = dirname(__filename);
7
7
  class TemplateHelper {
8
8
  templateCache = new Map();
9
9
  loadTemplate(templateName) {
10
- if (this.templateCache.has(templateName)) {
11
- return this.templateCache.get(templateName);
10
+ const cached = this.templateCache.get(templateName);
11
+ if (cached) {
12
+ return cached;
12
13
  }
13
14
  const templatePath = join(__dirname, "templates", `${templateName}.hbs`);
14
15
  const templateSource = readFileSync(templatePath, "utf-8");
@@ -24,14 +25,6 @@ class TemplateHelper {
24
25
  const template = this.loadTemplate("development");
25
26
  return template(data);
26
27
  }
27
- renderViteClient(data) {
28
- const template = this.loadTemplate("vite-client");
29
- return template(data);
30
- }
31
- injectViteClient(html, data) {
32
- const viteClientScript = this.renderViteClient(data);
33
- return viteClientScript + html;
34
- }
35
28
  }
36
29
  export const templateHelper = new TemplateHelper();
37
30
  //# sourceMappingURL=templateHelper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templateHelper.js","sourceRoot":"","sources":["../../src/server/templateHelper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,UAAU,MAAM,YAAY,CAAC;AAGpC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,MAAM,cAAc;IACV,aAAa,GAAG,IAAI,GAAG,EAAsC,CAAC;IAE9D,YAAY,CAAC,YAAoB;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACpD,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,YAAY,MAAM,CAAC,CAAC;QACzE,MAAM,cAAc,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAC3D,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QAEpD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QAC/C,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,gBAAgB,CAAC,IAKhB;QACC,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QACjD,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAED,iBAAiB,CAAC,IAKjB;QACC,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;QAClD,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;CACF;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC"}