Development of the MCP Registry · modelcontextprotocol/registry · Discussion #11 (original) (raw)

Edit (May 27, 2025): Here is a slide deck presentation from the recent MCP Developers Summit outlining the goals of the official registry.

Spurred by this discussion, a group of MCP community members have begun working on the official MCP metaregistry in this modelcontextprotocol/registry repository.

The initial deliverable we are sprinting towards is a REST API that centralizes metadata about MCP servers by leaning on server creators to submit and maintain metadata about their servers in a standardized format.

We envision that MCP client applications and other "server aggregator" type consumers will be able to leverage this metadata as a source of truth touchpoint in order to power functions like "extensions", "MCP marketplaces", "integrations", and other UX that involves discovering and installing MCP servers.

An official UI experience will likely come as a next-step after the initial API launch.

Coordinating this effort: @toby (GitHub), @alexhancock (Block), me (PulseMCP)

Leading development: @sridharavinash (GitHub)

Big thank you to everyone else who has contributed input on this working group so far: @dsp-ant, @jspahrsummers, Marc-Antoine Belanger, Benjamin Eckel, Chris Dickinson, Nils Adermann, @macoughl, @ravinahp, @jerome3o-anthropic, @topherbullock, @calclavia, @cliffhall

If anyone in the community has feedback or commentary on any aspect of the metaregistry, I encourage you to open up a Discussion explaining your use case and feedback. We feel good about the high level architecture and scope of the metaregistry, but are very open to feedback and want to make sure we are properly addressing the ecosystem's needs that should be in scope for this work.

Below is a high level review of where we currently stand and some architectural decisions we have made, along with some open questions we'd love feedback and input on (we'll spin some of these out to separate Discussions, but feel free to open your own if you don't see one already out there). The best way to contribute to this effort is to either (1) offer specific examples and use cases of your needs, or (2) pick up well-defined chunks of work that we have already aligned on and contribute to the codebase.

Details below are subject to change; I won't be updating the below as it goes stale. Consider this a starting point at the time of writing, but the codebase and its associated documentation is the ultimate source of truth, and other more fine-grained Discussions/Issues will likely progress forward these details.


Scope

Problem Statement

End-users of MCP clients have a need to be shown MCP servers they may want to install. MCP client hosts need to surface this data for their users.

Currently, the way MCP clients do this is one of the following:

This is a very fragmented approach that results in significant amounts of duplicated effort across the ecosystem, and still results in an inefficient, non-comprehensive UX for end-users. In addition, it puts server maintainers in a position where they must maintain their metadata on potentially dozens of different solutions (whether they be third party registries or MCP client registries).

Solution

Create a single source of truth "centralized metaregistry", to which server maintainers can push their metadata, and MCP clients (or other consumers) can consume that metadata, filter it, curate it, and serve it to their end-users.

This metadata should contain:

We aim to make the shape of this metaregistry be fit for re-use in other contexts, such as internal private metaregistries, or opinionated intermediate metaregistries that can be consumed by MCP clients instead of (or in addition to) the official centralized metaregistry.

Out of Scope

Massive scale & reliability (millions of consumers): this metaregistry should not be consumed by MCP client end-users. MCP client hosts should maintain asynchronous systems that integrate with the metaregistry. This means the maximum number of direct consumers of this metaregistry is roughly equal to "number of MCP client apps", rather than "number of MCP client app users".

Solving the long tail of MCP filtering & curation capabilities: MCP server "selection" is a complex problem with a myriad of long-tail use cases. The right "sort order" or "ranked search results" for a given use case or query is not something we want to solve centrally. MCP Client IDE's will solve this problem differently than MCP Client chat apps, who will solve it differently from MCP Client agent-building frameworks. While we may choose to include optional data fields that help facilitate solving this problem for end-users, we do not anticipate including that kind of data in the centralized metaregistry itself.

Reusability of infrastructure, implementation detail decisions: While we expect the ecosystem to reuse the shapes (such as OpenAPI shape, mcp.json shape) associated with this work, we are not designing for reuse of the underlying implementation details and infrastructure. As such, we will not provide instructions on "how to serve your own instance of this metaregistry".

Comprehensive security assurances: while there is some opportunity to improve security guarantees across the MCP ecosystem by working assurances into a centralized metaregistry, we are starting off by delegating source-code level concerns to package registries (we will not host any source code), and deferring opportunities like source code scanning, tool poisoning countermeasures, etc. to post-MVP iterations of the metaregistry.

Architecture

REST API: No authentication required to read; GitHub authentication required to publish. Publishers will submit metadata in a standardized format ("mcp.json") describing their MCP servers. The API will accept consumer requests to read published metadata, and have internal capability to perform async jobs and potentially issue webhook calls. It will be implemented with Go.

Note

We are choosing a REST API rather than, say, a daily data dump, because we expect our API shape to be repurposed by various consumers that augment (or make private versions of) the metaregistry. So while the centralized metaregistry is not designed for direct consumption by MCP client apps, the intermediate consumers may choose to mirror the shape of the centralized metaregistry, and it would be useful for them to expose their data to MCP client apps in a consistent manner.

NoSQL Database: To store application-level metadata and mcp.json data.

GitHub OAuth: Will serve as our auth provider. Requests to publish data into our REST API must go through GitHub OAuth.

Source Code Registries: npm, PyPi, crates, dockerhub, GHCR, etc. will store original source code and version data. The metaregistry will store references to these on a per-server basis.

CLI tool: Used by developers to trigger publication requests to the REST API.

Building blocks

Domain-based namespacing: Publishers can use TXT-based DNS verification to get access to publish packages namespaced under reverse DNS (e.g. com.microsoft(.subdomain)/my-mcp-server). For those publishing source code to GitHub without DNS verification, we'll offer a namespace like io.github.{username}/my-mcp-server.

