@hpp-io/x402-mcp-bridge 0.0.1 → 0.0.2
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 +54 -4
- package/bin/hpp-x402-channel.js +5 -0
- package/bin/hpp-x402-keychain.js +5 -0
- package/bin/hpp-x402-policy.js +5 -0
- package/bin/x402-mcp-bridge.js +0 -0
- package/dist/a2a.d.ts +70 -0
- package/dist/a2a.js +210 -0
- package/dist/a2a.js.map +1 -0
- package/dist/autoSettlePickup.d.ts +69 -0
- package/dist/autoSettlePickup.js +150 -0
- package/dist/autoSettlePickup.js.map +1 -0
- package/dist/cli/channel.d.ts +1 -0
- package/dist/cli/channel.js +330 -0
- package/dist/cli/channel.js.map +1 -0
- package/dist/cli/install-claude.d.ts +2 -20
- package/dist/cli/install-claude.js +12 -63
- package/dist/cli/install-claude.js.map +1 -1
- package/dist/cli/install-mcp-host.d.ts +35 -0
- package/dist/cli/install-mcp-host.js +82 -0
- package/dist/cli/install-mcp-host.js.map +1 -0
- package/dist/cli/install-openclaw.d.ts +7 -0
- package/dist/cli/install-openclaw.js +28 -0
- package/dist/cli/install-openclaw.js.map +1 -0
- package/dist/cli/keychain.d.ts +1 -0
- package/dist/cli/keychain.js +147 -0
- package/dist/cli/keychain.js.map +1 -0
- package/dist/cli/policy.d.ts +1 -0
- package/dist/cli/policy.js +219 -0
- package/dist/cli/policy.js.map +1 -0
- package/dist/cli/safe.d.ts +4111 -9519
- package/dist/cli/setup.js +23 -1
- package/dist/cli/setup.js.map +1 -1
- package/dist/client.d.ts +19 -8
- package/dist/client.js +118 -0
- package/dist/client.js.map +1 -1
- package/dist/config.d.ts +4 -4
- package/dist/config.js +11 -5
- package/dist/config.js.map +1 -1
- package/dist/httpX402.d.ts +39 -0
- package/dist/httpX402.js +208 -0
- package/dist/httpX402.js.map +1 -0
- package/dist/index.js +43 -14
- package/dist/index.js.map +1 -1
- package/dist/keychain.d.ts +23 -0
- package/dist/keychain.js +111 -0
- package/dist/keychain.js.map +1 -0
- package/dist/policy.d.ts +73 -0
- package/dist/policy.js +249 -0
- package/dist/policy.js.map +1 -0
- package/dist/server.d.ts +15 -1
- package/dist/server.js +154 -10
- package/dist/server.js.map +1 -1
- package/docs/policy.md +101 -0
- package/package.json +12 -5
package/dist/cli/setup.js
CHANGED
|
@@ -29,6 +29,7 @@
|
|
|
29
29
|
* --delegate-pk 0x... (optional; auto-generates if omitted)
|
|
30
30
|
* --resource-server-url https://... (default localhost:4021/mcp/sse)
|
|
31
31
|
* --install-claude (also write claude_desktop_config.json)
|
|
32
|
+
* --install-openclaw (also write ~/.openclaw/openclaw.json)
|
|
32
33
|
*/
|
|
33
34
|
import { parseUnits, parseEther, } from "viem";
|
|
34
35
|
import { privateKeyToAccount, generatePrivateKey } from "viem/accounts";
|
|
@@ -102,6 +103,7 @@ async function main() {
|
|
|
102
103
|
const resourceServerUrl = args["resource-server-url"] ||
|
|
103
104
|
"http://localhost:4021/mcp/sse";
|
|
104
105
|
const installClaude = args["install-claude"] === true;
|
|
106
|
+
const installOpenClaw = args["install-openclaw"] === true;
|
|
105
107
|
let delegatePk = args["delegate-pk"];
|
|
106
108
|
let delegateGenerated = false;
|
|
107
109
|
if (!delegatePk) {
|
|
@@ -214,8 +216,28 @@ async function main() {
|
|
|
214
216
|
console.error(" Use the env block above to merge manually.");
|
|
215
217
|
}
|
|
216
218
|
}
|
|
217
|
-
|
|
219
|
+
if (installOpenClaw) {
|
|
220
|
+
console.log("\n[install-openclaw] Writing to OpenClaw config…");
|
|
221
|
+
const { installOpenClaw: doInstall } = await import("./install-openclaw.js");
|
|
222
|
+
try {
|
|
223
|
+
const r = doInstall(envBlock, {
|
|
224
|
+
force: true,
|
|
225
|
+
});
|
|
226
|
+
console.log(` config: ${r.configPath}`);
|
|
227
|
+
if (r.backupPath)
|
|
228
|
+
console.log(` backup: ${r.backupPath}`);
|
|
229
|
+
console.log(` preserved entries: ${r.preservedEntries.length}`);
|
|
230
|
+
console.log(` changed: ${r.changed}`);
|
|
231
|
+
console.log("\n ✓ Restart OpenClaw to load the new MCP server.");
|
|
232
|
+
}
|
|
233
|
+
catch (err) {
|
|
234
|
+
console.error(" ✗ install-openclaw failed:", err.message);
|
|
235
|
+
console.error(" Use the env block above to merge manually.");
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
if (!installClaude && !installOpenClaw) {
|
|
218
239
|
console.log("\nTo merge into Claude Desktop automatically, re-run with --install-claude.");
|
|
240
|
+
console.log("To merge into OpenClaw automatically, re-run with --install-openclaw.");
|
|
219
241
|
console.log("To start the bridge manually:");
|
|
220
242
|
console.log(` RESOURCE_SERVER_URL=${resourceServerUrl} \\`);
|
|
221
243
|
console.log(` DELEGATE_PRIVATE_KEY=${delegatePk} \\`);
|
package/dist/cli/setup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"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"}
|
package/dist/client.d.ts
CHANGED
|
@@ -1,13 +1,6 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Upstream MCP client. Connects to the remote x402 MCP server (the
|
|
3
|
-
* "seller") and wraps it with @x402/mcp's payment middleware.
|
|
4
|
-
*
|
|
5
|
-
* The middleware handles the 402 → sign → retry cycle. We hook into its
|
|
6
|
-
* `onPaymentRequested` callback to run autoTopup before each payment so
|
|
7
|
-
* the delegate EOA holds enough USDC.e to sign the EIP-3009 authorization.
|
|
8
|
-
*/
|
|
9
1
|
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
10
2
|
import { wrapMCPClientWithPaymentFromConfig } from "@x402/mcp";
|
|
3
|
+
import { BatchSettlementEvmScheme } from "@x402/evm/batch-settlement/client";
|
|
11
4
|
import type { Network } from "@x402/core/types";
|
|
12
5
|
import type { AutoTopup } from "./autoTopup.js";
|
|
13
6
|
import { RawEoaSigner } from "./signers/raw-eoa.js";
|
|
@@ -16,6 +9,24 @@ export interface UpstreamClient {
|
|
|
16
9
|
base: Client;
|
|
17
10
|
/** Payment-aware wrapper — callTool goes here. */
|
|
18
11
|
x402: ReturnType<typeof wrapMCPClientWithPaymentFromConfig>;
|
|
12
|
+
/**
|
|
13
|
+
* batch-settlement scheme instance — F-3a auto-refund needs to
|
|
14
|
+
* call `.refund(url, {amount})` when a paid compute times out and
|
|
15
|
+
* the server reports the job failed.
|
|
16
|
+
*/
|
|
17
|
+
batchScheme: BatchSettlementEvmScheme;
|
|
18
|
+
/**
|
|
19
|
+
* Resource server URL the bridge is talking to. F-3a refund uses
|
|
20
|
+
* this as the target URL passed to `batchScheme.refund(...)`.
|
|
21
|
+
*/
|
|
22
|
+
serverUrl: string;
|
|
23
|
+
/**
|
|
24
|
+
* Most recent payment amount the selector accepted, in atomic
|
|
25
|
+
* units. F-3a's refund needs this to know how much to ask back —
|
|
26
|
+
* the SDK doesn't surface it through onAfterPayment cleanly.
|
|
27
|
+
* Updated by `paymentRequirementsSelector` on every 402 → sign.
|
|
28
|
+
*/
|
|
29
|
+
lastPaymentAmount(): bigint | null;
|
|
19
30
|
/** Disconnect and free resources. */
|
|
20
31
|
close(): Promise<void>;
|
|
21
32
|
}
|
package/dist/client.js
CHANGED
|
@@ -6,20 +6,87 @@
|
|
|
6
6
|
* `onPaymentRequested` callback to run autoTopup before each payment so
|
|
7
7
|
* the delegate EOA holds enough USDC.e to sign the EIP-3009 authorization.
|
|
8
8
|
*/
|
|
9
|
+
import { homedir } from "node:os";
|
|
10
|
+
import { resolve } from "node:path";
|
|
9
11
|
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
10
12
|
import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js";
|
|
11
13
|
import { wrapMCPClientWithPaymentFromConfig } from "@x402/mcp";
|
|
12
14
|
import { ExactEvmScheme } from "@x402/evm/exact/client";
|
|
15
|
+
import { BatchSettlementEvmScheme, processSettleResponse, } from "@x402/evm/batch-settlement/client";
|
|
16
|
+
// @x402/evm 2.13.0 moved FileClientChannelStorage into its own subpath.
|
|
17
|
+
import { FileClientChannelStorage } from "@x402/evm/batch-settlement/client/file-storage";
|
|
13
18
|
import { log } from "./log.js";
|
|
19
|
+
/**
|
|
20
|
+
* Root directory for persisted batch-settlement client state.
|
|
21
|
+
*
|
|
22
|
+
* The SDK's `FileClientChannelStorage` writes one JSON per channel under
|
|
23
|
+
* `{root}/client/{channelId}.json` and uses cross-process file locks so
|
|
24
|
+
* concurrent bridge instances (e.g., Claude Desktop + OpenClaw on the same
|
|
25
|
+
* machine sharing a delegate EOA) can mutate the same channel safely.
|
|
26
|
+
*
|
|
27
|
+
* Override with `HPP_X402_HOME` for test isolation or non-standard layouts.
|
|
28
|
+
*/
|
|
29
|
+
const CHANNEL_STORAGE_ROOT = process.env.HPP_X402_HOME ?? resolve(homedir(), ".hpp-x402");
|
|
14
30
|
export async function connectUpstream(opts) {
|
|
15
31
|
const base = new Client({ name: opts.bridgeName, version: opts.bridgeVersion });
|
|
32
|
+
const channelStorage = new FileClientChannelStorage({
|
|
33
|
+
directory: CHANNEL_STORAGE_ROOT,
|
|
34
|
+
});
|
|
35
|
+
log.info("channelStorage.configured", { directory: CHANNEL_STORAGE_ROOT });
|
|
36
|
+
// Single batch-settlement scheme instance — referenced by both the
|
|
37
|
+
// payment middleware and F-3a's auto-refund poller (via UpstreamClient
|
|
38
|
+
// surface). Sharing the instance keeps storage consistent — the same
|
|
39
|
+
// FileClientChannelStorage backs voucher signing AND refund signing.
|
|
40
|
+
const batchScheme = new BatchSettlementEvmScheme(opts.signer.viemAccount, {
|
|
41
|
+
storage: channelStorage,
|
|
42
|
+
});
|
|
43
|
+
// Track the last accepted payment amount so F-3a knows how much to
|
|
44
|
+
// refund on a failed compute. The selector callback below assigns
|
|
45
|
+
// it; the UpstreamClient surface reads it.
|
|
46
|
+
let lastPaymentAmountAtomic = null;
|
|
16
47
|
const x402 = wrapMCPClientWithPaymentFromConfig(base, {
|
|
48
|
+
// batch-settlement preferred when offered. Explicit selector keeps the
|
|
49
|
+
// choice visible in logs (the SDK's default would silently pick the
|
|
50
|
+
// first server accept; explicit lets us see what the bridge saw and
|
|
51
|
+
// why it picked).
|
|
17
52
|
schemes: [
|
|
53
|
+
{
|
|
54
|
+
network: opts.network,
|
|
55
|
+
// payerAuthorizer defaults to signer.address (Q-3: delegate EOA
|
|
56
|
+
// self-signs vouchers — no Safe EIP-1271 round-trip per call).
|
|
57
|
+
client: batchScheme,
|
|
58
|
+
},
|
|
18
59
|
{
|
|
19
60
|
network: opts.network,
|
|
20
61
|
client: new ExactEvmScheme(opts.signer.viemAccount),
|
|
21
62
|
},
|
|
22
63
|
],
|
|
64
|
+
paymentRequirementsSelector: (_x402Version, accepts) => {
|
|
65
|
+
// Default: prefer batch-settlement when the server offers it. Fall back
|
|
66
|
+
// to whatever's first otherwise (legacy exact-only servers).
|
|
67
|
+
// Demo/override: HPP_X402_PREFER_EXACT=true forces the `exact` scheme
|
|
68
|
+
// (e.g. to show wallet balance deltas live). Falls back to first accept
|
|
69
|
+
// if the server doesn't offer exact.
|
|
70
|
+
const preferExact = process.env.HPP_X402_PREFER_EXACT === "true";
|
|
71
|
+
const batch = accepts.find((a) => a.scheme === "batch-settlement");
|
|
72
|
+
const exact = accepts.find((a) => a.scheme === "exact");
|
|
73
|
+
const picked = preferExact ? (exact ?? accepts[0]) : (batch ?? accepts[0]);
|
|
74
|
+
const amountStr = picked.amount;
|
|
75
|
+
if (amountStr) {
|
|
76
|
+
try {
|
|
77
|
+
lastPaymentAmountAtomic = BigInt(amountStr);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// amount unparseable — leave previous value, log already covers selecting
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
log.info("scheme.selecting", {
|
|
84
|
+
offered: accepts.map((a) => a.scheme),
|
|
85
|
+
picked: picked.scheme,
|
|
86
|
+
amount: amountStr,
|
|
87
|
+
});
|
|
88
|
+
return picked;
|
|
89
|
+
},
|
|
23
90
|
}, {
|
|
24
91
|
autoPayment: true,
|
|
25
92
|
onPaymentRequested: async ({ paymentRequired }) => {
|
|
@@ -51,12 +118,63 @@ export async function connectUpstream(opts) {
|
|
|
51
118
|
}
|
|
52
119
|
},
|
|
53
120
|
});
|
|
121
|
+
// Persist channel state after every paid call. The SDK's HTTP transport
|
|
122
|
+
// does this through `processPaymentResponse(storage, getHeader)` which
|
|
123
|
+
// parses the PAYMENT-RESPONSE header; MCP transport routes the same
|
|
124
|
+
// settle payload through tool result meta (extractPaymentResponseFromMeta
|
|
125
|
+
// → afterPaymentHooks ctx.settleResponse) but the SDK's BatchSettlement
|
|
126
|
+
// schemeHooks.onPaymentResponse is *not* invoked by the MCP wrapper
|
|
127
|
+
// (only manual afterPaymentHooks are). Without this we never write
|
|
128
|
+
// {balance, totalClaimed, chargedCumulativeAmount, signedMaxClaimable,
|
|
129
|
+
// signature} back to the channel context, and the next call signs a
|
|
130
|
+
// voucher against stale state — triggering
|
|
131
|
+
// `invalid_batch_settlement_evm_cumulative_amount_mismatch`. Pending
|
|
132
|
+
// upstream MCP wrapper fix: x402-foundation/x402#2387.
|
|
133
|
+
x402.onAfterPayment(async ({ settleResponse }) => {
|
|
134
|
+
if (!settleResponse || !settleResponse.success)
|
|
135
|
+
return;
|
|
136
|
+
// Auto-deposit visibility: when the SDK bundles an onchain deposit
|
|
137
|
+
// with this call (channel was low on balance), the settle response
|
|
138
|
+
// carries a transaction hash AND the post-deposit balance. Compare
|
|
139
|
+
// against the previously-persisted balance to surface a clear log.
|
|
140
|
+
const extra = settleResponse
|
|
141
|
+
.extra?.channelState;
|
|
142
|
+
if (extra?.channelId && extra.balance !== undefined && settleResponse.transaction) {
|
|
143
|
+
try {
|
|
144
|
+
const prior = await channelStorage.get(extra.channelId.toLowerCase());
|
|
145
|
+
const priorBalance = BigInt(prior?.balance ?? "0");
|
|
146
|
+
const newBalance = BigInt(extra.balance);
|
|
147
|
+
if (newBalance > priorBalance) {
|
|
148
|
+
log.info("batch.channel.deposited", {
|
|
149
|
+
channelId: extra.channelId,
|
|
150
|
+
depositedAmount: (newBalance - priorBalance).toString(),
|
|
151
|
+
balanceAfter: extra.balance,
|
|
152
|
+
txHash: settleResponse.transaction,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
// best-effort log — never block payment on this
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
try {
|
|
161
|
+
await processSettleResponse(channelStorage, settleResponse);
|
|
162
|
+
}
|
|
163
|
+
catch (err) {
|
|
164
|
+
log.error("batch.settleResponse.persist_failed", {
|
|
165
|
+
err: err.message,
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
});
|
|
54
169
|
const transport = new SSEClientTransport(new URL(opts.url));
|
|
55
170
|
await base.connect(transport);
|
|
56
171
|
log.info("upstream.connected", { url: opts.url });
|
|
57
172
|
return {
|
|
58
173
|
base,
|
|
59
174
|
x402,
|
|
175
|
+
batchScheme,
|
|
176
|
+
serverUrl: opts.url,
|
|
177
|
+
lastPaymentAmount: () => lastPaymentAmountAtomic,
|
|
60
178
|
async close() {
|
|
61
179
|
await base.close().catch(() => { });
|
|
62
180
|
},
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,EAAE,kCAAkC,EAAE,MAAM,WAAW,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -6,11 +6,11 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { z } from "zod";
|
|
8
8
|
declare const Schema: z.ZodObject<{
|
|
9
|
-
DELEGATE_PRIVATE_KEY: z.ZodString
|
|
9
|
+
DELEGATE_PRIVATE_KEY: z.ZodEffects<z.ZodString, string, string>;
|
|
10
10
|
SAFE_ADDRESS: z.ZodString;
|
|
11
11
|
ALLOWANCE_MODULE_ADDRESS: z.ZodString;
|
|
12
12
|
USDCE_ADDRESS: z.ZodString;
|
|
13
|
-
RESOURCE_SERVER_URL: z.ZodString
|
|
13
|
+
RESOURCE_SERVER_URL: z.ZodOptional<z.ZodString>;
|
|
14
14
|
HPP_RPC_URL: z.ZodString;
|
|
15
15
|
HPP_NETWORK: z.ZodString;
|
|
16
16
|
TOPUP_AMOUNT_ATOMIC: z.ZodOptional<z.ZodString>;
|
|
@@ -21,20 +21,20 @@ declare const Schema: z.ZodObject<{
|
|
|
21
21
|
SAFE_ADDRESS: string;
|
|
22
22
|
ALLOWANCE_MODULE_ADDRESS: string;
|
|
23
23
|
USDCE_ADDRESS: string;
|
|
24
|
-
RESOURCE_SERVER_URL: string;
|
|
25
24
|
HPP_RPC_URL: string;
|
|
26
25
|
HPP_NETWORK: string;
|
|
27
26
|
TOPUP_HEADROOM_X: string;
|
|
28
27
|
LOG_LEVEL: "off" | "info" | "debug";
|
|
28
|
+
RESOURCE_SERVER_URL?: string | undefined;
|
|
29
29
|
TOPUP_AMOUNT_ATOMIC?: string | undefined;
|
|
30
30
|
}, {
|
|
31
31
|
DELEGATE_PRIVATE_KEY: string;
|
|
32
32
|
SAFE_ADDRESS: string;
|
|
33
33
|
ALLOWANCE_MODULE_ADDRESS: string;
|
|
34
34
|
USDCE_ADDRESS: string;
|
|
35
|
-
RESOURCE_SERVER_URL: string;
|
|
36
35
|
HPP_RPC_URL: string;
|
|
37
36
|
HPP_NETWORK: string;
|
|
37
|
+
RESOURCE_SERVER_URL?: string | undefined;
|
|
38
38
|
TOPUP_AMOUNT_ATOMIC?: string | undefined;
|
|
39
39
|
TOPUP_HEADROOM_X?: string | undefined;
|
|
40
40
|
LOG_LEVEL?: "off" | "info" | "debug" | undefined;
|
package/dist/config.js
CHANGED
|
@@ -7,19 +7,25 @@
|
|
|
7
7
|
import { z } from "zod";
|
|
8
8
|
const HEX_ADDR = /^0x[0-9a-fA-F]{40}$/;
|
|
9
9
|
const HEX_KEY = /^0x[0-9a-fA-F]{64}$/;
|
|
10
|
+
const KEYCHAIN_URI = /^keychain:\/\/[^\/]+\/[a-zA-Z0-9._-]+$/;
|
|
10
11
|
const Schema = z.object({
|
|
11
12
|
// Delegate EOA — signs EIP-3009 payments + executeAllowanceTransfer.
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
|
|
13
|
+
// Accepted forms:
|
|
14
|
+
// - 0x + 64 hex chars (raw key, dev / quickstart)
|
|
15
|
+
// - keychain://hpp-x402/<account> (resolved via @napi-rs/keyring at startup)
|
|
16
|
+
DELEGATE_PRIVATE_KEY: z
|
|
17
|
+
.string()
|
|
18
|
+
.refine((v) => HEX_KEY.test(v) || KEYCHAIN_URI.test(v), "expected 0x + 64 hex chars OR keychain://hpp-x402/<account>"),
|
|
15
19
|
// Safe wallet that holds the user's USDC.e.
|
|
16
20
|
SAFE_ADDRESS: z.string().regex(HEX_ADDR),
|
|
17
21
|
// Deployed AllowanceModule.
|
|
18
22
|
ALLOWANCE_MODULE_ADDRESS: z.string().regex(HEX_ADDR),
|
|
19
23
|
// Asset paid in (USDC.e on HPP).
|
|
20
24
|
USDCE_ADDRESS: z.string().regex(HEX_ADDR),
|
|
21
|
-
// Remote MCP server we proxy to (the seller).
|
|
22
|
-
|
|
25
|
+
// Remote MCP server we proxy to (the seller). Optional: when unset the
|
|
26
|
+
// bridge runs in local-tools-only mode (e.g. credit top-up / A2A) and skips
|
|
27
|
+
// the upstream connection entirely.
|
|
28
|
+
RESOURCE_SERVER_URL: z.string().url().optional(),
|
|
23
29
|
// Chain RPC.
|
|
24
30
|
HPP_RPC_URL: z.string().url(),
|
|
25
31
|
// CAIP-2 network identifier used by @x402/evm.
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,QAAQ,GAAG,qBAAqB,CAAC;AACvC,MAAM,OAAO,GAAG,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,QAAQ,GAAG,qBAAqB,CAAC;AACvC,MAAM,OAAO,GAAG,qBAAqB,CAAC;AACtC,MAAM,YAAY,GAAG,wCAAwC,CAAC;AAE9D,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IACtB,qEAAqE;IACrE,kBAAkB;IAClB,oDAAoD;IACpD,+EAA+E;IAC/E,oBAAoB,EAAE,CAAC;SACpB,MAAM,EAAE;SACR,MAAM,CACL,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAC9C,6DAA6D,CAC9D;IAEH,4CAA4C;IAC5C,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC;IAExC,4BAA4B;IAC5B,wBAAwB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC;IAEpD,iCAAiC;IACjC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC;IAEzC,uEAAuE;IACvE,4EAA4E;IAC5E,oCAAoC;IACpC,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IAEhD,aAAa;IACb,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;IAE7B,+CAA+C;IAC/C,sEAAsE;IACtE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC;IAE7C,wEAAwE;IACxE,oEAAoE;IACpE,oEAAoE;IACpE,2DAA2D;IAC3D,mBAAmB,EAAE,CAAC;SACnB,MAAM,EAAE;SACR,KAAK,CAAC,OAAO,CAAC;SACd,QAAQ,EAAE;IAEb,oEAAoE;IACpE,kEAAkE;IAClE,4BAA4B;IAC5B,gBAAgB,EAAE,CAAC;SAChB,MAAM,EAAE;SACR,KAAK,CAAC,OAAO,CAAC;SACd,QAAQ,EAAE;SACV,OAAO,CAAC,IAAI,CAAC;IAEhB,4EAA4E;IAC5E,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;CACvE,CAAC,CAAC;AAMH,MAAM,UAAU,UAAU,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC7D,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM;aAC/B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,QAAQ,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;aAC/D,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,MAAM,IAAI,KAAK,CACb,4CAA4C,GAAG,MAAM,GAAG,IAAI,CAC7D,CAAC;IACJ,CAAC;IACD,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC;IACtB,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,OAAO,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { Network } from "@x402/core/types";
|
|
2
|
+
import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
|
|
3
|
+
import type { AutoTopup } from "./autoTopup.js";
|
|
4
|
+
import type { RawEoaSigner } from "./signers/raw-eoa.js";
|
|
5
|
+
export interface HttpX402Deps {
|
|
6
|
+
signer: RawEoaSigner;
|
|
7
|
+
network: Network;
|
|
8
|
+
/** Ensure the delegate holds enough USDC.e before paying. */
|
|
9
|
+
autoTopup?: AutoTopup;
|
|
10
|
+
}
|
|
11
|
+
export declare const X402_HTTP_TOOL: {
|
|
12
|
+
readonly name: "x402_http_call";
|
|
13
|
+
readonly description: string;
|
|
14
|
+
readonly inputSchema: {
|
|
15
|
+
readonly type: "object";
|
|
16
|
+
readonly properties: {
|
|
17
|
+
readonly url: {
|
|
18
|
+
readonly type: "string";
|
|
19
|
+
readonly description: "Target endpoint URL (host must be allow-listed).";
|
|
20
|
+
};
|
|
21
|
+
readonly method: {
|
|
22
|
+
readonly type: "string";
|
|
23
|
+
readonly description: "HTTP method (default POST).";
|
|
24
|
+
};
|
|
25
|
+
readonly body: {
|
|
26
|
+
readonly type: "object";
|
|
27
|
+
readonly description: "JSON request body (for POST/PUT/...).";
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
readonly required: readonly ["url"];
|
|
31
|
+
readonly additionalProperties: false;
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
export interface X402HttpArgs {
|
|
35
|
+
url: string;
|
|
36
|
+
method?: string;
|
|
37
|
+
body?: unknown;
|
|
38
|
+
}
|
|
39
|
+
export declare function x402HttpCall(deps: HttpX402Deps, args: X402HttpArgs): Promise<CallToolResult>;
|
package/dist/httpX402.js
ADDED
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic HTTP x402 tool for the bridge.
|
|
3
|
+
*
|
|
4
|
+
* Like `pay_a2a_agent`, this is a *local* tool (not forwarded upstream):
|
|
5
|
+
* it lets the host call an x402-protected HTTP endpoint. The first use is
|
|
6
|
+
* HPP Hub credit top-up (`POST /api/web3/credit/topup`), but nothing here
|
|
7
|
+
* is Hub-specific — the per-host auth header + spend limits come from the
|
|
8
|
+
* generic policy (see ./policy.ts), so any "x402 + auth header" service
|
|
9
|
+
* works with one policy entry and no code change.
|
|
10
|
+
*
|
|
11
|
+
* Flow (mirrors a2a.ts: gate → spend-cap → sign → re-send):
|
|
12
|
+
* 1. pre-flight guard: host allowlist + https (policy.checkAccess)
|
|
13
|
+
* 2. inject auth headers from local policy (policy.resolveCredentials)
|
|
14
|
+
* 3. unpaid fetch; non-402 → passthrough (e.g. GET usage)
|
|
15
|
+
* 4. parse 402 → pick the (exact, ourNetwork) accept (a2a.pickExactAccept)
|
|
16
|
+
* 5. per-call amount cap (policy.checkAmount)
|
|
17
|
+
* 6. autoTopup the delegate from the Safe (reused)
|
|
18
|
+
* 7. sign exact payload, encode Payment-Signature, re-send
|
|
19
|
+
*
|
|
20
|
+
* Secrets (api keys) never travel through tool args — only `{url, method,
|
|
21
|
+
* body}` come from the host/LLM. Identity is the X-Api-Key injected locally.
|
|
22
|
+
*/
|
|
23
|
+
import { x402Client, x402HTTPClient } from "@x402/core/client";
|
|
24
|
+
import { ExactEvmScheme } from "@x402/evm/exact/client";
|
|
25
|
+
import { pickExactAccept } from "./a2a.js";
|
|
26
|
+
import { loadPolicy, checkAccess, checkAmount, resolveCredentials, checkCooldown, recordPaid, acquireHostLock, } from "./policy.js";
|
|
27
|
+
import { log } from "./log.js";
|
|
28
|
+
export const X402_HTTP_TOOL = {
|
|
29
|
+
name: "x402_http_call",
|
|
30
|
+
description: "Call an x402-protected HTTP endpoint and return its response. Payment " +
|
|
31
|
+
"(USDC.e) is handled automatically with your wallet, subject to the daily " +
|
|
32
|
+
"spend cap; per-host auth headers come from local policy (you do NOT pass " +
|
|
33
|
+
"keys). Only allow-listed hosts can be called. Use for paid HTTP APIs and " +
|
|
34
|
+
"account actions such as Hub credit top-up " +
|
|
35
|
+
"(POST <hub>/api/web3/credit/topup {amount}) and usage checks " +
|
|
36
|
+
"(GET <hub>/api/web3/credit/usage).",
|
|
37
|
+
inputSchema: {
|
|
38
|
+
type: "object",
|
|
39
|
+
properties: {
|
|
40
|
+
url: { type: "string", description: "Target endpoint URL (host must be allow-listed)." },
|
|
41
|
+
method: { type: "string", description: "HTTP method (default POST)." },
|
|
42
|
+
body: { type: "object", description: "JSON request body (for POST/PUT/...)." },
|
|
43
|
+
},
|
|
44
|
+
required: ["url"],
|
|
45
|
+
additionalProperties: false,
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
function errorResult(text) {
|
|
49
|
+
return { content: [{ type: "text", text }], isError: true };
|
|
50
|
+
}
|
|
51
|
+
async function toToolResult(res) {
|
|
52
|
+
const text = await res.text();
|
|
53
|
+
let parsed = text;
|
|
54
|
+
try {
|
|
55
|
+
parsed = JSON.parse(text);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
/* keep raw text */
|
|
59
|
+
}
|
|
60
|
+
return {
|
|
61
|
+
content: [
|
|
62
|
+
{ type: "text", text: JSON.stringify({ status: res.status, ok: res.ok, body: parsed }) },
|
|
63
|
+
],
|
|
64
|
+
isError: !res.ok,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
export async function x402HttpCall(deps, args) {
|
|
68
|
+
const url = args.url;
|
|
69
|
+
if (!url || typeof url !== "string")
|
|
70
|
+
return errorResult("url required");
|
|
71
|
+
const method = (args.method ?? "POST").toUpperCase();
|
|
72
|
+
const policy = loadPolicy();
|
|
73
|
+
// 1. pre-flight guard — host allowlist + https (③ / H1·C1)
|
|
74
|
+
const access = checkAccess(policy, url);
|
|
75
|
+
if (!access.ok)
|
|
76
|
+
return errorResult(`blocked: ${access.error}`);
|
|
77
|
+
const host = new URL(url).host.toLowerCase();
|
|
78
|
+
// 2. inject auth headers from local policy (② — never from args/LLM)
|
|
79
|
+
let authHeaders;
|
|
80
|
+
try {
|
|
81
|
+
authHeaders = resolveCredentials(policy, host);
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
return errorResult(err.message);
|
|
85
|
+
}
|
|
86
|
+
const baseHeaders = { "Content-Type": "application/json", ...authHeaders };
|
|
87
|
+
const init = {
|
|
88
|
+
method,
|
|
89
|
+
headers: baseHeaders,
|
|
90
|
+
body: method === "GET" || method === "HEAD" ? undefined : JSON.stringify(args.body ?? {}),
|
|
91
|
+
};
|
|
92
|
+
// 3. unpaid request — non-402 passes through (e.g. GET /usage 200)
|
|
93
|
+
let res;
|
|
94
|
+
try {
|
|
95
|
+
res = await fetch(url, init);
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
return errorResult(`request failed: ${err.message}`);
|
|
99
|
+
}
|
|
100
|
+
if (res.status !== 402)
|
|
101
|
+
return toToolResult(res);
|
|
102
|
+
// Paid path. Serialize per host so two near-simultaneous calls can't both
|
|
103
|
+
// pay (closes the cooldown's check-then-act race); combined with the
|
|
104
|
+
// cooldown below this dedupes agent-retry / heartbeat double-fire.
|
|
105
|
+
const release = acquireHostLock(host);
|
|
106
|
+
if (!release) {
|
|
107
|
+
log.info("x402_http_call.locked", { host });
|
|
108
|
+
return {
|
|
109
|
+
content: [
|
|
110
|
+
{ type: "text", text: JSON.stringify({ inProgress: true, retry: true, message: `payment to ${host} already in progress` }) },
|
|
111
|
+
],
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
try {
|
|
115
|
+
// H2 idempotency: if we paid this host within its cooldown window, return
|
|
116
|
+
// the previous result instead of paying again.
|
|
117
|
+
const cd = checkCooldown(host, access.limits.cooldownMs);
|
|
118
|
+
if (cd.throttled) {
|
|
119
|
+
let previous = cd.cachedResult;
|
|
120
|
+
try {
|
|
121
|
+
previous = JSON.parse(cd.cachedResult ?? "null");
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
/* keep raw */
|
|
125
|
+
}
|
|
126
|
+
log.info("x402_http_call.cooldown", { host, remainingMs: cd.remainingMs });
|
|
127
|
+
return {
|
|
128
|
+
content: [
|
|
129
|
+
{ type: "text", text: JSON.stringify({ cooldown: true, retryAfterMs: cd.remainingMs, previous }) },
|
|
130
|
+
],
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
// x402 client — also parses the 402 (v2 header / v1 body) and signs.
|
|
134
|
+
const client = new x402Client().register(deps.network, new ExactEvmScheme(deps.signer.viemAccount));
|
|
135
|
+
const httpClient = new x402HTTPClient(client);
|
|
136
|
+
// Parse 402 requirements. x402 v2 carries them in the PAYMENT-REQUIRED
|
|
137
|
+
// header (body is the v1 fallback) — getPaymentRequiredResponse handles
|
|
138
|
+
// those. Some servers (incl. HPP Hub) instead return v2-shaped requirements
|
|
139
|
+
// directly in the JSON body; fall back to that when the SDK parser rejects.
|
|
140
|
+
const body = (await res.json().catch(() => undefined));
|
|
141
|
+
let required;
|
|
142
|
+
try {
|
|
143
|
+
required = httpClient.getPaymentRequiredResponse((name) => res.headers.get(name), body);
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
if (body && Array.isArray(body.accepts)) {
|
|
147
|
+
required = body;
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
return errorResult("no x402 payment requirements found (header or body)");
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
const accept = pickExactAccept(required, deps.network);
|
|
154
|
+
if (!accept) {
|
|
155
|
+
return errorResult(`no "exact" accept for network ${deps.network} ` +
|
|
156
|
+
`(offered: ${JSON.stringify((required.accepts ?? []).map((a) => ({ scheme: a.scheme, network: a.network })))})`);
|
|
157
|
+
}
|
|
158
|
+
const narrowedRequired = { ...required, accepts: [accept] };
|
|
159
|
+
const amount = BigInt(accept.amount ?? "0");
|
|
160
|
+
// per-call amount cap — before pulling any funds
|
|
161
|
+
const deny = checkAmount(access.limits, amount);
|
|
162
|
+
if (deny)
|
|
163
|
+
return errorResult(`blocked: ${deny}`);
|
|
164
|
+
// autoTopup the delegate from the Safe (reused; same spend-cap gate)
|
|
165
|
+
if (deps.autoTopup) {
|
|
166
|
+
try {
|
|
167
|
+
await deps.autoTopup.ensure(amount);
|
|
168
|
+
}
|
|
169
|
+
catch (err) {
|
|
170
|
+
return errorResult(`autoTopup failed (spend cap?): ${err.message}`);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
// sign exact payload + encode Payment-Signature header
|
|
174
|
+
let payHeaders;
|
|
175
|
+
try {
|
|
176
|
+
const payload = await httpClient.createPaymentPayload(narrowedRequired);
|
|
177
|
+
payHeaders = httpClient.encodePaymentSignatureHeader(payload);
|
|
178
|
+
}
|
|
179
|
+
catch (err) {
|
|
180
|
+
return errorResult(`failed to sign payment: ${err.message}`);
|
|
181
|
+
}
|
|
182
|
+
// re-send with payment + preserved auth headers
|
|
183
|
+
let paid;
|
|
184
|
+
try {
|
|
185
|
+
paid = await fetch(url, { ...init, headers: { ...baseHeaders, ...payHeaders } });
|
|
186
|
+
}
|
|
187
|
+
catch (err) {
|
|
188
|
+
return errorResult(`paid request failed: ${err.message}`);
|
|
189
|
+
}
|
|
190
|
+
const result = await toToolResult(paid);
|
|
191
|
+
// Record only successful paid calls so the cooldown gate can dedupe
|
|
192
|
+
// retries; a failed settle (isError) stays retryable.
|
|
193
|
+
if (!result.isError) {
|
|
194
|
+
recordPaid(host, result.content[0].text ?? "");
|
|
195
|
+
}
|
|
196
|
+
log.info("x402_http_call.done", {
|
|
197
|
+
host,
|
|
198
|
+
status: paid.status,
|
|
199
|
+
amountAtomic: amount.toString(),
|
|
200
|
+
paid: !result.isError,
|
|
201
|
+
});
|
|
202
|
+
return result;
|
|
203
|
+
}
|
|
204
|
+
finally {
|
|
205
|
+
release();
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=httpX402.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"httpX402.js","sourceRoot":"","sources":["../src/httpX402.ts"],"names":[],"mappings":"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"}
|