mppx 0.6.31 → 0.8.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 (616) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/README.md +20 -11
  3. package/dist/Challenge.d.ts.map +1 -1
  4. package/dist/Challenge.js +27 -13
  5. package/dist/Challenge.js.map +1 -1
  6. package/dist/Constants.d.ts +46 -0
  7. package/dist/Constants.d.ts.map +1 -0
  8. package/dist/Constants.js +46 -0
  9. package/dist/Constants.js.map +1 -0
  10. package/dist/Credential.d.ts.map +1 -1
  11. package/dist/Credential.js +5 -4
  12. package/dist/Credential.js.map +1 -1
  13. package/dist/Mcp.d.ts +3 -0
  14. package/dist/Mcp.d.ts.map +1 -1
  15. package/dist/Mcp.js +2 -0
  16. package/dist/Mcp.js.map +1 -1
  17. package/dist/Method.d.ts +32 -4
  18. package/dist/Method.d.ts.map +1 -1
  19. package/dist/Method.js +5 -2
  20. package/dist/Method.js.map +1 -1
  21. package/dist/PaymentRequest.d.ts +10 -10
  22. package/dist/PaymentRequest.js +8 -8
  23. package/dist/Receipt.d.ts.map +1 -1
  24. package/dist/Receipt.js +3 -2
  25. package/dist/Receipt.js.map +1 -1
  26. package/dist/cli/cli.d.ts.map +1 -1
  27. package/dist/cli/cli.js +19 -11
  28. package/dist/cli/cli.js.map +1 -1
  29. package/dist/cli/plugins/tempo.d.ts.map +1 -1
  30. package/dist/cli/plugins/tempo.js +17 -6
  31. package/dist/cli/plugins/tempo.js.map +1 -1
  32. package/dist/cli/utils.d.ts +5 -0
  33. package/dist/cli/utils.d.ts.map +1 -1
  34. package/dist/cli/utils.js +10 -0
  35. package/dist/cli/utils.js.map +1 -1
  36. package/dist/client/Methods.d.ts +5 -2
  37. package/dist/client/Methods.d.ts.map +1 -1
  38. package/dist/client/Methods.js +5 -2
  39. package/dist/client/Methods.js.map +1 -1
  40. package/dist/client/Mppx.js +2 -2
  41. package/dist/client/Mppx.js.map +1 -1
  42. package/dist/client/Transport.d.ts +11 -16
  43. package/dist/client/Transport.d.ts.map +1 -1
  44. package/dist/client/Transport.js +55 -76
  45. package/dist/client/Transport.js.map +1 -1
  46. package/dist/client/index.d.ts +5 -1
  47. package/dist/client/index.d.ts.map +1 -1
  48. package/dist/client/index.js +3 -1
  49. package/dist/client/index.js.map +1 -1
  50. package/dist/client/internal/Fetch.d.ts.map +1 -1
  51. package/dist/client/internal/Fetch.js +60 -13
  52. package/dist/client/internal/Fetch.js.map +1 -1
  53. package/dist/client/internal/protocols/Mcp.d.ts +7 -0
  54. package/dist/client/internal/protocols/Mcp.d.ts.map +1 -0
  55. package/dist/client/internal/protocols/Mcp.js +159 -0
  56. package/dist/client/internal/protocols/Mcp.js.map +1 -0
  57. package/dist/client/internal/protocols/Mpp.d.ts +4 -0
  58. package/dist/client/internal/protocols/Mpp.d.ts.map +1 -0
  59. package/dist/client/internal/protocols/Mpp.js +18 -0
  60. package/dist/client/internal/protocols/Mpp.js.map +1 -0
  61. package/dist/client/internal/protocols/Protocol.d.ts +10 -0
  62. package/dist/client/internal/protocols/Protocol.d.ts.map +1 -0
  63. package/dist/client/internal/protocols/Protocol.js +2 -0
  64. package/dist/client/internal/protocols/Protocol.js.map +1 -0
  65. package/dist/client/internal/protocols/Shared.d.ts +5 -0
  66. package/dist/client/internal/protocols/Shared.d.ts.map +1 -0
  67. package/dist/client/internal/protocols/Shared.js +20 -0
  68. package/dist/client/internal/protocols/Shared.js.map +1 -0
  69. package/dist/client/internal/protocols/X402.d.ts +8 -0
  70. package/dist/client/internal/protocols/X402.d.ts.map +1 -0
  71. package/dist/client/internal/protocols/X402.js +39 -0
  72. package/dist/client/internal/protocols/X402.js.map +1 -0
  73. package/dist/evm/client/index.d.ts +1 -0
  74. package/dist/evm/client/index.d.ts.map +1 -1
  75. package/dist/evm/client/index.js +1 -0
  76. package/dist/evm/client/index.js.map +1 -1
  77. package/dist/evm/index.d.ts +2 -0
  78. package/dist/evm/index.d.ts.map +1 -1
  79. package/dist/evm/index.js +2 -0
  80. package/dist/evm/index.js.map +1 -1
  81. package/dist/evm/server/Methods.d.ts +1 -1
  82. package/dist/evm/server/Methods.d.ts.map +1 -1
  83. package/dist/evm/server/index.d.ts +1 -0
  84. package/dist/evm/server/index.d.ts.map +1 -1
  85. package/dist/evm/server/index.js +1 -0
  86. package/dist/evm/server/index.js.map +1 -1
  87. package/dist/index.d.ts +1 -0
  88. package/dist/index.d.ts.map +1 -1
  89. package/dist/index.js +1 -0
  90. package/dist/index.js.map +1 -1
  91. package/dist/internal/AcceptPayment.d.ts +3 -0
  92. package/dist/internal/AcceptPayment.d.ts.map +1 -1
  93. package/dist/internal/AcceptPayment.js +15 -11
  94. package/dist/internal/AcceptPayment.js.map +1 -1
  95. package/dist/mcp/client/McpClient.d.ts +101 -0
  96. package/dist/mcp/client/McpClient.d.ts.map +1 -0
  97. package/dist/mcp/client/McpClient.js +162 -0
  98. package/dist/mcp/client/McpClient.js.map +1 -0
  99. package/dist/mcp/client/index.d.ts.map +1 -0
  100. package/dist/mcp/client/index.js.map +1 -0
  101. package/dist/mcp/server/Transport.d.ts.map +1 -0
  102. package/dist/mcp/server/Transport.js.map +1 -0
  103. package/dist/mcp/server/index.d.ts.map +1 -0
  104. package/dist/mcp/server/index.js.map +1 -0
  105. package/dist/server/Mppx.d.ts +12 -4
  106. package/dist/server/Mppx.d.ts.map +1 -1
  107. package/dist/server/Mppx.js +85 -27
  108. package/dist/server/Mppx.js.map +1 -1
  109. package/dist/server/Response.d.ts.map +1 -1
  110. package/dist/server/Response.js +2 -1
  111. package/dist/server/Response.js.map +1 -1
  112. package/dist/server/Transport.d.ts +1 -1
  113. package/dist/server/Transport.d.ts.map +1 -1
  114. package/dist/server/Transport.js +5 -4
  115. package/dist/server/Transport.js.map +1 -1
  116. package/dist/server/index.d.ts +1 -0
  117. package/dist/server/index.d.ts.map +1 -1
  118. package/dist/server/index.js +1 -0
  119. package/dist/server/index.js.map +1 -1
  120. package/dist/stripe/client/Charge.d.ts +1 -1
  121. package/dist/stripe/client/Charge.d.ts.map +1 -1
  122. package/dist/stripe/client/Charge.js +3 -1
  123. package/dist/stripe/client/Charge.js.map +1 -1
  124. package/dist/stripe/server/Charge.d.ts +1 -1
  125. package/dist/stripe/server/Charge.d.ts.map +1 -1
  126. package/dist/stripe/server/Charge.js +9 -2
  127. package/dist/stripe/server/Charge.js.map +1 -1
  128. package/dist/stripe/server/Methods.d.ts +1 -1
  129. package/dist/stripe/server/Methods.d.ts.map +1 -1
  130. package/dist/stripe/server/internal/html.gen.d.ts +1 -1
  131. package/dist/stripe/server/internal/html.gen.d.ts.map +1 -1
  132. package/dist/stripe/server/internal/html.gen.js +1 -1
  133. package/dist/stripe/server/internal/html.gen.js.map +1 -1
  134. package/dist/tempo/Methods.d.ts +18 -0
  135. package/dist/tempo/Methods.d.ts.map +1 -1
  136. package/dist/tempo/Methods.js +16 -1
  137. package/dist/tempo/Methods.js.map +1 -1
  138. package/dist/tempo/Proof.d.ts +85 -1
  139. package/dist/tempo/Proof.d.ts.map +1 -1
  140. package/dist/tempo/Proof.js +35 -0
  141. package/dist/tempo/Proof.js.map +1 -1
  142. package/dist/tempo/client/Charge.d.ts +19 -1
  143. package/dist/tempo/client/Charge.d.ts.map +1 -1
  144. package/dist/tempo/client/Charge.js +47 -27
  145. package/dist/tempo/client/Charge.js.map +1 -1
  146. package/dist/tempo/client/Methods.d.ts +41 -10
  147. package/dist/tempo/client/Methods.d.ts.map +1 -1
  148. package/dist/tempo/client/Methods.js +16 -7
  149. package/dist/tempo/client/Methods.js.map +1 -1
  150. package/dist/tempo/client/ResolveAccount.d.ts +40 -0
  151. package/dist/tempo/client/ResolveAccount.d.ts.map +1 -0
  152. package/dist/tempo/client/ResolveAccount.js +2 -0
  153. package/dist/tempo/client/ResolveAccount.js.map +1 -0
  154. package/dist/tempo/client/index.d.ts +7 -4
  155. package/dist/tempo/client/index.d.ts.map +1 -1
  156. package/dist/tempo/client/index.js +5 -3
  157. package/dist/tempo/client/index.js.map +1 -1
  158. package/dist/tempo/index.d.ts +1 -0
  159. package/dist/tempo/index.d.ts.map +1 -1
  160. package/dist/tempo/index.js +1 -0
  161. package/dist/tempo/index.js.map +1 -1
  162. package/dist/tempo/internal/fee-payer.d.ts +29 -1
  163. package/dist/tempo/internal/fee-payer.d.ts.map +1 -1
  164. package/dist/tempo/internal/fee-payer.js +138 -4
  165. package/dist/tempo/internal/fee-payer.js.map +1 -1
  166. package/dist/tempo/internal/proof.d.ts +71 -5
  167. package/dist/tempo/internal/proof.d.ts.map +1 -1
  168. package/dist/tempo/internal/proof.js +42 -6
  169. package/dist/tempo/internal/proof.js.map +1 -1
  170. package/dist/tempo/{client → legacy/client}/ChannelOps.d.ts +19 -6
  171. package/dist/tempo/legacy/client/ChannelOps.d.ts.map +1 -0
  172. package/dist/tempo/{client → legacy/client}/ChannelOps.js +9 -3
  173. package/dist/tempo/legacy/client/ChannelOps.js.map +1 -0
  174. package/dist/tempo/{client → legacy/client}/Session.d.ts +23 -4
  175. package/dist/tempo/legacy/client/Session.d.ts.map +1 -0
  176. package/dist/tempo/{client → legacy/client}/Session.js +14 -7
  177. package/dist/tempo/legacy/client/Session.js.map +1 -0
  178. package/dist/tempo/{client → legacy/client}/SessionManager.d.ts +20 -5
  179. package/dist/tempo/legacy/client/SessionManager.d.ts.map +1 -0
  180. package/dist/tempo/{client → legacy/client}/SessionManager.js +30 -19
  181. package/dist/tempo/legacy/client/SessionManager.js.map +1 -0
  182. package/dist/tempo/legacy/client/index.d.ts +7 -0
  183. package/dist/tempo/legacy/client/index.d.ts.map +1 -0
  184. package/dist/tempo/legacy/client/index.js +5 -0
  185. package/dist/tempo/legacy/client/index.js.map +1 -0
  186. package/dist/tempo/legacy/index.d.ts +7 -0
  187. package/dist/tempo/legacy/index.d.ts.map +1 -0
  188. package/dist/tempo/legacy/index.js +7 -0
  189. package/dist/tempo/legacy/index.js.map +1 -0
  190. package/dist/tempo/{server → legacy/server}/Session.d.ts +28 -11
  191. package/dist/tempo/legacy/server/Session.d.ts.map +1 -0
  192. package/dist/tempo/{server → legacy/server}/Session.js +12 -10
  193. package/dist/tempo/legacy/server/Session.js.map +1 -0
  194. package/dist/tempo/legacy/server/index.d.ts +5 -0
  195. package/dist/tempo/legacy/server/index.d.ts.map +1 -0
  196. package/dist/tempo/legacy/server/index.js +5 -0
  197. package/dist/tempo/legacy/server/index.js.map +1 -0
  198. package/dist/tempo/{session → legacy/session}/Chain.d.ts +30 -23
  199. package/dist/tempo/legacy/session/Chain.d.ts.map +1 -0
  200. package/dist/tempo/{session → legacy/session}/Chain.js +12 -11
  201. package/dist/tempo/legacy/session/Chain.js.map +1 -0
  202. package/dist/tempo/{session → legacy/session}/Channel.d.ts +1 -0
  203. package/dist/tempo/legacy/session/Channel.d.ts.map +1 -0
  204. package/dist/tempo/legacy/session/Channel.js.map +1 -0
  205. package/dist/tempo/legacy/session/ChannelStore.d.ts +22 -0
  206. package/dist/tempo/legacy/session/ChannelStore.d.ts.map +1 -0
  207. package/dist/tempo/legacy/session/ChannelStore.js +6 -0
  208. package/dist/tempo/legacy/session/ChannelStore.js.map +1 -0
  209. package/dist/tempo/legacy/session/Types.d.ts +73 -0
  210. package/dist/tempo/legacy/session/Types.d.ts.map +1 -0
  211. package/dist/tempo/legacy/session/Types.js.map +1 -0
  212. package/dist/tempo/{session → legacy/session}/Voucher.d.ts +4 -4
  213. package/dist/tempo/legacy/session/Voucher.d.ts.map +1 -0
  214. package/dist/tempo/{session → legacy/session}/Voucher.js +1 -1
  215. package/dist/tempo/legacy/session/Voucher.js.map +1 -0
  216. package/dist/tempo/{session → legacy/session}/escrow.abi.d.ts +1 -0
  217. package/dist/tempo/{session → legacy/session}/escrow.abi.d.ts.map +1 -1
  218. package/dist/tempo/{session → legacy/session}/escrow.abi.js +1 -0
  219. package/dist/tempo/legacy/session/escrow.abi.js.map +1 -0
  220. package/dist/tempo/legacy/session/index.d.ts +9 -0
  221. package/dist/tempo/legacy/session/index.d.ts.map +1 -0
  222. package/dist/tempo/legacy/session/index.js +9 -0
  223. package/dist/tempo/legacy/session/index.js.map +1 -0
  224. package/dist/tempo/server/Charge.d.ts +1 -1
  225. package/dist/tempo/server/Charge.d.ts.map +1 -1
  226. package/dist/tempo/server/Charge.js +51 -30
  227. package/dist/tempo/server/Charge.js.map +1 -1
  228. package/dist/tempo/server/Methods.d.ts +67 -8
  229. package/dist/tempo/server/Methods.d.ts.map +1 -1
  230. package/dist/tempo/server/Methods.js +40 -10
  231. package/dist/tempo/server/Methods.js.map +1 -1
  232. package/dist/tempo/server/Subscription.d.ts +11 -1
  233. package/dist/tempo/server/Subscription.d.ts.map +1 -1
  234. package/dist/tempo/server/Subscription.js +135 -23
  235. package/dist/tempo/server/Subscription.js.map +1 -1
  236. package/dist/tempo/server/index.d.ts +6 -5
  237. package/dist/tempo/server/index.d.ts.map +1 -1
  238. package/dist/tempo/server/index.js +5 -5
  239. package/dist/tempo/server/index.js.map +1 -1
  240. package/dist/tempo/server/internal/html.gen.d.ts +1 -1
  241. package/dist/tempo/server/internal/html.gen.d.ts.map +1 -1
  242. package/dist/tempo/server/internal/html.gen.js +1 -1
  243. package/dist/tempo/server/internal/html.gen.js.map +1 -1
  244. package/dist/tempo/server/internal/request-body.d.ts +7 -2
  245. package/dist/tempo/server/internal/request-body.d.ts.map +1 -1
  246. package/dist/tempo/server/internal/request-body.js +20 -3
  247. package/dist/tempo/server/internal/request-body.js.map +1 -1
  248. package/dist/tempo/server/internal/transport.d.ts +8 -4
  249. package/dist/tempo/server/internal/transport.d.ts.map +1 -1
  250. package/dist/tempo/server/internal/transport.js +8 -7
  251. package/dist/tempo/server/internal/transport.js.map +1 -1
  252. package/dist/tempo/session/Snapshot.d.ts +32 -0
  253. package/dist/tempo/session/Snapshot.d.ts.map +1 -0
  254. package/dist/tempo/session/Snapshot.js +37 -0
  255. package/dist/tempo/session/Snapshot.js.map +1 -0
  256. package/dist/tempo/session/client/ChannelOps.d.ts +81 -0
  257. package/dist/tempo/session/client/ChannelOps.d.ts.map +1 -0
  258. package/dist/tempo/session/client/ChannelOps.js +201 -0
  259. package/dist/tempo/session/client/ChannelOps.js.map +1 -0
  260. package/dist/tempo/session/client/ChannelStore.d.ts +51 -0
  261. package/dist/tempo/session/client/ChannelStore.d.ts.map +1 -0
  262. package/dist/tempo/session/client/ChannelStore.js +63 -0
  263. package/dist/tempo/session/client/ChannelStore.js.map +1 -0
  264. package/dist/tempo/session/client/CredentialState.d.ts +245 -0
  265. package/dist/tempo/session/client/CredentialState.d.ts.map +1 -0
  266. package/dist/tempo/session/client/CredentialState.js +419 -0
  267. package/dist/tempo/session/client/CredentialState.js.map +1 -0
  268. package/dist/tempo/session/client/ReceiptCoordinator.d.ts +26 -0
  269. package/dist/tempo/session/client/ReceiptCoordinator.d.ts.map +1 -0
  270. package/dist/tempo/session/client/ReceiptCoordinator.js +61 -0
  271. package/dist/tempo/session/client/ReceiptCoordinator.js.map +1 -0
  272. package/dist/tempo/session/client/Runtime.d.ts +464 -0
  273. package/dist/tempo/session/client/Runtime.d.ts.map +1 -0
  274. package/dist/tempo/session/client/Runtime.js +499 -0
  275. package/dist/tempo/session/client/Runtime.js.map +1 -0
  276. package/dist/tempo/session/client/Session.d.ts +138 -0
  277. package/dist/tempo/session/client/Session.d.ts.map +1 -0
  278. package/dist/tempo/session/client/Session.js +69 -0
  279. package/dist/tempo/session/client/Session.js.map +1 -0
  280. package/dist/tempo/session/client/SessionManager.d.ts +84 -0
  281. package/dist/tempo/session/client/SessionManager.d.ts.map +1 -0
  282. package/dist/tempo/session/client/SessionManager.js +577 -0
  283. package/dist/tempo/session/client/SessionManager.js.map +1 -0
  284. package/dist/tempo/session/client/Transports.d.ts +449 -0
  285. package/dist/tempo/session/client/Transports.d.ts.map +1 -0
  286. package/dist/tempo/session/client/Transports.js +721 -0
  287. package/dist/tempo/session/client/Transports.js.map +1 -0
  288. package/dist/tempo/session/client/index.d.ts +11 -0
  289. package/dist/tempo/session/client/index.d.ts.map +1 -0
  290. package/dist/tempo/session/client/index.js +6 -0
  291. package/dist/tempo/session/client/index.js.map +1 -0
  292. package/dist/tempo/session/index.d.ts +7 -8
  293. package/dist/tempo/session/index.d.ts.map +1 -1
  294. package/dist/tempo/session/index.js +7 -8
  295. package/dist/tempo/session/index.js.map +1 -1
  296. package/dist/tempo/session/precompile/Chain.d.ts +319 -0
  297. package/dist/tempo/session/precompile/Chain.d.ts.map +1 -0
  298. package/dist/tempo/session/precompile/Chain.js +492 -0
  299. package/dist/tempo/session/precompile/Chain.js.map +1 -0
  300. package/dist/tempo/session/precompile/Channel.d.ts +46 -0
  301. package/dist/tempo/session/precompile/Channel.d.ts.map +1 -0
  302. package/dist/tempo/session/precompile/Channel.js +56 -0
  303. package/dist/tempo/session/precompile/Channel.js.map +1 -0
  304. package/dist/tempo/session/precompile/Protocol.d.ts +308 -0
  305. package/dist/tempo/session/precompile/Protocol.d.ts.map +1 -0
  306. package/dist/tempo/session/precompile/Protocol.js +264 -0
  307. package/dist/tempo/session/precompile/Protocol.js.map +1 -0
  308. package/dist/tempo/session/precompile/Voucher.d.ts +40 -0
  309. package/dist/tempo/session/precompile/Voucher.d.ts.map +1 -0
  310. package/dist/tempo/session/precompile/Voucher.js +125 -0
  311. package/dist/tempo/session/precompile/Voucher.js.map +1 -0
  312. package/dist/tempo/session/precompile/escrow.abi.d.ts +522 -0
  313. package/dist/tempo/session/precompile/escrow.abi.d.ts.map +1 -0
  314. package/dist/tempo/session/precompile/escrow.abi.js +224 -0
  315. package/dist/tempo/session/precompile/escrow.abi.js.map +1 -0
  316. package/dist/tempo/session/precompile/index.d.ts +24 -0
  317. package/dist/tempo/session/precompile/index.d.ts.map +1 -0
  318. package/dist/tempo/session/precompile/index.js +22 -0
  319. package/dist/tempo/session/precompile/index.js.map +1 -0
  320. package/dist/tempo/session/server/ChannelOps.d.ts +56 -0
  321. package/dist/tempo/session/server/ChannelOps.d.ts.map +1 -0
  322. package/dist/tempo/session/server/ChannelOps.js +91 -0
  323. package/dist/tempo/session/server/ChannelOps.js.map +1 -0
  324. package/dist/tempo/session/server/ChannelStore.d.ts +347 -0
  325. package/dist/tempo/session/server/ChannelStore.d.ts.map +1 -0
  326. package/dist/tempo/session/server/ChannelStore.js +404 -0
  327. package/dist/tempo/session/server/ChannelStore.js.map +1 -0
  328. package/dist/tempo/session/server/CredentialVerification.d.ts +85 -0
  329. package/dist/tempo/session/server/CredentialVerification.d.ts.map +1 -0
  330. package/dist/tempo/session/server/CredentialVerification.js +494 -0
  331. package/dist/tempo/session/server/CredentialVerification.js.map +1 -0
  332. package/dist/tempo/session/server/MeteredStream.d.ts +40 -0
  333. package/dist/tempo/session/server/MeteredStream.d.ts.map +1 -0
  334. package/dist/tempo/session/server/MeteredStream.js +42 -0
  335. package/dist/tempo/session/server/MeteredStream.js.map +1 -0
  336. package/dist/tempo/session/server/RequestState.d.ts +208 -0
  337. package/dist/tempo/session/server/RequestState.d.ts.map +1 -0
  338. package/dist/tempo/session/server/RequestState.js +252 -0
  339. package/dist/tempo/session/server/RequestState.js.map +1 -0
  340. package/dist/tempo/session/server/Session.d.ts +169 -0
  341. package/dist/tempo/session/server/Session.d.ts.map +1 -0
  342. package/dist/tempo/session/server/Session.js +351 -0
  343. package/dist/tempo/session/server/Session.js.map +1 -0
  344. package/dist/tempo/session/server/Settlement.d.ts +185 -0
  345. package/dist/tempo/session/server/Settlement.d.ts.map +1 -0
  346. package/dist/tempo/session/server/Settlement.js +252 -0
  347. package/dist/tempo/session/server/Settlement.js.map +1 -0
  348. package/dist/tempo/session/{Sse.d.ts → server/Sse.d.ts} +9 -56
  349. package/dist/tempo/session/server/Sse.d.ts.map +1 -0
  350. package/dist/tempo/session/server/Sse.js +184 -0
  351. package/dist/tempo/session/server/Sse.js.map +1 -0
  352. package/dist/tempo/session/server/Transports.d.ts +89 -0
  353. package/dist/tempo/session/server/Transports.d.ts.map +1 -0
  354. package/dist/tempo/session/server/Transports.js +149 -0
  355. package/dist/tempo/session/server/Transports.js.map +1 -0
  356. package/dist/tempo/session/server/Ws.d.ts +48 -0
  357. package/dist/tempo/session/server/Ws.d.ts.map +1 -0
  358. package/dist/tempo/session/server/Ws.js +244 -0
  359. package/dist/tempo/session/server/Ws.js.map +1 -0
  360. package/dist/tempo/session/server/index.d.ts +4 -0
  361. package/dist/tempo/session/server/index.d.ts.map +1 -0
  362. package/dist/tempo/session/server/index.js +2 -0
  363. package/dist/tempo/session/server/index.js.map +1 -0
  364. package/dist/tempo/subscription/KeyAuthorization.d.ts +712 -1
  365. package/dist/tempo/subscription/KeyAuthorization.d.ts.map +1 -1
  366. package/dist/tempo/subscription/Store.d.ts +2 -0
  367. package/dist/tempo/subscription/Store.d.ts.map +1 -1
  368. package/dist/tempo/subscription/Store.js +16 -1
  369. package/dist/tempo/subscription/Store.js.map +1 -1
  370. package/dist/x402/index.d.ts +1 -0
  371. package/dist/x402/index.d.ts.map +1 -1
  372. package/dist/x402/index.js +1 -0
  373. package/dist/x402/index.js.map +1 -1
  374. package/package.json +25 -9
  375. package/src/Challenge.test.ts +40 -0
  376. package/src/Challenge.ts +28 -13
  377. package/src/Constants.ts +58 -0
  378. package/src/Credential.ts +5 -4
  379. package/src/Mcp.ts +4 -0
  380. package/src/Method.ts +46 -5
  381. package/src/PaymentRequest.ts +10 -10
  382. package/src/Receipt.ts +3 -2
  383. package/src/cli/cli.test.ts +38 -43
  384. package/src/cli/cli.ts +23 -10
  385. package/src/cli/mcp.test.ts +21 -7
  386. package/src/cli/plugins/tempo.ts +21 -8
  387. package/src/cli/utils.test.ts +25 -1
  388. package/src/cli/utils.ts +10 -0
  389. package/src/client/Methods.ts +5 -2
  390. package/src/client/Mppx.test-d.ts +31 -1
  391. package/src/client/Mppx.test.ts +76 -1
  392. package/src/client/Mppx.ts +2 -2
  393. package/src/client/Transport.test.ts +225 -178
  394. package/src/client/Transport.ts +77 -84
  395. package/src/client/index.ts +25 -1
  396. package/src/client/internal/Fetch.test.ts +236 -6
  397. package/src/client/internal/Fetch.ts +69 -11
  398. package/src/client/internal/protocols/Mcp.test.ts +220 -0
  399. package/src/client/internal/protocols/Mcp.ts +162 -0
  400. package/src/client/internal/protocols/Mpp.ts +21 -0
  401. package/src/client/internal/protocols/Protocol.ts +10 -0
  402. package/src/client/internal/protocols/Shared.ts +25 -0
  403. package/src/client/internal/protocols/X402.ts +42 -0
  404. package/src/discovery/OpenApi.test.ts +1 -1
  405. package/src/env.d.ts +1 -1
  406. package/src/evm/PublicInterface.test-d.ts +1 -1
  407. package/src/evm/client/index.ts +1 -0
  408. package/src/evm/index.ts +2 -0
  409. package/src/evm/server/Charge.test.ts +1 -1
  410. package/src/evm/server/index.ts +1 -0
  411. package/src/index.ts +1 -0
  412. package/src/internal/AcceptPayment.test.ts +61 -0
  413. package/src/internal/AcceptPayment.ts +21 -14
  414. package/src/{mcp-sdk → mcp}/client/McpClient.integration.test.ts +18 -11
  415. package/src/{mcp-sdk → mcp}/client/McpClient.test-d.ts +45 -11
  416. package/src/{mcp-sdk → mcp}/client/McpClient.test.ts +211 -5
  417. package/src/mcp/client/McpClient.ts +307 -0
  418. package/src/mcp/client/McpClient.unit.test.ts +135 -0
  419. package/src/middlewares/elysia.test.ts +9 -5
  420. package/src/middlewares/express.test.ts +9 -5
  421. package/src/middlewares/hono.test.ts +5 -5
  422. package/src/middlewares/internal/mppx.test.ts +1 -1
  423. package/src/middlewares/nextjs.test.ts +9 -5
  424. package/src/proxy/Proxy.test.ts +9 -9
  425. package/src/proxy/services/anthropic.test.ts +1 -1
  426. package/src/proxy/services/openai.test.ts +1 -1
  427. package/src/proxy/services/stripe.test.ts +1 -1
  428. package/src/server/Mppx.authorize.test.ts +1 -1
  429. package/src/server/Mppx.test-d.ts +55 -1
  430. package/src/server/Mppx.test.ts +220 -9
  431. package/src/server/Mppx.ts +501 -407
  432. package/src/server/Response.ts +2 -1
  433. package/src/server/Transport.test.ts +6 -6
  434. package/src/server/Transport.ts +5 -4
  435. package/src/server/index.ts +1 -0
  436. package/src/stripe/Charge.integration.test.ts +1 -1
  437. package/src/stripe/client/Charge.test.ts +21 -6
  438. package/src/stripe/client/Charge.ts +6 -2
  439. package/src/stripe/server/Charge.test.ts +115 -2
  440. package/src/stripe/server/Charge.ts +13 -2
  441. package/src/stripe/server/internal/html/package.json +1 -1
  442. package/src/stripe/server/internal/html.gen.ts +1 -1
  443. package/src/tempo/AccessKeyAuthorization.test.ts +4 -94
  444. package/src/tempo/Methods.test.ts +45 -17
  445. package/src/tempo/Methods.ts +22 -0
  446. package/src/tempo/Proof.conformance.test.ts +146 -0
  447. package/src/tempo/Proof.test-d.ts +15 -0
  448. package/src/tempo/Proof.ts +52 -1
  449. package/src/tempo/PublicExports.test-d.ts +105 -0
  450. package/src/tempo/Subscription.integration.test.ts +1 -1
  451. package/src/tempo/client/Charge.test.ts +258 -0
  452. package/src/tempo/client/Charge.ts +84 -38
  453. package/src/tempo/client/Methods.ts +22 -8
  454. package/src/tempo/client/ResolveAccount.ts +46 -0
  455. package/src/tempo/client/index.ts +15 -4
  456. package/src/tempo/index.ts +1 -0
  457. package/src/tempo/internal/fee-payer.test.ts +296 -17
  458. package/src/tempo/internal/fee-payer.ts +186 -4
  459. package/src/tempo/internal/fee-token.test.ts +14 -9
  460. package/src/tempo/internal/proof.test.ts +12 -4
  461. package/src/tempo/internal/proof.ts +55 -6
  462. package/src/tempo/legacy/AccessKeyAuthorization.test.ts +162 -0
  463. package/src/tempo/legacy/README.md +9 -0
  464. package/src/tempo/{client → legacy/client}/ChannelOps.test.ts +6 -7
  465. package/src/tempo/{client → legacy/client}/ChannelOps.ts +22 -9
  466. package/src/tempo/{client → legacy/client}/Session.test.ts +51 -9
  467. package/src/tempo/{client → legacy/client}/Session.ts +25 -11
  468. package/src/tempo/{client → legacy/client}/SessionManager.test.ts +81 -9
  469. package/src/tempo/{client → legacy/client}/SessionManager.ts +52 -23
  470. package/src/tempo/legacy/client/index.ts +6 -0
  471. package/src/tempo/legacy/index.ts +6 -0
  472. package/src/tempo/{server → legacy/server}/Session.test.ts +136 -71
  473. package/src/tempo/{server → legacy/server}/Session.ts +32 -23
  474. package/src/tempo/legacy/server/index.ts +4 -0
  475. package/src/tempo/{session → legacy/session}/Chain.test.ts +3 -4
  476. package/src/tempo/{session → legacy/session}/Chain.ts +94 -63
  477. package/src/tempo/{session → legacy/session}/Channel.ts +1 -0
  478. package/src/tempo/legacy/session/ChannelStore.test.ts +58 -0
  479. package/src/tempo/legacy/session/ChannelStore.ts +39 -0
  480. package/src/tempo/legacy/session/Types.ts +91 -0
  481. package/src/tempo/{session → legacy/session}/Voucher.ts +12 -8
  482. package/src/tempo/{session → legacy/session}/escrow.abi.ts +1 -0
  483. package/src/tempo/legacy/session/index.ts +8 -0
  484. package/src/tempo/server/AtomicStore.test-d.ts +16 -11
  485. package/src/tempo/server/Charge.test.ts +480 -31
  486. package/src/tempo/server/Charge.ts +54 -30
  487. package/src/tempo/server/Methods.ts +58 -10
  488. package/src/tempo/server/Sse.test.ts +2 -2
  489. package/src/tempo/server/Subscription.test.ts +465 -3
  490. package/src/tempo/server/Subscription.ts +174 -19
  491. package/src/tempo/server/index.ts +6 -5
  492. package/src/tempo/server/internal/html/package.json +2 -2
  493. package/src/tempo/server/internal/html.gen.ts +1 -1
  494. package/src/tempo/server/internal/request-body.test.ts +37 -4
  495. package/src/tempo/server/internal/request-body.ts +25 -6
  496. package/src/tempo/server/internal/transport.test.ts +4 -4
  497. package/src/tempo/server/internal/transport.ts +19 -10
  498. package/src/tempo/session/Snapshot.test.ts +41 -0
  499. package/src/tempo/session/Snapshot.ts +74 -0
  500. package/src/tempo/session/client/ChannelOps.test.ts +163 -0
  501. package/src/tempo/session/client/ChannelOps.ts +330 -0
  502. package/src/tempo/session/client/ChannelStore.ts +111 -0
  503. package/src/tempo/session/client/CredentialState.test.ts +789 -0
  504. package/src/tempo/session/client/CredentialState.ts +799 -0
  505. package/src/tempo/session/client/ReceiptCoordinator.ts +95 -0
  506. package/src/tempo/session/client/Runtime.test.ts +1092 -0
  507. package/src/tempo/session/client/Runtime.ts +986 -0
  508. package/src/tempo/session/client/Session.test.ts +774 -0
  509. package/src/tempo/session/client/Session.ts +123 -0
  510. package/src/tempo/session/client/SessionManager.test.ts +1397 -0
  511. package/src/tempo/session/client/SessionManager.ts +751 -0
  512. package/src/tempo/session/client/Transports.test.ts +837 -0
  513. package/src/tempo/session/client/Transports.ts +1292 -0
  514. package/src/tempo/session/client/index.ts +40 -0
  515. package/src/tempo/session/index.ts +7 -8
  516. package/src/tempo/session/precompile/Chain.integration.test.ts +321 -0
  517. package/src/tempo/session/precompile/Chain.test.ts +1258 -0
  518. package/src/tempo/session/precompile/Chain.ts +979 -0
  519. package/src/tempo/session/precompile/Channel.test.ts +138 -0
  520. package/src/tempo/session/precompile/Channel.ts +103 -0
  521. package/src/tempo/session/precompile/Protocol.test.ts +358 -0
  522. package/src/tempo/session/precompile/Protocol.ts +520 -0
  523. package/src/tempo/session/precompile/Voucher.test.ts +354 -0
  524. package/src/tempo/session/precompile/Voucher.ts +162 -0
  525. package/src/tempo/session/precompile/escrow.abi.ts +226 -0
  526. package/src/tempo/session/precompile/index.ts +33 -0
  527. package/src/tempo/session/server/ChannelOps.test.ts +129 -0
  528. package/src/tempo/session/server/ChannelOps.ts +157 -0
  529. package/src/tempo/session/{ChannelStore.test.ts → server/ChannelStore.test.ts} +536 -29
  530. package/src/tempo/session/server/ChannelStore.ts +835 -0
  531. package/src/tempo/session/server/CredentialVerification.test.ts +146 -0
  532. package/src/tempo/session/server/CredentialVerification.ts +710 -0
  533. package/src/tempo/session/server/MeteredStream.ts +88 -0
  534. package/src/tempo/session/server/RequestState.test.ts +531 -0
  535. package/src/tempo/session/server/RequestState.ts +499 -0
  536. package/src/tempo/session/server/Session.integration.test.ts +444 -0
  537. package/src/tempo/session/server/Session.test.ts +3253 -0
  538. package/src/tempo/session/server/Session.ts +543 -0
  539. package/src/tempo/session/server/Settlement.test.ts +329 -0
  540. package/src/tempo/session/server/Settlement.ts +471 -0
  541. package/src/tempo/session/{Sse.test.ts → server/Sse.test.ts} +37 -3
  542. package/src/tempo/session/server/Sse.ts +254 -0
  543. package/src/tempo/session/server/Transports.test.ts +346 -0
  544. package/src/tempo/session/server/Transports.ts +255 -0
  545. package/src/tempo/session/{Ws.test.ts → server/Ws.test.ts} +4 -4
  546. package/src/tempo/session/server/Ws.ts +380 -0
  547. package/src/tempo/session/server/index.ts +8 -0
  548. package/src/tempo/subscription/Store.ts +27 -9
  549. package/src/x402/Exact.e2e.test.ts +1 -1
  550. package/src/x402/PublicInterface.test-d.ts +1 -1
  551. package/src/x402/index.ts +1 -0
  552. package/dist/mcp-sdk/client/McpClient.d.ts +0 -78
  553. package/dist/mcp-sdk/client/McpClient.d.ts.map +0 -1
  554. package/dist/mcp-sdk/client/McpClient.js +0 -105
  555. package/dist/mcp-sdk/client/McpClient.js.map +0 -1
  556. package/dist/mcp-sdk/client/index.d.ts.map +0 -1
  557. package/dist/mcp-sdk/client/index.js.map +0 -1
  558. package/dist/mcp-sdk/server/Transport.d.ts.map +0 -1
  559. package/dist/mcp-sdk/server/Transport.js.map +0 -1
  560. package/dist/mcp-sdk/server/index.d.ts.map +0 -1
  561. package/dist/mcp-sdk/server/index.js.map +0 -1
  562. package/dist/tempo/client/ChannelOps.d.ts.map +0 -1
  563. package/dist/tempo/client/ChannelOps.js.map +0 -1
  564. package/dist/tempo/client/Session.d.ts.map +0 -1
  565. package/dist/tempo/client/Session.js.map +0 -1
  566. package/dist/tempo/client/SessionManager.d.ts.map +0 -1
  567. package/dist/tempo/client/SessionManager.js.map +0 -1
  568. package/dist/tempo/server/Session.d.ts.map +0 -1
  569. package/dist/tempo/server/Session.js.map +0 -1
  570. package/dist/tempo/session/Chain.d.ts.map +0 -1
  571. package/dist/tempo/session/Chain.js.map +0 -1
  572. package/dist/tempo/session/Channel.d.ts.map +0 -1
  573. package/dist/tempo/session/Channel.js.map +0 -1
  574. package/dist/tempo/session/ChannelStore.d.ts +0 -117
  575. package/dist/tempo/session/ChannelStore.d.ts.map +0 -1
  576. package/dist/tempo/session/ChannelStore.js +0 -172
  577. package/dist/tempo/session/ChannelStore.js.map +0 -1
  578. package/dist/tempo/session/Receipt.d.ts +0 -22
  579. package/dist/tempo/session/Receipt.d.ts.map +0 -1
  580. package/dist/tempo/session/Receipt.js +0 -34
  581. package/dist/tempo/session/Receipt.js.map +0 -1
  582. package/dist/tempo/session/Sse.d.ts.map +0 -1
  583. package/dist/tempo/session/Sse.js +0 -363
  584. package/dist/tempo/session/Sse.js.map +0 -1
  585. package/dist/tempo/session/Types.d.ts +0 -78
  586. package/dist/tempo/session/Types.d.ts.map +0 -1
  587. package/dist/tempo/session/Types.js.map +0 -1
  588. package/dist/tempo/session/Voucher.d.ts.map +0 -1
  589. package/dist/tempo/session/Voucher.js.map +0 -1
  590. package/dist/tempo/session/Ws.d.ts +0 -87
  591. package/dist/tempo/session/Ws.d.ts.map +0 -1
  592. package/dist/tempo/session/Ws.js +0 -443
  593. package/dist/tempo/session/Ws.js.map +0 -1
  594. package/dist/tempo/session/escrow.abi.js.map +0 -1
  595. package/src/mcp-sdk/client/McpClient.ts +0 -196
  596. package/src/tempo/session/ChannelStore.ts +0 -308
  597. package/src/tempo/session/Receipt.test.ts +0 -89
  598. package/src/tempo/session/Receipt.ts +0 -46
  599. package/src/tempo/session/Sse.ts +0 -462
  600. package/src/tempo/session/Types.ts +0 -86
  601. package/src/tempo/session/Ws.ts +0 -576
  602. /package/dist/{mcp-sdk → mcp}/client/index.d.ts +0 -0
  603. /package/dist/{mcp-sdk → mcp}/client/index.js +0 -0
  604. /package/dist/{mcp-sdk → mcp}/server/Transport.d.ts +0 -0
  605. /package/dist/{mcp-sdk → mcp}/server/Transport.js +0 -0
  606. /package/dist/{mcp-sdk → mcp}/server/index.d.ts +0 -0
  607. /package/dist/{mcp-sdk → mcp}/server/index.js +0 -0
  608. /package/dist/tempo/{session → legacy/session}/Channel.js +0 -0
  609. /package/dist/tempo/{session → legacy/session}/Types.js +0 -0
  610. /package/src/{mcp-sdk → mcp}/client/index.ts +0 -0
  611. /package/src/{mcp-sdk → mcp}/server/Transport.test.ts +0 -0
  612. /package/src/{mcp-sdk → mcp}/server/Transport.ts +0 -0
  613. /package/src/{mcp-sdk → mcp}/server/index.ts +0 -0
  614. /package/src/tempo/{session → legacy/session}/Channel.test.ts +0 -0
  615. /package/src/tempo/{session → legacy/session}/Voucher.test.ts +0 -0
  616. /package/src/tempo/session/{Sse.fuzz.test.ts → server/Sse.fuzz.test.ts} +0 -0
