mppx 0.7.0 → 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 (278) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/README.md +20 -11
  3. package/dist/Challenge.d.ts.map +1 -1
  4. package/dist/Challenge.js +18 -6
  5. package/dist/Challenge.js.map +1 -1
  6. package/dist/Mcp.d.ts +3 -0
  7. package/dist/Mcp.d.ts.map +1 -1
  8. package/dist/Mcp.js +2 -0
  9. package/dist/Mcp.js.map +1 -1
  10. package/dist/PaymentRequest.d.ts +10 -10
  11. package/dist/PaymentRequest.js +8 -8
  12. package/dist/client/Mppx.js +2 -2
  13. package/dist/client/Mppx.js.map +1 -1
  14. package/dist/client/Transport.d.ts +11 -16
  15. package/dist/client/Transport.d.ts.map +1 -1
  16. package/dist/client/Transport.js +55 -75
  17. package/dist/client/Transport.js.map +1 -1
  18. package/dist/client/index.d.ts +3 -0
  19. package/dist/client/index.d.ts.map +1 -1
  20. package/dist/client/index.js +1 -0
  21. package/dist/client/index.js.map +1 -1
  22. package/dist/client/internal/Fetch.d.ts.map +1 -1
  23. package/dist/client/internal/Fetch.js +46 -7
  24. package/dist/client/internal/Fetch.js.map +1 -1
  25. package/dist/client/internal/protocols/Mcp.d.ts +7 -0
  26. package/dist/client/internal/protocols/Mcp.d.ts.map +1 -0
  27. package/dist/client/internal/protocols/Mcp.js +159 -0
  28. package/dist/client/internal/protocols/Mcp.js.map +1 -0
  29. package/dist/client/internal/protocols/Mpp.d.ts +4 -0
  30. package/dist/client/internal/protocols/Mpp.d.ts.map +1 -0
  31. package/dist/client/internal/protocols/Mpp.js +18 -0
  32. package/dist/client/internal/protocols/Mpp.js.map +1 -0
  33. package/dist/client/internal/protocols/Protocol.d.ts +10 -0
  34. package/dist/client/internal/protocols/Protocol.d.ts.map +1 -0
  35. package/dist/client/internal/protocols/Protocol.js +2 -0
  36. package/dist/client/internal/protocols/Protocol.js.map +1 -0
  37. package/dist/client/internal/protocols/Shared.d.ts +5 -0
  38. package/dist/client/internal/protocols/Shared.d.ts.map +1 -0
  39. package/dist/client/internal/protocols/Shared.js +20 -0
  40. package/dist/client/internal/protocols/Shared.js.map +1 -0
  41. package/dist/client/internal/protocols/X402.d.ts +8 -0
  42. package/dist/client/internal/protocols/X402.d.ts.map +1 -0
  43. package/dist/client/internal/protocols/X402.js +39 -0
  44. package/dist/client/internal/protocols/X402.js.map +1 -0
  45. package/dist/evm/client/index.d.ts +1 -0
  46. package/dist/evm/client/index.d.ts.map +1 -1
  47. package/dist/evm/client/index.js +1 -0
  48. package/dist/evm/client/index.js.map +1 -1
  49. package/dist/evm/index.d.ts +2 -0
  50. package/dist/evm/index.d.ts.map +1 -1
  51. package/dist/evm/index.js +2 -0
  52. package/dist/evm/index.js.map +1 -1
  53. package/dist/evm/server/index.d.ts +1 -0
  54. package/dist/evm/server/index.d.ts.map +1 -1
  55. package/dist/evm/server/index.js +1 -0
  56. package/dist/evm/server/index.js.map +1 -1
  57. package/dist/mcp/client/McpClient.d.ts +101 -0
  58. package/dist/mcp/client/McpClient.d.ts.map +1 -0
  59. package/dist/mcp/client/McpClient.js +162 -0
  60. package/dist/mcp/client/McpClient.js.map +1 -0
  61. package/dist/mcp/client/index.d.ts.map +1 -0
  62. package/dist/mcp/client/index.js.map +1 -0
  63. package/dist/mcp/server/Transport.d.ts.map +1 -0
  64. package/dist/mcp/server/Transport.js.map +1 -0
  65. package/dist/mcp/server/index.d.ts.map +1 -0
  66. package/dist/mcp/server/index.js.map +1 -0
  67. package/dist/server/Mppx.d.ts +1 -1
  68. package/dist/server/Mppx.d.ts.map +1 -1
  69. package/dist/server/Mppx.js +9 -0
  70. package/dist/server/Mppx.js.map +1 -1
  71. package/dist/server/Transport.d.ts +1 -1
  72. package/dist/server/Transport.d.ts.map +1 -1
  73. package/dist/server/Transport.js +1 -1
  74. package/dist/server/Transport.js.map +1 -1
  75. package/dist/stripe/server/internal/html.gen.d.ts +1 -1
  76. package/dist/stripe/server/internal/html.gen.d.ts.map +1 -1
  77. package/dist/stripe/server/internal/html.gen.js +1 -1
  78. package/dist/stripe/server/internal/html.gen.js.map +1 -1
  79. package/dist/tempo/Proof.d.ts +85 -1
  80. package/dist/tempo/Proof.d.ts.map +1 -1
  81. package/dist/tempo/Proof.js +35 -0
  82. package/dist/tempo/Proof.js.map +1 -1
  83. package/dist/tempo/client/Charge.d.ts +13 -1
  84. package/dist/tempo/client/Charge.d.ts.map +1 -1
  85. package/dist/tempo/client/Charge.js +38 -25
  86. package/dist/tempo/client/Charge.js.map +1 -1
  87. package/dist/tempo/client/Methods.d.ts +5 -3
  88. package/dist/tempo/client/Methods.d.ts.map +1 -1
  89. package/dist/tempo/client/Methods.js +4 -2
  90. package/dist/tempo/client/Methods.js.map +1 -1
  91. package/dist/tempo/client/ResolveAccount.d.ts +40 -0
  92. package/dist/tempo/client/ResolveAccount.d.ts.map +1 -0
  93. package/dist/tempo/client/ResolveAccount.js +2 -0
  94. package/dist/tempo/client/ResolveAccount.js.map +1 -0
  95. package/dist/tempo/internal/fee-payer.d.ts +9 -1
  96. package/dist/tempo/internal/fee-payer.d.ts.map +1 -1
  97. package/dist/tempo/internal/fee-payer.js +35 -6
  98. package/dist/tempo/internal/fee-payer.js.map +1 -1
  99. package/dist/tempo/internal/proof.d.ts +71 -5
  100. package/dist/tempo/internal/proof.d.ts.map +1 -1
  101. package/dist/tempo/internal/proof.js +42 -6
  102. package/dist/tempo/internal/proof.js.map +1 -1
  103. package/dist/tempo/legacy/client/SessionManager.d.ts.map +1 -1
  104. package/dist/tempo/legacy/client/SessionManager.js +10 -3
  105. package/dist/tempo/legacy/client/SessionManager.js.map +1 -1
  106. package/dist/tempo/server/Charge.d.ts.map +1 -1
  107. package/dist/tempo/server/Charge.js +42 -18
  108. package/dist/tempo/server/Charge.js.map +1 -1
  109. package/dist/tempo/server/Methods.d.ts +4 -2
  110. package/dist/tempo/server/Methods.d.ts.map +1 -1
  111. package/dist/tempo/server/Methods.js +4 -2
  112. package/dist/tempo/server/Methods.js.map +1 -1
  113. package/dist/tempo/server/Subscription.d.ts +10 -0
  114. package/dist/tempo/server/Subscription.d.ts.map +1 -1
  115. package/dist/tempo/server/Subscription.js +135 -23
  116. package/dist/tempo/server/Subscription.js.map +1 -1
  117. package/dist/tempo/server/internal/html.gen.d.ts +1 -1
  118. package/dist/tempo/server/internal/html.gen.d.ts.map +1 -1
  119. package/dist/tempo/server/internal/html.gen.js +1 -1
  120. package/dist/tempo/server/internal/html.gen.js.map +1 -1
  121. package/dist/tempo/session/client/ChannelOps.d.ts +2 -3
  122. package/dist/tempo/session/client/ChannelOps.d.ts.map +1 -1
  123. package/dist/tempo/session/client/ChannelOps.js +7 -10
  124. package/dist/tempo/session/client/ChannelOps.js.map +1 -1
  125. package/dist/tempo/session/client/ChannelStore.d.ts +51 -0
  126. package/dist/tempo/session/client/ChannelStore.d.ts.map +1 -0
  127. package/dist/tempo/session/client/ChannelStore.js +63 -0
  128. package/dist/tempo/session/client/ChannelStore.js.map +1 -0
  129. package/dist/tempo/session/client/CredentialState.d.ts +7 -24
  130. package/dist/tempo/session/client/CredentialState.d.ts.map +1 -1
  131. package/dist/tempo/session/client/CredentialState.js +51 -49
  132. package/dist/tempo/session/client/CredentialState.js.map +1 -1
  133. package/dist/tempo/session/client/Session.d.ts +8 -2
  134. package/dist/tempo/session/client/Session.d.ts.map +1 -1
  135. package/dist/tempo/session/client/Session.js +22 -8
  136. package/dist/tempo/session/client/Session.js.map +1 -1
  137. package/dist/tempo/session/client/SessionManager.d.ts +4 -40
  138. package/dist/tempo/session/client/SessionManager.d.ts.map +1 -1
  139. package/dist/tempo/session/client/SessionManager.js +124 -174
  140. package/dist/tempo/session/client/SessionManager.js.map +1 -1
  141. package/dist/tempo/session/client/index.d.ts +3 -4
  142. package/dist/tempo/session/client/index.d.ts.map +1 -1
  143. package/dist/tempo/session/client/index.js +1 -0
  144. package/dist/tempo/session/client/index.js.map +1 -1
  145. package/dist/tempo/session/precompile/Voucher.d.ts +3 -3
  146. package/dist/tempo/session/precompile/Voucher.d.ts.map +1 -1
  147. package/dist/tempo/session/precompile/Voucher.js +24 -25
  148. package/dist/tempo/session/precompile/Voucher.js.map +1 -1
  149. package/dist/tempo/session/server/Settlement.d.ts.map +1 -1
  150. package/dist/tempo/session/server/Settlement.js +4 -2
  151. package/dist/tempo/session/server/Settlement.js.map +1 -1
  152. package/dist/tempo/session/server/Sse.d.ts.map +1 -1
  153. package/dist/tempo/session/server/Sse.js.map +1 -1
  154. package/dist/tempo/session/server/Ws.d.ts.map +1 -1
  155. package/dist/tempo/session/server/Ws.js.map +1 -1
  156. package/dist/tempo/subscription/KeyAuthorization.d.ts +712 -1
  157. package/dist/tempo/subscription/KeyAuthorization.d.ts.map +1 -1
  158. package/dist/tempo/subscription/Store.d.ts +2 -0
  159. package/dist/tempo/subscription/Store.d.ts.map +1 -1
  160. package/dist/tempo/subscription/Store.js +16 -1
  161. package/dist/tempo/subscription/Store.js.map +1 -1
  162. package/dist/x402/index.d.ts +1 -0
  163. package/dist/x402/index.d.ts.map +1 -1
  164. package/dist/x402/index.js +1 -0
  165. package/dist/x402/index.js.map +1 -1
  166. package/package.json +21 -10
  167. package/src/Challenge.test.ts +40 -0
  168. package/src/Challenge.ts +19 -6
  169. package/src/Mcp.ts +4 -0
  170. package/src/PaymentRequest.ts +10 -10
  171. package/src/cli/cli.test.ts +15 -15
  172. package/src/client/Mppx.test-d.ts +21 -1
  173. package/src/client/Mppx.test.ts +1 -1
  174. package/src/client/Mppx.ts +2 -2
  175. package/src/client/Transport.test.ts +225 -178
  176. package/src/client/Transport.ts +77 -83
  177. package/src/client/index.ts +14 -0
  178. package/src/client/internal/Fetch.test.ts +207 -2
  179. package/src/client/internal/Fetch.ts +52 -6
  180. package/src/client/internal/protocols/Mcp.test.ts +220 -0
  181. package/src/client/internal/protocols/Mcp.ts +162 -0
  182. package/src/client/internal/protocols/Mpp.ts +21 -0
  183. package/src/client/internal/protocols/Protocol.ts +10 -0
  184. package/src/client/internal/protocols/Shared.ts +25 -0
  185. package/src/client/internal/protocols/X402.ts +42 -0
  186. package/src/discovery/OpenApi.test.ts +1 -1
  187. package/src/evm/PublicInterface.test-d.ts +1 -1
  188. package/src/evm/client/index.ts +1 -0
  189. package/src/evm/index.ts +2 -0
  190. package/src/evm/server/Charge.test.ts +1 -1
  191. package/src/evm/server/index.ts +1 -0
  192. package/src/{mcp-sdk → mcp}/client/McpClient.integration.test.ts +10 -4
  193. package/src/{mcp-sdk → mcp}/client/McpClient.test-d.ts +45 -18
  194. package/src/{mcp-sdk → mcp}/client/McpClient.test.ts +211 -5
  195. package/src/mcp/client/McpClient.ts +307 -0
  196. package/src/{mcp-sdk → mcp}/client/McpClient.unit.test.ts +9 -5
  197. package/src/middlewares/elysia.test.ts +1 -1
  198. package/src/middlewares/express.test.ts +1 -1
  199. package/src/middlewares/hono.test.ts +1 -1
  200. package/src/middlewares/internal/mppx.test.ts +1 -1
  201. package/src/middlewares/nextjs.test.ts +1 -1
  202. package/src/proxy/Proxy.test.ts +1 -1
  203. package/src/proxy/services/anthropic.test.ts +1 -1
  204. package/src/proxy/services/openai.test.ts +1 -1
  205. package/src/proxy/services/stripe.test.ts +1 -1
  206. package/src/server/Mppx.authorize.test.ts +1 -1
  207. package/src/server/Mppx.test-d.ts +1 -1
  208. package/src/server/Mppx.test.ts +20 -2
  209. package/src/server/Mppx.ts +14 -1
  210. package/src/server/Transport.test.ts +6 -6
  211. package/src/server/Transport.ts +1 -1
  212. package/src/stripe/Charge.integration.test.ts +1 -1
  213. package/src/stripe/client/Charge.test.ts +1 -1
  214. package/src/stripe/server/Charge.test.ts +1 -1
  215. package/src/stripe/server/internal/html/package.json +1 -1
  216. package/src/stripe/server/internal/html.gen.ts +1 -1
  217. package/src/tempo/Proof.conformance.test.ts +146 -0
  218. package/src/tempo/Proof.test-d.ts +15 -0
  219. package/src/tempo/Proof.ts +52 -1
  220. package/src/tempo/Subscription.integration.test.ts +1 -1
  221. package/src/tempo/client/Charge.test.ts +173 -0
  222. package/src/tempo/client/Charge.ts +65 -36
  223. package/src/tempo/client/Methods.ts +4 -2
  224. package/src/tempo/client/ResolveAccount.ts +46 -0
  225. package/src/tempo/internal/fee-payer.test.ts +65 -10
  226. package/src/tempo/internal/fee-payer.ts +42 -6
  227. package/src/tempo/internal/proof.test.ts +12 -4
  228. package/src/tempo/internal/proof.ts +55 -6
  229. package/src/tempo/legacy/client/SessionManager.ts +11 -3
  230. package/src/tempo/legacy/server/Session.test.ts +91 -26
  231. package/src/tempo/server/Charge.test.ts +388 -17
  232. package/src/tempo/server/Charge.ts +46 -24
  233. package/src/tempo/server/Methods.ts +4 -2
  234. package/src/tempo/server/Subscription.test.ts +465 -3
  235. package/src/tempo/server/Subscription.ts +174 -19
  236. package/src/tempo/server/internal/html/package.json +2 -2
  237. package/src/tempo/server/internal/html.gen.ts +1 -1
  238. package/src/tempo/session/client/ChannelOps.ts +5 -19
  239. package/src/tempo/session/client/ChannelStore.ts +111 -0
  240. package/src/tempo/session/client/CredentialState.test.ts +206 -62
  241. package/src/tempo/session/client/CredentialState.ts +58 -73
  242. package/src/tempo/session/client/Session.test.ts +41 -1
  243. package/src/tempo/session/client/Session.ts +36 -10
  244. package/src/tempo/session/client/SessionManager.test.ts +154 -65
  245. package/src/tempo/session/client/SessionManager.ts +141 -235
  246. package/src/tempo/session/client/index.ts +8 -5
  247. package/src/tempo/session/precompile/Voucher.test.ts +45 -7
  248. package/src/tempo/session/precompile/Voucher.ts +27 -25
  249. package/src/tempo/session/server/Session.test.ts +4 -4
  250. package/src/tempo/session/server/Settlement.test.ts +88 -1
  251. package/src/tempo/session/server/Settlement.ts +2 -1
  252. package/src/tempo/session/server/Sse.ts +0 -2
  253. package/src/tempo/session/server/Ws.ts +0 -4
  254. package/src/tempo/subscription/Store.ts +27 -9
  255. package/src/x402/Exact.e2e.test.ts +1 -1
  256. package/src/x402/PublicInterface.test-d.ts +1 -1
  257. package/src/x402/index.ts +1 -0
  258. package/dist/mcp-sdk/client/McpClient.d.ts +0 -85
  259. package/dist/mcp-sdk/client/McpClient.d.ts.map +0 -1
  260. package/dist/mcp-sdk/client/McpClient.js +0 -118
  261. package/dist/mcp-sdk/client/McpClient.js.map +0 -1
  262. package/dist/mcp-sdk/client/index.d.ts.map +0 -1
  263. package/dist/mcp-sdk/client/index.js.map +0 -1
  264. package/dist/mcp-sdk/server/Transport.d.ts.map +0 -1
  265. package/dist/mcp-sdk/server/Transport.js.map +0 -1
  266. package/dist/mcp-sdk/server/index.d.ts.map +0 -1
  267. package/dist/mcp-sdk/server/index.js.map +0 -1
  268. package/src/mcp-sdk/client/McpClient.ts +0 -228
  269. /package/dist/{mcp-sdk → mcp}/client/index.d.ts +0 -0
  270. /package/dist/{mcp-sdk → mcp}/client/index.js +0 -0
  271. /package/dist/{mcp-sdk → mcp}/server/Transport.d.ts +0 -0
  272. /package/dist/{mcp-sdk → mcp}/server/Transport.js +0 -0
  273. /package/dist/{mcp-sdk → mcp}/server/index.d.ts +0 -0
  274. /package/dist/{mcp-sdk → mcp}/server/index.js +0 -0
  275. /package/src/{mcp-sdk → mcp}/client/index.ts +0 -0
  276. /package/src/{mcp-sdk → mcp}/server/Transport.test.ts +0 -0
  277. /package/src/{mcp-sdk → mcp}/server/Transport.ts +0 -0
  278. /package/src/{mcp-sdk → mcp}/server/index.ts +0 -0
