<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Elliot LIU</title>
    <description>The latest articles on DEV Community by Elliot LIU (@elliotllliu).</description>
    <link>https://dev.to/elliotllliu</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3822985%2F9ad5bd96-46d0-4b90-9428-bcc5fdfc93fa.png</url>
      <title>DEV Community: Elliot LIU</title>
      <link>https://dev.to/elliotllliu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/elliotllliu"/>
    <language>en</language>
    <item>
      <title>We Scanned 17 Popular MCP Servers — Here's What We Found</title>
      <dc:creator>Elliot LIU</dc:creator>
      <pubDate>Fri, 13 Mar 2026 19:38:30 +0000</pubDate>
      <link>https://dev.to/elliotllliu/we-scanned-17-popular-mcp-servers-heres-what-we-found-321c</link>
      <guid>https://dev.to/elliotllliu/we-scanned-17-popular-mcp-servers-heres-what-we-found-321c</guid>
      <description>&lt;p&gt;The Model Context Protocol (MCP) is quickly becoming the standard for connecting AI agents to external tools. Claude Desktop, Cursor, Windsurf, and dozens of other AI apps now support MCP servers as plugins.&lt;/p&gt;

&lt;p&gt;But here's the problem: &lt;strong&gt;nobody is checking if these servers are safe to install.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We built &lt;a href="https://github.com/elliotllliu/agent-shield" rel="noopener noreferrer"&gt;Agent Shield&lt;/a&gt;, a security scanner for AI agent tools, and used it to audit 17 of the most popular MCP servers — including official ones from Anthropic, AWS, Cloudflare, Docker, Brave, and Azure.&lt;/p&gt;

&lt;p&gt;The results were eye-opening.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;17 servers scanned&lt;/strong&gt;, 4,198 files, 1.2 million lines of code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;100% of servers&lt;/strong&gt; lack proper permission declarations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;5 servers&lt;/strong&gt; (29%) scored as high risk&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;1 real eval() vulnerability&lt;/strong&gt; found in Playwright MCP&lt;/li&gt;
&lt;li&gt;Average security score: &lt;strong&gt;34/100&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What We Scanned
&lt;/h2&gt;

&lt;p&gt;We selected servers across the MCP ecosystem — from official reference implementations to popular community projects:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tier&lt;/th&gt;
&lt;th&gt;Servers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Official&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Anthropic's reference servers, AWS MCP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Major vendors&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cloudflare, Azure, Docker, Brave Search&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Popular community&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Playwright, Obsidian, Figma, PostgreSQL, Supabase, Kubernetes, Notion&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All scans were fully offline — no code ever left our machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Results
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Server&lt;/th&gt;
&lt;th&gt;Score&lt;/th&gt;
&lt;th&gt;Risk&lt;/th&gt;
&lt;th&gt;Top Findings&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;cloudflare/mcp-server-cloudflare&lt;/td&gt;
&lt;td&gt;-100&lt;/td&gt;
&lt;td&gt;🔴&lt;/td&gt;
&lt;td&gt;privilege, phone-home, backdoor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;awslabs/mcp&lt;/td&gt;
&lt;td&gt;-100&lt;/td&gt;
&lt;td&gt;🔴&lt;/td&gt;
&lt;td&gt;credential-hardcode, privilege, phone-home&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;modelcontextprotocol/servers&lt;/td&gt;
&lt;td&gt;-29&lt;/td&gt;
&lt;td&gt;🔴&lt;/td&gt;
&lt;td&gt;privilege, phone-home, cross-file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;anthropics/anthropic-quickstarts&lt;/td&gt;
&lt;td&gt;-1&lt;/td&gt;
&lt;td&gt;🔴&lt;/td&gt;
&lt;td&gt;privilege, sensitive-read&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azure/azure-mcp&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;td&gt;🟡&lt;/td&gt;
&lt;td&gt;privilege, backdoor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;docker/hub-mcp&lt;/td&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;td&gt;🟡&lt;/td&gt;
&lt;td&gt;privilege, description-integrity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;supabase-mcp-server&lt;/td&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;td&gt;🟡&lt;/td&gt;
&lt;td&gt;credential-hardcode, privilege&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mcp-server-kubernetes&lt;/td&gt;
&lt;td&gt;43&lt;/td&gt;
&lt;td&gt;🟡&lt;/td&gt;
&lt;td&gt;privilege, env-leak&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Figma-Context-MCP&lt;/td&gt;
&lt;td&gt;48&lt;/td&gt;
&lt;td&gt;🟡&lt;/td&gt;
&lt;td&gt;privilege, phone-home&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;brave-search-mcp-server&lt;/td&gt;
&lt;td&gt;58&lt;/td&gt;
&lt;td&gt;🟡&lt;/td&gt;
&lt;td&gt;privilege, network-ssrf&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MCP-Server-Playwright&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;64&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;🔴&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;backdoor (eval), privilege&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;postgres-mcp&lt;/td&gt;
&lt;td&gt;78&lt;/td&gt;
&lt;td&gt;🟡&lt;/td&gt;
&lt;td&gt;credential-hardcode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;docker-mcp&lt;/td&gt;
&lt;td&gt;97&lt;/td&gt;
&lt;td&gt;🟢&lt;/td&gt;
&lt;td&gt;privilege&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mcp-server-docker&lt;/td&gt;
&lt;td&gt;97&lt;/td&gt;
&lt;td&gt;🟢&lt;/td&gt;
&lt;td&gt;privilege&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;(Scores range from -100 to 100. Higher is safer.)&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3 Key Findings
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Nobody Declares Permissions (17/17 servers)
&lt;/h3&gt;

