<?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>Forem: Michael Kayode Onyekwere</title>
    <description>The latest articles on Forem by Michael Kayode Onyekwere (@michael_onyekwere).</description>
    <link>https://forem.com/michael_onyekwere</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%2F3811816%2F04986db6-d6fd-41d5-a2a5-be996dc4580e.png</url>
      <title>Forem: Michael Kayode Onyekwere</title>
      <link>https://forem.com/michael_onyekwere</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/michael_onyekwere"/>
    <language>en</language>
    <item>
      <title>AGENTSCORE-2026-0005: `@planu/cli` risk change detected</title>
      <dc:creator>Michael Kayode Onyekwere</dc:creator>
      <pubDate>Fri, 17 Apr 2026 19:42:10 +0000</pubDate>
      <link>https://forem.com/michael_onyekwere/agentscore-2026-0005-planucli-risk-change-detected-51gc</link>
      <guid>https://forem.com/michael_onyekwere/agentscore-2026-0005-planucli-risk-change-detected-51gc</guid>
      <description>&lt;p&gt;&lt;a class="mentioned-user" href="https://dev.to/planu"&gt;@planu&lt;/a&gt;/cli updated from 1.68.0 to 1.69.0. Score changed 85/100 to 65/100 (-20). Risk: LOW to ELEVATED. 3 findings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Package
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Name:&lt;/strong&gt; &lt;code&gt;@planu/cli&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Version:&lt;/strong&gt; 1.68.0 to 1.69.0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Score:&lt;/strong&gt; 85/100 to 65/100&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Risk:&lt;/strong&gt; LOW to ELEVATED&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Findings
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;[MEDIUM]&lt;/strong&gt; no_repository: Package has no repository link — source code is not verifiable&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[HIGH]&lt;/strong&gt; command_injection: Potential command injection: shell execution with template literal input&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[LOW]&lt;/strong&gt; no_provenance: Package is not published with provenance attestations or trusted publishing. Published by: planudev&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Full advisory: &lt;a href="https://agentscores.xyz/security/advisories#AGENTSCORE-2026-0005" rel="noopener noreferrer"&gt;AGENTSCORE-2026-0005&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Verdict API: &lt;code&gt;curl https://agentscores.xyz/api/verdict?npm=%40planu%2Fcli&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Auto-published by &lt;a href="https://agentscores.xyz" rel="noopener noreferrer"&gt;AgentScore&lt;/a&gt; MCP security monitoring.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>mcp</category>
      <category>npm</category>
      <category>supplychain</category>
    </item>
    <item>
      <title>MCP Ecosystem Security Pulse: Mid-April 2026</title>
      <dc:creator>Michael Kayode Onyekwere</dc:creator>
      <pubDate>Thu, 16 Apr 2026 19:29:52 +0000</pubDate>
      <link>https://forem.com/michael_onyekwere/mcp-ecosystem-security-pulse-mid-april-2026-f40</link>
      <guid>https://forem.com/michael_onyekwere/mcp-ecosystem-security-pulse-mid-april-2026-f40</guid>
      <description>&lt;p&gt;We continuously monitor MCP server packages on npm. Last month we published the first ecosystem snapshot. This is the update, with new data, new incidents, and a new capability we have not seen anyone else ship yet.&lt;/p&gt;

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

&lt;p&gt;351 packages monitored, up from 316 last month. 6,400+ scans completed. Every package is rescanned on a rolling basis, with real-time detection of new npm publishes via the registry changes feed.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Risk Level&lt;/th&gt;
&lt;th&gt;Packages&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;LOW&lt;/td&gt;
&lt;td&gt;273&lt;/td&gt;
&lt;td&gt;78%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MODERATE&lt;/td&gt;
&lt;td&gt;61&lt;/td&gt;
&lt;td&gt;17%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ELEVATED&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HIGH&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CRITICAL&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Mean score: 89/100. Median: 95/100. 59 packages score a perfect 100. The ecosystem is getting marginally cleaner as more maintainers adopt provenance attestations.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed since last month
&lt;/h2&gt;

&lt;p&gt;The biggest shift is not in the scan data. It is in what we can now tell you about each package.&lt;/p&gt;

&lt;p&gt;We built a capability taxonomy that classifies every MCP tool into 15 categories: file system read, file system write, repository read, repository write, shell execution, browser automation, network egress, database access, secrets access, email/messaging, cloud infrastructure, persistent memory, search/retrieval, code analysis, and unknown.&lt;/p&gt;

&lt;p&gt;When you scan a package now, you don't just get a score. You get a breakdown of what powers that package gives to your AI.&lt;/p&gt;

&lt;p&gt;Example: &lt;code&gt;@modelcontextprotocol/server-github&lt;/code&gt; has 26 tools. Capability surface:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CRITICAL&lt;/strong&gt;: Repository write (create issues, PRs, branches, merge PRs)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HIGH&lt;/strong&gt;: File system write, outbound network&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MEDIUM&lt;/strong&gt;: File system read, search&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LOW&lt;/strong&gt;: Repository read&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is different from "score 85/100." It tells you what you are actually granting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Incidents detected
&lt;/h2&gt;

&lt;p&gt;Four advisories published since monitoring began:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AGENTSCORE-2026-0004: @opentabs-dev/mcp-server&lt;/strong&gt; (April 13)&lt;br&gt;
Score dropped 85 to 65. New command injection pattern in v0.0.95 (shell execution with template literal input). Package has 50 MCP tools including secrets access and cloud infrastructure capabilities. No repository link, no provenance. Published by individual account.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AGENTSCORE-2026-0003: local-mcp&lt;/strong&gt; (April 11)&lt;br&gt;
Score dropped 90 to 70. Command injection pattern appeared in v3.0.50. On investigation, the pattern was in a setup utility (&lt;code&gt;execSync&lt;/code&gt; with template literal), not in the MCP runtime. Inputs were hardcoded strings from a static array. We classified this as a code smell, not an exploitable vulnerability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AGENTSCORE-2026-0002: agent-recall-mcp&lt;/strong&gt; (April 10)&lt;br&gt;
Score dropped 95 to 85. Lost repository link and provenance in new version.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AGENTSCORE-2026-0001: &lt;a class="mentioned-user" href="https://dev.to/agenttrust"&gt;@agenttrust&lt;/a&gt;/mcp-server&lt;/strong&gt; (April 9)&lt;br&gt;
Score dropped 95 to 85. Same pattern as agent-recall-mcp: lost repository link and provenance.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pattern worth watching
&lt;/h2&gt;

&lt;p&gt;The opentabs-dev incident is the most interesting. Here is a package with 50 tools, including capabilities classified as secrets access and cloud infrastructure management. It introduced a command injection pattern in a version bump. It has no repository link, so the source is not publicly auditable. It has no provenance, so there is no verifiable build chain.&lt;/p&gt;

&lt;p&gt;That combination, broad capability surface plus low publisher posture plus code-level findings, is the risk profile that deserves attention in the MCP ecosystem. Most packages do not have this combination. But the ones that do are the ones where a compromise would have the widest impact.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we are building
&lt;/h2&gt;

