Every stablecoin freeze and seizure on record — with evidence.

The record, for AI assistants

A read-only Model Context Protocol server that answers from the same record this site shows: every record dated, cited to a page here, and never an opinion about anyone.

Record as of 17 August 2026. Server facts as of 22 August 2026. Every tool is open — no account, no key, no sign-in.

What it is

A Model Context Protocol server at https://mcp.eaglevirtual.com/mcp. It is read-only and it is open: no account, no API key and no sign-in, as of 22 August 2026. It speaks Streamable HTTP to the 2026-07-28 revision of the MCP specification, on POST only; its server name is eagle-virtual.

It answers from the same record this site shows. A wallet check reads the live per-address record the site's own lookup reads, at the moment of the call. Counts, per-coin histories and coverage come from the published snapshot — as of 17 August 2026, 44,643 recorded events across 17 blockchains and 57 coins, from 2018-06-09.

https://mcp.eaglevirtual.com is the server's permanent hostname, attached on 22 August 2026. It is the only supported address: paste it exactly, including the /mcp path.

What it is
Item Detail
Endpoint https://mcp.eaglevirtual.com/mcp
Transport Streamable HTTP — JSON-RPC over POST. GET is refused with 405.
Specification MCP revision 2026-07-28
Server name eagle-virtual, version 0.1.0-draft
Authentication None. Every tool is open as of 22 August 2026, and the server advertises no authorization server.
Hostname https://mcp.eaglevirtual.com — attached 22 August 2026; the only supported address

How to connect

Paste the endpoint into whichever client you use. The server needs nothing else from you. Each client was checked against its own documentation on the date above; menu paths move, so if one has, the client's own documentation wins.

In Claude Code an entry with a url and no type is a configuration error — it is read as a local command — so keep the type line in its snippet below.

Claude Code, Cursor, VS Code
# Claude Code — one command:
claude mcp add --transport http eaglevirtual https://mcp.eaglevirtual.com/mcp

# Claude Code — or .mcp.json at the project root (the type line is required):
{
  "mcpServers": {
    "eaglevirtual": {
      "type": "http",
      "url": "https://mcp.eaglevirtual.com/mcp"
    }
  }
}

# Cursor — .cursor/mcp.json in the project, or ~/.cursor/mcp.json:
{
  "mcpServers": {
    "eaglevirtual": {
      "url": "https://mcp.eaglevirtual.com/mcp"
    }
  }
}

# VS Code — .vscode/mcp.json:
{
  "servers": {
    "eaglevirtual": {
      "type": "http",
      "url": "https://mcp.eaglevirtual.com/mcp"
    }
  }
}
How to connect
Item Detail
Claude (web and desktop) Customize → Connectors → + → Add custom connector → paste the endpoint → Add. On Team and Enterprise plans an owner adds it under Organization settings → Connectors and members enable it. As of 22 August 2026, Free plans are limited to one custom connector.
ChatGPT Turn on Developer mode in Settings, then create a developer-mode app for a remote MCP server, enter the endpoint, and choose no authentication. Available on Plus, Pro, Business, Enterprise and Education on the web as of 22 August 2026; the exact path is in OpenAI's developer-mode guide.
Claude Code The command in the block below, or the .mcp.json entry with "type": "http".
Cursor The mcpServers entry below, in .cursor/mcp.json in your project or in ~/.cursor/mcp.json.
VS Code The servers entry below, in .vscode/mcp.json.
Anything else Any client that speaks Streamable HTTP: point it at the endpoint. An agent framework with no MCP support can present the tool schema further down to its model and relay each call to the endpoint as an MCP tools/call request.

Querying the server directly

You do not need a client library. The server speaks JSON-RPC 2.0 over HTTP: one POST per call to https://mcp.eaglevirtual.com/mcp, no account and no key, and GET is answered with 405. Four headers are required — Content-Type: application/json; Accept: application/json, text/event-stream; MCP-Protocol-Version: 2026-07-28; and Mcp-Method naming the JSON-RPC method — plus Mcp-Name naming the tool on a tools/call. Because the server implements protocol revision 2026-07-28, every request also carries the per-request envelope in params._meta (the protocol version, your client's name and version, and its capabilities); a request without it is refused with a JSON-RPC error that says which key is missing, and a request whose headers and body disagree is refused with -32020 rather than guessed at.

