@cryptoapis-io/mcp-x402-pay 0.3.0 → 0.5.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/dist/tools/index.d.ts +65 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +2 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/payCore.d.ts +92 -0
- package/dist/tools/payCore.d.ts.map +1 -0
- package/dist/tools/payCore.js +209 -0
- package/dist/tools/payCore.js.map +1 -0
- package/dist/tools/x402-pay/index.d.ts +10 -6
- package/dist/tools/x402-pay/index.d.ts.map +1 -1
- package/dist/tools/x402-pay/index.js +58 -188
- package/dist/tools/x402-pay/index.js.map +1 -1
- package/dist/tools/x402-pay-tool/index.d.ts +45 -0
- package/dist/tools/x402-pay-tool/index.d.ts.map +1 -0
- package/dist/tools/x402-pay-tool/index.js +114 -0
- package/dist/tools/x402-pay-tool/index.js.map +1 -0
- package/dist/tools/x402-pay-tool/schema.d.ts +76 -0
- package/dist/tools/x402-pay-tool/schema.d.ts.map +1 -0
- package/dist/tools/x402-pay-tool/schema.js +33 -0
- package/dist/tools/x402-pay-tool/schema.js.map +1 -0
- package/package.json +4 -3
- package/server.json +2 -2
package/dist/tools/index.d.ts
CHANGED
|
@@ -64,5 +64,70 @@ export declare const tools: readonly [import("./types.js").McpX402ToolDef<import
|
|
|
64
64
|
limit?: number | undefined;
|
|
65
65
|
offset?: number | undefined;
|
|
66
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;
|
|
67
132
|
}>>];
|
|
68
133
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAA2D,CAAC"}
|
package/dist/tools/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { x402PayTool } from "./x402-pay/index.js";
|
|
2
2
|
import { x402DiscoverTool } from "./x402-discover/index.js";
|
|
3
|
-
|
|
3
|
+
import { x402PayToolDef } from "./x402-pay-tool/index.js";
|
|
4
|
+
export const tools = [x402PayTool, x402DiscoverTool, x402PayToolDef];
|
|
4
5
|
//# sourceMappingURL=index.js.map
|
package/dist/tools/index.js.map
CHANGED
|
@@ -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;
|
|
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,CA+HvB;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,209 @@
|
|
|
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
|
+
// `accepted` is Required in x402 v2 (§5.2.2) and carries scheme/network; a v1 merchant
|
|
174
|
+
// instead matches on the top-level fields. Emit both so a merchant reading either shape
|
|
175
|
+
// pairs the payment with the requirement it actually offered. Shared by the HTTP payer
|
|
176
|
+
// and the MCP tool payer, so neither transport can drift from the other.
|
|
177
|
+
return {
|
|
178
|
+
ok: true,
|
|
179
|
+
requirements,
|
|
180
|
+
paymentPayload: {
|
|
181
|
+
x402Version: X402_VERSION,
|
|
182
|
+
scheme: SCHEME_EXACT,
|
|
183
|
+
network: network,
|
|
184
|
+
accepted: { ...requirements },
|
|
185
|
+
payload: payload,
|
|
186
|
+
},
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Resolve the per-family signing keys from explicit params, then env.
|
|
191
|
+
*
|
|
192
|
+
* Tron falls back to the EVM key (same secp256k1 curve); the others have no safe fallback,
|
|
193
|
+
* since a hex key cannot sign a base58/WIF/seed payment.
|
|
194
|
+
*
|
|
195
|
+
* @param input the tool input carrying optional per-family keys
|
|
196
|
+
* @returns the resolved keys
|
|
197
|
+
*/
|
|
198
|
+
export function resolveSigningKeys(input) {
|
|
199
|
+
const evm = input.privateKey ?? process.env.X402_PRIVATE_KEY;
|
|
200
|
+
return {
|
|
201
|
+
evm,
|
|
202
|
+
tron: input.tronKey ?? process.env.X402_TRON_KEY ?? evm,
|
|
203
|
+
svm: input.svmSecret ?? process.env.X402_SVM_SECRET,
|
|
204
|
+
utxo: input.utxoWif ?? process.env.X402_UTXO_WIF,
|
|
205
|
+
kaspa: input.kaspaKey ?? process.env.X402_KASPA_KEY,
|
|
206
|
+
xrp: input.xrpSeed ?? process.env.X402_XRP_SEED,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
//# 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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"}
|
|
@@ -1,12 +1,6 @@
|
|
|
1
1
|
import type { X402PayInput } from "./schema.js";
|
|
2
2
|
import { X402PaySchema } from "./schema.js";
|
|
3
3
|
import type { McpX402ToolDef } from "../types.js";
|
|
4
|
-
/**
|
|
5
|
-
* Fetch a URL and auto-pay a 402 with x402 (EVM eip712 path).
|
|
6
|
-
*
|
|
7
|
-
* @param input the tool input
|
|
8
|
-
* @return the final (paid) response summary
|
|
9
|
-
*/
|
|
10
4
|
/**
|
|
11
5
|
* Is `url` allowed by a host allowlist?
|
|
12
6
|
*
|
|
@@ -19,6 +13,16 @@ import type { McpX402ToolDef } from "../types.js";
|
|
|
19
13
|
* @return true when the url may be paid
|
|
20
14
|
*/
|
|
21
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.
|
|
22
|
+
*
|
|
23
|
+
* @param input the tool input
|
|
24
|
+
* @return the final (paid) response summary
|
|
25
|
+
*/
|
|
22
26
|
export declare function x402Pay(input: X402PayInput): Promise<{
|
|
23
27
|
status: number;
|
|
24
28
|
paid: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/x402-pay/index.ts"],"names":[],"mappings":"
|
|
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;AAkBD;;;;;;;;;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,CA8ED;AAED,eAAO,MAAM,WAAW,EAAE,cAAc,CAAC,OAAO,aAAa,CAS5D,CAAC"}
|
|
@@ -1,47 +1,5 @@
|
|
|
1
|
-
import { evmSignTypedData, svmPartialSign, tronSignFromDetails, utxoSignFromDetails, kaspaSignFromDetails, xrpSignFromDetails, } from "@cryptoapis-io/mcp-signer";
|
|
2
1
|
import { X402PaySchema } from "./schema.js";
|
|
3
|
-
|
|
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;
|
|
36
|
-
}
|
|
37
|
-
return accepts[0] ?? null;
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Fetch a URL and auto-pay a 402 with x402 (EVM eip712 path).
|
|
41
|
-
*
|
|
42
|
-
* @param input the tool input
|
|
43
|
-
* @return the final (paid) response summary
|
|
44
|
-
*/
|
|
2
|
+
import { buildPaymentForChallenge, resolveSigningKeys } from "../payCore.js";
|
|
45
3
|
/**
|
|
46
4
|
* Is `url` allowed by a host allowlist?
|
|
47
5
|
*
|
|
@@ -68,11 +26,34 @@ export function isHostAllowed(url, allowed) {
|
|
|
68
26
|
return e.startsWith(".") ? host === e.slice(1) || host.endsWith(e) : host === e;
|
|
69
27
|
});
|
|
70
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* Decode the base64 `PAYMENT-REQUIRED` header into the x402 v2 PaymentRequired challenge.
|
|
31
|
+
* Null when absent or malformed, so the v1 body fallback still applies.
|
|
32
|
+
*
|
|
33
|
+
* @param headerValue the raw header value
|
|
34
|
+
* @return the decoded challenge, or null
|
|
35
|
+
*/
|
|
36
|
+
function decodePaymentRequired(headerValue) {
|
|
37
|
+
if (!headerValue)
|
|
38
|
+
return null;
|
|
39
|
+
try {
|
|
40
|
+
return JSON.parse(Buffer.from(headerValue, "base64").toString("utf8"));
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Fetch a URL and auto-pay a 402 with x402.
|
|
48
|
+
*
|
|
49
|
+
* The authorize → sign → build-payload half lives in `payCore` and is SHARED with the
|
|
50
|
+
* MCP-tool payer (`x402_pay_tool`); only the HTTP envelope is here — the 402 status, the
|
|
51
|
+
* base64 `X-PAYMENT` header, and the `X-PAYMENT-RESPONSE` receipt.
|
|
52
|
+
*
|
|
53
|
+
* @param input the tool input
|
|
54
|
+
* @return the final (paid) response summary
|
|
55
|
+
*/
|
|
71
56
|
export async function x402Pay(input) {
|
|
72
|
-
// Credentials: prefer the per-call params, else fall back to env (set once in the
|
|
73
|
-
// MCP config so the agent only ever passes `url` — and the key stays out of logs).
|
|
74
|
-
// apiKey + walletId are always needed (to call /authorize); the SIGNING key is
|
|
75
|
-
// resolved per-family at the dispatch below (each chain uses its own key form).
|
|
76
57
|
// Host allowlist FIRST — before credentials, before any fetch. This tool holds spending
|
|
77
58
|
// keys and will pay whatever url it is handed, so a url the operator never sanctioned
|
|
78
59
|
// must not even be contacted. Resolved from the param OR X402_ALLOWED_HOSTS so an
|
|
@@ -88,22 +69,14 @@ export async function x402Pay(input) {
|
|
|
88
69
|
body: "",
|
|
89
70
|
};
|
|
90
71
|
}
|
|
72
|
+
// Credentials: prefer the per-call params, else fall back to env (set once in the
|
|
73
|
+
// MCP config so the agent only ever passes `url` — and the key stays out of logs).
|
|
91
74
|
const apiKey = input.apiKey ?? process.env.CRYPTOAPIS_API_KEY;
|
|
92
75
|
const walletId = input.walletId ?? process.env.X402_WALLET_ID;
|
|
93
76
|
if (!apiKey || !walletId) {
|
|
94
77
|
const missing = [!apiKey && "apiKey/CRYPTOAPIS_API_KEY", !walletId && "walletId/X402_WALLET_ID"].filter(Boolean).join(", ");
|
|
95
78
|
return { status: 0, paid: false, reason: `missing credentials: ${missing} (pass as params or set the env vars)`, body: "" };
|
|
96
79
|
}
|
|
97
|
-
// Per-family signing keys (param → family env → EVM fallback where the curve allows).
|
|
98
|
-
const evmKey = input.privateKey ?? process.env.X402_PRIVATE_KEY;
|
|
99
|
-
const keys = {
|
|
100
|
-
evm: evmKey,
|
|
101
|
-
tron: input.tronKey ?? process.env.X402_TRON_KEY ?? evmKey,
|
|
102
|
-
svm: input.svmSecret ?? process.env.X402_SVM_SECRET,
|
|
103
|
-
utxo: input.utxoWif ?? process.env.X402_UTXO_WIF,
|
|
104
|
-
kaspa: input.kaspaKey ?? process.env.X402_KASPA_KEY,
|
|
105
|
-
xrp: input.xrpSeed ?? process.env.X402_XRP_SEED,
|
|
106
|
-
};
|
|
107
80
|
const method = input.method ?? "GET";
|
|
108
81
|
const baseInit = {
|
|
109
82
|
method,
|
|
@@ -114,142 +87,39 @@ export async function x402Pay(input) {
|
|
|
114
87
|
if (first.status !== 402) {
|
|
115
88
|
return { status: first.status, paid: false, body: await first.text() };
|
|
116
89
|
}
|
|
90
|
+
// x402 v2 carries the challenge in the PAYMENT-REQUIRED header and treats the response
|
|
91
|
+
// body as a server implementation concern (a conforming merchant may send no body at
|
|
92
|
+
// all); v1 put it in the body. Read the header first, fall back to the body.
|
|
117
93
|
const body402 = await first.json().catch(() => null);
|
|
118
|
-
const
|
|
119
|
-
const
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
method: "POST",
|
|
130
|
-
headers: { "content-type": "application/json", "x-api-key": apiKey },
|
|
131
|
-
body: JSON.stringify({ paymentRequirements: requirements, walletId: walletId }),
|
|
94
|
+
const fromHeader = decodePaymentRequired(first.headers.get("payment-required"));
|
|
95
|
+
const built = await buildPaymentForChallenge({
|
|
96
|
+
accepts: Array.isArray(fromHeader?.accepts) && fromHeader.accepts.length > 0
|
|
97
|
+
? fromHeader.accepts
|
|
98
|
+
: (Array.isArray(body402?.accepts) ? body402.accepts : []),
|
|
99
|
+
apiKey: apiKey,
|
|
100
|
+
walletId: walletId,
|
|
101
|
+
keys: resolveSigningKeys(input),
|
|
102
|
+
allowedNetworks: input.allowedNetworks,
|
|
103
|
+
maxAmount: input.maxAmount,
|
|
104
|
+
buyerBaseUrl: input.buyerBaseUrl,
|
|
132
105
|
});
|
|
133
|
-
if (!
|
|
134
|
-
return { status: 402, paid: false, reason:
|
|
106
|
+
if (!built.ok) {
|
|
107
|
+
return { status: 402, paid: false, reason: built.reason, body: JSON.stringify(body402 ?? {}) };
|
|
135
108
|
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
}
|
|
140
|
-
// 2. Sign LOCALLY + build the PaymentPayload. The WIRE scheme is ALWAYS "exact"
|
|
141
|
-
// (family carried by `network`); the /authorize `scheme` says HOW to sign. Every
|
|
142
|
-
// family's facilitator parsePayload reads `payload.transaction` first — so the
|
|
143
|
-
// non-EVM families use a uniform `payload:{transaction}` wrapper, with the
|
|
144
|
-
// per-family value the facilitator expects (SVM base64, UTXO/XRP hex, Kaspa JSON,
|
|
145
|
-
// Tron the structured {txID, raw_data_hex, raw_data, signature[]} object).
|
|
146
|
-
const network = requirements.network;
|
|
147
|
-
// Gate off families that are wired but not yet live-verified (Tron/UTXO/XRP/Kaspa).
|
|
148
|
-
// EVM + Solana are supported today; the rest are on the roadmap ("coming soon").
|
|
149
|
-
if (!auth.scheme || !SUPPORTED_SCHEMES.has(auth.scheme)) {
|
|
150
|
-
return {
|
|
151
|
-
status: 402,
|
|
152
|
-
paid: false,
|
|
153
|
-
reason: `family_not_yet_supported: the "${auth.scheme}" family is coming soon — only EVM (eip712) and Solana (svm-transaction) are supported today`,
|
|
154
|
-
body: "",
|
|
155
|
-
};
|
|
156
|
-
}
|
|
157
|
-
const sp = auth.signingPayload ?? {};
|
|
158
|
-
let payload;
|
|
159
|
-
/** Guard: a family whose signing key wasn't configured errors cleanly (never mis-signs). */
|
|
160
|
-
const needKey = (key, envName) => (key ? null : `no signing key for ${auth.scheme} — set ${envName} (or the matching param)`);
|
|
161
|
-
if (auth.scheme === "eip712") {
|
|
162
|
-
const missing = needKey(keys.evm, "X402_PRIVATE_KEY");
|
|
163
|
-
if (missing)
|
|
164
|
-
return { status: 402, paid: false, reason: missing, body: "" };
|
|
165
|
-
const td = sp;
|
|
166
|
-
const { signature } = await evmSignTypedData({
|
|
167
|
-
action: "sign-typed-data",
|
|
168
|
-
privateKey: keys.evm,
|
|
169
|
-
domain: td.domain,
|
|
170
|
-
types: td.types,
|
|
171
|
-
primaryType: td.primaryType,
|
|
172
|
-
message: td.message,
|
|
173
|
-
});
|
|
174
|
-
payload = { signature, authorization: td.message };
|
|
175
|
-
}
|
|
176
|
-
else if (auth.scheme === "svm-transaction") {
|
|
177
|
-
const missing = needKey(keys.svm, "X402_SVM_SECRET");
|
|
178
|
-
if (missing)
|
|
179
|
-
return { status: 402, paid: false, reason: missing, body: "" };
|
|
180
|
-
const { transaction } = svmPartialSign({
|
|
181
|
-
action: "partial-sign",
|
|
182
|
-
secretKeyBase58: keys.svm,
|
|
183
|
-
transaction: sp.transaction,
|
|
184
|
-
});
|
|
185
|
-
payload = { transaction };
|
|
186
|
-
}
|
|
187
|
-
else if (auth.scheme === "tron-transaction") {
|
|
188
|
-
const missing = needKey(keys.tron, "X402_TRON_KEY");
|
|
189
|
-
if (missing)
|
|
190
|
-
return { status: 402, paid: false, reason: missing, body: "" };
|
|
191
|
-
const { signedTransaction } = tronSignFromDetails({
|
|
192
|
-
action: "sign-from-details",
|
|
193
|
-
privateKey: keys.tron,
|
|
194
|
-
transaction: sp.transaction,
|
|
195
|
-
});
|
|
196
|
-
// Tron's facilitator wants the structured {txID, raw_data_hex, raw_data, signature[]}.
|
|
197
|
-
payload = { transaction: signedTransaction };
|
|
198
|
-
}
|
|
199
|
-
else if (auth.scheme === "utxo-transaction") {
|
|
200
|
-
const missing = needKey(keys.utxo, "X402_UTXO_WIF");
|
|
201
|
-
if (missing)
|
|
202
|
-
return { status: 402, paid: false, reason: missing, body: "" };
|
|
203
|
-
const chain = UTXO_CAIP2[network];
|
|
204
|
-
if (!chain)
|
|
205
|
-
return { status: 402, paid: false, reason: `unknown UTXO network ${network}`, body: "" };
|
|
206
|
-
const { signedTransactionHex } = utxoSignFromDetails({
|
|
207
|
-
action: "sign-from-details",
|
|
208
|
-
blockchain: chain.blockchain,
|
|
209
|
-
network: chain.network,
|
|
210
|
-
privateKeys: [keys.utxo],
|
|
211
|
-
preparedTransaction: sp.preparedTransaction,
|
|
212
|
-
});
|
|
213
|
-
payload = { transaction: signedTransactionHex };
|
|
214
|
-
}
|
|
215
|
-
else if (auth.scheme === "kaspa-transaction") {
|
|
216
|
-
const missing = needKey(keys.kaspa, "X402_KASPA_KEY");
|
|
217
|
-
if (missing)
|
|
218
|
-
return { status: 402, paid: false, reason: missing, body: "" };
|
|
219
|
-
const { signedTransaction } = kaspaSignFromDetails({
|
|
220
|
-
action: "sign-from-details",
|
|
221
|
-
privateKeys: [keys.kaspa],
|
|
222
|
-
preparedTransaction: sp.preparedTransaction,
|
|
223
|
-
});
|
|
224
|
-
payload = { transaction: signedTransaction };
|
|
225
|
-
}
|
|
226
|
-
else if (auth.scheme === "xrp-transaction") {
|
|
227
|
-
const missing = needKey(keys.xrp, "X402_XRP_SEED");
|
|
228
|
-
if (missing)
|
|
229
|
-
return { status: 402, paid: false, reason: missing, body: "" };
|
|
230
|
-
const { signedTransactionHex } = await xrpSignFromDetails({
|
|
231
|
-
action: "sign-from-details",
|
|
232
|
-
secret: keys.xrp,
|
|
233
|
-
transaction: sp.transaction,
|
|
234
|
-
});
|
|
235
|
-
payload = { transaction: signedTransactionHex };
|
|
236
|
-
}
|
|
237
|
-
else {
|
|
238
|
-
return { status: 402, paid: false, reason: `unsupported_scheme: ${auth.scheme}`, body: "" };
|
|
239
|
-
}
|
|
240
|
-
const paymentPayload = {
|
|
241
|
-
x402Version: X402_VERSION,
|
|
242
|
-
scheme: SCHEME_EXACT,
|
|
243
|
-
network: network,
|
|
244
|
-
payload: payload,
|
|
245
|
-
};
|
|
246
|
-
// 3. Retry the ORIGINAL request with the X-PAYMENT header.
|
|
247
|
-
const xPayment = Buffer.from(JSON.stringify(paymentPayload), "utf8").toString("base64");
|
|
109
|
+
// Retry the ORIGINAL request with the X-PAYMENT header. HTTP carries the payload as a
|
|
110
|
+
// base64 header value; MCP carries the same object as structured JSON (see x402_pay_tool).
|
|
111
|
+
const credential = Buffer.from(JSON.stringify(built.paymentPayload), "utf8").toString("base64");
|
|
248
112
|
const paid = await fetch(input.url, {
|
|
249
113
|
...baseInit,
|
|
250
|
-
|
|
114
|
+
// Both header names carry the SAME value: PAYMENT-SIGNATURE for a v2 merchant,
|
|
115
|
+
// X-PAYMENT for a v1 one. Each reads the one it knows and ignores the other.
|
|
116
|
+
headers: {
|
|
117
|
+
...baseInit.headers,
|
|
118
|
+
"payment-signature": credential,
|
|
119
|
+
"x-payment": credential,
|
|
120
|
+
},
|
|
251
121
|
});
|
|
252
|
-
const paymentResponse = paid.headers.get("x-payment-response");
|
|
122
|
+
const paymentResponse = paid.headers.get("payment-response") ?? paid.headers.get("x-payment-response");
|
|
253
123
|
return {
|
|
254
124
|
status: paid.status,
|
|
255
125
|
paid: paid.status >= 200 && paid.status < 300,
|
|
@@ -259,7 +129,7 @@ export async function x402Pay(input) {
|
|
|
259
129
|
}
|
|
260
130
|
export const x402PayTool = {
|
|
261
131
|
name: "x402_pay",
|
|
262
|
-
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 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.",
|
|
132
|
+
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.",
|
|
263
133
|
inputSchema: X402PaySchema,
|
|
264
134
|
handler: async (input) => {
|
|
265
135
|
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":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAE7E;;;;;;;;;;GAUG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW,EAAE,OAAiB;IACxD,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACD,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAC,CAAC,mCAAmC;IACrD,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;QAC1B,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,IAAI,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QACrB,OAAO,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;AACP,CAAC;AAED;;;;;;GAMG;AACH,SAAS,qBAAqB,CAAC,WAA0B;IACrD,IAAI,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IAC9B,IAAI,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3E,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,KAAmB;IAG7C,wFAAwF;IACxF,sFAAsF;IACtF,kFAAkF;IAClF,uFAAuF;IACvF,oFAAoF;IACpF,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY;WAChC,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAChG,IAAI,YAAY,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,CAAC;QACrF,OAAO;YACH,MAAM,EAAE,CAAC;YACT,IAAI,EAAE,KAAK;YACX,MAAM,EAAE,qBAAqB,KAAK,CAAC,GAAG,6BAA6B,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;YAC7F,IAAI,EAAE,EAAE;SACX,CAAC;IACN,CAAC;IAED,kFAAkF;IAClF,mFAAmF;IACnF,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IAC9D,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAC9D,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,IAAI,2BAA2B,EAAE,CAAC,QAAQ,IAAI,yBAAyB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5H,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,wBAAwB,OAAO,uCAAuC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IAChI,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC;IACrC,MAAM,QAAQ,GAAgB;QAC1B,MAAM;QACN,OAAO,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE;QACrC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtD,CAAC;IAEF,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC/C,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACvB,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;IAC3E,CAAC;IAED,uFAAuF;IACvF,qFAAqF;IACrF,6EAA6E;IAC7E,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAA+C,CAAC;IACnG,MAAM,UAAU,GAAG,qBAAqB,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAChF,MAAM,KAAK,GAAG,MAAM,wBAAwB,CAAC;QACzC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;YACxE,CAAC,CAAC,UAAU,CAAC,OAAO;YACpB,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,MAAM,EAAE,MAAM;QACd,QAAQ,EAAE,QAAQ;QAClB,IAAI,EAAE,kBAAkB,CAAC,KAAK,CAAC;QAC/B,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,YAAY,EAAE,KAAK,CAAC,YAAY;KACnC,CAAC,CAAC;IACH,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;QACZ,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC;IACnG,CAAC;IAED,sFAAsF;IACtF,2FAA2F;IAC3F,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAChG,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE;QAChC,GAAG,QAAQ;QACX,+EAA+E;QAC/E,6EAA6E;QAC7E,OAAO,EAAE;YACL,GAAI,QAAQ,CAAC,OAAkC;YAC/C,mBAAmB,EAAE,UAAU;YAC/B,WAAW,EAAE,UAAU;SAC1B;KACJ,CAAC,CAAC;IACH,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IACvG,OAAO;QACH,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,IAAI,EAAE,IAAI,CAAC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG;QAC7C,IAAI,EAAE,MAAM,IAAI,CAAC,IAAI,EAAE;QACvB,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;KAChH,CAAC;AACN,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAyC;IAC7D,IAAI,EAAE,UAAU;IAChB,WAAW,EACP,q3CAAq3C;IACz3C,WAAW,EAAE,aAAa;IAC1B,OAAO,EAAE,KAAK,EAAE,KAAmB,EAAE,EAAE;QACnC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;QACpC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;IACzE,CAAC;CACJ,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.
|
|
4
|
+
"version": "0.5.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",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
23
23
|
"ethers": "^6.13.0",
|
|
24
24
|
"zod": "^3.25.0",
|
|
25
|
-
"@cryptoapis-io/mcp-shared": "0.3.
|
|
25
|
+
"@cryptoapis-io/mcp-shared": "0.3.2",
|
|
26
26
|
"@cryptoapis-io/mcp-signer": "0.4.0"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
@@ -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.
|
|
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.
|
|
14
|
+
"version": "0.4.0",
|
|
15
15
|
"transport": {
|
|
16
16
|
"type": "stdio"
|
|
17
17
|
}
|