<?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: Ismail Khouya</title>
    <description>The latest articles on DEV Community by Ismail Khouya (@ismail_khouya_4643b00c238).</description>
    <link>https://dev.to/ismail_khouya_4643b00c238</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4048182%2Fcd7280bf-68e9-4b89-9bb7-4d83f986ebf8.png</url>
      <title>DEV Community: Ismail Khouya</title>
      <link>https://dev.to/ismail_khouya_4643b00c238</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ismail_khouya_4643b00c238"/>
    <language>en</language>
    <item>
      <title>We Scored 675 MCP Servers on Security. 89% Failed.</title>
      <dc:creator>Ismail Khouya</dc:creator>
      <pubDate>Fri, 04 Sep 2026 10:44:42 +0000</pubDate>
      <link>https://dev.to/ismail_khouya_4643b00c238/we-scored-675-mcp-servers-on-security-89-failed-17ae</link>
      <guid>https://dev.to/ismail_khouya_4643b00c238/we-scored-675-mcp-servers-on-security-89-failed-17ae</guid>
      <description>&lt;p&gt;The Model Context Protocol (MCP) has become the default way to connect AI assistants to real tools — databases, file systems, SaaS APIs, dev environments. In under two years, the ecosystem has grown to thousands of servers. Almost none of them limit what an AI agent can do to them.&lt;/p&gt;

&lt;p&gt;We run &lt;a href="https://repoai.io" rel="noopener noreferrer"&gt;RepoAI&lt;/a&gt;, a directory that scores every MCP server on 15 structural security signals — not a penetration test, but a trust score built from real, verifiable facts: does it offer a read-only mode, does it authenticate requests, is it actively maintained, who published it. We recently audited our own scoring methodology end to end, fixed two real bugs that were under-counting risk, and re-scored the entire directory. The numbers that came back are worth sharing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The headline numbers
&lt;/h2&gt;

&lt;p&gt;Across all 675 published MCP servers in our directory:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Score&lt;/th&gt;
&lt;th&gt;Risk level&lt;/th&gt;
&lt;th&gt;Servers&lt;/th&gt;
&lt;th&gt;Share&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;80–100&lt;/td&gt;
&lt;td&gt;Safe&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;0.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;60–79&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;66&lt;/td&gt;
&lt;td&gt;9.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0–59&lt;/td&gt;
&lt;td&gt;High risk&lt;/td&gt;
&lt;td&gt;603&lt;/td&gt;
&lt;td&gt;89.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Fewer than 1 in 100 servers scores as genuinely safe by any reasonable structural standard. Nearly 9 in 10 land in our "high risk" band.&lt;/p&gt;

&lt;p&gt;Three signals drive most of that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;92.1%&lt;/strong&gt; of servers offer no read-only mode at all — every install gets full read/write access, with no safer way to run it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;35.9%&lt;/strong&gt; have at least one tool we classify as dangerous (it can execute code, delete data, or write files); of those, &lt;strong&gt;43.1%&lt;/strong&gt; combine that with having no read-only escape hatch — the single worst combination in our scoring model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;1.9%&lt;/strong&gt; of servers have no authentication mechanism whatsoever — anyone who has the config file can invoke every tool the server exposes. Only &lt;strong&gt;14.7%&lt;/strong&gt; support OAuth, the strongest of the auth methods we track.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Only &lt;strong&gt;12%&lt;/strong&gt; of servers are published by the actual vendor rather than a third party.&lt;/p&gt;

&lt;h2&gt;
  
  
  This isn't a fluke of which servers happened to get listed first
&lt;/h2&gt;

&lt;p&gt;Before publishing this, we wanted to rule out selection bias — maybe our directory just happened to accumulate the worst-scoring servers first. So we searched GitHub directly for MCP servers we hadn't imported yet (sorted by star count, so the most established, most-used candidates came first) and scored 20 new ones with the exact same methodology, cold.&lt;/p&gt;

