skybridge 0.0.0-dev.fc7beaf → 0.0.0-dev.fca7959

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 (368) hide show
  1. package/README.md +10 -7
  2. package/dist/cli/build-helpers.d.ts +11 -0
  3. package/dist/cli/build-helpers.js +107 -0
  4. package/dist/cli/build-helpers.js.map +1 -0
  5. package/dist/cli/build-helpers.test.js +132 -0
  6. package/dist/cli/build-helpers.test.js.map +1 -0
  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.d.ts +2 -2
  13. package/dist/cli/detect-port.js +8 -20
  14. package/dist/cli/detect-port.js.map +1 -1
  15. package/dist/cli/header.d.ts +1 -1
  16. package/dist/cli/resolve-skybridge-config.d.ts +5 -0
  17. package/dist/cli/resolve-skybridge-config.js +18 -0
  18. package/dist/cli/resolve-skybridge-config.js.map +1 -0
  19. package/dist/cli/run-plain.d.ts +18 -0
  20. package/dist/cli/run-plain.js +89 -0
  21. package/dist/cli/run-plain.js.map +1 -0
  22. package/dist/cli/use-execute-steps.d.ts +1 -1
  23. package/dist/cli/use-nodemon.d.ts +14 -0
  24. package/dist/cli/use-nodemon.js +81 -62
  25. package/dist/cli/use-nodemon.js.map +1 -1
  26. package/dist/cli/use-typescript-check.d.ts +8 -2
  27. package/dist/cli/use-typescript-check.js +70 -67
  28. package/dist/cli/use-typescript-check.js.map +1 -1
  29. package/dist/commands/build.d.ts +0 -3
  30. package/dist/commands/build.js +2 -73
  31. package/dist/commands/build.js.map +1 -1
  32. package/dist/commands/dev.d.ts +1 -0
  33. package/dist/commands/dev.js +48 -0
  34. package/dist/commands/dev.js.map +1 -1
  35. package/dist/commands/start.js +7 -1
  36. package/dist/commands/start.js.map +1 -1
  37. package/dist/context-warnings.d.ts +5 -0
  38. package/dist/context-warnings.js +31 -0
  39. package/dist/context-warnings.js.map +1 -0
  40. package/dist/context-warnings.test.js +28 -0
  41. package/dist/context-warnings.test.js.map +1 -0
  42. package/dist/server/app.d.ts +194 -0
  43. package/dist/server/app.js +266 -0
  44. package/dist/server/app.js.map +1 -0
  45. package/dist/server/app.test.js +97 -0
  46. package/dist/server/app.test.js.map +1 -0
  47. package/dist/server/auth/discovery.d.ts +33 -0
  48. package/dist/server/auth/discovery.js +56 -0
  49. package/dist/server/auth/discovery.js.map +1 -0
  50. package/dist/server/auth/discovery.test.d.ts +1 -0
  51. package/dist/server/auth/discovery.test.js +93 -0
  52. package/dist/server/auth/discovery.test.js.map +1 -0
  53. package/dist/server/auth/index.d.ts +48 -0
  54. package/dist/server/auth/index.js +2 -0
  55. package/dist/server/auth/index.js.map +1 -0
  56. package/dist/server/auth/providers/auth0.d.ts +40 -0
  57. package/dist/server/auth/providers/auth0.js +36 -0
  58. package/dist/server/auth/providers/auth0.js.map +1 -0
  59. package/dist/server/auth/providers/auth0.test.d.ts +1 -0
  60. package/dist/server/auth/providers/auth0.test.js +50 -0
  61. package/dist/server/auth/providers/auth0.test.js.map +1 -0
  62. package/dist/server/auth/providers/authplane.d.ts +49 -0
  63. package/dist/server/auth/providers/authplane.js +57 -0
  64. package/dist/server/auth/providers/authplane.js.map +1 -0
  65. package/dist/server/auth/providers/authplane.test.d.ts +1 -0
  66. package/dist/server/auth/providers/authplane.test.js +143 -0
  67. package/dist/server/auth/providers/authplane.test.js.map +1 -0
  68. package/dist/server/auth/providers/clerk.d.ts +51 -0
  69. package/dist/server/auth/providers/clerk.js +19 -0
  70. package/dist/server/auth/providers/clerk.js.map +1 -0
  71. package/dist/server/auth/providers/clerk.test.d.ts +1 -0
  72. package/dist/server/auth/providers/clerk.test.js +30 -0
  73. package/dist/server/auth/providers/clerk.test.js.map +1 -0
  74. package/dist/server/auth/providers/custom.d.ts +40 -0
  75. package/dist/server/auth/providers/custom.js +59 -0
  76. package/dist/server/auth/providers/custom.js.map +1 -0
  77. package/dist/server/auth/providers/custom.test.d.ts +1 -0
  78. package/dist/server/auth/providers/custom.test.js +161 -0
  79. package/dist/server/auth/providers/custom.test.js.map +1 -0
  80. package/dist/server/auth/providers/descope.d.ts +44 -0
  81. package/dist/server/auth/providers/descope.js +44 -0
  82. package/dist/server/auth/providers/descope.js.map +1 -0
  83. package/dist/server/auth/providers/descope.test.d.ts +1 -0
  84. package/dist/server/auth/providers/descope.test.js +62 -0
  85. package/dist/server/auth/providers/descope.test.js.map +1 -0
  86. package/dist/server/auth/providers/shared.d.ts +2 -0
  87. package/dist/server/auth/providers/shared.js +6 -0
  88. package/dist/server/auth/providers/shared.js.map +1 -0
  89. package/dist/server/auth/providers/shared.test.d.ts +1 -0
  90. package/dist/server/auth/providers/shared.test.js +10 -0
  91. package/dist/server/auth/providers/shared.test.js.map +1 -0
  92. package/dist/server/auth/providers/stytch.d.ts +25 -0
  93. package/dist/server/auth/providers/stytch.js +16 -0
  94. package/dist/server/auth/providers/stytch.js.map +1 -0
  95. package/dist/server/auth/providers/verify-spy.d.ts +12 -0
  96. package/dist/server/auth/providers/verify-spy.js +21 -0
  97. package/dist/server/auth/providers/verify-spy.js.map +1 -0
  98. package/dist/server/auth/providers/workos.d.ts +33 -0
  99. package/dist/server/auth/providers/workos.js +15 -0
  100. package/dist/server/auth/providers/workos.js.map +1 -0
  101. package/dist/server/auth/security-schemes.d.ts +23 -0
  102. package/dist/server/auth/security-schemes.js +64 -0
  103. package/dist/server/auth/security-schemes.js.map +1 -0
  104. package/dist/server/auth/security-schemes.test.d.ts +1 -0
  105. package/dist/server/auth/security-schemes.test.js +99 -0
  106. package/dist/server/auth/security-schemes.test.js.map +1 -0
  107. package/dist/server/auth/setup.d.ts +6 -0
  108. package/dist/server/auth/setup.js +91 -0
  109. package/dist/server/auth/setup.js.map +1 -0
  110. package/dist/server/auth/setup.test.d.ts +1 -0
  111. package/dist/server/auth/setup.test.js +514 -0
  112. package/dist/server/auth/setup.test.js.map +1 -0
  113. package/dist/server/auth/verify.d.ts +46 -0
  114. package/dist/server/auth/verify.js +62 -0
  115. package/dist/server/auth/verify.js.map +1 -0
  116. package/dist/server/auth/verify.test.d.ts +1 -0
  117. package/dist/server/auth/verify.test.js +149 -0
  118. package/dist/server/auth/verify.test.js.map +1 -0
  119. package/dist/server/auth-extra.test-d.js +130 -0
  120. package/dist/server/auth-extra.test-d.js.map +1 -0
  121. package/dist/server/auth.d.ts +43 -6
  122. package/dist/server/auth.js +4 -5
  123. package/dist/server/auth.js.map +1 -1
  124. package/dist/server/build-manifest.test.d.ts +1 -0
  125. package/dist/server/build-manifest.test.js +28 -0
  126. package/dist/server/build-manifest.test.js.map +1 -0
  127. package/dist/server/content-helpers.d.ts +1 -1
  128. package/dist/server/content-helpers.js.map +1 -1
  129. package/dist/server/express.d.ts +23 -3
  130. package/dist/server/express.js +38 -32
  131. package/dist/server/express.js.map +1 -1
  132. package/dist/server/express.test.js +268 -90
  133. package/dist/server/express.test.js.map +1 -1
  134. package/dist/server/file-ref.d.ts +1 -1
  135. package/dist/server/file-ref.js +1 -1
  136. package/dist/server/file-ref.js.map +1 -1
  137. package/dist/server/host.d.ts +2 -0
  138. package/dist/server/host.js +11 -0
  139. package/dist/server/host.js.map +1 -0
  140. package/dist/server/host.test.d.ts +1 -0
  141. package/dist/server/host.test.js +13 -0
  142. package/dist/server/host.test.js.map +1 -0
  143. package/dist/server/index.d.ts +17 -3
  144. package/dist/server/index.js +14 -2
  145. package/dist/server/index.js.map +1 -1
  146. package/dist/server/mcp-errors.test.d.ts +1 -0
  147. package/dist/server/mcp-errors.test.js +41 -0
  148. package/dist/server/mcp-errors.test.js.map +1 -0
  149. package/dist/server/middleware.d.ts +35 -10
  150. package/dist/server/middleware.js +33 -0
  151. package/dist/server/middleware.js.map +1 -1
  152. package/dist/server/middleware.test-d.js +1 -1
  153. package/dist/server/middleware.test-d.js.map +1 -1
  154. package/dist/server/middleware.test.js +242 -134
  155. package/dist/server/middleware.test.js.map +1 -1
  156. package/dist/server/register-tool.test.d.ts +1 -0
  157. package/dist/server/register-tool.test.js +27 -0
  158. package/dist/server/register-tool.test.js.map +1 -0
  159. package/dist/server/requestOrigin.d.ts +7 -0
  160. package/dist/server/requestOrigin.js +25 -0
  161. package/dist/server/requestOrigin.js.map +1 -0
  162. package/dist/server/server.d.ts +144 -122
  163. package/dist/server/server.js +313 -328
  164. package/dist/server/server.js.map +1 -1
  165. package/dist/server/skills-integration.test.d.ts +1 -0
  166. package/dist/server/skills-integration.test.js +86 -0
  167. package/dist/server/skills-integration.test.js.map +1 -0
  168. package/dist/server/skills.d.ts +27 -0
  169. package/dist/server/skills.js +188 -0
  170. package/dist/server/skills.js.map +1 -0
  171. package/dist/server/skills.test.d.ts +1 -0
  172. package/dist/server/skills.test.js +243 -0
  173. package/dist/server/skills.test.js.map +1 -0
  174. package/dist/server/templateHelper.d.ts +0 -3
  175. package/dist/server/templateHelper.js.map +1 -1
  176. package/dist/server/templates.generated.js +4 -8
  177. package/dist/server/templates.generated.js.map +1 -1
  178. package/dist/server/tool-extra.test.d.ts +1 -0
  179. package/dist/server/tool-extra.test.js +88 -0
  180. package/dist/server/tool-extra.test.js.map +1 -0
  181. package/dist/server/view-name.test-d.d.ts +1 -0
  182. package/dist/server/view-name.test-d.js +8 -0
  183. package/dist/server/view-name.test-d.js.map +1 -0
  184. package/dist/server/view-resource-resolution.test.d.ts +6 -0
  185. package/dist/server/view-resource-resolution.test.js +176 -0
  186. package/dist/server/view-resource-resolution.test.js.map +1 -0
  187. package/dist/server/viewsDevServer.js +4 -1
  188. package/dist/server/viewsDevServer.js.map +1 -1
  189. package/dist/test/utils.d.ts +9 -11
  190. package/dist/test/utils.js +220 -201
  191. package/dist/test/utils.js.map +1 -1
  192. package/dist/test/view.test.js +105 -133
  193. package/dist/test/view.test.js.map +1 -1
  194. package/dist/views/index.d.ts +10 -0
  195. package/dist/views/index.js +3 -0
  196. package/dist/views/index.js.map +1 -0
  197. package/dist/{web/plugin → views}/scan-views.js +1 -1
  198. package/dist/views/scan-views.js.map +1 -0
  199. package/dist/views/scan-views.test.d.ts +1 -0
  200. package/dist/views/scan-views.test.js.map +1 -0
  201. package/dist/views/validate-view.d.ts +1 -0
  202. package/dist/{web/plugin → views}/validate-view.js +2 -2
  203. package/dist/views/validate-view.js.map +1 -0
  204. package/dist/views/validate-view.test.d.ts +1 -0
  205. package/dist/views/validate-view.test.js.map +1 -0
  206. package/dist/web/bridges/adaptor.d.ts +51 -0
  207. package/dist/web/bridges/adaptor.js +327 -0
  208. package/dist/web/bridges/adaptor.js.map +1 -0
  209. package/dist/web/bridges/adaptor.test.d.ts +1 -0
  210. package/dist/web/bridges/adaptor.test.js +225 -0
  211. package/dist/web/bridges/adaptor.test.js.map +1 -0
  212. package/dist/web/bridges/apps-sdk/bridge.d.ts +6 -2
  213. package/dist/web/bridges/apps-sdk/bridge.js +15 -4
  214. package/dist/web/bridges/apps-sdk/bridge.js.map +1 -1
  215. package/dist/web/bridges/apps-sdk/index.d.ts +0 -1
  216. package/dist/web/bridges/apps-sdk/index.js +0 -1
  217. package/dist/web/bridges/apps-sdk/index.js.map +1 -1
  218. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.d.ts +1 -1
  219. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js +1 -1
  220. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js.map +1 -1
  221. package/dist/web/bridges/get-adaptor.d.ts +4 -4
  222. package/dist/web/bridges/get-adaptor.js +6 -11
  223. package/dist/web/bridges/get-adaptor.js.map +1 -1
  224. package/dist/web/bridges/get-adaptor.test.d.ts +1 -0
  225. package/dist/web/bridges/get-adaptor.test.js +32 -0
  226. package/dist/web/bridges/get-adaptor.test.js.map +1 -0
  227. package/dist/web/bridges/mcp-app/bridge.d.ts +15 -3
  228. package/dist/web/bridges/mcp-app/bridge.js +73 -8
  229. package/dist/web/bridges/mcp-app/bridge.js.map +1 -1
  230. package/dist/web/bridges/mcp-app/bridge.test.d.ts +1 -0
  231. package/dist/web/bridges/mcp-app/bridge.test.js +17 -0
  232. package/dist/web/bridges/mcp-app/bridge.test.js.map +1 -0
  233. package/dist/web/bridges/mcp-app/index.d.ts +0 -1
  234. package/dist/web/bridges/mcp-app/index.js +0 -1
  235. package/dist/web/bridges/mcp-app/index.js.map +1 -1
  236. package/dist/web/bridges/mcp-app/types.d.ts +2 -0
  237. package/dist/web/bridges/mcp-app/types.js.map +1 -1
  238. package/dist/web/bridges/mcp-app/use-mcp-app-context.d.ts +1 -1
  239. package/dist/web/bridges/mcp-app/use-mcp-app-context.js +1 -1
  240. package/dist/web/bridges/mcp-app/use-mcp-app-context.js.map +1 -1
  241. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js +1 -1
  242. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js.map +1 -1
  243. package/dist/web/bridges/mcp-app/view-tools.test.d.ts +1 -0
  244. package/dist/web/bridges/mcp-app/view-tools.test.js +143 -0
  245. package/dist/web/bridges/mcp-app/view-tools.test.js.map +1 -0
  246. package/dist/web/bridges/types.d.ts +55 -7
  247. package/dist/web/bridges/types.js +14 -1
  248. package/dist/web/bridges/types.js.map +1 -1
  249. package/dist/web/bridges/types.test.d.ts +1 -0
  250. package/dist/web/bridges/types.test.js +19 -0
  251. package/dist/web/bridges/types.test.js.map +1 -0
  252. package/dist/web/components/modal-provider.d.ts +1 -1
  253. package/dist/web/components/modal-provider.js +4 -3
  254. package/dist/web/components/modal-provider.js.map +1 -1
  255. package/dist/web/create-store.test.js +10 -7
  256. package/dist/web/create-store.test.js.map +1 -1
  257. package/dist/web/data-llm.d.ts +1 -1
  258. package/dist/web/data-llm.test.js +20 -7
  259. package/dist/web/data-llm.test.js.map +1 -1
  260. package/dist/web/generate-helpers.d.ts +22 -18
  261. package/dist/web/generate-helpers.js +19 -15
  262. package/dist/web/generate-helpers.js.map +1 -1
  263. package/dist/web/generate-helpers.test-d.js +7 -5
  264. package/dist/web/generate-helpers.test-d.js.map +1 -1
  265. package/dist/web/generate-helpers.test.js +2 -2
  266. package/dist/web/generate-helpers.test.js.map +1 -1
  267. package/dist/web/hooks/index.d.ts +3 -1
  268. package/dist/web/hooks/index.js +3 -1
  269. package/dist/web/hooks/index.js.map +1 -1
  270. package/dist/web/hooks/test/utils.d.ts +2 -1
  271. package/dist/web/hooks/test/utils.js +1 -1
  272. package/dist/web/hooks/test/utils.js.map +1 -1
  273. package/dist/web/hooks/use-call-tool.test.js +39 -25
  274. package/dist/web/hooks/use-call-tool.test.js.map +1 -1
  275. package/dist/web/hooks/use-display-mode.d.ts +1 -1
  276. package/dist/web/hooks/use-display-mode.js +1 -1
  277. package/dist/web/hooks/use-display-mode.js.map +1 -1
  278. package/dist/web/hooks/use-display-mode.test.js +57 -21
  279. package/dist/web/hooks/use-display-mode.test.js.map +1 -1
  280. package/dist/web/hooks/use-download.d.ts +1 -3
  281. package/dist/web/hooks/use-download.js +1 -2
  282. package/dist/web/hooks/use-download.js.map +1 -1
  283. package/dist/web/hooks/use-download.test.js +18 -10
  284. package/dist/web/hooks/use-download.test.js.map +1 -1
  285. package/dist/web/hooks/use-files.test.js +11 -3
  286. package/dist/web/hooks/use-files.test.js.map +1 -1
  287. package/dist/web/hooks/use-host.d.ts +22 -0
  288. package/dist/web/hooks/use-host.js +30 -0
  289. package/dist/web/hooks/use-host.js.map +1 -0
  290. package/dist/web/hooks/use-host.test.d.ts +1 -0
  291. package/dist/web/hooks/use-host.test.js +59 -0
  292. package/dist/web/hooks/use-host.test.js.map +1 -0
  293. package/dist/web/hooks/use-open-external.test.js +15 -5
  294. package/dist/web/hooks/use-open-external.test.js.map +1 -1
  295. package/dist/web/hooks/use-register-view-tool.d.ts +37 -0
  296. package/dist/web/hooks/use-register-view-tool.js +50 -0
  297. package/dist/web/hooks/use-register-view-tool.js.map +1 -0
  298. package/dist/web/hooks/use-request-close.test.js +35 -40
  299. package/dist/web/hooks/use-request-close.test.js.map +1 -1
  300. package/dist/web/hooks/use-request-modal.test.js +11 -1
  301. package/dist/web/hooks/use-request-modal.test.js.map +1 -1
  302. package/dist/web/hooks/use-request-size.d.ts +1 -1
  303. package/dist/web/hooks/use-request-size.js +1 -1
  304. package/dist/web/hooks/use-request-size.js.map +1 -1
  305. package/dist/web/hooks/use-request-size.test.js +35 -53
  306. package/dist/web/hooks/use-request-size.test.js.map +1 -1
  307. package/dist/web/hooks/use-set-open-in-app-url.test.js +26 -12
  308. package/dist/web/hooks/use-set-open-in-app-url.test.js.map +1 -1
  309. package/dist/web/hooks/use-tool-info.d.ts +18 -19
  310. package/dist/web/hooks/use-tool-info.js +4 -8
  311. package/dist/web/hooks/use-tool-info.js.map +1 -1
  312. package/dist/web/hooks/use-tool-info.test-d.js +11 -34
  313. package/dist/web/hooks/use-tool-info.test-d.js.map +1 -1
  314. package/dist/web/hooks/use-tool-info.test.js +42 -37
  315. package/dist/web/hooks/use-tool-info.test.js.map +1 -1
  316. package/dist/web/hooks/use-user.d.ts +3 -2
  317. package/dist/web/hooks/use-user.js +4 -3
  318. package/dist/web/hooks/use-user.js.map +1 -1
  319. package/dist/web/hooks/use-user.test.js +85 -37
  320. package/dist/web/hooks/use-user.test.js.map +1 -1
  321. package/dist/web/hooks/use-view-state.js +19 -9
  322. package/dist/web/hooks/use-view-state.js.map +1 -1
  323. package/dist/web/hooks/use-view-state.test.js +39 -4
  324. package/dist/web/hooks/use-view-state.test.js.map +1 -1
  325. package/dist/web/hooks/use-viewport.d.ts +20 -0
  326. package/dist/web/hooks/use-viewport.js +21 -0
  327. package/dist/web/hooks/use-viewport.js.map +1 -0
  328. package/dist/web/hooks/use-viewport.test.d.ts +1 -0
  329. package/dist/web/hooks/use-viewport.test.js +109 -0
  330. package/dist/web/hooks/use-viewport.test.js.map +1 -0
  331. package/dist/web/mount-view.d.ts +3 -2
  332. package/dist/web/mount-view.js +5 -8
  333. package/dist/web/mount-view.js.map +1 -1
  334. package/package.json +32 -26
  335. package/dist/web/bridges/apps-sdk/adaptor.d.ts +0 -28
  336. package/dist/web/bridges/apps-sdk/adaptor.js +0 -113
  337. package/dist/web/bridges/apps-sdk/adaptor.js.map +0 -1
  338. package/dist/web/bridges/mcp-app/adaptor.d.ts +0 -52
  339. package/dist/web/bridges/mcp-app/adaptor.js +0 -280
  340. package/dist/web/bridges/mcp-app/adaptor.js.map +0 -1
  341. package/dist/web/hooks/use-layout.d.ts +0 -24
  342. package/dist/web/hooks/use-layout.js +0 -25
  343. package/dist/web/hooks/use-layout.js.map +0 -1
  344. package/dist/web/hooks/use-layout.test.js +0 -96
  345. package/dist/web/hooks/use-layout.test.js.map +0 -1
  346. package/dist/web/plugin/data-llm.test.js +0 -81
  347. package/dist/web/plugin/data-llm.test.js.map +0 -1
  348. package/dist/web/plugin/plugin.d.ts +0 -33
  349. package/dist/web/plugin/plugin.js +0 -189
  350. package/dist/web/plugin/plugin.js.map +0 -1
  351. package/dist/web/plugin/scan-views.js.map +0 -1
  352. package/dist/web/plugin/scan-views.test.js.map +0 -1
  353. package/dist/web/plugin/transform-data-llm.d.ts +0 -12
  354. package/dist/web/plugin/transform-data-llm.js +0 -96
  355. package/dist/web/plugin/transform-data-llm.js.map +0 -1
  356. package/dist/web/plugin/transform-data-llm.test.js +0 -81
  357. package/dist/web/plugin/transform-data-llm.test.js.map +0 -1
  358. package/dist/web/plugin/validate-view.d.ts +0 -1
  359. package/dist/web/plugin/validate-view.js.map +0 -1
  360. package/dist/web/plugin/validate-view.test.js.map +0 -1
  361. /package/dist/{web/hooks/use-layout.test.d.ts → cli/build-helpers.test.d.ts} +0 -0
  362. /package/dist/{web/plugin/data-llm.test.d.ts → cli/build-steps.test.d.ts} +0 -0
  363. /package/dist/{web/plugin/scan-views.test.d.ts → context-warnings.test.d.ts} +0 -0
  364. /package/dist/{web/plugin/transform-data-llm.test.d.ts → server/app.test.d.ts} +0 -0
  365. /package/dist/{web/plugin/validate-view.test.d.ts → server/auth-extra.test-d.d.ts} +0 -0
  366. /package/dist/{web/plugin → views}/scan-views.d.ts +0 -0
  367. /package/dist/{web/plugin → views}/scan-views.test.js +0 -0
  368. /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,6 +132,46 @@ describe("McpServer.express", () => {
113
132
  expect(await res.json()).toEqual({ from: "useOnError" });
114
133
  });
