ARD Registry Builder
Agentic Resource Discovery (ARD) lets AI clients discover agents, MCP servers, skills, and
APIs at runtime by search instead of hardcoding them. Publishers describe their resources in a
static ai-catalog.json capability manifest; dynamic Agent Registries index those
manifests and answer POST /search. This skill helps you engineer both — author, validate,
test, and maintain them so they actually pass conformance and get discovered.
Two artifacts, one mental model — identity vs location:
- The manifest (
ai-catalog.json, static) lists entries. Each entry's identifier is a
permanent urn:air: URN (identity); its url/data is the movable endpoint (location).
- The registry (REST API, dynamic) is a service that searches indexed entries.
Never bake a hostname into a URN; never treat a URL as an identity. Almost every ARD mistake
traces back to confusing these two.
Bundled tools (use these — don't reinvent them)
All scripts are stdlib-only Python 3.8+; validate_catalog.py uses the jsonschema library
when present (recommended: pip install jsonschema) and falls back to a built-in checker.
| Tool |
Purpose |
scripts/validate_catalog.py <path-or-url> [--json] [--strict] |
Validate a manifest: JSON Schema plus ARD semantic rules. Exit 1 on errors. |
scripts/test_registry.py <base-url> [--query T] [--json] |
Probe a live registry's /search (required), /agents, /explore for conformance. |
scripts/new_catalog.py --template minimal|enterprise|local-dev [--publisher D] [--host N] --out F |
Scaffold a starter manifest. |
assets/ai-catalog.schema.json |
JSON Schema for the ai-catalog.json manifest format (Draft 2020-12), bundled for offline validation. |
assets/ard-entry.schema.json |
JSON Schema for a standalone ARD entry and ArdManifest (the v0.91 ard.json format). Use this to validate entries individually or a bare-entries manifest. |
assets/templates/*.json |
Valid starting points: minimal, enterprise (trust + registry entry), local-dev. |
Always validate after every edit, and validate the live URL after publishing — not just
the local file.
Decide what the user needs
- "Create / scaffold / start a catalog" → Workflow 1.
- "Validate / check / is this valid / why won't it pass conformance / fix this manifest" →
Workflow 2 (run
validate_catalog.py first, before reading anything).
- "Test / probe my registry / does my /search work / is my API ARD-compliant" → Workflow 3.
- "Add an agent / bump a version / change an endpoint / maintain" → Workflow 4.
- "How does X work" (data model, API, trust, publishing) → read the matching reference below.
Workflow 1 — Build a manifest
- Pick the closest template and scaffold it:
python scripts/new_catalog.py --template enterprise --publisher mycorp.com --host "MyCorp AI" --out ./ard.json.
(Without scaffolding, copy a file from assets/templates/.)
- For each resource, set
identifier (urn:air:<publisher>:<namespace?>:<name>),
displayName, type (the artifact's media type), and exactly one of url or data.
- Add
description, tags, capabilities, and especially representativeQueries (2–5
natural-language queries) — the single biggest lever for being found by semantic search.
Absence is a conformance warning in v0.91; presence is still strongly recommended.
- Add
trustManifest only when you have real identity/attestations; keep simple entries lean.
- Choose the publisher domain to match the deployment context (enterprise FQDN, public
namespace like
github.com:you, or agent.localhost/example.com for local-only). See
references/data-model.md.
- Validate:
python scripts/validate_catalog.py ./ard.json. Fix until it passes.
Workflow 2 — Validate / debug a manifest
- Run the validator first, before reading the file by hand — it pinpoints issues fast:
python scripts/validate_catalog.py <path-or-url>.
- Read findings by severity. ERROR must be fixed; WARN should be (use
--strict in CI
to enforce); INFO is advice. Every finding names a JSON path and a stable code.
- Map the
code to a fix using references/validation-rules.md. The high-frequency ones:
urn-wrong-nid → change urn:ai: to urn:air:.
value-or-reference → keep exactly one of url / data.
schema (oneOf/required/pattern/minItems) → fix the structure the message names.
urn-localhost / urn-publisher-fqdn → use a verifiable or reserved-placeholder domain.
trust-domain-mismatch → make the trustManifest.identity domain match the URN publisher.
- Re-run until clean. For CI, use
--json (machine output) and/or --strict (fail on warnings).
Workflow 3 — Test a live registry API
- Probe it:
python scripts/test_registry.py https://registry.example.com/api/v1.
The tester sends a real POST /search, validates the results envelope (each item is a
catalog entry carrying a score 0–100 and a source), confirms a malformed request is
rejected with 400 + errorCode + message, and checks optional /agents and /explore
(skipped, not failed, when a server returns 404/501).
- Required checks failing → the server is not ARD-conformant on the mandated floor (
/search).
Fix the envelope/status against references/registry-api.md.
- For exploratory calls, hit endpoints directly with
curl (see references/registry-api.md).
Workflow 4 — Update / maintain
- Edit the entry. Keep the
identifier URN stable — it is a permanent contract. To move an
endpoint, change url (or data), never the URN.
- Bump the entry's
version and refresh updatedAt (ISO 8601) when the artifact changes.
- Adding a resource → append an entry; ensure its
identifier is unique (the validator flags
duplicates).
- Re-validate the file; if it is already published, also validate the live URL and re-probe any
registry. Treat "passes validation" as the definition of done.
Golden rules (the why behind the checks)
- URN = identity, url/data = location. Stable URNs keep search indexes, client references,
and orchestration working while infrastructure moves underneath them.
- The publisher segment must be a verifiable FQDN. Registries extract it and bind it to
trustManifest.identity to stop namespace squatting. localhost and bare words break this.
- Exactly one of
url or data. Predictable parsing in enterprise pipelines depends on it.
score is relevance, not trust. Never gate safety on a search score; verify
trustManifest independently.
- Validate early, validate often, validate the live URL. Most "it won't index" problems are
schema or hosting issues a 1-second validator run would have caught.
Reference files
Read the one matching the task; each has a table of contents.
references/data-model.md — manifest/entry fields, URN format, media types, value-or-reference,
trust manifest, JSON-LD context extension, and the known urn:air: vs urn:ai: doc inconsistencies.
references/registry-api.md — /search, /explore, /agents, the query/filter model,
federation modes, and error codes.
references/validation-rules.md — every check the validator runs, with its code and severity.
references/publishing.md — well-known URI (ard.json), CORS, DNS discovery, and public reference
registries to test against.
Evals
evals/evals.json holds realistic task prompts for the skill-creator evaluation loop. Use it to
benchmark or regression-test changes to this skill.
1---2name: ard-registry-builder3description: Build, validate, test, and update registries and catalogs that follow the Agentic Resource Discovery (ARD) specification. Use this whenever the user works with an ai-catalog.json, a capability manifest, an ARD/AIR catalog or Agent Registry, urn:air: identifiers, trustManifest/attestations, representativeQueries, or an Agent Finder / discovery service — including authoring a new manifest, scaffolding one, fixing schema or URN errors, running conformance/validation, probing a registry's /search, /explore, or /agents REST endpoints, reviewing trust and federation metadata, or preparing to publish at /.well-known/ai-catalog.json. Trigger it even when the user only says "ARD", "agentic resource discovery", "AI catalog manifest", "agent registry", or "make agents discoverable" without naming the file.4license: MIT5---6
7# ARD Registry Builder
8
9Agentic Resource Discovery (ARD) lets AI clients **discover** agents, MCP servers, skills, and
10APIs at runtime by search instead of hardcoding them. Publishers describe their resources in a
11static `ai-catalog.json` **capability manifest**; dynamic **Agent Registries** index those
12manifests and answer `POST /search`. This skill helps you engineer both — author, validate,
13test, and maintain them so they actually pass conformance and get discovered.
14
15Two artifacts, one mental model — **identity vs location**:
16- The **manifest** (`ai-catalog.json`, static) lists entries. Each entry's `identifier` is a
17 permanent `urn:air:` URN (identity); its `url`/`data` is the movable endpoint (location).
18- The **registry** (REST API, dynamic) is a service that searches indexed entries.
19
20Never bake a hostname into a URN; never treat a URL as an identity. Almost every ARD mistake
21traces back to confusing these two.
22
23## Bundled tools (use these — don't reinvent them)
24All scripts are stdlib-only Python 3.8+; `validate_catalog.py` uses the `jsonschema` library
25when present (recommended: `pip install jsonschema`) and falls back to a built-in checker.
26
27| Tool | Purpose |
28| :-- | :-- |
29| `scripts/validate_catalog.py <path-or-url> [--json] [--strict]` | Validate a manifest: JSON Schema **plus** ARD semantic rules. Exit 1 on errors. |
30| `scripts/test_registry.py <base-url> [--query T] [--json]` | Probe a live registry's `/search` (required), `/agents`, `/explore` for conformance. |
31| `scripts/new_catalog.py --template minimal\|enterprise\|local-dev [--publisher D] [--host N] --out F` | Scaffold a starter manifest. |
32| `assets/ai-catalog.schema.json` | JSON Schema for the `ai-catalog.json` manifest format (Draft 2020-12), bundled for offline validation. |
33| `assets/ard-entry.schema.json` | JSON Schema for a standalone ARD entry and `ArdManifest` (the v0.91 `ard.json` format). Use this to validate entries individually or a bare-`entries` manifest. |
34| `assets/templates/*.json` | Valid starting points: `minimal`, `enterprise` (trust + registry entry), `local-dev`. |
35
36Always **validate after every edit**, and validate the **live URL** after publishing — not just
37the local file.
38
39## Decide what the user needs
40- *"Create / scaffold / start a catalog"* → **Workflow 1**.
41- *"Validate / check / is this valid / why won't it pass conformance / fix this manifest"* →
42 **Workflow 2** (run `validate_catalog.py` first, before reading anything).
43- *"Test / probe my registry / does my /search work / is my API ARD-compliant"* → **Workflow 3**.
44- *"Add an agent / bump a version / change an endpoint / maintain"* → **Workflow 4**.
45- *"How does X work" (data model, API, trust, publishing)* → read the matching reference below.
46
47## Workflow 1 — Build a manifest
481. Pick the closest template and scaffold it:
49 `python scripts/new_catalog.py --template enterprise --publisher mycorp.com --host "MyCorp AI" --out ./ard.json`.
50 (Without scaffolding, copy a file from `assets/templates/`.)
512. For each resource, set `identifier` (`urn:air:<publisher>:<namespace?>:<name>`),
52 `displayName`, `type` (the artifact's media type), and **exactly one** of `url` or `data`.
533. Add `description`, `tags`, `capabilities`, and especially `representativeQueries` (2–5
54 natural-language queries) — the single biggest lever for being found by semantic search.
55 Absence is a conformance warning in v0.91; presence is still strongly recommended.
564. Add `trustManifest` only when you have real identity/attestations; keep simple entries lean.
575. Choose the publisher domain to match the deployment context (enterprise FQDN, public
58 namespace like `github.com:you`, or `agent.localhost`/`example.com` for local-only). See
59 `references/data-model.md`.
606. Validate: `python scripts/validate_catalog.py ./ard.json`. Fix until it passes.
61
62## Workflow 2 — Validate / debug a manifest
631. **Run the validator first**, before reading the file by hand — it pinpoints issues fast:
64 `python scripts/validate_catalog.py <path-or-url>`.
652. Read findings by severity. **ERROR** must be fixed; **WARN** should be (use `--strict` in CI
66 to enforce); **INFO** is advice. Every finding names a JSON path and a stable `code`.
673. Map the `code` to a fix using `references/validation-rules.md`. The high-frequency ones:
68 - `urn-wrong-nid` → change `urn:ai:` to `urn:air:`.
69 - `value-or-reference` → keep exactly one of `url` / `data`.
70 - `schema` (oneOf/required/pattern/minItems) → fix the structure the message names.
71 - `urn-localhost` / `urn-publisher-fqdn` → use a verifiable or reserved-placeholder domain.
72 - `trust-domain-mismatch` → make the `trustManifest.identity` domain match the URN publisher.
734. Re-run until clean. For CI, use `--json` (machine output) and/or `--strict` (fail on warnings).
74
75## Workflow 3 — Test a live registry API
761. Probe it: `python scripts/test_registry.py https://registry.example.com/api/v1`.
77 The tester sends a real `POST /search`, validates the `results` envelope (each item is a
78 catalog entry carrying a `score` 0–100 and a `source`), confirms a malformed request is
79 rejected with `400 + errorCode + message`, and checks optional `/agents` and `/explore`
80 (skipped, not failed, when a server returns `404`/`501`).
812. Required checks failing → the server is not ARD-conformant on the mandated floor (`/search`).
82 Fix the envelope/status against `references/registry-api.md`.
833. For exploratory calls, hit endpoints directly with `curl` (see `references/registry-api.md`).
84
85## Workflow 4 — Update / maintain
861. Edit the entry. **Keep the `identifier` URN stable** — it is a permanent contract. To move an
87 endpoint, change `url` (or `data`), never the URN.
882. Bump the entry's `version` and refresh `updatedAt` (ISO 8601) when the artifact changes.
893. Adding a resource → append an entry; ensure its `identifier` is unique (the validator flags
90 duplicates).
914. Re-validate the file; if it is already published, also validate the live URL and re-probe any
92 registry. Treat "passes validation" as the definition of done.
93
94## Golden rules (the why behind the checks)
95- **URN = identity, url/data = location.** Stable URNs keep search indexes, client references,
96 and orchestration working while infrastructure moves underneath them.
97- **The publisher segment must be a verifiable FQDN.** Registries extract it and bind it to
98 `trustManifest.identity` to stop namespace squatting. `localhost` and bare words break this.
99- **Exactly one of `url` or `data`.** Predictable parsing in enterprise pipelines depends on it.
100- **`score` is relevance, not trust.** Never gate safety on a search score; verify
101 `trustManifest` independently.
102- **Validate early, validate often, validate the live URL.** Most "it won't index" problems are
103 schema or hosting issues a 1-second validator run would have caught.
104
105## Reference files
106Read the one matching the task; each has a table of contents.
107- `references/data-model.md` — manifest/entry fields, URN format, media types, value-or-reference,
108 trust manifest, JSON-LD context extension, and the known `urn:air:` vs `urn:ai:` doc inconsistencies.
109- `references/registry-api.md` — `/search`, `/explore`, `/agents`, the query/filter model,
110 federation modes, and error codes.
111- `references/validation-rules.md` — every check the validator runs, with its `code` and severity.
112- `references/publishing.md` — well-known URI (`ard.json`), CORS, DNS discovery, and public reference
113 registries to test against.
114
115## Evals
116`evals/evals.json` holds realistic task prompts for the skill-creator evaluation loop. Use it to
117benchmark or regression-test changes to this skill.