Skip to content

Agents (ENSIP-25)

ERC-8004 gives every onchain AI agent a portable identity (an NFT in an Identity Registry) plus an agent card describing what it does and how to reach it. ENSIP-25 and ENSIP-26 connect that identity to a human-readable ENS name: a name can publish agent discovery records and cryptographically attest which agent(s) it controls.

The Omnigraph brings both sides together. Start from an ENS name or from an agent, and get the agent card, reputation, and a verified name ↔ agent link — in one query, with no contract calls or IPFS fetching on your side.

Most apps already have an ENS name. Ask domain.resolve.profile.agents for the agents linked to that name. Each link is one ENSIP-25 attestation, with a verified flag (the name and the agent confirm each other) and the full indexed agent nested inline.

query AgentsForName {
domain(by: { name: "myagent.eth" }) {
canonical {
name { beautified }
}
resolve {
profile {
agents {
context # the agent-context record (ENSIP-26)
links {
verified # true only when name ↔ agent confirm each other (ENSIP-25)
agent {
agentId
chain { name }
card {
name
description
x402Support
supportedTrust
}
reputation {
feedbackCount
averageScore
}
}
}
}
}
}
}
}
  • verified — gate on this before trusting a link. A name can list an agent without the agent confirming it (and vice versa); only verified: true means both sides agree.
  • A name may link to several agentslinks is a list, so iterate and pick what you need.
  • Everything in one round trip — the agent card and reputation come back nested under each link; no second request to look the agent up.

When you already have an agent (from a registry, a wallet, or search), query it directly. domains.links is the reverse view: the ENS names that link to this agent, each with the same verified semantics.

query AgentById {
agent(by: { chain: ETHEREUM, identityRegistry: "0x8004…432", agentId: "31814" }) {
agentId
owner { address }
card {
name
description
supportedTrust
}
reputation {
feedbackCount
averageScore
}
domains {
links {
verified
name { beautified }
}
}
}
}

Find agents by chain, owner, or card name.

query FindAgents {
agents(
first: 20
where: {
chain: { eq: ETHEREUM }
name: { contains: "trading" }
}
) {
totalCount
edges {
node {
agentId
card { name description }
domains {
links { verified name { beautified } }
}
}
}
}
}

Once you have a verified link, read the endpoint you want to talk to from the agent card and connect.

query AgentEndpoint {
domain(by: { name: "myagent.eth" }) {
resolve {
profile {
agents {
links {
verified
agent {
card {
services {
protocol # MCP, A2A, X402, WEB, …
endpoint
}
}
}
}
}
}
}
}
}

Filter to verified: true, pick the service for the protocol you need (for example MCP), and use its endpoint.