@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.
Files changed (54) hide show
  1. package/README.md +54 -4
  2. package/bin/hpp-x402-channel.js +5 -0
  3. package/bin/hpp-x402-keychain.js +5 -0
  4. package/bin/hpp-x402-policy.js +5 -0
  5. package/bin/x402-mcp-bridge.js +0 -0
  6. package/dist/a2a.d.ts +70 -0
  7. package/dist/a2a.js +210 -0
  8. package/dist/a2a.js.map +1 -0
  9. package/dist/autoSettlePickup.d.ts +69 -0
  10. package/dist/autoSettlePickup.js +150 -0
  11. package/dist/autoSettlePickup.js.map +1 -0
  12. package/dist/cli/channel.d.ts +1 -0
  13. package/dist/cli/channel.js +330 -0
  14. package/dist/cli/channel.js.map +1 -0
  15. package/dist/cli/install-claude.d.ts +2 -20
  16. package/dist/cli/install-claude.js +12 -63
  17. package/dist/cli/install-claude.js.map +1 -1
  18. package/dist/cli/install-mcp-host.d.ts +35 -0
  19. package/dist/cli/install-mcp-host.js +82 -0
  20. package/dist/cli/install-mcp-host.js.map +1 -0
  21. package/dist/cli/install-openclaw.d.ts +7 -0
  22. package/dist/cli/install-openclaw.js +28 -0
  23. package/dist/cli/install-openclaw.js.map +1 -0
  24. package/dist/cli/keychain.d.ts +1 -0
  25. package/dist/cli/keychain.js +147 -0
  26. package/dist/cli/keychain.js.map +1 -0
  27. package/dist/cli/policy.d.ts +1 -0
  28. package/dist/cli/policy.js +219 -0
  29. package/dist/cli/policy.js.map +1 -0
  30. package/dist/cli/safe.d.ts +4111 -9519
  31. package/dist/cli/setup.js +23 -1
  32. package/dist/cli/setup.js.map +1 -1
  33. package/dist/client.d.ts +19 -8
  34. package/dist/client.js +118 -0
  35. package/dist/client.js.map +1 -1
  36. package/dist/config.d.ts +4 -4
  37. package/dist/config.js +11 -5
  38. package/dist/config.js.map +1 -1
  39. package/dist/httpX402.d.ts +39 -0
  40. package/dist/httpX402.js +208 -0
  41. package/dist/httpX402.js.map +1 -0
  42. package/dist/index.js +43 -14
  43. package/dist/index.js.map +1 -1
  44. package/dist/keychain.d.ts +23 -0
  45. package/dist/keychain.js +111 -0
  46. package/dist/keychain.js.map +1 -0
  47. package/dist/policy.d.ts +73 -0
  48. package/dist/policy.js +249 -0
  49. package/dist/policy.js.map +1 -0
  50. package/dist/server.d.ts +15 -1
  51. package/dist/server.js +154 -10
  52. package/dist/server.js.map +1 -1
  53. package/docs/policy.md +101 -0
  54. 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
- else {
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} \\`);
@@ -1 +1 @@
1
- {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"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"}
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
  },
@@ -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;AAKxD,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAoB/B,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAqB;IACzD,MAAM,IAAI,GAAG,IAAI,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;IAEhF,MAAM,IAAI,GAAG,kCAAkC,CAC7C,IAAI,EACJ;QACE,OAAO,EAAE;YACP;gBACE,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,MAAM,EAAE,IAAI,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;aACpD;SACF;KACF,EACD;QACE,WAAW,EAAE,IAAI;QACjB,kBAAkB,EAAE,KAAK,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE;YAChD,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;YAC5C,IAAI,CAAC,MAAM;gBAAE,OAAO,KAAK,CAAC;YAE1B,MAAM,cAAc,GAAG,MAAM,CAAE,MAA8B,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC;YAC7E,GAAG,CAAC,IAAI,CAAC,mBAAmB,EAAE;gBAC5B,MAAM,EAAE,cAAc,CAAC,QAAQ,EAAE;gBACjC,KAAK,EAAG,MAA6B,CAAC,KAAK;gBAC3C,OAAO,EAAG,MAA+B,CAAC,OAAO;aAClD,CAAC,CAAC;YAEH,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;gBAC3D,IAAI,MAAM,EAAE,CAAC;oBACX,GAAG,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBACxF,CAAC;qBAAM,CAAC;oBACN,GAAG,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;gBACtD,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,GAAG,CAAC,KAAK,CAAC,kBAAkB,EAAE;oBAC5B,GAAG,EAAG,GAAa,CAAC,OAAO;oBAC3B,cAAc,EAAE,cAAc,CAAC,QAAQ,EAAE;iBAC1C,CAAC,CAAC;gBACH,OAAO,KAAK,CAAC,CAAC,2CAA2C;YAC3D,CAAC;QACH,CAAC;KACF,CACF,CAAC;IAEF,MAAM,SAAS,GAAG,IAAI,kBAAkB,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5D,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC9B,GAAG,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAElD,OAAO;QACL,IAAI;QACJ,IAAI;QACJ,KAAK,CAAC,KAAK;YACT,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACrC,CAAC;KACF,CAAC;AACJ,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
- // NOTE: PoC accepts the raw key. Future signers (keychain, server-wallet)
13
- // will short-circuit this field.
14
- DELEGATE_PRIVATE_KEY: z.string().regex(HEX_KEY, "expected 0x + 64 hex chars"),
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
- RESOURCE_SERVER_URL: z.string().url(),
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.
@@ -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;AAEtC,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IACtB,qEAAqE;IACrE,0EAA0E;IAC1E,iCAAiC;IACjC,oBAAoB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,4BAA4B,CAAC;IAE7E,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,8CAA8C;IAC9C,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;IAErC,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"}
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>;
@@ -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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"}