Note

Whether we should use forward DNS or reverse DNS is still an open question. See #12

Auth delegation to GitHub OAuth: In its simplest form, this lets us tie a DNS verification to a GitHub user or an entire GitHub organization, used when executing metadata updates.

Delegation to existing package & container registries: Gives us a base level of security and anti-spam assurance.

Store only metadata that serves as a single source of truth: Anything that can be a reference to structured data stored elsewhere should be a reference, not a copy.

Design for consumers to poll & transform: Because we will not solve "curation" in a centralized manner, our design assumes that there will be at least one middle-layer of data transformation in between data published by the metaregistry and consumption by MCP client end-users.

Considerations

Third parties should be able to mirror our design for private or downstream usage: There will be a need for registering MCP server metadata beyond a single, centralized public repository. Consumers of this metadata may want to compose the centralized repository with their own private repositories, or augment data in the metaregistry with their own opinionation; our API surface area should keep those use cases in mind.

Example Flows

Here are example flows showing how the system will work in practice:

GitHub user publishes to personal namespace with no domain verification

sequenceDiagram participant User participant CLI as CLI Tool participant GH as GitHub App participant API as Registry API participant DB as Registry Database participant Storage as Object Storage

User->>CLI: Run with mcp.json<br/>(name: io.github.tadasant/my-mcp-server)
CLI->>GH: Initiate OAuth flow
GH->>User: Prompt for authorization
User->>GH: Authorize
GH->>CLI: Return Authorization Code
CLI->>GH: Exchange code for token
GH->>CLI: Return OAuth token
CLI->>API: Submit publish request with<br/>OAuth token + mcp.json
API->>GH: Verify token belongs to<br/>@tadasant user
GH->>API: Confirm ownership
API->>Storage: Store mcp.json file
API->>DB: Record metadata
API->>CLI: Confirm successful publish
CLI->>User: Display success message

Loading

GitHub user verifies domain ownership

sequenceDiagram participant User participant CLI as CLI Tool participant GH as GitHub App participant API as Registry API participant DNS as DNS System participant DB as Registry Database

User->>CLI: Run verify-domain command<br/>(domain: example.com)
CLI->>GH: Initiate OAuth flow
GH->>User: Prompt for authorization
User->>GH: Authorize
GH->>CLI: Return Authorization Code
CLI->>GH: Exchange code for token
GH->>CLI: Return OAuth token
CLI->>API: Submit domain verification request<br/>(domain + OAuth token)
API->>GH: Verify token belongs to user
GH->>API: Confirm ownership
API->>CLI: Return TXT record to add<br/>(e.g., mcp-verify=abc123)
CLI->>User: Display TXT record instructions
User->>DNS: Add TXT record to<br/>example.com DNS settings
DNS-->>User: Confirm TXT record added
User->>CLI: Continue verification process
CLI->>API: Request domain verification check
API->>DNS: Query for TXT record at<br/>example.com
DNS->>API: Return TXT record
API->>API: Verify TXT record matches<br/>expected value
API->>DB: Store domain verification mapping<br/>(GitHub user -> verified domain)
API->>CLI: Confirm successful verification
CLI->>User: Display success message<br/>(Now authorized to publish under com.example/*)

Loading

GitHub user publishes under namespace they have previously verified

sequenceDiagram participant User participant CLI as CLI Tool participant GH as GitHub App participant API as Registry API participant DB as Registry Database participant Storage as Object Storage

User->>CLI: Run with mcp.json<br/>(name: com.example/my-mcp-server)
CLI->>GH: Initiate OAuth flow
GH->>User: Prompt for authorization
User->>GH: Authorize
GH->>CLI: Return Authorization Code
CLI->>GH: Exchange code for token
GH->>CLI: Return OAuth token
CLI->>API: Submit publish request with<br/>OAuth token + mcp.json
API->>GH: Verify token belongs to user
GH->>API: Confirm ownership
API->>DB: Check if user has verified<br/>example.com domain
DB->>API: Confirm domain verification
API->>Storage: Store mcp.json file
API->>DB: Record metadata
API->>CLI: Confirm successful publish
CLI->>User: Display success message

Loading

Frequently Asked Questions

How do I know if someone creates a server named @block/goose, that it is actually made by Block?

What should the name of the server be? Should we enforce that the name is the repo name or can it be freeform?

How do we handle domain transfers? E.g. domain expires, someone else buys it; we'd need to make sure the old owners don't still have access.

What fallbacks do we have in case spammers or other bad actors succeed in publishing malicious/spam content?

Will there be a problem with spam and abuse detection?

Will we maintain server quality guarantees in some way?

How often do we expect consumers to read our data?

Who will be responsible for monitoring, alerts, on-call?

How does versioning work?

How will people discover servers they're interested in?

How will we get off the ground w.r.t. data in the metaregistry?

How will identity work?

How will regaining access (such as when leaving a job) work?

How do we do change management w.r.t. to our API's and tools?

How do we encourage people to actually use this system?

How do we know whether folks are using our solution and happy with it?

What reliability guarantees do we need?

Is there any way to trick the official metaregistry to serving a package that a consumer is not expecting?

Note

This note on avoiding misrepresentative packages is not fully fleshed out and could use more input.

How do we handle typosquatting?

How do we manage repo-jacking?

Have a way to quickly delete accidentally published private data

Are we introducing any privacy and/or security risks for end-users?

Note

Could use community input on potential risks and mitigation ideas here.

What registries should we support?

How will "search" work?

API Shape

See OpenAPI PR here.

mcp.json Schema

TBD: will likely be similar to/derived from the OpenAPI shape above.

Open questions

Not comprehensive and likely will evolve, but some questions we acknowledge are not yet fully solved: