@cryptoapis-io/mcp-x402-pay 0.2.0 → 0.4.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.
package/README.md CHANGED
@@ -52,6 +52,7 @@ bare name — and exactly one of `address` (any chain; **required for Solana/Kas
52
52
  | `method`/`body`/`headers` | | the request to make |
53
53
  | `allowedNetworks` | | restrict which CAIP-2 networks to pay on |
54
54
  | `maxAmount` | | safety cap — refuse if the required atomic-unit amount exceeds it |
55
+ | `allowedHosts` | | restrict WHICH SITES may be paid, e.g. `["api.acme.com"]` (leading dot = subdomains). A url outside the list is refused **before any network call**. Falls back to `X402_ALLOWED_HOSTS` (comma-separated) — pin it there to keep the allowlist **outside the model's reach** |
55
56
 
56
57
  Returns `{ status, paid, body, settlement? }`. On a 402 with no acceptable option (or over `maxAmount`),
57
58
  `paid:false` with a `reason` — nothing is signed or paid.
@@ -12,6 +12,7 @@ export declare const tools: readonly [import("./types.js").McpX402ToolDef<import
12
12
  kaspaKey: import("zod").ZodOptional<import("zod").ZodString>;
13
13
  xrpSeed: import("zod").ZodOptional<import("zod").ZodString>;
14
14
  allowedNetworks: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString, "many">>;
15
+ allowedHosts: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString, "many">>;
15
16
  buyerBaseUrl: import("zod").ZodOptional<import("zod").ZodString>;
16
17
  maxAmount: import("zod").ZodOptional<import("zod").ZodString>;
17
18
  }, "strip", import("zod").ZodTypeAny, {
@@ -28,6 +29,7 @@ export declare const tools: readonly [import("./types.js").McpX402ToolDef<import
28
29
  kaspaKey?: string | undefined;
29
30
  xrpSeed?: string | undefined;
30
31
  allowedNetworks?: string[] | undefined;
32
+ allowedHosts?: string[] | undefined;
31
33
  buyerBaseUrl?: string | undefined;
32
34
  maxAmount?: string | undefined;
33
35
  }, {
@@ -44,6 +46,7 @@ export declare const tools: readonly [import("./types.js").McpX402ToolDef<import
44
46
  kaspaKey?: string | undefined;
45
47
  xrpSeed?: string | undefined;
46
48
  allowedNetworks?: string[] | undefined;
49
+ allowedHosts?: string[] | undefined;
47
50
  buyerBaseUrl?: string | undefined;
48
51
  maxAmount?: string | undefined;
49
52
  }>>, import("./types.js").McpX402ToolDef<import("zod").ZodObject<{
@@ -61,5 +64,70 @@ export declare const tools: readonly [import("./types.js").McpX402ToolDef<import
61
64
  limit?: number | undefined;
62
65
  offset?: number | undefined;
63
66
  facilitatorBaseUrl?: string | undefined;
67
+ }>>, import("./types.js").McpX402ToolDef<import("zod").ZodObject<{
68
+ server: import("zod").ZodObject<{
69
+ command: import("zod").ZodString;
70
+ args: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString, "many">>;
71
+ env: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodString>>;
72
+ }, "strip", import("zod").ZodTypeAny, {
73
+ command: string;
74
+ args?: string[] | undefined;
75
+ env?: Record<string, string> | undefined;
76
+ }, {
77
+ command: string;
78
+ args?: string[] | undefined;
79
+ env?: Record<string, string> | undefined;
80
+ }>;
81
+ toolName: import("zod").ZodString;
82
+ arguments: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodUnknown>>;
83
+ apiKey: import("zod").ZodOptional<import("zod").ZodString>;
84
+ walletId: import("zod").ZodOptional<import("zod").ZodString>;
85
+ privateKey: import("zod").ZodOptional<import("zod").ZodString>;
86
+ tronKey: import("zod").ZodOptional<import("zod").ZodString>;
87
+ svmSecret: import("zod").ZodOptional<import("zod").ZodString>;
88
+ utxoWif: import("zod").ZodOptional<import("zod").ZodString>;
89
+ kaspaKey: import("zod").ZodOptional<import("zod").ZodString>;
90
+ xrpSeed: import("zod").ZodOptional<import("zod").ZodString>;
91
+ allowedNetworks: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString, "many">>;
92
+ maxAmount: import("zod").ZodOptional<import("zod").ZodString>;
93
+ buyerBaseUrl: import("zod").ZodOptional<import("zod").ZodString>;
94
+ }, "strip", import("zod").ZodTypeAny, {
95
+ server: {
96
+ command: string;
97
+ args?: string[] | undefined;
98
+ env?: Record<string, string> | undefined;
99
+ };
100
+ toolName: string;
101
+ apiKey?: string | undefined;
102
+ walletId?: string | undefined;
103
+ privateKey?: string | undefined;
104
+ tronKey?: string | undefined;
105
+ svmSecret?: string | undefined;
106
+ utxoWif?: string | undefined;
107
+ kaspaKey?: string | undefined;
108
+ xrpSeed?: string | undefined;
109
+ allowedNetworks?: string[] | undefined;
110
+ buyerBaseUrl?: string | undefined;
111
+ maxAmount?: string | undefined;
112
+ arguments?: Record<string, unknown> | undefined;
113
+ }, {
114
+ server: {
115
+ command: string;
116
+ args?: string[] | undefined;
117
+ env?: Record<string, string> | undefined;
118
+ };
119
+ toolName: string;
120
+ apiKey?: string | undefined;
121
+ walletId?: string | undefined;
122
+ privateKey?: string | undefined;
123
+ tronKey?: string | undefined;
124
+ svmSecret?: string | undefined;
125
+ utxoWif?: string | undefined;
126
+ kaspaKey?: string | undefined;
127
+ xrpSeed?: string | undefined;
128
+ allowedNetworks?: string[] | undefined;
129
+ buyerBaseUrl?: string | undefined;
130
+ maxAmount?: string | undefined;
131
+ arguments?: Record<string, unknown> | undefined;
64
132
  }>>];
65
133
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAA2C,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAA2D,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { x402PayTool } from "./x402-pay/index.js";
2
2
  import { x402DiscoverTool } from "./x402-discover/index.js";
3
- export const tools = [x402PayTool, x402DiscoverTool];
3
+ import { x402PayToolDef } from "./x402-pay-tool/index.js";
4
+ export const tools = [x402PayTool, x402DiscoverTool, x402PayToolDef];
4
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,WAAW,EAAE,gBAAgB,CAAU,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,WAAW,EAAE,gBAAgB,EAAE,cAAc,CAAU,CAAC"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * The transport-independent half of paying an x402 challenge.
3
+ *
4
+ * Given the merchant's `accepts` list, this picks a requirement, authorizes it with the
5
+ * CryptoAPIs buyer service, signs LOCALLY, and returns the `PaymentPayload` to resubmit. It
6
+ * knows nothing about HTTP or MCP — the caller decides how the challenge arrived and how the
7
+ * payload travels back (a base64 `X-PAYMENT` header over HTTP, a raw object in
8
+ * `_meta["x402/payment"]` over MCP).
9
+ *
10
+ * Extracted so both transports run ONE implementation: the authorize→sign→build flow is
11
+ * identical, and a fix or a newly-enabled family must never land on only one of them. (The
12
+ * buyer SDK made the same split for the same reason — see its `payFlow.js`.)
13
+ */
14
+ export declare const DEFAULT_BUYER_BASE_URL = "https://ai.cryptoapis.io/x402/buyer";
15
+ export declare const X402_VERSION = 2;
16
+ /** The WIRE payment scheme is ALWAYS "exact" — the facilitator derives the family from `network`. */
17
+ export declare const SCHEME_EXACT = "exact";
18
+ /** Artifact schemes live-verified end-to-end. Enabling a family = add its scheme here. */
19
+ export declare const SUPPORTED_SCHEMES: Set<string>;
20
+ /** UTXO CAIP-2 → the {blockchain, network} pair mcp-signer's utxo-sign needs. */
21
+ export declare const UTXO_CAIP2: Record<string, {
22
+ blockchain: string;
23
+ network: string;
24
+ }>;
25
+ export type PaymentRequirements = {
26
+ scheme: string;
27
+ network: string;
28
+ amount: string;
29
+ asset: string;
30
+ payTo: string;
31
+ maxTimeoutSeconds?: number;
32
+ extra?: Record<string, unknown>;
33
+ };
34
+ /** Per-family signing keys, already resolved from params/env by the caller. */
35
+ export type SigningKeys = {
36
+ evm?: string;
37
+ tron?: string;
38
+ svm?: string;
39
+ utxo?: string;
40
+ kaspa?: string;
41
+ xrp?: string;
42
+ };
43
+ /** Either a built payload, or a clean refusal reason. Never throws for an expected refusal. */
44
+ export type BuildResult = {
45
+ ok: true;
46
+ paymentPayload: Record<string, unknown>;
47
+ requirements: PaymentRequirements;
48
+ } | {
49
+ ok: false;
50
+ reason: string;
51
+ };
52
+ /**
53
+ * Pick which offered requirement to pay: the first whose network is allowed, else the first.
54
+ *
55
+ * @param accepts the merchant's PaymentRequirements list
56
+ * @param allowed optional CAIP-2 allowlist
57
+ * @returns the chosen requirements, or null when none is acceptable
58
+ */
59
+ export declare function selectRequirements(accepts: PaymentRequirements[], allowed?: string[]): PaymentRequirements | null;
60
+ /**
61
+ * Authorize + sign one x402 challenge into a resubmittable PaymentPayload.
62
+ *
63
+ * @param params inputs
64
+ * @returns the payload to resubmit, or a refusal with an actionable reason
65
+ */
66
+ export declare function buildPaymentForChallenge(params: {
67
+ accepts: PaymentRequirements[];
68
+ apiKey: string;
69
+ walletId: string;
70
+ keys: SigningKeys;
71
+ allowedNetworks?: string[];
72
+ maxAmount?: string;
73
+ buyerBaseUrl?: string;
74
+ }): Promise<BuildResult>;
75
+ /**
76
+ * Resolve the per-family signing keys from explicit params, then env.
77
+ *
78
+ * Tron falls back to the EVM key (same secp256k1 curve); the others have no safe fallback,
79
+ * since a hex key cannot sign a base58/WIF/seed payment.
80
+ *
81
+ * @param input the tool input carrying optional per-family keys
82
+ * @returns the resolved keys
83
+ */
84
+ export declare function resolveSigningKeys(input: {
85
+ privateKey?: string;
86
+ tronKey?: string;
87
+ svmSecret?: string;
88
+ utxoWif?: string;
89
+ kaspaKey?: string;
90
+ xrpSeed?: string;
91
+ }): SigningKeys;
92
+ //# sourceMappingURL=payCore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payCore.d.ts","sourceRoot":"","sources":["../../src/tools/payCore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAWH,eAAO,MAAM,sBAAsB,wCAAwC,CAAC;AAC5E,eAAO,MAAM,YAAY,IAAI,CAAC;AAE9B,qGAAqG;AACrG,eAAO,MAAM,YAAY,UAAU,CAAC;AAEpC,0FAA0F;AAC1F,eAAO,MAAM,iBAAiB,aAAyC,CAAC;AAExE,iFAAiF;AACjF,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAa9E,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAC9B,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAC/D,KAAK,EAAE,MAAM,CAAC;IAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC9E,CAAC;AAEF,+EAA+E;AAC/E,MAAM,MAAM,WAAW,GAAG;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CAC1F,CAAC;AAEF,+FAA+F;AAC/F,MAAM,MAAM,WAAW,GACjB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,YAAY,EAAE,mBAAmB,CAAA;CAAE,GACxF;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpC;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,mBAAmB,GAAG,IAAI,CAMjH;AAED;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAAC,MAAM,EAAE;IACnD,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,WAAW,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB,GAAG,OAAO,CAAC,WAAW,CAAC,CA0HvB;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC1D,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CACzD,GAAG,WAAW,CAUd"}
@@ -0,0 +1,204 @@
1
+ /**
2
+ * The transport-independent half of paying an x402 challenge.
3
+ *
4
+ * Given the merchant's `accepts` list, this picks a requirement, authorizes it with the
5
+ * CryptoAPIs buyer service, signs LOCALLY, and returns the `PaymentPayload` to resubmit. It
6
+ * knows nothing about HTTP or MCP — the caller decides how the challenge arrived and how the
7
+ * payload travels back (a base64 `X-PAYMENT` header over HTTP, a raw object in
8
+ * `_meta["x402/payment"]` over MCP).
9
+ *
10
+ * Extracted so both transports run ONE implementation: the authorize→sign→build flow is
11
+ * identical, and a fix or a newly-enabled family must never land on only one of them. (The
12
+ * buyer SDK made the same split for the same reason — see its `payFlow.js`.)
13
+ */
14
+ import { evmSignTypedData, svmPartialSign, tronSignFromDetails, utxoSignFromDetails, kaspaSignFromDetails, xrpSignFromDetails, } from "@cryptoapis-io/mcp-signer";
15
+ export const DEFAULT_BUYER_BASE_URL = "https://ai.cryptoapis.io/x402/buyer";
16
+ export const X402_VERSION = 2;
17
+ /** The WIRE payment scheme is ALWAYS "exact" — the facilitator derives the family from `network`. */
18
+ export const SCHEME_EXACT = "exact";
19
+ /** Artifact schemes live-verified end-to-end. Enabling a family = add its scheme here. */
20
+ export const SUPPORTED_SCHEMES = new Set(["eip712", "svm-transaction"]);
21
+ /** UTXO CAIP-2 → the {blockchain, network} pair mcp-signer's utxo-sign needs. */
22
+ export const UTXO_CAIP2 = {
23
+ "bip122:000000000019d6689c085ae165831e93": { blockchain: "bitcoin", network: "mainnet" },
24
+ "bip122:000000000933ea01ad0ee984209779ba": { blockchain: "bitcoin", network: "testnet" },
25
+ "bip122:12a765e31ffd4059bada1e25190f6e98": { blockchain: "litecoin", network: "mainnet" },
26
+ "bip122:4966625a4b2851d9fdee139e56211a0d": { blockchain: "litecoin", network: "testnet" },
27
+ "bip122:1a91e3dace36e2be3bf030a65679fe82": { blockchain: "dogecoin", network: "mainnet" },
28
+ "bip122:bb0a78264637406b6360aad926284d54": { blockchain: "dogecoin", network: "testnet" },
29
+ "bip122:00000ffd590b1485b3caadc19b22e637": { blockchain: "dash", network: "mainnet" },
30
+ "bip122:00000bafbc94add76cb75e2ec92894837": { blockchain: "dash", network: "testnet" },
31
+ "bip122:000000000000000000651ef99cb9fcbe": { blockchain: "bitcoin-cash", network: "mainnet" },
32
+ "bip122:00000000dfd5d65c9d8561b4b8f60a63": { blockchain: "bitcoin-cash", network: "testnet" },
33
+ "bip122:0007104ccda289427919efc39dc9e4d4": { blockchain: "zcash", network: "mainnet" },
34
+ "bip122:05a60a92d99d85997cce3b87616c089f": { blockchain: "zcash", network: "testnet" },
35
+ };
36
+ /**
37
+ * Pick which offered requirement to pay: the first whose network is allowed, else the first.
38
+ *
39
+ * @param accepts the merchant's PaymentRequirements list
40
+ * @param allowed optional CAIP-2 allowlist
41
+ * @returns the chosen requirements, or null when none is acceptable
42
+ */
43
+ export function selectRequirements(accepts, allowed) {
44
+ if (accepts.length === 0)
45
+ return null;
46
+ if (Array.isArray(allowed) && allowed.length > 0) {
47
+ return accepts.find((r) => allowed.includes(r.network)) ?? null;
48
+ }
49
+ return accepts[0] ?? null;
50
+ }
51
+ /**
52
+ * Authorize + sign one x402 challenge into a resubmittable PaymentPayload.
53
+ *
54
+ * @param params inputs
55
+ * @returns the payload to resubmit, or a refusal with an actionable reason
56
+ */
57
+ export async function buildPaymentForChallenge(params) {
58
+ const requirements = selectRequirements(params.accepts, params.allowedNetworks);
59
+ if (!requirements) {
60
+ return { ok: false, reason: "no acceptable payment option" };
61
+ }
62
+ if (params.maxAmount != null && BigInt(requirements.amount) > BigInt(params.maxAmount)) {
63
+ return { ok: false, reason: `required amount ${requirements.amount} exceeds maxAmount ${params.maxAmount}` };
64
+ }
65
+ // 1. Authorize via the buyer service → the artifact to sign.
66
+ const root = (params.buyerBaseUrl ?? DEFAULT_BUYER_BASE_URL).replace(/\/$/, "");
67
+ const authRes = await fetch(`${root}/authorize`, {
68
+ method: "POST",
69
+ headers: { "content-type": "application/json", "x-api-key": params.apiKey },
70
+ body: JSON.stringify({ paymentRequirements: requirements, walletId: params.walletId }),
71
+ });
72
+ if (!authRes.ok) {
73
+ return { ok: false, reason: `buyer /authorize failed: ${authRes.status} ${await authRes.text()}`.trim() };
74
+ }
75
+ const auth = await authRes.json();
76
+ if (auth.authorized === false) {
77
+ return { ok: false, reason: `authorize refused: ${auth.reason ?? "unknown"}` };
78
+ }
79
+ // Gate off families that are wired but not yet live-verified.
80
+ if (!auth.scheme || !SUPPORTED_SCHEMES.has(auth.scheme)) {
81
+ return {
82
+ ok: false,
83
+ reason: `family_not_yet_supported: the "${auth.scheme}" family is coming soon — only EVM (eip712) and Solana (svm-transaction) are supported today`,
84
+ };
85
+ }
86
+ // 2. Sign LOCALLY + build the payload. Every family's facilitator parsePayload reads
87
+ // `payload.transaction` first, so the non-EVM families use a uniform wrapper with the
88
+ // per-family value the facilitator expects.
89
+ const network = requirements.network;
90
+ const sp = auth.signingPayload ?? {};
91
+ const keys = params.keys;
92
+ let payload;
93
+ /** A family whose signing key wasn't configured errors cleanly (never mis-signs). */
94
+ const needKey = (key, envName) => (key ? null : `no signing key for ${auth.scheme} — set ${envName} (or the matching param)`);
95
+ if (auth.scheme === "eip712") {
96
+ const missing = needKey(keys.evm, "X402_PRIVATE_KEY");
97
+ if (missing)
98
+ return { ok: false, reason: missing };
99
+ const td = sp;
100
+ const { signature } = await evmSignTypedData({
101
+ action: "sign-typed-data",
102
+ privateKey: keys.evm,
103
+ domain: td.domain,
104
+ types: td.types,
105
+ primaryType: td.primaryType,
106
+ message: td.message,
107
+ });
108
+ payload = { signature, authorization: td.message };
109
+ }
110
+ else if (auth.scheme === "svm-transaction") {
111
+ const missing = needKey(keys.svm, "X402_SVM_SECRET");
112
+ if (missing)
113
+ return { ok: false, reason: missing };
114
+ const { transaction } = svmPartialSign({
115
+ action: "partial-sign",
116
+ secretKeyBase58: keys.svm,
117
+ transaction: sp.transaction,
118
+ });
119
+ payload = { transaction };
120
+ }
121
+ else if (auth.scheme === "tron-transaction") {
122
+ const missing = needKey(keys.tron, "X402_TRON_KEY");
123
+ if (missing)
124
+ return { ok: false, reason: missing };
125
+ const { signedTransaction } = tronSignFromDetails({
126
+ action: "sign-from-details",
127
+ privateKey: keys.tron,
128
+ transaction: sp.transaction,
129
+ });
130
+ payload = { transaction: signedTransaction };
131
+ }
132
+ else if (auth.scheme === "utxo-transaction") {
133
+ const missing = needKey(keys.utxo, "X402_UTXO_WIF");
134
+ if (missing)
135
+ return { ok: false, reason: missing };
136
+ const chain = UTXO_CAIP2[network];
137
+ if (!chain)
138
+ return { ok: false, reason: `unknown UTXO network ${network}` };
139
+ const { signedTransactionHex } = utxoSignFromDetails({
140
+ action: "sign-from-details",
141
+ blockchain: chain.blockchain,
142
+ network: chain.network,
143
+ privateKeys: [keys.utxo],
144
+ preparedTransaction: sp.preparedTransaction,
145
+ });
146
+ payload = { transaction: signedTransactionHex };
147
+ }
148
+ else if (auth.scheme === "kaspa-transaction") {
149
+ const missing = needKey(keys.kaspa, "X402_KASPA_KEY");
150
+ if (missing)
151
+ return { ok: false, reason: missing };
152
+ const { signedTransaction } = kaspaSignFromDetails({
153
+ action: "sign-from-details",
154
+ privateKeys: [keys.kaspa],
155
+ preparedTransaction: sp.preparedTransaction,
156
+ });
157
+ payload = { transaction: signedTransaction };
158
+ }
159
+ else if (auth.scheme === "xrp-transaction") {
160
+ const missing = needKey(keys.xrp, "X402_XRP_SEED");
161
+ if (missing)
162
+ return { ok: false, reason: missing };
163
+ const { signedTransactionHex } = await xrpSignFromDetails({
164
+ action: "sign-from-details",
165
+ secret: keys.xrp,
166
+ transaction: sp.transaction,
167
+ });
168
+ payload = { transaction: signedTransactionHex };
169
+ }
170
+ else {
171
+ return { ok: false, reason: `unsupported_scheme: ${auth.scheme}` };
172
+ }
173
+ return {
174
+ ok: true,
175
+ requirements,
176
+ paymentPayload: {
177
+ x402Version: X402_VERSION,
178
+ scheme: SCHEME_EXACT,
179
+ network: network,
180
+ payload: payload,
181
+ },
182
+ };
183
+ }
184
+ /**
185
+ * Resolve the per-family signing keys from explicit params, then env.
186
+ *
187
+ * Tron falls back to the EVM key (same secp256k1 curve); the others have no safe fallback,
188
+ * since a hex key cannot sign a base58/WIF/seed payment.
189
+ *
190
+ * @param input the tool input carrying optional per-family keys
191
+ * @returns the resolved keys
192
+ */
193
+ export function resolveSigningKeys(input) {
194
+ const evm = input.privateKey ?? process.env.X402_PRIVATE_KEY;
195
+ return {
196
+ evm,
197
+ tron: input.tronKey ?? process.env.X402_TRON_KEY ?? evm,
198
+ svm: input.svmSecret ?? process.env.X402_SVM_SECRET,
199
+ utxo: input.utxoWif ?? process.env.X402_UTXO_WIF,
200
+ kaspa: input.kaspaKey ?? process.env.X402_KASPA_KEY,
201
+ xrp: input.xrpSeed ?? process.env.X402_XRP_SEED,
202
+ };
203
+ }
204
+ //# sourceMappingURL=payCore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payCore.js","sourceRoot":"","sources":["../../src/tools/payCore.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,23 @@ import type { X402PayInput } from "./schema.js";
2
2
  import { X402PaySchema } from "./schema.js";
3
3
  import type { McpX402ToolDef } from "../types.js";
4
4
  /**
5
- * Fetch a URL and auto-pay a 402 with x402 (EVM eip712 path).
5
+ * Is `url` allowed by a host allowlist?
6
+ *
7
+ * An entry matches the host exactly; an entry with a LEADING DOT (`.acme.com`) also matches
8
+ * any subdomain. Matching is on the parsed hostname, never on substrings of the raw url —
9
+ * a substring test would let `evil.com/?x=api.acme.com` through.
10
+ *
11
+ * @param url the url about to be fetched
12
+ * @param allowed the allowlist (already resolved from param or env)
13
+ * @return true when the url may be paid
14
+ */
15
+ export declare function isHostAllowed(url: string, allowed: string[]): boolean;
16
+ /**
17
+ * Fetch a URL and auto-pay a 402 with x402.
18
+ *
19
+ * The authorize → sign → build-payload half lives in `payCore` and is SHARED with the
20
+ * MCP-tool payer (`x402_pay_tool`); only the HTTP envelope is here — the 402 status, the
21
+ * base64 `X-PAYMENT` header, and the `X-PAYMENT-RESPONSE` receipt.
6
22
  *
7
23
  * @param input the tool input
8
24
  * @return the final (paid) response summary
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/x402-pay/index.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AA+ClD;;;;;GAKG;AACH,wBAAsB,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC;IACxD,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CACtF,CAAC,CA4KD;AAED,eAAO,MAAM,WAAW,EAAE,cAAc,CAAC,OAAO,aAAa,CAS5D,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/x402-pay/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAIlD;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAYrE;AAED;;;;;;;;;GASG;AACH,wBAAsB,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC;IACxD,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CACtF,CAAC,CAkED;AAED,eAAO,MAAM,WAAW,EAAE,cAAc,CAAC,OAAO,aAAa,CAS5D,CAAC"}
@@ -1,68 +1,65 @@
1
- import { evmSignTypedData, svmPartialSign, tronSignFromDetails, utxoSignFromDetails, kaspaSignFromDetails, xrpSignFromDetails, } from "@cryptoapis-io/mcp-signer";
2
1
  import { X402PaySchema } from "./schema.js";
3
- const DEFAULT_BUYER_BASE_URL = "https://ai.cryptoapis.io/x402/buyer";
4
- const X402_VERSION = 2;
5
- /** The WIRE payment scheme is ALWAYS "exact" — the facilitator's parseEnvelope rejects
6
- * anything else and derives the family from `network`. The buyer /authorize "scheme"
7
- * (eip712/…) is the ARTIFACT type (how to sign), NOT this. */
8
- const SCHEME_EXACT = "exact";
9
- /** Artifact schemes that are LIVE-VERIFIED end-to-end and enabled today. EVM (eip712) and
10
- * Solana (svm-transaction) are supported; Tron/UTXO/XRP/Kaspa are wired but not yet
11
- * live-verified, so they are gated OFF ("coming soon") until each is exercised in prod.
12
- * Enabling a family once verified = add its scheme here. */
13
- const SUPPORTED_SCHEMES = new Set(["eip712", "svm-transaction"]);
14
- /** UTXO CAIP-2 network id → the {blockchain, network} the mcp-signer utxo-sign needs
15
- * (a bare CAIP-2 doesn't carry the chain name). Only UTXO signing needs this pair. */
16
- const UTXO_CAIP2 = {
17
- "bip122:000000000019d6689c085ae165831e93": { blockchain: "bitcoin", network: "mainnet" },
18
- "bip122:000000000933ea01ad0ee984209779ba": { blockchain: "bitcoin", network: "testnet" },
19
- "bip122:12a765e31ffd4059bada1e25190f6e98": { blockchain: "litecoin", network: "mainnet" },
20
- "bip122:4966625a4b2851d9fdee139e56211a0d": { blockchain: "litecoin", network: "testnet" },
21
- "bip122:1a91e3dace36e2be3bf030a65679fe82": { blockchain: "dogecoin", network: "mainnet" },
22
- "bip122:bb0a78264637406b6360aad926284d54": { blockchain: "dogecoin", network: "testnet" },
23
- "bip122:00000ffd590b1485b3caadc19b22e637": { blockchain: "dash", network: "mainnet" },
24
- "bip122:00000bafbc94add76cb75e2ec92894837": { blockchain: "dash", network: "testnet" },
25
- "bip122:000000000000000000651ef99cb9fcbe": { blockchain: "bitcoin-cash", network: "mainnet" },
26
- "bip122:00000000dfd5d65c9d8561b4b8f60a63": { blockchain: "bitcoin-cash", network: "testnet" },
27
- "bip122:0007104ccda289427919efc39dc9e4d4": { blockchain: "zcash", network: "mainnet" },
28
- "bip122:05a60a92d99d85997cce3b87616c089f": { blockchain: "zcash", network: "testnet" },
29
- };
30
- /** Pick which offered requirement to pay (allowlist-aware; else the first). */
31
- function selectRequirements(accepts, allowed) {
32
- if (accepts.length === 0)
33
- return null;
34
- if (Array.isArray(allowed) && allowed.length > 0) {
35
- return accepts.find((r) => allowed.includes(r.network)) ?? null;
2
+ import { buildPaymentForChallenge, resolveSigningKeys } from "../payCore.js";
3
+ /**
4
+ * Is `url` allowed by a host allowlist?
5
+ *
6
+ * An entry matches the host exactly; an entry with a LEADING DOT (`.acme.com`) also matches
7
+ * any subdomain. Matching is on the parsed hostname, never on substrings of the raw url —
8
+ * a substring test would let `evil.com/?x=api.acme.com` through.
9
+ *
10
+ * @param url the url about to be fetched
11
+ * @param allowed the allowlist (already resolved from param or env)
12
+ * @return true when the url may be paid
13
+ */
14
+ export function isHostAllowed(url, allowed) {
15
+ let host;
16
+ try {
17
+ host = new URL(url).hostname.toLowerCase();
18
+ }
19
+ catch {
20
+ return false; // unparseable url is never allowed
36
21
  }
37
- return accepts[0] ?? null;
22
+ return allowed.some((entry) => {
23
+ const e = entry.trim().toLowerCase();
24
+ if (!e)
25
+ return false;
26
+ return e.startsWith(".") ? host === e.slice(1) || host.endsWith(e) : host === e;
27
+ });
38
28
  }
39
29
  /**
40
- * Fetch a URL and auto-pay a 402 with x402 (EVM eip712 path).
30
+ * Fetch a URL and auto-pay a 402 with x402.
31
+ *
32
+ * The authorize → sign → build-payload half lives in `payCore` and is SHARED with the
33
+ * MCP-tool payer (`x402_pay_tool`); only the HTTP envelope is here — the 402 status, the
34
+ * base64 `X-PAYMENT` header, and the `X-PAYMENT-RESPONSE` receipt.
41
35
  *
42
36
  * @param input the tool input
43
37
  * @return the final (paid) response summary
44
38
  */
45
39
  export async function x402Pay(input) {
40
+ // Host allowlist FIRST — before credentials, before any fetch. This tool holds spending
41
+ // keys and will pay whatever url it is handed, so a url the operator never sanctioned
42
+ // must not even be contacted. Resolved from the param OR X402_ALLOWED_HOSTS so an
43
+ // operator can pin it outside the model's reach; unset = unrestricted (x402 is an open
44
+ // protocol and the tool must be able to pay any merchant, incl. our own customers).
45
+ const allowedHosts = input.allowedHosts
46
+ ?? (process.env.X402_ALLOWED_HOSTS ? process.env.X402_ALLOWED_HOSTS.split(",") : undefined);
47
+ if (allowedHosts && allowedHosts.length > 0 && !isHostAllowed(input.url, allowedHosts)) {
48
+ return {
49
+ status: 0,
50
+ paid: false,
51
+ reason: `host not allowed: ${input.url} is outside allowedHosts (${allowedHosts.join(", ")})`,
52
+ body: "",
53
+ };
54
+ }
46
55
  // Credentials: prefer the per-call params, else fall back to env (set once in the
47
56
  // MCP config so the agent only ever passes `url` — and the key stays out of logs).
48
- // apiKey + walletId are always needed (to call /authorize); the SIGNING key is
49
- // resolved per-family at the dispatch below (each chain uses its own key form).
50
57
  const apiKey = input.apiKey ?? process.env.CRYPTOAPIS_API_KEY;
51
58
  const walletId = input.walletId ?? process.env.X402_WALLET_ID;
52
59
  if (!apiKey || !walletId) {
53
60
  const missing = [!apiKey && "apiKey/CRYPTOAPIS_API_KEY", !walletId && "walletId/X402_WALLET_ID"].filter(Boolean).join(", ");
54
61
  return { status: 0, paid: false, reason: `missing credentials: ${missing} (pass as params or set the env vars)`, body: "" };
55
62
  }
56
- // Per-family signing keys (param → family env → EVM fallback where the curve allows).
57
- const evmKey = input.privateKey ?? process.env.X402_PRIVATE_KEY;
58
- const keys = {
59
- evm: evmKey,
60
- tron: input.tronKey ?? process.env.X402_TRON_KEY ?? evmKey,
61
- svm: input.svmSecret ?? process.env.X402_SVM_SECRET,
62
- utxo: input.utxoWif ?? process.env.X402_UTXO_WIF,
63
- kaspa: input.kaspaKey ?? process.env.X402_KASPA_KEY,
64
- xrp: input.xrpSeed ?? process.env.X402_XRP_SEED,
65
- };
66
63
  const method = input.method ?? "GET";
67
64
  const baseInit = {
68
65
  method,
@@ -74,136 +71,21 @@ export async function x402Pay(input) {
74
71
  return { status: first.status, paid: false, body: await first.text() };
75
72
  }
76
73
  const body402 = await first.json().catch(() => null);
77
- const accepts = Array.isArray(body402?.accepts) ? body402.accepts : [];
78
- const requirements = selectRequirements(accepts, input.allowedNetworks);
79
- if (!requirements) {
80
- return { status: 402, paid: false, reason: "no acceptable payment option", body: JSON.stringify(body402) };
81
- }
82
- if (input.maxAmount != null && BigInt(requirements.amount) > BigInt(input.maxAmount)) {
83
- return { status: 402, paid: false, reason: `required amount ${requirements.amount} exceeds maxAmount ${input.maxAmount}`, body: "" };
84
- }
85
- // 1. Authorize via the buyer service → the artifact to sign.
86
- const root = (input.buyerBaseUrl ?? DEFAULT_BUYER_BASE_URL).replace(/\/$/, "");
87
- const authRes = await fetch(`${root}/authorize`, {
88
- method: "POST",
89
- headers: { "content-type": "application/json", "x-api-key": apiKey },
90
- body: JSON.stringify({ paymentRequirements: requirements, walletId: walletId }),
74
+ const built = await buildPaymentForChallenge({
75
+ accepts: Array.isArray(body402?.accepts) ? body402.accepts : [],
76
+ apiKey: apiKey,
77
+ walletId: walletId,
78
+ keys: resolveSigningKeys(input),
79
+ allowedNetworks: input.allowedNetworks,
80
+ maxAmount: input.maxAmount,
81
+ buyerBaseUrl: input.buyerBaseUrl,
91
82
  });
92
- if (!authRes.ok) {
93
- return { status: 402, paid: false, reason: `buyer /authorize failed: ${authRes.status} ${await authRes.text()}`.trim(), body: "" };
94
- }
95
- const auth = await authRes.json();
96
- if (auth.authorized === false) {
97
- return { status: 402, paid: false, reason: `authorize refused: ${auth.reason ?? "unknown"}`, body: "" };
98
- }
99
- // 2. Sign LOCALLY + build the PaymentPayload. The WIRE scheme is ALWAYS "exact"
100
- // (family carried by `network`); the /authorize `scheme` says HOW to sign. Every
101
- // family's facilitator parsePayload reads `payload.transaction` first — so the
102
- // non-EVM families use a uniform `payload:{transaction}` wrapper, with the
103
- // per-family value the facilitator expects (SVM base64, UTXO/XRP hex, Kaspa JSON,
104
- // Tron the structured {txID, raw_data_hex, raw_data, signature[]} object).
105
- const network = requirements.network;
106
- // Gate off families that are wired but not yet live-verified (Tron/UTXO/XRP/Kaspa).
107
- // EVM + Solana are supported today; the rest are on the roadmap ("coming soon").
108
- if (!auth.scheme || !SUPPORTED_SCHEMES.has(auth.scheme)) {
109
- return {
110
- status: 402,
111
- paid: false,
112
- reason: `family_not_yet_supported: the "${auth.scheme}" family is coming soon — only EVM (eip712) and Solana (svm-transaction) are supported today`,
113
- body: "",
114
- };
115
- }
116
- const sp = auth.signingPayload ?? {};
117
- let payload;
118
- /** Guard: a family whose signing key wasn't configured errors cleanly (never mis-signs). */
119
- const needKey = (key, envName) => (key ? null : `no signing key for ${auth.scheme} — set ${envName} (or the matching param)`);
120
- if (auth.scheme === "eip712") {
121
- const missing = needKey(keys.evm, "X402_PRIVATE_KEY");
122
- if (missing)
123
- return { status: 402, paid: false, reason: missing, body: "" };
124
- const td = sp;
125
- const { signature } = await evmSignTypedData({
126
- action: "sign-typed-data",
127
- privateKey: keys.evm,
128
- domain: td.domain,
129
- types: td.types,
130
- primaryType: td.primaryType,
131
- message: td.message,
132
- });
133
- payload = { signature, authorization: td.message };
83
+ if (!built.ok) {
84
+ return { status: 402, paid: false, reason: built.reason, body: JSON.stringify(body402 ?? {}) };
134
85
  }
135
- else if (auth.scheme === "svm-transaction") {
136
- const missing = needKey(keys.svm, "X402_SVM_SECRET");
137
- if (missing)
138
- return { status: 402, paid: false, reason: missing, body: "" };
139
- const { transaction } = svmPartialSign({
140
- action: "partial-sign",
141
- secretKeyBase58: keys.svm,
142
- transaction: sp.transaction,
143
- });
144
- payload = { transaction };
145
- }
146
- else if (auth.scheme === "tron-transaction") {
147
- const missing = needKey(keys.tron, "X402_TRON_KEY");
148
- if (missing)
149
- return { status: 402, paid: false, reason: missing, body: "" };
150
- const { signedTransaction } = tronSignFromDetails({
151
- action: "sign-from-details",
152
- privateKey: keys.tron,
153
- transaction: sp.transaction,
154
- });
155
- // Tron's facilitator wants the structured {txID, raw_data_hex, raw_data, signature[]}.
156
- payload = { transaction: signedTransaction };
157
- }
158
- else if (auth.scheme === "utxo-transaction") {
159
- const missing = needKey(keys.utxo, "X402_UTXO_WIF");
160
- if (missing)
161
- return { status: 402, paid: false, reason: missing, body: "" };
162
- const chain = UTXO_CAIP2[network];
163
- if (!chain)
164
- return { status: 402, paid: false, reason: `unknown UTXO network ${network}`, body: "" };
165
- const { signedTransactionHex } = utxoSignFromDetails({
166
- action: "sign-from-details",
167
- blockchain: chain.blockchain,
168
- network: chain.network,
169
- privateKeys: [keys.utxo],
170
- preparedTransaction: sp.preparedTransaction,
171
- });
172
- payload = { transaction: signedTransactionHex };
173
- }
174
- else if (auth.scheme === "kaspa-transaction") {
175
- const missing = needKey(keys.kaspa, "X402_KASPA_KEY");
176
- if (missing)
177
- return { status: 402, paid: false, reason: missing, body: "" };
178
- const { signedTransaction } = kaspaSignFromDetails({
179
- action: "sign-from-details",
180
- privateKeys: [keys.kaspa],
181
- preparedTransaction: sp.preparedTransaction,
182
- });
183
- payload = { transaction: signedTransaction };
184
- }
185
- else if (auth.scheme === "xrp-transaction") {
186
- const missing = needKey(keys.xrp, "X402_XRP_SEED");
187
- if (missing)
188
- return { status: 402, paid: false, reason: missing, body: "" };
189
- const { signedTransactionHex } = await xrpSignFromDetails({
190
- action: "sign-from-details",
191
- secret: keys.xrp,
192
- transaction: sp.transaction,
193
- });
194
- payload = { transaction: signedTransactionHex };
195
- }
196
- else {
197
- return { status: 402, paid: false, reason: `unsupported_scheme: ${auth.scheme}`, body: "" };
198
- }
199
- const paymentPayload = {
200
- x402Version: X402_VERSION,
201
- scheme: SCHEME_EXACT,
202
- network: network,
203
- payload: payload,
204
- };
205
- // 3. Retry the ORIGINAL request with the X-PAYMENT header.
206
- const xPayment = Buffer.from(JSON.stringify(paymentPayload), "utf8").toString("base64");
86
+ // Retry the ORIGINAL request with the X-PAYMENT header. HTTP carries the payload as a
87
+ // base64 header value; MCP carries the same object as structured JSON (see x402_pay_tool).
88
+ const xPayment = Buffer.from(JSON.stringify(built.paymentPayload), "utf8").toString("base64");
207
89
  const paid = await fetch(input.url, {
208
90
  ...baseInit,
209
91
  headers: { ...baseInit.headers, "x-payment": xPayment },
@@ -218,7 +100,7 @@ export async function x402Pay(input) {
218
100
  }
219
101
  export const x402PayTool = {
220
102
  name: "x402_pay",
221
- description: "Fetch an HTTP resource and, if it returns 402 Payment Required, pay it automatically with x402 and return the paid response. On a 402 it: parses the merchant's price, authorizes via the CryptoAPIs buyer /authorize, signs the payment LOCALLY (non-custodial — the key never leaves this process), and retries with the X-PAYMENT header. Returns { status, paid, body, settlement? }. Supported today: EVM (eip712, e.g. Base USDC) and Solana. Tron, UTXO (bitcoin/ltc/doge/dash/bch/zcash), Kaspa and XRP are UPCOMING — wired but not yet enabled, and paying on them returns a clear coming-soon (family_not_yet_supported) result. Set CRYPTOAPIS_API_KEY + X402_WALLET_ID once, plus the signing key(s) for the chain(s) you pay on: X402_PRIVATE_KEY (EVM hex), X402_SVM_SECRET (base58). A scheme with no configured key errors cleanly (never mis-signs). Env vars keep keys OUT of tool-call logs. Use allowedNetworks to restrict, maxAmount as a safety cap. SECURITY: use only in trusted local environments.",
103
+ description: "Fetch an HTTP resource and, if it returns 402 Payment Required, pay it automatically with x402 and return the paid response. On a 402 it: parses the merchant's price, authorizes via the CryptoAPIs buyer /authorize, signs the payment LOCALLY (non-custodial — the key never leaves this process), and retries with the X-PAYMENT header. Returns { status, paid, body, settlement? }. This is for HTTP URLs — to pay a paid MCP TOOL on another server, use x402_pay_tool instead. Supported today: EVM (eip712, e.g. Base USDC) and Solana. Tron, UTXO (bitcoin/ltc/doge/dash/bch/zcash), Kaspa and XRP are UPCOMING — wired but not yet enabled, and paying on them returns a clear coming-soon (family_not_yet_supported) result. Set CRYPTOAPIS_API_KEY + X402_WALLET_ID once, plus the signing key(s) for the chain(s) you pay on: X402_PRIVATE_KEY (EVM hex), X402_SVM_SECRET (base58). A scheme with no configured key errors cleanly (never mis-signs). Env vars keep keys OUT of tool-call logs. Use allowedNetworks to restrict chains, maxAmount as a per-call spend cap, and allowedHosts to restrict WHICH SITES may be paid (a url outside the list is refused before any network call; set X402_ALLOWED_HOSTS in the MCP config to pin it outside the model's reach). SECURITY: this tool holds spending keys — use only in trusted local environments, and prefer pinning allowedHosts + maxAmount via env for unattended runs.",
222
104
  inputSchema: X402PaySchema,
223
105
  handler: async (input) => {
224
106
  const result = await x402Pay(input);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/x402-pay/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/x402-pay/index.ts"],"names":[],"mappings":"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"}
@@ -24,6 +24,7 @@ export declare const X402PaySchema: z.ZodObject<{
24
24
  kaspaKey: z.ZodOptional<z.ZodString>;
25
25
  xrpSeed: z.ZodOptional<z.ZodString>;
26
26
  allowedNetworks: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
27
+ allowedHosts: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
27
28
  buyerBaseUrl: z.ZodOptional<z.ZodString>;
28
29
  maxAmount: z.ZodOptional<z.ZodString>;
29
30
  }, "strip", z.ZodTypeAny, {
@@ -40,6 +41,7 @@ export declare const X402PaySchema: z.ZodObject<{
40
41
  kaspaKey?: string | undefined;
41
42
  xrpSeed?: string | undefined;
42
43
  allowedNetworks?: string[] | undefined;
44
+ allowedHosts?: string[] | undefined;
43
45
  buyerBaseUrl?: string | undefined;
44
46
  maxAmount?: string | undefined;
45
47
  }, {
@@ -56,6 +58,7 @@ export declare const X402PaySchema: z.ZodObject<{
56
58
  kaspaKey?: string | undefined;
57
59
  xrpSeed?: string | undefined;
58
60
  allowedNetworks?: string[] | undefined;
61
+ allowedHosts?: string[] | undefined;
59
62
  buyerBaseUrl?: string | undefined;
60
63
  maxAmount?: string | undefined;
61
64
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/tools/x402-pay/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB;;;;;;;;;;GAUG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsBxB,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/tools/x402-pay/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB;;;;;;;;;;GAUG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuBxB,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC"}
@@ -27,6 +27,7 @@ export const X402PaySchema = z.object({
27
27
  kaspaKey: z.string().optional().describe("Kaspa private key (hex, 32 bytes) — signs kaspa-transaction payments. Falls back to X402_KASPA_KEY."),
28
28
  xrpSeed: z.string().optional().describe("XRP secret/seed (base58, e.g. s...) — signs xrp-transaction payments. Falls back to X402_XRP_SEED."),
29
29
  allowedNetworks: z.array(z.string()).optional().describe("Restrict which CAIP-2 networks to pay on (e.g. [\"eip155:8453\"])"),
30
+ allowedHosts: z.array(z.string()).optional().describe("Restrict WHICH HOSTS may be paid, e.g. [\"api.acme.com\"] (a leading dot matches subdomains: \".acme.com\"). A url outside the list is refused BEFORE any network call. Falls back to the X402_ALLOWED_HOSTS env var (comma-separated) — set it there to pin the allowlist OUTSIDE the model's reach, so a prompt-injected url cannot widen it."),
30
31
  buyerBaseUrl: z.string().url().optional().describe("Override the buyer service base URL (default https://ai.cryptoapis.io/x402/buyer)"),
31
32
  maxAmount: z.string().optional().describe("Optional safety cap: refuse to pay if the required atomic-unit amount exceeds this"),
32
33
  });
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/tools/x402-pay/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,gDAAgD,CAAC;IAChF,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IAC1G,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+DAA+D,CAAC;IACrG,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IAEtF,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yKAAyK,CAAC;IACjN,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sdAAsd,CAAC;IAEhgB,8EAA8E;IAC9E,+EAA+E;IAC/E,qDAAqD;IACrD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sKAAsK,CAAC;IAClN,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kHAAkH,CAAC;IAC3J,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6HAA6H,CAAC;IACxK,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kIAAkI,CAAC;IAC3K,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qGAAqG,CAAC;IAC/I,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oGAAoG,CAAC;IAE7I,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mEAAmE,CAAC;IAC7H,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mFAAmF,CAAC;IACvI,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oFAAoF,CAAC;CAClI,CAAC,CAAC"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/tools/x402-pay/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,gDAAgD,CAAC;IAChF,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IAC1G,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+DAA+D,CAAC;IACrG,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IAEtF,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yKAAyK,CAAC;IACjN,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sdAAsd,CAAC;IAEhgB,8EAA8E;IAC9E,+EAA+E;IAC/E,qDAAqD;IACrD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sKAAsK,CAAC;IAClN,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kHAAkH,CAAC;IAC3J,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6HAA6H,CAAC;IACxK,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kIAAkI,CAAC;IAC3K,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qGAAqG,CAAC;IAC/I,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oGAAoG,CAAC;IAE7I,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mEAAmE,CAAC;IAC7H,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iVAAiV,CAAC;IACxY,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mFAAmF,CAAC;IACvI,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oFAAoF,CAAC;CAClI,CAAC,CAAC"}
@@ -0,0 +1,45 @@
1
+ import type { X402PayToolInput } from "./schema.js";
2
+ import { X402PayToolSchema } from "./schema.js";
3
+ import type { McpX402ToolDef } from "../types.js";
4
+ import type { PaymentRequirements } from "../payCore.js";
5
+ type ToolResult = {
6
+ isError?: boolean;
7
+ content?: {
8
+ type: string;
9
+ text?: string;
10
+ }[];
11
+ structuredContent?: unknown;
12
+ _meta?: Record<string, unknown>;
13
+ };
14
+ /**
15
+ * Read an x402 `PaymentRequired` challenge out of an MCP tool result.
16
+ *
17
+ * Per the spec a client SHOULD prefer `structuredContent` and fall back to parsing
18
+ * `content[0].text` — servers must send BOTH, but a server that sends only the text form is
19
+ * still payable, and treating it as unpayable would strand the user.
20
+ *
21
+ * @param result an MCP tool result
22
+ * @return the PaymentRequired body, or null when this is not a payment challenge
23
+ */
24
+ export declare function parseToolChallenge(result: ToolResult | undefined): {
25
+ accepts?: PaymentRequirements[];
26
+ } | null;
27
+ /**
28
+ * Call a tool on another MCP server, paying it if it answers with an x402 challenge.
29
+ *
30
+ * The authorize → sign → build-payload half is SHARED with `x402_pay` (`payCore`); only the
31
+ * envelope differs. Over MCP the payment travels as a RAW OBJECT in `_meta["x402/payment"]` —
32
+ * no base64, because MCP carries structured JSON natively.
33
+ *
34
+ * @param input the tool input
35
+ * @return the tool result, plus whether a payment was made
36
+ */
37
+ export declare function x402PayTool(input: X402PayToolInput): Promise<{
38
+ paid: boolean;
39
+ result?: unknown;
40
+ settlement?: unknown;
41
+ reason?: string;
42
+ }>;
43
+ export declare const x402PayToolDef: McpX402ToolDef<typeof X402PayToolSchema>;
44
+ export {};
45
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/x402-pay-tool/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AASzD,KAAK,UAAU,GAAG;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC5C,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG;IAAE,OAAO,CAAC,EAAE,mBAAmB,EAAE,CAAA;CAAE,GAAG,IAAI,CAoB7G;AAED;;;;;;;;;GASG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC;IAChE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1E,CAAC,CA2DD;AAED,eAAO,MAAM,cAAc,EAAE,cAAc,CAAC,OAAO,iBAAiB,CASnE,CAAC"}
@@ -0,0 +1,114 @@
1
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
2
+ import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
3
+ import { X402PayToolSchema } from "./schema.js";
4
+ import { buildPaymentForChallenge, resolveSigningKeys } from "../payCore.js";
5
+ /** `_meta` key the payment is sent under (x402 v2 MCP transport). */
6
+ const PAYMENT_META_KEY = "x402/payment";
7
+ /** `_meta` key the settlement receipt comes back under. */
8
+ const PAYMENT_RESPONSE_META_KEY = "x402/payment-response";
9
+ /**
10
+ * Read an x402 `PaymentRequired` challenge out of an MCP tool result.
11
+ *
12
+ * Per the spec a client SHOULD prefer `structuredContent` and fall back to parsing
13
+ * `content[0].text` — servers must send BOTH, but a server that sends only the text form is
14
+ * still payable, and treating it as unpayable would strand the user.
15
+ *
16
+ * @param result an MCP tool result
17
+ * @return the PaymentRequired body, or null when this is not a payment challenge
18
+ */
19
+ export function parseToolChallenge(result) {
20
+ if (!result?.isError)
21
+ return null;
22
+ const isChallenge = (o) => !!o && typeof o === "object"
23
+ && o.x402Version !== undefined
24
+ && Array.isArray(o.accepts);
25
+ if (isChallenge(result.structuredContent))
26
+ return result.structuredContent;
27
+ const text = result.content?.[0]?.text;
28
+ if (typeof text === "string") {
29
+ try {
30
+ const parsed = JSON.parse(text);
31
+ if (isChallenge(parsed))
32
+ return parsed;
33
+ }
34
+ catch {
35
+ return null; // not JSON — an ordinary tool error, not a payment challenge
36
+ }
37
+ }
38
+ return null;
39
+ }
40
+ /**
41
+ * Call a tool on another MCP server, paying it if it answers with an x402 challenge.
42
+ *
43
+ * The authorize → sign → build-payload half is SHARED with `x402_pay` (`payCore`); only the
44
+ * envelope differs. Over MCP the payment travels as a RAW OBJECT in `_meta["x402/payment"]` —
45
+ * no base64, because MCP carries structured JSON natively.
46
+ *
47
+ * @param input the tool input
48
+ * @return the tool result, plus whether a payment was made
49
+ */
50
+ export async function x402PayTool(input) {
51
+ const apiKey = input.apiKey ?? process.env.CRYPTOAPIS_API_KEY;
52
+ const walletId = input.walletId ?? process.env.X402_WALLET_ID;
53
+ if (!apiKey || !walletId) {
54
+ const missing = [!apiKey && "apiKey/CRYPTOAPIS_API_KEY", !walletId && "walletId/X402_WALLET_ID"].filter(Boolean).join(", ");
55
+ return { paid: false, reason: `missing credentials: ${missing} (pass as params or set the env vars)` };
56
+ }
57
+ const client = new Client({ name: "mcp-x402-pay", version: "0.4.0" }, { capabilities: {} });
58
+ const transport = new StdioClientTransport({
59
+ command: input.server.command,
60
+ args: input.server.args ?? [],
61
+ env: { ...process.env, ...(input.server.env ?? {}) },
62
+ });
63
+ try {
64
+ await client.connect(transport);
65
+ const params = { name: input.toolName, arguments: input.arguments ?? {} };
66
+ const first = await client.callTool(params);
67
+ const challenge = parseToolChallenge(first);
68
+ if (!challenge) {
69
+ // Not a payment challenge (success, or an ordinary tool error) — hand it back
70
+ // untouched rather than interpreting someone else's error.
71
+ return { paid: false, result: first };
72
+ }
73
+ const built = await buildPaymentForChallenge({
74
+ accepts: Array.isArray(challenge.accepts) ? challenge.accepts : [],
75
+ apiKey: apiKey,
76
+ walletId: walletId,
77
+ keys: resolveSigningKeys(input),
78
+ allowedNetworks: input.allowedNetworks,
79
+ maxAmount: input.maxAmount,
80
+ buyerBaseUrl: input.buyerBaseUrl,
81
+ });
82
+ if (!built.ok) {
83
+ // Return the original challenge alongside the reason so the agent can see the price.
84
+ return { paid: false, reason: built.reason, result: first };
85
+ }
86
+ // Exactly ONE retry, never a loop: a second challenge means the payment was rejected,
87
+ // and re-paying would risk paying twice for one call.
88
+ const paidResult = await client.callTool({
89
+ ...params,
90
+ _meta: { [PAYMENT_META_KEY]: built.paymentPayload },
91
+ });
92
+ return {
93
+ paid: !paidResult?.isError,
94
+ result: paidResult,
95
+ settlement: paidResult?._meta?.[PAYMENT_RESPONSE_META_KEY],
96
+ };
97
+ }
98
+ catch (err) {
99
+ return { paid: false, reason: `upstream MCP call failed: ${err instanceof Error ? err.message : String(err)}` };
100
+ }
101
+ finally {
102
+ await client.close().catch(() => { });
103
+ }
104
+ }
105
+ export const x402PayToolDef = {
106
+ name: "x402_pay_tool",
107
+ description: "Call a TOOL on another MCP server and, if that tool requires payment, pay it automatically with x402 and return the paid result. This is the MCP-transport twin of x402_pay: use x402_pay for an HTTP url, and THIS for a paid tool on another MCP server. On a challenge it reads the PaymentRequired (from structuredContent, falling back to content[0].text), authorizes via the CryptoAPIs buyer /authorize, signs LOCALLY (non-custodial — the key never leaves this process), and retries the tool call once with the payment in _meta[\"x402/payment\"] (a raw object, no base64 — MCP carries structured JSON natively). Returns { paid, result, settlement? }; the settlement receipt comes back in _meta[\"x402/payment-response\"]. The upstream server is launched over stdio for the call and shut down afterwards. Same credentials and keys as x402_pay: CRYPTOAPIS_API_KEY + X402_WALLET_ID, plus X402_PRIVATE_KEY (EVM) / X402_SVM_SECRET (Solana). Supported today: EVM (eip712) and Solana; Tron, UTXO, Kaspa and XRP return a clear coming-soon result. Use allowedNetworks and maxAmount as guardrails. SECURITY: this tool holds spending keys and launches the process you name — use only in trusted local environments.",
108
+ inputSchema: X402PayToolSchema,
109
+ handler: async (input) => {
110
+ const result = await x402PayTool(input);
111
+ return { content: [{ type: "text", text: JSON.stringify(result) }] };
112
+ },
113
+ };
114
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/x402-pay-tool/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ import * as z from "zod";
2
+ /**
3
+ * Call a TOOL on another MCP server and, if it answers with an x402 payment challenge, pay it
4
+ * and retry — the MCP-transport twin of `x402_pay` (which pays HTTP urls).
5
+ *
6
+ * Same credentials and per-family keys as `x402_pay`; only the envelope differs. See
7
+ * `specs/transports-v2/mcp.md`.
8
+ */
9
+ export declare const X402PayToolSchema: z.ZodObject<{
10
+ server: z.ZodObject<{
11
+ command: z.ZodString;
12
+ args: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
13
+ env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
14
+ }, "strip", z.ZodTypeAny, {
15
+ command: string;
16
+ args?: string[] | undefined;
17
+ env?: Record<string, string> | undefined;
18
+ }, {
19
+ command: string;
20
+ args?: string[] | undefined;
21
+ env?: Record<string, string> | undefined;
22
+ }>;
23
+ toolName: z.ZodString;
24
+ arguments: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
25
+ apiKey: z.ZodOptional<z.ZodString>;
26
+ walletId: z.ZodOptional<z.ZodString>;
27
+ privateKey: z.ZodOptional<z.ZodString>;
28
+ tronKey: z.ZodOptional<z.ZodString>;
29
+ svmSecret: z.ZodOptional<z.ZodString>;
30
+ utxoWif: z.ZodOptional<z.ZodString>;
31
+ kaspaKey: z.ZodOptional<z.ZodString>;
32
+ xrpSeed: z.ZodOptional<z.ZodString>;
33
+ allowedNetworks: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
34
+ maxAmount: z.ZodOptional<z.ZodString>;
35
+ buyerBaseUrl: z.ZodOptional<z.ZodString>;
36
+ }, "strip", z.ZodTypeAny, {
37
+ server: {
38
+ command: string;
39
+ args?: string[] | undefined;
40
+ env?: Record<string, string> | undefined;
41
+ };
42
+ toolName: string;
43
+ apiKey?: string | undefined;
44
+ walletId?: string | undefined;
45
+ privateKey?: string | undefined;
46
+ tronKey?: string | undefined;
47
+ svmSecret?: string | undefined;
48
+ utxoWif?: string | undefined;
49
+ kaspaKey?: string | undefined;
50
+ xrpSeed?: string | undefined;
51
+ allowedNetworks?: string[] | undefined;
52
+ buyerBaseUrl?: string | undefined;
53
+ maxAmount?: string | undefined;
54
+ arguments?: Record<string, unknown> | undefined;
55
+ }, {
56
+ server: {
57
+ command: string;
58
+ args?: string[] | undefined;
59
+ env?: Record<string, string> | undefined;
60
+ };
61
+ toolName: string;
62
+ apiKey?: string | undefined;
63
+ walletId?: string | undefined;
64
+ privateKey?: string | undefined;
65
+ tronKey?: string | undefined;
66
+ svmSecret?: string | undefined;
67
+ utxoWif?: string | undefined;
68
+ kaspaKey?: string | undefined;
69
+ xrpSeed?: string | undefined;
70
+ allowedNetworks?: string[] | undefined;
71
+ buyerBaseUrl?: string | undefined;
72
+ maxAmount?: string | undefined;
73
+ arguments?: Record<string, unknown> | undefined;
74
+ }>;
75
+ export type X402PayToolInput = z.infer<typeof X402PayToolSchema>;
76
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/tools/x402-pay-tool/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2B5B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC"}
@@ -0,0 +1,33 @@
1
+ import * as z from "zod";
2
+ /**
3
+ * Call a TOOL on another MCP server and, if it answers with an x402 payment challenge, pay it
4
+ * and retry — the MCP-transport twin of `x402_pay` (which pays HTTP urls).
5
+ *
6
+ * Same credentials and per-family keys as `x402_pay`; only the envelope differs. See
7
+ * `specs/transports-v2/mcp.md`.
8
+ */
9
+ export const X402PayToolSchema = z.object({
10
+ // --- which upstream tool to call -------------------------------------------------------
11
+ server: z.object({
12
+ command: z.string().describe("Executable to launch the upstream MCP server, e.g. \"npx\""),
13
+ args: z.array(z.string()).optional().describe("Arguments, e.g. [\"-y\",\"@vendor/their-mcp-server\"]"),
14
+ env: z.record(z.string(), z.string()).optional().describe("Extra env for the upstream process (its own credentials, if it needs any)"),
15
+ }).describe("The upstream MCP server to call, launched over stdio. It is started for this call and shut down afterwards."),
16
+ toolName: z.string().describe("The name of the tool to call on that server"),
17
+ arguments: z.record(z.string(), z.unknown()).optional().describe("Arguments to pass to that tool"),
18
+ // --- credentials (identical to x402_pay) -----------------------------------------------
19
+ apiKey: z.string().optional().describe("Your CryptoAPIs API key with the X402_BUYER feature (used only to call the buyer /authorize). Falls back to the CRYPTOAPIS_API_KEY env var."),
20
+ walletId: z.string().optional().describe("The CryptoAPIs buyer-service wallet RECORD ID (from POST /wallets) — NOT the on-chain address. Falls back to the X402_WALLET_ID env var."),
21
+ // --- per-family signing keys (identical to x402_pay) -----------------------------------
22
+ privateKey: z.string().optional().describe("EVM private key (hex, 0x optional) — signs the eip712 payment, and Tron by default. Falls back to X402_PRIVATE_KEY. SECURITY: trusted local environments only."),
23
+ tronKey: z.string().optional().describe("Tron private key (hex). Falls back to X402_TRON_KEY, then to privateKey/X402_PRIVATE_KEY."),
24
+ svmSecret: z.string().optional().describe("Solana secret key, base58-encoded — signs svm-transaction payments. Falls back to X402_SVM_SECRET."),
25
+ utxoWif: z.string().optional().describe("UTXO private key in WIF format. Falls back to X402_UTXO_WIF."),
26
+ kaspaKey: z.string().optional().describe("Kaspa private key (hex). Falls back to X402_KASPA_KEY."),
27
+ xrpSeed: z.string().optional().describe("XRP secret/seed. Falls back to X402_XRP_SEED."),
28
+ // --- guardrails -------------------------------------------------------------------------
29
+ allowedNetworks: z.array(z.string()).optional().describe("Restrict which CAIP-2 networks to pay on (e.g. [\"eip155:8453\"])"),
30
+ maxAmount: z.string().optional().describe("Safety cap: refuse to pay if the required atomic-unit amount exceeds this"),
31
+ buyerBaseUrl: z.string().url().optional().describe("Override the buyer service base URL (default https://ai.cryptoapis.io/x402/buyer)"),
32
+ });
33
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/tools/x402-pay-tool/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,0FAA0F;IAC1F,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACb,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4DAA4D,CAAC;QAC1F,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;QACtG,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2EAA2E,CAAC;KACzI,CAAC,CAAC,QAAQ,CAAC,6GAA6G,CAAC;IAE1H,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;IAC5E,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;IAElG,0FAA0F;IAC1F,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6IAA6I,CAAC;IACrL,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0IAA0I,CAAC;IAEpL,0FAA0F;IAC1F,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gKAAgK,CAAC;IAC5M,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2FAA2F,CAAC;IACpI,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oGAAoG,CAAC;IAC/I,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8DAA8D,CAAC;IACvG,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC;IAClG,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;IAExF,2FAA2F;IAC3F,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mEAAmE,CAAC;IAC7H,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2EAA2E,CAAC;IACtH,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mFAAmF,CAAC;CAC1I,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cryptoapis-io/mcp-x402-pay",
3
3
  "mcpName": "io.github.CryptoAPIs-io/mcp-x402-pay",
4
- "version": "0.2.0",
4
+ "version": "0.4.0",
5
5
  "description": "MCP server that pays x402-gated HTTP endpoints — one x402_pay tool that fetches, and on a 402 authorizes via the CryptoAPIs buyer service, signs LOCALLY, and retries.",
6
6
  "license": "MIT",
7
7
  "type": "module",
@@ -37,6 +37,7 @@
37
37
  "test": "node -e \"console.log('test: add later')\"",
38
38
  "test:x402-pay": "tsx scripts/test-x402-pay.ts",
39
39
  "clean": "rimraf dist",
40
- "test:x402-pay-families": "tsx scripts/test-x402-pay-families.ts"
40
+ "test:x402-pay-families": "tsx scripts/test-x402-pay-families.ts",
41
+ "test:x402-pay-tool": "tsx scripts/test-x402-pay-tool.ts"
41
42
  }
42
43
  }
package/server.json CHANGED
@@ -6,12 +6,12 @@
6
6
  "url": "https://github.com/CryptoAPIs-io/cryptoapis-mcp-x402-pay",
7
7
  "source": "github"
8
8
  },
9
- "version": "0.2.0",
9
+ "version": "0.4.0",
10
10
  "packages": [
11
11
  {
12
12
  "registryType": "npm",
13
13
  "identifier": "@cryptoapis-io/mcp-x402-pay",
14
- "version": "0.2.0",
14
+ "version": "0.4.0",
15
15
  "transport": {
16
16
  "type": "stdio"
17
17
  }