@hpp-io/x402-mcp-bridge 0.0.2 → 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 +120 -122
- package/bin/hpp-x402.js +5 -0
- package/dist/a2a.d.ts +2 -2
- package/dist/a2a.js +4 -4
- package/dist/a2a.js.map +1 -1
- package/dist/autoTopup.d.ts +2 -1
- package/dist/autoTopup.js.map +1 -1
- package/dist/cli/channel.d.ts +1 -1
- package/dist/cli/channel.js +1 -8
- package/dist/cli/channel.js.map +1 -1
- 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-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 +2 -2
- package/dist/cli/install-mcp-host.js.map +1 -1
- 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 -1
- package/dist/cli/policy.js +1 -8
- package/dist/cli/policy.js.map +1 -1
- 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 +62 -62
- package/dist/cli/setup.d.ts +1 -1
- package/dist/cli/setup.js +1 -5
- package/dist/cli/setup.js.map +1 -1
- package/dist/client.d.ts +6 -2
- package/dist/client.js +34 -15
- package/dist/client.js.map +1 -1
- package/dist/config.d.ts +46 -7
- package/dist/config.js +39 -5
- 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 +8 -2
- package/dist/httpX402.js +19 -13
- package/dist/httpX402.js.map +1 -1
- package/dist/index.js +27 -10
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts +5 -2
- package/dist/server.js +30 -64
- package/dist/server.js.map +1 -1
- package/package.json +7 -11
- package/bin/hpp-x402-channel.js +0 -5
- package/bin/hpp-x402-keychain.js +0 -5
- package/bin/hpp-x402-policy.js +0 -5
- package/bin/hpp-x402-safe-revoke.js +0 -5
- package/bin/hpp-x402-safe-setup.js +0 -5
- package/dist/autoSettlePickup.d.ts +0 -69
- package/dist/autoSettlePickup.js +0 -150
- package/dist/autoSettlePickup.js.map +0 -1
- package/dist/cli/keychain.d.ts +0 -1
- package/dist/cli/keychain.js +0 -147
- package/dist/cli/keychain.js.map +0 -1
package/dist/httpX402.js
CHANGED
|
@@ -70,18 +70,23 @@ export async function x402HttpCall(deps, args) {
|
|
|
70
70
|
return errorResult("url required");
|
|
71
71
|
const method = (args.method ?? "POST").toUpperCase();
|
|
72
72
|
const policy = loadPolicy();
|
|
73
|
-
// 1. pre-flight guard — host allowlist + https (③ / H1·C1)
|
|
73
|
+
// 1. pre-flight guard — host allowlist + https (③ / H1·C1). Trusted
|
|
74
|
+
// (curated-discovery) calls skip the allowlist/https gate but still inherit
|
|
75
|
+
// the default spend limits carried on `access.limits`.
|
|
74
76
|
const access = checkAccess(policy, url);
|
|
75
|
-
if (!access.ok)
|
|
77
|
+
if (!access.ok && !deps.trustedSource)
|
|
76
78
|
return errorResult(`blocked: ${access.error}`);
|
|
77
79
|
const host = new URL(url).host.toLowerCase();
|
|
78
|
-
// 2. inject auth headers from local policy (② — never from args/LLM)
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
80
|
+
// 2. inject auth headers from local policy (② — never from args/LLM). Trusted
|
|
81
|
+
// discovery services authenticate by payment (x402), not a local api key.
|
|
82
|
+
let authHeaders = {};
|
|
83
|
+
if (!deps.trustedSource) {
|
|
84
|
+
try {
|
|
85
|
+
authHeaders = resolveCredentials(policy, host);
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
return errorResult(err.message);
|
|
89
|
+
}
|
|
85
90
|
}
|
|
86
91
|
const baseHeaders = { "Content-Type": "application/json", ...authHeaders };
|
|
87
92
|
const init = {
|
|
@@ -161,13 +166,14 @@ export async function x402HttpCall(deps, args) {
|
|
|
161
166
|
const deny = checkAmount(access.limits, amount);
|
|
162
167
|
if (deny)
|
|
163
168
|
return errorResult(`blocked: ${deny}`);
|
|
164
|
-
//
|
|
165
|
-
|
|
169
|
+
// Ensure the delegate holds enough USDC.e (Safe autoTopup within the
|
|
170
|
+
// on-chain cap, or a light-mode balance check — same gate either way).
|
|
171
|
+
if (deps.funds) {
|
|
166
172
|
try {
|
|
167
|
-
await deps.
|
|
173
|
+
await deps.funds.ensure(amount);
|
|
168
174
|
}
|
|
169
175
|
catch (err) {
|
|
170
|
-
return errorResult(`
|
|
176
|
+
return errorResult(`funds check failed (spend cap / insufficient balance?): ${err.message}`);
|
|
171
177
|
}
|
|
172
178
|
}
|
|
173
179
|
// sign exact payload + encode Payment-Signature header
|
package/dist/httpX402.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"httpX402.js","sourceRoot":"","sources":["../src/httpX402.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAMxD,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EACL,UAAU,EACV,WAAW,EACX,WAAW,EACX,kBAAkB,EAClB,aAAa,EACb,UAAU,EACV,eAAe,GAChB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"httpX402.js","sourceRoot":"","sources":["../src/httpX402.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -10,11 +10,13 @@ import { loadConfig } from "./config.js";
|
|
|
10
10
|
import { setLogLevel, log } from "./log.js";
|
|
11
11
|
import { RawEoaSigner } from "./signers/raw-eoa.js";
|
|
12
12
|
import { AutoTopup } from "./autoTopup.js";
|
|
13
|
+
import { DirectBalance } from "./funds/direct-balance.js";
|
|
13
14
|
import { connectUpstream } from "./client.js";
|
|
14
15
|
import { startBridgeServer } from "./server.js";
|
|
16
|
+
import { DiscoveryClient } from "./discovery.js";
|
|
15
17
|
import { isKeychainURI, resolveKeychain } from "./keychain.js";
|
|
16
18
|
const PKG_NAME = "@hpp-io/x402-mcp-bridge";
|
|
17
|
-
const PKG_VERSION = "0.0.
|
|
19
|
+
const PKG_VERSION = "0.0.3"; // mirrors package.json — bump together
|
|
18
20
|
export async function runBridge(env = process.env) {
|
|
19
21
|
const cfg = loadConfig(env);
|
|
20
22
|
setLogLevel(cfg.LOG_LEVEL);
|
|
@@ -22,6 +24,7 @@ export async function runBridge(env = process.env) {
|
|
|
22
24
|
name: PKG_NAME,
|
|
23
25
|
version: PKG_VERSION,
|
|
24
26
|
chain: cfg.HPP_NETWORK,
|
|
27
|
+
walletMode: cfg.walletMode,
|
|
25
28
|
safe: cfg.SAFE_ADDRESS,
|
|
26
29
|
resourceServer: cfg.RESOURCE_SERVER_URL,
|
|
27
30
|
});
|
|
@@ -34,13 +37,19 @@ export async function runBridge(env = process.env) {
|
|
|
34
37
|
address: signer.address,
|
|
35
38
|
source: isKeychainURI(cfg.DELEGATE_PRIVATE_KEY) ? "keychain" : "env",
|
|
36
39
|
});
|
|
37
|
-
// ----
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
40
|
+
// ---- Funds (wallet mode) --------------------------------------------
|
|
41
|
+
// Safe mode: autoTopup pulls USDC.e from the Safe within the on-chain daily
|
|
42
|
+
// cap when the delegate is short. Light mode: the delegate holds USDC.e
|
|
43
|
+
// directly; DirectBalance only checks the balance and surfaces a funding
|
|
44
|
+
// instruction when short (no Safe, no on-chain topup, no native gas).
|
|
45
|
+
const funds = cfg.walletMode === "safe"
|
|
46
|
+
? new AutoTopup(signer, cfg.SAFE_ADDRESS, cfg.ALLOWANCE_MODULE_ADDRESS, cfg.USDCE_ADDRESS, cfg.chainId, cfg.HPP_RPC_URL, {
|
|
47
|
+
headroomX: BigInt(cfg.TOPUP_HEADROOM_X),
|
|
48
|
+
fixedAmountAtomic: cfg.TOPUP_AMOUNT_ATOMIC
|
|
49
|
+
? BigInt(cfg.TOPUP_AMOUNT_ATOMIC)
|
|
50
|
+
: undefined,
|
|
51
|
+
})
|
|
52
|
+
: new DirectBalance(signer.address, cfg.USDCE_ADDRESS, cfg.chainId, cfg.HPP_RPC_URL);
|
|
44
53
|
// ---- Upstream MCP client (optional) ---------------------------------
|
|
45
54
|
// When RESOURCE_SERVER_URL is unset, run in local-tools-only mode (credit
|
|
46
55
|
// top-up / A2A) and skip the upstream connection.
|
|
@@ -49,8 +58,9 @@ export async function runBridge(env = process.env) {
|
|
|
49
58
|
upstream = await connectUpstream({
|
|
50
59
|
url: cfg.RESOURCE_SERVER_URL,
|
|
51
60
|
network: cfg.HPP_NETWORK,
|
|
61
|
+
rpcUrl: cfg.HPP_RPC_URL,
|
|
52
62
|
signer,
|
|
53
|
-
|
|
63
|
+
funds,
|
|
54
64
|
bridgeName: PKG_NAME,
|
|
55
65
|
bridgeVersion: PKG_VERSION,
|
|
56
66
|
});
|
|
@@ -69,13 +79,20 @@ export async function runBridge(env = process.env) {
|
|
|
69
79
|
const a2aRpcTimeoutMs = Number.isFinite(a2aRpcTimeoutParsed) && a2aRpcTimeoutParsed > 0
|
|
70
80
|
? a2aRpcTimeoutParsed
|
|
71
81
|
: undefined;
|
|
82
|
+
// Curated service discovery — register hpp_discover / hpp_call when enabled.
|
|
83
|
+
const discovery = cfg.discoveryEnabled
|
|
84
|
+
? new DiscoveryClient(cfg.discoveryUrl)
|
|
85
|
+
: undefined;
|
|
86
|
+
if (discovery)
|
|
87
|
+
log.info("discovery.enabled", { url: cfg.discoveryUrl });
|
|
72
88
|
await startBridgeServer({
|
|
73
89
|
upstream,
|
|
74
90
|
name: PKG_NAME,
|
|
75
91
|
version: PKG_VERSION,
|
|
76
92
|
signer,
|
|
77
93
|
network: cfg.HPP_NETWORK,
|
|
78
|
-
|
|
94
|
+
funds,
|
|
95
|
+
discovery,
|
|
79
96
|
a2aRpcTimeoutMs,
|
|
80
97
|
});
|
|
81
98
|
// Graceful shutdown: when the host closes our stdin (or Claude Desktop
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,UAAU,EAAe,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAI/D,MAAM,QAAQ,GAAG,yBAAyB,CAAC;AAC3C,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,uCAAuC;AAEpE,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,MAAyB,OAAO,CAAC,GAAG;IAClE,MAAM,GAAG,GAAW,UAAU,CAAC,GAAG,CAAC,CAAC;IACpC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC3B,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE;QACvB,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,WAAW;QACpB,KAAK,EAAE,GAAG,CAAC,WAAW;QACtB,IAAI,EAAE,GAAG,CAAC,YAAY;QACtB,cAAc,EAAE,GAAG,CAAC,mBAAmB;KACxC,CAAC,CAAC;IAEH,wEAAwE;IACxE,MAAM,WAAW,GAAG,aAAa,CAAC,GAAG,CAAC,oBAAoB,CAAC;QACzD,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,oBAAoB,CAAC;QAC3C,CAAC,CAAE,GAAG,CAAC,oBAAsC,CAAC;IAChD,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,WAAW,CAAC,CAAC;IAC7C,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE;QACxB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM,EAAE,aAAa,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK;KACrE,CAAC,CAAC;IAEH,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { UpstreamClient } from "./client.js";
|
|
2
|
+
import type { DiscoveryClient } from "./discovery.js";
|
|
2
3
|
import type { RawEoaSigner } from "./signers/raw-eoa.js";
|
|
3
|
-
import type {
|
|
4
|
+
import type { Funds } from "./funds.js";
|
|
4
5
|
import type { Network } from "@x402/core/types";
|
|
5
6
|
export interface BridgeServerOptions {
|
|
6
7
|
/** Upstream resource server. Undefined = local-tools-only mode. */
|
|
@@ -10,7 +11,9 @@ export interface BridgeServerOptions {
|
|
|
10
11
|
/** Delegate signer + network — used by the local `pay_a2a_agent` tool. */
|
|
11
12
|
signer: RawEoaSigner;
|
|
12
13
|
network: Network;
|
|
13
|
-
|
|
14
|
+
funds?: Funds;
|
|
15
|
+
/** Curated-discovery client. Present = register hpp_discover / hpp_call. */
|
|
16
|
+
discovery?: DiscoveryClient;
|
|
14
17
|
/**
|
|
15
18
|
* Per-request timeout for the A2A JSON-RPC calls in `pay_a2a_agent`.
|
|
16
19
|
* Surfaced via env `HPP_X402_A2A_RPC_TIMEOUT_MS` (set at CLI entry);
|
package/dist/server.js
CHANGED
|
@@ -14,17 +14,20 @@
|
|
|
14
14
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
15
15
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
16
16
|
import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
17
|
-
import { parseComputeResultText, startAutoSettlePoller, } from "./autoSettlePickup.js";
|
|
18
17
|
import { PAY_A2A_TOOL, payA2aAgent } from "./a2a.js";
|
|
19
18
|
import { X402_HTTP_TOOL, x402HttpCall } from "./httpX402.js";
|
|
19
|
+
import { HPP_DISCOVER_TOOL, HPP_CALL_TOOL, hppDiscover, hppCall, } from "./discoveryTools.js";
|
|
20
20
|
import { log } from "./log.js";
|
|
21
21
|
export async function startBridgeServer(opts) {
|
|
22
22
|
const server = new Server({ name: opts.name, version: opts.version }, { capabilities: { tools: {} } });
|
|
23
23
|
// ---- listTools — upstream tools (if any) + local tools --------------
|
|
24
24
|
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
25
25
|
const upstreamTools = opts.upstream ? await opts.upstream.base.listTools() : { tools: [] };
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
const localTools = opts.discovery
|
|
27
|
+
? [PAY_A2A_TOOL, X402_HTTP_TOOL, HPP_DISCOVER_TOOL, HPP_CALL_TOOL]
|
|
28
|
+
: [PAY_A2A_TOOL, X402_HTTP_TOOL];
|
|
29
|
+
log.debug("listTools", { count: upstreamTools.tools.length + localTools.length });
|
|
30
|
+
return { tools: [...upstreamTools.tools, ...localTools] };
|
|
28
31
|
});
|
|
29
32
|
// ---- callTool — forward through x402-aware wrapper ------------------
|
|
30
33
|
//
|
|
@@ -49,7 +52,7 @@ export async function startBridgeServer(opts) {
|
|
|
49
52
|
return await payA2aAgent({
|
|
50
53
|
signer: opts.signer,
|
|
51
54
|
network: opts.network,
|
|
52
|
-
|
|
55
|
+
funds: opts.funds,
|
|
53
56
|
rpcTimeoutMs: opts.a2aRpcTimeoutMs,
|
|
54
57
|
}, (args ?? {}));
|
|
55
58
|
}
|
|
@@ -67,7 +70,7 @@ export async function startBridgeServer(opts) {
|
|
|
67
70
|
return await x402HttpCall({
|
|
68
71
|
signer: opts.signer,
|
|
69
72
|
network: opts.network,
|
|
70
|
-
|
|
73
|
+
funds: opts.funds,
|
|
71
74
|
}, (args ?? {}));
|
|
72
75
|
}
|
|
73
76
|
catch (err) {
|
|
@@ -76,6 +79,28 @@ export async function startBridgeServer(opts) {
|
|
|
76
79
|
return { content: [{ type: "text", text: `x402_http_call error: ${msg}` }], isError: true };
|
|
77
80
|
}
|
|
78
81
|
}
|
|
82
|
+
// Local tool: discover curated x402 services (read-only, no payment).
|
|
83
|
+
if (opts.discovery && name === HPP_DISCOVER_TOOL.name) {
|
|
84
|
+
try {
|
|
85
|
+
return await hppDiscover(opts.discovery, (args ?? {}));
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
89
|
+
log.error("hpp_discover.failed", { err: msg });
|
|
90
|
+
return { content: [{ type: "text", text: `hpp_discover error: ${msg}` }], isError: true };
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// Local tool: call a discovered service by id (payment via our wallet).
|
|
94
|
+
if (opts.discovery && name === HPP_CALL_TOOL.name) {
|
|
95
|
+
try {
|
|
96
|
+
return await hppCall({ signer: opts.signer, network: opts.network, funds: opts.funds }, opts.discovery, (args ?? {}));
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
100
|
+
log.error("hpp_call.failed", { err: msg });
|
|
101
|
+
return { content: [{ type: "text", text: `hpp_call error: ${msg}` }], isError: true };
|
|
102
|
+
}
|
|
103
|
+
}
|
|
79
104
|
// Beyond the local tools above, everything is an upstream resource-server
|
|
80
105
|
// tool. In local-tools-only mode there's no upstream to forward to.
|
|
81
106
|
if (!opts.upstream) {
|
|
@@ -118,22 +143,6 @@ export async function startBridgeServer(opts) {
|
|
|
118
143
|
const result = await up.x402.callTool(name, (args ?? {}), upstreamOptions);
|
|
119
144
|
const paymentMade = result.paymentMade ?? false;
|
|
120
145
|
log.info("callTool.done", { name, paymentMade });
|
|
121
|
-
// F-3a auto-refund hook. If the server's inline wait returned
|
|
122
|
-
// status:pending for a paid compute, start a background poller
|
|
123
|
-
// that watches get_compute_result(jobId). On terminal `failed`
|
|
124
|
-
// we fire batchScheme.refund() so the buyer recovers funds
|
|
125
|
-
// without manual intervention.
|
|
126
|
-
// Skip silently when:
|
|
127
|
-
// - this wasn't a paid compute tool (name doesn't start with compute_)
|
|
128
|
-
// - payment didn't actually happen this turn (already in channel cache)
|
|
129
|
-
// - response isn't the pending shape (server returned an actual
|
|
130
|
-
// result inline, or some non-JSON text like "hello world ...")
|
|
131
|
-
// - we don't have a channelId to act on
|
|
132
|
-
// - the payment scheme wasn't batch-settlement (exact settles on
|
|
133
|
-
// the first response so the buyer already has its PAYMENT-RESPONSE)
|
|
134
|
-
if (paymentMade && name.startsWith("compute_")) {
|
|
135
|
-
maybeStartAutoSettlePoller(up, result, name);
|
|
136
|
-
}
|
|
137
146
|
// Strip bridge-internal fields (paymentMade, paymentResponse) before
|
|
138
147
|
// returning to host — they're not part of the MCP CallToolResult shape.
|
|
139
148
|
return {
|
|
@@ -154,47 +163,4 @@ export async function startBridgeServer(opts) {
|
|
|
154
163
|
await server.connect(transport);
|
|
155
164
|
log.info("bridge.ready");
|
|
156
165
|
}
|
|
157
|
-
/**
|
|
158
|
-
* Inspect a freshly-returned paid compute result. If the server
|
|
159
|
-
* reported `status: "pending"` (its inline-wait timed out) AND the
|
|
160
|
-
* payment used batch-settlement, kick off the background poller so
|
|
161
|
-
* the eventual result-poll picks up the PAYMENT-RESPONSE and updates
|
|
162
|
-
* the buyer's local cumulative. All failure paths are silent
|
|
163
|
-
* best-effort, never throwing into the caller.
|
|
164
|
-
*
|
|
165
|
-
* Deferred-settle replaces F-3a: the server never settles the pending
|
|
166
|
-
* voucher, so failed compute leaves the buyer's budget intact and
|
|
167
|
-
* there's nothing to refund. The poller now only applies settle when
|
|
168
|
-
* the compute succeeds and the server attaches PAYMENT-RESPONSE.
|
|
169
|
-
*/
|
|
170
|
-
function maybeStartAutoSettlePoller(upstream, result, toolName) {
|
|
171
|
-
const content = result.content;
|
|
172
|
-
const text = content?.[0]?.type === "text" ? content[0]?.text : undefined;
|
|
173
|
-
if (!text)
|
|
174
|
-
return;
|
|
175
|
-
const parsed = parseComputeResultText(text);
|
|
176
|
-
if (parsed?.status !== "pending" || !parsed.jobId)
|
|
177
|
-
return;
|
|
178
|
-
const payResp = result.paymentResponse;
|
|
179
|
-
const schemeName = payResp?.scheme;
|
|
180
|
-
const channelId = payResp?.extra?.channelState?.channelId;
|
|
181
|
-
if (schemeName !== "batch-settlement" || !channelId) {
|
|
182
|
-
log.debug("autoSettle.skipped", {
|
|
183
|
-
jobId: parsed.jobId,
|
|
184
|
-
reason: schemeName !== "batch-settlement"
|
|
185
|
-
? "scheme_not_batch_settlement"
|
|
186
|
-
: "no_channel_id",
|
|
187
|
-
scheme: schemeName,
|
|
188
|
-
});
|
|
189
|
-
return;
|
|
190
|
-
}
|
|
191
|
-
startAutoSettlePoller({
|
|
192
|
-
base: upstream.base,
|
|
193
|
-
batchScheme: upstream.batchScheme,
|
|
194
|
-
}, {
|
|
195
|
-
jobId: parsed.jobId,
|
|
196
|
-
channelId,
|
|
197
|
-
toolName,
|
|
198
|
-
});
|
|
199
|
-
}
|
|
200
166
|
//# sourceMappingURL=server.js.map
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAG5C,OAAO,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hpp-io/x402-mcp-bridge",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.3",
|
|
4
4
|
"description": "MCP stdio bridge that lets Claude Desktop / OpenClaw / other MCP hosts make x402 payments on HPP — autoTopup from a Safe via AllowanceModule, signs EIP-3009 with a delegate EOA.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -8,11 +8,7 @@
|
|
|
8
8
|
"types": "./dist/index.d.ts",
|
|
9
9
|
"bin": {
|
|
10
10
|
"x402-mcp-bridge": "bin/x402-mcp-bridge.js",
|
|
11
|
-
"hpp-x402
|
|
12
|
-
"hpp-x402-safe-revoke": "bin/hpp-x402-safe-revoke.js",
|
|
13
|
-
"hpp-x402-keychain": "bin/hpp-x402-keychain.js",
|
|
14
|
-
"hpp-x402-channel": "bin/hpp-x402-channel.js",
|
|
15
|
-
"hpp-x402-policy": "bin/hpp-x402-policy.js"
|
|
11
|
+
"hpp-x402": "bin/hpp-x402.js"
|
|
16
12
|
},
|
|
17
13
|
"files": [
|
|
18
14
|
"dist",
|
|
@@ -32,15 +28,15 @@
|
|
|
32
28
|
"prepublishOnly": "npm run typecheck && npm run build"
|
|
33
29
|
},
|
|
34
30
|
"publishConfig": {
|
|
35
|
-
"access": "public"
|
|
36
|
-
"provenance": true
|
|
31
|
+
"access": "public"
|
|
37
32
|
},
|
|
38
33
|
"dependencies": {
|
|
39
34
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
40
35
|
"@napi-rs/keyring": "^1.3.0",
|
|
41
|
-
"@x402/core": "^2.
|
|
42
|
-
"@x402/evm": "^2.
|
|
43
|
-
"@x402/mcp": "^2.
|
|
36
|
+
"@x402/core": "^2.14.0",
|
|
37
|
+
"@x402/evm": "^2.14.0",
|
|
38
|
+
"@x402/mcp": "^2.14.0",
|
|
39
|
+
"commander": "^12.1.0",
|
|
44
40
|
"viem": "^2.21.54",
|
|
45
41
|
"zod": "^3.23.8"
|
|
46
42
|
},
|
package/bin/hpp-x402-channel.js
DELETED
package/bin/hpp-x402-keychain.js
DELETED
package/bin/hpp-x402-policy.js
DELETED
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Auto settle pickup for the deferred-settle batch-settlement model.
|
|
3
|
-
*
|
|
4
|
-
* Replaces the F-3a auto-refund poller. The server side moved settle
|
|
5
|
-
* out of the inline-pending response into the result poll endpoints
|
|
6
|
-
* (`get_compute_result` for MCP, `GET /paid/jobs/:jobId` for HTTP); the
|
|
7
|
-
* buyer is therefore *not* charged until the result actually arrives.
|
|
8
|
-
* Refund-on-failure is no longer needed — failed compute simply never
|
|
9
|
-
* settles, so the channel state is unchanged.
|
|
10
|
-
*
|
|
11
|
-
* What this poller does:
|
|
12
|
-
*
|
|
13
|
-
* 1. After a paid compute call returns `status: "pending"`, start a
|
|
14
|
-
* background loop that calls `get_compute_result(jobId)` every
|
|
15
|
-
* POLL_INTERVAL_MS.
|
|
16
|
-
* 2. When the response includes a PAYMENT-RESPONSE under
|
|
17
|
-
* `_meta["x402/payment-response"]`, hand it to the batch scheme's
|
|
18
|
-
* `processSettleResponse` so the local `chargedCumulativeAmount`
|
|
19
|
-
* tracks the now-settled cumulative.
|
|
20
|
-
* 3. On terminal `failed`, just exit — the server discarded the
|
|
21
|
-
* pending voucher, so the buyer keeps their full cumulative budget.
|
|
22
|
-
*
|
|
23
|
-
* Spec refs:
|
|
24
|
-
* docs/design/03-BUYER-SDK-SYNC §D — autoSettlePickup contract
|
|
25
|
-
* docs/design/03-BUYER-SDK-SYNC §H — operational envelope (poll
|
|
26
|
-
* interval, max attempts)
|
|
27
|
-
*
|
|
28
|
-
* Opt-out: `HPP_X402_AUTO_POLL=false` (default = on).
|
|
29
|
-
*
|
|
30
|
-
* Exact scheme isn't covered — exact settles on the initial response,
|
|
31
|
-
* so there's nothing left to pick up.
|
|
32
|
-
*/
|
|
33
|
-
import type { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
34
|
-
import type { BatchSettlementEvmScheme } from "@x402/evm/batch-settlement/client";
|
|
35
|
-
import type { SettleResponse } from "@x402/core/types";
|
|
36
|
-
export interface AutoSettlePickupDeps {
|
|
37
|
-
/** Same upstream MCP client used by the bridge's callTool path. */
|
|
38
|
-
base: Client;
|
|
39
|
-
/** The batch-settlement scheme instance for the buyer's local channel. */
|
|
40
|
-
batchScheme: BatchSettlementEvmScheme;
|
|
41
|
-
}
|
|
42
|
-
export interface AutoSettlePickupContext {
|
|
43
|
-
jobId: string;
|
|
44
|
-
channelId: string;
|
|
45
|
-
/** Compute tool name — for logging only. */
|
|
46
|
-
toolName: string;
|
|
47
|
-
}
|
|
48
|
-
/** Returns true unless the env explicitly opts out. */
|
|
49
|
-
export declare function isAutoPollEnabled(): boolean;
|
|
50
|
-
/** Parsed payload from a compute tool's text content. */
|
|
51
|
-
interface ComputeResultPayload {
|
|
52
|
-
status?: string;
|
|
53
|
-
jobId?: string;
|
|
54
|
-
error?: string;
|
|
55
|
-
}
|
|
56
|
-
export declare function parseComputeResultText(text: string): ComputeResultPayload | null;
|
|
57
|
-
/**
|
|
58
|
-
* Pulls a `SettleResponse` out of an MCP tool result's `_meta`, if
|
|
59
|
-
* present. Returns `undefined` when the server didn't attach one
|
|
60
|
-
* (the result is still pending, or this is a non-batch path).
|
|
61
|
-
*/
|
|
62
|
-
export declare function extractSettleResponse(meta: unknown): SettleResponse | undefined;
|
|
63
|
-
/**
|
|
64
|
-
* Fire-and-forget background poller. Polls until terminal then either
|
|
65
|
-
* applies the settle pickup or just exits on failure. Errors inside
|
|
66
|
-
* the poller never propagate — they're logged and the task ends.
|
|
67
|
-
*/
|
|
68
|
-
export declare function startAutoSettlePoller(deps: AutoSettlePickupDeps, ctx: AutoSettlePickupContext): void;
|
|
69
|
-
export {};
|