@aifinpay/mcp 0.1.0-alpha.5 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/bin/aifinpay-mcp.js +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +12 -1
- package/dist/server.js.map +1 -1
- package/dist/tools/agent-call.d.ts.map +1 -1
- package/dist/tools/agent-call.js +29 -11
- package/dist/tools/agent-call.js.map +1 -1
- package/dist/tools/agent-claim-self.d.ts +2 -2
- package/dist/tools/agent-claim-self.d.ts.map +1 -1
- package/dist/tools/agent-claim-self.js +95 -49
- package/dist/tools/agent-claim-self.js.map +1 -1
- package/dist/tools/payable-fetch.d.ts.map +1 -1
- package/dist/tools/payable-fetch.js +13 -5
- package/dist/tools/payable-fetch.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -61,7 +61,7 @@ agent identity (and any funded Seat) persists across restarts.
|
|
|
61
61
|
| Var | Default | Purpose |
|
|
62
62
|
|---|---|---|
|
|
63
63
|
| `AIFINPAY_AGENT_SECRET` | — | Base58 secret. If absent → ephemeral agent printed to stderr. |
|
|
64
|
-
| `AIFINPAY_BASE_URL` | `https://aifinpay.
|
|
64
|
+
| `AIFINPAY_BASE_URL` | `https://aifinpay.io` | Backend URL for nonce + funding probes. |
|
|
65
65
|
| `AIFINPAY_TIMEOUT_MS` | `30000` | Request timeout. |
|
|
66
66
|
| `AIFINPAY_MAX_USD` | — | Hard cap per single payment. Strongly recommended. |
|
|
67
67
|
|
|
@@ -71,7 +71,7 @@ agent identity (and any funded Seat) persists across restarts.
|
|
|
71
71
|
import { createServer, loadConfigFromEnv } from "@aifinpay/mcp";
|
|
72
72
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
73
73
|
|
|
74
|
-
const { server } = createServer({
|
|
74
|
+
const { server } = await createServer({
|
|
75
75
|
...loadConfigFromEnv(),
|
|
76
76
|
agentSecretB58: "your-secret-here",
|
|
77
77
|
maxAmountUsd: 0.10,
|
package/bin/aifinpay-mcp.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*
|
|
7
7
|
* Configure via env:
|
|
8
8
|
* AIFINPAY_AGENT_SECRET base58 secret (load existing identity)
|
|
9
|
-
* AIFINPAY_BASE_URL default https://aifinpay.
|
|
9
|
+
* AIFINPAY_BASE_URL default https://aifinpay.io
|
|
10
10
|
* AIFINPAY_TIMEOUT_MS default 30000
|
|
11
11
|
* AIFINPAY_MAX_USD hard cap per single payment (no default)
|
|
12
12
|
*/
|
package/dist/index.d.ts
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
* import { createServer } from "@aifinpay/mcp";
|
|
19
19
|
* import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
20
20
|
*
|
|
21
|
-
* const { server } = createServer({ agentSecretB58: process.env.SECRET });
|
|
21
|
+
* const { server } = await createServer({ agentSecretB58: process.env.SECRET });
|
|
22
22
|
* await server.connect(new StdioServerTransport());
|
|
23
23
|
*/
|
|
24
24
|
export { createServer } from "./server.js";
|
package/dist/index.js
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
* import { createServer } from "@aifinpay/mcp";
|
|
19
19
|
* import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
20
20
|
*
|
|
21
|
-
* const { server } = createServer({ agentSecretB58: process.env.SECRET });
|
|
21
|
+
* const { server } = await createServer({ agentSecretB58: process.env.SECRET });
|
|
22
22
|
* await server.connect(new StdioServerTransport());
|
|
23
23
|
*/
|
|
24
24
|
export { createServer } from "./server.js";
|
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,EAAS,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAKnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAa7C;;;;;;;;;;GAUG;AACH,wBAAsB,YAAY,CAAC,MAAM,GAAE,SAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAS,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAKnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAa7C;;;;;;;;;;GAUG;AACH,wBAAsB,YAAY,CAAC,MAAM,GAAE,SAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiGxD;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,aAAa,CAAC;IACrB,MAAM,EAAE,SAAS,CAAC;IAClB,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9D"}
|
package/dist/server.js
CHANGED
|
@@ -39,10 +39,21 @@ export async function createServer(config = {}) {
|
|
|
39
39
|
` >> Save the secret to AIFINPAY_AGENT_SECRET to keep the agent across restarts.`);
|
|
40
40
|
return a;
|
|
41
41
|
})();
|
|
42
|
+
// AIFINPAY_MAX_USD is the documented "hard cap on a single payment".
|
|
43
|
+
// payable_fetch enforces it via PayOptions, but agent_call settles through
|
|
44
|
+
// AiFinPayAgent.call() which only honours the agent's budget caps — wire
|
|
45
|
+
// the cap there too, otherwise the primary tool has NO runaway protection.
|
|
46
|
+
if (config.maxAmountUsd !== undefined && Number.isFinite(config.maxAmountUsd)) {
|
|
47
|
+
agent.setBudget({ per_call_usd: config.maxAmountUsd });
|
|
48
|
+
log("info", `[aifinpay-mcp] per-call cap: $${config.maxAmountUsd} (AIFINPAY_MAX_USD)`);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
log("warn", "[aifinpay-mcp] AIFINPAY_MAX_USD not set — agent_call/payable_fetch have NO per-payment cap. Strongly recommended.");
|
|
52
|
+
}
|
|
42
53
|
log("info", `[aifinpay-mcp] solana: ${agent.solanaAddress} · evm: ${agent.evmAddress}`);
|
|
43
54
|
const server = new Server({
|
|
44
55
|
name: "@aifinpay/mcp",
|
|
45
|
-
version: "
|
|
56
|
+
version: "1.0.0",
|
|
46
57
|
}, {
|
|
47
58
|
capabilities: {
|
|
48
59
|
tools: {},
|
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,EAAS,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACpF,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,aAAa,GACd,MAAM,2BAA2B,CAAC;AAEnC;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,SAAoB,EAAE;IACvD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,IAAI,UAAU,CAAC;IAEvC,sEAAsE;IACtE,uDAAuD;IACvD,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc;QACjC,CAAC,CAAC,MAAM,aAAa,CAAC,gBAAgB,CAAC,MAAM,CAAC,cAAc,EAAE;YAC1D,OAAO,EAAI,MAAM,CAAC,OAAO;YACzB,SAAS,EAAE,MAAM,CAAC,SAAS;SAC5B,CAAC;QACJ,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;YAChB,MAAM,CAAC,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC;gBAChC,OAAO,EAAI,MAAM,CAAC,OAAO;gBACzB,SAAS,EAAE,MAAM,CAAC,SAAS;aAC5B,CAAC,CAAC;YACH,GAAG,CACD,MAAM,EACN,4EAA4E;gBAC1E,qBAAqB,CAAC,CAAC,aAAa,IAAI;gBACxC,qBAAqB,CAAC,CAAC,UAAU,IAAI;gBACrC,qBAAqB,CAAC,CAAC,KAAK,CAAC,SAAS,IAAI;gBAC1C,kFAAkF,CACrF,CAAC;YACF,OAAO,CAAC,CAAC;QACX,CAAC,CAAC,EAAE,CAAC;IAET,GAAG,CAAC,MAAM,EAAE,0BAA0B,KAAK,CAAC,aAAa,WAAW,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;IAExF,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;QACE,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-call.d.ts","sourceRoot":"","sources":["../../src/tools/agent-call.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"agent-call.d.ts","sourceRoot":"","sources":["../../src/tools/agent-call.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6C5B;AAED,wBAAsB,YAAY,CAChC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;;;;;;;GAkE9B"}
|
package/dist/tools/agent-call.js
CHANGED
|
@@ -17,13 +17,21 @@
|
|
|
17
17
|
export function agentCallTool() {
|
|
18
18
|
return {
|
|
19
19
|
name: "agent_call",
|
|
20
|
-
description: "
|
|
21
|
-
"
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
20
|
+
description: "USE THIS TOOL whenever the user asks to call, pay, query, search via, " +
|
|
21
|
+
"or use any of these AiFinPay-registered paid providers: 'exa' (neural " +
|
|
22
|
+
"web search), 'io-net' (LLM inference, Llama-3.3-70B), 'venice' (image " +
|
|
23
|
+
"generation), or any other provider listed at " +
|
|
24
|
+
"https://aifinpay.io/api/providers. " +
|
|
25
|
+
"DO NOT use WebSearch or WebFetch for these providers — they are paid " +
|
|
26
|
+
"APIs accessible only through this MCP, and a plain web search will " +
|
|
27
|
+
"return public marketing pages instead of the actual API. " +
|
|
28
|
+
"Natural-language triggers that should invoke this tool: 'call exa for X', " +
|
|
29
|
+
"'search exa', 'pay venice to generate Y', 'use io-net to run inference', " +
|
|
30
|
+
"'query exa', 'ask io-net'. Provider name maps to the `provider` argument. " +
|
|
31
|
+
"Body is the provider-specific request shape (e.g. {messages:[...]} for " +
|
|
32
|
+
"io-net inference, {query:'...'} for exa search). Returns the upstream " +
|
|
33
|
+
"response with the Polygon tx hash + Polygonscan link prepended. " +
|
|
34
|
+
"Settlement is automatic — Polygon mainnet, atomic 99/1 split via B2BSplitter.",
|
|
27
35
|
inputSchema: {
|
|
28
36
|
type: "object",
|
|
29
37
|
properties: {
|
|
@@ -81,13 +89,23 @@ export async function runAgentCall(ctx, args) {
|
|
|
81
89
|
parsed = JSON.parse(text);
|
|
82
90
|
}
|
|
83
91
|
catch { /* keep as text */ }
|
|
92
|
+
// Pull the @internal settlement metadata attached by AiFinPayAgent.call
|
|
93
|
+
// (see unifiedAgent.ts). Surfacing the tx hash here lets the agent show
|
|
94
|
+
// a clickable explorer link in chat without re-querying the chain.
|
|
95
|
+
const meta = resp;
|
|
96
|
+
const txHash = meta.aifinpayTx;
|
|
97
|
+
const txChain = meta.aifinpayChain;
|
|
98
|
+
const txLine = txHash
|
|
99
|
+
? `Paid on ${txChain ?? "polygon"}. Tx: ${txHash} → https://${txChain === "solana" ? "solscan.io/tx" : "polygonscan.com/tx"}/${txHash}\n\n`
|
|
100
|
+
: "";
|
|
101
|
+
const bodyText = typeof parsed === "string"
|
|
102
|
+
? parsed
|
|
103
|
+
: JSON.stringify({ status: resp.status, body: parsed }, null, 2);
|
|
84
104
|
return {
|
|
85
105
|
content: [
|
|
86
106
|
{
|
|
87
107
|
type: "text",
|
|
88
|
-
text:
|
|
89
|
-
? parsed
|
|
90
|
-
: JSON.stringify({ status: resp.status, body: parsed }, null, 2),
|
|
108
|
+
text: txLine + bodyText,
|
|
91
109
|
},
|
|
92
110
|
],
|
|
93
111
|
};
|
|
@@ -98,7 +116,7 @@ export async function runAgentCall(ctx, args) {
|
|
|
98
116
|
? "Tip: increase the per-call cost cap or use `agent_quote` to preview before paying."
|
|
99
117
|
: message.toLowerCase().includes("revert") || message.toLowerCase().includes("insufficient")
|
|
100
118
|
? `Tip: ensure the EVM address ${ctx.agent.evmAddress} holds enough POL on Polygon for gas + payment.`
|
|
101
|
-
: `Provider may be misconfigured. Check https://aifinpay.
|
|
119
|
+
: `Provider may be misconfigured. Check https://aifinpay.io/api/providers.`;
|
|
102
120
|
return {
|
|
103
121
|
isError: true,
|
|
104
122
|
content: [{ type: "text", text: `agent_call failed: ${message}\n\n${hint}` }],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-call.js","sourceRoot":"","sources":["../../src/tools/agent-call.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,WAAW,EACT,
|
|
1
|
+
{"version":3,"file":"agent-call.js","sourceRoot":"","sources":["../../src/tools/agent-call.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,8 +4,8 @@ import type { ToolContext } from "../server.js";
|
|
|
4
4
|
* autonomously by signing a claim challenge with its own key.
|
|
5
5
|
*
|
|
6
6
|
* Flow (executed inside the tool, no copy-paste between UIs):
|
|
7
|
-
* 1. User signs in to /login on aifinpay.
|
|
8
|
-
* email with URL like `https://aifinpay.
|
|
7
|
+
* 1. User signs in to /login on aifinpay.io → gets a magic-link
|
|
8
|
+
* email with URL like `https://aifinpay.io/api/auth/verify?token=…`
|
|
9
9
|
* 2. User pastes that URL to the agent: "claim yourself on my account
|
|
10
10
|
* using this magic link"
|
|
11
11
|
* 3. Agent calls this tool with the magic_link_url
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-claim-self.d.ts","sourceRoot":"","sources":["../../src/tools/agent-claim-self.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,kBAAkB;;;;;;;;;;;;;;;;;EA6BjC;AAED,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"agent-claim-self.d.ts","sourceRoot":"","sources":["../../src/tools/agent-claim-self.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,kBAAkB;;;;;;;;;;;;;;;;;EA6BjC;AAED,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;;;;;;;GAgL9B"}
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
* autonomously by signing a claim challenge with its own key.
|
|
4
4
|
*
|
|
5
5
|
* Flow (executed inside the tool, no copy-paste between UIs):
|
|
6
|
-
* 1. User signs in to /login on aifinpay.
|
|
7
|
-
* email with URL like `https://aifinpay.
|
|
6
|
+
* 1. User signs in to /login on aifinpay.io → gets a magic-link
|
|
7
|
+
* email with URL like `https://aifinpay.io/api/auth/verify?token=…`
|
|
8
8
|
* 2. User pastes that URL to the agent: "claim yourself on my account
|
|
9
9
|
* using this magic link"
|
|
10
10
|
* 3. Agent calls this tool with the magic_link_url
|
|
@@ -28,7 +28,7 @@ export function agentClaimSelfTool() {
|
|
|
28
28
|
name: "agent_claim_self",
|
|
29
29
|
description: "Attach this agent to a user's AiFinPay account autonomously. " +
|
|
30
30
|
"Requires a magic-link URL the user got after signing in at " +
|
|
31
|
-
"https://aifinpay.
|
|
31
|
+
"https://aifinpay.io/login. The tool will use the link to " +
|
|
32
32
|
"establish a session, request a claim challenge for this agent's " +
|
|
33
33
|
"EVM address, sign it with the agent's key, and submit the proof. " +
|
|
34
34
|
"After this completes, the user's /me page lists this agent and " +
|
|
@@ -39,7 +39,7 @@ export function agentClaimSelfTool() {
|
|
|
39
39
|
magic_link_url: {
|
|
40
40
|
type: "string",
|
|
41
41
|
description: "The URL the user received in the sign-in email. Looks like " +
|
|
42
|
-
"https://aifinpay.
|
|
42
|
+
"https://aifinpay.io/api/auth/verify?token=… — one-shot, " +
|
|
43
43
|
"expires 15 minutes after the user requested it.",
|
|
44
44
|
},
|
|
45
45
|
label: {
|
|
@@ -57,7 +57,7 @@ export async function runAgentClaimSelf(ctx, args) {
|
|
|
57
57
|
if (!magicLinkUrl || !magicLinkUrl.includes("/api/auth/verify?token=")) {
|
|
58
58
|
return {
|
|
59
59
|
isError: true,
|
|
60
|
-
content: [{ type: "text", text: "magic_link_url required — should look like https://aifinpay.
|
|
60
|
+
content: [{ type: "text", text: "magic_link_url required — should look like https://aifinpay.io/api/auth/verify?token=…" }],
|
|
61
61
|
};
|
|
62
62
|
}
|
|
63
63
|
// Derive API base from the magic link itself so demo can run against
|
|
@@ -93,64 +93,107 @@ export async function runAgentClaimSelf(ctx, args) {
|
|
|
93
93
|
}
|
|
94
94
|
// Some setups split multiple cookies; grab the session one we care about.
|
|
95
95
|
const cookieHeader = setCookie.split(",").map((c) => c.trim().split(";")[0]).join("; ");
|
|
96
|
-
//
|
|
96
|
+
// Claim both chains (EVM + Solana). Each is its own challenge + sig.
|
|
97
|
+
// We try Polygon first because that's where live bridges settle today;
|
|
98
|
+
// Solana side is best-effort — if anything fails we still consider the
|
|
99
|
+
// overall claim successful as long as Polygon went through.
|
|
97
100
|
const evmAddr = ctx.agent.evmAddress;
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
+
const solAddr = ctx.agent.solanaAddress;
|
|
102
|
+
const innerAny = ctx.agent.inner;
|
|
103
|
+
const solSecret = innerAny.secretKey; // tweetnacl 64-byte secretKey
|
|
104
|
+
async function claimOne(address, sigFn) {
|
|
105
|
+
// 1) challenge
|
|
106
|
+
const cr = await fetch(`${apiBase}/api/me/agents/challenge`, {
|
|
101
107
|
method: "POST",
|
|
102
108
|
headers: { "content-type": "application/json", cookie: cookieHeader },
|
|
103
|
-
body: JSON.stringify({ address
|
|
109
|
+
body: JSON.stringify({ address }),
|
|
104
110
|
});
|
|
105
|
-
const
|
|
106
|
-
if (!
|
|
107
|
-
return {
|
|
108
|
-
isError: true,
|
|
109
|
-
content: [{ type: "text", text: `Challenge request failed (${r.status}): ${j.error || JSON.stringify(j)}` }],
|
|
110
|
-
};
|
|
111
|
+
const cj = (await cr.json());
|
|
112
|
+
if (!cr.ok || !cj.challenge_id || !cj.message) {
|
|
113
|
+
return { ok: false, reason: cj.error || `challenge HTTP ${cr.status}` };
|
|
111
114
|
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
};
|
|
115
|
+
// 2) sign
|
|
116
|
+
let sigPayload;
|
|
117
|
+
try {
|
|
118
|
+
sigPayload = await sigFn(cj.message);
|
|
117
119
|
}
|
|
118
|
-
|
|
120
|
+
catch (e) {
|
|
121
|
+
return { ok: false, reason: `sign: ${e.message}` };
|
|
122
|
+
}
|
|
123
|
+
// 3) submit
|
|
124
|
+
const sr = await fetch(`${apiBase}/api/me/agents/claim`, {
|
|
125
|
+
method: "POST",
|
|
126
|
+
headers: { "content-type": "application/json", cookie: cookieHeader },
|
|
127
|
+
body: JSON.stringify({ challenge_id: cj.challenge_id, label, ...sigPayload }),
|
|
128
|
+
});
|
|
129
|
+
const sj = (await sr.json());
|
|
130
|
+
if (!sr.ok) {
|
|
131
|
+
return { ok: false, reason: sj.error + (sj.reason ? ` (${sj.reason})` : "") };
|
|
132
|
+
}
|
|
133
|
+
return { ok: true };
|
|
119
134
|
}
|
|
120
|
-
|
|
135
|
+
// ── 2. Claim Polygon EVM ───────────────────────────────────────────
|
|
136
|
+
const polRes = await claimOne(evmAddr, async (msg) => ({
|
|
137
|
+
signature: await ctx.agent.evmAccount.signMessage({ message: msg }),
|
|
138
|
+
}));
|
|
139
|
+
if (!polRes.ok) {
|
|
121
140
|
return {
|
|
122
141
|
isError: true,
|
|
123
|
-
content: [{ type: "text", text: `
|
|
142
|
+
content: [{ type: "text", text: `Polygon claim failed: ${polRes.reason}` }],
|
|
124
143
|
};
|
|
125
144
|
}
|
|
126
|
-
// ── 3.
|
|
127
|
-
let
|
|
145
|
+
// ── 3. Claim Solana (best-effort) ──────────────────────────────────
|
|
146
|
+
let solRes;
|
|
128
147
|
try {
|
|
129
|
-
|
|
148
|
+
const nacl = (await import("tweetnacl")).default;
|
|
149
|
+
const bs58 = (await import("bs58")).default;
|
|
150
|
+
solRes = await claimOne(solAddr, async (msg) => {
|
|
151
|
+
const sig = nacl.sign.detached(Buffer.from(msg, "utf8"), solSecret);
|
|
152
|
+
return { signature_base58: bs58.encode(sig) };
|
|
153
|
+
});
|
|
130
154
|
}
|
|
131
155
|
catch (e) {
|
|
132
|
-
|
|
133
|
-
isError: true,
|
|
134
|
-
content: [{ type: "text", text: `Signing failed: ${e.message}` }],
|
|
135
|
-
};
|
|
156
|
+
solRes = { ok: false, reason: `solana_signer_unavailable: ${e.message}` };
|
|
136
157
|
}
|
|
137
|
-
// ── 4.
|
|
158
|
+
// ── 4. Balance check (best-effort) — drives funded-vs-unfunded copy ─
|
|
159
|
+
// Never block the claim flow on a balance check; if the RPC is down or
|
|
160
|
+
// balance() throws, fall back to the standard funding recommendation.
|
|
161
|
+
let polygonUsdc = 0;
|
|
162
|
+
let solanaUsdc = 0;
|
|
138
163
|
try {
|
|
139
|
-
const
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
164
|
+
const bal = await ctx.agent.balance();
|
|
165
|
+
polygonUsdc = bal.chains.polygon.usdc ?? 0;
|
|
166
|
+
solanaUsdc = bal.chains.solana.usdc ?? 0;
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
/* swallow — keep funding_recommendation as-is */
|
|
170
|
+
}
|
|
171
|
+
// ── 5. Report ──────────────────────────────────────────────────────
|
|
172
|
+
try {
|
|
173
|
+
// Dashboard URLs live at dashboard.aifinpay.io regardless of
|
|
174
|
+
// which host the user used for magic-link sign-in. apiBase is correct
|
|
175
|
+
// only for /me (which lives at whichever host the user signed in via).
|
|
176
|
+
const DASHBOARD_BASE = "https://dashboard.aifinpay.io";
|
|
177
|
+
// Funded threshold: 0.10 USDC (~4 io-net calls). Below this we still
|
|
178
|
+
// show the funding tip; at-or-above we show a "Funded" status so the
|
|
179
|
+
// agent doesn't tell the user to send money they already sent.
|
|
180
|
+
const FUNDED_USDC_THRESHOLD = 0.10;
|
|
181
|
+
const polygonFunded = polygonUsdc >= FUNDED_USDC_THRESHOLD;
|
|
182
|
+
const fundingFields = polygonFunded
|
|
183
|
+
? {
|
|
184
|
+
funding_status: `Funded — $${polygonUsdc.toFixed(2)} USDC available on Polygon`,
|
|
185
|
+
}
|
|
186
|
+
: {
|
|
187
|
+
// Live bridges (io.net, Exa, Venice) settle on Polygon — fund
|
|
188
|
+
// the Polygon address with USDC for autonomous calls today.
|
|
189
|
+
// Solana is claimed for visibility; SOL-native settlement is
|
|
190
|
+
// available on bridges that advertise pay_solana in their 402.
|
|
191
|
+
funding_recommendation: `Send USDC on Polygon to ${evmAddr} (~0.5 USDC ≈ 20 calls). Optionally fund the Solana address with SOL to use Solana-native bridges.`,
|
|
153
192
|
};
|
|
193
|
+
// Surface Solana USDC status when balance() exposes a non-zero value;
|
|
194
|
+
// schema doesn't currently include solana.usdc but future-proof here.
|
|
195
|
+
if (solanaUsdc >= FUNDED_USDC_THRESHOLD) {
|
|
196
|
+
fundingFields.funding_status_solana = `Funded — $${solanaUsdc.toFixed(2)} USDC available on Solana`;
|
|
154
197
|
}
|
|
155
198
|
return {
|
|
156
199
|
content: [
|
|
@@ -158,10 +201,13 @@ export async function runAgentClaimSelf(ctx, args) {
|
|
|
158
201
|
type: "text",
|
|
159
202
|
text: JSON.stringify({
|
|
160
203
|
ok: true,
|
|
161
|
-
|
|
162
|
-
|
|
204
|
+
polygon_address: evmAddr,
|
|
205
|
+
polygon_claim: "ok",
|
|
206
|
+
solana_address: solAddr,
|
|
207
|
+
solana_claim: solRes.ok ? "ok" : `skipped (${solRes.reason})`,
|
|
163
208
|
label: label || null,
|
|
164
|
-
|
|
209
|
+
...fundingFields,
|
|
210
|
+
next: `Visit ${DASHBOARD_BASE}/agents/${evmAddr} (Polygon view) or ${DASHBOARD_BASE}/agents/${solAddr} (Solana view). Watchlist: ${apiBase}/me.`,
|
|
165
211
|
}, null, 2),
|
|
166
212
|
},
|
|
167
213
|
],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-claim-self.js","sourceRoot":"","sources":["../../src/tools/agent-claim-self.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO;QACL,IAAI,EAAE,kBAAkB;QACxB,WAAW,EACT,+DAA+D;YAC/D,6DAA6D;YAC7D,
|
|
1
|
+
{"version":3,"file":"agent-claim-self.js","sourceRoot":"","sources":["../../src/tools/agent-claim-self.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payable-fetch.d.ts","sourceRoot":"","sources":["../../src/tools/payable-fetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,wBAAgB,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"payable-fetch.d.ts","sourceRoot":"","sources":["../../src/tools/payable-fetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,wBAAgB,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkD/B;AAED,wBAAsB,eAAe,CACnC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;;;;;;GA6D9B"}
|
|
@@ -1,10 +1,18 @@
|
|
|
1
1
|
export function payableFetchTool() {
|
|
2
2
|
return {
|
|
3
3
|
name: "payable_fetch",
|
|
4
|
-
description: "
|
|
5
|
-
"
|
|
6
|
-
"
|
|
7
|
-
"
|
|
4
|
+
description: "USE THIS TOOL to fetch any URL that may require payment (HTTP 402). " +
|
|
5
|
+
"DO NOT use WebFetch for URLs that might be paid endpoints — WebFetch " +
|
|
6
|
+
"cannot sign x402 payment headers and will only see the 402 challenge " +
|
|
7
|
+
"without being able to settle it. " +
|
|
8
|
+
"Natural-language triggers: 'fetch <paid URL>', 'pay for <url>', " +
|
|
9
|
+
"'try this URL — it might be paid', 'pay the 402 and get the response'. " +
|
|
10
|
+
"The agent automatically detects the x402 facilitator flavor (AiFinPay " +
|
|
11
|
+
"or Coinbase x402), signs a payment from the agent's wallet, retries, " +
|
|
12
|
+
"and returns the response status, headers, and body. For known " +
|
|
13
|
+
"AiFinPay-registered providers (exa, io-net, venice, ...), prefer " +
|
|
14
|
+
"`agent_call` instead — it's higher-level and resolves the bridge URL " +
|
|
15
|
+
"from the registry.",
|
|
8
16
|
inputSchema: {
|
|
9
17
|
type: "object",
|
|
10
18
|
properties: {
|
|
@@ -84,7 +92,7 @@ export async function runPayableFetch(ctx, args) {
|
|
|
84
92
|
const err = e;
|
|
85
93
|
return errorResult(`${err.constructor.name}: ${err.message}`, `Tip: ensure agent ${ctx.agent.solanaAddress} has a funded Seat PDA, ` +
|
|
86
94
|
`or use the unified \`agent_call\` tool (Polygon settlement). ` +
|
|
87
|
-
`Docs: https://aifinpay.
|
|
95
|
+
`Docs: https://aifinpay.io/docs`);
|
|
88
96
|
}
|
|
89
97
|
}
|
|
90
98
|
function errorResult(...lines) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payable-fetch.js","sourceRoot":"","sources":["../../src/tools/payable-fetch.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,gBAAgB;IAC9B,OAAO;QACL,IAAI,EAAE,eAAe;QACrB,WAAW,EACT,
|
|
1
|
+
{"version":3,"file":"payable-fetch.js","sourceRoot":"","sources":["../../src/tools/payable-fetch.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aifinpay/mcp",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"description": "Pay-per-call MCP server for autonomous AI agents \u2014 installs in Claude Desktop / Cursor / Continue with one config block; on-chain settlement on Polygon and Solana via x402.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
},
|
|
58
58
|
"bugs": "https://github.com/AiFinPay/sdk/issues",
|
|
59
59
|
"dependencies": {
|
|
60
|
-
"@aifinpay/agent": "^0.
|
|
60
|
+
"@aifinpay/agent": "^1.0.0",
|
|
61
61
|
"@modelcontextprotocol/sdk": "^1.0.0"
|
|
62
62
|
},
|
|
63
63
|
"devDependencies": {
|