@aifinpay/mcp 1.4.0 → 1.5.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/dist/safe-fetch.d.ts +25 -0
- package/dist/safe-fetch.d.ts.map +1 -0
- package/dist/safe-fetch.js +167 -0
- package/dist/safe-fetch.js.map +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +25 -4
- package/dist/server.js.map +1 -1
- package/dist/tools/agent-claim-self.d.ts.map +1 -1
- package/dist/tools/agent-claim-self.js +74 -1
- package/dist/tools/agent-claim-self.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** True when this address must not be contacted. */
|
|
2
|
+
export declare function isBlockedAddress(addr: string): boolean;
|
|
3
|
+
export declare class BlockedRequestError extends Error {
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Decide whether one URL may be requested.
|
|
7
|
+
*
|
|
8
|
+
* Resolution happens here, not at connect time, so a hostname that points at a
|
|
9
|
+
* private address is refused by name. It leaves a DNS-rebinding window between
|
|
10
|
+
* this lookup and the socket — closing that needs a custom agent that pins the
|
|
11
|
+
* resolved address, which is worth doing and is not done here.
|
|
12
|
+
*/
|
|
13
|
+
export declare function assertRequestAllowed(rawUrl: string, opts?: {
|
|
14
|
+
allowPrivate?: boolean;
|
|
15
|
+
}): Promise<URL>;
|
|
16
|
+
/**
|
|
17
|
+
* A `fetch` that validates the target, and every redirect target, before going.
|
|
18
|
+
*
|
|
19
|
+
* Installed as the agent's fetchImpl so the whole payment flow inherits it —
|
|
20
|
+
* the 402 probe, the retry with proof, and anything a bridge redirects to.
|
|
21
|
+
*/
|
|
22
|
+
export declare function makeSafeFetch(opts?: {
|
|
23
|
+
allowPrivate?: boolean;
|
|
24
|
+
}): typeof fetch;
|
|
25
|
+
//# sourceMappingURL=safe-fetch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safe-fetch.d.ts","sourceRoot":"","sources":["../src/safe-fetch.ts"],"names":[],"mappings":"AA4DA,oDAAoD;AACpD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAmBtD;AAED,qBAAa,mBAAoB,SAAQ,KAAK;CAAG;AAEjD;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,MAAM,EACd,IAAI,GAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAA;CAAO,GACpC,OAAO,CAAC,GAAG,CAAC,CAkDd;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,GAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,KAAK,CA4BjF"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
// Where this MCP server is allowed to send a request.
|
|
2
|
+
//
|
|
3
|
+
// payable_fetch takes a URL from the caller and hands it to the agent, which
|
|
4
|
+
// requests it and, on a 402, pays and requests it again. Nothing checked the
|
|
5
|
+
// URL. A caller — or a prompt injection reaching this tool — could name
|
|
6
|
+
// http://127.0.0.1:4001, http://169.254.169.254/latest/meta-data/ or any host
|
|
7
|
+
// inside the network the process sits in, and read the reply. That is the tool
|
|
8
|
+
// that is exposed over HTTP today, so it is the one that matters most.
|
|
9
|
+
//
|
|
10
|
+
// The guard lives here rather than in the tool because a check on the first URL
|
|
11
|
+
// is not a check on the request: a public host that answers 302 to
|
|
12
|
+
// http://169.254.169.254 defeats it. This is installed as the agent's
|
|
13
|
+
// `fetchImpl`, so every request the agent makes passes through it, redirects
|
|
14
|
+
// are followed one at a time, and each hop is validated before it is taken.
|
|
15
|
+
//
|
|
16
|
+
// Not a firewall. A process that can be told to make requests should also be
|
|
17
|
+
// confined at the network layer; this stops the obvious reach, not a determined
|
|
18
|
+
// one with an SSRF-friendly public host to bounce off.
|
|
19
|
+
import { lookup } from "node:dns/promises";
|
|
20
|
+
import { isIP } from "node:net";
|
|
21
|
+
/** How many redirects to follow before giving up. */
|
|
22
|
+
const MAX_REDIRECTS = 5;
|
|
23
|
+
/**
|
|
24
|
+
* Address ranges a request must never reach, as [first, last] 32-bit integers.
|
|
25
|
+
*
|
|
26
|
+
* Loopback and the private ranges are the obvious ones. 169.254.0.0/16 carries
|
|
27
|
+
* the cloud metadata endpoint, which is the single most valuable thing an SSRF
|
|
28
|
+
* can reach — credentials, usually. 100.64.0.0/10 is carrier-grade NAT, which
|
|
29
|
+
* on some hosts is the internal network. 0.0.0.0/8 matters because 0.0.0.0
|
|
30
|
+
* resolves to localhost on Linux.
|
|
31
|
+
*/
|
|
32
|
+
const BLOCKED_V4 = [
|
|
33
|
+
[0x00000000, 0x00ffffff], // 0.0.0.0/8
|
|
34
|
+
[0x0a000000, 0x0affffff], // 10.0.0.0/8
|
|
35
|
+
[0x64400000, 0x647fffff], // 100.64.0.0/10 carrier NAT
|
|
36
|
+
[0x7f000000, 0x7fffffff], // 127.0.0.0/8 loopback
|
|
37
|
+
[0xa9fe0000, 0xa9feffff], // 169.254.0.0/16 link-local + metadata
|
|
38
|
+
[0xac100000, 0xac1fffff], // 172.16.0.0/12
|
|
39
|
+
[0xc0000000, 0xc00000ff], // 192.0.0.0/24
|
|
40
|
+
[0xc0a80000, 0xc0a8ffff], // 192.168.0.0/16
|
|
41
|
+
[0xc6120000, 0xc613ffff], // 198.18.0.0/15 benchmarking
|
|
42
|
+
[0xe0000000, 0xefffffff], // 224.0.0.0/4 multicast
|
|
43
|
+
[0xf0000000, 0xffffffff], // 240.0.0.0/4 reserved + broadcast
|
|
44
|
+
];
|
|
45
|
+
function v4ToInt(ip) {
|
|
46
|
+
const parts = ip.split(".");
|
|
47
|
+
if (parts.length !== 4)
|
|
48
|
+
return null;
|
|
49
|
+
let n = 0;
|
|
50
|
+
for (const p of parts) {
|
|
51
|
+
const b = Number(p);
|
|
52
|
+
if (!Number.isInteger(b) || b < 0 || b > 255)
|
|
53
|
+
return null;
|
|
54
|
+
n = (n << 8) | b;
|
|
55
|
+
}
|
|
56
|
+
return n >>> 0;
|
|
57
|
+
}
|
|
58
|
+
/** True when this address must not be contacted. */
|
|
59
|
+
export function isBlockedAddress(addr) {
|
|
60
|
+
const family = isIP(addr);
|
|
61
|
+
if (family === 4) {
|
|
62
|
+
const n = v4ToInt(addr);
|
|
63
|
+
if (n === null)
|
|
64
|
+
return true; // unparseable is not something to gamble on
|
|
65
|
+
return BLOCKED_V4.some(([lo, hi]) => n >= lo && n <= hi);
|
|
66
|
+
}
|
|
67
|
+
if (family === 6) {
|
|
68
|
+
const lower = addr.toLowerCase().replace(/^\[|\]$/g, "");
|
|
69
|
+
// An IPv4-mapped address is an IPv4 address wearing a hat. Unwrap it, or
|
|
70
|
+
// ::ffff:127.0.0.1 walks straight through an IPv6-only check.
|
|
71
|
+
const mapped = lower.match(/^::ffff:(\d+\.\d+\.\d+\.\d+)$/);
|
|
72
|
+
if (mapped)
|
|
73
|
+
return isBlockedAddress(mapped[1]);
|
|
74
|
+
if (lower === "::1" || lower === "::")
|
|
75
|
+
return true;
|
|
76
|
+
if (/^f[cd][0-9a-f]{2}:/.test(lower))
|
|
77
|
+
return true; // fc00::/7 unique-local
|
|
78
|
+
if (/^fe[89ab][0-9a-f]:/.test(lower))
|
|
79
|
+
return true; // fe80::/10 link-local
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
return true; // not an address at all
|
|
83
|
+
}
|
|
84
|
+
export class BlockedRequestError extends Error {
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Decide whether one URL may be requested.
|
|
88
|
+
*
|
|
89
|
+
* Resolution happens here, not at connect time, so a hostname that points at a
|
|
90
|
+
* private address is refused by name. It leaves a DNS-rebinding window between
|
|
91
|
+
* this lookup and the socket — closing that needs a custom agent that pins the
|
|
92
|
+
* resolved address, which is worth doing and is not done here.
|
|
93
|
+
*/
|
|
94
|
+
export async function assertRequestAllowed(rawUrl, opts = {}) {
|
|
95
|
+
let url;
|
|
96
|
+
try {
|
|
97
|
+
url = new URL(rawUrl);
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
throw new BlockedRequestError(`not a valid URL: ${rawUrl}`);
|
|
101
|
+
}
|
|
102
|
+
if (opts.allowPrivate)
|
|
103
|
+
return url; // an operator asked for this explicitly
|
|
104
|
+
if (url.protocol !== "https:" && url.protocol !== "http:") {
|
|
105
|
+
throw new BlockedRequestError(`refusing ${url.protocol} — only http and https are requested by this server`);
|
|
106
|
+
}
|
|
107
|
+
if (url.protocol === "http:") {
|
|
108
|
+
// Plaintext to a public host leaks the request and invites a redirect into
|
|
109
|
+
// the private range from anyone on the path.
|
|
110
|
+
throw new BlockedRequestError(`refusing http://${url.host} — payable requests must be https`);
|
|
111
|
+
}
|
|
112
|
+
const host = url.hostname.replace(/^\[|\]$/g, "");
|
|
113
|
+
if (isIP(host)) {
|
|
114
|
+
if (isBlockedAddress(host)) {
|
|
115
|
+
throw new BlockedRequestError(`refusing ${host}: not a public address`);
|
|
116
|
+
}
|
|
117
|
+
return url;
|
|
118
|
+
}
|
|
119
|
+
let addresses;
|
|
120
|
+
try {
|
|
121
|
+
addresses = await lookup(host, { all: true });
|
|
122
|
+
}
|
|
123
|
+
catch (e) {
|
|
124
|
+
throw new BlockedRequestError(`cannot resolve ${host}: ${e.message}`);
|
|
125
|
+
}
|
|
126
|
+
if (!addresses.length) {
|
|
127
|
+
throw new BlockedRequestError(`${host} resolved to nothing`);
|
|
128
|
+
}
|
|
129
|
+
// Every answer must be public. One private address among several is enough
|
|
130
|
+
// for a host to be steering us somewhere internal.
|
|
131
|
+
for (const { address } of addresses) {
|
|
132
|
+
if (isBlockedAddress(address)) {
|
|
133
|
+
throw new BlockedRequestError(`refusing ${host}: it resolves to ${address}, which is not a public address`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return url;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* A `fetch` that validates the target, and every redirect target, before going.
|
|
140
|
+
*
|
|
141
|
+
* Installed as the agent's fetchImpl so the whole payment flow inherits it —
|
|
142
|
+
* the 402 probe, the retry with proof, and anything a bridge redirects to.
|
|
143
|
+
*/
|
|
144
|
+
export function makeSafeFetch(opts = {}) {
|
|
145
|
+
const safeFetch = async (input, init) => {
|
|
146
|
+
let target = typeof input === "string" ? input
|
|
147
|
+
: input instanceof URL ? input.toString()
|
|
148
|
+
: input.url;
|
|
149
|
+
let request = init;
|
|
150
|
+
for (let hop = 0; hop <= MAX_REDIRECTS; hop++) {
|
|
151
|
+
await assertRequestAllowed(target, opts);
|
|
152
|
+
const res = await globalThis.fetch(target, { ...request, redirect: "manual" });
|
|
153
|
+
const location = res.status >= 300 && res.status < 400 ? res.headers.get("location") : null;
|
|
154
|
+
if (!location)
|
|
155
|
+
return res;
|
|
156
|
+
target = new URL(location, target).toString();
|
|
157
|
+
// 303, and 301/302 in practice, turn the follow-up into a GET with no
|
|
158
|
+
// body. Mirroring that keeps behaviour the same as a normal fetch.
|
|
159
|
+
if (res.status === 303 || res.status === 301 || res.status === 302) {
|
|
160
|
+
request = { ...request, method: "GET", body: undefined };
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
throw new BlockedRequestError(`too many redirects (more than ${MAX_REDIRECTS})`);
|
|
164
|
+
};
|
|
165
|
+
return safeFetch;
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=safe-fetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safe-fetch.js","sourceRoot":"","sources":["../src/safe-fetch.ts"],"names":[],"mappings":"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"}
|
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;
|
|
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;AA4B7C;;;;;;;;;;GAUG;AACH,wBAAsB,YAAY,CAAC,MAAM,GAAE,SAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiHxD;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
|
@@ -6,7 +6,21 @@ import { agentAddressTool, runAgentAddress } from "./tools/agent-address.js";
|
|
|
6
6
|
import { agentQuoteTool, runAgentQuote } from "./tools/agent-quote.js";
|
|
7
7
|
import { agentCallTool, runAgentCall } from "./tools/agent-call.js";
|
|
8
8
|
import { agentClaimSelfTool, runAgentClaimSelf } from "./tools/agent-claim-self.js";
|
|
9
|
+
import { makeSafeFetch } from "./safe-fetch.js";
|
|
9
10
|
import { payWithSplitTool, runPayWithSplit, quoteSplitTool, runQuoteSplit, } from "./tools/pay-with-split.js";
|
|
11
|
+
// Every request the agent makes goes through this, including redirects.
|
|
12
|
+
//
|
|
13
|
+
// payable_fetch hands a caller-supplied URL to the agent, which requests it
|
|
14
|
+
// and, on a 402, pays and requests it again. Nothing checked the URL, so a
|
|
15
|
+
// caller — or a prompt injection reaching the tool — could name
|
|
16
|
+
// http://127.0.0.1:4001 or http://169.254.169.254/latest/meta-data/ and read
|
|
17
|
+
// the answer. It is the tool exposed over HTTP today.
|
|
18
|
+
//
|
|
19
|
+
// Set AIFINPAY_ALLOW_PRIVATE_FETCH=1 to lift it, which is what a local bridge
|
|
20
|
+
// on localhost needs and what a public deployment must never have.
|
|
21
|
+
const safeFetch = makeSafeFetch({
|
|
22
|
+
allowPrivate: process.env.AIFINPAY_ALLOW_PRIVATE_FETCH === "1",
|
|
23
|
+
});
|
|
10
24
|
/**
|
|
11
25
|
* Build an MCP server that wraps the AiFinPay agent SDK as MCP tools.
|
|
12
26
|
*
|
|
@@ -24,11 +38,13 @@ export async function createServer(config = {}) {
|
|
|
24
38
|
// and print to stderr so the human knows what to fund.
|
|
25
39
|
const agent = config.agentSecretB58
|
|
26
40
|
? await AiFinPayAgent.fromSolanaSecret(config.agentSecretB58, {
|
|
41
|
+
fetchImpl: safeFetch,
|
|
27
42
|
baseUrl: config.baseUrl,
|
|
28
43
|
timeoutMs: config.timeoutMs,
|
|
29
44
|
})
|
|
30
45
|
: await (async () => {
|
|
31
46
|
const a = await AiFinPayAgent.new({
|
|
47
|
+
fetchImpl: safeFetch,
|
|
32
48
|
baseUrl: config.baseUrl,
|
|
33
49
|
timeoutMs: config.timeoutMs,
|
|
34
50
|
});
|
|
@@ -36,10 +52,15 @@ export async function createServer(config = {}) {
|
|
|
36
52
|
// journald, CI logs, support bundles and monitoring, so printing the
|
|
37
53
|
// secret here leaked it into all of them.
|
|
38
54
|
//
|
|
39
|
-
// The
|
|
40
|
-
//
|
|
41
|
-
//
|
|
42
|
-
//
|
|
55
|
+
// The warning below stays, but not for the reason it once gave. That
|
|
56
|
+
// reason — that new() produced an EVM key independent of the Solana
|
|
57
|
+
// one, so no backup could restore both — was fixed: everything now
|
|
58
|
+
// derives from a single random seed. What makes this identity
|
|
59
|
+
// ephemeral is narrower and still true: the seed is never printed and
|
|
60
|
+
// never written anywhere, deliberately, because stderr ends up in
|
|
61
|
+
// Docker, journald, CI logs and support bundles. Recoverable in
|
|
62
|
+
// principle, unrecoverable in practice, so still not an address to
|
|
63
|
+
// fund.
|
|
43
64
|
log("warn", `[aifinpay-mcp] no AIFINPAY_AGENT_SECRET set — generated an EPHEMERAL, NON-RECOVERABLE agent.\n` +
|
|
44
65
|
` solana_address: ${a.solanaAddress}\n` +
|
|
45
66
|
` evm_address: ${a.evmAddress}\n` +
|
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,gEAAgE;YAChE,qEAAqE;YACrE,0CAA0C;YAC1C,EAAE;YACF,mEAAmE;YACnE,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -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;;;;;;;;;;;;;;;;;;;;;;;;;EAgCjC;
|
|
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;;;;;;;;;;;;;;;;;;;;;;;;;EAgCjC;AAiED,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;;;;;;;GA4L9B"}
|
|
@@ -54,6 +54,67 @@ export function agentClaimSelfTool() {
|
|
|
54
54
|
outputSchema: { type: "object" },
|
|
55
55
|
};
|
|
56
56
|
}
|
|
57
|
+
// ── Who this tool may talk to, and what it may sign ─────────────────────────
|
|
58
|
+
//
|
|
59
|
+
// This tool took the API host out of the URL it was handed, checked only that
|
|
60
|
+
// the string contained "/api/auth/verify?token=", fetched a challenge from that
|
|
61
|
+
// host, and signed whatever came back with the agent's EVM key AND its Solana
|
|
62
|
+
// secret — then posted both signatures back to the same host.
|
|
63
|
+
//
|
|
64
|
+
// That is a signing oracle with an SSRF in front of it. Anyone who can put a
|
|
65
|
+
// URL in front of the agent, prompt injection included, could name their own
|
|
66
|
+
// server, choose the text to be signed, and collect the signatures. Naming
|
|
67
|
+
// 127.0.0.1 or 169.254.169.254 instead reached whatever the host could reach.
|
|
68
|
+
//
|
|
69
|
+
// Two independent barriers below, because either alone is one mistake away
|
|
70
|
+
// from failing.
|
|
71
|
+
const DEFAULT_CLAIM_ORIGINS = [
|
|
72
|
+
"https://aifinpay.io",
|
|
73
|
+
"https://www.aifinpay.io",
|
|
74
|
+
"https://dash.aifinpay.io",
|
|
75
|
+
"https://api.aifinpay.io",
|
|
76
|
+
];
|
|
77
|
+
/** Origins this tool will contact. Override deliberately, for staging. */
|
|
78
|
+
function allowedOrigins() {
|
|
79
|
+
const raw = process.env.AIFINPAY_CLAIM_ORIGINS;
|
|
80
|
+
if (!raw)
|
|
81
|
+
return DEFAULT_CLAIM_ORIGINS;
|
|
82
|
+
return raw.split(",").map((o) => o.trim().replace(/\/+$/, "")).filter(Boolean);
|
|
83
|
+
}
|
|
84
|
+
/** null when the URL may be used; otherwise the reason it may not. */
|
|
85
|
+
function originRefusal(url) {
|
|
86
|
+
const origin = `${url.protocol}//${url.host}`;
|
|
87
|
+
const allowed = allowedOrigins();
|
|
88
|
+
if (!allowed.includes(origin)) {
|
|
89
|
+
return `refusing to use ${origin}: not an allowed AiFinPay origin. ` +
|
|
90
|
+
`Allowed: ${allowed.join(", ")}. Set AIFINPAY_CLAIM_ORIGINS to add one deliberately.`;
|
|
91
|
+
}
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* The only shape this agent will sign here.
|
|
96
|
+
*
|
|
97
|
+
* The server builds `AiFinPay-claim:<chain>:<address>:<nonce>` and nothing
|
|
98
|
+
* else. Checking that locally means even an allowed origin — compromised, or
|
|
99
|
+
* simply the wrong one — cannot choose the bytes. The address must be this
|
|
100
|
+
* agent's own, so a signature obtained here says only "I am this agent", which
|
|
101
|
+
* is the whole purpose of the exchange.
|
|
102
|
+
*
|
|
103
|
+
* EVM addresses compare case-insensitively because the server lowercases them.
|
|
104
|
+
* base58 is case-significant and compares exactly.
|
|
105
|
+
*/
|
|
106
|
+
function challengeIsWellFormed(message, address) {
|
|
107
|
+
if (typeof message !== "string")
|
|
108
|
+
return false;
|
|
109
|
+
const chain = address.startsWith("0x") ? "polygon" : "solana";
|
|
110
|
+
const prefix = `AiFinPay-claim:${chain}:${address}:`;
|
|
111
|
+
const matches = chain === "polygon"
|
|
112
|
+
? message.toLowerCase().startsWith(prefix.toLowerCase())
|
|
113
|
+
: message.startsWith(prefix);
|
|
114
|
+
if (!matches)
|
|
115
|
+
return false;
|
|
116
|
+
return /^[0-9a-f]{32}$/.test(message.slice(prefix.length));
|
|
117
|
+
}
|
|
57
118
|
export async function runAgentClaimSelf(ctx, args) {
|
|
58
119
|
const magicLinkUrl = typeof args.magic_link_url === "string" ? args.magic_link_url : "";
|
|
59
120
|
const label = typeof args.label === "string" ? args.label : null;
|
|
@@ -68,6 +129,10 @@ export async function runAgentClaimSelf(ctx, args) {
|
|
|
68
129
|
let apiBase;
|
|
69
130
|
try {
|
|
70
131
|
const u = new URL(magicLinkUrl);
|
|
132
|
+
const refusal = originRefusal(u);
|
|
133
|
+
if (refusal) {
|
|
134
|
+
return { isError: true, content: [{ type: "text", text: refusal }] };
|
|
135
|
+
}
|
|
71
136
|
apiBase = `${u.protocol}//${u.host}`;
|
|
72
137
|
}
|
|
73
138
|
catch {
|
|
@@ -108,6 +173,7 @@ export async function runAgentClaimSelf(ctx, args) {
|
|
|
108
173
|
// 1) challenge
|
|
109
174
|
const cr = await fetch(`${apiBase}/api/me/agents/challenge`, {
|
|
110
175
|
method: "POST",
|
|
176
|
+
redirect: "error", // a redirect would leave the origin we vetted
|
|
111
177
|
headers: { "content-type": "application/json", cookie: cookieHeader },
|
|
112
178
|
body: JSON.stringify({ address }),
|
|
113
179
|
});
|
|
@@ -115,7 +181,13 @@ export async function runAgentClaimSelf(ctx, args) {
|
|
|
115
181
|
if (!cr.ok || !cj.challenge_id || !cj.message) {
|
|
116
182
|
return { ok: false, reason: cj.error || `challenge HTTP ${cr.status}` };
|
|
117
183
|
}
|
|
118
|
-
// 2) sign
|
|
184
|
+
// 2) sign — but only the one shape this exchange is defined to produce.
|
|
185
|
+
if (!challengeIsWellFormed(cj.message, address)) {
|
|
186
|
+
return {
|
|
187
|
+
ok: false,
|
|
188
|
+
reason: "challenge is not a well-formed AiFinPay claim for this agent — refusing to sign it",
|
|
189
|
+
};
|
|
190
|
+
}
|
|
119
191
|
let sigPayload;
|
|
120
192
|
try {
|
|
121
193
|
sigPayload = await sigFn(cj.message);
|
|
@@ -126,6 +198,7 @@ export async function runAgentClaimSelf(ctx, args) {
|
|
|
126
198
|
// 3) submit
|
|
127
199
|
const sr = await fetch(`${apiBase}/api/me/agents/claim`, {
|
|
128
200
|
method: "POST",
|
|
201
|
+
redirect: "error", // a redirect would leave the origin we vetted
|
|
129
202
|
headers: { "content-type": "application/json", cookie: cookieHeader },
|
|
130
203
|
body: JSON.stringify({ challenge_id: cj.challenge_id, label, ...sigPayload }),
|
|
131
204
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-claim-self.js","sourceRoot":"","sources":["../../src/tools/agent-claim-self.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"agent-claim-self.js","sourceRoot":"","sources":["../../src/tools/agent-claim-self.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aifinpay/mcp",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "Pay-per-call MCP server for autonomous AI agents
|
|
3
|
+
"version": "1.5.0",
|
|
4
|
+
"description": "Pay-per-call MCP server for autonomous AI agents — 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",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
},
|
|
58
58
|
"bugs": "https://github.com/AiFinPay/sdk/issues",
|
|
59
59
|
"dependencies": {
|
|
60
|
-
"@aifinpay/agent": "^1.
|
|
60
|
+
"@aifinpay/agent": "^1.7.0",
|
|
61
61
|
"@modelcontextprotocol/sdk": "^1.0.0"
|
|
62
62
|
},
|
|
63
63
|
"devDependencies": {
|