Yves Habchy

What actually happens when you install an MCP server in 2026

By Yves Habchy · August 2026

This article is a companion to the open-source utility mcp-audit at github.com/Yveshby27/mcp-server-audit. Written from the outside as a working developer, not from any position inside the ecosystem.


I am a software engineer. I am not the maintainer of any MCP server currently on Anthropic's directory, and I have no horse in the race between the various tools trying to make sense of ecosystem quality. I am the person on the other end. The developer typing npx -y @some/mcp-thing into a config file, pressing return, and hoping the agent still works after.

Over the last few months, that experience has been consistently worse than the ecosystem's marketing implies. Something goes wrong on install roughly a third of the time. When it does, the failure is almost always silent from the agent's perspective. The tool disappears from the session, or the schema is quietly rejected, or the process exits with an error that never surfaces upstream. You keep working, wonder why the agent seems stupider than yesterday, and eventually notice one of the servers you thought you installed never actually loaded.

This piece is about why that happens, what the failure modes look like at the mechanical level, and why an install-time audit turns out to be a more useful position on the problem than I initially expected. I am writing it from having built a small utility (mcp-audit, MIT, open-source) that runs four checks against any MCP server before you install it. Building the utility taught me most of what follows.

What the ecosystem actually looks like

The public picture of MCP in mid-2026 is a fast-growing directory of thousands of servers across six-plus public registries. The private picture is what you find when you actually audit them.

A team at the University of Delaware did the largest survey to date, on 67,057 MCP servers:

"We analyze 67,057 servers across six public registries and identify widespread conditions enabling server hijacking and invocation manipulation. We further implement MCPInspect, a pre-integration analysis tool that detects misleading tool metadata and exploitable code vulnerabilities, identifying 833 vulnerable servers and 18 with suspicious descriptions."

Xiaofan Li, Xing Gao (University of Delaware, DSN 2026). arxiv 2510.16558.

Their structural diagnosis of why 833 vulnerable servers landed in public registries in the first place is one sentence:

"MCP registries are open platforms allowing anyone to publish servers. However, these registries lack effective security scrutiny mechanisms."

A separate first-glance paper's aggregate stats confirm the pattern from a different measurement axis:

"5.5% exhibit MCP-specific tool poisoning [...] 7.2% of servers contain general vulnerabilities [...] 66% exhibit code smells [...] 14.4% contain ten bug patterns overlapping prior research."

Two-thirds of MCP servers have code smells. About one in fourteen has a documented general vulnerability. About one in eighteen is quietly poisoning the tool metadata itself, which the same paper explains is enough on its own to compromise the agent's behavior:

"A malicious description alone steers the FM to misuse an otherwise legitimate tool."

The registries know the mechanism. The community security-audit project at ModelContextProtocol-Security opens its README with the low-friction publish side:

"Anyone can create MCP servers and Desktop Extensions, no programming experience required."

That is the shape. Anyone can publish. Nobody checks. And it is not just an academic worry: a separate paper puts the registry-admission gate in one sentence:

"Registry admission requires only proof of GitHub repository or domain ownership: it does not require code review, security audit, or malware scanning."

"Securing the Model Context Protocol (MCP): Risks, Controls, and Governance", arxiv 2511.20920.

What the failure modes look like from the user's side

The papers give you the shape at scale. The individual dev's experience is more specific and, honestly, a lot more annoying.

A recurring pattern from Anthropic's own claude-code issue tracker, on installing an MCP server with what looked like valid config:

"It doesn't tell you what the exact issue with the configuration is. I tried various things before eventually stumbling on the string format as the correct solution."

cph-datamasque, claude-code#4109, 2025-07.

The same user, on Anthropic's own docs for the MCP config surface:

"The documentation here is also insufficient [...] it doesn't document the type parameter nor the format/optional-ness of the parameters."

Another user, on a working MCP that stopped working after Claude Code v2.0.21 shipped:

"Claude Code v2.0.21 introduced strict MCP tool schema validation that breaks previously working MCP servers without providing: 1. A way to opt-out of validation 2. Warning about the breaking change 3. Graceful degradation (disable problematic MCPs instead of blocking entire session)."

PHMD, claude-code#10606, 2025-10.

Another, on a schema surface where the same server passes one host and fails another:

"mcp server working on Claude desktop but crashing claude code: [...] tools.16.custom.input_schema: JSON schema is invalid. It must match JSON Schema draft 2020-12."

vdt4534, claude-code#1690, 2025-06.

Another, from the same class of failure on a different community server:

"tools.136.custom.input_schema: input_schema does not support oneOf, allOf, or anyOf at the top level. [...] Claudesidian MCP works as expected with Claude Desktop, but not with Claude Code."

rafstahelin, claudesidian-mcp#6, 2025-06.

Another, on Stripe's own official MCP server:

"The Stripe MCP server (@stripe/mcp v0.2.3) hangs indefinitely when Claude Desktop sends an initialize request with protocolVersion 2025-11-25. The server receives the initialize message but never responds. After 60 seconds, the client times out."

miqcie, stripe/ai#290, 2026-03.

Another, on the official reference GitHub MCP server:

"all tool executions fail with the error: MCP error -32603: fetch is not defined. This appears to be due to a missing dependency on node-fetch in the published package."

circuitfive, modelcontextprotocol/servers#1065, 2025-03.

Another, on an MCP server that appears to install fine and then silently dies at first use:

