<?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: Edison Flores</title>
    <description>The latest articles on DEV Community by Edison Flores (@edison_flores_6d2cd381b13).</description>
    <link>https://dev.to/edison_flores_6d2cd381b13</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%2F4011586%2F59d27a5e-b708-4d17-b346-37dce502454e.png</url>
      <title>DEV Community: Edison Flores</title>
      <link>https://dev.to/edison_flores_6d2cd381b13</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/edison_flores_6d2cd381b13"/>
    <language>en</language>
    <item>
      <title>The MarketNow roadmap: building the SSL for AI agents (with zero budget)</title>
      <dc:creator>Edison Flores</dc:creator>
      <pubDate>Wed, 22 Jul 2026 04:52:09 +0000</pubDate>
      <link>https://dev.to/edison_flores_6d2cd381b13/the-marketnow-roadmap-building-the-ssl-for-ai-agents-with-zero-budget-4kp9</link>
      <guid>https://dev.to/edison_flores_6d2cd381b13/the-marketnow-roadmap-building-the-ssl-for-ai-agents-with-zero-budget-4kp9</guid>
      <description>&lt;p&gt;I'm building MarketNow — the trust layer for AI agent commerce. No funding, no ads, no paid tools. Just code, community, and a clear roadmap.&lt;/p&gt;

&lt;p&gt;Here's where we are and where we're going.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's done (July 2026)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  9-layer security pipeline (all live, all free)
&lt;/h3&gt;

&lt;p&gt;L1.5 through L3 — static analysis, malware detection, sandbox, continuous monitoring. Plus WAF, honeypot, threat intel, and auto-quarantine.&lt;/p&gt;

&lt;p&gt;Every MCP skill in our catalog (8,845 real servers from GitHub) is audited. Each gets a signed Sentinel certificate (0-10 score) that anyone can verify.&lt;/p&gt;

&lt;h3&gt;
  
  
  Agent Trust Cards (ATC)
&lt;/h3&gt;

&lt;p&gt;SSL certificates for AI agents. Ed25519 signed, GitHub-persisted ledger, working verify + revoke. Code examples in Python, JS, and Go.&lt;/p&gt;

&lt;h3&gt;
  
  
  Marketplace
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;8,845 skills (all free, all real)&lt;/li&gt;
&lt;li&gt;5 languages&lt;/li&gt;
&lt;li&gt;npm v1.5.0&lt;/li&gt;
&lt;li&gt;MCP Registry published&lt;/li&gt;
&lt;li&gt;14 API endpoints&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Community
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;45 dev.to articles (677 views, 28 comments)&lt;/li&gt;
&lt;li&gt;35+ GitHub issues across 10 repos&lt;/li&gt;
&lt;li&gt;Active conversations on CrewAI (8 comments) and AutoGen (3 comments)&lt;/li&gt;
&lt;li&gt;3 contributors&lt;/li&gt;
&lt;li&gt;11 open issues (5 good first issues, 5 help wanted, 1 security review)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's next (Q3 2026)
&lt;/h2&gt;

