{
  "data": {
    "tool": {
      "category": "",
      "endpoint": "https://oceanalt.com/api/mcp",
      "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/oceanalt-aml.json",
      "kind": "mcp",
      "listed": "indexed",
      "liveUrl": "https://www.anchorterminal.com/api/v1/live/oceanalt-aml.json",
      "markdownUrl": "https://www.anchorterminal.com/tools/oceanalt-aml.md",
      "mcpTools": {
        "check": {
          "checker": "anchor-check/1.0",
          "totalTokens": 3186,
          "counts": {
            "error": 0,
            "note": 1,
            "warn": 3
          },
          "findings": [
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "check_calldata_intent",
              "message": "2 parameters without a description: intent, intent.action",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC12",
              "severity": "warn",
              "tool": "verify_payment_requirements",
              "message": "no type for body",
              "fix": "Give every parameter a type (or an enum)."
            },
            {
              "rule": "TC13",
              "severity": "warn",
              "tool": "attest_control_baseline",
              "message": "answers (object with no properties)",
              "fix": "Declare the properties (or additionalProperties with a schema) and the array's items."
            },
            {
              "rule": "TC24",
              "severity": "note",
              "message": "10 of 10 tools have no outputSchema",
              "fix": "Declare outputSchema for tools that return structured data, and return structuredContent that matches it."
            }
          ]
        },
        "checkedAt": "2026-10-04T22:23:30Z",
        "count": 10,
        "schemaTokens": 3186,
        "status": "ok",
        "tools": [
          {
            "name": "payment_decision",
            "title": "Decide whether this payment should happen (free)",
            "description": "\"Before your agent pays, call OceanAlt once.\" Pass the payee address the agent is about to pay; get a machine-executable decision: allow | review | decline, plus verifiable evidence and retry semantics — use it as a gate: if the decision is not \"allow\", do not pay. On allow/review it also returns a verifiable compliance attestation you can attach to the settlement so the payment carries proof it passed OceanAlt's decision. Free, no API key.",
            "inputSchema": {
              "properties": {
                "amountUsdc": {
                  "description": "Amount in USDC (optional; recorded, not required for the decision).",
                  "type": "number"
                },
                "lang": {
                  "description": "Language for human-readable fields (signals, note, advice). Defaults to English.",
                  "enum": [
                    "en",
                    "zh"
                  ],
                  "type": "string"
                },
                "maxAmountUsdc": {
                  "description": "Optional declared per-payment cap in USDC. amountUsdc above it → decline.",
                  "type": "number"
                },
                "network": {
                  "description": "EVM chain for the payee (optional; ignored for Tron).",
                  "enum": [
                    "ethereum",
                    "base",
                    "bsc",
                    "polygon",
                    "arbitrum",
                    "optimism",
                    "avalanche",
                    "arc"
                  ],
                  "type": "string"
                },
                "purpose": {
                  "description": "Short purpose/memo (optional).",
                  "type": "string"
                },
                "reasoning": {
                  "description": "Optional payment intent: why this payee. Instruction-override phrases here route the payment to review.",
                  "type": "string"
                },
                "task": {
                  "description": "Optional payment intent: what this payment is for. Sending task, reasoning or maxAmountUsdc opts into a deterministic intent check; an empty intent is itself a finding (requires_information).",
                  "type": "string"
                },
                "to": {
                  "description": "Payee address the agent is about to pay. EVM: 0x + 40 hex. Tron: T + 33 base58.",
                  "type": "string"
                }
              },
              "required": [
                "to"
              ],
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "openWorldHint": true,
              "readOnlyHint": true,
              "title": "Payment decision (free)"
            }
          },
          {
            "name": "screen_address",
            "title": "Screen a payee address for AML risk (free)",
            "description": "Run an AML compliance screen on a single blockchain address BEFORE paying or receiving from it — the pre-payment check on a counterparty. Checks OFAC sanctions, known mixers, community scam/phishing lists, stablecoin issuer freezes, and on-chain heuristics. Returns a verdict (clear | caution | risky), a 0–100 risk score, a blocked flag, and the matching signals — 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. Depth varies by chain (see coverage.chains at /.well-known/agent-capabilities). Supports EVM (0x…), Tron (T…), Solana (base58). Free, no API key.",
            "inputSchema": {
              "properties": {
                "address": {
                  "description": "Address to screen. EVM: 0x + 40 hex. Tron: T + 33 base58. Solana: base58 public key.",
                  "type": "string"
                },
                "lang": {
                  "description": "Language for human-readable fields (signals, note, advice). Defaults to English.",
                  "enum": [
                    "en",
                    "zh"
                  ],
                  "type": "string"
                },
                "network": {
                  "description": "EVM chain (optional; auto-defaults to ethereum; ignored for Tron/Solana).",
                  "enum": [
                    "ethereum",
                    "base",
                    "bsc",
                    "polygon",
                    "arbitrum",
                    "optimism",
                    "avalanche",
                    "arc"
                  ],
                  "type": "string"
                }
              },
              "required": [
                "address"
              ],
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "openWorldHint": true,
              "readOnlyHint": true,
              "title": "Screen address (AML, free)"
            }
          },
          {
            "name": "screen_endpoint",
            "title": "Screen a payment endpoint for phishing (free)",
            "description": "Screen a payment ENDPOINT (URL or domain) before calling it — the half that address screening cannot answer. In x402 the agent discovers a URL first, receives a 402, and only then learns where to pay: if that endpoint is spoofed, the payee address it hands back is freshly generated and appears on no sanctions list. Checks the hostname and its parent domains against public phishing-domain lists plus hostname shape signals (bare IP, punycode homograph, deep subdomain nesting, free hosting). Returns clear | caution | risky | unknown with language-independent signal_keys. A clear verdict means no match was found, NOT that the endpoint is safe — freshly registered phishing hosts always precede any list. Use together with screen_address. Free, no API key.",
            "inputSchema": {
              "properties": {
                "lang": {
                  "description": "Language for human-readable fields. Defaults to English.",
                  "enum": [
                    "en",
                    "zh"
                  ],
                  "type": "string"
                },
                "url": {
                  "description": "Full URL or bare domain of the payment endpoint, e.g. https://pay.example.com/x402 or pay.example.com",
                  "type": "string"
                }
              },
              "required": [
                "url"
              ],
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "openWorldHint": true,
              "readOnlyHint": true,
              "title": "Screen payment endpoint (free)"
            }
          },
          {
            "name": "counterparty_control_baseline",
            "title": "Check a counterparty's control baseline before paying (free)",
            "description": "Answers a different question from address screening. Screening asks whether an address is risky; this asks how much damage the agent on the other side could do if it were talked into something. Returns that party's self-attestation against the OceanAlt Agent Control Baseline, split into two sets that must NOT be conflated: verified_by_oceanalt (enforced by the gateway on every payment — provable) and self_claimed (what they state about their own side — NOT verified by OceanAlt). Most parties have not attested: found:false means no information, not a bad signal.",
            "inputSchema": {
              "properties": {
                "agentId": {
                  "description": "Their agent id, if you have that instead.",
                  "type": "string"
                },
                "entity": {
                  "description": "The counterparty's entity name.",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "openWorldHint": true,
              "readOnlyHint": true,
              "title": "Counterparty control baseline (free)"
            }
          },
          {
            "name": "attest_control_baseline",
            "title": "File your own control-baseline attestation (free)",
            "description": "File your operator's control-baseline attestation — the counterpart to counterparty_control_baseline. That tool asks what controls the OTHER side runs; this one publishes what YOUR side runs, so payers can see it before settling with you. No account, no key, one call. Gaps are allowed and expected: answer false where a control is not in place and describe how you plan to close it in gapPlan. A filing with declared gaps is worth far more than no filing — it lets a payer decide against a known shape instead of a blank. Get the control ids from the baseline list first. Only file for a party you are actually authorised to speak for.",
            "inputSchema": {
              "properties": {
                "agentId": {
                  "description": "Optional. If this party already has an agent registered with OceanAlt, link the attestation to it.",
                  "type": "string"
                },
                "answers": {
                  "description": "Map of control id to boolean, e.g. {\"ACB-1.1\": true, \"ACB-2.1\": false}. Control ids come from the baseline list (see baseline_controls).",
                  "type": "object"
                },
                "contact": {
                  "description": "Optional contact for follow-up. Not published.",
                  "type": "string"
                },
                "entity": {
                  "description": "The accountable party's legal or commonly-used name, e.g. \"Acme Robotics Ltd\". This is who the attestation is about — not your agent's name.",
                  "type": "string"
                },
                "gapPlan": {
                  "description": "For controls answered false: how and when you plan to close them. Plain text.",
                  "type": "string"
                }
              },
              "required": [
                "entity",
                "answers"
              ],
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "openWorldHint": true,
              "readOnlyHint": false,
              "title": "File a control-baseline attestation (free)"
            }
          },
          {
            "name": "baseline_controls",
            "title": "List the control-baseline questions (free)",
            "description": "Fetch the OceanAlt Agent Control Baseline: the list of controls an agent operator is expected to run before it is allowed to move money, each answerable yes or no. Call this before attest_control_baseline so you file against real control ids. Each control carries which gate enforces it and why it exists.",
            "inputSchema": {
              "properties": {},
              "required": [],
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "openWorldHint": false,
              "readOnlyHint": true,
              "title": "Get the control baseline list (free)"
            }
          },
          {
            "name": "resolve_agent_identity",
            "title": "Resolve an agent's chain of accountability (free)",
            "description": "Resolves who stands behind a paying agent: agent -\u003e principal -\u003e mandate -\u003e credential -\u003e wallet. Each link reports whether it holds; completeness counts how many do (a factual count, not a score). Wherever the chain breaks is where accountability stops. Publication is opt-in and only posture is exposed (that a ceiling exists, never its value), so found:false means the agent has not published — absence of information, not a bad signal.",
            "inputSchema": {
              "properties": {
                "agentId": {
                  "description": "The agent id to resolve.",
                  "type": "string"
                }
              },
              "required": [
                "agentId"
              ],
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "openWorldHint": true,
              "readOnlyHint": true,
              "title": "Resolve agent identity (free)"
            }
          },
          {
            "name": "recent_flagged",
            "title": "List recently flagged addresses (free)",
            "description": "Return a representative sample of addresses on OceanAlt's reviewed risk list — OFAC-sanctioned, known mixers, and community-reported scam/phishing — each with its source category and reason. Takes no arguments. Free, no API key.",
            "inputSchema": {
              "properties": {},
              "type": "object"
            },
            "annotations": {
              "openWorldHint": true,
              "readOnlyHint": true,
              "title": "Recent flagged addresses (free)"
            }
          },
          {
            "name": "verify_payment_requirements",
            "title": "Verify a signed x402 402 response (free)",
            "description": "Before paying an x402 402 response, check that its payment requirements (payTo, amount, asset, network, resource) were signed by the seller and not altered in transit by a proxy, CDN, SDK or another tool. x402 v2 carries the requirements in the PAYMENT-REQUIRED response header (base64 JSON): pass either the decoded JSON or the raw base64 value as body. Optionally pass expect:{payTo, amount} — the address and amount you are about to pay — and the tool also checks they match what was signed. verified:false with reason_code no_signature means the seller does not sign (unprotected, not necessarily malicious); digest_mismatch or signature_invalid means the response was tampered with — do not pay.",
            "inputSchema": {
              "properties": {
                "body": {
                  "description": "The decoded PAYMENT-REQUIRED header JSON (object), or the raw base64 header value (string)."
                },
                "expect": {
                  "description": "What you are about to pay; checked against the signed fields.",
                  "properties": {
                    "amount": {
                      "type": "string"
                    },
                    "payTo": {
                      "type": "string"
                    }
                  },
                  "type": "object"
                },
                "keys_url": {
                  "description": "Override the seller's public-key URL (defaults to extensions.signedRequirements.keys_url).",
                  "type": "string"
                }
              },
              "required": [
                "body"
              ],
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "openWorldHint": true,
              "readOnlyHint": true,
              "title": "Verify signed payment requirements (free)"
            }
          },
          {
            "name": "check_calldata_intent",
            "title": "Decode calldata and compare with declared intent (free)",
            "description": "Anti blind-signing. EVM: decodes what a transaction's calldata will actually do (ERC-20 transfer/approve/permit, setApprovalForAll, ownership transfer, native transfer). Solana: decodes a whole base64 transaction (SPL Token / Token-2022 Transfer, TransferChecked, Approve, SetAuthority, CloseAccount, Burn; System Transfer / Assign; ATA creation). Compares it with what you believe you are doing. EVM: pass intent:{action:'pay', to, amount} plus contract (the transaction's to) and data (hex calldata). Solana: pass network:'solana' and transaction (base64) instead of data. decision match = does what you declared; mismatch = different recipient/amount/asset, or an approval / authority change instead of a payment — do not sign; unknown = could not decode (including address-lookup-table accounts), which is not the same as safe.",
            "inputSchema": {
              "properties": {
                "contract": {
                  "description": "EVM only: the transaction's `to` field (token contract for ERC-20 payments, or the recipient for native transfers).",
                  "type": "string"
                },
                "data": {
                  "description": "EVM only: 0x-prefixed hex calldata.",
                  "type": "string"
                },
                "intent": {
                  "properties": {
                    "action": {
                      "enum": [
                        "pay"
                      ],
                      "type": "string"
                    },
                    "amount": {
                      "description": "Base units (e.g. 10 USDC = 10000000).",
                      "type": "string"
                    },
                    "asset": {
                      "description": "EVM: symbol/contract (optional). Solana: mint address (optional, checked against TransferChecked).",
                      "type": "string"
                    },
                    "to": {
                      "description": "EVM: recipient address. Solana: wallet or token account.",
                      "type": "string"
                    }
                  },
                  "required": [
                    "action",
                    "to"
                  ],
                  "type": "object"
                },
                "network": {
                  "description": "'solana' to decode a Solana transaction; EVM chain name or CAIP-2 id otherwise (optional).",
                  "type": "string"
                },
                "transaction": {
                  "description": "Solana only: base64-serialized transaction or message.",
                  "type": "string"
                },
                "value": {
                  "description": "EVM only: native value in wei (optional).",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "openWorldHint": false,
              "readOnlyHint": true,
              "title": "Check calldata against intent (free)"
            }
          }
        ]
      },
      "name": "aml",
      "note": "Indexed from the official MCP registry: facts and our own checks, not reviewed, so no score, grade or rank.",
      "packages": [
        {
          "registryType": "npm",
          "identifier": "oceanalt-aml-mcp",
          "version": "0.7.0",
          "transport": "stdio"
        }
      ],
      "pageJsonUrl": "https://www.anchorterminal.com/tools/oceanalt-aml.json",
      "popularity": {
        "githubStars": 0,
        "npmWeekly": 90
      },
      "registryName": "com.oceanalt/aml",
      "remotes": [
        {
          "type": "streamable-http",
          "url": "https://oceanalt.com/api/mcp"
        }
      ],
      "repository": "https://github.com/OceanAlt666/oceanalt-aml-mcp",
      "reviewed": false,
      "slug": "oceanalt-aml",
      "source": "the official MCP registry",
      "sourceUrl": "https://registry.modelcontextprotocol.io/v0.1/servers?search=com.oceanalt/aml",
      "summary": "Screen a payee address before an AI agent pays: sanctions, mixers, scam lists, on-chain risk.",
      "updatedAt": "2026-10-04T08:54:58Z",
      "url": "https://www.anchorterminal.com/tools/oceanalt-aml",
      "vendor": "oceanalt.com",
      "vendorUrl": "https://oceanalt.com/en/api-docs",
      "version": "0.7.1",
      "websiteUrl": "https://oceanalt.com/en/api-docs",
      "where": "both",
      "why": [
        "vendor"
      ]
    }
  },
  "kind": "anchor.page",
  "links": {
    "api": "https://www.anchorterminal.com/api/v1/index.json",
    "html": "https://www.anchorterminal.com/tools/oceanalt-aml",
    "json": "https://www.anchorterminal.com/tools/oceanalt-aml.json",
    "llms": "https://www.anchorterminal.com/llms.txt",
    "markdown": "https://www.anchorterminal.com/tools/oceanalt-aml.md",
    "slim": "https://www.anchorterminal.com/tools/oceanalt-aml.min.md"
  },
  "markdown": "# aml\n\n\u003e Indexed, not reviewed: facts from the official MCP registry and our own checks. No score, grade or rank, and not in the rankings until the panel reviews it. How the index works: https://www.anchorterminal.com/indexed/\n\n- Kind: MCP server, by oceanalt.com (https://oceanalt.com/en/api-docs)\n- Listed because: It's published in the registry under oceanalt.com, a namespace the registry only gives to whoever proves they control that domain.\n- What the official MCP registry says: Screen a payee address before an AI agent pays: sanctions, mixers, scam lists, on-chain risk.\n\n## Facts\n\n- MCP registry: `com.oceanalt/aml` 0.7.1\n- Endpoint: https://oceanalt.com/api/mcp (streamable HTTP)\n- Package: npm `oceanalt-aml-mcp` (stdio)\n- Source: https://github.com/OceanAlt666/oceanalt-aml-mcp\n- Website: https://oceanalt.com/en/api-docs\n- npm downloads a week: 90\n- GitHub stars: 0\n- Registry entry updated: 2026-10-04\n\n## Tools\n\n- Tools it lists (10, about 3,186 tokens of context, `tools/list` without credentials over MCP 2026-07-28, checked 2026-10-04 22:23 UTC):\n  - `payment_decision` (read-only): \"Before your agent pays, call OceanAlt once.\" Pass the payee address the agent is about to pay; get a machine-executable decision: allow | review | decline,…\n  - `screen_address` (read-only): Run an AML compliance screen on a single blockchain address BEFORE paying or receiving from it — the pre-payment check on a counterparty. Checks OFAC…\n  - `screen_endpoint` (read-only): Screen a payment ENDPOINT (URL or domain) before calling it — the half that address screening cannot answer. In x402 the agent discovers a URL first, receives…\n  - `counterparty_control_baseline` (read-only): Answers a different question from address screening. Screening asks whether an address is risky; this asks how much damage the agent on the other side could do…\n  - `attest_control_baseline` (writes): File your operator's control-baseline attestation — the counterpart to counterparty_control_baseline. That tool asks what controls the OTHER side runs; this…\n  - `baseline_controls` (read-only): Fetch the OceanAlt Agent Control Baseline: the list of controls an agent operator is expected to run before it is allowed to move money, each answerable yes or…\n  - `resolve_agent_identity` (read-only): Resolves who stands behind a paying agent: agent -\u003e principal -\u003e mandate -\u003e credential -\u003e wallet. Each link reports whether it holds; completeness counts how…\n  - `recent_flagged` (read-only): Return a representative sample of addresses on OceanAlt's reviewed risk list — OFAC-sanctioned, known mixers, and community-reported scam/phishing — each with…\n  - `verify_payment_requirements` (read-only): Before paying an x402 402 response, check that its payment requirements (payTo, amount, asset, network, resource) were signed by the seller and not altered in…\n  - `check_calldata_intent` (read-only): Anti blind-signing. EVM: decodes what a transaction's calldata will actually do (ERC-20 transfer/approve/permit, setApprovalForAll, ownership transfer, native…\n- How its tools read to an agent (0 errors, 3 warnings, 1 note, about 3,186 tokens; rules at https://www.anchorterminal.com/check.md; not part of the score):\n  - warn TC11 check_calldata_intent: 2 parameters without a description: intent, intent.action\n  - warn TC12 verify_payment_requirements: no type for body\n  - warn TC13 attest_control_baseline: answers (object with no properties)\n  - note TC24 server: 10 of 10 tools have no outputSchema\n\n- JSON: https://www.anchorterminal.com/api/v1/tools/oceanalt-aml.json\n- Being indexed says nothing about quality, and nobody can pay for it. Ask for a review: https://www.anchorterminal.com/builders/#claiming\n",
  "meta": {
    "attribution": "Anchor Terminal (https://www.anchorterminal.com)",
    "docs": "https://www.anchorterminal.com/docs/",
    "generatedAt": "2026-10-05",
    "license": "CC-BY-4.0",
    "method": "https://www.anchorterminal.com/benchmark/",
    "methodology": "0.3",
    "openapi": "https://www.anchorterminal.com/openapi.json",
    "preview": false,
    "run": "2026-10-01",
    "runLabel": "October 2026 research run"
  },
  "page": {
    "breadcrumbs": [
      {
        "name": "Home",
        "url": "https://www.anchorterminal.com/"
      },
      {
        "name": "Terminal",
        "url": "https://www.anchorterminal.com/tools/"
      },
      {
        "name": "Indexed",
        "url": "https://www.anchorterminal.com/indexed/"
      },
      {
        "name": "aml",
        "url": ""
      }
    ],
    "description": "aml, an MCP server by oceanalt.com, listed from the official MCP registry. Indexed, not reviewed: facts and our own checks, no score or ranking. Screen a payee address before an AI agent pays: sanctions, mixers, scam lists, on-chain risk.",
    "facts": [
      "not reviewed",
      "not ranked",
      "facts only"
    ],
    "h1": "aml",
    "image": "https://www.anchorterminal.com/assets/og/indexed.png",
    "path": "/tools/oceanalt-aml",
    "published": "",
    "section": "indexed",
    "title": "aml: MCP server, indexed from the official MCP registry",
    "toc": null,
    "updated": "2026-10-05",
    "url": "https://www.anchorterminal.com/tools/oceanalt-aml"
  },
  "tokens": {
    "markdown": 1100,
    "slim": 1030
  },
  "version": 1
}
