ard-publish
Make your API, MCP server or AI agent discoverable by AI agents.
Build, validate and verify an Agentic Resource Discovery (ARD) manifest — the
/.well-known/ard.json file that lets AI agents find what you offer at runtime,
without anyone installing your tool in advance.
pip install ard-publish
How do I make my API discoverable by AI agents?
Serve an ARD manifest on your own domain describing what you offer, with 2 to 5 representative queries per entry. Registries crawl it. There is no submission form, no marketplace to apply to and no allowlist.
from ard_publish import Manifest, Entry
m = Manifest(host="example.com", display_name="Example Inc")
m.add(Entry.mcp_server(
name="weather",
display_name="Weather API",
host="example.com",
url="https://example.com/.well-known/mcp/server-card.json",
description="Current conditions and forecasts for any location.",
queries=["what is the weather in Berlin",
"will it rain in London tomorrow"],
))
m.save(".well-known/ard.json") # raises if it would not be findable
What is ARD?
ARD stands for Agentic Resource Discovery: an open specification for how AI agents find the tools, skills, agents and APIs they need, published in June 2026 by a working group including Google, Microsoft, Hugging Face, AWS, Cisco, GitHub, Nvidia, Salesforce and Snowflake.
It answers one question — "what is available for this task?" — then gets out of the way. It is a discovery layer, not a runtime, and it does not replace MCP or A2A.
Why this package exists
Publishing a manifest is a small job that is easy to get subtly wrong, and the failures are silent. A malformed URN, or entries with no representative queries, validates as JSON, serves a 200, and is never returned by any search. There is no error to notice.
save() refuses to write a manifest that would not be findable.
Command line
ard-publish init example.com > .well-known/ard.json # scaffold a valid manifest
ard-publish validate .well-known/ard.json # check it locally
ard-publish check example.com # check it for real
check is the one that matters. It fetches your live manifest, validates it, and asks
every public ARD registry whether they return your domain for your own
representative queries — because publishing and being indexed are different things.
example.com grade B 82/100
15/15 Serves a manifest found
10/10 Advertised on all four paths 4 of 4
25/25 Conformance 0 errors, 0 warnings
20/20 Entries are searchable 3 of 3 carry representativeQueries
12/30 Returned by registries 2 of 5 return this domain
registries returning you:
yes Neuronto
no GitHub Agent Finder
yes WellKnown
How do I publish my MCP server so agents can find it?
Three steps, about ten minutes.
1. Write the manifest — ard-publish init yourdomain.com
2. Advertise it on all four discovery paths. Serving only one makes you invisible to any client that checks another:
/.well-known/ard.json the path a consumer MUST fetch
Agentmap: <url> in robots.txt, the agent-facing Sitemap:
<link rel="ard" href="..."> in your page head
DNS service records optional
Manifest.robots_line() and .link_tags() generate two of those for you.
3. Verify — ard-publish check yourdomain.com
The mistake that costs you everything
Leaving out representativeQueries. It is the field registries build their semantic
index from, so an entry without it is a valid catalogue entry that no search will
ever return.
Write 2 to 5 per entry, phrased as the request someone would actually make:
| Written for a brochure | Written for retrieval |
|---|---|
| enterprise document intelligence | read this PDF and pull out the invoice total |
| scalable web extraction platform | scrape a website that blocks bots |
| unified communications API | send a text message to a phone number |
Media types
Three spellings for MCP servers are in circulation, and because filters match exactly,
the wrong one gets you silently dropped by registries that do not normalise.
Entry.mcp_server() uses application/mcp-server-card+json, the spelling the official
conformance tool accepts.
Helpers are provided for each resource kind:
| Helper | Media type |
|---|---|
Entry.mcp_server() |
application/mcp-server-card+json |
Entry.agent() |
application/a2a-agent-card+json |
Entry.skill() |
application/agent-skills+gzip |
API
Manifest(host, display_name, documentation_url, did) |
the catalogue |
.add(entry) |
attach an entry, inheriting host and identity |
.validate() |
list of problems, as plain instructions |
.save(path, strict=True) |
write, refusing an unfindable manifest |
.robots_line() / .link_tags() |
the advertisement snippets |
validate(dict) |
validate a manifest you built elsewhere |
Links
- Agentic Resource Discovery specification
- Publishing guide
- Free ARD audit — which registries return you
- Neuronto, the federated ARD index
- Source
Licence
Apache-2.0
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ard_publish-1.0.1.tar.gz.
File metadata
- Download URL: ard_publish-1.0.1.tar.gz
- Upload date:
- Size: 11.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a6fc6d6010d43e6681e473e0829b87b9e7f2056d0320a224e5941c543774c565
|
|
| MD5 |
3a92cc1880077187779864b1a16fd006
|
|
| BLAKE2b-256 |
172a5a4a44bda6402244b0a7a64ea06fc20c245a48f41d40fb096da353a91681
|
File details
Details for the file ard_publish-1.0.1-py3-none-any.whl.
File metadata
- Download URL: ard_publish-1.0.1-py3-none-any.whl
- Upload date:
- Size: 12.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1e259deae337c3e1319e2cca362d39a0d9807a5c70e470a664a48c052bf6fb1b
|
|
| MD5 |
21ca640186cb05f3a2a2c982391a8d80
|
|
| BLAKE2b-256 |
1dfbb49e6bbee00d66db6639d8022f3c996c2bab03e41e8e5f76cdba0381831b
|