diff --git a/docs/ensnode.io/config/integrations/starlight/sidebar-topics/integrate.ts b/docs/ensnode.io/config/integrations/starlight/sidebar-topics/integrate.ts index 9585e195b..844165abf 100644 --- a/docs/ensnode.io/config/integrations/starlight/sidebar-topics/integrate.ts +++ b/docs/ensnode.io/config/integrations/starlight/sidebar-topics/integrate.ts @@ -100,6 +100,20 @@ export const integrateSidebarTopic = { label: "Protocol Acceleration", link: "/docs/integrate/omnigraph/protocol-acceleration", }, + { + label: "Complementary protocols", + collapsed: false, + items: [ + { + label: "Agents / ERC-8004", + link: "/docs/integrate/omnigraph/complementary/erc8004", + badge: { + text: "SOON", + variant: "note", + }, + }, + ], + }, { label: "Examples", collapsed: true, diff --git a/docs/ensnode.io/src/content/docs/docs/integrate/omnigraph/complementary/erc8004.mdx b/docs/ensnode.io/src/content/docs/docs/integrate/omnigraph/complementary/erc8004.mdx new file mode 100644 index 000000000..26e26cf47 --- /dev/null +++ b/docs/ensnode.io/src/content/docs/docs/integrate/omnigraph/complementary/erc8004.mdx @@ -0,0 +1,187 @@ +--- +title: ERC-8004 (AI Agent Discovery) +description: Preview of ERC-8004 AI agent discovery in the ENS Omnigraph API — find agents associated with an ENS name, look up the names behind an agent, and read agent service profiles. +--- + +import { Aside, LinkCard } from "@astrojs/starlight/components"; + + + +[ERC-8004](https://eips.ethereum.org/EIPS/eip-8004) is a new standard that gives an 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. On the ENS side, [ENSIP-25](https://docs.ens.domains/ensip/25) and [ENSIP-26](https://docs.ens.domains/ensip/26) are ENS standards that let an **ENS name** publish agent discovery records and **attest** which ERC-8004 agent(s) it controls. + +The ENS Omnigraph API will bring both sides together: start from an **ENS name** or from an **ERC-8004 agent**, and get the agent card, reputation, and the attested name-to-agent relationship in one query, with no contract calls or IPFS fetching on your side. + +## Why this is complementary to ENS + + + +## Plugin + +ERC-8004 data is **not** part of core ENS. The fields on this page come from `erc8004` [ENSNode plugin](/docs/integrate/integration-options/ensnode-plugins): + +- Each ENSNode operator chooses which plugins to activate on their instance. +- The ERC-8004 fields described here resolve to non-null values when ENSNode has `erc8004` plugin. + + + +## Who this feature is for + +- **AI agent developers** — you publish an **agent** under ERC-8004 and want a human-readable ENS **name** to be shown in ENS related services. +- **AI Apps and services** — you want to discover **agents** and show trustworthy identity, reputation, endpoints and connection to ENS. +- **Apps with ENS integration** - you want to include information about ENSIP-25 **agent** into profile card of a **name** or show all **agents** of an **address**. + +## Find ERC-8004 agents associated with an ENS name + +Most apps already have an ENS name. The agent data lives under `domain.resolve.profile.erc8004agents` — this is **interpreted ENS Resolution** (see [ENS Resolution](/docs/integrate/omnigraph/ens-resolution)): the ENS Omnigraph API reads the underlying ENSIP-25/26 records and returns clean, structured fields instead of raw text records. + +Each entry in `attestations` is one ENSIP-25 attestation, with its `verification` status and the indexed ERC-8004 agent nested inline. By default `attestations` returns only `VERIFIED` attestations; pass `where` to include the partial ones. + +```graphql ins={8-29} +query AgentsForName { + domain(by: { name: "myagent.eth" }) { + canonical { + name { beautified } + } + resolve { + profile { + erc8004agents { + context + attestations(where: { verification: [VERIFIED, ONLY_ENS, ONLY_AGENT] }) { + verification # ONLY_ENS | ONLY_AGENT | VERIFIED + identityRegistry { chainId address } + agentId + erc8004agent { + agentId + chain { name } + card { + name + description + x402Support + supportedTrust + } + reputation { + feedbackCount + averageScore + } + } + } + } + } + } + } +} +``` + +- **Gate on `verification`** — since ENSIP-25 is **bidirectional** relationship, an ENS name can attest to an agent, and an agent can reference an ENS name. This enum covers three cases: + - **`VERIFIED`** — both sides agree: the ENS name attests the agent, and the agent references the name. + - **`ONLY_ENS`** — the ENS name attests the agent, but the agent does not reference the name back. + - **`ONLY_AGENT`** — the agent references the name, but the ENS name does not attest the agent. +- **A name may have several attestations** — in theory name can have several agents so `attestations` is a list. Iterate and pick what you need. +- **Everything in one round trip** — the agent card and reputation come back nested under each attestation; no second request. + +## Look up the ENS names associated with an ERC-8004 agent + +When you already have an agent (from a registry, a wallet, or search), query it directly. +The reverse view `domains.attestations` returns the ENS names that attest to this agent. + +```graphql +query AgentById { + erc8004agent(by: { + chainName: ETHEREUM, + agentId: "34820" + }) { + agentId + owner { address } + card { + name + description + supportedTrust + } + reputation { + feedbackCount + averageScore + } + domains { + attestations(where: { verification: [VERIFIED, ONLY_ENS, ONLY_AGENT] }) { + verification + context + name { beautified } + } + } + } +} +``` + +## Search for ERC-8004 agents by indexed metadata + +Find agents by chain, card name, or ENS name. + +```graphql +query FindErc8004Agents { + erc8004agents( + first: 20 + where: { + chainName: { eq: ETHEREUM } + cardName: { contains: "trading" } + ensName: { contains: "eth" } + } + ) { + totalCount + edges { + node { + agentId + card { name description } + domains { + attestations { verification name { beautified } } + } + } + } + } +} +``` + +## Read an ERC-8004 agent service profile + +Read the endpoint you want to talk to from the agent card. `attestations` returns only `VERIFIED` attestations by default, so no `where` filter is needed here. `protocol` is an `AgentServiceProtocol` enum (`MCP`, `A2A`, `X402`, `WEB`, ...), and you can pass `protocols` to fetch only the services you care about. + +```graphql +query AgentServices { + domain(by: { name: "myagent.eth" }) { + resolve { + profile { + erc8004agents { + attestations { + verification + erc8004agent { + card { + services(protocols: [MCP, A2A]) { + protocol + endpoint + } + } + } + } + } + } + } + } +} +``` + +Since only `VERIFIED` attestations are returned by default, pass the `protocols` you need (for example `[MCP]`) and use the returned `endpoint`.