&lt;p&gt;The most popular candidate had 1,860 GitHub stars. &lt;strong&gt;Not one of the 20 reached even our "medium" tier.&lt;/strong&gt; The highest score was 55 out of 100.&lt;/p&gt;

&lt;p&gt;The pattern holds outside our own dataset. This looks like the honest current state of the ecosystem, not an artifact of our sample.&lt;/p&gt;

&lt;h2&gt;
  
  
  A concrete example
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;mcp-server-trello&lt;/code&gt;, a community-maintained MCP that connects an assistant to Trello boards, exposes 35 tools — including &lt;code&gt;delete_checklist_item&lt;/code&gt; and &lt;code&gt;delete_comment&lt;/code&gt;, both flagged as dangerous operations. It offers no read-only mode. There is no way to run it in a mode where the assistant can look but not touch. It scores 20/100 in our system, and that's a fair, mechanical read of what the repository itself documents — not a judgment of the maintainer, who has built something genuinely useful. It's simply typical: a small, popular, actively-used integration that ships full write access with no safety valve, because until now almost nothing in this space has asked for one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why "nothing bad has happened yet" doesn't mean much here
&lt;/h2&gt;

&lt;p&gt;The natural objection: this ecosystem is used constantly, by a lot of people, and it isn't visibly on fire. Doesn't that mean the risk is overstated?&lt;/p&gt;

&lt;p&gt;It's worth remembering that Log4Shell — one of the most severe vulnerabilities in a decade — sat unnoticed inside a library used by a meaningful share of enterprise Java applications for eight years before anyone found it. Absence of a headline is not evidence of absence of risk; often it's evidence that nobody has looked yet, or that when something does go wrong, nobody can tell.&lt;/p&gt;

&lt;p&gt;MCP servers raise a version of this that's specific to agentic AI: prompt injection. An assistant doesn't need a bug in the server to misuse it — it needs to be tricked, by a webpage, a document, or an email it was asked to read, into calling a tool it shouldn't. When that tool has no read-only mode and no authentication boundary, the blast radius is whatever the tool can do. This failure mode produces no crash, no alert, and no log line that looks unusual. Researchers at Anthropic and elsewhere have written about exactly this "lethal trifecta" — private data, untrusted content, and a way to communicate externally — as the shape of risk that's specific to giving language models real tools to call. It's a quiet risk by construction, which is exactly why it doesn't show up as a wave of public incidents even where it is real.&lt;/p&gt;

&lt;p&gt;None of this means MCP is unsafe to use. It means the safety work — read-only modes, scoped authentication, tool-level risk disclosure — is largely still ahead of the ecosystem, not behind it. That's normal for infrastructure this young. npm, early cloud IAM, and the first wave of consumer IoT devices went through the same phase, at similar or lower adoption numbers, before better defaults became standard.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we'd ask of anyone shipping an MCP server
&lt;/h2&gt;

&lt;p&gt;Three of our 15 signals matter more than the rest combined, and all three are achievable in an afternoon, not a rewrite:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Ship a read-only mode.&lt;/strong&gt; If your tools can write, add a flag or config option that restricts the assistant to reads only. This one change had the single biggest effect on scores in our entire dataset.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Require authentication.&lt;/strong&gt; Even a static API key is enough to clear our bar — it's the complete absence of one that costs points.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Document what your tools can do.&lt;/strong&gt; We classify tool risk from what's actually described in your README and tool schemas. A tool named &lt;code&gt;delete_x&lt;/code&gt; that says so plainly scores more fairly than one whose real capability is only discoverable by reading the source.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Methodology, briefly
&lt;/h2&gt;

&lt;p&gt;Every score is a plain sum of 15 signals — repo health (maintenance activity, license, contributor count, community adoption) plus MCP-specific behavior (read-only mode, authentication strength, tool risk) — clamped to 0–100. It's a trust signal built from public, verifiable facts, not a security audit or vulnerability scan; a high score means a server looks well-maintained and conservatively scoped, not that its code has been proven free of bugs. The full breakdown, including exact point values for every check, is public on our &lt;a href="https://repoai.io/methodology" rel="noopener noreferrer"&gt;methodology page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Every score referenced in this piece reflects the directory at the time of writing, and is a live number — it moves as servers add real safety features or new ones get reviewed. Look up any specific server's score and full check breakdown on its RepoAI page, or browse the &lt;a href="https://repoai.io/browse" rel="noopener noreferrer"&gt;full directory&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;RepoAI is an independent directory of MCP servers, Claude Skills, and the wider AI tooling ecosystem — not affiliated with Anthropic or the maintainers of any server we list unless a listing explicitly says "Official."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What does your own MCP server score? Curious where the gaps are in your specific setup — drop the repo link below.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>security</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I Built a Security Scorer for 213 MCP Servers — Here's What Made the Difference</title>
      <dc:creator>Ismail Khouya</dc:creator>
      <pubDate>Sun, 26 Jul 2026 16:52:35 +0000</pubDate>
      <link>https://dev.to/ismail_khouya_4643b00c238/i-built-a-security-scorer-for-213-mcp-servers-heres-what-made-the-difference-2hi4</link>
      <guid>https://dev.to/ismail_khouya_4643b00c238/i-built-a-security-scorer-for-213-mcp-servers-heres-what-made-the-difference-2hi4</guid>
      <description>&lt;p&gt;Every time I wanted to add an MCP server to Claude Desktop or Cursor, I ended up&lt;br&gt;
with a dozen browser tabs open, trying to answer one question the README never&lt;br&gt;
answers: &lt;strong&gt;is this actually safe to give tool-call access to my machine?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;MCP (Model Context Protocol) directories exist, but most of them just mirror&lt;br&gt;
GitHub — stars, a README excerpt, a copy-paste config. None of them score&lt;br&gt;
&lt;em&gt;risk&lt;/em&gt;. So I built &lt;a href="https://repoai.io" rel="noopener noreferrer"&gt;RepoAI&lt;/a&gt;, and I want to share the exact&lt;br&gt;
methodology, because I think it's more interesting than the product pitch.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem with "just check the stars"
&lt;/h2&gt;

&lt;p&gt;Stars measure popularity, not safety. A server with 5,000 stars can still:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;have no read-only mode (every tool call can write/delete)&lt;/li&gt;
&lt;li&gt;ship with no auth method at all&lt;/li&gt;
&lt;li&gt;be an unmaintained fork nobody's patched in a year&lt;/li&gt;
&lt;li&gt;be archived — meaning whatever's wrong with it stays wrong, forever&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of that shows up in a star count.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 15 signals
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;computeSecurityScore()&lt;/code&gt; runs 15 checks against each server, sums signed point&lt;br&gt;
values, and clamps the result to 0–100. Two categories:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repo health&lt;/strong&gt; (max +101):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;Points&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Official maintainer&lt;/td&gt;
&lt;td&gt;+18 / 0&lt;/td&gt;
&lt;td&gt;Vendor-published &amp;gt; random fork&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Editorially verified&lt;/td&gt;
&lt;td&gt;+5 / 0&lt;/td&gt;
&lt;td&gt;A human actually reviewed it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Actively maintained&lt;/td&gt;
&lt;td&gt;+12 / +6 / 0&lt;/td&gt;
&lt;td&gt;Last commit ≤90d / ≤365d / older&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Established contributor base&lt;/td&gt;
&lt;td&gt;+10 / +5 / 0&lt;/td&gt;
&lt;td&gt;Bus factor: ≥5 / ≥2 / 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Community adoption&lt;/td&gt;
&lt;td&gt;+10 / +5 / 0&lt;/td&gt;
&lt;td&gt;Stars: ≥1000 / ≥100 / fewer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Has license&lt;/td&gt;
&lt;td&gt;+8 / 0&lt;/td&gt;
&lt;td&gt;Unlicensed = unclear usage terms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reasonable dependency footprint&lt;/td&gt;
&lt;td&gt;+5 / +2 / 0&lt;/td&gt;
&lt;td&gt;Smaller supply-chain surface&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Has homepage/docs&lt;/td&gt;
&lt;td&gt;+3 / 0&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Substantial README&lt;/td&gt;
&lt;td&gt;+5 / 0&lt;/td&gt;
&lt;td&gt;≥500 chars&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Archived&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0 / &lt;strong&gt;−40&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;No future fixes. Ever.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;MCP-specific:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;Points&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Read-only mode available&lt;/td&gt;
&lt;td&gt;+15 / 0&lt;/td&gt;
&lt;td&gt;A safer way to run it should exist&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Supports OAuth&lt;/td&gt;
&lt;td&gt;+10 / 0&lt;/td&gt;
&lt;td&gt;Stronger than static tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dangerous tools present&lt;/td&gt;
&lt;td&gt;0 / −10 / −25&lt;/td&gt;
&lt;td&gt;Share of tools flagged execute/delete/write&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dangerous tools, no safe mode&lt;/td&gt;
&lt;td&gt;0 / &lt;strong&gt;−20&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;The double penalty — risky &lt;em&gt;and&lt;/em&gt; no escape hatch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Weak or missing auth&lt;/td&gt;
&lt;td&gt;0 / −15&lt;/td&gt;
&lt;td&gt;Anyone with the config file can use it&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Scores land in three bands: 80–100 &lt;code&gt;safe&lt;/code&gt;, 60–79 &lt;code&gt;medium&lt;/code&gt;, 0–59 &lt;code&gt;high&lt;/code&gt; risk.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part I almost got wrong
&lt;/h2&gt;

