<?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: Clarence Etnel</title>
    <description>The latest articles on DEV Community by Clarence Etnel (@c6zks4gssndroid).</description>
    <link>https://dev.to/c6zks4gssndroid</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%2F4002819%2F29fb71df-2417-4efe-9752-3ab8338a8c5a.png</url>
      <title>DEV Community: Clarence Etnel</title>
      <link>https://dev.to/c6zks4gssndroid</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/c6zks4gssndroid"/>
    <language>en</language>
    <item>
      <title>"Put a security gateway in front of any MCP server in 5 minutes"</title>
      <dc:creator>Clarence Etnel</dc:creator>
      <pubDate>Thu, 25 Jun 2026 17:45:04 +0000</pubDate>
      <link>https://dev.to/c6zks4gssndroid/put-a-security-gateway-in-front-of-any-mcp-server-in-5-minutes-5ag0</link>
      <guid>https://dev.to/c6zks4gssndroid/put-a-security-gateway-in-front-of-any-mcp-server-in-5-minutes-5ag0</guid>
      <description>&lt;h1&gt;
  
  
  Put a security gateway in front of any MCP server in 5 minutes
&lt;/h1&gt;

&lt;p&gt;If you're shipping an AI agent, you've probably wired it up to one or more MCP servers — for filesystem, GitHub, web search, payments. But here's the uncomfortable truth: most MCP setups today have &lt;strong&gt;zero auth, no rate limit, no audit log, and no spending control&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Anyone who can hit your MCP URL can drain your wallet, exfiltrate your files, or run up a bill on a paid API. There's no firewall. There's no &lt;code&gt;if amount &amp;gt; $5, ask me first&lt;/code&gt;. There's nothing.&lt;/p&gt;

&lt;p&gt;I just shipped &lt;strong&gt;mcp-guard&lt;/strong&gt;, a tiny open-source gateway that sits between your agent and any MCP server. It's one &lt;code&gt;pip install&lt;/code&gt; and one config file away from being useful.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;bonanza-mcp-guard
mcp-guard scan     &lt;span class="c"&gt;# check your existing config for holes&lt;/span&gt;
mcp-guard serve    &lt;span class="c"&gt;# wrap any MCP server in 30 seconds&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here's what it does, why I built it, and how to wire it into your stack today.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem I kept running into
&lt;/h2&gt;

&lt;p&gt;When I started shipping agents that talk to paid APIs (Stripe, OpenAI, Anthropic, Twilio, weather APIs), I wanted &lt;strong&gt;five things&lt;/strong&gt; that MCP didn't give me out of the box:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Authentication&lt;/strong&gt; — who's calling this? Is the agent who it claims to be?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rate limits&lt;/strong&gt; — per agent, per tool, per minute. Stop one misbehaving agent from blowing up the budget.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spend caps&lt;/strong&gt; — &lt;code&gt;wallet_pay&lt;/code&gt; to the value of $50 should require my approval. Always.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit log&lt;/strong&gt; — JSONL of every tool call: who, what, when, how much, what happened next.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Approval queue&lt;/strong&gt; — when something expensive or sensitive comes through, hold it. Send me a Slack message. Let me approve or deny from my phone.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;MCP itself is great. It's a clean protocol. It doesn't try to be a security layer — and that's the right call for a protocol spec. But somebody has to build the security layer.&lt;/p&gt;

&lt;p&gt;So I did.&lt;/p&gt;

&lt;h2&gt;
  
  
  What mcp-guard does
&lt;/h2&gt;

