Skip to content

docs(draft): add MCP Catalog discovery specification (Plan B)#4

Draft
SamMorrowDrums wants to merge 2 commits intomainfrom
sammorrowdrums/mcp-catalog-specification
Draft

docs(draft): add MCP Catalog discovery specification (Plan B)#4
SamMorrowDrums wants to merge 2 commits intomainfrom
sammorrowdrums/mcp-catalog-specification

Conversation

@SamMorrowDrums
Copy link
Copy Markdown
Owner

@SamMorrowDrums SamMorrowDrums commented Apr 20, 2026

Summary

Adds a new Discovery section to the draft specification that defines the MCP Catalog format — a minimal, MCP-scoped subset of the AI Catalog specification for domain-level server card discovery.

This is the "Plan B" catalog agreed upon in the Server Card working group meeting, providing config-free auto-discovery of MCP servers while the cross-protocol AI Catalog standard is being finalized.

What's included

  • docs/specification/draft/basic/discovery.mdx — New Discovery specification page covering:

    • MCP Catalog format (minimal AI Catalog subset: specVersion + entries[])
    • Well-known URI convention: /.well-known/mcp/catalog
    • Catalog entry schema (identifier, mediaType, url, plus optional fields)
    • Examples for single-server and multi-server domains
    • Client discovery flow with Mermaid diagram
    • Relationship to AI Catalog and migration path
    • Security considerations (CORS, caching, transport security)
  • docs/docs.json — Navigation updated to place Discovery before Lifecycle in the draft spec

Design decisions

  • Minimal subset of AI Catalog: Uses the same specVersion/entries structure with identifier, displayName, mediaType, url — but omits trust manifests, publisher objects, collections, bundles, and host info. Entries are valid AI Catalog entries with no structural changes needed for migration.
  • Well-known URI: /.well-known/mcp/catalog (no file extension)
  • Not a SEP: This is a companion to the Server Card effort, not a standalone proposal
  • Draft status: Uses "draft" as specVersion, aligning with the draft specification convention

Related

SamMorrowDrums and others added 2 commits April 20, 2026 15:03
Add a new Discovery section to the draft specification that defines the
MCP Catalog format — a minimal, MCP-scoped subset of the AI Catalog
specification for domain-level server card discovery.

The MCP Catalog is served at /.well-known/mcp/catalog and provides a
JSON index of MCP server cards available on a domain. This enables
config-free auto-discovery of MCP servers, acting as a transitional
mechanism (Plan B) while the cross-protocol AI Catalog standard is
being finalized.

Key aspects:
- Minimal subset of AI Catalog format (specVersion + entries)
- Each entry references an MCP server card via mediaType and url
- Designed for trivial migration to the full AI Catalog format
- CORS, caching, and transport security requirements

Related: modelcontextprotocol#2127
Related: modelcontextprotocol#2563
See also: https://github.com/Agent-Card/ai-catalog

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Since server cards are the source of truth for metadata, displayName
and description are redundant in the catalog. Move both to optional
fields, keeping only identifier, mediaType, and url as required.

Update the single-server example to show a minimal entry with only
required fields.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copy link
Copy Markdown

@tadasant tadasant left a comment

Choose a reason for hiding this comment

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

Agree this is the right place for it, thanks for drafting!

I do think we should also document Server Cards in a subsection here (or in a second document and link to it from here). But that's a whole extra chunk of work, maybe just leave a placeholder in this PR?

Recommend this PR be merged into https://github.com/modelcontextprotocol/modelcontextprotocol/pull/2127/files instead of main so it goes in concert with that SEP.


