Agentic Resource Discovery (ARD) Specification
repository·main·Indexed 18 days ago
https://github.com/ards-project/ard-specA federated, domain-anchored standard for cataloging, searching, and discovering agentic resources such as MCP servers, A2A agent cards, Skills, and APIs. Built upon the ai-catalog standard, it includes specifications for URN naming patterns, Registry API endpoints (POST /search, GET /agents, and POST /explore), and a Python-based Conformance Testing Tool for verifying implementation compliance.
What's inside ARD
- Agentic Resource Discovery (ARD) is a federated, domain-anchored standard designed for cataloging, searching, and discovering agentic resources. These resources include MCP servers, A2A agent cards, Skills, APIs, and other callable services across networks of discovery services. The specification builds upon the ai-catalog standard.
Overview of Agentic Resource Discovery (ARD)
mainAgentic Resource Discovery (ARD) is a specification for the federated discovery and search of agentic resources (such as MCP tools, A2A agents, skills, and other callable services). It provides a framework for cataloging and searching these resources across distributed networks, allowing LLMs to discover capabilities dynamically via search rather than requiring manual installation or hardcoding.The ARD Query Model
mainThe ARD API uses a common
queryobject for bothPOST /searchandPOST /exploreendpoints. The query object consists of two primary members:text(String): A natural-language description used for semantic relevance. InPOST /search, this field is required.filter(Object): Structured constraints using dot-separated field paths (e.g.,trustManifest.attestations.type).
Filter Semantics:
- Matching: An entry matches if it satisfies the
textrelevance AND every constraint in thefilter. - Logic: Within a single key, values are combined with OR. Across different keys, constraints are combined with AND.
- Arrays: If the value at a path is an array, a constraint matches if any element satisfies it.
- Extensibility: Any attribute in a catalog entry (standard fields like
type,tags,capabilities, or custommetadata.*fields) can be used as a filter key.
{ "query": { "text": "find me a flight booking agent", "filter": { "type": ["application/a2a-agent-card+json"], "tags": ["finance"], "trustManifest.attestations.type": ["SOC2-Type2"] } } }Placement of the federation parameter in POST /search
mainIn the ARD specification (v0.5.0 and later), the
federationcontrol parameter is located at the root level of thePOST /searchrequest payload. It is a sibling to thequery,pageSize, andpageTokenparameters.Do not place the
federationparameter inside thequeryobject. Thequeryobject (theQueryModel) is shared with the/exploreendpoint and must only contain semantic intent and metadata filtering constraints. Thefederationparameter is a routing instruction that determines how the registry executes and routes the request across the network topology.{ "federation": "auto", "query": { "//": "semantic intent and filters go here" }, "pageSize": 20, "pageToken": "abc" }Understand the two layers of ARD Discovery
mainThe ARD discovery specification operates via two distinct layers:
- Static Discovery: A decentralized mechanism where developers or enterprises host static JSON manifests (capability manifests).
- Dynamic Discovery: Active, searchable services known as Registries that index these static catalogs and provide dynamic search endpoints for agents to query.
Format Agent Identifiers using URNs
mainTo ensure cross-network uniqueness and decentralized trust, all agent identifiers MUST follow a standardized, domain-anchored URN format:
urn:air:<publisher>:<namespace>:<agent-name>.urn: Mandatory prefix.air: The Namespace Identifier (NID) for the ARD ecosystem.<publisher>: A fully qualified domain name (FQDN) acting as the organizational trust anchor (e.g.,acme.com).<namespace>: (Optional) Hierarchical segments for categorization (e.g.,finance:trading).<agent-name>: (Mandatory) The specific logical short name (e.g.,assistant).
urn:air:<publisher>:<namespace>:<agent-name>Core Design Principles of ARD
mainARD is built on several key principles to ensure scalability and interoperability:
- Search-First Discovery: Agents are discovered dynamically through search registries rather than pre-installation.
- Scalability Beyond Context Windows: Moves the tool selection process from the LLM's context window to a dedicated search service using information retrieval techniques.
- Artifact Agnostic Envelope: Uses an IANA Media Type in a
typefield to identify artifacts (e.g.,application/mcp-server-card+json), delegating specific metadata definitions to the underlying protocol. - Strict Value-or-Reference: To ensure safe parsing, every catalog entry must contain exactly one of two mutually exclusive keys:
url: A remote reference to the artifact document.data: An embedded JSON object containing the full artifact document.
- Universal Baseline for Federation: Agent Registries MUST expose a standard HTTP REST search interface to ensure any HTTP client can participate in discovery.
- Separation of Concerns: Authentication and physical distribution (e.g., OCI, npm) are handled by the artifact protocols and infrastructure, not the discovery layer.
Understand the Core Principle: Identity vs. Location in URNs
mainIn the Agentic Resource Discovery (ARD) specification, a Uniform Resource Name (URN) represents the logical identity (the 'Noun') of an agent or capability, not its physical location.
- Identity (URN): A permanent, abstract identifier that serves as a stable primary key for search indexes and clients. It must not change based on deployment environment.
- Location (URL/Data): The physical transport binding (e.g.,
http://,mTLS,stdio) is defined separately in the catalog entry'surlordataproperties.
The standard URN structure is:
urn:air:<publisher>:<namespace>:<agent-name>urn:air:<publisher>:<namespace>:<agent-name>Configure URN publishers for Syntax-Only vs. Workload Verification
mainThe ARD specification supports two tiers of URN publisher configuration depending on your security requirements:
Scenario A & B: Syntax-Only Validation (Default)
For standard local development, use the RFC 2606 placeholders (
*.localhost,example.com). In this mode, there is no active cryptographic identity verification. The placeholders are used strictly to satisfy syntax validation rules and maintain architectural consistency.Scenario C: Workload Verification (Advanced Enterprise)
If you are testing production zero-trust security meshes (e.g., SPIFFE/SPIRE or mTLS) within a local environment (like a Kubernetes/Istio cluster), use your real production domain (e.g.,
acme.com) as the URN publisher. This allows your local security mesh to actively validate test certificates against the URN namespace before deployment.Control federation with the federation parameter
mainThe
federationparameter inPOST /searchallows clients to control how a registry interacts with other registries in the network:auto: The registry automatically queries upstream registries, merges their results with its own, and returns a single unified response.referrals: The registry returns its own results plus catalog entries for other registries. The client is responsible for deciding which registries to query next.none: The registry searches only its own local index and does not perform any federated lookups.
{ "query": { "text": "find me a flight booking agent" }, "federation": "referrals" }Identify Artifact Types using IANA Media Types
mainARD uses the
typefield, formatted as an IANA Media Type, to identify the nature of an artifact. This allows the discovery layer to remain agnostic of the internal schema of specific agent types.Commonly used (though pending formal registration) media types include:
application/a2a-agent-card+jsonapplication/mcp-server-card+json
Note for Implementers: While well-known path directories like
/.well-known/agent-card.jsonare officially registered, full type registrations are pending. Intermediaries should avoid strict verification of these types during the transition period.Understand the difference between Search and Browse APIs
mainThe ARD specification enforces a strict separation of concerns between semantic search and catalog browsing to ensure performance and relevance integrity:
POST /search(Relevance-Driven): Use this for semantic, natural-language queries. Results are ordered exclusively by match score. To filter results, do not use complex EBNF strings; instead, use the explicit, flat JSON fields provided in thequeryobject (e.g.,type,compliance,publisher).GET /agents(Browse-Driven): Use this for deterministic, SQL-like catalog browsing. This is the only endpoint that supports complex EBNFfilterstrings and metadataorderByparameters. There are no relevance scores in this endpoint.
When to use which:
- If you want to find resources using natural language (e.g., "tools for translating text") $\rightarrow$ Use
POST /search. - If you want to find resources using exact logic (e.g., "all servers published by Acme Corp, sorted by date") $\rightarrow$ Use
GET /agents.