&lt;p&gt;Beyond the scanner and advisory feed, we shipped three things this month:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Capability diffs in CI.&lt;/strong&gt; If you run the AgentScore Policy Gate in GitHub Actions, every PR now shows what AI capabilities each MCP package grants and what changed since the last run. "New AI capabilities introduced: browser automation via @playwright/mcp." That makes capability changes visible in code review instead of invisible at install time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Package watch alerts.&lt;/strong&gt; On any package report page, you can enter your email and get notified when that package changes score, risk, or capability surface. No account needed. One field.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repo preview.&lt;/strong&gt; Paste any GitHub repo URL on our policy gate page and see what MCP packages it uses, what capabilities they expose, and what the gate would do. No install, no API key, no YAML. Just a preview of what your AI has access to.&lt;/p&gt;

&lt;h2&gt;
  
  
  The broader context
&lt;/h2&gt;

&lt;p&gt;The MCP ecosystem is growing fast. 97 million monthly SDK downloads. 10,000+ public servers. Anthropic donated MCP to the Linux Foundation's Agentic AI Foundation, co-founded with Block and OpenAI. GitHub now supports MCP registry URLs for Copilot with admin-level access controls.&lt;/p&gt;

&lt;p&gt;The security surface is growing with it. 30 CVEs were filed against MCP servers and clients in January and February alone. The OWASP MCP Top 10 project is in beta, with supply chain attacks (MCP04) as a top risk category. Our scan data has been incorporated into the OWASP project.&lt;/p&gt;

&lt;p&gt;Funded players are entering the space. Runlayer raised $11M for a runtime MCP gateway. Backslash raised $19M for enterprise AI security including MCP coverage. Snyk launched Agent Scan for local MCP config scanning.&lt;/p&gt;

&lt;p&gt;What nobody else is doing yet, as far as we can tell, is merge-path capability gating: showing what powers each MCP package grants, tracking capability changes between CI runs, and enforcing approval policies at the capability level. That is what we built.&lt;/p&gt;

&lt;h2&gt;
  
  
  Follow this
&lt;/h2&gt;

