@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
@@ -1,63 +0,0 @@
1
- import { InjectionToken, OnApplicationBootstrap } from '@nestjs/common';
2
- import { DiscoveryService, MetadataScanner, ModulesContainer } from '@nestjs/core';
3
- import { ToolMetadata } from '../decorators';
4
- import { ResourceMetadata } from '../decorators/resource.decorator';
5
- import { PromptMetadata } from '../decorators/prompt.decorator';
6
- import { ResourceTemplateMetadata } from '../decorators/resource-template.decorator';
7
- import type { McpOptions } from '../interfaces';
8
- export type DiscoveredCapability<T extends object> = {
9
- type: 'tool' | 'resource' | 'resource-template' | 'prompt';
10
- metadata: T;
11
- providerClass: InjectionToken;
12
- methodName: string;
13
- };
14
- export type InjectionTokenWithName = InjectionToken & {
15
- name: string;
16
- };
17
- export declare class McpRegistryDiscoveryService implements OnApplicationBootstrap {
18
- private readonly discovery;
19
- private readonly metadataScanner;
20
- private readonly modulesContainer;
21
- private readonly options?;
22
- private readonly logger;
23
- private discoveredCapabilitiesByMcpModuleId;
24
- constructor(discovery: DiscoveryService, metadataScanner: MetadataScanner, modulesContainer: ModulesContainer, options?: McpOptions | undefined);
25
- onApplicationBootstrap(): void;
26
- private discoverTools;
27
- private buildServerNameToModuleIdMap;
28
- private collectFeatureRegistrations;
29
- private processFeatureRegistrations;
30
- private findModuleWithProviders;
31
- private discoverToolsFromProviders;
32
- private discoverToolsForModuleSubtree;
33
- private addDiscovery;
34
- private addDiscoveryPrompt;
35
- private addDiscoveryTool;
36
- private addDiscoveryResource;
37
- private addDiscoveryResourceTemplate;
38
- getMcpModuleIds(): string[];
39
- getTools(mcpModuleId: string): DiscoveredCapability<ToolMetadata>[];
40
- findTool(mcpModuleId: string, name: string): DiscoveredCapability<ToolMetadata> | undefined;
41
- getResources(mcpModuleId: string): DiscoveredCapability<ResourceMetadata>[];
42
- findResource(mcpModuleId: string, name: string): DiscoveredCapability<ResourceMetadata> | undefined;
43
- getResourceTemplates(mcpModuleId: string): DiscoveredCapability<ResourceTemplateMetadata>[];
44
- findResourceTemplate(mcpModuleId: string, name: string): DiscoveredCapability<ResourceTemplateMetadata> | undefined;
45
- getPrompts(mcpModuleId: string): DiscoveredCapability<PromptMetadata>[];
46
- findPrompt(mcpModuleId: string, name: string): DiscoveredCapability<PromptMetadata> | undefined;
47
- private convertTemplate;
48
- private extractTemplateQueryParams;
49
- private parseQueryString;
50
- private stripQueryString;
51
- private convertUri;
52
- findResourceByUri(mcpModuleId: string, uri: string): {
53
- resource: DiscoveredCapability<ResourceMetadata>;
54
- params: Record<string, string>;
55
- } | undefined;
56
- findResourceTemplateByUri(mcpModuleId: string, uri: string): {
57
- resourceTemplate: DiscoveredCapability<ResourceTemplateMetadata>;
58
- params: Record<string, string>;
59
- } | undefined;
60
- registerDynamicCapability<T extends object>(mcpModuleId: string, capability: DiscoveredCapability<T>): void;
61
- removeDynamicCapability(mcpModuleId: string, type: DiscoveredCapability<object>['type'], identifier: string): void;
62
- }
63
- //# sourceMappingURL=mcp-registry-discovery.service.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp-registry-discovery.service.d.ts","sourceRoot":"","sources":["../../../src/mcp/services/mcp-registry-discovery.service.ts"],"names":[],"mappings":"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"}
@@ -1,397 +0,0 @@
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
- var McpRegistryDiscoveryService_1;
15
- Object.defineProperty(exports, "__esModule", { value: true });
16
- exports.McpRegistryDiscoveryService = void 0;
17
- const common_1 = require("@nestjs/common");
18
- const core_1 = require("@nestjs/core");
19
- const decorators_1 = require("../decorators");
20
- const path_to_regexp_1 = require("path-to-regexp");
21
- const mcp_logger_factory_1 = require("../utils/mcp-logger.factory");
22
- const feature_registration_constants_1 = require("../constants/feature-registration.constants");
23
- let McpRegistryDiscoveryService = McpRegistryDiscoveryService_1 = class McpRegistryDiscoveryService {
24
- constructor(discovery, metadataScanner, modulesContainer, options) {
25
- this.discovery = discovery;
26
- this.metadataScanner = metadataScanner;
27
- this.modulesContainer = modulesContainer;
28
- this.options = options;
29
- this.discoveredCapabilitiesByMcpModuleId = new Map();
30
- this.logger = (0, mcp_logger_factory_1.createMcpLogger)(McpRegistryDiscoveryService_1.name, this.options);
31
- }
32
- onApplicationBootstrap() {
33
- this.discoverTools();
34
- }
35
- discoverTools() {
36
- const serverNameToModuleId = this.buildServerNameToModuleIdMap();
37
- const featureRegistrations = this.collectFeatureRegistrations();
38
- const getImportedMcpModules = (module) => Array.from(module.imports).filter((m) => m.instance.__isMcpModule &&
39
- !m.instance.__isMcpFeatureModule);
40
- const pairs = Array.from(this.modulesContainer.values())
41
- .map((module) => [
42
- module,
43
- getImportedMcpModules(module),
44
- ])
45
- .filter(([, importedMcpModules]) => importedMcpModules.length > 0);
46
- for (const [rootModule, mcpModules] of pairs) {
47
- this.logger.debug(`Discovering tools, resources, resource templates, and prompts for module: ${rootModule.name}`);
48
- for (const mcpModule of mcpModules) {
49
- const mcpModuleId = mcpModule.getProviderByKey('MCP_MODULE_ID')?.instance;
50
- this.discoverToolsForModuleSubtree(mcpModuleId, [rootModule]);
51
- }
52
- }
53
- this.processFeatureRegistrations(featureRegistrations, serverNameToModuleId);
54
- }
55
- buildServerNameToModuleIdMap() {
56
- const map = new Map();
57
- for (const module of this.modulesContainer.values()) {
58
- if (module.instance?.__isMcpModule) {
59
- const moduleId = module.getProviderByKey('MCP_MODULE_ID')?.instance;
60
- const options = module.getProviderByKey('MCP_OPTIONS')?.instance;
61
- if (moduleId && options?.name) {
62
- map.set(options.name, moduleId);
63
- }
64
- }
65
- }
66
- return map;
67
- }
68
- collectFeatureRegistrations() {
69
- const registrations = [];
70
- for (const module of this.modulesContainer.values()) {
71
- for (const [key, provider] of module.providers) {
72
- if (typeof key === 'string' &&
73
- key.startsWith(feature_registration_constants_1.MCP_FEATURE_REGISTRATION) &&
74
- provider?.instance) {
75
- registrations.push({
76
- registration: provider.instance,
77
- sourceModule: module,
78
- });
79
- }
80
- }
81
- }
82
- return registrations;
83
- }
84
- processFeatureRegistrations(registrations, serverNameToModuleId) {
85
- for (const { registration, sourceModule } of registrations) {
86
- const mcpModuleId = serverNameToModuleId.get(registration.serverName);
87
- if (!mcpModuleId) {
88
- this.logger.warn(`McpModule.forFeature: No MCP server found with name '${registration.serverName}'. ` +
89
- `Make sure McpModule.forRoot({ name: '${registration.serverName}', ... }) is imported.`);
90
- continue;
91
- }
92
- this.logger.debug(`Processing forFeature registration for server '${registration.serverName}' ` +
93
- `with ${registration.providerTokens.length} provider(s)`);
94
- const parentModule = this.findModuleWithProviders(registration.providerTokens, sourceModule);
95
- if (parentModule) {
96
- this.discoverToolsFromProviders(mcpModuleId, registration.providerTokens, parentModule);
97
- }
98
- }
99
- }
100
- findModuleWithProviders(providerTokens, sourceModule) {
101
- for (const module of this.modulesContainer.values()) {
102
- if (module.imports.has(sourceModule)) {
103
- const hasAllProviders = providerTokens.every((token) => module.getProviderByKey(token));
104
- if (hasAllProviders) {
105
- return module;
106
- }
107
- }
108
- }
109
- for (const module of this.modulesContainer.values()) {
110
- const hasAllProviders = providerTokens.every((token) => module.getProviderByKey(token));
111
- if (hasAllProviders) {
112
- return module;
113
- }
114
- }
115
- return undefined;
116
- }
117
- discoverToolsFromProviders(mcpModuleId, providerTokens, module) {
118
- for (const token of providerTokens) {
119
- const provider = module.getProviderByKey(token);
120
- if (!provider?.instance || typeof provider.instance !== 'object') {
121
- this.logger.warn(`McpModule.forFeature: Provider '${String(token)}' not found or not instantiated`);
122
- continue;
123
- }
124
- const instance = provider.instance;
125
- this.metadataScanner.getAllMethodNames(instance).forEach((methodName) => {
126
- const methodRef = instance[methodName];
127
- const methodMetaKeys = Reflect.getOwnMetadataKeys(methodRef);
128
- if (methodMetaKeys.includes(decorators_1.MCP_TOOL_METADATA_KEY)) {
129
- this.addDiscoveryTool(mcpModuleId, methodRef, token, methodName);
130
- }
131
- if (methodMetaKeys.includes(decorators_1.MCP_RESOURCE_METADATA_KEY)) {
132
- this.addDiscoveryResource(mcpModuleId, methodRef, token, methodName);
133
- }
134
- if (methodMetaKeys.includes(decorators_1.MCP_RESOURCE_TEMPLATE_METADATA_KEY)) {
135
- this.addDiscoveryResourceTemplate(mcpModuleId, methodRef, token, methodName);
136
- }
137
- if (methodMetaKeys.includes(decorators_1.MCP_PROMPT_METADATA_KEY)) {
138
- this.addDiscoveryPrompt(mcpModuleId, methodRef, token, methodName);
139
- }
140
- });
141
- }
142
- }
143
- discoverToolsForModuleSubtree(mcpModuleId, modules) {
144
- const providers = this.discovery.getProviders(undefined, modules);
145
- const controllers = this.discovery.getControllers(undefined, modules);
146
- const allInstances = [...providers, ...controllers]
147
- .filter((wrapper) => wrapper.instance &&
148
- typeof wrapper.instance === 'object' &&
149
- wrapper.instance !== null)
150
- .map((wrapper) => ({
151
- instance: wrapper.instance,
152
- token: wrapper.token,
153
- }));
154
- allInstances.forEach(({ instance, token }) => {
155
- this.metadataScanner.getAllMethodNames(instance).forEach((methodName) => {
156
- const methodRef = instance[methodName];
157
- const methodMetaKeys = Reflect.getOwnMetadataKeys(methodRef);
158
- if (methodMetaKeys.includes(decorators_1.MCP_TOOL_METADATA_KEY)) {
159
- this.addDiscoveryTool(mcpModuleId, methodRef, token, methodName);
160
- }
161
- if (methodMetaKeys.includes(decorators_1.MCP_RESOURCE_METADATA_KEY)) {
162
- this.addDiscoveryResource(mcpModuleId, methodRef, token, methodName);
163
- }
164
- if (methodMetaKeys.includes(decorators_1.MCP_RESOURCE_TEMPLATE_METADATA_KEY)) {
165
- this.addDiscoveryResourceTemplate(mcpModuleId, methodRef, token, methodName);
166
- }
167
- if (methodMetaKeys.includes(decorators_1.MCP_PROMPT_METADATA_KEY)) {
168
- this.addDiscoveryPrompt(mcpModuleId, methodRef, token, methodName);
169
- }
170
- });
171
- });
172
- }
173
- addDiscovery(type, metadataKey, mcpModuleId, methodRef, token, methodName) {
174
- const metadata = Reflect.getMetadata(metadataKey, methodRef);
175
- if (!metadata['name']) {
176
- metadata['name'] = methodName;
177
- }
178
- if (!this.discoveredCapabilitiesByMcpModuleId.has(mcpModuleId)) {
179
- this.discoveredCapabilitiesByMcpModuleId.set(mcpModuleId, []);
180
- }
181
- this.discoveredCapabilitiesByMcpModuleId.get(mcpModuleId)?.push({
182
- type,
183
- metadata,
184
- providerClass: token,
185
- methodName,
186
- });
187
- }
188
- addDiscoveryPrompt(mcpModuleId, methodRef, token, methodName) {
189
- this.logger.debug(`Prompt discovered: ${token.name}.${methodName} in module: ${mcpModuleId}`);
190
- this.addDiscovery('prompt', decorators_1.MCP_PROMPT_METADATA_KEY, mcpModuleId, methodRef, token, methodName);
191
- }
192
- addDiscoveryTool(mcpModuleId, methodRef, token, methodName) {
193
- this.logger.debug(`Tool discovered: ${token.name}.${methodName} in module: ${mcpModuleId}`);
194
- const isPublic = Reflect.getMetadata(decorators_1.MCP_PUBLIC_METADATA_KEY, methodRef);
195
- const requiredScopes = Reflect.getMetadata(decorators_1.MCP_SCOPES_METADATA_KEY, methodRef);
196
- const requiredRoles = Reflect.getMetadata(decorators_1.MCP_ROLES_METADATA_KEY, methodRef);
197
- const guards = Reflect.getMetadata(decorators_1.MCP_GUARDS_METADATA_KEY, methodRef);
198
- const baseMetadata = Reflect.getMetadata(decorators_1.MCP_TOOL_METADATA_KEY, methodRef);
199
- if (!baseMetadata.name) {
200
- baseMetadata.name = methodName;
201
- }
202
- if (isPublic !== undefined) {
203
- baseMetadata.isPublic = isPublic;
204
- }
205
- if (requiredScopes) {
206
- baseMetadata.requiredScopes = requiredScopes;
207
- }
208
- if (requiredRoles) {
209
- baseMetadata.requiredRoles = requiredRoles;
210
- }
211
- if (guards) {
212
- baseMetadata.guards = guards;
213
- }
214
- if (!this.discoveredCapabilitiesByMcpModuleId.has(mcpModuleId)) {
215
- this.discoveredCapabilitiesByMcpModuleId.set(mcpModuleId, []);
216
- }
217
- this.discoveredCapabilitiesByMcpModuleId.get(mcpModuleId)?.push({
218
- type: 'tool',
219
- metadata: baseMetadata,
220
- providerClass: token,
221
- methodName,
222
- });
223
- }
224
- addDiscoveryResource(mcpModuleId, methodRef, token, methodName) {
225
- this.logger.debug(`Resource discovered: ${token.name}.${methodName} in module: ${mcpModuleId}`);
226
- this.addDiscovery('resource', decorators_1.MCP_RESOURCE_METADATA_KEY, mcpModuleId, methodRef, token, methodName);
227
- }
228
- addDiscoveryResourceTemplate(mcpModuleId, methodRef, token, methodName) {
229
- this.logger.debug(`Resource Template discovered: ${token.name}.${methodName} in module: ${mcpModuleId}`);
230
- this.addDiscovery('resource-template', decorators_1.MCP_RESOURCE_TEMPLATE_METADATA_KEY, mcpModuleId, methodRef, token, methodName);
231
- }
232
- getMcpModuleIds() {
233
- return Array.from(this.discoveredCapabilitiesByMcpModuleId.keys());
234
- }
235
- getTools(mcpModuleId) {
236
- return (this.discoveredCapabilitiesByMcpModuleId
237
- .get(mcpModuleId)
238
- ?.filter((tool) => tool.type === 'tool') ?? []);
239
- }
240
- findTool(mcpModuleId, name) {
241
- return this.getTools(mcpModuleId).find((tool) => tool.metadata.name === name);
242
- }
243
- getResources(mcpModuleId) {
244
- return (this.discoveredCapabilitiesByMcpModuleId
245
- .get(mcpModuleId)
246
- ?.filter((tool) => tool.type === 'resource') ?? []);
247
- }
248
- findResource(mcpModuleId, name) {
249
- return this.getResources(mcpModuleId).find((tool) => tool.metadata.name === name);
250
- }
251
- getResourceTemplates(mcpModuleId) {
252
- return (this.discoveredCapabilitiesByMcpModuleId
253
- .get(mcpModuleId)
254
- ?.filter((tool) => tool.type === 'resource-template') ?? []);
255
- }
256
- findResourceTemplate(mcpModuleId, name) {
257
- return this.getResourceTemplates(mcpModuleId).find((tool) => tool.metadata.name === name);
258
- }
259
- getPrompts(mcpModuleId) {
260
- return (this.discoveredCapabilitiesByMcpModuleId
261
- .get(mcpModuleId)
262
- ?.filter((tool) => tool.type === 'prompt') ?? []);
263
- }
264
- findPrompt(mcpModuleId, name) {
265
- return this.getPrompts(mcpModuleId).find((tool) => tool.metadata.name === name);
266
- }
267
- convertTemplate(template) {
268
- if (!template)
269
- return template;
270
- const withoutQueryParams = template.replace(/\{\?[^}]+\}/g, '');
271
- return withoutQueryParams.replace(/{(\w+)}/g, ':$1');
272
- }
273
- extractTemplateQueryParams(template) {
274
- const queryParamMatch = template.match(/\{\?([^}]+)\}/);
275
- if (!queryParamMatch)
276
- return [];
277
- return queryParamMatch[1].split(',').map((p) => p.trim());
278
- }
279
- parseQueryString(uri) {
280
- const queryIndex = uri.indexOf('?');
281
- if (queryIndex === -1)
282
- return {};
283
- const queryString = uri.substring(queryIndex + 1);
284
- const params = {};
285
- for (const pair of queryString.split('&')) {
286
- const [key, value] = pair.split('=');
287
- if (key) {
288
- params[decodeURIComponent(key)] = value
289
- ? decodeURIComponent(value)
290
- : '';
291
- }
292
- }
293
- return params;
294
- }
295
- stripQueryString(uri) {
296
- const queryIndex = uri.indexOf('?');
297
- return queryIndex === -1 ? uri : uri.substring(0, queryIndex);
298
- }
299
- convertUri(uri) {
300
- if (uri.includes('://')) {
301
- return uri.split('://')[1];
302
- }
303
- return uri;
304
- }
305
- findResourceByUri(mcpModuleId, uri) {
306
- const resources = this.getResources(mcpModuleId).map((tool) => ({
307
- name: tool.metadata.name,
308
- uri: tool.metadata.uri,
309
- }));
310
- const strippedInputUri = this.convertUri(uri);
311
- for (const t of resources) {
312
- if (!t.uri)
313
- continue;
314
- const rawTemplate = t.uri;
315
- const templatePath = this.convertTemplate(this.convertUri(rawTemplate));
316
- const matcher = (0, path_to_regexp_1.match)(templatePath, { decode: decodeURIComponent });
317
- const result = matcher(strippedInputUri);
318
- if (result) {
319
- const foundResource = this.findResource(mcpModuleId, t.name);
320
- if (!foundResource)
321
- continue;
322
- return {
323
- resource: foundResource,
324
- params: result.params,
325
- };
326
- }
327
- }
328
- return undefined;
329
- }
330
- findResourceTemplateByUri(mcpModuleId, uri) {
331
- const resourceTemplates = this.getResourceTemplates(mcpModuleId).map((tool) => ({
332
- name: tool.metadata.name,
333
- uriTemplate: tool.metadata.uriTemplate,
334
- }));
335
- const strippedInputUri = this.stripQueryString(this.convertUri(uri));
336
- const inputQueryParams = this.parseQueryString(uri);
337
- for (const t of resourceTemplates) {
338
- if (!t.uriTemplate)
339
- continue;
340
- const rawTemplate = t.uriTemplate;
341
- const templatePath = this.convertTemplate(this.convertUri(rawTemplate));
342
- const matcher = (0, path_to_regexp_1.match)(templatePath, { decode: decodeURIComponent });
343
- const result = matcher(strippedInputUri);
344
- if (result) {
345
- const foundResourceTemplate = this.findResourceTemplate(mcpModuleId, t.name);
346
- if (!foundResourceTemplate)
347
- continue;
348
- const pathParams = result.params;
349
- const expectedQueryParams = this.extractTemplateQueryParams(rawTemplate);
350
- const queryParams = {};
351
- for (const paramName of expectedQueryParams) {
352
- if (inputQueryParams[paramName] !== undefined) {
353
- queryParams[paramName] = inputQueryParams[paramName];
354
- }
355
- }
356
- return {
357
- resourceTemplate: foundResourceTemplate,
358
- params: { ...pathParams, ...queryParams },
359
- };
360
- }
361
- }
362
- return undefined;
363
- }
364
- registerDynamicCapability(mcpModuleId, capability) {
365
- if (!this.discoveredCapabilitiesByMcpModuleId.has(mcpModuleId)) {
366
- this.discoveredCapabilitiesByMcpModuleId.set(mcpModuleId, []);
367
- }
368
- const capabilities = this.discoveredCapabilitiesByMcpModuleId.get(mcpModuleId);
369
- const existingIndex = capabilities.findIndex((c) => c.type === capability.type && c.methodName === capability.methodName);
370
- if (existingIndex !== -1) {
371
- this.logger.warn(`Dynamic ${capability.type} '${capability.methodName}' already registered in module: ${mcpModuleId}. Overwriting.`);
372
- capabilities[existingIndex] = capability;
373
- }
374
- else {
375
- this.logger.debug(`Dynamic ${capability.type} registered: ${capability.metadata['name']} in module: ${mcpModuleId}`);
376
- capabilities.push(capability);
377
- }
378
- }
379
- removeDynamicCapability(mcpModuleId, type, identifier) {
380
- const capabilities = this.discoveredCapabilitiesByMcpModuleId.get(mcpModuleId);
381
- if (!capabilities) {
382
- return;
383
- }
384
- this.logger.debug(`Dynamic ${type} removed: ${identifier} in module: ${mcpModuleId}`);
385
- this.discoveredCapabilitiesByMcpModuleId.set(mcpModuleId, capabilities.filter((c) => !(c.type === type && c.methodName === identifier)));
386
- }
387
- };
388
- exports.McpRegistryDiscoveryService = McpRegistryDiscoveryService;
389
- exports.McpRegistryDiscoveryService = McpRegistryDiscoveryService = McpRegistryDiscoveryService_1 = __decorate([
390
- (0, common_1.Injectable)(),
391
- __param(3, (0, common_1.Optional)()),
392
- __param(3, (0, common_1.Inject)('MCP_OPTIONS')),
393
- __metadata("design:paramtypes", [core_1.DiscoveryService,
394
- core_1.MetadataScanner,
395
- core_1.ModulesContainer, Object])
396
- ], McpRegistryDiscoveryService);
397
- //# sourceMappingURL=mcp-registry-discovery.service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp-registry-discovery.service.js","sourceRoot":"","sources":["../../../src/mcp/services/mcp-registry-discovery.service.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Injectable,\n InjectionToken,\n Logger,\n OnApplicationBootstrap,\n Inject,\n Optional,\n} from '@nestjs/common';\nimport {\n DiscoveryService,\n MetadataScanner,\n ModulesContainer,\n} from '@nestjs/core';\nimport {\n MCP_PROMPT_METADATA_KEY,\n MCP_RESOURCE_METADATA_KEY,\n MCP_RESOURCE_TEMPLATE_METADATA_KEY,\n MCP_TOOL_METADATA_KEY,\n MCP_PUBLIC_METADATA_KEY,\n MCP_SCOPES_METADATA_KEY,\n MCP_ROLES_METADATA_KEY,\n MCP_GUARDS_METADATA_KEY,\n ToolMetadata,\n} from '../decorators';\nimport { ResourceMetadata } from '../decorators/resource.decorator';\nimport { match } from 'path-to-regexp';\nimport { PromptMetadata } from '../decorators/prompt.decorator';\nimport { Module } from '@nestjs/core/injector/module';\nimport { ResourceTemplateMetadata } from '../decorators/resource-template.decorator';\nimport type { McpOptions } from '../interfaces';\nimport { createMcpLogger } from '../utils/mcp-logger.factory';\nimport {\n MCP_FEATURE_REGISTRATION,\n McpFeatureRegistration,\n} from '../constants/feature-registration.constants';\n\n/**\n * Interface representing a discovered capability\n */\nexport type DiscoveredCapability<T extends object> = {\n type: 'tool' | 'resource' | 'resource-template' | 'prompt';\n metadata: T;\n providerClass: InjectionToken;\n methodName: string;\n};\n\nexport type InjectionTokenWithName = InjectionToken & { name: string };\n\n/**\n * Singleton service that discovers and registers tools during application bootstrap\n */\n@Injectable()\nexport class McpRegistryDiscoveryService implements OnApplicationBootstrap {\n private readonly logger: Logger;\n private discoveredCapabilitiesByMcpModuleId: Map<\n string,\n DiscoveredCapability<any>[]\n > = new Map();\n\n constructor(\n private readonly discovery: DiscoveryService,\n private readonly metadataScanner: MetadataScanner,\n private readonly modulesContainer: ModulesContainer,\n @Optional() @Inject('MCP_OPTIONS') private readonly options?: McpOptions,\n ) {\n this.logger = createMcpLogger(\n McpRegistryDiscoveryService.name,\n this.options,\n );\n }\n\n onApplicationBootstrap() {\n this.discoverTools();\n }\n\n /**\n * Finds all modules that import the McpModule and scans only the root module providers and controllers.\n * This prevents unintentionally exposing tools from imported dependencies.\n */\n private discoverTools() {\n // First, build a map of server names to module IDs\n const serverNameToModuleId = this.buildServerNameToModuleIdMap();\n\n // Then, collect feature registrations\n const featureRegistrations = this.collectFeatureRegistrations();\n\n const getImportedMcpModules = (module: Module) =>\n Array.from(module.imports).filter(\n (m) =>\n (m.instance as any).__isMcpModule &&\n !(m.instance as any).__isMcpFeatureModule,\n );\n\n const pairs = Array.from(this.modulesContainer.values())\n .map((module): [Module, Module[]] => [\n module,\n getImportedMcpModules(module),\n ])\n .filter(([, importedMcpModules]) => importedMcpModules.length > 0);\n\n for (const [rootModule, mcpModules] of pairs) {\n this.logger.debug(\n `Discovering tools, resources, resource templates, and prompts for module: ${rootModule.name}`,\n );\n\n for (const mcpModule of mcpModules) {\n const mcpModuleId =\n mcpModule.getProviderByKey<string>('MCP_MODULE_ID')?.instance;\n\n this.discoverToolsForModuleSubtree(mcpModuleId, [rootModule]);\n }\n }\n\n // Process feature registrations\n this.processFeatureRegistrations(\n featureRegistrations,\n serverNameToModuleId,\n );\n }\n\n /**\n * Builds a map from server names to their module IDs.\n */\n private buildServerNameToModuleIdMap(): Map<string, string> {\n const map = new Map<string, string>();\n\n for (const module of this.modulesContainer.values()) {\n if ((module.instance as any)?.__isMcpModule) {\n const moduleId =\n module.getProviderByKey<string>('MCP_MODULE_ID')?.instance;\n const options =\n module.getProviderByKey<McpOptions>('MCP_OPTIONS')?.instance;\n\n if (moduleId && options?.name) {\n map.set(options.name, moduleId);\n }\n }\n }\n\n return map;\n }\n\n /**\n * Collects all feature registrations from modules that import McpModule.forFeature().\n */\n private collectFeatureRegistrations(): Array<{\n registration: McpFeatureRegistration;\n sourceModule: Module;\n }> {\n const registrations: Array<{\n registration: McpFeatureRegistration;\n sourceModule: Module;\n }> = [];\n\n for (const module of this.modulesContainer.values()) {\n // Check for feature registration providers (tokens start with MCP_FEATURE_REGISTRATION)\n for (const [key, provider] of module.providers) {\n if (\n typeof key === 'string' &&\n key.startsWith(MCP_FEATURE_REGISTRATION) &&\n provider?.instance\n ) {\n registrations.push({\n registration: provider.instance as McpFeatureRegistration,\n sourceModule: module,\n });\n }\n }\n }\n\n return registrations;\n }\n\n /**\n * Processes feature registrations and discovers tools from their providers.\n */\n private processFeatureRegistrations(\n registrations: Array<{\n registration: McpFeatureRegistration;\n sourceModule: Module;\n }>,\n serverNameToModuleId: Map<string, string>,\n ) {\n for (const { registration, sourceModule } of registrations) {\n const mcpModuleId = serverNameToModuleId.get(registration.serverName);\n\n if (!mcpModuleId) {\n this.logger.warn(\n `McpModule.forFeature: No MCP server found with name '${registration.serverName}'. ` +\n `Make sure McpModule.forRoot({ name: '${registration.serverName}', ... }) is imported.`,\n );\n continue;\n }\n\n this.logger.debug(\n `Processing forFeature registration for server '${registration.serverName}' ` +\n `with ${registration.providerTokens.length} provider(s)`,\n );\n\n // Find the module that actually provides these providers\n // The sourceModule imports the forFeature module, so we look at its parent\n const parentModule = this.findModuleWithProviders(\n registration.providerTokens,\n sourceModule,\n );\n\n if (parentModule) {\n this.discoverToolsFromProviders(\n mcpModuleId,\n registration.providerTokens,\n parentModule,\n );\n }\n }\n }\n\n /**\n * Finds a module that contains the specified providers.\n * Searches the source module and its parent modules.\n */\n private findModuleWithProviders(\n providerTokens: InjectionToken[],\n sourceModule: Module,\n ): Module | undefined {\n // First check if the source module's parent has the providers\n for (const module of this.modulesContainer.values()) {\n if (module.imports.has(sourceModule)) {\n // This module imports our source module, check if it has the providers\n const hasAllProviders = providerTokens.every((token) =>\n module.getProviderByKey(token),\n );\n if (hasAllProviders) {\n return module;\n }\n }\n }\n\n // Fallback: search all modules\n for (const module of this.modulesContainer.values()) {\n const hasAllProviders = providerTokens.every((token) =>\n module.getProviderByKey(token),\n );\n if (hasAllProviders) {\n return module;\n }\n }\n\n return undefined;\n }\n\n /**\n * Discovers tools from specific providers within a module.\n */\n private discoverToolsFromProviders(\n mcpModuleId: string,\n providerTokens: InjectionToken[],\n module: Module,\n ) {\n for (const token of providerTokens) {\n const provider = module.getProviderByKey(token);\n if (!provider?.instance || typeof provider.instance !== 'object') {\n this.logger.warn(\n `McpModule.forFeature: Provider '${String(token)}' not found or not instantiated`,\n );\n continue;\n }\n\n const instance = provider.instance as object;\n this.metadataScanner.getAllMethodNames(instance).forEach((methodName) => {\n const methodRef = instance[methodName] as object;\n const methodMetaKeys = Reflect.getOwnMetadataKeys(methodRef);\n\n if (methodMetaKeys.includes(MCP_TOOL_METADATA_KEY)) {\n this.addDiscoveryTool(\n mcpModuleId,\n methodRef,\n token as InjectionTokenWithName,\n methodName,\n );\n }\n\n if (methodMetaKeys.includes(MCP_RESOURCE_METADATA_KEY)) {\n this.addDiscoveryResource(\n mcpModuleId,\n methodRef,\n token as InjectionTokenWithName,\n methodName,\n );\n }\n\n if (methodMetaKeys.includes(MCP_RESOURCE_TEMPLATE_METADATA_KEY)) {\n this.addDiscoveryResourceTemplate(\n mcpModuleId,\n methodRef,\n token as InjectionTokenWithName,\n methodName,\n );\n }\n\n if (methodMetaKeys.includes(MCP_PROMPT_METADATA_KEY)) {\n this.addDiscoveryPrompt(\n mcpModuleId,\n methodRef,\n token as InjectionTokenWithName,\n methodName,\n );\n }\n });\n }\n }\n\n /**\n * Scans all providers and controllers for @Tool decorators\n */\n private discoverToolsForModuleSubtree(\n mcpModuleId: string,\n modules: Module[],\n ) {\n const providers = this.discovery.getProviders(undefined, modules);\n const controllers = this.discovery.getControllers(undefined, modules);\n const allInstances = [...providers, ...controllers]\n .filter(\n (wrapper) =>\n wrapper.instance &&\n typeof wrapper.instance === 'object' &&\n wrapper.instance !== null,\n )\n .map((wrapper) => ({\n instance: wrapper.instance as object,\n token: wrapper.token,\n }));\n\n allInstances.forEach(({ instance, token }) => {\n this.metadataScanner.getAllMethodNames(instance).forEach((methodName) => {\n const methodRef = instance[methodName] as object;\n const methodMetaKeys = Reflect.getOwnMetadataKeys(methodRef);\n\n if (methodMetaKeys.includes(MCP_TOOL_METADATA_KEY)) {\n this.addDiscoveryTool(\n mcpModuleId,\n methodRef,\n token as InjectionTokenWithName,\n methodName,\n );\n }\n\n if (methodMetaKeys.includes(MCP_RESOURCE_METADATA_KEY)) {\n this.addDiscoveryResource(\n mcpModuleId,\n methodRef,\n token as InjectionTokenWithName,\n methodName,\n );\n }\n\n if (methodMetaKeys.includes(MCP_RESOURCE_TEMPLATE_METADATA_KEY)) {\n this.addDiscoveryResourceTemplate(\n mcpModuleId,\n methodRef,\n token as InjectionTokenWithName,\n methodName,\n );\n }\n\n if (methodMetaKeys.includes(MCP_PROMPT_METADATA_KEY)) {\n this.addDiscoveryPrompt(\n mcpModuleId,\n methodRef,\n token as InjectionTokenWithName,\n methodName,\n );\n }\n });\n });\n }\n\n /**\n * Adds a discovered tool to the registry\n */\n private addDiscovery<T>(\n type: 'tool' | 'resource' | 'resource-template' | 'prompt',\n metadataKey: string,\n mcpModuleId: string,\n methodRef: object,\n token: InjectionTokenWithName,\n methodName: string,\n ) {\n const metadata: T = Reflect.getMetadata(metadataKey, methodRef);\n\n if (!metadata['name']) {\n metadata['name'] = methodName;\n }\n\n if (!this.discoveredCapabilitiesByMcpModuleId.has(mcpModuleId)) {\n this.discoveredCapabilitiesByMcpModuleId.set(mcpModuleId, []);\n }\n\n this.discoveredCapabilitiesByMcpModuleId.get(mcpModuleId)?.push({\n type,\n metadata,\n providerClass: token,\n methodName,\n });\n }\n\n private addDiscoveryPrompt(\n mcpModuleId: string,\n methodRef: object,\n token: InjectionTokenWithName,\n methodName: string,\n ) {\n this.logger.debug(\n `Prompt discovered: ${token.name}.${methodName} in module: ${mcpModuleId}`,\n );\n this.addDiscovery<PromptMetadata>(\n 'prompt',\n MCP_PROMPT_METADATA_KEY,\n mcpModuleId,\n methodRef,\n token,\n methodName,\n );\n }\n\n private addDiscoveryTool(\n mcpModuleId: string,\n methodRef: object,\n token: InjectionTokenWithName,\n methodName: string,\n ) {\n this.logger.debug(\n `Tool discovered: ${token.name}.${methodName} in module: ${mcpModuleId}`,\n );\n\n // Collect security metadata from decorators\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 const guards = Reflect.getMetadata(MCP_GUARDS_METADATA_KEY, methodRef);\n\n // Add tool with security metadata\n const baseMetadata: ToolMetadata = Reflect.getMetadata(\n MCP_TOOL_METADATA_KEY,\n methodRef,\n );\n\n if (!baseMetadata.name) {\n baseMetadata.name = methodName;\n }\n\n // Enrich with security metadata\n if (isPublic !== undefined) {\n baseMetadata.isPublic = isPublic;\n }\n if (requiredScopes) {\n baseMetadata.requiredScopes = requiredScopes;\n }\n if (requiredRoles) {\n baseMetadata.requiredRoles = requiredRoles;\n }\n if (guards) {\n baseMetadata.guards = guards;\n }\n\n if (!this.discoveredCapabilitiesByMcpModuleId.has(mcpModuleId)) {\n this.discoveredCapabilitiesByMcpModuleId.set(mcpModuleId, []);\n }\n\n this.discoveredCapabilitiesByMcpModuleId.get(mcpModuleId)?.push({\n type: 'tool',\n metadata: baseMetadata,\n providerClass: token,\n methodName,\n });\n }\n\n private addDiscoveryResource(\n mcpModuleId: string,\n methodRef: object,\n token: InjectionTokenWithName,\n methodName: string,\n ) {\n this.logger.debug(\n `Resource discovered: ${token.name}.${methodName} in module: ${mcpModuleId}`,\n );\n this.addDiscovery<ResourceMetadata>(\n 'resource',\n MCP_RESOURCE_METADATA_KEY,\n mcpModuleId,\n methodRef,\n token,\n methodName,\n );\n }\n\n private addDiscoveryResourceTemplate(\n mcpModuleId: string,\n methodRef: object,\n token: InjectionTokenWithName,\n methodName: string,\n ) {\n this.logger.debug(\n `Resource Template discovered: ${token.name}.${methodName} in module: ${mcpModuleId}`,\n );\n this.addDiscovery<ResourceTemplateMetadata>(\n 'resource-template',\n MCP_RESOURCE_TEMPLATE_METADATA_KEY,\n mcpModuleId,\n methodRef,\n token,\n methodName,\n );\n }\n\n /**\n * Return all discovered MCP module IDs\n */\n getMcpModuleIds(): string[] {\n return Array.from(this.discoveredCapabilitiesByMcpModuleId.keys());\n }\n\n /**\n * Get all discovered tools\n */\n getTools(mcpModuleId: string): DiscoveredCapability<ToolMetadata>[] {\n return (\n this.discoveredCapabilitiesByMcpModuleId\n .get(mcpModuleId)\n ?.filter((tool) => tool.type === 'tool') ?? []\n );\n }\n\n /**\n * Find a tool by name\n */\n findTool(\n mcpModuleId: string,\n name: string,\n ): DiscoveredCapability<ToolMetadata> | undefined {\n return this.getTools(mcpModuleId).find(\n (tool) => tool.metadata.name === name,\n );\n }\n\n /**\n * Get all discovered resources\n */\n getResources(mcpModuleId: string): DiscoveredCapability<ResourceMetadata>[] {\n return (\n this.discoveredCapabilitiesByMcpModuleId\n .get(mcpModuleId)\n ?.filter((tool) => tool.type === 'resource') ?? []\n );\n }\n\n /**\n * Find a resource by name\n */\n findResource(\n mcpModuleId: string,\n name: string,\n ): DiscoveredCapability<ResourceMetadata> | undefined {\n return this.getResources(mcpModuleId).find(\n (tool) => tool.metadata.name === name,\n );\n }\n\n /**\n * Get all discovered resource templates\n */\n getResourceTemplates(\n mcpModuleId: string,\n ): DiscoveredCapability<ResourceTemplateMetadata>[] {\n return (\n this.discoveredCapabilitiesByMcpModuleId\n .get(mcpModuleId)\n ?.filter((tool) => tool.type === 'resource-template') ?? []\n );\n }\n\n /**\n * Find a resource by name\n */\n findResourceTemplate(\n mcpModuleId: string,\n name: string,\n ): DiscoveredCapability<ResourceTemplateMetadata> | undefined {\n return this.getResourceTemplates(mcpModuleId).find(\n (tool) => tool.metadata.name === name,\n );\n }\n\n /**\n * Get all discovered prompts\n */\n getPrompts(mcpModuleId: string): DiscoveredCapability<PromptMetadata>[] {\n return (\n this.discoveredCapabilitiesByMcpModuleId\n .get(mcpModuleId)\n ?.filter((tool) => tool.type === 'prompt') ?? []\n );\n }\n\n /**\n * Find a prompt by name\n */\n findPrompt(\n mcpModuleId: string,\n name: string,\n ): DiscoveredCapability<PromptMetadata> | undefined {\n return this.getPrompts(mcpModuleId).find(\n (tool) => tool.metadata.name === name,\n );\n }\n\n /**\n * Convert RFC 6570 URI template to path-to-regexp compatible format.\n * Handles both path parameters {param} and query parameters {?param} or {?param1,param2}\n */\n private convertTemplate(template: string): string {\n if (!template) return template;\n\n // Remove RFC 6570 query parameter syntax {?...} from the template\n // These will be handled separately via URL query string parsing\n const withoutQueryParams = template.replace(/\\{\\?[^}]+\\}/g, '');\n\n // Convert path parameters {param} to path-to-regexp format :param\n return withoutQueryParams.replace(/{(\\w+)}/g, ':$1');\n }\n\n /**\n * Extract query parameter names from an RFC 6570 URI template.\n * E.g., 'mcp://example{?foo,bar}' returns ['foo', 'bar']\n */\n private extractTemplateQueryParams(template: string): string[] {\n const queryParamMatch = template.match(/\\{\\?([^}]+)\\}/);\n if (!queryParamMatch) return [];\n return queryParamMatch[1].split(',').map((p) => p.trim());\n }\n\n /**\n * Parse query string from a URI and return as key-value pairs.\n */\n private parseQueryString(uri: string): Record<string, string> {\n const queryIndex = uri.indexOf('?');\n if (queryIndex === -1) return {};\n\n const queryString = uri.substring(queryIndex + 1);\n const params: Record<string, string> = {};\n\n for (const pair of queryString.split('&')) {\n const [key, value] = pair.split('=');\n if (key) {\n params[decodeURIComponent(key)] = value\n ? decodeURIComponent(value)\n : '';\n }\n }\n\n return params;\n }\n\n /**\n * Strip query string from a URI, returning only the path portion.\n */\n private stripQueryString(uri: string): string {\n const queryIndex = uri.indexOf('?');\n return queryIndex === -1 ? uri : uri.substring(0, queryIndex);\n }\n\n private convertUri(uri: string): string {\n if (uri.includes('://')) {\n return uri.split('://')[1];\n }\n\n return uri;\n }\n\n /**\n * Find a resource by uri\n * @returns An object containing the found resource and extracted parameters, or undefined if no resource is found\n */\n findResourceByUri(\n mcpModuleId: string,\n uri: string,\n ):\n | {\n resource: DiscoveredCapability<ResourceMetadata>;\n params: Record<string, string>;\n }\n | undefined {\n const resources = this.getResources(mcpModuleId).map((tool) => ({\n name: tool.metadata.name,\n uri: tool.metadata.uri,\n }));\n\n const strippedInputUri = this.convertUri(uri);\n\n for (const t of resources) {\n if (!t.uri) continue;\n\n const rawTemplate = t.uri;\n const templatePath = this.convertTemplate(this.convertUri(rawTemplate));\n const matcher = match(templatePath, { decode: decodeURIComponent });\n const result = matcher(strippedInputUri);\n\n if (result) {\n const foundResource = this.findResource(mcpModuleId, t.name);\n if (!foundResource) continue;\n\n return {\n resource: foundResource,\n params: result.params as Record<string, string>,\n };\n }\n }\n\n return undefined;\n }\n\n /**\n * Find a resource template by uri\n * @returns An object containing the found resource template and extracted parameters, or undefined if no resource template is found\n */\n findResourceTemplateByUri(\n mcpModuleId: string,\n uri: string,\n ):\n | {\n resourceTemplate: DiscoveredCapability<ResourceTemplateMetadata>;\n params: Record<string, string>;\n }\n | undefined {\n const resourceTemplates = this.getResourceTemplates(mcpModuleId).map(\n (tool) => ({\n name: tool.metadata.name,\n uriTemplate: tool.metadata.uriTemplate,\n }),\n );\n\n // Strip query string from input URI for path matching\n const strippedInputUri = this.stripQueryString(this.convertUri(uri));\n // Parse query parameters from input URI\n const inputQueryParams = this.parseQueryString(uri);\n\n for (const t of resourceTemplates) {\n if (!t.uriTemplate) continue;\n\n const rawTemplate = t.uriTemplate;\n // Convert template (removes {?...} query params and converts {param} to :param)\n const templatePath = this.convertTemplate(this.convertUri(rawTemplate));\n const matcher = match(templatePath, { decode: decodeURIComponent });\n const result = matcher(strippedInputUri);\n\n if (result) {\n const foundResourceTemplate = this.findResourceTemplate(\n mcpModuleId,\n t.name,\n );\n if (!foundResourceTemplate) continue;\n\n // Get path params from matching\n const pathParams = result.params as Record<string, string>;\n\n // Get expected query params from template and filter input query params\n const expectedQueryParams =\n this.extractTemplateQueryParams(rawTemplate);\n const queryParams: Record<string, string> = {};\n for (const paramName of expectedQueryParams) {\n if (inputQueryParams[paramName] !== undefined) {\n queryParams[paramName] = inputQueryParams[paramName];\n }\n }\n\n return {\n resourceTemplate: foundResourceTemplate,\n params: { ...pathParams, ...queryParams },\n };\n }\n }\n\n return undefined;\n }\n\n /**\n * Register a tool programmatically (for dynamic tools).\n * Use McpRegistryService.registerTool() instead of calling this directly.\n *\n * @param mcpModuleId - The module ID to register the tool with\n * @param capability - The discovered capability object to register\n */\n registerDynamicCapability<T extends object>(\n mcpModuleId: string,\n capability: DiscoveredCapability<T>,\n ): void {\n if (!this.discoveredCapabilitiesByMcpModuleId.has(mcpModuleId)) {\n this.discoveredCapabilitiesByMcpModuleId.set(mcpModuleId, []);\n }\n\n const capabilities =\n this.discoveredCapabilitiesByMcpModuleId.get(mcpModuleId)!;\n\n const existingIndex = capabilities.findIndex(\n (c) =>\n c.type === capability.type && c.methodName === capability.methodName,\n );\n\n if (existingIndex !== -1) {\n this.logger.warn(\n `Dynamic ${capability.type} '${capability.methodName}' already registered in module: ${mcpModuleId}. Overwriting.`,\n );\n capabilities[existingIndex] = capability;\n } else {\n this.logger.debug(\n `Dynamic ${capability.type} registered: ${capability.metadata['name']} in module: ${mcpModuleId}`,\n );\n capabilities.push(capability);\n }\n }\n\n removeDynamicCapability(\n mcpModuleId: string,\n type: DiscoveredCapability<object>['type'],\n identifier: string,\n ): void {\n const capabilities =\n this.discoveredCapabilitiesByMcpModuleId.get(mcpModuleId);\n if (!capabilities) {\n return;\n }\n\n this.logger.debug(\n `Dynamic ${type} removed: ${identifier} in module: ${mcpModuleId}`,\n );\n\n this.discoveredCapabilitiesByMcpModuleId.set(\n mcpModuleId,\n capabilities.filter(\n (c) => !(c.type === type && c.methodName === identifier),\n ),\n );\n }\n}\n"]}
@@ -1,20 +0,0 @@
1
- import { ApplicationConfig, ModuleRef } from '@nestjs/core';
2
- import type { McpOptions } from '../interfaces';
3
- import { McpRegistryDiscoveryService } from './mcp-registry-discovery.service';
4
- import { SsePingService } from './sse-ping.service';
5
- export declare class McpSseService {
6
- private readonly options;
7
- private readonly mcpModuleId;
8
- private readonly applicationConfig;
9
- private readonly moduleRef;
10
- private readonly toolRegistry;
11
- private readonly pingService;
12
- private readonly logger;
13
- private readonly transports;
14
- private readonly mcpServers;
15
- constructor(options: McpOptions, mcpModuleId: string, applicationConfig: ApplicationConfig, moduleRef: ModuleRef, toolRegistry: McpRegistryDiscoveryService, pingService: SsePingService);
16
- initialize(): void;
17
- createSseConnection(rawReq: any, rawRes: any, messagesEndpoint: string, apiPrefix: string): Promise<void>;
18
- handleMessage(rawReq: any, rawRes: any, body: unknown): Promise<any>;
19
- }
20
- //# sourceMappingURL=mcp-sse.service.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp-sse.service.d.ts","sourceRoot":"","sources":["../../../src/mcp/services/mcp-sse.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAG9E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAMpD,qBACa,aAAa;IAWC,OAAO,CAAC,QAAQ,CAAC,OAAO;IACtB,OAAO,CAAC,QAAQ,CAAC,WAAW;IACrD,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,YAAY;IACL,OAAO,CAAC,QAAQ,CAAC,WAAW;IAftD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAKhC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyC;IAEpE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgC;gBAGjB,OAAO,EAAE,UAAU,EACjB,WAAW,EAAE,MAAM,EAC5C,iBAAiB,EAAE,iBAAiB,EACpC,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,2BAA2B,EACjB,WAAW,EAAE,cAAc;IAQtE,UAAU;IAWJ,mBAAmB,CACvB,MAAM,EAAE,GAAG,EACX,MAAM,EAAE,GAAG,EACX,gBAAgB,EAAE,MAAM,EACxB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC;IAwCV,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC;CA6B3E"}