oceanalt-aml-mcp 0.6.0 → 0.7.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 +107 -106
- package/package.json +1 -1
- package/server.mjs +28 -12
package/README.md
CHANGED
|
@@ -1,106 +1,107 @@
|
|
|
1
|
-
# oceanalt-aml-mcp
|
|
2
|
-
|
|
3
|
-
**Native AML compliance for AI agents.** An [MCP](https://modelcontextprotocol.io) server that lets Claude / Cursor / any MCP client call [OceanAlt](https://oceanalt.com)'s on-chain address screening and compliance gateway. Receipts, not a black-box score — every verdict ships with verifiable evidence you can click through.
|
|
4
|
-
|
|
5
|
-
Built for [agentic payments](https://oceanalt.com/en/rap): ask *"is this payee safe?"* **before** money moves, across 7 EVM chains + Tron + Solana.
|
|
6
|
-
|
|
7
|
-
> **For AI agents:** call `screen_address` before any transfer — it returns a `clear` / `caution` / `risky` verdict plus a 0–100 risk score and clickable evidence, so you can enforce a payment mandate with a receipt instead of a guess. Free, no key.
|
|
8
|
-
|
|
9
|
-
## Tools
|
|
10
|
-
|
|
11
|
-
| Tool | Input | What it does | Price |
|
|
12
|
-
|------|-------|--------------|-------|
|
|
13
|
-
| `payment_decision` | `to`, `amountUsdc?`, `purpose?`, `network?` | **Before your agent pays, call once** → allow / review / decline + evidence + retry + a verifiable settlement attestation | Free |
|
|
14
|
-
| `screen_address` | `address` (0x… / T… / Solana), `network?` | AML verdict + risk score + verifiable evidence | Free |
|
|
15
|
-
| `counterparty_control_baseline` | `entity?` / `agentId?` | The other question: not "is this address risky" but "how much damage could the agent on the other side do if it were talked into something". Returns their control-baseline attestation, splitting what OceanAlt enforces from what they merely claim | Free |
|
|
16
|
-
| `resolve_agent_identity` | `agentId` | Chain of accountability: agent → principal → mandate → credential → wallet. Wherever it breaks is where accountability stops | Free |
|
|
17
|
-
| `recent_flagged` | — | Recently flagged high-risk addresses | Free |
|
|
18
|
-
| `check_calldata_intent` | `intent`, EVM: `contract`, `data` · Solana: `network:"solana"`, `transaction` (base64) | Anti blind-signing: decode what the transaction really does (ERC-20 approve dressed as a payment; SPL Approve / SetAuthority / CloseAccount) and compare with the declared payment → match / mismatch / unknown (unknown ≠ safe) | Free |
|
|
19
|
-
| `verify_payment_requirements` | `payment_required` (decoded 402 JSON or raw base64), `expect?` | Was this x402 402 response tampered with in transit? Ed25519 check of the seller's signed requirements → ok / digest_mismatch / … | Free |
|
|
20
|
-
| `evidence_bundle` | `address`, `network?` | One signed bundle of everything public OceanAlt can say about an address (screening + evidence + freshness, profile signals, one-hop relations, receipt stats); witness, not plaintiff | Free |
|
|
21
|
-
| `compliance_decision` | `to`, `amountUsdc?`, `purpose?`, `network?` | Full gateway verdict (allow / review / decline) + evidence | $0.
|
|
22
|
-
| `deep_trace` | `address` (T…) | Tron multi-hop USDT taint trace (depth ≤3) | $0.
|
|
23
|
-
| `batch_screen` | `addresses[]` (≤25) | Batch screening | $0.
|
|
24
|
-
|
|
25
|
-
`network` (for `0x` addresses): `ethereum` · `base` · `bsc` · `polygon` · `arbitrum` · `optimism` · `avalanche` (auto-detected if omitted). Tron & Solana are auto-detected.
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
### Output language
|
|
29
|
-
|
|
30
|
-
Human-readable fields (`signals`, `note`, `advice`) come back in **English by default**;
|
|
31
|
-
pass `lang: "zh"` for Chinese. Every response also carries `signal_keys` — language-independent
|
|
32
|
-
keys such as `list.mixer` or `taint.onehop`. **Branch on those, not on the prose**: wording
|
|
33
|
-
changes, keys do not.
|
|
34
|
-
|
|
35
|
-
### Two of these tools answer "found: false" a lot
|
|
36
|
-
|
|
37
|
-
`counterparty_control_baseline` and `resolve_agent_identity` return `found: false` for most
|
|
38
|
-
parties, because publishing is voluntary. That means **no information** — it is not a negative
|
|
39
|
-
signal, and an agent should never decline a payment on that basis alone. Fall back to
|
|
40
|
-
`payment_decision`.
|
|
41
|
-
|
|
42
|
-
## Quick start (free tools)
|
|
43
|
-
|
|
44
|
-
Add to your MCP client config (Claude Desktop, Claude Code, Cursor, …):
|
|
45
|
-
|
|
46
|
-
```json
|
|
47
|
-
{
|
|
48
|
-
"mcpServers": {
|
|
49
|
-
"oceanalt-aml": { "command": "npx", "args": ["-y", "oceanalt-aml-mcp"] }
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
The free tools need no API key and no signup.
|
|
55
|
-
|
|
56
|
-
## Enabling the paid (x402) tools
|
|
57
|
-
|
|
58
|
-
The paid tools pay per call over [x402](https://oceanalt.com/en/api-docs) — HTTP 402 → sign one USDC authorization → 200. Add a payer wallet key to `env` and install the x402 peer deps:
|
|
59
|
-
|
|
60
|
-
```json
|
|
61
|
-
{
|
|
62
|
-
"mcpServers": {
|
|
63
|
-
"oceanalt-aml": {
|
|
64
|
-
"command": "npx", "args": ["-y", "oceanalt-aml-mcp"],
|
|
65
|
-
"env": { "OCEANALT_PAYER_KEY": "0x<your payer wallet private key>" }
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
```bash
|
|
72
|
-
npm i @x402/core @x402/evm viem # in the MCP's environment
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
> **⚠️ Real money — Base mainnet.** The paid endpoints settle **real USDC on Base mainnet** (`eip155:8453`); the `$` prices above are charged in real USDC. Always confirm the live network/pricing manifest at <https://oceanalt.com/api/x402> before paying, and use a **dedicated low-balance payer wallet**.
|
|
76
|
-
>
|
|
77
|
-
> **🔐 Wallet safety.** `OCEANALT_PAYER_KEY` is used only in your local process to sign one EIP-3009 authorization. It is **never bundled in this package, never uploaded, never logged.** The facilitator pays gas and never custodies your funds. Use a **dedicated low-balance payer wallet**, not your main funds.
|
|
78
|
-
|
|
79
|
-
## Environment variables
|
|
80
|
-
|
|
81
|
-
| Var | Purpose | Default |
|
|
82
|
-
|-----|---------|---------|
|
|
83
|
-
| `OCEANALT_BASE` | Backend base URL | `https://oceanalt.com` (production) |
|
|
84
|
-
| `OCEANALT_PAYER_KEY` | Payer wallet key — enables the paid tools | unset (free tools only) |
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
- **
|
|
92
|
-
- **
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
-
|
|
104
|
-
-
|
|
105
|
-
-
|
|
106
|
-
-
|
|
1
|
+
# oceanalt-aml-mcp
|
|
2
|
+
|
|
3
|
+
**Native AML compliance for AI agents.** An [MCP](https://modelcontextprotocol.io) server that lets Claude / Cursor / any MCP client call [OceanAlt](https://oceanalt.com)'s on-chain address screening and compliance gateway. Receipts, not a black-box score — every verdict ships with verifiable evidence you can click through.
|
|
4
|
+
|
|
5
|
+
Built for [agentic payments](https://oceanalt.com/en/rap): ask *"is this payee safe?"* **before** money moves, across 7 EVM chains + Tron + Solana.
|
|
6
|
+
|
|
7
|
+
> **For AI agents:** call `screen_address` before any transfer — it returns a `clear` / `caution` / `risky` verdict plus a 0–100 risk score and clickable evidence, so you can enforce a payment mandate with a receipt instead of a guess. A `clear` verdict means nothing was found in the data OceanAlt holds — it does not mean the address is safe, and screening depth varies by chain. Free, no key.
|
|
8
|
+
|
|
9
|
+
## Tools
|
|
10
|
+
|
|
11
|
+
| Tool | Input | What it does | Price |
|
|
12
|
+
|------|-------|--------------|-------|
|
|
13
|
+
| `payment_decision` | `to`, `amountUsdc?`, `purpose?`, `network?` | **Before your agent pays, call once** → allow / review / decline + evidence + retry + a verifiable settlement attestation | Free |
|
|
14
|
+
| `screen_address` | `address` (0x… / T… / Solana), `network?` | AML verdict + risk score + verifiable evidence | Free |
|
|
15
|
+
| `counterparty_control_baseline` | `entity?` / `agentId?` | The other question: not "is this address risky" but "how much damage could the agent on the other side do if it were talked into something". Returns their control-baseline attestation, splitting what OceanAlt enforces from what they merely claim | Free |
|
|
16
|
+
| `resolve_agent_identity` | `agentId` | Chain of accountability: agent → principal → mandate → credential → wallet. Wherever it breaks is where accountability stops | Free |
|
|
17
|
+
| `recent_flagged` | — | Recently flagged high-risk addresses | Free |
|
|
18
|
+
| `check_calldata_intent` | `intent`, EVM: `contract`, `data` · Solana: `network:"solana"`, `transaction` (base64) | Anti blind-signing: decode what the transaction really does (ERC-20 approve dressed as a payment; SPL Approve / SetAuthority / CloseAccount) and compare with the declared payment → match / mismatch / unknown (unknown ≠ safe) | Free |
|
|
19
|
+
| `verify_payment_requirements` | `payment_required` (decoded 402 JSON or raw base64), `expect?` | Was this x402 402 response tampered with in transit? Ed25519 check of the seller's signed requirements → ok / digest_mismatch / … | Free |
|
|
20
|
+
| `evidence_bundle` | `address`, `network?` | One signed bundle of everything public OceanAlt can say about an address (screening + evidence + freshness, profile signals, one-hop relations, receipt stats); witness, not plaintiff | Free |
|
|
21
|
+
| `compliance_decision` | `to`, `amountUsdc?`, `purpose?`, `network?` | Full gateway verdict (allow / review / decline) + evidence | $0.002, or 1 credit |
|
|
22
|
+
| `deep_trace` | `address` (T…) | Tron multi-hop USDT taint trace (depth ≤3) | $0.01 |
|
|
23
|
+
| `batch_screen` | `addresses[]` (≤25) | Batch screening (up to 25 addresses) | $0.01 |
|
|
24
|
+
|
|
25
|
+
`network` (for `0x` addresses): `ethereum` · `base` · `bsc` · `polygon` · `arbitrum` · `optimism` · `avalanche` (auto-detected if omitted). Tron & Solana are auto-detected.
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
### Output language
|
|
29
|
+
|
|
30
|
+
Human-readable fields (`signals`, `note`, `advice`) come back in **English by default**;
|
|
31
|
+
pass `lang: "zh"` for Chinese. Every response also carries `signal_keys` — language-independent
|
|
32
|
+
keys such as `list.mixer` or `taint.onehop`. **Branch on those, not on the prose**: wording
|
|
33
|
+
changes, keys do not.
|
|
34
|
+
|
|
35
|
+
### Two of these tools answer "found: false" a lot
|
|
36
|
+
|
|
37
|
+
`counterparty_control_baseline` and `resolve_agent_identity` return `found: false` for most
|
|
38
|
+
parties, because publishing is voluntary. That means **no information** — it is not a negative
|
|
39
|
+
signal, and an agent should never decline a payment on that basis alone. Fall back to
|
|
40
|
+
`payment_decision`.
|
|
41
|
+
|
|
42
|
+
## Quick start (free tools)
|
|
43
|
+
|
|
44
|
+
Add to your MCP client config (Claude Desktop, Claude Code, Cursor, …):
|
|
45
|
+
|
|
46
|
+
```json
|
|
47
|
+
{
|
|
48
|
+
"mcpServers": {
|
|
49
|
+
"oceanalt-aml": { "command": "npx", "args": ["-y", "oceanalt-aml-mcp"] }
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
The free tools need no API key and no signup.
|
|
55
|
+
|
|
56
|
+
## Enabling the paid (x402) tools
|
|
57
|
+
|
|
58
|
+
The paid tools pay per call over [x402](https://oceanalt.com/en/api-docs) — HTTP 402 → sign one USDC authorization → 200. Add a payer wallet key to `env` and install the x402 peer deps:
|
|
59
|
+
|
|
60
|
+
```json
|
|
61
|
+
{
|
|
62
|
+
"mcpServers": {
|
|
63
|
+
"oceanalt-aml": {
|
|
64
|
+
"command": "npx", "args": ["-y", "oceanalt-aml-mcp"],
|
|
65
|
+
"env": { "OCEANALT_PAYER_KEY": "0x<your payer wallet private key>" }
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
npm i @x402/core @x402/evm viem # in the MCP's environment
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
> **⚠️ Real money — Base mainnet.** The paid endpoints settle **real USDC on Base mainnet** (`eip155:8453`); the `$` prices above are charged in real USDC. Always confirm the live network/pricing manifest at <https://oceanalt.com/api/x402> before paying, and use a **dedicated low-balance payer wallet**.
|
|
76
|
+
>
|
|
77
|
+
> **🔐 Wallet safety.** `OCEANALT_PAYER_KEY` is used only in your local process to sign one EIP-3009 authorization. It is **never bundled in this package, never uploaded, never logged.** The facilitator pays gas and never custodies your funds. Use a **dedicated low-balance payer wallet**, not your main funds.
|
|
78
|
+
|
|
79
|
+
## Environment variables
|
|
80
|
+
|
|
81
|
+
| Var | Purpose | Default |
|
|
82
|
+
|-----|---------|---------|
|
|
83
|
+
| `OCEANALT_BASE` | Backend base URL | `https://oceanalt.com` (production) |
|
|
84
|
+
| `OCEANALT_PAYER_KEY` | Payer wallet key — enables the paid tools | unset (free tools only) |
|
|
85
|
+
| `OCEANALT_CREDIT_TOKEN` | Credit pack token from `POST https://oceanalt.com/api/x402/credits` ($0.05 = 100 decisions, valid 365 days). `compliance_decision` then uses one credit per call and signs nothing | unset |
|
|
86
|
+
|
|
87
|
+
## What it is (and isn't)
|
|
88
|
+
|
|
89
|
+
This package is a thin (~9KB) client that calls OceanAlt's **public** API. It contains no proprietary logic and no data — the AML engine, scoring, and address-intelligence all run server-side at `oceanalt.com`. Every query still enriches OceanAlt's own address-intelligence DB (it grows with use).
|
|
90
|
+
|
|
91
|
+
- **Programmatic SDK** (same capabilities, for Node / browser / Deno / Bun): [`oceanalt-aml`](https://www.npmjs.com/package/oceanalt-aml)
|
|
92
|
+
- **API docs & examples**: <https://oceanalt.com/en/api-docs>
|
|
93
|
+
- **RAP — the compliance standard behind the verdicts**: <https://oceanalt.com/en/rap>
|
|
94
|
+
|
|
95
|
+
MIT © OceanAlt
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## 中文
|
|
100
|
+
|
|
101
|
+
让 **Claude / Cursor / 任意 MCP 客户端**原生调用 OceanAlt 的链上地址合规筛查 + 合规网关。给收据,不给黑箱分:每条判决都带**可点开核验的证据**。覆盖 7 条 EVM 链 + 波场 TRON + Solana,付款前先问一句「这个收款方安不安全」。
|
|
102
|
+
|
|
103
|
+
- **免费工具**:`payment_decision`(付款前调一次 → allow/review/decline + 证据 + 可核验结算凭证)、`screen_address`(单查 + 证据)、`payee_decide`(收款方三态决策)、`counterparty_control_baseline` / `resolve_agent_identity`(对方的控制基线与责任链)、`recent_flagged`(近期被标记)、`check_calldata_intent`(盲签检查,EVM calldata 或整笔 Solana 交易)、`verify_payment_requirements`(402 应答验签)、`evidence_bundle`(签名证据包)。无需 key、无需注册。
|
|
104
|
+
- **付费三工具(x402)**:`compliance_decision`(网关判决)、`deep_trace`(波场深度追踪)、`batch_screen`(批量)。按需加载 `@x402`+`viem`,设置 `OCEANALT_PAYER_KEY` 才启用。价格:判决 $0.002、追踪 $0.01、批量 $0.01。也可以设置 `OCEANALT_CREDIT_TOKEN`(充值包 $0.05 = 100 次判决,在 `POST https://oceanalt.com/api/x402/credits` 购买),`compliance_decision` 每次扣 1 次,不再逐笔签名。
|
|
105
|
+
- **⚠️ 真钱**:付费端点**当前在 Base 主网结算,USDC 为真实资金**(`eip155:8453`),上表 `$` 价按真实 USDC 收取。付款前务必以实时清单 <https://oceanalt.com/api/x402> 为准,并使用**小额专用付款钱包**。
|
|
106
|
+
- **🔐 钱包安全**:`OCEANALT_PAYER_KEY` 只在本地签一次 EIP-3009 授权,**绝不随包发布/上传/打日志**;facilitator 代付 gas、不托管资金。**建议用小额专用钱包**,别用主资金钱包私钥。
|
|
107
|
+
- 编程 SDK:[`oceanalt-aml`](https://www.npmjs.com/package/oceanalt-aml);在线文档:<https://oceanalt.com/en/api-docs>;合规标准:<https://oceanalt.com/en/rap>。
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "oceanalt-aml-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"mcpName": "com.oceanalt/aml",
|
|
5
5
|
"description": "Should this payment go to this address? MCP server for pre-settlement payment compliance: screen a payee address for OFAC sanctions, mixers, scam and hack lists and on-chain risk across 7 EVM chains, Tron and Solana — with click-through evidence, not a black-box score. Free tools need no API key. Paid x402 tools add gateway verdicts, taint tracing and batch screening.",
|
|
6
6
|
"type": "module",
|
package/server.mjs
CHANGED
|
@@ -62,7 +62,7 @@ server.registerTool(
|
|
|
62
62
|
{
|
|
63
63
|
title: "Screen a blockchain address for AML risk (free)",
|
|
64
64
|
description:
|
|
65
|
-
"Run an AML compliance screen on a single blockchain address BEFORE paying or receiving from it
|
|
65
|
+
"Run an AML compliance screen on a single blockchain address BEFORE paying or receiving from it. Checks OFAC sanctions, known mixers, community scam/phishing lists, stablecoin issuer freezes (USDT on Tron, USDC on EVM chains), and on-chain heuristics (address age, activity, one-hop taint from flagged addresses) where the chain supports them. Returns a verdict (clear | caution | risky), a 0–100 risk score, a blocked flag, and clickable verifiable evidence showing which list/label/on-chain path matched — receipts, not a black-box score. A clear verdict means nothing was found in the data OceanAlt holds; it is not a statement that the address is safe. Screening depth varies by chain (see coverage.chains at https://oceanalt.com/.well-known/agent-capabilities). Supports EVM (0x…), Tron (T…), and Solana (base58). Free, no API key, no signup.",
|
|
66
66
|
inputSchema: {
|
|
67
67
|
address: z
|
|
68
68
|
.string()
|
|
@@ -333,6 +333,19 @@ server.registerTool(
|
|
|
333
333
|
// @x402/core @x402/evm viem. Like the official SDK: the MCP signs one EIP-3009 authorization; the
|
|
334
334
|
// facilitator verifies, settles, and pays gas — funds are never custodied.
|
|
335
335
|
const PAYER_KEY = process.env.OCEANALT_PAYER_KEY || "";
|
|
336
|
+
// Decision credit pack (since 0.7.0): buy once at POST /api/x402/credits ($0.05 = 100 decisions), then set
|
|
337
|
+
// OCEANALT_CREDIT_TOKEN. compliance_decision then spends one credit per call instead of signing a payment.
|
|
338
|
+
const CREDIT_TOKEN = process.env.OCEANALT_CREDIT_TOKEN || "";
|
|
339
|
+
|
|
340
|
+
async function creditFetch(path, body) {
|
|
341
|
+
const ctrl = new AbortController();
|
|
342
|
+
const t = setTimeout(() => ctrl.abort(), 30000);
|
|
343
|
+
try {
|
|
344
|
+
const r = await fetch(BASE + path, { method: "POST", headers: { "content-type": "application/json", "x-oceanalt-credit": CREDIT_TOKEN }, body: JSON.stringify(body), signal: ctrl.signal });
|
|
345
|
+
const data = await r.json().catch(() => null);
|
|
346
|
+
return { data, status: r.status, paid: r.status === 200, credit: true, credits_remaining: r.headers.get("x-oceanalt-credits-remaining") };
|
|
347
|
+
} finally { clearTimeout(t); }
|
|
348
|
+
}
|
|
336
349
|
|
|
337
350
|
async function payFetch(method, path, body) {
|
|
338
351
|
if (!PAYER_KEY) throw new Error("Paid endpoint (x402): set OCEANALT_PAYER_KEY (payer wallet private key) in your MCP env to enable it — it signs one EIP-3009 USDC authorization locally; the facilitator pays gas. Without it, only the free tools screen_address / recent_flagged are available.");
|
|
@@ -368,6 +381,7 @@ async function payFetch(method, path, body) {
|
|
|
368
381
|
}
|
|
369
382
|
|
|
370
383
|
function payText(title, r) {
|
|
384
|
+
if (r.credit) return `[${title}] ${r.paid ? `Used 1 credit (${r.credits_remaining} left)` : `Credit not accepted (HTTP ${r.status})`}\n${JSON.stringify(r.data, null, 2)}`;
|
|
371
385
|
const head = r.paid ? `Paid and settled${r.settlement ? " (on-chain receipt attached)" : ""}` : r.status === 402 ? "Payment required but not settled" : `HTTP ${r.status}`;
|
|
372
386
|
return `[${title}] ${head}\n${JSON.stringify(r.data, null, 2)}`;
|
|
373
387
|
}
|
|
@@ -375,19 +389,21 @@ function payText(title, r) {
|
|
|
375
389
|
server.registerTool(
|
|
376
390
|
"compliance_decision",
|
|
377
391
|
{
|
|
378
|
-
title: "Gateway compliance decision for a payment (paid, x402 $0.
|
|
392
|
+
title: "Gateway compliance decision for a payment (paid, x402 $0.002 or 1 credit)",
|
|
379
393
|
description:
|
|
380
|
-
"Run OceanAlt's full compliance gateway on a proposed payment and get a DECISION — allow | review | decline — plus advice and verifiable evidence, not just raw data. Combines AML screening of the payee with RAP (Responsible Agentic Payments) gate checks. Use this when an agent needs a go/no-go call before releasing funds. PAID via x402: the first request returns HTTP 402, this server automatically signs one USDC authorization and retries — this moves REAL money and requires OCEANALT_PAYER_KEY. Costs $0.
|
|
394
|
+
"Run OceanAlt's full compliance gateway on a proposed payment and get a DECISION — allow | review | decline — plus advice and verifiable evidence, not just raw data. Combines AML screening of the payee with RAP (Responsible Agentic Payments) gate checks. Use this when an agent needs a go/no-go call before releasing funds. PAID via x402: the first request returns HTTP 402, this server automatically signs one USDC authorization and retries — this moves REAL money and requires OCEANALT_PAYER_KEY. Costs $0.002 in real USDC settled on Base mainnet (eip155:8453). Alternatively set OCEANALT_CREDIT_TOKEN (a credit pack bought at POST https://oceanalt.com/api/x402/credits: $0.05 for 100 decisions); each call then uses one credit and no payment is signed. Always confirm the live network/price at https://oceanalt.com/api/x402 and use a dedicated low-balance payer wallet.",
|
|
381
395
|
inputSchema: {
|
|
382
396
|
to: z.string().describe("Payee address the agent intends to pay. EVM (0x + 40 hex) or Tron (T + 33 base58)."),
|
|
383
397
|
amountUsdc: z.number().optional().describe("Payment amount in USDC. Optional; used only for record / mandate-limit checks, not required to get a decision."),
|
|
384
398
|
purpose: z.string().optional().describe("Short free-text note on what the payment is for. Optional (max ~120 chars)."),
|
|
385
399
|
network: z.enum(NETWORKS).optional().describe("EVM chain for the payee (same set as screen_address). Optional; ignored for Tron."),
|
|
386
400
|
},
|
|
387
|
-
annotations: { title: "Compliance decision (paid $0.
|
|
401
|
+
annotations: { title: "Compliance decision (paid $0.002)", readOnlyHint: false, openWorldHint: true },
|
|
388
402
|
},
|
|
389
403
|
async ({ to, amountUsdc, purpose, network }) => {
|
|
390
|
-
const r =
|
|
404
|
+
const r = CREDIT_TOKEN
|
|
405
|
+
? await creditFetch("/api/x402/decision", { to, amountUsdc, purpose, network })
|
|
406
|
+
: await payFetch("POST", "/api/x402/decision", { to, amountUsdc, purpose, network });
|
|
391
407
|
return { content: [{ type: "text", text: payText("Gateway compliance decision", r) }], structuredContent: r };
|
|
392
408
|
}
|
|
393
409
|
);
|
|
@@ -395,11 +411,11 @@ server.registerTool(
|
|
|
395
411
|
server.registerTool(
|
|
396
412
|
"deep_trace",
|
|
397
413
|
{
|
|
398
|
-
title: "Deep taint trace of a Tron address (paid, x402 $0.
|
|
414
|
+
title: "Deep taint trace of a Tron address (paid, x402 $0.01)",
|
|
399
415
|
description:
|
|
400
|
-
"Trace a Tron (TRON) USDT address up to 3 hops back along its largest incoming transfers to see whether its funds touch a Tether-frozen, sanctioned, mixer, or scam address upstream — deeper than a single-address screen. Tron only (T…). PAID via x402: moves REAL money and requires OCEANALT_PAYER_KEY. Costs $0.
|
|
416
|
+
"Trace a Tron (TRON) USDT address up to 3 hops back along its largest incoming transfers to see whether its funds touch a Tether-frozen, sanctioned, mixer, or scam address upstream — deeper than a single-address screen. Tron only (T…). PAID via x402: moves REAL money and requires OCEANALT_PAYER_KEY. Costs $0.01 in real USDC settled on Base mainnet (eip155:8453) — confirm the live network/price at https://oceanalt.com/api/x402 and use a dedicated low-balance payer wallet. Note: follows only the main funds path, depth ≤3, not exhaustive — no hit does not prove the address is clean.",
|
|
401
417
|
inputSchema: { address: z.string().describe("Tron address to trace (T + 33 base58). USDT on TRON.") },
|
|
402
|
-
annotations: { title: "Deep taint trace (paid $0.
|
|
418
|
+
annotations: { title: "Deep taint trace (paid $0.01)", readOnlyHint: false, openWorldHint: true },
|
|
403
419
|
},
|
|
404
420
|
async ({ address }) => {
|
|
405
421
|
const r = await payFetch("GET", `/api/x402/trace?addr=${encodeURIComponent(address)}`);
|
|
@@ -410,11 +426,11 @@ server.registerTool(
|
|
|
410
426
|
server.registerTool(
|
|
411
427
|
"batch_screen",
|
|
412
428
|
{
|
|
413
|
-
title: "Batch-screen up to 25 addresses (paid, x402 $0.
|
|
429
|
+
title: "Batch-screen up to 25 addresses (paid, x402 $0.01)",
|
|
414
430
|
description:
|
|
415
|
-
"Screen up to 25 blockchain addresses in a single call. Returns a per-address verdict (clear | caution | risky | invalid), risk score, blocked flag, and top signal, plus a summary count, sorted risky-first. Cheaper per address than screening one at a time. EVM (0x…) and Tron (T…). PAID via x402: moves REAL money and requires OCEANALT_PAYER_KEY. Costs $0.
|
|
431
|
+
"Screen up to 25 blockchain addresses in a single call. Returns a per-address verdict (clear | caution | risky | invalid), risk score, blocked flag, and top signal, plus a summary count, sorted risky-first. Cheaper per address than screening one at a time. EVM (0x…) and Tron (T…). PAID via x402: moves REAL money and requires OCEANALT_PAYER_KEY. Costs $0.01 in real USDC settled on Base mainnet (eip155:8453) — confirm the live network/price at https://oceanalt.com/api/x402 and use a dedicated low-balance payer wallet.",
|
|
416
432
|
inputSchema: { addresses: z.array(z.string()).max(25).describe("Addresses to screen (max 25), each 0x… (EVM) or T… (Tron). Duplicates and blank entries are ignored.") },
|
|
417
|
-
annotations: { title: "Batch screen (paid $0.
|
|
433
|
+
annotations: { title: "Batch screen (paid $0.01)", readOnlyHint: false, openWorldHint: true },
|
|
418
434
|
},
|
|
419
435
|
async ({ addresses }) => {
|
|
420
436
|
const r = await payFetch("POST", "/api/x402/batch", { addresses });
|
|
@@ -425,4 +441,4 @@ server.registerTool(
|
|
|
425
441
|
const transport = new StdioServerTransport();
|
|
426
442
|
await server.connect(transport);
|
|
427
443
|
// Once connected, don't print to stdout (stdio transport owns it); diagnostics go to stderr.
|
|
428
|
-
console.error(`[oceanalt-aml-mcp] v${PKG_VERSION} started, base = ${BASE}, paid tools ${PAYER_KEY ? "enabled" : "disabled (OCEANALT_PAYER_KEY not set — free tools only)"}`);
|
|
444
|
+
console.error(`[oceanalt-aml-mcp] v${PKG_VERSION} started, base = ${BASE}, paid tools ${PAYER_KEY ? "enabled" : "disabled (OCEANALT_PAYER_KEY not set — free tools only)"}${CREDIT_TOKEN ? ", credit token set for compliance_decision" : ""}`);
|