<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[plaindmarc]]></title><description><![CDATA[plaindmarc]]></description><link>https://plaindmarc.hashnode.dev</link><image><url>https://cdn.hashnode.com/uploads/logos/6a7789e169b9e00afe80ca1d/0687d3bc-9359-4987-9ba0-6dc1a2951abd.jpg</url><title>plaindmarc</title><link>https://plaindmarc.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Mon, 21 Sep 2026 17:22:07 GMT</lastBuildDate><atom:link href="https://plaindmarc.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[How to Check SPF, DKIM and DMARC Without Leaving Your AI Assistant]]></title><description><![CDATA[Email authentication debugging is a lookup problem. Someone forwards you a bounce, and answering it means pulling a TXT record, counting SPF includes, chasing a DKIM selector through a CNAME chain, an]]></description><link>https://plaindmarc.hashnode.dev/how-to-check-spf-dkim-and-dmarc-without-leaving-your-ai-assistant</link><guid isPermaLink="true">https://plaindmarc.hashnode.dev/how-to-check-spf-dkim-and-dmarc-without-leaving-your-ai-assistant</guid><category><![CDATA[DMARC]]></category><category><![CDATA[mcp]]></category><category><![CDATA[mcp server]]></category><category><![CDATA[email security]]></category><category><![CDATA[ai agents]]></category><dc:creator><![CDATA[Soulaymen Yaakoubi]]></dc:creator><pubDate>Sat, 08 Aug 2026 20:28:35 GMT</pubDate><content:encoded><![CDATA[<p>Email authentication debugging is a lookup problem. Someone forwards you a bounce, and answering it means pulling a TXT record, counting SPF includes, chasing a DKIM selector through a CNAME chain, and then translating all of it into something a non-technical client will actually read. That is four browser tabs and a pile of copy-paste for a question that has exactly one correct answer.</p>
<p>The Model Context Protocol is the standard that lets assistants like Claude call external tools, and it collapses that whole loop into a single sentence: <em>Is acme.com protected against spoofing, and is anyone actually reading its DMARC reports?</em></p>
<h2>Install it in one line</h2>
<p><code>plaindmarc-mcp</code> is a small, read-only MCP server that wraps a set of public email-authentication endpoints. Every tool does a live DNS lookup and returns structured fields plus a one-sentence plain-English summary.</p>
<p>Claude Code:</p>
<pre><code class="language-bash">claude mcp add plaindmarc -- npx -y plaindmarc-mcp
</code></pre>
<p>Claude Desktop, or any other MCP client:</p>
<pre><code class="language-json">{
  "mcpServers": {
    "plaindmarc": {
      "command": "npx",
      "args": ["-y", "plaindmarc-mcp"]
    }
  }
}
</code></pre>
<p>There is no signup step and no API key to paste, which matters more than it sounds: the friction in most tooling is not the tool, it is the account you have to make before you can try it. Then ask something like <em>"Is example.com protected against email spoofing, and is anyone watching its DMARC reports?"</em></p>
<h2>The seven tools</h2>
<ul>
<li><strong>check_dmarc</strong> - the verdict and a letter grade (A-F), the policy in force, and whether aggregate reports are actually being received. A domain can be protected yet completely unmonitored; this says so.</li>
<li><strong>check_spf</strong> - the SPF record, the DNS-lookup count against the limit of 10, and whether it ends in a protective <code>-all</code>/<code>~all</code> or a permissive one.</li>
<li><strong>check_dkim</strong> - a selector's key, following CNAME chains the way most providers publish: found, missing, revoked or weak.</li>
<li><strong>check_bimi</strong> - BIMI eligibility: the logo, the VMC, and whether DMARC is at enforcement (a BIMI record at <code>p=none</code> never shows a logo).</li>
<li><strong>check_mta_sts</strong> - MTA-STS and TLS-RPT DNS setup for enforced, reported TLS delivery.</li>
<li><strong>generate_dmarc_record</strong> - a valid DMARC record to publish.</li>
<li><strong>analyze_dmarc_report</strong> - a raw aggregate (rua) XML report, explained in plain English.</li>
</ul>
<h2>Honest by design</h2>
<p>An agent repeats whatever a tool tells it, more or less verbatim, to a human being who is going to act on it. That changes what a good answer looks like.</p>
<p>A DNS failure or a missing record returns an explicit unknown state with the reason attached, never a guessed verdict, and a FAIL is never softened into a maybe. BIMI is reported as eligibility rather than a promise, because mailbox providers apply their own rules on top. The MTA-STS check says plainly that it cannot fetch the HTTPS policy file remotely, instead of pretending otherwise.</p>
<p>The record generator is the clearest example. Ask it for <code>p=reject</code> or <code>p=quarantine</code> straight out of the gate and it pushes back: start at <code>p=none</code>, watch the reports for a few weeks, then tighten. Skip that and enforcement starts blocking your own legitimate mail. It also flags that <code>pct=</code> is deprecated in DMARCbis, which is exactly the kind of detail an assistant gets confidently wrong from stale training data.</p>
<p>Requests are concurrency-capped with backoff, so an agent auditing a whole portfolio of domains finishes cleanly.</p>
<h2>Where a one-off check stops being enough</h2>
<p>These tools read DNS at the moment you ask. That answers "is this configured correctly today", which is the right question when you are onboarding a domain or debugging a bounce. It is not the question that catches a live problem. The verdict that matters there arrives three days into a spoofing run, from the aggregate reports receivers send back, and nobody reads those XML files voluntarily.</p>
<p>So treat the MCP server as the fast half of the job: instant answers, no account, inside the tool you are already working in. Then put something in place that keeps watching after the check comes back green.</p>
<p>The server is on npm as <code>plaindmarc-mcp</code>.</p>
<hr />
<p><em>Originally published on the PlainDMARC blog: <a href="https://plaindmarc.com/blog/dmarc-mcp-server">A DMARC MCP server for your AI agent</a></em></p>
]]></content:encoded></item></channel></rss>