For publishers
How to publish an ARD manifest
Serve a JSON manifest at /.well-known/ard.json on your domain listing what you offer, add an Agentmap: line to robots.txt and a <link rel="ard"> tag, and put 2 to 5 representative queries on every entry. Registries crawl it from there. There is no submission form and no allowlist.
Step 1: write the manifest
The whole document is a spec version, an optional host block, and an array of entries.
{
"specVersion": "1.0",
"host": {
"displayName": "Example Inc",
"identifier": "did:web:example.com"
},
"entries": [
{
"identifier": "urn:air:example.com:mcp:weather",
"displayName": "Weather API",
"type": "application/mcp-server-card+json",
"url": "https://example.com/.well-known/mcp/server-card.json",
"description": "Current conditions and forecasts for any location.",
"representativeQueries": [
"what is the weather in Berlin",
"will it rain in London tomorrow"
],
"tags": ["weather", "forecast"]
}
]
}
The identifier is a domain-anchored URN: urn:air:<your-domain>:<namespace>:<name>.
The publisher segment has to be a domain you control, because that is what publisher-authority
binding checks.
Step 2: get representativeQueries right
This is the field that decides whether you are findable, and it is the one most often left out.
Registries build their semantic index from it. An entry without representative queries is a valid catalogue entry that no search will ever return. The specification's own conformance tool flags its absence for exactly that reason.
Write 2 to 5, phrased the way someone asks for the thing, not the way you describe it:
| Weak | Strong |
|---|---|
| "weather data platform" | "will it rain in London tomorrow" |
| "enterprise document intelligence" | "read this PDF and pull out the invoice total" |
| "scalable web extraction" | "scrape a website that blocks bots" |
Step 3: advertise it on all four paths
# robots.txt Sitemap: https://example.com/sitemap.xml Agentmap: https://example.com/.well-known/ard.json
<!-- in your <head> --> <link rel="ard" href="https://example.com/.well-known/ard.json"> <link rel="ai-catalog" href="https://example.com/.well-known/ai-catalog.json">
Serve the same document at /.well-known/ai-catalog.json too. It is the predecessor
name, and crawlers written against the earlier draft still look there.
Step 4: check that it worked
Publishing is not being indexed. Use the SDK, or run a free audit that fetches your manifest and asks every public registry whether they actually return you.
pip install ard-publish python -m ard_publish validate .well-known/ard.json python -m ard_publish check example.com
Step 5: tell the registries
Everything above is on your domain. Nothing so far has told anyone it is there, and this is the step people skip: a manifest that no registry has fetched is a manifest no agent can find. Step 4 tells you whether that has happened yet; this is how you make it happen.
Crawling is not a plan you control. Registries crawl domain lists they chose: one public registry crawls a top-100,000 list, so a domain outside it is invisible to that registry indefinitely. Our own crawl of 375,958 domains found exactly one new publisher in its last 63,000. If you wait to be discovered, you may wait forever.
What each public ARD registry accepts, checked on 1 September 2026:
| Registry | How to get listed | Verified before listing |
|---|---|---|
| Neuronto | one request, below, or ard-publish submit, or the MCP tool publish_resource | yes: your manifest is fetched from your domain, or your MCP endpoint answers a handshake |
| WellKnown | a submission form on its own site | not stated |
| GitHub Agent Finder | no submission path found | n/a |
| Hugging Face Discover | no submission path found; indexes Hugging Face content | n/a |
| Desvela | no submission path found; crawls a top-100,000 list | n/a |
| ARD Registry Hub | no submission path found | n/a |
Registries federate, so this is worth more than one listing: a domain indexed here is returned to clients of any registry that queries Neuronto, and every federated search here queries the others.
Free, no account. We fetch both well-known paths from your domain and index whatever parses, so a submission cannot list anything you do not actually publish. If nothing is found you are told which paths were tried, and the submission is kept and retried by us for about two and a half days, with a status link, so a manifest that goes live a minute later is still indexed without a second submission.
From a terminal instead:
curl -X POST https://neuronto.com/submit \
-H 'content-type: application/json' \
-d '{"domain":"example.com"}'
Or, if you have an MCP server and never wrote a manifest at all, skip every step above:
ard-publish submit https://example.com/mcp handshakes with the server and indexes
what it reports about itself.
Step 6: add the badge
Once a registry returns you, put the badge on your README or site. It states what was observed about your resources, the verified tool count and whether your endpoint answered, and it corrects itself when that changes. It is free, and it changes nothing about your indexing or ranking. The paste-ready HTML and Markdown are at /badge.
The mistakes that cost you silently
- No representativeQueries. Validates fine, never returned.
- The wrong MCP media type. Three spellings are live in the ecosystem. Registries that
match exactly will drop you. Use
application/mcp-server-card+json. - Only one discovery path. A crawler checking robots.txt will never see a manifest that exists only at the well-known path.
- A description written for humans browsing a marketing page rather than for a machine matching a task.
Check your own domain. The console fetches what you publish and asks every public registry whether they return you.
Run a free audit