skybridge 0.0.0-dev.81fd90a → 0.0.0-dev.8226541

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 (269) hide show
  1. package/README.md +14 -14
  2. package/dist/cli/build-helpers.d.ts +1 -1
  3. package/dist/cli/build-helpers.js +4 -4
  4. package/dist/cli/build-helpers.js.map +1 -1
  5. package/dist/cli/build-helpers.test.js +2 -2
  6. package/dist/cli/build-helpers.test.js.map +1 -1
  7. package/dist/cli/build-steps.js +1 -1
  8. package/dist/cli/build-steps.js.map +1 -1
  9. package/dist/cli/build-steps.test.js +3 -3
  10. package/dist/cli/build-steps.test.js.map +1 -1
  11. package/dist/cli/detect-port.js +0 -1
  12. package/dist/cli/detect-port.js.map +1 -1
  13. package/dist/cli/run-plain.js +2 -1
  14. package/dist/cli/run-plain.js.map +1 -1
  15. package/dist/cli/telemetry.js +2 -0
  16. package/dist/cli/telemetry.js.map +1 -1
  17. package/dist/cli/use-nodemon.d.ts +11 -1
  18. package/dist/cli/use-nodemon.js +30 -8
  19. package/dist/cli/use-nodemon.js.map +1 -1
  20. package/dist/cli/use-typescript-check.js +1 -1
  21. package/dist/cli/use-typescript-check.js.map +1 -1
  22. package/dist/commands/dev.js +4 -4
  23. package/dist/commands/dev.js.map +1 -1
  24. package/dist/commands/start.js +2 -2
  25. package/dist/commands/start.js.map +1 -1
  26. package/dist/server/app.d.ts +194 -0
  27. package/dist/server/app.js +266 -0
  28. package/dist/server/app.js.map +1 -0
  29. package/dist/server/app.test.js +97 -0
  30. package/dist/server/app.test.js.map +1 -0
  31. package/dist/server/auth/discovery.d.ts +1 -1
  32. package/dist/server/auth/discovery.js +1 -1
  33. package/dist/server/auth/discovery.js.map +1 -1
  34. package/dist/server/auth/index.d.ts +19 -1
  35. package/dist/server/auth/index.js.map +1 -1
  36. package/dist/server/auth/providers/auth0.d.ts +2 -2
  37. package/dist/server/auth/providers/auth0.js +13 -8
  38. package/dist/server/auth/providers/auth0.js.map +1 -1
  39. package/dist/server/auth/providers/auth0.test.js +1 -1
  40. package/dist/server/auth/providers/auth0.test.js.map +1 -1
  41. package/dist/server/auth/providers/authplane.d.ts +2 -2
  42. package/dist/server/auth/providers/authplane.js.map +1 -1
  43. package/dist/server/auth/providers/authplane.test.js +10 -7
  44. package/dist/server/auth/providers/authplane.test.js.map +1 -1
  45. package/dist/server/auth/providers/clerk.d.ts +2 -2
  46. package/dist/server/auth/providers/clerk.js.map +1 -1
  47. package/dist/server/auth/providers/clerk.test.js +1 -1
  48. package/dist/server/auth/providers/clerk.test.js.map +1 -1
  49. package/dist/server/auth/providers/custom.d.ts +7 -5
  50. package/dist/server/auth/providers/custom.js +5 -2
  51. package/dist/server/auth/providers/custom.js.map +1 -1
  52. package/dist/server/auth/providers/custom.test.js +13 -10
  53. package/dist/server/auth/providers/custom.test.js.map +1 -1
  54. package/dist/server/auth/providers/descope.d.ts +2 -2
  55. package/dist/server/auth/providers/descope.js.map +1 -1
  56. package/dist/server/auth/providers/descope.test.js +3 -3
  57. package/dist/server/auth/providers/descope.test.js.map +1 -1
  58. package/dist/server/auth/providers/stytch.d.ts +2 -2
  59. package/dist/server/auth/providers/stytch.js.map +1 -1
  60. package/dist/server/auth/providers/workos.d.ts +5 -4
  61. package/dist/server/auth/providers/workos.js +2 -1
  62. package/dist/server/auth/providers/workos.js.map +1 -1
  63. package/dist/server/auth/setup.d.ts +1 -1
  64. package/dist/server/auth/setup.js.map +1 -1
  65. package/dist/server/auth/setup.test.js +74 -58
  66. package/dist/server/auth/setup.test.js.map +1 -1
  67. package/dist/server/auth/verify.d.ts +5 -3
  68. package/dist/server/auth/verify.js.map +1 -1
  69. package/dist/server/auth/verify.test.js +16 -0
  70. package/dist/server/auth/verify.test.js.map +1 -1
  71. package/dist/server/auth-extra.test-d.js +93 -34
  72. package/dist/server/auth-extra.test-d.js.map +1 -1
  73. package/dist/server/auth.d.ts +4 -4
  74. package/dist/server/auth.js +2 -2
  75. package/dist/server/auth.js.map +1 -1
  76. package/dist/server/build-manifest.test.js +7 -6
  77. package/dist/server/build-manifest.test.js.map +1 -1
  78. package/dist/server/events.d.ts +113 -0
  79. package/dist/server/events.js +318 -0
  80. package/dist/server/events.js.map +1 -0
  81. package/dist/server/events.test.js +172 -0
  82. package/dist/server/events.test.js.map +1 -0
  83. package/dist/server/express.d.ts +23 -3
  84. package/dist/server/express.js +40 -10
  85. package/dist/server/express.js.map +1 -1
  86. package/dist/server/express.test.js +193 -110
  87. package/dist/server/express.test.js.map +1 -1
  88. package/dist/server/file-ref.d.ts +1 -1
  89. package/dist/server/file-ref.js +1 -1
  90. package/dist/server/file-ref.js.map +1 -1
  91. package/dist/server/form-input.d.ts +120 -0
  92. package/dist/server/form-input.js +89 -0
  93. package/dist/server/form-input.js.map +1 -0
  94. package/dist/server/index.d.ts +8 -4
  95. package/dist/server/index.js +5 -1
  96. package/dist/server/index.js.map +1 -1
  97. package/dist/server/mcp-errors.test.js +9 -5
  98. package/dist/server/mcp-errors.test.js.map +1 -1
  99. package/dist/server/middleware.test.js +221 -148
  100. package/dist/server/middleware.test.js.map +1 -1
  101. package/dist/server/register-tool.test.js +212 -7
  102. package/dist/server/register-tool.test.js.map +1 -1
  103. package/dist/server/server.d.ts +323 -150
  104. package/dist/server/server.js +349 -324
  105. package/dist/server/server.js.map +1 -1
  106. package/dist/server/skills-integration.test.js +16 -9
  107. package/dist/server/skills-integration.test.js.map +1 -1
  108. package/dist/server/skills.js +1 -1
  109. package/dist/server/skills.js.map +1 -1
  110. package/dist/server/templateHelper.d.ts +0 -3
  111. package/dist/server/templateHelper.js.map +1 -1
  112. package/dist/server/templates.generated.js +4 -8
  113. package/dist/server/templates.generated.js.map +1 -1
  114. package/dist/server/tool-extra.test.js +115 -20
  115. package/dist/server/tool-extra.test.js.map +1 -1
  116. package/dist/server/view-resource-resolution.test.js +17 -10
  117. package/dist/server/view-resource-resolution.test.js.map +1 -1
  118. package/dist/test/utils.d.ts +7 -6
  119. package/dist/test/utils.js +212 -197
  120. package/dist/test/utils.js.map +1 -1
  121. package/dist/test/view.test.js +24 -20
  122. package/dist/test/view.test.js.map +1 -1
  123. package/dist/views/index.d.ts +10 -0
  124. package/dist/views/index.js +3 -0
  125. package/dist/views/index.js.map +1 -0
  126. package/dist/{web/plugin → views}/scan-views.js +1 -1
  127. package/dist/views/scan-views.js.map +1 -0
  128. package/dist/views/scan-views.test.js.map +1 -0
  129. package/dist/views/validate-view.d.ts +1 -0
  130. package/dist/{web/plugin → views}/validate-view.js +2 -2
  131. package/dist/views/validate-view.js.map +1 -0
  132. package/dist/views/validate-view.test.js.map +1 -0
  133. package/dist/web/bridges/adaptor.d.ts +14 -3
  134. package/dist/web/bridges/adaptor.js +157 -13
  135. package/dist/web/bridges/adaptor.js.map +1 -1
  136. package/dist/web/bridges/adaptor.test.js +46 -7
  137. package/dist/web/bridges/adaptor.test.js.map +1 -1
  138. package/dist/web/bridges/apps-sdk/bridge.js +1 -1
  139. package/dist/web/bridges/apps-sdk/bridge.js.map +1 -1
  140. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.d.ts +3 -3
  141. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js +3 -3
  142. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js.map +1 -1
  143. package/dist/web/bridges/get-adaptor.test.js +2 -2
  144. package/dist/web/bridges/get-adaptor.test.js.map +1 -1
  145. package/dist/web/bridges/mcp-app/bridge.d.ts +1 -1
  146. package/dist/web/bridges/mcp-app/bridge.js +10 -3
  147. package/dist/web/bridges/mcp-app/bridge.js.map +1 -1
  148. package/dist/web/bridges/mcp-app/bridge.test.js +2 -2
  149. package/dist/web/bridges/mcp-app/bridge.test.js.map +1 -1
  150. package/dist/web/bridges/mcp-app/types.d.ts +18 -3
  151. package/dist/web/bridges/mcp-app/types.js.map +1 -1
  152. package/dist/web/bridges/mcp-app/use-mcp-app-context.d.ts +2 -2
  153. package/dist/web/bridges/mcp-app/use-mcp-app-context.js +1 -1
  154. package/dist/web/bridges/mcp-app/use-mcp-app-context.js.map +1 -1
  155. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js +1 -1
  156. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js.map +1 -1
  157. package/dist/web/bridges/mcp-app/view-tools.test.js +1 -1
  158. package/dist/web/bridges/mcp-app/view-tools.test.js.map +1 -1
  159. package/dist/web/bridges/types.d.ts +63 -13
  160. package/dist/web/bridges/types.js +1 -1
  161. package/dist/web/bridges/types.js.map +1 -1
  162. package/dist/web/create-store.test.js +2 -2
  163. package/dist/web/create-store.test.js.map +1 -1
  164. package/dist/web/data-llm.js +3 -2
  165. package/dist/web/data-llm.js.map +1 -1
  166. package/dist/web/data-llm.test.js +8 -2
  167. package/dist/web/data-llm.test.js.map +1 -1
  168. package/dist/web/generate-helpers.d.ts +23 -19
  169. package/dist/web/generate-helpers.js +21 -17
  170. package/dist/web/generate-helpers.js.map +1 -1
  171. package/dist/web/generate-helpers.test-d.js +3 -3
  172. package/dist/web/generate-helpers.test-d.js.map +1 -1
  173. package/dist/web/generate-helpers.test.js +2 -2
  174. package/dist/web/generate-helpers.test.js.map +1 -1
  175. package/dist/web/hooks/index.d.ts +5 -1
  176. package/dist/web/hooks/index.js +5 -1
  177. package/dist/web/hooks/index.js.map +1 -1
  178. package/dist/web/hooks/openai-extensions.test.js +107 -0
  179. package/dist/web/hooks/openai-extensions.test.js.map +1 -0
  180. package/dist/web/hooks/use-call-tool.d.ts +2 -2
  181. package/dist/web/hooks/use-call-tool.js +15 -10
  182. package/dist/web/hooks/use-call-tool.js.map +1 -1
  183. package/dist/web/hooks/use-call-tool.test.js +15 -4
  184. package/dist/web/hooks/use-call-tool.test.js.map +1 -1
  185. package/dist/web/hooks/use-deep-link.d.ts +22 -0
  186. package/dist/web/hooks/use-deep-link.js +34 -0
  187. package/dist/web/hooks/use-deep-link.js.map +1 -0
  188. package/dist/web/hooks/use-display-mode.test.js +1 -1
  189. package/dist/web/hooks/use-display-mode.test.js.map +1 -1
  190. package/dist/web/hooks/use-download.test.js +3 -3
  191. package/dist/web/hooks/use-download.test.js.map +1 -1
  192. package/dist/web/hooks/use-file-resource.d.ts +37 -0
  193. package/dist/web/hooks/use-file-resource.js +98 -0
  194. package/dist/web/hooks/use-file-resource.js.map +1 -0
  195. package/dist/web/hooks/use-file-resource.test.js +65 -0
  196. package/dist/web/hooks/use-file-resource.test.js.map +1 -0
  197. package/dist/web/hooks/use-files.test.js +1 -1
  198. package/dist/web/hooks/use-files.test.js.map +1 -1
  199. package/dist/web/hooks/use-host.d.ts +27 -5
  200. package/dist/web/hooks/use-host.js +20 -5
  201. package/dist/web/hooks/use-host.js.map +1 -1
  202. package/dist/web/hooks/use-host.test.js +1 -1
  203. package/dist/web/hooks/use-host.test.js.map +1 -1
  204. package/dist/web/hooks/use-model-context.d.ts +44 -0
  205. package/dist/web/hooks/use-model-context.js +63 -0
  206. package/dist/web/hooks/use-model-context.js.map +1 -0
  207. package/dist/web/hooks/use-open-external.test.js +2 -2
  208. package/dist/web/hooks/use-open-external.test.js.map +1 -1
  209. package/dist/web/hooks/use-open-file.d.ts +20 -0
  210. package/dist/web/hooks/use-open-file.js +25 -0
  211. package/dist/web/hooks/use-open-file.js.map +1 -0
  212. package/dist/web/hooks/use-register-view-tool.d.ts +1 -1
  213. package/dist/web/hooks/use-register-view-tool.js +1 -1
  214. package/dist/web/hooks/use-register-view-tool.js.map +1 -1
  215. package/dist/web/hooks/use-request-close.test.js +1 -1
  216. package/dist/web/hooks/use-request-close.test.js.map +1 -1
  217. package/dist/web/hooks/use-request-modal.test.js +1 -1
  218. package/dist/web/hooks/use-request-modal.test.js.map +1 -1
  219. package/dist/web/hooks/use-request-size.test.js +1 -1
  220. package/dist/web/hooks/use-request-size.test.js.map +1 -1
  221. package/dist/web/hooks/use-send-follow-up-message.d.ts +8 -2
  222. package/dist/web/hooks/use-send-follow-up-message.js +6 -0
  223. package/dist/web/hooks/use-send-follow-up-message.js.map +1 -1
  224. package/dist/web/hooks/use-set-open-in-app-url.test.js +2 -8
  225. package/dist/web/hooks/use-set-open-in-app-url.test.js.map +1 -1
  226. package/dist/web/hooks/use-tool-info.test.js +2 -2
  227. package/dist/web/hooks/use-tool-info.test.js.map +1 -1
  228. package/dist/web/hooks/use-user.test.js +2 -2
  229. package/dist/web/hooks/use-user.test.js.map +1 -1
  230. package/dist/web/hooks/use-view-state.test.js +2 -2
  231. package/dist/web/hooks/use-view-state.test.js.map +1 -1
  232. package/dist/web/hooks/use-viewport.test.js +2 -2
  233. package/dist/web/hooks/use-viewport.test.js.map +1 -1
  234. package/dist/web/index.d.ts +0 -1
  235. package/dist/web/index.js.map +1 -1
  236. package/dist/web/mount-view.js +2 -6
  237. package/dist/web/mount-view.js.map +1 -1
  238. package/package.json +15 -15
  239. package/dist/standard-schema.d.ts +0 -3
  240. package/dist/standard-schema.js +0 -2
  241. package/dist/standard-schema.js.map +0 -1
  242. package/dist/web/plugin/data-llm.test.js +0 -81
  243. package/dist/web/plugin/data-llm.test.js.map +0 -1
  244. package/dist/web/plugin/plugin-build.test.js +0 -54
  245. package/dist/web/plugin/plugin-build.test.js.map +0 -1
  246. package/dist/web/plugin/plugin.d.ts +0 -39
  247. package/dist/web/plugin/plugin.js +0 -200
  248. package/dist/web/plugin/plugin.js.map +0 -1
  249. package/dist/web/plugin/plugin.test.js +0 -61
  250. package/dist/web/plugin/plugin.test.js.map +0 -1
  251. package/dist/web/plugin/scan-views.js.map +0 -1
  252. package/dist/web/plugin/scan-views.test.js.map +0 -1
  253. package/dist/web/plugin/transform-data-llm.d.ts +0 -12
  254. package/dist/web/plugin/transform-data-llm.js +0 -96
  255. package/dist/web/plugin/transform-data-llm.js.map +0 -1
  256. package/dist/web/plugin/transform-data-llm.test.js +0 -81
  257. package/dist/web/plugin/transform-data-llm.test.js.map +0 -1
  258. package/dist/web/plugin/validate-view.d.ts +0 -1
  259. package/dist/web/plugin/validate-view.js.map +0 -1
  260. package/dist/web/plugin/validate-view.test.js.map +0 -1
  261. /package/dist/{web/plugin/data-llm.test.d.ts → server/app.test.d.ts} +0 -0
  262. /package/dist/{web/plugin/plugin-build.test.d.ts → server/events.test.d.ts} +0 -0
  263. /package/dist/{web/plugin → views}/scan-views.d.ts +0 -0
  264. /package/dist/{web/plugin → views}/scan-views.test.d.ts +0 -0
  265. /package/dist/{web/plugin → views}/scan-views.test.js +0 -0
  266. /package/dist/{web/plugin → views}/validate-view.test.d.ts +0 -0
  267. /package/dist/{web/plugin → views}/validate-view.test.js +0 -0
  268. /package/dist/web/{plugin/plugin.test.d.ts → hooks/openai-extensions.test.d.ts} +0 -0
  269. /package/dist/web/{plugin/transform-data-llm.test.d.ts → hooks/use-file-resource.test.d.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-errors.test.js","sourceRoot":"","sources":["../../src/server/mcp-errors.test.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,EAAE,CAAC,IAAI,CAAC,qBAAqB,EAAE,GAAG,EAAE,CAAC,CAAC;IACpC,oBAAoB,EAAE,GAAG,EAAE,CACzB,CAAC,CAAC,EAAW,EAAE,EAAW,EAAE,CAAa,EAAE,EAAE,CAAC,CAAC,EAAE,CAAmB;CACvE,CAAC,CAAC,CAAC;AACJ,EAAE,CAAC,IAAI,CAAC,qBAAqB,EAAE,GAAG,EAAE,CAAC,CAAC;IACpC,cAAc,EAAE,GAAG,EAAE,CACnB,CAAC,CAAC,EAAW,EAAE,EAAW,EAAE,CAAa,EAAE,EAAE,CAAC,CAAC,EAAE,CAAmB;CACvE,CAAC,CAAC,CAAC;AAEJ,IAAI,UAAmC,CAAC;AACxC,SAAS,CAAC,GAAG,EAAE;IACb,UAAU,EAAE,KAAK,EAAE,CAAC;IACpB,EAAE,CAAC,eAAe,EAAE,CAAC;AACvB,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;IAC7E,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IAC9D,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,+BAA+B,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE;QACxE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAEvE,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;IACvC,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;IAC/D,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IACzC,MAAM,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACvD,UAAU,GAAG,SAAS,CAAC;IACvB,MAAM,IAAI,GAAI,SAAS,CAAC,OAAO,EAAuB,CAAC,IAAI,CAAC;IAE5D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,oBAAoB,IAAI,MAAM,EAAE;QACtD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;KACtE,CAAC,CAAC;IAEH,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC;IAC/C,MAAM,CACJ,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAC/B,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,4BAA4B,CAAC,CACnD,CACF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC,CAAC,CAAC","sourcesContent":["// @vitest-environment node\nimport http from \"node:http\";\nimport type { RequestHandler } from \"express\";\nimport { afterEach, expect, it, vi } from \"vitest\";\nimport { McpServer } from \"./server.js\";\n\nvi.mock(\"@skybridge/devtools\", () => ({\n devtoolsStaticServer: () =>\n ((_r: unknown, _s: unknown, n: () => void) => n()) as RequestHandler,\n}));\nvi.mock(\"./viewsDevServer.js\", () => ({\n viewsDevServer: () =>\n ((_r: unknown, _s: unknown, n: () => void) => n()) as RequestHandler,\n}));\n\nlet openServer: http.Server | undefined;\nafterEach(() => {\n openServer?.close();\n vi.restoreAllMocks();\n});\n\nit(\"reports a failure inside the MCP leg instead of swallowing it\", async () => {\n const { createApp } = await import(\"./express.js\");\n const server = new McpServer({ name: \"t\", version: \"0.0.0\" });\n vi.spyOn(server, \"createStatelessServerInstance\").mockImplementation(() => {\n throw new Error(\"boom\");\n });\n const errors = vi.spyOn(console, \"error\").mockImplementation(() => {});\n\n const httpServer = http.createServer();\n const app = await createApp({ mcpServer: server, httpServer });\n const listening = http.createServer(app);\n await new Promise<void>((r) => listening.listen(0, r));\n openServer = listening;\n const port = (listening.address() as { port: number }).port;\n\n const res = await fetch(`http://localhost:${port}/mcp`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ jsonrpc: \"2.0\", id: 1, method: \"initialize\" }),\n });\n\n expect(res.status).toBeGreaterThanOrEqual(500);\n expect(\n errors.mock.calls.some(([msg]) =>\n String(msg).includes(\"Error handling MCP request\"),\n ),\n ).toBe(true);\n});\n"]}
1
+ {"version":3,"file":"mcp-errors.test.js","sourceRoot":"","sources":["../../src/server/mcp-errors.test.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,EAAE,CAAC,IAAI,CAAC,qBAAqB,EAAE,GAAG,EAAE,CAAC,CAAC;IACpC,oBAAoB,EAAE,GAAG,EAAE,CACzB,CAAC,CAAC,EAAW,EAAE,EAAW,EAAE,CAAa,EAAE,EAAE,CAAC,CAAC,EAAE,CAAmB;CACvE,CAAC,CAAC,CAAC;AACJ,EAAE,CAAC,IAAI,CAAC,qBAAqB,EAAE,GAAG,EAAE,CAAC,CAAC;IACpC,cAAc,EAAE,GAAG,EAAE,CACnB,CAAC,CAAC,EAAW,EAAE,EAAW,EAAE,CAAa,EAAE,EAAE,CAAC,CAAC,EAAE,CAAmB;CACvE,CAAC,CAAC,CAAC;AAEJ,IAAI,UAAmC,CAAC;AACxC,SAAS,CAAC,GAAG,EAAE;IACb,UAAU,EAAE,KAAK,EAAE,CAAC;IACpB,EAAE,CAAC,eAAe,EAAE,CAAC;AACvB,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;IAC7E,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;IACnD,MAAM,GAAG,GAAG,IAAI,SAAS,CAAC;QACxB,IAAI,EAAE,GAAG;QACT,OAAO,EAAE,OAAO;QAChB,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM;KAC5B,CAAC,CAAC;IACH,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE;QAC5D,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAEvE,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;IACvC,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;IAChD,MAAM,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACvD,UAAU,GAAG,SAAS,CAAC;IACvB,MAAM,IAAI,GAAI,SAAS,CAAC,OAAO,EAAuB,CAAC,IAAI,CAAC;IAE5D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,oBAAoB,IAAI,MAAM,EAAE;QACtD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;KACtE,CAAC,CAAC;IAEH,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC;IAC/C,MAAM,CACJ,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAC/B,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,4BAA4B,CAAC,CACnD,CACF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC,CAAC,CAAC","sourcesContent":["// @vitest-environment node\nimport http from \"node:http\";\nimport type { RequestHandler } from \"express\";\nimport { afterEach, expect, it, vi } from \"vitest\";\nimport { Skybridge } from \"./app.js\";\n\nvi.mock(\"@skybridge/devtools\", () => ({\n devtoolsStaticServer: () =>\n ((_r: unknown, _s: unknown, n: () => void) => n()) as RequestHandler,\n}));\nvi.mock(\"./viewsDevServer.js\", () => ({\n viewsDevServer: () =>\n ((_r: unknown, _s: unknown, n: () => void) => n()) as RequestHandler,\n}));\n\nlet openServer: http.Server | undefined;\nafterEach(() => {\n openServer?.close();\n vi.restoreAllMocks();\n});\n\nit(\"reports a failure inside the MCP leg instead of swallowing it\", async () => {\n const { createApp } = await import(\"./express.js\");\n const app = new Skybridge({\n name: \"t\",\n version: \"0.0.0\",\n handler: (server) => server,\n });\n vi.spyOn(app, \"createServerInstance\").mockImplementation(() => {\n throw new Error(\"boom\");\n });\n const errors = vi.spyOn(console, \"error\").mockImplementation(() => {});\n\n const httpServer = http.createServer();\n const expressApp = await createApp({ app, httpServer });\n const listening = http.createServer(expressApp);\n await new Promise<void>((r) => listening.listen(0, r));\n openServer = listening;\n const port = (listening.address() as { port: number }).port;\n\n const res = await fetch(`http://localhost:${port}/mcp`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ jsonrpc: \"2.0\", id: 1, method: \"initialize\" }),\n });\n\n expect(res.status).toBeGreaterThanOrEqual(500);\n expect(\n errors.mock.calls.some(([msg]) =>\n String(msg).includes(\"Error handling MCP request\"),\n ),\n ).toBe(true);\n});\n"]}
@@ -1,8 +1,8 @@
1
1
  import { Client, InMemoryTransport } from "@modelcontextprotocol/client";
2
2
  import { describe, expect, it, vi } from "vitest";
3
3
  import { z } from "zod";
4
+ import { Skybridge } from "./app.js";
4
5
  import { buildMiddlewareChain, getHandlerMaps, getToolError, matchesFilter, } from "./middleware.js";
5
- import { McpServer } from "./server.js";
6
6
  // ---------------------------------------------------------------------------
7
7
  // matchesFilter
8
8
  // ---------------------------------------------------------------------------
@@ -207,29 +207,42 @@ describe("McpServer.mcpMiddleware()", () => {
207
207
  return new Client({ name: "test-client", version: "1.0.0" });
208
208
  }
209
209
  it("returns this for chaining", () => {
210
- const server = new McpServer({ name: "test", version: "1.0.0" });
211
- const result = server.mcpMiddleware(async (_req, _extra, next) => next());
212
- expect(result).toBe(server);
210
+ new Skybridge({
211
+ name: "test",
212
+ version: "1.0.0",
213
+ handler: (server) => {
214
+ const result = server.mcpMiddleware(async (_req, _extra, next) => next());
215
+ expect(result).toBe(server);
216
+ return server;
217
+ },
218
+ });
213
219
  });
214
220
  it("intercepts tools/call and exposes request params", async () => {
215
221
  let capturedMethod = "";
216
222
  let capturedParams = {};
217
- const server = new McpServer({ name: "test", version: "1.0.0" });
218
- server.registerTool({
219
- name: "greet",
220
- description: "greet",
221
- inputSchema: { name: z.string() },
222
- }, (args) => ({
223
- content: [{ type: "text", text: `hi ${args.name}` }],
224
- }));
225
- server.mcpMiddleware("tools/call", async (request, _extra, next) => {
226
- capturedMethod = request.method;
227
- capturedParams = request.params;
228
- return next();
223
+ const app = new Skybridge({
224
+ name: "test",
225
+ version: "1.0.0",
226
+ handler: (server) => {
227
+ server.registerTool({
228
+ name: "greet",
229
+ description: "greet",
230
+ inputSchema: { name: z.string() },
231
+ }, (args) => ({
232
+ content: [{ type: "text", text: `hi ${args.name}` }],
233
+ }));
234
+ server.mcpMiddleware("tools/call", async (request, _extra, next) => {
235
+ capturedMethod = request.method;
236
+ capturedParams = request.params;
237
+ return next();
238
+ });
239
+ return server;
240
+ },
229
241
  });
230
242
  const client = createClient();
231
243
  const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
232
- await server.connect(serverTransport);
244
+ const instance = await app.createServerInstance();
245
+ await instance.connect(serverTransport);
233
246
  await client.connect(clientTransport);
234
247
  const result = await client.callTool({
235
248
  name: "greet",
@@ -242,59 +255,70 @@ describe("McpServer.mcpMiddleware()", () => {
242
255
  });
243
256
  expect(result.content).toEqual([{ type: "text", text: "hi World" }]);
244
257
  await client.close();
245
- await server.close();
258
+ await instance.close();
246
259
  });
247
260
  it("array filter works", async () => {
248
261
  const matchedMethods = [];
249
- const server = new McpServer({ name: "test", version: "1.0.0" });
250
- server.registerTool({ name: "t1", description: "t1" }, () => ({
251
- content: [{ type: "text", text: "ok" }],
252
- }));
253
- server.mcpMiddleware(["tools/call", "tools/list"], async (request, _extra, next) => {
254
- matchedMethods.push(request.method);
255
- return next();
262
+ const app = new Skybridge({
263
+ name: "test",
264
+ version: "1.0.0",
265
+ handler: (server) => {
266
+ server.registerTool({ name: "t1", description: "t1" }, () => ({
267
+ content: [{ type: "text", text: "ok" }],
268
+ }));
269
+ server.mcpMiddleware(["tools/call", "tools/list"], async (request, _extra, next) => {
270
+ matchedMethods.push(request.method);
271
+ return next();
272
+ });
273
+ return server;
274
+ },
256
275
  });
257
276
  const client = createClient();
258
277
  const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
259
- await server.connect(serverTransport);
278
+ const instance = await app.createServerInstance();
279
+ await instance.connect(serverTransport);
260
280
  await client.connect(clientTransport);
261
281
  await client.listTools();
262
282
  await client.callTool({ name: "t1" });
263
283
  expect(matchedMethods).toEqual(["tools/list", "tools/call"]);
264
284
  await client.close();
265
- await server.close();
266
- });
267
- it("throws if registered after connect()", async () => {
268
- const server = new McpServer({ name: "test", version: "1.0.0" });
269
- const [_clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
270
- await server.connect(serverTransport);
271
- expect(() => server.mcpMiddleware(async (_req, _extra, next) => next())).toThrow("Cannot register MCP middleware after run() or connect()");
272
- await server.close();
273
- });
274
- it("throws when filter provided without handler", () => {
275
- const server = new McpServer({ name: "test", version: "1.0.0" });
276
- expect(() =>
277
- // @ts-expect-error intentionally passing filter without handler
278
- server.mcpMiddleware("tools/call")).toThrow("mcpMiddleware requires a handler function");
285
+ await instance.close();
286
+ });
287
+ it("throws when filter provided without handler", async () => {
288
+ const app = new Skybridge({
289
+ name: "test",
290
+ version: "1.0.0",
291
+ handler: (server) =>
292
+ // @ts-expect-error intentionally passing filter without handler
293
+ server.mcpMiddleware("tools/call"),
294
+ });
295
+ await expect(app.createServerInstance()).rejects.toThrow("mcpMiddleware requires a handler function");
279
296
  });
280
297
  it("catch-all middleware + filtered middleware stack correctly", async () => {
281
298
  const calls = [];
282
- const server = new McpServer({ name: "test", version: "1.0.0" });
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();
299
+ const app = new Skybridge({
300
+ name: "test",
301
+ version: "1.0.0",
302
+ handler: (server) => {
303
+ server.registerTool({ name: "t1", description: "t1" }, () => ({
304
+ content: [{ type: "text", text: "ok" }],
305
+ }));
306
+ server
307
+ .mcpMiddleware(async (request, _extra, next) => {
308
+ calls.push(`global:${request.method}`);
309
+ return next();
310
+ })
311
+ .mcpMiddleware("tools/call", async (_req, _extra, next) => {
312
+ calls.push("tools-only");
313
+ return next();
314
+ });
315
+ return server;
316
+ },
294
317
  });
295
318
  const client = createClient();
296
319
  const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
297
- await server.connect(serverTransport);
320
+ const instance = await app.createServerInstance();
321
+ await instance.connect(serverTransport);
298
322
  await client.connect(clientTransport);
299
323
  await client.listTools();
300
324
  await client.callTool({ name: "t1" });
@@ -308,41 +332,55 @@ describe("McpServer.mcpMiddleware()", () => {
308
332
  const toolsCallIdx = calls.indexOf("global:tools/call");
309
333
  expect(calls[toolsCallIdx + 1]).toBe("tools-only");
310
334
  await client.close();
311
- await server.close();
335
+ await instance.close();
312
336
  });
313
337
  it("notification middleware receives extra as undefined", async () => {
314
338
  let capturedExtra = "sentinel";
315
- const server = new McpServer({ name: "test", version: "1.0.0" });
316
- server.registerTool({ name: "t1", description: "t1" }, () => ({
317
- content: [{ type: "text", text: "ok" }],
318
- }));
319
- server.mcpMiddleware("notification", async (_request, extra, next) => {
320
- capturedExtra = extra;
321
- return next();
339
+ const app = new Skybridge({
340
+ name: "test",
341
+ version: "1.0.0",
342
+ handler: (server) => {
343
+ server.registerTool({ name: "t1", description: "t1" }, () => ({
344
+ content: [{ type: "text", text: "ok" }],
345
+ }));
346
+ server.mcpMiddleware("notification", async (_request, extra, next) => {
347
+ capturedExtra = extra;
348
+ return next();
349
+ });
350
+ return server;
351
+ },
322
352
  });
323
353
  const client = createClient();
324
354
  const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
325
- await server.connect(serverTransport);
355
+ const instance = await app.createServerInstance();
356
+ await instance.connect(serverTransport);
326
357
  await client.connect(clientTransport);
327
358
  // The client sends notifications/initialized automatically on connect.
328
359
  await client.listTools();
329
360
  expect(capturedExtra).toBeUndefined();
330
361
  await client.close();
331
- await server.close();
362
+ await instance.close();
332
363
  });
333
364
  it("wildcard filter intercepts matching methods only", async () => {
334
365
  const matchedMethods = [];
335
- const server = new McpServer({ name: "test", version: "1.0.0" });
336
- server.registerTool({ name: "t1", description: "t1" }, () => ({
337
- content: [{ type: "text", text: "ok" }],
338
- }));
339
- server.mcpMiddleware("tools/*", async (request, _extra, next) => {
340
- matchedMethods.push(request.method);
341
- return next();
366
+ const app = new Skybridge({
367
+ name: "test",
368
+ version: "1.0.0",
369
+ handler: (server) => {
370
+ server.registerTool({ name: "t1", description: "t1" }, () => ({
371
+ content: [{ type: "text", text: "ok" }],
372
+ }));
373
+ server.mcpMiddleware("tools/*", async (request, _extra, next) => {
374
+ matchedMethods.push(request.method);
375
+ return next();
376
+ });
377
+ return server;
378
+ },
342
379
  });
343
380
  const client = createClient();
344
381
  const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
345
- await server.connect(serverTransport);
382
+ const instance = await app.createServerInstance();
383
+ await instance.connect(serverTransport);
346
384
  await client.connect(clientTransport);
347
385
  await client.listTools();
348
386
  await client.callTool({ name: "t1" });
@@ -352,30 +390,37 @@ describe("McpServer.mcpMiddleware()", () => {
352
390
  expect(matchedMethods).not.toContain("initialize");
353
391
  expect(matchedMethods).not.toContain("notifications/initialized");
354
392
  await client.close();
355
- await server.close();
356
- });
357
- it("middleware can modify tool result via McpServer integration", async () => {
358
- const server = new McpServer({ name: "test", version: "1.0.0" });
359
- server.registerTool({
360
- name: "greet",
361
- description: "greet",
362
- inputSchema: { name: z.string() },
363
- }, (args) => ({
364
- content: [{ type: "text", text: `hi ${args.name}` }],
365
- }));
366
- server.mcpMiddleware("tools/call", async (_req, _extra, next) => {
367
- const result = (await next());
368
- return {
369
- ...result,
370
- content: [
371
- ...result.content,
372
- { type: "text", text: " (modified)" },
373
- ],
374
- };
393
+ await instance.close();
394
+ });
395
+ it("middleware can modify tool result via Skybridge integration", async () => {
396
+ const app = new Skybridge({
397
+ name: "test",
398
+ version: "1.0.0",
399
+ handler: (server) => {
400
+ server.registerTool({
401
+ name: "greet",
402
+ description: "greet",
403
+ inputSchema: { name: z.string() },
404
+ }, (args) => ({
405
+ content: [{ type: "text", text: `hi ${args.name}` }],
406
+ }));
407
+ server.mcpMiddleware("tools/call", async (_req, _extra, next) => {
408
+ const result = (await next());
409
+ return {
410
+ ...result,
411
+ content: [
412
+ ...result.content,
413
+ { type: "text", text: " (modified)" },
414
+ ],
415
+ };
416
+ });
417
+ return server;
418
+ },
375
419
  });
376
420
  const client = createClient();
377
421
  const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
378
- await server.connect(serverTransport);
422
+ const instance = await app.createServerInstance();
423
+ await instance.connect(serverTransport);
379
424
  await client.connect(clientTransport);
380
425
  const result = await client.callTool({
381
426
  name: "greet",
@@ -386,53 +431,67 @@ describe("McpServer.mcpMiddleware()", () => {
386
431
  { type: "text", text: " (modified)" },
387
432
  ]);
388
433
  await client.close();
389
- await server.close();
434
+ await instance.close();
390
435
  });
391
- it("middleware can short-circuit via McpServer integration", async () => {
436
+ it("middleware can short-circuit via Skybridge integration", async () => {
392
437
  const handlerCalled = vi.fn();
393
- const server = new McpServer({ name: "test", version: "1.0.0" });
394
- server.registerTool({ name: "t1", description: "t1" }, () => {
395
- handlerCalled();
396
- return {
397
- content: [{ type: "text", text: "original" }],
398
- };
438
+ const app = new Skybridge({
439
+ name: "test",
440
+ version: "1.0.0",
441
+ handler: (server) => {
442
+ server.registerTool({ name: "t1", description: "t1" }, () => {
443
+ handlerCalled();
444
+ return {
445
+ content: [{ type: "text", text: "original" }],
446
+ };
447
+ });
448
+ server.mcpMiddleware("tools/call", async () => ({
449
+ content: [{ type: "text", text: "short-circuited" }],
450
+ }));
451
+ return server;
452
+ },
399
453
  });
400
- server.mcpMiddleware("tools/call", async () => ({
401
- content: [{ type: "text", text: "short-circuited" }],
402
- }));
403
454
  const client = createClient();
404
455
  const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
405
- await server.connect(serverTransport);
456
+ const instance = await app.createServerInstance();
457
+ await instance.connect(serverTransport);
406
458
  await client.connect(clientTransport);
407
459
  const result = await client.callTool({ name: "t1" });
408
460
  expect(result.content).toEqual([{ type: "text", text: "short-circuited" }]);
409
461
  expect(handlerCalled).not.toHaveBeenCalled();
410
462
  await client.close();
411
- await server.close();
463
+ await instance.close();
412
464
  });
413
465
  it("exposes a thrown tool error to middleware via getToolError", async () => {
414
466
  const schemaError = new Error("boom with schema");
415
467
  const schemalessError = new Error("boom without schema");
416
468
  let captured;
417
- const server = new McpServer({ name: "test", version: "1.0.0" });
418
- server.registerTool({
419
- name: "withSchema",
420
- description: "withSchema",
421
- inputSchema: { name: z.string() },
422
- }, () => {
423
- throw schemaError;
424
- });
425
- server.registerTool({ name: "withoutSchema", description: "withoutSchema" }, () => {
426
- throw schemalessError;
427
- });
428
- server.mcpMiddleware("tools/call", async (_request, extra, next) => {
429
- const result = await next();
430
- captured = getToolError(extra);
431
- return result;
469
+ const app = new Skybridge({
470
+ name: "test",
471
+ version: "1.0.0",
472
+ handler: (server) => {
473
+ server.registerTool({
474
+ name: "withSchema",
475
+ description: "withSchema",
476
+ inputSchema: { name: z.string() },
477
+ }, () => {
478
+ throw schemaError;
479
+ });
480
+ server.registerTool({ name: "withoutSchema", description: "withoutSchema" }, () => {
481
+ throw schemalessError;
482
+ });
483
+ server.mcpMiddleware("tools/call", async (_request, extra, next) => {
484
+ const result = await next();
485
+ captured = getToolError(extra);
486
+ return result;
487
+ });
488
+ return server;
489
+ },
432
490
  });
433
491
  const client = createClient();
434
492
  const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
435
- await server.connect(serverTransport);
493
+ const instance = await app.createServerInstance();
494
+ await instance.connect(serverTransport);
436
495
  await client.connect(clientTransport);
437
496
  const withSchema = await client.callTool({
438
497
  name: "withSchema",
@@ -444,28 +503,35 @@ describe("McpServer.mcpMiddleware()", () => {
444
503
  expect(withoutSchema.isError).toBe(true);
445
504
  expect(captured).toBe(schemalessError);
446
505
  await client.close();
447
- await server.close();
506
+ await instance.close();
448
507
  });
449
- it("middleware can mutate tool call params via McpServer integration", async () => {
508
+ it("middleware can mutate tool call params via Skybridge integration", async () => {
450
509
  let receivedName = "";
451
- const server = new McpServer({ name: "test", version: "1.0.0" });
452
- server.registerTool({
453
- name: "greet",
454
- description: "greet",
455
- inputSchema: { name: z.string() },
456
- }, (args) => {
457
- receivedName = args.name;
458
- return {
459
- content: [{ type: "text", text: `hi ${args.name}` }],
460
- };
461
- });
462
- server.mcpMiddleware("tools/call", async (request, _extra, next) => {
463
- request.params.arguments = { name: "Overridden" };
464
- return next();
510
+ const app = new Skybridge({
511
+ name: "test",
512
+ version: "1.0.0",
513
+ handler: (server) => {
514
+ server.registerTool({
515
+ name: "greet",
516
+ description: "greet",
517
+ inputSchema: { name: z.string() },
518
+ }, (args) => {
519
+ receivedName = args.name;
520
+ return {
521
+ content: [{ type: "text", text: `hi ${args.name}` }],
522
+ };
523
+ });
524
+ server.mcpMiddleware("tools/call", async (request, _extra, next) => {
525
+ request.params.arguments = { name: "Overridden" };
526
+ return next();
527
+ });
528
+ return server;
529
+ },
465
530
  });
466
531
  const client = createClient();
467
532
  const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
468
- await server.connect(serverTransport);
533
+ const instance = await app.createServerInstance();
534
+ await instance.connect(serverTransport);
469
535
  await client.connect(clientTransport);
470
536
  await client.callTool({
471
537
  name: "greet",
@@ -473,21 +539,28 @@ describe("McpServer.mcpMiddleware()", () => {
473
539
  });
474
540
  expect(receivedName).toBe("Overridden");
475
541
  await client.close();
476
- await server.close();
542
+ await instance.close();
477
543
  });
478
544
  it("category 'request' filter matches requests but not notifications", async () => {
479
545
  const matchedMethods = [];
480
- const server = new McpServer({ name: "test", version: "1.0.0" });
481
- server.registerTool({ name: "t1", description: "t1" }, () => ({
482
- content: [{ type: "text", text: "ok" }],
483
- }));
484
- server.mcpMiddleware("request", async (request, _extra, next) => {
485
- matchedMethods.push(request.method);
486
- return next();
546
+ const app = new Skybridge({
547
+ name: "test",
548
+ version: "1.0.0",
549
+ handler: (server) => {
550
+ server.registerTool({ name: "t1", description: "t1" }, () => ({
551
+ content: [{ type: "text", text: "ok" }],
552
+ }));
553
+ server.mcpMiddleware("request", async (request, _extra, next) => {
554
+ matchedMethods.push(request.method);
555
+ return next();
556
+ });
557
+ return server;
558
+ },
487
559
  });
488
560
  const client = createClient();
489
561
  const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
490
- await server.connect(serverTransport);
562
+ const instance = await app.createServerInstance();
563
+ await instance.connect(serverTransport);
491
564
  await client.connect(clientTransport);
492
565
  await client.listTools();
493
566
  await client.callTool({ name: "t1" });
@@ -495,7 +568,7 @@ describe("McpServer.mcpMiddleware()", () => {
495
568
  expect(matchedMethods).toContain("tools/call");
496
569
  expect(matchedMethods).not.toContain("notifications/initialized");
497
570
  await client.close();
498
- await server.close();
571
+ await instance.close();
499
572
  });
500
573
  });
501
574
  // ---------------------------------------------------------------------------