The same call shapes work for every tool: tools/list to read the five schemas, then tools/call with the tool name and its arguments. The example below checks one wallet; the response that follows is what the live server returned for it on 22 August 2026, abbreviated to one record.

Request — curl, tools/call get_address_status
curl -s https://mcp.eaglevirtual.com/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -H 'MCP-Protocol-Version: 2026-07-28' \
  -H 'Mcp-Method: tools/call' \
  -H 'Mcp-Name: get_address_status' \
  -d '{
    "jsonrpc": "2.0", "id": 1, "method": "tools/call",
    "params": {
      "name": "get_address_status",
      "arguments": { "address": "0x9b2328055872e7470e9cfdafa0186c1c72c3bac4" },
      "_meta": {
        "io.modelcontextprotocol/protocolVersion": "2026-07-28",
        "io.modelcontextprotocol/clientInfo": { "name": "my-script", "version": "1" },
        "io.modelcontextprotocol/clientCapabilities": {}
      }
    }
  }'

What comes back

A JSON-RPC result whose content[0].text is the answer as a JSON string and whose structuredContent is the same answer as an object. The state is one of restricted, clean, or stale; every record carries a title, a one-sentence text that names the company as the actor, a url on this site to cite, the record data, and a metadata block with the as-of date and the license. A wallet with nothing on record answers clean only while every lane is vouched for, and stale otherwise — never a bare clean over a gap.

Response — abbreviated to one record
{
  "jsonrpc": "2.0", "id": 1,
  "result": {
    "content": [{ "type": "text", "text": "{ …the same object as structuredContent… }" }],
    "structuredContent": {
      "address": "0x9b2328055872E7470e9CFDAfA0186C1c72C3bAc4",
      "lookup_key": "0x9b2328055872e7470e9cfdafa0186c1c72c3bac4",
      "recognized": true,
      "state": "restricted",
      "headline": "3 records found",
      "record_count": 3,
      "records": [
        {
          "id": "fae73fe502850f640120e24afa1c075d",
          "title": "USDT — balance taken on Ethereum, block 25,776,080",
          "url": "https://eaglevirtual.com/address/0x9b2328055872e7470e9cfdafa0186c1c72c3bac4",
          "text": "Tether took the balance of 0x9b2328055872e7470e9cfdafa0186c1c72c3bac4 on Ethereum on 2026-08-17, block 25,776,080. Transaction 0xd87f8894…4add4ad9.",
          "metadata": {
            "source": "Eagle Virtual — Stablecoin Freeze & Seize Tracker",
            "as_of": "2026-08-17",
            "license": "https://eaglevirtual.com/license.xml"
          },
          "data": {
            "chain": "Ethereum", "chain_id": "1", "coin": "USDT", "issuer": "Tether",
            "category": "blacklist", "event_signature": "DestroyedBlackFunds(address,uint256)",
            "is_seizure": true, "is_release": false,
            "observed_at": "2026-08-17T16:44:47.000Z", "block_number": 25776080,
            "transaction_hash": "0xd87f889460d81cb099eb1d617efad22728aae787fb2fb5d7f948bb634add4ad9"
          }
        }
      ]
    }
  }
}

The five tools

Five tools, all read-only, listed by the server in this order. Four answer with counts, dates, or the one address you supplied; the fifth returns the published feed and nothing past it.

Every response carries the same envelope: a state or a count, a list of records, and a metadata block. Every record is one citable object — an id, a title, a url on this site, a one-sentence dated text with the company as the actor, and a data block of structured fields. A wallet with six recorded events comes back as six records, each pointing at that wallet's page here.

