skybridge 0.0.0-dev.c2b3cec → 0.0.0-dev.c2c0f98

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 (355) hide show
  1. package/README.md +3 -0
  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/header.d.ts +1 -1
  13. package/dist/cli/resolve-skybridge-config.d.ts +5 -0
  14. package/dist/cli/{resolve-views-dir.js → resolve-skybridge-config.js} +4 -3
  15. package/dist/cli/resolve-skybridge-config.js.map +1 -0
  16. package/dist/cli/run-plain.d.ts +18 -0
  17. package/dist/cli/run-plain.js +89 -0
  18. package/dist/cli/run-plain.js.map +1 -0
  19. package/dist/cli/use-execute-steps.d.ts +1 -1
  20. package/dist/cli/use-nodemon.d.ts +14 -0
  21. package/dist/cli/use-nodemon.js +71 -60
  22. package/dist/cli/use-nodemon.js.map +1 -1
  23. package/dist/cli/use-typescript-check.d.ts +8 -2
  24. package/dist/cli/use-typescript-check.js +70 -67
  25. package/dist/cli/use-typescript-check.js.map +1 -1
  26. package/dist/commands/build.d.ts +0 -2
  27. package/dist/commands/build.js +2 -61
  28. package/dist/commands/build.js.map +1 -1
  29. package/dist/commands/dev.d.ts +1 -0
  30. package/dist/commands/dev.js +35 -3
  31. package/dist/commands/dev.js.map +1 -1
  32. package/dist/commands/start.js +2 -2
  33. package/dist/commands/start.js.map +1 -1
  34. package/dist/context-warnings.d.ts +5 -0
  35. package/dist/context-warnings.js +31 -0
  36. package/dist/context-warnings.js.map +1 -0
  37. package/dist/context-warnings.test.js +28 -0
  38. package/dist/context-warnings.test.js.map +1 -0
  39. package/dist/server/app.d.ts +143 -0
  40. package/dist/server/app.js +229 -0
  41. package/dist/server/app.js.map +1 -0
  42. package/dist/server/auth/discovery.d.ts +33 -0
  43. package/dist/server/auth/discovery.js +56 -0
  44. package/dist/server/auth/discovery.js.map +1 -0
  45. package/dist/server/auth/discovery.test.js +93 -0
  46. package/dist/server/auth/discovery.test.js.map +1 -0
  47. package/dist/server/auth/index.d.ts +30 -0
  48. package/dist/server/auth/index.js +2 -0
  49. package/dist/server/auth/index.js.map +1 -0
  50. package/dist/server/auth/providers/auth0.d.ts +40 -0
  51. package/dist/server/auth/providers/auth0.js +31 -0
  52. package/dist/server/auth/providers/auth0.js.map +1 -0
  53. package/dist/server/auth/providers/auth0.test.js +50 -0
  54. package/dist/server/auth/providers/auth0.test.js.map +1 -0
  55. package/dist/server/auth/providers/authplane.d.ts +49 -0
  56. package/dist/server/auth/providers/authplane.js +57 -0
  57. package/dist/server/auth/providers/authplane.js.map +1 -0
  58. package/dist/server/auth/providers/authplane.test.d.ts +1 -0
  59. package/dist/server/auth/providers/authplane.test.js +140 -0
  60. package/dist/server/auth/providers/authplane.test.js.map +1 -0
  61. package/dist/server/auth/providers/clerk.d.ts +51 -0
  62. package/dist/server/auth/providers/clerk.js +19 -0
  63. package/dist/server/auth/providers/clerk.js.map +1 -0
  64. package/dist/server/auth/providers/clerk.test.d.ts +1 -0
  65. package/dist/server/auth/providers/clerk.test.js +30 -0
  66. package/dist/server/auth/providers/clerk.test.js.map +1 -0
  67. package/dist/server/auth/providers/custom.d.ts +40 -0
  68. package/dist/server/auth/providers/custom.js +56 -0
  69. package/dist/server/auth/providers/custom.js.map +1 -0
  70. package/dist/server/auth/providers/custom.test.d.ts +1 -0
  71. package/dist/server/auth/providers/custom.test.js +158 -0
  72. package/dist/server/auth/providers/custom.test.js.map +1 -0
  73. package/dist/server/auth/providers/descope.d.ts +44 -0
  74. package/dist/server/auth/providers/descope.js +44 -0
  75. package/dist/server/auth/providers/descope.js.map +1 -0
  76. package/dist/server/auth/providers/descope.test.d.ts +1 -0
  77. package/dist/server/auth/providers/descope.test.js +62 -0
  78. package/dist/server/auth/providers/descope.test.js.map +1 -0
  79. package/dist/server/auth/providers/shared.d.ts +2 -0
  80. package/dist/server/auth/providers/shared.js +6 -0
  81. package/dist/server/auth/providers/shared.js.map +1 -0
  82. package/dist/server/auth/providers/shared.test.d.ts +1 -0
  83. package/dist/server/auth/providers/shared.test.js +10 -0
  84. package/dist/server/auth/providers/shared.test.js.map +1 -0
  85. package/dist/server/auth/providers/stytch.d.ts +25 -0
  86. package/dist/server/auth/providers/stytch.js +16 -0
  87. package/dist/server/auth/providers/stytch.js.map +1 -0
  88. package/dist/server/auth/providers/verify-spy.d.ts +12 -0
  89. package/dist/server/auth/providers/verify-spy.js +21 -0
  90. package/dist/server/auth/providers/verify-spy.js.map +1 -0
  91. package/dist/server/auth/providers/workos.d.ts +33 -0
  92. package/dist/server/auth/providers/workos.js +15 -0
  93. package/dist/server/auth/providers/workos.js.map +1 -0
  94. package/dist/server/auth/security-schemes.d.ts +23 -0
  95. package/dist/server/auth/security-schemes.js +64 -0
  96. package/dist/server/auth/security-schemes.js.map +1 -0
  97. package/dist/server/auth/security-schemes.test.d.ts +1 -0
  98. package/dist/server/auth/security-schemes.test.js +99 -0
  99. package/dist/server/auth/security-schemes.test.js.map +1 -0
  100. package/dist/server/auth/setup.d.ts +6 -0
  101. package/dist/server/auth/setup.js +91 -0
  102. package/dist/server/auth/setup.js.map +1 -0
  103. package/dist/server/auth/setup.test.d.ts +1 -0
  104. package/dist/server/auth/setup.test.js +512 -0
  105. package/dist/server/auth/setup.test.js.map +1 -0
  106. package/dist/server/auth/verify.d.ts +46 -0
  107. package/dist/server/auth/verify.js +62 -0
  108. package/dist/server/auth/verify.js.map +1 -0
  109. package/dist/server/auth/verify.test.d.ts +1 -0
  110. package/dist/server/auth/verify.test.js +149 -0
  111. package/dist/server/auth/verify.test.js.map +1 -0
  112. package/dist/server/auth-extra.test-d.js +71 -0
  113. package/dist/server/auth-extra.test-d.js.map +1 -0
  114. package/dist/server/auth.d.ts +42 -5
  115. package/dist/server/auth.js +3 -4
  116. package/dist/server/auth.js.map +1 -1
  117. package/dist/server/build-manifest.test.js +6 -5
  118. package/dist/server/build-manifest.test.js.map +1 -1
  119. package/dist/server/content-helpers.d.ts +1 -1
  120. package/dist/server/content-helpers.js.map +1 -1
  121. package/dist/server/express.d.ts +14 -3
  122. package/dist/server/express.js +20 -32
  123. package/dist/server/express.js.map +1 -1
  124. package/dist/server/express.test.js +130 -102
  125. package/dist/server/express.test.js.map +1 -1
  126. package/dist/server/host.d.ts +2 -0
  127. package/dist/server/host.js +11 -0
  128. package/dist/server/host.js.map +1 -0
  129. package/dist/server/host.test.d.ts +1 -0
  130. package/dist/server/host.test.js +13 -0
  131. package/dist/server/host.test.js.map +1 -0
  132. package/dist/server/index.d.ts +17 -3
  133. package/dist/server/index.js +13 -2
  134. package/dist/server/index.js.map +1 -1
  135. package/dist/server/mcp-errors.test.d.ts +1 -0
  136. package/dist/server/mcp-errors.test.js +37 -0
  137. package/dist/server/mcp-errors.test.js.map +1 -0
  138. package/dist/server/middleware.d.ts +35 -10
  139. package/dist/server/middleware.js +33 -0
  140. package/dist/server/middleware.js.map +1 -1
  141. package/dist/server/middleware.test-d.js +1 -1
  142. package/dist/server/middleware.test-d.js.map +1 -1
  143. package/dist/server/middleware.test.js +190 -131
  144. package/dist/server/middleware.test.js.map +1 -1
  145. package/dist/server/register-tool.test.d.ts +1 -0
  146. package/dist/server/register-tool.test.js +23 -0
  147. package/dist/server/register-tool.test.js.map +1 -0
  148. package/dist/server/requestOrigin.d.ts +7 -0
  149. package/dist/server/requestOrigin.js +25 -0
  150. package/dist/server/requestOrigin.js.map +1 -0
  151. package/dist/server/server.d.ts +167 -114
  152. package/dist/server/server.js +288 -350
  153. package/dist/server/server.js.map +1 -1
  154. package/dist/server/skills-integration.test.d.ts +1 -0
  155. package/dist/server/skills-integration.test.js +79 -0
  156. package/dist/server/skills-integration.test.js.map +1 -0
  157. package/dist/server/skills.d.ts +27 -0
  158. package/dist/server/skills.js +188 -0
  159. package/dist/server/skills.js.map +1 -0
  160. package/dist/server/skills.test.d.ts +1 -0
  161. package/dist/server/skills.test.js +243 -0
  162. package/dist/server/skills.test.js.map +1 -0
  163. package/dist/server/tool-extra.test.d.ts +1 -0
  164. package/dist/server/tool-extra.test.js +72 -0
  165. package/dist/server/tool-extra.test.js.map +1 -0
  166. package/dist/server/view-name.test-d.d.ts +1 -0
  167. package/dist/server/view-name.test-d.js +8 -0
  168. package/dist/server/view-name.test-d.js.map +1 -0
  169. package/dist/server/view-resource-resolution.test.js +101 -17
  170. package/dist/server/view-resource-resolution.test.js.map +1 -1
  171. package/dist/server/viewsDevServer.js +4 -1
  172. package/dist/server/viewsDevServer.js.map +1 -1
  173. package/dist/standard-schema.d.ts +3 -0
  174. package/dist/standard-schema.js +2 -0
  175. package/dist/standard-schema.js.map +1 -0
  176. package/dist/test/utils.d.ts +9 -11
  177. package/dist/test/utils.js +18 -13
  178. package/dist/test/utils.js.map +1 -1
  179. package/dist/test/view.test.js +88 -120
  180. package/dist/test/view.test.js.map +1 -1
  181. package/dist/views/index.d.ts +3 -0
  182. package/dist/views/index.js +3 -0
  183. package/dist/views/index.js.map +1 -0
  184. package/dist/{web/plugin → views}/scan-views.js +1 -1
  185. package/dist/views/scan-views.js.map +1 -0
  186. package/dist/views/scan-views.test.d.ts +1 -0
  187. package/dist/views/scan-views.test.js.map +1 -0
  188. package/dist/views/validate-view.d.ts +1 -0
  189. package/dist/{web/plugin → views}/validate-view.js +2 -2
  190. package/dist/views/validate-view.js.map +1 -0
  191. package/dist/views/validate-view.test.d.ts +1 -0
  192. package/dist/views/validate-view.test.js.map +1 -0
  193. package/dist/web/bridges/adaptor.d.ts +51 -0
  194. package/dist/web/bridges/adaptor.js +327 -0
  195. package/dist/web/bridges/adaptor.js.map +1 -0
  196. package/dist/web/bridges/adaptor.test.d.ts +1 -0
  197. package/dist/web/bridges/adaptor.test.js +225 -0
  198. package/dist/web/bridges/adaptor.test.js.map +1 -0
  199. package/dist/web/bridges/apps-sdk/bridge.d.ts +6 -2
  200. package/dist/web/bridges/apps-sdk/bridge.js +15 -4
  201. package/dist/web/bridges/apps-sdk/bridge.js.map +1 -1
  202. package/dist/web/bridges/apps-sdk/index.d.ts +0 -1
  203. package/dist/web/bridges/apps-sdk/index.js +0 -1
  204. package/dist/web/bridges/apps-sdk/index.js.map +1 -1
  205. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.d.ts +1 -1
  206. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js +1 -1
  207. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js.map +1 -1
  208. package/dist/web/bridges/get-adaptor.d.ts +4 -4
  209. package/dist/web/bridges/get-adaptor.js +6 -11
  210. package/dist/web/bridges/get-adaptor.js.map +1 -1
  211. package/dist/web/bridges/get-adaptor.test.d.ts +1 -0
  212. package/dist/web/bridges/get-adaptor.test.js +32 -0
  213. package/dist/web/bridges/get-adaptor.test.js.map +1 -0
  214. package/dist/web/bridges/mcp-app/bridge.d.ts +13 -2
  215. package/dist/web/bridges/mcp-app/bridge.js +51 -7
  216. package/dist/web/bridges/mcp-app/bridge.js.map +1 -1
  217. package/dist/web/bridges/mcp-app/bridge.test.d.ts +1 -0
  218. package/dist/web/bridges/mcp-app/bridge.test.js +17 -0
  219. package/dist/web/bridges/mcp-app/bridge.test.js.map +1 -0
  220. package/dist/web/bridges/mcp-app/index.d.ts +0 -1
  221. package/dist/web/bridges/mcp-app/index.js +0 -1
  222. package/dist/web/bridges/mcp-app/index.js.map +1 -1
  223. package/dist/web/bridges/mcp-app/types.d.ts +2 -0
  224. package/dist/web/bridges/mcp-app/types.js.map +1 -1
  225. package/dist/web/bridges/mcp-app/use-mcp-app-context.d.ts +1 -1
  226. package/dist/web/bridges/mcp-app/use-mcp-app-context.js +1 -1
  227. package/dist/web/bridges/mcp-app/use-mcp-app-context.js.map +1 -1
  228. package/dist/web/bridges/mcp-app/view-tools.test.js +5 -6
  229. package/dist/web/bridges/mcp-app/view-tools.test.js.map +1 -1
  230. package/dist/web/bridges/types.d.ts +27 -9
  231. package/dist/web/bridges/types.js +14 -1
  232. package/dist/web/bridges/types.js.map +1 -1
  233. package/dist/web/bridges/types.test.d.ts +1 -0
  234. package/dist/web/bridges/types.test.js +19 -0
  235. package/dist/web/bridges/types.test.js.map +1 -0
  236. package/dist/web/components/modal-provider.d.ts +1 -1
  237. package/dist/web/components/modal-provider.js +4 -3
  238. package/dist/web/components/modal-provider.js.map +1 -1
  239. package/dist/web/create-store.test.js +9 -6
  240. package/dist/web/create-store.test.js.map +1 -1
  241. package/dist/web/data-llm.d.ts +1 -1
  242. package/dist/web/data-llm.test.js +19 -6
  243. package/dist/web/data-llm.test.js.map +1 -1
  244. package/dist/web/generate-helpers.d.ts +13 -12
  245. package/dist/web/generate-helpers.js +10 -9
  246. package/dist/web/generate-helpers.js.map +1 -1
  247. package/dist/web/generate-helpers.test-d.js +3 -3
  248. package/dist/web/generate-helpers.test-d.js.map +1 -1
  249. package/dist/web/generate-helpers.test.js +2 -2
  250. package/dist/web/generate-helpers.test.js.map +1 -1
  251. package/dist/web/hooks/index.d.ts +2 -1
  252. package/dist/web/hooks/index.js +2 -1
  253. package/dist/web/hooks/index.js.map +1 -1
  254. package/dist/web/hooks/test/utils.d.ts +2 -1
  255. package/dist/web/hooks/test/utils.js +1 -1
  256. package/dist/web/hooks/test/utils.js.map +1 -1
  257. package/dist/web/hooks/use-call-tool.test.js +39 -25
  258. package/dist/web/hooks/use-call-tool.test.js.map +1 -1
  259. package/dist/web/hooks/use-display-mode.d.ts +1 -1
  260. package/dist/web/hooks/use-display-mode.js +1 -1
  261. package/dist/web/hooks/use-display-mode.js.map +1 -1
  262. package/dist/web/hooks/use-display-mode.test.js +57 -21
  263. package/dist/web/hooks/use-display-mode.test.js.map +1 -1
  264. package/dist/web/hooks/use-download.d.ts +1 -3
  265. package/dist/web/hooks/use-download.js +1 -2
  266. package/dist/web/hooks/use-download.js.map +1 -1
  267. package/dist/web/hooks/use-download.test.js +16 -8
  268. package/dist/web/hooks/use-download.test.js.map +1 -1
  269. package/dist/web/hooks/use-files.test.js +11 -3
  270. package/dist/web/hooks/use-files.test.js.map +1 -1
  271. package/dist/web/hooks/use-host.d.ts +22 -0
  272. package/dist/web/hooks/use-host.js +30 -0
  273. package/dist/web/hooks/use-host.js.map +1 -0
  274. package/dist/web/hooks/use-host.test.d.ts +1 -0
  275. package/dist/web/hooks/use-host.test.js +59 -0
  276. package/dist/web/hooks/use-host.test.js.map +1 -0
  277. package/dist/web/hooks/use-open-external.test.js +14 -4
  278. package/dist/web/hooks/use-open-external.test.js.map +1 -1
  279. package/dist/web/hooks/use-register-view-tool.d.ts +2 -3
  280. package/dist/web/hooks/use-register-view-tool.js.map +1 -1
  281. package/dist/web/hooks/use-request-close.test.js +35 -40
  282. package/dist/web/hooks/use-request-close.test.js.map +1 -1
  283. package/dist/web/hooks/use-request-modal.test.js +11 -1
  284. package/dist/web/hooks/use-request-modal.test.js.map +1 -1
  285. package/dist/web/hooks/use-request-size.d.ts +1 -1
  286. package/dist/web/hooks/use-request-size.js +1 -1
  287. package/dist/web/hooks/use-request-size.js.map +1 -1
  288. package/dist/web/hooks/use-request-size.test.js +35 -53
  289. package/dist/web/hooks/use-request-size.test.js.map +1 -1
  290. package/dist/web/hooks/use-set-open-in-app-url.test.js +29 -9
  291. package/dist/web/hooks/use-set-open-in-app-url.test.js.map +1 -1
  292. package/dist/web/hooks/use-tool-info.d.ts +1 -20
  293. package/dist/web/hooks/use-tool-info.js +0 -1
  294. package/dist/web/hooks/use-tool-info.js.map +1 -1
  295. package/dist/web/hooks/use-tool-info.test-d.js +0 -5
  296. package/dist/web/hooks/use-tool-info.test-d.js.map +1 -1
  297. package/dist/web/hooks/use-tool-info.test.js +37 -32
  298. package/dist/web/hooks/use-tool-info.test.js.map +1 -1
  299. package/dist/web/hooks/use-user.d.ts +3 -2
  300. package/dist/web/hooks/use-user.js +4 -3
  301. package/dist/web/hooks/use-user.js.map +1 -1
  302. package/dist/web/hooks/use-user.test.js +84 -36
  303. package/dist/web/hooks/use-user.test.js.map +1 -1
  304. package/dist/web/hooks/use-view-state.js +19 -9
  305. package/dist/web/hooks/use-view-state.js.map +1 -1
  306. package/dist/web/hooks/use-view-state.test.js +38 -3
  307. package/dist/web/hooks/use-view-state.test.js.map +1 -1
  308. package/dist/web/hooks/use-viewport.d.ts +20 -0
  309. package/dist/web/hooks/use-viewport.js +21 -0
  310. package/dist/web/hooks/use-viewport.js.map +1 -0
  311. package/dist/web/hooks/use-viewport.test.d.ts +1 -0
  312. package/dist/web/hooks/use-viewport.test.js +109 -0
  313. package/dist/web/hooks/use-viewport.test.js.map +1 -0
  314. package/dist/web/index.d.ts +1 -0
  315. package/dist/web/index.js.map +1 -1
  316. package/dist/web/mount-view.d.ts +3 -2
  317. package/dist/web/mount-view.js +3 -2
  318. package/dist/web/mount-view.js.map +1 -1
  319. package/package.json +30 -26
  320. package/dist/cli/resolve-views-dir.d.ts +0 -1
  321. package/dist/cli/resolve-views-dir.js.map +0 -1
  322. package/dist/web/bridges/apps-sdk/adaptor.d.ts +0 -29
  323. package/dist/web/bridges/apps-sdk/adaptor.js +0 -117
  324. package/dist/web/bridges/apps-sdk/adaptor.js.map +0 -1
  325. package/dist/web/bridges/mcp-app/adaptor.d.ts +0 -53
  326. package/dist/web/bridges/mcp-app/adaptor.js +0 -283
  327. package/dist/web/bridges/mcp-app/adaptor.js.map +0 -1
  328. package/dist/web/hooks/use-layout.d.ts +0 -24
  329. package/dist/web/hooks/use-layout.js +0 -25
  330. package/dist/web/hooks/use-layout.js.map +0 -1
  331. package/dist/web/hooks/use-layout.test.js +0 -96
  332. package/dist/web/hooks/use-layout.test.js.map +0 -1
  333. package/dist/web/plugin/data-llm.test.js +0 -81
  334. package/dist/web/plugin/data-llm.test.js.map +0 -1
  335. package/dist/web/plugin/plugin.d.ts +0 -33
  336. package/dist/web/plugin/plugin.js +0 -189
  337. package/dist/web/plugin/plugin.js.map +0 -1
  338. package/dist/web/plugin/scan-views.js.map +0 -1
  339. package/dist/web/plugin/scan-views.test.js.map +0 -1
  340. package/dist/web/plugin/transform-data-llm.d.ts +0 -12
  341. package/dist/web/plugin/transform-data-llm.js +0 -96
  342. package/dist/web/plugin/transform-data-llm.js.map +0 -1
  343. package/dist/web/plugin/transform-data-llm.test.js +0 -81
  344. package/dist/web/plugin/transform-data-llm.test.js.map +0 -1
  345. package/dist/web/plugin/validate-view.d.ts +0 -1
  346. package/dist/web/plugin/validate-view.js.map +0 -1
  347. package/dist/web/plugin/validate-view.test.js.map +0 -1
  348. /package/dist/{web/hooks/use-layout.test.d.ts → cli/build-steps.test.d.ts} +0 -0
  349. /package/dist/{web/plugin/data-llm.test.d.ts → context-warnings.test.d.ts} +0 -0
  350. /package/dist/{web/plugin/transform-data-llm.test.d.ts → server/auth/discovery.test.d.ts} +0 -0
  351. /package/dist/{web/plugin/validate-view.test.d.ts → server/auth/providers/auth0.test.d.ts} +0 -0
  352. /package/dist/{web/plugin/scan-views.test.d.ts → server/auth-extra.test-d.d.ts} +0 -0
  353. /package/dist/{web/plugin → views}/scan-views.d.ts +0 -0
  354. /package/dist/{web/plugin → views}/scan-views.test.js +0 -0
  355. /package/dist/{web/plugin → views}/validate-view.test.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.test-d.js","sourceRoot":"","sources":["../../src/server/middleware.test-d.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n CallToolResult,\n ListToolsResult,\n ServerResult,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { expectTypeOf, test } from \"vitest\";\nimport type {\n McpExtra,\n McpResultFor,\n McpTypedMiddlewareFn,\n} from \"./middleware.js\";\nimport type { McpServer } from \"./server.js\";\n\nconst server = null as unknown as McpServer;\n\ntest(\"request category narrows extra and next() result\", () => {\n server.mcpMiddleware(\"request\", async (_request, extra, next) => {\n expectTypeOf(extra).toEqualTypeOf<McpExtra>();\n extra.signal;\n const result = await next();\n expectTypeOf(result).toEqualTypeOf<ServerResult>();\n return result;\n });\n});\n\ntest(\"notification category narrows extra and next() result\", () => {\n server.mcpMiddleware(\"notification\", async (_request, extra, next) => {\n expectTypeOf(extra).toEqualTypeOf<undefined>();\n // @ts-expect-error extra is undefined, cannot access .signal\n extra.signal;\n const result = await next();\n expectTypeOf(result).toEqualTypeOf<undefined>();\n });\n});\n\ntest(\"exact method tools/call narrows params, extra, and next() result\", () => {\n server.mcpMiddleware(\"tools/call\", async (request, extra, next) => {\n expectTypeOf(request.params.name).toBeString();\n expectTypeOf(extra).toEqualTypeOf<McpExtra>();\n const result = await next();\n expectTypeOf(result).toEqualTypeOf<CallToolResult>();\n return result;\n });\n});\n\ntest(\"exact method tools/list narrows next() to ListToolsResult\", () => {\n server.mcpMiddleware(\"tools/list\", async (_request, _extra, next) => {\n const result = await next();\n expectTypeOf(result).toEqualTypeOf<ListToolsResult>();\n return result;\n });\n});\n\ntest(\"exact notification method narrows extra and next() result\", () => {\n server.mcpMiddleware(\n \"notifications/initialized\",\n async (_request, extra, next) => {\n expectTypeOf(extra).toEqualTypeOf<undefined>();\n // @ts-expect-error extra is undefined\n extra.signal;\n const result = await next();\n expectTypeOf(result).toEqualTypeOf<undefined>();\n },\n );\n});\n\ntest(\"McpTypedMiddlewareFn narrows params, extra, and next() per method\", () => {\n expectTypeOf<\n Parameters<McpTypedMiddlewareFn<\"tools/call\">>[0][\"params\"][\"name\"]\n >().toBeString();\n expectTypeOf<\n Parameters<McpTypedMiddlewareFn<\"tools/call\">>[1]\n >().toEqualTypeOf<McpExtra>();\n expectTypeOf<\n Parameters<McpTypedMiddlewareFn<\"notifications/initialized\">>[1]\n >().toEqualTypeOf<undefined>();\n expectTypeOf<\n ReturnType<Parameters<McpTypedMiddlewareFn<\"tools/list\">>[2]>\n >().toEqualTypeOf<Promise<ListToolsResult>>();\n expectTypeOf<\n ReturnType<Parameters<McpTypedMiddlewareFn<\"notifications/initialized\">>[2]>\n >().toEqualTypeOf<Promise<undefined>>();\n});\n\ntest(\"McpResultFor maps methods to correct result types\", () => {\n expectTypeOf<McpResultFor<\"tools/list\">>().toEqualTypeOf<ListToolsResult>();\n expectTypeOf<McpResultFor<\"tools/call\">>().toEqualTypeOf<CallToolResult>();\n expectTypeOf<\n McpResultFor<\"notifications/initialized\">\n >().toEqualTypeOf<undefined>();\n});\n\ntest(\"wildcard tools/* narrows next() to union of tools result types\", () => {\n server.mcpMiddleware(\"tools/*\", async (_request, _extra, next) => {\n const result = await next();\n expectTypeOf(result).toEqualTypeOf<ListToolsResult | CallToolResult>();\n return result;\n });\n});\n\ntest(\"McpResultFor resolves wildcards to union of matching result types\", () => {\n expectTypeOf<McpResultFor<\"tools/*\">>().toEqualTypeOf<\n ListToolsResult | CallToolResult\n >();\n});\n\ntest(\"catch-all middleware has no narrowing on extra or params\", () => {\n server.mcpMiddleware((_request, extra, next) => {\n expectTypeOf(extra).toEqualTypeOf<McpExtra | undefined>();\n expectTypeOf(_request.params).toEqualTypeOf<Record<string, unknown>>();\n return next();\n });\n});\n"]}
1
+ {"version":3,"file":"middleware.test-d.js","sourceRoot":"","sources":["../../src/server/middleware.test-d.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n CallToolResult,\n ListToolsResult,\n ServerResult,\n} from \"@modelcontextprotocol/server\";\nimport { expectTypeOf, test } from \"vitest\";\nimport type {\n McpExtra,\n McpResultFor,\n McpTypedMiddlewareFn,\n} from \"./middleware.js\";\nimport type { McpServer } from \"./server.js\";\n\nconst server = null as unknown as McpServer;\n\ntest(\"request category narrows extra and next() result\", () => {\n server.mcpMiddleware(\"request\", async (_request, extra, next) => {\n expectTypeOf(extra).toEqualTypeOf<McpExtra>();\n extra.mcpReq.signal;\n const result = await next();\n expectTypeOf(result).toEqualTypeOf<ServerResult>();\n return result;\n });\n});\n\ntest(\"notification category narrows extra and next() result\", () => {\n server.mcpMiddleware(\"notification\", async (_request, extra, next) => {\n expectTypeOf(extra).toEqualTypeOf<undefined>();\n // @ts-expect-error extra is undefined, cannot access .signal\n extra.signal;\n const result = await next();\n expectTypeOf(result).toEqualTypeOf<undefined>();\n });\n});\n\ntest(\"exact method tools/call narrows params, extra, and next() result\", () => {\n server.mcpMiddleware(\"tools/call\", async (request, extra, next) => {\n expectTypeOf(request.params.name).toBeString();\n expectTypeOf(extra).toEqualTypeOf<McpExtra>();\n const result = await next();\n expectTypeOf(result).toEqualTypeOf<CallToolResult>();\n return result;\n });\n});\n\ntest(\"exact method tools/list narrows next() to ListToolsResult\", () => {\n server.mcpMiddleware(\"tools/list\", async (_request, _extra, next) => {\n const result = await next();\n expectTypeOf(result).toEqualTypeOf<ListToolsResult>();\n return result;\n });\n});\n\ntest(\"exact notification method narrows extra and next() result\", () => {\n server.mcpMiddleware(\n \"notifications/initialized\",\n async (_request, extra, next) => {\n expectTypeOf(extra).toEqualTypeOf<undefined>();\n // @ts-expect-error extra is undefined\n extra.signal;\n const result = await next();\n expectTypeOf(result).toEqualTypeOf<undefined>();\n },\n );\n});\n\ntest(\"McpTypedMiddlewareFn narrows params, extra, and next() per method\", () => {\n expectTypeOf<\n Parameters<McpTypedMiddlewareFn<\"tools/call\">>[0][\"params\"][\"name\"]\n >().toBeString();\n expectTypeOf<\n Parameters<McpTypedMiddlewareFn<\"tools/call\">>[1]\n >().toEqualTypeOf<McpExtra>();\n expectTypeOf<\n Parameters<McpTypedMiddlewareFn<\"notifications/initialized\">>[1]\n >().toEqualTypeOf<undefined>();\n expectTypeOf<\n ReturnType<Parameters<McpTypedMiddlewareFn<\"tools/list\">>[2]>\n >().toEqualTypeOf<Promise<ListToolsResult>>();\n expectTypeOf<\n ReturnType<Parameters<McpTypedMiddlewareFn<\"notifications/initialized\">>[2]>\n >().toEqualTypeOf<Promise<undefined>>();\n});\n\ntest(\"McpResultFor maps methods to correct result types\", () => {\n expectTypeOf<McpResultFor<\"tools/list\">>().toEqualTypeOf<ListToolsResult>();\n expectTypeOf<McpResultFor<\"tools/call\">>().toEqualTypeOf<CallToolResult>();\n expectTypeOf<\n McpResultFor<\"notifications/initialized\">\n >().toEqualTypeOf<undefined>();\n});\n\ntest(\"wildcard tools/* narrows next() to union of tools result types\", () => {\n server.mcpMiddleware(\"tools/*\", async (_request, _extra, next) => {\n const result = await next();\n expectTypeOf(result).toEqualTypeOf<ListToolsResult | CallToolResult>();\n return result;\n });\n});\n\ntest(\"McpResultFor resolves wildcards to union of matching result types\", () => {\n expectTypeOf<McpResultFor<\"tools/*\">>().toEqualTypeOf<\n ListToolsResult | CallToolResult\n >();\n});\n\ntest(\"catch-all middleware has no narrowing on extra or params\", () => {\n server.mcpMiddleware((_request, extra, next) => {\n expectTypeOf(extra).toEqualTypeOf<McpExtra | undefined>();\n expectTypeOf(_request.params).toEqualTypeOf<Record<string, unknown>>();\n return next();\n });\n});\n"]}
@@ -1,9 +1,8 @@
1
- import { Client } from "@modelcontextprotocol/sdk/client/index.js";
2
- import { InMemoryTransport } from "@modelcontextprotocol/sdk/inMemory.js";
1
+ import { Client, InMemoryTransport } from "@modelcontextprotocol/client";
3
2
  import { describe, expect, it, vi } from "vitest";