@@ -1,228 +0,0 @@
1
- import type { Client } from '@modelcontextprotocol/sdk/client/index.js'
2
- import type { McpError } from '@modelcontextprotocol/sdk/types.js'
3
-
4
- import type * 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 type * as z from '../../zod.js'
11
-
12
- type AnyClient = Method.Client<any, any>
13
-
14
- export type CallToolParameters = {
15
- name: string
16
- arguments?: Record<string, unknown>
17
- _meta?: Record<string, unknown>
18
- }
19
-
20
- export type OnPaymentRequired = (challenge: Challenge.Challenge) => boolean | Promise<boolean>
21
-
22
- /**
23
- * Result of a tool call with payment handling.
24
- * Extends the SDK's callTool return type with an optional payment receipt.
25
- */
26
- export type CallToolResult = Awaited<ReturnType<Client['callTool']>> & {
27
- /** Payment receipt if payment was made. */
28
- receipt: core_Mcp.Receipt | undefined
29
- }
30
-
31
- /**
32
- * Creates a payment-aware wrapper around an MCP SDK client.
33
- *
34
- * Similar to `Fetch.from()` for HTTP, this wraps an MCP client's `callTool`
35
- * method to automatically handle payment challenges.
36
- *
37
- * @example
38
- * ```ts
39
- * import { Client } from '@modelcontextprotocol/sdk/client'
40
- * import { McpClient, tempo } from 'mppx/mcp-sdk/client'
41
- * import { privateKeyToAccount } from 'viem/accounts'
42
- *
43
- * const client = new Client({ name: 'my-client', version: '1.0.0' })
44
- * await client.connect(transport)
45
- *
46
- * const mcp = McpClient.wrap(client, {
47
- * methods: [
48
- * tempo({
49
- * account: privateKeyToAccount('0x...'),
50
- * }),
51
- * ],
52
- * })
53
- *
54
- * // Automatically handles payment challenges
55
- * const result = await mcp.callTool({ name: 'premium_tool', arguments: {} })
56
- * console.log(result.content, result.receipt)
57
- * ```
58
- */
59
- export function wrap<
60
- const client extends Pick<Client, 'callTool'>,
61
- const methods extends readonly Method.AnyClient[],
62
- >(client: client, config: wrap.Config<methods>): wrap.McpClient<client, methods> {
63
- const { methods } = config
64
- const paymentPreferences = AcceptPayment.resolve(methods)
65
-
66
- const callTool = (async (
67
- first: CallToolParameters | OnPaymentRequired | null | undefined,
68
- second?: CallToolParameters | wrap.CallToolOptions<methods>,
69
- third?: wrap.CallToolOptions<methods>,
70
- ) => {
71
- const hasApprovalArgument = typeof first === 'function' || first === null || first === undefined
72
- const params = (hasApprovalArgument ? second : first) as CallToolParameters
73
- const options = (hasApprovalArgument ? third : second) as
74
- | wrap.CallToolOptions<methods>
75
- | undefined
76
- const onPaymentRequired =
77
- first === null
78
- ? undefined
79
- : hasApprovalArgument
80
- ? ((first as OnPaymentRequired | undefined) ?? config.onPaymentRequired)
81
- : config.onPaymentRequired
82
- const context = options?.context
83
- const timeout = options?.timeout
84
-
85
- try {
86
- const result = await client.callTool(
87
- params,
88
- undefined,
89
- timeout !== undefined ? { timeout } : undefined,
90
- )
91
-
92
- return {
93
- ...result,
94
- receipt: result._meta?.[core_Mcp.receiptMetaKey] as core_Mcp.Receipt | undefined,
95
- }
96
- } catch (error) {
97
- // Check if this is a payment required error
98
- if (!isPaymentRequiredError(error)) throw error
99
-
100
- const challenges = (error.data as { challenges?: Challenge.Challenge[] })?.challenges
101
- if (!challenges?.length) throw error
102
-
103
- const selected = AcceptPayment.selectChallenge(
104
- challenges,
105
- methods,
106
- paymentPreferences.entries,
107
- )
108
- if (!selected) {
109
- const available = challenges.map((c) => `${c.method}.${c.intent}`).join(', ')
110
- const installed = methods.map((m) => `${m.name}.${m.intent}`).join(', ')
111
- throw new Error(
112
- `No compatible payment method. Server offers: ${available}. Client has: ${installed}`,
113
- { cause: error },
114
- )
115
- }
116
-
117
- if (selected.challenge.expires)
118
- Expires.assert(selected.challenge.expires, selected.challenge.id)
119
-
120
- if (onPaymentRequired) {
121
- const approved = await onPaymentRequired(selected.challenge)
122
- if (!approved) throw new Error('Payment declined.', { cause: error })
123
- }
124
-
125
- const credential = await createCredential(selected.challenge, {
126
- context,
127
- methods,
128
- })
129
- const parsed = Credential.deserialize(credential)
130
-
131
- const retryResult = await client.callTool(
132
- {
133
- ...params,
134
- _meta: {
135
- ...params._meta,
136
- [core_Mcp.credentialMetaKey]: parsed,
137
- },
138
- },
139
- undefined,
140
- timeout !== undefined ? { timeout } : undefined,
141
- )
142
-
143
- return {
144
- ...retryResult,
145
- receipt: retryResult._meta?.[core_Mcp.receiptMetaKey] as core_Mcp.Receipt | undefined,
146
- }
147
- }
148
- }) as wrap.McpClient<client, methods>['callTool']
149
-
150
- return { ...client, callTool } as wrap.McpClient<client, methods>
151
- }
152
-
153
- /** Union of all context types from all methods that have context schemas. */
154
- type AnyContextFor<methods extends readonly AnyClient[]> = {
155
- [key in keyof methods]: methods[key] extends Method.Client<any, infer context>
156
- ? context extends z.ZodMiniType
157
- ? z.input<context>
158
- : undefined
159
- : undefined
160
- }[number]
161
-
162
- export declare namespace wrap {
163
- type Config<methods extends readonly Method.AnyClient[] = readonly Method.AnyClient[]> = {
164
- /** Array of methods to use. */
165
- methods: methods
166
- /** Optional approval hook called before creating a payment credential. */
167
- onPaymentRequired?: OnPaymentRequired
168
- }
169
-
170
- type McpClient<
171
- client extends Pick<Client, 'callTool'> = Pick<Client, 'callTool'>,
172
- methods extends readonly AnyClient[] = readonly AnyClient[],
173
- > = Omit<client, 'callTool'> & {
174
- /** Call a tool with automatic payment handling. */
175
- callTool: {
176
- (params: CallToolParameters, options?: CallToolOptions<methods>): Promise<CallToolResult>
177
- (
178
- onPaymentRequired: OnPaymentRequired | null | undefined,
179
- params: CallToolParameters,
180
- options?: CallToolOptions<methods>,
181
- ): Promise<CallToolResult>
182
- }
183
- }
184
-
185
- type CallToolOptions<methods extends readonly AnyClient[] = readonly AnyClient[]> = {
186
- /** Context to pass to the method intent's createCredential. */
187
- context?: AnyContextFor<methods>
188
- /** Request timeout in milliseconds. */
189
- timeout?: number
190
- }
191
- }
192
-
193
- /**
194
- * Checks if an error is a payment required error.
195
- */
196
- export function isPaymentRequiredError(
197
- error: unknown,
198
- ): error is McpError & { data: { challenges: Challenge.Challenge[] } } {
199
- if (typeof error !== 'object' || error === null) return false
200
- if (!('code' in error) || !('message' in error)) return false
201
- if ((error as { code: unknown }).code !== core_Mcp.paymentRequiredCode) return false
202
- const data = (error as { data?: { challenges?: unknown } }).data
203
- return Array.isArray(data?.challenges) && data.challenges.length > 0
204
- }
205
-
206
- /** @internal */
207
- async function createCredential<methods extends readonly Method.AnyClient[]>(
208
- challenge: Challenge.Challenge,
209
- config: {
210
- context?: unknown
211
- methods: methods
212
- },
213
- ): Promise<string> {
214
- const { context, methods } = config
215
-
216
- const mi = methods.find((m) => m.name === challenge.method && m.intent === challenge.intent)
217
- if (!mi)
218
- throw new Error(
219
- `No method found for "${challenge.method}.${challenge.intent}". Available: ${methods.map((m) => `${m.name}.${m.intent}`).join(', ')}`,
220
- )
221
-
222
- if (challenge.expires) Expires.assert(challenge.expires, challenge.id)
223
-
224
- const parsedContext = mi.context && context !== undefined ? mi.context.parse(context) : undefined
225
- return mi.createCredential(
226
- parsedContext !== undefined ? { challenge, context: parsedContext } : ({ challenge } as never),
227
- )
228
- }
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes