@frontmcp/sdk 0.4.1 → 0.5.0

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 (558) hide show
  1. package/README.md +30 -18
  2. package/package.json +20 -5
  3. package/src/app/app.registry.d.ts +3 -2
  4. package/src/app/app.registry.js +3 -1
  5. package/src/app/app.registry.js.map +1 -1
  6. package/src/app/instances/app.local.instance.js +2 -2
  7. package/src/app/instances/app.local.instance.js.map +1 -1
  8. package/src/auth/auth.registry.d.ts +34 -2
  9. package/src/auth/auth.registry.js +162 -24
  10. package/src/auth/auth.registry.js.map +1 -1
  11. package/src/auth/auth.utils.js +8 -9
  12. package/src/auth/auth.utils.js.map +1 -1
  13. package/src/auth/authorization/authorization.class.d.ts +125 -0
  14. package/src/auth/authorization/authorization.class.js +224 -0
  15. package/src/auth/authorization/authorization.class.js.map +1 -0
  16. package/src/auth/authorization/authorization.types.d.ts +300 -0
  17. package/src/auth/authorization/authorization.types.js +79 -0
  18. package/src/auth/authorization/authorization.types.js.map +1 -0
  19. package/src/auth/authorization/index.d.ts +5 -0
  20. package/src/auth/authorization/index.js +19 -0
  21. package/src/auth/authorization/index.js.map +1 -0
  22. package/src/auth/authorization/orchestrated.authorization.d.ts +242 -0
  23. package/src/auth/authorization/orchestrated.authorization.js +306 -0
  24. package/src/auth/authorization/orchestrated.authorization.js.map +1 -0
  25. package/src/auth/authorization/public.authorization.d.ts +91 -0
  26. package/src/auth/authorization/public.authorization.js +132 -0
  27. package/src/auth/authorization/public.authorization.js.map +1 -0
  28. package/src/auth/authorization/transparent.authorization.d.ts +130 -0
  29. package/src/auth/authorization/transparent.authorization.js +147 -0
  30. package/src/auth/authorization/transparent.authorization.js.map +1 -0
  31. package/src/auth/consent/consent.types.d.ts +111 -0
  32. package/src/auth/consent/consent.types.js +119 -0
  33. package/src/auth/consent/consent.types.js.map +1 -0
  34. package/src/auth/consent/index.d.ts +1 -0
  35. package/src/auth/consent/index.js +13 -0
  36. package/src/auth/consent/index.js.map +1 -0
  37. package/src/auth/detection/auth-provider-detection.d.ts +84 -0
  38. package/src/auth/detection/auth-provider-detection.js +230 -0
  39. package/src/auth/detection/auth-provider-detection.js.map +1 -0
  40. package/src/auth/detection/index.d.ts +1 -0
  41. package/src/auth/detection/index.js +15 -0
  42. package/src/auth/detection/index.js.map +1 -0
  43. package/src/auth/flows/auth.verify.flow.d.ts +110 -0
  44. package/src/auth/flows/auth.verify.flow.js +379 -0
  45. package/src/auth/flows/auth.verify.flow.js.map +1 -0
  46. package/src/auth/flows/oauth.authorize.flow.d.ts +118 -164
  47. package/src/auth/flows/oauth.authorize.flow.js +701 -33
  48. package/src/auth/flows/oauth.authorize.flow.js.map +1 -1
  49. package/src/auth/flows/oauth.callback.flow.d.ts +117 -0
  50. package/src/auth/flows/oauth.callback.flow.js +357 -0
  51. package/src/auth/flows/oauth.callback.flow.js.map +1 -0
  52. package/src/auth/flows/oauth.register.flow.d.ts +32 -125
  53. package/src/auth/flows/oauth.token.flow.d.ts +52 -154
  54. package/src/auth/flows/oauth.token.flow.js +193 -55
  55. package/src/auth/flows/oauth.token.flow.js.map +1 -1
  56. package/src/auth/flows/session.verify.flow.d.ts +66 -321
  57. package/src/auth/flows/session.verify.flow.js +107 -18
  58. package/src/auth/flows/session.verify.flow.js.map +1 -1
  59. package/src/auth/flows/well-known.jwks.flow.d.ts +34 -205
  60. package/src/auth/flows/well-known.jwks.flow.js +15 -8
  61. package/src/auth/flows/well-known.jwks.flow.js.map +1 -1
  62. package/src/auth/flows/well-known.oauth-authorization-server.flow.d.ts +48 -223
  63. package/src/auth/flows/well-known.oauth-authorization-server.flow.js +2 -3
  64. package/src/auth/flows/well-known.oauth-authorization-server.flow.js.map +1 -1
  65. package/src/auth/flows/well-known.prm.flow.d.ts +19 -120
  66. package/src/auth/flows/well-known.prm.flow.js +3 -4
  67. package/src/auth/flows/well-known.prm.flow.js.map +1 -1
  68. package/src/auth/instances/instance.local-primary-auth.d.ts +91 -4
  69. package/src/auth/instances/instance.local-primary-auth.js +236 -6
  70. package/src/auth/instances/instance.local-primary-auth.js.map +1 -1
  71. package/src/auth/instances/instance.remote-primary-auth.d.ts +4 -3
  72. package/src/auth/instances/instance.remote-primary-auth.js +2 -2
  73. package/src/auth/instances/instance.remote-primary-auth.js.map +1 -1
  74. package/src/auth/session/authorization-vault.d.ts +611 -0
  75. package/src/auth/session/authorization-vault.js +817 -0
  76. package/src/auth/session/authorization-vault.js.map +1 -0
  77. package/src/auth/session/authorization.store.d.ts +301 -0
  78. package/src/auth/session/authorization.store.js +323 -0
  79. package/src/auth/session/authorization.store.js.map +1 -0
  80. package/src/auth/session/encrypted-authorization-vault.d.ts +181 -0
  81. package/src/auth/session/encrypted-authorization-vault.js +493 -0
  82. package/src/auth/session/encrypted-authorization-vault.js.map +1 -0
  83. package/src/auth/session/index.d.ts +4 -4
  84. package/src/auth/session/index.js +11 -7
  85. package/src/auth/session/index.js.map +1 -1
  86. package/src/auth/session/session.schema.d.ts +1 -1
  87. package/src/auth/session/session.service.d.ts +1 -1
  88. package/src/auth/session/transport-session.manager.d.ts +101 -0
  89. package/src/auth/session/transport-session.manager.js +300 -0
  90. package/src/auth/session/transport-session.manager.js.map +1 -0
  91. package/src/auth/session/transport-session.types.d.ts +457 -0
  92. package/src/auth/session/transport-session.types.js +110 -0
  93. package/src/auth/session/transport-session.types.js.map +1 -0
  94. package/src/auth/session/utils/session-id.utils.d.ts +14 -2
  95. package/src/auth/session/utils/session-id.utils.js +68 -19
  96. package/src/auth/session/utils/session-id.utils.js.map +1 -1
  97. package/src/auth/session/vault-encryption.d.ts +189 -0
  98. package/src/auth/session/vault-encryption.js +263 -0
  99. package/src/auth/session/vault-encryption.js.map +1 -0
  100. package/src/auth/ui/base-layout.d.ts +188 -0
  101. package/src/auth/ui/base-layout.js +292 -0
  102. package/src/auth/ui/base-layout.js.map +1 -0
  103. package/src/auth/ui/htmx-templates.d.ts +135 -0
  104. package/src/auth/ui/htmx-templates.js +433 -0
  105. package/src/auth/ui/htmx-templates.js.map +1 -0
  106. package/src/auth/ui/index.d.ts +11 -0
  107. package/src/auth/ui/index.js +35 -0
  108. package/src/auth/ui/index.js.map +1 -0
  109. package/src/auth/utils/audience.validator.d.ts +129 -0
  110. package/src/auth/utils/audience.validator.js +196 -0
  111. package/src/auth/utils/audience.validator.js.map +1 -0
  112. package/src/auth/utils/index.d.ts +2 -0
  113. package/src/auth/utils/index.js +7 -0
  114. package/src/auth/utils/index.js.map +1 -0
  115. package/src/auth/utils/www-authenticate.utils.d.ts +97 -0
  116. package/src/auth/utils/www-authenticate.utils.js +183 -0
  117. package/src/auth/utils/www-authenticate.utils.js.map +1 -0
  118. package/src/common/common.schema.d.ts +2 -16
  119. package/src/common/constants.d.ts +3 -0
  120. package/src/common/constants.js +6 -1
  121. package/src/common/constants.js.map +1 -1
  122. package/src/common/decorators/decorator-utils.d.ts +131 -0
  123. package/src/common/decorators/decorator-utils.js +195 -0
  124. package/src/common/decorators/decorator-utils.js.map +1 -0
  125. package/src/common/decorators/front-mcp.decorator.js +3 -2
  126. package/src/common/decorators/front-mcp.decorator.js.map +1 -1
  127. package/src/common/decorators/hook.decorator.d.ts +58 -2
  128. package/src/common/decorators/hook.decorator.js +127 -17
  129. package/src/common/decorators/hook.decorator.js.map +1 -1
  130. package/src/common/decorators/plugin.decorator.d.ts +1 -1
  131. package/src/common/decorators/plugin.decorator.js +11 -10
  132. package/src/common/decorators/plugin.decorator.js.map +1 -1
  133. package/src/common/decorators/resource.decorator.d.ts +32 -3
  134. package/src/common/decorators/resource.decorator.js +46 -4
  135. package/src/common/decorators/resource.decorator.js.map +1 -1
  136. package/src/common/decorators/tool.decorator.d.ts +54 -5
  137. package/src/common/decorators/tool.decorator.js.map +1 -1
  138. package/src/common/dynamic/dynamic.plugin.d.ts +22 -11
  139. package/src/common/dynamic/dynamic.plugin.js +7 -1
  140. package/src/common/dynamic/dynamic.plugin.js.map +1 -1
  141. package/src/common/entries/prompt.entry.d.ts +46 -2
  142. package/src/common/entries/prompt.entry.js +10 -0
  143. package/src/common/entries/prompt.entry.js.map +1 -1
  144. package/src/common/entries/resource.entry.d.ts +69 -6
  145. package/src/common/entries/resource.entry.js +27 -3
  146. package/src/common/entries/resource.entry.js.map +1 -1
  147. package/src/common/entries/scope.entry.d.ts +5 -1
  148. package/src/common/entries/scope.entry.js +3 -3
  149. package/src/common/entries/scope.entry.js.map +1 -1
  150. package/src/common/flow/flow.utils.d.ts +56 -0
  151. package/src/common/flow/flow.utils.js +96 -0
  152. package/src/common/flow/flow.utils.js.map +1 -0
  153. package/src/common/index.d.ts +2 -2
  154. package/src/common/index.js +2 -2
  155. package/src/common/index.js.map +1 -1
  156. package/src/common/interfaces/execution-context.interface.d.ts +59 -0
  157. package/src/common/interfaces/execution-context.interface.js +81 -0
  158. package/src/common/interfaces/execution-context.interface.js.map +1 -0
  159. package/src/common/interfaces/flow.interface.d.ts +1 -1
  160. package/src/common/interfaces/flow.interface.js.map +1 -1
  161. package/src/common/interfaces/index.d.ts +1 -0
  162. package/src/common/interfaces/index.js +1 -0
  163. package/src/common/interfaces/index.js.map +1 -1
  164. package/src/common/interfaces/internal/primary-auth-provider.interface.d.ts +17 -2
  165. package/src/common/interfaces/internal/primary-auth-provider.interface.js +52 -4
  166. package/src/common/interfaces/internal/primary-auth-provider.interface.js.map +1 -1
  167. package/src/common/interfaces/internal/registry.interface.d.ts +16 -2
  168. package/src/common/interfaces/internal/registry.interface.js.map +1 -1
  169. package/src/common/interfaces/plugin.interface.js.map +1 -1
  170. package/src/common/interfaces/prompt.interface.d.ts +53 -4
  171. package/src/common/interfaces/prompt.interface.js +78 -0
  172. package/src/common/interfaces/prompt.interface.js.map +1 -1
  173. package/src/common/interfaces/resource.interface.d.ts +47 -17
  174. package/src/common/interfaces/resource.interface.js +53 -0
  175. package/src/common/interfaces/resource.interface.js.map +1 -1
  176. package/src/common/interfaces/tool.interface.d.ts +39 -22
  177. package/src/common/interfaces/tool.interface.js +61 -34
  178. package/src/common/interfaces/tool.interface.js.map +1 -1
  179. package/src/common/metadata/adapter.metadata.d.ts +1 -9
  180. package/src/common/metadata/app.metadata.d.ts +425 -730
  181. package/src/common/metadata/auth-provider.metadata.d.ts +2 -12
  182. package/src/common/metadata/flow.metadata.d.ts +10 -25
  183. package/src/common/metadata/front-mcp.metadata.d.ts +602 -1023
  184. package/src/common/metadata/front-mcp.metadata.js +6 -4
  185. package/src/common/metadata/front-mcp.metadata.js.map +1 -1
  186. package/src/common/metadata/hook.metadata.d.ts +1 -1
  187. package/src/common/metadata/hook.metadata.js.map +1 -1
  188. package/src/common/metadata/index.d.ts +1 -0
  189. package/src/common/metadata/index.js +1 -0
  190. package/src/common/metadata/index.js.map +1 -1
  191. package/src/common/metadata/logger.metadata.d.ts +1 -9
  192. package/src/common/metadata/plugin.metadata.d.ts +8 -30
  193. package/src/common/metadata/prompt.metadata.d.ts +4 -161
  194. package/src/common/metadata/provider.metadata.d.ts +2 -12
  195. package/src/common/metadata/resource.metadata.d.ts +6 -98
  196. package/src/common/metadata/resource.metadata.js +15 -6
  197. package/src/common/metadata/resource.metadata.js.map +1 -1
  198. package/src/common/metadata/tool-ui.metadata.d.ts +10 -0
  199. package/src/common/metadata/tool-ui.metadata.js +12 -0
  200. package/src/common/metadata/tool-ui.metadata.js.map +1 -0
  201. package/src/common/metadata/tool.metadata.d.ts +78 -199
  202. package/src/common/metadata/tool.metadata.js +11 -14
  203. package/src/common/metadata/tool.metadata.js.map +1 -1
  204. package/src/common/providers/base-config.provider.d.ts +84 -0
  205. package/src/common/providers/base-config.provider.js +128 -0
  206. package/src/common/providers/base-config.provider.js.map +1 -0
  207. package/src/common/records/plugin.record.d.ts +5 -6
  208. package/src/common/records/plugin.record.js.map +1 -1
  209. package/src/common/records/prompt.record.js.map +1 -1
  210. package/src/common/records/resource.record.d.ts +17 -1
  211. package/src/common/records/resource.record.js +12 -6
  212. package/src/common/records/resource.record.js.map +1 -1
  213. package/src/common/records/tool.record.js.map +1 -1
  214. package/src/common/schemas/annotated-class.schema.d.ts +9 -9
  215. package/src/common/schemas/annotated-class.schema.js +92 -27
  216. package/src/common/schemas/annotated-class.schema.js.map +1 -1
  217. package/src/common/schemas/http-input.schema.d.ts +6 -30
  218. package/src/common/schemas/http-output.schema.d.ts +326 -1630
  219. package/src/common/schemas/http-output.schema.js +39 -1
  220. package/src/common/schemas/http-output.schema.js.map +1 -1
  221. package/src/common/tokens/front-mcp.tokens.js +4 -1
  222. package/src/common/tokens/front-mcp.tokens.js.map +1 -1
  223. package/src/common/tokens/resource.tokens.d.ts +2 -0
  224. package/src/common/tokens/resource.tokens.js +4 -1
  225. package/src/common/tokens/resource.tokens.js.map +1 -1
  226. package/src/common/tokens/tool.tokens.d.ts +2 -0
  227. package/src/common/tokens/tool.tokens.js +2 -0
  228. package/src/common/tokens/tool.tokens.js.map +1 -1
  229. package/src/common/types/auth/jwt.types.d.ts +5 -31
  230. package/src/common/types/auth/session.types.d.ts +97 -192
  231. package/src/common/types/auth/session.types.js +24 -11
  232. package/src/common/types/auth/session.types.js.map +1 -1
  233. package/src/common/types/options/auth.options.d.ts +1013 -490
  234. package/src/common/types/options/auth.options.js +554 -36
  235. package/src/common/types/options/auth.options.js.map +1 -1
  236. package/src/common/types/options/http.options.d.ts +1 -9
  237. package/src/common/types/options/logging.options.d.ts +7 -13
  238. package/src/common/types/options/logging.options.js +4 -0
  239. package/src/common/types/options/logging.options.js.map +1 -1
  240. package/src/common/types/options/server-info.options.d.ts +3 -31
  241. package/src/common/types/options/session.options.d.ts +90 -10
  242. package/src/common/types/options/session.options.js +26 -3
  243. package/src/common/types/options/session.options.js.map +1 -1
  244. package/src/common/utils/decide-request-intent.utils.d.ts +8 -46
  245. package/src/common/utils/decide-request-intent.utils.js +88 -23
  246. package/src/common/utils/decide-request-intent.utils.js.map +1 -1
  247. package/src/completion/flows/complete.flow.d.ts +74 -0
  248. package/src/completion/flows/complete.flow.js +199 -0
  249. package/src/completion/flows/complete.flow.js.map +1 -0
  250. package/src/errors/authorization-required.error.d.ts +189 -0
  251. package/src/errors/authorization-required.error.js +274 -0
  252. package/src/errors/authorization-required.error.js.map +1 -0
  253. package/src/errors/index.d.ts +2 -1
  254. package/src/errors/index.js +17 -1
  255. package/src/errors/index.js.map +1 -1
  256. package/src/errors/mcp.error.d.ts +101 -1
  257. package/src/errors/mcp.error.js +147 -2
  258. package/src/errors/mcp.error.js.map +1 -1
  259. package/src/flows/flow.instance.js +4 -3
  260. package/src/flows/flow.instance.js.map +1 -1
  261. package/src/flows/flow.registry.js.map +1 -1
  262. package/src/flows/flow.stages.js +14 -11
  263. package/src/flows/flow.stages.js.map +1 -1
  264. package/src/front-mcp/front-mcp.providers.d.ts +464 -102
  265. package/src/front-mcp/front-mcp.providers.js +3 -5
  266. package/src/front-mcp/front-mcp.providers.js.map +1 -1
  267. package/src/hooks/hook.instance.d.ts +1 -1
  268. package/src/hooks/hook.instance.js +5 -2
  269. package/src/hooks/hook.instance.js.map +1 -1
  270. package/src/hooks/hook.registry.js +7 -5
  271. package/src/hooks/hook.registry.js.map +1 -1
  272. package/src/index.d.ts +28 -9
  273. package/src/index.js +5 -1
  274. package/src/index.js.map +1 -1
  275. package/src/logger/instances/instance.logger.js +3 -2
  276. package/src/logger/instances/instance.logger.js.map +1 -1
  277. package/src/logger/logger.registry.js +7 -2
  278. package/src/logger/logger.registry.js.map +1 -1
  279. package/src/logging/flows/set-level.flow.d.ts +62 -0
  280. package/src/logging/flows/set-level.flow.js +108 -0
  281. package/src/logging/flows/set-level.flow.js.map +1 -0
  282. package/src/mcp-apps/csp.d.ts +111 -0
  283. package/src/mcp-apps/csp.js +267 -0
  284. package/src/mcp-apps/csp.js.map +1 -0
  285. package/src/mcp-apps/index.d.ts +23 -0
  286. package/src/mcp-apps/index.js +91 -0
  287. package/src/mcp-apps/index.js.map +1 -0
  288. package/src/mcp-apps/schemas.d.ts +403 -0
  289. package/src/mcp-apps/schemas.js +345 -0
  290. package/src/mcp-apps/schemas.js.map +1 -0
  291. package/src/mcp-apps/template.d.ts +94 -0
  292. package/src/mcp-apps/template.js +419 -0
  293. package/src/mcp-apps/template.js.map +1 -0
  294. package/src/mcp-apps/types.d.ts +323 -0
  295. package/src/mcp-apps/types.js +59 -0
  296. package/src/mcp-apps/types.js.map +1 -0
  297. package/src/notification/index.d.ts +1 -0
  298. package/src/notification/index.js +13 -0
  299. package/src/notification/index.js.map +1 -0
  300. package/src/notification/notification.service.d.ts +378 -0
  301. package/src/notification/notification.service.js +727 -0
  302. package/src/notification/notification.service.js.map +1 -0
  303. package/src/plugin/plugin.registry.js +12 -9
  304. package/src/plugin/plugin.registry.js.map +1 -1
  305. package/src/prompt/flows/get-prompt.flow.d.ts +153 -0
  306. package/src/prompt/flows/get-prompt.flow.js +214 -0
  307. package/src/prompt/flows/get-prompt.flow.js.map +1 -0
  308. package/src/prompt/flows/prompts-list.flow.d.ts +67 -0
  309. package/src/prompt/flows/prompts-list.flow.js +176 -0
  310. package/src/prompt/flows/prompts-list.flow.js.map +1 -0
  311. package/src/prompt/index.d.ts +7 -0
  312. package/src/prompt/index.js +17 -0
  313. package/src/prompt/index.js.map +1 -0
  314. package/src/prompt/prompt.events.d.ts +17 -0
  315. package/src/prompt/prompt.events.js +25 -0
  316. package/src/prompt/prompt.events.js.map +1 -0
  317. package/src/prompt/prompt.instance.d.ts +30 -0
  318. package/src/prompt/prompt.instance.js +120 -0
  319. package/src/prompt/prompt.instance.js.map +1 -0
  320. package/src/prompt/prompt.registry.d.ts +79 -12
  321. package/src/prompt/prompt.registry.js +360 -15
  322. package/src/prompt/prompt.registry.js.map +1 -1
  323. package/src/prompt/prompt.types.d.ts +26 -0
  324. package/src/prompt/prompt.types.js +11 -0
  325. package/src/prompt/prompt.types.js.map +1 -0
  326. package/src/prompt/prompt.utils.d.ts +26 -0
  327. package/src/prompt/prompt.utils.js +136 -0
  328. package/src/prompt/prompt.utils.js.map +1 -0
  329. package/src/provider/provider.registry.d.ts +12 -5
  330. package/src/provider/provider.registry.js +30 -138
  331. package/src/provider/provider.registry.js.map +1 -1
  332. package/src/regsitry/registry.base.d.ts +1 -1
  333. package/src/regsitry/registry.base.js.map +1 -1
  334. package/src/resource/flows/read-resource.flow.d.ts +91 -0
  335. package/src/resource/flows/read-resource.flow.js +270 -0
  336. package/src/resource/flows/read-resource.flow.js.map +1 -0
  337. package/src/resource/flows/resource-templates-list.flow.d.ts +64 -0
  338. package/src/resource/flows/resource-templates-list.flow.js +191 -0
  339. package/src/resource/flows/resource-templates-list.flow.js.map +1 -0
  340. package/src/resource/flows/resources-list.flow.d.ts +64 -0
  341. package/src/resource/flows/resources-list.flow.js +196 -0
  342. package/src/resource/flows/resources-list.flow.js.map +1 -0
  343. package/src/resource/flows/subscribe-resource.flow.d.ts +45 -0
  344. package/src/resource/flows/subscribe-resource.flow.js +123 -0
  345. package/src/resource/flows/subscribe-resource.flow.js.map +1 -0
  346. package/src/resource/flows/unsubscribe-resource.flow.d.ts +44 -0
  347. package/src/resource/flows/unsubscribe-resource.flow.js +107 -0
  348. package/src/resource/flows/unsubscribe-resource.flow.js.map +1 -0
  349. package/src/resource/index.d.ts +8 -0
  350. package/src/resource/index.js +20 -0
  351. package/src/resource/index.js.map +1 -0
  352. package/src/resource/resource.events.d.ts +24 -0
  353. package/src/resource/resource.events.js +17 -0
  354. package/src/resource/resource.events.js.map +1 -0
  355. package/src/resource/resource.instance.d.ts +35 -0
  356. package/src/resource/resource.instance.js +163 -0
  357. package/src/resource/resource.instance.js.map +1 -0
  358. package/src/resource/resource.registry.d.ts +106 -12
  359. package/src/resource/resource.registry.js +449 -13
  360. package/src/resource/resource.registry.js.map +1 -1
  361. package/src/resource/resource.types.d.ts +35 -0
  362. package/src/resource/resource.types.js +11 -0
  363. package/src/resource/resource.types.js.map +1 -0
  364. package/src/resource/resource.utils.d.ts +30 -0
  365. package/src/resource/resource.utils.js +151 -0
  366. package/src/resource/resource.utils.js.map +1 -0
  367. package/src/scope/flows/http.request.flow.d.ts +48 -330
  368. package/src/scope/flows/http.request.flow.js +306 -78
  369. package/src/scope/flows/http.request.flow.js.map +1 -1
  370. package/src/scope/scope.instance.d.ts +12 -0
  371. package/src/scope/scope.instance.js +145 -15
  372. package/src/scope/scope.instance.js.map +1 -1
  373. package/src/tool/flows/call-tool.flow.d.ts +64 -1110
  374. package/src/tool/flows/call-tool.flow.js +303 -15
  375. package/src/tool/flows/call-tool.flow.js.map +1 -1
  376. package/src/tool/flows/tools-list.flow.d.ts +32 -473
  377. package/src/tool/flows/tools-list.flow.js +121 -40
  378. package/src/tool/flows/tools-list.flow.js.map +1 -1
  379. package/src/tool/tool.events.d.ts +8 -1
  380. package/src/tool/tool.events.js.map +1 -1
  381. package/src/tool/tool.instance.d.ts +3 -1
  382. package/src/tool/tool.instance.js +17 -3
  383. package/src/tool/tool.instance.js.map +1 -1
  384. package/src/tool/tool.registry.d.ts +7 -1
  385. package/src/tool/tool.registry.js +26 -10
  386. package/src/tool/tool.registry.js.map +1 -1
  387. package/src/tool/tool.types.d.ts +4 -4
  388. package/src/tool/tool.types.js.map +1 -1
  389. package/src/tool/tool.utils.d.ts +3 -12
  390. package/src/tool/tool.utils.js +39 -193
  391. package/src/tool/tool.utils.js.map +1 -1
  392. package/src/tool/ui/index.d.ts +22 -0
  393. package/src/tool/ui/index.js +63 -0
  394. package/src/tool/ui/index.js.map +1 -0
  395. package/src/tool/ui/platform-adapters.d.ts +10 -0
  396. package/src/tool/ui/platform-adapters.js +18 -0
  397. package/src/tool/ui/platform-adapters.js.map +1 -0
  398. package/src/tool/ui/template-helpers.d.ts +46 -0
  399. package/src/tool/ui/template-helpers.js +112 -0
  400. package/src/tool/ui/template-helpers.js.map +1 -0
  401. package/src/tool/ui/ui-resource-template.d.ts +34 -0
  402. package/src/tool/ui/ui-resource-template.js +64 -0
  403. package/src/tool/ui/ui-resource-template.js.map +1 -0
  404. package/src/tool/ui/ui-resource.handler.d.ts +74 -0
  405. package/src/tool/ui/ui-resource.handler.js +129 -0
  406. package/src/tool/ui/ui-resource.handler.js.map +1 -0
  407. package/src/transport/adapters/transport.local.adapter.d.ts +2 -2
  408. package/src/transport/adapters/transport.local.adapter.js +28 -7
  409. package/src/transport/adapters/transport.local.adapter.js.map +1 -1
  410. package/src/transport/adapters/transport.sse.adapter.d.ts +2 -2
  411. package/src/transport/adapters/transport.sse.adapter.js +4 -3
  412. package/src/transport/adapters/transport.sse.adapter.js.map +1 -1
  413. package/src/transport/adapters/transport.streamable-http.adapter.d.ts +10 -3
  414. package/src/transport/adapters/transport.streamable-http.adapter.js +54 -8
  415. package/src/transport/adapters/transport.streamable-http.adapter.js.map +1 -1
  416. package/src/transport/flows/handle.sse.flow.d.ts +29 -63
  417. package/src/transport/flows/handle.sse.flow.js +78 -10
  418. package/src/transport/flows/handle.sse.flow.js.map +1 -1
  419. package/src/transport/flows/handle.stateless-http.flow.d.ts +29 -0
  420. package/src/transport/flows/handle.stateless-http.flow.js +102 -0
  421. package/src/transport/flows/handle.stateless-http.flow.js.map +1 -0
  422. package/src/transport/flows/handle.streamable-http.flow.d.ts +32 -64
  423. package/src/transport/flows/handle.streamable-http.flow.js +158 -26
  424. package/src/transport/flows/handle.streamable-http.flow.js.map +1 -1
  425. package/src/transport/legacy/legacy.sse.tranporter.d.ts +9 -0
  426. package/src/transport/legacy/legacy.sse.tranporter.js +17 -2
  427. package/src/transport/legacy/legacy.sse.tranporter.js.map +1 -1
  428. package/src/transport/mcp-handlers/call-tool-request.handler.js +27 -1
  429. package/src/transport/mcp-handlers/call-tool-request.handler.js.map +1 -1
  430. package/src/transport/mcp-handlers/complete-request.handler.d.ts +69 -0
  431. package/src/transport/mcp-handlers/complete-request.handler.js +11 -0
  432. package/src/transport/mcp-handlers/complete-request.handler.js.map +1 -0
  433. package/src/transport/mcp-handlers/get-prompt-request.handler.d.ts +87 -0
  434. package/src/transport/mcp-handlers/get-prompt-request.handler.js +11 -0
  435. package/src/transport/mcp-handlers/get-prompt-request.handler.js.map +1 -0
  436. package/src/transport/mcp-handlers/index.d.ts +517 -208
  437. package/src/transport/mcp-handlers/index.js +39 -2
  438. package/src/transport/mcp-handlers/index.js.map +1 -1
  439. package/src/transport/mcp-handlers/initialize-request.handler.d.ts +1 -1
  440. package/src/transport/mcp-handlers/initialize-request.handler.js +73 -7
  441. package/src/transport/mcp-handlers/initialize-request.handler.js.map +1 -1
  442. package/src/transport/mcp-handlers/list-prompts-request.handler.d.ts +54 -0
  443. package/src/transport/mcp-handlers/list-prompts-request.handler.js +11 -0
  444. package/src/transport/mcp-handlers/list-prompts-request.handler.js.map +1 -0
  445. package/src/transport/mcp-handlers/list-resource-templates-request.handler.d.ts +51 -0
  446. package/src/transport/mcp-handlers/list-resource-templates-request.handler.js +12 -0
  447. package/src/transport/mcp-handlers/list-resource-templates-request.handler.js.map +1 -0
  448. package/src/transport/mcp-handlers/list-resources-request.handler.d.ts +51 -0
  449. package/src/transport/mcp-handlers/list-resources-request.handler.js +12 -0
  450. package/src/transport/mcp-handlers/list-resources-request.handler.js.map +1 -0
  451. package/src/transport/mcp-handlers/list-tools-request.handler.d.ts +19 -146
  452. package/src/transport/mcp-handlers/logging-set-level-request.handler.d.ts +46 -0
  453. package/src/transport/mcp-handlers/logging-set-level-request.handler.js +34 -0
  454. package/src/transport/mcp-handlers/logging-set-level-request.handler.js.map +1 -0
  455. package/src/transport/mcp-handlers/mcp-handlers.types.d.ts +3 -7
  456. package/src/transport/mcp-handlers/mcp-handlers.types.js.map +1 -1
  457. package/src/transport/mcp-handlers/read-resource-request.handler.d.ts +46 -0
  458. package/src/transport/mcp-handlers/read-resource-request.handler.js +12 -0
  459. package/src/transport/mcp-handlers/read-resource-request.handler.js.map +1 -0
  460. package/src/transport/mcp-handlers/roots-list-changed-notification.handler.d.ts +11 -0
  461. package/src/transport/mcp-handlers/roots-list-changed-notification.handler.js +26 -0
  462. package/src/transport/mcp-handlers/roots-list-changed-notification.handler.js.map +1 -0
  463. package/src/transport/mcp-handlers/subscribe-request.handler.d.ts +37 -0
  464. package/src/transport/mcp-handlers/subscribe-request.handler.js +34 -0
  465. package/src/transport/mcp-handlers/subscribe-request.handler.js.map +1 -0
  466. package/src/transport/mcp-handlers/unsubscribe-request.handler.d.ts +37 -0
  467. package/src/transport/mcp-handlers/unsubscribe-request.handler.js +34 -0
  468. package/src/transport/mcp-handlers/unsubscribe-request.handler.js.map +1 -0
  469. package/src/transport/transport.local.js +7 -2
  470. package/src/transport/transport.local.js.map +1 -1
  471. package/src/transport/transport.registry.d.ts +30 -0
  472. package/src/transport/transport.registry.js +84 -1
  473. package/src/transport/transport.registry.js.map +1 -1
  474. package/src/transport/transport.types.d.ts +3 -3
  475. package/src/transport/transport.types.js.map +1 -1
  476. package/src/utils/content.utils.d.ts +48 -0
  477. package/src/utils/content.utils.js +194 -0
  478. package/src/utils/content.utils.js.map +1 -0
  479. package/src/utils/index.d.ts +8 -0
  480. package/src/utils/index.js +55 -0
  481. package/src/utils/index.js.map +1 -0
  482. package/src/utils/lineage.utils.d.ts +40 -0
  483. package/src/utils/lineage.utils.js +82 -0
  484. package/src/utils/lineage.utils.js.map +1 -0
  485. package/src/utils/naming.utils.d.ts +46 -0
  486. package/src/utils/naming.utils.js +136 -0
  487. package/src/utils/naming.utils.js.map +1 -0
  488. package/src/utils/types.utils.d.ts +2 -2
  489. package/src/utils/types.utils.js.map +1 -1
  490. package/src/utils/uri-template.utils.d.ts +57 -0
  491. package/src/utils/uri-template.utils.js +113 -0
  492. package/src/utils/uri-template.utils.js.map +1 -0
  493. package/src/utils/uri-validation.utils.d.ts +40 -0
  494. package/src/utils/uri-validation.utils.js +76 -0
  495. package/src/utils/uri-validation.utils.js.map +1 -0
  496. package/src/__test-utils__/fixtures/hook.fixtures.d.ts +0 -46
  497. package/src/__test-utils__/fixtures/hook.fixtures.js +0 -114
  498. package/src/__test-utils__/fixtures/hook.fixtures.js.map +0 -1
  499. package/src/__test-utils__/fixtures/index.d.ts +0 -7
  500. package/src/__test-utils__/fixtures/index.js +0 -11
  501. package/src/__test-utils__/fixtures/index.js.map +0 -1
  502. package/src/__test-utils__/fixtures/plugin.fixtures.d.ts +0 -46
  503. package/src/__test-utils__/fixtures/plugin.fixtures.js +0 -127
  504. package/src/__test-utils__/fixtures/plugin.fixtures.js.map +0 -1
  505. package/src/__test-utils__/fixtures/provider.fixtures.d.ts +0 -69
  506. package/src/__test-utils__/fixtures/provider.fixtures.js +0 -131
  507. package/src/__test-utils__/fixtures/provider.fixtures.js.map +0 -1
  508. package/src/__test-utils__/fixtures/scope.fixtures.d.ts +0 -14
  509. package/src/__test-utils__/fixtures/scope.fixtures.js +0 -59
  510. package/src/__test-utils__/fixtures/scope.fixtures.js.map +0 -1
  511. package/src/__test-utils__/fixtures/tool.fixtures.d.ts +0 -36
  512. package/src/__test-utils__/fixtures/tool.fixtures.js +0 -91
  513. package/src/__test-utils__/fixtures/tool.fixtures.js.map +0 -1
  514. package/src/__test-utils__/helpers/assertion.helpers.d.ts +0 -45
  515. package/src/__test-utils__/helpers/assertion.helpers.js +0 -153
  516. package/src/__test-utils__/helpers/assertion.helpers.js.map +0 -1
  517. package/src/__test-utils__/helpers/async.helpers.d.ts +0 -48
  518. package/src/__test-utils__/helpers/async.helpers.js +0 -112
  519. package/src/__test-utils__/helpers/async.helpers.js.map +0 -1
  520. package/src/__test-utils__/helpers/index.d.ts +0 -6
  521. package/src/__test-utils__/helpers/index.js +0 -10
  522. package/src/__test-utils__/helpers/index.js.map +0 -1
  523. package/src/__test-utils__/helpers/setup.helpers.d.ts +0 -54
  524. package/src/__test-utils__/helpers/setup.helpers.js +0 -106
  525. package/src/__test-utils__/helpers/setup.helpers.js.map +0 -1
  526. package/src/__test-utils__/index.d.ts +0 -9
  527. package/src/__test-utils__/index.js +0 -14
  528. package/src/__test-utils__/index.js.map +0 -1
  529. package/src/__test-utils__/mocks/flow-instance.mock.d.ts +0 -50
  530. package/src/__test-utils__/mocks/flow-instance.mock.js +0 -72
  531. package/src/__test-utils__/mocks/flow-instance.mock.js.map +0 -1
  532. package/src/__test-utils__/mocks/hook-registry.mock.d.ts +0 -25
  533. package/src/__test-utils__/mocks/hook-registry.mock.js +0 -65
  534. package/src/__test-utils__/mocks/hook-registry.mock.js.map +0 -1
  535. package/src/__test-utils__/mocks/index.d.ts +0 -8
  536. package/src/__test-utils__/mocks/index.js +0 -12
  537. package/src/__test-utils__/mocks/index.js.map +0 -1
  538. package/src/__test-utils__/mocks/plugin-registry.mock.d.ts +0 -43
  539. package/src/__test-utils__/mocks/plugin-registry.mock.js +0 -70
  540. package/src/__test-utils__/mocks/plugin-registry.mock.js.map +0 -1
  541. package/src/__test-utils__/mocks/provider-registry.mock.d.ts +0 -39
  542. package/src/__test-utils__/mocks/provider-registry.mock.js +0 -72
  543. package/src/__test-utils__/mocks/provider-registry.mock.js.map +0 -1
  544. package/src/__test-utils__/mocks/tool-registry.mock.d.ts +0 -43
  545. package/src/__test-utils__/mocks/tool-registry.mock.js +0 -79
  546. package/src/__test-utils__/mocks/tool-registry.mock.js.map +0 -1
  547. package/src/auth/path.utils.d.ts +0 -20
  548. package/src/auth/path.utils.js +0 -71
  549. package/src/auth/path.utils.js.map +0 -1
  550. package/src/common/decorators-old/async-with.decorator.d.ts +0 -10
  551. package/src/common/decorators-old/async-with.decorator.js +0 -24
  552. package/src/common/decorators-old/async-with.decorator.js.map +0 -1
  553. package/src/common/decorators-old/auth-hook.decorator.d.ts +0 -14
  554. package/src/common/decorators-old/auth-hook.decorator.js +0 -27
  555. package/src/common/decorators-old/auth-hook.decorator.js.map +0 -1
  556. package/src/common/decorators-old/session-hook.decorator.d.ts +0 -14
  557. package/src/common/decorators-old/session-hook.decorator.js +0 -27
  558. package/src/common/decorators-old/session-hook.decorator.js.map +0 -1
