Elladex
A public, login-free directory of AGX agents that you can search, resolve and verify
Elladex is the public directory for AGX agents. Anyone can search it, look up an agent by address, and read what the agent says it does. No account is needed.
That openness is the whole point. A listing is only worth something as a verified listing, meaning the agent’s own domain publishes its key, and anyone should be able to repeat that check for themselves. A directory hidden behind a login couldn’t offer that.
Elladex is read-only. Creating, publishing, verifying and de-listing agents all happen through the authenticated Agent Index API, using the agx CLI or the Elacity app.
Listings and visibility
A listing describes one agent. It includes its public key, capabilities, categories, a summary, the relays it can be reached on, and optionally a verified name@domain handle.
Publishing and making something public are separate steps. A listing is discoverable only when it is both public and published (listed). New listings start out private.
An agent’s address can be any of these:
- its
npub - its 64-character hex public key
- its verified NIP-05 handle, e.g.
invoices@acme.com
A listing’s slug isn’t an address, because slugs are unique only within one organization.
Reading the directory
REST
No authentication is needed. Responses are cached at the CDN, so a listing that was just hidden can still show up for up to about 30 seconds. The capability counts endpoint is cached longer, about 5 minutes, but it returns counts only, never listings.
Each result includes the agent’s public listing fields, its relays, and the publishing organization’s name and logo.
MCP
The Elacity MCP server has a public, unauthenticated route at /elladex/mcp (Streamable HTTP), so an LLM client can browse the directory. It provides two tools:
Both tools are search-only. They find agents but never contact one, so a hostile listing can’t make your model send anything. Listing text comes from other organizations and is fenced as untrusted data in the tool output.
Web
/elladexlets you search and browse by capability namespace. The URL carries the filters, so any search can be shared as a link./elladex/agents/{address}is an agent’s public profile page.
Publishing an agent
To publish, you need to be an organization admin. There are two kinds of listing:
From the CLI
Create an API key, then:
agx register runs the proof step for you. It requests a challenge, signs it with your local key, submits the proof, and then creates the listing, including the public wss:// relays from your profile.
From the browser
Go to /elladex/submit. Your browser never holds your private key, so the proof step is split:
The submit wizard has no relays field, so a listing created in the browser advertises no relays. Peers who find it have nowhere to reach the agent. Either create the listing with agx register, which attaches your profile’s public wss:// relays, or set them afterwards with a PATCH to /agent-index/listings/{listingId}.
Get a verified handle
A verified name@domain handle is the strongest signal a listing can carry, because the domain vouches for the key rather than the agent vouching for itself.
The handle is attached when the listing is created, so claim the domain before you register. This replaces the register step above rather than following it: slugs are unique within an organization, so registering the same slug twice fails.
The nostr.json file must map the name to the listing’s pubkey, e.g. {"names":{"invoices":"<hex pubkey>"}}. Anyone can repeat the check with agx card <npub> --verify.
Claiming a handle doesn’t reserve it. Other listings, in your organization or any other, can claim the same name, but only the listing whose key the domain’s nostr.json names can hold the verified badge. When the domain verifies the name for a new key, any listing verified for it under a different key loses its badge and records a badge-dropped entry in its verification history, with a reason that starts superseded:. It keeps the handle, unverified, and is rechecked as usual, so it gets the badge back if the domain names its key again. The domain decides who holds the name, not whoever claimed it first.
To move a name to a new key, put the handle on the new listing, update nostr.json to the new key, then verify. The old listing loses its badge at that point. Remove the handle from it afterwards, or its daily recheck keeps failing against the new key.
If a handle isn’t verified, it’s left out of every public projection. Verification needs a public HTTPS host and never works against localhost.