An **MCP Catalog** is a JSON document that lists the MCP server cards available from a
given host. Clients can fetch this document to discover all MCP servers a domain offers,
and then retrieve individual [server cards](https://github.com/modelcontextprotocol/modelcontextprotocol/pull/2127)
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Rather than linking the SEP, maybe we should link a subsection in this same doc that explains the Server Card shape?


## MCP Catalog

An **MCP Catalog** is a JSON document that lists the MCP server cards available from a
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Suggested change
An **MCP Catalog** is a JSON document that lists the MCP server cards available from a
An **MCP Catalog** is a JSON document that lists the MCP Server Cards available from a

Hyperlink MCP Server Cards?

Comment on lines +16 to +17
An **MCP Catalog** is a JSON document that lists the MCP server cards available from a
given host. Clients can fetch this document to discover all MCP servers a domain offers,
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Suggested change
An **MCP Catalog** is a JSON document that lists the MCP server cards available from a
given host. Clients can fetch this document to discover all MCP servers a domain offers,
An **MCP Catalog** is a JSON document published by an organization to advertise the MCP Server Cards relevant to its services.
The catalog MAY reference servers hosted on different domains than the catalog itself - for example, `acme.org/.well-known/...` MAY advertise servers operated by `mcp-server-host-saas.com` on Acme's behalf.

"Host" is a loaded term in MCP-land; we'd normal use it for MCP client apps. But we mean web host here.

I also think we shouldn't constrain the scope to be "servers hosted on a domain". The intent of a catalog is to allow for cross-domain advertising. e.g. acme.org might use mcp-host-saas.com to host their MCP server, and acme.org/.well-known/*'s MCP catalog should be allowed (encouraged) to advertise that other domain.

Hosts that serve MCP servers SHOULD publish an MCP Catalog at:

```
/.well-known/mcp/catalog
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Suggested change
/.well-known/mcp/catalog
/.well-known/mcp/catalog.json

For parity with ai-catalog.json? We don't have .json in the mcp/server-card case, but that's because we want to support Server Cards living at postfix-powered paths.

I guess there's the possibility that we want postfix-powered paths for catalogs too... but it feels messier, since the whole point of discoverability is to make it easy to find the catalog, which is much more ambiguous if it might be at acme.org/.well-known/mcp/catalog OR acme.org/.well-known/mcp/catalog/servers.

... but maybe some big domains could convince me that there's a use case for this, like a specific product line at acme.org/product-line-1 -> acme.org/.well-known/mcp/catalog/product-line-1

If we feel strongly that we should drop .json and allow postfix paths, I think we should try to also convince the AI Card folks to bring us into alignemnt.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Ah I think AI Catalog wants to use Collections and Bundles for this purpose.

So I think we should just add .json here and drop the idea I'm describing of a postfix convention for multiple .well-known AI catalogs on a single domain.


### Well-Known URI

Hosts that serve MCP servers SHOULD publish an MCP Catalog at:
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Suggested change
Hosts that serve MCP servers SHOULD publish an MCP Catalog at:
Organizations offering services accessible via MCP SHOULD publish an MCP Catalog at the domain users associate with the service. The MCP Catalog should live at:

| `mediaType` | string | Yes | The media type of the referenced artifact. MUST be `application/mcp-server+json` |
| `url` | string | Yes | URL where the full server card can be retrieved |

The following members are OPTIONAL. Because the server card itself is the source of truth
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

I think we should just leave these out of the minimal (hopefully temporary) "MCP Catalog" spec here. They are purely AI Catalog concerns for folks who wish to adopt AI Catalog, and in an effort to keep our surface here simple without having to answer questions like "so how do I keep description in sync across my Server Card", I think we can just cut.


| Member | Type | Required | Description |
| :----------- | :----- | :------- | :------------------------------------------------------------------------------- |
| `identifier` | string | Yes | A URI or URN identifying this server (e.g., `urn:mcp:server:example/weather`) |
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Suggested change
| `identifier` | string | Yes | A URI or URN identifying this server (e.g., `urn:mcp:server:example/weather`) |
| `identifier` | string | Yes | A URI or URN identifying this server (e.g., `urn:mcp:server:com.example/weather`) |

I think everything after urn:mcp:server: should directly map to the server.json notion of name.

I would probably additionally add a line like:

The `identifier` MUST begin with `urn:mcp:server:` and end with the `name` value of the referenced Server Card, with no characters in between.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

We should probably also take an action to get these examples updated on the AI Catalog docs. FWIW: I like your addition of server; I think we need that extra namespace within MCP.

"specVersion": "draft",
"entries": [
{
"identifier": "urn:mcp:server:example.com/weather",
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Suggested change
"identifier": "urn:mcp:server:example.com/weather",
"identifier": "urn:mcp:server:com.example/weather",

This and other examples sould use reverse DNS

This endpoint:

- MUST be accessible via HTTPS (HTTP MAY be supported for local/development use)
- MUST return `Content-Type: application/json`
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Suggested change
- MUST return `Content-Type: application/json`

Later this becomes application/ai-catalog+json; I think easier to just leave it unspecified

| Member | Type | Required | Description |
| :----------- | :----- | :------- | :------------------------------------------------------------------------------- |
| `identifier` | string | Yes | A URI or URN identifying this server (e.g., `urn:mcp:server:example/weather`) |
| `mediaType` | string | Yes | The media type of the referenced artifact. MUST be `application/mcp-server+json` |
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

We should probably define application/mcp-server+json in the aforementioned new subsection about Server Cards

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants