<?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: Ali Al-Jaafari</title>
    <description>The latest articles on DEV Community by Ali Al-Jaafari (@alih552).</description>
    <link>https://dev.to/alih552</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%2F4005957%2Fdfcdc058-d8f2-45de-88ac-725b43d9957e.jpg</url>
      <title>DEV Community: Ali Al-Jaafari</title>
      <link>https://dev.to/alih552</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alih552"/>
    <language>en</language>
    <item>
      <title>I built a free browser tool that scores your MCP setup for security</title>
      <dc:creator>Ali Al-Jaafari</dc:creator>
      <pubDate>Mon, 29 Jun 2026 16:03:57 +0000</pubDate>
      <link>https://dev.to/alih552/i-built-a-free-browser-tool-that-scores-your-mcp-setup-for-security-3jo0</link>
      <guid>https://dev.to/alih552/i-built-a-free-browser-tool-that-scores-your-mcp-setup-for-security-3jo0</guid>
      <description>&lt;p&gt;Recently I scanned my own MCP config and it scored 0 out of 100. I wrote a small CLI for that. The problem with a CLI is friction: most people will not install something just to check.&lt;/p&gt;

&lt;p&gt;So I rebuilt the same checks to run entirely in the browser. Paste your config, get a score and a list of fixes, and nothing leaves your machine.&lt;/p&gt;

&lt;p&gt;Try it (no install, no signup): &lt;a href="https://alih552.github.io/mcp-forge/scan.html" rel="noopener noreferrer"&gt;https://alih552.github.io/mcp-forge/scan.html&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What it flags
&lt;/h2&gt;

&lt;p&gt;The scanner reads a Claude Desktop, Cursor, or plain &lt;code&gt;.mcp.json&lt;/code&gt; config and checks for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;remote servers with no authentication&lt;/li&gt;
&lt;li&gt;cleartext http endpoints&lt;/li&gt;
&lt;li&gt;secrets pasted in plaintext (it knows the common token shapes)&lt;/li&gt;
&lt;li&gt;unpinned npx and uvx runners that fetch the newest package every launch&lt;/li&gt;
&lt;li&gt;over-broad filesystem roots like / or your home folder&lt;/li&gt;
&lt;li&gt;TLS verification turned off (NODE_TLS_REJECT_UNAUTHORIZED=0 and friends)&lt;/li&gt;
&lt;li&gt;servers bound to 0.0.0.0&lt;/li&gt;
&lt;li&gt;and it estimates how many context tokens your servers cost on every request&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each finding comes with the exact fix, and you get a score out of 100 grouped by risk class.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it runs client-side
&lt;/h2&gt;

&lt;p&gt;A config can contain real secrets, so uploading it to a scanner would be its own security problem. The whole thing runs in JavaScript in your tab. The same checks are in the open source CLI if you prefer to run it locally or in CI: &lt;code&gt;pipx install git+https://github.com/alih552/mcp-audit&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I would love to hear what score people get, and which checks you would add. What does your config say?&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>security</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Your MCP servers are burning 50k+ tokens before you type a word</title>
      <dc:creator>Ali Al-Jaafari</dc:creator>
      <pubDate>Sun, 28 Jun 2026 19:41:42 +0000</pubDate>
      <link>https://dev.to/alih552/your-mcp-servers-are-burning-50k-tokens-before-you-type-a-word-2oc6</link>
      <guid>https://dev.to/alih552/your-mcp-servers-are-burning-50k-tokens-before-you-type-a-word-2oc6</guid>
      <description>&lt;p&gt;Here is something I did not realize about the Model Context Protocol until my context window kept feeling full for no reason.&lt;/p&gt;

&lt;p&gt;Every MCP server you connect loads its full set of tool definitions into the context window on every single request. Those schemas are not free. Each tool costs a few hundred tokens, and they are sent before the model reads a word of your prompt.&lt;/p&gt;

&lt;p&gt;Five typical servers, with a dozen or more tools each, commonly add up to 50,000 to 75,000 tokens of overhead per request. That is real money on every call, and latency you feel on every turn. It also crowds out the context you actually want the model to use.&lt;/p&gt;

&lt;h2&gt;
  
  
  Measure it first
&lt;/h2&gt;

&lt;p&gt;You cannot cut what you cannot see. A rough rule is about 200 tokens per tool plus a small per-server overhead. I built a tiny tool that prints an estimate for your real config (and checks security while it is at it):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;pipx install git+https://github.com/alih552/mcp-audit
mcp-audit
&lt;/span&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&amp;gt; 7 server&lt;span class="o"&gt;(&lt;/span&gt;s&lt;span class="o"&gt;)&lt;/span&gt; - ~13,160 context tokens - score 0/100
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It runs fully locally, zero dependencies, MIT.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then cut it
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Turn off what you are not using.&lt;/strong&gt; The biggest lever and the easiest. Most people leave servers connected that they touched once. Going from seven always-on servers to the two you actually use can reclaim tens of thousands of tokens.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remove redundant servers.&lt;/strong&gt; Two search servers, two file servers. Pick one per capability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trim tool surface on servers you build.&lt;/strong&gt; Ten focused tools beat thirty overlapping ones, both for token cost and for the model picking the right one. Keep descriptions tight.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Load niche servers on demand&lt;/strong&gt; rather than keeping everything always on.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The default of "everything connected all the time" is what creates the bloat. A few minutes of cleanup pays for itself on every request after.&lt;/p&gt;

