Every MCP server you connect to Claude, Cursor, or any other AI client is a door into your Drive, your Notion workspace, your inbox, and sometimes your terminal. Most people wire these connections up in an afternoon and never think about what else could walk through that door. That is the real story behind mcp security risks in 2026. The protocol that made AI agents useful, by giving them the ability to read your files and take real actions on your behalf, is the same protocol that makes them exploitable. A single poisoned tool description or one unvetted server pulled from a public registry, and an agent that was supposed to save you time can quietly leak credentials or run a command you never approved. This is not a warning aimed at enterprise security teams. It is aimed at the freelancer, the two-person agency, and the founder who connected five MCP servers last weekend and has not looked at them since.
What this post covers: mcp security risks explained in plain language, what tool poisoning and prompt injection actually do, what the April 2026 OX Security disclosure exposed, and four rules plus a checklist for keeping a small team’s AI setup safe without hiring a security team.
Table of Contents
What Tool Poisoning and Prompt Injection Actually Mean
Tool poisoning is when someone hides malicious instructions inside an MCP tool’s own description, the text your AI model reads to decide what a tool does and how to use it. Prompt injection is the broader category. It covers any content, a webpage, a PDF, a GitHub pull request title, an email your agent summarizes, that carries hidden instructions your agent was never supposed to follow.
The two overlap constantly in practice. A tool description is just text, and an AI model cannot reliably tell the difference between “here is what this tool does” and “here is a command you must now execute.” In April 2026, researchers demonstrated exactly this by hijacking Claude Code, Gemini CLI, and GitHub Copilot through malicious instructions buried inside GitHub PR titles, tricking the agents into exfiltrating GitHub Actions secrets. No one clicked a suspicious link. The agent just read a pull request the way it was told to.
This is also why the Model Context Protocol specification itself is explicit that tool descriptions should be treated as untrusted content unless they come from a server you know and trust. That guidance exists because the failure mode is not a bug you can patch once. It is a structural property of how these agents read and act on text, which means the responsibility sits with whoever decides which servers get connected in the first place.
<rect x="48" y="88" width="320" height="240" rx="8" fill="#FFFFFF" stroke="#2E6B4A" stroke-width="2"/>
<text x="208" y="128" text-anchor="middle" font-family="Poppins, system-ui, sans-serif" font-size="19" font-weight="700" fill="#1C3D2E">Tool Poisoning</text>
<text x="208" y="160" text-anchor="middle" font-family="Poppins, system-ui, sans-serif" font-size="13" fill="#2E6B4A">Lives inside the tool</text>
<text x="76" y="196" font-family="Poppins, system-ui, sans-serif" font-size="13" fill="#1C3D2E">Malicious instructions are</text>
<text x="76" y="216" font-family="Poppins, system-ui, sans-serif" font-size="13" fill="#1C3D2E">written into a tool's own</text>
<text x="76" y="236" font-family="Poppins, system-ui, sans-serif" font-size="13" fill="#1C3D2E">description, the text the</text>
<text x="76" y="256" font-family="Poppins, system-ui, sans-serif" font-size="13" fill="#1C3D2E">model reads to decide how</text>
<text x="76" y="276" font-family="Poppins, system-ui, sans-serif" font-size="13" fill="#1C3D2E">and when to use it.</text>
<text x="76" y="308" font-family="Poppins, system-ui, sans-serif" font-size="12" font-style="italic" fill="#2E6B4A">Fix: vet every server first.</text>
<rect x="432" y="88" width="320" height="240" rx="8" fill="#FFFFFF" stroke="#2E6B4A" stroke-width="2"/>
<text x="592" y="128" text-anchor="middle" font-family="Poppins, system-ui, sans-serif" font-size="19" font-weight="700" fill="#1C3D2E">Prompt Injection</text>
<text x="592" y="160" text-anchor="middle" font-family="Poppins, system-ui, sans-serif" font-size="13" fill="#2E6B4A">Lives inside the content</text>
<text x="460" y="196" font-family="Poppins, system-ui, sans-serif" font-size="13" fill="#1C3D2E">Hidden instructions ride</text>
<text x="460" y="216" font-family="Poppins, system-ui, sans-serif" font-size="13" fill="#1C3D2E">along in a webpage, PDF,</text>
<text x="460" y="236" font-family="Poppins, system-ui, sans-serif" font-size="13" fill="#1C3D2E">email, or PR title the agent</text>
<text x="460" y="256" font-family="Poppins, system-ui, sans-serif" font-size="13" fill="#1C3D2E">reads or summarizes during</text>
<text x="460" y="276" font-family="Poppins, system-ui, sans-serif" font-size="13" fill="#1C3D2E">a normal task.</text>
<text x="460" y="308" font-family="Poppins, system-ui, sans-serif" font-size="12" font-style="italic" fill="#2E6B4A">Fix: confirm before writes.</text>
<rect x="150" y="352" width="500" height="36" rx="8" fill="#D35F1A"/>
<text x="400" y="375" text-anchor="middle" font-family="Poppins, system-ui, sans-serif" font-size="13" font-weight="700" fill="#FFFFFF">Both bypass your judgment, not your system's permissions</text>
If you have not yet mapped out which servers you are running and why, our MCP setup guide walks through connecting Drive, Notion, Gmail, and Calendar in the right order, starting read-only.
Inside the OX Security Disclosure
In April 2026, OX Security published a disclosure it titled “The Mother of All AI Supply Chains,” and it is the clearest evidence yet that mcp security risks are not a theoretical talking point. The researchers found a design flaw present across every officially supported MCP SDK, Python, TypeScript, Java, and Rust, that let any process command passed to the STDIO interface execute on the host system, regardless of whether it initialized a valid MCP server at all.
The scope is what made it newsworthy. OX Security’s team traced the flaw through a supply chain spanning more than 150 million downloads and flagged roughly 200,000 exposed server instances. In testing, they poisoned nine of eleven public MCP registries with a harmless payload and confirmed working command execution on six live production platforms that had paying customers. The research produced at least ten CVEs rated high or critical severity. According to reporting on the disclosure, Anthropic reviewed the finding and declined to patch the protocol itself, calling the behavior expected given how STDIO-based MCP servers are designed to work.
That response matters for how you should read this. A design that behaves as intended can still be dangerous if most people connecting to it have no idea what “as intended” means. A March 2026 arXiv preprint, “Model Context Protocol Threat Modeling and Analyzing Vulnerabilities to Prompt Injection with Tool Poisoning,” reached a similar conclusion from the academic side: across the AI clients the researchers tested, tool poisoning was the single most prevalent and highest-impact client-side vulnerability, driven mainly by weak static validation of tool metadata and poor visibility into what parameters a tool call actually touches. Some clients, like Claude Desktop, ship stronger guardrails out of the box. Others do not, and the protocol itself will not save you from that gap. We track incidents like this as they happen on the ByHarshal blog, because the guardrails worth building change every time a new one surfaces.
Why Small Teams Are More Exposed Than Enterprises
Small teams carry more mcp security risks than the incident count suggests, because the exposure is operational, not just technical. Sophisticated tool poisoning attacks are real, but the more common failure at a two-person agency or a solo founder’s setup is simpler: no audit trail of which servers are connected, no separation between who can read data and who can write it, and one person making every connection decision on a Friday afternoon between client calls.
Enterprises staff this problem in pieces. A security team owns the registry vetting. IT owns the access provisioning. Someone else owns the logging. A small team is usually one person wearing all three hats, and it is easy to grant a server full read and write access because the narrower, read-only option takes five extra minutes to configure. That five minutes is the entire gap between a contained mistake and a real one, and it is exactly the door that a poisoned tool description or an injected instruction is built to walk through. Our AI Orchestra Workflow resource covers how to structure multi-tool AI setups so that access boundaries are part of the workflow from day one, not an afterthought you bolt on after something breaks.
Four Rules That Keep an MCP Setup Safe
You do not need a security team to close most of this gap. Four rules cover the majority of real-world mcp security risks for a small operation, and none of them require code.
1. Trust only servers you can name the maintainer of. If you cannot say who built and maintains an MCP server, do not connect it, no matter how useful the marketplace listing looks.
2. Start every connection read-only. Grant write, send, or delete permissions only after you have used the read-only version and understand exactly what the tool touches.
3. Re-check before any action that writes, sends, or deletes. A confirmation step before an irreversible action is the single cheapest control you can add, and it catches both poisoned instructions and your own mistakes.
4. Watch local command access like a live wire. Any server that can run shell commands on your machine deserves more scrutiny than one that only reads a spreadsheet, because that is precisely the class of flaw OX Security’s researchers exploited.
Rule two is the one most people skip because read-only takes a few extra minutes to configure. Our MCP setup guide defaults to that read-only-first order for Drive, Notion, Gmail, and Calendar, so following it once removes most of the review work in the checklist below.
<rect x="48" y="72" width="336" height="150" rx="8" fill="#FFFFFF" stroke="#2E6B4A" stroke-width="2"/>
<circle cx="88" cy="112" r="18" fill="#4CAF7D"/>
<text x="88" y="118" text-anchor="middle" font-family="Poppins, system-ui, sans-serif" font-size="16" font-weight="700" fill="#1C3D2E">1</text>
<text x="116" y="118" font-family="Poppins, system-ui, sans-serif" font-size="15" font-weight="700" fill="#1C3D2E">Know the maintainer</text>
<text x="76" y="152" font-family="Poppins, system-ui, sans-serif" font-size="12.5" fill="#1C3D2E">No named maintainer means</text>
<text x="76" y="172" font-family="Poppins, system-ui, sans-serif" font-size="12.5" fill="#1C3D2E">no connection, regardless of</text>
<text x="76" y="192" font-family="Poppins, system-ui, sans-serif" font-size="12.5" fill="#1C3D2E">how useful it looks.</text>
<rect x="416" y="72" width="336" height="150" rx="8" fill="#FFFFFF" stroke="#2E6B4A" stroke-width="2"/>
<circle cx="456" cy="112" r="18" fill="#4CAF7D"/>
<text x="456" y="118" text-anchor="middle" font-family="Poppins, system-ui, sans-serif" font-size="16" font-weight="700" fill="#1C3D2E">2</text>
<text x="484" y="118" font-family="Poppins, system-ui, sans-serif" font-size="15" font-weight="700" fill="#1C3D2E">Start read-only</text>
<text x="444" y="152" font-family="Poppins, system-ui, sans-serif" font-size="12.5" fill="#1C3D2E">Add write access only after</text>
<text x="444" y="172" font-family="Poppins, system-ui, sans-serif" font-size="12.5" fill="#1C3D2E">you understand exactly what</text>
<text x="444" y="192" font-family="Poppins, system-ui, sans-serif" font-size="12.5" fill="#1C3D2E">the tool touches.</text>
<rect x="48" y="240" width="336" height="150" rx="8" fill="#FFFFFF" stroke="#2E6B4A" stroke-width="2"/>
<circle cx="88" cy="280" r="18" fill="#4CAF7D"/>
<text x="88" y="286" text-anchor="middle" font-family="Poppins, system-ui, sans-serif" font-size="16" font-weight="700" fill="#1C3D2E">3</text>
<text x="116" y="286" font-family="Poppins, system-ui, sans-serif" font-size="15" font-weight="700" fill="#1C3D2E">Re-check writes</text>
<text x="76" y="320" font-family="Poppins, system-ui, sans-serif" font-size="12.5" fill="#1C3D2E">Confirm before anything that</text>
<text x="76" y="340" font-family="Poppins, system-ui, sans-serif" font-size="12.5" fill="#1C3D2E">writes, sends, or deletes.</text>
<text x="76" y="360" font-family="Poppins, system-ui, sans-serif" font-size="12.5" fill="#1C3D2E">Cheap, and it works.</text>
<rect x="416" y="240" width="336" height="150" rx="8" fill="#FFFFFF" stroke="#D35F1A" stroke-width="3"/>
<circle cx="456" cy="280" r="18" fill="#D35F1A"/>
<text x="456" y="286" text-anchor="middle" font-family="Poppins, system-ui, sans-serif" font-size="16" font-weight="700" fill="#FFFFFF">4</text>
<text x="484" y="286" font-family="Poppins, system-ui, sans-serif" font-size="15" font-weight="700" fill="#1C3D2E">Watch local commands</text>
<text x="444" y="320" font-family="Poppins, system-ui, sans-serif" font-size="12.5" fill="#1C3D2E">Shell-command access is the</text>
<text x="444" y="340" font-family="Poppins, system-ui, sans-serif" font-size="12.5" fill="#1C3D2E">exact flaw class behind the</text>
<text x="444" y="360" font-family="Poppins, system-ui, sans-serif" font-size="12.5" fill="#1C3D2E">OX Security disclosure.</text>
A Small-Team MCP Security Checklist
A checklist beats good intentions, because good intentions do not survive a busy week. Run this once a month, and treat it as non-negotiable as backing up client files.
<rect x="30" y="150" width="160" height="110" rx="8" fill="#FFFFFF" stroke="#2E6B4A" stroke-width="2"/>
<text x="110" y="185" text-anchor="middle" font-family="Poppins, system-ui, sans-serif" font-size="14" font-weight="700" fill="#1C3D2E">1. List</text>
<text x="110" y="208" text-anchor="middle" font-family="Poppins, system-ui, sans-serif" font-size="12" fill="#1C3D2E">Every connected</text>
<text x="110" y="226" text-anchor="middle" font-family="Poppins, system-ui, sans-serif" font-size="12" fill="#1C3D2E">MCP server, by</text>
<text x="110" y="244" text-anchor="middle" font-family="Poppins, system-ui, sans-serif" font-size="12" fill="#1C3D2E">name and source</text>
<path d="M195 205 L228 205" stroke="#2E6B4A" stroke-width="2" marker-end="url(#arrow)"/>
<rect x="232" y="150" width="160" height="110" rx="8" fill="#FFFFFF" stroke="#2E6B4A" stroke-width="2"/>
<text x="312" y="185" text-anchor="middle" font-family="Poppins, system-ui, sans-serif" font-size="14" font-weight="700" fill="#1C3D2E">2. Check</text>
<text x="312" y="208" text-anchor="middle" font-family="Poppins, system-ui, sans-serif" font-size="12" fill="#1C3D2E">Each server's</text>
<text x="312" y="226" text-anchor="middle" font-family="Poppins, system-ui, sans-serif" font-size="12" fill="#1C3D2E">permission scope,</text>
<text x="312" y="244" text-anchor="middle" font-family="Poppins, system-ui, sans-serif" font-size="12" fill="#1C3D2E">read versus write</text>
<path d="M397 205 L430 205" stroke="#2E6B4A" stroke-width="2" marker-end="url(#arrow)"/>
<rect x="434" y="150" width="160" height="110" rx="8" fill="#FFFFFF" stroke="#2E6B4A" stroke-width="2"/>
<text x="514" y="185" text-anchor="middle" font-family="Poppins, system-ui, sans-serif" font-size="14" font-weight="700" fill="#1C3D2E">3. Test</text>
<text x="514" y="208" text-anchor="middle" font-family="Poppins, system-ui, sans-serif" font-size="12" fill="#1C3D2E">One write action</text>
<text x="514" y="226" text-anchor="middle" font-family="Poppins, system-ui, sans-serif" font-size="12" fill="#1C3D2E">manually to confirm</text>
<text x="514" y="244" text-anchor="middle" font-family="Poppins, system-ui, sans-serif" font-size="12" fill="#1C3D2E">it behaves as expected</text>
<path d="M599 205 L632 205" stroke="#2E6B4A" stroke-width="2" marker-end="url(#arrow)"/>
<rect x="636" y="150" width="140" height="110" rx="8" fill="#FFFFFF" stroke="#D35F1A" stroke-width="3"/>
<text x="706" y="185" text-anchor="middle" font-family="Poppins, system-ui, sans-serif" font-size="14" font-weight="700" fill="#1C3D2E">4. Revoke</text>
<text x="706" y="208" text-anchor="middle" font-family="Poppins, system-ui, sans-serif" font-size="12" fill="#1C3D2E">Anything you</text>
<text x="706" y="226" text-anchor="middle" font-family="Poppins, system-ui, sans-serif" font-size="12" fill="#1C3D2E">have not used</text>
<text x="706" y="244" text-anchor="middle" font-family="Poppins, system-ui, sans-serif" font-size="12" fill="#1C3D2E">in 30 days</text>
<defs>
<marker id="arrow" markerWidth="10" markerHeight="10" refX="8" refY="5" orient="auto">
<path d="M0,0 L10,5 L0,10 Z" fill="#2E6B4A"/>
</marker>
</defs>
Beyond the four steps above, keep a simple written list of who owns the decision to connect a new server. One person’s name, not “whoever needs it that day.” Separate any agent that touches client financial data or credentials from the general-purpose assistant you use for research and drafting, so a compromised tool in one context cannot reach the other. And log what your agents actually do when they act on your behalf. Even a rough text file with timestamps beats no record at all when you need to figure out what happened after the fact. If you want to see how this fits into a broader AI workflow, my background running AI orchestration for founders and agencies covers the same access-boundary thinking applied across a full client operation, not just MCP servers.
Key Takeaways
- Tool poisoning hides malicious instructions inside a tool’s description; prompt injection hides them inside content the agent reads. Both exploit the same blind spot: an AI model cannot reliably separate instructions from data.
- OX Security’s April 2026 disclosure found a design flaw across every official MCP SDK, tied to a supply chain of more than 150 million downloads and roughly 200,000 exposed server instances.
- Researchers poisoned nine of eleven public MCP registries in testing and confirmed working exploitation on six live production platforms with paying customers.
- A March 2026 academic paper found tool poisoning to be the most prevalent, highest-impact client-side MCP vulnerability, driven by weak validation and poor visibility into tool parameters.
- Small teams face more operational exposure than enterprises, not less, because one person usually owns vetting, access, and logging all at once.
- Four rules cover most of the risk: trust only known maintainers, start read-only, re-check before writes, and watch local command access closely.
- A monthly checklist, list, check, test, revoke, keeps unused or over-permissioned servers from quietly piling up.
Frequently Asked Questions
Is MCP safe to use for a small business or solo operation? Yes, with conditions. MCP itself is not the risk; unvetted servers and default write access are. Start every connection read-only, confirm the maintainer, and add permissions only as you need them.
What is the difference between tool poisoning and prompt injection? Tool poisoning hides malicious instructions inside a tool’s own description. Prompt injection is broader and covers hidden instructions inside any content an agent reads, including webpages, PDFs, and pull request titles.
Did Anthropic fix the MCP vulnerability OX Security found? Reporting on the April 2026 disclosure indicates Anthropic reviewed the finding and did not patch the protocol, describing the behavior as expected given how STDIO-based MCP servers are designed. The responsibility for vetting servers sits with whoever connects them.
How often should I review my connected MCP servers? Monthly at minimum. List every server, check its permission scope, test one write action to confirm it behaves as expected, and revoke anything you have not used in the last 30 days.
Can an MCP server read my data without me knowing? If you granted it read access, yes, that is what read access means. The risk is not the access itself but connecting a server you have not vetted, which is why naming the maintainer before you connect matters more than any single technical control.
Harshal Saraf is a Creative Director and AI Workflow Consultant based in Indore, India. Under his practice ByHarshal, he sets up AI workflows for founders, agencies, and brands across India. Where Creative Direction Meets AI Orchestration. He has led creative direction for brands and small and medium scale B2B businesses, and currently works as Creative Director and AI Strategist at Square Root SEO. He writes Oh, So AI, a Tuesday and Friday newsletter on AI tools, workflows, and productivity for founders and creatives.