@rekog/mcp-nest 1.9.10 → 2.0.0-alpha.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 (364) hide show
  1. package/README.md +76 -29
  2. package/dist/index.d.ts +0 -1
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +0 -1
  5. package/dist/index.js.map +1 -1
  6. package/dist/mcp/decorators/constants.d.ts +1 -0
  7. package/dist/mcp/decorators/constants.d.ts.map +1 -1
  8. package/dist/mcp/decorators/constants.js +2 -1
  9. package/dist/mcp/decorators/constants.js.map +1 -1
  10. package/dist/mcp/decorators/index.d.ts +3 -1
  11. package/dist/mcp/decorators/index.d.ts.map +1 -1
  12. package/dist/mcp/decorators/index.js +3 -1
  13. package/dist/mcp/decorators/index.js.map +1 -1
  14. package/dist/mcp/decorators/mcp-controller.decorator.d.ts +6 -0
  15. package/dist/mcp/decorators/mcp-controller.decorator.d.ts.map +1 -0
  16. package/dist/mcp/decorators/mcp-controller.decorator.js +43 -0
  17. package/dist/mcp/decorators/mcp-controller.decorator.js.map +1 -0
  18. package/dist/mcp/decorators/mcp-message-pattern.d.ts +3 -0
  19. package/dist/mcp/decorators/mcp-message-pattern.d.ts.map +1 -0
  20. package/dist/mcp/decorators/mcp-message-pattern.js +13 -0
  21. package/dist/mcp/decorators/mcp-message-pattern.js.map +1 -0
  22. package/dist/mcp/decorators/prompt.decorator.d.ts +1 -1
  23. package/dist/mcp/decorators/prompt.decorator.d.ts.map +1 -1
  24. package/dist/mcp/decorators/prompt.decorator.js +2 -1
  25. package/dist/mcp/decorators/prompt.decorator.js.map +1 -1
  26. package/dist/mcp/decorators/public.decorator.js.map +1 -1
  27. package/dist/mcp/decorators/raw-request.decorator.d.ts +2 -0
  28. package/dist/mcp/decorators/raw-request.decorator.d.ts.map +1 -0
  29. package/dist/mcp/decorators/raw-request.decorator.js +6 -0
  30. package/dist/mcp/decorators/raw-request.decorator.js.map +1 -0
  31. package/dist/mcp/decorators/resource-template.decorator.d.ts +1 -1
  32. package/dist/mcp/decorators/resource-template.decorator.d.ts.map +1 -1
  33. package/dist/mcp/decorators/resource-template.decorator.js +2 -1
  34. package/dist/mcp/decorators/resource-template.decorator.js.map +1 -1
  35. package/dist/mcp/decorators/resource.decorator.d.ts +1 -1
  36. package/dist/mcp/decorators/resource.decorator.d.ts.map +1 -1
  37. package/dist/mcp/decorators/resource.decorator.js +2 -1
  38. package/dist/mcp/decorators/resource.decorator.js.map +1 -1
  39. package/dist/mcp/decorators/tool.decorator.d.ts +1 -3
  40. package/dist/mcp/decorators/tool.decorator.d.ts.map +1 -1
  41. package/dist/mcp/decorators/tool.decorator.js +2 -1
  42. package/dist/mcp/decorators/tool.decorator.js.map +1 -1
  43. package/dist/mcp/filters/mcp-exception.filter.d.ts +6 -0
  44. package/dist/mcp/filters/mcp-exception.filter.d.ts.map +1 -0
  45. package/dist/mcp/filters/mcp-exception.filter.js +26 -0
  46. package/dist/mcp/filters/mcp-exception.filter.js.map +1 -0
  47. package/dist/mcp/index.d.ts +11 -7
  48. package/dist/mcp/index.d.ts.map +1 -1
  49. package/dist/mcp/index.js +11 -7
  50. package/dist/mcp/index.js.map +1 -1
  51. package/dist/mcp/interfaces/authenticated-user.interface.d.ts +9 -0
  52. package/dist/mcp/interfaces/authenticated-user.interface.d.ts.map +1 -0
  53. package/dist/{authz/interfaces/request-with-user.js → mcp/interfaces/authenticated-user.interface.js} +1 -1
  54. package/dist/mcp/interfaces/authenticated-user.interface.js.map +1 -0
  55. package/dist/mcp/interfaces/dynamic-prompt.interface.d.ts +1 -1
  56. package/dist/mcp/interfaces/dynamic-prompt.interface.d.ts.map +1 -1
  57. package/dist/mcp/interfaces/dynamic-prompt.interface.js.map +1 -1
  58. package/dist/mcp/interfaces/dynamic-resource.interface.d.ts +1 -1
  59. package/dist/mcp/interfaces/dynamic-resource.interface.d.ts.map +1 -1
  60. package/dist/mcp/interfaces/dynamic-resource.interface.js.map +1 -1
  61. package/dist/mcp/interfaces/dynamic-tool.interface.d.ts +1 -1
  62. package/dist/mcp/interfaces/dynamic-tool.interface.d.ts.map +1 -1
  63. package/dist/mcp/interfaces/dynamic-tool.interface.js.map +1 -1
  64. package/dist/mcp/interfaces/index.d.ts +2 -2
  65. package/dist/mcp/interfaces/index.d.ts.map +1 -1
  66. package/dist/mcp/interfaces/index.js +0 -3
  67. package/dist/mcp/interfaces/index.js.map +1 -1
  68. package/dist/mcp/services/tool-authorization.service.d.ts +7 -5
  69. package/dist/mcp/services/tool-authorization.service.d.ts.map +1 -1
  70. package/dist/mcp/services/tool-authorization.service.js +9 -6
  71. package/dist/mcp/services/tool-authorization.service.js.map +1 -1
  72. package/dist/mcp/transport/mcp-context.d.ts +34 -0
  73. package/dist/mcp/transport/mcp-context.d.ts.map +1 -0
  74. package/dist/mcp/transport/mcp-context.js +74 -0
  75. package/dist/mcp/transport/mcp-context.js.map +1 -0
  76. package/dist/mcp/transport/mcp-http-handler.d.ts +7 -0
  77. package/dist/mcp/transport/mcp-http-handler.d.ts.map +1 -0
  78. package/dist/mcp/transport/mcp-http-handler.js +5 -0
  79. package/dist/mcp/transport/mcp-http-handler.js.map +1 -0
  80. package/dist/mcp/transport/mcp-server-options.interface.d.ts +23 -0
  81. package/dist/mcp/transport/mcp-server-options.interface.d.ts.map +1 -0
  82. package/dist/{authz/providers/oauth-provider.interface.js → mcp/transport/mcp-server-options.interface.js} +1 -1
  83. package/dist/mcp/transport/mcp-server-options.interface.js.map +1 -0
  84. package/dist/mcp/transport/mcp-transport.constants.d.ts +19 -0
  85. package/dist/mcp/transport/mcp-transport.constants.d.ts.map +1 -0
  86. package/dist/mcp/transport/mcp-transport.constants.js +21 -0
  87. package/dist/mcp/transport/mcp-transport.constants.js.map +1 -0
  88. package/dist/mcp/transport/mcp-transport.interface.d.ts +17 -0
  89. package/dist/mcp/transport/mcp-transport.interface.d.ts.map +1 -0
  90. package/dist/{authz/interfaces/oauth-common.interface.js → mcp/transport/mcp-transport.interface.js} +1 -1
  91. package/dist/mcp/transport/mcp-transport.interface.js.map +1 -0
  92. package/dist/mcp/transport/mcp.strategy.d.ts +56 -0
  93. package/dist/mcp/transport/mcp.strategy.d.ts.map +1 -0
  94. package/dist/mcp/transport/mcp.strategy.js +446 -0
  95. package/dist/mcp/transport/mcp.strategy.js.map +1 -0
  96. package/dist/mcp/transport/resource-matcher.d.ts +13 -0
  97. package/dist/mcp/transport/resource-matcher.d.ts.map +1 -0
  98. package/dist/mcp/transport/resource-matcher.js +83 -0
  99. package/dist/mcp/transport/resource-matcher.js.map +1 -0
  100. package/dist/mcp/transport/streamable-http.controller.d.ts +16 -0
  101. package/dist/mcp/transport/streamable-http.controller.d.ts.map +1 -0
  102. package/dist/mcp/transport/streamable-http.controller.js +98 -0
  103. package/dist/mcp/transport/streamable-http.controller.js.map +1 -0
  104. package/dist/mcp/transport/transports/index.d.ts +3 -0
  105. package/dist/mcp/transport/transports/index.d.ts.map +1 -0
  106. package/dist/{authz → mcp/transport/transports}/index.js +2 -10
  107. package/dist/mcp/transport/transports/index.js.map +1 -0
  108. package/dist/mcp/transport/transports/read-body.d.ts +3 -0
  109. package/dist/mcp/transport/transports/read-body.d.ts.map +1 -0
  110. package/dist/mcp/transport/transports/read-body.js +32 -0
  111. package/dist/mcp/transport/transports/read-body.js.map +1 -0
  112. package/dist/mcp/transport/transports/stdio.transport.d.ts +9 -0
  113. package/dist/mcp/transport/transports/stdio.transport.d.ts.map +1 -0
  114. package/dist/mcp/transport/transports/stdio.transport.js +27 -0
  115. package/dist/mcp/transport/transports/stdio.transport.js.map +1 -0
  116. package/dist/mcp/transport/transports/streamable-http.transport.d.ts +33 -0
  117. package/dist/mcp/transport/transports/streamable-http.transport.d.ts.map +1 -0
  118. package/dist/mcp/transport/transports/streamable-http.transport.js +216 -0
  119. package/dist/mcp/transport/transports/streamable-http.transport.js.map +1 -0
  120. package/dist/mcp/utils/mcp-logger.factory.d.ts +6 -2
  121. package/dist/mcp/utils/mcp-logger.factory.d.ts.map +1 -1
  122. package/dist/mcp/utils/mcp-logger.factory.js.map +1 -1
  123. package/package.json +3 -66
  124. package/src/index.ts +0 -1
  125. package/src/mcp/decorators/constants.ts +1 -0
  126. package/src/mcp/decorators/index.ts +3 -1
  127. package/src/mcp/decorators/mcp-controller.decorator.ts +126 -0
  128. package/src/mcp/decorators/mcp-message-pattern.ts +38 -0
  129. package/src/mcp/decorators/prompt.decorator.ts +6 -2
  130. package/src/mcp/decorators/public.decorator.ts +3 -3
  131. package/src/mcp/decorators/raw-request.decorator.ts +32 -0
  132. package/src/mcp/decorators/resource-template.decorator.ts +6 -2
  133. package/src/mcp/decorators/resource.decorator.ts +6 -2
  134. package/src/mcp/decorators/tool.decorator.ts +6 -3
  135. package/src/mcp/filters/mcp-exception.filter.ts +47 -0
  136. package/src/mcp/index.ts +13 -7
  137. package/src/mcp/interfaces/authenticated-user.interface.ts +22 -0
  138. package/src/mcp/interfaces/dynamic-prompt.interface.ts +1 -1
  139. package/src/mcp/interfaces/dynamic-resource.interface.ts +1 -1
  140. package/src/mcp/interfaces/dynamic-tool.interface.ts +2 -2
  141. package/src/mcp/interfaces/index.ts +3 -7
  142. package/src/mcp/services/tool-authorization.service.ts +52 -72
  143. package/src/mcp/transport/mcp-context.ts +138 -0
  144. package/src/mcp/transport/mcp-http-handler.ts +32 -0
  145. package/src/mcp/transport/mcp-server-options.interface.ts +75 -0
  146. package/src/mcp/transport/mcp-transport.constants.ts +99 -0
  147. package/src/mcp/transport/mcp-transport.interface.ts +50 -0
  148. package/src/mcp/transport/mcp.strategy.ts +752 -0
  149. package/src/mcp/transport/resource-matcher.ts +107 -0
  150. package/src/mcp/transport/streamable-http.controller.ts +114 -0
  151. package/src/mcp/transport/transports/index.ts +2 -0
  152. package/src/mcp/transport/transports/read-body.ts +39 -0
  153. package/src/mcp/transport/transports/stdio.transport.ts +35 -0
  154. package/src/mcp/transport/transports/streamable-http.transport.ts +384 -0
  155. package/src/mcp/utils/mcp-logger.factory.spec.ts +8 -22
  156. package/src/mcp/utils/mcp-logger.factory.ts +13 -2
  157. package/dist/authz/guards/jwt-auth.guard.d.ts +0 -19
  158. package/dist/authz/guards/jwt-auth.guard.d.ts.map +0 -1
  159. package/dist/authz/guards/jwt-auth.guard.js +0 -108
  160. package/dist/authz/guards/jwt-auth.guard.js.map +0 -1
  161. package/dist/authz/index.d.ts +0 -11
  162. package/dist/authz/index.d.ts.map +0 -1
  163. package/dist/authz/index.js.map +0 -1
  164. package/dist/authz/interfaces/oauth-common.interface.d.ts +0 -21
  165. package/dist/authz/interfaces/oauth-common.interface.d.ts.map +0 -1
  166. package/dist/authz/interfaces/oauth-common.interface.js.map +0 -1
  167. package/dist/authz/interfaces/request-with-user.d.ts +0 -13
  168. package/dist/authz/interfaces/request-with-user.d.ts.map +0 -1
  169. package/dist/authz/interfaces/request-with-user.js.map +0 -1
  170. package/dist/authz/mcp-oauth.controller.d.ts +0 -81
  171. package/dist/authz/mcp-oauth.controller.d.ts.map +0 -1
  172. package/dist/authz/mcp-oauth.controller.js +0 -540
  173. package/dist/authz/mcp-oauth.controller.js.map +0 -1
  174. package/dist/authz/mcp-oauth.module.d.ts +0 -12
  175. package/dist/authz/mcp-oauth.module.d.ts.map +0 -1
  176. package/dist/authz/mcp-oauth.module.js +0 -271
  177. package/dist/authz/mcp-oauth.module.js.map +0 -1
  178. package/dist/authz/providers/azure-ad.provider.d.ts +0 -3
  179. package/dist/authz/providers/azure-ad.provider.d.ts.map +0 -1
  180. package/dist/authz/providers/azure-ad.provider.js +0 -37
  181. package/dist/authz/providers/azure-ad.provider.js.map +0 -1
  182. package/dist/authz/providers/github.provider.d.ts +0 -3
  183. package/dist/authz/providers/github.provider.d.ts.map +0 -1
  184. package/dist/authz/providers/github.provider.js +0 -24
  185. package/dist/authz/providers/github.provider.js.map +0 -1
  186. package/dist/authz/providers/google.provider.d.ts +0 -3
  187. package/dist/authz/providers/google.provider.d.ts.map +0 -1
  188. package/dist/authz/providers/google.provider.js +0 -25
  189. package/dist/authz/providers/google.provider.js.map +0 -1
  190. package/dist/authz/providers/oauth-provider.interface.d.ts +0 -107
  191. package/dist/authz/providers/oauth-provider.interface.d.ts.map +0 -1
  192. package/dist/authz/providers/oauth-provider.interface.js.map +0 -1
  193. package/dist/authz/services/client.service.d.ts +0 -12
  194. package/dist/authz/services/client.service.d.ts.map +0 -1
  195. package/dist/authz/services/client.service.js +0 -81
  196. package/dist/authz/services/client.service.js.map +0 -1
  197. package/dist/authz/services/jwt-token.service.d.ts +0 -37
  198. package/dist/authz/services/jwt-token.service.d.ts.map +0 -1
  199. package/dist/authz/services/jwt-token.service.js +0 -182
  200. package/dist/authz/services/jwt-token.service.js.map +0 -1
  201. package/dist/authz/services/oauth-strategy.service.d.ts +0 -13
  202. package/dist/authz/services/oauth-strategy.service.d.ts.map +0 -1
  203. package/dist/authz/services/oauth-strategy.service.js +0 -71
  204. package/dist/authz/services/oauth-strategy.service.js.map +0 -1
  205. package/dist/authz/stores/memory-store.service.d.ts +0 -27
  206. package/dist/authz/stores/memory-store.service.d.ts.map +0 -1
  207. package/dist/authz/stores/memory-store.service.js +0 -107
  208. package/dist/authz/stores/memory-store.service.js.map +0 -1
  209. package/dist/authz/stores/oauth-store.interface.d.ts +0 -61
  210. package/dist/authz/stores/oauth-store.interface.d.ts.map +0 -1
  211. package/dist/authz/stores/oauth-store.interface.js +0 -5
  212. package/dist/authz/stores/oauth-store.interface.js.map +0 -1
  213. package/dist/authz/stores/typeorm/constants.d.ts +0 -3
  214. package/dist/authz/stores/typeorm/constants.d.ts.map +0 -1
  215. package/dist/authz/stores/typeorm/constants.js +0 -6
  216. package/dist/authz/stores/typeorm/constants.js.map +0 -1
  217. package/dist/authz/stores/typeorm/entities/authorization-code.entity.d.ts +0 -15
  218. package/dist/authz/stores/typeorm/entities/authorization-code.entity.d.ts.map +0 -1
  219. package/dist/authz/stores/typeorm/entities/authorization-code.entity.js +0 -69
  220. package/dist/authz/stores/typeorm/entities/authorization-code.entity.js.map +0 -1
  221. package/dist/authz/stores/typeorm/entities/index.d.ts +0 -5
  222. package/dist/authz/stores/typeorm/entities/index.d.ts.map +0 -1
  223. package/dist/authz/stores/typeorm/entities/index.js +0 -12
  224. package/dist/authz/stores/typeorm/entities/index.js.map +0 -1
  225. package/dist/authz/stores/typeorm/entities/oauth-client.entity.d.ts +0 -17
  226. package/dist/authz/stores/typeorm/entities/oauth-client.entity.d.ts.map +0 -1
  227. package/dist/authz/stores/typeorm/entities/oauth-client.entity.js +0 -77
  228. package/dist/authz/stores/typeorm/entities/oauth-client.entity.js.map +0 -1
  229. package/dist/authz/stores/typeorm/entities/oauth-session.entity.d.ts +0 -14
  230. package/dist/authz/stores/typeorm/entities/oauth-session.entity.d.ts.map +0 -1
  231. package/dist/authz/stores/typeorm/entities/oauth-session.entity.js +0 -65
  232. package/dist/authz/stores/typeorm/entities/oauth-session.entity.js.map +0 -1
  233. package/dist/authz/stores/typeorm/entities/user-profile.entity.d.ts +0 -13
  234. package/dist/authz/stores/typeorm/entities/user-profile.entity.d.ts.map +0 -1
  235. package/dist/authz/stores/typeorm/entities/user-profile.entity.js +0 -62
  236. package/dist/authz/stores/typeorm/entities/user-profile.entity.js.map +0 -1
  237. package/dist/authz/stores/typeorm/typeorm-store.service.d.ts +0 -28
  238. package/dist/authz/stores/typeorm/typeorm-store.service.d.ts.map +0 -1
  239. package/dist/authz/stores/typeorm/typeorm-store.service.js +0 -138
  240. package/dist/authz/stores/typeorm/typeorm-store.service.js.map +0 -1
  241. package/dist/mcp/constants/feature-registration.constants.d.ts +0 -7
  242. package/dist/mcp/constants/feature-registration.constants.d.ts.map +0 -1
  243. package/dist/mcp/constants/feature-registration.constants.js +0 -5
  244. package/dist/mcp/constants/feature-registration.constants.js.map +0 -1
  245. package/dist/mcp/decorators/tool-guards.decorator.d.ts +0 -12
  246. package/dist/mcp/decorators/tool-guards.decorator.d.ts.map +0 -1
  247. package/dist/mcp/decorators/tool-guards.decorator.js +0 -13
  248. package/dist/mcp/decorators/tool-guards.decorator.js.map +0 -1
  249. package/dist/mcp/interfaces/mcp-options.interface.d.ts +0 -53
  250. package/dist/mcp/interfaces/mcp-options.interface.d.ts.map +0 -1
  251. package/dist/mcp/interfaces/mcp-options.interface.js +0 -10
  252. package/dist/mcp/interfaces/mcp-options.interface.js.map +0 -1
  253. package/dist/mcp/mcp.module.d.ts +0 -15
  254. package/dist/mcp/mcp.module.d.ts.map +0 -1
  255. package/dist/mcp/mcp.module.js +0 -248
  256. package/dist/mcp/mcp.module.js.map +0 -1
  257. package/dist/mcp/services/handlers/mcp-handler.base.d.ts +0 -117
  258. package/dist/mcp/services/handlers/mcp-handler.base.d.ts.map +0 -1
  259. package/dist/mcp/services/handlers/mcp-handler.base.js +0 -125
  260. package/dist/mcp/services/handlers/mcp-handler.base.js.map +0 -1
  261. package/dist/mcp/services/handlers/mcp-prompts.handler.d.ts +0 -12
  262. package/dist/mcp/services/handlers/mcp-prompts.handler.d.ts.map +0 -1
  263. package/dist/mcp/services/handlers/mcp-prompts.handler.js +0 -98
  264. package/dist/mcp/services/handlers/mcp-prompts.handler.js.map +0 -1
  265. package/dist/mcp/services/handlers/mcp-resources.handler.d.ts +0 -13
  266. package/dist/mcp/services/handlers/mcp-resources.handler.d.ts.map +0 -1
  267. package/dist/mcp/services/handlers/mcp-resources.handler.js +0 -117
  268. package/dist/mcp/services/handlers/mcp-resources.handler.js.map +0 -1
  269. package/dist/mcp/services/handlers/mcp-tools.handler.d.ts +0 -22
  270. package/dist/mcp/services/handlers/mcp-tools.handler.d.ts.map +0 -1
  271. package/dist/mcp/services/handlers/mcp-tools.handler.js +0 -258
  272. package/dist/mcp/services/handlers/mcp-tools.handler.js.map +0 -1
  273. package/dist/mcp/services/mcp-dynamic-registry.service.d.ts +0 -26
  274. package/dist/mcp/services/mcp-dynamic-registry.service.d.ts.map +0 -1
  275. package/dist/mcp/services/mcp-dynamic-registry.service.js +0 -133
  276. package/dist/mcp/services/mcp-dynamic-registry.service.js.map +0 -1
  277. package/dist/mcp/services/mcp-executor.service.d.ts +0 -15
  278. package/dist/mcp/services/mcp-executor.service.d.ts.map +0 -1
  279. package/dist/mcp/services/mcp-executor.service.js +0 -47
  280. package/dist/mcp/services/mcp-executor.service.js.map +0 -1
  281. package/dist/mcp/services/mcp-registry-discovery.service.d.ts +0 -63
  282. package/dist/mcp/services/mcp-registry-discovery.service.d.ts.map +0 -1
  283. package/dist/mcp/services/mcp-registry-discovery.service.js +0 -397
  284. package/dist/mcp/services/mcp-registry-discovery.service.js.map +0 -1
  285. package/dist/mcp/services/mcp-sse.service.d.ts +0 -20
  286. package/dist/mcp/services/mcp-sse.service.d.ts.map +0 -1
  287. package/dist/mcp/services/mcp-sse.service.js +0 -91
  288. package/dist/mcp/services/mcp-sse.service.js.map +0 -1
  289. package/dist/mcp/services/mcp-streamable-http.service.d.ts +0 -32
  290. package/dist/mcp/services/mcp-streamable-http.service.d.ts.map +0 -1
  291. package/dist/mcp/services/mcp-streamable-http.service.js +0 -327
  292. package/dist/mcp/services/mcp-streamable-http.service.js.map +0 -1
  293. package/dist/mcp/services/sse-ping.service.d.ts +0 -23
  294. package/dist/mcp/services/sse-ping.service.d.ts.map +0 -1
  295. package/dist/mcp/services/sse-ping.service.js +0 -99
  296. package/dist/mcp/services/sse-ping.service.js.map +0 -1
  297. package/dist/mcp/transport/sse.controller.factory.d.ts +0 -14
  298. package/dist/mcp/transport/sse.controller.factory.d.ts.map +0 -1
  299. package/dist/mcp/transport/sse.controller.factory.js +0 -67
  300. package/dist/mcp/transport/sse.controller.factory.js.map +0 -1
  301. package/dist/mcp/transport/stdio.service.d.ts +0 -14
  302. package/dist/mcp/transport/stdio.service.d.ts.map +0 -1
  303. package/dist/mcp/transport/stdio.service.js +0 -66
  304. package/dist/mcp/transport/stdio.service.js.map +0 -1
  305. package/dist/mcp/transport/streamable-http.controller.factory.d.ts +0 -14
  306. package/dist/mcp/transport/streamable-http.controller.factory.d.ts.map +0 -1
  307. package/dist/mcp/transport/streamable-http.controller.factory.js +0 -74
  308. package/dist/mcp/transport/streamable-http.controller.factory.js.map +0 -1
  309. package/dist/mcp/utils/capabilities-builder.d.ts +0 -5
  310. package/dist/mcp/utils/capabilities-builder.d.ts.map +0 -1
  311. package/dist/mcp/utils/capabilities-builder.js +0 -25
  312. package/dist/mcp/utils/capabilities-builder.js.map +0 -1
  313. package/dist/mcp/utils/mcp-server.factory.d.ts +0 -6
  314. package/dist/mcp/utils/mcp-server.factory.d.ts.map +0 -1
  315. package/dist/mcp/utils/mcp-server.factory.js +0 -22
  316. package/dist/mcp/utils/mcp-server.factory.js.map +0 -1
  317. package/src/authz/guards/jwt-auth.guard.ts +0 -127
  318. package/src/authz/index.ts +0 -10
  319. package/src/authz/interfaces/oauth-common.interface.ts +0 -21
  320. package/src/authz/interfaces/request-with-user.ts +0 -16
  321. package/src/authz/mcp-oauth.controller.ts +0 -860
  322. package/src/authz/mcp-oauth.module.ts +0 -384
  323. package/src/authz/providers/azure-ad.provider.ts +0 -40
  324. package/src/authz/providers/github.provider.ts +0 -22
  325. package/src/authz/providers/google.provider.ts +0 -23
  326. package/src/authz/providers/oauth-provider.interface.ts +0 -147
  327. package/src/authz/services/client.service.ts +0 -125
  328. package/src/authz/services/jwt-token.service.spec.ts +0 -67
  329. package/src/authz/services/jwt-token.service.ts +0 -188
  330. package/src/authz/services/oauth-strategy.service.ts +0 -64
  331. package/src/authz/stores/memory-store.service.spec.ts +0 -475
  332. package/src/authz/stores/memory-store.service.ts +0 -141
  333. package/src/authz/stores/oauth-store.interface.ts +0 -131
  334. package/src/authz/stores/typeorm/README.md +0 -140
  335. package/src/authz/stores/typeorm/constants.ts +0 -6
  336. package/src/authz/stores/typeorm/entities/authorization-code.entity.ts +0 -41
  337. package/src/authz/stores/typeorm/entities/index.ts +0 -4
  338. package/src/authz/stores/typeorm/entities/oauth-client.entity.ts +0 -53
  339. package/src/authz/stores/typeorm/entities/oauth-session.entity.ts +0 -38
  340. package/src/authz/stores/typeorm/entities/user-profile.entity.ts +0 -46
  341. package/src/authz/stores/typeorm/typeorm-store.service.spec.ts +0 -494
  342. package/src/authz/stores/typeorm/typeorm-store.service.ts +0 -165
  343. package/src/mcp/constants/feature-registration.constants.ts +0 -24
  344. package/src/mcp/decorators/tool-guards.decorator.ts +0 -82
  345. package/src/mcp/interfaces/mcp-options.interface.ts +0 -95
  346. package/src/mcp/mcp.module.ts +0 -349
  347. package/src/mcp/services/handlers/mcp-handler.base.ts +0 -203
  348. package/src/mcp/services/handlers/mcp-prompts.handler.ts +0 -143
  349. package/src/mcp/services/handlers/mcp-resources.handler.ts +0 -183
  350. package/src/mcp/services/handlers/mcp-tools.handler.spec.ts +0 -41
  351. package/src/mcp/services/handlers/mcp-tools.handler.ts +0 -436
  352. package/src/mcp/services/mcp-dynamic-registry.service.ts +0 -236
  353. package/src/mcp/services/mcp-executor.service.ts +0 -64
  354. package/src/mcp/services/mcp-registry-discovery.service.spec.ts +0 -306
  355. package/src/mcp/services/mcp-registry-discovery.service.ts +0 -849
  356. package/src/mcp/services/mcp-sse.service.ts +0 -124
  357. package/src/mcp/services/mcp-streamable-http.service.ts +0 -472
  358. package/src/mcp/services/sse-ping.service.ts +0 -144
  359. package/src/mcp/transport/custom-decorator.spec.ts +0 -75
  360. package/src/mcp/transport/sse.controller.factory.ts +0 -84
  361. package/src/mcp/transport/stdio.service.ts +0 -75
  362. package/src/mcp/transport/streamable-http.controller.factory.ts +0 -80
  363. package/src/mcp/utils/capabilities-builder.ts +0 -43
  364. package/src/mcp/utils/mcp-server.factory.ts +0 -33
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.strategy.js","sourceRoot":"","sources":["../../../src/mcp/transport/mcp.strategy.ts"],"names":[],"mappings":"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","sourcesContent":["import { HttpServer, Logger } from '@nestjs/common';\nimport {\n BaseRpcContext,\n CustomTransportStrategy,\n MessageHandler,\n Server,\n} from '@nestjs/microservices';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport {\n CallToolRequestSchema,\n ErrorCode,\n GetPromptRequestSchema,\n GetPromptResult,\n ListPromptsRequestSchema,\n ListResourcesRequestSchema,\n ListResourceTemplatesRequestSchema,\n ListToolsRequestSchema,\n McpError,\n PromptArgument,\n ReadResourceRequestSchema,\n ReadResourceResult,\n ServerCapabilities,\n} from '@modelcontextprotocol/sdk/types.js';\nimport { toJsonSchemaCompat } from '@modelcontextprotocol/sdk/server/zod-json-schema-compat.js';\nimport { normalizeObjectSchema } from '@modelcontextprotocol/sdk/server/zod-compat.js';\nimport { firstValueFrom } from 'rxjs';\nimport { z, ZodType } from 'zod';\n\nimport {\n MCP_PROMPT_METADATA_KEY,\n MCP_PUBLIC_METADATA_KEY,\n MCP_RESOURCE_METADATA_KEY,\n MCP_RESOURCE_TEMPLATE_METADATA_KEY,\n MCP_ROLES_METADATA_KEY,\n MCP_SCOPES_METADATA_KEY,\n MCP_TOOL_METADATA_KEY,\n PromptMetadata,\n ResourceMetadata,\n ResourceTemplateMetadata,\n ToolMetadata,\n} from '../decorators';\nimport { ToolAuthorizationService } from '../services/tool-authorization.service';\nimport { createMcpLogger } from '../utils/mcp-logger.factory';\nimport type { McpRequest } from '../interfaces/mcp-tool.interface';\nimport type {\n DynamicPromptDefinition,\n DynamicPromptHandler,\n DynamicResourceDefinition,\n DynamicResourceHandler,\n DynamicToolDefinition,\n DynamicToolHandler,\n} from '../interfaces';\nimport {\n mcpTransportFor,\n McpHandlerExtras,\n McpMethodRef,\n} from './mcp-transport.constants';\nimport { McpContext, McpSessionInfo } from './mcp-context';\nimport { McpServerOptions } from './mcp-server-options.interface';\nimport { McpTransportContext } from './mcp-transport.interface';\nimport {\n matchResourceByUri,\n matchResourceTemplateByUri,\n} from './resource-matcher';\n\n/** DI token a user can wire (`{ provide: MCP_STRATEGY, useValue: strategy }`) to inject the strategy. */\nexport const MCP_STRATEGY = 'MCP_STRATEGY';\n\ntype Invoke = (payload: unknown, ctx: McpContext) => Promise<unknown>;\n\ninterface ToolCapability {\n metadata: ToolMetadata;\n invoke: Invoke;\n}\ninterface ResourceCapability {\n metadata: ResourceMetadata;\n invoke: Invoke;\n}\ninterface TemplateCapability {\n metadata: ResourceTemplateMetadata;\n invoke: Invoke;\n}\ninterface PromptCapability {\n metadata: PromptMetadata;\n invoke: Invoke;\n}\n\nlet strategyIdCounter = 0;\n\n/**\n * NestJS microservice transport strategy for the Model Context Protocol.\n *\n * Construct one, declare your `@McpController` classes in a module's\n * `controllers`, and connect it: `app.connectMicroservice({ strategy })`. NestJS\n * binds every `@Tool`/`@Resource`/`@Prompt` handler whose transport id matches\n * this strategy's into its `messageHandlers`. On `listen()` the strategy reads each\n * handler's MCP metadata directly off the decorated method, builds the SDK request\n * handlers, and routes invocations through the standard NestJS RPC pipeline — so\n * MCP tools get guards, pipes, interceptors, and exception filters for free.\n *\n * No `McpModule` or DI discovery service is required.\n */\nexport class McpStrategy extends Server implements CustomTransportStrategy {\n public override transportId: symbol;\n\n public readonly moduleId: string;\n protected override readonly logger: Logger;\n\n private readonly authService = new ToolAuthorizationService();\n private httpAdapter?: HttpServer;\n private built = false;\n\n private readonly tools: ToolCapability[] = [];\n private readonly resources: ResourceCapability[] = [];\n private readonly templates: TemplateCapability[] = [];\n private readonly prompts: PromptCapability[] = [];\n\n private readonly dynamicTools = new Map<string, ToolCapability>();\n private readonly dynamicResources = new Map<string, ResourceCapability>();\n private readonly dynamicPrompts = new Map<string, PromptCapability>();\n\n private readonly eventListeners = new Map<\n string,\n Array<(...a: any[]) => void>\n >();\n\n constructor(public readonly options: McpServerOptions) {\n super();\n // A named server gets its own transport id so NestJS routes only the\n // matching `@McpController({ server })` handlers to this strategy; an\n // unnamed server uses the default shared MCP_TRANSPORT id.\n this.transportId = mcpTransportFor(options.server);\n this.moduleId = `mcp-strategy-${strategyIdCounter++}`;\n this.httpAdapter = options.httpAdapter;\n this.logger = createMcpLogger(McpStrategy.name, this.options);\n }\n\n /** Provide the Nest HTTP adapter for HTTP transports (call after NestFactory.create). */\n setHttpAdapter(adapter: HttpServer): void {\n this.httpAdapter = adapter;\n }\n\n // ---------------------------------------------------------------------------\n // CustomTransportStrategy lifecycle\n // ---------------------------------------------------------------------------\n\n async listen(callback: (err?: unknown, ...args: unknown[]) => void) {\n try {\n this.buildCapabilities();\n this.warnIfNamedServerHasNoDecoratorCapabilities();\n const ctx = this.createTransportContext();\n for (const transport of this.options.transports) {\n await transport.start(ctx);\n }\n callback();\n } catch (err) {\n this.logger.error('Failed to start MCP strategy', err as Error);\n callback(err);\n }\n }\n\n async close() {\n for (const transport of this.options.transports) {\n try {\n await transport.close();\n } catch (err) {\n this.logger.error('Error closing MCP transport', err as Error);\n }\n }\n this.eventListeners.clear();\n }\n\n on<\n EventKey extends string = string,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n EventCallback extends Function = Function,\n >(event: EventKey, callback: EventCallback): void {\n const list = this.eventListeners.get(event) ?? [];\n list.push(callback as unknown as (...args: any[]) => void);\n this.eventListeners.set(event, list);\n }\n\n unwrap<T>(): T {\n return {\n transports: this.options.transports,\n httpAdapter: this.httpAdapter,\n } as T;\n }\n\n /**\n * A named server (`McpStrategy({ server })`) that bound zero decorator\n * capabilities almost certainly has a name mismatch: no\n * `@McpController({ server: <name> })` targets it, so it would serve an empty\n * endpoint silently. Warn so the misconfiguration is visible at startup.\n *\n * Scoped to named servers on purpose: an unnamed (default) server is commonly\n * populated only at runtime via `registerTool()` (see the dynamic-capabilities\n * multi-server example), and we don't want to warn on that supported pattern.\n * For the same reason the message notes dynamic registration as the escape hatch.\n */\n private warnIfNamedServerHasNoDecoratorCapabilities(): void {\n if (!this.options.server) return;\n const decoratorCount =\n this.tools.length +\n this.resources.length +\n this.templates.length +\n this.prompts.length;\n if (decoratorCount > 0) return;\n this.logger.warn(\n `MCP server '${this.options.server}' started with no @McpController ` +\n `capabilities bound to it. Check that a @McpController({ server: ` +\n `'${this.options.server}' }) exists and is listed in a module's ` +\n `controllers. (Safe to ignore if this server is populated at runtime ` +\n `via strategy.registerTool()/registerResource()/registerPrompt().)`,\n );\n }\n\n // ---------------------------------------------------------------------------\n // Capability discovery — straight from the bound handlers' metadata\n // ---------------------------------------------------------------------------\n\n private buildCapabilities(): void {\n if (this.built) return;\n this.built = true;\n\n for (const [route, handler] of this.messageHandlers) {\n const extras = (handler as MessageHandler & { extras?: McpHandlerExtras })\n .extras;\n if (!extras?.mcpType) {\n // Prune stray non-MCP @MessagePattern handlers bound via the\n // undefined-transport clause, so the MCP server only sees MCP handlers.\n this.messageHandlers.delete(route);\n continue;\n }\n\n const { mcpType, mcpMethodKey, mcpMethodRef } = extras;\n const invoke: Invoke = (payload, ctx) =>\n this.invokeViaPipeline(handler, payload, ctx);\n\n switch (mcpType) {\n case 'tool':\n this.tools.push({\n metadata: this.readToolMetadata(mcpMethodRef, mcpMethodKey),\n invoke,\n });\n break;\n case 'resource':\n this.resources.push({\n metadata: this.readMetadata<ResourceMetadata>(\n MCP_RESOURCE_METADATA_KEY,\n mcpMethodRef,\n mcpMethodKey,\n ),\n invoke,\n });\n break;\n case 'resource-template':\n this.templates.push({\n metadata: this.readMetadata<ResourceTemplateMetadata>(\n MCP_RESOURCE_TEMPLATE_METADATA_KEY,\n mcpMethodRef,\n mcpMethodKey,\n ),\n invoke,\n });\n break;\n case 'prompt':\n this.prompts.push({\n metadata: this.readMetadata<PromptMetadata>(\n MCP_PROMPT_METADATA_KEY,\n mcpMethodRef,\n mcpMethodKey,\n ),\n invoke,\n });\n break;\n }\n }\n }\n\n private readToolMetadata(\n methodRef: McpMethodRef,\n methodKey: string,\n ): ToolMetadata {\n const base: ToolMetadata = {\n ...(Reflect.getMetadata(\n MCP_TOOL_METADATA_KEY,\n methodRef,\n ) as ToolMetadata),\n };\n if (!base.name) base.name = methodKey;\n if (!base.parameters) base.parameters = z.object({});\n\n const isPublic = Reflect.getMetadata(MCP_PUBLIC_METADATA_KEY, methodRef);\n const requiredScopes = Reflect.getMetadata(\n MCP_SCOPES_METADATA_KEY,\n methodRef,\n );\n const requiredRoles = Reflect.getMetadata(\n MCP_ROLES_METADATA_KEY,\n methodRef,\n );\n if (isPublic !== undefined) base.isPublic = isPublic;\n if (requiredScopes) base.requiredScopes = requiredScopes;\n if (requiredRoles) base.requiredRoles = requiredRoles;\n return base;\n }\n\n private readMetadata<T extends { name?: string }>(\n key: string,\n methodRef: McpMethodRef,\n methodKey: string,\n ): T {\n const metadata = { ...(Reflect.getMetadata(key, methodRef) as T) };\n if (!metadata.name) metadata.name = methodKey;\n return metadata;\n }\n\n private getTools(): ToolCapability[] {\n return [...this.tools, ...this.dynamicTools.values()];\n }\n private getResources(): ResourceCapability[] {\n return [...this.resources, ...this.dynamicResources.values()];\n }\n private getTemplates(): TemplateCapability[] {\n return [...this.templates];\n }\n private getPrompts(): PromptCapability[] {\n return [...this.prompts, ...this.dynamicPrompts.values()];\n }\n\n // ---------------------------------------------------------------------------\n // SDK server + request handlers\n // ---------------------------------------------------------------------------\n\n private createTransportContext(): McpTransportContext {\n return {\n createServer: () => this.createServer(),\n bindRequestHandlers: (server, session, rawRequest) =>\n this.bindRequestHandlers(server, session, rawRequest),\n httpAdapter: this.httpAdapter,\n options: this.options,\n logger: this.logger,\n };\n }\n\n private createServer(): McpServer {\n const capabilities: ServerCapabilities = {\n ...(this.options.capabilities ?? {}),\n };\n if (this.getTools().length > 0) {\n capabilities.tools = capabilities.tools ?? { listChanged: true };\n }\n if (this.getResources().length + this.getTemplates().length > 0) {\n capabilities.resources = capabilities.resources ?? { listChanged: true };\n }\n if (this.getPrompts().length > 0) {\n capabilities.prompts = capabilities.prompts ?? { listChanged: true };\n }\n\n const server = new McpServer(\n {\n name: this.options.name,\n version: this.options.version,\n ...(this.options.title && { title: this.options.title }),\n ...(this.options.description && {\n description: this.options.description,\n }),\n ...(this.options.websiteUrl && { websiteUrl: this.options.websiteUrl }),\n ...(this.options.icons && { icons: this.options.icons }),\n },\n { capabilities, instructions: this.options.instructions ?? '' },\n );\n\n return this.options.serverMutator\n ? this.options.serverMutator(server)\n : server;\n }\n\n bindRequestHandlers(\n server: McpServer,\n session: Pick<McpSessionInfo, 'transport' | 'stateless' | 'sessionId'>,\n rawRequest?: unknown,\n ): void {\n this.bindToolHandlers(server, session, rawRequest);\n this.bindResourceHandlers(server, session, rawRequest);\n this.bindPromptHandlers(server, session, rawRequest);\n }\n\n private buildContext(\n server: McpServer,\n request: McpRequest,\n session: Pick<McpSessionInfo, 'transport' | 'stateless' | 'sessionId'>,\n rawRequest?: unknown,\n ): McpContext {\n const sessionId =\n session.sessionId ??\n (server.server.transport as { sessionId?: string } | undefined)\n ?.sessionId;\n return new McpContext(\n [server, request, { ...session, sessionId }, rawRequest],\n this.logger,\n );\n }\n\n private getUser(rawRequest?: unknown): any {\n return rawRequest ? (rawRequest as { user?: unknown }).user : undefined;\n }\n\n private bindToolHandlers(\n server: McpServer,\n session: Pick<McpSessionInfo, 'transport' | 'stateless' | 'sessionId'>,\n rawRequest?: unknown,\n ): void {\n if (this.getTools().length === 0) return;\n\n const allowUnauthenticatedAccess =\n this.options.allowUnauthenticatedAccess ?? false;\n\n server.server.setRequestHandler(ListToolsRequestSchema, () => {\n const user = this.getUser(rawRequest);\n const tools = this.getTools()\n .filter((tool) =>\n this.authService.canAccessTool(\n user,\n tool,\n allowUnauthenticatedAccess,\n ),\n )\n .map((tool) => {\n const schema: Record<string, unknown> = {\n name: tool.metadata.name,\n description: tool.metadata.description,\n annotations: tool.metadata.annotations,\n _meta: tool.metadata._meta,\n };\n const securitySchemes = this.authService.generateSecuritySchemes(\n tool,\n allowUnauthenticatedAccess,\n );\n if (securitySchemes.length > 0) {\n schema._meta = { ...(schema._meta as object), securitySchemes };\n }\n const input = normalizeObjectSchema(tool.metadata.parameters);\n if (input) schema.inputSchema = toJsonSchemaCompat(input);\n const output = normalizeObjectSchema(tool.metadata.outputSchema);\n if (output) {\n schema.outputSchema = {\n ...toJsonSchemaCompat(output),\n type: 'object',\n };\n }\n return schema;\n });\n return { tools };\n });\n\n server.server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const tool = this.getTools().find(\n (t) => t.metadata.name === request.params.name,\n );\n if (!tool) {\n throw new McpError(\n ErrorCode.MethodNotFound,\n `Unknown tool: ${request.params.name}`,\n );\n }\n\n this.authService.validateToolAccess(\n this.getUser(rawRequest),\n tool,\n allowUnauthenticatedAccess,\n );\n\n if (tool.metadata.parameters) {\n const validation = tool.metadata.parameters.safeParse(\n request.params.arguments ?? {},\n );\n if (!validation.success) {\n const issues = validation.error.issues\n .map((issue) => {\n const path = issue.path.length > 0 ? issue.path.join('.') : '';\n return `${path ? `[${path}]: ` : ''}${issue.message}`;\n })\n .join('; ');\n return {\n content: [{ type: 'text', text: `Invalid parameters: ${issues}` }],\n isError: true,\n };\n }\n request.params.arguments = validation.data as Record<string, unknown>;\n }\n\n const ctx = this.buildContext(server, request, session, rawRequest);\n try {\n const result = await tool.invoke(request.params.arguments ?? {}, ctx);\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return this.formatToolResult(result, tool.metadata.outputSchema);\n } catch (error) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return this.toErrorResult(error);\n }\n });\n }\n\n private bindResourceHandlers(\n server: McpServer,\n session: Pick<McpSessionInfo, 'transport' | 'stateless' | 'sessionId'>,\n rawRequest?: unknown,\n ): void {\n if (this.getResources().length + this.getTemplates().length === 0) return;\n\n server.server.setRequestHandler(ListResourcesRequestSchema, () => ({\n resources: this.getResources().map((r) => r.metadata),\n }));\n\n server.server.setRequestHandler(ListResourceTemplatesRequestSchema, () => ({\n resourceTemplates: this.getTemplates().map((r) => r.metadata),\n }));\n\n server.server.setRequestHandler(\n ReadResourceRequestSchema,\n async (request) => {\n const uri = request.params.uri;\n const templateMatch = matchResourceTemplateByUri(\n this.getTemplates().map((cap) => ({\n uriTemplate: cap.metadata.uriTemplate,\n cap,\n })),\n uri,\n );\n const resourceMatch = matchResourceByUri(\n this.getResources().map((cap) => ({ uri: cap.metadata.uri, cap })),\n uri,\n );\n\n let invoke: Invoke;\n let params: Record<string, unknown>;\n if (templateMatch) {\n invoke = templateMatch.template.cap.invoke;\n params = { ...templateMatch.params, ...request.params };\n } else if (resourceMatch) {\n invoke = resourceMatch.resource.cap.invoke;\n params = { ...resourceMatch.params, ...request.params };\n } else {\n throw new McpError(\n ErrorCode.MethodNotFound,\n `Unknown resource: ${uri}`,\n );\n }\n\n const ctx = this.buildContext(server, request, session, rawRequest);\n return (await invoke(params, ctx)) as ReadResourceResult;\n },\n );\n }\n\n private bindPromptHandlers(\n server: McpServer,\n session: Pick<McpSessionInfo, 'transport' | 'stateless' | 'sessionId'>,\n rawRequest?: unknown,\n ): void {\n if (this.getPrompts().length === 0) return;\n\n server.server.setRequestHandler(ListPromptsRequestSchema, () => ({\n prompts: this.getPrompts().map((prompt) => ({\n name: prompt.metadata.name,\n description: prompt.metadata.description,\n arguments: prompt.metadata.parameters\n ? Object.entries(prompt.metadata.parameters.shape).map(\n ([name, field]): PromptArgument => ({\n name,\n description: field.description,\n required: !field.isOptional(),\n }),\n )\n : [],\n })),\n }));\n\n server.server.setRequestHandler(GetPromptRequestSchema, async (request) => {\n const prompt = this.getPrompts().find(\n (p) => p.metadata.name === request.params.name,\n );\n if (!prompt) {\n throw new McpError(\n ErrorCode.MethodNotFound,\n `Unknown prompt: ${request.params.name}`,\n );\n }\n const ctx = this.buildContext(server, request, session, rawRequest);\n return (await prompt.invoke(\n request.params.arguments,\n ctx,\n )) as GetPromptResult;\n });\n }\n\n // ---------------------------------------------------------------------------\n // RPC pipeline invocation\n // ---------------------------------------------------------------------------\n\n private async invokeViaPipeline(\n handler: MessageHandler,\n payload: unknown,\n ctx: BaseRpcContext,\n ): Promise<unknown> {\n let resultPromise!: Promise<unknown>;\n const done = () => {\n resultPromise = (async () => {\n const resultOrStream: unknown = await handler(payload, ctx);\n return firstValueFrom(this.transformToObservable(resultOrStream));\n })();\n return resultPromise;\n };\n // onProcessingStartHook may be async (request-scoped lifecycle); the base\n // type declares it `void`, so wrap to await defensively without a lint error.\n await Promise.resolve(\n this.onProcessingStartHook(this.transportId, ctx, done),\n );\n try {\n return await resultPromise;\n } finally {\n this.onProcessingEndHook?.(this.transportId, ctx);\n }\n }\n\n private formatToolResult(result: any, outputSchema?: ZodType): any {\n if (result && typeof result === 'object' && Array.isArray(result.content)) {\n return result;\n }\n const defaultContent = [{ type: 'text', text: JSON.stringify(result) }];\n if (outputSchema) {\n const validation = outputSchema.safeParse(result);\n if (!validation.success) {\n throw new McpError(\n ErrorCode.InternalError,\n `Tool result does not match outputSchema: ${validation.error.message}`,\n );\n }\n return { structuredContent: validation.data, content: defaultContent };\n }\n return { content: defaultContent };\n }\n\n /**\n * Turn an error thrown while invoking a tool into a result the calling agent\n * can act on.\n *\n * We deliberately surface the most specific message available so the agent can\n * tell *why* the call failed and whether retrying makes sense:\n *\n * - `McpError` is re-thrown so the SDK emits a real JSON-RPC error with its\n * code (e.g. invalid params, output-schema mismatch).\n * - Errors raised intentionally for the client — `throw new RpcException('…')`\n * or anything surfaced by a `@UseFilters` exception filter — carry an\n * explicit message/payload, which we return verbatim as an `isError` result.\n * - Unexpected errors (`throw new Error('boom')` in a handler) are masked to a\n * generic \"Internal server error\" by NestJS's default RPC exception handler\n * *before* they reach here. That is intentional (don't leak internals); to\n * surface a custom message, throw `RpcException` or register the exported\n * `McpExceptionFilter`. Either way the agent gets `isError: true` and knows\n * the failure is server-side, not a bad-input problem it can fix by retrying.\n */\n private toErrorResult(error: unknown): any {\n if (error instanceof McpError) {\n throw error;\n }\n let message = 'Internal server error';\n if (error instanceof Error) {\n message = error.message;\n } else if (typeof error === 'string') {\n message = error;\n } else if (\n error &&\n typeof error === 'object' &&\n typeof (error as { message?: unknown }).message === 'string'\n ) {\n // RpcException payloads arrive as `{ status: 'error', message: '…' }`.\n message = (error as { message: string }).message;\n }\n this.logger.error(message);\n return { content: [{ type: 'text', text: message }], isError: true };\n }\n\n // ---------------------------------------------------------------------------\n // Dynamic capability registration\n // ---------------------------------------------------------------------------\n\n registerTool(definition: DynamicToolDefinition): void {\n const handler: DynamicToolHandler = definition.handler;\n this.dynamicTools.set(definition.name, {\n metadata: {\n name: definition.name,\n description: definition.description,\n parameters: definition.parameters ?? z.object({}),\n outputSchema: definition.outputSchema,\n annotations: definition.annotations,\n _meta: definition._meta,\n isPublic: definition.isPublic,\n requiredScopes: definition.requiredScopes,\n requiredRoles: definition.requiredRoles,\n },\n invoke: (payload, ctx) =>\n Promise.resolve(\n handler(payload as any, ctx, ctx.getRawRequest()) as unknown,\n ),\n });\n }\n\n registerResource(definition: DynamicResourceDefinition): void {\n const handler: DynamicResourceHandler = definition.handler;\n this.dynamicResources.set(definition.uri, {\n metadata: {\n uri: definition.uri,\n name: definition.name ?? definition.uri,\n description: definition.description,\n mimeType: definition.mimeType,\n _meta: definition._meta,\n },\n invoke: (payload, ctx) =>\n Promise.resolve(\n handler(payload as any, ctx, ctx.getRawRequest()) as unknown,\n ),\n });\n }\n\n registerPrompt(definition: DynamicPromptDefinition): void {\n const handler: DynamicPromptHandler = definition.handler;\n this.dynamicPrompts.set(definition.name, {\n metadata: {\n name: definition.name,\n description: definition.description,\n parameters: definition.parameters,\n },\n invoke: (payload, ctx) =>\n Promise.resolve(\n handler(payload as any, ctx, ctx.getRawRequest()) as unknown,\n ),\n });\n }\n\n removeTool(name: string): void {\n this.dynamicTools.delete(name);\n }\n removeResource(uri: string): void {\n this.dynamicResources.delete(uri);\n }\n removePrompt(name: string): void {\n this.dynamicPrompts.delete(name);\n }\n}\n"]}
@@ -0,0 +1,13 @@
1
+ export declare function matchResourceByUri<T extends {
2
+ uri?: string;
3
+ }>(resources: T[], inputUri: string): {
4
+ resource: T;
5
+ params: Record<string, string>;
6
+ } | undefined;
7
+ export declare function matchResourceTemplateByUri<T extends {
8
+ uriTemplate?: string;
9
+ }>(templates: T[], inputUri: string): {
10
+ template: T;
11
+ params: Record<string, string>;
12
+ } | undefined;
13
+ //# sourceMappingURL=resource-matcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-matcher.d.ts","sourceRoot":"","sources":["../../../src/mcp/transport/resource-matcher.ts"],"names":[],"mappings":"AAiEA,wBAAgB,kBAAkB,CAAC,CAAC,SAAS;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,EAC3D,SAAS,EAAE,CAAC,EAAE,EACd,QAAQ,EAAE,MAAM,GACf;IAAE,QAAQ,EAAE,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAAG,SAAS,CAa7D;AAGD,wBAAgB,0BAA0B,CAAC,CAAC,SAAS;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,EAC3E,SAAS,EAAE,CAAC,EAAE,EACd,QAAQ,EAAE,MAAM,GACf;IAAE,QAAQ,EAAE,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAAG,SAAS,CAmB7D"}
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.matchResourceByUri = matchResourceByUri;
4
+ exports.matchResourceTemplateByUri = matchResourceTemplateByUri;
5
+ const path_to_regexp_1 = require("path-to-regexp");
6
+ function stripScheme(uri) {
7
+ return uri.includes('://') ? uri.split('://')[1] : uri;
8
+ }
9
+ function convertTemplate(template) {
10
+ if (!template)
11
+ return template;
12
+ return template
13
+ .replace(/\{\?[^}]+\}/g, '')
14
+ .replace(/\{(\w+)\*\}/g, '*$1')
15
+ .replace(/\{(\w+)\}/g, ':$1');
16
+ }
17
+ function flattenParams(params) {
18
+ const out = {};
19
+ for (const [key, value] of Object.entries(params)) {
20
+ if (value === undefined)
21
+ continue;
22
+ out[key] = Array.isArray(value) ? value.join('/') : value;
23
+ }
24
+ return out;
25
+ }
26
+ function extractTemplateQueryParams(template) {
27
+ const m = template.match(/\{\?([^}]+)\}/);
28
+ return m ? m[1].split(',').map((p) => p.trim()) : [];
29
+ }
30
+ function parseQueryString(uri) {
31
+ const i = uri.indexOf('?');
32
+ if (i === -1)
33
+ return {};
34
+ const params = {};
35
+ for (const pair of uri.substring(i + 1).split('&')) {
36
+ const [k, v] = pair.split('=');
37
+ if (k)
38
+ params[decodeURIComponent(k)] = v ? decodeURIComponent(v) : '';
39
+ }
40
+ return params;
41
+ }
42
+ function stripQueryString(uri) {
43
+ const i = uri.indexOf('?');
44
+ return i === -1 ? uri : uri.substring(0, i);
45
+ }
46
+ function matchResourceByUri(resources, inputUri) {
47
+ const input = stripScheme(inputUri);
48
+ for (const resource of resources) {
49
+ if (!resource.uri)
50
+ continue;
51
+ const matcher = (0, path_to_regexp_1.match)(convertTemplate(stripScheme(resource.uri)), {
52
+ decode: decodeURIComponent,
53
+ });
54
+ const result = matcher(input);
55
+ if (result) {
56
+ return { resource, params: flattenParams(result.params) };
57
+ }
58
+ }
59
+ return undefined;
60
+ }
61
+ function matchResourceTemplateByUri(templates, inputUri) {
62
+ const input = stripQueryString(stripScheme(inputUri));
63
+ const inputQuery = parseQueryString(inputUri);
64
+ for (const template of templates) {
65
+ if (!template.uriTemplate)
66
+ continue;
67
+ const matcher = (0, path_to_regexp_1.match)(convertTemplate(stripScheme(template.uriTemplate)), {
68
+ decode: decodeURIComponent,
69
+ });
70
+ const result = matcher(input);
71
+ if (result) {
72
+ const params = flattenParams(result.params);
73
+ const query = {};
74
+ for (const name of extractTemplateQueryParams(template.uriTemplate)) {
75
+ if (inputQuery[name] !== undefined)
76
+ query[name] = inputQuery[name];
77
+ }
78
+ return { template, params: { ...params, ...query } };
79
+ }
80
+ }
81
+ return undefined;
82
+ }
83
+ //# sourceMappingURL=resource-matcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-matcher.js","sourceRoot":"","sources":["../../../src/mcp/transport/resource-matcher.ts"],"names":[],"mappings":"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","sourcesContent":["import { match } from 'path-to-regexp';\n\n/** Strips the scheme (`mcp://foo` -> `foo`). */\nfunction stripScheme(uri: string): string {\n return uri.includes('://') ? uri.split('://')[1] : uri;\n}\n\n/**\n * RFC 6570 template -> path-to-regexp (v8) path:\n * - drop the `{?query}` form,\n * - turn a catch-all `{path*}` into a wildcard `*path` (matches one or more\n * segments across `/`),\n * - turn a single `{p}` into `:p` (one segment).\n *\n * The catch-all rule MUST run before the single-param rule: `{(\\w+)}` can't\n * match `{path*}` (the `*` sits between `\\w+` and `}`), which is the bug that\n * previously left `{path*}` untouched so it never matched.\n */\nfunction convertTemplate(template: string): string {\n if (!template) return template;\n return template\n .replace(/\\{\\?[^}]+\\}/g, '')\n .replace(/\\{(\\w+)\\*\\}/g, '*$1')\n .replace(/\\{(\\w+)\\}/g, ':$1');\n}\n\n/**\n * path-to-regexp v8 returns wildcard (`*path`) params as an array of segments,\n * while named (`:id`) params come back as strings. Join wildcard arrays with\n * `/` so a `{path*}` template hands the handler a single string\n * (e.g. `docs/readme.md`), preserving the documented contract.\n */\nfunction flattenParams(\n params: Partial<Record<string, string | string[]>>,\n): Record<string, string> {\n const out: Record<string, string> = {};\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined) continue;\n out[key] = Array.isArray(value) ? value.join('/') : value;\n }\n return out;\n}\n\nfunction extractTemplateQueryParams(template: string): string[] {\n const m = template.match(/\\{\\?([^}]+)\\}/);\n return m ? m[1].split(',').map((p) => p.trim()) : [];\n}\n\nfunction parseQueryString(uri: string): Record<string, string> {\n const i = uri.indexOf('?');\n if (i === -1) return {};\n const params: Record<string, string> = {};\n for (const pair of uri.substring(i + 1).split('&')) {\n const [k, v] = pair.split('=');\n if (k) params[decodeURIComponent(k)] = v ? decodeURIComponent(v) : '';\n }\n return params;\n}\n\nfunction stripQueryString(uri: string): string {\n const i = uri.indexOf('?');\n return i === -1 ? uri : uri.substring(0, i);\n}\n\n/** Finds a static resource whose URI matches `inputUri`, extracting any path params. */\nexport function matchResourceByUri<T extends { uri?: string }>(\n resources: T[],\n inputUri: string,\n): { resource: T; params: Record<string, string> } | undefined {\n const input = stripScheme(inputUri);\n for (const resource of resources) {\n if (!resource.uri) continue;\n const matcher = match(convertTemplate(stripScheme(resource.uri)), {\n decode: decodeURIComponent,\n });\n const result = matcher(input);\n if (result) {\n return { resource, params: flattenParams(result.params) };\n }\n }\n return undefined;\n}\n\n/** Finds a resource template matching `inputUri`, extracting path + declared query params. */\nexport function matchResourceTemplateByUri<T extends { uriTemplate?: string }>(\n templates: T[],\n inputUri: string,\n): { template: T; params: Record<string, string> } | undefined {\n const input = stripQueryString(stripScheme(inputUri));\n const inputQuery = parseQueryString(inputUri);\n for (const template of templates) {\n if (!template.uriTemplate) continue;\n const matcher = match(convertTemplate(stripScheme(template.uriTemplate)), {\n decode: decodeURIComponent,\n });\n const result = matcher(input);\n if (result) {\n const params = flattenParams(result.params);\n const query: Record<string, string> = {};\n for (const name of extractTemplateQueryParams(template.uriTemplate)) {\n if (inputQuery[name] !== undefined) query[name] = inputQuery[name];\n }\n return { template, params: { ...params, ...query } };\n }\n }\n return undefined;\n}\n"]}
@@ -0,0 +1,16 @@
1
+ import { type McpHttpHandler } from './mcp-http-handler';
2
+ export interface McpHttpHandlerSource {
3
+ readonly httpHandlers: McpHttpHandler;
4
+ }
5
+ export declare function McpHttpControllerFor(source: McpHttpHandlerSource): abstract new () => {
6
+ post(req: unknown, res: unknown): Promise<void> | void;
7
+ get(req: unknown, res: unknown): Promise<void> | void;
8
+ delete(req: unknown, res: unknown): Promise<void> | void;
9
+ };
10
+ export declare abstract class StreamableHttpController {
11
+ protected readonly mcpHandler: McpHttpHandler;
12
+ post(req: unknown, res: unknown): Promise<void> | void;
13
+ get(req: unknown, res: unknown): Promise<void> | void;
14
+ delete(req: unknown, res: unknown): Promise<void> | void;
15
+ }
16
+ //# sourceMappingURL=streamable-http.controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streamable-http.controller.d.ts","sourceRoot":"","sources":["../../../src/mcp/transport/streamable-http.controller.ts"],"names":[],"mappings":"AACA,OAAO,EAAoB,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAG3E,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,YAAY,EAAE,cAAc,CAAC;CACvC;AA4BD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,oBAAoB;cAK5C,OAAO,OAAc,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;aAKpD,OAAO,OAAc,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;gBAKhD,OAAO,OAAc,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;EAMzE;AAwCD,8BAAsB,wBAAwB;IAE5C,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAG,cAAc,CAAC;IAG/C,IAAI,CAAQ,GAAG,EAAE,OAAO,EAAS,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAKpE,GAAG,CAAQ,GAAG,EAAE,OAAO,EAAS,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAKnE,MAAM,CAAQ,GAAG,EAAE,OAAO,EAAS,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;CAGvE"}
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.StreamableHttpController = void 0;
16
+ exports.McpHttpControllerFor = McpHttpControllerFor;
17
+ const common_1 = require("@nestjs/common");
18
+ const mcp_http_handler_1 = require("./mcp-http-handler");
19
+ function McpHttpControllerFor(source) {
20
+ const handlers = source.httpHandlers;
21
+ class BoundMcpHttpController {
22
+ post(req, res) {
23
+ return handlers.handlePost(req, res);
24
+ }
25
+ get(req, res) {
26
+ return handlers.handleGet(req, res);
27
+ }
28
+ delete(req, res) {
29
+ return handlers.handleDelete(req, res);
30
+ }
31
+ }
32
+ __decorate([
33
+ (0, common_1.Post)(),
34
+ __param(0, (0, common_1.Req)()),
35
+ __param(1, (0, common_1.Res)()),
36
+ __metadata("design:type", Function),
37
+ __metadata("design:paramtypes", [Object, Object]),
38
+ __metadata("design:returntype", Object)
39
+ ], BoundMcpHttpController.prototype, "post", null);
40
+ __decorate([
41
+ (0, common_1.Get)(),
42
+ __param(0, (0, common_1.Req)()),
43
+ __param(1, (0, common_1.Res)()),
44
+ __metadata("design:type", Function),
45
+ __metadata("design:paramtypes", [Object, Object]),
46
+ __metadata("design:returntype", Object)
47
+ ], BoundMcpHttpController.prototype, "get", null);
48
+ __decorate([
49
+ (0, common_1.Delete)(),
50
+ __param(0, (0, common_1.Req)()),
51
+ __param(1, (0, common_1.Res)()),
52
+ __metadata("design:type", Function),
53
+ __metadata("design:paramtypes", [Object, Object]),
54
+ __metadata("design:returntype", Object)
55
+ ], BoundMcpHttpController.prototype, "delete", null);
56
+ return BoundMcpHttpController;
57
+ }
58
+ class StreamableHttpController {
59
+ post(req, res) {
60
+ return this.mcpHandler.handlePost(req, res);
61
+ }
62
+ get(req, res) {
63
+ return this.mcpHandler.handleGet(req, res);
64
+ }
65
+ delete(req, res) {
66
+ return this.mcpHandler.handleDelete(req, res);
67
+ }
68
+ }
69
+ exports.StreamableHttpController = StreamableHttpController;
70
+ __decorate([
71
+ (0, common_1.Inject)(mcp_http_handler_1.MCP_HTTP_HANDLER),
72
+ __metadata("design:type", Object)
73
+ ], StreamableHttpController.prototype, "mcpHandler", void 0);
74
+ __decorate([
75
+ (0, common_1.Post)(),
76
+ __param(0, (0, common_1.Req)()),
77
+ __param(1, (0, common_1.Res)()),
78
+ __metadata("design:type", Function),
79
+ __metadata("design:paramtypes", [Object, Object]),
80
+ __metadata("design:returntype", Object)
81
+ ], StreamableHttpController.prototype, "post", null);
82
+ __decorate([
83
+ (0, common_1.Get)(),
84
+ __param(0, (0, common_1.Req)()),
85
+ __param(1, (0, common_1.Res)()),
86
+ __metadata("design:type", Function),
87
+ __metadata("design:paramtypes", [Object, Object]),
88
+ __metadata("design:returntype", Object)
89
+ ], StreamableHttpController.prototype, "get", null);
90
+ __decorate([
91
+ (0, common_1.Delete)(),
92
+ __param(0, (0, common_1.Req)()),
93
+ __param(1, (0, common_1.Res)()),
94
+ __metadata("design:type", Function),
95
+ __metadata("design:paramtypes", [Object, Object]),
96
+ __metadata("design:returntype", Object)
97
+ ], StreamableHttpController.prototype, "delete", null);
98
+ //# sourceMappingURL=streamable-http.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streamable-http.controller.js","sourceRoot":"","sources":["../../../src/mcp/transport/streamable-http.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAkCA,oDAqBC;AAvDD,2CAAqE;AACrE,yDAA2E;AAiC3E,SAAgB,oBAAoB,CAAC,MAA4B;IAC/D,MAAM,QAAQ,GAAG,MAAM,CAAC,YAAY,CAAC;IAErC,MAAe,sBAAsB;QAEnC,IAAI,CAAQ,GAAY,EAAS,GAAY;YAC3C,OAAO,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACvC,CAAC;QAGD,GAAG,CAAQ,GAAY,EAAS,GAAY;YAC1C,OAAO,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACtC,CAAC;QAGD,MAAM,CAAQ,GAAY,EAAS,GAAY;YAC7C,OAAO,QAAQ,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACzC,CAAC;KACF;IAbC;QADC,IAAA,aAAI,GAAE;QACD,WAAA,IAAA,YAAG,GAAE,CAAA;QAAgB,WAAA,IAAA,YAAG,GAAE,CAAA;;;;sDAE/B;IAGD;QADC,IAAA,YAAG,GAAE;QACD,WAAA,IAAA,YAAG,GAAE,CAAA;QAAgB,WAAA,IAAA,YAAG,GAAE,CAAA;;;;qDAE9B;IAGD;QADC,IAAA,eAAM,GAAE;QACD,WAAA,IAAA,YAAG,GAAE,CAAA;QAAgB,WAAA,IAAA,YAAG,GAAE,CAAA;;;;wDAEjC;IAGH,OAAO,sBAAsB,CAAC;AAChC,CAAC;AAwCD,MAAsB,wBAAwB;IAK5C,IAAI,CAAQ,GAAY,EAAS,GAAY;QAC3C,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC9C,CAAC;IAGD,GAAG,CAAQ,GAAY,EAAS,GAAY;QAC1C,OAAO,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC7C,CAAC;IAGD,MAAM,CAAQ,GAAY,EAAS,GAAY;QAC7C,OAAO,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAChD,CAAC;CACF;AAlBD,4DAkBC;AAhBoB;IADlB,IAAA,eAAM,EAAC,mCAAgB,CAAC;;4DACsB;AAG/C;IADC,IAAA,aAAI,GAAE;IACD,WAAA,IAAA,YAAG,GAAE,CAAA;IAAgB,WAAA,IAAA,YAAG,GAAE,CAAA;;;;oDAE/B;AAGD;IADC,IAAA,YAAG,GAAE;IACD,WAAA,IAAA,YAAG,GAAE,CAAA;IAAgB,WAAA,IAAA,YAAG,GAAE,CAAA;;;;mDAE9B;AAGD;IADC,IAAA,eAAM,GAAE;IACD,WAAA,IAAA,YAAG,GAAE,CAAA;IAAgB,WAAA,IAAA,YAAG,GAAE,CAAA;;;;sDAEjC","sourcesContent":["import { Delete, Get, Inject, Post, Req, Res } from '@nestjs/common';\nimport { MCP_HTTP_HANDLER, type McpHttpHandler } from './mcp-http-handler';\n\n/** Anything that can hand out MCP HTTP verb handlers — i.e. a transport. */\nexport interface McpHttpHandlerSource {\n readonly httpHandlers: McpHttpHandler;\n}\n\n/**\n * Build a base controller bound DIRECTLY to a specific transport — the\n * legible way to wire a bring-your-own MCP controller.\n *\n * Instead of providing handlers under a DI token and hoping the right one\n * resolves (which gets confusing with multiple servers), the controller simply\n * names the transport it serves. The binding is a concrete reference you can\n * click through to:\n *\n * ```ts\n * @Controller('weather/mcp')\n * @UseGuards(WeatherAuthGuard)\n * export class WeatherMcpController extends McpHttpControllerFor(weatherTransport) {}\n * ```\n *\n * No `MCP_HTTP_HANDLER` provider, no module-local resolution to reason about: a\n * reader sees `weatherTransport`, jumps to where it's declared, and finds it in\n * `weatherStrategy({ server: 'weather' })` next to the weather tools. One hop.\n *\n * Reading `source.httpHandlers` here (at class-definition / import time) also\n * marks the route as claimed, so the transport auto-disables its own self-mount.\n *\n * You still own the subclass decorators — `@Controller(path)`, `@UseGuards`,\n * `@UseInterceptors`, `@Version`, etc. all compose normally; the library only\n * owns the `POST`/`GET`/`DELETE` wiring.\n */\nexport function McpHttpControllerFor(source: McpHttpHandlerSource) {\n const handlers = source.httpHandlers;\n\n abstract class BoundMcpHttpController {\n @Post()\n post(@Req() req: unknown, @Res() res: unknown): Promise<void> | void {\n return handlers.handlePost(req, res);\n }\n\n @Get()\n get(@Req() req: unknown, @Res() res: unknown): Promise<void> | void {\n return handlers.handleGet(req, res);\n }\n\n @Delete()\n delete(@Req() req: unknown, @Res() res: unknown): Promise<void> | void {\n return handlers.handleDelete(req, res);\n }\n }\n\n return BoundMcpHttpController;\n}\n\n/**\n * Abstract base controller for the streamable-HTTP MCP endpoint.\n *\n * Extend it to mount the MCP route as a real NestJS controller — so guards,\n * interceptors, exception filters and versioning apply the normal Nest way,\n * while the library keeps ownership of the `POST`/`GET`/`DELETE` wiring\n * (session handling, SSE streaming, raw-body reading). You never reimplement the\n * verbs; you just decorate your subclass:\n *\n * ```ts\n * @Controller('mcp')\n * @UseGuards(MyAuthGuard) // ← authenticate the whole MCP surface, once\n * export class McpController extends StreamableHttpController {}\n * ```\n *\n * Wiring is a single line — provide the transport's handlers under\n * {@link MCP_HTTP_HANDLER} so this base can inject them:\n *\n * ```ts\n * { provide: MCP_HTTP_HANDLER, useValue: mcpTransport.httpHandlers }\n * ```\n *\n * Reading `httpHandlers` there also auto-disables the transport's own\n * self-mount, so you do NOT need `{ mount: false }` — your controller owns the\n * route and there is no double-registration. (Pass `mount` explicitly only to\n * override that.) The path lives on YOUR `@Controller(...)` decorator, not on\n * the transport.\n *\n * Implementation notes:\n * - `@Controller()` must be on the concrete subclass; Nest registers the route\n * handlers it finds on the prototype chain, including these inherited ones.\n * - The handler is injected via a property (not the constructor) so subclasses\n * need no constructor and no `super(...)` call — and so it survives NestJS's\n * inherited-constructor-metadata quirks.\n * - `@Res()` puts Nest in manual-response mode: the SDK transport writes the\n * response (and SSE stream) directly, so Nest must not serialize a return\n * value.\n */\nexport abstract class StreamableHttpController {\n @Inject(MCP_HTTP_HANDLER)\n protected readonly mcpHandler!: McpHttpHandler;\n\n @Post()\n post(@Req() req: unknown, @Res() res: unknown): Promise<void> | void {\n return this.mcpHandler.handlePost(req, res);\n }\n\n @Get()\n get(@Req() req: unknown, @Res() res: unknown): Promise<void> | void {\n return this.mcpHandler.handleGet(req, res);\n }\n\n @Delete()\n delete(@Req() req: unknown, @Res() res: unknown): Promise<void> | void {\n return this.mcpHandler.handleDelete(req, res);\n }\n}\n"]}
@@ -0,0 +1,3 @@
1
+ export * from './stdio.transport';
2
+ export * from './streamable-http.transport';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/mcp/transport/transports/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,6BAA6B,CAAC"}
@@ -14,14 +14,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./mcp-oauth.controller"), exports);
18
- __exportStar(require("./mcp-oauth.module"), exports);
19
- __exportStar(require("./providers/oauth-provider.interface"), exports);
20
- __exportStar(require("./providers/google.provider"), exports);
21
- __exportStar(require("./providers/github.provider"), exports);
22
- __exportStar(require("./providers/azure-ad.provider"), exports);
23
- __exportStar(require("./stores/oauth-store.interface"), exports);
24
- __exportStar(require("./stores/memory-store.service"), exports);
25
- __exportStar(require("./interfaces/request-with-user"), exports);
26
- __exportStar(require("./guards/jwt-auth.guard"), exports);
17
+ __exportStar(require("./stdio.transport"), exports);
18
+ __exportStar(require("./streamable-http.transport"), exports);
27
19
  //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/mcp/transport/transports/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAkC;AAClC,8DAA4C","sourcesContent":["export * from './stdio.transport';\nexport * from './streamable-http.transport';\n"]}
