skybridge 0.0.0-dev.f7aded3 → 0.0.0-dev.f7e85aa

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 (191) hide show
  1. package/README.md +153 -0
  2. package/bin/run.js +0 -4
  3. package/dist/cli/detect-port.d.ts +18 -0
  4. package/dist/cli/detect-port.js +61 -0
  5. package/dist/cli/detect-port.js.map +1 -0
  6. package/dist/cli/header.js +1 -1
  7. package/dist/cli/header.js.map +1 -1
  8. package/dist/cli/telemetry.d.ts +7 -0
  9. package/dist/cli/telemetry.js +123 -0
  10. package/dist/cli/telemetry.js.map +1 -0
  11. package/dist/cli/types.d.ts +5 -0
  12. package/dist/cli/types.js +2 -0
  13. package/dist/cli/types.js.map +1 -0
  14. package/dist/cli/use-execute-steps.d.ts +3 -2
  15. package/dist/cli/use-execute-steps.js +6 -1
  16. package/dist/cli/use-execute-steps.js.map +1 -1
  17. package/dist/cli/use-messages.d.ts +3 -0
  18. package/dist/cli/use-messages.js +11 -0
  19. package/dist/cli/use-messages.js.map +1 -0
  20. package/dist/cli/use-nodemon.d.ts +2 -0
  21. package/dist/cli/use-nodemon.js +64 -0
  22. package/dist/cli/use-nodemon.js.map +1 -0
  23. package/dist/cli/use-tunnel.d.ts +14 -0
  24. package/dist/cli/use-tunnel.js +97 -0
  25. package/dist/cli/use-tunnel.js.map +1 -0
  26. package/dist/cli/use-typescript-check.d.ts +8 -0
  27. package/dist/cli/use-typescript-check.js +59 -0
  28. package/dist/cli/use-typescript-check.js.map +1 -0
  29. package/dist/commands/build.js +8 -5
  30. package/dist/commands/build.js.map +1 -1
  31. package/dist/commands/dev.d.ts +5 -1
  32. package/dist/commands/dev.js +38 -9
  33. package/dist/commands/dev.js.map +1 -1
  34. package/dist/commands/start.d.ts +3 -1
  35. package/dist/commands/start.js +31 -15
  36. package/dist/commands/start.js.map +1 -1
  37. package/dist/commands/telemetry/disable.d.ts +5 -0
  38. package/dist/commands/telemetry/disable.js +14 -0
  39. package/dist/commands/telemetry/disable.js.map +1 -0
  40. package/dist/commands/telemetry/enable.d.ts +5 -0
  41. package/dist/commands/telemetry/enable.js +14 -0
  42. package/dist/commands/telemetry/enable.js.map +1 -0
  43. package/dist/commands/telemetry/status.d.ts +5 -0
  44. package/dist/commands/telemetry/status.js +14 -0
  45. package/dist/commands/telemetry/status.js.map +1 -0
  46. package/dist/server/asset-base-url-transform-plugin.d.ts +10 -0
  47. package/dist/server/asset-base-url-transform-plugin.js +33 -0
  48. package/dist/server/asset-base-url-transform-plugin.js.map +1 -0
  49. package/dist/server/asset-base-url-transform-plugin.test.d.ts +1 -0
  50. package/dist/server/asset-base-url-transform-plugin.test.js +55 -0
  51. package/dist/server/asset-base-url-transform-plugin.test.js.map +1 -0
  52. package/dist/server/content-helpers.d.ts +27 -0
  53. package/dist/server/content-helpers.js +46 -0
  54. package/dist/server/content-helpers.js.map +1 -0
  55. package/dist/server/content-helpers.test.d.ts +1 -0
  56. package/dist/server/content-helpers.test.js +70 -0
  57. package/dist/server/content-helpers.test.js.map +1 -0
  58. package/dist/server/express.d.ts +15 -0
  59. package/dist/server/express.js +77 -0
  60. package/dist/server/express.js.map +1 -0
  61. package/dist/server/express.test.d.ts +1 -0
  62. package/dist/server/express.test.js +252 -0
  63. package/dist/server/express.test.js.map +1 -0
  64. package/dist/server/index.d.ts +4 -2
  65. package/dist/server/index.js +2 -1
  66. package/dist/server/index.js.map +1 -1
  67. package/dist/server/metric.d.ts +14 -0
  68. package/dist/server/metric.js +62 -0
  69. package/dist/server/metric.js.map +1 -0
  70. package/dist/server/middleware.d.ts +124 -0
  71. package/dist/server/middleware.js +93 -0
  72. package/dist/server/middleware.js.map +1 -0
  73. package/dist/server/middleware.test-d.d.ts +1 -0
  74. package/dist/server/middleware.test-d.js +75 -0
  75. package/dist/server/middleware.test-d.js.map +1 -0
  76. package/dist/server/middleware.test.d.ts +1 -0
  77. package/dist/server/middleware.test.js +493 -0
  78. package/dist/server/middleware.test.js.map +1 -0
  79. package/dist/server/server.d.ts +136 -61
  80. package/dist/server/server.js +304 -55
  81. package/dist/server/server.js.map +1 -1
  82. package/dist/server/templates/development.hbs +2 -56
  83. package/dist/server/templates/production.hbs +1 -2
  84. package/dist/server/widgetsDevServer.d.ts +9 -7
  85. package/dist/server/widgetsDevServer.js +22 -23
  86. package/dist/server/widgetsDevServer.js.map +1 -1
  87. package/dist/test/utils.d.ts +6 -14
  88. package/dist/test/utils.js +35 -30
  89. package/dist/test/utils.js.map +1 -1
  90. package/dist/test/widget.test.js +309 -110
  91. package/dist/test/widget.test.js.map +1 -1
  92. package/dist/version.d.ts +1 -0
  93. package/dist/version.js +5 -0
  94. package/dist/version.js.map +1 -0
  95. package/dist/web/bridges/apps-sdk/adaptor.d.ts +14 -4
  96. package/dist/web/bridges/apps-sdk/adaptor.js +53 -5
  97. package/dist/web/bridges/apps-sdk/adaptor.js.map +1 -1
  98. package/dist/web/bridges/apps-sdk/bridge.d.ts +1 -1
  99. package/dist/web/bridges/apps-sdk/index.d.ts +1 -1
  100. package/dist/web/bridges/apps-sdk/types.d.ts +30 -25
  101. package/dist/web/bridges/apps-sdk/types.js.map +1 -1
  102. package/dist/web/bridges/mcp-app/adaptor.d.ts +33 -4
  103. package/dist/web/bridges/mcp-app/adaptor.js +161 -38
  104. package/dist/web/bridges/mcp-app/adaptor.js.map +1 -1
  105. package/dist/web/bridges/mcp-app/bridge.d.ts +13 -30
  106. package/dist/web/bridges/mcp-app/bridge.js +43 -196
  107. package/dist/web/bridges/mcp-app/bridge.js.map +1 -1
  108. package/dist/web/bridges/mcp-app/use-mcp-app-context.d.ts +5 -3
  109. package/dist/web/bridges/mcp-app/use-mcp-app-context.js +2 -2
  110. package/dist/web/bridges/mcp-app/use-mcp-app-context.js.map +1 -1
  111. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js +1 -41
  112. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js.map +1 -1
  113. package/dist/web/bridges/types.d.ts +38 -3
  114. package/dist/web/components/modal-provider.d.ts +4 -0
  115. package/dist/web/components/modal-provider.js +45 -0
  116. package/dist/web/components/modal-provider.js.map +1 -0
  117. package/dist/web/create-store.js +15 -1
  118. package/dist/web/create-store.js.map +1 -1
  119. package/dist/web/create-store.test.js +9 -4
  120. package/dist/web/create-store.test.js.map +1 -1
  121. package/dist/web/data-llm.test.js +11 -8
  122. package/dist/web/data-llm.test.js.map +1 -1
  123. package/dist/web/generate-helpers.d.ts +8 -6
  124. package/dist/web/generate-helpers.js +8 -6
  125. package/dist/web/generate-helpers.js.map +1 -1
  126. package/dist/web/hooks/index.d.ts +2 -1
  127. package/dist/web/hooks/index.js +1 -0
  128. package/dist/web/hooks/index.js.map +1 -1
  129. package/dist/web/hooks/test/utils.js +4 -0
  130. package/dist/web/hooks/test/utils.js.map +1 -1
  131. package/dist/web/hooks/use-display-mode.d.ts +3 -3
  132. package/dist/web/hooks/use-display-mode.js.map +1 -1
  133. package/dist/web/hooks/use-display-mode.test-d.d.ts +1 -0
  134. package/dist/web/hooks/use-display-mode.test-d.js +8 -0
  135. package/dist/web/hooks/use-display-mode.test-d.js.map +1 -0
  136. package/dist/web/hooks/use-files.d.ts +3 -6
  137. package/dist/web/hooks/use-files.js +5 -2
  138. package/dist/web/hooks/use-files.js.map +1 -1
  139. package/dist/web/hooks/use-files.test.js +28 -3
  140. package/dist/web/hooks/use-files.test.js.map +1 -1
  141. package/dist/web/hooks/use-layout.test.js +3 -3
  142. package/dist/web/hooks/use-layout.test.js.map +1 -1
  143. package/dist/web/hooks/use-open-external.d.ts +3 -1
  144. package/dist/web/hooks/use-open-external.js +1 -1
  145. package/dist/web/hooks/use-open-external.js.map +1 -1
  146. package/dist/web/hooks/use-open-external.test.js +26 -11
  147. package/dist/web/hooks/use-open-external.test.js.map +1 -1
  148. package/dist/web/hooks/use-request-modal.d.ts +2 -2
  149. package/dist/web/hooks/use-request-modal.js +9 -7
  150. package/dist/web/hooks/use-request-modal.js.map +1 -1
  151. package/dist/web/hooks/use-request-modal.test.js +5 -1
  152. package/dist/web/hooks/use-request-modal.test.js.map +1 -1
  153. package/dist/web/hooks/use-set-open-in-app-url.d.ts +1 -0
  154. package/dist/web/hooks/use-set-open-in-app-url.js +8 -0
  155. package/dist/web/hooks/use-set-open-in-app-url.js.map +1 -0
  156. package/dist/web/hooks/use-set-open-in-app-url.test.d.ts +1 -0
  157. package/dist/web/hooks/use-set-open-in-app-url.test.js +43 -0
  158. package/dist/web/hooks/use-set-open-in-app-url.test.js.map +1 -0
  159. package/dist/web/hooks/use-tool-info.test.js +1 -1
  160. package/dist/web/hooks/use-tool-info.test.js.map +1 -1
  161. package/dist/web/hooks/use-user.js +18 -2
  162. package/dist/web/hooks/use-user.js.map +1 -1
  163. package/dist/web/hooks/use-user.test.js +29 -1
  164. package/dist/web/hooks/use-user.test.js.map +1 -1
  165. package/dist/web/hooks/use-widget-state.test.js +123 -7
  166. package/dist/web/hooks/use-widget-state.test.js.map +1 -1
  167. package/dist/web/index.d.ts +1 -0
  168. package/dist/web/index.js.map +1 -1
  169. package/dist/web/mount-widget.js +9 -1
  170. package/dist/web/mount-widget.js.map +1 -1
  171. package/dist/web/plugin/plugin.d.ts +4 -1
  172. package/dist/web/plugin/plugin.js +89 -18
  173. package/dist/web/plugin/plugin.js.map +1 -1
  174. package/dist/web/plugin/scan-widgets.d.ts +8 -0
  175. package/dist/web/plugin/scan-widgets.js +68 -0
  176. package/dist/web/plugin/scan-widgets.js.map +1 -0
  177. package/dist/web/plugin/scan-widgets.test.d.ts +1 -0
  178. package/dist/web/plugin/scan-widgets.test.js +96 -0
  179. package/dist/web/plugin/scan-widgets.test.js.map +1 -0
  180. package/dist/web/plugin/transform-data-llm.js +1 -1
  181. package/dist/web/plugin/transform-data-llm.js.map +1 -1
  182. package/dist/web/plugin/validate-widget.d.ts +1 -0
  183. package/dist/web/plugin/validate-widget.js +9 -0
  184. package/dist/web/plugin/validate-widget.js.map +1 -0
  185. package/dist/web/plugin/validate-widget.test.d.ts +1 -0
  186. package/dist/web/plugin/validate-widget.test.js +24 -0
  187. package/dist/web/plugin/validate-widget.test.js.map +1 -0
  188. package/dist/web/proxy.js +0 -1
  189. package/dist/web/proxy.js.map +1 -1
  190. package/package.json +40 -25
  191. package/tsconfig.base.json +33 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asset-base-url-transform-plugin.test.js","sourceRoot":"","sources":["../../src/server/asset-base-url-transform-plugin.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAE7E,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,MAAM,KAAK,GAAG;YACZ;gBACE,IAAI,EAAE,eAAe;gBACrB,IAAI,EAAE,mCAAmC;gBACzC,QAAQ,EAAE,yEAAyE;aACpF;YACD;gBACE,IAAI,EAAE,eAAe;gBACrB,IAAI,EAAE,mCAAmC;gBACzC,QAAQ,EAAE,yEAAyE;aACpF;YACD;gBACE,IAAI,EAAE,iBAAiB;gBACvB,IAAI,EAAE,mCAAmC;gBACzC,QAAQ,EAAE,yEAAyE;aACpF;SACF,CAAC;QAEF,KAAK,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,KAAK,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;YAC3C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,IAAI,GAAG;;;;KAIZ,CAAC;QACF,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAE3C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CACtB,0DAA0D,CAC3D,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CACtB,0DAA0D,CAC3D,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CACtB,4DAA4D,CAC7D,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,IAAI,GAAG;;;;KAIZ,CAAC;QACF,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAE3C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CACtB,0DAA0D,CAC3D,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAC;QACzD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,+BAA+B,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,IAAI,GAAG,6BAA6B,CAAC;QAC3C,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAE3C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { AudioContent, EmbeddedResource, ImageContent, ResourceLink, TextContent } from "@modelcontextprotocol/sdk/types.js";