4
3
  import { z } from "zod";
5
- import { buildMiddlewareChain, getHandlerMaps, matchesFilter, } from "./middleware.js";
6
- import { McpServer } from "./server.js";
4
+ import { Skybridge } from "./app.js";
5
+ import { buildMiddlewareChain, getHandlerMaps, getToolError, matchesFilter, } from "./middleware.js";
7
6
  // ---------------------------------------------------------------------------
8
7
  // matchesFilter
9
8
  // ---------------------------------------------------------------------------
@@ -208,29 +207,34 @@ describe("McpServer.mcpMiddleware()", () => {
208
207
  return new Client({ name: "test-client", version: "1.0.0" });
209
208
  }
210
209
  it("returns this for chaining", () => {
211
- const server = new McpServer({ name: "test", version: "1.0.0" });
212
- const result = server.mcpMiddleware(async (_req, _extra, next) => next());
213
- expect(result).toBe(server);
210
+ new Skybridge({ name: "test", version: "1.0.0" }, (server) => {
211
+ const result = server.mcpMiddleware(async (_req, _extra, next) => next());
212
+ expect(result).toBe(server);
213
+ return server;
214
+ });
214
215
  });
215
216
  it("intercepts tools/call and exposes request params", async () => {
216
217
  let capturedMethod = "";
217
218
  let capturedParams = {};
218
- const server = new McpServer({ name: "test", version: "1.0.0" });
219
- server.registerTool({
220
- name: "greet",
221
- description: "greet",
222
- inputSchema: { name: z.string() },
223
- }, (args) => ({
224
- content: [{ type: "text", text: `hi ${args.name}` }],
225
- }));
226
- server.mcpMiddleware("tools/call", async (request, _extra, next) => {
227
- capturedMethod = request.method;
228
- capturedParams = request.params;
229
- return next();
219
+ const app = new Skybridge({ name: "test", version: "1.0.0" }, (server) => {
220
+ server.registerTool({
221
+ name: "greet",
222
+ description: "greet",
223
+ inputSchema: { name: z.string() },
224
+ }, (args) => ({
225
+ content: [{ type: "text", text: `hi ${args.name}` }],
226
+ }));
227
+ server.mcpMiddleware("tools/call", async (request, _extra, next) => {
228
+ capturedMethod = request.method;
229
+ capturedParams = request.params;
230
+ return next();
231
+ });
232
+ return server;
230
233
  });
231
234
  const client = createClient();
232
235
  const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
233
- await server.connect(serverTransport);
236
+ const instance = app.createServerInstance();
237
+ await instance.connect(serverTransport);
234
238
  await client.connect(clientTransport);
235
239
  const result = await client.callTool({
236
240
  name: "greet",
@@ -243,59 +247,57 @@ describe("McpServer.mcpMiddleware()", () => {
243
247
  });
244
248
  expect(result.content).toEqual([{ type: "text", text: "hi World" }]);
245
249
  await client.close();
246
- await server.close();
250
+ await instance.close();
247
251
  });
248
252
  it("array filter works", async () => {
249
253
  const matchedMethods = [];
250
- const server = new McpServer({ name: "test", version: "1.0.0" });
251
- server.registerTool({ name: "t1", description: "t1" }, () => ({
252
- content: [{ type: "text", text: "ok" }],
253
- }));
254
- server.mcpMiddleware(["tools/call", "tools/list"], async (request, _extra, next) => {
255
- matchedMethods.push(request.method);
256
- return next();
254
+ const app = new Skybridge({ name: "test", version: "1.0.0" }, (server) => {
255
+ server.registerTool({ name: "t1", description: "t1" }, () => ({
256
+ content: [{ type: "text", text: "ok" }],
257
+ }));
258
+ server.mcpMiddleware(["tools/call", "tools/list"], async (request, _extra, next) => {
259
+ matchedMethods.push(request.method);
260
+ return next();
261
+ });
262
+ return server;
257
263
  });
258
264
  const client = createClient();
259
265
  const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
260
- await server.connect(serverTransport);
266
+ const instance = app.createServerInstance();
267
+ await instance.connect(serverTransport);
261
268
  await client.connect(clientTransport);
262
269
  await client.listTools();
263
270
  await client.callTool({ name: "t1" });
264
271
  expect(matchedMethods).toEqual(["tools/list", "tools/call"]);
265
272
  await client.close();
266
- await server.close();
267
- });
268
- it("throws if registered after connect()", async () => {
269
- const server = new McpServer({ name: "test", version: "1.0.0" });
270
- const [_clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
271
- await server.connect(serverTransport);
272
- expect(() => server.mcpMiddleware(async (_req, _extra, next) => next())).toThrow("Cannot register MCP middleware after run() or connect()");
273
- await server.close();
273
+ await instance.close();
274
274
  });
275
275
  it("throws when filter provided without handler", () => {
276
- const server = new McpServer({ name: "test", version: "1.0.0" });
277
- expect(() =>
276
+ expect(() => new Skybridge({ name: "test", version: "1.0.0" }, (server) =>
278
277
  // @ts-expect-error intentionally passing filter without handler
279
- server.mcpMiddleware("tools/call")).toThrow("mcpMiddleware requires a handler function");
278
+ server.mcpMiddleware("tools/call"))).toThrow("mcpMiddleware requires a handler function");
280
279
  });
281
280
  it("catch-all middleware + filtered middleware stack correctly", async () => {
282
281
  const calls = [];
283
- const server = new McpServer({ name: "test", version: "1.0.0" });
284
- server.registerTool({ name: "t1", description: "t1" }, () => ({
285
- content: [{ type: "text", text: "ok" }],
286
- }));
287
- server
288
- .mcpMiddleware(async (request, _extra, next) => {
289
- calls.push(`global:${request.method}`);
290
- return next();
291
- })
292
- .mcpMiddleware("tools/call", async (_req, _extra, next) => {
293
- calls.push("tools-only");
294
- return next();
282
+ const app = new Skybridge({ name: "test", version: "1.0.0" }, (server) => {
283
+ server.registerTool({ name: "t1", description: "t1" }, () => ({
284
+ content: [{ type: "text", text: "ok" }],
285
+ }));
286
+ server
287
+ .mcpMiddleware(async (request, _extra, next) => {
288
+ calls.push(`global:${request.method}`);
289
+ return next();
290
+ })
291
+ .mcpMiddleware("tools/call", async (_req, _extra, next) => {
292
+ calls.push("tools-only");
293
+ return next();
294
+ });
295
+ return server;
295
296
  });
296
297
  const client = createClient();
297
298
  const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
298
- await server.connect(serverTransport);
299
+ const instance = app.createServerInstance();
300
+ await instance.connect(serverTransport);
299
301
  await client.connect(clientTransport);
300
302
  await client.listTools();
301
303
  await client.callTool({ name: "t1" });
@@ -309,41 +311,47 @@ describe("McpServer.mcpMiddleware()", () => {
309
311
  const toolsCallIdx = calls.indexOf("global:tools/call");
310
312
  expect(calls[toolsCallIdx + 1]).toBe("tools-only");
311
313
  await client.close();
312
- await server.close();
314
+ await instance.close();
313
315
  });
314
316
  it("notification middleware receives extra as undefined", async () => {
315
317
  let capturedExtra = "sentinel";
316
- const server = new McpServer({ name: "test", version: "1.0.0" });
317
- server.registerTool({ name: "t1", description: "t1" }, () => ({
318
- content: [{ type: "text", text: "ok" }],
319
- }));
320
- server.mcpMiddleware("notification", async (_request, extra, next) => {
321
- capturedExtra = extra;
322
- return next();
318
+ const app = new Skybridge({ name: "test", version: "1.0.0" }, (server) => {
319
+ server.registerTool({ name: "t1", description: "t1" }, () => ({
320
+ content: [{ type: "text", text: "ok" }],
321
+ }));
322
+ server.mcpMiddleware("notification", async (_request, extra, next) => {
323
+ capturedExtra = extra;
324
+ return next();
325
+ });
326
+ return server;
323
327
  });
324
328
  const client = createClient();
325
329
  const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
326
- await server.connect(serverTransport);
330
+ const instance = app.createServerInstance();
331
+ await instance.connect(serverTransport);
327
332
  await client.connect(clientTransport);
328
333
  // The client sends notifications/initialized automatically on connect.
329
334
  await client.listTools();
330
335
  expect(capturedExtra).toBeUndefined();
331
336
  await client.close();
332
- await server.close();
337
+ await instance.close();
333
338
  });
334
339
  it("wildcard filter intercepts matching methods only", async () => {
335
340
  const matchedMethods = [];
336
- const server = new McpServer({ name: "test", version: "1.0.0" });
337
- server.registerTool({ name: "t1", description: "t1" }, () => ({
338
- content: [{ type: "text", text: "ok" }],
339
- }));
340
- server.mcpMiddleware("tools/*", async (request, _extra, next) => {
341
- matchedMethods.push(request.method);
342
- return next();
341
+ const app = new Skybridge({ name: "test", version: "1.0.0" }, (server) => {
342
+ server.registerTool({ name: "t1", description: "t1" }, () => ({
343
+ content: [{ type: "text", text: "ok" }],
344
+ }));
345
+ server.mcpMiddleware("tools/*", async (request, _extra, next) => {
346
+ matchedMethods.push(request.method);
347
+ return next();
348
+ });
349
+ return server;
343
350
  });
344
351
  const client = createClient();
345
352
  const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
346
- await server.connect(serverTransport);
353
+ const instance = app.createServerInstance();
354
+ await instance.connect(serverTransport);
347
355
  await client.connect(clientTransport);
348
356
  await client.listTools();
349
357
  await client.callTool({ name: "t1" });
@@ -353,30 +361,33 @@ describe("McpServer.mcpMiddleware()", () => {
353
361
  expect(matchedMethods).not.toContain("initialize");
354
362
  expect(matchedMethods).not.toContain("notifications/initialized");
355
363
  await client.close();
356
- await server.close();
357
- });
358
- it("middleware can modify tool result via McpServer integration", async () => {
359
- const server = new McpServer({ name: "test", version: "1.0.0" });
360
- server.registerTool({
361
- name: "greet",
362
- description: "greet",
363
- inputSchema: { name: z.string() },
364
- }, (args) => ({
365
- content: [{ type: "text", text: `hi ${args.name}` }],
366
- }));
367
- server.mcpMiddleware("tools/call", async (_req, _extra, next) => {
368
- const result = (await next());
369
- return {
370
- ...result,
371
- content: [
372
- ...result.content,
373
- { type: "text", text: " (modified)" },
374
- ],
375
- };
364
+ await instance.close();
365
+ });
366
+ it("middleware can modify tool result via Skybridge integration", async () => {
367
+ const app = new Skybridge({ name: "test", version: "1.0.0" }, (server) => {
368
+ server.registerTool({
369
+ name: "greet",
370
+ description: "greet",
371
+ inputSchema: { name: z.string() },
372
+ }, (args) => ({
373
+ content: [{ type: "text", text: `hi ${args.name}` }],
374
+ }));
375
+ server.mcpMiddleware("tools/call", async (_req, _extra, next) => {
376
+ const result = (await next());
377
+ return {
378
+ ...result,
379
+ content: [
380
+ ...result.content,
381
+ { type: "text", text: " (modified)" },
382
+ ],
383
+ };
384
+ });
385
+ return server;
376
386
  });
377
387
  const client = createClient();
378
388
  const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
379
- await server.connect(serverTransport);
389
+ const instance = app.createServerInstance();
390
+ await instance.connect(serverTransport);
380
391
  await client.connect(clientTransport);
381
392
  const result = await client.callTool({
382
393
  name: "greet",
@@ -387,50 +398,95 @@ describe("McpServer.mcpMiddleware()", () => {
387
398
  { type: "text", text: " (modified)" },
388
399
  ]);
389
400
  await client.close();
390
- await server.close();
401
+ await instance.close();
391
402
  });
392
- it("middleware can short-circuit via McpServer integration", async () => {
403
+ it("middleware can short-circuit via Skybridge integration", async () => {
393
404
  const handlerCalled = vi.fn();
394
- const server = new McpServer({ name: "test", version: "1.0.0" });
395
- server.registerTool({ name: "t1", description: "t1" }, () => {
396
- handlerCalled();
397
- return {
398
- content: [{ type: "text", text: "original" }],
399
- };
405
+ const app = new Skybridge({ name: "test", version: "1.0.0" }, (server) => {
406
+ server.registerTool({ name: "t1", description: "t1" }, () => {
407
+ handlerCalled();
408
+ return {
409
+ content: [{ type: "text", text: "original" }],
410
+ };
411
+ });
412
+ server.mcpMiddleware("tools/call", async () => ({
413
+ content: [{ type: "text", text: "short-circuited" }],
414
+ }));
415
+ return server;
400
416
  });
401
- server.mcpMiddleware("tools/call", async () => ({
402
- content: [{ type: "text", text: "short-circuited" }],
403
- }));
404
417
  const client = createClient();
405
418
  const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
406
- await server.connect(serverTransport);
419
+ const instance = app.createServerInstance();
420
+ await instance.connect(serverTransport);
407
421
  await client.connect(clientTransport);
408
422
  const result = await client.callTool({ name: "t1" });
409
423
  expect(result.content).toEqual([{ type: "text", text: "short-circuited" }]);
410
424
  expect(handlerCalled).not.toHaveBeenCalled();
411
425
  await client.close();
412
- await server.close();
426
+ await instance.close();
427
+ });
428
+ it("exposes a thrown tool error to middleware via getToolError", async () => {
429
+ const schemaError = new Error("boom with schema");
430
+ const schemalessError = new Error("boom without schema");
431
+ let captured;
432
+ const app = new Skybridge({ name: "test", version: "1.0.0" }, (server) => {
433
+ server.registerTool({
434
+ name: "withSchema",
435
+ description: "withSchema",
436
+ inputSchema: { name: z.string() },
437
+ }, () => {
438
+ throw schemaError;
439
+ });
440
+ server.registerTool({ name: "withoutSchema", description: "withoutSchema" }, () => {
441
+ throw schemalessError;
442
+ });
443
+ server.mcpMiddleware("tools/call", async (_request, extra, next) => {
444
+ const result = await next();
445
+ captured = getToolError(extra);
446
+ return result;
447
+ });
448
+ return server;
449
+ });
450
+ const client = createClient();
451
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
452
+ const instance = app.createServerInstance();
453
+ await instance.connect(serverTransport);
454
+ await client.connect(clientTransport);
455
+ const withSchema = await client.callTool({
456
+ name: "withSchema",
457
+ arguments: { name: "World" },
458
+ });
459
+ expect(withSchema.isError).toBe(true);
460
+ expect(captured).toBe(schemaError);
461
+ const withoutSchema = await client.callTool({ name: "withoutSchema" });
462
+ expect(withoutSchema.isError).toBe(true);
463
+ expect(captured).toBe(schemalessError);
464
+ await client.close();
465
+ await instance.close();
413
466
  });
414
- it("middleware can mutate tool call params via McpServer integration", async () => {
467
+ it("middleware can mutate tool call params via Skybridge integration", async () => {
415
468
  let receivedName = "";
416
- const server = new McpServer({ name: "test", version: "1.0.0" });
417
- server.registerTool({
418
- name: "greet",
419
- description: "greet",
420
- inputSchema: { name: z.string() },
421
- }, (args) => {
422
- receivedName = args.name;
423
- return {
424
- content: [{ type: "text", text: `hi ${args.name}` }],
425
- };
426
- });
427
- server.mcpMiddleware("tools/call", async (request, _extra, next) => {
428
- request.params.arguments = { name: "Overridden" };
429
- return next();
469
+ const app = new Skybridge({ name: "test", version: "1.0.0" }, (server) => {
470
+ server.registerTool({
471
+ name: "greet",
472
+ description: "greet",
473
+ inputSchema: { name: z.string() },
474
+ }, (args) => {
475
+ receivedName = args.name;
476
+ return {
477
+ content: [{ type: "text", text: `hi ${args.name}` }],
478
+ };
479
+ });
480
+ server.mcpMiddleware("tools/call", async (request, _extra, next) => {
481
+ request.params.arguments = { name: "Overridden" };
482
+ return next();
483
+ });
484
+ return server;
430
485
  });
431
486
  const client = createClient();
432
487
  const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
433
- await server.connect(serverTransport);
488
+ const instance = app.createServerInstance();
489
+ await instance.connect(serverTransport);
434
490
  await client.connect(clientTransport);
435
491
  await client.callTool({
436
492
  name: "greet",
@@ -438,21 +494,24 @@ describe("McpServer.mcpMiddleware()", () => {
438
494
  });
439
495
  expect(receivedName).toBe("Overridden");
440
496
  await client.close();
441
- await server.close();
497
+ await instance.close();
442
498
  });
443
499
  it("category 'request' filter matches requests but not notifications", async () => {
444
500
  const matchedMethods = [];
445
- const server = new McpServer({ name: "test", version: "1.0.0" });
446
- server.registerTool({ name: "t1", description: "t1" }, () => ({
447
- content: [{ type: "text", text: "ok" }],
448
- }));
449
- server.mcpMiddleware("request", async (request, _extra, next) => {
450
- matchedMethods.push(request.method);
451
- return next();
501
+ const app = new Skybridge({ name: "test", version: "1.0.0" }, (server) => {
502
+ server.registerTool({ name: "t1", description: "t1" }, () => ({
503
+ content: [{ type: "text", text: "ok" }],
504
+ }));
505
+ server.mcpMiddleware("request", async (request, _extra, next) => {
506
+ matchedMethods.push(request.method);
507
+ return next();
508
+ });
509
+ return server;
452
510
  });
453
511
  const client = createClient();
454
512
  const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
455
- await server.connect(serverTransport);
513
+ const instance = app.createServerInstance();
514
+ await instance.connect(serverTransport);
456
515
  await client.connect(clientTransport);
457
516
  await client.listTools();
458
517
  await client.callTool({ name: "t1" });
@@ -460,7 +519,7 @@ describe("McpServer.mcpMiddleware()", () => {
460
519
  expect(matchedMethods).toContain("tools/call");
461
520
  expect(matchedMethods).not.toContain("notifications/initialized");
462
521
  await client.close();
463
- await server.close();
522
+ await instance.close();
464
523
  });
465
524
  });
466
525
  // ---------------------------------------------------------------------------