@@ -0,0 +1,3 @@
1
+ import { HttpRequest } from '../../interfaces/http-adapter.interface';
2
+ export declare function readJsonBody(adaptedReq: HttpRequest): Promise<unknown>;
3
+ //# sourceMappingURL=read-body.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-body.d.ts","sourceRoot":"","sources":["../../../../src/mcp/transport/transports/read-body.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAC;AAYtE,wBAAsB,YAAY,CAAC,UAAU,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CA0B5E"}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.readJsonBody = readJsonBody;
4
+ async function readJsonBody(adaptedReq) {
5
+ if (adaptedReq.body !== undefined) {
6
+ return adaptedReq.body;
7
+ }
8
+ const rawReq = adaptedReq.raw;
9
+ if (rawReq?.body !== undefined) {
10
+ return rawReq.body;
11
+ }
12
+ return new Promise((resolve) => {
13
+ let data = '';
14
+ rawReq.on('data', (chunk) => {
15
+ data += chunk.toString();
16
+ });
17
+ rawReq.on('end', () => {
18
+ if (!data) {
19
+ resolve(undefined);
20
+ return;
21
+ }
22
+ try {
23
+ resolve(JSON.parse(data));
24
+ }
25
+ catch {
26
+ resolve(undefined);
27
+ }
28
+ });
29
+ rawReq.on('error', () => resolve(undefined));
30
+ });
31
+ }
32
+ //# sourceMappingURL=read-body.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-body.js","sourceRoot":"","sources":["../../../../src/mcp/transport/transports/read-body.ts"],"names":[],"mappings":";;AAYA,oCA0BC;AA1BM,KAAK,UAAU,YAAY,CAAC,UAAuB;IACxD,IAAI,UAAU,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAClC,OAAO,UAAU,CAAC,IAAI,CAAC;IACzB,CAAC;IACD,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC;IAC9B,IAAI,MAAM,EAAE,IAAI,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IACD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAsB,EAAE,EAAE;YAC3C,IAAI,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC3B,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;YACpB,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,CAAC,SAAS,CAAC,CAAC;gBACnB,OAAO;YACT,CAAC;YACD,IAAI,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,SAAS,CAAC,CAAC;YACrB,CAAC;QACH,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { HttpRequest } from '../../interfaces/http-adapter.interface';\n\n/**\n * Resolves the JSON request body for an MCP HTTP request.\n *\n * Prefers an already-parsed body (`adaptedReq.body`) when a framework body-parser\n * ran (e.g. Fastify parses before route handlers). Otherwise reads the raw Node\n * stream — the case for Express, where MCP routes are mounted before NestJS adds\n * its body-parser middleware, so `req.body` is undefined and the stream is intact.\n * Reading once here also lets the transport inspect the payload (e.g. to detect an\n * `initialize` request) before handing off to the SDK.\n */\nexport async function readJsonBody(adaptedReq: HttpRequest): Promise<unknown> {\n if (adaptedReq.body !== undefined) {\n return adaptedReq.body;\n }\n const rawReq = adaptedReq.raw;\n if (rawReq?.body !== undefined) {\n return rawReq.body;\n }\n return new Promise((resolve) => {\n let data = '';\n rawReq.on('data', (chunk: Buffer | string) => {\n data += chunk.toString();\n });\n rawReq.on('end', () => {\n if (!data) {\n resolve(undefined);\n return;\n }\n try {\n resolve(JSON.parse(data));\n } catch {\n resolve(undefined);\n }\n });\n rawReq.on('error', () => resolve(undefined));\n });\n}\n"]}
@@ -0,0 +1,9 @@
1
+ import { McpTransport, McpTransportContext } from '../mcp-transport.interface';
2
+ export declare class StdioTransport implements McpTransport {
3
+ readonly kind: "stdio";
4
+ private server?;
5
+ private transport?;
6
+ start(ctx: McpTransportContext): Promise<void>;
7
+ close(): Promise<void>;
8
+ }
9
+ //# sourceMappingURL=stdio.transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio.transport.d.ts","sourceRoot":"","sources":["../../../../src/mcp/transport/transports/stdio.transport.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAS/E,qBAAa,cAAe,YAAW,YAAY;IACjD,QAAQ,CAAC,IAAI,EAAG,OAAO,CAAU;IAEjC,OAAO,CAAC,MAAM,CAAC,CAAY;IAC3B,OAAO,CAAC,SAAS,CAAC,CAAuB;IAEnC,KAAK,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAW9C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAM7B"}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StdioTransport = void 0;
4
+ const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
5
+ class StdioTransport {
6
+ constructor() {
7
+ this.kind = 'stdio';
8
+ }
9
+ async start(ctx) {
10
+ this.server = ctx.createServer();
11
+ ctx.bindRequestHandlers(this.server, {
12
+ transport: this.kind,
13
+ stateless: false,
14
+ });
15
+ this.transport = new stdio_js_1.StdioServerTransport();
16
+ await this.server.connect(this.transport);
17
+ ctx.logger.log('MCP stdio transport started');
18
+ }
19
+ async close() {
20
+ await this.transport?.close();
21
+ await this.server?.close();
22
+ this.transport = undefined;
23
+ this.server = undefined;
24
+ }
25
+ }
26
+ exports.StdioTransport = StdioTransport;
27
+ //# sourceMappingURL=stdio.transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio.transport.js","sourceRoot":"","sources":["../../../../src/mcp/transport/transports/stdio.transport.ts"],"names":[],"mappings":";;;AACA,wEAAiF;AAUjF,MAAa,cAAc;IAA3B;QACW,SAAI,GAAG,OAAgB,CAAC;IAsBnC,CAAC;IAjBC,KAAK,CAAC,KAAK,CAAC,GAAwB;QAClC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;QACjC,GAAG,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,EAAE;YACnC,SAAS,EAAE,IAAI,CAAC,IAAI;YACpB,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,GAAG,IAAI,+BAAoB,EAAE,CAAC;QAC5C,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC1C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC;QAC9B,MAAM,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;IAC1B,CAAC;CACF;AAvBD,wCAuBC","sourcesContent":["import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { McpTransport, McpTransportContext } from '../mcp-transport.interface';\n\n/**\n * stdio transport. Starts a single long-lived MCP server bound to the process'\n * stdin/stdout. Intended for CLI-style MCP servers launched by an MCP client.\n *\n * No HTTP adapter is required. As a persistent, session-aware connection, stdio\n * supports progress notifications and server-side logging.\n */\nexport class StdioTransport implements McpTransport {\n readonly kind = 'stdio' as const;\n\n private server?: McpServer;\n private transport?: StdioServerTransport;\n\n async start(ctx: McpTransportContext): Promise<void> {\n this.server = ctx.createServer();\n ctx.bindRequestHandlers(this.server, {\n transport: this.kind,\n stateless: false,\n });\n this.transport = new StdioServerTransport();\n await this.server.connect(this.transport);\n ctx.logger.log('MCP stdio transport started');\n }\n\n async close(): Promise<void> {\n await this.transport?.close();\n await this.server?.close();\n this.transport = undefined;\n this.server = undefined;\n }\n}\n"]}
@@ -0,0 +1,33 @@
1
+ import { McpTransport, McpTransportContext } from '../mcp-transport.interface';
2
+ import type { McpHttpHandler } from '../mcp-http-handler';
3
+ export interface StreamableHttpTransportOptions {
4
+ endpoint?: string;
5
+ statefulMode?: boolean;
6
+ enableJsonResponse?: boolean;
7
+ sessionIdGenerator?: () => string;
8
+ mount?: boolean;
9
+ }
10
+ export declare class StreamableHttpTransport implements McpTransport {
11
+ readonly kind: "streamable-http";
12
+ private readonly endpoint;
13
+ private readonly statefulMode;
14
+ private readonly enableJsonResponse;
15
+ private readonly sessionIdGenerator;
16
+ private readonly endpointExplicit;
17
+ private readonly mountOption?;
18
+ private handlersClaimed;
19
+ private readonly transports;
20
+ private readonly servers;
21
+ private ctx?;
22
+ constructor(options?: StreamableHttpTransportOptions);
23
+ get httpHandlers(): McpHttpHandler;
24
+ start(ctx: McpTransportContext): void;
25
+ close(): Promise<void>;
26
+ private handlePost;
27
+ private handleStateless;
28
+ private handleStateful;
29
+ private handleGet;
30
+ private handleDelete;
31
+ private cleanupSession;
32
+ }
33
+ //# sourceMappingURL=streamable-http.transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streamable-http.transport.d.ts","sourceRoot":"","sources":["../../../../src/mcp/transport/transports/streamable-http.transport.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAC/E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAG1D,MAAM,WAAW,8BAA8B;IAgB7C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAclB,YAAY,CAAC,EAAE,OAAO,CAAC;IAWvB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B,kBAAkB,CAAC,EAAE,MAAM,MAAM,CAAC;IAmBlC,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAOD,qBAAa,uBAAwB,YAAW,YAAY;IAC1D,QAAQ,CAAC,IAAI,EAAG,iBAAiB,CAAU;IAE3C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAU;IACvC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAU;IAC7C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAe;IAElD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAU;IAE3C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAU;IAEvC,OAAO,CAAC,eAAe,CAAS;IAEhC,OAAO,CAAC,QAAQ,CAAC,UAAU,CACtB;IACL,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;IACzD,OAAO,CAAC,GAAG,CAAC,CAAsB;gBAEtB,OAAO,GAAE,8BAAmC;IAwBxD,IAAI,YAAY,IAAI,cAAc,CAOjC;IAED,KAAK,CAAC,GAAG,EAAE,mBAAmB,GAAG,IAAI;IA4C/B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAMd,UAAU;YAwBV,eAAe;YA2Bf,cAAc;YA+Dd,SAAS;YA+BT,YAAY;YA+BZ,cAAc;CAY7B"}