@vendure/mcp-plugin 3.8.0-minor-bootstrap.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 (389) hide show
  1. package/lib/api/api-extensions.d.ts +2 -0
  2. package/lib/api/api-extensions.js +239 -0
  3. package/lib/api/api-extensions.js.map +1 -0
  4. package/lib/api/mcp-actor.service.d.ts +19 -0
  5. package/lib/api/mcp-actor.service.js +52 -0
  6. package/lib/api/mcp-actor.service.js.map +1 -0
  7. package/lib/api/mcp-admin.resolver.d.ts +105 -0
  8. package/lib/api/mcp-admin.resolver.js +463 -0
  9. package/lib/api/mcp-admin.resolver.js.map +1 -0
  10. package/lib/api/mcp-shop.resolver.d.ts +25 -0
  11. package/lib/api/mcp-shop.resolver.js +74 -0
  12. package/lib/api/mcp-shop.resolver.js.map +1 -0
  13. package/lib/check-options.d.ts +7 -0
  14. package/lib/check-options.js +130 -0
  15. package/lib/check-options.js.map +1 -0
  16. package/lib/constants.d.ts +48 -0
  17. package/lib/constants.js +72 -0
  18. package/lib/constants.js.map +1 -0
  19. package/lib/delete-in-batches.d.ts +5 -0
  20. package/lib/delete-in-batches.js +28 -0
  21. package/lib/delete-in-batches.js.map +1 -0
  22. package/lib/entities/index.d.ts +5 -0
  23. package/lib/entities/index.js +22 -0
  24. package/lib/entities/index.js.map +1 -0
  25. package/lib/entities/mcp-authorization-code.entity.d.ts +33 -0
  26. package/lib/entities/mcp-authorization-code.entity.js +77 -0
  27. package/lib/entities/mcp-authorization-code.entity.js.map +1 -0
  28. package/lib/entities/mcp-authorization-request.entity.d.ts +31 -0
  29. package/lib/entities/mcp-authorization-request.entity.js +73 -0
  30. package/lib/entities/mcp-authorization-request.entity.js.map +1 -0
  31. package/lib/entities/mcp-oauth-client.entity.d.ts +56 -0
  32. package/lib/entities/mcp-oauth-client.entity.js +70 -0
  33. package/lib/entities/mcp-oauth-client.entity.js.map +1 -0
  34. package/lib/entities/mcp-oauth-grant.entity.d.ts +77 -0
  35. package/lib/entities/mcp-oauth-grant.entity.js +121 -0
  36. package/lib/entities/mcp-oauth-grant.entity.js.map +1 -0
  37. package/lib/entities/mcp-tool-call-log.entity.d.ts +50 -0
  38. package/lib/entities/mcp-tool-call-log.entity.js +101 -0
  39. package/lib/entities/mcp-tool-call-log.entity.js.map +1 -0
  40. package/lib/events/mcp-tool-call.event.d.ts +17 -0
  41. package/lib/events/mcp-tool-call.event.js +23 -0
  42. package/lib/events/mcp-tool-call.event.js.map +1 -0
  43. package/lib/get-client-ip.d.ts +2 -0
  44. package/lib/get-client-ip.js +10 -0
  45. package/lib/get-client-ip.js.map +1 -0
  46. package/lib/get-language-code.d.ts +3 -0
  47. package/lib/get-language-code.js +12 -0
  48. package/lib/get-language-code.js.map +1 -0
  49. package/lib/index.d.ts +6 -0
  50. package/lib/index.js +26 -0
  51. package/lib/index.js.map +1 -0
  52. package/lib/internal-types.d.ts +27 -0
  53. package/lib/internal-types.js +3 -0
  54. package/lib/internal-types.js.map +1 -0
  55. package/lib/logging/mcp-tool-call-log-retention.service.d.ts +8 -0
  56. package/lib/logging/mcp-tool-call-log-retention.service.js +54 -0
  57. package/lib/logging/mcp-tool-call-log-retention.service.js.map +1 -0
  58. package/lib/logging/mcp-tool-call-log.service.d.ts +24 -0
  59. package/lib/logging/mcp-tool-call-log.service.js +128 -0
  60. package/lib/logging/mcp-tool-call-log.service.js.map +1 -0
  61. package/lib/oauth/cimd/cimd-client-resolver.service.d.ts +18 -0
  62. package/lib/oauth/cimd/cimd-client-resolver.service.js +109 -0
  63. package/lib/oauth/cimd/cimd-client-resolver.service.js.map +1 -0
  64. package/lib/oauth/cimd/cimd-document.d.ts +11 -0
  65. package/lib/oauth/cimd/cimd-document.js +66 -0
  66. package/lib/oauth/cimd/cimd-document.js.map +1 -0
  67. package/lib/oauth/cimd/cimd-fetch.d.ts +14 -0
  68. package/lib/oauth/cimd/cimd-fetch.js +192 -0
  69. package/lib/oauth/cimd/cimd-fetch.js.map +1 -0
  70. package/lib/oauth/cimd/cimd-url.d.ts +5 -0
  71. package/lib/oauth/cimd/cimd-url.js +94 -0
  72. package/lib/oauth/cimd/cimd-url.js.map +1 -0
  73. package/lib/oauth/grant-session.service.d.ts +19 -0
  74. package/lib/oauth/grant-session.service.js +141 -0
  75. package/lib/oauth/grant-session.service.js.map +1 -0
  76. package/lib/oauth/oauth-error.d.ts +18 -0
  77. package/lib/oauth/oauth-error.js +60 -0
  78. package/lib/oauth/oauth-error.js.map +1 -0
  79. package/lib/oauth/oauth-metadata.service.d.ts +34 -0
  80. package/lib/oauth/oauth-metadata.service.js +107 -0
  81. package/lib/oauth/oauth-metadata.service.js.map +1 -0
  82. package/lib/oauth/oauth-retention.service.d.ts +23 -0
  83. package/lib/oauth/oauth-retention.service.js +103 -0
  84. package/lib/oauth/oauth-retention.service.js.map +1 -0
  85. package/lib/oauth/oauth-types.d.ts +61 -0
  86. package/lib/oauth/oauth-types.js +32 -0
  87. package/lib/oauth/oauth-types.js.map +1 -0
  88. package/lib/oauth/oauth-utils.d.ts +20 -0
  89. package/lib/oauth/oauth-utils.js +111 -0
  90. package/lib/oauth/oauth-utils.js.map +1 -0
  91. package/lib/oauth/oauth.controller.d.ts +31 -0
  92. package/lib/oauth/oauth.controller.js +132 -0
  93. package/lib/oauth/oauth.controller.js.map +1 -0
  94. package/lib/oauth/oauth.service.d.ts +69 -0
  95. package/lib/oauth/oauth.service.js +650 -0
  96. package/lib/oauth/oauth.service.js.map +1 -0
  97. package/lib/oauth/token-hash.d.ts +6 -0
  98. package/lib/oauth/token-hash.js +21 -0
  99. package/lib/oauth/token-hash.js.map +1 -0
  100. package/lib/plugin.d.ts +54 -0
  101. package/lib/plugin.js +171 -0
  102. package/lib/plugin.js.map +1 -0
  103. package/lib/rate-limit/ip-bucket-key.d.ts +1 -0
  104. package/lib/rate-limit/ip-bucket-key.js +35 -0
  105. package/lib/rate-limit/ip-bucket-key.js.map +1 -0
  106. package/lib/rate-limit/mcp-oauth-rate-limit.guard.d.ts +20 -0
  107. package/lib/rate-limit/mcp-oauth-rate-limit.guard.js +63 -0
  108. package/lib/rate-limit/mcp-oauth-rate-limit.guard.js.map +1 -0
  109. package/lib/rate-limit/mcp-rate-limiter.service.d.ts +47 -0
  110. package/lib/rate-limit/mcp-rate-limiter.service.js +248 -0
  111. package/lib/rate-limit/mcp-rate-limiter.service.js.map +1 -0
  112. package/lib/registry/bm25.d.ts +12 -0
  113. package/lib/registry/bm25.js +60 -0
  114. package/lib/registry/bm25.js.map +1 -0
  115. package/lib/registry/mcp-tool-execution.service.d.ts +45 -0
  116. package/lib/registry/mcp-tool-execution.service.js +72 -0
  117. package/lib/registry/mcp-tool-execution.service.js.map +1 -0
  118. package/lib/registry/mcp-tool-registry.service.d.ts +89 -0
  119. package/lib/registry/mcp-tool-registry.service.js +668 -0
  120. package/lib/registry/mcp-tool-registry.service.js.map +1 -0
  121. package/lib/registry/mcp-tool-schema.service.d.ts +42 -0
  122. package/lib/registry/mcp-tool-schema.service.js +229 -0
  123. package/lib/registry/mcp-tool-schema.service.js.map +1 -0
  124. package/lib/registry/registry-types.d.ts +32 -0
  125. package/lib/registry/registry-types.js +3 -0
  126. package/lib/registry/registry-types.js.map +1 -0
  127. package/lib/resolve-options.d.ts +7 -0
  128. package/lib/resolve-options.js +85 -0
  129. package/lib/resolve-options.js.map +1 -0
  130. package/lib/shared/endpoint-paths.d.ts +8 -0
  131. package/lib/shared/endpoint-paths.js +12 -0
  132. package/lib/shared/endpoint-paths.js.map +1 -0
  133. package/lib/shared/loopback.d.ts +2 -0
  134. package/lib/shared/loopback.js +9 -0
  135. package/lib/shared/loopback.js.map +1 -0
  136. package/lib/shop-session/mcp-shop-session.service.d.ts +47 -0
  137. package/lib/shop-session/mcp-shop-session.service.js +132 -0
  138. package/lib/shop-session/mcp-shop-session.service.js.map +1 -0
  139. package/lib/tasks/mcp-oauth-retention.task.d.ts +9 -0
  140. package/lib/tasks/mcp-oauth-retention.task.js +21 -0
  141. package/lib/tasks/mcp-oauth-retention.task.js.map +1 -0
  142. package/lib/tasks/mcp-tool-call-log-retention.task.d.ts +7 -0
  143. package/lib/tasks/mcp-tool-call-log-retention.task.js +22 -0
  144. package/lib/tasks/mcp-tool-call-log-retention.task.js.map +1 -0
  145. package/lib/tools/built-in/active-order.service.d.ts +26 -0
  146. package/lib/tools/built-in/active-order.service.js +125 -0
  147. package/lib/tools/built-in/active-order.service.js.map +1 -0
  148. package/lib/tools/built-in/admin/add-customer-to-group.tool.d.ts +23 -0
  149. package/lib/tools/built-in/admin/add-customer-to-group.tool.js +68 -0
  150. package/lib/tools/built-in/admin/add-customer-to-group.tool.js.map +1 -0
  151. package/lib/tools/built-in/admin/add-note-to-order.tool.d.ts +104 -0
  152. package/lib/tools/built-in/admin/add-note-to-order.tool.js +66 -0
  153. package/lib/tools/built-in/admin/add-note-to-order.tool.js.map +1 -0
  154. package/lib/tools/built-in/admin/adjust-stock.tool.d.ts +26 -0
  155. package/lib/tools/built-in/admin/adjust-stock.tool.js +88 -0
  156. package/lib/tools/built-in/admin/adjust-stock.tool.js.map +1 -0
  157. package/lib/tools/built-in/admin/cancel-order.tool.d.ts +17 -0
  158. package/lib/tools/built-in/admin/cancel-order.tool.js +60 -0
  159. package/lib/tools/built-in/admin/cancel-order.tool.js.map +1 -0
  160. package/lib/tools/built-in/admin/channel-access.d.ts +2 -0
  161. package/lib/tools/built-in/admin/channel-access.js +9 -0
  162. package/lib/tools/built-in/admin/channel-access.js.map +1 -0
  163. package/lib/tools/built-in/admin/create-customer.tool.d.ts +41 -0
  164. package/lib/tools/built-in/admin/create-customer.tool.js +57 -0
  165. package/lib/tools/built-in/admin/create-customer.tool.js.map +1 -0
  166. package/lib/tools/built-in/admin/create-fulfillment.tool.d.ts +118 -0
  167. package/lib/tools/built-in/admin/create-fulfillment.tool.js +156 -0
  168. package/lib/tools/built-in/admin/create-fulfillment.tool.js.map +1 -0
  169. package/lib/tools/built-in/admin/create-product.tool.d.ts +52 -0
  170. package/lib/tools/built-in/admin/create-product.tool.js +61 -0
  171. package/lib/tools/built-in/admin/create-product.tool.js.map +1 -0
  172. package/lib/tools/built-in/admin/create-variant.tool.d.ts +48 -0
  173. package/lib/tools/built-in/admin/create-variant.tool.js +79 -0
  174. package/lib/tools/built-in/admin/create-variant.tool.js.map +1 -0
  175. package/lib/tools/built-in/admin/entity-field-schemas.d.ts +36 -0
  176. package/lib/tools/built-in/admin/entity-field-schemas.js +63 -0
  177. package/lib/tools/built-in/admin/entity-field-schemas.js.map +1 -0
  178. package/lib/tools/built-in/admin/get-customer.tool.d.ts +28 -0
  179. package/lib/tools/built-in/admin/get-customer.tool.js +55 -0
  180. package/lib/tools/built-in/admin/get-customer.tool.js.map +1 -0
  181. package/lib/tools/built-in/admin/get-order.tool.d.ts +100 -0
  182. package/lib/tools/built-in/admin/get-order.tool.js +68 -0
  183. package/lib/tools/built-in/admin/get-order.tool.js.map +1 -0
  184. package/lib/tools/built-in/admin/get-product.tool.d.ts +69 -0
  185. package/lib/tools/built-in/admin/get-product.tool.js +77 -0
  186. package/lib/tools/built-in/admin/get-product.tool.js.map +1 -0
  187. package/lib/tools/built-in/admin/get-stock-levels.tool.d.ts +23 -0
  188. package/lib/tools/built-in/admin/get-stock-levels.tool.js +61 -0
  189. package/lib/tools/built-in/admin/get-stock-levels.tool.js.map +1 -0
  190. package/lib/tools/built-in/admin/index.d.ts +25 -0
  191. package/lib/tools/built-in/admin/index.js +54 -0
  192. package/lib/tools/built-in/admin/index.js.map +1 -0
  193. package/lib/tools/built-in/admin/list-channels.tool.d.ts +24 -0
  194. package/lib/tools/built-in/admin/list-channels.tool.js +56 -0
  195. package/lib/tools/built-in/admin/list-channels.tool.js.map +1 -0
  196. package/lib/tools/built-in/admin/list-customer-groups.tool.d.ts +23 -0
  197. package/lib/tools/built-in/admin/list-customer-groups.tool.js +52 -0
  198. package/lib/tools/built-in/admin/list-customer-groups.tool.js.map +1 -0
  199. package/lib/tools/built-in/admin/list-customers.tool.d.ts +62 -0
  200. package/lib/tools/built-in/admin/list-customers.tool.js +66 -0
  201. package/lib/tools/built-in/admin/list-customers.tool.js.map +1 -0
  202. package/lib/tools/built-in/admin/list-orders.tool.d.ts +142 -0
  203. package/lib/tools/built-in/admin/list-orders.tool.js +87 -0
  204. package/lib/tools/built-in/admin/list-orders.tool.js.map +1 -0
  205. package/lib/tools/built-in/admin/list-products.tool.d.ts +63 -0
  206. package/lib/tools/built-in/admin/list-products.tool.js +71 -0
  207. package/lib/tools/built-in/admin/list-products.tool.js.map +1 -0
  208. package/lib/tools/built-in/admin/refund-order.tool.d.ts +38 -0
  209. package/lib/tools/built-in/admin/refund-order.tool.js +115 -0
  210. package/lib/tools/built-in/admin/refund-order.tool.js.map +1 -0
  211. package/lib/tools/built-in/admin/set-active-channel.tool.d.ts +22 -0
  212. package/lib/tools/built-in/admin/set-active-channel.tool.js +84 -0
  213. package/lib/tools/built-in/admin/set-active-channel.tool.js.map +1 -0
  214. package/lib/tools/built-in/admin/translation-schemas.d.ts +12 -0
  215. package/lib/tools/built-in/admin/translation-schemas.js +17 -0
  216. package/lib/tools/built-in/admin/translation-schemas.js.map +1 -0
  217. package/lib/tools/built-in/admin/update-customer.tool.d.ts +42 -0
  218. package/lib/tools/built-in/admin/update-customer.tool.js +59 -0
  219. package/lib/tools/built-in/admin/update-customer.tool.js.map +1 -0
  220. package/lib/tools/built-in/admin/update-order-state.tool.d.ts +16 -0
  221. package/lib/tools/built-in/admin/update-order-state.tool.js +58 -0
  222. package/lib/tools/built-in/admin/update-order-state.tool.js.map +1 -0
  223. package/lib/tools/built-in/admin/update-product.tool.d.ts +53 -0
  224. package/lib/tools/built-in/admin/update-product.tool.js +68 -0
  225. package/lib/tools/built-in/admin/update-product.tool.js.map +1 -0
  226. package/lib/tools/built-in/admin/update-variant.tool.d.ts +46 -0
  227. package/lib/tools/built-in/admin/update-variant.tool.js +77 -0
  228. package/lib/tools/built-in/admin/update-variant.tool.js.map +1 -0
  229. package/lib/tools/built-in/admin/upload-asset.tool.d.ts +32 -0
  230. package/lib/tools/built-in/admin/upload-asset.tool.js +56 -0
  231. package/lib/tools/built-in/admin/upload-asset.tool.js.map +1 -0
  232. package/lib/tools/built-in/catalog-query.service.d.ts +21 -0
  233. package/lib/tools/built-in/catalog-query.service.js +128 -0
  234. package/lib/tools/built-in/catalog-query.service.js.map +1 -0
  235. package/lib/tools/built-in/custom-field-input.service.d.ts +10 -0
  236. package/lib/tools/built-in/custom-field-input.service.js +64 -0
  237. package/lib/tools/built-in/custom-field-input.service.js.map +1 -0
  238. package/lib/tools/built-in/email-schema.d.ts +2 -0
  239. package/lib/tools/built-in/email-schema.js +12 -0
  240. package/lib/tools/built-in/email-schema.js.map +1 -0
  241. package/lib/tools/built-in/id-schema.d.ts +3 -0
  242. package/lib/tools/built-in/id-schema.js +11 -0
  243. package/lib/tools/built-in/id-schema.js.map +1 -0
  244. package/lib/tools/built-in/int32-schema.d.ts +4 -0
  245. package/lib/tools/built-in/int32-schema.js +8 -0
  246. package/lib/tools/built-in/int32-schema.js.map +1 -0
  247. package/lib/tools/built-in/list-helpers.d.ts +48 -0
  248. package/lib/tools/built-in/list-helpers.js +76 -0
  249. package/lib/tools/built-in/list-helpers.js.map +1 -0
  250. package/lib/tools/built-in/order-list-helpers.d.ts +20 -0
  251. package/lib/tools/built-in/order-list-helpers.js +48 -0
  252. package/lib/tools/built-in/order-list-helpers.js.map +1 -0
  253. package/lib/tools/built-in/providers.d.ts +2 -0
  254. package/lib/tools/built-in/providers.js +7 -0
  255. package/lib/tools/built-in/providers.js.map +1 -0
  256. package/lib/tools/built-in/remote-asset.d.ts +4 -0
  257. package/lib/tools/built-in/remote-asset.js +54 -0
  258. package/lib/tools/built-in/remote-asset.js.map +1 -0
  259. package/lib/tools/built-in/serializer.service.d.ts +327 -0
  260. package/lib/tools/built-in/serializer.service.js +413 -0
  261. package/lib/tools/built-in/serializer.service.js.map +1 -0
  262. package/lib/tools/built-in/shop/add-to-cart.tool.d.ts +21 -0
  263. package/lib/tools/built-in/shop/add-to-cart.tool.js +100 -0
  264. package/lib/tools/built-in/shop/add-to-cart.tool.js.map +1 -0
  265. package/lib/tools/built-in/shop/address-schema.d.ts +15 -0
  266. package/lib/tools/built-in/shop/address-schema.js +20 -0
  267. package/lib/tools/built-in/shop/address-schema.js.map +1 -0
  268. package/lib/tools/built-in/shop/apply-coupon-code.tool.d.ts +17 -0
  269. package/lib/tools/built-in/shop/apply-coupon-code.tool.js +62 -0
  270. package/lib/tools/built-in/shop/apply-coupon-code.tool.js.map +1 -0
  271. package/lib/tools/built-in/shop/collection-lookup.d.ts +15 -0
  272. package/lib/tools/built-in/shop/collection-lookup.js +35 -0
  273. package/lib/tools/built-in/shop/collection-lookup.js.map +1 -0
  274. package/lib/tools/built-in/shop/get-cart.tool.d.ts +94 -0
  275. package/lib/tools/built-in/shop/get-cart.tool.js +55 -0
  276. package/lib/tools/built-in/shop/get-cart.tool.js.map +1 -0
  277. package/lib/tools/built-in/shop/get-collection.tool.d.ts +42 -0
  278. package/lib/tools/built-in/shop/get-collection.tool.js +64 -0
  279. package/lib/tools/built-in/shop/get-collection.tool.js.map +1 -0
  280. package/lib/tools/built-in/shop/get-eligible-payment-methods.tool.d.ts +26 -0
  281. package/lib/tools/built-in/shop/get-eligible-payment-methods.tool.js +58 -0
  282. package/lib/tools/built-in/shop/get-eligible-payment-methods.tool.js.map +1 -0
  283. package/lib/tools/built-in/shop/get-eligible-shipping-methods.tool.d.ts +30 -0
  284. package/lib/tools/built-in/shop/get-eligible-shipping-methods.tool.js +59 -0
  285. package/lib/tools/built-in/shop/get-eligible-shipping-methods.tool.js.map +1 -0
  286. package/lib/tools/built-in/shop/get-my-account.tool.d.ts +22 -0
  287. package/lib/tools/built-in/shop/get-my-account.tool.js +57 -0
  288. package/lib/tools/built-in/shop/get-my-account.tool.js.map +1 -0
  289. package/lib/tools/built-in/shop/get-order.tool.d.ts +100 -0
  290. package/lib/tools/built-in/shop/get-order.tool.js +67 -0
  291. package/lib/tools/built-in/shop/get-order.tool.js.map +1 -0
  292. package/lib/tools/built-in/shop/get-product.tool.d.ts +57 -0
  293. package/lib/tools/built-in/shop/get-product.tool.js +81 -0
  294. package/lib/tools/built-in/shop/get-product.tool.js.map +1 -0
  295. package/lib/tools/built-in/shop/index.d.ts +19 -0
  296. package/lib/tools/built-in/shop/index.js +42 -0
  297. package/lib/tools/built-in/shop/index.js.map +1 -0
  298. package/lib/tools/built-in/shop/list-collections.tool.d.ts +42 -0
  299. package/lib/tools/built-in/shop/list-collections.tool.js +75 -0
  300. package/lib/tools/built-in/shop/list-collections.tool.js.map +1 -0
  301. package/lib/tools/built-in/shop/list-my-orders.tool.d.ts +100 -0
  302. package/lib/tools/built-in/shop/list-my-orders.tool.js +63 -0
  303. package/lib/tools/built-in/shop/list-my-orders.tool.js.map +1 -0
  304. package/lib/tools/built-in/shop/place-order.tool.d.ts +188 -0
  305. package/lib/tools/built-in/shop/place-order.tool.js +152 -0
  306. package/lib/tools/built-in/shop/place-order.tool.js.map +1 -0
  307. package/lib/tools/built-in/shop/product-search-query.d.ts +4 -0
  308. package/lib/tools/built-in/shop/product-search-query.js +34 -0
  309. package/lib/tools/built-in/shop/product-search-query.js.map +1 -0
  310. package/lib/tools/built-in/shop/remove-coupon-code.tool.d.ts +17 -0
  311. package/lib/tools/built-in/shop/remove-coupon-code.tool.js +63 -0
  312. package/lib/tools/built-in/shop/remove-coupon-code.tool.js.map +1 -0
  313. package/lib/tools/built-in/shop/remove-from-cart.tool.d.ts +17 -0
  314. package/lib/tools/built-in/shop/remove-from-cart.tool.js +58 -0
  315. package/lib/tools/built-in/shop/remove-from-cart.tool.js.map +1 -0
  316. package/lib/tools/built-in/shop/search-products.tool.d.ts +48 -0
  317. package/lib/tools/built-in/shop/search-products.tool.js +95 -0
  318. package/lib/tools/built-in/shop/search-products.tool.js.map +1 -0
  319. package/lib/tools/built-in/shop/set-checkout-details.tool.d.ts +56 -0
  320. package/lib/tools/built-in/shop/set-checkout-details.tool.js +187 -0
  321. package/lib/tools/built-in/shop/set-checkout-details.tool.js.map +1 -0
  322. package/lib/tools/built-in/shop/set-shipping-method.tool.d.ts +17 -0
  323. package/lib/tools/built-in/shop/set-shipping-method.tool.js +58 -0
  324. package/lib/tools/built-in/shop/set-shipping-method.tool.js.map +1 -0
  325. package/lib/tools/built-in/shop/update-cart-line.tool.d.ts +18 -0
  326. package/lib/tools/built-in/shop/update-cart-line.tool.js +60 -0
  327. package/lib/tools/built-in/shop/update-cart-line.tool.js.map +1 -0
  328. package/lib/tools/built-in/string-schemas.d.ts +4 -0
  329. package/lib/tools/built-in/string-schemas.js +13 -0
  330. package/lib/tools/built-in/string-schemas.js.map +1 -0
  331. package/lib/transport/mcp-server.factory.d.ts +13 -0
  332. package/lib/transport/mcp-server.factory.js +32 -0
  333. package/lib/transport/mcp-server.factory.js.map +1 -0
  334. package/lib/transport/mcp-transport.controller.d.ts +77 -0
  335. package/lib/transport/mcp-transport.controller.js +442 -0
  336. package/lib/transport/mcp-transport.controller.js.map +1 -0
  337. package/lib/types.d.ts +432 -0
  338. package/lib/types.js +3 -0
  339. package/lib/types.js.map +1 -0
  340. package/package.json +42 -0
  341. package/src/dashboard/components/activity-block.tsx +72 -0
  342. package/src/dashboard/components/actor-cell.tsx +31 -0
  343. package/src/dashboard/components/connection-dialog.tsx +106 -0
  344. package/src/dashboard/components/empty-cell.tsx +7 -0
  345. package/src/dashboard/components/grants-block.tsx +218 -0
  346. package/src/dashboard/components/stats-block.tsx +275 -0
  347. package/src/dashboard/components/tools-block.tsx +274 -0
  348. package/src/dashboard/components/tooltip-button.tsx +28 -0
  349. package/src/dashboard/components/use-mcp-table-state.ts +47 -0
  350. package/src/dashboard/i18n/ar.po +311 -0
  351. package/src/dashboard/i18n/bg.po +311 -0
  352. package/src/dashboard/i18n/cs.po +311 -0
  353. package/src/dashboard/i18n/de.po +311 -0
  354. package/src/dashboard/i18n/en.po +311 -0
  355. package/src/dashboard/i18n/es.po +311 -0
  356. package/src/dashboard/i18n/fa.po +311 -0
  357. package/src/dashboard/i18n/fr.po +311 -0
  358. package/src/dashboard/i18n/he.po +311 -0
  359. package/src/dashboard/i18n/hr.po +311 -0
  360. package/src/dashboard/i18n/hu.po +311 -0
  361. package/src/dashboard/i18n/it.po +311 -0
  362. package/src/dashboard/i18n/ja.po +311 -0
  363. package/src/dashboard/i18n/ko.po +311 -0
  364. package/src/dashboard/i18n/nb.po +311 -0
  365. package/src/dashboard/i18n/ne.po +311 -0
  366. package/src/dashboard/i18n/nl.po +311 -0
  367. package/src/dashboard/i18n/pl.po +311 -0
  368. package/src/dashboard/i18n/pt_BR.po +311 -0
  369. package/src/dashboard/i18n/pt_PT.po +311 -0
  370. package/src/dashboard/i18n/ro.po +311 -0
  371. package/src/dashboard/i18n/ru.po +311 -0
  372. package/src/dashboard/i18n/sv.po +311 -0
  373. package/src/dashboard/i18n/tr.po +311 -0
  374. package/src/dashboard/i18n/uk.po +311 -0
  375. package/src/dashboard/i18n/uz.po +311 -0
  376. package/src/dashboard/i18n/zh_Hans.po +311 -0
  377. package/src/dashboard/i18n/zh_Hant.po +311 -0
  378. package/src/dashboard/index.tsx +30 -0
  379. package/src/dashboard/mcp-activity-route.tsx +38 -0
  380. package/src/dashboard/mcp-authorize-route.tsx +369 -0
  381. package/src/dashboard/mcp-grants-route.tsx +38 -0
  382. package/src/dashboard/mcp-overview-route.tsx +46 -0
  383. package/src/dashboard/mcp-server-redirect-route.tsx +15 -0
  384. package/src/dashboard/mcp-tools-route.tsx +38 -0
  385. package/src/dashboard/mcp.graphql.ts +127 -0
  386. package/src/dashboard/published-files.spec.ts +54 -0
  387. package/src/dashboard/tsconfig.json +9 -0
  388. package/src/shared/endpoint-paths.ts +8 -0
  389. package/src/shared/loopback.ts +6 -0
@@ -0,0 +1,192 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.isAllowedCimdAddress = isAllowedCimdAddress;
37
+ exports.fetchCimdDocument = fetchCimdDocument;
38
+ const common_1 = require("@nestjs/common");
39
+ const core_1 = require("@vendure/core");
40
+ const dns = __importStar(require("node:dns"));
41
+ const http = __importStar(require("node:http"));
42
+ const https = __importStar(require("node:https"));
43
+ const node_net_1 = require("node:net");
44
+ const constants_1 = require("../../constants");
45
+ // Blocks every IANA-reserved, non-public address range so a client_id URL can't be used
46
+ // to probe this server's own network.
47
+ // https://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml
48
+ // https://www.iana.org/assignments/iana-ipv6-special-registry/iana-ipv6-special-registry.xhtml
49
+ const blockedRanges = new node_net_1.BlockList();
50
+ blockedRanges.addSubnet('0.0.0.0', 8, 'ipv4');
51
+ blockedRanges.addSubnet('10.0.0.0', 8, 'ipv4');
52
+ blockedRanges.addSubnet('100.64.0.0', 10, 'ipv4');
53
+ blockedRanges.addSubnet('127.0.0.0', 8, 'ipv4');
54
+ blockedRanges.addSubnet('169.254.0.0', 16, 'ipv4');
55
+ blockedRanges.addSubnet('172.16.0.0', 12, 'ipv4');
56
+ blockedRanges.addSubnet('192.0.0.0', 24, 'ipv4');
57
+ blockedRanges.addSubnet('192.0.2.0', 24, 'ipv4');
58
+ blockedRanges.addSubnet('192.88.99.0', 24, 'ipv4');
59
+ blockedRanges.addSubnet('192.168.0.0', 16, 'ipv4');
60
+ blockedRanges.addSubnet('198.18.0.0', 15, 'ipv4');
61
+ blockedRanges.addSubnet('198.51.100.0', 24, 'ipv4');
62
+ blockedRanges.addSubnet('203.0.113.0', 24, 'ipv4');
63
+ blockedRanges.addSubnet('224.0.0.0', 4, 'ipv4');
64
+ blockedRanges.addSubnet('240.0.0.0', 4, 'ipv4');
65
+ blockedRanges.addSubnet('::', 128, 'ipv6');
66
+ blockedRanges.addSubnet('::1', 128, 'ipv6');
67
+ blockedRanges.addSubnet('64:ff9b::', 96, 'ipv6');
68
+ blockedRanges.addSubnet('64:ff9b:1::', 48, 'ipv6');
69
+ blockedRanges.addSubnet('100::', 64, 'ipv6');
70
+ blockedRanges.addSubnet('100:0:0:1::', 64, 'ipv6');
71
+ blockedRanges.addSubnet('2001::', 23, 'ipv6');
72
+ blockedRanges.addSubnet('2001:db8::', 32, 'ipv6');
73
+ blockedRanges.addSubnet('2002::', 16, 'ipv6');
74
+ blockedRanges.addSubnet('3fff::', 20, 'ipv6');
75
+ blockedRanges.addSubnet('5f00::', 16, 'ipv6');
76
+ blockedRanges.addSubnet('fc00::', 7, 'ipv6');
77
+ blockedRanges.addSubnet('fe80::', 10, 'ipv6');
78
+ blockedRanges.addSubnet('ff00::', 8, 'ipv6');
79
+ const loopbackRanges = new node_net_1.BlockList();
80
+ loopbackRanges.addSubnet('127.0.0.0', 8, 'ipv4');
81
+ loopbackRanges.addAddress('::1', 'ipv6');
82
+ /** True when a resolved address may be dialed. Loopback is only allowed in development. */
83
+ function isAllowedCimdAddress(address, family, allowLoopback) {
84
+ const familyName = family === 6 ? 'ipv6' : 'ipv4';
85
+ try {
86
+ if (allowLoopback && loopbackRanges.check(address, familyName)) {
87
+ return true;
88
+ }
89
+ return !blockedRanges.check(address, familyName);
90
+ }
91
+ catch (_a) {
92
+ return false;
93
+ }
94
+ }
95
+ /** Checks every address a hostname resolves to, since a hostname could mix a public and a private record to slip past a single check. */
96
+ function createGuardedLookup(allowLoopback, baseLookup) {
97
+ const guarded = (hostname, optionsOrCallback, maybeCallback) => {
98
+ const callerOptions = typeof optionsOrCallback === 'function' ? {} : (optionsOrCallback !== null && optionsOrCallback !== void 0 ? optionsOrCallback : {});
99
+ const callback = typeof optionsOrCallback === 'function' ? optionsOrCallback : maybeCallback;
100
+ baseLookup(hostname, { all: true, verbatim: true }, (error, addresses) => {
101
+ if (error) {
102
+ return callback(error);
103
+ }
104
+ const allAllowed = addresses.length > 0 &&
105
+ addresses.every(entry => isAllowedCimdAddress(entry.address, entry.family, allowLoopback));
106
+ if (!allAllowed) {
107
+ return callback(new Error('client_id host does not resolve to a public address'));
108
+ }
109
+ // The socket may ask for one address or (with `all`, e.g. for happy-eyeballs
110
+ // connection racing) the whole list — answer in the shape it asked for.
111
+ if (callerOptions.all) {
112
+ return callback(null, addresses);
113
+ }
114
+ callback(null, addresses[0].address, addresses[0].family);
115
+ });
116
+ };
117
+ return guarded;
118
+ }
119
+ const jsonContentType = /^application\/(?:[^;+\s]+\+)?json\s*(?:;.*)?$/i;
120
+ /** Caps outbound fetches process-wide so many concurrent client_id URLs can't fan this server out into a flood of connections. */
121
+ let activeFetchCount = 0;
122
+ async function fetchCimdDocument(url, options) {
123
+ if (activeFetchCount >= constants_1.MAX_CONCURRENT_CIMD_FETCHES) {
124
+ throw new common_1.BadRequestException('client_id metadata document could not be fetched');
125
+ }
126
+ activeFetchCount++;
127
+ try {
128
+ return await runFetch(url, options);
129
+ }
130
+ finally {
131
+ activeFetchCount--;
132
+ }
133
+ }
134
+ function runFetch(url, options) {
135
+ const transport = url.protocol === 'https:' ? https : http;
136
+ const deadline = AbortSignal.timeout(options.timeoutMs);
137
+ const timedOut = () => new common_1.BadRequestException('client_id metadata document request timed out');
138
+ return new Promise((resolve, reject) => {
139
+ var _a;
140
+ const fail = (error) => {
141
+ request.destroy();
142
+ reject(error);
143
+ };
144
+ const request = transport.request(url, {
145
+ method: 'GET',
146
+ headers: { accept: 'application/json' },
147
+ lookup: createGuardedLookup(options.allowLoopback, (_a = options.lookup) !== null && _a !== void 0 ? _a : dns.lookup),
148
+ // Disables connection reuse: a pooled socket would skip the lookup above, which is
149
+ // where the address check happens.
150
+ agent: false,
151
+ signal: deadline,
152
+ }, response => {
153
+ var _a;
154
+ if (response.statusCode !== 200) {
155
+ return fail(new common_1.BadRequestException(`client_id metadata document request failed with HTTP ${String(response.statusCode)}`));
156
+ }
157
+ const contentType = String((_a = response.headers['content-type']) !== null && _a !== void 0 ? _a : '');
158
+ if (!jsonContentType.test(contentType)) {
159
+ return fail(new common_1.BadRequestException('client_id metadata document must be JSON'));
160
+ }
161
+ const chunks = [];
162
+ let received = 0;
163
+ response.on('data', (chunk) => {
164
+ received += chunk.length;
165
+ if (received > options.maxBytes) {
166
+ return fail(new common_1.BadRequestException('client_id metadata document is too large'));
167
+ }
168
+ chunks.push(chunk);
169
+ });
170
+ response.on('end', () => {
171
+ resolve(Buffer.concat(chunks).toString('utf8'));
172
+ });
173
+ // The deadline destroys the request mid-body, which surfaces here rather than on
174
+ // the request itself, so it has to be reported as the timeout it is.
175
+ response.on('error', () => fail(deadline.aborted
176
+ ? timedOut()
177
+ : new common_1.BadRequestException('client_id metadata document could not be read')));
178
+ });
179
+ request.on('error', error => {
180
+ if (error instanceof common_1.BadRequestException) {
181
+ return fail(error);
182
+ }
183
+ if (deadline.aborted) {
184
+ return fail(timedOut());
185
+ }
186
+ core_1.Logger.warn(`Failed to fetch the client_id metadata document at ${url.hostname}: ${error.message}`, constants_1.loggerCtx);
187
+ fail(new common_1.BadRequestException('client_id metadata document could not be fetched'));
188
+ });
189
+ request.end();
190
+ });
191
+ }
192
+ //# sourceMappingURL=cimd-fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cimd-fetch.js","sourceRoot":"","sources":["../../../src/oauth/cimd/cimd-fetch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function isUrlClientId(clientId: string): boolean;
2
+ export interface CimdClientIdUrlOptions {
3
+ allowLoopback: boolean;
4
+ }
5
+ export declare function validateCimdClientIdUrl(clientId: string, options: CimdClientIdUrlOptions): URL;
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isUrlClientId = isUrlClientId;
4
+ exports.validateCimdClientIdUrl = validateCimdClientIdUrl;
5
+ const common_1 = require("@nestjs/common");
6
+ const node_net_1 = require("node:net");
7
+ const constants_1 = require("../../constants");
8
+ const loopback_1 = require("../../shared/loopback");
9
+ // Client ID Metadata Documents (CIMD, draft-ietf-oauth-client-id-metadata-document-02):
10
+ // a client_id that is an HTTPS URL pointing at a JSON document describing the client,
11
+ // instead of an id created by registration. This module owns the URL-shape rules (§3).
12
+ function isUrlClientId(clientId) {
13
+ // URL scheme is case-insensitive; normalization is handled by validation layer.
14
+ const scheme = clientId.slice(0, 8).toLowerCase();
15
+ return scheme.startsWith('https://') || scheme.startsWith('http://');
16
+ }
17
+ function validateCimdClientIdUrl(clientId, options) {
18
+ assertWithinLengthLimit(clientId);
19
+ const url = parseClientIdUrl(clientId);
20
+ const loopback = (0, loopback_1.isLoopbackHostname)(url.hostname);
21
+ assertSchemeAllowed(url, loopback, options);
22
+ assertNoUserinfo(url);
23
+ assertNoFragment(url);
24
+ assertNoQueryString(url, clientId);
25
+ assertHasPath(url);
26
+ assertNoDotSegments(clientId);
27
+ assertHostnameIsNotIpAddress(url, loopback, options);
28
+ assertCanonicalForm(url, clientId);
29
+ return url;
30
+ }
31
+ function assertWithinLengthLimit(clientId) {
32
+ if (clientId.length > constants_1.CIMD_MAX_CLIENT_ID_LENGTH) {
33
+ throw new common_1.BadRequestException(`client_id URL must be at most ${constants_1.CIMD_MAX_CLIENT_ID_LENGTH} characters`);
34
+ }
35
+ }
36
+ function parseClientIdUrl(clientId) {
37
+ try {
38
+ return new URL(clientId);
39
+ }
40
+ catch (_a) {
41
+ throw new common_1.BadRequestException('client_id is not a valid URL');
42
+ }
43
+ }
44
+ function assertSchemeAllowed(url, loopback, options) {
45
+ const httpLoopbackAllowed = options.allowLoopback && url.protocol === 'http:' && loopback;
46
+ if (url.protocol !== 'https:' && !httpLoopbackAllowed) {
47
+ throw new common_1.BadRequestException('client_id URL must use https');
48
+ }
49
+ if (loopback && !options.allowLoopback) {
50
+ throw new common_1.BadRequestException('client_id URL must not point at a loopback address');
51
+ }
52
+ }
53
+ function assertNoUserinfo(url) {
54
+ if (url.username || url.password) {
55
+ throw new common_1.BadRequestException('client_id URL must not contain userinfo');
56
+ }
57
+ }
58
+ function assertNoFragment(url) {
59
+ if (url.hash) {
60
+ throw new common_1.BadRequestException('client_id URL must not contain a fragment');
61
+ }
62
+ }
63
+ function assertNoQueryString(url, clientId) {
64
+ if (url.search || clientId.includes('?')) {
65
+ throw new common_1.BadRequestException('client_id URL must not contain a query string');
66
+ }
67
+ }
68
+ function assertHasPath(url) {
69
+ if (url.pathname === '/') {
70
+ throw new common_1.BadRequestException('client_id URL must include a path, for example /oauth-client-metadata.json');
71
+ }
72
+ }
73
+ /** The URL parser resolves "." and ".." segments silently, so check the raw string instead. */
74
+ function assertNoDotSegments(clientId) {
75
+ for (const segment of clientId.split('/')) {
76
+ const normalized = segment.toLowerCase().replace(/%2e/g, '.');
77
+ if (normalized === '.' || normalized === '..') {
78
+ throw new common_1.BadRequestException('client_id URL must not contain dot path segments');
79
+ }
80
+ }
81
+ }
82
+ function assertHostnameIsNotIpAddress(url, loopback, options) {
83
+ const bareHost = url.hostname.replace(/^\[|\]$/g, '');
84
+ if ((0, node_net_1.isIP)(bareHost) !== 0 && !(options.allowLoopback && loopback)) {
85
+ throw new common_1.BadRequestException('client_id URL must use a hostname, not an IP address');
86
+ }
87
+ }
88
+ /** Catches parser rewrites the other checks can't see, such as resolving "." and ".." segments. */
89
+ function assertCanonicalForm(url, clientId) {
90
+ if (url.href !== clientId) {
91
+ throw new common_1.BadRequestException(`client_id URL must be given in canonical form (${url.href}), not "${clientId}"`);
92
+ }
93
+ }
94
+ //# sourceMappingURL=cimd-url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cimd-url.js","sourceRoot":"","sources":["../../../src/oauth/cimd/cimd-url.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { AuthenticatedSession, CachedSession, ConfigService, RequestContext, SessionService, TransactionalConnection, User } from '@vendure/core';
2
+ import { McpOauthGrant } from '../entities/mcp-oauth-grant.entity';
3
+ /** Keeps each MCP grant's Vendure session in sync with the grant, safely even when requests race. */
4
+ export declare class McpGrantSessionService {
5
+ private readonly connection;
6
+ private readonly sessionService;
7
+ private readonly configService;
8
+ constructor(connection: TransactionalConnection, sessionService: SessionService, configService: ConfigService);
9
+ /** Safe to call on an already-revoked grant, so callers don't need to check `revokedAt` first. */
10
+ revokeGrant(ctx: RequestContext, grant: McpOauthGrant): Promise<void>;
11
+ /** Runs as one transaction so a lapsed session is never replaced twice or left orphaned when requests race. */
12
+ recreateGrantSession(ctx: RequestContext, grant: McpOauthGrant, user: User): Promise<CachedSession>;
13
+ /** Falls back to the session another request just created, for when two requests try to replace the same lapsed session at once. */
14
+ private loadSessionOfReplacedGrant;
15
+ /** No token is supplied, so the session's identifier can't be derived from the OAuth tokens that reach it. */
16
+ createVendureSession(ctx: RequestContext, user: User): Promise<AuthenticatedSession>;
17
+ /** Returns the deleted session's token too, since a cached session keeps serving until its entry ages out even after the row is gone. */
18
+ private deleteVendureSessionRow;
19
+ }
@@ -0,0 +1,141 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.McpGrantSessionService = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const core_1 = require("@vendure/core");
15
+ const mcp_oauth_grant_entity_1 = require("../entities/mcp-oauth-grant.entity");
16
+ const oauth_utils_1 = require("./oauth-utils");
17
+ /**
18
+ * Name recorded against the dedicated Vendure session created for an MCP grant.
19
+ */
20
+ const MCP_SESSION_STRATEGY = 'mcp-dedicated-session';
21
+ /** Used only to roll back the transaction below when another request already replaced or revoked the grant; never thrown outside this file. */
22
+ class GrantSessionAlreadyReplaced extends Error {
23
+ }
24
+ /** Keeps each MCP grant's Vendure session in sync with the grant, safely even when requests race. */
25
+ let McpGrantSessionService = class McpGrantSessionService {
26
+ constructor(connection, sessionService, configService) {
27
+ this.connection = connection;
28
+ this.sessionService = sessionService;
29
+ this.configService = configService;
30
+ }
31
+ /** Safe to call on an already-revoked grant, so callers don't need to check `revokedAt` first. */
32
+ async revokeGrant(ctx, grant) {
33
+ const sessionToken = await this.connection.withTransaction(ctx, async (txCtx) => {
34
+ // Only one of two simultaneous revokes should win, since the loser could otherwise
35
+ // delete a session row the winner already replaced.
36
+ const claim = await this.connection
37
+ .getRepository(txCtx, mcp_oauth_grant_entity_1.McpOauthGrant)
38
+ .createQueryBuilder()
39
+ .update(mcp_oauth_grant_entity_1.McpOauthGrant)
40
+ .set({ revokedAt: new Date() })
41
+ .where('id = :id', { id: grant.id })
42
+ .andWhere('revokedAt IS NULL')
43
+ .execute();
44
+ if (!claim.affected) {
45
+ return undefined;
46
+ }
47
+ return this.deleteVendureSessionRow(txCtx, grant.vendureSessionId);
48
+ });
49
+ await (0, oauth_utils_1.deleteCachedVendureSession)(this.configService, sessionToken);
50
+ }
51
+ /** Runs as one transaction so a lapsed session is never replaced twice or left orphaned when requests race. */
52
+ async recreateGrantSession(ctx, grant, user) {
53
+ const staleSessionId = grant.vendureSessionId;
54
+ let staleSessionToken;
55
+ let createdSessionToken;
56
+ try {
57
+ await this.connection.withTransaction(ctx, async (txCtx) => {
58
+ // The lapsed session row may still be in the table, because Vendure clears
59
+ // expired sessions with a background job rather than on read.
60
+ staleSessionToken = await this.deleteVendureSessionRow(txCtx, staleSessionId);
61
+ const created = await this.createVendureSession(txCtx, user);
62
+ createdSessionToken = created.token;
63
+ const claim = await this.connection
64
+ .getRepository(txCtx, mcp_oauth_grant_entity_1.McpOauthGrant)
65
+ .createQueryBuilder()
66
+ .update(mcp_oauth_grant_entity_1.McpOauthGrant)
67
+ .set({ vendureSessionId: created.id })
68
+ .where('id = :id', { id: grant.id })
69
+ .andWhere('vendureSessionId = :staleSessionId', { staleSessionId })
70
+ .andWhere('revokedAt IS NULL')
71
+ .execute();
72
+ if (!claim.affected) {
73
+ throw new GrantSessionAlreadyReplaced();
74
+ }
75
+ });
76
+ }
77
+ catch (e) {
78
+ if (!(e instanceof GrantSessionAlreadyReplaced)) {
79
+ throw e;
80
+ }
81
+ // The session row we created was rolled back with the rest of the transaction, but
82
+ // Core had already written it to the session cache, so that entry has to go by hand.
83
+ await (0, oauth_utils_1.deleteCachedVendureSession)(this.configService, createdSessionToken);
84
+ return this.loadSessionOfReplacedGrant(ctx, grant);
85
+ }
86
+ // Deleting the stale row is only half the job: a cached session is served without
87
+ // touching the database until its entry ages out.
88
+ await (0, oauth_utils_1.deleteCachedVendureSession)(this.configService, staleSessionToken);
89
+ const session = createdSessionToken
90
+ ? await this.sessionService.getSessionFromToken(createdSessionToken)
91
+ : undefined;
92
+ if (!session) {
93
+ throw new common_1.UnauthorizedException('Failed to establish Vendure session');
94
+ }
95
+ grant.vendureSessionId = session.id;
96
+ return session;
97
+ }
98
+ /** Falls back to the session another request just created, for when two requests try to replace the same lapsed session at once. */
99
+ async loadSessionOfReplacedGrant(ctx, grant) {
100
+ const current = await this.connection
101
+ .getRepository(ctx, mcp_oauth_grant_entity_1.McpOauthGrant)
102
+ .findOne({ where: { id: grant.id } });
103
+ if (!current || current.revokedAt) {
104
+ throw new common_1.UnauthorizedException('Invalid or expired access token');
105
+ }
106
+ const sessionRow = await this.connection
107
+ .getRepository(ctx, core_1.Session)
108
+ .findOne({ where: { id: current.vendureSessionId } });
109
+ const session = sessionRow
110
+ ? await this.sessionService.getSessionFromToken(sessionRow.token)
111
+ : undefined;
112
+ if (!session) {
113
+ throw new common_1.UnauthorizedException('Failed to establish Vendure session');
114
+ }
115
+ grant.vendureSessionId = current.vendureSessionId;
116
+ return session;
117
+ }
118
+ /** No token is supplied, so the session's identifier can't be derived from the OAuth tokens that reach it. */
119
+ createVendureSession(ctx, user) {
120
+ return this.sessionService.createNewAuthenticatedSession(ctx, user, MCP_SESSION_STRATEGY);
121
+ }
122
+ /** Returns the deleted session's token too, since a cached session keeps serving until its entry ages out even after the row is gone. */
123
+ async deleteVendureSessionRow(ctx, sessionId) {
124
+ const session = await this.connection
125
+ .getRepository(ctx, core_1.Session)
126
+ .findOne({ where: { id: sessionId } });
127
+ if (!session) {
128
+ return;
129
+ }
130
+ await this.connection.getRepository(ctx, core_1.Session).remove(session);
131
+ return session.token;
132
+ }
133
+ };
134
+ exports.McpGrantSessionService = McpGrantSessionService;
135
+ exports.McpGrantSessionService = McpGrantSessionService = __decorate([
136
+ (0, common_1.Injectable)(),
137
+ __metadata("design:paramtypes", [core_1.TransactionalConnection,
138
+ core_1.SessionService,
139
+ core_1.ConfigService])
140
+ ], McpGrantSessionService);
141
+ //# sourceMappingURL=grant-session.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grant-session.service.js","sourceRoot":"","sources":["../../src/oauth/grant-session.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { ArgumentsHost, BadRequestException, ExceptionFilter, UnauthorizedException } from '@nestjs/common';
2
+ import type { ZodType } from 'zod';
3
+ /** Follows the OAuth spec's error codes, minus `invalid_client` since clients here are never authenticated. */
4
+ export type McpOauthErrorCode = 'invalid_request' | 'invalid_grant' | 'unsupported_grant_type' | 'invalid_target' | 'invalid_client_metadata' | 'invalid_redirect_uri' | 'server_error';
5
+ export declare class McpOauthError extends BadRequestException {
6
+ readonly code: McpOauthErrorCode;
7
+ constructor(code: McpOauthErrorCode, description: string);
8
+ }
9
+ /** Kept apart from other 401s so the transport can treat it as a routine token refresh rather than a failed authentication attempt. */
10
+ export declare class McpAccessTokenExpiredError extends UnauthorizedException {
11
+ constructor();
12
+ }
13
+ /** Converts a schema failure into an OAuth-compliant 400, so bad client input never reaches the service as a 500. */
14
+ export declare function parseOAuthInput<T>(schema: ZodType<T>, value: unknown, code: McpOauthErrorCode): T;
15
+ /** Ensures every 400 from the OAuth endpoints comes back in the OAuth error shape, so clients only ever parse one format. */
16
+ export declare class McpOauthExceptionFilter implements ExceptionFilter {
17
+ catch(exception: BadRequestException, host: ArgumentsHost): void;
18
+ }
@@ -0,0 +1,60 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.McpOauthExceptionFilter = exports.McpAccessTokenExpiredError = exports.McpOauthError = void 0;
10
+ exports.parseOAuthInput = parseOAuthInput;
11
+ const common_1 = require("@nestjs/common");
12
+ const core_1 = require("@vendure/core");
13
+ const constants_1 = require("../constants");
14
+ class McpOauthError extends common_1.BadRequestException {
15
+ constructor(code, description) {
16
+ super({ error: code, error_description: description });
17
+ this.code = code;
18
+ this.message = description;
19
+ }
20
+ }
21
+ exports.McpOauthError = McpOauthError;
22
+ /** Kept apart from other 401s so the transport can treat it as a routine token refresh rather than a failed authentication attempt. */
23
+ class McpAccessTokenExpiredError extends common_1.UnauthorizedException {
24
+ constructor() {
25
+ super('Access token expired');
26
+ }
27
+ }
28
+ exports.McpAccessTokenExpiredError = McpAccessTokenExpiredError;
29
+ /** Converts a schema failure into an OAuth-compliant 400, so bad client input never reaches the service as a 500. */
30
+ function parseOAuthInput(schema, value, code) {
31
+ const result = schema.safeParse(value);
32
+ if (result.success) {
33
+ return result.data;
34
+ }
35
+ const issue = result.error.issues[0];
36
+ const fieldPath = issue.path.join('.');
37
+ throw new McpOauthError(code, fieldPath ? `${fieldPath}: ${issue.message}` : issue.message);
38
+ }
39
+ /** Ensures every 400 from the OAuth endpoints comes back in the OAuth error shape, so clients only ever parse one format. */
40
+ let McpOauthExceptionFilter = class McpOauthExceptionFilter {
41
+ catch(exception, host) {
42
+ const res = host.switchToHttp().getResponse();
43
+ res.setHeader('Cache-Control', 'no-store');
44
+ res.setHeader('Pragma', 'no-cache');
45
+ let body;
46
+ if (exception instanceof McpOauthError) {
47
+ body = exception.getResponse();
48
+ }
49
+ else {
50
+ core_1.Logger.warn(`OAuth request rejected: ${exception.message}`, constants_1.loggerCtx);
51
+ body = { error: 'invalid_request', error_description: exception.message };
52
+ }
53
+ res.status(exception.getStatus()).json(body);
54
+ }
55
+ };
56
+ exports.McpOauthExceptionFilter = McpOauthExceptionFilter;
57
+ exports.McpOauthExceptionFilter = McpOauthExceptionFilter = __decorate([
58
+ (0, common_1.Catch)(common_1.BadRequestException)
59
+ ], McpOauthExceptionFilter);
60
+ //# sourceMappingURL=oauth-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-error.js","sourceRoot":"","sources":["../../src/oauth/oauth-error.ts"],"names":[],"mappings":";;;;;;;;;AAyCA,0CAQC;AAjDD,2CAMwB;AACxB,wCAAuC;AAIvC,4CAAyC;AAYzC,MAAa,aAAc,SAAQ,4BAAmB;IAGlD,YAAY,IAAuB,EAAE,WAAmB;QACpD,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAAE,CAAC,CAAC;QACvD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,WAAW,CAAC;IAC/B,CAAC;CACJ;AARD,sCAQC;AAED,uIAAuI;AACvI,MAAa,0BAA2B,SAAQ,8BAAqB;IACjE;QACI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAClC,CAAC;CACJ;AAJD,gEAIC;AAED,qHAAqH;AACrH,SAAgB,eAAe,CAAI,MAAkB,EAAE,KAAc,EAAE,IAAuB;IAC1F,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACvC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,MAAM,CAAC,IAAI,CAAC;IACvB,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACrC,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvC,MAAM,IAAI,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAChG,CAAC;AAED,6HAA6H;AAEtH,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;IAChC,KAAK,CAAC,SAA8B,EAAE,IAAmB;QACrD,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,WAAW,EAAY,CAAC;QACxD,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;QAC3C,GAAG,CAAC,SAAS,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QACpC,IAAI,IAAa,CAAC;QAClB,IAAI,SAAS,YAAY,aAAa,EAAE,CAAC;YACrC,IAAI,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;QACnC,CAAC;aAAM,CAAC;YACJ,aAAM,CAAC,IAAI,CAAC,2BAA2B,SAAS,CAAC,OAAO,EAAE,EAAE,qBAAS,CAAC,CAAC;YACvE,IAAI,GAAG,EAAE,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC;QAC9E,CAAC;QACD,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC;CACJ,CAAA;AAdY,0DAAuB;kCAAvB,uBAAuB;IADnC,IAAA,cAAK,EAAC,4BAAmB,CAAC;GACd,uBAAuB,CAcnC"}
@@ -0,0 +1,34 @@
1
+ import { McpToolset } from '@vendure/mcp-sdk';
2
+ import { ResolvedMcpPluginOptions } from '../internal-types';
3
+ /** Builds the RFC 8414 and RFC 9728 OAuth discovery documents this server publishes. */
4
+ export declare class McpOauthMetadataService {
5
+ private readonly options;
6
+ constructor(options: ResolvedMcpPluginOptions);
7
+ metadata(): {
8
+ issuer: string;
9
+ authorization_endpoint: string;
10
+ token_endpoint: string;
11
+ registration_endpoint: string;
12
+ revocation_endpoint: string;
13
+ response_types_supported: string[];
14
+ grant_types_supported: string[];
15
+ code_challenge_methods_supported: string[];
16
+ token_endpoint_auth_methods_supported: string[];
17
+ client_id_metadata_document_supported: boolean;
18
+ };
19
+ protectedResourceMetadata(toolsetParam: string): {
20
+ resource: string;
21
+ authorization_servers: string[];
22
+ bearer_methods_supported: string[];
23
+ resource_name: string;
24
+ };
25
+ protectedResourceMetadataUrl(toolset: McpToolset): string;
26
+ resolveResource(resource?: string): {
27
+ resource: string;
28
+ toolset: McpToolset;
29
+ };
30
+ /** Shop is not a valid toolset when shop access is switched off. */
31
+ private availableToolsets;
32
+ private issuerOrigin;
33
+ resourceForToolset(toolset: McpToolset): string;
34
+ }