@@ -0,0 +1,307 @@
1
+ import type { Client } from '@modelcontextprotocol/sdk/client/index.js'
2
+ import type { McpError } from '@modelcontextprotocol/sdk/types.js'
3
+
4
+ import * as Challenge from '../../Challenge.js'
5
+ import * as Credential from '../../Credential.js'
6
+ import * as Expires from '../../Expires.js'
7
+ import * as AcceptPayment from '../../internal/AcceptPayment.js'
8
+ import * as core_Mcp from '../../Mcp.js'
9
+ import type * as Method from '../../Method.js'
10
+ import * as z from '../../zod.js'
11
+
12
+ type AnyClient = Method.Client<any, any>
13
+ type Methods = readonly (Method.AnyClient | readonly Method.AnyClient[])[]
14
+ type DefaultMethods = readonly [Method.AnyClient | readonly Method.AnyClient[]]
15
+ type CallToolParams = Parameters<Client['callTool']>[0]
16
+ type CallToolResultSchema = Parameters<Client['callTool']>[1]
17
+ type CallToolRequestOptions = Parameters<Client['callTool']>[2]
18
+ type PaymentRequiredData = NonNullable<core_Mcp.ErrorObject['data']>
19
+
20
+ const MPPX_MCP_CLIENT_WRAPPER = Symbol.for('mppx.mcp.client.wrapper')
21
+
22
+ export type OnPaymentRequired = (challenge: Challenge.Challenge) => boolean | Promise<boolean>
23
+
24
+ /**
25
+ * Result of a tool call with payment handling.
26
+ * Extends the SDK's callTool return type with an optional payment receipt.
27
+ */
28
+ export type CallToolResult = Awaited<ReturnType<Client['callTool']>> & {
29
+ /** Payment receipt if payment was made. */
30
+ receipt: core_Mcp.Receipt | undefined
31
+ }
32
+
33
+ /**
34
+ * Adds automatic payment handling to an MCP SDK client.
35
+ *
36
+ * The client's `callTool` method is replaced in place and the same reference
37
+ * is returned, so surfaces that keep using the original client become
38
+ * payment-aware — including when another SDK owns the client reference (e.g.
39
+ * Cloudflare Agents). The MCP SDK `callTool(params, resultSchema?, options?)`
40
+ * signature is preserved; pass a method's `context` or a per-call
41
+ * `onPaymentRequired` approval hook via the options argument, where they are
42
+ * stripped before the remaining request options are forwarded to the SDK.
43
+ * Payment challenges are handled whether they arrive as payment-required
44
+ * errors or as tool results carrying payment-required metadata. Calling
45
+ * `wrap()` again replaces the payment configuration.
46
+ *
47
+ * @example
48
+ * ```ts
49
+ * import { Client } from '@modelcontextprotocol/sdk/client'
50
+ * import { tempo } from 'mppx/client'
51
+ * import { McpClient } from 'mppx/mcp/client'
52
+ * import { privateKeyToAccount } from 'viem/accounts'
53
+ *
54
+ * const client = new Client({ name: 'my-client', version: '1.0.0' })
55
+ * await client.connect(transport)
56
+ *
57
+ * McpClient.wrap(client, {
58
+ * methods: [
59
+ * tempo({
60
+ * account: privateKeyToAccount('0x...'),
61
+ * }),
62
+ * ],
63
+ * })
64
+ *
65
+ * // Automatically handles payment challenges
66
+ * const result = await client.callTool({ name: 'premium_tool', arguments: {} })
67
+ * console.log(result.content, result.receipt)
68
+ * ```
69
+ */
70
+ export function wrap<const client extends Pick<Client, 'callTool'>, const methods extends Methods>(
71
+ client: client,
72
+ config: wrap.Config<methods>,
73
+ ): wrap.McpClient<client, methods> {
74
+ const target = client as client & { [MPPX_MCP_CLIENT_WRAPPER]?: Client['callTool'] }
75
+ const originalCallTool = target[MPPX_MCP_CLIENT_WRAPPER] ?? target.callTool
76
+ const callTool = createPaymentAwareCallTool(originalCallTool.bind(client), config)
77
+
78
+ Object.defineProperty(target, MPPX_MCP_CLIENT_WRAPPER, {
79
+ configurable: true,
80
+ value: originalCallTool,
81
+ })
82
+
83
+ Object.defineProperty(target, 'callTool', {
84
+ configurable: true,
85
+ enumerable: false,
86
+ value: (
87
+ params: CallToolParams,
88
+ resultSchema?: CallToolResultSchema,
89
+ options?: wrap.CallToolOptions<methods>,
90
+ ) => {
91
+ const { context, onPaymentRequired, ...requestOptions } =
92
+ options ?? ({} as wrap.CallToolOptions<methods>)
93
+ return callTool(params, {
94
+ context,
95
+ onPaymentRequired:
96
+ onPaymentRequired === null ? undefined : (onPaymentRequired ?? config.onPaymentRequired),
97
+ requestOptions: Object.keys(requestOptions).length
98
+ ? (requestOptions as CallToolRequestOptions)
99
+ : undefined,
100
+ resultSchema,
101
+ })
102
+ },
103
+ writable: true,
104
+ })
105
+
106
+ return target as unknown as wrap.McpClient<client, methods>
107
+ }
108
+
109
+ export declare namespace wrap {
110
+ type Config<methods extends Methods = Methods> = {
111
+ /** Optional approval hook called before creating a payment credential. */
112
+ onPaymentRequired?: OnPaymentRequired
113
+ /** Filters and sorts supported Challenges before Credential creation. */
114
+ orderChallenges?: AcceptPayment.OrderChallenges<FlattenMethods<methods>> | undefined
115
+ /** Client-declared supported payment methods, keyed by typed `method/intent` strings. */
116
+ paymentPreferences?: AcceptPayment.Config<FlattenMethods<methods>> | undefined
117
+ /** Array of methods to use. Accepts individual clients or tuples (e.g. from `tempo()`). */
118
+ methods: methods
119
+ }
120
+
121
+ type McpClient<
122
+ client extends Pick<Client, 'callTool'> = Pick<Client, 'callTool'>,
123
+ methods extends Methods = DefaultMethods,
124
+ > = Omit<client, 'callTool'> & {
125
+ /** Call a tool with automatic payment handling. Preserves the MCP SDK signature. */
126
+ callTool: (
127
+ params: CallToolParams,
128
+ resultSchema?: CallToolResultSchema,
129
+ options?: CallToolOptions<methods>,
130
+ ) => Promise<CallToolResult>
131
+ }
132
+
133
+ type CallToolOptions<methods extends Methods = DefaultMethods> = CallToolRequestOptions & {
134
+ /** Context to pass to the method intent's createCredential. */
135
+ context?: AnyContextForMethods<methods>
136
+ /** Per-call approval hook; overrides the configured hook. Pass `null` to bypass it. */
137
+ onPaymentRequired?: OnPaymentRequired | null
138
+ }
139
+ }
140
+
141
+ /** Minimal wire shape of payment-required data; challenges are validated, extra fields pass through. */
142
+ const PaymentRequiredSchema = z.object({
143
+ challenges: z.array(Challenge.Schema).check(z.minLength(1)),
144
+ })
145
+
146
+ /**
147
+ * Checks if an error is a payment required error.
148
+ */
149
+ export function isPaymentRequiredError(
150
+ error: unknown,
151
+ ): error is McpError & { data: PaymentRequiredData } {
152
+ if (typeof error !== 'object' || error === null) return false
153
+ if (!('code' in error) || !('message' in error)) return false
154
+ if ((error as { code: unknown }).code !== core_Mcp.paymentRequiredCode) return false
155
+ return isPaymentRequiredData((error as { data?: unknown }).data)
156
+ }
157
+
158
+ /** @internal */
159
+ async function createCredential<methods extends readonly Method.AnyClient[]>(
160
+ challenge: Challenge.Challenge,
161
+ config: {
162
+ context?: unknown
163
+ methods: methods
164
+ },
165
+ ): Promise<string> {
166
+ const { context, methods } = config
167
+
168
+ const mi = methods.find((m) => m.name === challenge.method && m.intent === challenge.intent)
169
+ if (!mi)
170
+ throw new Error(
171
+ `No method found for "${challenge.method}.${challenge.intent}". Available: ${methods.map((m) => `${m.name}.${m.intent}`).join(', ')}`,
172
+ )
173
+
174
+ if (challenge.expires) Expires.assert(challenge.expires, challenge.id)
175
+
176
+ const parsedContext = mi.context && context !== undefined ? mi.context.parse(context) : undefined
177
+ return mi.createCredential(
178
+ parsedContext !== undefined ? { challenge, context: parsedContext } : ({ challenge } as never),
179
+ )
180
+ }
181
+
182
+ /** Normalized per-call inputs for the payment-aware adapter. @internal */
183
+ type CallToolCall = {
184
+ context?: unknown
185
+ onPaymentRequired?: OnPaymentRequired | undefined
186
+ requestOptions?: CallToolRequestOptions | undefined
187
+ resultSchema?: CallToolResultSchema | undefined
188
+ }
189
+
190
+ function createPaymentAwareCallTool<methods extends Methods>(
191
+ callTool: Client['callTool'],
192
+ config: wrap.Config<methods>,
193
+ ): (params: CallToolParams, call: CallToolCall) => Promise<CallToolResult> {
194
+ const methods = config.methods.flat() as unknown as FlattenMethods<methods>
195
+ const paymentPreferences = AcceptPayment.resolve(methods, config.paymentPreferences)
196
+
197
+ const retryWithPayment = async (
198
+ params: CallToolParams,
199
+ call: CallToolCall,
200
+ paymentRequired: PaymentRequiredData,
201
+ cause: unknown,
202
+ ) => {
203
+ const challenges = paymentRequired.challenges
204
+ const candidates = AcceptPayment.selectChallengeCandidates(
205
+ challenges,
206
+ methods,
207
+ paymentPreferences.entries,
208
+ )
209
+ const orderedCandidates = config.orderChallenges
210
+ ? await config.orderChallenges(candidates)
211
+ : candidates
212
+ const selected = orderedCandidates[0]
213
+
214
+ if (!selected) {
215
+ const available = challenges.map((challenge) => `${challenge.method}.${challenge.intent}`)
216
+ const installed = methods.map((method) => `${method.name}.${method.intent}`)
217
+ throw new Error(
218
+ `No compatible payment method. Server offers: ${available.join(', ')}. Client has: ${installed.join(', ')}`,
219
+ { cause },
220
+ )
221
+ }
222
+
223
+ if (selected.challenge.expires)
224
+ Expires.assert(selected.challenge.expires, selected.challenge.id)
225
+
226
+ if (call.onPaymentRequired) {
227
+ const approved = await call.onPaymentRequired(selected.challenge)
228
+ if (!approved) throw new Error('Payment declined.', { cause })
229
+ }
230
+
231
+ const credential = await createCredential(selected.challenge, {
232
+ context: call.context,
233
+ methods,
234
+ })
235
+ const parsed = Credential.deserialize(credential)
236
+
237
+ const retryResult = await callTool(
238
+ {
239
+ ...params,
240
+ _meta: {
241
+ ...params._meta,
242
+ [core_Mcp.credentialMetaKey]: parsed,
243
+ },
244
+ },
245
+ call.resultSchema,
246
+ call.requestOptions,
247
+ )
248
+
249
+ return withReceipt(retryResult)
250
+ }
251
+
252
+ return async (params, call) => {
253
+ try {
254
+ const result = await callTool(params, call.resultSchema, call.requestOptions)
255
+ const paymentRequired = getPaymentRequiredMeta(result)
256
+ if (paymentRequired) return retryWithPayment(params, call, paymentRequired, result)
257
+ return withReceipt(result)
258
+ } catch (error) {
259
+ if (!isPaymentRequiredError(error)) throw error
260
+ return retryWithPayment(params, call, error.data, error)
261
+ }
262
+ }
263
+ }
264
+
265
+ function getPaymentRequiredMeta(
266
+ result: Awaited<ReturnType<Client['callTool']>>,
267
+ ): PaymentRequiredData | undefined {
268
+ const data = result._meta?.[core_Mcp.paymentRequiredMetaKey]
269
+ return isPaymentRequiredData(data) ? data : undefined
270
+ }
271
+
272
+ function isPaymentRequiredData(value: unknown): value is PaymentRequiredData {
273
+ return PaymentRequiredSchema.safeParse(value).success
274
+ }
275
+
276
+ function withReceipt(result: Awaited<ReturnType<Client['callTool']>>): CallToolResult {
277
+ return {
278
+ ...result,
279
+ receipt: result._meta?.[core_Mcp.receiptMetaKey] as core_Mcp.Receipt | undefined,
280
+ }
281
+ }
282
+
283
+ /** Union of all context types from all methods that have context schemas. */
284
+ type AnyContextFor<methods extends readonly AnyClient[]> = {
285
+ [key in keyof methods]: methods[key] extends Method.Client<any, infer context>
286
+ ? context extends z.ZodMiniType
287
+ ? z.input<context>
288
+ : undefined
289
+ : undefined
290
+ }[number]
291
+
292
+ /** Union of all context types across a methods config, flattening tuples. @internal */
293
+ type AnyContextForMethods<methods extends Methods> =
294
+ FlattenMethods<methods> extends infer flattened extends readonly AnyClient[]
295
+ ? AnyContextFor<flattened>
296
+ : never
297
+
298
+ type FlattenMethods<methods extends Methods> = methods extends readonly [
299
+ infer head,
300
+ ...infer tail extends Methods,
301
+ ]
302
+ ? head extends readonly Method.AnyClient[]
303
+ ? readonly [...head, ...FlattenMethods<tail>]
304
+ : head extends Method.AnyClient
305
+ ? readonly [head, ...FlattenMethods<tail>]
306
+ : never
307
+ : readonly []
@@ -0,0 +1,135 @@
1
+ import type { Client } from '@modelcontextprotocol/sdk/client/index.js'
2
+ import { McpError } from '@modelcontextprotocol/sdk/types.js'
3
+ import { Challenge, Credential, Mcp as core_Mcp, Method } from 'mppx'
4
+ import { Methods } from 'mppx/tempo'
5
+ import { describe, expect, test, vi } from 'vp/test'
6
+
7
+ import * as McpClient from './McpClient.js'
8
+
9
+ describe('MCP client payment approval', () => {
10
+ test('calls an approval hook before creating a credential', async () => {
11
+ const challenge = Challenge.from({
12
+ id: 'approval-test',
13
+ intent: 'charge',
14
+ method: 'tempo',
15
+ realm: 'api.example.com',
16
+ request: {},
17
+ })
18
+ const calls: unknown[] = []
19
+ const client = {
20
+ async callTool(params: unknown) {
21
+ calls.push(params)
22
+ if (calls.length === 1)
23
+ throw new McpError(core_Mcp.paymentRequiredCode, 'Payment Required', {
24
+ challenges: [challenge],
25
+ httpStatus: 402,
26
+ })
27
+ return {
28
+ _meta: {
29
+ [core_Mcp.receiptMetaKey]: {
30
+ method: 'tempo',
31
+ reference: 'test',
32
+ status: 'success',
33
+ timestamp: new Date().toISOString(),
34
+ },
35
+ },
36
+ content: [{ type: 'text', text: 'ok' }],
37
+ }
38
+ },
39
+ }
40
+ const createCredential = vi.fn(async ({ challenge }: { challenge: Challenge.Challenge }) =>
41
+ Credential.serialize({
42
+ challenge,
43
+ payload: { signature: '0xsignature', type: 'transaction' },
44
+ }),
45
+ )
46
+ const onPaymentRequired = vi.fn(() => true)
47
+ const mcp = McpClient.wrap(client as unknown as Pick<Client, 'callTool'>, {
48
+ methods: [Method.toClient(Methods.charge, { createCredential })],
49
+ })
50
+
51
+ const result = await mcp.callTool({ name: 'paid_tool', arguments: {} }, undefined, {
52
+ onPaymentRequired,
53
+ })
54
+
55
+ expect(result.content).toEqual([{ type: 'text', text: 'ok' }])
56
+ expect(onPaymentRequired).toHaveBeenCalledWith(challenge)
57
+ expect(createCredential).toHaveBeenCalledOnce()
58
+ expect(calls).toHaveLength(2)
59
+ })
60
+
61
+ test('does not create a credential when approval is denied', async () => {
62
+ const challenge = Challenge.from({
63
+ id: 'denied-test',
64
+ intent: 'charge',
65
+ method: 'tempo',
66
+ realm: 'api.example.com',
67
+ request: {},
68
+ })
69
+ const client = {
70
+ async callTool() {
71
+ throw new McpError(core_Mcp.paymentRequiredCode, 'Payment Required', {
72
+ challenges: [challenge],
73
+ httpStatus: 402,
74
+ })
75
+ },
76
+ }
77
+ const createCredential = vi.fn(async ({ challenge }: { challenge: Challenge.Challenge }) =>
78
+ Credential.serialize({
79
+ challenge,
80
+ payload: { signature: '0xsignature', type: 'transaction' },
81
+ }),
82
+ )
83
+ const mcp = McpClient.wrap(client as unknown as Pick<Client, 'callTool'>, {
84
+ methods: [Method.toClient(Methods.charge, { createCredential })],
85
+ })
86
+
87
+ await expect(
88
+ mcp.callTool({ name: 'paid_tool' }, undefined, { onPaymentRequired: () => false }),
89
+ ).rejects.toThrow('Payment declined.')
90
+ expect(createCredential).not.toHaveBeenCalled()
91
+ })
92
+
93
+ test('allows null to bypass a config approval hook', async () => {
94
+ const challenge = Challenge.from({
95
+ id: 'null-bypass-test',
96
+ intent: 'charge',
97
+ method: 'tempo',
98
+ realm: 'api.example.com',
99
+ request: {},
100
+ })
101
+ let calls = 0
102
+ const client = {
103
+ async callTool() {
104
+ calls += 1
105
+ if (calls === 1)
106
+ throw new McpError(core_Mcp.paymentRequiredCode, 'Payment Required', {
107
+ challenges: [challenge],
108
+ httpStatus: 402,
109
+ })
110
+ return {
111
+ content: [{ type: 'text', text: 'ok' }],
112
+ }
113
+ },
114
+ }
115
+ const createCredential = vi.fn(async ({ challenge }: { challenge: Challenge.Challenge }) =>
116
+ Credential.serialize({
117
+ challenge,
118
+ payload: { signature: '0xsignature', type: 'transaction' },
119
+ }),
120
+ )
121
+ const onPaymentRequired = vi.fn(() => false)
122
+ const mcp = McpClient.wrap(client as unknown as Pick<Client, 'callTool'>, {
123
+ methods: [Method.toClient(Methods.charge, { createCredential })],
124
+ onPaymentRequired,
125
+ })
126
+
127
+ await expect(
128
+ mcp.callTool({ name: 'paid_tool' }, undefined, { onPaymentRequired: null }),
129
+ ).resolves.toMatchObject({
130
+ content: [{ type: 'text', text: 'ok' }],
131
+ })
132
+ expect(onPaymentRequired).not.toHaveBeenCalled()
133
+ expect(createCredential).toHaveBeenCalledOnce()
134
+ })
135
+ })
@@ -2,14 +2,18 @@ import * as http from 'node:http'
2
2
 
