@hpp-io/x402-mcp-bridge 0.0.1 → 0.0.3
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 +125 -77
- package/bin/hpp-x402.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/autoTopup.d.ts +2 -1
- package/dist/autoTopup.js.map +1 -1
- package/dist/cli/channel.d.ts +1 -0
- package/dist/cli/channel.js +323 -0
- package/dist/cli/channel.js.map +1 -0
- package/dist/cli/hpp-x402.d.ts +2 -0
- package/dist/cli/hpp-x402.js +375 -0
- package/dist/cli/hpp-x402.js.map +1 -0
- package/dist/cli/install-claude-code.d.ts +24 -0
- package/dist/cli/install-claude-code.js +50 -0
- package/dist/cli/install-claude-code.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-cursor.d.ts +7 -0
- package/dist/cli/install-cursor.js +26 -0
- package/dist/cli/install-cursor.js.map +1 -0
- 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/install-windsurf.d.ts +7 -0
- package/dist/cli/install-windsurf.js +37 -0
- package/dist/cli/install-windsurf.js.map +1 -0
- package/dist/cli/policy.d.ts +1 -0
- package/dist/cli/policy.js +212 -0
- package/dist/cli/policy.js.map +1 -0
- package/dist/cli/revoke.d.ts +1 -1
- package/dist/cli/revoke.js +1 -5
- package/dist/cli/revoke.js.map +1 -1
- package/dist/cli/safe.d.ts +4172 -9580
- package/dist/cli/setup.d.ts +1 -1
- package/dist/cli/setup.js +24 -6
- package/dist/cli/setup.js.map +1 -1
- package/dist/client.d.ts +25 -10
- package/dist/client.js +139 -2
- package/dist/client.js.map +1 -1
- package/dist/config.d.ts +50 -11
- package/dist/config.js +50 -10
- package/dist/config.js.map +1 -1
- package/dist/discovery.d.ts +43 -0
- package/dist/discovery.js +62 -0
- package/dist/discovery.js.map +1 -0
- package/dist/discoveryTools.d.ts +75 -0
- package/dist/discoveryTools.js +101 -0
- package/dist/discoveryTools.js.map +1 -0
- package/dist/funds/direct-balance.d.ts +27 -0
- package/dist/funds/direct-balance.js +58 -0
- package/dist/funds/direct-balance.js.map +1 -0
- package/dist/funds.d.ts +26 -0
- package/dist/funds.js +2 -0
- package/dist/funds.js.map +1 -0
- package/dist/httpX402.d.ts +45 -0
- package/dist/httpX402.js +214 -0
- package/dist/httpX402.js.map +1 -0
- package/dist/index.js +66 -20
- 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 +18 -1
- package/dist/server.js +120 -10
- package/dist/server.js.map +1 -1
- package/docs/policy.md +101 -0
- package/package.json +11 -8
- package/bin/hpp-x402-safe-revoke.js +0 -5
- package/bin/hpp-x402-safe-setup.js +0 -5
|
@@ -0,0 +1,375 @@
|
|
|
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.0.3");
|
|
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
|
+
// Passthrough groups delegate to the existing scripts, which parse process.argv
|
|
338
|
+
// themselves. Intercept BEFORE commander so their flags aren't consumed, and
|
|
339
|
+
// rewrite argv so each script sees its sub-args starting at index 2.
|
|
340
|
+
async function runPassthrough(modPath, label, subArgs) {
|
|
341
|
+
process.argv = [process.argv[0], label, ...subArgs];
|
|
342
|
+
const m = (await import(modPath));
|
|
343
|
+
await m.run();
|
|
344
|
+
}
|
|
345
|
+
const PASSTHROUGH = {
|
|
346
|
+
policy: { mod: "./policy.js", label: "hpp-x402-policy" },
|
|
347
|
+
channel: { mod: "./channel.js", label: "hpp-x402-channel" },
|
|
348
|
+
};
|
|
349
|
+
const sub = process.argv[2];
|
|
350
|
+
if (sub && sub in PASSTHROUGH) {
|
|
351
|
+
const { mod, label } = PASSTHROUGH[sub];
|
|
352
|
+
runPassthrough(mod, label, process.argv.slice(3)).catch((e) => {
|
|
353
|
+
console.error(`${label} error:`, e?.message ?? e);
|
|
354
|
+
process.exit(1);
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
else if (sub === "safe") {
|
|
358
|
+
const action = process.argv[3];
|
|
359
|
+
const map = { setup: "./setup.js", revoke: "./revoke.js" };
|
|
360
|
+
if (!action || !(action in map)) {
|
|
361
|
+
console.log("usage: hpp-x402 safe <setup|revoke> [options]");
|
|
362
|
+
process.exit(action ? 1 : 0);
|
|
363
|
+
}
|
|
364
|
+
runPassthrough(map[action], `hpp-x402-safe-${action}`, process.argv.slice(4)).catch((e) => {
|
|
365
|
+
console.error(`hpp-x402-safe-${action} error:`, e?.message ?? e);
|
|
366
|
+
process.exit(1);
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
else {
|
|
370
|
+
program.parseAsync(process.argv).catch((e) => {
|
|
371
|
+
console.error("error:", e?.message ?? e);
|
|
372
|
+
process.exit(1);
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
//# 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"}
|
|
@@ -1,24 +1,6 @@
|
|
|
1
|
+
import { type InstallEnv, type InstallResult } from "./install-mcp-host.js";
|
|
1
2
|
export declare function configPath(): string;
|
|
2
|
-
export
|
|
3
|
-
DELEGATE_PRIVATE_KEY: string;
|
|
4
|
-
SAFE_ADDRESS: string;
|
|
5
|
-
ALLOWANCE_MODULE_ADDRESS: string;
|
|
6
|
-
USDCE_ADDRESS: string;
|
|
7
|
-
RESOURCE_SERVER_URL: string;
|
|
8
|
-
HPP_RPC_URL: string;
|
|
9
|
-
HPP_NETWORK: string;
|
|
10
|
-
LOG_LEVEL?: string;
|
|
11
|
-
}
|
|
12
|
-
export interface InstallResult {
|
|
13
|
-
configPath: string;
|
|
14
|
-
backupPath: string | null;
|
|
15
|
-
changed: boolean;
|
|
16
|
-
preservedEntries: string[];
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Merge an `hpp-x402` server entry into the host config and write it.
|
|
20
|
-
* `command`/`args` default to launching the published bridge via npx.
|
|
21
|
-
*/
|
|
3
|
+
export type { InstallEnv, InstallResult };
|
|
22
4
|
export declare function installClaudeDesktop(env: InstallEnv, opts?: {
|
|
23
5
|
force?: boolean;
|
|
24
6
|
bridgeAbsPath?: string;
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Merge an `hpp-x402` MCP server entry into the user's
|
|
3
|
-
* claude_desktop_config.json. Importable
|
|
4
|
-
*
|
|
3
|
+
* claude_desktop_config.json. Importable from the setup CLI
|
|
4
|
+
* (--install-claude flag).
|
|
5
5
|
*
|
|
6
|
-
*
|
|
6
|
+
* The merge logic is shared with OpenClaw — see install-mcp-host.ts.
|
|
7
7
|
*/
|
|
8
|
-
import {
|
|
9
|
-
import { resolve, dirname } from "node:path";
|
|
8
|
+
import { resolve } from "node:path";
|
|
10
9
|
import { homedir, platform } from "node:os";
|
|
10
|
+
import { installMcpHost, } from "./install-mcp-host.js";
|
|
11
11
|
const ENTRY_NAME = "hpp-x402";
|
|
12
12
|
export function configPath() {
|
|
13
13
|
const p = platform();
|
|
@@ -19,64 +19,13 @@ export function configPath() {
|
|
|
19
19
|
}
|
|
20
20
|
return resolve(homedir(), ".config/Claude/claude_desktop_config.json");
|
|
21
21
|
}
|
|
22
|
-
/**
|
|
23
|
-
* Merge an `hpp-x402` server entry into the host config and write it.
|
|
24
|
-
* `command`/`args` default to launching the published bridge via npx.
|
|
25
|
-
*/
|
|
26
22
|
export function installClaudeDesktop(env, opts = {}) {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
}
|
|
35
|
-
const command = opts.bridgeAbsPath ? "node" : "npx";
|
|
36
|
-
const args = opts.bridgeAbsPath
|
|
37
|
-
? [opts.bridgeAbsPath]
|
|
38
|
-
: ["-y", "@hpp-io/x402-mcp-bridge"];
|
|
39
|
-
const entry = {
|
|
40
|
-
command,
|
|
41
|
-
args,
|
|
42
|
-
env: {
|
|
43
|
-
DELEGATE_PRIVATE_KEY: env.DELEGATE_PRIVATE_KEY,
|
|
44
|
-
SAFE_ADDRESS: env.SAFE_ADDRESS,
|
|
45
|
-
ALLOWANCE_MODULE_ADDRESS: env.ALLOWANCE_MODULE_ADDRESS,
|
|
46
|
-
USDCE_ADDRESS: env.USDCE_ADDRESS,
|
|
47
|
-
RESOURCE_SERVER_URL: env.RESOURCE_SERVER_URL,
|
|
48
|
-
HPP_RPC_URL: env.HPP_RPC_URL,
|
|
49
|
-
HPP_NETWORK: env.HPP_NETWORK,
|
|
50
|
-
LOG_LEVEL: env.LOG_LEVEL ?? "info",
|
|
51
|
-
},
|
|
52
|
-
};
|
|
53
|
-
const mcpServers = (existing.mcpServers ??= {});
|
|
54
|
-
const prior = mcpServers[ENTRY_NAME];
|
|
55
|
-
if (prior && JSON.stringify(prior) === JSON.stringify(entry)) {
|
|
56
|
-
return {
|
|
57
|
-
configPath: path,
|
|
58
|
-
backupPath: null,
|
|
59
|
-
changed: false,
|
|
60
|
-
preservedEntries: Object.keys(mcpServers).filter((k) => k !== ENTRY_NAME),
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
if (prior && !opts.force) {
|
|
64
|
-
throw new Error(`existing hpp-x402 entry differs; pass force:true (or --force in CLI) to overwrite`);
|
|
65
|
-
}
|
|
66
|
-
mcpServers[ENTRY_NAME] = entry;
|
|
67
|
-
const merged = { ...existing, mcpServers };
|
|
68
|
-
let backupPath = null;
|
|
69
|
-
if (existsSync(path)) {
|
|
70
|
-
const ts = new Date().toISOString().replace(/[:.]/g, "-");
|
|
71
|
-
backupPath = path + "." + ts + ".bak";
|
|
72
|
-
copyFileSync(path, backupPath);
|
|
73
|
-
}
|
|
74
|
-
writeFileSync(path, JSON.stringify(merged, null, 2) + "\n", "utf8");
|
|
75
|
-
return {
|
|
76
|
-
configPath: path,
|
|
77
|
-
backupPath,
|
|
78
|
-
changed: true,
|
|
79
|
-
preservedEntries: Object.keys(mcpServers).filter((k) => k !== ENTRY_NAME),
|
|
80
|
-
};
|
|
23
|
+
return installMcpHost({
|
|
24
|
+
configPath: configPath(),
|
|
25
|
+
entryName: ENTRY_NAME,
|
|
26
|
+
env,
|
|
27
|
+
force: opts.force,
|
|
28
|
+
bridgeAbsPath: opts.bridgeAbsPath,
|
|
29
|
+
});
|
|
81
30
|
}
|
|
82
31
|
//# sourceMappingURL=install-claude.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-claude.js","sourceRoot":"","sources":["../../src/cli/install-claude.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,
|
|
1
|
+
{"version":3,"file":"install-claude.js","sourceRoot":"","sources":["../../src/cli/install-claude.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;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,QAAQ,EAAE,CAAC;QACnB,OAAO,OAAO,CAAC,OAAO,EAAE,EAAE,+DAA+D,CAAC,CAAC;IAC7F,CAAC;IACD,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC;QAClB,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,EAAE,mCAAmC,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,OAAO,CAAC,OAAO,EAAE,EAAE,2CAA2C,CAAC,CAAC;AACzE,CAAC;AAID,MAAM,UAAU,oBAAoB,CAClC,GAAe,EACf,OAAoD,EAAE;IAEtD,OAAO,cAAc,CAAC;QACpB,UAAU,EAAE,UAAU,EAAE;QACxB,SAAS,EAAE,UAAU;QACrB,GAAG;QACH,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,aAAa,EAAE,IAAI,CAAC,aAAa;KAClC,CAAC,CAAC;AACL,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"}
|