spec: adopt urn:air: naming standard for AI artifacts (ADR 0015)#36
Conversation
|
Preview unavailable. The pull request preview was removed because this pull request is closed. |
|
|
||
| ## Proposal | ||
| We will align the agent identifier naming in `ai-catalog.md` with the standards defined in [PR #19](https://github.com/Agent-Card/ai-catalog/pull/19). | ||
| The `identifier` field MUST follow the URN format: `urn:{nid}:{publisher}:{namespace}:{name}`. |
There was a problem hiding this comment.
Hi Luca, it is specifically a URN (which is a specific type of URI). While the previous draft allowed a mix of URNs and URIs, the latest update narrows this down to mandate a strictly formatted URN (starting with urn:).
This ensures that agent identifiers remain stable, location-independent handles, separating the logical name of the agent from its physical network location (which would be a URL) and the trust identity (SPIFFE/DID/DNS/etc).
So in summary:
- Logical Discovery Identifier (CatalogEntry.identifier): Retains an abstract, domain-anchored URN namespace (e.g., urn:example:agent:name) to ensure permanent nomenclature stability and efficient indexing and discovery.
- Pluggable Trust Identity (TrustManifest.identity): Supports various identity including SPIFFE IDs, DIDs, etc as a fully supported, first-class identity token for zero-trust enforcement and cryptographic verification.
There was a problem hiding this comment.
Understood. So if my agent is running locally and I am using stdio or a file descriptor it's still a URN that I should use?
There was a problem hiding this comment.
This is a good question. We can use "local" or "unknown" to indicate this is an unverifiable local agent (so publisher is not verifiable)
| ## Proposal | ||
| We will align the agent identifier naming in `ai-catalog.md` with the standards defined in [PR #19](https://github.com/Agent-Card/ai-catalog/pull/19). | ||
| The `identifier` field MUST follow the URN format: `urn:{nid}:{publisher}:{namespace}:{name}`. | ||
| - `nid`: The Namespace Identifier (e.g., `agent`, `mcp`). |
There was a problem hiding this comment.
Making each ai artifact have its own nid is somewhat duplicative of having a type for each artifact. To adhere to the guidance of URNs and media types would require registering in two different IANA registries.
And if agent and mcp have two different nids, then there is no guarantee that the mcp nid will have publisher/namespace/name as the elements because the NID determines how the NSS is interpreted.
Would you be open to having aicatalog as the nid ?
There was a problem hiding this comment.
These are valid concerns. Let's discuss about this in the meeting today.
| `application/agentskill+zip` for skill definitions) | ||
| - `application/mcp-server+json` — an MCP Server | ||
| - `application/ai-catalog+json` — a nested AI Catalog | ||
| - `application/agent-registry` — an Agent Registry search endpoint |
There was a problem hiding this comment.
I'm not sure how a type defines an endpoint? Is there other documentation for what this is?
There was a problem hiding this comment.
This is the agent registry which is a rest based registry API (as proposed in #21). So by allowing to point to registries allow to further discover as well. But since we haven't discussed too much on registry here yet, I can remove that type from this PR.
There was a problem hiding this comment.
It's just a url pointer
… marked as type under TrustManifest) during auto-merge
urn:ai: naming standard for AI artifacts (ADR 0015)urn:air: naming standard for AI artifacts (ADR 0015)
Documents the decision already implemented by this PR: displayName moves from a REQUIRED to an OPTIONAL member of a Catalog Entry and is dropped from the Minimal Catalog (Level 1) required-at-minimum set. Pairs each substantive spec PR with an ADR, matching ADR-0014 (Agent-Card#37) / ADR-0015 (Agent-Card#36). Status is Proposed pending the 2026-06-18 working-group call. Signed-off-by: Tadas Antanavicius <tadasant@users.noreply.github.com> Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
| To ensure global federation and industry-wide interoperability, we need a standardized, secure naming protocol for AI actors. However, we also need to preserve flexibility for organizations running local, private, or closed catalog instances that do not participate in public federation. | ||
|
|
||
| ## Decision | ||
| We will define the `identifier` field as an open text format, while strongly recommending and standardizing the domain-anchored `urn:ai` scheme for open or federated ecosystems. |
| [[RFC8141]] or URI [[RFC3986]] (e.g., `urn:example:agent:name`). | ||
| See [Multi-Version Entries](#multi-version-entries) for uniqueness | ||
| rules when multiple versions are present. | ||
| : A string uniquely identifying this artifact. This field is an open text format (e.g., any valid URI or URN is accepted). However, to ensure interoperability, identity uniqueness, and discoverability, the standard `urn:ai` naming structure is **HIGHLY RECOMMENDED** and **MUST** be used for open or federated systems. |
…DR 0015)
Align the MCP Catalog Entry `identifier` with the domain-anchored
`urn:air:{publisher}:{namespace}:{name}` naming convention standardized
in Agent-Card/ai-catalog#36 (ADR 0015), replacing the repo-local
`urn:mcp:server:<name>` format.
The MCP Catalog is documented as "a minimal, MCP-scoped subset of the AI
Catalog specification" whose entries "can be used as-is within a full AI
Catalog document" — a claim the old `urn:mcp:server:` format
contradicted. Maps the Server Card reverse-DNS `name` (`{publisher}/{name}`)
to `urn:air:{publisher}:mcp:{name}`, and clarifies that the discovery
`identifier` is decoupled from cryptographic trust identity per ADR 0015.
Doc-only change to docs/discovery.md; the Server Card schema has no
identifier field and is unchanged.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
| "entries": [ | ||
| { | ||
| "identifier": "urn:mcp:io.modelcontextprotocol.anonymous/brave-search", | ||
| "identifier": "urn:air:io.modelcontextprotocol.anonymous:mcp:brave-search", |
There was a problem hiding this comment.
| "identifier": "urn:air:io.modelcontextprotocol.anonymous:mcp:brave-search", | |
| "identifier": "urn:air:anonymous.modelcontextprotocol.io:mcp:brave-search", |
If we are going to say the {publisher} is "The domain name of the organization publishing the artifact", I think we should use forward DNS here
MCP equivalent PR: modelcontextprotocol/experimental-ext-server-card#31
…DR 0015) (#31) ## What & why Adopts the AI Catalog **`urn:air:`** identifier-naming convention standardized in [Agent-Card/ai-catalog#36](Agent-Card/ai-catalog#36) (ADR 0015) for this extension's discovery docs. This repo's only identifier-naming surface is the **MCP Catalog Entry** in [`docs/discovery.md`](docs/discovery.md). It previously used a repo-local `urn:mcp:server:<name>` URN. `docs/discovery.md` describes the MCP Catalog as *"a minimal, MCP-scoped subset of the AI Catalog specification"* whose entries *"can be used as-is within a full AI Catalog document"* — a claim the old format contradicted, since the AI Catalog now standardizes the domain-anchored `urn:air:{publisher}:{namespace}:{name}` form. ### Changes (doc-only, `docs/discovery.md`) - Replace the `urn:mcp:server:<name>` convention with the AI Catalog `urn:air:` form. - Document the segments for an MCP server: - **`publisher`** — the publisher's domain (forward DNS), e.g. `example.com`, matching ADR 0015's framing that the publisher is a domain. - **`namespace`** — optional, populated per the AI Catalog specification (the examples omit it). - **`name`** — the server-name suffix (the segment after the `/` in the referenced Server Card's reverse-DNS `name`), e.g. `weather`. - So a Server Card named `com.example/weather` can be referenced as `urn:air:example.com:weather`. - Update all 4 catalog examples accordingly. ### Design notes for reviewers - **Forward-DNS publisher**, anchored on the publisher's domain per ADR 0015. - **Server Card schema deliberately untouched.** `schema.ts`/`schema.json` have **no `identifier`/`identity` field** — the card carries `name` (reverse-DNS) only — so this is a discovery-doc change, not a schema change. Keeps the PR minimal and avoids pre-empting unresolved SEP-2127 discussion. - **Related open question:** issue #26 ("Remove the MCP Catalog") — this aligns the identifier format while the MCP Catalog exists and does not pre-empt that discussion. ## Verification - [x] **Self-review (fresh-eyes) done.** Ran independent in-process reviews of the diff across iterations; findings (an incorrectly-attributed `urn:air:local:` form; reverse- vs forward-DNS publisher) were addressed. - [x] **ADR 0015 cross-checked against source** — verified the `urn:air:{publisher}:{namespace}:{name}` form, the forward-domain example `urn:air:example.com:...`, and the optional namespace against the raw `adr/0015-agent-identifier-naming.md` in PR #36. - [x] **All 4 examples internally consistent** with the documented mapping; example `url` hosts match the publisher domains. - [x] **No stale references** — `grep` confirms zero remaining `urn:mcp:server:` occurrences. - [x] **Schema untouched & in sync** — `npm run check` → `✓ schema.json is up to date`; `tsc --noEmit` passes. - [x] **Examples validate** — `npm run validate` → `All 7 example(s) passed.` - [x] **Formatting** — `npm run format:check` (prettier) passes on all tracked files. - [x] **CI green** — confirmed on the pushed branch (`build`, `CodeQL`, `Analyze` all pass). Local proof: ``` $ npm run check ✓ schema.json is up to date (+ tsc --noEmit, no errors) $ npm run validate All 7 example(s) passed. $ npm run format:check All matched files use Prettier code style! ``` Documentation-only change; no UI and no runtime/logic behavior to exercise beyond the schema toolchain above. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: tadasant <bob@tadasant.com> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
tadasant
left a comment
There was a problem hiding this comment.
This looks good 👍 Just pending the batch of changes flipping the MCP examples to forward DNS.
…ID length requirements (>2 characters). Note: this also aligns with the AI-catalog PR: Agent-Card/ai-catalog#36
…ention (forward dns domain format)
Just updated all examples in the spec. |
This pull request introduces ADR 0015, proposaling a standardized, domain-anchored URN naming convention (
urn:air:) for all AI actors and artifacts within the AI Catalog ecosystem. Evolving from the recommendations in PR #19, this proposal ensures global federation, consistent indexing, and industry-wide interoperability across registries and orchestrators.📝 Summary of Changes
1. Architectural Decision Record:
adr/0015-agent-identifier-naming.mdurn:air:{publisher}:{namespace}:{name}.publisher: The anchoring domain where the artifact is hosted (e.g.,example.com).namespace: Optional, hierarchical segments separated by:(e.g.,hr,finance,finance:agent,mcp,skill,catalog).name: The specific, distinguishing name of the artifact.identifierURN) and cryptographic trust identities (theidentityfield intrustManifest, which may use DIDs, SPIFFE, x509, etc.).2. Core Specification:
specification/ai-catalog.mdidentifiermember definition to mandate theurn:air:format. (air->ai resource)urn:air:acme.com:agent:finance)urn:air:io.modelcontextprotocol.anonymous:mcp:brave-search)urn:air:acme.com:catalog:finance)urn:air:acme.com:agent:finance:mcp)urn:air:acme.com:agent:financvsurn:ai:acme.com:agent:finance)Architectural Rationale:
urn:ai:allows centralized registries and decentralized crawlers to index, filter, and search AI artifacts uniformly.