&lt;p&gt;Advisories: &lt;a href="https://agentscores.xyz/security/advisories" rel="noopener noreferrer"&gt;https://agentscores.xyz/security/advisories&lt;/a&gt;&lt;br&gt;
RSS: &lt;a href="https://agentscores.xyz/security/advisories/rss.xml" rel="noopener noreferrer"&gt;https://agentscores.xyz/security/advisories/rss.xml&lt;/a&gt;&lt;br&gt;
Scan any package: &lt;a href="https://agentscores.xyz" rel="noopener noreferrer"&gt;https://agentscores.xyz&lt;/a&gt;&lt;br&gt;
Watch a package: sign up on any report page (e.g. &lt;a href="https://agentscores.xyz/report/mcp-trust-guard" rel="noopener noreferrer"&gt;https://agentscores.xyz/report/mcp-trust-guard&lt;/a&gt;)&lt;br&gt;
Preview your repo: &lt;a href="https://agentscores.xyz/policy-gate" rel="noopener noreferrer"&gt;https://agentscores.xyz/policy-gate&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Published by AgentScore. We monitor the MCP ecosystem so you don't have to.&lt;/p&gt;

</description>
      <category>security</category>
      <category>mcp</category>
      <category>npm</category>
      <category>monitoring</category>
    </item>
    <item>
      <title>My Claude Code agent stopped forgetting. Here's the 2-minute setup.</title>
      <dc:creator>Michael Kayode Onyekwere</dc:creator>
      <pubDate>Thu, 16 Apr 2026 18:07:05 +0000</pubDate>
      <link>https://forem.com/michael_onyekwere/my-claude-code-agent-stopped-forgetting-heres-the-2-minute-setup-1c8c</link>
      <guid>https://forem.com/michael_onyekwere/my-claude-code-agent-stopped-forgetting-heres-the-2-minute-setup-1c8c</guid>
      <description>&lt;p&gt;I fix a bug on Monday. On Wednesday my agent debugs the same bug from scratch.&lt;/p&gt;

&lt;p&gt;I tell it "use pnpm, not npm" and by Thursday it's running npm again. I solve an FFmpeg audio issue at 2am and three weeks later I'm staring at the exact same stack trace, wondering if I'm losing my mind or if my agent is.&lt;/p&gt;

&lt;p&gt;The problem isn't that AI assistants are bad at coding. They're good. The problem is they have no memory between sessions. Every conversation starts from zero.&lt;/p&gt;

&lt;h2&gt;
  
  
  I tried the existing tools
&lt;/h2&gt;

&lt;p&gt;Mem0 needs an OpenAI API key and a cloud account. Letta wants you to self-host a server. The official MCP memory server uses a knowledge graph I didn't need. I wanted something simpler: store things locally, search them, get them back when relevant, and know which ones are still true.&lt;/p&gt;

&lt;p&gt;That last part turned out to be the hard part.&lt;/p&gt;

&lt;h2&gt;
  
  
  330 memories and my agent got worse
&lt;/h2&gt;

&lt;p&gt;After two months of building a memory system, I had 330 memories in my database. And my agent started breaking things.&lt;/p&gt;

&lt;p&gt;Not because it forgot. Because it remembered too much. An old rule said "always apply loudnorm to voice audio." A newer rule said "never apply loudnorm." Both were active. Both were retrievable. The agent picked the wrong one and ruined a production build.&lt;/p&gt;

&lt;p&gt;Storage isn't the problem. Trust is the problem. Your agent needs to know which memories are still true and which ones got replaced.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/Thezenmonster/agentmem" rel="noopener noreferrer"&gt;agentmem&lt;/a&gt; is governed memory for coding agents. Every memory has a trust status:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;hypothesis → active → validated → deprecated / superseded
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Validated memories rank highest in recall. Deprecated ones are excluded entirely. If two memories contradict each other, the system catches it. If a memory's source file changed since it was recorded, the system flags it as stale.&lt;/p&gt;

&lt;p&gt;It runs on SQLite. No cloud. No API keys. No vector database. Just a .db file in your project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup (actually 2 minutes)
&lt;/h2&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;quilmem[mcp]
agentmem init &lt;span class="nt"&gt;--tool&lt;/span&gt; claude &lt;span class="nt"&gt;--project&lt;/span&gt; myapp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The init command creates your database, adds a starter memory, and prints the MCP config. Paste it into your editor settings, restart, done. Your agent now has 13 memory tools.&lt;/p&gt;

&lt;p&gt;Works with Claude Code, Cursor, Codex CLI, and Windsurf.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it looks like in practice
&lt;/h2&gt;

&lt;p&gt;My agent runs load_session at the start of every conversation. It picks up where the last session left off. No context lost.&lt;/p&gt;

&lt;p&gt;When it learns something new, it stores it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;agentmem add &lt;span class="nt"&gt;--type&lt;/span&gt; bug &lt;span class="nt"&gt;--title&lt;/span&gt; &lt;span class="s2"&gt;"loudnorm lifts noise floor"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--status&lt;/span&gt; validated &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"Never apply loudnorm to final mix. It re-normalizes everything."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When I want to know if the memory system is healthy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;agentmem health
&lt;span class="c"&gt;# Health: 92/100 | Conflicts: 0 | Stale: 1 | Validated: 48&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When two rules contradict each other, I find out before they break something:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;agentmem conflicts
&lt;span class="c"&gt;# !! "Always apply loudnorm" vs "Never apply loudnorm"&lt;/span&gt;
&lt;span class="c"&gt;# Contradiction on shared topic (voice, loudnorm, audio)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Results after 65 production builds
&lt;/h2&gt;

&lt;p&gt;I produce short-form video with an AI pipeline. Voice generation, image prompting, FFmpeg assembly, uploads. Lots of settings, lots of things that can break.&lt;/p&gt;

&lt;p&gt;Since deploying governed memory: zero repeated production bugs. Not "fewer." Zero. Every bug gets caught once, fixed once, stored as validated, and never repeated.&lt;/p&gt;

&lt;p&gt;The database went from 330 unmanaged memories to 226 governed ones. The 104 that got cut were stale, contradictory, or superseded. They were noise that made my agent worse, not better.&lt;/p&gt;

&lt;h2&gt;
  
  
  The copy-paste agent instructions
&lt;/h2&gt;

&lt;p&gt;This is the part most memory tools skip. Installing the tool isn't enough. You have to tell your agent how to use it.&lt;/p&gt;

&lt;p&gt;Paste this into your CLAUDE.md (or .cursorrules for Cursor):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Memory (agentmem)&lt;/span&gt;

You have governed memory via MCP tools.
&lt;span class="p"&gt;
-&lt;/span&gt; Session start: call load_session to restore context.
&lt;span class="p"&gt;-&lt;/span&gt; Session end: call save_session with what was done, in progress, blocked.
&lt;span class="p"&gt;-&lt;/span&gt; Before acting on a remembered rule: call search_memory to verify it's active/validated.
&lt;span class="p"&gt;-&lt;/span&gt; When you learn something durable: search first (no duplicates), then add_memory.
&lt;span class="p"&gt;-&lt;/span&gt; Trust: validated &amp;gt; active &amp;gt; hypothesis. Deprecated excluded from recall.
&lt;span class="p"&gt;-&lt;/span&gt; Health: Run memory_health periodically. Flag conflicts to user.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That block is the difference between "memory is installed" and "memory is actually used."&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&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;quilmem[mcp]
agentmem init &lt;span class="nt"&gt;--tool&lt;/span&gt; claude &lt;span class="nt"&gt;--project&lt;/span&gt; myapp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;GitHub: &lt;a href="https://github.com/Thezenmonster/agentmem" rel="noopener noreferrer"&gt;github.com/Thezenmonster/agentmem&lt;/a&gt;&lt;br&gt;
Docs: &lt;a href="https://thezenmonster.github.io/agentmem/" rel="noopener noreferrer"&gt;thezenmonster.github.io/agentmem&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MIT licensed. Zero infrastructure. 84 tests. Works with Claude Code, Cursor, Codex, Windsurf.&lt;/p&gt;

&lt;p&gt;If your agent keeps forgetting things between sessions, or worse, remembering the wrong things, this fixes it. Two commands.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>mcp</category>
      <category>opensource</category>
    </item>
    <item>
      <title>AGENTSCORE-2026-0004: `@opentabs-dev/mcp-server` risk change detected</title>
      <dc:creator>Michael Kayode Onyekwere</dc:creator>
      <pubDate>Mon, 13 Apr 2026 14:04:09 +0000</pubDate>
      <link>https://forem.com/michael_onyekwere/agentscore-2026-0004-opentabs-devmcp-server-risk-change-detected-44cg</link>
      <guid>https://forem.com/michael_onyekwere/agentscore-2026-0004-opentabs-devmcp-server-risk-change-detected-44cg</guid>
      <description>&lt;p&gt;@opentabs-dev/mcp-server updated from 0.0.94 to 0.0.95. Score changed 85/100 to 65/100 (-20). Risk: LOW to ELEVATED. 3 findings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Package
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Name:&lt;/strong&gt; &lt;code&gt;@opentabs-dev/mcp-server&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Version:&lt;/strong&gt; 0.0.94 to 0.0.95&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Score:&lt;/strong&gt; 85/100 to 65/100&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Risk:&lt;/strong&gt; LOW to ELEVATED&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Findings
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;[MEDIUM]&lt;/strong&gt; no_repository: Package has no repository link — source code is not verifiable&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[HIGH]&lt;/strong&gt; command_injection: Potential command injection: shell execution with template literal input&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[LOW]&lt;/strong&gt; no_provenance: Package is not published with provenance attestations or trusted publishing. Published by: opentabs-dev-admin&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Affected MCP Servers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@opentabs-dev/cli&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Full advisory: &lt;a href="https://agentscores.xyz/security/advisories#AGENTSCORE-2026-0004" rel="noopener noreferrer"&gt;AGENTSCORE-2026-0004&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Verdict API: &lt;code&gt;curl https://agentscores.xyz/api/verdict?npm=%40opentabs-dev%2Fmcp-server&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Auto-published by &lt;a href="https://agentscores.xyz" rel="noopener noreferrer"&gt;AgentScore&lt;/a&gt; MCP security monitoring.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>mcp</category>
      <category>npm</category>
      <category>supplychain</category>
    </item>
    <item>
      <title>AGENTSCORE-2026-0003: `local-mcp` risk change detected</title>
      <dc:creator>Michael Kayode Onyekwere</dc:creator>
      <pubDate>Sat, 11 Apr 2026 17:42:08 +0000</pubDate>
      <link>https://forem.com/michael_onyekwere/agentscore-2026-0003-local-mcp-risk-change-detected-11n1</link>
      <guid>https://forem.com/michael_onyekwere/agentscore-2026-0003-local-mcp-risk-change-detected-11n1</guid>
      <description>&lt;p&gt;local-mcp updated from 3.0.49 to 3.0.50. Score changed 90/100 to 70/100 (-20). Risk: LOW to MODERATE. 3 findings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Package
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Name:&lt;/strong&gt; &lt;code&gt;local-mcp&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Version:&lt;/strong&gt; 3.0.49 to 3.0.50&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Score:&lt;/strong&gt; 90/100 to 70/100&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Risk:&lt;/strong&gt; LOW to MODERATE&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Findings
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;[LOW]&lt;/strong&gt; install_script: Package has 'postinstall' script: node postinstall.js&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[HIGH]&lt;/strong&gt; command_injection: Potential command injection: shell execution with template literal input&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[LOW]&lt;/strong&gt; no_provenance: Package is not published with provenance attestations or trusted publishing. Published by: lanchuske&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Full advisory: &lt;a href="https://agentscores.xyz/security/advisories#AGENTSCORE-2026-0003" rel="noopener noreferrer"&gt;AGENTSCORE-2026-0003&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Verdict API: &lt;code&gt;curl https://agentscores.xyz/api/verdict?npm=local-mcp&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Auto-published by &lt;a href="https://agentscores.xyz" rel="noopener noreferrer"&gt;AgentScore&lt;/a&gt; MCP security monitoring.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>mcp</category>
      <category>npm</category>
      <category>supplychain</category>
    </item>
    <item>
      <title>AGENTSCORE-2026-0002: `agent-recall-mcp` risk change detected</title>
      <dc:creator>Michael Kayode Onyekwere</dc:creator>
      <pubDate>Fri, 10 Apr 2026 08:38:08 +0000</pubDate>
      <link>https://forem.com/michael_onyekwere/agentscore-2026-0002-agent-recall-mcp-risk-change-detected-hl7</link>
      <guid>https://forem.com/michael_onyekwere/agentscore-2026-0002-agent-recall-mcp-risk-change-detected-hl7</guid>
      <description>&lt;p&gt;agent-recall-mcp updated from 3.3.3 to 3.3.4. Score changed 95/100 to 85/100 (-10). Risk: LOW to LOW. 2 findings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Package
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Name:&lt;/strong&gt; &lt;code&gt;agent-recall-mcp&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Version:&lt;/strong&gt; 3.3.3 to 3.3.4&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Score:&lt;/strong&gt; 95/100 to 85/100&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Risk:&lt;/strong&gt; LOW to LOW&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Findings
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;[MEDIUM]&lt;/strong&gt; no_repository: Package has no repository link — source code is not verifiable&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[LOW]&lt;/strong&gt; no_provenance: Package is not published with provenance attestations or trusted publishing. Published by: tw260&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Full advisory: &lt;a href="https://agentscores.xyz/security/advisories#AGENTSCORE-2026-0002" rel="noopener noreferrer"&gt;AGENTSCORE-2026-0002&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Verdict API: &lt;code&gt;curl https://agentscores.xyz/api/verdict?npm=agent-recall-mcp&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Auto-published by &lt;a href="https://agentscores.xyz" rel="noopener noreferrer"&gt;AgentScore&lt;/a&gt; MCP security monitoring.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>mcp</category>
      <category>npm</category>
      <category>supplychain</category>
    </item>
    <item>
      <title>AGENTSCORE-2026-0001: `@agenttrust/mcp-server` risk change detected</title>
      <dc:creator>Michael Kayode Onyekwere</dc:creator>
      <pubDate>Thu, 09 Apr 2026 21:28:10 +0000</pubDate>
      <link>https://forem.com/michael_onyekwere/agentscore-2026-0001-agenttrustmcp-server-risk-change-detected-1fhm</link>
      <guid>https://forem.com/michael_onyekwere/agentscore-2026-0001-agenttrustmcp-server-risk-change-detected-1fhm</guid>
      <description>&lt;p&gt;&lt;a class="mentioned-user" href="https://dev.to/agenttrust"&gt;@agenttrust&lt;/a&gt;/mcp-server updated from 1.1.1 to 1.2.0. Score changed 95/100 to 85/100 (-10). Risk: LOW to LOW. 2 findings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Package
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Name:&lt;/strong&gt; &lt;code&gt;@agenttrust/mcp-server&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Version:&lt;/strong&gt; 1.1.1 to 1.2.0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Score:&lt;/strong&gt; 95/100 to 85/100&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Risk:&lt;/strong&gt; LOW to LOW&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Findings
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;[MEDIUM]&lt;/strong&gt; no_repository: Package has no repository link — source code is not verifiable&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[LOW]&lt;/strong&gt; no_provenance: Package is not published with provenance attestations or trusted publishing. Published by: agenttrust&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Full advisory: &lt;a href="https://agentscores.xyz/security/advisories#AGENTSCORE-2026-0001" rel="noopener noreferrer"&gt;AGENTSCORE-2026-0001&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Verdict API: &lt;code&gt;curl https://agentscores.xyz/api/verdict?npm=%40agenttrust%2Fmcp-server&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Auto-published by &lt;a href="https://agentscores.xyz" rel="noopener noreferrer"&gt;AgentScore&lt;/a&gt; MCP security monitoring.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>mcp</category>
      <category>npm</category>
      <category>supplychain</category>
    </item>
    <item>
      <title>MCP Ecosystem Security Pulse: April 2026</title>
      <dc:creator>Michael Kayode Onyekwere</dc:creator>
      <pubDate>Thu, 09 Apr 2026 09:28:22 +0000</pubDate>
      <link>https://forem.com/michael_onyekwere/mcp-ecosystem-security-pulse-april-2026-4pae</link>
      <guid>https://forem.com/michael_onyekwere/mcp-ecosystem-security-pulse-april-2026-4pae</guid>
      <description>&lt;p&gt;We monitor 316 MCP server packages on npm continuously. This is the first public snapshot of what the ecosystem looks like from a security perspective.&lt;/p&gt;

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

&lt;p&gt;4,600+ scans completed across 316 packages since monitoring began in late March. Every package is rescanned on a rolling basis, with real-time detection of new npm publishes via the registry changes feed.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Risk Level&lt;/th&gt;
&lt;th&gt;Packages&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;LOW&lt;/td&gt;
&lt;td&gt;241&lt;/td&gt;
&lt;td&gt;76%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MODERATE&lt;/td&gt;
&lt;td&gt;57&lt;/td&gt;
&lt;td&gt;18%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ELEVATED&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HIGH&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CRITICAL&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Mean score across the ecosystem: 89/100. Median: 95/100. 50 packages score a perfect 100.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we found
&lt;/h2&gt;

&lt;p&gt;The three most common findings across monitored packages:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Missing provenance.&lt;/strong&gt; The majority of MCP servers are published by individual npm accounts without provenance attestations or trusted publishing. This means there is no verifiable link between the source repository and the published artifact. When a maintainer account gets compromised (as happened with axios on March 31), there is no way to distinguish a legitimate release from a malicious one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Missing metadata.&lt;/strong&gt; Many packages lack a licence, repository link, or meaningful description. These are low-severity individually, but they signal low publish hygiene. Packages with incomplete metadata are harder to audit and verify.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source code patterns.&lt;/strong&gt; A small number of packages contain command injection patterns, unsafe eval with dynamic input, or hardcoded secrets in their published source. These are the highest-severity findings and affect 3 packages at HIGH risk.&lt;/p&gt;

&lt;h2&gt;
  
  
  Incidents this period
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;axios npm compromise (March 31).&lt;/strong&gt; Malicious versions 1.14.1 and 0.30.4 were published with a hidden dependency deploying a cross-platform RAT. Two monitored MCP servers (&lt;code&gt;exa-mcp-server&lt;/code&gt;, &lt;code&gt;tavily-mcp&lt;/code&gt;) had axios in their direct dependency chain. &lt;a href="https://dev.to/michael_onyekwere/what-the-axios-npm-compromise-means-for-mcp-server-maintainers-50bm"&gt;Full analysis&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Azure MCP Server CVE-2026-32211 (April 3).&lt;/strong&gt; CVSS 9.1 authentication flaw. Missing auth on the Azure MCP Server. We had flagged the package for install script concerns and missing provenance before the CVE was disclosed. &lt;a href="https://dev.to/michael_onyekwere/cve-2026-32211-what-the-azure-mcp-server-flaw-means-for-your-agent-security-14db"&gt;Full analysis&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The posture problem
&lt;/h2&gt;

&lt;p&gt;MCP servers are npm packages with all the supply chain risks that come with that. But they carry additional risk because they handle API tokens, file system access, and tool permissions that AI agents use to interact with production systems.&lt;/p&gt;

&lt;p&gt;The MCP specification makes authentication optional. The official registry lists servers but does not assess them. Most packages are published without provenance, meaning a compromised maintainer account can push malicious code with no structural safeguard.&lt;/p&gt;

&lt;p&gt;76% of the ecosystem scoring LOW is better than we expected. But 24% having findings, and 6% at ELEVATED or above, in a protocol that is gaining mainstream adoption, is worth paying attention to.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we check
&lt;/h2&gt;

&lt;p&gt;Install scripts, prompt injection patterns in metadata, source code patterns (command injection, unsafe eval, hardcoded secrets), publisher provenance, dependency count, and metadata completeness. We also extract MCP tool definitions from published source and track tool manifest changes over time.&lt;/p&gt;

&lt;p&gt;Full methodology: &lt;a href="https://agentscores.xyz/methodology" rel="noopener noreferrer"&gt;https://agentscores.xyz/methodology&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Follow this
&lt;/h2&gt;

&lt;p&gt;Security advisories are published automatically when a monitored package changes risk level:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Web: &lt;a href="https://agentscores.xyz/security/advisories" rel="noopener noreferrer"&gt;https://agentscores.xyz/security/advisories&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;RSS: &lt;a href="https://agentscores.xyz/security/advisories/rss.xml" rel="noopener noreferrer"&gt;https://agentscores.xyz/security/advisories/rss.xml&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;JSON: &lt;a href="https://agentscores.xyz/api/advisories" rel="noopener noreferrer"&gt;https://agentscores.xyz/api/advisories&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Scan any MCP package yourself at &lt;a href="https://agentscores.xyz" rel="noopener noreferrer"&gt;https://agentscores.xyz&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Published by &lt;a href="https://agentscores.xyz" rel="noopener noreferrer"&gt;AgentScore&lt;/a&gt;. We monitor the MCP ecosystem so you don't have to.&lt;/p&gt;

</description>
      <category>security</category>
      <category>mcp</category>
      <category>npm</category>
      <category>monitoring</category>
    </item>
    <item>
      <title>CVE-2026-32211: What the Azure MCP Server Flaw Means for Your Agent Security</title>
      <dc:creator>Michael Kayode Onyekwere</dc:creator>
      <pubDate>Sat, 04 Apr 2026 17:34:50 +0000</pubDate>
      <link>https://forem.com/michael_onyekwere/cve-2026-32211-what-the-azure-mcp-server-flaw-means-for-your-agent-security-14db</link>
      <guid>https://forem.com/michael_onyekwere/cve-2026-32211-what-the-azure-mcp-server-flaw-means-for-your-agent-security-14db</guid>
      <description>&lt;p&gt;On April 3, 2026, Microsoft disclosed CVE-2026-32211, a critical authentication flaw in the Azure MCP Server. CVSS score: 9.1. The vulnerability allows unauthorized access to sensitive data because the server is missing authentication mechanisms entirely.&lt;/p&gt;

&lt;p&gt;No patch is available yet. Microsoft has published mitigation guidance but the fix is pending.&lt;/p&gt;

&lt;p&gt;If your AI agents use Azure DevOps through MCP, this applies to you.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the vulnerability is
&lt;/h2&gt;

&lt;p&gt;The Azure MCP Server (&lt;code&gt;@azure-devops/mcp&lt;/code&gt; on npm) exposes tools for interacting with Azure DevOps: work items, repos, pipelines, pull requests. CVE-2026-32211 is an information disclosure flaw where the server lacks proper authentication, allowing an attacker to access sensitive data without valid credentials. That could include configuration details, API keys, authentication tokens, and project data.&lt;/p&gt;

&lt;p&gt;This is not a subtle bug. It is a missing authentication layer on a server that handles enterprise development infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  What our monitoring already showed
&lt;/h2&gt;

&lt;p&gt;We have been monitoring &lt;code&gt;@azure-devops/mcp&lt;/code&gt; since March 31 as part of our MCP ecosystem coverage. Before the CVE was disclosed, our scanner had already flagged two issues:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Install script with registry modification.&lt;/strong&gt; The package has a &lt;code&gt;preinstall&lt;/code&gt; script that runs &lt;code&gt;npm config set registry https://registry.npmjs.org/&lt;/code&gt;. This overrides any custom registry configuration on the installing machine. While not malicious on its own, install scripts that modify npm configuration are a documented supply chain attack vector (see the axios compromise from the same week).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. No provenance attestations.&lt;/strong&gt; The package is published by a personal npm account (&lt;code&gt;antonatms&lt;/code&gt;), not through GitHub Actions trusted publishing. There are no provenance attestations linking the published package to a verified build. This means there is no verifiable chain from the source repository to the published artifact.&lt;/p&gt;

&lt;p&gt;Our verdict API returns &lt;code&gt;warn&lt;/code&gt; for this package with a score of 75/100 and risk level MODERATE.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters for the MCP ecosystem
&lt;/h2&gt;

&lt;p&gt;The MCP specification currently makes authentication optional. The official docs note that "the MCP SDK does not include built-in authentication mechanisms." That design choice puts the responsibility on each MCP server implementation. When an implementation skips authentication, as the Azure MCP Server did, the result is a CVSS 9.1 vulnerability.&lt;/p&gt;

&lt;p&gt;This is not unique to Microsoft. The OWASP MCP Top 10 draft lists "Insufficient Authentication and Authorization" (MCP07) as a top risk for exactly this reason. Many MCP servers are published without authentication, running with whatever permissions the host environment grants.&lt;/p&gt;

&lt;p&gt;For teams deploying MCP servers in production, the question is not just "does this package have malware in it" but "does this server implement the security controls it should?"&lt;/p&gt;

&lt;h2&gt;
  
  
  What you should do
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;If you use &lt;code&gt;@azure-devops/mcp&lt;/code&gt;:&lt;/strong&gt;- Restrict network access to the MCP server endpoint using firewall rules&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Place a reverse proxy with authentication in front of the server&lt;/li&gt;
&lt;li&gt;Review access logs for unauthorised requests&lt;/li&gt;
&lt;li&gt;Monitor Microsoft's security update guide for the official patch&lt;/li&gt;
&lt;li&gt;Consider whether the server needs to be running until the patch is available&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;For any MCP server:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check whether the server implements authentication&lt;/li&gt;
&lt;li&gt;Review what tools the server exposes and whether the permission surface matches what you actually need&lt;/li&gt;
&lt;li&gt;Monitor your MCP dependencies for changes. Version bumps, new dependencies, and configuration changes all affect your security posture.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How we track this
&lt;/h2&gt;

&lt;p&gt;AgentScore monitors 60+ MCP packages continuously and provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Verdict API&lt;/strong&gt;: &lt;code&gt;GET /api/verdict?npm=@azure-devops/mcp&lt;/code&gt; returns allow/warn/block with reasons, publisher posture, and tool surface&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exposure API&lt;/strong&gt;: &lt;code&gt;GET /api/exposure?npm=@azure-devops/mcp&lt;/code&gt; shows which other monitored packages depend on the affected package&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Continuous monitoring&lt;/strong&gt;: changes to package versions, dependencies, and risk levels are detected automatically&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We flagged this package before the CVE was disclosed because the security signals were already visible: install script modifying registry config, no provenance, personal publisher account. These are the kinds of pre-incident indicators that continuous monitoring catches.&lt;/p&gt;

&lt;p&gt;Scan any MCP package for free at &lt;a href="https://agentscores.xyz" rel="noopener noreferrer"&gt;agentscores.xyz&lt;/a&gt;. For continuous monitoring or a detailed security review, &lt;a href="https://agentscores.xyz/contact" rel="noopener noreferrer"&gt;get in touch&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://agentscores.xyz" rel="noopener noreferrer"&gt;AgentScore&lt;/a&gt; is the trust and policy layer for the MCP ecosystem. We scan, monitor, and assess MCP packages so registries, clients, and teams can make informed decisions.&lt;/p&gt;

</description>
      <category>security</category>
      <category>mcp</category>
      <category>azure</category>
      <category>supplychain</category>
    </item>
    <item>
      <title>What the Axios npm Compromise Means for MCP Server Maintainers</title>
      <dc:creator>Michael Kayode Onyekwere</dc:creator>
      <pubDate>Fri, 03 Apr 2026 11:18:39 +0000</pubDate>
      <link>https://forem.com/michael_onyekwere/what-the-axios-npm-compromise-means-for-mcp-server-maintainers-50bm</link>
      <guid>https://forem.com/michael_onyekwere/what-the-axios-npm-compromise-means-for-mcp-server-maintainers-50bm</guid>
      <description>&lt;p&gt;On March 31, 2026, the axios npm package was compromised. A maintainer account was hijacked, and two malicious versions (1.14.1 and 0.30.4) were published with a hidden dependency that deployed a cross-platform remote access trojan. The versions were live for about three hours before removal.&lt;/p&gt;

&lt;p&gt;Axios has over 100 million weekly downloads. The blast radius was enormous.&lt;/p&gt;

&lt;p&gt;If you maintain an MCP server, this matters to you directly.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happened
&lt;/h2&gt;

&lt;p&gt;The attacker gained publishing access to the official axios package on npm. They didn't modify any axios source files. Instead, they added a new dependency, &lt;code&gt;plain-crypto-js@4.2.1&lt;/code&gt;, to the &lt;code&gt;package.json&lt;/code&gt;. That package had a &lt;code&gt;postinstall&lt;/code&gt; script that downloaded and executed platform-specific malware: a RAT on macOS, a PowerShell backdoor on Windows, a Python RAT on Linux.&lt;/p&gt;

&lt;p&gt;The attack was sophisticated. The malicious dependency had a "clean" version (&lt;code&gt;4.2.0&lt;/code&gt;) published 18 hours earlier to establish a brief history on the registry. The dropper used double-obfuscated code and self-deleted after execution.&lt;/p&gt;

&lt;p&gt;Full technical details are in &lt;a href="https://snyk.io/blog/axios-npm-package-compromised-supply-chain-attack-delivers-cross-platform/" rel="noopener noreferrer"&gt;Snyk's write-up&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why MCP server maintainers should care
&lt;/h2&gt;

&lt;p&gt;MCP servers are npm packages. They have dependencies. Those dependencies have dependencies. If your MCP server depends on axios (or on a package that depends on axios), and you or your CI ran &lt;code&gt;npm install&lt;/code&gt; without a lockfile during that three-hour window, you may have pulled the compromised version.&lt;/p&gt;

&lt;p&gt;This is not a hypothetical scenario. We scanned 20 MCP server packages the week before the incident. Two of them, exa-mcp-server and tavily-mcp, depend on axios directly. Both use semver ranges (&lt;code&gt;^1.13.6&lt;/code&gt; and &lt;code&gt;^1.6.7&lt;/code&gt; respectively) that would have resolved to the compromised 1.14.1 during the window.&lt;/p&gt;

&lt;p&gt;The MCP ecosystem is growing fast. The &lt;a href="https://modelcontextprotocol.io/introduction" rel="noopener noreferrer"&gt;official MCP site&lt;/a&gt; describes over 1,000 servers and 70+ compatible clients. Most of these are npm packages with conventional dependency trees. None of them are immune to supply chain attacks on popular packages.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you should do now
&lt;/h2&gt;

&lt;p&gt;Check your lockfile. If your &lt;code&gt;package-lock.json&lt;/code&gt; or &lt;code&gt;yarn.lock&lt;/code&gt; was committed before March 31 00:21 UTC and you did not run &lt;code&gt;npm install&lt;/code&gt; during the window, you were not affected. Lockfiles are the first line of defence.&lt;/p&gt;

&lt;p&gt;Search for the malicious dependency. Run &lt;code&gt;npm ls plain-crypto-js&lt;/code&gt; in your project. If it appears, you were affected.&lt;/p&gt;

&lt;p&gt;Pin your dependencies. Semver ranges like &lt;code&gt;^1.13.6&lt;/code&gt; are convenient but dangerous. They resolve to the latest matching version at install time. During a supply chain attack, "latest" means "compromised."&lt;/p&gt;

&lt;p&gt;Audit install scripts. The axios attack used a &lt;code&gt;postinstall&lt;/code&gt; hook to execute the payload. You can run &lt;code&gt;npm install --ignore-scripts&lt;/code&gt; in CI to prevent lifecycle scripts from executing, though this breaks packages that legitimately need &lt;code&gt;postinstall&lt;/code&gt; steps.&lt;/p&gt;

&lt;p&gt;Use lockfile enforcement in CI. Run &lt;code&gt;npm ci&lt;/code&gt; instead of &lt;code&gt;npm install&lt;/code&gt;. It installs exactly what the lockfile specifies, ignoring the registry's current latest.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this looks like structurally
&lt;/h2&gt;

&lt;p&gt;This attack worked because of three things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Implicit trust in established packages. Axios has been around for years. Nobody expects it to suddenly contain malware. But the package is only as secure as the maintainer accounts with publishing access.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Transitive dependency blindness. Most developers don't audit their dependencies' dependencies. The malicious code was in &lt;code&gt;plain-crypto-js&lt;/code&gt;, a package most axios users had never heard of.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Postinstall scripts as an attack vector. npm runs lifecycle scripts by default. A single &lt;code&gt;postinstall&lt;/code&gt; entry in a new dependency is enough to execute arbitrary code on every machine that installs it.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For MCP servers specifically, there is a fourth factor: MCP servers often need API tokens, file system access, and network permissions to function. A compromised dependency running inside an MCP server process has access to whatever the server has access to. That includes API keys, database connections, and the tools the server exposes to AI agents.&lt;/p&gt;

&lt;h2&gt;
  
  
  How we think about this
&lt;/h2&gt;

&lt;p&gt;At &lt;a href="https://agentscores.xyz" rel="noopener noreferrer"&gt;AgentScore&lt;/a&gt;, we scan MCP packages for security issues. Our scanner checks for &lt;code&gt;postinstall&lt;/code&gt; hooks with network calls, suspicious URLs, prompt injection patterns in metadata, and source code patterns like command injection and hardcoded secrets. We also run continuous monitoring on MCP packages and their direct dependencies, with alerts when versions change or risk levels shift.&lt;/p&gt;

&lt;p&gt;Our scanner would have flagged &lt;code&gt;plain-crypto-js@4.2.1&lt;/code&gt; for its &lt;code&gt;postinstall&lt;/code&gt; script. The question is whether you would have scanned it before installing it.&lt;/p&gt;

&lt;p&gt;That is the real gap in the ecosystem right now. Not detection capability, but routine. Most MCP server maintainers do not regularly audit their dependency chains. Most do not have monitoring that would catch a new malicious transitive dependency between releases.&lt;/p&gt;

&lt;p&gt;If you want to check your MCP server's dependency chain, you can scan it for free at &lt;a href="https://agentscores.xyz" rel="noopener noreferrer"&gt;agentscores.xyz&lt;/a&gt;. If you want ongoing monitoring, &lt;a href="https://agentscores.xyz/contact" rel="noopener noreferrer"&gt;get in touch&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The broader picture
&lt;/h2&gt;

&lt;p&gt;The same week as the axios compromise, Anthropic accidentally published Claude Code's source to npm via a packaging error. Different failure mode (accidental exposure, not malicious compromise) but the same underlying lesson: npm is critical infrastructure for the AI ecosystem, and packaging hygiene is not optional.&lt;/p&gt;

&lt;p&gt;The MCP ecosystem is built on npm. As it grows, it inherits all of npm's supply chain risks. The question is not whether another package will be compromised, but when, and whether you will know about it before it reaches your production environment.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://agentscores.xyz" rel="noopener noreferrer"&gt;AgentScore&lt;/a&gt; scans MCP packages for security issues and monitors dependencies for changes. Free scanner, no signup required.&lt;/p&gt;

</description>
      <category>security</category>
      <category>mcp</category>
      <category>npm</category>
      <category>supplychain</category>
    </item>
    <item>
      <title>My AI remembered the wrong thing and broke my build. So I built memory governance.</title>
      <dc:creator>Michael Kayode Onyekwere</dc:creator>
      <pubDate>Tue, 31 Mar 2026 02:34:55 +0000</pubDate>
      <link>https://forem.com/michael_onyekwere/my-ai-remembered-the-wrong-thing-and-broke-my-build-so-i-built-memory-governance-50b2</link>
      <guid>https://forem.com/michael_onyekwere/my-ai-remembered-the-wrong-thing-and-broke-my-build-so-i-built-memory-governance-50b2</guid>
      <description>&lt;p&gt;Six weeks ago I &lt;a href="https://dev.to/thezenmonster/i-gave-my-ai-coding-assistant-a-memory-it-changed-how-i-work-2jkh"&gt;gave my AI assistant a memory&lt;/a&gt;. It worked. No more re-explaining the project every session. Bugs got fixed once and stayed fixed.&lt;/p&gt;

&lt;p&gt;Then it followed a rule from January that I'd overridden in February, and the audio in my video sounded like a robot reading through a tin can.&lt;/p&gt;

&lt;p&gt;The old rule said "always apply loudnorm to voice audio." The new rule said "never do that — it lifts the noise floor." Both were in memory. Both active. Both ranked the same. The agent grabbed the wrong one and I didn't catch it until I listened to the export.&lt;/p&gt;

&lt;h2&gt;
  
  
  330 memories, no idea which ones were still valid
&lt;/h2&gt;

&lt;p&gt;I build YouTube Shorts with my AI assistant. Daily production — voice generation, image prompting, FFmpeg assembly, captions, upload. Over two months, the memory database grew to 330 entries. Bugs, fixes, decisions, settings, voice profiles, pipeline steps.&lt;/p&gt;

&lt;p&gt;Some of those entries were battle-tested rules that saved me hours every week. Some were from the first week, when I was still figuring things out, and they were just wrong. The database treated them all the same. No status. No history. No way to tell what was current.&lt;/p&gt;

&lt;p&gt;I looked at Mem0, Letta, Mengram. Good at storing and retrieving. None of them answer "is this memory still true, or did something else in this database already replace it?"&lt;/p&gt;

&lt;h2&gt;
  
  
  Lifecycle states
&lt;/h2&gt;

&lt;p&gt;Every memory now gets a status:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;hypothesis  →  active  →  validated
                          deprecated  •  superseded
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;New observations start as &lt;code&gt;hypothesis&lt;/code&gt;. They get promoted when confirmed. They get deprecated when disproven. If a new rule replaces an old one, the old one is marked &lt;code&gt;superseded&lt;/code&gt; and points to the replacement.&lt;/p&gt;

&lt;p&gt;Deprecated and superseded memories don't show up in search. The agent only sees current truth.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agentmem&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Memory&lt;/span&gt;

&lt;span class="n"&gt;mem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Memory&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;mem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;decision&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Never apply loudnorm to voice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Lifts noise floor. Use per-track volume instead.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;validated&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Kill the old wrong rule
&lt;/span&gt;&lt;span class="n"&gt;mem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;deprecate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;old_rule_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reason&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Causes robotic audio&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Agent now only sees the correct rule
&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;recall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;audio processing&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That alone would have prevented the tin-can incident.&lt;/p&gt;

&lt;h2&gt;
  
  
  1,848 conflicts (then 7)
&lt;/h2&gt;

&lt;p&gt;I ran conflict detection on the full production database.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agentmem&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;detect_conflicts&lt;/span&gt;

&lt;span class="n"&gt;conflicts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;detect_conflicts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_conn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;First run: 1,848. Matching any two memories that share a few words and contain "never" somewhere is not precise. After tuning — requiring 25% topic overlap and sentence-level negation matching instead of whole-document scanning — it found 7.&lt;/p&gt;

&lt;p&gt;All real. Duplicate entries from two different sync runs. A bug stored once as a "decision" and once as a "bug." Two session snapshots that were never properly superseded. The kind of thing that sits quietly in your database and degrades trust so slowly you don't notice until your agent does something wrong and you can't explain why.&lt;/p&gt;

&lt;h2&gt;
  
  
  Staleness
&lt;/h2&gt;

&lt;p&gt;Every memory now tracks where it came from — the source file, the section heading, and a hash of the content at import time. If the source file changes, the memory is flagged stale.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agentmem&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;detect_stale&lt;/span&gt;

&lt;span class="n"&gt;stale&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;detect_stale&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_conn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stale_days&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# [decision] "Use atempo 0.90" — Source changed since import (hash mismatch)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I had memories referencing files that had been renamed weeks ago. Rules updated in the markdown source but never re-synced to the database. Without provenance tracking, I'd have never known.&lt;/p&gt;

&lt;h2&gt;
  
  
  Health score
&lt;/h2&gt;

&lt;p&gt;One number. Can I trust what my agent knows right now.&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="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;agentmem health
&lt;span class="go"&gt;
Memory Health: 85/100
Total: 226
By status: validated: 14, active: 198, hypothesis: 12, deprecated: 2
Conflicts: 1
Stale: 3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Penalises conflicts, stale entries, orphaned supersedes, having zero validated memories. If you never explicitly confirm anything, the score reflects that. My production database started at 55.&lt;/p&gt;

&lt;h2&gt;
  
  
  65 videos later
&lt;/h2&gt;

&lt;p&gt;Before governance: 330 memories, all "active," 7 hidden contradictions, 104 duplicates. The agent sometimes followed outdated rules. I'd catch it in QA or I wouldn't.&lt;/p&gt;

&lt;p&gt;After: 226 active, 104 properly superseded, contradictions surfaced and resolved. Recall prioritises validated canonical rules over unprovenanced imports.&lt;/p&gt;

&lt;p&gt;65 videos built since the governance engine went live. Zero repeated production bugs.&lt;/p&gt;

&lt;p&gt;The database isn't bigger. It's cleaner. And the agent makes fewer mistakes because what it retrieves is actually right.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install
&lt;/h2&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;quilmem
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open source, local-first, no API keys, no cloud. SQLite underneath. Ships with a CLI, a Python API, and an MCP server with 13 tools that works with Claude Code, Cursor, and Codex.&lt;/p&gt;

&lt;p&gt;The governance stuff — lifecycle states, conflict detection, staleness, health scoring, provenance tracking — is all in the free core.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Thezenmonster/agentmem" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; / &lt;a href="https://thezenmonster.github.io/agentmem/" rel="noopener noreferrer"&gt;Landing page&lt;/a&gt; / &lt;a href="https://pypi.org/project/quilmem/" rel="noopener noreferrer"&gt;PyPI&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>productivity</category>
      <category>mcp</category>
    </item>
    <item>
      <title>I added agent verification to my MCP server in 3 minutes. Here's the before and after.</title>
      <dc:creator>Michael Kayode Onyekwere</dc:creator>
      <pubDate>Tue, 24 Mar 2026 12:34:37 +0000</pubDate>
      <link>https://forem.com/michael_onyekwere/i-added-agent-verification-to-my-mcp-server-in-3-minutes-heres-the-before-and-after-2f5g</link>
      <guid>https://forem.com/michael_onyekwere/i-added-agent-verification-to-my-mcp-server-in-3-minutes-heres-the-before-and-after-2f5g</guid>
      <description>&lt;p&gt;I run an MCP server that exposes tools to AI agents. Last week I checked my logs. Agents I'd never heard of were calling my tools. No identity. No verification. Just raw JSON-RPC requests from unknown callers.&lt;/p&gt;

&lt;p&gt;This is normal for MCP servers. The protocol has no built-in security. 10,000+ servers in production, and most accept connections from anything.&lt;/p&gt;

&lt;p&gt;I fixed mine. Here's what changed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/mcp&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;mcpHandler&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Any agent calls any tool. No questions asked.&lt;/p&gt;

&lt;h2&gt;
  
  
  After
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;McpGuard&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mcp-trust-guard&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;guard&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;McpGuard&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;abuseCheck&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;rateLimit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;window&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;max&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;minTrust&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;get_*&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;read_*&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;minTrust&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;create_*&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;update_*&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;minTrust&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;delete_*&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;execute_*&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;audit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/mcp&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;guard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;middleware&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/mcp&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;mcpHandler&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now every &lt;code&gt;tools/call&lt;/code&gt; request goes through four checks before the tool executes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Abuse database&lt;/strong&gt; — is this agent known to be malicious?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rate limit&lt;/strong&gt; — is this caller flooding my server?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trust score&lt;/strong&gt; — does this agent have enough reputation for this tool?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit log&lt;/strong&gt; — record who called what, when, and whether it was allowed&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The first thing I saw in the logs after enabling it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[mcp-guard] ALLOW known-agent → get_data (score: 42, band: MODERATE TRUST)
[mcp-guard] DENY  unknown-bot → delete_records (score: 0, band: ANONYMOUS)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An unknown agent was trying to call &lt;code&gt;delete_records&lt;/code&gt; on my server. It had been doing it for days. I never knew.&lt;/p&gt;

&lt;h2&gt;
  
  
  The abuse database is the part that surprised me
&lt;/h2&gt;

&lt;p&gt;When I enabled &lt;code&gt;abuseCheck: true&lt;/code&gt;, the middleware started checking every caller against a community database. Turns out someone had already scanned the MCP ecosystem and flagged a package with a suspicious preinstall script. That finding was automatically in the database. My server knew about it before I did.&lt;/p&gt;

&lt;p&gt;The database is free and open. Anyone can check, anyone can report:&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;# Check an agent&lt;/span&gt;
curl https://agentscores.xyz/api/abuse/check?agent&lt;span class="o"&gt;=&lt;/span&gt;some-agent

&lt;span class="c"&gt;# Report a bad one&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://agentscores.xyz/api/abuse/report &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"agent_identifier":"bad-agent","reason":"data_exfiltration","evidence":"what happened"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every report protects every server using the middleware. That's the network effect — the more people use it, the safer everyone gets.&lt;/p&gt;

&lt;h2&gt;
  
  
  I also scanned my own dependencies
&lt;/h2&gt;

&lt;p&gt;Before I secured runtime access, I wanted to make sure my own packages were clean. The KYA scanner checks npm packages for install scripts, prompt injection in metadata, suspicious URLs, and dependency issues:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://agentscores.xyz/api/scan?npm&lt;span class="o"&gt;=&lt;/span&gt;my-mcp-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or use the visual scanner: &lt;a href="https://agentscores.xyz/scan" rel="noopener noreferrer"&gt;agentscores.xyz/scan&lt;/a&gt; — type a package name, get a score and findings.&lt;/p&gt;

&lt;p&gt;They scanned 195 MCP packages. 64% clean, 4% with install scripts, one flagged for modifying npm registry config in a preinstall hook. That's a real supply chain attack vector.&lt;/p&gt;

&lt;h2&gt;
  
  
  The full verification if you want it
&lt;/h2&gt;

&lt;p&gt;Beyond the middleware, there's a full agent verification API. Six checks in one call:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://agentscores.xyz/api/verify &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"agent":"name","github":"deployer","model":"claude","tools":["read_file"],"transport":"http"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Returns: deployer identity (GitHub history), model identification, code auditability, abuse status, permission risk, and deployment context. Useful when your server needs to decide whether to trust an agent for a high-stakes operation.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd recommend
&lt;/h2&gt;

&lt;p&gt;If you're running an MCP server:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;npm install mcp-trust-guard&lt;/code&gt; — takes 3 minutes&lt;/li&gt;
&lt;li&gt;Enable &lt;code&gt;abuseCheck: true&lt;/code&gt; — free, no API key&lt;/li&gt;
&lt;li&gt;Set rules for your tools — read = open, write = verified, delete = high trust&lt;/li&gt;
&lt;li&gt;Turn on &lt;code&gt;audit: true&lt;/code&gt; — you need to see what's hitting your server&lt;/li&gt;
&lt;li&gt;Scan your own package at &lt;a href="https://agentscores.xyz/scan" rel="noopener noreferrer"&gt;agentscores.xyz/scan&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The MCP protocol is adding OAuth and auth specs later this year. Until then, this is the security layer.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;More from this series:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/thezenmonster/securing-your-mcp-server-in-2026-a-practical-guide-3p9f"&gt;Securing Your MCP Server in 2026: A Practical Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/thezenmonster/i-built-an-abuse-database-for-ai-agents-its-free-and-open-2la5"&gt;I Built an Abuse Database for AI Agents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/thezenmonster/how-to-verify-any-ai-agent-in-one-api-call-6-checks-zero-config-1g1d"&gt;How to Verify Any AI Agent in One API Call&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Free scanner:&lt;/strong&gt; &lt;a href="https://agentscores.xyz" rel="noopener noreferrer"&gt;agentscores.xyz&lt;/a&gt; - scan any MCP package for security issues.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;npm:&lt;/strong&gt; &lt;a href="https://www.npmjs.com/package/mcp-trust-guard" rel="noopener noreferrer"&gt;mcp-trust-guard&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Abuse check:&lt;/strong&gt; &lt;a href="https://www.npmjs.com/package/kya-abuse-check" rel="noopener noreferrer"&gt;kya-abuse-check&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scanner:&lt;/strong&gt; &lt;a href="https://agentscores.xyz/scan" rel="noopener noreferrer"&gt;agentscores.xyz/scan&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full API:&lt;/strong&gt; &lt;a href="https://agentscores.xyz/docs" rel="noopener noreferrer"&gt;agentscores.xyz/docs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/Thezenmonster/mcp-guard" rel="noopener noreferrer"&gt;Thezenmonster/mcp-guard&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

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