115
134
  });
135
+ describe("Skybridge JSON body parser options", () => {
136
+ const largeBody = JSON.stringify({ data: "x".repeat(200 * 1024) });
137
+ async function postEcho(port, body) {
138
+ return fetch(`http://localhost:${port}/echo`, {
139
+ method: "POST",
140
+ headers: { "Content-Type": "application/json" },
141
+ body,
142
+ });
143
+ }
144
+ it("forwards json options to express.json", async () => {
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) => {
152
+ res.json({ received: req.body.data.length });
153
+ });
154
+ const { port, server: listening } = await listen(app.express);
155
+ openServer = listening;
156
+ const res = await postEcho(port, largeBody);
157
+ expect(res.status).toBe(200);
158
+ expect(await res.json()).toEqual({ received: 200 * 1024 });
159
+ });
160
+ it("keeps the default 100kb limit when no options are passed", async () => {
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) => {
167
+ res.json({ ok: true });
168
+ });
169
+ const { port, server: listening } = await listen(app.express);
170
+ openServer = listening;
171
+ const res = await postEcho(port, largeBody);
172
+ expect(res.status).toBe(413);
173
+ });
174
+ });
116
175
  describe("createApp", () => {
117
176
  it("runs global custom middleware before the /mcp handler", async () => {
118
177
  const { createApp } = await import("./express.js");
@@ -121,11 +180,15 @@ describe("createApp", () => {
121
180
  calls.push("custom");
122
181
  next();
123
182
  };
124
- const server = new McpServer({ name: "t", version: "0.0.0" });
125
- 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);
126
189
  const httpServer = http.createServer();
127
- const app = await createApp({ mcpServer: server, httpServer });
128
- const { port, server: httpListening } = await listen(app);
190
+ const expressApp = await createApp({ app, httpServer });
191
+ const { port, server: httpListening } = await listen(expressApp);
129
192
  openServer = httpListening;
130
193
  await postMcp(port);
131
194
  expect(calls).toEqual(["custom"]);
@@ -137,11 +200,15 @@ describe("createApp", () => {
137
200
  calls.push("auth");
138
201
  next();
139
202
  };
140
- const server = new McpServer({ name: "t", version: "0.0.0" });
141
- 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);
142
209
  const httpServer = http.createServer();
143
- const app = await createApp({ mcpServer: server, httpServer });
144
- const { port, server: httpListening } = await listen(app);
210
+ const expressApp = await createApp({ app, httpServer });
211
+ const { port, server: httpListening } = await listen(expressApp);
145
212
  openServer = httpListening;
146
213
  await postMcp(port);
147
214
  expect(calls).toEqual(["auth"]);
@@ -153,11 +220,15 @@ describe("createApp", () => {
153
220
  calls.push("reject");
154
221
  res.status(401).json({ error: "Unauthorized" });
155
222
  };
156
- const server = new McpServer({ name: "t", version: "0.0.0" });
157
- 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);
158
229
  const httpServer = http.createServer();
159
- const app = await createApp({ mcpServer: server, httpServer });
160
- const { port, server: httpListening } = await listen(app);
230
+ const expressApp = await createApp({ app, httpServer });
231
+ const { port, server: httpListening } = await listen(expressApp);
161
232
  openServer = httpListening;
162
233
  const res = await postMcp(port);
163
234
  expect(calls).toEqual(["reject"]);
@@ -175,12 +246,16 @@ describe("createApp", () => {
175
246
  calls.push("B");
176
247
  next();
177
248
  };
178
- const server = new McpServer({ name: "t", version: "0.0.0" });
179
- server.use(mwA);
180
- 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);
181
256
  const httpServer = http.createServer();
182
- const app = await createApp({ mcpServer: server, httpServer });
183
- const { port, server: httpListening } = await listen(app);
257
+ const expressApp = await createApp({ app, httpServer });
258
+ const { port, server: httpListening } = await listen(expressApp);
184
259
  openServer = httpListening;
185
260
  await postMcp(port);
186
261
  expect(calls).toEqual(["A", "B"]);
@@ -192,11 +267,15 @@ describe("createApp", () => {
192
267
  calls.push("api");
193
268
  next();
194
269
  };
195
- const server = new McpServer({ name: "t", version: "0.0.0" });
196
- 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);
197
276
  const httpServer = http.createServer();
198
- const app = await createApp({ mcpServer: server, httpServer });
199
- const { port, server: httpListening } = await listen(app);
277
+ const expressApp = await createApp({ app, httpServer });
278
+ const { port, server: httpListening } = await listen(expressApp);
200
279
  openServer = httpListening;
201
280
  // Hit /mcp — the /api middleware should NOT fire
202
281
  await postMcp(port);
@@ -209,11 +288,15 @@ describe("createApp", () => {
209
288
  router.get("/health", (_req, res) => {
210
289
  res.json({ status: "ok" });
211
290
  });
212
- const server = new McpServer({ name: "t", version: "0.0.0" });
213
- 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);
214
297
  const httpServer = http.createServer();
215
- const app = await createApp({ mcpServer: server, httpServer });
216
- const { port, server: httpListening } = await listen(app);
298
+ const expressApp = await createApp({ app, httpServer });
299
+ const { port, server: httpListening } = await listen(expressApp);
217
300
  openServer = httpListening;
218
301
  const res = await fetch(`http://localhost:${port}/health`);
219
302
  expect(res.status).toBe(200);
@@ -226,11 +309,15 @@ describe("createApp", () => {
226
309
  router.get("/data", (_req, res) => {
227
310
  res.json({ value: 42 });
228
311
  });
229
- const server = new McpServer({ name: "t", version: "0.0.0" });
230
- 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);
231
318
  const httpServer = http.createServer();
232
- const app = await createApp({ mcpServer: server, httpServer });
233
- const { port, server: httpListening } = await listen(app);
319
+ const expressApp = await createApp({ app, httpServer });
320
+ const { port, server: httpListening } = await listen(expressApp);
234
321
  openServer = httpListening;
235
322
  const res = await fetch(`http://localhost:${port}/api/data`);
236
323
  expect(res.status).toBe(200);
@@ -241,11 +328,15 @@ describe("createApp", () => {
241
328
  const throwing = () => {
242
329
  throw new Error("boom");
243
330
  };
244
- const server = new McpServer({ name: "t", version: "0.0.0" });
245
- 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);
246
337
  const httpServer = http.createServer();
247
- const app = await createApp({ mcpServer: server, httpServer });
248
- const { port, server: httpListening } = await listen(app);
338
+ const expressApp = await createApp({ app, httpServer });
339
+ const { port, server: httpListening } = await listen(expressApp);
249
340
  openServer = httpListening;
250
341
  const res = await fetch(`http://localhost:${port}/explode`);
251
342
  expect(res.status).toBe(500);
@@ -256,14 +347,19 @@ describe("createApp", () => {
256
347
  it("returns 500 JSON-RPC error when the MCP handler throws and no error middleware is registered", async () => {
257
348
  const { createApp } = await import("./express.js");
258
349
  const consoleSpy = vi.spyOn(console, "error").mockImplementation(() => { });
259
- const mcpServer = new McpServer({ name: "t", version: "0.0.0" });
260
- // Force the express-level error path: make connectStatelessTransport
261
- // reject so the request handler hits its try/catch and calls next(error),
262
- // which lands in the default /mcp error handler.
263
- 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
+ });
264
360
  const httpServer = http.createServer();
265
- const app = await createApp({ mcpServer, httpServer });
266
- const { port, server: httpListening } = await listen(app);
361
+ const expressApp = await createApp({ app, httpServer });
362
+ const { port, server: httpListening } = await listen(expressApp);
267
363
  openServer = httpListening;
268
364
  const res = await postMcp(port);
269
365
  expect(res.status).toBe(500);
@@ -282,15 +378,21 @@ describe("createApp", () => {
282
378
  calls.push("error-handler");
283
379
  res.status(503).json({ custom: true });
284
380
  };
285
- const mcpServer = new McpServer({ name: "t", version: "0.0.0" });
286
- 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
+ });
287
389
  const httpServer = http.createServer();
288
- const app = await createApp({
289
- mcpServer,
390
+ const expressApp = await createApp({
391
+ app,
290
392
  httpServer,
291
393
  errorMiddleware: [{ handlers: [errorHandler] }],
292
394
  });
293
- const { port, server: httpListening } = await listen(app);
395
+ const { port, server: httpListening } = await listen(expressApp);
294
396
  openServer = httpListening;
295
397
  const res = await postMcp(port);
296
398
  expect(calls).toEqual(["error-handler"]);
@@ -307,16 +409,22 @@ describe("createApp", () => {
307
409
  const throwingApiRoute = (_req, _res, next) => {
308
410
  next(new Error("api error"));
309
411
  };
310
- const mcpServer = new McpServer({ name: "t", version: "0.0.0" });
311
- vi.spyOn(mcpServer, "connectStatelessTransport").mockRejectedValue(new Error("boom"));
312
- 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);
313
421
  const httpServer = http.createServer();
314
- const app = await createApp({
315
- mcpServer,
422
+ const expressApp = await createApp({
423
+ app,
316
424
  httpServer,
317
425
  errorMiddleware: [{ path: "/mcp", handlers: [mcpErrorHandler] }],
318
426
  });
319
- const { port, server: httpListening } = await listen(app);
427
+ const { port, server: httpListening } = await listen(expressApp);
320
428
  openServer = httpListening;
321
429
  const mcpRes = await postMcp(port);
322
430
  expect(calls).toEqual(["mcp-error-handler"]);
@@ -330,20 +438,20 @@ describe("createApp", () => {
330
438
  });
331
439
  it("handles concurrent /mcp requests without 'Already connected to a transport'", async () => {
332
440
  const { createApp } = await import("./express.js");
333
- const mcpServer = new McpServer({
334
- name: "concurrent-test",
335
- version: "0.0.0",
336
- });
337
441
  // Slow tool: keeps the underlying transport bound long enough to overlap
338
442
  // with concurrent requests, exposing the shared-McpServer race.
339
- mcpServer.registerTool({ name: "slow", description: "slow" }, async () => {
340
- await new Promise((r) => setTimeout(r, 50));
341
- 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
+ }),
342
450
  });
343
451
  const consoleSpy = vi.spyOn(console, "error").mockImplementation(() => { });
344
452
  const httpServer = http.createServer();
345
- const app = await createApp({ mcpServer, httpServer });
346
- const { port, server } = await listen(app);
453
+ const expressApp = await createApp({ app, httpServer });
454
+ const { port, server } = await listen(expressApp);
347
455
  openServer = server;
348
456
  const callBody = (id) => JSON.stringify({
349
457
  jsonrpc: "2.0",
@@ -365,6 +473,40 @@ describe("createApp", () => {
365
473
  consoleSpy.mockRestore();
366
474
  });
367
475
  });
476
+ describe("createApp Vercel mode", () => {
477
+ it("app.run() returns the Express app without binding a port when VERCEL=1", async () => {
478
+ const prevVercel = process.env.VERCEL;
479
+ const prevEnv = process.env.NODE_ENV;
480
+ process.env.VERCEL = "1";
481
+ process.env.NODE_ENV = "production";
482
+ try {
483
+ vi.resetModules();
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();
491
+ expect(typeof result).toBe("function");
492
+ expect(result).toBe(app.express);
493
+ const { port, server: listening } = await listen(app.express);
494
+ openServer = listening;
495
+ const res = await postMcp(port);
496
+ expect(res.status).not.toBe(404);
497
+ }
498
+ finally {
499
+ if (prevVercel === undefined) {
500
+ delete process.env.VERCEL;
501
+ }
502
+ else {
503
+ process.env.VERCEL = prevVercel;
504
+ }
505
+ process.env.NODE_ENV = prevEnv;
506
+ vi.resetModules();
507
+ }
508
+ });
509
+ });
368
510
  describe("createApp tunnel routes", () => {
369
511
  it("proxies POST /__skybridge/tunnel to the cli control server in dev mode", async () => {
370
512
  // Stand up a fake control listener that returns a known JSON body.
@@ -383,10 +525,14 @@ describe("createApp tunnel routes", () => {
383
525
  process.env.__TUNNEL_CONTROL_PORT = String(controlPort);
384
526
  try {
385
527
  const { createApp } = await import("./express.js");
386
- 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
+ });
387
533
  const httpServer = http.createServer();
388
- const app = await createApp({ mcpServer, httpServer });
389
- const { port, server } = await listen(app);
534
+ const expressApp = await createApp({ app, httpServer });
535
+ const { port, server } = await listen(expressApp);
390
536
  openServer = server;
391
537
  const res = await fetch(`http://localhost:${port}/__skybridge/tunnel`, {
392
538
  method: "POST",
@@ -410,11 +556,15 @@ describe("createApp tunnel routes", () => {
410
556
  try {
411
557
  vi.resetModules();
412
558
  const { createApp } = await import("./express.js");
413
- const { McpServer: ReloadedMcpServer } = await import("./server.js");
414
- 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
+ });
415
565
  const httpServer = http.createServer();
416
- const app = await createApp({ mcpServer, httpServer });
417
- const { port, server } = await listen(app);
566
+ const expressApp = await createApp({ app, httpServer });
567
+ const { port, server } = await listen(expressApp);
418
568
  openServer = server;
419
569
  const res = await fetch(`http://localhost:${port}/__skybridge/tunnel`, {
420
570
  method: "POST",
@@ -427,4 +577,32 @@ describe("createApp tunnel routes", () => {
427
577
  }
428
578
  });
429
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
+ });
430
608
  //# sourceMappingURL=express.test.js.map