The State of MCP Registries
Kunal SinghTable of Contents
What is MCP - Model Context Protocol
The modelcontextprotocol.io describes MCP in its fundamental form as “The USB-C for AI Applications”. The Model Context Protocol allows applications to interact with the outer world with a simple plug-and-play architecture, solving the limited context problem that previous models of AI applications faced. The registry is at https://registry.modelcontextprotocol.io/
The architecture consists of 2 components: the MCP Client and the MCP Server. Examples of MCP Clients include Claude Code, VSCode, Cursor, etc., and examples of MCP Servers include Exa AI Search, SafeDep VET MCP, etc.
The Client part was sorted, but the server side was not. Discovering them was tedious, finding the current way of installing was painful, managing the state was difficult, and it was all manual. While most people were already publishing their MCPs in NPM and Docker registries, uniformity was needed. Every Client used to have their own “syntactic sugar” for “Installing MCP,” much like Cursor has here: https://cursor.com/docs/context/mcp/directory.
This is a sample .vscode/mcp.json file as instructed in their docs: https://docs.github.com/en/copilot/how-tos/provide-context/use-mcp/extend-copilot-chat-with-mcp
{ "inputs": [ // The "inputs" section defines the inputs required for the MCP server configuration. { "type": "promptString" } ], "servers": { // The "servers" section defines the MCP servers you want to use. "fetch": { "command": "uvx", "args": ["mcp-server-fetch"] } }}A Cursor Install link would look like:
cursor://anysphere.cursor-deeplink/mcp/install?name=Vercel&config=eyJ1cmwiOiJodHRwczovL21jcC52ZXJjZWwuY29tIn0MCP Registry to the rescue
Anthropic released an official MCP registry a few months back, meant to become the holy grail of everything involving discovering MCP servers. They say it’s a “Single source of truth for MCP servers”. Blog post link: https://blog.modelcontextprotocol.io/posts/2025-09-08-mcp-registry-preview/
This is actually a kind of meta-registry—a registry that stores metadata and installation instructions while the actual artifacts remain in package registries like NPM, PyPI, Container Registry, etc. It stores basic metadata with the actual installation command for the MCP server so that it becomes easy for Clients to simply run them.

It is an easy way to publish your MCP server for discovery and makes it even easier for Client Maintainers to install and use these servers.
However, it is not polished—seriously and fundamentally—since their primary goal is “to standardize how servers are distributed and discovered, providing a primary source of truth that sub-registries can build upon.”

Consuming MCP Registry Packages
For an MCP Client to use an MCP server from the official registry, it just needs to make an HTTP GET request:
List all versions of a server:
curl --request GET \ --url https://registry.modelcontextprotocol.io/v0.1/servers/{server_name}/versions \ --header 'Accept: application/json, application/problem+json'Getting a specific version of a server:
curl --request GET \ --url https://registry.modelcontextprotocol.io/v0.1/servers/{server_name}/versions/{server_version} \ --header 'Accept: application/json, application/problem+json'Let’s see the response for our own vet MCP server. The server_name will be io.github.safedep/vet-mcp and the version will be 1.12.16.
curl -fsSL --request GET --url https://registry.modelcontextprotocol.io/v0.1/servers/io.github.safedep%2Fvet-mcp/versions/1.12.16 --header 'Accept: application/json, application/problem+json' | jqResponse:
{ "server": { "$schema": "https://static.modelcontextprotocol.io/schemas/2025-10-17/server.schema.json", "name": "io.github.safedep/vet-mcp", "description": "Protect your AI agents and IDEs from malicious open-source packages.", "title": "SafeDep Vet MCP", "repository": { "url": "https://github.com/safedep/vet", "source": "github" }, "version": "1.12.16", "websiteUrl": "https://safedep.io", "icons": [ { "src": "https://raw.githubusercontent.com/safedep/.github/9275c7d1b59f718d73e47cecd93df92e7bfbea25/assets/logo/safedep-logo-darkshade.svg", "mimeType": "image/svg+xml", "sizes": ["48x48", "96x96"], "theme": "light" }, { "src": "https://raw.githubusercontent.com/safedep/.github/9275c7d1b59f718d73e47cecd93df92e7bfbea25/assets/logo/safedep-logo.svg", "mimeType": "image/svg+xml", "sizes": ["48x48", "96x96"], "theme": "dark" } ], "packages": [ { "registryType": "oci", "identifier": "ghcr.io/safedep/vet:v1.12.16", "runtimeHint": "docker", "transport": { "type": "stdio" }, "runtimeArguments": [ { "type": "named", "name": "--rm" }, { "type": "named", "name": "-i" } ], "packageArguments": [ { "value": "-s", "type": "positional" }, { "value": "/tmp/vet-mcp.log", "type": "named", "name": "-l" }, { "value": "server", "type": "positional" }, { "value": "mcp", "type": "positional" } ] } ] }, "_meta": { "io.modelcontextprotocol.registry/official": { "status": "active", "publishedAt": "2025-12-10T10:58:13.018394Z", "updatedAt": "2025-12-10T10:58:13.018394Z", "isLatest": true } }}We see lots of information about the server; the most important bit is packages. The packages section contains the actual artifact available to install and run the server in the client. We can also have multiple packages, and the client has the freedom to choose any.
If we parse the package info, we will end up with:
docker run --rm -i ghcr.io/safedep/vet:v1.12.16 -- -s -l /tmp/vet-mcp.log server mcpThe entire API documentation is at: https://registry.modelcontextprotocol.io/docs
Sub Registries
You remember we mentioned that the official MCP registry is not polished? One of the reasons is the amount of unchecked data it has. Since publishing the same MCP server with the same version is allowed, what is happening is people are publishing their MCPs in CIs, causing duplicate entries for the same servers.
We tried to analyze the data in the registry, and to our surprise, for only 1691 unique underlying npm, pypi, etc. packages, there are about 64.7 Million server entries having a one-to-many relationship with 48.5 Million packages.
The number clearly shows how massive and duplicated the meta-registry is.
The servers are published with few authentication mechanisms, like GitHub OIDC or DNS verification for domains, but the issue of typosquatting still exists.
Need for a Vetted Sub registry
The official MCP registry has successfully solved the problem of discovery. The next challenge for the community is to solve the problem of trust. As MCP moves from experimental hobby projects to enterprise AI agents, the existence of a curated, security-first sub-registry will be the deciding factor in its adoption.
- engineering
- security
- ai
- mcp
Author
Kunal Singh
safedep.io
Share
The Latest from SafeDep blogs
Follow for the latest updates and insights on open source security & engineering

npm SANDWORM_MODE Attack: Step-by-Step Malware Analysis
Step-by-step technical analysis of the SANDWORM_MODE npm supply chain attack. We dissect yarsg and format-defaults malicious packages, decode multi-layer obfuscation, and trace the payload delivery...

Why We Built a Hosted MCP Server to Stop Malicious Packages for AI Agents
Exposing an MCP server is trivial. Making it useful for AI agents is not. Here's what we learned dogfooding our own tool, and why we built a hosted MCP server backed by real-time open source threat...

AI Agent Cline v2.3.0 Compromised: From Prompt Injection to Unauthorized npm Publish
A compromised npm token was used to publish a tampered version of Cline CLI. A prompt injection vulnerability in Cline's AI-powered GitHub Actions workflow may have enabled the credential theft.

End-to-End test with Nextjs, Playwright and MSW
A practical Next.js 16 App Router E2E setup with Playwright and MSW that keeps server-side fetch deterministic by focusing mocking where it matters, not on server actions.

Ship Code
Not Malware
Install the SafeDep GitHub App to keep malicious packages out of your repos.