&lt;p&gt;mcp-guard is a &lt;strong&gt;transparent proxy&lt;/strong&gt;. You put it in front of any MCP server (stdio or HTTP) and it enforces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔐 &lt;strong&gt;4 auth modes&lt;/strong&gt; — none, API key (timing-safe SHA-256), JWT, or full &lt;strong&gt;OAuth2 with PKCE + Device flow&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;🚦 &lt;strong&gt;Rate limits&lt;/strong&gt; — &lt;code&gt;30 req/min&lt;/code&gt;, configurable per-agent or globally&lt;/li&gt;
&lt;li&gt;💸 &lt;strong&gt;Spend caps&lt;/strong&gt; — &lt;code&gt;require_approval_above: 5.0&lt;/code&gt; → tool calls ≥ $5 get held in the approval queue&lt;/li&gt;
&lt;li&gt;🧾 &lt;strong&gt;Audit logs&lt;/strong&gt; — JSONL, one line per call, ready for Splunk/Datadog/whatever&lt;/li&gt;
&lt;li&gt;✋ &lt;strong&gt;Approval queue&lt;/strong&gt; — SQLite-backed. Agent gets &lt;code&gt;-32004 approval_pending&lt;/code&gt; with an &lt;code&gt;approval_id&lt;/code&gt;. Human runs &lt;code&gt;mcp-guard approvals approve &amp;lt;id&amp;gt;&lt;/code&gt;. Done.&lt;/li&gt;
&lt;li&gt;🚫 &lt;strong&gt;Tool allowlist/denylist&lt;/strong&gt; — &lt;code&gt;deny: ["filesystem.delete", "wallet_pay"]&lt;/code&gt; per server&lt;/li&gt;
&lt;li&gt;📊 &lt;strong&gt;Prometheus metrics&lt;/strong&gt; — &lt;code&gt;GET /metrics&lt;/code&gt; on the HTTP gateway, drop-in for Grafana&lt;/li&gt;
&lt;li&gt;🐳 &lt;strong&gt;Docker image&lt;/strong&gt; — &lt;code&gt;docker run mcp-guard serve --config /etc/mcp-guard.yaml&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;🔀 &lt;strong&gt;Multi-server routing&lt;/strong&gt; — one gateway, many backends. Route &lt;code&gt;wallet_pay&lt;/code&gt; → bonanza, &lt;code&gt;read_file&lt;/code&gt; → filesystem, default → search.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The whole thing is &lt;strong&gt;zero required dependencies&lt;/strong&gt; (pyyaml only if you want YAML configs) and &lt;strong&gt;~2,900 lines of Python&lt;/strong&gt;. You can read the whole codebase in an afternoon.&lt;/p&gt;

&lt;h2&gt;
  
  
  5-minute setup
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Install
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="s2"&gt;"bonanza-mcp-guard[yaml]"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Scan your existing config
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mcp-guard scan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This walks your Claude Desktop config (&lt;code&gt;~/Library/Application Support/Claude/&lt;/code&gt;), Cursor config (&lt;code&gt;~/.cursor/mcp.json&lt;/code&gt;), and any local &lt;code&gt;mcp.json&lt;/code&gt; files. It flags:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔴 MCP servers without any auth&lt;/li&gt;
&lt;li&gt;🔴 Direct stdio commands (no wrapper, no policy, no logs)&lt;/li&gt;
&lt;li&gt;🟡 Remote URLs without obvious auth&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It doesn't fix anything — just shows you the holes.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Wrap your MCP server
&lt;/h3&gt;

&lt;p&gt;Create a config file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# mcp-guard.yaml&lt;/span&gt;
&lt;span class="na"&gt;auth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;api_key&lt;/span&gt;
  &lt;span class="na"&gt;keys&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;${AGENT_API_KEY}&lt;/span&gt;

&lt;span class="na"&gt;rate_limit&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;requests_per_minute&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;30&lt;/span&gt;

&lt;span class="na"&gt;policies&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;spend_cap_usd&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100.0&lt;/span&gt;
  &lt;span class="na"&gt;require_approval_above&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5.0&lt;/span&gt;
  &lt;span class="na"&gt;deny&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;filesystem.delete_file&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;wallet_pay.bulk_transfer&lt;/span&gt;
  &lt;span class="na"&gt;audit_log&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./audit.jsonl&lt;/span&gt;

&lt;span class="na"&gt;servers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;filesystem&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npx&lt;/span&gt;
    &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-y"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;@modelcontextprotocol/server-filesystem"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/data"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it:&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="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;AGENT_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;openssl rand &lt;span class="nt"&gt;-hex&lt;/span&gt; 32&lt;span class="si"&gt;)&lt;/span&gt;
