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.
76
94%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
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:
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).Never bake a hostname into a URN; never treat a URL as an identity. Almost every ARD mistake traces back to confusing these two.
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 | The authoritative JSON Schema (Draft 2020-12), bundled for offline validation. |
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.
validate_catalog.py first, before reading anything).python scripts/new_catalog.py --template enterprise --publisher mycorp.com --host "MyCorp AI" --out ./ai-catalog.json.
(Without scaffolding, copy a file from assets/templates/.)identifier (urn:air:<publisher>:<namespace?>:<name>),
displayName, type (the artifact's media type), and exactly one of url or data.description, tags, capabilities, and especially representativeQueries (2–5) —
the single biggest lever for being found by semantic search.trustManifest only when you have real identity/attestations; keep simple entries lean.github.com:you, or agent.localhost/example.com for local-only). See
references/data-model.md.python scripts/validate_catalog.py ./ai-catalog.json. Fix until it passes.python scripts/validate_catalog.py <path-or-url>.--strict in CI
to enforce); INFO is advice. Every finding names a JSON path and a stable code.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.--json (machine output) and/or --strict (fail on warnings).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)./search).
Fix the envelope/status against references/registry-api.md.curl (see references/registry-api.md).identifier URN stable — it is a permanent contract. To move an
endpoint, change url (or data), never the URN.version and refresh updatedAt (ISO 8601) when the artifact changes.identifier is unique (the validator flags
duplicates).trustManifest.identity to stop namespace squatting. localhost and bare words break this.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.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, 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, CORS, DNS discovery, and public reference
registries to test against.evals/evals.json holds realistic task prompts for the skill-creator evaluation loop. Use it to
benchmark or regression-test changes to this skill.
0ddb6a6
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.