3
3
  import { Elysia } from 'elysia'
4
4
  import { Receipt } from 'mppx'
5
- import { Mppx as Mppx_client, session as sessionIntent, tempo as tempo_client } from 'mppx/client'
5
+ import {
6
+ Mppx as Mppx_client,
7
+ sessionLegacy as sessionIntent,
8
+ tempo as tempo_client,
9
+ } from 'mppx/client'
6
10
  import { Mppx, discovery, payment } from 'mppx/elysia'
7
11
  import { tempo as tempo_server } from 'mppx/server'
8
12
  import type { Address } from 'viem'
9
13
  import { Addresses } from 'viem/tempo'
10
14
  import { beforeAll, describe, expect, test } from 'vp/test'
11
15
  import * as TestHttp from '~test/Http.js'
12
- import { deployEscrow } from '~test/tempo/session.js'
16
+ import { deployEscrow } from '~test/tempo/legacy/session.js'
13
17
  import { accounts, asset, client, fundAccount } from '~test/tempo/viem.js'
14
18
 
15
19
  function createServer(app: Elysia<any, any, any, any, any, any, any>) {
@@ -33,7 +37,7 @@ function createServer(app: Elysia<any, any, any, any, any, any, any>) {
33
37
  })
34
38
  }
35
39
 
