Registration for .agt names opens today. This post is the short version of what a .agt name is, what it resolves to, and what you can do with one this afternoon.
Every agent needs a name #
Agents are getting easier to build and harder to find. The protocols they speak solved communication and left identity open.
MCP defines how an agent talks to tools. Discovery is a JSON config you edit by hand. There is no directory.
A2A defines how agents talk to each other. An agent card lives at /.well-known/agent.json, which ties the agent's identity to a DNS name and whoever controls that zone.
Marketplaces list agents, but the platform controls listing, ranking and delisting. Orchestration frameworks hardcode which agents they know about.
So when one agent wants to reach another, the question "who is this, where do I connect, and did the real owner publish this?" has three different answers depending on the protocol, and none of them is verifiable by the caller.
.agt is a namespace that answers that question once. A name is an NFT on Polygon. Whoever holds the token owns the name, and every record, manifest and directory listing checks against that token.
What a .agt name resolves to #
One lookup returns everything a client needs to talk to your agent:
- the current owner, read from the registry
- an endpoint per protocol:
mcp,a2a,http,ws,grpc, or a custom one - signing keys the agent uses
- a payment address
- a manifest the owner signed in their own wallet, with description, capabilities, endpoints, pricing and payment rails
The manifest pointer lives on-chain. The document itself lives on IPFS, at a hosted URL like https://agts.dev/<label>.json, or inline as a data: URI. Anyone with an RPC connection can read it. There is no account with us involved.
Here is the live manifest for launchpad.agt, the namespace's own agent, as it comes back from a resolution today (signature shortened):
{
"agt": "3.0",
"name": "launchpad.agt",
"owner": "0x37007a1c233f00b423bc0d177ac5b50ca9417596",
"updated": "2026-09-16T16:28:08.342Z",
"description": "The .agt namespace's own agent. Check whether a name is available, resolve any .agt to its owner, records and verified manifest, and get walked through registering a new name or migrating an existing one.",
"website": "https://agtnames.com",
"icon": "https://agtnames.com/api/badge/launchpad.svg",
"endpoints": [{ "protocol": "http", "url": "https://agtnames.com/api/v2/manifest" }],
"capabilities": [{ "id": "search" }, { "id": "question-answering" }, { "id": "api-integration" }, { "id": "knowledge-retrieval" }],
"pricing": { "model": "free" },
"payments": [{ "rail": "evm", "chain": "polygon", "token": "USDC", "address": "0x37007a1c233f00b423bc0d177ac5b50ca9417596" }],
"signature": "0xc91ef6b2…19821c"
}
Every field in that document is a claim the owner made and signed. The resolver checks the signature against the on-chain owner before it tells you the manifest is verified. The full field list is in the manifest spec.
How it works, in three steps #
- Register a name. Search, pay for a term of one to ten years, and the name is minted as an NFT to your wallet on Polygon. Start at/register .
- Publish your records. Set the manifest, endpoints and keys from/manifest or the SDK. The manifest is signed in your wallet. The moment records are published, the name appears in thedirectory , where other agents filter by protocol and capability.
- Get resolved. Any .agt-aware client resolves your name and reads your records. The client picks the endpoint for the protocol it supports and dispatches.
Declare one protocol or many. A client that speaks MCP takes the mcp endpoint; one that speaks A2A takes the a2a endpoint. The name stays the same.
Resolve one right now #
The CLI needs nothing installed beyond Node:
npx agt-resolve resolve launchpad.agt
Today that prints (trimmed to the fields that matter):
{
"name": "launchpad.agt",
"registered": true,
"owner": "0x37007a1c233f00b423bc0d177ac5b50ca9417596",
"expiry": "perpetual",
"active": true,
"source": "registry-v2",
"manifestSource": "onchain",
"verified": true,
"reasons": [],
"signer": "0x37007a1c233f00b423bc0d177ac5b50ca9417596",
"records": {
"addr": "0x37007a1c233f00b423bc0d177ac5b50ca9417596",
"manifestUri": "https://agts.dev/launchpad.json",
"endpoints": { "http": "https://agtnames.com/api/v2/manifest" }
}
}
The same thing from code, three lines:
import { AgtResolver } from "@agtnames/resolver";
const agt = new AgtResolver({ chain: "polygon" }); // mainnet defaults built in
const r = await agt.resolveAgent("launchpad.agt");
console.log(r.owner, r.verified, r.records.endpoints);
@agtnames/resolver (npm install @agtnames/resolver) talks raw JSON-RPC to the registry. Its only dependencies are @noble/curves and @noble/hashes, and it runs in Node, Deno, Bun and browsers. Contract addresses and the full API are in the Resolver SDK docs.
If your client speaks MCP, you can skip the code entirely. npx -y @agtnames/mcp starts a read-only MCP server that works in any MCP-compatible client. In Claude Code that is one command: claude mcp add agt -- npx -y @agtnames/mcp. Details at /docs/claude-code.
The trust model, in one paragraph #
A manifest is verified when three things agree: the wallet recovered from the signature, the owner field the document declares, and the wallet that owns the name on the registry right now. Signer equals manifest owner equals on-chain owner. If the name changes hands, every old manifest stops verifying until the new owner signs one. If someone edits a byte of the document after signing, the recovered signer changes and verification fails. When it fails, the resolver still returns the document, marked verified: false with a reasons array, so your client can decide what to do. And in every case, manifest content is data published by a third party, never instructions to your agent.
Already hold a .agt? #
If you registered a .agt on the original registry, you migrate it to Registry v2 for free. Migrated names are perpetual: no expiry and no renewal. You pay only Polygon gas. There are three paths depending on where your name lives today, and /migrate reads your eligibility on-chain and routes you. Thursday's post walks all three paths. The guide is at /docs/migrating.
Pricing, in one line #
A standard name is $10 per year, renewing at $10 per year, for terms of one to ten years. Premium and short names carry higher first-year and renewal prices, and the renewal price is always shown beside the registration price before you pay. Migrated names are perpetual and never carry either.
What to do today #
Building an agent. Register the name at /register, then publish a signed manifest from /manifest. The quickstart covers both in a few minutes.
Holding a name from the original registry. Go to /migrate with the wallet that holds it. Then publish your records.
Building a client or tool. Add @agtnames/resolver or run the MCP server, and start resolving names your users hand you. The API reference covers the keyless HTTP read API if you would rather curl.
Every agent needs a name. Register yours, publish what it can do, and let any client that speaks MCP or A2A find it by name.