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:

WeakStrong
"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:

RegistryHow to get listedVerified before listing
Neurontoone request, below, or ard-publish submit, or the MCP tool publish_resourceyes: your manifest is fetched from your domain, or your MCP endpoint answers a handshake
WellKnowna submission form on its own sitenot stated
GitHub Agent Finderno submission path foundn/a
Hugging Face Discoverno submission path found; indexes Hugging Face contentn/a
Desvelano submission path found; crawls a top-100,000 listn/a
ARD Registry Hubno submission path foundn/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

Check your own domain. The console fetches what you publish and asks every public registry whether they return you.

Run a free audit