&lt;p&gt;Repo and the full writeup: &lt;a href="https://github.com/alih552/mcp-audit" rel="noopener noreferrer"&gt;https://github.com/alih552/mcp-audit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Curious what context-token number people get on their setups.&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>claude</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I scanned my MCP setup and it scored 0/100. Here's what was wrong.</title>
      <dc:creator>Ali Al-Jaafari</dc:creator>
      <pubDate>Sun, 28 Jun 2026 01:40:10 +0000</pubDate>
      <link>https://dev.to/alih552/i-scanned-my-mcp-setup-and-it-scored-0100-heres-what-was-wrong-28g</link>
      <guid>https://dev.to/alih552/i-scanned-my-mcp-setup-and-it-scored-0100-heres-what-was-wrong-28g</guid>
      <description>&lt;p&gt;I've been adding MCP servers to Claude and Cursor for months — GitHub, a filesystem server, a couple of search servers, a little internal HTTP one I wrote. It works great. Then two things bugged me:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Some of those servers have &lt;strong&gt;no authentication at all&lt;/strong&gt;. Anyone who can reach the URL can call my tools.&lt;/li&gt;
&lt;li&gt;My context window felt &lt;em&gt;full&lt;/em&gt; before I even typed a prompt.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Turns out it's not just me. A 2026 analysis of ~7,000 public MCP servers found &lt;strong&gt;41% require no auth&lt;/strong&gt;, &lt;strong&gt;36.7% are SSRF-vulnerable&lt;/strong&gt;, and only &lt;strong&gt;8.5% use OAuth&lt;/strong&gt;. So I wrote a tiny tool to check my own config — and it scored &lt;strong&gt;0 out of 100&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tool
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;mcp-audit&lt;/code&gt; (&lt;a href="https://github.com/alih552/mcp-audit" rel="noopener noreferrer"&gt;https://github.com/alih552/mcp-audit&lt;/a&gt;) is a zero-dependency CLI that reads your MCP config (Claude Desktop, Cursor, VS Code, Windsurf, or a plain .mcp.json) and tells you what's wrong. It runs &lt;strong&gt;100% locally&lt;/strong&gt; — it never connects to your servers or sends your config anywhere.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pipx install git+https://github.com/alih552/mcp-audit
mcp-audit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Here's the kind of thing it flagged on my (deliberately messy) test config:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MCP Audit — ~/.cursor/mcp.json
  7 server(s) - ~13,160 context tokens - score 0/100 (F)

[HIGH] Remote server with no authentication  (internal-api)
[HIGH] Plaintext secret in config (GitHub token)  (github)
[MED]  Unpinned auto-updating executable (npx -y)  (filesystem)
[MED]  Over-broad filesystem root '/Users'  (filesystem)
[LOW]  7 servers ~ 13,160 context tokens loaded every request
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  What each finding actually means
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;No auth on a remote server.&lt;/strong&gt; If your MCP server is reachable over HTTP and doesn't check a token, the model — or anyone who finds the URL — can run your tools. With prompt injection in the wild, the &lt;em&gt;server&lt;/em&gt; has to hold the line, not the model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Plaintext secrets in the config.&lt;/strong&gt; A GITHUB_TOKEN sitting in .mcp.json leaks through the file itself and through your git history. Move it to an env var or a secret manager.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;npx -y / uvx without a pinned version.&lt;/strong&gt; That silently runs whatever was published most recently. It's a supply-chain risk — pin the version and review updates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Over-broad filesystem roots.&lt;/strong&gt; A filesystem server pointed at /Users or $HOME lets the model read and write far more than your project. Scope it to the project directory.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Token bloat.&lt;/strong&gt; This was the one I didn't expect. Every server loads its tool schemas into &lt;em&gt;every&lt;/em&gt; request. Five servers commonly cost &lt;strong&gt;50-75k tokens of context before you type a word&lt;/strong&gt; — that's real money and real latency. Disable the servers you aren't actively using.&lt;/p&gt;
&lt;h2&gt;
  
  
  The fix
&lt;/h2&gt;

&lt;p&gt;For the config issues: pin versions, move secrets to env vars, scope filesystem access, and put auth in front of anything remote. There's a full MCP Server Security Checklist here: &lt;a href="https://alih552.github.io/mcp-forge/checklist.html" rel="noopener noreferrer"&gt;https://alih552.github.io/mcp-forge/checklist.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're &lt;em&gt;building&lt;/em&gt; an MCP server and want it secure from commit one, I also put together MCP Forge Kit (&lt;a href="https://alih552.github.io/mcp-forge/" rel="noopener noreferrer"&gt;https://alih552.github.io/mcp-forge/&lt;/a&gt;) — a secure-by-default starter (bearer + JWT auth, SSRF-safe fetch, rate limiting, validation, tests, CI). But the auditor above is free and MIT, and genuinely useful on its own.&lt;/p&gt;
&lt;h2&gt;
  
  
  Try it on your setup
&lt;/h2&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pipx install git+https://github.com/alih552/mcp-audit
mcp-audit --json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;I'd love feedback on the checks — especially &lt;strong&gt;false positives&lt;/strong&gt; and checks you think are missing. Repo: &lt;a href="https://github.com/alih552/mcp-audit" rel="noopener noreferrer"&gt;https://github.com/alih552/mcp-audit&lt;/a&gt;&lt;/p&gt;

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