MCP server

zScreen is available as a hosted Model Context Protocol server, so an assistant can screen a wallet through a tool call instead of an HTTP request. There is nothing to install and nothing to run.

Connect

The bearer token is an ordinary zScreen API key, the same one the HTTP API takes. Sign in at /signin with Google or a wallet, then create a key from /dashboard. It is shown once, on that screen, so copy it before navigating away. Paste it in place of zsk_... below.

In Claude Code:

claude code
claude mcp add --transport http zscreen \
  https://zscreenapi.zeruai.org/mcp \
  --header "Authorization: Bearer zsk_..."

Clients that take a configuration file, such as Cursor and VS Code, want the same three things: the transport, the URL, and the header.

mcp.json
{
  "mcpServers": {
    "zscreen": {
      "type": "http",
      "url": "https://zscreenapi.zeruai.org/mcp",
      "headers": { "Authorization": "Bearer zsk_..." }
    }
  }
}

Clients that only offer OAuth fields, which includes the Claude web connector, cannot use a key header yet. Use Claude Code, Cursor or VS Code until that lands.

Tools

  • screen_wallet(address) screens one address and returns the verdict.
  • get_job(job_id) polls a wallet that had to be fetched.
  • get_screening(screening_id) returns one record from your account.
  • list_wallet_screenings(address) lists your screenings for an address.

Read assessed first

Every result carries an assessed field, and it is the one to branch on. Only a result with assessed: true carries a verdict.

assessed
{
  "ok": true,
  "assessed": true,
  "verdict": "FLAGGED",
  "risk_score": 100,
  "decided_by": {
    "rule": "ofac_contact",
    "source": "rule",
    "reason": "This wallet dealt directly with an address on the OFAC sanctions list."
  }
}

A wallet nobody has looked at yet comes back with assessed: false and a null verdict. It is not a clean wallet. The same is true when the free tier is spent and when the chain has nothing to score.

not assessed
{
  "ok": true,
  "assessed": false,
  "status": "queued",
  "job_id": 41,
  "verdict": null,
  "note": "This wallet has no history on file and is being fetched. Poll get_job with job_id. A wallet is NOT low risk because it has not been assessed yet."
}

Rate limits and brief outages also return assessed: false, with a retry_after, so a failure to answer is never mistaken for an answer.

Limits

Tool calls are screens. They count against the same free tier and the same requests-per-second limit as the API, on the key you configured, so Rate limits and the free tier applies unchanged.

When the key's free tier is spent, screen_wallet returns assessed: false with status: "payment_required" and a payment object. The agent cannot pay from inside MCP: a person, or an x402 client, pays $0.50 per screen over the HTTP API.

No MCP in your client?

An agent can call the HTTP API directly instead. skill.md is a single file that tells it how, and For agents covers the rest of what this site offers machines.