{"agentId":"8441","card":{"description":"A demo agent graded by Preflight at ETHGlobal Lisbon 2026.","name":"enswhois.eth","services":[{"endpoint":"https://mcp.enswhois.com/mcp","name":"MCP"}],"type":"https://eips.ethereum.org/EIPS/eip-8004#registration-v1","version":"1.0.0"},"coverage":{"endpointsDeclared":1,"endpointsGraded":1,"note":null},"endpoints":[{"endpoint":"https://mcp.enswhois.com/mcp","grade":"B","litmus":{"categories":[{"code":"C-01","probes":[{"findings":[],"id":"1.1","status":"pass"},{"findings":[],"id":"1.2","reason":null,"status":"pass"},{"findings":[],"id":"1.3","reason":"12 second-order call(s): 8 source output(s) → ≤3 sink(s) each (cap 12)","status":"pass"},{"findings":[],"id":"1.4","reason":"no external-content channel (remote target or no seed dir)","status":"skipped"}],"status":"pass"},{"code":"C-02","probes":[{"findings":[],"id":"2.1","status":"pass"},{"findings":[],"id":"2.2","reason":"egress not run for this target","status":"skipped"}],"reason":"egress not run for this target","status":"skipped"},{"code":"C-03","probes":[{"findings":[],"id":"4.1","reason":"no canary could be planted on a remote target","status":"skipped"},{"findings":[],"id":"4.2","reason":"egress not run for this target","status":"partial"}],"reason":"no canary could be planted on a remote target","status":"skipped"},{"code":"C-04","probes":[{"findings":[],"id":"3.1","reason":null,"status":"pass"},{"findings":[],"id":"3.2","reason":null,"status":"pass"}],"status":"pass"}],"disclaimer":"Self-run, self-minted under litmus-v17. Independence traded for cost. Re-run the open harness to verify.","grade":"B","gradeRationale":"Injection checks passed; egress not verified. Not verified: C-02, C-03 (egress not run for this target; no canary could be planted on a remote target).","harness":{"dockerAvailable":true,"node":"v23.10.0","package":"@polygraph/probes","presentedClientInfo":{"name":"claude-code","version":"2.1.0"},"version":"0.36.0"},"methodologyVersion":"litmus-v17","ranAt":"2026-07-25T15:17:24.661Z","resolvedVersion":null,"schemaVersion":"1.10.0","selfReportedVersion":"1.0.0","serverRef":"https://mcp.enswhois.com/mcp","target":{"command":null,"kind":"http","url":"https://mcp.enswhois.com/mcp"},"toolDefs":[{"description":"Read an ENS name's AI-agent profile (ENSIP-26): agent-context plus the agent-endpoint records for MCP, A2A and web, alongside its ERC-8004 registration status.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"name":{"description":"ENS name","type":"string"}},"required":["name"],"type":"object"},"name":"agent_profile"},{"description":"Read a single ENS text record for a name (e.g. key 'url', 'com.twitter', 'avatar'). Live-resolves for names on resolvers we don't index.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"key":{"description":"Text record key, e.g. url, email, com.twitter, avatar","type":"string"},"name":{"description":"ENS name","type":"string"}},"required":["name","key"],"type":"object"},"name":"get_text_record"},{"description":"Check whether an ENS name is an ERC-8004 (Trustless Agent) identity. A name is an agent when it has an on-chain binding in the ens8004 adapter. Returns the name (owner, expiry, avatar), its agent ENSIP-26 profile (agent-context + endpoints), and registrations[] - one per binding (empty = not an agent). Each has the on-chain binding details, is_bound (always true), and has_ensip25_registration (a bonus flag: a conformant ERC-7930 ENSIP-25 claim exists).","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"name":{"description":"ENS name to check","type":"string"}},"required":["name"],"type":"object"},"name":"is_erc8004_agent"},{"description":"List ENS names associated with an Ethereum address. Optionally filter by ownership role (effective_owner, registry_owner, registrar_owner, wrapper_owner, resolver). Returns 25 per page.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"address":{"description":"Ethereum address (0x-prefixed, 40 hex chars)","type":"string"},"page":{"description":"Page number (25 results per page)","maximum":9007199254740991,"minimum":1,"type":"integer"},"type":{"description":"Which ownership role to match the address against (default: effective_owner)","enum":["effective_owner","registry_owner","registrar_owner","wrapper_owner","resolver"],"type":"string"}},"required":["address"],"type":"object"},"name":"list_domains"},{"description":"List all current resolver records for an ENS name: text records, address records (by coin type) and contenthash.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"name":{"description":"ENS name","type":"string"}},"required":["name"],"type":"object"},"name":"list_text_records"},{"description":"Find ENS domains whose label matches a labelhash (the 0x-prefixed keccak256 of a single label). May match multiple names; returns 25 per page.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"hash":{"description":"Labelhash: 0x followed by 64 hex chars","type":"string"},"page":{"description":"Page number (25 results per page)","maximum":9007199254740991,"minimum":1,"type":"integer"}},"required":["hash"],"type":"object"},"name":"lookup_labelhash"},{"description":"Resolve an ENS namehash (the 0x-prefixed 32-byte node hash) back to its domain, if indexed.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"hash":{"description":"Namehash: 0x followed by 64 hex chars","type":"string"}},"required":["hash"],"type":"object"},"name":"lookup_namehash"},{"description":"Look up an ENS name: ownership, resolver, expiry, wrapper status and availability. Accepts any ENS name (e.g. vitalik.eth). Falls back to live on-chain resolution for names not yet indexed.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"name":{"description":"ENS name, e.g. vitalik.eth","type":"string"}},"required":["name"],"type":"object"},"name":"whois"}],"toolDefsFingerprint":"0xe783c668d14602b29e50edafd9197a7c423ac6b422f9af917e88ed1e62bf0ee4"}}],"engineVersion":"0.36.0","methodologyVersion":"litmus-v17","ranAt":1784992671,"schema":"preflight-evidence-v1","tokenURI":"data:application/json;base64,eyJ0eXBlIjoiaHR0cHM6Ly9laXBzLmV0aGVyZXVtLm9yZy9FSVBTL2VpcC04MDA0I3JlZ2lzdHJhdGlvbi12MSIsIm5hbWUiOiJlbnN3aG9pcy5ldGgiLCJkZXNjcmlwdGlvbiI6IkEgZGVtbyBhZ2VudCBncmFkZWQgYnkgUHJlZmxpZ2h0IGF0IEVUSEdsb2JhbCBMaXNib24gMjAyNi4iLCJzZXJ2aWNlcyI6W3sibmFtZSI6Ik1DUCIsImVuZHBvaW50IjoiaHR0cHM6Ly9tY3AuZW5zd2hvaXMuY29tL21jcCJ9XSwidmVyc2lvbiI6IjEuMC4wIn0=","toolSurface":[{"endpoint":"https://mcp.enswhois.com/mcp","pages":[{"cursor":null,"tools":[{"description":"Read an ENS name's AI-agent profile (ENSIP-26): agent-context plus the agent-endpoint records for MCP, A2A and web, alongside its ERC-8004 registration status.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"name":{"description":"ENS name","type":"string"}},"required":["name"],"type":"object"},"name":"agent_profile"},{"description":"Read a single ENS text record for a name (e.g. key 'url', 'com.twitter', 'avatar'). Live-resolves for names on resolvers we don't index.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"key":{"description":"Text record key, e.g. url, email, com.twitter, avatar","type":"string"},"name":{"description":"ENS name","type":"string"}},"required":["name","key"],"type":"object"},"name":"get_text_record"},{"description":"Check whether an ENS name is an ERC-8004 (Trustless Agent) identity. A name is an agent when it has an on-chain binding in the ens8004 adapter. Returns the name (owner, expiry, avatar), its agent ENSIP-26 profile (agent-context + endpoints), and registrations[] - one per binding (empty = not an agent). Each has the on-chain binding details, is_bound (always true), and has_ensip25_registration (a bonus flag: a conformant ERC-7930 ENSIP-25 claim exists).","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"name":{"description":"ENS name to check","type":"string"}},"required":["name"],"type":"object"},"name":"is_erc8004_agent"},{"description":"List ENS names associated with an Ethereum address. Optionally filter by ownership role (effective_owner, registry_owner, registrar_owner, wrapper_owner, resolver). Returns 25 per page.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"address":{"description":"Ethereum address (0x-prefixed, 40 hex chars)","type":"string"},"page":{"description":"Page number (25 results per page)","maximum":9007199254740991,"minimum":1,"type":"integer"},"type":{"description":"Which ownership role to match the address against (default: effective_owner)","enum":["effective_owner","registry_owner","registrar_owner","wrapper_owner","resolver"],"type":"string"}},"required":["address"],"type":"object"},"name":"list_domains"},{"description":"List all current resolver records for an ENS name: text records, address records (by coin type) and contenthash.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"name":{"description":"ENS name","type":"string"}},"required":["name"],"type":"object"},"name":"list_text_records"},{"description":"Find ENS domains whose label matches a labelhash (the 0x-prefixed keccak256 of a single label). May match multiple names; returns 25 per page.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"hash":{"description":"Labelhash: 0x followed by 64 hex chars","type":"string"},"page":{"description":"Page number (25 results per page)","maximum":9007199254740991,"minimum":1,"type":"integer"}},"required":["hash"],"type":"object"},"name":"lookup_labelhash"},{"description":"Resolve an ENS namehash (the 0x-prefixed 32-byte node hash) back to its domain, if indexed.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"hash":{"description":"Namehash: 0x followed by 64 hex chars","type":"string"}},"required":["hash"],"type":"object"},"name":"lookup_namehash"},{"description":"Look up an ENS name: ownership, resolver, expiry, wrapper status and availability. Accepts any ENS name (e.g. vitalik.eth). Falls back to live on-chain resolution for names not yet indexed.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"name":{"description":"ENS name, e.g. vitalik.eth","type":"string"}},"required":["name"],"type":"object"},"name":"whois"}]}],"toolCount":8}]}