AI Catalog and ARD discovery
With AI Catalog and Agentic Resource Discovery (ARD), you can discover registered AGENT_CARD and MCP_TOOL artifacts by using compatible clients.
Apicurio Registry publishes an AI Catalog document and provides an ARD search API in addition to its existing discovery endpoints.
AI Catalog and ARD overview
AI Catalog and Agentic Resource Discovery (ARD) are related standards for discovering agentic AI artifacts, including Agent2Agent (A2A) agent cards and Model Context Protocol (MCP) servers. A Linux Foundation working group maintains these community standards.
- AI Catalog
-
A static JSON envelope that supports multiple artifact types, typically served at
/.well-known/ai-catalog.json. Each entry identifies an artifact by its Internet Assigned Numbers Authority (IANA) media type and either links to it (url) or embeds it (data). - ARD
-
A discovery standard that extends AI Catalog with a domain-based identifier scheme (
urn:air:<publisher>:<namespace>:<name>) and a requiredPOST /searchREST API for dynamic discovery. It also defines optionalGET /agentsandPOST /exploreendpoints. The standard path for publishing and retrieving an ARD catalog is/.well-known/ard.json.
Apicurio Registry provides a read-only view of existing AGENT_CARD and MCP_TOOL artifacts in both formats.
This view requires no schema migration or additional artifact types.
AI Catalog and ARD configuration properties
AI Catalog publishing and ARD search are disabled by default. You can enable each feature independently with its configuration property.
| Property | Default | Description |
|---|---|---|
|
|
Whether to enable the |
|
Derived from request host |
The |
|
|
Display name for this registry instance, reported as the catalog’s |
|
|
The AI Catalog specification version reported in the catalog document |
|
|
Whether to enable the |
|
|
Reserved for the ARD federation mode.
Apicurio Registry implements only |
AI Catalog document endpoints
When apicurio.ai-catalog.enabled=true, Apicurio Registry serves an AI Catalog document at two equivalent paths.
GET /.well-known/ai-catalog.json-
Returns the AI Catalog document. This earlier path remains available for clients that support only AI Catalog.
GET /.well-known/ard.json-
Returns the same AI Catalog document. An ARD crawler retrieves the document from this path as required by the ARD specification. A client conforms to the specification even if it retrieves only
ard.json. If you can serve only one path, use this path.
{
"specVersion": "1.0",
"host": {
"displayName": "Apicurio Registry",
"identifier": "registry.example.com:8080"
},
"entries": [
{
"identifier": "urn:air:registry.example.com:8080:system:registry",
"displayName": "Apicurio Registry",
"type": "application/ai-registry+json",
"url": "http://registry.example.com:8080/.well-known/ard/search",
"description": "ARD search API for this registry."
},
{
"identifier": "urn:air:registry.example.com:8080:ai-agents:translator-agent",
"displayName": "Translation Agent",
"type": "application/a2a-agent-card+json",
"url": "http://registry.example.com:8080/.well-known/agents/ai-agents/translator-agent",
"description": "Translates text between languages",
"capabilities": ["translation"],
"version": "1.0.0",
"updatedAt": "2026-09-01T10:15:30Z",
"tags": ["apicurio.agent.visibility=public", "department=localization"],
"representativeQueries": [
"Translate this paragraph into Spanish",
"Which language is this text written in?"
]
},
{
"identifier": "urn:air:registry.example.com:8080:ai-tools:catalog-lookup",
"displayName": "catalog_lookup",
"type": "application/mcp-server-card+json",
"url": "http://registry.example.com:8080/.well-known/mcp-tools/ai-tools/catalog-lookup",
"description": "Look up entries in the product catalog",
"capabilities": [],
"version": "1.0.0",
"updatedAt": "2026-08-28T08:00:00Z"
}
]
}
- Artifact entries
-
Each entry has an
identifierin theurn:air:<publisher>:<namespace>:<name>form. Entries forAGENT_CARDartifacts useapplication/a2a-agent-card+json. Entries forMCP_TOOLartifacts useapplication/mcp-server-card+json. - Registry entry
-
When
apicurio.ard.enabled=true, the first entry in the catalog has the typeapplication/ai-registry+jsonand identifies the registry. This entry points to the/.well-known/ard/searchendpoint. A crawler that retrieves only the static catalog can discover the search API from this entry, as defined by the ARD specification.
| Field | Source |
|---|---|
|
|
|
The |
|
|
|
The |
|
The artifact description. |
|
The skill IDs from the Agent Card |
|
The |
|
The artifact modification time as an ISO-8601 instant. |
|
The artifact labels as |
|
Up to five sample queries taken from the |
- Artifact visibility
-
Apicurio Registry filters Agent Card entries by the
apicurio.agent.visibilitylabel with the same rules as/.well-known/agents. MCP tool entries have no visibility label, so Apicurio Registry always includes them. When neither OpenID Connect (OIDC) nor basic authentication is configured, Apicurio Registry applies no visibility filtering. - Authorization
-
Both endpoints require read-level authorization when authentication is enabled. Anonymous clients can read them only if
apicurio.auth.anonymous-read-access.enabledistrue. The same documents are also available at/apis/registry/v3/well-known/ai-catalog.jsonand/apis/registry/v3/well-known/ard.json.
ARD search API
When apicurio.ard.enabled=true, Apicurio Registry provides ARD REST search endpoints under both /.well-known/ard/ and /apis/registry/v3/well-known/ard/.
All three endpoints require read-level authorization when authentication is enabled. They apply the same visibility rules as the catalog documents.
POST /ard/search-
The required ARD search endpoint accepts a
queryobject with a requiredtextfield and an optional structuredfilter. The supported filter keys aretype,tags,capabilities, andpublisher. Apicurio Registry matches thetextvalue against artifact names and artifact IDs as a partial match. A value withoutmatches anywhere, and you can useas a prefix or suffix wildcard. Values within a filter key use the OR operator; different keys use the AND operator. Atagsvalue of the formkey=valuematches an artifact label exactly. A value without=matches any artifact that has a label with that key. Acapabilitiesvalue matches a skill ID of an Agent Card entry. Atypevalue must match, or be a substring of, one of the two media types that Apicurio Registry emits.pageSizedefaults to 10, and Apicurio Registry clamps larger values to 100. To fetch the next page, pass thepageTokenvalue from the previous response. The last page has nopageToken.Example request{ "query": { "text": "translation", "filter": { "type": ["application/a2a-agent-card+json"] } }, "pageSize": 10 }Example response{ "results": [ { "identifier": "urn:air:registry.example.com:8080:ai-agents:translator-agent", "displayName": "Translation Agent", "type": "application/a2a-agent-card+json", "url": "http://registry.example.com:8080/.well-known/agents/ai-agents/translator-agent", "description": "Translates text between languages", "capabilities": ["translation"], "version": "1.0.0", "updatedAt": "2026-09-01T10:15:30Z", "tags": ["apicurio.agent.visibility=public", "department=localization"], "score": 100, "source": "http://registry.example.com:8080" } ] }The search returns only entries that match every requested criterion, and each result has a scoreof100. The implementation does not support fuzzy or semantic ranking. It supports onlyfederation: nonesemantics and accepts otherfederationvalues for compatibility with later versions without changing the behavior. GET /ard/agents-
The optional, deterministic browsing endpoint accepts a
filterquery parameter in the formkey=value[ AND key=value]*. It supports the same filter keys and matching rules asPOST /ard/search. The endpoint also acceptsorderBy,pageSize, andpageTokenparameters. Apicurio Registry acceptsorderByfor compatibility with ARD clients, but the parameter has no effect. Apicurio Registry returns Agent Card entries before MCP tool entries and orders each group newest first.pageSizedefaults to 20, and Apicurio Registry clamps larger values to 500. The endpoint returns an AI Catalog document. When more results remain, the response includes anextPageTokenvalue that you can use to request the next page.Example requestcurl -G "http://localhost:8080/.well-known/ard/agents" \ --data-urlencode "filter=type=application/a2a-agent-card+json" \ --data-urlencode "pageSize=10" POST /ard/explore-
The optional facet aggregation endpoint accepts an optional
queryin the same form asPOST /ard/search. It requires aresultType.facetsarray that names the fields to aggregate. The supported fields aretypeandpublisher. Each facet request can also setlimit(the maximum number of buckets to return) andminCount(the minimum count for a bucket). Apicurio Registry sums the counts of buckets beyondlimitintootherCount. The endpoint returns counts grouped by field value instead of ranked entries.Example request{ "resultType": { "facets": [ { "field": "type" } ] } }Example response{ "resultType": "facets", "facets": { "type": { "buckets": [ { "value": "application/a2a-agent-card+json", "count": 4 }, { "value": "application/mcp-server-card+json", "count": 2 } ], "otherCount": 0 } } }
| Status | Cause |
|---|---|
|
One of the following conditions applies:
Apicurio Registry clamps out-of-range |
|
Authentication is enabled, the request is anonymous, and |
|
|
Scope and limitations
AI Catalog and ARD provide a read-only view of existing artifacts in Apicurio Registry, which stores and governs metadata. They do not provide a runtime platform for those artifacts.
The implementation has the following limitations:
-
It does not support Trust Manifest, which is optional in the specification.
-
It searches only the local Apicurio Registry index (
federation: none). -
It does not import entries from external
ai-catalog.jsonorard.jsondocuments as artifacts. -
It returns a
scoreof100for matching results without semantic relevance ranking.
