streamable-httpupdated 16d ago
Checks whether an agent registered in the real ERC-8004 "Trustless Agents" Identity Registry (Base Sepolia testnet) is actually alive right now -- not just that it was registered once. NEXUS candidate #10 -- manual build, not FORGE-generated, same manual-Cloud-Run-asset pattern as candidates #3/#4/#6/#8/#9/#13/#16.
What can you do with erc8004 agent liveness?
ERC-8004 Agent Liveness
Checks whether an agent registered in the real ERC-8004 "Trustless Agents" Identity Registry (Base Sepolia testnet) is actually alive right now -- not just that it was registered once. NEXUS candidate #10 -- manual build, not FORGE-generated, same manual-Cloud-Run-asset pattern as candidates #3/#4/#6/#8/#9/#13/#16.
POST /verify-registered-agent {"agent_id": 3}-- $0.10/call.- MCP tool
verify_registered_agentat/mcp, same params -- currently free, see "Known limitations". GET /health,GET /.well-known/agent-card.json,GET /openapi.json(hasx-payment-info),GET /.well-known/402index-verify.txt(402index claim verification file).
What this is (and why registration alone isn't enough)
ERC-8004 is a real, live Ethereum standard for on-chain agent
identity: an agent mints an ERC-721 token in an IdentityRegistry, whose tokenURI points to an off-chain
registration file (JSON: name, description, declared endpoints, active flag, supported trust methods). It
went live on Ethereum mainnet 2026-01-29, with reference deployments on Base mainnet and Base/Ethereum/Linea
Sepolia testnets. Registration is a one-time on-chain action -- a real registered agent can go completely
dark (process killed, domain expired, endpoint changed) while its on-chain record persists unchanged forever.
This asset closes that gap: it resolves the real on-chain registration AND performs a real MCP initialize
handshake against whatever endpoint the registration declares, right now, at call time -- the same
liveness-vs-registration distinction agent-verification-api (candidate #3) already draws for
domain-claimed identities, applied here to on-chain-registered ones.
Grounding (verified live this session, not assumed from any single source)
- Contract addresses, initially from a third-party summary, verified independently via
eth_getCodeagainsthttps://sepolia.base.orgbefore being trusted:IdentityRegistry(0x8004A818BFB912233c491871b3d84c89A494BD9e) andReputationRegistry(0x8004B663056A597Dffe9eCcC1965A193B7388713) both have real, non-empty deployed bytecode. - ABI, pulled from the reference implementation (
github.com/erc-8004/erc-8004-contracts/abis), tested live against 3 real registered agents (agentId1-3) before being trusted for this asset:- Agent 1's
tokenURIresolves to adata:application/json;base64,...URI. - Agent 2's resolves to
ipfs://bafkreiff.... - Agent 3's resolves to a real
https://api.snack.money/agent/.../registration.jsonURL. All 3 of ERC-8004's real URI schemes confirmed working live, not just the one the spec's own examples show.
- Agent 1's
getSummaryrequires a non-emptyclientAddressesarray -- confirmed live (reverts with"clientAddresses required"otherwise). This asset callsgetClients(agentId)first and only callsgetSummaryif that returns at least one address; agents with zero feedback correctly reportfeedback_count: 0without an RPC error.agentId=999999(a real nonexistent token) correctly reverts with a custom error, confirmed live -- mapped toAGENT_NOT_FOUND, not a crash.
MCP handshake engine: reused, not reimplemented
Per the task brief's explicit instruction, _nexus_validate_public_url, _nexus_no_redirect_mcp_http_client,
and _mcp_handshake_check are ported verbatim from manual_assets/agent-verification-api/main.py
(candidate #3) -- same SSRF pre-check, same no-redirect posture (the exact fix applied there after the
2026-08-22 security review found a redirect-based SSRF bypass), same bounded timeout. Not modified beyond the
asset-name constant. This asset's own contribution is upstream of that: resolving an ERC-8004 registration
file (3 URI schemes) and picking a real endpoint out of its endpoints array to hand to that engine.
Chain scope, on purpose
Base Sepolia testnet only -- same network every other x402 payment in this codebase already uses. ERC-8004 is also live on Base mainnet and Ethereum mainnet (verified live this session), but this asset doesn't expose a caller-selectable chain: no evidence a buyer needs mainnet for a 7-day probation candidate (CLAUDE.md SS3).
Deploy target: Cloud Run
Same pipeline as candidates #4/#3/#6/#8/#9/#13/#16 -- see skills/infra-deploy-ops.
# 1. First deploy -- PUBLIC_DOMAIN not known yet, every real request 421s until step 2.
./scripts/deploy_cloud_run.sh erc8004-agent-liveness manual_assets/erc8004-agent-liveness
# 2. Grab the printed *.run.app URL, then (only if it differs from env-vars.deploy.yaml's guess):
gcloud run services update erc8004-agent-liveness --region us-central1 --project nexus-505016 \
--update-env-vars PUBLIC_DOMAIN=<the-real-domain>
Known limitations (left unfixed on purpose -- CLAUDE.md SS3, no gate without evidence it's needed)
- MCP tool calls are not charged. Same in-process-call pattern as every other manual asset in this codebase.
active: falseshort-circuits toREGISTERED_INACTIVEeven if the endpoint is actually live. Trusts the registrant's own self-declaration over an independent liveness check in that one case -- an agent lying about being inactive (unusual incentive) would be misreported. Accepted:activeis the registrant's own signal by spec design, overriding it would be second-guessing the standard's own field.REGISTERED_UNREACHABLE(the opposite failure mode -- declared active, not actually reachable) is this asset's actual value-add and is NOT similarly short-circuited.- Endpoint selection is a heuristic, not a spec requirement. ERC-8004's
endpointsarray is free-form (anyname); this asset prefersmcp/x402/a2a/web(in that order) and falls back to the first entry. A registration using an unlistednamefor its only real MCP-capable endpoint would still be picked (name matching isn't the only path -- unnamed-preference fallback covers it), but a registration with MULTIPLE endpoints where none of the preferred names points to the live one could reportREGISTERED_UNREACHABLEbased on the wrong endpoint.
- Endpoint selection is a heuristic, not a spec requirement. ERC-8004's
- IPFS resolution uses a single public gateway (
ipfs.io). No fallback gateway -- a registration whose CID isn't pinned/reachable via that specific gateway reportsREGISTRATION_FETCH_FAILEDeven if the content exists on IPFS generally. - No per-caller rate limiting. Fine for a 7-day disposable measurement window.
reputationis a self-reported, ungated, un-staked signal. Any EVM address can callReputationRegistry.giveFeedbackfor anyagentId--feedback_count/average_valueare real on-chain numbers, but nothing stops an agent's own owner from Sybil-feeding themselves. Treat as an unverified signal, not a trust score (this caveat is also in thereputationfield's own description in the API schema, not just here).
Quality gate (2026-08-23, from design not retroactive)
Same 2-agent process as candidates #3/#4/#6/#8/#9/#13/#16 (security lens; functional+quality+buyer-experience lens), run before the first deploy. Real findings, all fixed before going live:
- Security (0 exploitable findings): confirmed the 3 functions ported verbatim from
agent-verification-api/main.py(_nexus_validate_public_url,_nexus_no_redirect_mcp_http_client,_mcp_handshake_check) carry the actual SSRF-redirect fix, byte-for-byte, and that the newhttps:///IPFS registration-fetch path applies the same defense one layer earlier, before any endpoint is extracted -- confirmed NOT to reintroduce that bug class. Two low/informational items, both addressed as defense-in-depth even though neither was a confirmed exploit: IPFS CID concatenation (confirmed live it couldn't escape theipfs.iohost, but now usesurllib.parse.quoteto confine it to a single path segment anyway), anddata:URI base64 decoding (confirmed linear/non-amplifying, no fix needed). - Functional/buyer-experience (1 must-fix, 1 medium, applied): a registration file whose top-level JSON
is a non-object (array/string/number -- registrant-controlled content) passed through as
"ok": Truewith a non-dictregistration, which every downstream consumer (_pick_liveness_endpoint,_classify_verdict, the response body) assumed was a dict -- an uncaughtAttributeErrorbecame an unhandled 500 after x402 payment had already settled. Fixed: both JSON-parse sites in_resolve_registration_filenow reject non-dict results asregistration_not_an_objectbefore returning"ok": True. Also added the reputation gameability caveat (see "Known limitations" above and thereputationfield's own schema description). Two low/nice-to-have items (duplicate-nameendpoint shadowing, unverified field casing on 2 optional registration keys) left as-is -- no evidence yet either matters for real registrations, consistent with CLAUDE.md SS3. - Verified end-to-end against real production data before AND after fixes: 4 real ERC-8004 agent IDs on Base
Sepolia (1, 2, 3, and a real nonexistent 999999) each produced the correct verdict --
REGISTERED_UNREACHABLE(real registration, endpoint doesn't answer MCP),REGISTRATION_FETCH_FAILEDx2 (a real IPFS gateway timeout, and a real deadhttps://registration URL -- both legitimate, not bugs), andAGENT_NOT_FOUND(real on-chain revert) -- plus real reputation data (74 feedback entries from 12 distinct clients on agent 1).
Measurement (candidate #10, 7-day window)
7-day window from 2026-08-23 (real deploy date) -> decision point 2026-08-30. Source of truth:
traffic_events/revenue_events/mcp_call_events (asset_name = 'erc8004-agent-liveness'), not Cloud Run
logs. Day 7: if zero real traffic (filtering crawlers), pause/delete the Cloud Run service
(gcloud run services delete erc8004-agent-liveness --region us-central1 --project nexus-505016).
Install
Add erc8004 agent liveness to your client. Pick the one you use.
claude mcp add --transport http erc8004-agent-liveness https://erc8004-agent-liveness-325572559480.us-central1.run.app/mcpcodex mcp add erc8004-agent-liveness --url https://erc8004-agent-liveness-325572559480.us-central1.run.app/mcp{
"mcpServers": {
"erc8004-agent-liveness": {
"url": "https://erc8004-agent-liveness-325572559480.us-central1.run.app/mcp"
}
}
}Add to `~/.cursor/mcp.json`, or `.cursor/mcp.json` for a single project.
{
"servers": {
"erc8004-agent-liveness": {
"type": "http",
"url": "https://erc8004-agent-liveness-325572559480.us-central1.run.app/mcp"
}
}
}Add to `.vscode/mcp.json` in your workspace.
{
"mcpServers": {
"erc8004-agent-liveness": {
"url": "https://erc8004-agent-liveness-325572559480.us-central1.run.app/mcp"
}
}
}Add to `claude_desktop_config.json`, then restart Claude Desktop.
{
"mcpServers": {
"erc8004-agent-liveness": {
"serverUrl": "https://erc8004-agent-liveness-325572559480.us-central1.run.app/mcp"
}
}
}Add to `~/.codeium/windsurf/mcp_config.json`.
Score
39 / 100
Incomplete
- Documentation25/25
- Maintenance19/25
- Trust6/20
- Capability0/15
- Install experience12/15
- Documents what it does and how to connect
- Has a resolvable package or endpoint
- Exposes at least one tool, prompt or resource
- README has substantive content
- Includes a code example
- Documents its configuration
- Mentions credentials or security posture
- Last commit 9 days ago
- Has a release history
- Repository is not archived
- No licence detected
- Namespace verified in the official MCP registry
- Claimed by its owner
- Published under an organisation
- 0 tool(s) documented
- Provides prompt templates
- Provides resources
- 6 documented install method(s)
- Published to a package registry
- Offers a hosted endpoint — no local install
Version history
| Versions | Published |
|---|---|
| 1.0.0Latest | Aug 23, 2026 |