How to Build an MCP Server Registry and Govern MCP at Scale
- An MCP server registry is a curated, governed catalog of every Model Context Protocol server your organization allows agents to connect to, with ownership, risk tier, auth method, and version pin recorded for each entry.
- The official MCP Registry (launched in preview September 8, 2025) is a minimal upstream catalog for *discovery*, not a vetting or governance tool, so enterprises must run a private sub-registry on top of it.
- Extend the official
server.jsonschema with governance fields: owner, data classification, auth method, pinned version, last review date, dependent agents, and risk tier. - The lifecycle runs discovery to vetting to approval (with version pinning) to monitoring to re-vetting on update to deprecation - a registry entry is a living record, not a one-time signoff.
- Roll out enforcement in phases: log-only, then alert, then block unvetted servers at a gateway, so you build coverage before you break developer workflows.
- Verified risk is real: researchers found 1,862 MCP servers exposed without authentication, and
mcp-remotecarried a remote code execution flaw (CVE-2025-6514) - an unvetted server is an unvetted dependency with tool-call reach into your data.
Every AI agent your developers run reaches the outside world through tools, and increasingly those tools arrive as MCP servers - Model Context Protocol connectors that grant an agent the ability to read a database, call an API, browse a repo, or run a shell command. The protocol is open and the ecosystem is enormous, which is exactly the problem. A community server installed in thirty seconds becomes a live dependency with tool-call reach into your data, and nobody on the security team knows it exists.
An MCP server registry is how you take that sprawl back. It is a curated, governed catalog of every server your agents are allowed to connect to, with ownership, risk, authentication, and an approved version recorded for each. This guide covers what a registry is, how the official one differs from the one you actually need, the schema and lifecycle to build, and the concrete controls a security team puts in place to govern MCP at scale.
What an MCP server registry is
A registry is the source of truth for which MCP servers are sanctioned, who owns them, and how they may be used. It is not a marketplace and it is not documentation. It is a control surface: a place where an approval decision is recorded, a version is pinned, a risk tier is assigned, and a gateway can check whether a given server is allowed before an agent connects to it.
Think of it the way you already think about an internal package registry or an approved-software list. The unit of governance is a single server entry. Each entry answers the questions an auditor or an incident responder will ask: what is this, what can it touch, who signed off, what version are we running, and which agents break if we pull it.
The official MCP Registry is not a governance tool
In September 2025 the MCP project launched the official MCP Registry in preview - a minimal upstream catalog where server authors publish their servers and consumers discover them. It is genuinely useful for what it is: a canonical place to find servers and their metadata, anchored on a published server.json schema.
But it is built for discovery and publication, not for governance. It does not vet code, assign an accountable owner inside your org, pin a server to the specific version you approved, classify the sensitivity of the data a server touches, or enforce who is allowed to install what. Treating the public registry as your control plane is like treating npm as your software-approval process. You use it as an upstream source and build a private sub-registry that adds the governance layer on top.
| Capability | Official MCP Registry | Enterprise sub-registry |
|---|---|---|
| Find available servers | Yes | Yes (mirrors upstream) |
| Vet code and permissions | No | Yes |
| Assign an internal owner | No | Yes |
| Pin to an approved version | No | Yes |
| Classify data sensitivity | No | Yes |
| Enforce an allowlist at runtime | No | Yes (via gateway) |
| Audit trail of approvals | No | Yes |
How the schema works: extend server.json
You do not need to invent a format. Start from the official server.json schema - it already carries the server name, description, package source, and runtime details - and extend it with the governance fields that turn a package descriptor into a governable record.
The added fields are what your approval process, your gateway, and your auditors actually consume. At minimum, capture the following on every entry:
- Owner - a single named, accountable person or team. Unowned servers are deprecation candidates.
- Data classification - the most sensitive data class the server's tools can read or write (public, internal, confidential, regulated).
- Auth method - how the server authenticates, e.g. OAuth, API key, or none. See OAuth for MCP servers explained for what good looks like.
- Pinned version - the exact approved version or digest, not just the server name.
- Last review date and reviewer - when it was last vetted and by whom.
- Dependent agents - which agents are cleared to use it (this links the registry to your agent inventory).
- Risk tier - a coarse rating driven by data class, blast radius, and auth strength.
- Approval status - proposed, approved, restricted, or deprecated.
{
"name": "io.github.acme/postgres-mcp",
"description": "Read-only Postgres query server",
"packages": [{ "registry_type": "npm", "identifier": "@acme/postgres-mcp" }],
"x-anomity-governance": {
"owner": "[email protected]",
"data_classification": "confidential",
"auth_method": "oauth",
"pinned_version": "1.4.2",
"last_review": "2026-06-10",
"reviewer": "appsec",
"dependent_agents": ["sales-copilot", "analytics-bot"],
"risk_tier": "high",
"approval_status": "approved"
}
}
Namespacing your fields under an x- extension keeps you compatible with the upstream schema while letting tooling validate the governance block independently.
How it applies to AI agents and MCP
The reason a registry matters more for MCP than for ordinary software is the combination of autonomy and reach. An agent chooses which tools to call based on a prompt, and a single MCP server can expose dozens of tools. That makes every connected server a piece of your attack surface that activates without a human in the loop.
The risk is not theoretical. Researchers at Knostic found 1,862 MCP servers exposed to the internet with no authentication at all - anyone who found one could invoke its tools directly. Separately, the widely used mcp-remote connector carried a critical remote code execution vulnerability tracked as CVE-2025-6514 (CVSS 9.6), triggered when the proxy connected to a malicious server. Both are textbook supply-chain exposure: an unvetted server is an unvetted dependency, and the agent will call it without asking.
Connected MCP servers also widen the blast radius for prompt injection. When an agent can read untrusted content and call powerful tools and reach sensitive data, you have the conditions for the lethal trifecta of AI agent data exfiltration. A registry does not stop injection on its own, but it bounds the trifecta by controlling which high-reach servers are even reachable.
This is why MCP governance and discovery are inseparable. As we argue in AI agents are the new shadow IT, you cannot govern what you have never enumerated, and the full picture only exists when your MCP server security program is backed by a registry that knows what is actually running.
The MCP server lifecycle
A registry entry is a living record, not a one-time signoff. The lifecycle has six stages, and the value comes from running every server through all of them - especially the ones teams skip, like re-vetting on update and deprecation.
1. Discovery
You cannot govern servers you cannot see. Discovery means finding every MCP server already in use across the fleet - in IDE configs, agent settings, CI runners, and developer machines - not just the ones someone remembered to register. This is the same scanning problem we describe in what we found scanning AI configs: the gap between declared and actual is where the risk lives.
2. Vetting
Each discovered server gets reviewed before approval: read the code or audit the package, check the maintainer and update history, inspect the tool definitions for over-broad permissions, confirm the auth method, and pull dependencies for known vulnerabilities. Watch specifically for hidden instructions in tool descriptions - the MCP tool poisoning pattern hides attacker text exactly where an agent will read it.
3. Approval with version pinning
Approval writes the registry entry: owner, risk tier, data class, and the pinned version. Pinning is non-negotiable. If you approve postgres-mcp by name but not by version, a compromised update ships straight into your agents - the same dynamic behind the npm worm and credential-stealer campaigns covered in our AI supply chain attacks defender's guide.
4. Monitoring
Once a server is approved and in use, watch how it actually behaves: which agents call it, what tools they invoke, what data flows out. Static vetting cannot catch a server that is abused at runtime through injection or that quietly changes behavior. Pair the registry with runtime monitoring and anomaly detection for AI agents so a vetted-but-abused server still surfaces.
5. Re-vetting on update
When a new version is published, the pinned approval no longer applies. The update goes back through vetting before the pin moves. This is the stage that defeats slow-burn supply-chain attacks, where a package earns trust and then turns malicious in a later release.
6. Deprecation
Servers that lose their owner, fail re-vetting, or fall out of use are marked deprecated and removed from the allowlist. The dependent-agents field tells you exactly which agents break first, so deprecation is a planned migration rather than an outage.
Concrete controls: rolling out enforcement in phases
The fastest way to fail at MCP governance is to start by blocking things. You will break working agents, developers will route around you, and your registry will be both incomplete and resented. Roll out enforcement in three phases at an MCP gateway or proxy - a chokepoint all agent-to-server traffic passes through.
| Phase | Gateway behavior | What you gain |
|---|---|---|
| 1. Log-only | Record every server an agent connects to; block nothing | Real inventory of what is actually in use; a baseline |
| 2. Alert | Flag connections to unvetted or unpinned servers | Owners get nudged to register; security sees drift early |
| 3. Enforce | Block servers not in the approved registry | An allowlist that is real, with known exceptions |
The sequence matters because each phase builds the data the next one needs. Log-only populates the registry from reality. Alerting drives owners to get servers vetted while nothing is broken. Only when coverage is high and the allowlist is trusted do you flip to enforcement. A gateway also gives you the central logging that feeds your AI agent audit trail.
Alongside the gateway, apply these standing controls:
- Least privilege per server - scope each server's tools and credentials to the minimum its job requires; see least privilege for AI agents.
- Strong auth, no anonymous servers - require OAuth or scoped keys; the 1,862 exposed servers were all auth-free.
- Secrets isolation - never let a server hold long-lived broad credentials; follow secrets management for AI agents.
- A written policy - codify what is allowed in an AI acceptable use policy for agents and MCP so the registry has rules to enforce.
- Linkage to identity - tie each server and agent to a governed identity so actions are attributable; see non-human identity governance.
A pragmatic build order
- Stand up a gateway in log-only mode and capture what agents actually connect to.
- Define the extended
server.jsonschema with your governance fields. - Seed the registry from discovery - every server already in use becomes a proposed entry.
- Vet the high-reach servers first (anything touching confidential or regulated data).
- Assign owners; deprecate anything no one will own.
- Pin approved versions and turn on update alerts.
- Move the gateway to alert, then enforce, once coverage is high.
- Wire runtime monitoring so abuse of vetted servers is still caught.
Where continuous MCP visibility fits
A registry is only as good as your knowledge of what is actually running against it. The hard part is not the schema - it is keeping the catalog honest as developers add servers, versions drift, and agents multiply across IDEs, CI, and laptops. That is the discovery problem Anomity is built for: continuously finding every agent and MCP server across the fleet, reconciling them against the approved registry, flagging unvetted or unpinned servers, and watching runtime behavior for anomalies. The registry is the policy; continuous visibility is what keeps it from quietly going stale. You can read how that discovery works in inside Anomity discovery.
Build the registry first regardless of tooling - the schema, the lifecycle, and the phased gateway are durable practices. Then make sure something is watching the gap between what the registry says and what your fleet is really doing, because that gap is exactly where the next unvetted server is being installed right now.
Frequently asked questions
What is an MCP server registry?
An MCP server registry is a curated catalog of the Model Context Protocol servers your organization permits AI agents to use. Each entry records what the server does, who owns it, how it authenticates, what data class it touches, the approved (pinned) version, and the agents that depend on it. It is the source of truth your gateway and approval process enforce against, turning an uncontrolled sprawl of community servers into a governed, auditable set.
Is the official MCP Registry enough for enterprise governance?
No. The official MCP Registry, launched in preview on September 8, 2025, is a minimal upstream catalog designed for discovery and publication. It tells you a server exists and where to get it; it does not vet code, assign ownership, pin versions to your approved build, classify data sensitivity, or enforce who can install what. Enterprises should treat it as an upstream source and build a private sub-registry that adds the governance layer on top.
What fields should an enterprise MCP registry track beyond server.json?
Start from the official server.json schema and extend it with governance metadata: an accountable owner, data classification, authentication method, the pinned/approved version, the last review date and reviewer, the list of dependent agents, a risk tier, and an approval status. These fields are what turn a package descriptor into a governable record you can audit, re-vet, and deprecate.
How do I roll out MCP enforcement without breaking developer workflows?
Phase it. Start in log-only mode at an MCP gateway or proxy so you capture which servers agents actually call without blocking anything. Move to alerting once you understand the baseline and have a registry populated. Only then switch to enforcement, blocking servers that are not in the approved registry. This sequence builds coverage and an allowlist before you introduce any failure mode, and it gives owners time to get their servers vetted.
Why does version pinning matter for MCP servers?
An MCP server is a live dependency with tool-call access to your data and systems, and most are installed from package registries that can change underneath you. If you approve a server but track only its name, a malicious or compromised update ships straight into your agents. Pinning to an approved version and re-vetting on every update is the same supply-chain discipline you already apply to libraries - see our AI supply chain attacks guide for why that matters.
What real risks come from unvetted MCP servers?
Two verified examples make the case. Researchers at Knostic found 1,862 MCP servers exposed to the internet without any authentication, meaning anyone could invoke their tools. Separately, the widely used mcp-remote connector carried a critical remote code execution vulnerability tracked as CVE-2025-6514 (CVSS 9.6, affecting versions 0.0.5 through 0.1.15, fixed in 0.1.16). An unvetted MCP server is an unvetted dependency that an agent will happily call, so registry vetting and version pinning are direct controls against both classes of risk.
How does an MCP registry relate to an AI agent inventory?
They are two halves of the same visibility problem. An AI agent inventory tells you which agents exist and what they can do; an MCP server registry tells you which tools and data sources those agents are allowed to reach. The dependent-agents field links the two: when you deprecate a server you know which agents break, and when you onboard an agent you know which servers it is cleared to use. Most teams build both together.
Who should own MCP server vetting?
Vetting is a shared responsibility with a single accountable owner per server. Security or a platform team typically owns the registry, the schema, the gateway, and the approval gate; the engineering team that introduced or depends on a server owns its entry, its risk justification, and its re-vetting. GRC consumes the registry for audit evidence. The key rule is that every entry has one named owner - unowned servers are deprecation candidates.
Can a registry stop a malicious MCP server on its own?
No. A registry is a control point, not a guarantee. Vetting catches known-bad code and risky permissions at approval time, and pinning plus a gateway allowlist stops unvetted servers from being reached. But a previously clean server can be compromised, or a vetted server can be abused through prompt injection at runtime. That is why the lifecycle pairs static vetting with continuous runtime monitoring for anomalous tool calls and data flows.




