@obolos_tech/mcp-server 0.2.3 → 0.2.5
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 +18 -2
- package/dist/index.js +0 -0
- package/dist/payment.js +66 -7
- package/dist/payment.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -8,16 +8,32 @@ Every API on the Obolos marketplace becomes a tool your AI agent can call — wi
|
|
|
8
8
|
|
|
9
9
|
### Claude Code
|
|
10
10
|
|
|
11
|
+
By default, `claude mcp add` registers the server for the **current project only**. To make Obolos available in **every Claude Code session** across all your projects, add `--scope user`:
|
|
12
|
+
|
|
13
|
+
**Global (all projects):**
|
|
14
|
+
|
|
11
15
|
```bash
|
|
12
|
-
claude mcp add obolos -- node /path/to/mcp-server/dist/index.js
|
|
16
|
+
claude mcp add obolos --scope user -e OBOLOS_PRIVATE_KEY=0xyour_private_key -- node /path/to/mcp-server/dist/index.js
|
|
13
17
|
```
|
|
14
18
|
|
|
15
|
-
|
|
19
|
+
**Per-project (current project only):**
|
|
16
20
|
|
|
17
21
|
```bash
|
|
18
22
|
claude mcp add obolos -e OBOLOS_PRIVATE_KEY=0xyour_private_key -- node /path/to/mcp-server/dist/index.js
|
|
19
23
|
```
|
|
20
24
|
|
|
25
|
+
**Browse-only (no payments):** omit the `-e OBOLOS_PRIVATE_KEY=...` flag to search and explore APIs without paying.
|
|
26
|
+
|
|
27
|
+
> **Scope reference:**
|
|
28
|
+
>
|
|
29
|
+
> | Scope | Flag | Stored in | Available |
|
|
30
|
+
> |-------|------|-----------|-----------|
|
|
31
|
+
> | Local | *(default)* | `~/.claude.json` (project entry) | Current project only |
|
|
32
|
+
> | Project | `--scope project` | `.mcp.json` at repo root | Anyone who clones the repo |
|
|
33
|
+
> | User | `--scope user` | `~/.claude.json` (global entry) | All projects on your machine |
|
|
34
|
+
>
|
|
35
|
+
> If the same server name exists at multiple scopes, local wins over project, project wins over user.
|
|
36
|
+
|
|
21
37
|
### Claude Desktop
|
|
22
38
|
|
|
23
39
|
Add to `~/.claude/claude_desktop_config.json`:
|
package/dist/index.js
CHANGED
|
File without changes
|
package/dist/payment.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Signs x402 payment requests using a private key (no browser wallet needed).
|
|
5
5
|
* Supports both v1 (exact) and v2 (x402x-router-settlement) payment schemes.
|
|
6
6
|
*/
|
|
7
|
-
import { createWalletClient, http, publicActions, formatUnits, } from 'viem';
|
|
7
|
+
import { createWalletClient, http, publicActions, formatUnits, keccak256, encodePacked, } from 'viem';
|
|
8
8
|
import { privateKeyToAccount } from 'viem/accounts';
|
|
9
9
|
import { base } from 'viem/chains';
|
|
10
10
|
const USDC_ADDRESS = '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913';
|
|
@@ -17,6 +17,42 @@ const USDC_ABI = [
|
|
|
17
17
|
type: 'function',
|
|
18
18
|
},
|
|
19
19
|
];
|
|
20
|
+
/**
|
|
21
|
+
* Calculate the SettlementRouter commitment hash.
|
|
22
|
+
* This must be used as the EIP-3009 nonce when signing for router settlement,
|
|
23
|
+
* because the on-chain contract recalculates and verifies it.
|
|
24
|
+
*/
|
|
25
|
+
function calculateCommitment(params) {
|
|
26
|
+
return keccak256(encodePacked([
|
|
27
|
+
'string', // protocol identifier
|
|
28
|
+
'uint256', // chainId
|
|
29
|
+
'address', // hub (settlementRouter)
|
|
30
|
+
'address', // token
|
|
31
|
+
'address', // from
|
|
32
|
+
'uint256', // value
|
|
33
|
+
'uint256', // validAfter
|
|
34
|
+
'uint256', // validBefore
|
|
35
|
+
'bytes32', // salt
|
|
36
|
+
'address', // payTo
|
|
37
|
+
'uint256', // facilitatorFee
|
|
38
|
+
'address', // hook
|
|
39
|
+
'bytes32', // keccak256(hookData)
|
|
40
|
+
], [
|
|
41
|
+
'X402/settle/v1',
|
|
42
|
+
params.chainId,
|
|
43
|
+
params.hub,
|
|
44
|
+
params.asset,
|
|
45
|
+
params.from,
|
|
46
|
+
params.value,
|
|
47
|
+
params.validAfter,
|
|
48
|
+
params.validBefore,
|
|
49
|
+
params.salt,
|
|
50
|
+
params.payTo,
|
|
51
|
+
params.facilitatorFee,
|
|
52
|
+
params.hook,
|
|
53
|
+
keccak256(params.hookData),
|
|
54
|
+
]));
|
|
55
|
+
}
|
|
20
56
|
export class PaymentSigner {
|
|
21
57
|
account;
|
|
22
58
|
client;
|
|
@@ -72,6 +108,10 @@ export class PaymentSigner {
|
|
|
72
108
|
if (!amount || !payTo) {
|
|
73
109
|
throw new Error('Missing amount or payTo in payment requirement');
|
|
74
110
|
}
|
|
111
|
+
// Check for x402x-router-settlement extension
|
|
112
|
+
const settlementKey = 'x402x-router-settlement';
|
|
113
|
+
const settlementExt = requirement.extra?.[settlementKey];
|
|
114
|
+
const settlementInfo = settlementExt?.info;
|
|
75
115
|
// Build EIP-712 typed data for the exact scheme
|
|
76
116
|
const deadline = BigInt(Math.floor(Date.now() / 1000) + 300); // 5 min
|
|
77
117
|
const amountBigInt = BigInt(amount);
|
|
@@ -92,10 +132,31 @@ export class PaymentSigner {
|
|
|
92
132
|
{ name: 'nonce', type: 'bytes32' },
|
|
93
133
|
],
|
|
94
134
|
};
|
|
95
|
-
//
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
135
|
+
// Determine the nonce: commitment hash for router settlement, random otherwise
|
|
136
|
+
let nonce;
|
|
137
|
+
if (settlementInfo?.settlementRouter && settlementInfo?.salt) {
|
|
138
|
+
// SettlementRouter requires nonce = commitment hash of all settlement params
|
|
139
|
+
nonce = calculateCommitment({
|
|
140
|
+
chainId: 8453n,
|
|
141
|
+
hub: settlementInfo.settlementRouter,
|
|
142
|
+
asset,
|
|
143
|
+
from: this.account.address,
|
|
144
|
+
value: amountBigInt,
|
|
145
|
+
validAfter: 0n,
|
|
146
|
+
validBefore: deadline,
|
|
147
|
+
salt: settlementInfo.salt,
|
|
148
|
+
payTo: settlementInfo.finalPayTo || payTo,
|
|
149
|
+
facilitatorFee: BigInt(settlementInfo.facilitatorFee || '0'),
|
|
150
|
+
hook: settlementInfo.hook,
|
|
151
|
+
hookData: settlementInfo.hookData,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
// Standard exact scheme — random nonce
|
|
156
|
+
const nonceBytes = new Uint8Array(32);
|
|
157
|
+
crypto.getRandomValues(nonceBytes);
|
|
158
|
+
nonce = `0x${Array.from(nonceBytes).map(b => b.toString(16).padStart(2, '0')).join('')}`;
|
|
159
|
+
}
|
|
99
160
|
const message = {
|
|
100
161
|
from: this.account.address,
|
|
101
162
|
to: payTo,
|
|
@@ -133,8 +194,6 @@ export class PaymentSigner {
|
|
|
133
194
|
},
|
|
134
195
|
};
|
|
135
196
|
// Forward settlement extensions if present in the 402 response
|
|
136
|
-
const settlementKey = 'x402x-router-settlement';
|
|
137
|
-
const settlementExt = requirement.extra?.[settlementKey];
|
|
138
197
|
if (settlementExt) {
|
|
139
198
|
paymentPayload.extensions = { [settlementKey]: settlementExt };
|
|
140
199
|
}
|
package/dist/payment.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payment.js","sourceRoot":"","sources":["../src/payment.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,kBAAkB,EAClB,IAAI,EACJ,aAAa,EACb,WAAW,
|
|
1
|
+
{"version":3,"file":"payment.js","sourceRoot":"","sources":["../src/payment.ts"],"names":[],"mappings":"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"}
|