The metadata block carries source, as_of (the date of the most recent recorded event, never today's date), exported_at, license, and a status field reading "DRAFT — pending operator sign-off" until the operator signs the data off. When a blockchain cannot be vouched for at the moment of the call, not_vouched_for names it — the chain, whether it was never scanned or is behind, and the last verified block — and coverage_note says so in a sentence. When our data plane does not answer at all, coverage_note says that instead. Neither case is ever collapsed into silence.

The five tools
Item Detail
get_address_status One wallet → every recorded freeze, seizure, blacklisting or on-chain sanctions listing against it, with the transaction and block for each. State: clean, restricted or stale.
get_token_statistics Counts by coin, blockchain, month or year. Returns no addresses.
get_token_policy Per coin, which restriction controls the issuing company has actually used, how many times, and the first and most recent dates. Returns no addresses.
get_coverage The blockchains and coins covered, the as-of date, and which lanes cannot currently be vouched for.
list_freeze_events The published feed of recent events — the same rows the events page shows, inside the six-month window — filterable by coin, blockchain, kind and date. The one tool that returns addresses you did not supply, and it cannot be paged past.

get_address_status — check a wallet

Supply one address in any form its chain uses — EVM, TRON, Solana or Stellar; casing does not matter. It is normalized before the lookup, so a checksum-cased address and its lowercase form are the same wallet.

What comes back: the full address, state (clean, restricted or stale), a headline — "No freeze, seizure, or blacklist recorded", "N records found", or "We cannot vouch for this right now" — and one record per recorded event, each with the company, the coin, the chain, the date, the block, the transaction hash and the event signature. A string that does not check out as an address on any chain we check returns recognized: false and no lookup is performed, so a typo cannot read as a clear wallet.

stale means we could not vouch for the answer at that moment — our data did not answer, or a chain the answer depends on was behind. It is a statement about us, never about the wallet.

No amount and no dollar figure is returned for any event: the amount field is null, with a note saying so. The server renders no quantity as of 22 August 2026.

get_address_status — check a wallet
Item Detail
address Required. The wallet address, in any format the chain uses; up to 120 characters.

get_token_statistics — counts, never addresses

Counts of recorded freezes, seizures and blacklistings, grouped by coin, blockchain, month or year, with the date of the first event and the as-of date. Wallet counts are distinct within each grouping and deliberately do not sum to the total: a wallet restricted by two companies is one wallet overall and one in each of two rows, and the response says so.

The total is counted over every token we check, which includes tokens that are not stablecoins; the response labels it that way rather than letting "stablecoin wallets" be inferred.

get_token_statistics — counts, never addresses
Item Detail
token Optional. A coin symbol, e.g. USDT. Omit for every coin.
chain Optional. A blockchain name or chain id, e.g. Ethereum or 1.
group_by Optional. One of token, chain, month, year, overall. Defaults to token.

get_token_policy — what an issuer has done

For a coin, the record of which restriction controls the issuing company has actually used — freezing, blacklisting, taking a balance, lifting a restriction — each with its on-chain event signature, how many times, and the first and most recent dates, on the chains we check, as of 17 August 2026.

It reports what has happened. It does not report what a contract is capable of: contract capability inspection is not published, the contract_capability field is null rather than false, and the note beside it says that an absence of recorded events is not evidence that a control is absent. A coin with nothing recorded comes back as exactly that, dated and scoped — never as "cannot freeze".

get_token_policy — what an issuer has done
Item Detail
token Optional. A coin symbol, e.g. USDT, USDC, EURC. Omit for every coin on record.

get_coverage — what we check, and how fresh it is

Takes no arguments. Returns the blockchains and coins covered, the number of recorded events, the first-event and as-of dates, one record per chain saying whether it is currently vouched for, and the same not_vouched_for list every other tool carries. all_lanes_current is true, false, or null — null when our data plane could not be asked, because "we could not check" must never read as "everything is current".

Call it before relying on an answer about a chain or a coin. A chain we are not checking shows as not currently checked, and an absence of records for it means nothing.

list_freeze_events — the published feed

The same recent events the events page shows — the rolling six-month window, capped at the published feed — filterable by coin, blockchain, kind and date, up to 100 rows per call and 25 by default. Each row is one record citing that wallet's page.

It is a published sample, not the corpus, and the response says so: subset_note states the sample size and that there is no way to page past it; matched_in_published_subset and truncated say what the filters hit. There is no cursor, no offset, no prefix search and no "what changed since" — deliberately, because each of those is the full list handed over a row at a time. For one wallet, use get_address_status; for totals, get_token_statistics.

list_freeze_events — the published feed
Item Detail
token Optional. A coin symbol, e.g. USDT.
chain Optional. A blockchain name or chain id, e.g. Tron or 1.
kind Optional. One of blacklist, freeze, seizure, release, sanctions, delisting.
since Optional. Only events on or after this date, YYYY-MM-DD.
limit Optional. Rows to return, 1 to 100. Defaults to 25.

OpenAI-compatible tool schema

The five tools as function definitions, in the shape the OpenAI chat-completions API and every framework that copies it expect — type, and a function with name, description and parameters. The parameters objects are the server's own input schemas, unchanged, and a test fails if this block and the server ever differ.

An agent that cannot speak MCP can present these to its model and relay each call to the endpoint above as an MCP tools/call request with the same arguments. An agent that can should simply connect; the server lists the same five.

tools — OpenAI function-calling shape
[
  {
    "type": "function",
    "function": {
      "name": "get_address_status",
      "description": "Look up one wallet address and return every recorded stablecoin freeze, seizure, blacklisting or on-chain sanctions listing against it, with the transaction and block for each so it can be verified independently. Covers 17 blockchains and 57 coins. Returns a dated record, never a risk score, rating, or opinion about the address or its owner. Free and needs no account.",
      "parameters": {
        "type": "object",
        "properties": {
          "address": {
            "type": "string",
            "description": "The wallet address to check, in any format the chain uses. Accepts EVM, TRON, Solana and Stellar forms; casing does not matter.",
            "maxLength": 120
          }
        },
        "required": [
          "address"
        ],
        "additionalProperties": false
      }
    }
  },
  {
    "type": "function",
    "function": {
      "name": "get_token_statistics",
      "description": "Counts of recorded stablecoin freezes, seizures and blacklistings — by coin, by blockchain, by month, or by year. Answers questions like \"how many wallets has Tether frozen\", \"which coin is frozen most often\", and \"how many seizures happened in 2025\". Returns counts and dates only; no wallet addresses are returned by this tool.",
      "parameters": {
        "type": "object",
        "properties": {
          "token": {
            "type": "string",
            "description": "Optional coin symbol, e.g. USDT. Omit for every coin.",
            "maxLength": 32
          },
          "chain": {
            "type": "string",
            "description": "Optional blockchain name or chain id, e.g. Ethereum or 1.",
            "maxLength": 32
          },
          "group_by": {
            "type": "string",
            "enum": [
              "token",
              "chain",
              "month",
              "year",
              "overall"
            ],
            "description": "Which breakdown to return. Defaults to token."
          }
        },
        "additionalProperties": false
      }
    }
  },
  {
    "type": "function",
    "function": {
      "name": "get_token_policy",
      "description": "For a given coin, the record of which restriction controls the issuing company has actually used — freezing, blacklisting, taking a balance, lifting a restriction — with the on-chain event signature, how many times, and the first and most recent dates. Reports what has happened, dated. It does not report what a contract is capable of: contract capability inspection is not published yet, and this tool says so rather than inferring that a coin cannot freeze from an absence of records. Discloses no wallets.",
      "parameters": {
        "type": "object",
        "properties": {
          "token": {
            "type": "string",
            "description": "Coin symbol, e.g. USDT, USDC, EURC. Omit for every coin on record.",
            "maxLength": 32
          }
        },
        "additionalProperties": false
      }
    }
  },
  {
    "type": "function",
    "function": {
      "name": "get_coverage",
      "description": "The blockchains and coins covered by this freeze and seizure record, the date of the most recent recorded event, and which lanes we cannot currently vouch for. Call this to find out whether a chain or coin is in scope before relying on an answer about it, and to check whether any part of the record is behind.",
      "parameters": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    }
  },
  {
    "type": "function",
    "function": {
      "name": "list_freeze_events",
      "description": "The published feed of recent stablecoin freeze, seizure, blacklist, release and on-chain sanctions events — the same rows eaglevirtual.com shows publicly — with the wallet, coin, blockchain, date, block and transaction for each. Filter by coin, blockchain, event kind or date. This is a published sample of the record, not the full corpus, and there is no way to page beyond it. To check a specific wallet, use get_address_status instead; for totals use get_token_statistics.",
      "parameters": {
        "type": "object",
        "properties": {
          "token": {
            "type": "string",
            "description": "Coin symbol, e.g. USDT.",
            "maxLength": 32
          },
          "chain": {
            "type": "string",
            "description": "Blockchain name or chain id, e.g. Tron or 1.",
            "maxLength": 32
          },
          "kind": {
            "type": "string",
            "enum": [
              "blacklist",
              "freeze",
              "seizure",
              "release",
              "sanctions",
              "delisting"
            ],
            "description": "Restrict to one kind of event."
          },
          "since": {
            "type": "string",
            "description": "Only events on or after this date, YYYY-MM-DD.",
            "maxLength": 10
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "description": "Rows to return, up to 100. Defaults to 25."
          }
        },
        "additionalProperties": false
      }
    }
  }
]

What it is not

Reference data, not advice. It is not a compliance determination, not legal or financial advice, and not a clearance: a wallet with nothing recorded has nothing recorded on the coins and chains we check, as of the date on the answer, and that is all it means.

No risk score, no band, no opinion about any address or any person. The machine state is clean, restricted or stale; the sentence beside it says what was actually found; and neither is a judgment about anyone.

Every record is a dated past-tense fact about what a company did, with the company as the actor — "Tether restricted this wallet on Ethereum on 2026-08-17", never "USDT froze you". Every "none" carries its scope and its date.

The full list is not published here or anywhere. list_freeze_events returns the same published feed the site shows and cannot be paged past; the other four return counts, dates, or the one address you supplied. A wallet whose events are all older than the six-month window is reachable only by asking about that wallet.

No dollar figures. The server returns no amount and no USD value for any event — the field is null, with a note saying so, as of 22 August 2026. Where this site shows a dollar figure it is computed only from a certified price for that coin at that block, and an em-dash stands where none exists.

Terms, license and privacy

The records are public on-chain fact and are meant to be cited. Use them with attribution under CC BY 4.0 — a link to the url each record carries, and the date on it — as the machine-readable license at https://eaglevirtual.com/license.xml states; every record's metadata.license field carries that address. The license permits search, inclusion in an AI retrieval index, and use as AI input; it does not permit AI training.

The terms of use at /terms apply, and the privacy page at /privacy describes what this site stores. For the server itself: a call sets no cookie, and the Worker's own code logs nothing — not the address you asked about, not who asked, not a count. Cloudflare's Workers Logs is switched on for the Worker, so Cloudflare holds its standard per-request invocation log under Cloudflare's own retention; we do not export it anywhere.

If a record the server returns is wrong, the corrections policy at /corrections applies exactly as it does to the site: legal@eaglevirtual.com, and a transaction hash is the fastest report. Privacy questions go to legal@eaglevirtual.com; anything else to hello@eaglevirtual.com. The same record is also available over plain HTTP for teams — see /api.

Terms, license and privacy
Item Detail
Records CC BY 4.0 attribution — link the url on each record and keep its date
Machine-readable license https://eaglevirtual.com/license.xml (RSL); carried in every record as metadata.license
Terms of use /terms
Privacy /privacy
Logging by the Worker None — no per-request log of any kind in the Worker's code
Cloudflare Workers Logs Enabled on the Worker; held by Cloudflare; not exported

Questions people ask

Do I need an account or a key?

No. Every tool is open as of 22 August 2026: paste the endpoint and ask.

Does it return a risk score?

No. It returns dated records with the transaction that executed each one, and counts. It characterizes no address and no person.

Can I download the full list of restricted addresses?

No. list_freeze_events returns the published feed — the same rows the site shows, inside the six-month window — and cannot be paged past. A specific wallet is answered one address at a time by get_address_status.

Which URL do I paste?

https://mcp.eaglevirtual.com/mcp — exactly that, including the /mcp path. The server has answered on https://mcp.eaglevirtual.com since 22 August 2026, and no other hostname is supported.