@hpp-io/x402-mcp-bridge 0.0.2 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/README.md +146 -123
  2. package/bin/hpp-x402.js +5 -0
  3. package/dist/a2a.d.ts +2 -2
  4. package/dist/a2a.js +14 -6
  5. package/dist/a2a.js.map +1 -1
  6. package/dist/autoTopup.d.ts +4 -1
  7. package/dist/autoTopup.js +4 -0
  8. package/dist/autoTopup.js.map +1 -1
  9. package/dist/cli/channel.d.ts +1 -1
  10. package/dist/cli/channel.js +1 -8
  11. package/dist/cli/channel.js.map +1 -1
  12. package/dist/cli/hpp-x402.d.ts +2 -0
  13. package/dist/cli/hpp-x402.js +377 -0
  14. package/dist/cli/hpp-x402.js.map +1 -0
  15. package/dist/cli/install-claude-code.d.ts +24 -0
  16. package/dist/cli/install-claude-code.js +50 -0
  17. package/dist/cli/install-claude-code.js.map +1 -0
  18. package/dist/cli/install-cursor.d.ts +7 -0
  19. package/dist/cli/install-cursor.js +26 -0
  20. package/dist/cli/install-cursor.js.map +1 -0
  21. package/dist/cli/install-mcp-host.d.ts +2 -2
  22. package/dist/cli/install-mcp-host.js.map +1 -1
  23. package/dist/cli/install-windsurf.d.ts +7 -0
  24. package/dist/cli/install-windsurf.js +37 -0
  25. package/dist/cli/install-windsurf.js.map +1 -0
  26. package/dist/cli/policy.d.ts +1 -1
  27. package/dist/cli/policy.js +1 -8
  28. package/dist/cli/policy.js.map +1 -1
  29. package/dist/cli/revoke.d.ts +1 -1
  30. package/dist/cli/revoke.js +1 -5
  31. package/dist/cli/revoke.js.map +1 -1
  32. package/dist/cli/safe.d.ts +62 -62
  33. package/dist/cli/serve.d.ts +1 -0
  34. package/dist/cli/serve.js +128 -0
  35. package/dist/cli/serve.js.map +1 -0
  36. package/dist/cli/setup.d.ts +1 -1
  37. package/dist/cli/setup.js +1 -5
  38. package/dist/cli/setup.js.map +1 -1
  39. package/dist/client.d.ts +6 -2
  40. package/dist/client.js +34 -15
  41. package/dist/client.js.map +1 -1
  42. package/dist/config.d.ts +71 -15
  43. package/dist/config.js +66 -10
  44. package/dist/config.js.map +1 -1
  45. package/dist/discovery.d.ts +43 -0
  46. package/dist/discovery.js +62 -0
  47. package/dist/discovery.js.map +1 -0
  48. package/dist/discoveryTools.d.ts +75 -0
  49. package/dist/discoveryTools.js +101 -0
  50. package/dist/discoveryTools.js.map +1 -0
  51. package/dist/funds/direct-balance.d.ts +28 -0
  52. package/dist/funds/direct-balance.js +61 -0
  53. package/dist/funds/direct-balance.js.map +1 -0
  54. package/dist/funds.d.ts +32 -0
  55. package/dist/funds.js +2 -0
  56. package/dist/funds.js.map +1 -0
  57. package/dist/httpX402.d.ts +8 -2
  58. package/dist/httpX402.js +26 -13
  59. package/dist/httpX402.js.map +1 -1
  60. package/dist/index.js +66 -11
  61. package/dist/index.js.map +1 -1
  62. package/dist/sellerTools.d.ts +247 -0
  63. package/dist/sellerTools.js +202 -0
  64. package/dist/sellerTools.js.map +1 -0
  65. package/dist/server.d.ts +8 -2
  66. package/dist/server.js +165 -64
  67. package/dist/server.js.map +1 -1
  68. package/dist/spendGuard.d.ts +24 -0
  69. package/dist/spendGuard.js +124 -0
  70. package/dist/spendGuard.js.map +1 -0
  71. package/package.json +13 -12
  72. package/bin/hpp-x402-channel.js +0 -5
  73. package/bin/hpp-x402-keychain.js +0 -5
  74. package/bin/hpp-x402-policy.js +0 -5
  75. package/bin/hpp-x402-safe-revoke.js +0 -5
  76. package/bin/hpp-x402-safe-setup.js +0 -5
  77. package/dist/autoSettlePickup.d.ts +0 -69
  78. package/dist/autoSettlePickup.js +0 -150
  79. package/dist/autoSettlePickup.js.map +0 -1
  80. package/dist/cli/keychain.d.ts +0 -1
  81. package/dist/cli/keychain.js +0 -147
  82. package/dist/cli/keychain.js.map +0 -1