&lt;p&gt;My first instinct was to let an LLM write the verdict &lt;em&gt;and&lt;/em&gt; set the score.&lt;br&gt;
That's a mistake — an AI can be convinced by good marketing copy in a README&lt;br&gt;
just as easily as a human can. So the pipeline splits it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;score&lt;/strong&gt; comes only from verifiable facts: GitHub metadata, license,
commit history, tool risk classification. No AI in that loop at all.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;verdict&lt;/strong&gt; (the human-readable "should you use this" paragraph) starts
as an AI draft grounded strictly in those same facts — then a human reads
it before it ever goes live. Nothing gets published on the strength of an
AI's opinion alone.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What it looks like end to end
&lt;/h2&gt;

&lt;p&gt;For a server like &lt;code&gt;qdrant/mcp-server-qdrant&lt;/code&gt;, the pipeline:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Scrapes the repo (README, package.json, releases, commit history)&lt;/li&gt;
&lt;li&gt;Runs the 15 checks → a score (58, in this case — &lt;code&gt;medium&lt;/code&gt; risk, mostly
held back by no OAuth support and a moderate dependency footprint)&lt;/li&gt;
&lt;li&gt;Generates a ready-to-paste config for Claude Desktop / Cursor / VS Code / Windsurf&lt;/li&gt;
&lt;li&gt;Extracts its actual tool list and FAQs from the README&lt;/li&gt;
&lt;li&gt;Waits for a human to confirm the AI's draft summary before anything ships&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Where it stands today
&lt;/h2&gt;

&lt;p&gt;213 servers, 36 categories, all re-scraped and re-scored on a rolling basis&lt;br&gt;
so a score reflects last week's commit activity, not last year's.&lt;/p&gt;

&lt;p&gt;It's &lt;a href="https://repoai.io" rel="noopener noreferrer"&gt;open at repoai.io&lt;/a&gt; — MCP is the first layer, Claude&lt;br&gt;
Skills and the rest of the AI-tool ecosystem are next, same trust model.&lt;/p&gt;

&lt;p&gt;Curious what other people would want a security scorer to check for —&lt;br&gt;
what's bitten you when installing an MCP server?&lt;/p&gt;




</description>
      <category>ai</category>
      <category>webdev</category>
      <category>security</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
