Every change Wellknown observed on this MCP server, newest first, with what it was before and what it became. Tool-surface changes carry the definition diff. Nothing here is edited after the fact.
Certificate changed, valid to 2027-01-03
Changed the definition of "get_address_approvals", "get_address_compliance", "get_address_exposure" and 5 more
OpenERC-20/Permit2ERC-20allowancesandforPermit2anallowances one address(Class-Fhasdecodedgrantedfacts)on one chain, one row per spender and token withatheper-rowrawapproval-riskvalue, unlimited/oversized/old flags, spender_class and a band (shadow heuristiccritical|high|low|expired|none): unlimited to aflagged/unknownflagged or unknown spender is the#1main drainvector.vector,Aaknown-serviceknown service spender (DEX router/, Permit2) isnormal.normal,Expiredan expired Permit2sub-allowancessub-allowancearereads 'expired'.TheUse it when the question is what a wallet has approved and who could pull its stablecoins. Not for a risk tier — the band is informational,notandaneverrisk-tiermovescontributionget_address_risk. Not for issuer freezes: get_address_compliance. Not for taint: get_address_exposure. address is the allowance owner (the granter),untilnever the spender. Heavy read: under load itclearsanswersthebusyprecisionorgate.timeout — retry with backoff. Noauth.auth; 1200 requests/min shared by all tools. A heuristic band over decoded on-chain Approval facts, not an AML or legal determination.
before
—after
{"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"readOnlyHint":true}Per-address Class-FIssuercompliancefreeze/seize facts(M4)for one address onONEone chain, plus the OFAC SDNflag.flag: freeze[]:(one row perenabledfreeze-capable stablecoin—, statusfrozen|seized|clear|unknown; 'unknown' = no issuer act namesfrozen|seized|clear|unknown,thewithaddressfrozen_usd6and= the
TheTaint§8exposuretaint-exposureofverdictoneforaddressanonaddressone chain: a bounded backwardBFSwalk over the value graph to the nearest OFAC-sanctioned or hack/drainer/mixer root,returninganswered as a class (sanctioned|direct|indirect|negligible|unknown|none),nearest-hop,the nearest hop and a value-proportional haircut fraction.'unknown'Use
The unifiedUnified riskverdicttier foranone address(§9 R2):onaonesinglechaintier—(unknown|none|low|medium|high|severe)aggregating— from decodedFACTSfacts (OFAC listing, issuer freeze/seize on this chain, exposure to asanctioned/hacksanctioned or hack
Recent stablecoin transfers onONEone chain,(newest first), filterable byrecipient/payerpayer and/or recipient,cursor-paginatedcursor-paginated.(next_cursor).Use it for the latest transfers of an address or of the whole chain, with a tx_hash to cite. Not for who an address settles with over time: get_wallet_graph_walk. Not for how fresh the feed is: get_sync_status. Not for any verdict about an address: get_address_risk. Answer: items[], each row tx_hash, log_index ⟨28 unchanged words⟩ asked for — rows do not repeat it.Genericpayer and recipient narrow together; omit both for the chain-wide feed; pass next_cursor back unchanged as cursor for older rows, and a page without it is the last. Heavy read: under load it answers busy or timeout — retry with backoff. No auth; 1200 requests/min shared by all tools. Plain on-chain Transferfacts.facts,
OFAC SDNsanction-listlist coverage:howasmanythisEVMscanner+holdsSolanait:+evm_count,Tronsolana_count,addressestron_countareandingestedtotal addresses loaded (the free public 0xB10C list,
DataIndexer freshness for one chain, so the agent knows how recent the data behind an answer is: freshness_seconds (the age of the newest indexedtransfer, the freshness measure on every chain;transfer; null when it could not be read for ⟨15 unchanged words⟩ blocks (lag_blocks = head_block - last_indexed_block). Use it before trusting how recent an address answer is, or to tell an empty feed from a stalled indexer. Not for how fresh the OFAC list is: get_sanctions_status. Every address verdict already carries freshness_seconds, so call this only for the block numbers or for a chain you have not asked about yet. On Solana (chain -1) safe_block is the ⟨29 unchanged words⟩ negative lag_blocks means the node's head went back. chain is the only parameter; omit it for Base. Light read, never waits for a slot. Noauth.auth; 1200 requests/min shared by all tools.
before
—
{"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"readOnlyHint":true}Bounded walk over the indexedstablecoinsettlementflowgraph of one stablecoin fromaone wallet on one chain: payer<->recipient hops,with value-weightedscorescores, entity-aware node keys,attributed-nodea stopoption,at known services and sanctioned-node markers.ThisUseisit to explain who anexplainabilityaddressprimitive,settles
Changed the definition of "get_address_approvals", "get_address_compliance", "get_address_exposure" and 4 more
{"additionalProperties":false,"properties":{"address":{"description":"theThe address tocheckcheck.(0xThehexaddress in its network's own spelling: 0x… for EVM chains,orT… for Tron, base58 forSolanaSolana. The answer writes it in the spelling of chain_id (address) and echoes what you sent (requested_address); address_respelled true means your spelling belongs to another kind of chain than chain_id (a T… address asked about an EVM chain, a 0x… address asked about Tron) — answered about the same bytes there, not refused, and the same owner only for a plain key account.
Certificate recorded, valid to 2026-11-05
Authorization not required
Unknown → Live
First tool surface recorded: 8 tools (server version 1.2.0)
https://stablescan.achivx.com/mcp (mcp_streamable_http) — from mcp_registry, with the record
Showing the latest 8 events. The API returns up to 500 and filters by kind: ?kind=tool_surface_changed
before
—after
{"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"readOnlyHint":true}before
—after
{"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"readOnlyHint":true}before
—after
{"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"readOnlyHint":true}before
—after
{"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"readOnlyHint":true}before
—after
{"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"readOnlyHint":true}before
—after
{"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"readOnlyHint":true}{"additionalProperties":false,"properties":{"address":{"description":"theThe address tocheckcheck.(0xThehexaddress in its network's own spelling: 0x… for EVM chains,orT… for Tron, base58 forSolanaSolana. The answer writes it in the spelling of chain_id (address) and echoes what you sent (requested_address); address_respelled true means your spelling belongs to another kind of chain than chain_id (a T… address asked about an EVM chain, a 0x… address asked about Tron) — answered about the same bytes there, not refused, and the same owner only for a plain key account.","type":"string"},"chain":{ ⟨59 unchanged words⟩ CAIP-2 id (eip155:1, solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp).UnknownSurroundingspellingswhitespace, a leading + and leading zeros are ignored, a JSON number counts by its value (1.0 is 1), slugs and CAIP-2 ids match in any letter case, and an empty, blank or null chain is no chain at all. Anything else (hex, a decimal fraction, a zero-padded CAIP-2 reference) is refused, and so is a network this scanner ⟨48 unchanged words⟩ chain set","type":["integer","string","null"]}},"required":["address"],"type":"object"}
⟨36 unchanged words⟩ could not be completed (OFAC list unloaded,frontierwalk truncated by its time budget or frontier cap, Solana coverage pending or partial, short history, or no hack/drainer/mixer label loaded for this chain) — never a false'none'.'none'; incomplete_reasons names which (time_budget may complete at a quieter moment, frontier_cap repeats). Heuristic risk signal, not an AML/legal determination. No auth.
{"additionalProperties":false,"properties":{"address":{"description":"theThe address tocheckcheck.(0xThehexaddress in its network's own spelling: 0x… for EVM chains,orT… for Tron, base58 forSolanaSolana. The answer writes it in the spelling of chain_id (address) and echoes what you sent (requested_address); address_respelled true means your spelling belongs to another kind of chain than chain_id (a T… address asked about an EVM chain, a 0x… address asked about Tron) — answered about the same bytes there, not refused, and the same owner only for a plain key account.","type":"string"},"chain":{ ⟨59 unchanged words⟩ CAIP-2 id (eip155:1, solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp).UnknownSurroundingspellingswhitespace, a leading + and leading zeros are ignored, a JSON number counts by its value (1.0 is 1), slugs and CAIP-2 ids match in any letter case, and an empty, blank or null chain is no chain at all. Anything else (hex, a decimal fraction, a zero-padded CAIP-2 reference) is refused, and so is a network this scanner ⟨48 unchanged words⟩ chain set","type":["integer","string","null"]}},"required":["address"],"type":"object"}
⟨48 unchanged words⟩ be completed (incomplete coverage) — NOT 'checkedclean'.clean'; a tier 'unknown' names its cause in evidence and incomplete_reasons (e.g. time_budget: the exposure walk was cut). The freeze input is this chain's per-token status ⟨15 unchanged words⟩ is not backfilled turns a would-be 'none' into'unknown'.'unknown' — so a Solana tier, where every freeze pair is unknown, is never 'none'. NOT scored: the same address frozen on ⟨20 unchanged words⟩
{"additionalProperties":false,"properties":{"address":{"description":"theThe address tocheckcheck.(0xThehexaddress in its network's own spelling: 0x… for EVM chains,orT… for Tron, base58 forSolanaSolana. The answer writes it in the spelling of chain_id (address) and echoes what you sent (requested_address); address_respelled true means your spelling belongs to another kind of chain than chain_id (a T… address asked about an EVM chain, a 0x… address asked about Tron) — answered about the same bytes there, not refused, and the same owner only for a plain key account.","type":"string"},"chain":{ ⟨59 unchanged words⟩ CAIP-2 id (eip155:1, solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp).UnknownSurroundingspellingswhitespace, a leading + and leading zeros are ignored, a JSON number counts by its value (1.0 is 1), slugs and CAIP-2 ids match in any letter case, and an empty, blank or null chain is no chain at all. Anything else (hex, a decimal fraction, a zero-padded CAIP-2 reference) is refused, and so is a network this scanner ⟨48 unchanged words⟩ chain set","type":["integer","string","null"]}},"required":["address"],"type":"object"}
⟨51 unchanged words⟩ CAIP-2 id (eip155:1, solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp).UnknownSurroundingspellingswhitespace, a leading + and leading zeros are ignored, a JSON number counts by its value (1.0 is 1), slugs and CAIP-2 ids match in any letter case, and an empty, blank or null chain is no chain at all. Anything else (hex, a decimal fraction, a zero-padded CAIP-2 reference) is refused, and so is a network this scanner ⟨31 unchanged words⟩ for","type":["integer","string","null"]},"cursor":{"description":"Pagination cursor ⟨32 unchanged words⟩ payer":{"description":"Filter by payer address: 0x… (0x+40hexEVM), T… (Tron) or base58 (Solana)","type":"string"},"recipient":{"description":"Filter by recipient address: 0x… (0x+40hexEVM), T… (Tron) or base58 (Solana)","type":"string"}},"type":"object"}
Data freshness for one chain, so the agent knows how recent the data behind an answer is: freshness_seconds (theindexer'sageheadof the newest indexed transfer,safethe freshness measure on every chain; null when it could not be read for this answer), the indexer's head and finalized blocks, its safe block and its lag in blocks (lag_blocks = head_block - last_indexed_block). On Solana (chain -1) safe_block is the finalized slot, andfreshness_secondslag_blocks is near 0 by construction and never negative, sotheitagentisknowsnothowarecentfreshness signal there: read freshness_seconds. On thedataEVMbehindchainsanandanswerTronis.a negative lag_blocks means the node's head went back. No auth.
⟨48 unchanged words⟩ CAIP-2 id (eip155:1, solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp).UnknownSurroundingspellingswhitespace, a leading + and leading zeros are ignored, a JSON number counts by its value (1.0 is 1), slugs and CAIP-2 ids match in any letter case, and an empty, blank or null chain is no chain at all. Anything else (hex, a decimal fraction, a zero-padded CAIP-2 reference) is refused, and so is a network this scanner ⟨13 unchanged words⟩ is about","type":["integer","string","null"]}},"type":"object"}
⟨47 unchanged words⟩ edge-rows) return hop 1 only with frontier_truncated=true. window_from present means the answer was built from that date, the edge-grain horizon, not from the start of the requested window; the default window all, 90d and 1y included (/v1/methodology edge_grain_horizon). When window_from is present, read the graph as covering that span only — do not treat the absence of a counterparty, a path or a sanctioned node as evidence about anything before that date. volume on nodes is the token's raw minor units (divide by 10^decimals); volume_usd6 is the same amount in USD with 6 decimals at peg 1. On Solana (chain -1) the answer carries coverage_status for the subject address only, never for its counterparties: pending — its history is still being filled, so an empty or small answer is not final; partial — filled to a documented bound. The walk shows a finished fill after the next Solana rollup pass (about 10 minutes), and never shows history older than window_from. This read never starts a fill, so pending can also mean none was asked for yet: one compliance read of the address asks for it. A Solana answer without coverage_status could not read it in time — treat it as pending. On Solana (chain -1) the edge grain of 2026-07-20..2026-09-14 is incomplete: those days hold part of their transfers or none, because their raw rows were offloaded before a fix reached production on 2026-09-17; they are not restored, and answers do not mark them (decision of 2026-09-17). Solana's grain is never trimmed, so there the horizon that window_from reports is not where retained data ends: once window_from is later than 2026-09-14 the answer holds none of those days. An answer that reaches them — window_from on or before 2026-09-14, or no window_from over a window that includes them — counts them as floors: at least this much, never the whole, and a counterparty, path or sanctioned node missing from those days is not evidence that there was none. No auth.
{"additionalProperties":false,"properties":{"address":{"description":"Wallet address. The address(in its network's own spelling: 0x… for EVM0x-hexchains,orT…Solanafor Tron, base58 for Solana. The answer writes it in the spelling of chain_id (address) and echoes what you sent (requested_address); address_respelled true means your spelling belongs to another kind of chain than chain_id (a T… address asked about an EVM chain, a 0x… address asked about Tron) — answered about the same bytes there, not refused, and the same owner only for a plain key account.","type":"string"},"chain":{ ⟨59 unchanged words⟩ CAIP-2 id (eip155:1, solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp).UnknownSurroundingspellingswhitespace, a leading + and leading zeros are ignored, a JSON number counts by its value (1.0 is 1), slugs and CAIP-2 ids match in any letter case, and an empty, blank or null chain is no chain at all. Anything else (hex, a decimal fraction, a zero-padded CAIP-2 reference) is refused, and so is a network this scanner ⟨48 unchanged words⟩ chain set","type":["integer","string","null"]},"frontier_cap":{"description":"Per-hop ⟨85 unchanged words⟩