"Failed to run server: No module named 'fitz'. Server transport closed unexpectedly, this is likely due to the process exiting early."

aayushrajj, modelcontextprotocol/servers#1836, 2025-05.

The pattern across all of these is not any one specific failure. It is the class of failures that a first-time install lands in. Undocumented config format. Working server that breaks after a client update. Same server passes one client, fails another. Vendor-published production server hangs on handshake with a protocol version the client sends by default. Reference server missing a runtime dependency. Server dies immediately on first invocation because a Python module is not installed.

Any single one of these is a bug in a specific place. The class of them is the ecosystem asking every individual developer to solve the same puzzle from scratch every time they install a new server. That puzzle has an average time cost measured in hours. The mcp-audit utility exists to make that cost about a second instead.

What brand does and does not tell you

If you have not paid attention to MCP quality issues before, one reasonable heuristic is "just install servers from Anthropic and named vendors." That heuristic partially works.

I ran mcp-audit against four of Anthropic's own reference servers this week: server-everything, server-memory, server-filesystem, server-sequential-thinking. All four passed clean on install-time validation, capability declaration, and tool schema validity. The heuristic is not zero-signal.

But the heuristic is weaker than the branding suggests, and independent audits keep showing it.

The paper introducing MCPGuard cites, as its motivating example:

"A representative example is CVE-2025-49596, a critical remote code execution vulnerability recently disclosed in Anthropic's official MCP Inspector tool."

arxiv 2510.23673, Section 3.2.

Teng Li's independent lint audit of 36 popular MCP servers, using his own mcpgrade tool, reported that "11 received D/F grades, including MongoDB's official server (66 errors), Notion's official server (62), Airtable (69, 66 errors), todoist-mcp-server (67, 110 errors), GitHub's archived reference server (67, 44 errors), and firecrawl-mcp (57, 134 errors)."

Vendor-official MCPs failing basic quality gates. The reference GitHub MCP shipping without a runtime dependency. Anthropic's own Inspector tool getting a critical CVE. This is not a one-bad-apple ecosystem. It is an anyone-can-publish, nobody-checks, brand-is-not-a-substitute-for-validation ecosystem.

The audit I ran on Anthropic's four reference servers passing clean is a data point, not a promise. Running the same audit against Context7 (Upstash's popular community MCP server), with a default 5-second timeout, surfaced a CRITICAL finding because the npx -y first-run download and compile takes 30 to 120 seconds. With a 120-second timeout, the audit passes clean. Both readings are true and both matter. A first-time user installing Context7 will experience the first behavior, not the second, and the first behavior is what will silently break their agent session while they wait for a handshake that never fires within the client's default timeout.

The hypothesis this all points at

The install-time gap in MCP is not a lack of tooling. Several projects (mcpgrade, MCPJam, Runlayer, Reticle, MCPwn, mcp-fortress, mcpserver-audit, mcpguard) are working the ecosystem-level quality question from different angles. The gap is a specific missing position: run a check that takes a second, before you install, that catches the four highest-frequency install-time failure modes, and returns a scriptable exit code.

That is what mcp-audit is. Four checks:

  • Handshake sanity. Server starts, responds to initialize within timeout, shuts down cleanly on stdin close.
  • Descriptor well-formedness. Initialize response has protocolVersion, serverInfo, capabilities. Every tool, resource, and prompt entry has its required fields.
  • Capability-declaration consistency. Declared capabilities match what list calls actually return. Flags declared-but-not-implemented and implemented-but-not-declared.
  • Tool schema validity. Each declared tool's inputSchema and outputSchema is well-formed JSON Schema Draft 2020-12 per meta-validation.

None of these checks is deep. All of them are meta-checkable properties of the server's own self-description. The point of running them at install time is that most of the pain reports quoted earlier (schema violations, capability mismatches, missing required fields, protocol timeouts) are catchable in the second before the server enters your config, not in the afternoon after it silently fails.

The scope discipline matters. Security-boundary checks (vulnerability patterns, credential exfiltration, unsafe defaults, auth-boundary violations) belong in mcp-audit v0.2, not v0.1. Runtime spec-compliance beyond the handshake belongs in v0.3. Hosted service tier belongs in v0.5. Enterprise tier belongs in v1.0. Shipping v0.1 with only the four highest-signal install-time checks was the deliberate choice; shipping something narrow that actually works beats shipping a comprehensive suite that takes three months and validates the wrong things.

I do not claim any of the parallel install-time or security tools are wrong. I claim this one is deliberately narrow, ships as an open-source CLI you can run in about a second, and returns a scriptable exit code so it can live in a shell script or CI pipeline without further ceremony. The other tools cover other axes; use them all.

The ask

Two asks, both concrete.

If you maintain an MCP server, especially a published one, run mcp-audit against your own server before releasing the next version. If it surfaces something, it surfaces something a first-time installer will also hit. Repo is at github.com/Yveshby27/mcp-server-audit. Issues welcome, especially edge cases the current checks miss.

If you are the individual dev on the other end of the install (the person typing npx -y and hoping the agent still works), install with pip install mcp-audit and run it against any server before adding it to your config. Report back if it misses something real. Real-world failures are the best guide to which checks matter next.

I am mostly interested in patterns that recur across servers, not one-off issues. If you have seen the same failure mode on more than one MCP server, that is exactly the material this tool needs to know about.

LinkedIn DM or yves.habchy@gmail.com.


Other research notes →