What Is the MCP Registry and How to Search It
The MCP Registry at registry.modelcontextprotocol.io is the official public catalog of MCP server metadata. Each entry is a server.json file that gives the server's name, description and version, plus where to get it: an npm, PyPI or Docker package, or a remote URL. Anyone can search it through a REST API without signing in. Publishing is different, because you have to prove you control the namespace in the server's name.
What the registry holds
The registry stores metadata, not code. It doesn't host server packages. A server.json entry points at a package on npm or PyPI, a Docker image, or a URL where a remote server runs, and the client downloads or connects from there. The registry's quickstart says it plainly: "The MCP Registry only hosts metadata, not artifacts."
The registry is in preview, and the project says breaking changes or data resets can happen before general availability. The official docs say it's meant to be read mainly by aggregators: marketplaces that add ratings, security checks or curation on top. Host apps are supposed to read those marketplaces, not the registry itself.
Some clients already read a registry directly. VS Code's MCP gallery calls a URL set by chat.mcp.gallery.serviceUrl and sends search, version=latest and cursor parameters, the same ones described below. Organizations can point it at their own registry. The VS Code docs describe the gallery, and the VS Code enterprise settings describe the McpGalleryServiceUrl policy.
The server.json entry
Every server in the registry has a server.json. The publisher writes it, and the registry checks it when you publish. These are the fields you'll see most:
| Field | Rules |
|---|---|
name | Required. Reverse-DNS form, namespace/server-name, with exactly one /. 3 to 200 characters, using letters, digits, ., - and _. |
description | Required. 1 to 100 characters. Describe what the server does, not how it's built. |
version | Required. A specific version such as 1.0.2. Version ranges are rejected. Up to 255 characters. |
title | Optional. A display name of up to 100 characters. |
repository | Optional, but recommended. Has url and source, such as github. |
websiteUrl | Optional. Homepage or documentation link. |
packages | Optional. Describes a server a client runs locally, with registryType, identifier, version and transport. |
remotes | Optional. Describes a server a client connects to over a URL, such as streamable-http. |
_meta | Optional. On publish, only the io.modelcontextprotocol.registry/publisher-provided key is kept, up to 4KB. |
Here's a complete remote server entry. The name and domains are fictional:
{
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
"name": "io.github.acme/weather-server",
"title": "Weather",
"description": "Current conditions and forecasts for any city.",
"repository": {
"url": "https://github.com/acme/weather-server",
"source": "github"
},
"version": "1.0.0",
"remotes": [
{
"type": "streamable-http",
"url": "https://mcp.example.com/weather"
}
]
}
The registry's validator checks a file without publishing it. The official API docs list POST /v0.1/validate for this, and mcp-publisher validate uses it. Sending the sample above returns valid: true:
{"valid":true,"issues":[]}
If you change version to ^1.0.0, the validator reports:
{"valid":false,"issues":[{"type":"semantic","path":"version","message":"version must be a specific version, not a range: \"^1.0.0\"","severity":"error","reference":"version-looks-like-range"}]}
The published JSON schema for server.json describes the shape of the file but doesn't reject ranges in version, so run the validator when you need that check.
Namespaces: who can publish a name
The part of the name before the slash is a namespace, and it has to belong to you. The sign-in method you use decides which namespace you can publish under:
| Sign-in method | Name must start with | Example |
|---|---|---|
| GitHub | io.github.<username>/ or io.github.<orgname>/ | io.github.alice/weather-server |
| Domain, by DNS or HTTP proof | the reverse of your domain, such as com.example/ | com.example/weather |
This is why the registry can say a name is verified. The check is on the account or domain, not on the server's code. The registry also doesn't accept private servers. Servers on a private network or private package feed are out of scope, and the docs suggest running your own private registry for those. The publish guide covers the sign-in and the commands.
Packages in a server.json must come from public registries: npm (registryType npm), PyPI (pypi), NuGet (nuget), crates.io (cargo), Docker or OCI images (oci), and MCPB files on GitHub or GitLab releases (mcpb). Each type has its own ownership check, which the package types page lists.
Search the registry
The REST API is public and read-only. Reading it doesn't need a sign-in. These are the endpoints:
| Request | Returns |
|---|---|
GET /v0.1/servers | One page of servers. |
GET /v0.1/servers/{serverName}/versions | Every version of one server. |
GET /v0.1/servers/{serverName}/versions/{version} | One version. Use latest for the newest. |
Server names contain a slash, so URL-encode it as %2F. The query parameters on the list endpoint are:
| Parameter | What it does |
|---|---|
search | Case-insensitive substring match on the server name. |
version | latest returns one entry per server, the newest version. |
limit | Page size. |
cursor | The nextCursor value from the previous page. Treat it as opaque. |
updated_since | Servers updated after an RFC 3339 timestamp, for syncing. |
include_deleted | Includes servers with status deleted, which are hidden by default. |
Search for soil, one result per server:
curl "https://registry.modelcontextprotocol.io/v0.1/servers?search=soil&version=latest&limit=1"
The response, trimmed:
{
"servers": [
{
"server": {
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
"name": "dev.nativesoil/soil",
"description": "Save an AI chat's working state, load it in any other model or provider. Verified, secret-safe.",
"title": "Native Soil",
"version": "1.0.0",
"websiteUrl": "https://nativesoil.dev",
...
"remotes": [
{
"type": "streamable-http",
"url": "https://mcp.nativesoil.dev/mcp/soil"
}
]
},
"_meta": {
"io.modelcontextprotocol.registry/official": {
"status": "active",
"statusChangedAt": "2026-06-23T20:53:05.746852Z",
"publishedAt": "2026-06-23T20:53:05.746852Z",
"updatedAt": "2026-06-23T20:53:05.746852Z",
"isLatest": true
}
}
}
],
"metadata": {
"nextCursor": "dev.nativesoil/soil:1.0.0",
"count": 1
}
}
A few things to know from that call and from testing the API:
- Leave out
version=latestand you get every version. In our test,limit=2with no filter returnedac.inference.sh/mcptwice, once per version. - Search only looks at names.
search=soilmatched four servers whose names contain "soil", and none of the servers that only mention soil in their description. - Pagination uses
nextCursor. Pass the value back ascursor=to get the next page. WhennextCursoris missing or empty, you've reached the end. - Some searches are slow. In our tests, a few took more than 30 seconds, so give your client a generous timeout.
To read one server, request its latest version:
curl "https://registry.modelcontextprotocol.io/v0.1/servers/ai.precip%2Fweather/versions/latest"
Each response carries registry-managed fields under _meta in io.modelcontextprotocol.registry/official. Their status is active, deprecated or deleted. A deprecated server still appears with a message. A deleted one is hidden from default results, and the registry says deletion usually means the server broke its moderation policy.
Common misconceptions
"The registry runs or hosts the servers." It doesn't. It stores metadata and points at packages or remote URLs. Your client still installs the package or connects to the remote URL.
"Listed means reviewed or safe." The registry checks namespace ownership and package ownership, and it can remove spam or malicious entries. It doesn't scan the code. The docs leave security scanning to the package registries and to marketplaces built on top.
"Publishing here makes my server show up in Claude or ChatGPT." Host apps don't read the registry directly. Marketplaces and directories read it, and some apps read their own gallery sources. Getting listed in those is a separate step covered in list in MCP directories.
"The list shows each server once." Only with version=latest. Without it, every version appears.
Common problems
version must be a specific version, not a range
The version field holds a range such as ^1.0.0 or 1.x. Replace it with an exact version such as 1.0.0. The validator output in the section above shows this error.
Registry validation failed for package
The package doesn't contain the ownership marker the registry looks for, such as mcpName in an npm package.json. The publish guide walks through each package type.
You do not have permission to publish this server
The name's namespace doesn't match the account you signed in with. A GitHub sign-in must publish under io.github.<your-username>/. See the namespaces table above.
FAQ
Is the MCP Registry the same as a marketplace?
Not quite. The MCP Registry is the metadata source. Marketplaces and directories read it and add their own features, such as ratings, reviews and curation. The official docs say host apps should read those marketplaces rather than the registry itself.
Do I need to sign in to search the MCP Registry?
No. The read API is unauthenticated, so you can search it and read any server entry from a terminal. Signing in is only required to publish a server.
Can I keep a private MCP server out of the registry?
Yes, by not publishing it. The official registry doesn't accept servers that only live on a private network or a private package feed. Teams that want an internal catalog can run their own registry that implements the same API.
Why does the same server appear several times in search results?
Each published version is a separate entry. Add version=latest to the request to get one entry per server.
- How to find MCP serversOfficial registry, vendor servers and directories, and how to compare them.
- MCP server examplesReal servers by use case, from the reference set and from vendors.
- Publish to the MCP RegistryNamespace sign-in, server.json, versions and GitHub Actions.
- Evaluate an MCP server before you install itA checklist for publisher, permissions, source and pinned versions.
- List your MCP server in directoriesMake a listing trustworthy so directories and users pick it up.