36
- const secretKey = 'test-secret-key'
40
+ const secretKey = 'test-secret-key-test-secret-key-32'
37
41
 
38
42
  describe('payment', () => {
39
43
  test('short-circuits management responses', async () => {
@@ -202,7 +206,7 @@ describe('session', () => {
202
206
  function createSessionHarness(feePayer: boolean) {
203
207
  const mppx = Mppx.create({
204
208
  methods: [
205
- tempo_server.session({
209
+ tempo_server.sessionLegacy({
206
210
  getClient: () => client,
207
211
  account: accounts[0],
208
212
  currency: asset,
@@ -218,7 +222,7 @@ describe('session', () => {
218
222
  methods: [
219
223
  sessionIntent({
220
224
  account: accounts[2],
221
- deposit: '10',
225
+ maxDeposit: '10',
222
226
  getClient: () => client,
223
227
  }),
224
228
  ],
@@ -1,13 +1,17 @@
1
1
  import express from 'express'
2
2
  import { Receipt } from 'mppx'
3
- import { Mppx as Mppx_client, session as sessionIntent, tempo as tempo_client } from 'mppx/client'
3
+ import {
4
+ Mppx as Mppx_client,
5
+ sessionLegacy as sessionIntent,
6
+ tempo as tempo_client,
7
+ } from 'mppx/client'
4
8
  import { Mppx, discovery, payment } from 'mppx/express'
5
9
  import { Mppx as Mppx_server, tempo as tempo_server } from 'mppx/server'
6
10
  import type { Address } from 'viem'
7
11
  import { Addresses } from 'viem/tempo'
8
12
  import { beforeAll, describe, expect, test } from 'vp/test'
9
13
  import * as Http from '~test/Http.js'
10
- import { deployEscrow } from '~test/tempo/session.js'
14
+ import { deployEscrow } from '~test/tempo/legacy/session.js'
11
15
  import { accounts, asset, client, fundAccount } from '~test/tempo/viem.js'
12
16
 
13
17
  function createServer(app: express.Express) {
@@ -19,7 +23,7 @@ function createServer(app: express.Express) {
19
23
  })
20
24
  }
21
25
 
22
- const secretKey = 'test-secret-key'
26
+ const secretKey = 'test-secret-key-test-secret-key-32'
23
27
 
24
28
  function createChargeHarness(feePayer: boolean) {
25
29
  const mppx = Mppx.create({
@@ -196,7 +200,7 @@ describe('session', () => {
196
200
  function createSessionHarness(feePayer: boolean) {
197
201
  const mppx = Mppx.create({
198
202
  methods: [
199
- tempo_server.session({
203
+ tempo_server.sessionLegacy({
200
204
  getClient: () => client,
201
205
  account: accounts[0],
202
206
  currency: asset,
@@ -212,7 +216,7 @@ describe('session', () => {
212
216
  methods: [
213
217
  sessionIntent({
214
218
  account: accounts[2],
215
- deposit: '10',
219
+ maxDeposit: '10',
216
220
  getClient: () => client,
217
221
  }),
218
222
  ],
@@ -4,7 +4,7 @@ import { Challenge, Credential, Method, Receipt, z } from 'mppx'
4
4
  import {
5
5
  evm as evm_client,
6
6
  Mppx as Mppx_client,
7
- session as sessionIntent,
7
+ sessionLegacy as sessionIntent,
8
8
  tempo as tempo_client,
9
9
  } from 'mppx/client'
10
10
  import { Mppx, discovery, payment } from 'mppx/hono'
@@ -19,7 +19,7 @@ import type { Address } from 'viem'
19
19
  import { Addresses } from 'viem/tempo'
20
20
  import { beforeAll, describe, expect, test } from 'vp/test'
21
21
  import * as Http from '~test/Http.js'
22
- import { deployEscrow } from '~test/tempo/session.js'
22
+ import { deployEscrow } from '~test/tempo/legacy/session.js'
23
23
  import { accounts, asset, client, fundAccount } from '~test/tempo/viem.js'
24
24
 
25
25
  function createServer(app: Hono) {
@@ -35,7 +35,7 @@ function createServer(app: Hono) {
35
35
  })
36
36
  }
37
37
 
38
- const secretKey = 'test-secret-key'
38
+ const secretKey = 'test-secret-key-test-secret-key-32'
39
39
 
40
40
  describe('payment', () => {
41
41
  test('short-circuits management responses', async () => {
@@ -391,7 +391,7 @@ describe('session', () => {
391
391
  function createSessionHarness(feePayer: boolean) {
392
392
  const mppx = Mppx.create({
393
393
  methods: [
394
- tempo_server.session({
394
+ tempo_server.sessionLegacy({
395
395
  getClient: () => client,
396
396
  account: accounts[0],
397
397
  currency: asset,
@@ -407,7 +407,7 @@ describe('session', () => {
407
407
  methods: [
408
408
  sessionIntent({
409
409
  account: accounts[2],
410
- deposit: '10',
410
+ maxDeposit: '10',
411
411
  getClient: () => client,
412
412
  }),
413
413
  ],
@@ -5,7 +5,7 @@ import { describe, expect, test } from 'vp/test'
5
5
  import { wrap } from './mppx.js'
6
6
 
7
7
  const realm = 'api.example.com'
8
- const secretKey = 'test-secret-key'
8
+ const secretKey = 'test-secret-key-test-secret-key-32'
9
9
 
10
10
  const mockChargeA = Method.from({
11
11
  name: 'alpha',
@@ -1,14 +1,18 @@
1
1
  import * as http from 'node:http'
2
2
 
3
3
  import { Challenge, Credential, Receipt } from 'mppx'
4
- import { Mppx as Mppx_client, session as sessionIntent, tempo as tempo_client } from 'mppx/client'
4
+ import {
5
+ Mppx as Mppx_client,
6
+ sessionLegacy as sessionIntent,
7
+ tempo as tempo_client,
8
+ } from 'mppx/client'
5
9
  import { Mppx, discovery, payment } from 'mppx/nextjs'
6
10
  import { tempo as tempo_server } from 'mppx/server'
7
11
  import type { Address } from 'viem'
8
12
  import { Addresses } from 'viem/tempo'
9
13
  import { beforeAll, describe, expect, test } from 'vp/test'
10
14
  import * as TestHttp from '~test/Http.js'
11
- import { deployEscrow } from '~test/tempo/session.js'
15
+ import { deployEscrow } from '~test/tempo/legacy/session.js'
12
16
  import { accounts, asset, chain, client, fundAccount } from '~test/tempo/viem.js'
13
17
 
14
18
  function createServer(handler: (request: Request) => Promise<Response> | Response) {
@@ -32,7 +36,7 @@ function createServer(handler: (request: Request) => Promise<Response> | Respons
32
36
  })
33
37
  }
34
38
 
35
- const secretKey = 'test-secret-key'
39
+ const secretKey = 'test-secret-key-test-secret-key-32'
36
40
 
37
41
  describe('payment', () => {
38
42
  test('short-circuits management responses', async () => {
@@ -279,7 +283,7 @@ describe('session', () => {
279
283
  function createSessionHarness(feePayer: boolean) {
280
284
  const mppx = Mppx.create({
281
285
  methods: [
282
- tempo_server.session({
286
+ tempo_server.sessionLegacy({
283
287
  getClient: () => client,
284
288
  account: accounts[0],
285
289
  currency: asset,
@@ -295,7 +299,7 @@ describe('session', () => {
295
299
  methods: [
296
300
  sessionIntent({
297
301
  account: accounts[2],
298
- deposit: '10',
302
+ maxDeposit: '10',
299
303
  getClient: () => client,
300
304
  }),
301
305
  ],