mcp-guard serve &lt;span class="nt"&gt;--config&lt;/span&gt; mcp-guard.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your agent now hits &lt;code&gt;mcp-guard&lt;/code&gt; instead of the bare MCP server. Everything works the same — but every call is now authenticated, rate-limited, audited, and (if it's expensive) held for approval.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Handle approvals
&lt;/h3&gt;

&lt;p&gt;When the agent calls &lt;code&gt;wallet_pay&lt;/code&gt; with &lt;code&gt;$amount: 10&lt;/code&gt;, it gets back:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jsonrpc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;-32004&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Tool call held for approval"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"approval_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"appr_7f3a9c"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"tool"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"wallet_pay"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"amount_usd"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;10.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"expires_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1719336000&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You see this in your audit log, your Slack, your phone. You run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mcp-guard approvals list
mcp-guard approvals approve appr_7f3a9c
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent retries, the call goes through, the audit log records your decision.&lt;/p&gt;

&lt;p&gt;State is &lt;strong&gt;persistent&lt;/strong&gt; (SQLite), so approvals survive restarts. And &lt;code&gt;require_approval_above&lt;/code&gt; is &lt;strong&gt;per-tool, per-amount&lt;/strong&gt; — &lt;code&gt;$4.99&lt;/code&gt; goes through, &lt;code&gt;$5.01&lt;/code&gt; waits.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Wire it up to your CI
&lt;/h3&gt;

&lt;p&gt;mcp-guard ships with a &lt;strong&gt;GitHub Action&lt;/strong&gt; that scans your MCP configs on every PR:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# .github/workflows/mcp-scan.yml&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mcp-scan&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;scan&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;c6zks4gssn-droid/mcp-guard/.github/workflows/mcp-scan.yml@main&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I tested it on mcp-guard itself with a &lt;code&gt;.mcp.json&lt;/code&gt; fixture — it posted a live comment on the PR with 6 warnings, then merged clean. See the &lt;a href="https://github.com/c6zks4gssn-droid/mcp-guard/pull/1" rel="noopener noreferrer"&gt;test PR&lt;/a&gt; for the actual output.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I learned building this
&lt;/h2&gt;

&lt;p&gt;A few things that surprised me:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The approval queue is the killer feature.&lt;/strong&gt; I expected auth and rate limiting to be the headlines. Nope — the moment I shipped the approval queue, every single person who tested it said "oh, this is what I needed." When an agent wants to spend money, you want a human in the loop. That turns out to be the entire pitch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. JSON-RPC error codes are your API surface.&lt;/strong&gt; &lt;code&gt;-32004 approval_pending&lt;/code&gt; is now a stable contract that tools and dashboards can build against. Pick your extension codes carefully — they're forever.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. PKCE without a JWT library is easier than I thought.&lt;/strong&gt; mcp-guard's OAuth2 provider does HMAC-SHA256 signed access tokens with PKCE S256. Zero JWT deps, ~150 lines of code, RFC-compliant.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Docker is the secret weapon for stdio MCP.&lt;/strong&gt; The HTTP transport (&lt;code&gt;mcp-guard serve-http&lt;/code&gt;) is great, but the killer app is wrapping a stdio server in Docker, exposing it as HTTP, and putting a real auth layer in front. Suddenly every MCP server in the world is reachable from a browser tab.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it's not
&lt;/h2&gt;

&lt;p&gt;I want to be upfront about what's missing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No per-agent tool allowlist yet.&lt;/strong&gt; Today you can deny tools globally per server. Per-agent allowlists are on the roadmap (issue tracker).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No dashboard.&lt;/strong&gt; Audit log is JSONL — great for piping into Datadog, bad for humans.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OAuth2 state is in-memory.&lt;/strong&gt; Multi-replica deployments need a database backend (Redis or SQLite).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If any of those block you, open an issue. I ship fast when someone files a real bug.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/c6zks4gssn-droid/mcp-guard" rel="noopener noreferrer"&gt;https://github.com/c6zks4gssn-droid/mcp-guard&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PyPI:&lt;/strong&gt; &lt;code&gt;pip install bonanza-mcp-guard&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker:&lt;/strong&gt; &lt;code&gt;docker pull ghcr.io/c6zks4gssn-droid/mcp-guard:v0.1.4&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Issues:&lt;/strong&gt; &lt;a href="https://github.com/c6zks4gssn-droid/mcp-guard/issues" rel="noopener noreferrer"&gt;https://github.com/c6zks4gssn-droid/mcp-guard/issues&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're shipping agents that talk to MCP servers, give it 5 minutes. Scan your config, wrap one server, send one expensive tool call through it. If it doesn't immediately make sense why you need this, I'm happy to refund your time.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;About me:&lt;/strong&gt; I run &lt;a href="https://bonanza-labs.com" rel="noopener noreferrer"&gt;Bonanza Labs&lt;/a&gt; — we ship security and tooling for the agent economy. mcp-guard is one of a dozen open-source packages we maintain. Follow me on X (&lt;a href="https://x.com/myopenclaw" rel="noopener noreferrer"&gt;@myopenclaw&lt;/a&gt;) if you want to see what we're working on next.&lt;/p&gt;

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