@aifinpay/mcp 2.11.0 → 2.11.4
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 +50 -19
- package/bin/aifinpay-mcp.js +33 -11
- package/dist/client-framework.d.ts +6 -0
- package/dist/client-framework.d.ts.map +1 -1
- package/dist/client-framework.js +15 -2
- package/dist/client-framework.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +14 -4
- package/dist/server.js.map +1 -1
- package/dist/tools/payment-setup-status.d.ts +39 -2
- package/dist/tools/payment-setup-status.d.ts.map +1 -1
- package/dist/tools/payment-setup-status.js +143 -25
- package/dist/tools/payment-setup-status.js.map +1 -1
- package/package.json +3 -3
- package/skills/SKILL.md +67 -34
package/README.md
CHANGED
|
@@ -4,8 +4,8 @@ AiFinPay MCP server for persistent agent identity, Agent Passport resolution,
|
|
|
4
4
|
route discovery and non-signing settlement invoices. Canonical domain:
|
|
5
5
|
**aifinpay.io**.
|
|
6
6
|
|
|
7
|
-
Version **2.11.
|
|
8
|
-
and canonical skill 2.10.
|
|
7
|
+
Version **2.11.4** is prepared in this checkout, on the published agent 2.9.0
|
|
8
|
+
and canonical skill 2.10.2 (AiFinPay/skill 48285cf, published 2026-10-19). The separate canonical producer's final immutable
|
|
9
9
|
source pin is a required handoff, not a moving-branch substitution.
|
|
10
10
|
The published baseline checked2026-10-04 was MCP2.5.0. Package publication and
|
|
11
11
|
real registry dependency/lock refresh remain release gates; a source-cohort
|
|
@@ -25,30 +25,38 @@ and only once the owner has set every limit in step 4.
|
|
|
25
25
|
200 standard requests).
|
|
26
26
|
2. **Check the setup.** Call `payment_setup_status`. It returns the wallet
|
|
27
27
|
(persistent or ephemeral), whether payments are enabled, which owner limits
|
|
28
|
-
are set, the balance when the RPC answers,
|
|
28
|
+
are set, the balance when the RPC answers, `funding` (what a persistent
|
|
29
|
+
wallet needs, priced at today's rate) and `next_step`: the first thing
|
|
29
30
|
still missing.
|
|
30
31
|
3. **Persistent wallet.** If `wallet.persistent` is false, run
|
|
31
32
|
`npx @aifinpay/mcp init`. Without a terminal it prints one JSON document;
|
|
32
33
|
copy its `env` (the passphrase is only there) into the `aifinpay` server
|
|
33
34
|
entry of the MCP client config, reconnect the server, then call
|
|
34
35
|
`agent_reload`. Never fund an ephemeral address.
|
|
35
|
-
4. **Fund and enable.** Tell the owner `addresses.evm` and the amount
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
36
|
+
4. **Fund and enable.** Tell the owner `addresses.evm` and the amount from
|
|
37
|
+
`payment_setup_status`'s `funding`: the smallest batch (`$0.10`) in POL at
|
|
38
|
+
today's rate plus the gas cap (the SDK refuses before signing if the
|
|
39
|
+
worst-case fee exceeds the cap). The rate moves — `$0.10` was 1.08 POL on
|
|
40
|
+
2026-10-19 — so never quote a remembered number; if `funding` carries a
|
|
41
|
+
`rate_error` instead of an `amount`, ask the owner to fund "the batch price
|
|
42
|
+
in POL at today's rate plus the gas cap" and name no number. When the owner
|
|
43
|
+
confirms funding, they add the payment settings to the same `env` and
|
|
44
|
+
restart the aifinpay MCP server in the client (`agent_reload` does not read
|
|
45
|
+
env):
|
|
40
46
|
|
|
41
47
|
```json
|
|
42
48
|
{
|
|
43
49
|
"AIFINPAY_PAYMENTS_ENABLED": "1",
|
|
44
50
|
"AIFINPAY_GATEWAY_ORIGINS": "https://dev.ratersapp.com",
|
|
45
51
|
"AIFINPAY_GATEWAY_PATH_MODE": "direct",
|
|
46
|
-
"AIFINPAY_MAX_USD": "
|
|
47
|
-
"AIFINPAY_DAILY_USD": "
|
|
52
|
+
"AIFINPAY_MAX_USD": "5",
|
|
53
|
+
"AIFINPAY_DAILY_USD": "20",
|
|
48
54
|
"AIFINPAY_MAX_GAS_POL": "0.3"
|
|
49
55
|
}
|
|
50
56
|
```
|
|
51
57
|
|
|
58
|
+
The USD values are a ceiling the owner sets once, not the budget: the
|
|
59
|
+
working limits live in the dashboard (see "Owner limits" below).
|
|
52
60
|
`payment_setup_status` then reports `ready: true`.
|
|
53
61
|
|
|
54
62
|
5. **Pay.** `payable_fetch({"url": "https://dev.ratersapp.com/api/agent/genres/list"})`
|
|
@@ -70,8 +78,8 @@ to the server's `env` (`init` prints the same block):
|
|
|
70
78
|
"AIFINPAY_PAYMENTS_ENABLED": "1",
|
|
71
79
|
"AIFINPAY_GATEWAY_ORIGINS": "https://merchant.example",
|
|
72
80
|
"AIFINPAY_GATEWAY_PATH_MODE": "direct",
|
|
73
|
-
"AIFINPAY_MAX_USD": "
|
|
74
|
-
"AIFINPAY_DAILY_USD": "
|
|
81
|
+
"AIFINPAY_MAX_USD": "5",
|
|
82
|
+
"AIFINPAY_DAILY_USD": "20",
|
|
75
83
|
"AIFINPAY_MAX_GAS_POL": "0.3"
|
|
76
84
|
}
|
|
77
85
|
```
|
|
@@ -82,6 +90,18 @@ owner. `direct` uses the full path for self-hosted sites; `gateway` uses the
|
|
|
82
90
|
merchant slug on the hosted gateway. Restart/reconnect the MCP process after
|
|
83
91
|
changing its environment.
|
|
84
92
|
|
|
93
|
+
### Owner limits: a ceiling in env, the working limits in the dashboard
|
|
94
|
+
|
|
95
|
+
`AIFINPAY_MAX_USD` and `AIFINPAY_DAILY_USD` are the ceiling the SDK requires
|
|
96
|
+
before it signs with the owner's key: set them once, high enough that they do
|
|
97
|
+
not need revisiting (the example `5` per payment and `20` per day is a ceiling,
|
|
98
|
+
not a budget), and leave them. The day-to-day limits belong in the dashboard:
|
|
99
|
+
once the agent is linked with `agent_claim_self`, the owner manages the
|
|
100
|
+
per-payment cap, the daily cap, pause and the allowed sites under **Controls**
|
|
101
|
+
at https://dash.aifinpay.io, and the backend enforces that policy on every
|
|
102
|
+
`/v1/quote` and `/v1/pay` for the claimed agent — no env change, no server
|
|
103
|
+
restart. The env ceiling still applies underneath; a payment has to pass both.
|
|
104
|
+
|
|
85
105
|
## Indexed wallet derivation
|
|
86
106
|
|
|
87
107
|
The wallet CLI and MCP can use deterministic child wallets from one recovery
|
|
@@ -148,8 +168,8 @@ runtime/signer verification and owner limits. It persists the prepared transacti
|
|
|
148
168
|
before sending, verifies the receipt, and reuses the purchased batch. No special
|
|
149
169
|
merchant script, alternate contract or facilitator fallback is used. GET on the configured chain; EVM receipt payments use live
|
|
150
170
|
mode only, in its native currency or the configured
|
|
151
|
-
stablecoin; Amoy payment receipts are not supported. The smallest batch is $0.10 plus gas
|
|
152
|
-
|
|
171
|
+
stablecoin; Amoy payment receipts are not supported. The smallest batch is $0.10 plus gas; `AIFINPAY_MAX_USD`
|
|
172
|
+
only has to be at or above the batch you expect to buy.
|
|
153
173
|
|
|
154
174
|
To buy access to a whole site rather than one endpoint, call
|
|
155
175
|
`payable_fetch({"url":"https://merchant.example/api/data","scope":"merchant"})`.
|
|
@@ -180,11 +200,15 @@ header on the payment requests (and on recovery of a pending payment).
|
|
|
180
200
|
| `cursor`, `cursor-vscode` | `cursor` |
|
|
181
201
|
| `windsurf` | `windsurf` |
|
|
182
202
|
| `chatgpt`, `openai` | `chatgpt` |
|
|
203
|
+
| `codex-mcp-client` | `codex` |
|
|
183
204
|
| `gemini` | `gemini` |
|
|
184
205
|
| `perplexity` | `perplexity` |
|
|
185
206
|
|
|
186
207
|
Names are matched exactly. Any other client sends no header; the server never
|
|
187
|
-
guesses. Nothing in the payment, limits or receipts depends on it.
|
|
208
|
+
guesses. Nothing in the payment, limits or receipts depends on it. At
|
|
209
|
+
initialize the server logs one line to stderr with the name it received, for
|
|
210
|
+
example `[aifinpay-mcp] client "codex-mcp-client" → framework codex`, so a
|
|
211
|
+
client missing from this table can be reported with its exact name.
|
|
188
212
|
|
|
189
213
|
## Link the agent to its owner's dashboard
|
|
190
214
|
|
|
@@ -195,7 +219,8 @@ origins, signs only the claim challenge for this agent's own address, and moves
|
|
|
195
219
|
no funds. The owner-selected payment family must be confirmed successfully;
|
|
196
220
|
the second wallet is best-effort. Use the selected wallet's Fund panel for
|
|
197
221
|
available networks and assets; binding does not activate a disabled network.
|
|
198
|
-
Offer this to the owner after `init
|
|
222
|
+
Offer this to the owner after `init`: from then on the owner manages the
|
|
223
|
+
agent's working limits under Controls there (see "Owner limits" above).
|
|
199
224
|
|
|
200
225
|
Private recovery state for all payment families lives at `AIFINPAY_HOME/payments/<evm-address>/state.json`
|
|
201
226
|
(default home `~/.aifinpay`). State is mode600 in mode700 directories, atomically
|
|
@@ -338,9 +363,15 @@ passphrase, encrypts the keystore and prints one JSON document:
|
|
|
338
363
|
The passphrase appears only inside `env`, because the caller must put it in
|
|
339
364
|
the client config and there is no other channel; a process that captures that
|
|
340
365
|
output captures the passphrase, so treat the output as a secret. A second run
|
|
341
|
-
keeps the wallet and prints a placeholder instead of the passphrase.
|
|
342
|
-
|
|
343
|
-
|
|
366
|
+
keeps the wallet and prints a placeholder instead of the passphrase. When
|
|
367
|
+
`AIFINPAY_HOME` is set, `env` also carries it (absolute), so the server reads the
|
|
368
|
+
keystore init wrote; `payment_setup_status` gives the init command with the
|
|
369
|
+
server's `AIFINPAY_HOME` for the same reason. If the keystore exists, is
|
|
370
|
+
encrypted and `AIFINPAY_WALLET_PASSPHRASE` is unset, `init` leaves it untouched,
|
|
371
|
+
prints one JSON line naming the variable and exits with status 2; its
|
|
372
|
+
`next_step` is to run init in a new, empty `AIFINPAY_HOME`
|
|
373
|
+
(`~/.aifinpay/agent-<yyyymmdd>`) and put the `env` it prints into the client
|
|
374
|
+
config.
|
|
344
375
|
|
|
345
376
|
Select the wallet in this order: `SEED_HASH` → `./aifinpay/agents.json` →
|
|
346
377
|
legacy `AIFINPAY_AGENT_SECRET` → `~/.aifinpay/agent.json`.
|
package/bin/aifinpay-mcp.js
CHANGED
|
@@ -41,7 +41,7 @@ import {
|
|
|
41
41
|
linkSync,
|
|
42
42
|
unlinkSync,
|
|
43
43
|
} from "node:fs";
|
|
44
|
-
import { join } from "node:path";
|
|
44
|
+
import { join, resolve } from "node:path";
|
|
45
45
|
import { homedir } from "node:os";
|
|
46
46
|
import { createRequire } from "node:module";
|
|
47
47
|
import { scryptSync, randomBytes, createCipheriv, createDecipheriv } from "node:crypto";
|
|
@@ -178,19 +178,31 @@ if (arg === "init") {
|
|
|
178
178
|
|
|
179
179
|
const { loadConfigFromEnv } = await import("../dist/config.js");
|
|
180
180
|
const { loadWalletIdentity } = await import("../dist/identity.js");
|
|
181
|
-
const { PAYMENT_ENV } = await import("../dist/tools/payment-setup-status.js");
|
|
181
|
+
const { PAYMENT_ENV, lockedKeystoreStep } = await import("../dist/tools/payment-setup-status.js");
|
|
182
182
|
const config = loadConfigFromEnv();
|
|
183
183
|
// A keystore that cannot be opened is reported in one line that names the
|
|
184
|
-
// variable, never as a stack trace — and never replaced.
|
|
184
|
+
// variable, never as a stack trace — and never replaced. An agent cannot ask
|
|
185
|
+
// anyone for the passphrase, so its JSON also names the way past it that
|
|
186
|
+
// touches nothing: a new wallet in a new, empty AIFINPAY_HOME.
|
|
185
187
|
const failKeystore = (error) => {
|
|
186
188
|
const line =
|
|
187
189
|
!PASSPHRASE && existsSync(KEYSTORE)
|
|
188
190
|
? `${KEYSTORE} exists and is encrypted; set ${PASSPHRASE_ENV} to the passphrase used at init (it is not set in this environment).`
|
|
189
191
|
: error.message;
|
|
192
|
+
let encrypted = false;
|
|
193
|
+
try {
|
|
194
|
+
encrypted = Boolean(JSON.parse(readFileSync(KEYSTORE, "utf8"))?.enc);
|
|
195
|
+
} catch {
|
|
196
|
+
/* No readable keystore: the error is about something else. */
|
|
197
|
+
}
|
|
190
198
|
if (NONINTERACTIVE)
|
|
191
199
|
process.stdout.write(
|
|
192
|
-
JSON.stringify({
|
|
193
|
-
|
|
200
|
+
JSON.stringify({
|
|
201
|
+
error: line,
|
|
202
|
+
keystore: KEYSTORE,
|
|
203
|
+
...(PASSPHRASE ? {} : { missing_env: PASSPHRASE_ENV }),
|
|
204
|
+
...(encrypted ? { next_step: lockedKeystoreStep(KEYSTORE) } : {}),
|
|
205
|
+
}) + "\n"
|
|
194
206
|
);
|
|
195
207
|
else process.stderr.write(line + "\n");
|
|
196
208
|
process.exit(2);
|
|
@@ -205,6 +217,10 @@ if (arg === "init") {
|
|
|
205
217
|
const addressesOf = (agent) => ({ evm: agent.evmAddress, solana: agent.solanaAddress, casper: agent.casperAddress });
|
|
206
218
|
const indexEnv =
|
|
207
219
|
selected?.derivationIndex === undefined ? {} : { AIFINPAY_WALLET_INDEX: String(selected.derivationIndex) };
|
|
220
|
+
// The server reads the keystore (and keeps its payment journal) under the same
|
|
221
|
+
// AIFINPAY_HOME init used, so a non-default one goes into the client env too,
|
|
222
|
+
// absolute: the client does not start the server in this directory.
|
|
223
|
+
const homeEnv = process.env.AIFINPAY_HOME ? { AIFINPAY_HOME: resolve(process.env.AIFINPAY_HOME) } : {};
|
|
208
224
|
// Non-interactive stdout is one JSON document and nothing else, so the
|
|
209
225
|
// caller can parse it. The same facts, as prose, go to a terminal.
|
|
210
226
|
const emit = (json, text) => process.stdout.write(NONINTERACTIVE ? JSON.stringify(json, null, 2) + "\n" : text);
|
|
@@ -222,7 +238,7 @@ if (arg === "init") {
|
|
|
222
238
|
encrypted: null,
|
|
223
239
|
source: selected.source,
|
|
224
240
|
addresses: addressesOf(agent),
|
|
225
|
-
env: indexEnv,
|
|
241
|
+
env: { ...homeEnv, ...indexEnv },
|
|
226
242
|
payment_env_example: PAYMENT_ENV,
|
|
227
243
|
next_step: nextStep,
|
|
228
244
|
},
|
|
@@ -316,6 +332,7 @@ if (arg === "init") {
|
|
|
316
332
|
source: "legacy-keystore",
|
|
317
333
|
addresses: addressesOf(agent),
|
|
318
334
|
env: {
|
|
335
|
+
...homeEnv,
|
|
319
336
|
...(encrypted
|
|
320
337
|
? {
|
|
321
338
|
[PASSPHRASE_ENV]: GENERATED_PASSPHRASE
|
|
@@ -383,6 +400,7 @@ if (arg === "init") {
|
|
|
383
400
|
command: "npx",
|
|
384
401
|
args: ["-y", `@aifinpay/mcp@${VERSION}`],
|
|
385
402
|
env: {
|
|
403
|
+
...homeEnv,
|
|
386
404
|
...(encrypted ? { AIFINPAY_WALLET_PASSPHRASE: "<the passphrase you used for init>" } : {}),
|
|
387
405
|
...indexEnv,
|
|
388
406
|
},
|
|
@@ -409,20 +427,24 @@ if (arg === "init") {
|
|
|
409
427
|
` replace the example. No wildcards.\n` +
|
|
410
428
|
` AIFINPAY_GATEWAY_PATH_MODE "direct" for a site that runs its own AiFinPay\n` +
|
|
411
429
|
` paywall, "gateway" for gateway.aifinpay.io.\n` +
|
|
412
|
-
` AIFINPAY_MAX_USD per payment
|
|
413
|
-
`
|
|
414
|
-
` AIFINPAY_DAILY_USD total over any 24 hours.\n` +
|
|
430
|
+
` AIFINPAY_MAX_USD per payment, a ceiling set once (the smallest\n` +
|
|
431
|
+
` batch is $0.10; the example is not a budget).\n` +
|
|
432
|
+
` AIFINPAY_DAILY_USD total over any 24 hours, the same kind of ceiling.\n` +
|
|
433
|
+
` Day-to-day limits: dashboard Controls, once the\n` +
|
|
434
|
+
` agent is claimed (see below).\n` +
|
|
415
435
|
` AIFINPAY_MAX_GAS_POL worst-case network fee of one payment, checked\n` +
|
|
416
436
|
` before signing. It follows Polygon's gas price:\n` +
|
|
417
437
|
` at ~280 gwei it is ~0.10 POL paying in POL and\n` +
|
|
418
438
|
` ~0.21 POL paying in USDC. A lower cap refuses\n` +
|
|
419
439
|
` the payment; raise it when gas is higher.\n\n` +
|
|
420
|
-
`Fund the EVM address on Polygon with the batch price
|
|
440
|
+
`Fund the EVM address on Polygon with the batch price at today's rate plus the\n` +
|
|
441
|
+
`gas cap, in POL; payment_setup_status prices it.\n` +
|
|
421
442
|
`To pay in USDC, also set "AIFINPAY_PAY_ASSET": "USDC" and hold USDC for the\n` +
|
|
422
443
|
`batch plus POL up to the gas cap. Check the balance before funding or paying.\n\n` +
|
|
423
444
|
`See its balance, payments and receipts in your dashboard:\n` +
|
|
424
445
|
` https://dash.aifinpay.io → My Agents → Claim via MCP, then give the\n` +
|
|
425
|
-
` one-time URL to the agent (tool agent_claim_self)
|
|
446
|
+
` one-time URL to the agent (tool agent_claim_self). Controls there set the\n` +
|
|
447
|
+
` working limits; the env values above stay as the ceiling.\n`
|
|
426
448
|
);
|
|
427
449
|
process.exit(0);
|
|
428
450
|
}
|
|
@@ -1,3 +1,9 @@
|
|
|
1
1
|
import type { AgentFramework } from "@aifinpay/agent";
|
|
2
2
|
export declare function frameworkForClient(name: unknown): AgentFramework | undefined;
|
|
3
|
+
/**
|
|
4
|
+
* One stderr line per connection, so a client the table does not know shows up
|
|
5
|
+
* in the server log instead of silently sending no header. The name is the
|
|
6
|
+
* client's own public identifier, never a secret.
|
|
7
|
+
*/
|
|
8
|
+
export declare function clientFrameworkLine(name: unknown): string;
|
|
3
9
|
//# sourceMappingURL=client-framework.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-framework.d.ts","sourceRoot":"","sources":["../src/client-framework.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"client-framework.d.ts","sourceRoot":"","sources":["../src/client-framework.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAyBtD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,cAAc,GAAG,SAAS,CAE5E;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAGzD"}
|
package/dist/client-framework.js
CHANGED
|
@@ -2,8 +2,11 @@
|
|
|
2
2
|
* MCP `clientInfo.name`, as the client sent it at initialize, → the
|
|
3
3
|
* AIFP-Agent-Framework the backend records. Exact names only: a client not
|
|
4
4
|
* listed here sends no header rather than a guess. Entries are the names the
|
|
5
|
-
* product owner listed plus `cursor-vscode`, which Cursor is reported to send
|
|
6
|
-
*
|
|
5
|
+
* product owner listed plus `cursor-vscode`, which Cursor is reported to send,
|
|
6
|
+
* and `codex-mcp-client`, which Codex sends (openai/codex
|
|
7
|
+
* codex-rs/codex-mcp/src/rmcp_client.rs, `Implementation::new("codex-mcp-client", …)`);
|
|
8
|
+
* confirm new ones against real initialize payloads before adding them. The
|
|
9
|
+
* server logs every client's name at initialize so an unlisted one is visible.
|
|
7
10
|
*/
|
|
8
11
|
const CLIENT_FRAMEWORKS = new Map([
|
|
9
12
|
["claude-ai", "claude"],
|
|
@@ -13,10 +16,20 @@ const CLIENT_FRAMEWORKS = new Map([
|
|
|
13
16
|
["windsurf", "windsurf"],
|
|
14
17
|
["chatgpt", "chatgpt"],
|
|
15
18
|
["openai", "chatgpt"],
|
|
19
|
+
["codex-mcp-client", "codex"],
|
|
16
20
|
["gemini", "gemini"],
|
|
17
21
|
["perplexity", "perplexity"],
|
|
18
22
|
]);
|
|
19
23
|
export function frameworkForClient(name) {
|
|
20
24
|
return typeof name === "string" ? CLIENT_FRAMEWORKS.get(name) : undefined;
|
|
21
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* One stderr line per connection, so a client the table does not know shows up
|
|
28
|
+
* in the server log instead of silently sending no header. The name is the
|
|
29
|
+
* client's own public identifier, never a secret.
|
|
30
|
+
*/
|
|
31
|
+
export function clientFrameworkLine(name) {
|
|
32
|
+
const client = typeof name === "string" ? JSON.stringify(name) : "(unnamed)";
|
|
33
|
+
return `[aifinpay-mcp] client ${client} → framework ${frameworkForClient(name) ?? "none"}`;
|
|
34
|
+
}
|
|
22
35
|
//# sourceMappingURL=client-framework.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-framework.js","sourceRoot":"","sources":["../src/client-framework.ts"],"names":[],"mappings":"AAEA
|
|
1
|
+
{"version":3,"file":"client-framework.js","sourceRoot":"","sources":["../src/client-framework.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAyB;IACxD,CAAC,WAAW,EAAE,QAAQ,CAAC;IACvB,CAAC,aAAa,EAAE,QAAQ,CAAC;IACzB,CAAC,QAAQ,EAAE,QAAQ,CAAC;IACpB,CAAC,eAAe,EAAE,QAAQ,CAAC;IAC3B,CAAC,UAAU,EAAE,UAAU,CAAC;IACxB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,QAAQ,EAAE,SAAS,CAAC;IACrB,CAAC,kBAAkB,EAAE,OAAO,CAAC;IAC7B,CAAC,QAAQ,EAAE,QAAQ,CAAC;IACpB,CAAC,YAAY,EAAE,YAAY,CAAC;CAC7B,CAAC,CAAC;AAEH,MAAM,UAAU,kBAAkB,CAAC,IAAa;IAC9C,OAAO,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC5E,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAa;IAC/C,MAAM,MAAM,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;IAC7E,OAAO,yBAAyB,MAAM,gBAAgB,kBAAkB,CAAC,IAAI,CAAC,IAAI,MAAM,EAAE,CAAC;AAC7F,CAAC"}
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAkB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACrF,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAQnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAS7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAkB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACrF,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAQnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAS7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAgCvD;iFACiF;AACjF,wBAAsB,YAAY,CAAC,MAAM,GAAE,SAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+MxD;AA2BD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,aAAa,CAAC;IACrB,MAAM,EAAE,SAAS,CAAC;IAClB,YAAY,CAAC,EAAE,iBAAiB,CAAC;IACjC,6EAA6E;IAC7E,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,+HAA+H;IAC/H,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9D"}
|
package/dist/server.js
CHANGED
|
@@ -12,11 +12,11 @@ import { makeSafeFetch } from "./safe-fetch.js";
|
|
|
12
12
|
import { loadConfigFromEnv, validatePaymentConfig } from "./config.js";
|
|
13
13
|
import { PaymentStateStore } from "./payment-state.js";
|
|
14
14
|
import { payableFetchTool, runPayableFetch } from "./tools/payable-fetch.js";
|
|
15
|
-
import { paymentSetupStatusTool, runPaymentSetupStatus } from "./tools/payment-setup-status.js";
|
|
15
|
+
import { initCommand, paymentSetupStatusTool, runPaymentSetupStatus } from "./tools/payment-setup-status.js";
|
|
16
16
|
import { agentPassportResolveTool, runAgentPassportResolve, settlementRoutesTool, runSettlementRoutes, settlementInvoiceTool, runSettlementInvoice, settlementSolanaTool, runSettlementSolana, settlementCasperTool, runSettlementCasper, } from "./tools/production-control.js";
|
|
17
17
|
import { deploymentInfoTool, runDeploymentInfo } from "./tools/supported-chains.js";
|
|
18
18
|
import { payChain } from "./pay-chains.js";
|
|
19
|
-
import { frameworkForClient } from "./client-framework.js";
|
|
19
|
+
import { clientFrameworkLine, frameworkForClient } from "./client-framework.js";
|
|
20
20
|
// Every backend/public request made by this server goes through safeFetch.
|
|
21
21
|
// Public deployments never lift private-network protection; local development
|
|
22
22
|
// may explicitly use AIFINPAY_ALLOW_PRIVATE_FETCH=1.
|
|
@@ -26,6 +26,7 @@ const safeFetch = makeSafeFetch({
|
|
|
26
26
|
// for those names — see safe-fetch.ts for why this is not a proxy switch.
|
|
27
27
|
trustedHosts: loadConfigFromEnv().trustedHosts,
|
|
28
28
|
});
|
|
29
|
+
const RELOAD_ENV_NOTE = "Owner limits and AIFINPAY_PAYMENTS_ENABLED are read only when this server starts; agent_reload re-reads the keystore and nothing else. If the owner has saved them since, have the client restart the aifinpay MCP server (restart the client, or disable and re-enable the server), then call payment_setup_status.";
|
|
29
30
|
/** Read-only by default. Explicit owner configuration enables the reviewed
|
|
30
31
|
* family-specific v1.4 payable_fetch path; legacy signing tools stay retired. */
|
|
31
32
|
export async function createServer(config = {}) {
|
|
@@ -62,7 +63,7 @@ export async function createServer(config = {}) {
|
|
|
62
63
|
}));
|
|
63
64
|
identitySource = configured?.source ?? "ephemeral";
|
|
64
65
|
if (!configured)
|
|
65
|
-
log("warn",
|
|
66
|
+
log("warn", `[aifinpay-mcp] EPHEMERAL wallet — DO NOT FUND. Run \`${initCommand(config.walletHome)}\`, then agent_reload in this connection.`);
|
|
66
67
|
let paymentState;
|
|
67
68
|
if (config.paymentsEnabled) {
|
|
68
69
|
validatePaymentConfig(config);
|
|
@@ -82,6 +83,10 @@ export async function createServer(config = {}) {
|
|
|
82
83
|
name: "@aifinpay/mcp",
|
|
83
84
|
version: JSON.parse(readFileSync(new URL("../package.json", import.meta.url), "utf8")).version,
|
|
84
85
|
}, { capabilities: { tools: {}, resources: {} } });
|
|
86
|
+
// The client names itself at initialize. Logging it is how an unlisted name
|
|
87
|
+
// gets found: the 2026-10-19 Codex payment showed as "Independent" because
|
|
88
|
+
// "codex-mcp-client" was not in the table and nothing said what was sent.
|
|
89
|
+
server.oninitialized = () => log("info", clientFrameworkLine(server.getClientVersion()?.name));
|
|
85
90
|
server.setRequestHandler(ListResourcesRequestSchema, async () => ({
|
|
86
91
|
resources: [
|
|
87
92
|
{
|
|
@@ -113,7 +118,7 @@ export async function createServer(config = {}) {
|
|
|
113
118
|
agentClaimSelfTool(),
|
|
114
119
|
{
|
|
115
120
|
name: "agent_reload",
|
|
116
|
-
description: "Reload the configured local wallet files after init or a file update, without starting a new conversation. Returns public addresses only.
|
|
121
|
+
description: "Reload the configured local wallet files after init or a file update, without starting a new conversation. Returns public addresses only. Owner limits and other env changes take effect only after the client restarts the aifinpay MCP server; agent_reload does not read them.",
|
|
117
122
|
inputSchema: { type: "object", properties: {}, additionalProperties: false },
|
|
118
123
|
annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: false },
|
|
119
124
|
},
|
|
@@ -162,6 +167,11 @@ export async function createServer(config = {}) {
|
|
|
162
167
|
evm: agent.evmAddress,
|
|
163
168
|
casper: agent.casperAddress,
|
|
164
169
|
reloaded: true,
|
|
170
|
+
// A reload that succeeds while payments stay off read as "the
|
|
171
|
+
// env was not picked up", and an agent stopped there
|
|
172
|
+
// (2026-10-19): config is fixed at start, so say so.
|
|
173
|
+
payments_enabled: Boolean(config.paymentsEnabled),
|
|
174
|
+
...(config.paymentsEnabled ? {} : { env_note: RELOAD_ENV_NOTE }),
|
|
165
175
|
}),
|
|
166
176
|
},
|
|
167
177
|
],
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAuB,MAAM,iBAAiB,CAAC;AACrF,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,0BAA0B,EAC1B,yBAAyB,GAC1B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AACvF,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACpF,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,11 +17,28 @@ export declare const PAYMENT_ENV: Readonly<{
|
|
|
17
17
|
AIFINPAY_PAYMENTS_ENABLED: "1";
|
|
18
18
|
AIFINPAY_GATEWAY_ORIGINS: "https://merchant.example";
|
|
19
19
|
AIFINPAY_GATEWAY_PATH_MODE: "direct";
|
|
20
|
-
AIFINPAY_MAX_USD: "
|
|
21
|
-
AIFINPAY_DAILY_USD: "
|
|
20
|
+
AIFINPAY_MAX_USD: "5";
|
|
21
|
+
AIFINPAY_DAILY_USD: "20";
|
|
22
22
|
AIFINPAY_MAX_GAS_POL: "0.3";
|
|
23
23
|
}>;
|
|
24
|
+
/** Where the owner manages the working limits once the agent is claimed. */
|
|
25
|
+
export declare const CONTROLS_NOTE = "The USD env values are a ceiling the owner sets once, not the budget: after agent_claim_self the owner sets the working limits (per-payment cap, daily cap, pause, allowed sites) in the dashboard Controls at https://dash.aifinpay.io, and the backend enforces them on every quote and payment.";
|
|
24
26
|
export declare const INIT_COMMAND = "npx @aifinpay/mcp init";
|
|
27
|
+
/**
|
|
28
|
+
* init, run so that it writes the keystore this server reads. An agent's shell
|
|
29
|
+
* does not have the server's AIFINPAY_HOME, so a bare `npx @aifinpay/mcp init`
|
|
30
|
+
* wrote ~/.aifinpay/agent.json while the server kept looking elsewhere.
|
|
31
|
+
*/
|
|
32
|
+
export declare function initCommand(walletHome: string | undefined): string;
|
|
33
|
+
/** A directory that does not exist yet, for a new wallet beside one that cannot be opened. */
|
|
34
|
+
export declare function freshWalletHome(now?: Date): string;
|
|
35
|
+
/**
|
|
36
|
+
* The way past an encrypted keystore nobody here can open. init and the server
|
|
37
|
+
* both refuse to replace it, rightly: it may hold funds. Without this the agent
|
|
38
|
+
* had a refusal and no next move, and the next move it invented was its own key
|
|
39
|
+
* handling. A new, empty AIFINPAY_HOME leaves the old file untouched.
|
|
40
|
+
*/
|
|
41
|
+
export declare function lockedKeystoreStep(keystore: string): string;
|
|
25
42
|
interface Limit {
|
|
26
43
|
env: string;
|
|
27
44
|
set: boolean;
|
|
@@ -52,8 +69,28 @@ export interface PaymentSetupStatus {
|
|
|
52
69
|
rpc: string;
|
|
53
70
|
} | "unknown";
|
|
54
71
|
balance_error?: string;
|
|
72
|
+
/** What to fund a persistent wallet with, priced now; absent for an ephemeral wallet. */
|
|
73
|
+
funding?: Funding;
|
|
55
74
|
next_step: string;
|
|
56
75
|
}
|
|
76
|
+
export interface Funding {
|
|
77
|
+
address: string;
|
|
78
|
+
chain: string;
|
|
79
|
+
asset: string;
|
|
80
|
+
batch_usd: number;
|
|
81
|
+
/** The native/USD rate read for this answer; absent when no price source answered. */
|
|
82
|
+
rate_usd?: number;
|
|
83
|
+
rate_source?: string;
|
|
84
|
+
rate_error?: string;
|
|
85
|
+
/** The smallest batch at that rate. */
|
|
86
|
+
batch_native?: string;
|
|
87
|
+
/** The owner's gas cap, when set. */
|
|
88
|
+
gas_cap?: string;
|
|
89
|
+
/** batch_native plus gas_cap: the amount to fund, when both are known. */
|
|
90
|
+
amount?: string;
|
|
91
|
+
/** The sentence to give the owner. Names a number only when one was read. */
|
|
92
|
+
advice: string;
|
|
93
|
+
}
|
|
57
94
|
export declare function paymentSetupStatusTool(): {
|
|
58
95
|
name: string;
|
|
59
96
|
description: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payment-setup-status.d.ts","sourceRoot":"","sources":["../../src/tools/payment-setup-status.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"payment-setup-status.d.ts","sourceRoot":"","sources":["../../src/tools/payment-setup-status.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { join, resolve } from "node:path";
|
|
1
4
|
import { validatePaymentConfig } from "../config.js";
|
|
2
5
|
import { independentNativeUsd } from "../native-price.js";
|
|
3
6
|
import { payChain } from "../pay-chains.js";
|
|
@@ -16,22 +19,76 @@ import { payChain } from "../pay-chains.js";
|
|
|
16
19
|
export const SMALLEST_BATCH_USD = 0.1;
|
|
17
20
|
// The owner settings that let payable_fetch sign, as init prints them. README
|
|
18
21
|
// "Enable native paid GET requests" shows the same block; a test keeps the two
|
|
19
|
-
// equal and starts a server with it. The
|
|
20
|
-
//
|
|
22
|
+
// equal and starts a server with it. The USD values are a ceiling the owner
|
|
23
|
+
// sets once, not the budget: the working limits (per-payment cap, daily cap,
|
|
24
|
+
// pause, allowed sites) live in the dashboard Controls once the agent is
|
|
25
|
+
// claimed, and the backend enforces those on every quote and payment. The gas
|
|
26
|
+
// cap is a worst case at the current Polygon gas price, not the fee: 0.05 POL
|
|
27
|
+
// refused every payment at ~280 gwei.
|
|
21
28
|
export const PAYMENT_ENV = Object.freeze({
|
|
22
29
|
AIFINPAY_PAYMENTS_ENABLED: "1",
|
|
23
30
|
AIFINPAY_GATEWAY_ORIGINS: "https://merchant.example",
|
|
24
31
|
AIFINPAY_GATEWAY_PATH_MODE: "direct",
|
|
25
|
-
AIFINPAY_MAX_USD: "
|
|
26
|
-
AIFINPAY_DAILY_USD: "
|
|
32
|
+
AIFINPAY_MAX_USD: "5",
|
|
33
|
+
AIFINPAY_DAILY_USD: "20",
|
|
27
34
|
AIFINPAY_MAX_GAS_POL: "0.3",
|
|
28
35
|
});
|
|
36
|
+
/** Where the owner manages the working limits once the agent is claimed. */
|
|
37
|
+
export const CONTROLS_NOTE = "The USD env values are a ceiling the owner sets once, not the budget: after agent_claim_self the owner sets the working limits (per-payment cap, daily cap, pause, allowed sites) in the dashboard Controls at https://dash.aifinpay.io, and the backend enforces them on every quote and payment.";
|
|
29
38
|
export const INIT_COMMAND = "npx @aifinpay/mcp init";
|
|
39
|
+
/** POSIX single quotes: the path reaches init byte for byte, spaces and quotes included. */
|
|
40
|
+
function shellQuote(value) {
|
|
41
|
+
return `'${value.replace(/'/g, `'\\''`)}'`;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* init, run so that it writes the keystore this server reads. An agent's shell
|
|
45
|
+
* does not have the server's AIFINPAY_HOME, so a bare `npx @aifinpay/mcp init`
|
|
46
|
+
* wrote ~/.aifinpay/agent.json while the server kept looking elsewhere.
|
|
47
|
+
*/
|
|
48
|
+
export function initCommand(walletHome) {
|
|
49
|
+
return walletHome ? `AIFINPAY_HOME=${shellQuote(resolve(walletHome))} ${INIT_COMMAND}` : INIT_COMMAND;
|
|
50
|
+
}
|
|
51
|
+
/** A directory that does not exist yet, for a new wallet beside one that cannot be opened. */
|
|
52
|
+
export function freshWalletHome(now = new Date()) {
|
|
53
|
+
const base = join(homedir(), ".aifinpay", `agent-${now.toISOString().slice(0, 10).replace(/-/g, "")}`);
|
|
54
|
+
for (let n = 1;; n++) {
|
|
55
|
+
const candidate = n === 1 ? base : `${base}-${n}`;
|
|
56
|
+
if (!existsSync(candidate))
|
|
57
|
+
return candidate;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* The way past an encrypted keystore nobody here can open. init and the server
|
|
62
|
+
* both refuse to replace it, rightly: it may hold funds. Without this the agent
|
|
63
|
+
* had a refusal and no next move, and the next move it invented was its own key
|
|
64
|
+
* handling. A new, empty AIFINPAY_HOME leaves the old file untouched.
|
|
65
|
+
*/
|
|
66
|
+
export function lockedKeystoreStep(keystore) {
|
|
67
|
+
return (`${keystore} is an encrypted wallet that cannot be opened here: AIFINPAY_WALLET_PASSPHRASE is not set or is wrong. ` +
|
|
68
|
+
`Do not delete, move or overwrite it; it may hold funds. ` +
|
|
69
|
+
`If its passphrase is known, set AIFINPAY_WALLET_PASSPHRASE in the aifinpay server's env in the MCP client config and reconnect. ` +
|
|
70
|
+
`Otherwise create a new wallet in a new, empty directory: run \`${initCommand(freshWalletHome())}\`, ` +
|
|
71
|
+
`put the "env" it prints (it includes AIFINPAY_HOME) into the aifinpay server's env in the MCP client config, ` +
|
|
72
|
+
`reconnect the server, then call agent_reload and payment_setup_status again.`);
|
|
73
|
+
}
|
|
74
|
+
/** The keystore this server reads, when it is encrypted and the server has no passphrase for it. */
|
|
75
|
+
function lockedKeystore(config) {
|
|
76
|
+
if (config.walletPassphrase)
|
|
77
|
+
return undefined;
|
|
78
|
+
const keystore = join(resolve(config.walletHome || join(homedir(), ".aifinpay")), "agent.json");
|
|
79
|
+
try {
|
|
80
|
+
return JSON.parse(readFileSync(keystore, "utf8"))?.enc ? keystore : undefined;
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return undefined;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
30
86
|
export function paymentSetupStatusTool() {
|
|
31
87
|
return {
|
|
32
88
|
name: "payment_setup_status",
|
|
33
89
|
description: "Read-only checklist for paying with payable_fetch: wallet (persistent or ephemeral), whether the owner enabled payments, which owner limits are set, the wallet's native balance on the pay chain when readable, and next_step — exactly one instruction for the first unmet item. " +
|
|
34
|
-
"First payment in five steps: (1) GET the resource and read its 402 (merchant, price, smallest batch); (2) call payment_setup_status; (3) no persistent wallet: run `npx @aifinpay/mcp init` without a terminal, put its printed env into the MCP client config, reconnect, agent_reload; (4) tell the owner the address and the amount
|
|
90
|
+
"First payment in five steps: (1) GET the resource and read its 402 (merchant, price, smallest batch); (2) call payment_setup_status; (3) no persistent wallet: run `npx @aifinpay/mcp init` without a terminal, put its printed env into the MCP client config, reconnect, agent_reload; (4) tell the owner the address and the amount in `funding` (the smallest batch at today's rate plus the gas cap; if no rate could be read, ask for the batch price in the native currency at today's rate plus the gas cap and name no number), and have the owner add the payment env (AIFINPAY_PAYMENTS_ENABLED=1, origins, a USD ceiling, gas cap) and restart the server; (5) payable_fetch the URL. " +
|
|
91
|
+
"The env USD values are a one-time ceiling; after agent_claim_self the owner manages the working limits in the dashboard Controls. " +
|
|
35
92
|
"Signs nothing, moves nothing, never asks the owner's limits from the model.",
|
|
36
93
|
inputSchema: { type: "object", properties: {}, additionalProperties: false },
|
|
37
94
|
annotations: { readOnlyHint: true, openWorldHint: true, destructiveHint: false },
|
|
@@ -101,41 +158,49 @@ export async function paymentSetupStatus(ctx, options) {
|
|
|
101
158
|
next_step: "",
|
|
102
159
|
};
|
|
103
160
|
if (!persistent) {
|
|
161
|
+
const locked = lockedKeystore(config);
|
|
104
162
|
status.next_step =
|
|
105
163
|
`No persistent wallet: this server started with an ephemeral one — do not fund ${ctx.agent.evmAddress}. ` +
|
|
106
|
-
|
|
164
|
+
(locked
|
|
165
|
+
? lockedKeystoreStep(locked)
|
|
166
|
+
: `Run \`${initCommand(config.walletHome)}\` (without a terminal it prints JSON; copy its "env" into this server's env in the MCP client config), reconnect the server, then call agent_reload and payment_setup_status again.`);
|
|
107
167
|
return status;
|
|
108
168
|
}
|
|
169
|
+
// The amount to fund is answered before payments are enabled too: step 4
|
|
170
|
+
// ("tell the owner the address and the amount") happens with payments still
|
|
171
|
+
// off, and the 2026-10-19 quote priced $0.10 at 1.08 POL while the guide
|
|
172
|
+
// still said 0.5 — no fixed rate survives, so the tool reads one now.
|
|
173
|
+
const gasCap = status.limits.gas_cap.set && Number(status.limits.gas_cap.value) > 0 ? String(status.limits.gas_cap.value) : undefined;
|
|
174
|
+
const rpc = config.rpcUrl ?? chain.defaultRpc;
|
|
175
|
+
if (options.readBalance && chain.name !== "solana") {
|
|
176
|
+
status.funding = await funding(ctx, chain, rpc, gasCap);
|
|
177
|
+
}
|
|
109
178
|
if (!config.paymentsEnabled || configError) {
|
|
110
179
|
const block = JSON.stringify(paymentEnvFor(config));
|
|
111
180
|
status.next_step =
|
|
112
181
|
(configError && config.paymentsEnabled
|
|
113
182
|
? `Owner setting refused: ${configError}. `
|
|
114
183
|
: `Payments are off until the owner enables them. `) +
|
|
115
|
-
|
|
116
|
-
|
|
184
|
+
(status.funding ? `${status.funding.advice} ` : "") +
|
|
185
|
+
`Have the owner add this to the server's env in the MCP client config (their real site origin, not the example; ${CONTROLS_NOTE}), then reconnect: ${block}` +
|
|
186
|
+
(configError && !config.paymentsEnabled ? ` Currently missing: ${configError}` : "") +
|
|
187
|
+
// The env is read once, at start. An agent that saw agent_reload succeed
|
|
188
|
+
// and payments stay off concluded the settings were lost, and stopped.
|
|
189
|
+
(config.paymentsEnabled
|
|
190
|
+
? ""
|
|
191
|
+
: ` If the owner has already saved these settings, this server has not been restarted since: agent_reload does not read env. Have the client restart the aifinpay MCP server, then call payment_setup_status again.`);
|
|
117
192
|
return status;
|
|
118
193
|
}
|
|
119
|
-
|
|
120
|
-
if (options.readBalance && chain.name !== "solana") {
|
|
121
|
-
const rpc = config.rpcUrl ?? chain.defaultRpc;
|
|
194
|
+
if (status.funding) {
|
|
122
195
|
try {
|
|
123
196
|
const balance = await nativeBalance(ctx, rpc, ctx.agent.evmAddress);
|
|
124
197
|
status.balance = { amount: formatNative(balance), asset: chain.native, chain: chain.name, rpc };
|
|
125
|
-
const
|
|
126
|
-
fetchImpl: (input, init) => ctx.agent.inner.fetchImpl(input, init),
|
|
127
|
-
chain,
|
|
128
|
-
rpc,
|
|
129
|
-
}).catch(() => undefined);
|
|
130
|
-
const batchNative = price ? SMALLEST_BATCH_USD / price.usd : 0;
|
|
131
|
-
const needed = batchNative + gasCap;
|
|
198
|
+
const needed = status.funding.amount !== undefined ? Number(status.funding.amount) : Number(gasCap);
|
|
132
199
|
if (Number(status.balance.amount) < needed) {
|
|
133
200
|
status.next_step =
|
|
134
|
-
|
|
135
|
-
(
|
|
136
|
-
|
|
137
|
-
: ` (at least the gas cap of ${gasCap} ${chain.native} plus the batch price; it holds ${status.balance.amount})`) +
|
|
138
|
-
`, then call payment_setup_status again.`;
|
|
201
|
+
status.funding.amount !== undefined
|
|
202
|
+
? `Fund ${ctx.agent.evmAddress} on ${chain.label} with about ${status.funding.amount} ${chain.native} (the smallest batch is $${SMALLEST_BATCH_USD.toFixed(2)} ≈ ${status.funding.batch_native} ${chain.native} at today's rate plus up to ${gasCap} ${chain.native} gas; it holds ${status.balance.amount}), then call payment_setup_status again.`
|
|
203
|
+
: `Fund ${ctx.agent.evmAddress} on ${chain.label} with the batch price in ${chain.native} at today's rate plus the gas cap of ${gasCap} ${chain.native} (the rate could not be read here, so ask the owner to look it up; it holds ${status.balance.amount}), then call payment_setup_status again.`;
|
|
139
204
|
return status;
|
|
140
205
|
}
|
|
141
206
|
}
|
|
@@ -146,12 +211,65 @@ export async function paymentSetupStatus(ctx, options) {
|
|
|
146
211
|
status.ready = true;
|
|
147
212
|
status.next_step =
|
|
148
213
|
`Ready. Call payable_fetch({"url": "<HTTPS resource on ${config.gatewayOrigins.join(" or ")}>"}); ` +
|
|
149
|
-
`it pays at most $${config.maxAmountUsd} per call and $${config.dailyAmountUsd} per 24 hours, with gas capped at ${status.limits.gas_cap.value} ${chain.native}
|
|
214
|
+
`it pays at most $${config.maxAmountUsd} per call and $${config.dailyAmountUsd} per 24 hours, with gas capped at ${status.limits.gas_cap.value} ${chain.native}. ` +
|
|
215
|
+
CONTROLS_NOTE +
|
|
150
216
|
(status.balance === "unknown"
|
|
151
|
-
? ` The wallet must hold the batch price plus up to the gas cap in ${chain.native} on ${chain.label}
|
|
217
|
+
? ` The wallet must hold the batch price plus up to the gas cap in ${chain.native} on ${chain.label}` +
|
|
218
|
+
(status.funding?.amount !== undefined ? ` (about ${status.funding.amount} ${chain.native} at today's rate).` : ".")
|
|
152
219
|
: "");
|
|
153
220
|
return status;
|
|
154
221
|
}
|
|
222
|
+
/**
|
|
223
|
+
* The amount to fund, priced now. Never a fixed rate: the number comes from
|
|
224
|
+
* the same independent price sources payable_fetch uses, and when none
|
|
225
|
+
* answers the advice says so and names no number, so the agent asks the owner
|
|
226
|
+
* for "the batch price at today's rate plus the gas cap" instead of inventing one.
|
|
227
|
+
*/
|
|
228
|
+
async function funding(ctx, chain, rpc, gasCap) {
|
|
229
|
+
const address = ctx.agent.evmAddress;
|
|
230
|
+
const base = {
|
|
231
|
+
address,
|
|
232
|
+
chain: chain.name,
|
|
233
|
+
asset: chain.native,
|
|
234
|
+
batch_usd: SMALLEST_BATCH_USD,
|
|
235
|
+
...(gasCap !== undefined ? { gas_cap: gasCap } : {}),
|
|
236
|
+
advice: "",
|
|
237
|
+
};
|
|
238
|
+
const batch = `the smallest batch ($${SMALLEST_BATCH_USD.toFixed(2)})`;
|
|
239
|
+
const cap = gasCap !== undefined ? `the gas cap of ${gasCap} ${chain.native}` : "the gas cap the owner sets";
|
|
240
|
+
try {
|
|
241
|
+
const price = await independentNativeUsd({
|
|
242
|
+
fetchImpl: (input, init) => ctx.agent.inner.fetchImpl(input, init),
|
|
243
|
+
chain,
|
|
244
|
+
rpc,
|
|
245
|
+
});
|
|
246
|
+
const batchNative = SMALLEST_BATCH_USD / price.usd;
|
|
247
|
+
const funded = {
|
|
248
|
+
...base,
|
|
249
|
+
rate_usd: price.usd,
|
|
250
|
+
rate_source: price.source,
|
|
251
|
+
batch_native: formatAmount(batchNative, 4),
|
|
252
|
+
};
|
|
253
|
+
if (gasCap === undefined) {
|
|
254
|
+
funded.advice = `Fund ${address} on ${chain.label} with ${batch} ≈ ${funded.batch_native} ${chain.native} at today's rate ($${formatAmount(price.usd, 4)}/${chain.native}) plus ${cap}.`;
|
|
255
|
+
return funded;
|
|
256
|
+
}
|
|
257
|
+
funded.amount = formatAmount(batchNative + Number(gasCap), 2);
|
|
258
|
+
funded.advice = `Fund ${address} on ${chain.label} with about ${funded.amount} ${chain.native}: ${batch} ≈ ${funded.batch_native} ${chain.native} at today's rate ($${formatAmount(price.usd, 4)}/${chain.native}) plus up to ${gasCap} ${chain.native} gas.`;
|
|
259
|
+
return funded;
|
|
260
|
+
}
|
|
261
|
+
catch (error) {
|
|
262
|
+
return {
|
|
263
|
+
...base,
|
|
264
|
+
rate_error: error.message,
|
|
265
|
+
advice: `The ${chain.native}/USD rate could not be read here, so name no amount: ask the owner to fund ${address} on ${chain.label} with the price of ${batch} in ${chain.native} at today's rate plus ${cap}.`,
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
/** Fixed decimals for readable amounts; more for ones that would round to zero (ETH on Base). */
|
|
270
|
+
function formatAmount(value, decimals) {
|
|
271
|
+
return value.toFixed(value >= 0.01 || value === 0 ? decimals : 6);
|
|
272
|
+
}
|
|
155
273
|
function unready(ctx, source, chain, error) {
|
|
156
274
|
return {
|
|
157
275
|
ready: false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payment-setup-status.js","sourceRoot":"","sources":["../../src/tools/payment-setup-status.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"payment-setup-status.js","sourceRoot":"","sources":["../../src/tools/payment-setup-status.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aifinpay/mcp",
|
|
3
|
-
"version": "2.11.
|
|
3
|
+
"version": "2.11.4",
|
|
4
4
|
"mcpName": "io.github.daochild/aifinpay",
|
|
5
5
|
"description": "AiFinPay MCP: persistent local agent wallets, owner-configured EVM and Solana payment adapters, durable budgets and receipt recovery.",
|
|
6
6
|
"type": "module",
|
|
@@ -76,8 +76,8 @@
|
|
|
76
76
|
},
|
|
77
77
|
"bugs": "https://github.com/AiFinPay/sdk/issues",
|
|
78
78
|
"dependencies": {
|
|
79
|
-
"@aifinpay/agent": "^2.
|
|
80
|
-
"@aifinpay/skill": "^2.10.
|
|
79
|
+
"@aifinpay/agent": "^2.9.0",
|
|
80
|
+
"@aifinpay/skill": "^2.10.2",
|
|
81
81
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
82
82
|
"bs58": "^6.0.0",
|
|
83
83
|
"tweetnacl": "^1.0.3"
|
package/skills/SKILL.md
CHANGED
|
@@ -6,7 +6,7 @@ description: Pay for x402-gated APIs and sites as an agent (AIFP-1 on an owner-s
|
|
|
6
6
|
wallet, payment history, prepaid quotas and Agent Passport records through
|
|
7
7
|
the AiFinPay MCP server or SDK.
|
|
8
8
|
license: MIT
|
|
9
|
-
version: 2.10.
|
|
9
|
+
version: 2.10.2
|
|
10
10
|
author: AiFinPay Support
|
|
11
11
|
metadata:
|
|
12
12
|
hermes:
|
|
@@ -61,17 +61,17 @@ your language. There is no "install together" scenario.
|
|
|
61
61
|
|
|
62
62
|
## Version and release status
|
|
63
63
|
|
|
64
|
-
Release target: MCP **2.11.
|
|
64
|
+
Release target: MCP **2.11.3**, Node SDK **2.9.0**, Python **2.7.0**.
|
|
65
65
|
This skill describes that coordinated package cohort. Check the installed
|
|
66
66
|
versions before using its additional-network instructions; a release target
|
|
67
67
|
does not establish npm/PyPI publication or production network activation.
|
|
68
|
-
Published baseline checked 2026-10-19: MCP **2.
|
|
68
|
+
Published baseline checked 2026-10-19: MCP **2.11.2**, Node SDK **2.8.0**.
|
|
69
69
|
`payable_fetch` has shipped since MCP 2.2.0, and Base since MCP 2.5.0.
|
|
70
70
|
Published packages remain usable within their documented capabilities.
|
|
71
71
|
|
|
72
72
|
| Surface | Can it pay? |
|
|
73
73
|
|---|---|
|
|
74
|
-
| MCP `@aifinpay/mcp` 2.11.x | `payable_fetch`, only with a persistent wallet and every owner limit set; it is always listed and, until then, answers with the setup checklist instead of signing. `payment_setup_status` is the read-only checklist with one `next_step
|
|
74
|
+
| MCP `@aifinpay/mcp` 2.11.x | `payable_fetch`, only with a persistent wallet and every owner limit set; it is always listed and, until then, answers with the setup checklist instead of signing. `payment_setup_status` is the read-only checklist with one `next_step` and, from 2.11.3, `funding`: the amount to fund at today's rate. Polygon is the default; other networks require explicit `AIFINPAY_PAY_CHAIN`. The merchant and backend must authorize and serve that network. `scope: "merchant"` buys a site-wide batch. |
|
|
75
75
|
| Node `@aifinpay/agent` 2.8.x | `fetchPaid` with a v14 journal, gas cap and owner budgets. Select another network with `v14.chain`; select a pinned stablecoin with `v14.asset`. Native payments require an independent native/USD rate. |
|
|
76
76
|
| Python `aifinpay-agent` 2.7.x | `agent.fetch_paid(url, allowed_origins=…, max_amount_usd=…, daily_amount_usd=…)`; use explicit `chain` and the chain's native gas cap for another network, or a pinned stablecoin `asset`. `agent.recover_paid(journal_path)` recovers the original transaction. |
|
|
77
77
|
|
|
@@ -192,23 +192,41 @@ step — no key handling of your own, no funding of an ephemeral address.
|
|
|
192
192
|
example `$0.10` for 200 standard requests).
|
|
193
193
|
2. **Check the setup.** Call `payment_setup_status`. It returns the wallet
|
|
194
194
|
(`persistent` or ephemeral), `payments_enabled`, which owner limits are
|
|
195
|
-
set, the balance when the RPC answers, `
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
195
|
+
set, the balance when the RPC answers, `funding` (what a persistent wallet
|
|
196
|
+
needs, priced now), `ready`, and `next_step` — the one thing still
|
|
197
|
+
missing. Follow `next_step`; do not skip ahead.
|
|
198
|
+
3. **Persistent wallet.** If `wallet.persistent` is false, run the exact
|
|
199
|
+
command in `next_step` (it is `npx @aifinpay/mcp init`, prefixed with
|
|
200
|
+
`AIFINPAY_HOME=…` when the server uses its own wallet directory — keep
|
|
201
|
+
that prefix, or the server will not see the keystore). Without a terminal
|
|
202
|
+
init does not prompt: it generates the passphrase, writes the keystore and
|
|
203
|
+
prints one JSON document with `addresses` and an `env` block. Put that
|
|
204
|
+
`env` into the `aifinpay` server entry of the MCP client config (the
|
|
205
|
+
passphrase is only there — the output is a secret, and a second run never
|
|
206
|
+
reprints it), then call `agent_reload`: it reads the keystore and switches
|
|
207
|
+
this server to the persistent wallet. If init answers that a keystore
|
|
208
|
+
already exists and cannot be opened, do not delete or replace it: follow
|
|
209
|
+
its `next_step` and start a new wallet directory. Never fund an ephemeral
|
|
210
|
+
address.
|
|
204
211
|
4. **Fund and enable.** Tell the owner `addresses.evm` and the amount: the
|
|
205
|
-
batch price in the pay chain's native currency
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
`
|
|
211
|
-
|
|
212
|
+
batch price in the pay chain's native currency at today's rate plus the
|
|
213
|
+
gas cap. Take it from `payment_setup_status` — its `funding` field prices
|
|
214
|
+
the smallest batch now and adds the owner's gas cap into `amount`. The
|
|
215
|
+
rate moves (on 2026-10-19 one `$0.10` batch was 1.08 POL), so never
|
|
216
|
+
quote a remembered number; if `funding` has a `rate_error` and no
|
|
217
|
+
`amount`, ask the owner to fund "the batch price in POL at today's rate
|
|
218
|
+
plus the gas cap" and name no number. When the owner confirms funding,
|
|
219
|
+
they add the payment settings from "Paying with payable_fetch" below —
|
|
220
|
+
with their real origin, and USD values that are a ceiling they will not
|
|
221
|
+
need to revisit (the working limits are set in the dashboard, see "After
|
|
222
|
+
creating a wallet") — to the same `env`. **Limits are read only when the server starts**:
|
|
223
|
+
`agent_reload` re-reads the keystore and nothing else, so after the env
|
|
224
|
+
changes the client has to restart the `aifinpay` MCP server (restart the
|
|
225
|
+
client, or disable and re-enable the server in it). Until that restart
|
|
226
|
+
`payment_setup_status` keeps reporting `payments_enabled: false`; that is
|
|
227
|
+
expected, not a refusal — say so, ask the owner for the restart, and stop.
|
|
228
|
+
After it, `payment_setup_status` reports `ready: true`. Funding, origins
|
|
229
|
+
and limits are the owner's decisions; never choose them yourself.
|
|
212
230
|
5. **Pay.** `payable_fetch({"url":"<origin><path>"})` (add
|
|
213
231
|
`"scope":"merchant"` for a site-wide batch) buys the batch and returns the
|
|
214
232
|
content with the receipt summary. Later requests reuse the batch.
|
|
@@ -238,9 +256,10 @@ into ratersapp.com", "купи доступ до цього сайту". Handle
|
|
|
238
256
|
persistent wallet first, then the owner's funding and environment block
|
|
239
257
|
with this origin in `AIFINPAY_GATEWAY_ORIGINS` (and
|
|
240
258
|
`AIFINPAY_GATEWAY_PATH_MODE=direct` when the 402 comes from the site
|
|
241
|
-
itself) — and stop until the owner has done their part.
|
|
242
|
-
|
|
243
|
-
|
|
259
|
+
itself) — and stop until the owner has done their part. Env changes take
|
|
260
|
+
effect only after the client restarts the `aifinpay` server; `agent_reload`
|
|
261
|
+
does not read them. Adding a site, raising a limit and funding the wallet
|
|
262
|
+
are the owner's decisions; never make them on your own initiative.
|
|
244
263
|
5. **Buy.** `payable_fetch({"url":"<origin><path>","scope":"merchant"})`, where
|
|
245
264
|
the path is what the owner wants to read, or a standard resource from the
|
|
246
265
|
discovery document.
|
|
@@ -259,21 +278,28 @@ default `scope`.
|
|
|
259
278
|
|
|
260
279
|
## Paying with payable_fetch
|
|
261
280
|
|
|
262
|
-
The owner configures these MCP environment values (example
|
|
281
|
+
The owner configures these MCP environment values once (example values; the
|
|
282
|
+
USD ones are a ceiling, not a budget):
|
|
263
283
|
|
|
264
284
|
```json
|
|
265
285
|
{
|
|
266
286
|
"AIFINPAY_PAYMENTS_ENABLED": "1",
|
|
267
287
|
"AIFINPAY_GATEWAY_ORIGINS": "https://merchant.example",
|
|
268
288
|
"AIFINPAY_GATEWAY_PATH_MODE": "direct",
|
|
269
|
-
"AIFINPAY_MAX_USD": "
|
|
270
|
-
"AIFINPAY_DAILY_USD": "
|
|
289
|
+
"AIFINPAY_MAX_USD": "5",
|
|
290
|
+
"AIFINPAY_DAILY_USD": "20",
|
|
271
291
|
"AIFINPAY_MAX_GAS_POL": "0.3"
|
|
272
292
|
}
|
|
273
293
|
```
|
|
274
294
|
|
|
275
|
-
|
|
276
|
-
|
|
295
|
+
`AIFINPAY_MAX_USD` and `AIFINPAY_DAILY_USD` are the ceiling the SDK requires
|
|
296
|
+
before it signs with the owner's key: set once, high enough not to need
|
|
297
|
+
revisiting, and left alone. The day-to-day limits — per-payment cap, daily
|
|
298
|
+
cap, pause, allowed sites — are the dashboard **Controls** once the agent is
|
|
299
|
+
claimed (see "After creating a wallet" below); the backend enforces them on
|
|
300
|
+
every quote and payment, with no env change and no server restart. A payment
|
|
301
|
+
has to pass both. The smallest batch is **$0.10 plus gas** on **Polygon**;
|
|
302
|
+
`AIFINPAY_MAX_USD` only has to be at or above the batch. The gas cap has to cover the
|
|
277
303
|
worst-case fee: at ~280 gwei that is about 0.10 POL for a POL payment and
|
|
278
304
|
0.21 POL for USDC, and a lower cap refuses before anything is signed. The fee
|
|
279
305
|
charged is usually a fraction of that, but the wallet must hold the batch plus
|
|
@@ -286,8 +312,9 @@ wallet or create one with `npx @aifinpay/mcp init` (on a terminal it asks for
|
|
|
286
312
|
a passphrase; without one it generates it and prints the `env` block to put
|
|
287
313
|
into the MCP client config — the server's env needs that same
|
|
288
314
|
`AIFINPAY_WALLET_PASSPHRASE`, or every start mints a new ephemeral wallet);
|
|
289
|
-
fund its EVM address on Polygon with POL, or with USDC plus some POL
|
|
290
|
-
|
|
315
|
+
fund its EVM address on Polygon with POL, or with USDC plus some POL, in the
|
|
316
|
+
amount `payment_setup_status` prices. Funding a wallet does not establish
|
|
317
|
+
unlimited spend authority. Use the owner's actual approved origins and ceiling,
|
|
291
318
|
then call `payable_fetch({"url":"https://merchant.example/api/data"})`.
|
|
292
319
|
|
|
293
320
|
For another network, the owner sets `AIFINPAY_PAY_CHAIN` to an exact name in
|
|
@@ -358,10 +385,16 @@ at https://dash.aifinpay.io → My Agents:
|
|
|
358
385
|
`agent.sign_dashboard_claim(challenge)` (Python). These sign only
|
|
359
386
|
`AiFinPay-claim:polygon:<own address>:<nonce>`.
|
|
360
387
|
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
388
|
+
Once the agent is claimed, the dashboard is where the owner manages its
|
|
389
|
+
working limits: **Controls** on the agent's page sets the per-payment cap, the
|
|
390
|
+
daily cap, pause and the allowed sites, and the backend enforces that policy
|
|
391
|
+
on every `/v1/quote` and `/v1/pay` for the claimed agent — no env change, no
|
|
392
|
+
server restart. The env values (`AIFINPAY_MAX_USD`, `AIFINPAY_DAILY_USD`, the
|
|
393
|
+
gas cap, the origins) stay as the ceiling the SDK requires before it signs;
|
|
394
|
+
they do not replace the dashboard, and the dashboard does not replace them —
|
|
395
|
+
a payment has to pass both. Dashboard controls do not reach transactions sent
|
|
396
|
+
directly outside AiFinPay. After `agent_claim_self`, point the owner at
|
|
397
|
+
Controls rather than at the config file when they want to change a limit.
|
|
365
398
|
|
|
366
399
|
Discover routes on the exact requested origin: `/.well-known/x402.json` and any
|
|
367
400
|
API catalog linked by that site. A dev hostname does not imply testnet. If a
|