Research 6 min read

The State of MCP Security in 2026

92% of MCP servers lack proper OAuth. We scanned real configurations and found critical vulnerabilities across authentication, authorization, and resource management.

Vindicara Security Research | April 2, 2026

The MCP adoption explosion

Model Context Protocol has become the connective tissue of the agentic AI stack. Every major platform, Microsoft, Google, Anthropic, OpenAI, Salesforce, is shipping MCP connectors that let AI agents interact with enterprise infrastructure: databases, CRMs, file systems, code repositories, payment processors, and internal APIs. What started as a specification for structured tool use has become the default integration layer for autonomous agents in production.

The scale is staggering. Gartner projects that 40% of enterprise applications will embed task-specific AI agents by 2026, up from under 5% in 2025. Each of those agents needs to call tools, access data, and take actions through MCP servers. The attack surface is no longer the prompt. It is the entire execution lifecycle of an autonomous agent, and MCP servers sit at the center of it.

A compromised or misconfigured MCP server does not just affect one agent. It can influence every agent that connects to it, amplifying the blast radius far beyond what traditional API vulnerabilities produce. A single MCP server with shell access and no authentication is not a misconfiguration. It is an open door to your entire infrastructure.

That door is also the most common starting point for incidents we reconstruct with Project AIR™. When security calls us in after an agent has exfiltrated data, modified records, or shelled out to a host it should not have touched, the path almost always traces back to an MCP tool that never should have been exposed in the first place. Scanning before deployment is cheap. Reconstructing what happened afterward, from partial logs, is not.

The 92% problem

RSA Conference 2026 confirmed what security teams have been discovering through painful experience: only 8% of MCP servers implement OAuth. That means 92% of MCP servers in production today have no standardized authentication mechanism. Nearly half of the servers that do implement OAuth have material implementation flaws, ranging from missing PKCE to improper token validation.

The gap in defensive tooling is equally alarming. MITRE ATLAS and NIST frameworks do not yet cover MCP-specific attack vectors. Roughly 50% of the agentic architectural stack has zero standardized defensive guidance. Security teams are deploying MCP servers with the same level of confidence they had deploying REST APIs in 2008, before OWASP, before API gateways, before anyone had codified what "secure by default" meant for networked services.

The result is a rapidly expanding attack surface with no industry-standard defenses. Every week, more MCP servers go into production. Every week, the gap between deployment velocity and security coverage widens.

What a vulnerable MCP server looks like

We ran the Vindicara MCP scanner against a representative server configuration. The results speak for themselves. This is the actual output from a static analysis scan, completed in 47 milliseconds:

{
  "scan_id": "10c940b5-c56f-47a0-99d3-e7f91a40425e",
  "risk_score": 0.85,
  "risk_level": "critical",
  "findings": [
    {
      "finding_id": "STATIC-NO-AUTH",
      "category": "authentication",
      "severity": "critical",
      "title": "No authentication configured",
      "description": "Server exposes tools without any authentication mechanism",
      "cwe_id": "CWE-306"
    },
    {
      "finding_id": "STATIC-DANGEROUS-TOOL-shell_exec",
      "category": "dangerous_tool",
      "severity": "critical",
      "title": "Dangerous tool: shell_exec",
      "description": "Tool allows arbitrary command execution on the host system",
      "cwe_id": "CWE-78"
    },
    {
      "finding_id": "STATIC-DANGEROUS-TOOL-delete_records",
      "category": "dangerous_tool",
      "severity": "high",
      "title": "Dangerous tool: delete_records",
      "description": "Tool allows unrestricted database record deletion",
      "cwe_id": "CWE-862"
    },
    {
      "finding_id": "STATIC-DANGEROUS-TOOL-read_file",
      "category": "dangerous_tool",
      "severity": "high",
      "title": "Dangerous tool: read_file",
      "description": "Tool allows reading arbitrary files from the filesystem",
      "cwe_id": "CWE-22"
    },
    {
      "finding_id": "STATIC-NO-RATELIMIT",
      "category": "rate_limit",
      "severity": "medium",
      "title": "No rate limiting configured",
      "description": "No request throttling mechanism detected",
      "cwe_id": "CWE-770"
    }
  ],
  "remediation": [
    {"priority": 1, "action": "Implement OAuth 2.0 with PKCE for all MCP connections"},
    {"priority": 2, "action": "Remove or sandbox the shell_exec tool"},
    {"priority": 3, "action": "Add row-level access controls to delete_records"},
    {"priority": 4, "action": "Restrict read_file to an allowlist of safe paths"},
    {"priority": 5, "action": "Implement server-side rate limiting with HTTP 429 responses"}
  ],
  "tools_discovered": 3,
  "scan_duration_ms": 47
}

Five findings. Two critical, two high, one medium. A risk score of 0.85 out of 1.0. This server exposes shell execution, unrestricted file reads, and database deletion capabilities to any agent that connects, with no authentication and no rate limiting. This is not a contrived example. This pattern is common in MCP servers deployed for internal tooling, development environments, and rapid prototyping that quietly drifted into production.

Reconstruct the next MCP incident

The air CLI is open source. Ingest any agent trace and get a signed forensic timeline in seconds.

Common vulnerability patterns

The scan output maps directly to five CWE (Common Weakness Enumeration) categories. Each one represents a distinct class of risk that compounds when multiple weaknesses are present on the same server.

CWE-306: Missing Authentication for Critical Function. The MCP server exposes its tools to any client that connects. Without OAuth or any authentication layer, there is no way to distinguish between a legitimate agent and an attacker. Every tool on this server is callable by anyone with network access.

CWE-78: Improper Neutralization of Special Elements used in an OS Command. The shell_exec tool accepts arbitrary commands and runs them on the host system. An agent manipulated through prompt injection, or simply one that hallucinates a destructive command, can execute anything the server process has permissions to run. This is remote code execution by design.

CWE-862: Missing Authorization. The delete_records tool has no row-level access controls. Any agent can delete any record. There is no scoping by user, tenant, or permission level. In a multi-agent environment, this means one compromised agent can wipe data belonging to every user in the system.

CWE-22: Improper Limitation of a Pathname to a Restricted Directory. The read_file tool accepts any path without restriction. An agent can read /etc/passwd, environment files containing secrets, or application source code. Path traversal in an MCP context is particularly dangerous because agents can be manipulated into reading sensitive files through carefully crafted instructions.

CWE-770: Allocation of Resources Without Limits. No rate limiting means an agent, or an attacker pretending to be one, can flood the server with requests. In the MCP context, this enables denial-of-service attacks and makes it trivial to exfiltrate large volumes of data quickly. Without request throttling, there is no circuit breaker between a misbehaving agent and total resource exhaustion.

What to do about it

The remediation priorities from the scan output provide a clear action plan. Here are the five steps every team running MCP servers should take immediately.

1. Implement OAuth 2.0 with PKCE for all MCP connections. This is the single highest-impact fix. Every MCP server must authenticate its clients. PKCE (Proof Key for Code Exchange) prevents authorization code interception attacks, which is critical in environments where agents may be running in shared infrastructure.

2. Remove or sandbox dangerous tools. Tools like shell_exec should never be exposed without sandboxing. If shell access is genuinely required, run it inside a restricted container with no network access, no filesystem writes outside a designated directory, and a hard timeout on execution.

3. Add row-level access controls to data mutation tools. Every tool that modifies data needs scoping. An agent should only be able to delete, update, or create records within the boundaries of its assigned task and tenant.

4. Restrict file access to an allowlist of safe paths. Never give an agent access to the entire filesystem. Define an explicit allowlist of directories and file patterns, and reject any path that does not match.

5. Implement server-side rate limiting. Set per-client request limits and return HTTP 429 responses when thresholds are exceeded. This protects against both accidental runaway agents and deliberate abuse.

You can automate this entire assessment with the Vindicara SDK. A single call scans an MCP server and returns prioritized findings with CWE mappings:

import vindicara

vc = vindicara.Client(api_key="vnd_...")
report = vc.mcp.scan(server_url="https://mcp.internal.co")

print(f"Risk: {report.risk_score} ({report.risk_level})")
for finding in report.findings:
    print(f"  [{finding.severity}] {finding.title} ({finding.cwe_id})")

Scanning is only half the story

Scanning tells you which MCP servers have dangerous tools. It does not tell you which agent called shell_exec with what arguments at what timestamp, or why. When an incident happens, the scan is a snapshot of your attack surface. The investigation is a reconstruction of the blast.

That reconstruction is what Project AIR is built for. AIR ingests agent traces, runs detectors across OWASP's Top 10 for Agentic Applications (all 10 ASIs shipped in projectair 0.3.0, including ASI04 Agentic Supply Chain Vulnerabilities with partial coverage focused on MCP server risk) plus OWASP's Top 10 for LLM Applications (three categories: LLM01 Prompt Injection, LLM04 Model DoS, LLM06 Sensitive Information Disclosure), and outputs a signed forensic timeline that security, legal, and insurance can all act on. The MCP scanner is one surface of the engine underneath AIR, the others being runtime policy enforcement, agent IAM, and compliance export. Scan output feeds the baseline. Trace replay proves what actually happened.

The prevention layer is crowded. The incident layer is fragmented and underbuilt. MCP security is not optional, but neither is the forensic record of how an agent used MCP tools when the prevention layer inevitably missed something.

When prevention fails, reconstruction wins

Project AIR is the forensic and incident response layer for AI agents. Open source today.