2
+ type ContentAnnotations = {
3
+ audience?: ("user" | "assistant")[];
4
+ priority?: number;
5
+ lastModified?: string;
6
+ };
7
+ export declare function text(value: string, annotations?: ContentAnnotations): TextContent;
8
+ export declare function image(data: string | Uint8Array, mimeType: string, annotations?: ContentAnnotations): ImageContent;
9
+ export declare function audio(data: string | Uint8Array, mimeType: string, annotations?: ContentAnnotations): AudioContent;
10
+ export declare function embeddedResource(resource: {
11
+ uri: string;
12
+ mimeType?: string;
13
+ text: string;
14
+ } | {
15
+ uri: string;
16
+ mimeType?: string;
17
+ blob: string;
18
+ }, annotations?: ContentAnnotations): EmbeddedResource;
19
+ export declare function resourceLink(link: {
20
+ uri: string;
21
+ name: string;
22
+ title?: string;
23
+ description?: string;
24
+ mimeType?: string;
25
+ size?: number;
26
+ }, annotations?: ContentAnnotations): ResourceLink;
27
+ export {};
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Returns a base64-encoded string.
3
+ * - `Uint8Array` input is encoded via `Buffer.toString("base64")`.
4
+ * - `string` input is assumed to be **already base64-encoded** and is returned
5
+ * as-is. Passing raw/unencoded string bytes will produce invalid MCP content.
6
+ */
7
+ function toBase64(data) {
8
+ if (typeof data === "string") {
9
+ return data;
10
+ }
11
+ return Buffer.from(data).toString("base64");
12
+ }
13
+ export function text(value, annotations) {
14
+ return { type: "text", text: value, ...(annotations && { annotations }) };
15
+ }
16
+ export function image(data, mimeType, annotations) {
17
+ return {
18
+ type: "image",
19
+ data: toBase64(data),
20
+ mimeType,
21
+ ...(annotations && { annotations }),
22
+ };
23
+ }
24
+ export function audio(data, mimeType, annotations) {
25
+ return {
26
+ type: "audio",
27
+ data: toBase64(data),
28
+ mimeType,
29
+ ...(annotations && { annotations }),
30
+ };
31
+ }
32
+ export function embeddedResource(resource, annotations) {
33
+ return {
34
+ type: "resource",
35
+ resource,
36
+ ...(annotations && { annotations }),
37
+ };
38
+ }
39
+ export function resourceLink(link, annotations) {
40
+ return {
41
+ type: "resource_link",
42
+ ...link,
43
+ ...(annotations && { annotations }),
44
+ };
45
+ }
46
+ //# sourceMappingURL=content-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-helpers.js","sourceRoot":"","sources":["../../src/server/content-helpers.ts"],"names":[],"mappings":"AAcA;;;;;GAKG;AACH,SAAS,QAAQ,CAAC,IAAyB;IACzC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,IAAI,CAClB,KAAa,EACb,WAAgC;IAEhC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,WAAW,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,KAAK,CACnB,IAAyB,EACzB,QAAgB,EAChB,WAAgC;IAEhC,OAAO;QACL,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC;QACpB,QAAQ;QACR,GAAG,CAAC,WAAW,IAAI,EAAE,WAAW,EAAE,CAAC;KACpC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,KAAK,CACnB,IAAyB,EACzB,QAAgB,EAChB,WAAgC;IAEhC,OAAO;QACL,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC;QACpB,QAAQ;QACR,GAAG,CAAC,WAAW,IAAI,EAAE,WAAW,EAAE,CAAC;KACpC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,QAEoD,EACpD,WAAgC;IAEhC,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,QAAQ;QACR,GAAG,CAAC,WAAW,IAAI,EAAE,WAAW,EAAE,CAAC;KACpC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,IAOC,EACD,WAAgC;IAEhC,OAAO;QACL,IAAI,EAAE,eAAe;QACrB,GAAG,IAAI;QACP,GAAG,CAAC,WAAW,IAAI,EAAE,WAAW,EAAE,CAAC;KACpC,CAAC;AACJ,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,70 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { audio, embeddedResource, image, resourceLink, text, } from "./content-helpers.js";
3
+ describe("text", () => {
4
+ it("returns a TextContent without annotations when none given", () => {
5
+ expect(text("hello")).toEqual({ type: "text", text: "hello" });
6
+ });
7
+ it("includes annotations when provided", () => {
8
+ expect(text("hi", { priority: 1 })).toEqual({
9
+ type: "text",
10
+ text: "hi",
11
+ annotations: { priority: 1 },
12
+ });
13
+ });
14
+ });
15
+ describe("image", () => {
16
+ it("base64-encodes Uint8Array data", () => {
17
+ const bytes = new Uint8Array([104, 105]); // "hi"
18
+ expect(image(bytes, "image/png")).toEqual({
19
+ type: "image",
20
+ data: "aGk=",
21
+ mimeType: "image/png",
22
+ });
23
+ });
24
+ it("passes string data through unchanged (caller is responsible for base64)", () => {
25
+ expect(image("YWxyZWFkeS1iNjQ=", "image/png")).toEqual({
26
+ type: "image",
27
+ data: "YWxyZWFkeS1iNjQ=",
28
+ mimeType: "image/png",
29
+ });
30
+ });
31
+ });
32
+ describe("audio", () => {
33
+ it("base64-encodes Uint8Array data", () => {
34
+ const bytes = new Uint8Array([104, 105]);
35
+ expect(audio(bytes, "audio/mpeg")).toMatchObject({
36
+ type: "audio",
37
+ data: "aGk=",
38
+ mimeType: "audio/mpeg",
39
+ });
40
+ });
41
+ });
42
+ describe("embeddedResource", () => {
43
+ it("wraps a text resource with a type tag", () => {
44
+ expect(embeddedResource({
45
+ uri: "file:///a.txt",
46
+ mimeType: "text/plain",
47
+ text: "x",
48
+ })).toEqual({
49
+ type: "resource",
50
+ resource: { uri: "file:///a.txt", mimeType: "text/plain", text: "x" },
51
+ });
52
+ });
53
+ it("wraps a blob resource with a type tag", () => {
54
+ expect(embeddedResource({ uri: "file:///a.bin", blob: "YmFy" })).toEqual({
55
+ type: "resource",
56
+ resource: { uri: "file:///a.bin", blob: "YmFy" },
57
+ });
58
+ });
59
+ });
60
+ describe("resourceLink", () => {
61
+ it("spreads link fields alongside the type tag", () => {
62
+ expect(resourceLink({ uri: "file:///a", name: "a", title: "A" })).toEqual({
63
+ type: "resource_link",
64
+ uri: "file:///a",
65
+ name: "a",
66
+ title: "A",
67
+ });
68
+ });
69
+ });
70
+ //# sourceMappingURL=content-helpers.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-helpers.test.js","sourceRoot":"","sources":["../../src/server/content-helpers.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type http from "node:http";
2
+ import express from "express";
3
+ import type { McpServer } from "./server.js";
4
+ export declare function createApp({ mcpServer, httpServer, customMiddleware, errorMiddleware, }: {
5
+ mcpServer: McpServer;
6
+ httpServer: http.Server;
7
+ customMiddleware?: {
8
+ path?: string;
9
+ handlers: express.RequestHandler[];
10
+ }[];
11
+ errorMiddleware?: {
12
+ path?: string;
13
+ handlers: express.ErrorRequestHandler[];
14
+ }[];
15
+ }): Promise<express.Express>;
@@ -0,0 +1,77 @@
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
+ function applyMiddlewares(app, middlewares) {
6
+ for (const middleware of middlewares) {
7
+ if (middleware.path) {
8
+ app.use(middleware.path, ...middleware.handlers);
9
+ }
10
+ else {
11
+ app.use(...middleware.handlers);
12
+ }
13
+ }
14
+ }
15
+ function defaultErrorHandler(err, _req, res, _next) {
16
+ console.error("Error handling MCP request:", err);
17
+ if (!res.headersSent) {
18
+ res.status(500).json({
19
+ jsonrpc: "2.0",
20
+ error: { code: -32603, message: "Internal server error" },
21
+ id: null,
22
+ });
23
+ }
24
+ }
25
+ export async function createApp({ mcpServer, httpServer, customMiddleware = [], errorMiddleware = [], }) {
26
+ const app = express();
27
+ app.use(express.json());
28
+ const env = process.env.NODE_ENV || "development";
29
+ applyMiddlewares(app, customMiddleware);
30
+ if (env !== "production") {
31
+ const { devtoolsStaticServer } = await import("@skybridge/devtools");
32
+ app.use(await devtoolsStaticServer());
33
+ const { widgetsDevServer } = await import("./widgetsDevServer.js");
34
+ app.use(await widgetsDevServer(httpServer));
35
+ }
36
+ if (env === "production") {
37
+ const assetsPath = path.join(process.cwd(), "dist", "assets");
38
+ app.use("/assets", cors());
39
+ app.use("/assets", express.static(assetsPath));
40
+ }
41
+ app.use("/mcp", mcpMiddleware(mcpServer));
42
+ applyMiddlewares(app, errorMiddleware);
43
+ app.use("/mcp", defaultErrorHandler);
44
+ return app;
45
+ }
46
+ const mcpMiddleware = (server) => {
47
+ return async (req, res, next) => {
48
+ if (req.method !== "POST") {
49
+ res.writeHead(405).end(JSON.stringify({
50
+ jsonrpc: "2.0",
51
+ error: {
52
+ code: -32000,
53
+ message: "Method not allowed.",
54
+ },
55
+ id: null,
56
+ }));
57
+ return;
58
+ }
59
+ try {
60
+ const transport = new StreamableHTTPServerTransport({
61
+ sessionIdGenerator: undefined,
62
+ });
63
+ res.on("close", () => {
64
+ transport.close();
65
+ });
66
+ await server.connect(transport);
67
+ // Express strips the mount path from req.url (e.g. "/mcp" becomes "/").
68
+ // Restore it so the SDK builds the correct requestInfo.url.
69
+ req.url = req.originalUrl;
70
+ await transport.handleRequest(req, res, req.body);
71
+ }
72
+ catch (error) {
73
+ next(error);
74
+ }
75
+ };
76
+ };
77
+ //# 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 @@
1
+ export {};
@@ -0,0 +1,252 @@
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: (_httpServer) => ((_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
+ async function postApi(port) {
26
+ return fetch(`http://localhost:${port}/api/test`, { method: "POST" });
27
+ }
28
+ describe("createApp", () => {
29
+ it("runs global custom middleware before the /mcp handler", async () => {
30
+ const { createApp } = await import("./express.js");
31
+ const calls = [];
32
+ const mw = (_req, _res, next) => {
33
+ calls.push("custom");
34
+ next();
35
+ };
36
+ const httpServer = http.createServer();
37
+ const app = await createApp({
38
+ mcpServer: fakeServer,
39
+ httpServer,
40
+ customMiddleware: [{ handlers: [mw] }],
41
+ });
42
+ const { port, server } = await listen(app);
43
+ openServer = server;
44
+ await postMcp(port);
45
+ expect(calls).toEqual(["custom"]);
46
+ });
47
+ it("runs path-scoped middleware on /mcp", async () => {
48
+ const { createApp } = await import("./express.js");
49
+ const calls = [];
50
+ const mw = (_req, _res, next) => {
51
+ calls.push("auth");
52
+ next();
53
+ };
54
+ const httpServer = http.createServer();
55
+ const app = await createApp({
56
+ mcpServer: fakeServer,
57
+ httpServer,
58
+ customMiddleware: [{ path: "/mcp", handlers: [mw] }],
59
+ });
60
+ const { port, server } = await listen(app);
61
+ openServer = server;
62
+ await postMcp(port);
63
+ expect(calls).toEqual(["auth"]);
64
+ });
65
+ it("allows middleware to short-circuit with 401", async () => {
66
+ const { createApp } = await import("./express.js");
67
+ const calls = [];
68
+ const reject = (_req, res) => {
69
+ calls.push("reject");
70
+ res.status(401).json({ error: "Unauthorized" });
71
+ };
72
+ const httpServer = http.createServer();
73
+ const app = await createApp({
74
+ mcpServer: fakeServer,
75
+ httpServer,
76
+ customMiddleware: [{ path: "/mcp", handlers: [reject] }],
77
+ });
78
+ const { port, server } = await listen(app);
79
+ openServer = server;
80
+ const res = await postMcp(port);
81
+ expect(calls).toEqual(["reject"]);
82
+ expect(res.status).toBe(401);
83
+ expect(await res.json()).toEqual({ error: "Unauthorized" });
84
+ });
85
+ it("runs multiple global middleware in registration order", async () => {
86
+ const { createApp } = await import("./express.js");
87
+ const calls = [];
88
+ const mwA = (_req, _res, next) => {
89
+ calls.push("A");
90
+ next();
91
+ };
92
+ const mwB = (_req, _res, next) => {
93
+ calls.push("B");
94
+ next();
95
+ };
96
+ const httpServer = http.createServer();
97
+ const app = await createApp({
98
+ mcpServer: fakeServer,
99
+ httpServer,
100
+ customMiddleware: [{ handlers: [mwA] }, { handlers: [mwB] }],
101
+ });
102
+ const { port, server } = await listen(app);
103
+ openServer = server;
104
+ await postMcp(port);
105
+ expect(calls).toEqual(["A", "B"]);
106
+ });
107
+ it("path-scoped middleware does not run on non-matching paths", async () => {
108
+ const { createApp } = await import("./express.js");
109
+ const calls = [];
110
+ const apiMw = (_req, _res, next) => {
111
+ calls.push("api");
112
+ next();
113
+ };
114
+ const httpServer = http.createServer();
115
+ const app = await createApp({
116
+ mcpServer: fakeServer,
117
+ httpServer,
118
+ customMiddleware: [{ path: "/api", handlers: [apiMw] }],
119
+ });
120
+ const { port, server } = await listen(app);
121
+ openServer = server;
122
+ // Hit /mcp — the /api middleware should NOT fire
123
+ await postMcp(port);
124
+ expect(calls).toEqual([]);
125
+ });
126
+ it("supports Express Router via custom middleware", async () => {
127
+ const { createApp } = await import("./express.js");
128
+ const { Router } = await import("express");
129
+ const router = Router();
130
+ router.get("/health", (_req, res) => {
131
+ res.json({ status: "ok" });
132
+ });
133
+ const httpServer = http.createServer();
134
+ const app = await createApp({
135
+ mcpServer: fakeServer,
136
+ httpServer,
137
+ customMiddleware: [{ handlers: [router] }],
138
+ });
139
+ const { port, server } = await listen(app);
140
+ openServer = server;
141
+ const res = await fetch(`http://localhost:${port}/health`);
142
+ expect(res.status).toBe(200);
143
+ expect(await res.json()).toEqual({ status: "ok" });
144
+ });
145
+ it("supports path-prefixed Router", async () => {
146
+ const { createApp } = await import("./express.js");
147
+ const { Router } = await import("express");
148
+ const router = Router();
149
+ router.get("/data", (_req, res) => {
150
+ res.json({ value: 42 });
151
+ });
152
+ const httpServer = http.createServer();
153
+ const app = await createApp({
154
+ mcpServer: fakeServer,
155
+ httpServer,
156
+ customMiddleware: [
157
+ { path: "/api", handlers: [router] },
158
+ ],
159
+ });
160
+ const { port, server } = await listen(app);
161
+ openServer = server;
162
+ const res = await fetch(`http://localhost:${port}/api/data`);
163
+ expect(res.status).toBe(200);
164
+ expect(await res.json()).toEqual({ value: 42 });
165
+ });
166
+ it("server survives middleware errors without crashing", async () => {
167
+ const { createApp } = await import("./express.js");
168
+ const throwing = () => {
169
+ throw new Error("boom");
170
+ };
171
+ const httpServer = http.createServer();
172
+ const app = await createApp({
173
+ mcpServer: fakeServer,
174
+ httpServer,
175
+ customMiddleware: [{ path: "/explode", handlers: [throwing] }],
176
+ });
177
+ const { port, server } = await listen(app);
178
+ openServer = server;
179
+ const res = await fetch(`http://localhost:${port}/explode`);
180
+ expect(res.status).toBe(500);
181
+ // Server process did not crash — it still accepts connections
182
+ const followUp = await fetch(`http://localhost:${port}/explode`);
183
+ expect(followUp.status).toBe(500);
184
+ });
185
+ it("returns 500 JSON-RPC error when the MCP handler throws and no error middleware is registered", async () => {
186
+ const { createApp } = await import("./express.js");
187
+ const consoleSpy = vi.spyOn(console, "error").mockImplementation(() => { });
188
+ const httpServer = http.createServer();
189
+ const app = await createApp({ mcpServer: fakeServer, httpServer });
190
+ const { port, server } = await listen(app);
191
+ openServer = server;
192
+ const res = await postMcp(port);
193
+ expect(res.status).toBe(500);
194
+ expect(await res.json()).toEqual({
195
+ jsonrpc: "2.0",
196
+ error: { code: -32603, message: "Internal server error" },
197
+ id: null,
198
+ });
199
+ expect(consoleSpy).toHaveBeenCalledWith("Error handling MCP request:", expect.any(Error));
200
+ consoleSpy.mockRestore();
201
+ });
202
+ it("invokes a custom error handler when the MCP handler throws", async () => {
203
+ const { createApp } = await import("./express.js");
204
+ const calls = [];
205
+ const errorHandler = (_err, _req, res, _next) => {
206
+ calls.push("error-handler");
207
+ res.status(503).json({ custom: true });
208
+ };
209
+ const httpServer = http.createServer();
210
+ const app = await createApp({
211
+ mcpServer: fakeServer,
212
+ httpServer,
213
+ errorMiddleware: [{ handlers: [errorHandler] }],
214
+ });
215
+ const { port, server } = await listen(app);
216
+ openServer = server;
217
+ const res = await postMcp(port);
218
+ expect(calls).toEqual(["error-handler"]);
219
+ expect(res.status).toBe(503);
220
+ expect(await res.json()).toEqual({ custom: true });
221
+ });
222
+ it("invokes a path-scoped error handler only for matching routes", async () => {
223
+ const { createApp } = await import("./express.js");
224
+ const calls = [];
225
+ const mcpErrorHandler = (_err, _req, res, _next) => {
226
+ calls.push("mcp-error-handler");
227
+ res.status(503).json({ from: "mcp-error-handler" });
228
+ };
229
+ const throwingApiRoute = (_req, _res, next) => {
230
+ next(new Error("api error"));
231
+ };
232
+ const httpServer = http.createServer();
233
+ const app = await createApp({
234
+ mcpServer: fakeServer,
235
+ httpServer,
236
+ customMiddleware: [{ path: "/api/test", handlers: [throwingApiRoute] }],
237
+ errorMiddleware: [{ path: "/mcp", handlers: [mcpErrorHandler] }],
238
+ });
239
+ const { port, server } = await listen(app);
240
+ openServer = server;
241
+ const mcpRes = await postMcp(port);
242
+ expect(calls).toEqual(["mcp-error-handler"]);
243
+ expect(mcpRes.status).toBe(503);
244
+ expect(await mcpRes.json()).toEqual({ from: "mcp-error-handler" });
245
+ const consoleSpy = vi.spyOn(console, "error").mockImplementation(() => { });
246
+ const apiRes = await postApi(port);
247
+ expect(calls).toEqual(["mcp-error-handler"]);
248
+ expect(apiRes.status).toBe(500);
249
+ consoleSpy.mockRestore();
250
+ });
251
+ });
252
+ //# sourceMappingURL=express.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"express.test.js","sourceRoot":"","sources":["../../src/server/express.test.ts"],"names":[],"mappings":"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"}
@@ -1,4 +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
- export type { McpServerTypes, ToolDef, WidgetHostType } from "./server.js";
3
- export { McpServer } from "./server.js";
3
+ export type { McpExtra, McpMethodString, McpMiddlewareFilter, McpMiddlewareFn, McpResultFor, McpTypedMiddlewareFn, McpWildcard, } from "./middleware.js";
4
+ export type { HandlerContent, KnownToolMeta, McpServerTypes, ToolDef, ToolMeta, ViewConfig, ViewCsp, WidgetHostType, WidgetName, } from "./server.js";
5
+ export { McpServer, normalizeContent, } from "./server.js";
4
6
  export { widgetsDevServer } from "./widgetsDevServer.js";
@@ -1,3 +1,4 @@
1
- export { McpServer } from "./server.js";
1
+ export { audio, embeddedResource, image, resourceLink, text, } from "./content-helpers.js";
2
+ export { McpServer, normalizeContent, } from "./server.js";
2
3
  export { widgetsDevServer } from "./widgetsDevServer.js";
3
4
  //# sourceMappingURL=index.js.map
@@ -1 +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"}
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;AA6B9B,OAAO,EACL,SAAS,EACT,gBAAgB,GACjB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -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"}