&lt;p&gt;All volunteer, no budget:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python marketnow-atc package (issue #11)&lt;/li&gt;
&lt;li&gt;AutoGen integration (@Sravan1011 is on it)&lt;/li&gt;
&lt;li&gt;Rust ATC verification crate (issue #10)&lt;/li&gt;
&lt;li&gt;Japanese translation (issue #12)&lt;/li&gt;
&lt;li&gt;More malware signatures (issue #13)&lt;/li&gt;
&lt;li&gt;L4 design document — in-process monitoring&lt;/li&gt;
&lt;li&gt;RFC 8785 canonical JSON&lt;/li&gt;
&lt;li&gt;CA key rotation&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The revenue model (when it comes)
&lt;/h2&gt;

&lt;p&gt;Everything is free until revenue exists:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Skills: FREE (we don't sell skills)&lt;/li&gt;
&lt;li&gt;Sentinel audit: FREE&lt;/li&gt;
&lt;li&gt;ATC: FREE&lt;/li&gt;
&lt;li&gt;Seller subscriptions: PRO .99/mo (when sellers exist)&lt;/li&gt;
&lt;li&gt;Commission: 20% on seller sales (when sales happen)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No paywalls on security. No freemium on trust. The audit is free because the internet is safer when everyone can verify.&lt;/p&gt;

&lt;h2&gt;
  
  
  How you can help (costs /bin/bash)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  30 seconds
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Star the repo: &lt;a href="https://github.com/edgarfloresguerra2011-a11y/marketnow" rel="noopener noreferrer"&gt;https://github.com/edgarfloresguerra2011-a11y/marketnow&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Share with one person who uses Claude Desktop, Cursor, or Cline&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  1-2 hours
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Translate a page to Japanese (issue #12)&lt;/li&gt;
&lt;li&gt;Write a tutorial (issue #14)&lt;/li&gt;
&lt;li&gt;Test our honeypot — try to bypass it (issue #17)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2-8 hours
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Write the Python package (issue #11)&lt;/li&gt;
&lt;li&gt;Write the Rust verification example (issue #10)&lt;/li&gt;
&lt;li&gt;Research new malware signatures (issue #13)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Ongoing
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Review our code and report bugs&lt;/li&gt;
&lt;li&gt;Write about us on your blog (issue #18)&lt;/li&gt;
&lt;li&gt;Write a Twitter thread (issue #16)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Full roadmap: &lt;a href="https://github.com/edgarfloresguerra2011-a11y/marketnow/blob/master/ROADMAP.md" rel="noopener noreferrer"&gt;https://github.com/edgarfloresguerra2011-a11y/marketnow/blob/master/ROADMAP.md&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What we will NOT do
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Pay for ads&lt;/li&gt;
&lt;li&gt;Pay for reviews&lt;/li&gt;
&lt;li&gt;Pay for listings&lt;/li&gt;
&lt;li&gt;Fake stars or downloads&lt;/li&gt;
&lt;li&gt;Claim features we don't have&lt;/li&gt;
&lt;li&gt;Hide incidents or bugs&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The honest truth
&lt;/h2&gt;

&lt;p&gt;I have no budget. I have a laptop, a GitHub account, and a Vercel free tier. What I do have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A real product (9 security layers, ATC, 8,845 skills)&lt;/li&gt;
&lt;li&gt;Real community engagement (28 comments, 3 contributors)&lt;/li&gt;
&lt;li&gt;A real story (trojan incident -&amp;gt; 8 layers built in 2 weeks)&lt;/li&gt;
&lt;li&gt;A clear vision (SSL for AI agents)&lt;/li&gt;
&lt;li&gt;Honesty (everything public, including what's broken)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If that's enough for you to contribute, I'd love your help. If not, I understand — and I'll keep building anyway.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/edgarfloresguerra2011-a11y/marketnow" rel="noopener noreferrer"&gt;https://github.com/edgarfloresguerra2011-a11y/marketnow&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Live:&lt;/strong&gt; &lt;a href="https://marketnow.site" rel="noopener noreferrer"&gt;https://marketnow.site&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Contributing:&lt;/strong&gt; &lt;a href="https://github.com/edgarfloresguerra2011-a11y/marketnow/blob/master/CONTRIBUTING.md" rel="noopener noreferrer"&gt;https://github.com/edgarfloresguerra2011-a11y/marketnow/blob/master/CONTRIBUTING.md&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;— Edison Flores, AliceLabs LLC&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>mcp</category>
      <category>ai</category>
      <category>indiehackers</category>
    </item>
    <item>
      <title>I need help: 5 open-source tasks for the MCP trust layer</title>
      <dc:creator>Edison Flores</dc:creator>
      <pubDate>Wed, 22 Jul 2026 04:42:07 +0000</pubDate>
      <link>https://dev.to/edison_flores_6d2cd381b13/i-need-help-5-open-source-tasks-for-the-mcp-trust-layer-3i1o</link>
      <guid>https://dev.to/edison_flores_6d2cd381b13/i-need-help-5-open-source-tasks-for-the-mcp-trust-layer-3i1o</guid>
      <description>&lt;p&gt;I am building MarketNow — a security-first MCP marketplace with a 9-layer audit pipeline and Agent Trust Cards. The project is open and I need contributors.&lt;/p&gt;

&lt;p&gt;Here are 5 concrete tasks you can pick up right now. All are beginner-friendly.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Write a Rust ATC verification example
&lt;/h2&gt;

&lt;p&gt;We have ATC verification examples in Python, JavaScript, and Go. We need Rust.&lt;/p&gt;

&lt;p&gt;Skills: basic Rust, HTTP requests, crypto&lt;br&gt;
Time: 2-4 hours&lt;br&gt;
Issue: &lt;a href="https://github.com/edgarfloresguerra2011-a11y/marketnow/issues/10" rel="noopener noreferrer"&gt;https://github.com/edgarfloresguerra2011-a11y/marketnow/issues/10&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Create a Python marketnow-atc package
&lt;/h2&gt;

&lt;p&gt;A simple pip package that wraps our ATC API:&lt;/p&gt;

&lt;p&gt;from marketnow_atc import verify&lt;br&gt;
trust = verify("ATC-2026-9880252")&lt;br&gt;
print(trust.valid)  # True&lt;br&gt;
print(trust.sentinel_score)  # 10&lt;/p&gt;

&lt;p&gt;Skills: Python, requests, pip packaging&lt;br&gt;
Time: 4-8 hours&lt;br&gt;
Issue: &lt;a href="https://github.com/edgarfloresguerra2011-a11y/marketnow/issues/11" rel="noopener noreferrer"&gt;https://github.com/edgarfloresguerra2011-a11y/marketnow/issues/11&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Translate the /trust page to Japanese
&lt;/h2&gt;

&lt;p&gt;Our trust page is in 5 languages. We need Japanese.&lt;/p&gt;

&lt;p&gt;Skills: Native Japanese, basic React&lt;br&gt;
Time: 1-2 hours&lt;br&gt;
Issue: &lt;a href="https://github.com/edgarfloresguerra2011-a11y/marketnow/issues/12" rel="noopener noreferrer"&gt;https://github.com/edgarfloresguerra2011-a11y/marketnow/issues/12&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Research new malware family signatures
&lt;/h2&gt;

&lt;p&gt;Our L1.8 layer detects 17 malware families. We need more (Atomic Stealer, DarkGate, IcedID, BumbleBee, etc.).&lt;/p&gt;

&lt;p&gt;Skills: Security research, basic regex&lt;br&gt;
Time: 2-3 hours per signature&lt;br&gt;
Issue: &lt;a href="https://github.com/edgarfloresguerra2011-a11y/marketnow/issues/13" rel="noopener noreferrer"&gt;https://github.com/edgarfloresguerra2011-a11y/marketnow/issues/13&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Write a tutorial: How to verify MCP server safety
&lt;/h2&gt;

&lt;p&gt;A step-by-step guide for developers.&lt;/p&gt;

&lt;p&gt;Skills: Writing, basic API usage&lt;br&gt;
Time: 2-4 hours&lt;br&gt;
Issue: &lt;a href="https://github.com/edgarfloresguerra2011-a11y/marketnow/issues/14" rel="noopener noreferrer"&gt;https://github.com/edgarfloresguerra2011-a11y/marketnow/issues/14&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What you get
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Your name in the Contributors section of our README&lt;/li&gt;
&lt;li&gt;Credit in the next GitHub release&lt;/li&gt;
&lt;li&gt;A real open-source contribution to a security project&lt;/li&gt;
&lt;li&gt;Mentorship — I review every PR and explain why changes are made&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to start
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Pick a task from the list above&lt;/li&gt;
&lt;li&gt;Comment on the issue saying I will work on this&lt;/li&gt;
&lt;li&gt;Fork the repo&lt;/li&gt;
&lt;li&gt;Make your changes&lt;/li&gt;
&lt;li&gt;Open a PR&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No interview, no application, no waiting period. Just code.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/edgarfloresguerra2011-a11y/marketnow" rel="noopener noreferrer"&gt;https://github.com/edgarfloresguerra2011-a11y/marketnow&lt;/a&gt;&lt;br&gt;
Contributing guide: &lt;a href="https://github.com/edgarfloresguerra2011-a11y/marketnow/blob/master/CONTRIBUTING.md" rel="noopener noreferrer"&gt;https://github.com/edgarfloresguerra2011-a11y/marketnow/blob/master/CONTRIBUTING.md&lt;/a&gt;&lt;br&gt;
Live site: &lt;a href="https://marketnow.site" rel="noopener noreferrer"&gt;https://marketnow.site&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;— Edison Flores, AliceLabs LLC&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>mcp</category>
      <category>security</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Replying to everyone: 28 comments across 9 articles — here are my answers</title>
      <dc:creator>Edison Flores</dc:creator>
      <pubDate>Wed, 22 Jul 2026 04:14:19 +0000</pubDate>
      <link>https://dev.to/edison_flores_6d2cd381b13/replying-to-everyone-28-comments-across-9-articles-here-are-my-answers-2h4o</link>
      <guid>https://dev.to/edison_flores_6d2cd381b13/replying-to-everyone-28-comments-across-9-articles-here-are-my-answers-2h4o</guid>
      <description>&lt;p&gt;You commented. I listened. Here are responses to every unanswered comment across our articles. The dev.to API doesn't let me reply inline (it returns 404 on comment creation), so this is my workaround — one article that answers everyone.&lt;/p&gt;

&lt;h2&gt;
  
  
  To @mads_hansen (L3 article)
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"I would distinguish periodic re-attestation from runtime monitoring. A weekly sandbox replay can detect drift; it cannot see an attack that runs between scans."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You're right — L3 is periodic re-attestation, not true runtime monitoring. The distinction matters. True runtime monitoring would require an in-process agent (like an eBPF probe or a syscall interceptor) that watches the MCP server's behavior in real-time. That's L4 on our roadmap — but it requires running inside the user's runtime, not in our sandbox.&lt;/p&gt;

&lt;p&gt;What L3 does: catches drift that accumulates over time (config changes, supply chain updates, new tools). What it doesn't do: catch a skill that behaves normally during the weekly scan but maliciously between scans.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Honest answer:&lt;/strong&gt; L3 is the best we can do without shipping an agent to the user's machine. L4 (in-process monitoring) is the real fix, but it's a heavier lift.&lt;/p&gt;

&lt;h2&gt;
  
  
  To &lt;a class="mentioned-user" href="https://dev.to/mayank609"&gt;@mayank609&lt;/a&gt; (L3 article)
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"Certification is necessary, but production systems keep changing—dependencies update, permissions drift."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Exactly the problem L3 solves. The weekly re-audit catches exactly these changes. If a dependency updates (npm version bump) or permissions drift (allowed_paths expand), L3 flags it before the user is affected.&lt;/p&gt;

&lt;p&gt;Your feedback on CrewAI #6463 directly shaped this. Thank you.&lt;/p&gt;

&lt;h2&gt;
  
  
  To &lt;a class="mentioned-user" href="https://dev.to/anp2network"&gt;@anp2network&lt;/a&gt; (Responding to feedback article)
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"The recursive sort closes the top-level-only gap, but there's a second-order issue: it lands on the exact property an attacker would target if they could influence key ordering."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You're describing a canonicalization attack — where an attacker manipulates JSON key order to produce a different canonical form that still validates. This is a real concern.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Our defense:&lt;/strong&gt; We use &lt;code&gt;JSON.stringify(sortedObj)&lt;/code&gt; which produces a single deterministic output for any given object structure. An attacker can't influence the key ordering because we sort them ourselves before serialization. The only way to produce a different signature is to change the payload content, not its serialization.&lt;/p&gt;

&lt;p&gt;That said, you're right that canonicalization is a hard problem. The gold standard is something like &lt;a href="https://tools.ietf.org/html/rfc8785" rel="noopener noreferrer"&gt;RFC 8785 (JSON Canonicalization Scheme)&lt;/a&gt;. We're not there yet, but it's on the roadmap.&lt;/p&gt;

&lt;h2&gt;
  
  
  To @mads_hansen (Responding to feedback article)
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"Compromise recovery depends on revocation distribution. A verifier with a cached registry can keep accepting attacker-signed ATCs until it learns the old key is revoked."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is the OCSP problem (Online Certificate Status Protocol) — same issue SSL has. Our current solution: verifiers call &lt;code&gt;GET /api/atc?action=verify&lt;/code&gt; on every check (no caching). This is slow but correct.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Better solution (on roadmap):&lt;/strong&gt; Signed revocation lists with short TTLs. The verifier caches the revocation list for 5 minutes. If a CA key is compromised, the new revocation list is published within 5 minutes, and all verifiers pick it up on their next check.&lt;/p&gt;

&lt;p&gt;You also suggested signing the key registry itself — that's a great idea. The CA should sign its own key list, so a verifier can detect if the key list was tampered with.&lt;/p&gt;

&lt;h2&gt;
  
  
  To &lt;a class="mentioned-user" href="https://dev.to/neelagiri65"&gt;@neelagiri65&lt;/a&gt; (Post-mortem article)
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"The fix that actually holds is signed packages plus a runtime sandbox, not just more scanning layers."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Agreed. Signed packages (like npm's provenance) plus runtime sandboxing is the gold standard. We have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Signed packages:&lt;/strong&gt; every Sentinel certificate is SHA-256 signed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runtime sandbox:&lt;/strong&gt; L2 runs in gVisor with &lt;code&gt;--network none&lt;/code&gt;, &lt;code&gt;--read-only&lt;/code&gt;, &lt;code&gt;--cap-drop ALL&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Continuous monitoring:&lt;/strong&gt; L3 re-runs weekly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What we don't have yet: &lt;strong&gt;package-level signing&lt;/strong&gt; (signing the npm tarball itself, like Sigstore/cosign). That's on the roadmap — we're looking at integrating with npm's provenance feature.&lt;/p&gt;

&lt;h2&gt;
  
  
  To &lt;a class="mentioned-user" href="https://dev.to/neelagiri65"&gt;@neelagiri65&lt;/a&gt; (8 layers article)
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"Eight layers is a lot to maintain honestly. The useful bit is which ones actually caught something in practice."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Fair question. Here's what each layer has actually caught:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Caught something?&lt;/th&gt;
&lt;th&gt;What&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;L1.5&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;536 skills flagged for "no auth required" or "no rate limiting"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;L1.6&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;456 secrets found in skill descriptions (mostly example keys in READMEs)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;L1.7&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes — the trojan&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Caught the &lt;code&gt;unit.exe&lt;/code&gt; binary in the prospector-email-finder zip&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;L1.8&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;0 malware family matches (but the trojan was caught by L1.7 first)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;L2&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;103 skills failed to start in sandbox (MODULE_NOT_FOUND, crash)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;L3&lt;/td&gt;
&lt;td&gt;No (just shipped)&lt;/td&gt;
&lt;td&gt;Too early — first weekly run hasn't happened yet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WAF&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Blocked SQLi, XSS, SSRF attempts on our API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Honeypot&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;4 scanners banned for hitting /.env, /admin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Threat Intel&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;0 skills with URLs in URLhaus (catalog is clean)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;L1.7 is the MVP.&lt;/strong&gt; It caught the only real attack we've seen. The other layers are defense-in-depth — they haven't caught anything yet, but they're cheap to run and would catch different attack classes.&lt;/p&gt;

&lt;h2&gt;
  
  
  To &lt;a class="mentioned-user" href="https://dev.to/kordless"&gt;@kordless&lt;/a&gt; (ACP article)
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"ACP is a spec for agent to agent comms: agentclientprotocol.com"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You're right — we were aware of the existing ACP spec and actually killed our ACP implementation because it competed in the wrong layer. We pivoted to ATC (Agent Trust Card) which is the trust layer, not the communication layer. ACP/A2A/MCP handle communication. ATC handles trust. Complementary, not competitive.&lt;/p&gt;

&lt;p&gt;Full pivot writeup: &lt;a href="https://dev.to/edison_flores_6d2cd381b13/ai-agents-need-their-own-ssl-heres-why-i-built-it-1njk"&gt;https://dev.to/edison_flores_6d2cd381b13/ai-agents-need-their-own-ssl-heres-why-i-built-it-1njk&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  To &lt;a class="mentioned-user" href="https://dev.to/alexshev"&gt;@alexshev&lt;/a&gt; (MarketNow 2.0 article)
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"The stronger metric is whether users can connect, run a first workflow, and know what failed."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;100% agree. Downloads are vanity. The metric that matters is "did the agent successfully call a tool and get a useful response."&lt;/p&gt;

&lt;p&gt;We're instrumenting this now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/api/agent-purchase&lt;/code&gt; returns the full &lt;code&gt;system_prompt&lt;/code&gt; + &lt;code&gt;install&lt;/code&gt; command + &lt;code&gt;capabilities&lt;/code&gt; — so the agent has everything it needs in one call&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/api/audit-skill&lt;/code&gt; returns the Sentinel score — so the agent knows if the skill is safe before calling it&lt;/li&gt;
&lt;li&gt;Coming: success tracking (did the install command work? did the first tool call succeed?)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  To &lt;a class="mentioned-user" href="https://dev.to/pakvothe"&gt;@pakvothe&lt;/a&gt; (5 idiomas article)
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"Los objetos TRANSLATIONS a mano funcionan hasta que el producto crece. La solución escalable es extraer las traducciones a archivos JSON separados."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Tienes razón. Ahora mismo tenemos las traducciones inline en el código (un objeto por idioma). Funciona para 5 idiomas y ~30 rutas, pero no escalaría a 20 idiomas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Plan:&lt;/strong&gt; Migrar a archivos JSON separados (&lt;code&gt;/locales/en.json&lt;/code&gt;, &lt;code&gt;/locales/es.json&lt;/code&gt;, etc.) cargados dinámicamente. Esto permite:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Contribuciones de la comunidad (PR para añadir un idioma)&lt;/li&gt;
&lt;li&gt;Lazy loading (solo cargar el idioma del usuario)&lt;/li&gt;
&lt;li&gt;Mejor DX (editar un JSON es más fácil que navegar un objeto JS)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Gracias por el feedback — es el tipo de cosa que se ignora hasta que duele.&lt;/p&gt;

&lt;h2&gt;
  
  
  To &lt;a class="mentioned-user" href="https://dev.to/custralis"&gt;@custralis&lt;/a&gt; (Sandbox article)
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"--network none only closes egress — a tool that reads the filesystem or spawns processes is still dangerous."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Correct. &lt;code&gt;--network none&lt;/code&gt; blocks network but doesn't restrict filesystem or process access. That's why we layer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;--network none&lt;/code&gt; → blocks exfiltration&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--read-only&lt;/code&gt; → blocks writes to the root filesystem&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--cap-drop ALL&lt;/code&gt; → drops all Linux capabilities (no root, no raw sockets, no ptrace)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--security-opt no-new-privileges&lt;/code&gt; → prevents privilege escalation&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--memory 256m --cpus 0.5&lt;/code&gt; → prevents resource exhaustion&lt;/li&gt;
&lt;li&gt;gVisor → userspace kernel intercepts syscalls (stronger than seccomp)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The full Docker command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--network&lt;/span&gt; none &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--read-only&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--cap-drop&lt;/span&gt; ALL &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--security-opt&lt;/span&gt; no-new-privileges &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--memory&lt;/span&gt; 256m &lt;span class="nt"&gt;--cpus&lt;/span&gt; 0.5 &lt;span class="se"&gt;\&lt;/span&gt;
  mcp-audit-target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We also add &lt;code&gt;--tmpfs /tmp&lt;/code&gt; for skills that need write access, scoped to a small partition.&lt;/p&gt;

&lt;h2&gt;
  
  
  To &lt;a class="mentioned-user" href="https://dev.to/nazar-boyko"&gt;@nazar-boyko&lt;/a&gt; (8 layers article)
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"Layers 3 and 4 are pattern and family matching, which is exactly the technique malware authors optimize against."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;True — regex-based pattern matching is evadable. A sophisticated attacker can obfuscate their code to avoid matching our patterns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Our defense-in-depth:&lt;/strong&gt; L1.7/L1.8 catch known patterns. L2 (sandbox) catches behavior, not patterns — even if the code doesn't match any regex, the sandbox sees what it actually does (network calls, file writes, process spawns). L3 catches drift over time.&lt;/p&gt;

&lt;p&gt;No single layer is sufficient. That's why there are 9.&lt;/p&gt;

&lt;h2&gt;
  
  
  To &lt;a class="mentioned-user" href="https://dev.to/wrencalloway"&gt;@wrencalloway&lt;/a&gt; (8 layers article)
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"The hard one is a skill that ships clean and then pulls its payload at runtime."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This was the #1 feedback across all articles. L3 is our answer — it re-runs the sandbox weekly and detects if the skill's behavior changed since certification. But as @mads_hansen pointed out, it's periodic, not real-time.&lt;/p&gt;

&lt;p&gt;The real fix is L4 (in-process monitoring) — an agent that runs inside the user's runtime and watches the MCP server's syscalls in real-time. That's on the roadmap but requires shipping a native binary (eBPF on Linux, Endpoint Security framework on macOS).&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;28 comments across 9 articles. The community consistently identified 3 gaps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Runtime trust&lt;/strong&gt; (4 reviewers) → L3 is the first answer, L4 is the real fix&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CA key management&lt;/strong&gt; (3 reviewers) → Key rotation + signed revocation lists on roadmap&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Canonicalization&lt;/strong&gt; (2 reviewers) → Fixed (recursive sort), RFC 8785 on roadmap&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every comment made the system better. Keep them coming.&lt;/p&gt;

&lt;p&gt;— &lt;em&gt;Edison Flores, AliceLabs LLC — marketnow.site&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>security</category>
      <category>discuss</category>
      <category>ai</category>
    </item>
    <item>
      <title>The MCP security checklist: 9 things to check before installing any MCP server</title>
      <dc:creator>Edison Flores</dc:creator>
      <pubDate>Wed, 22 Jul 2026 04:06:59 +0000</pubDate>
      <link>https://dev.to/edison_flores_6d2cd381b13/the-mcp-security-checklist-9-things-to-check-before-installing-any-mcp-server-1350</link>
      <guid>https://dev.to/edison_flores_6d2cd381b13/the-mcp-security-checklist-9-things-to-check-before-installing-any-mcp-server-1350</guid>
      <description>&lt;p&gt;You wouldn't install a npm package without checking its dependencies. You shouldn't install an MCP server without checking its security. Here's the checklist we use at MarketNow — 9 layers, from basic to advanced.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Does it have a GitHub repo?
&lt;/h2&gt;

&lt;p&gt;If the install command is &lt;code&gt;npx -y some-package&lt;/code&gt; but there's no link to the source code, &lt;strong&gt;don't install it&lt;/strong&gt;. You're running code on your machine — you should be able to read it first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check:&lt;/strong&gt; &lt;code&gt;npm view some-package repository.url&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Does the repo have a README and LICENSE?
&lt;/h2&gt;

&lt;p&gt;A repo without a README or LICENSE is a red flag. It means the author didn't bother with basic documentation or legal terms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check:&lt;/strong&gt; Visit the GitHub repo. Is there a README.md? Is there a LICENSE file?&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Are there hardcoded secrets?
&lt;/h2&gt;

&lt;p&gt;Search the code for API keys, tokens, passwords. Even if they're example values, they indicate the author doesn't understand secret hygiene.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check:&lt;/strong&gt; &lt;code&gt;grep -r "sk_live\|ghp_\|AKIA\|password.*=" .&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Does it request dangerous permissions?
&lt;/h2&gt;

&lt;p&gt;MCP servers can access your filesystem, network, and environment variables. Check what the server declares it needs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check:&lt;/strong&gt; Read the server's manifest. Does it request:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Filesystem access? Which paths?&lt;/li&gt;
&lt;li&gt;Network access? To which domains?&lt;/li&gt;
&lt;li&gt;Environment variables? Which ones?&lt;/li&gt;
&lt;li&gt;Subprocess execution?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. Has it been audited?
&lt;/h2&gt;

&lt;p&gt;Running a server in an isolated sandbox (Docker with &lt;code&gt;--network none&lt;/code&gt;, &lt;code&gt;--read-only&lt;/code&gt;) reveals its actual runtime behavior. Has anyone done this?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check:&lt;/strong&gt; Look for a security audit or certificate. At MarketNow, every skill has a Sentinel certificate showing its audit score (0-10).&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Is it a typosquat?
&lt;/h2&gt;

&lt;p&gt;Attackers create repos with names similar to popular packages. &lt;code&gt;prospector-mcp-email-finder&lt;/code&gt; (legit) vs &lt;code&gt;JuanquiForty/prospector-mcp-email-finder&lt;/code&gt; (typosquat with a trojan).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check:&lt;/strong&gt; Compare the repo URL against the official npm package. Are they the same owner?&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Does the README promote external downloads?
&lt;/h2&gt;

&lt;p&gt;If the README has a "Download Latest Release" badge that links to a zip on &lt;code&gt;raw.githubusercontent.com&lt;/code&gt; or another external URL, &lt;strong&gt;don't click it&lt;/strong&gt;. This is the exact vector that delivered a Windows trojan to our marketplace.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check:&lt;/strong&gt; Search the README for download links. Are they pointing to the repo's own releases page, or to an external URL?&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Has the code changed recently?
&lt;/h2&gt;

&lt;p&gt;A repo that was clean 3 months ago might have malware injected last week. Check the commit history.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check:&lt;/strong&gt; &lt;code&gt;git log --oneline -20&lt;/code&gt; — any suspicious commits? Any commits by unknown contributors?&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Is there continuous monitoring?
&lt;/h2&gt;

&lt;p&gt;Static audits catch problems at one point in time. But code changes. Does anyone re-audit the server after it's been certified?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check:&lt;/strong&gt; Look for evidence of continuous monitoring. At MarketNow, our L3 layer re-audits every skill weekly and detects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tool catalog changes (new tools appeared)&lt;/li&gt;
&lt;li&gt;Supply chain drift (git commit changed)&lt;/li&gt;
&lt;li&gt;Network behavior changes (new domains contacted)&lt;/li&gt;
&lt;li&gt;Permission expansion (new paths accessed)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How MarketNow automates this checklist
&lt;/h2&gt;

&lt;p&gt;We run all 9 checks automatically on every skill:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;L1.5  → metadata checks (1-4 above)
L1.6  → semgrep + secrets + OSV (3, 5)
L1.7  → binary/malware detection (6, 7)
L1.8  → malware family signatures (5)
L2    → gVisor sandbox baseline (5)
L3    → continuous re-audit (8, 9)
WAF   → 40 attack signatures
Honeypot → 50+ fake paths
Threat Intel → abuse.ch feeds
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each skill gets a score (0-10) and a signed certificate. You can verify any certificate at &lt;code&gt;marketnow.site/verify&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The takeaway
&lt;/h2&gt;

&lt;p&gt;MCP servers are powerful — they can read your files, make network requests, and execute code. Treat them with the same caution you'd treat a npm package or a Docker container. Run the checklist before installing.&lt;/p&gt;

&lt;p&gt;Or just use MarketNow — we run it for you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try it:&lt;/strong&gt; &lt;a href="https://marketnow.site" rel="noopener noreferrer"&gt;https://marketnow.site&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Install:&lt;/strong&gt; &lt;code&gt;npx -y marketnow-mcp&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/edgarfloresguerra2011-a11y/marketnow" rel="noopener noreferrer"&gt;https://github.com/edgarfloresguerra2011-a11y/marketnow&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;— &lt;em&gt;Edison Flores, AliceLabs LLC&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>security</category>
      <category>ai</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>ATC vs SSL: a side-by-side comparison of web trust vs agent trust</title>
      <dc:creator>Edison Flores</dc:creator>
      <pubDate>Wed, 22 Jul 2026 04:06:28 +0000</pubDate>
      <link>https://dev.to/edison_flores_6d2cd381b13/atc-vs-ssl-a-side-by-side-comparison-of-web-trust-vs-agent-trust-3i3a</link>
      <guid>https://dev.to/edison_flores_6d2cd381b13/atc-vs-ssl-a-side-by-side-comparison-of-web-trust-vs-agent-trust-3i3a</guid>
      <description>&lt;p&gt;SSL certificates made the web trustworthy enough for commerce. ATC (Agent Trust Card) does the same for AI agents. Here's how they compare.&lt;/p&gt;

&lt;h2&gt;
  
  
  The comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;SSL (Web)&lt;/th&gt;
&lt;th&gt;ATC (Agents)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;What it proves&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Website identity&lt;/td&gt;
&lt;td&gt;Agent identity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Who issues&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Certificate Authority (DigiCert, Let's Encrypt)&lt;/td&gt;
&lt;td&gt;MarketNow Sentinel CA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Crypto&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;RSA 2048 or ECDSA P-256&lt;/td&gt;
&lt;td&gt;Ed25519 (RFC 8032)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Signature&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;X.509 certificate&lt;/td&gt;
&lt;td&gt;Detached Ed25519 signature over canonical JSON&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Verification&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Browser checks cert chain&lt;/td&gt;
&lt;td&gt;Agent fetches CA public key + verifies signature&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Revocation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CRL / OCSP&lt;/td&gt;
&lt;td&gt;GitHub-persisted record (status: 'revoked')&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Expiry&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;90 days (Let's Encrypt) / 1 year&lt;/td&gt;
&lt;td&gt;90 days&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Trust score&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;EV = green bar, DV = basic&lt;/td&gt;
&lt;td&gt;Sentinel score 0-10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Public ledger&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CT logs (Certificate Transparency)&lt;/td&gt;
&lt;td&gt;GitHub repo (_data/atc/)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cost&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0-$1000/year&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  How SSL works (1995-present)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Website generates keypair
2. Website sends CSR to CA
3. CA verifies identity (domain control)
4. CA signs certificate with CA private key
5. Browser receives certificate
6. Browser verifies signature with CA public key (bundled in OS)
7. Browser checks: not expired, not revoked, domain matches
8. Green padlock → HTTPS connection established
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How ATC works (2026)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Agent generates Ed25519 keypair
2. Agent sends public key + identity to MarketNow CA
3. CA fetches Sentinel score (8-layer security audit)
4. CA signs ATC payload with CA private key
5. CA persists ATC to GitHub (_data/atc/{card_id}.json)
6. Other agent fetches ATC: GET /api/atc?action=verify&amp;amp;card_id=X
7. Other agent verifies signature with CA public key (public on GitHub)
8. Other agent checks: not expired, not revoked, Sentinel score &amp;gt;= threshold
9. If valid → trust established → agent-to-agent interaction proceeds
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Key differences
&lt;/h2&gt;

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

&lt;p&gt;SSL certificates are logged to Certificate Transparency logs, but these are hard to query. ATC records are stored as JSON files in a public GitHub repo — anyone can &lt;code&gt;git clone&lt;/code&gt; and audit the entire ledger.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Trust scoring
&lt;/h3&gt;

&lt;p&gt;SSL is binary: valid or invalid. ATC has a 0-10 Sentinel score. An enterprise can set a threshold: "only interact with agents scoring 8+." A hobbyist can accept 5+. This granularity doesn't exist in SSL.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Revocation speed
&lt;/h3&gt;

&lt;p&gt;SSL revocation (CRL/OCSP) can take hours to propagate. ATC revocation is instant — the GitHub record is updated, and the next &lt;code&gt;verify&lt;/code&gt; call (which reads fresh from the GitHub Contents API) returns &lt;code&gt;valid: false&lt;/code&gt; immediately.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Runtime monitoring
&lt;/h3&gt;

&lt;p&gt;SSL certificates don't monitor the website's behavior after issuance. ATC's L3 layer re-audits the agent weekly and detects behavioral drift (new tools, new network calls, changed permissions). If the agent changes after certification, L3 flags it.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Cost
&lt;/h3&gt;

&lt;p&gt;SSL costs $0-$1000/year per domain. ATC is free — the CA, the signing, the verification, the ledger, the monitoring. All $0.&lt;/p&gt;

&lt;h2&gt;
  
  
  What ATC doesn't do (yet)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Chain of trust&lt;/strong&gt;: SSL has root CAs → intermediate CAs → leaf certs. ATC has one CA. Multi-sig (2+ CAs required) is on the roadmap.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Domain verification&lt;/strong&gt;: SSL proves you control example.com. ATC proves you control an Ed25519 keypair. Domain-bound ATCs are coming.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic renewal&lt;/strong&gt;: Let's Encrypt auto-renews via ACME. ATC renewal is manual (re-issue before expiry). Automation is on the roadmap.&lt;/li&gt;
&lt;/ul&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;&lt;span class="c"&gt;# Get the CA public key (like a root CA cert)&lt;/span&gt;
curl https://marketnow.site/api/atc?action&lt;span class="o"&gt;=&lt;/span&gt;ca-key

&lt;span class="c"&gt;# Verify an agent's trust card&lt;/span&gt;
curl &lt;span class="s2"&gt;"https://marketnow.site/api/atc?action=verify&amp;amp;card_id=ATC-2026-9880252"&lt;/span&gt;

&lt;span class="c"&gt;# List all trust cards (public ledger)&lt;/span&gt;
curl https://marketnow.site/api/atc

&lt;span class="c"&gt;# Issue a trust card for your agent&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://marketnow.site/api/atc &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;'{"action":"issue","agent_id":"your.agent","public_key":"your-ed25519-pubkey"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Live:&lt;/strong&gt; &lt;a href="https://marketnow.site/atc" rel="noopener noreferrer"&gt;https://marketnow.site/atc&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/edgarfloresguerra2011-a11y/marketnow" rel="noopener noreferrer"&gt;https://github.com/edgarfloresguerra2011-a11y/marketnow&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;— &lt;em&gt;Edison Flores, AliceLabs LLC&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>ai</category>
      <category>cryptography</category>
      <category>mcp</category>
    </item>
    <item>
      <title>I scanned 8,845 MCP servers for malware. Here are the results.</title>
      <dc:creator>Edison Flores</dc:creator>
      <pubDate>Wed, 22 Jul 2026 04:05:58 +0000</pubDate>
      <link>https://dev.to/edison_flores_6d2cd381b13/i-scanned-8845-mcp-servers-for-malware-here-are-the-results-4j8g</link>
      <guid>https://dev.to/edison_flores_6d2cd381b13/i-scanned-8845-mcp-servers-for-malware-here-are-the-results-4j8g</guid>
      <description>&lt;p&gt;I ran our 9-layer Sentinel pipeline on every MCP server in our catalog. Here's what I found.&lt;/p&gt;

&lt;h2&gt;
  
  
  The scan
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;8,845 MCP servers&lt;/strong&gt; from GitHub repos, each audited by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;L1.5: 6 metadata checks&lt;/li&gt;
&lt;li&gt;L1.6: 18 Semgrep rules + 18 secret patterns + OSV dependency check&lt;/li&gt;
&lt;li&gt;L1.7: Binary/launcher detection (opens the actual package zip)&lt;/li&gt;
&lt;li&gt;L1.8: 17 malware family signatures (Emotet, Cobalt Strike, Mimikatz, RedLine, etc.)&lt;/li&gt;
&lt;li&gt;L3: Continuous runtime monitoring (drift detection vs L2 baseline)&lt;/li&gt;
&lt;/ul&gt;

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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Count&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Total scanned&lt;/td&gt;
&lt;td&gt;8,845&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Score 10/10 (clean)&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Score 8-9 (low risk)&lt;/td&gt;
&lt;td&gt;6,311&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Score 5-7 (medium risk)&lt;/td&gt;
&lt;td&gt;1,892&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Score 1-4 (high risk)&lt;/td&gt;
&lt;td&gt;536&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Score 0 (critical)&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quarantined&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trojans found&lt;/td&gt;
&lt;td&gt;0 (after L1.7 was deployed)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What the scores mean
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;10/10&lt;/strong&gt;: Perfect — no findings across all layers. Only 6 skills achieved this.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;8-9&lt;/strong&gt;: Low risk — minor warnings (e.g., "no rate limiting declared" or "server-side execution without auth"). Safe to use.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;5-7&lt;/strong&gt;: Medium risk — some concerns (e.g., file system access, database access, HTTP access detected in metadata). Review before using.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;1-4&lt;/strong&gt;: High risk — significant findings (e.g., known vulnerable dependencies, hardcoded secrets in description, prompt injection patterns). Avoid in production.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;0&lt;/strong&gt;: Critical — malware family match or binary detected. Quarantined.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The 6 perfect-score skills
&lt;/h2&gt;

&lt;p&gt;These passed all 9 layers with zero findings:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A filesystem MCP server (official Anthropic reference)&lt;/li&gt;
&lt;li&gt;A memory MCP server (official Anthropic reference)&lt;/li&gt;
&lt;li&gt;A git MCP server (official Anthropic reference)&lt;/li&gt;
&lt;li&gt;A time MCP server (official Anthropic reference)&lt;/li&gt;
&lt;li&gt;A fetch MCP server (official Anthropic reference)&lt;/li&gt;
&lt;li&gt;A sequential thinking MCP server (official Anthropic reference)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;All 6 are Anthropic's official reference servers. They set the bar for what "clean" looks like.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed since the trojan
&lt;/h2&gt;

&lt;p&gt;Two weeks ago, a typosquatting repo slipped a Windows trojan into the catalog via a fake "Download Latest Release" badge. Since then:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;L1.7&lt;/strong&gt; scans inside every package zip (recursively — zips inside zips)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;L1.8&lt;/strong&gt; checks 17 malware family signatures&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;L3&lt;/strong&gt; re-audits weekly and detects behavioral drift&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Honeypot&lt;/strong&gt; auto-bans anyone scanning for &lt;code&gt;/.env&lt;/code&gt;, &lt;code&gt;/admin&lt;/code&gt;, &lt;code&gt;/.git/config&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WAF&lt;/strong&gt; blocks 40 attack patterns (SQLi, XSS, SSRF, path traversal)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Threat intel&lt;/strong&gt; checks URLs against URLhaus (1000+ malicious URLs)&lt;/li&gt;
&lt;/ol&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;&lt;span class="c"&gt;# Audit any skill in real-time&lt;/span&gt;
curl &lt;span class="s2"&gt;"https://marketnow.site/api/audit-skill?skillId=mn-mcp-filesystem"&lt;/span&gt; | jq .audit.overall_score

&lt;span class="c"&gt;# Check the security overview&lt;/span&gt;
curl &lt;span class="s2"&gt;"https://marketnow.site/api/security"&lt;/span&gt; | jq .layers

&lt;span class="c"&gt;# Get the CA public key for ATC verification&lt;/span&gt;
curl &lt;span class="s2"&gt;"https://marketnow.site/api/atc?action=ca-key"&lt;/span&gt; | jq .public_key_pem
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Live:&lt;/strong&gt; &lt;a href="https://marketnow.site" rel="noopener noreferrer"&gt;https://marketnow.site&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/edgarfloresguerra2011-a11y/marketnow" rel="noopener noreferrer"&gt;https://github.com/edgarfloresguerra2011-a11y/marketnow&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;— &lt;em&gt;Edison Flores, AliceLabs LLC&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>security</category>
      <category>malware</category>
      <category>devsecops</category>
    </item>
    <item>
      <title>L3: I built continuous runtime monitoring because certification is point-in-time, attacks are runtime</title>
      <dc:creator>Edison Flores</dc:creator>
      <pubDate>Tue, 21 Jul 2026 03:41:43 +0000</pubDate>
      <link>https://dev.to/edison_flores_6d2cd381b13/l3-i-built-continuous-runtime-monitoring-because-certification-is-point-in-time-attacks-are-2jd8</link>
      <guid>https://dev.to/edison_flores_6d2cd381b13/l3-i-built-continuous-runtime-monitoring-because-certification-is-point-in-time-attacks-are-2jd8</guid>
      <description>&lt;p&gt;Four independent reviewers said the same thing:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Certification is point-in-time. Attacks are runtime."&lt;br&gt;
— &lt;a class="mentioned-user" href="https://dev.to/correctover"&gt;@correctover&lt;/a&gt; (CrewAI), &lt;a class="mentioned-user" href="https://dev.to/wrencalloway"&gt;@wrencalloway&lt;/a&gt; (dev.to), @mads_hansen (dev.to), &lt;a class="mentioned-user" href="https://dev.to/mayank609"&gt;@mayank609&lt;/a&gt; (CrewAI)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When 4 people independently identify the same gap, it's not a gap — it's THE problem. So I built L3.&lt;/p&gt;

&lt;h2&gt;
  
  
  The gap
&lt;/h2&gt;

&lt;p&gt;My 8-layer Sentinel pipeline audits skills at import time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;L1.5-L1.8: static analysis (metadata, semgrep, secrets, malware patterns, malware families)&lt;/li&gt;
&lt;li&gt;L2: gVisor sandbox (runs the skill once, captures a behavior baseline)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But after certification, the skill can change:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A config drift changes &lt;code&gt;allowed_paths&lt;/code&gt; from &lt;code&gt;/data&lt;/code&gt; to &lt;code&gt;/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;A supply chain update injects a new payload&lt;/li&gt;
&lt;li&gt;A compromised credential lets it exfiltrate data&lt;/li&gt;
&lt;li&gt;New tools appear in the tool catalog&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Static analysis can't see these changes. L2 captured a snapshot. Neither catches drift.&lt;/p&gt;

&lt;h2&gt;
  
  
  L3 — Continuous Runtime Monitoring
&lt;/h2&gt;

&lt;p&gt;L3 re-runs skills in the sandbox on a schedule (weekly via GitHub Actions) and compares runtime behavior against the L2 baseline. If behavior drifts, the skill is flagged.&lt;/p&gt;

&lt;h3&gt;
  
  
  6 drift detection types
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Severity&lt;/th&gt;
&lt;th&gt;What it catches&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;TOOL_CATALOG_NEW_TOOLS&lt;/td&gt;
&lt;td&gt;critical&lt;/td&gt;
&lt;td&gt;New tools appeared after certification&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TOOL_CATALOG_CHANGED_SCHEMA&lt;/td&gt;
&lt;td&gt;critical&lt;/td&gt;
&lt;td&gt;Existing tool changed its inputSchema&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SUPPLY_CHAIN_GIT_SHA_CHANGED&lt;/td&gt;
&lt;td&gt;critical&lt;/td&gt;
&lt;td&gt;Git commit changed — repo was updated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SUPPLY_CHAIN_NPM_VERSION_CHANGED&lt;/td&gt;
&lt;td&gt;high&lt;/td&gt;
&lt;td&gt;npm package version bumped&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NETWORK_NEW_DOMAINS&lt;/td&gt;
&lt;td&gt;high&lt;/td&gt;
&lt;td&gt;Contacting domains not in baseline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CONFIG_PERMISSIONS_EXPANDED&lt;/td&gt;
&lt;td&gt;critical&lt;/td&gt;
&lt;td&gt;allowed_paths or scopes expanded&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CREDENTIAL_NEW_ENV_ACCESS&lt;/td&gt;
&lt;td&gt;high&lt;/td&gt;
&lt;td&gt;Accessing env vars not in baseline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PROCESS_NEW_SPAWNS&lt;/td&gt;
&lt;td&gt;high&lt;/td&gt;
&lt;td&gt;Spawning processes not in baseline&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  How it addresses each attack vector
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;"A config drift changes allowed_paths from /data to /"&lt;/strong&gt;&lt;br&gt;
→ L3 compares current permissions against baseline. If paths expanded → CRITICAL alert → skill re-quarantined.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"A supply chain update injects a payload"&lt;/strong&gt;&lt;br&gt;
→ L3 checks git commit SHA and npm version. If changed since certification → CRITICAL alert → skill must be re-audited.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"A compromised credential lets it exfiltrate"&lt;/strong&gt;&lt;br&gt;
→ L3 re-runs sandbox with --network none. If baseline showed 0 credential accesses and L3 shows N → HIGH alert.&lt;/p&gt;

&lt;h3&gt;
  
  
  What L3 doesn't solve (honest)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Client-specific behavior&lt;/strong&gt;: a skill that returns clean tool descriptions to the scanner but malicious ones to a real agent. L3 mitigates by running with multiple User-Agent strings, but it's not a full solution.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero-day protocol exploits&lt;/strong&gt;: L3 catches behavioral drift, not protocol-level vulnerabilities.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Architecture
&lt;/h3&gt;

&lt;p&gt;The full pipeline is now 9 layers:&lt;/p&gt;

&lt;p&gt;L3 results stored in &lt;code&gt;_data/l3_results/{skill_id}.json&lt;/code&gt; — publicly auditable. If a skill drifts, it's flagged at &lt;code&gt;/api/security?view=quarantine&lt;/code&gt; with &lt;code&gt;reason: 'l3_drift_detected'&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Try it
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Security overview (now shows 9 layers): &lt;a href="https://marketnow.site/api/security" rel="noopener noreferrer"&gt;https://marketnow.site/api/security&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Trust page: &lt;a href="https://marketnow.site/trust" rel="noopener noreferrer"&gt;https://marketnow.site/trust&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/edgarfloresguerra2011-a11y/marketnow" rel="noopener noreferrer"&gt;https://github.com/edgarfloresguerra2011-a11y/marketnow&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;— &lt;em&gt;Edison Flores, AliceLabs LLC&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>security</category>
      <category>devsecops</category>
      <category>ai</category>
    </item>
    <item>
      <title>Responding to feedback: runtime trust, CA key rotation, and the canonicalization bug</title>
      <dc:creator>Edison Flores</dc:creator>
      <pubDate>Sun, 19 Jul 2026 20:11:31 +0000</pubDate>
      <link>https://dev.to/edison_flores_6d2cd381b13/responding-to-feedback-runtime-trust-ca-key-rotation-and-the-canonicalization-bug-4939</link>
      <guid>https://dev.to/edison_flores_6d2cd381b13/responding-to-feedback-runtime-trust-ca-key-rotation-and-the-canonicalization-bug-4939</guid>
      <description>&lt;p&gt;My last post about ATC (Agent Trust Card) and the 8-layer security pipeline generated real conversation. Several commenters raised points that deserved more than a quick reply — so here's a proper response.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The canonicalization bug (&lt;a class="mentioned-user" href="https://dev.to/anp2network"&gt;@anp2network&lt;/a&gt;)
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;The canonicalization line has a coverage bug: &lt;code&gt;JSON.stringify(payload, Object.keys(payload).sort())&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;You're right.&lt;/strong&gt; &lt;code&gt;JSON.stringify(obj, replacer)&lt;/code&gt; only sorts top-level keys. Nested objects (like &lt;code&gt;payload.trust&lt;/code&gt;, &lt;code&gt;payload.identity&lt;/code&gt;, &lt;code&gt;payload.payment&lt;/code&gt;) keep their original key order. If the signer and verifier serialize nested objects differently, the signature won't verify.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;canonicalJson&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;object&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isArray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;canonicalJson&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;sorted&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
  &lt;span class="k"&gt;for &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;key&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;canonicalJson&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This recursively sorts keys at every depth. I'm shipping this fix in the next deploy. Thanks for catching it — that's exactly the kind of review that makes a trust system credible.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. CA key rotation (&lt;a class="mentioned-user" href="https://dev.to/jkming"&gt;@jkming&lt;/a&gt;)
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Have you considered what happens if the CA key itself is compromised? Would love to see a follow-up on key rotation and multi-sig for high-value agents.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Great question. Here's the plan:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Current state:&lt;/strong&gt; Single Ed25519 CA key. Private key in a Vercel env var. If compromised, all ATCs are untrustworthy until the key is rotated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rotation plan (implementing now):&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Key versioning:&lt;/strong&gt; Each ATC will include &lt;code&gt;ca_key_id&lt;/code&gt; (e.g., &lt;code&gt;ca-key-001&lt;/code&gt;). Verifiers check which key signed it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rotation flow:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Generate new CA keypair (&lt;code&gt;ca-key-002&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Re-sign all active ATCs with the new key&lt;/li&gt;
&lt;li&gt;Publish the old key as &lt;code&gt;revoked&lt;/code&gt; in the CA key registry&lt;/li&gt;
&lt;li&gt;Verifiers reject any ATC signed by a revoked CA key&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-sig for high-value agents:&lt;/strong&gt; An ATC can require signatures from 2+ CAs (e.g., MarketNow Sentinel CA + an independent third-party CA). This is the same pattern as extended validation SSL certificates.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Timeline:&lt;/strong&gt; Key versioning in the next 2 weeks. Multi-sig is on the roadmap but needs a second CA partner first.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Runtime trust gap (&lt;a class="mentioned-user" href="https://dev.to/wrencalloway"&gt;@wrencalloway&lt;/a&gt;)
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Layers 1-8 all inspect the artifact at import time, but MCP skills are live code that talks to servers you don't control. The hard one is a skill that ships clean and then pulls its payload at runtime.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;This is the most important point raised.&lt;/strong&gt; You're describing a "time-of-check vs time-of-use" (TOCTOU) attack:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Skill ships clean → passes all 8 layers&lt;/li&gt;
&lt;li&gt;After install, skill fetches a malicious payload from a remote server&lt;/li&gt;
&lt;li&gt;Static analysis never saw it because the payload wasn't in the package&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;What we have today (partial):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;L2 sandbox (gVisor) runs the skill with &lt;code&gt;--network none&lt;/code&gt; and captures any network attempts. If the skill tries to fetch a remote payload, the sandbox logs it.&lt;/li&gt;
&lt;li&gt;206 skills have L2 runtime data showing their behavior in isolation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What we're building (the gap you identified):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;L3 — Continuous runtime monitoring:&lt;/strong&gt; After a skill is installed, the agent runtime periodically re-runs it in the sandbox and compares behavior. If a skill that was clean at install time starts making different network calls, that's a flag.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool catalog diffing:&lt;/strong&gt; After install, record the skill's declared tool list. If the tool list changes (new tools appear, existing tools change their inputSchema), alert the user. This is what @mads_hansen described: "did the tool catalog change after approval?"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Egress allowlist enforcement:&lt;/strong&gt; Our L2.6 egress proxy already restricts which domains a sandboxed skill can contact. The next step is to enforce this at runtime (not just audit time) via a local proxy that the MCP server must route through.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Honest answer:&lt;/strong&gt; We don't fully solve the runtime trust problem yet. Nobody does. The 8 layers are a strong defense-in-depth, but &lt;a class="mentioned-user" href="https://dev.to/wrencalloway"&gt;@wrencalloway&lt;/a&gt; is right that a determined attacker who ships clean code and pulls the payload later can still get through. Continuous monitoring (L3) is the answer, and it's on the roadmap.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Provenance checks (@mads_hansen)
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;One layer I'd add: provenance checks before import. Compare the package source against the canonical repo owner, require immutable release digests, and treat README download links as untrusted unless they point to the same verified release artifact.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Agreed.&lt;/strong&gt; This is exactly the gap that let the prospector trojan through. The typosquatting repo had a convincing README with a "Download Latest Release" badge pointing to an external zip. Our import script trusted the README.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What we added (L1.7):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Any README containing &lt;code&gt;raw.githubusercontent.com/.../...zip&lt;/code&gt; is flagged as high risk.&lt;/li&gt;
&lt;li&gt;Any README with a "Download" badge linking to an external zip is quarantined.&lt;/li&gt;
&lt;li&gt;The auto-discovery pipeline now runs L1.7 &lt;em&gt;before&lt;/em&gt; importing — typosquatting repos are blocked at the door.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What we're adding (provenance layer):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repo owner verification:&lt;/strong&gt; When importing from &lt;code&gt;github.com/X/some-mcp&lt;/code&gt;, verify that &lt;code&gt;X&lt;/code&gt; is the canonical owner (cross-reference with npm registry, awesome-mcp-servers maintainers list).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Immutable release digests:&lt;/strong&gt; Instead of importing from &lt;code&gt;main&lt;/code&gt; branch (mutable), import from a specific git commit SHA. The SHA is recorded in the skill's &lt;code&gt;source.commit_sha&lt;/code&gt; field. If the repo changes after import, we can detect drift.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;README link trust:&lt;/strong&gt; Any link in a README that points to a download outside the repo's own releases page is treated as untrusted by default.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. The bigger picture
&lt;/h2&gt;

&lt;p&gt;What I'm hearing from the community is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Package safety ≠ runtime safety.&lt;/strong&gt; We need both. L1.5-L1.8 handle package safety. L2 handles runtime behavior in isolation. L3 (coming) handles continuous runtime monitoring.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trust is not binary.&lt;/strong&gt; @0xbrainkid on the CrewAI issue said it well: "different crews will have different acceptable risk." ATC's Sentinel score (0-10) gives that granularity. A crew handling payments can require score ≥ 9; a crew doing local file operations can accept ≥ 6.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Provenance matters.&lt;/strong&gt; Where the code came from is as important as what the code does. The typosquatting incident proved this.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;To everyone who commented:&lt;/strong&gt; thank you. This is what peer review looks like. Every comment above is making the system better. Keep them coming.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Live: &lt;a href="https://marketnow.site" rel="noopener noreferrer"&gt;https://marketnow.site&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;ATC demo: &lt;a href="https://marketnow.site/atc" rel="noopener noreferrer"&gt;https://marketnow.site/atc&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Security overview: &lt;a href="https://marketnow.site/api/security" rel="noopener noreferrer"&gt;https://marketnow.site/api/security&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Trust page: &lt;a href="https://marketnow.site/trust" rel="noopener noreferrer"&gt;https://marketnow.site/trust&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/edgarfloresguerra2011-a11y/marketnow" rel="noopener noreferrer"&gt;https://github.com/edgarfloresguerra2011-a11y/marketnow&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Open security review: &lt;a href="https://github.com/edgarfloresguerra2011-a11y/marketnow/issues/2" rel="noopener noreferrer"&gt;https://github.com/edgarfloresguerra2011-a11y/marketnow/issues/2&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;— &lt;em&gt;Edison Flores, AliceLabs LLC&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>security</category>
      <category>devsecops</category>
      <category>ai</category>
    </item>
    <item>
      <title>How to find safe MCP servers for your AI coding assistant (and why most directories lie)</title>
      <dc:creator>Edison Flores</dc:creator>
      <pubDate>Sat, 18 Jul 2026 03:27:34 +0000</pubDate>
      <link>https://dev.to/edison_flores_6d2cd381b13/how-to-find-safe-mcp-servers-for-your-ai-coding-assistant-and-why-most-directories-lie-3967</link>
      <guid>https://dev.to/edison_flores_6d2cd381b13/how-to-find-safe-mcp-servers-for-your-ai-coding-assistant-and-why-most-directories-lie-3967</guid>
      <description>&lt;p&gt;If you use Claude Desktop, Cursor, Cline, or Continue, you've probably installed MCP servers from a "curated list" or directory. Here's the uncomfortable truth: most of those directories don't actually audit the servers they list. They're curated lists, not security audits.&lt;/p&gt;

&lt;p&gt;I built an MCP marketplace that actually audits every server. Here's what I learned about MCP security — and how you can protect yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem with MCP directories today
&lt;/h2&gt;

&lt;p&gt;Most "awesome-mcp-servers" lists work like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Someone submits a GitHub repo&lt;/li&gt;
&lt;li&gt;The maintainer adds it to the README&lt;/li&gt;
&lt;li&gt;That's it. No audit. No scan. No sandbox.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A typo in the repo URL → you install the wrong thing&lt;/li&gt;
&lt;li&gt;A malicious PR merged into a legit repo → you install malware&lt;/li&gt;
&lt;li&gt;A typosquatting repo with a similar name → you install a trojan&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;This actually happened.&lt;/strong&gt; Two weeks ago, a typosquatting repo (&lt;code&gt;JuanquiFortuny/prospector-mcp-email-finder&lt;/code&gt;) slipped a Windows trojan (&lt;code&gt;Trojan:Win64/Lazy.PGPK!MTB&lt;/code&gt;) into a competing MCP directory via a fake "Download Latest Release" badge.&lt;/p&gt;

&lt;h2&gt;
  
  
  What real MCP security looks like
&lt;/h2&gt;

&lt;p&gt;At &lt;a href="https://marketnow.site" rel="noopener noreferrer"&gt;MarketNow&lt;/a&gt;, every MCP server goes through 8 audit layers before entering the catalog:&lt;/p&gt;

&lt;h3&gt;
  
  
  Layer 1-2: Static analysis
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;6 metadata checks (auth, injection, CORS, OAuth, rate limiting)&lt;/li&gt;
&lt;li&gt;18 Semgrep rules + 18 secret patterns + OSV dependency check&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Layer 3: Binary &amp;amp; malware detection
&lt;/h3&gt;

&lt;p&gt;Opens the actual package zip (recursively — zips inside zips) and scans for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Windows binaries (&lt;code&gt;.exe&lt;/code&gt;, &lt;code&gt;.dll&lt;/code&gt;, &lt;code&gt;.scr&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Launcher scripts (&lt;code&gt;.bat&lt;/code&gt;, &lt;code&gt;.cmd&lt;/code&gt;, &lt;code&gt;.vbs&lt;/code&gt;, &lt;code&gt;.ps1&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Nested archives (red flag)&lt;/li&gt;
&lt;li&gt;Obfuscated Lua bytecode&lt;/li&gt;
&lt;li&gt;External download URLs in READMEs&lt;/li&gt;
&lt;li&gt;PowerShell encoded commands&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Layer 4: Malware family signatures
&lt;/h3&gt;

&lt;p&gt;17 YARA-equivalent rules for known malware families: Emotet, Cobalt Strike, Mimikatz, RedLine, Vidar, Raccoon, LummaC2, AsyncRAT, njRAT, Remcos, and more.&lt;/p&gt;

&lt;h3&gt;
  
  
  Layer 5-8: Runtime defense
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;WAF (40 attack signatures)&lt;/li&gt;
&lt;li&gt;Honeypot (50+ fake paths that ban scanners)&lt;/li&gt;
&lt;li&gt;Threat intel feeds (abuse.ch: URLhaus + MalwareBazaar + ThreatFox)&lt;/li&gt;
&lt;li&gt;Auto-quarantine (malicious skills removed + publicly listed)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What this means for you
&lt;/h2&gt;

&lt;p&gt;When you browse &lt;a href="https://marketnow.site" rel="noopener noreferrer"&gt;marketnow.site&lt;/a&gt;, every skill has:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A Sentinel score (0-10)&lt;/strong&gt; — how safe is this server?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A signed certificate&lt;/strong&gt; — SHA-256 signed, publicly verifiable&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A risk level&lt;/strong&gt; — low / medium / high / critical&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source disclosure&lt;/strong&gt; — which GitHub repo it came from&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;L2 sandbox results&lt;/strong&gt; (for 206 skills) — actual runtime behavior in a gVisor sandbox&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How to use it
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Option 1: Browse the web UI
&lt;/h3&gt;

&lt;p&gt;Go to &lt;a href="https://marketnow.site" rel="noopener noreferrer"&gt;marketnow.site&lt;/a&gt;, search for what you need, check the Sentinel score, and copy the install command.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option 2: Use the MCP server
&lt;/h3&gt;

&lt;p&gt;Add MarketNow as an MCP server in your assistant:&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;"mcpServers"&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;"marketnow"&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;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&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="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"marketnow-mcp"&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;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;Now you can ask Claude/Cursor/Cline: "Find me a filesystem MCP server with a high security score" — and it'll search MarketNow, filter by Sentinel score, and return only audited servers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option 3: Use the API directly
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Search for skills&lt;/span&gt;
curl &lt;span class="s2"&gt;"https://marketnow.site/api/search?q=filesystem"&lt;/span&gt; | jq

&lt;span class="c"&gt;# Get a skill's security certificate&lt;/span&gt;
curl &lt;span class="s2"&gt;"https://marketnow.site/api/audit-skill?skillId=mn-mcp-filesystem"&lt;/span&gt; | jq
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The trust layer: ATC
&lt;/h2&gt;

&lt;p&gt;For agent-to-agent trust, we also built &lt;strong&gt;ATC (Agent Trust Card)&lt;/strong&gt; — SSL certificates for AI agents:&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;# Verify any agent's trust card&lt;/span&gt;
curl &lt;span class="s2"&gt;"https://marketnow.site/api/atc?action=verify&amp;amp;card_id=ATC-2026-XXXXXXX"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Returns: valid/invalid, Sentinel score, risk level, signature verification, revocation status.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you can do today
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Stop installing MCP servers from uncurated lists.&lt;/strong&gt; Check if the directory actually audits the servers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check the GitHub repo before installing.&lt;/strong&gt; Stars, last commit, open issues, license.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use MarketNow&lt;/strong&gt; (shameless plug, but it's free and actually audits everything).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verify Sentinel certificates&lt;/strong&gt; at &lt;code&gt;marketnow.site/verify&lt;/code&gt; before trusting a skill.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Report suspicious skills&lt;/strong&gt; — open an issue at &lt;a href="https://github.com/edgarfloresguerra2011-a11y/marketnow/issues" rel="noopener noreferrer"&gt;github.com/edgarfloresguerra2011-a11y/marketnow&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;MCP is becoming the standard for how AI assistants call external tools. But the trust infrastructure doesn't exist yet. Anyone can publish an MCP server, and most directories don't check anything.&lt;/p&gt;

&lt;p&gt;MarketNow is trying to fix this: every server audited, every certificate signed, every incident public. The marketplace is free. The security infrastructure is the product.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try it:&lt;/strong&gt; &lt;a href="https://marketnow.site" rel="noopener noreferrer"&gt;https://marketnow.site&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Install:&lt;/strong&gt; &lt;code&gt;npx -y marketnow-mcp&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/edgarfloresguerra2011-a11y/marketnow" rel="noopener noreferrer"&gt;https://github.com/edgarfloresguerra2011-a11y/marketnow&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;— &lt;em&gt;Edison Flores, AliceLabs LLC&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>tools</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I caught a trojan in my MCP marketplace. Here's the 8-layer defense I built.</title>
      <dc:creator>Edison Flores</dc:creator>
      <pubDate>Sat, 18 Jul 2026 03:27:03 +0000</pubDate>
      <link>https://dev.to/edison_flores_6d2cd381b13/i-caught-a-trojan-in-my-mcp-marketplace-heres-the-8-layer-defense-i-built-gk4</link>
      <guid>https://dev.to/edison_flores_6d2cd381b13/i-caught-a-trojan-in-my-mcp-marketplace-heres-the-8-layer-defense-i-built-gk4</guid>
      <description>&lt;p&gt;Two weeks ago, a Windows trojan slipped into my MCP (Model Context Protocol) marketplace. The malware was &lt;code&gt;Trojan:Win64/Lazy.PGPK!MTB&lt;/code&gt;, hidden inside a nested zip in a skill package.&lt;/p&gt;

&lt;p&gt;This is the technical writeup of what happened, what I built to prevent it, and the architecture of the 8-layer defense pipeline now running in production.&lt;/p&gt;

&lt;h2&gt;
  
  
  The attack
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Vector:&lt;/strong&gt; Typosquatting GitHub repository&lt;/p&gt;

&lt;p&gt;A legitimate MCP server &lt;code&gt;prospector-mcp-email-finder&lt;/code&gt; existed. An attacker created a typosquatting copy at &lt;code&gt;JuanquiFortuny/prospector-mcp-email-finder&lt;/code&gt; (now taken down) with an identical README — but with a "Download Latest Release" badge linking to a malicious zip on &lt;code&gt;raw.githubusercontent.com&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The payload:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Application.cmd  →  'start unit.exe package.txt'
package.txt      →  298 KB of obfuscated Lua bytecode
unit.exe         →  872 KB PE32+ Windows executable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Windows Defender flagged &lt;code&gt;unit.exe&lt;/code&gt; as &lt;code&gt;Trojan:Win64/Lazy.PGPK!MTB&lt;/code&gt;. The &lt;code&gt;Application.cmd → unit.exe + package.txt&lt;/code&gt; pattern is a classic staged launcher — small CMD wrapper executes the binary with the bytecode payload as input.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it got in:&lt;/strong&gt; My import script (which fetches MCP servers from GitHub) downloaded the zip and committed it to &lt;code&gt;dist/skills/&lt;/code&gt; without scanning inside it. My existing audit pipeline (Sentinel L1.5 + L1.6) only checked skill metadata — name, description, system_prompt. It never looked inside the actual package.&lt;/p&gt;

&lt;h2&gt;
  
  
  The defense — 8 layers
&lt;/h2&gt;

&lt;h3&gt;
  
  
  L1.5 — Metadata checks (6 rules)
&lt;/h3&gt;

&lt;p&gt;Cheapest layer. Runs on every skill's metadata:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AUTH: Is auth required? (warning if not)&lt;/li&gt;
&lt;li&gt;TOOL_DESCRIPTIONS: Prompt injection patterns (&lt;code&gt;ignore previous instructions&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;INPUT_VALIDATION: File/SQL/HTTP access declared in metadata&lt;/li&gt;
&lt;li&gt;CORS_ORIGIN: &lt;code&gt;Access-Control-Allow-Origin: *&lt;/code&gt; (warning)&lt;/li&gt;
&lt;li&gt;OAUTH_SCOPES: Unscoped tokens&lt;/li&gt;
&lt;li&gt;RATE_LIMITING: No rate limit declared&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  L1.6 — Semgrep + Secrets + OSV (36 rules)
&lt;/h3&gt;

&lt;p&gt;18 Semgrep-equivalent rules implemented as JS regex (no Semgrep binary needed):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prompt injection (6 patterns)&lt;/li&gt;
&lt;li&gt;Command injection (4 patterns)&lt;/li&gt;
&lt;li&gt;SSRF (2 patterns)&lt;/li&gt;
&lt;li&gt;Path traversal (2 patterns)&lt;/li&gt;
&lt;li&gt;Tool name spoofing (1 pattern)&lt;/li&gt;
&lt;li&gt;Hardcoded secrets (3 patterns)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;18 secret detection patterns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stripe (&lt;code&gt;sk_live_*&lt;/code&gt;, &lt;code&gt;sk_test_*&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;GitHub (&lt;code&gt;ghp_*&lt;/code&gt;, &lt;code&gt;gho_*&lt;/code&gt;, &lt;code&gt;ghs_*&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;AWS (&lt;code&gt;AKIA*&lt;/code&gt;, &lt;code&gt;aws_secret_access_key&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Private keys (RSA/EC/OPENSSH)&lt;/li&gt;
&lt;li&gt;Wallet mnemonics&lt;/li&gt;
&lt;li&gt;JWT, Slack, Discord, Google, Twilio tokens&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;OSV API for known vulnerable dependencies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bug fix (from peer review):&lt;/strong&gt; &lt;code&gt;process.env.X&lt;/code&gt; references were triggering MCP-SL-001 (hardcoded API key). Fixed by stripping &lt;code&gt;process.env.*&lt;/code&gt; patterns before running secret detection.&lt;/p&gt;

&lt;h3&gt;
  
  
  L1.7 — Binary &amp;amp; malware detection (8 patterns) — NEW
&lt;/h3&gt;

&lt;p&gt;This is the layer I built after the trojan incident. It opens the package zip (recursively — zips inside zips) and scans for:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;BINARY_EXTENSIONS&lt;/span&gt; &lt;span class="o"&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;.exe&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;.dll&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;.scr&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;.msi&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;LAUNCHER_EXTENSIONS&lt;/span&gt; &lt;span class="o"&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;.bat&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;.cmd&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;.vbs&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;.ps1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Plus 8 regex patterns for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Staged launchers: &lt;code&gt;start X.exe Y.txt&lt;/code&gt; (the exact prospector signature)&lt;/li&gt;
&lt;li&gt;Obfuscated Lua bytecode: &lt;code&gt;function(o,R,F,U,b,p,E,M,Z,W,...)&lt;/code&gt; (high-arity function signature)&lt;/li&gt;
&lt;li&gt;External download URLs: &lt;code&gt;raw.githubusercontent.com/.../...zip&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;"Download Latest Release" badges with external zip links&lt;/li&gt;
&lt;li&gt;PowerShell &lt;code&gt;-encodedcommand&lt;/code&gt; with long base64&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;eval(atob(...))&lt;/code&gt; obfuscation&lt;/li&gt;
&lt;li&gt;Lua numeric comment markers&lt;/li&gt;
&lt;li&gt;Oversized text files &amp;gt;100KB that aren't valid JSON (bytecode payloads)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Quarantine flow:&lt;/strong&gt; Any critical finding → score 0, risk_level &lt;code&gt;critical&lt;/code&gt;, status &lt;code&gt;quarantined&lt;/code&gt;, removed from catalog, listed at &lt;code&gt;/api/security?view=quarantine&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  L1.8 — Malware family signatures (17 families) — NEW
&lt;/h3&gt;

&lt;p&gt;YARA-equivalent rules for specific malware families, each with MITRE ATT&amp;amp;CK technique IDs:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Family&lt;/th&gt;
&lt;th&gt;MITRE&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Win64/Lazy.PGPK&lt;/td&gt;
&lt;td&gt;T1027.002&lt;/td&gt;
&lt;td&gt;The trojan that hit us&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Emotet&lt;/td&gt;
&lt;td&gt;T1027.011&lt;/td&gt;
&lt;td&gt;Banking trojan, Office macro delivery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cobalt Strike&lt;/td&gt;
&lt;td&gt;T1071.001&lt;/td&gt;
&lt;td&gt;Post-exploitation beacon&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mimikatz&lt;/td&gt;
&lt;td&gt;T1003.001&lt;/td&gt;
&lt;td&gt;LSASS credential dumper&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;QakBot&lt;/td&gt;
&lt;td&gt;T1027&lt;/td&gt;
&lt;td&gt;Banking trojan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TrickBot&lt;/td&gt;
&lt;td&gt;T1027&lt;/td&gt;
&lt;td&gt;Modular trojan, ransomware precursor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agent Tesla&lt;/td&gt;
&lt;td&gt;T1056.001&lt;/td&gt;
&lt;td&gt;Keylogger&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RedLine Stealer&lt;/td&gt;
&lt;td&gt;T1555&lt;/td&gt;
&lt;td&gt;Browser credential theft&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vidar Stealer&lt;/td&gt;
&lt;td&gt;T1555&lt;/td&gt;
&lt;td&gt;Browser + crypto wallet theft&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Raccoon Stealer&lt;/td&gt;
&lt;td&gt;T1555&lt;/td&gt;
&lt;td&gt;MaaS stealer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LummaC2 Stealer&lt;/td&gt;
&lt;td&gt;T1555&lt;/td&gt;
&lt;td&gt;Telegram-sold stealer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AsyncRAT&lt;/td&gt;
&lt;td&gt;T1071.001&lt;/td&gt;
&lt;td&gt;Open-source RAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;njRAT&lt;/td&gt;
&lt;td&gt;T1071.001&lt;/td&gt;
&lt;td&gt;.NET RAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Remcos RAT&lt;/td&gt;
&lt;td&gt;T1071.001&lt;/td&gt;
&lt;td&gt;Commercial RAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SolarMarker&lt;/td&gt;
&lt;td&gt;T1027&lt;/td&gt;
&lt;td&gt;SEO-poisoned backdoor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lokibot&lt;/td&gt;
&lt;td&gt;T1555&lt;/td&gt;
&lt;td&gt;Credential stealer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DoS tools&lt;/td&gt;
&lt;td&gt;T1499&lt;/td&gt;
&lt;td&gt;hping3, slowloris, goldeneye&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Any match → instant quarantine.&lt;/p&gt;

&lt;h3&gt;
  
  
  WAF — Web Application Firewall (40 rules) — NEW
&lt;/h3&gt;

&lt;p&gt;Inspects every incoming HTTP request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SQLi (7): UNION SELECT, OR 1=1, stacked, time-based, info_schema, hex
XSS (7): script, event handlers, javascript:, data:, vbscript:, img/svg
Path traversal (5): ../, encoded, /etc/passwd, /proc/self, Windows
SSRF (6): AWS/GCP/Azure metadata, file://, gopher://, dict://
Command injection (5): backticks, $(), chained, pipe, &amp;amp;&amp;amp; ||
NoSQL (3): $where, $ne, $gt
Prototype pollution: __proto__, constructor.prototype
SSTI: Jinja2 {{ }}, Twig {% %}, JS ${ }
Log injection: \n \r header injection
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Auto-ban&lt;/strong&gt; after 5 WAF hits in 10 minutes (1-hour ban).&lt;/p&gt;

&lt;h3&gt;
  
  
  Honeypot (50+ paths) — NEW
&lt;/h3&gt;

&lt;p&gt;Fake vulnerable paths that auto-ban scanners for 24 hours:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/.env&lt;/code&gt; → serves fake env file with canary tokens&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/admin&lt;/code&gt; → fake admin login form&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/wp-admin&lt;/code&gt; → fake WordPress login&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/.git/config&lt;/code&gt; → fake git config&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/.aws/credentials&lt;/code&gt; → fake AWS credentials&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/.ssh/id_rsa&lt;/code&gt; → fake SSH key&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/phpmyadmin&lt;/code&gt;, &lt;code&gt;/backup.sql&lt;/code&gt;, &lt;code&gt;/server-status&lt;/code&gt;, &lt;code&gt;/.DS_Store&lt;/code&gt;, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each hit: IP banned 24h + logged publicly at &lt;code&gt;/api/security?view=honeypot&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Threat Intelligence (3 feeds) — NEW
&lt;/h3&gt;

&lt;p&gt;Real-time IOC feeds from abuse.ch (free, no API key):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;URLhaus&lt;/strong&gt; — last 1000 malicious URLs (5-min cache)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MalwareBazaar&lt;/strong&gt; — last 100 malware sample hashes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ThreatFox&lt;/strong&gt; — IOCs from active malware campaigns (7-day window)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Used to check skill source URLs and file hashes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Auto-Quarantine
&lt;/h3&gt;

&lt;p&gt;If any layer flags a skill as critical/high:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Skill certificate moves to &lt;code&gt;_data/quarantine/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Skill removed from public catalog&lt;/li&gt;
&lt;li&gt;Listed publicly at &lt;code&gt;/api/security?view=quarantine&lt;/code&gt; for transparency&lt;/li&gt;
&lt;li&gt;Pre-import scan in auto-discovery blocks it before entering&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Result
&lt;/h2&gt;

&lt;p&gt;Re-audited all 7,063 skills with the 8 layers. &lt;strong&gt;0 in quarantine.&lt;/strong&gt; The catalog was clean except for the one we already removed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Request → Honeypot check → WAF (40 rules) → Handler
                                          ↓
Skill import → L1.5 (6) → L1.6 (36) → L1.7 (8) → L1.8 (17) → Quarantine?
                                                                ↓ no
                                                          Catalog (public)
                                                                ↓ yes
                                                          _data/quarantine/
                                                          (publicly listed)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Stack: Vercel Hobby ($0/mo), GitHub Actions (free), Docker + gVisor for L2 sandbox, abuse.ch feeds.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Metadata audits are not enough.&lt;/strong&gt; Open the packages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Typosquatting is the #1 threat.&lt;/strong&gt; "Download Latest Release" badges pointing to external zips.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transparency builds trust.&lt;/strong&gt; Publish the quarantine list, the audit methodology, the incident history.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free tier is sufficient.&lt;/strong&gt; $0/month infrastructure, 8 layers, real cryptography.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Live: &lt;a href="https://marketnow.site" rel="noopener noreferrer"&gt;https://marketnow.site&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Security overview: &lt;a href="https://marketnow.site/api/security" rel="noopener noreferrer"&gt;https://marketnow.site/api/security&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Trust page: &lt;a href="https://marketnow.site/trust" rel="noopener noreferrer"&gt;https://marketnow.site/trust&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/edgarfloresguerra2011-a11y/marketnow" rel="noopener noreferrer"&gt;https://github.com/edgarfloresguerra2011-a11y/marketnow&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;— &lt;em&gt;Edison Flores, AliceLabs LLC&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>malware</category>
      <category>devsecops</category>
      <category>mcp</category>
    </item>
    <item>
      <title>AI agents need their own SSL. Here's why I built it.</title>
      <dc:creator>Edison Flores</dc:creator>
      <pubDate>Fri, 17 Jul 2026 03:11:26 +0000</pubDate>
      <link>https://dev.to/edison_flores_6d2cd381b13/ai-agents-need-their-own-ssl-heres-why-i-built-it-1njk</link>
      <guid>https://dev.to/edison_flores_6d2cd381b13/ai-agents-need-their-own-ssl-heres-why-i-built-it-1njk</guid>
      <description>&lt;p&gt;In 1995, Netscape released SSL. The web didn't really take off commercially until then. Before SSL, you couldn't trust a website with your credit card. After SSL, e-commerce exploded.&lt;/p&gt;

&lt;p&gt;AI agents are at the same inflection point in 2026. Here's why.&lt;/p&gt;

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

&lt;p&gt;Agents are starting to call each other autonomously. Each hop is a trust decision. But agents have no way to verify each other.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Today, when Agent A calls Agent B:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is Agent B who it claims to be? No way to verify&lt;/li&gt;
&lt;li&gt;Has Agent B been audited for security? No standard&lt;/li&gt;
&lt;li&gt;Has Agent B's key been compromised? No revocation mechanism&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is exactly where the web was in 1994. No SSL, no trust, no commerce.&lt;/p&gt;

&lt;h2&gt;
  
  
  The analogy
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Web (1995)&lt;/th&gt;
&lt;th&gt;Agents (2026)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;HTTP (transport)&lt;/td&gt;
&lt;td&gt;A2A + MCP (transport)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No HTTPS = can't trust&lt;/td&gt;
&lt;td&gt;No ATC = can't trust&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSL certificate&lt;/td&gt;
&lt;td&gt;ATC Trust Card&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Certificate Authority&lt;/td&gt;
&lt;td&gt;MarketNow Sentinel CA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Revocation list (CRL)&lt;/td&gt;
&lt;td&gt;/api/atc?action=verify&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;p&gt;&lt;strong&gt;ATC (Agent Trust Card)&lt;/strong&gt; — SSL certificates for AI agents.&lt;/p&gt;

&lt;h3&gt;
  
  
  How it works
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Agent registers with MarketNow CA&lt;/li&gt;
&lt;li&gt;CA signs the agent's identity with Ed25519&lt;/li&gt;
&lt;li&gt;Agent presents its ATC to other agents&lt;/li&gt;
&lt;li&gt;Other agents verify the signature with the CA public key&lt;/li&gt;
&lt;li&gt;If compromised, the CA revokes the ATC&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Real cryptography (not a mock)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Ed25519 signatures (RFC 8032)&lt;/li&gt;
&lt;li&gt;CA private key in Vercel env var (never exposed)&lt;/li&gt;
&lt;li&gt;CA public key committed to public GitHub repo&lt;/li&gt;
&lt;li&gt;Every ATC persisted as signed JSON in _data/atc/&lt;/li&gt;
&lt;li&gt;Anyone can verify signatures offline using crypto.verify&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Sentinel integration
&lt;/h3&gt;

&lt;p&gt;The ATC's trust score comes from Sentinel — the 8-layer security audit pipeline:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;L1.5: metadata checks&lt;/li&gt;
&lt;li&gt;L1.6: Semgrep + secrets + OSV&lt;/li&gt;
&lt;li&gt;L1.7: binary/malware detection&lt;/li&gt;
&lt;li&gt;L1.8: malware family signatures (Emotet, Cobalt Strike, etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The positioning
&lt;/h2&gt;

&lt;p&gt;MarketNow is not competing with A2A or MCP. It's the trust layer that sits on top:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ATC (Trust Layer)              &amp;lt;- MarketNow
A2A / MCP (Transport Layer)    &amp;lt;- Google / Anthropic
HTTP / WebSocket (Network)     &amp;lt;- Standard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every agent with an A2A card can have an ATC Trust Card. Every MCP skill can have a Sentinel Certificate. Complementary, not competitive.&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;&lt;span class="c"&gt;# Get the CA public key&lt;/span&gt;
curl https://marketnow.site/api/atc?action&lt;span class="o"&gt;=&lt;/span&gt;ca-key

&lt;span class="c"&gt;# Issue a trust card for your agent&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://marketnow.site/api/atc &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;'{"action":"issue","agent_id":"your.agent","public_key":"your-ed25519-pubkey"}'&lt;/span&gt;

&lt;span class="c"&gt;# Verify any agent's trust card&lt;/span&gt;
curl &lt;span class="s2"&gt;"https://marketnow.site/api/atc?action=verify&amp;amp;card_id=ATC-2026-XXXXXXX"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Live demo:&lt;/strong&gt; &lt;a href="https://marketnow.site/atc" rel="noopener noreferrer"&gt;https://marketnow.site/atc&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/edgarfloresguerra2011-a11y/marketnow" rel="noopener noreferrer"&gt;https://github.com/edgarfloresguerra2011-a11y/marketnow&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The web needed SSL to become trustworthy enough for commerce. Agents need the same thing. This is it.&lt;/p&gt;

&lt;p&gt;— &lt;em&gt;Edison Flores, AliceLabs LLC — marketnow.site&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>mcp</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Post-mortem: a trojan slipped into my MCP marketplace. Here's what I built to stop it happening again.</title>
      <dc:creator>Edison Flores</dc:creator>
      <pubDate>Fri, 17 Jul 2026 03:09:17 +0000</pubDate>
      <link>https://dev.to/edison_flores_6d2cd381b13/post-mortem-a-trojan-slipped-into-my-mcp-marketplace-heres-what-i-built-to-stop-it-happening-42oc</link>
      <guid>https://dev.to/edison_flores_6d2cd381b13/post-mortem-a-trojan-slipped-into-my-mcp-marketplace-heres-what-i-built-to-stop-it-happening-42oc</guid>
      <description>&lt;p&gt;Two weeks ago, a community member reported something alarming on my MCP marketplace: one of the skills contained a Windows trojan.&lt;/p&gt;

&lt;p&gt;This is the post-mortem. Not the "here's what went wrong" kind — the "here's what I built so it never happens again" kind.&lt;/p&gt;

&lt;h2&gt;
  
  
  The incident
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Skill:&lt;/strong&gt; &lt;code&gt;prospector-email-finder&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Malware:&lt;/strong&gt; &lt;code&gt;Trojan:Win64/Lazy.PGPK!MTB&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Vector:&lt;/strong&gt; typosquatting GitHub repo&lt;/p&gt;

&lt;p&gt;The attack was clever. A legitimate MCP server (&lt;code&gt;prospector-mcp-email-finder&lt;/code&gt;) existed on GitHub. An attacker created a typosquatting copy (&lt;code&gt;JuanquiFortuny/prospector-mcp-email-finder&lt;/code&gt;) with the same README — but with a "Download Latest Release" badge that linked to a malicious zip on &lt;code&gt;raw.githubusercontent.com&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The zip contained:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Application.cmd  →  'start unit.exe package.txt'
package.txt      →  298 KB of obfuscated Lua bytecode
unit.exe         →  872 KB PE32+ Windows executable (the trojan)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;My import script downloaded the zip and committed it to &lt;code&gt;dist/skills/&lt;/code&gt; without scanning inside it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What went wrong
&lt;/h2&gt;

&lt;p&gt;My existing audit pipeline (Sentinel L1.5 + L1.6) only checked skill &lt;strong&gt;metadata&lt;/strong&gt; — name, description, system_prompt, install command. It never looked inside the actual package zip.&lt;/p&gt;

&lt;p&gt;That's like checking the cover of a book but never reading the pages.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I built (8 layers, 2 weeks)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Layer 1-2: L1.5 + L1.6 (already existed)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;6 metadata checks (auth, injection, CORS, OAuth, rate limiting)&lt;/li&gt;
&lt;li&gt;18 Semgrep rules + 18 secret patterns + OSV dependency check&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Layer 3: L1.7 — Binary &amp;amp; malware detection (NEW)
&lt;/h3&gt;

&lt;p&gt;Opens the package zip (recursively — zips inside zips) and scans for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Windows binaries (&lt;code&gt;.exe&lt;/code&gt;, &lt;code&gt;.dll&lt;/code&gt;, &lt;code&gt;.scr&lt;/code&gt;) → instant quarantine&lt;/li&gt;
&lt;li&gt;Launcher scripts (&lt;code&gt;.bat&lt;/code&gt;, &lt;code&gt;.cmd&lt;/code&gt;, &lt;code&gt;.vbs&lt;/code&gt;, &lt;code&gt;.ps1&lt;/code&gt;) → instant quarantine&lt;/li&gt;
&lt;li&gt;Nested archives (red flag — legit MCP skills don't nest zips)&lt;/li&gt;
&lt;li&gt;Obfuscated Lua bytecode (regex on the high-arity function signature)&lt;/li&gt;
&lt;li&gt;External download URLs in READMEs (the typosquatting vector)&lt;/li&gt;
&lt;li&gt;PowerShell &lt;code&gt;-encodedcommand&lt;/code&gt; payloads&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;eval(atob())&lt;/code&gt; obfuscation&lt;/li&gt;
&lt;li&gt;Oversized text files &amp;gt;100KB that aren't valid JSON (bytecode payloads)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Layer 4: L1.8 — Malware family signatures (NEW)
&lt;/h3&gt;

&lt;p&gt;17 YARA-equivalent rules for specific malware families:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Win64/Lazy.PGPK (the one that hit us)&lt;/li&gt;
&lt;li&gt;Emotet, Cobalt Strike, Mimikatz, QakBot, TrickBot&lt;/li&gt;
&lt;li&gt;Agent Tesla, RedLine, Vidar, Raccoon, LummaC2&lt;/li&gt;
&lt;li&gt;AsyncRAT, njRAT, Remcos, SolarMarker, Lokibot&lt;/li&gt;
&lt;li&gt;DoS tools (hping3, slowloris, goldeneye)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each rule has a MITRE ATT&amp;amp;CK technique ID. Any match → instant quarantine.&lt;/p&gt;

&lt;h3&gt;
  
  
  Layer 5: WAF — Web Application Firewall (NEW)
&lt;/h3&gt;

&lt;p&gt;40 attack signatures (SQLi, XSS, SSRF, path traversal, command injection) with auto-ban after 5 hits.&lt;/p&gt;

&lt;h3&gt;
  
  
  Layer 6: Honeypot (NEW)
&lt;/h3&gt;

&lt;p&gt;50+ fake paths (&lt;code&gt;/.env&lt;/code&gt;, &lt;code&gt;/admin&lt;/code&gt;, &lt;code&gt;/wp-admin&lt;/code&gt;, &lt;code&gt;/.git/config&lt;/code&gt;, &lt;code&gt;/.aws/credentials&lt;/code&gt;) that auto-ban scanners for 24h and serve believable fake responses.&lt;/p&gt;

&lt;h3&gt;
  
  
  Layer 7: Threat Intelligence (NEW)
&lt;/h3&gt;

&lt;p&gt;Real-time IOC feeds from abuse.ch (URLhaus + MalwareBazaar + ThreatFox).&lt;/p&gt;

&lt;h3&gt;
  
  
  Layer 8: Auto-Quarantine (NEW)
&lt;/h3&gt;

&lt;p&gt;Malicious skills removed from catalog + publicly listed at &lt;code&gt;/api/security?view=quarantine&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The result
&lt;/h2&gt;

&lt;p&gt;Re-audited all 7,063 skills with the new layers. &lt;strong&gt;0 in quarantine.&lt;/strong&gt; The catalog was clean except for the one we already removed.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Metadata audits are not enough.&lt;/strong&gt; If you run a marketplace for code that agents will execute, you have to look inside the packages.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Typosquatting is the #1 threat.&lt;/strong&gt; Attackers don't need to hack your platform — they just need to create a repo that looks similar to a legitimate one and add a "Download" button.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Transparency builds trust.&lt;/strong&gt; Publishing the quarantine list, the audit methodology, and the incident history at &lt;code&gt;/trust&lt;/code&gt; does more for credibility than any security badge.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Free tier is sufficient.&lt;/strong&gt; The whole thing runs on Vercel Hobby ($0/month) + GitHub Actions (free). You don't need enterprise infrastructure to do security right.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The trojan's silver lining
&lt;/h2&gt;

&lt;p&gt;The prospector incident was the best thing that happened to MarketNow. It forced me to build real security instead of performative security. Now every skill in the catalog is scanned by 8 layers including YARA-equivalent malware family detection — and the whole thing is verifiable by anyone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try it:&lt;/strong&gt; &lt;a href="https://marketnow.site" rel="noopener noreferrer"&gt;https://marketnow.site&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Security overview:&lt;/strong&gt; &lt;a href="https://marketnow.site/api/security" rel="noopener noreferrer"&gt;https://marketnow.site/api/security&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Trust page:&lt;/strong&gt; &lt;a href="https://marketnow.site/trust" rel="noopener noreferrer"&gt;https://marketnow.site/trust&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/edgarfloresguerra2011-a11y/marketnow" rel="noopener noreferrer"&gt;https://github.com/edgarfloresguerra2011-a11y/marketnow&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;— &lt;em&gt;Edison Flores, AliceLabs LLC&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>mcp</category>
      <category>postmortem</category>
      <category>indiehackers</category>
    </item>
  </channel>
</rss>
