skybridge 0.0.0-dev.ecfdeac → 0.0.0-dev.ed005a8

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