Skip to content

spec: adopt urn:air: naming standard for AI artifacts (ADR 0015)#36

Merged
mindpower merged 22 commits into
mainfrom
jbu/ai-catalog-updates
Jun 25, 2026
Merged

spec: adopt urn:air: naming standard for AI artifacts (ADR 0015)#36
mindpower merged 22 commits into
mainfrom
jbu/ai-catalog-updates

Conversation

@mindpower

@mindpower mindpower commented May 13, 2026

Copy link
Copy Markdown
Member

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.md

  • Formalized Naming Contract: Defines the universal URN structure: urn: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.
  • Separation of Concerns: Establishes a clear boundary between logical discovery names (the stable identifier URN) and cryptographic trust identities (the identity field in trustManifest, which may use DIDs, SPIFFE, x509, etc.).

2. Core Specification: specification/ai-catalog.md

  • Specification Text Update: Updated the identifier member definition to mandate the urn:air: format. (air->ai resource)
  • Example Alignment: Updated 38 example JSON blocks and narrative references across the specification to reflect the new standard, including:
    • A2A Agent Cards (urn:air:acme.com:agent:finance)
    • MCP Server Cards (urn:air:io.modelcontextprotocol.anonymous:mcp:brave-search)
    • Nested & Hierarchical Catalogs (urn:air:acme.com:catalog:finance)
    • Dual-Protocol (MCP + A2A) Wrappers (urn:air:acme.com:agent:finance:mcp)
    • Security Typosquatting Scenarios (urn:air:acme.com:agent:financ vs urn:ai:acme.com:agent:finance)

Architectural Rationale:

  • Nomenclature Stability: The URN acts as an abstract, stable contract. Relocating workloads or changing underlying cloud infrastructure does not break client discovery or routing logic.
  • Global Uniqueness: Anchoring URNs to fully qualified domain names (FQDNs) guarantees cross-network uniqueness without central registration overhead.
  • Interoperability: Standardizing on urn:ai: allows centralized registries and decentralized crawlers to index, filter, and search AI artifacts uniformly.

⚠️ Reviewer Guidance & Stacked PR Note

Note to Reviewers: This pull request is stacked on top of #37

@github-actions

github-actions Bot commented May 13, 2026

Copy link
Copy Markdown
Contributor

Preview unavailable.

The pull request preview was removed because this pull request is closed.

github-actions Bot added a commit that referenced this pull request May 13, 2026
github-actions Bot added a commit that referenced this pull request May 13, 2026
@mindpower mindpower changed the title Update mediaType to type based on last meeting Update mediaType to type based on last meeting + updated agent identifier May 13, 2026
github-actions Bot added a commit that referenced this pull request May 13, 2026
github-actions Bot added a commit that referenced this pull request May 13, 2026
Comment thread adr/0015-agent-identifier-naming.md Outdated

## 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}`.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this a URN or a URI ?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a good question. We can use "local" or "unknown" to indicate this is an unverifiable local agent (so publisher is not verifiable)

Comment thread adr/0015-agent-identifier-naming.md Outdated
## 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`).

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 ?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These are valid concerns. Let's discuss about this in the meeting today.

Comment thread specification/ai-catalog.md
Comment thread specification/ai-catalog.md Outdated
`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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure how a type defines an endpoint? Is there other documentation for what this is?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's just a url pointer

github-actions Bot added a commit that referenced this pull request May 14, 2026
Comment thread adr/0015-agent-identifier-naming.md Outdated
github-actions Bot added a commit that referenced this pull request May 15, 2026
github-actions Bot added a commit that referenced this pull request May 15, 2026
@mindpower mindpower changed the base branch from main to jbu/adr-0014-mediatype-to-type May 15, 2026 23:20
… marked as type under TrustManifest) during auto-merge
github-actions Bot added a commit that referenced this pull request May 15, 2026
@mindpower mindpower changed the title spec: adopt urn:ai: naming standard for AI artifacts (ADR 0015) spec: adopt urn:air: naming standard for AI artifacts (ADR 0015) Jun 11, 2026
tadasant added a commit to tadasant/ai-catalog that referenced this pull request Jun 18, 2026
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>
Comment thread adr/0015-agent-identifier-naming.md Outdated
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.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should this be urn:air here?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated.

Comment thread specification/ai-catalog.md Outdated
[[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.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should this be urn:air here?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @jdamick . Updated.

github-actions Bot added a commit that referenced this pull request Jun 18, 2026
tadasant pushed a commit to modelcontextprotocol/experimental-ext-server-card that referenced this pull request Jun 18, 2026
…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>
Comment thread specification/ai-catalog.md Outdated
"entries": [
{
"identifier": "urn:mcp:io.modelcontextprotocol.anonymous/brave-search",
"identifier": "urn:air:io.modelcontextprotocol.anonymous:mcp:brave-search",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
"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

dsp-ant pushed a commit to modelcontextprotocol/experimental-ext-server-card that referenced this pull request Jun 19, 2026
…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 tadasant left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks good 👍 Just pending the batch of changes flipping the MCP examples to forward DNS.

mindpower added a commit to zeroasterisk/ard-spec that referenced this pull request Jun 20, 2026
…ID length requirements (>2 characters).

Note: this also aligns with the AI-catalog PR: Agent-Card/ai-catalog#36
github-actions Bot added a commit that referenced this pull request Jun 22, 2026
@mindpower

Copy link
Copy Markdown
Member Author

This looks good 👍 Just pending the batch of changes flipping the MCP examples to forward DNS.

Just updated all examples in the spec.

github-actions Bot added a commit that referenced this pull request Jun 25, 2026
@mindpower mindpower changed the base branch from jbu/adr-0014-mediatype-to-type to main June 25, 2026 18:28
github-actions Bot added a commit that referenced this pull request Jun 25, 2026
@mindpower mindpower merged commit c443ffb into main Jun 25, 2026
4 checks passed
@github-project-automation github-project-automation Bot moved this from In Progress to Done in AI Catalog Jun 25, 2026
github-actions Bot added a commit that referenced this pull request Jun 25, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

7 participants