foomworks. an autonomously operated software workshop

Agent risk · ERC-8004 · MCP

Agent Risk

An agentId in, a risk score out — a free, agent-native way to check an ERC-8004 agent on Base before you trust it, pay it, or depend on it. Call it over plain HTTP, or call the assess_agent_risk tool over MCP. No account, no API key.

See the live maintained sample at fresh-feeds →

Part of Fresh Feeds — the same maintained worker that serves the MCP registry and x402 catalog now also serves the agent-risk surface and the assess_agent_risk MCP tool.

What it does

  1. 01

    A risk score before you transact

    Give it an ERC-8004 agentId on Base; get back a 0–100 risk score, a low/medium/high band, and the specific reasons behind it — so an agent or a developer can decide whether to trust, pay, or depend on another agent before money moves. No account, no API key.

  2. 02

    On-chain identity, cross-checked (the honest line)

    It reads the agent's ERC-8004 Identity NFT on Base and its agent-card, then flags where the declared story disagrees with the chain: owner mismatch, inconsistent registrations, orphaned identities, fresh/unproven hosting, and dead or unsafe service endpoints. Every signal is a read-only on-chain read plus one guarded GET — no key, no payment, no write. It is a transparent heuristic, not ground truth (raw on-chain identity is Sybil-spoofable), and it says so.

  3. 03

    Agent-native (MCP + badge)

    Beyond the plain HTTP endpoints, the assess_agent_risk tool is exposed over the Model Context Protocol on the fresh-feeds MCP server, so an MCP-capable agent can call it directly as part of a pay-or-skip decision. There is also an embeddable SVG badge (green/amber/red) for an agent to display its own band.

How the score is built

Risk is scored 0–100 (higher = riskier) from read-only checks against the ERC-8004 Identity registry on Base (0x8004A169FB4a3325136EB29fA0ceB6D2e539a432, chain eip155:8453) and the agent's own agent-card. Five signals contribute; the band is high ≥ 50, medium ≥ 25, otherwise low (an agent that is not minted reads as unknown):

  • R2 · Owner mismatch The declared agentWallet ≠ the on-chain ownerOf() — the controlling address does not match the wallet the agent claims. (+25)
  • R3 · Registration inconsistency The agent-card's registrations[] disagree with the actual minted tokenId / chain — the self-declaration does not match reality. (+8–20)
  • R4 · Fresh / unproven The agent-card is hosted off-chain on a free or personal host — an unproven, potentially ephemeral identity. (+10)
  • R5 · Dead / unsafe endpoint The declared service endpoint is unreachable, or is a private/loopback/credentialed URL that is refused rather than probed (SSRF protection). (+12–30)
  • R6 · Orphaned identity The tokenURI resolves but ownerOf() is null/zero — an identity with no controlling address behind it. (+25)

Honest limits: this is a transparent heuristic, not ground truth — raw on-chain identity is Sybil-spoofable, so a clean score is not a guarantee. The free tier computes R2–R6 only; R1 (payTo ≠ agentWallet, via a 402 probe) and on-chain reputation are a separate paid tier and are not included here. The methodology is served in full on every report.

Call it over HTTP

The simplest path — a plain GET from anything that speaks HTTP.

1 · Preview an agent's band

curl 'https://fresh-feeds.foomworks.workers.dev/risk/agent/preview?agentId=1'

Returns the band, the riskScore, whether the identity exists, and the top reason — a cheap check before the full report.

2 · Pull the full report

curl 'https://fresh-feeds.foomworks.workers.dev/risk/agent?agentId=1'

Returns the score and band with every contributing reason and its on-chain source, plus the methodology — the detail behind a pay-or-skip decision.

3 · Browse the maintained sample

curl 'https://fresh-feeds.foomworks.workers.dev/risk/agents'

The maintained sample — the first agentIds in the ERC-8004 Identity registry on Base — scored and ordered riskiest first. Coverage grows as the maintained scan widens (the registry exposes no total supply).

Call it from an agent (MCP)

The assess_agent_risk tool is exposed over the Model Context Protocol on the fresh-feeds MCP server at POST /mcp. Point an MCP-capable client at the endpoint and the tool appears alongside the other free fresh-feeds tools:

# List the tools the server offers
curl -s -X POST https://fresh-feeds.foomworks.workers.dev/mcp \
  -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

An agent deciding whether to pay or depend on another agent can call assess_agent_risk in-loop and route on the band it gets back.

Endpoints

All free — no account, no API key, call from anything:

  • GET /risk/agent?agentId=N free Full risk report (R2–R6) for a Base agent — score, band, every reason, and the methodology.
  • GET /risk/agent/preview?agentId=N free Just the band + score headline and the top reason — a cheap look before pulling the full report.
  • GET /risk/agent/badge?agentId=N free Embeddable SVG risk badge — green / amber / red.
  • GET /risk/agents free The maintained agent-risk sample, riskiest first.
  • POST /mcp free MCP server (Streamable HTTP, JSON-RPC 2.0): the agent-native assess_agent_risk tool.

Live

Try it now

Everything above is free and needs no setup — pass an agentId and read the band, or wire the MCP tool into an agent and let it check before it pays.

See the live sample →

Want the paid tier (R1 payTo-mismatch + on-chain reputation), wider coverage, or to check a specific agentId? Tell us what you'd use, no account, no card.

Agent Risk is built and maintained by an autonomously operated software workshop under human oversight. It performs read-only on-chain reads and a single guarded GET — it never holds keys, signs, or moves funds. The score is a transparent heuristic for due diligence, not financial, legal, or security advice, and not a guarantee about any agent; you are responsible for your own decisions. Provided as-is. No affiliation with, or endorsement by, any agent assessed is implied.