@@ -4,10 +4,11 @@ exports.httpRequestStateSchema = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const common_1 = require("../../common");
6
6
  const zod_1 = require("zod");
7
- const path_utils_1 = require("../../auth/path.utils");
8
7
  const session_verify_flow_1 = require("../../auth/flows/session.verify.flow");
9
8
  const plan = {
10
9
  pre: [
10
+ // request tracing
11
+ 'traceRequest',
11
12
  // rate limiting / concurrency
12
13
  'acquireQuota',
13
14
  'acquireSemaphore',
@@ -21,6 +22,7 @@ const plan = {
21
22
  'handleStreamableHttp',
22
23
  'handleStatefulHttp',
23
24
  'handleStatelessHttp',
25
+ 'handleDeleteSession',
24
26
  ],
25
27
  finalize: [
26
28
  // audit/metrics
@@ -31,7 +33,7 @@ const plan = {
31
33
  'releaseQuota',
32
34
  'finalize',
33
35
  ],
34
- error: ['error'],
36
+ error: [],
35
37
  };
36
38
  exports.httpRequestStateSchema = zod_1.z.object({
37
39
  decision: common_1.decisionSchema,
@@ -42,106 +44,318 @@ const name = 'http:request';
42
44
  const { Stage } = (0, common_1.FlowHooksOf)('http:request');
43
45
  let HttpRequestFlow = class HttpRequestFlow extends common_1.FlowBase {
44
46
  logger = this.scope.logger.child('HttpRequestFlow');
47
+ requestStartTime = 0;
48
+ requestId = '';
45
49
  static canActivate(request, scope) {
46
- const requestPath = (0, path_utils_1.normalizeEntryPrefix)(request.path);
47
- const prefix = (0, path_utils_1.normalizeEntryPrefix)(scope.entryPath);
48
- const scopePath = (0, path_utils_1.normalizeScopeBase)(scope.routeBase);
49
- return requestPath === `${prefix}${scopePath}` || requestPath === `${prefix}${scopePath}/message`;
50
+ const requestPath = (0, common_1.normalizeEntryPrefix)(request.path);
51
+ const prefix = (0, common_1.normalizeEntryPrefix)(scope.entryPath);
52
+ const scopePath = (0, common_1.normalizeScopeBase)(scope.routeBase);
53
+ const basePath = `${prefix}${scopePath}`;
54
+ return (requestPath === basePath || // Modern transports: /
55
+ requestPath === `${basePath}/sse` || // Legacy SSE: /sse
56
+ requestPath === `${basePath}/message` // Legacy SSE: /message
57
+ );
58
+ }
59
+ async traceRequest() {
60
+ const { request } = this.rawInput;
61
+ this.requestStartTime = Date.now();
62
+ this.requestId = `req-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
63
+ // Extract useful tracing info
64
+ const userAgent = request.headers?.['user-agent'];
65
+ const sessionId = request.headers?.['mcp-session-id'];
66
+ const contentType = request.headers?.['content-type'];
67
+ const accept = request.headers?.['accept'];
68
+ const body = request.body;
69
+ this.logger.info(`[${this.requestId}] ▶ ${request.method} ${request.path}`, {
70
+ requestId: this.requestId,
71
+ method: request.method,
72
+ path: request.path,
73
+ userAgent: userAgent?.slice(0, 50),
74
+ sessionId: sessionId?.slice(0, 20),
75
+ contentType,
76
+ accept,
77
+ hasBody: !!request.body,
78
+ bodyMethod: body?.['method'],
79
+ });
80
+ // Log sanitized headers for debugging connection issues
81
+ const headers = request.headers ?? {};
82
+ const sanitizedHeaders = Object.fromEntries(Object.entries(headers).map(([key, value]) => {
83
+ // Redact clearly sensitive headers
84
+ if (/^(authorization|proxy-authorization|cookie|set-cookie|x-api-key)$/i.test(key)) {
85
+ return [key, '[REDACTED]'];
86
+ }
87
+ // Truncate session identifiers instead of logging full values
88
+ if (key === 'mcp-session-id') {
89
+ return [key, String(value).slice(0, 8) + '...'];
90
+ }
91
+ return [key, value];
92
+ }));
93
+ this.logger.debug(`[${this.requestId}] HEADERS`, { headers: sanitizedHeaders });
50
94
  }
51
95
  async checkAuthorization() {
52
96
  const { request } = this.rawInput;
53
- this.logger.info(`New request: ${request.method} ${request.path}`);
54
- const result = await this.scope.runFlow('session:verify', { request });
55
- if (!result) {
56
- this.logger.error('failed to to verify session');
57
- throw new Error('Session verification failed');
97
+ this.logger.verbose(`[${this.requestId}] checkAuthorization: verifying session`);
98
+ try {
99
+ const result = await this.scope.runFlow('session:verify', { request });
100
+ if (!result) {
101
+ this.logger.error(`[${this.requestId}] failed to verify session`);
102
+ throw new Error('Session verification failed');
103
+ }
104
+ this.state.set({
105
+ verifyResult: result,
106
+ });
107
+ }
108
+ catch (error) {
109
+ // FlowControl is expected control flow, not an error
110
+ if (!(error instanceof common_1.FlowControl)) {
111
+ this.logError(error, 'checkAuthorization');
112
+ }
113
+ throw error;
58
114
  }
59
- this.state.set({
60
- verifyResult: result,
61
- });
62
115
  }
63
116
  async router() {
64
- const { request } = this.rawInput;
65
- this.logger.verbose('check request decision');
66
- const decision = (0, common_1.decideIntent)(request, {
67
- enableLegacySSE: true,
68
- enableSseListener: true,
69
- enableStatelessHttp: false,
70
- enableStatefulHttp: false,
71
- enableStreamableHttp: true,
72
- requireSessionForStreamable: true,
73
- tolerateMissingAccept: true,
74
- });
75
- const { verifyResult } = this.state.required;
76
- if (verifyResult.kind === 'authorized') {
77
- const { authorization } = verifyResult;
78
- request[common_1.ServerRequestTokens.auth] = authorization;
79
- if (authorization.session) {
80
- request[common_1.ServerRequestTokens.sessionId] = authorization.session.id;
81
- const intent = authorization.session.payload.protocol;
82
- this.logger.info(`decision from session: ${intent}`);
83
- this.state.set('intent', intent);
117
+ try {
118
+ const { request } = this.rawInput;
119
+ this.logger.verbose(`[${this.requestId}] router: check request decision`);
120
+ // Use transport config directly from auth (already parsed with defaults by Zod)
121
+ const transport = this.scope.auth.transport;
122
+ const decision = (0, common_1.decideIntent)(request, { ...transport, tolerateMissingAccept: true });
123
+ // Handle DELETE method immediately - it's for session termination
124
+ // regardless of what protocol the session was created with
125
+ if (request.method.toUpperCase() === 'DELETE') {
126
+ this.logger.verbose(`[${this.requestId}] DELETE request, using decision intent: ${decision.intent}`);
127
+ if (decision.intent === 'unknown') {
128
+ // DELETE without session ID - forward to next middleware
129
+ // to allow custom DELETE handlers by developers
130
+ this.logger.verbose(`[${this.requestId}] DELETE with unknown intent, forwarding to next middleware`);
131
+ this.next();
132
+ return;
133
+ }
134
+ this.state.set('intent', decision.intent);
84
135
  return;
85
136
  }
86
- if (decision.intent === 'unknown') {
87
- // continue to other middleware
88
- // with authentication (public/authorized routes)
89
- this.logger.verbose(`decision is unknown, continue to next http middleware`);
90
- this.next();
137
+ const { verifyResult } = this.state.required;
138
+ if (verifyResult.kind === 'authorized') {
139
+ const { authorization } = verifyResult;
140
+ request[common_1.ServerRequestTokens.auth] = authorization;
141
+ if (authorization.session) {
142
+ const sessionId = authorization.session.id;
143
+ request[common_1.ServerRequestTokens.sessionId] = sessionId;
144
+ // Check if the session has been terminated (via DELETE)
145
+ // Per MCP spec, requests to terminated sessions should return 404
146
+ if (this.scope.notifications.isSessionTerminated(sessionId)) {
147
+ this.logger.warn(`[${this.requestId}] Request to terminated session: ${sessionId.slice(0, 20)}...`);
148
+ this.respond(common_1.httpRespond.notFound('Session not found'));
149
+ return;
150
+ }
151
+ // Safely access payload.protocol with null check
152
+ const protocol = authorization.session.payload?.protocol;
153
+ if (protocol) {
154
+ this.logger.info(`[${this.requestId}] decision from session: ${protocol}`);
155
+ this.state.set('intent', protocol);
156
+ return;
157
+ }
158
+ }
159
+ if (decision.intent === 'unknown') {
160
+ // continue to other middleware
161
+ // with authentication (public/authorized routes)
162
+ this.logger.verbose(`[${this.requestId}] decision is unknown, continue to next http middleware`);
163
+ this.next();
164
+ return; // Explicit return for clarity (this.next() throws FlowControl)
165
+ }
166
+ // register decision intent to state
167
+ // and move to next stage
168
+ this.logger.verbose(`[${this.requestId}] decision is request info: ${decision.intent}`);
169
+ this.state.set('intent', decision.intent);
170
+ }
171
+ else {
172
+ this.logger.verbose(`[${this.requestId}] not authorized request, check decision intent: ${decision.intent}`);
173
+ if (decision.intent === 'unknown') {
174
+ this.logger.verbose(`[${this.requestId}] decision is unknown, continue to other public http middleware`);
175
+ // continue to other middleware
176
+ // without authentication (public routes)
177
+ this.next();
178
+ return; // Explicit return for clarity (this.next() throws FlowControl)
179
+ }
180
+ this.logger.warn(`[${this.requestId}] decision is ${decision.intent}, but not authorized, respond with 401`);
181
+ // if the decision is specific mcp transport and no auth
182
+ // then respond with 401
183
+ this.respond(common_1.httpRespond.unauthorized({
184
+ headers: {
185
+ 'WWW-Authenticate': verifyResult.prmMetadataHeader,
186
+ },
187
+ }));
91
188
  }
92
- // register decision intent to state
93
- // and move to next stage
94
- this.logger.verbose(`decision is request info: ${decision.intent}`);
95
- this.state.set('intent', decision.intent);
96
189
  }
97
- else {
98
- this.logger.verbose(`not authorized request, check decision intent: ${decision.intent}`);
99
- if (decision.intent === 'unknown') {
100
- this.logger.verbose(`decision is unknown, continue to other public http middleware`);
101
- // continue to other middleware
102
- // without authentication (public routes)
103
- this.next();
104
- }
105
- this.logger.warn(`decision is ${decision.intent}, but not authorized, respond with 401`);
106
- // if the decision is specific mcp transport and no auth
107
- // then respond with 401
108
- this.respond(common_1.httpRespond.unauthorized({
109
- headers: {
110
- 'WWW-Authenticate': verifyResult.prmMetadataHeader,
111
- },
112
- }));
190
+ catch (error) {
191
+ // FlowControl is expected control flow, not an error
192
+ if (!(error instanceof common_1.FlowControl)) {
193
+ this.logError(error, 'router');
194
+ }
195
+ throw error;
113
196
  }
114
197
  }
115
198
  async handleLegacySse() {
116
- const response = await this.scope.runFlow('handle:legacy-sse', this.rawInput);
117
- if (response) {
118
- this.respond(response);
199
+ try {
200
+ const response = await this.scope.runFlow('handle:legacy-sse', this.rawInput);
201
+ if (response) {
202
+ this.respond(response);
203
+ }
204
+ this.handled();
205
+ }
206
+ catch (error) {
207
+ // FlowControl is expected control flow, not an error
208
+ if (!(error instanceof common_1.FlowControl)) {
209
+ this.logError(error, 'handleLegacySse');
210
+ }
211
+ throw error;
119
212
  }
120
- this.handled();
121
213
  }
122
214
  async handleSse() {
123
- const response = await this.scope.runFlow('handle:streamable-http', this.rawInput);
124
- if (response) {
125
- this.respond(response);
215
+ try {
216
+ const response = await this.scope.runFlow('handle:streamable-http', this.rawInput);
217
+ if (response) {
218
+ this.respond(response);
219
+ }
220
+ this.next();
221
+ }
222
+ catch (error) {
223
+ // FlowControl is expected control flow, not an error
224
+ if (!(error instanceof common_1.FlowControl)) {
225
+ this.logError(error, 'handleSse');
226
+ }
227
+ throw error;
126
228
  }
127
- this.next();
128
229
  }
129
230
  async handleStreamableHttp() {
130
- const response = await this.scope.runFlow('handle:streamable-http', this.rawInput);
131
- if (response) {
132
- this.respond(response);
231
+ try {
232
+ const response = await this.scope.runFlow('handle:streamable-http', this.rawInput);
233
+ if (response) {
234
+ this.respond(response);
235
+ }
236
+ this.next();
237
+ }
238
+ catch (error) {
239
+ // FlowControl is expected control flow, not an error
240
+ if (!(error instanceof common_1.FlowControl)) {
241
+ this.logError(error, 'handleStreamableHttp');
242
+ }
243
+ throw error;
133
244
  }
134
- this.next();
135
245
  }
136
246
  async handleStatefulHttp() {
137
247
  // this.scope.runFlow('mcp:transport:stateful-http', this.rawInput);
138
248
  this.next();
139
249
  }
140
250
  async handleStatelessHttp() {
141
- // this.scope.runFlow('mcp:transport:stateless-http', this.rawInput);
142
- this.next();
251
+ try {
252
+ const response = await this.scope.runFlow('handle:stateless-http', this.rawInput);
253
+ if (response) {
254
+ this.respond(response);
255
+ }
256
+ this.handled();
257
+ }
258
+ catch (error) {
259
+ // FlowControl is expected control flow, not an error
260
+ if (!(error instanceof common_1.FlowControl)) {
261
+ this.logError(error, 'handleStatelessHttp');
262
+ }
263
+ throw error;
264
+ }
265
+ }
266
+ async handleDeleteSession() {
267
+ try {
268
+ const { request } = this.rawInput;
269
+ // Headers are normalized to lowercase by the adapter
270
+ const sessionId = request[common_1.ServerRequestTokens.sessionId] ?? request.headers['mcp-session-id'];
271
+ if (!sessionId || typeof sessionId !== 'string') {
272
+ this.logger.warn(`[${this.requestId}] DELETE request without valid session ID`);
273
+ this.respond(common_1.httpRespond.rpcError('No valid session ID provided'));
274
+ return;
275
+ }
276
+ this.logger.info(`[${this.requestId}] DELETE session: ${sessionId}`);
277
+ // Terminate the session - this unregisters the server AND adds to terminated set
278
+ // This prevents future requests with this session ID from being accepted
279
+ const wasRegistered = this.scope.notifications.terminateSession(sessionId);
280
+ if (!wasRegistered) {
281
+ // Session not found - per MCP spec, return 404
282
+ // Note: We still added it to terminated set to prevent future use
283
+ this.logger.warn(`[${this.requestId}] Session not found for DELETE: ${sessionId}`);
284
+ this.respond(common_1.httpRespond.notFound('Session not found'));
285
+ return;
286
+ }
287
+ this.logger.info(`[${this.requestId}] Session terminated: ${sessionId}`);
288
+ this.respond(common_1.httpRespond.noContent());
289
+ }
290
+ catch (error) {
291
+ // FlowControl is expected control flow, not an error
292
+ if (!(error instanceof common_1.FlowControl)) {
293
+ this.logError(error, 'handleDeleteSession');
294
+ }
295
+ throw error;
296
+ }
297
+ }
298
+ async finalize() {
299
+ const { request } = this.rawInput;
300
+ const duration = Date.now() - this.requestStartTime;
301
+ const intent = this.state.get('intent') ?? 'unknown';
302
+ this.logger.info(`[${this.requestId}] ◀ ${request.method} ${request.path} completed in ${duration}ms`, {
303
+ requestId: this.requestId,
304
+ method: request.method,
305
+ path: request.path,
306
+ duration,
307
+ intent,
308
+ });
309
+ }
310
+ /**
311
+ * Log an error that occurred during request processing.
312
+ * Called from stage handlers that catch errors.
313
+ */
314
+ logError(error, context) {
315
+ const { request } = this.rawInput;
316
+ const duration = Date.now() - this.requestStartTime;
317
+ // Extract error details - handle various error shapes
318
+ const errorMessage = error instanceof Error ? error.message : String(error);
319
+ const errorName = error instanceof Error ? error.name : 'UnknownError';
320
+ const errorStack = error instanceof Error ? error.stack : undefined;
321
+ const body = request.body;
322
+ // For errors with empty messages, try to extract more info
323
+ const errorCode = error?.code;
324
+ const errorCause = error?.cause;
325
+ // Log comprehensive error info including stack trace
326
+ this.logger.error(`[${this.requestId}] ✖ ${request.method} ${request.path} failed${context ? ` in ${context}` : ''} after ${duration}ms: ${errorMessage || '(no message)'}`, {
327
+ requestId: this.requestId,
328
+ method: request.method,
329
+ path: request.path,
330
+ duration,
331
+ context,
332
+ error: {
333
+ name: errorName,
334
+ message: errorMessage || '(no message)',
335
+ code: errorCode,
336
+ cause: errorCause instanceof Error ? errorCause.message : errorCause,
337
+ stack: errorStack,
338
+ },
339
+ request: {
340
+ userAgent: request.headers?.['user-agent']?.slice(0, 50),
341
+ sessionId: request.headers?.['mcp-session-id']?.slice(0, 20),
342
+ contentType: request.headers?.['content-type'],
343
+ bodyMethod: body?.['method'],
344
+ bodyId: body?.['id'],
345
+ },
346
+ state: {
347
+ intent: this.state.get('intent'),
348
+ hasVerifyResult: !!this.state.get('verifyResult'),
349
+ },
350
+ });
143
351
  }
144
352
  };
353
+ tslib_1.__decorate([
354
+ Stage('traceRequest'),
355
+ tslib_1.__metadata("design:type", Function),
356
+ tslib_1.__metadata("design:paramtypes", []),
357
+ tslib_1.__metadata("design:returntype", Promise)
358
+ ], HttpRequestFlow.prototype, "traceRequest", null);
145
359
  tslib_1.__decorate([
146
360
  Stage('checkAuthorization'),
147
361
  tslib_1.__metadata("design:type", Function),
@@ -156,7 +370,7 @@ tslib_1.__decorate([
156
370
  ], HttpRequestFlow.prototype, "router", null);
157
371
  tslib_1.__decorate([
158
372
  Stage('handleLegacySse', {
159
- filter: ({ state: { required: { intent } } }) => intent === 'legacy-sse',
373
+ filter: ({ state: { required: { intent }, }, }) => intent === 'legacy-sse',
160
374
  }),
161
375
  tslib_1.__metadata("design:type", Function),
162
376
  tslib_1.__metadata("design:paramtypes", []),
@@ -164,7 +378,7 @@ tslib_1.__decorate([
164
378
  ], HttpRequestFlow.prototype, "handleLegacySse", null);
165
379
  tslib_1.__decorate([
166
380
  Stage('handleSse', {
167
- filter: ({ state: { required: { intent } } }) => intent === 'sse',
381
+ filter: ({ state: { required: { intent }, }, }) => intent === 'sse',
168
382
  }),
169
383
  tslib_1.__metadata("design:type", Function),
170
384
  tslib_1.__metadata("design:paramtypes", []),
@@ -172,7 +386,7 @@ tslib_1.__decorate([
172
386
  ], HttpRequestFlow.prototype, "handleSse", null);
173
387
  tslib_1.__decorate([
174
388
  Stage('handleStreamableHttp', {
175
- filter: ({ state: { required: { intent } } }) => intent === 'streamable-http',
389
+ filter: ({ state: { required: { intent }, }, }) => intent === 'streamable-http',
176
390
  }),
177
391
  tslib_1.__metadata("design:type", Function),
178
392
  tslib_1.__metadata("design:paramtypes", []),
@@ -180,7 +394,7 @@ tslib_1.__decorate([
180
394
  ], HttpRequestFlow.prototype, "handleStreamableHttp", null);
181
395
  tslib_1.__decorate([
182
396
  Stage('handleStatefulHttp', {
183
- filter: ({ state: { required: { intent } } }) => intent === 'stateful-http',
397
+ filter: ({ state: { required: { intent }, }, }) => intent === 'stateful-http',
184
398
  }),
185
399
  tslib_1.__metadata("design:type", Function),
186
400
  tslib_1.__metadata("design:paramtypes", []),
@@ -188,12 +402,26 @@ tslib_1.__decorate([
188
402
  ], HttpRequestFlow.prototype, "handleStatefulHttp", null);
189
403
  tslib_1.__decorate([
190
404
  Stage('handleStatelessHttp', {
191
- filter: ({ state: { required: { intent } } }) => intent === 'stateless-http',
405
+ filter: ({ state: { required: { intent }, }, }) => intent === 'stateless-http',
192
406
  }),
193
407
  tslib_1.__metadata("design:type", Function),
194
408
  tslib_1.__metadata("design:paramtypes", []),
195
409
  tslib_1.__metadata("design:returntype", Promise)
196
410
  ], HttpRequestFlow.prototype, "handleStatelessHttp", null);
411
+ tslib_1.__decorate([
412
+ Stage('handleDeleteSession', {
413
+ filter: ({ state: { required: { intent }, }, }) => intent === 'delete-session',
414
+ }),
415
+ tslib_1.__metadata("design:type", Function),
416
+ tslib_1.__metadata("design:paramtypes", []),
417
+ tslib_1.__metadata("design:returntype", Promise)
418
+ ], HttpRequestFlow.prototype, "handleDeleteSession", null);
419
+ tslib_1.__decorate([
420
+ Stage('finalize'),
421
+ tslib_1.__metadata("design:type", Function),
422
+ tslib_1.__metadata("design:paramtypes", []),
423
+ tslib_1.__metadata("design:returntype", Promise)
424
+ ], HttpRequestFlow.prototype, "finalize", null);
197
425
  HttpRequestFlow = tslib_1.__decorate([
198
426
  (0, common_1.Flow)({
199
427
  name,
@@ -1 +1 @@
1
- {"version":3,"file":"http.request.flow.js","sourceRoot":"","sources":["../../../../src/scope/flows/http.request.flow.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Flow, httpInputSchema, FlowRunOptions,\n httpOutputSchema,\n FlowPlan, FlowBase, ScopeEntry, FlowHooksOf, ServerRequest, ServerRequestTokens,\n httpRespond,\n decideIntent, decisionSchema, intentSchema,\n} from '../../common';\nimport {z} from 'zod';\nimport {normalizeEntryPrefix, normalizeScopeBase} from '../../auth/path.utils';\nimport {sessionVerifyOutputSchema} from '../../auth/flows/session.verify.flow';\n\nconst plan = {\n pre: [\n // rate limiting / concurrency\n 'acquireQuota',\n 'acquireSemaphore',\n // route request to the correct flow\n 'checkAuthorization',\n 'router',\n ],\n execute: [\n 'handleLegacySse',\n 'handleSse',\n 'handleStreamableHttp',\n 'handleStatefulHttp',\n 'handleStatelessHttp',\n ],\n finalize: [\n // audit/metrics\n 'audit',\n 'metrics',\n\n // cleanup\n 'releaseSemaphore',\n 'releaseQuota',\n 'finalize',\n ],\n error: ['error'],\n} as const satisfies FlowPlan<string>;\n\n\nexport const httpRequestStateSchema = z.object({\n decision: decisionSchema,\n intent: intentSchema,\n verifyResult: sessionVerifyOutputSchema,\n});\n\n\nconst name = 'http:request' as const;\nconst {Stage} = FlowHooksOf('http:request');\n\ndeclare global {\n interface ExtendFlows {\n 'http:request': FlowRunOptions<\n HttpRequestFlow,\n typeof plan,\n typeof httpInputSchema,\n typeof httpOutputSchema,\n typeof httpRequestStateSchema\n >;\n }\n}\n\n\n@Flow({\n name,\n plan,\n access: 'public',\n inputSchema: httpInputSchema,\n outputSchema: httpOutputSchema,\n middleware: {\n path: '/',\n },\n})\nexport default class HttpRequestFlow extends FlowBase<typeof name> {\n\n logger = this.scope.logger.child('HttpRequestFlow');\n\n static canActivate(request: ServerRequest, scope: ScopeEntry) {\n const requestPath = normalizeEntryPrefix(request.path);\n const prefix = normalizeEntryPrefix(scope.entryPath);\n const scopePath = normalizeScopeBase(scope.routeBase);\n return requestPath === `${prefix}${scopePath}` || requestPath === `${prefix}${scopePath}/message`;\n }\n\n @Stage('checkAuthorization')\n async checkAuthorization() {\n const {request} = this.rawInput;\n this.logger.info(`New request: ${request.method} ${request.path}`);\n\n const result = await this.scope.runFlow('session:verify', {request});\n if (!result) {\n this.logger.error('failed to to verify session');\n throw new Error('Session verification failed');\n }\n this.state.set({\n verifyResult: result,\n });\n\n }\n\n\n @Stage('router')\n async router() {\n const {request} = this.rawInput;\n this.logger.verbose('check request decision');\n const decision = decideIntent(request, {\n enableLegacySSE: true,\n enableSseListener: true,\n enableStatelessHttp: false,\n enableStatefulHttp: false,\n enableStreamableHttp: true,\n requireSessionForStreamable: true,\n tolerateMissingAccept: true,\n });\n\n const {verifyResult} = this.state.required;\n if (verifyResult.kind === 'authorized') {\n const {authorization} = verifyResult;\n request[ServerRequestTokens.auth] = authorization;\n if (authorization.session) {\n request[ServerRequestTokens.sessionId] = authorization.session.id;\n\n const intent = authorization.session.payload.protocol;\n this.logger.info(`decision from session: ${intent}`);\n this.state.set('intent', intent);\n return;\n }\n\n if (decision.intent === 'unknown') {\n // continue to other middleware\n // with authentication (public/authorized routes)\n this.logger.verbose(`decision is unknown, continue to next http middleware`);\n this.next();\n }\n\n // register decision intent to state\n // and move to next stage\n this.logger.verbose(`decision is request info: ${decision.intent}`);\n this.state.set('intent', decision.intent);\n } else {\n this.logger.verbose(`not authorized request, check decision intent: ${decision.intent}`);\n if (decision.intent === 'unknown') {\n this.logger.verbose(`decision is unknown, continue to other public http middleware`);\n // continue to other middleware\n // without authentication (public routes)\n this.next();\n }\n\n this.logger.warn(`decision is ${decision.intent}, but not authorized, respond with 401`);\n // if the decision is specific mcp transport and no auth\n // then respond with 401\n this.respond(httpRespond.unauthorized({\n headers: {\n 'WWW-Authenticate': verifyResult.prmMetadataHeader,\n },\n }));\n }\n\n }\n\n\n @Stage('handleLegacySse', {\n filter: ({state: {required: {intent}}}) =>\n intent === 'legacy-sse',\n })\n async handleLegacySse() {\n const response = await this.scope.runFlow('handle:legacy-sse', this.rawInput);\n if (response) {\n this.respond(response);\n }\n this.handled();\n }\n\n @Stage('handleSse', {\n filter: ({state: {required: {intent}}}) => intent === 'sse',\n })\n async handleSse() {\n const response = await this.scope.runFlow('handle:streamable-http', this.rawInput);\n if (response) {\n this.respond(response);\n }\n this.next();\n }\n\n @Stage('handleStreamableHttp', {\n filter: ({state: {required: {intent}}}) => intent === 'streamable-http',\n })\n async handleStreamableHttp() {\n const response = await this.scope.runFlow('handle:streamable-http', this.rawInput);\n if (response) {\n this.respond(response);\n }\n this.next();\n }\n\n @Stage('handleStatefulHttp', {\n filter: ({state: {required: {intent}}}) => intent === 'stateful-http',\n })\n async handleStatefulHttp() {\n // this.scope.runFlow('mcp:transport:stateful-http', this.rawInput);\n this.next();\n }\n\n @Stage('handleStatelessHttp', {\n filter: ({state: {required: {intent}}}) => intent === 'stateless-http',\n })\n async handleStatelessHttp() {\n // this.scope.runFlow('mcp:transport:stateless-http', this.rawInput);\n this.next();\n }\n\n}\n"]}
1
+ {"version":3,"file":"http.request.flow.js","sourceRoot":"","sources":["../../../../src/scope/flows/http.request.flow.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Flow,\n httpInputSchema,\n FlowRunOptions,\n httpOutputSchema,\n FlowPlan,\n FlowBase,\n ScopeEntry,\n FlowHooksOf,\n ServerRequest,\n ServerRequestTokens,\n httpRespond,\n decideIntent,\n decisionSchema,\n intentSchema,\n normalizeEntryPrefix,\n normalizeScopeBase,\n FlowControl,\n} from '../../common';\nimport { z } from 'zod';\nimport { sessionVerifyOutputSchema } from '../../auth/flows/session.verify.flow';\n\nconst plan = {\n pre: [\n // request tracing\n 'traceRequest',\n // rate limiting / concurrency\n 'acquireQuota',\n 'acquireSemaphore',\n // route request to the correct flow\n 'checkAuthorization',\n 'router',\n ],\n execute: [\n 'handleLegacySse',\n 'handleSse',\n 'handleStreamableHttp',\n 'handleStatefulHttp',\n 'handleStatelessHttp',\n 'handleDeleteSession',\n ],\n finalize: [\n // audit/metrics\n 'audit',\n 'metrics',\n\n // cleanup\n 'releaseSemaphore',\n 'releaseQuota',\n 'finalize',\n ],\n error: [],\n} as const satisfies FlowPlan<string>;\n\nexport const httpRequestStateSchema = z.object({\n decision: decisionSchema,\n intent: intentSchema,\n verifyResult: sessionVerifyOutputSchema,\n});\n\nconst name = 'http:request' as const;\nconst { Stage } = FlowHooksOf('http:request');\n\ndeclare global {\n interface ExtendFlows {\n 'http:request': FlowRunOptions<\n HttpRequestFlow,\n typeof plan,\n typeof httpInputSchema,\n typeof httpOutputSchema,\n typeof httpRequestStateSchema\n >;\n }\n}\n\n@Flow({\n name,\n plan,\n access: 'public',\n inputSchema: httpInputSchema,\n outputSchema: httpOutputSchema,\n middleware: {\n path: '/',\n },\n})\nexport default class HttpRequestFlow extends FlowBase<typeof name> {\n logger = this.scope.logger.child('HttpRequestFlow');\n private requestStartTime = 0;\n private requestId = '';\n\n static canActivate(request: ServerRequest, scope: ScopeEntry) {\n const requestPath = normalizeEntryPrefix(request.path);\n const prefix = normalizeEntryPrefix(scope.entryPath);\n const scopePath = normalizeScopeBase(scope.routeBase);\n const basePath = `${prefix}${scopePath}`;\n\n return (\n requestPath === basePath || // Modern transports: /\n requestPath === `${basePath}/sse` || // Legacy SSE: /sse\n requestPath === `${basePath}/message` // Legacy SSE: /message\n );\n }\n\n @Stage('traceRequest')\n async traceRequest() {\n const { request } = this.rawInput;\n this.requestStartTime = Date.now();\n this.requestId = `req-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n\n // Extract useful tracing info\n const userAgent = request.headers?.['user-agent'] as string | undefined;\n const sessionId = request.headers?.['mcp-session-id'] as string | undefined;\n const contentType = request.headers?.['content-type'] as string | undefined;\n const accept = request.headers?.['accept'] as string | undefined;\n\n const body = request.body as Record<string, unknown> | undefined;\n this.logger.info(`[${this.requestId}] ▶ ${request.method} ${request.path}`, {\n requestId: this.requestId,\n method: request.method,\n path: request.path,\n userAgent: userAgent?.slice(0, 50),\n sessionId: sessionId?.slice(0, 20),\n contentType,\n accept,\n hasBody: !!request.body,\n bodyMethod: body?.['method'],\n });\n\n // Log sanitized headers for debugging connection issues\n const headers = request.headers ?? {};\n const sanitizedHeaders = Object.fromEntries(\n Object.entries(headers).map(([key, value]) => {\n // Redact clearly sensitive headers\n if (/^(authorization|proxy-authorization|cookie|set-cookie|x-api-key)$/i.test(key)) {\n return [key, '[REDACTED]'];\n }\n // Truncate session identifiers instead of logging full values\n if (key === 'mcp-session-id') {\n return [key, String(value).slice(0, 8) + '...'];\n }\n return [key, value];\n }),\n );\n this.logger.debug(`[${this.requestId}] HEADERS`, { headers: sanitizedHeaders });\n }\n\n @Stage('checkAuthorization')\n async checkAuthorization() {\n const { request } = this.rawInput;\n this.logger.verbose(`[${this.requestId}] checkAuthorization: verifying session`);\n\n try {\n const result = await this.scope.runFlow('session:verify', { request });\n if (!result) {\n this.logger.error(`[${this.requestId}] failed to verify session`);\n throw new Error('Session verification failed');\n }\n this.state.set({\n verifyResult: result,\n });\n } catch (error) {\n // FlowControl is expected control flow, not an error\n if (!(error instanceof FlowControl)) {\n this.logError(error, 'checkAuthorization');\n }\n throw error;\n }\n }\n\n @Stage('router')\n async router() {\n try {\n const { request } = this.rawInput;\n this.logger.verbose(`[${this.requestId}] router: check request decision`);\n\n // Use transport config directly from auth (already parsed with defaults by Zod)\n const transport = this.scope.auth.transport;\n const decision = decideIntent(request, { ...transport, tolerateMissingAccept: true });\n\n // Handle DELETE method immediately - it's for session termination\n // regardless of what protocol the session was created with\n if (request.method.toUpperCase() === 'DELETE') {\n this.logger.verbose(`[${this.requestId}] DELETE request, using decision intent: ${decision.intent}`);\n if (decision.intent === 'unknown') {\n // DELETE without session ID - forward to next middleware\n // to allow custom DELETE handlers by developers\n this.logger.verbose(`[${this.requestId}] DELETE with unknown intent, forwarding to next middleware`);\n this.next();\n return;\n }\n this.state.set('intent', decision.intent);\n return;\n }\n\n const { verifyResult } = this.state.required;\n if (verifyResult.kind === 'authorized') {\n const { authorization } = verifyResult;\n request[ServerRequestTokens.auth] = authorization;\n if (authorization.session) {\n const sessionId = authorization.session.id;\n request[ServerRequestTokens.sessionId] = sessionId;\n\n // Check if the session has been terminated (via DELETE)\n // Per MCP spec, requests to terminated sessions should return 404\n if (this.scope.notifications.isSessionTerminated(sessionId)) {\n this.logger.warn(`[${this.requestId}] Request to terminated session: ${sessionId.slice(0, 20)}...`);\n this.respond(httpRespond.notFound('Session not found'));\n return;\n }\n\n // Safely access payload.protocol with null check\n const protocol = authorization.session.payload?.protocol;\n if (protocol) {\n this.logger.info(`[${this.requestId}] decision from session: ${protocol}`);\n this.state.set('intent', protocol);\n return;\n }\n }\n\n if (decision.intent === 'unknown') {\n // continue to other middleware\n // with authentication (public/authorized routes)\n this.logger.verbose(`[${this.requestId}] decision is unknown, continue to next http middleware`);\n this.next();\n return; // Explicit return for clarity (this.next() throws FlowControl)\n }\n\n // register decision intent to state\n // and move to next stage\n this.logger.verbose(`[${this.requestId}] decision is request info: ${decision.intent}`);\n this.state.set('intent', decision.intent);\n } else {\n this.logger.verbose(`[${this.requestId}] not authorized request, check decision intent: ${decision.intent}`);\n if (decision.intent === 'unknown') {\n this.logger.verbose(`[${this.requestId}] decision is unknown, continue to other public http middleware`);\n // continue to other middleware\n // without authentication (public routes)\n this.next();\n return; // Explicit return for clarity (this.next() throws FlowControl)\n }\n\n this.logger.warn(`[${this.requestId}] decision is ${decision.intent}, but not authorized, respond with 401`);\n // if the decision is specific mcp transport and no auth\n // then respond with 401\n this.respond(\n httpRespond.unauthorized({\n headers: {\n 'WWW-Authenticate': verifyResult.prmMetadataHeader,\n },\n }),\n );\n }\n } catch (error) {\n // FlowControl is expected control flow, not an error\n if (!(error instanceof FlowControl)) {\n this.logError(error, 'router');\n }\n throw error;\n }\n }\n\n @Stage('handleLegacySse', {\n filter: ({\n state: {\n required: { intent },\n },\n }) => intent === 'legacy-sse',\n })\n async handleLegacySse() {\n try {\n const response = await this.scope.runFlow('handle:legacy-sse', this.rawInput);\n if (response) {\n this.respond(response);\n }\n this.handled();\n } catch (error) {\n // FlowControl is expected control flow, not an error\n if (!(error instanceof FlowControl)) {\n this.logError(error, 'handleLegacySse');\n }\n throw error;\n }\n }\n\n @Stage('handleSse', {\n filter: ({\n state: {\n required: { intent },\n },\n }) => intent === 'sse',\n })\n async handleSse() {\n try {\n const response = await this.scope.runFlow('handle:streamable-http', this.rawInput);\n if (response) {\n this.respond(response);\n }\n this.next();\n } catch (error) {\n // FlowControl is expected control flow, not an error\n if (!(error instanceof FlowControl)) {\n this.logError(error, 'handleSse');\n }\n throw error;\n }\n }\n\n @Stage('handleStreamableHttp', {\n filter: ({\n state: {\n required: { intent },\n },\n }) => intent === 'streamable-http',\n })\n async handleStreamableHttp() {\n try {\n const response = await this.scope.runFlow('handle:streamable-http', this.rawInput);\n if (response) {\n this.respond(response);\n }\n this.next();\n } catch (error) {\n // FlowControl is expected control flow, not an error\n if (!(error instanceof FlowControl)) {\n this.logError(error, 'handleStreamableHttp');\n }\n throw error;\n }\n }\n\n @Stage('handleStatefulHttp', {\n filter: ({\n state: {\n required: { intent },\n },\n }) => intent === 'stateful-http',\n })\n async handleStatefulHttp() {\n // this.scope.runFlow('mcp:transport:stateful-http', this.rawInput);\n this.next();\n }\n\n @Stage('handleStatelessHttp', {\n filter: ({\n state: {\n required: { intent },\n },\n }) => intent === 'stateless-http',\n })\n async handleStatelessHttp() {\n try {\n const response = await this.scope.runFlow('handle:stateless-http', this.rawInput);\n if (response) {\n this.respond(response);\n }\n this.handled();\n } catch (error) {\n // FlowControl is expected control flow, not an error\n if (!(error instanceof FlowControl)) {\n this.logError(error, 'handleStatelessHttp');\n }\n throw error;\n }\n }\n\n @Stage('handleDeleteSession', {\n filter: ({\n state: {\n required: { intent },\n },\n }) => intent === 'delete-session',\n })\n async handleDeleteSession() {\n try {\n const { request } = this.rawInput;\n // Headers are normalized to lowercase by the adapter\n const sessionId = request[ServerRequestTokens.sessionId] ?? request.headers['mcp-session-id'];\n\n if (!sessionId || typeof sessionId !== 'string') {\n this.logger.warn(`[${this.requestId}] DELETE request without valid session ID`);\n this.respond(httpRespond.rpcError('No valid session ID provided'));\n return;\n }\n\n this.logger.info(`[${this.requestId}] DELETE session: ${sessionId}`);\n\n // Terminate the session - this unregisters the server AND adds to terminated set\n // This prevents future requests with this session ID from being accepted\n const wasRegistered = this.scope.notifications.terminateSession(sessionId);\n\n if (!wasRegistered) {\n // Session not found - per MCP spec, return 404\n // Note: We still added it to terminated set to prevent future use\n this.logger.warn(`[${this.requestId}] Session not found for DELETE: ${sessionId}`);\n this.respond(httpRespond.notFound('Session not found'));\n return;\n }\n\n this.logger.info(`[${this.requestId}] Session terminated: ${sessionId}`);\n this.respond(httpRespond.noContent());\n } catch (error) {\n // FlowControl is expected control flow, not an error\n if (!(error instanceof FlowControl)) {\n this.logError(error, 'handleDeleteSession');\n }\n throw error;\n }\n }\n\n @Stage('finalize')\n async finalize() {\n const { request } = this.rawInput;\n const duration = Date.now() - this.requestStartTime;\n const intent = this.state.get('intent') ?? 'unknown';\n\n this.logger.info(`[${this.requestId}] ◀ ${request.method} ${request.path} completed in ${duration}ms`, {\n requestId: this.requestId,\n method: request.method,\n path: request.path,\n duration,\n intent,\n });\n }\n\n /**\n * Log an error that occurred during request processing.\n * Called from stage handlers that catch errors.\n */\n private logError(error: unknown, context?: string) {\n const { request } = this.rawInput;\n const duration = Date.now() - this.requestStartTime;\n\n // Extract error details - handle various error shapes\n const errorMessage = error instanceof Error ? error.message : String(error);\n const errorName = error instanceof Error ? error.name : 'UnknownError';\n const errorStack = error instanceof Error ? error.stack : undefined;\n const body = request.body as Record<string, unknown> | undefined;\n\n // For errors with empty messages, try to extract more info\n const errorCode = (error as { code?: string | number })?.code;\n const errorCause = (error as { cause?: unknown })?.cause;\n\n // Log comprehensive error info including stack trace\n this.logger.error(\n `[${this.requestId}] ✖ ${request.method} ${request.path} failed${\n context ? ` in ${context}` : ''\n } after ${duration}ms: ${errorMessage || '(no message)'}`,\n {\n requestId: this.requestId,\n method: request.method,\n path: request.path,\n duration,\n context,\n error: {\n name: errorName,\n message: errorMessage || '(no message)',\n code: errorCode,\n cause: errorCause instanceof Error ? errorCause.message : errorCause,\n stack: errorStack,\n },\n request: {\n userAgent: (request.headers?.['user-agent'] as string)?.slice(0, 50),\n sessionId: (request.headers?.['mcp-session-id'] as string)?.slice(0, 20),\n contentType: request.headers?.['content-type'],\n bodyMethod: body?.['method'],\n bodyId: body?.['id'],\n },\n state: {\n intent: this.state.get('intent'),\n hasVerifyResult: !!this.state.get('verifyResult'),\n },\n },\n );\n }\n}\n"]}
@@ -5,6 +5,10 @@ import ProviderRegistry from '../provider/provider.registry';
5
5
  import { AuthRegistry } from '../auth/auth.registry';
6
6
  import { TransportService } from '../transport/transport.registry';
7
7
  import ToolRegistry from '../tool/tool.registry';
8
+ import ResourceRegistry from '../resource/resource.registry';
9
+ import PromptRegistry from '../prompt/prompt.registry';
10
+ import { NotificationService } from '../notification';
11
+ import { ToolUIRegistry } from '../tool/ui';
8
12
  export declare class Scope extends ScopeEntry {
9
13
  readonly id: string;
10
14
  private readonly globalProviders;
@@ -15,7 +19,11 @@ export declare class Scope extends ScopeEntry {
15
19
  private scopeApps;
16
20
  private scopeHooks;
17
21
  private scopeTools;
22
+ private scopeResources;
23
+ private scopePrompts;
18
24
  transportService: TransportService;
25
+ notificationService: NotificationService;
26
+ private toolUIRegistry;
19
27
  readonly entryPath: string;
20
28
  readonly routeBase: string;
21
29
  readonly orchestrated: boolean;
@@ -29,6 +37,10 @@ export declare class Scope extends ScopeEntry {
29
37
  get providers(): ProviderRegistry;
30
38
  get apps(): AppRegistry;
31
39
  get tools(): ToolRegistry;
40
+ get toolUI(): ToolUIRegistry;
41
+ get resources(): ResourceRegistry;
42
+ get prompts(): PromptRegistry;
43
+ get notifications(): NotificationService;
32
44
  registryFlows(...flows: FlowType[]): Promise<void>;
33
45
  runFlow<Name extends FlowName>(name: Name, input: FlowInputOf<Name>, deps?: Map<Token, Type>): Promise<FlowOutputOf<Name> | undefined>;
34
46
  runFlowForOutput<Name extends FlowName>(name: Name, input: FlowInputOf<Name>, deps?: Map<Token, Type>): Promise<FlowOutputOf<Name>>;