&lt;p&gt;The MCP spec supports permission declarations in server manifests. In practice, &lt;strong&gt;not a single server we scanned uses them.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This means when you install a Kubernetes MCP server, there's no machine-readable way to know it can &lt;code&gt;kubectl delete&lt;/code&gt; your pods. When you install the Docker server, nothing declares it can remove containers.&lt;/p&gt;

&lt;p&gt;Users have to read source code or trust the README. That's not scalable security.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. A Real eval() Vulnerability in Playwright MCP
&lt;/h3&gt;

&lt;p&gt;The Playwright MCP server from Automata Labs contains a genuine &lt;code&gt;eval()&lt;/code&gt; call with dynamic input at &lt;code&gt;index.ts:535&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// User-controlled data flows into eval()&lt;/span&gt;
&lt;span class="nf"&gt;eval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userProvidedScript&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This means an AI agent using this server could be tricked into executing arbitrary JavaScript — a textbook code injection vector. This is not a false positive; it's a real security risk that any project using Playwright MCP should be aware of.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Monorepos Inflate Risk Scores — But Still Have Issues
&lt;/h3&gt;

&lt;p&gt;AWS's MCP repository (-100 score) and Cloudflare's (-100) are monorepos containing dozens of sub-packages, test fixtures, and example code. Their low scores are inflated by volume.&lt;/p&gt;

&lt;p&gt;But even accounting for that, we found real patterns worth investigating: hardcoded credentials in example configs, test files with embedded secrets, and worker code that makes unrestricted HTTP requests.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;The MCP ecosystem is growing fast. Anthropic's reference implementation has 18K+ stars. The awesome-mcp-servers list has 6K+ entries.&lt;/p&gt;

&lt;p&gt;But unlike npm (which has &lt;code&gt;npm audit&lt;/code&gt;), PyPI (which has &lt;code&gt;safety&lt;/code&gt;), or Docker Hub (which has image scanning), &lt;strong&gt;MCP servers have no standard security scanning.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When a developer installs &lt;code&gt;@modelcontextprotocol/server-filesystem&lt;/code&gt;, they're giving an AI agent read/write access to their files. When they install &lt;code&gt;mcp-server-kubernetes&lt;/code&gt;, they're giving it access to their cluster. The security implications are significant, and there's currently no automated way to assess them.&lt;/p&gt;

&lt;h2&gt;
  
  
  About False Positives
&lt;/h2&gt;

&lt;p&gt;We want to be transparent: some findings, especially &lt;code&gt;env-leak&lt;/code&gt; and &lt;code&gt;phone-home&lt;/code&gt;, can be false positives for legitimate API clients. MCP servers naturally read API keys from environment variables and make HTTP requests — that's what they do.&lt;/p&gt;

&lt;p&gt;Agent Shield flags these patterns for manual review, not as definitive security failures. The goal is to surface patterns that &lt;em&gt;could&lt;/em&gt; be problematic and let developers make informed decisions.&lt;/p&gt;

&lt;p&gt;That said, several findings — like the Playwright &lt;code&gt;eval()&lt;/code&gt;, missing permission declarations, and hardcoded credentials — are genuine issues worth fixing.&lt;/p&gt;

&lt;h2&gt;
  
  
  How We Did It
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/elliotllliu/agent-shield" rel="noopener noreferrer"&gt;Agent Shield&lt;/a&gt; performs static analysis with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;31 security rules&lt;/strong&gt; covering code injection, data exfiltration, reverse shells, obfuscation, prompt injection, and more&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-file taint tracking&lt;/strong&gt; to follow dangerous data flows across modules&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-language support&lt;/strong&gt; — TypeScript, JavaScript, Python, Go, Rust&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP-specific checks&lt;/strong&gt; — manifest validation, permission declarations, description integrity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All scanning is fully offline. No code is uploaded anywhere.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Try it yourself&lt;/span&gt;
npx @elliotllliu/agent-shield scan &amp;lt;directory&amp;gt;

&lt;span class="c"&gt;# Or with Docker&lt;/span&gt;
docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;:/workspace agent-shield scan &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What Should Change
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;MCP servers should declare permissions.&lt;/strong&gt; The spec supports it; implementations should use it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Registries should scan before listing.&lt;/strong&gt; awesome-mcp-servers, Glama.ai, Smithery — all could integrate automated scanning.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CI pipelines should include security checks.&lt;/strong&gt; Just like you run linters and tests, scan your MCP server before publishing.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The MCP ecosystem is at an inflection point. The tooling is maturing, adoption is accelerating, and the security practices need to catch up before the first major incident happens.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;&lt;a href="https://github.com/elliotllliu/agent-shield" rel="noopener noreferrer"&gt;Agent Shield&lt;/a&gt; is an open-source security scanner for AI agent skills, MCP servers, and plugins. Install it with &lt;code&gt;npm install -g @elliotllliu/agent-shield&lt;/code&gt; or use it as a &lt;a href="https://github.com/elliotllliu/agent-shield" rel="noopener noreferrer"&gt;GitHub Action&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Have a server you'd like us to scan? &lt;a href="https://github.com/elliotllliu/agent-shield/issues" rel="noopener noreferrer"&gt;Open an issue&lt;/a&gt; or just run it yourself — it's free and fully offline.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>ai</category>
      <category>mcp</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