@@ -0,0 +1,377 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * hpp-x402 — unified CLI (Polygon `polygon-agent` style).
4
+ *
5
+ * One entry with subcommands over the scattered per-tool bins:
6
+ * wallet · install · status (setup/fund/policy/pay to follow)
7
+ * The existing bins (hpp-x402-quickstart / -keychain / ...) remain during the
8
+ * transition; this reuses the same lib functions so behavior matches.
9
+ */
10
+ import { Command } from "commander";
11
+ import { privateKeyToAccount, generatePrivateKey } from "viem/accounts";
12
+ import { createPublicClient, http, defineChain, formatUnits, } from "viem";
13
+ import { setKeychain, buildKeychainURI, resolveKeychain, deleteKeychain, } from "../keychain.js";
14
+ import { DiscoveryClient } from "../discovery.js";
15
+ import { hppCall } from "../discoveryTools.js";
16
+ import { RawEoaSigner } from "../signers/raw-eoa.js";
17
+ import { DirectBalance } from "../funds/direct-balance.js";
18
+ import { installClaudeDesktop } from "./install-claude.js";
19
+ import { installOpenClaw } from "./install-openclaw.js";
20
+ import { installCursor } from "./install-cursor.js";
21
+ import { installWindsurf } from "./install-windsurf.js";
22
+ import { installClaudeCode } from "./install-claude-code.js";
23
+ const NETWORKS = {
24
+ "eip155:181228": {
25
+ rpc: "https://sepolia.hpp.io",
26
+ usdc: "0x401eCb1D350407f13ba348573E5630B83638E30D",
27
+ name: "HPP Sepolia",
28
+ chainId: 181228,
29
+ },
30
+ "eip155:190415": {
31
+ rpc: "https://mainnet.hpp.io",
32
+ usdc: "0x401eCb1D350407f13ba348573E5630B83638E30D",
33
+ name: "HPP Mainnet",
34
+ chainId: 190415,
35
+ },
36
+ };
37
+ const DEFAULT_NETWORK = "eip155:181228";
38
+ const DEFAULT_RESOURCE_SERVER = "http://localhost:4021/mcp/sse";
39
+ const ERC20_BALANCE_ABI = [
40
+ {
41
+ type: "function",
42
+ name: "balanceOf",
43
+ inputs: [{ name: "a", type: "address" }],
44
+ outputs: [{ name: "", type: "uint256" }],
45
+ stateMutability: "view",
46
+ },
47
+ ];
48
+ function net(id) {
49
+ const n = NETWORKS[id];
50
+ if (!n)
51
+ throw new Error(`unknown network ${id} (use ${Object.keys(NETWORKS).join(" | ")})`);
52
+ return n;
53
+ }
54
+ function addressFor(account) {
55
+ const key = resolveKeychain(buildKeychainURI(account));
56
+ return privateKeyToAccount(key).address;
57
+ }
58
+ async function usdcBalance(address, netId) {
59
+ const n = net(netId);
60
+ const chain = defineChain({
61
+ id: n.chainId,
62
+ name: n.name,
63
+ nativeCurrency: { name: "Ether", symbol: "ETH", decimals: 18 },
64
+ rpcUrls: { default: { http: [n.rpc] } },
65
+ });
66
+ const pub = createPublicClient({ chain, transport: http(n.rpc) });
67
+ const bal = (await pub.readContract({
68
+ address: n.usdc,
69
+ abi: ERC20_BALANCE_ABI,
70
+ functionName: "balanceOf",
71
+ args: [address],
72
+ }));
73
+ return formatUnits(bal, 6);
74
+ }
75
+ function lightEnv(account, netId, resourceServerUrl) {
76
+ const n = net(netId);
77
+ return {
78
+ DELEGATE_PRIVATE_KEY: buildKeychainURI(account),
79
+ USDCE_ADDRESS: n.usdc,
80
+ RESOURCE_SERVER_URL: resourceServerUrl,
81
+ HPP_RPC_URL: n.rpc,
82
+ HPP_NETWORK: netId,
83
+ LOG_LEVEL: "info",
84
+ };
85
+ }
86
+ const acct = ["-a, --account <name>", "keychain account", "delegate-default"];
87
+ const HOSTS = {
88
+ claude: (e) => installClaudeDesktop(e, { force: true }),
89
+ "claude-code": (e) => installClaudeCode(e, { scope: "user" }),
90
+ cursor: (e) => installCursor(e, { force: true }),
91
+ windsurf: (e) => installWindsurf(e, { force: true }),
92
+ openclaw: (e) => installOpenClaw(e, { force: true }),
93
+ };
94
+ const program = new Command();
95
+ program
96
+ .name("hpp-x402")
97
+ .description("HPP x402 agent wallet + payment CLI")
98
+ .version("0.1.0");
99
+ // ── setup (one-command onboarding) ─────────────────────────────────────
100
+ program
101
+ .command("setup")
102
+ .description("one-command light onboarding: wallet + fund instructions (+ optional --install)")
103
+ .option(...acct)
104
+ .option("-n, --network <id>", "network", DEFAULT_NETWORK)
105
+ .option("--resource-server-url <url>", "x402 MCP resource server", DEFAULT_RESOURCE_SERVER)
106
+ .option("--delegate-pk <key>", "import an existing 0x key instead of generating one")
107
+ .option("--print-key", "emit the raw key instead of a keychain URI (dev only)")
108
+ .option("--install <host>", `also register into an MCP host (${Object.keys(HOSTS).join("|")})`)
109
+ .action((o) => {
110
+ const n = net(o.network);
111
+ let key = o.delegatePk;
112
+ const generated = !key;
113
+ if (!key)
114
+ key = generatePrivateKey();
115
+ const address = privateKeyToAccount(key).address;
116
+ let ref;
117
+ if (o.printKey) {
118
+ ref = key;
119
+ }
120
+ else {
121
+ setKeychain(o.account, key);
122
+ ref = buildKeychainURI(o.account);
123
+ }
124
+ console.log(`network : ${n.name} (${o.network})`);
125
+ console.log(`wallet : ${address}${generated ? " (generated)" : ""}`);
126
+ console.log(`storage : ${o.printKey ? "raw key (dev)" : `keychain (${ref})`}`);
127
+ console.log("");
128
+ console.log(`▶ Fund: send USDC.e to ${address} on ${n.name} — no native gas needed (gasless settlement).`);
129
+ console.log("");
130
+ const env = {
131
+ DELEGATE_PRIVATE_KEY: ref,
132
+ USDCE_ADDRESS: n.usdc,
133
+ RESOURCE_SERVER_URL: o.resourceServerUrl,
134
+ HPP_RPC_URL: n.rpc,
135
+ HPP_NETWORK: o.network,
136
+ LOG_LEVEL: "info",
137
+ };
138
+ if (o.install) {
139
+ const fn = HOSTS[o.install];
140
+ if (!fn)
141
+ throw new Error(`unknown host "${o.install}" (${Object.keys(HOSTS).join("|")})`);
142
+ const r = fn(env);
143
+ if ("ok" in r)
144
+ console.log(r.ok ? "✓ registered with Claude Code" : `✗ ${r.stderr}`);
145
+ else
146
+ console.log(`✓ ${o.install}: ${r.configPath}${r.backupPath ? ` (backup ${r.backupPath})` : ""}`);
147
+ }
148
+ else {
149
+ console.log("MCP host config (paste, or re-run with --install <host>):");
150
+ console.log(JSON.stringify({ mcpServers: { "hpp-x402": { command: "npx", args: ["-y", "@hpp-io/x402-mcp-bridge"], env } } }, null, 2));
151
+ }
152
+ });
153
+ // ── wallet ────────────────────────────────────────────────────────────
154
+ const wallet = program.command("wallet").description("wallet management (OS keychain)");
155
+ wallet
156
+ .command("address")
157
+ .option(...acct)
158
+ .description("print the wallet (delegate) address")
159
+ .action((o) => console.log(addressFor(o.account)));
160
+ wallet
161
+ .command("balance")
162
+ .option(...acct)
163
+ .option("-n, --network <id>", "network", DEFAULT_NETWORK)
164
+ .description("show USDC.e balance")
165
+ .action(async (o) => {
166
+ const addr = addressFor(o.account);
167
+ console.log(`${addr}\n${await usdcBalance(addr, o.network)} USDC.e (${net(o.network).name})`);
168
+ });
169
+ wallet
170
+ .command("generate")
171
+ .option(...acct)
172
+ .description("generate a new delegate key into the keychain")
173
+ .action((o) => {
174
+ const key = generatePrivateKey();
175
+ setKeychain(o.account, key);
176
+ console.log(`generated ${privateKeyToAccount(key).address}\nstored: ${buildKeychainURI(o.account)}`);
177
+ });
178
+ wallet
179
+ .command("import <key>")
180
+ .option(...acct)
181
+ .description("import an existing 0x delegate key into the keychain")
182
+ .action((key, o) => {
183
+ setKeychain(o.account, key);
184
+ console.log(`imported ${privateKeyToAccount(key).address}\nstored: ${buildKeychainURI(o.account)}`);
185
+ });
186
+ wallet
187
+ .command("remove")
188
+ .option(...acct)
189
+ .description("delete the keychain entry")
190
+ .action((o) => {
191
+ console.log(deleteKeychain(o.account) ? `removed ${o.account}` : `not found: ${o.account}`);
192
+ });
193
+ // ── install ───────────────────────────────────────────────────────────
194
+ program
195
+ .command("install <host>")
196
+ .description(`register the bridge into an MCP host (${Object.keys(HOSTS).join("|")})`)
197
+ .option(...acct)
198
+ .option("-n, --network <id>", "network", DEFAULT_NETWORK)
199
+ .option("--resource-server-url <url>", "x402 MCP resource server", DEFAULT_RESOURCE_SERVER)
200
+ .action((host, o) => {
201
+ const fn = HOSTS[host];
202
+ if (!fn)
203
+ throw new Error(`unknown host "${host}" (${Object.keys(HOSTS).join("|")})`);
204
+ const r = fn(lightEnv(o.account, o.network, o.resourceServerUrl));
205
+ if ("ok" in r)
206
+ console.log(r.ok ? "✓ registered with Claude Code (claude mcp add)" : `✗ ${r.stderr}`);
207
+ else
208
+ console.log(`✓ ${host}: ${r.configPath}${r.backupPath ? ` (backup ${r.backupPath})` : ""}`);
209
+ });
210
+ // ── fund ──────────────────────────────────────────────────────────────
211
+ program
212
+ .command("fund")
213
+ .description("show where to send USDC.e to top up the wallet")
214
+ .option(...acct)
215
+ .option("-n, --network <id>", "network", DEFAULT_NETWORK)
216
+ .action(async (o) => {
217
+ const n = net(o.network);
218
+ const addr = addressFor(o.account);
219
+ let bal = "?";
220
+ try {
221
+ bal = await usdcBalance(addr, o.network);
222
+ }
223
+ catch {
224
+ /* leave ? */
225
+ }
226
+ console.log(`Send USDC.e on ${n.name} to:`);
227
+ console.log(` ${addr}`);
228
+ console.log(`token : ${n.usdc}`);
229
+ console.log(`balance : ${bal} USDC.e`);
230
+ console.log(`(no native gas needed — x402 settlement is gasless)`);
231
+ });
232
+ // ── discover (browse curated services) ────────────────────────────────
233
+ const DEFAULT_DISCOVERY_URL = "https://x402-discovery.hpp.io";
234
+ program
235
+ .command("discover [query]")
236
+ .description("browse/search curated x402 services from the HPP discovery directory")
237
+ .option("-t, --type <type>", "http|mcp|a2a|all", "all")
238
+ .option("-n, --network <id>", "CAIP-2 network filter (e.g. eip155:190415)")
239
+ .option("--limit <n>", "max results", "20")
240
+ .option("--url <url>", "discovery base URL", DEFAULT_DISCOVERY_URL)
241
+ .action(async (query, o) => {
242
+ const client = new DiscoveryClient(o.url);
243
+ const results = await client.discover({
244
+ query,
245
+ type: o.type,
246
+ network: o.network,
247
+ limit: Number(o.limit),
248
+ });
249
+ if (!results.length) {
250
+ console.log("(no services found)");
251
+ return;
252
+ }
253
+ for (const r of results) {
254
+ console.log(r.id);
255
+ console.log(` ${r.type} ${r.scheme} price=${r.priceAtomic} (${r.network})`);
256
+ console.log(` ${r.description ?? r.toolName ?? r.resourceUrl}`);
257
+ }
258
+ console.log(`\n${results.length} service(s). Call via an agent with hpp_call({ resourceId }).`);
259
+ });
260
+ // ── call (pay + invoke a discovered service) ──────────────────────────
261
+ program
262
+ .command("call <resourceId>")
263
+ .description("pay + call a discovered service by id (direct terminal payment)")
264
+ .option(...acct)
265
+ .option("-n, --network <id>", "network", DEFAULT_NETWORK)
266
+ .option("--body <json>", "JSON request body / input args")
267
+ .option("--url <url>", "discovery base URL", DEFAULT_DISCOVERY_URL)
268
+ .action(async (resourceId, o) => {
269
+ const n = net(o.network);
270
+ const signer = new RawEoaSigner(resolveKeychain(buildKeychainURI(o.account)));
271
+ const funds = new DirectBalance(signer.address, n.usdc, n.chainId, n.rpc);
272
+ const client = new DiscoveryClient(o.url);
273
+ let body;
274
+ if (o.body) {
275
+ try {
276
+ body = JSON.parse(o.body);
277
+ }
278
+ catch {
279
+ throw new Error("--body must be valid JSON");
280
+ }
281
+ }
282
+ const res = await hppCall({ signer, network: o.network, funds }, client, { resourceId, body });
283
+ const text = (res.content ?? [])
284
+ .map((c) => c.text)
285
+ .filter(Boolean)
286
+ .join("\n");
287
+ if (res.isError) {
288
+ console.error(text);
289
+ process.exit(1);
290
+ }
291
+ console.log(text);
292
+ });
293
+ // ── status ────────────────────────────────────────────────────────────
294
+ program
295
+ .command("status")
296
+ .description("config · wallet balance · server reachability")
297
+ .option(...acct)
298
+ .option("-n, --network <id>", "network", DEFAULT_NETWORK)
299
+ .option("--resource-server-url <url>", "x402 MCP resource server", DEFAULT_RESOURCE_SERVER)
300
+ .action(async (o) => {
301
+ const n = net(o.network);
302
+ console.log(`network : ${n.name} (${o.network})`);
303
+ let addr;
304
+ try {
305
+ addr = addressFor(o.account);
306
+ }
307
+ catch {
308
+ console.log(`wallet : (no key for "${o.account}" — run: hpp-x402 wallet generate)`);
309
+ return;
310
+ }
311
+ console.log(`wallet : ${addr}`);
312
+ try {
313
+ console.log(`balance : ${await usdcBalance(addr, o.network)} USDC.e`);
314
+ }
315
+ catch {
316
+ console.log(`balance : (read failed)`);
317
+ }
318
+ let srv = "unreachable";
319
+ try {
320
+ const origin = new URL(o.resourceServerUrl).origin;
321
+ const ac = new AbortController();
322
+ const t = setTimeout(() => ac.abort(), 4000);
323
+ const res = await fetch(origin, { signal: ac.signal }).catch(() => null);
324
+ clearTimeout(t);
325
+ if (res)
326
+ srv = String(res.status);
327
+ }
328
+ catch {
329
+ /* keep unreachable */
330
+ }
331
+ console.log(`server : ${o.resourceServerUrl} → ${srv}`);
332
+ });
333
+ // Absorbed per-tool scripts — shown in --help; actually dispatched below.
334
+ program.command("policy").description("manage the x402_http_call host policy (show/set/list/unset/defaults)").allowUnknownOption();
335
+ program.command("channel").description("inspect/manage batch-settlement channels (ls/status/refund)").allowUnknownOption();
336
+ program.command("safe").description("Safe (governance) wallet: setup | revoke").allowUnknownOption();
337
+ program.command("serve").description("run a lightweight x402 seller — a paid HTTP endpoint (--pay-to, --handler)").allowUnknownOption();
338
+ // Passthrough groups delegate to the existing scripts, which parse process.argv
339
+ // themselves. Intercept BEFORE commander so their flags aren't consumed, and
340
+ // rewrite argv so each script sees its sub-args starting at index 2.
341
+ async function runPassthrough(modPath, label, subArgs) {
342
+ process.argv = [process.argv[0], label, ...subArgs];
343
+ const m = (await import(modPath));
344
+ await m.run();
345
+ }
346
+ const PASSTHROUGH = {
347
+ policy: { mod: "./policy.js", label: "hpp-x402-policy" },
348
+ channel: { mod: "./channel.js", label: "hpp-x402-channel" },
349
+ serve: { mod: "./serve.js", label: "hpp-x402-serve" },
350
+ };
351
+ const sub = process.argv[2];
352
+ if (sub && sub in PASSTHROUGH) {
353
+ const { mod, label } = PASSTHROUGH[sub];
354
+ runPassthrough(mod, label, process.argv.slice(3)).catch((e) => {
355
+ console.error(`${label} error:`, e?.message ?? e);
356
+ process.exit(1);
357
+ });
358
+ }
359
+ else if (sub === "safe") {
360
+ const action = process.argv[3];
361
+ const map = { setup: "./setup.js", revoke: "./revoke.js" };
362
+ if (!action || !(action in map)) {
363
+ console.log("usage: hpp-x402 safe <setup|revoke> [options]");
364
+ process.exit(action ? 1 : 0);
365
+ }
366
+ runPassthrough(map[action], `hpp-x402-safe-${action}`, process.argv.slice(4)).catch((e) => {
367
+ console.error(`hpp-x402-safe-${action} error:`, e?.message ?? e);
368
+ process.exit(1);
369
+ });
370
+ }
371
+ else {
372
+ program.parseAsync(process.argv).catch((e) => {
373
+ console.error("error:", e?.message ?? e);
374
+ process.exit(1);
375
+ });
376
+ }
377
+ //# sourceMappingURL=hpp-x402.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hpp-x402.js","sourceRoot":"","sources":["../../src/cli/hpp-x402.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { InstallEnv } from "./install-mcp-host.js";
2
+ export interface ClaudeCodeInstallResult {
3
+ /** The full command that was run (for logging; env values may be URIs). */
4
+ command: string;
5
+ ok: boolean;
6
+ stdout: string;
7
+ stderr: string;
8
+ }
9
+ /**
10
+ * Build the argv for `claude mcp add`:
11
+ * mcp add hpp-x402 -s <scope> [-e K=V …] -- npx -y @hpp-io/x402-mcp-bridge
12
+ */
13
+ export declare function buildClaudeMcpAddArgs(env: InstallEnv, opts?: {
14
+ scope?: string;
15
+ entryName?: string;
16
+ bridgeAbsPath?: string;
17
+ }): string[];
18
+ export declare function installClaudeCode(env: InstallEnv, opts?: {
19
+ scope?: string;
20
+ entryName?: string;
21
+ cwd?: string;
22
+ claudeBin?: string;
23
+ bridgeAbsPath?: string;
24
+ }): ClaudeCodeInstallResult;
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Register the `hpp-x402` MCP server with Claude Code via its native
3
+ * `claude mcp add` command (the recommended path for Claude Code, mirroring
4
+ * BlockRun's `claude mcp add blockrun …`).
5
+ *
6
+ * Unlike the JSON-file hosts (Claude Desktop / Cursor / Windsurf / OpenClaw),
7
+ * Claude Code owns its own config, so we shell out to the `claude` CLI rather
8
+ * than editing a file. Env vars are passed with `-e KEY=value` (args array →
9
+ * no shell interpolation). With the keychain-URI form of DELEGATE_PRIVATE_KEY
10
+ * (quickstart's default) no secret ever lands on the command line.
11
+ */
12
+ import { spawnSync } from "node:child_process";
13
+ const ENTRY_NAME = "hpp-x402";
14
+ const PKG = "@hpp-io/x402-mcp-bridge";
15
+ /**
16
+ * Build the argv for `claude mcp add`:
17
+ * mcp add hpp-x402 -s <scope> [-e K=V …] -- npx -y @hpp-io/x402-mcp-bridge
18
+ */
19
+ export function buildClaudeMcpAddArgs(env, opts = {}) {
20
+ const scope = opts.scope ?? "user";
21
+ const entry = opts.entryName ?? ENTRY_NAME;
22
+ const args = ["mcp", "add", entry, "-s", scope];
23
+ for (const [k, v] of Object.entries(env)) {
24
+ if (v === undefined)
25
+ continue;
26
+ args.push("-e", `${k}=${v}`);
27
+ }
28
+ // Default launches the published package via npx; `bridgeAbsPath` points at a
29
+ // local checkout (dev / testing) as `node <abs>` — mirrors the file-based hosts.
30
+ if (opts.bridgeAbsPath) {
31
+ args.push("--", "node", opts.bridgeAbsPath);
32
+ }
33
+ else {
34
+ args.push("--", "npx", "-y", PKG);
35
+ }
36
+ return args;
37
+ }
38
+ export function installClaudeCode(env, opts = {}) {
39
+ const bin = opts.claudeBin ?? "claude";
40
+ const args = buildClaudeMcpAddArgs(env, opts);
41
+ const res = spawnSync(bin, args, { cwd: opts.cwd, encoding: "utf8" });
42
+ const stderr = (res.stderr ?? "") + (res.error ? `\n${res.error.message}` : "");
43
+ return {
44
+ command: `${bin} ${args.join(" ")}`,
45
+ ok: res.status === 0,
46
+ stdout: res.stdout ?? "",
47
+ stderr,
48
+ };
49
+ }
50
+ //# sourceMappingURL=install-claude-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-claude-code.js","sourceRoot":"","sources":["../../src/cli/install-claude-code.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAI/C,MAAM,UAAU,GAAG,UAAU,CAAC;AAC9B,MAAM,GAAG,GAAG,yBAAyB,CAAC;AAUtC;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CACnC,GAAe,EACf,OAAuE,EAAE;IAEzE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC;IACnC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,IAAI,UAAU,CAAC;IAC3C,MAAM,IAAI,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAChD,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACzC,IAAI,CAAC,KAAK,SAAS;YAAE,SAAS;QAC9B,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;IACD,8EAA8E;IAC9E,iFAAiF;IACjF,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IAC9C,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,GAAe,EACf,OAAyG,EAAE;IAE3G,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,IAAI,QAAQ,CAAC;IACvC,MAAM,IAAI,GAAG,qBAAqB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IACtE,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAChF,OAAO;QACL,OAAO,EAAE,GAAG,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;QACnC,EAAE,EAAE,GAAG,CAAC,MAAM,KAAK,CAAC;QACpB,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE;QACxB,MAAM;KACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { type InstallEnv, type InstallResult } from "./install-mcp-host.js";
2
+ export declare function configPath(): string;
3
+ export declare function installCursor(env: InstallEnv, opts?: {
4
+ force?: boolean;
5
+ bridgeAbsPath?: string;
6
+ configPathOverride?: string;
7
+ }): InstallResult;
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Merge an `hpp-x402` MCP server entry into Cursor's mcp.json.
3
+ *
4
+ * Cursor uses the same `{ mcpServers: { … } }` schema as Claude Desktop.
5
+ * The global config lives at ~/.cursor/mcp.json; a project can also carry a
6
+ * .cursor/mcp.json — pass `configPathOverride` for that (or for tests).
7
+ * The merge logic is shared — see install-mcp-host.ts.
8
+ */
9
+ import { resolve } from "node:path";
10
+ import { homedir } from "node:os";
11
+ import { installMcpHost, } from "./install-mcp-host.js";
12
+ const ENTRY_NAME = "hpp-x402";
13
+ export function configPath() {
14
+ return resolve(homedir(), ".cursor/mcp.json");
15
+ }
16
+ export function installCursor(env, opts = {}) {
17
+ return installMcpHost({
18
+ configPath: opts.configPathOverride ?? configPath(),
19
+ entryName: ENTRY_NAME,
20
+ env,
21
+ force: opts.force,
22
+ bridgeAbsPath: opts.bridgeAbsPath,
23
+ // serversKeyPath defaults to ["mcpServers"] — same as Cursor's schema.
24
+ });
25
+ }
26
+ //# sourceMappingURL=install-cursor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-cursor.js","sourceRoot":"","sources":["../../src/cli/install-cursor.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EACL,cAAc,GAGf,MAAM,uBAAuB,CAAC;AAE/B,MAAM,UAAU,GAAG,UAAU,CAAC;AAE9B,MAAM,UAAU,UAAU;IACxB,OAAO,OAAO,CAAC,OAAO,EAAE,EAAE,kBAAkB,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,GAAe,EACf,OAAiF,EAAE;IAEnF,OAAO,cAAc,CAAC;QACpB,UAAU,EAAE,IAAI,CAAC,kBAAkB,IAAI,UAAU,EAAE;QACnD,SAAS,EAAE,UAAU;QACrB,GAAG;QACH,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,uEAAuE;KACxE,CAAC,CAAC;AACL,CAAC"}
@@ -1,7 +1,7 @@
1
1
  export interface InstallEnv {
2
2
  DELEGATE_PRIVATE_KEY: string;
3
- SAFE_ADDRESS: string;
4
- ALLOWANCE_MODULE_ADDRESS: string;
3
+ SAFE_ADDRESS?: string;
4
+ ALLOWANCE_MODULE_ADDRESS?: string;
5
5
  USDCE_ADDRESS: string;
6
6
  RESOURCE_SERVER_URL: string;
7
7
  HPP_RPC_URL: string;
@@ -1 +1 @@
1
- {"version":3,"file":"install-mcp-host.js","sourceRoot":"","sources":["../../src/cli/install-mcp-host.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"install-mcp-host.js","sourceRoot":"","sources":["../../src/cli/install-mcp-host.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { type InstallEnv, type InstallResult } from "./install-mcp-host.js";
2
+ export declare function configPath(): string;
3
+ export declare function installWindsurf(env: InstallEnv, opts?: {
4
+ force?: boolean;
5
+ bridgeAbsPath?: string;
6
+ configPathOverride?: string;
7
+ }): InstallResult;
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Merge an `hpp-x402` MCP server entry into Windsurf's mcp_config.json.
3
+ *
4
+ * Windsurf (Codeium) uses the same `{ mcpServers: { … } }` schema, but a
5
+ * different file location per OS:
6
+ * macOS : ~/.codeium/windsurf/mcp_config.json
7
+ * Linux : ~/.config/.codeium/windsurf/mcp_config.json
8
+ * Windows : %APPDATA%/Codeium/windsurf/mcp_config.json
9
+ * Pass `configPathOverride` for a non-default path (or for tests).
10
+ * The merge logic is shared — see install-mcp-host.ts.
11
+ */
12
+ import { resolve } from "node:path";
13
+ import { homedir, platform } from "node:os";
14
+ import { installMcpHost, } from "./install-mcp-host.js";
15
+ const ENTRY_NAME = "hpp-x402";
16
+ export function configPath() {
17
+ const p = platform();
18
+ if (p === "win32") {
19
+ return resolve(process.env.APPDATA ?? "", "Codeium/windsurf/mcp_config.json");
20
+ }
21
+ if (p === "darwin") {
22
+ return resolve(homedir(), ".codeium/windsurf/mcp_config.json");
23
+ }
24
+ // Linux
25
+ return resolve(homedir(), ".config/.codeium/windsurf/mcp_config.json");
26
+ }
27
+ export function installWindsurf(env, opts = {}) {
28
+ return installMcpHost({
29
+ configPath: opts.configPathOverride ?? configPath(),
30
+ entryName: ENTRY_NAME,
31
+ env,
32
+ force: opts.force,
33
+ bridgeAbsPath: opts.bridgeAbsPath,
34
+ // serversKeyPath defaults to ["mcpServers"] — same as Windsurf's schema.
35
+ });
36
+ }
37
+ //# sourceMappingURL=install-windsurf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-windsurf.js","sourceRoot":"","sources":["../../src/cli/install-windsurf.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE5C,OAAO,EACL,cAAc,GAGf,MAAM,uBAAuB,CAAC;AAE/B,MAAM,UAAU,GAAG,UAAU,CAAC;AAE9B,MAAM,UAAU,UAAU;IACxB,MAAM,CAAC,GAAG,QAAQ,EAAE,CAAC;IACrB,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC;QAClB,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,EAAE,kCAAkC,CAAC,CAAC;IAChF,CAAC;IACD,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;QACnB,OAAO,OAAO,CAAC,OAAO,EAAE,EAAE,mCAAmC,CAAC,CAAC;IACjE,CAAC;IACD,QAAQ;IACR,OAAO,OAAO,CAAC,OAAO,EAAE,EAAE,2CAA2C,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,GAAe,EACf,OAAiF,EAAE;IAEnF,OAAO,cAAc,CAAC;QACpB,UAAU,EAAE,IAAI,CAAC,kBAAkB,IAAI,UAAU,EAAE;QACnD,SAAS,EAAE,UAAU;QACrB,GAAG;QACH,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,yEAAyE;KAC1E,CAAC,CAAC;AACL,CAAC"}
@@ -1 +1 @@
1
- export {};
1
+ export declare function run(): void;
@@ -123,7 +123,7 @@ function buildLimits(base, a) {
123
123
  limits.requireHttps = parseBool(a.https);
124
124
  return limits;
125
125
  }
126
- function main() {
126
+ export function run() {
127
127
  const a = parseArgs(process.argv);
128
128
  if (a.cmd === "help")
129
129
  usage();
@@ -209,11 +209,4 @@ function main() {
209
209
  }
210
210
  usage();
211
211
  }
212
- try {
213
- main();
214
- }
215
- catch (err) {
216
- process.stderr.write(`hpp-x402-policy: ${err.message}\n`);
217
- process.exit(1);
218
- }
219
212
  //# sourceMappingURL=policy.js.map