fix-dmarc

fix-dmarc is a skill for Claude Code from dnsdoctor/claude-plugin. It costs 94 tokens per session (5,272 once invoked), scanned B, original, Apache-2.0.

A guide for safely fixing a domain's DMARC record, which tells receiving mail servers what to do with messages that fail email-authentication checks. It scans the domain, obtains the next validated setting, and checks the record after the owner publishes it.

In plain words
What is it for?
It helps diagnose DMARC failures, improve a policy one step at a time, and verify the published DMARC record using DNS checks.
Why use it?
It prevents unsafe hand-written DMARC changes and moves the policy gradually from monitoring to quarantine or rejection. It also keeps SPF diagnosis separate and never changes DNS on the user's behalf.

Skill for Claude Code

Written for Claude Code: shipped in a Claude Code plugin.

Part of the dns-doctor plugin — 3 skills, 1 MCP server shipped together

Good fit It helps diagnose DMARC failures, improve a policy one step at a time, and verify the published DMARC record using DNS checks.

Compare 6 skills from other repositories ↓
Install with agentmods
npx agentmods add skills/dnsdoctor/claude-plugin/fix-dmarc
Install

Getting it into your agent

One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.

Any agent
npx skills add dnsdoctor/claude-plugin --skill fix-dmarc
Clone the repo
git clone --depth 1 https://github.com/dnsdoctor/claude-plugin

Made for: Claude Code.

Or install dns-doctor, the plugin that ships this one along with the rest of its 3 skills, 1 MCP server.

Wrote this? Show the measurements

A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.

agentmods badge for fix-dmarc

README.md
[![agentmods](https://agentmods.dev/badge/skills/dnsdoctor/claude-plugin/fix-dmarc/github.svg)](https://agentmods.dev/skills/dnsdoctor/claude-plugin/fix-dmarc)
Your own site
<a href="https://agentmods.dev/skills/dnsdoctor/claude-plugin/fix-dmarc"><img src="https://agentmods.dev/badge/skills/dnsdoctor/claude-plugin/fix-dmarc/github.svg" alt="Measured on agentmods" height="20"></a>

Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.

agentmods 80×15 button for fix-dmarc

Your own site · 80×15
<a href="https://agentmods.dev/skills/dnsdoctor/claude-plugin/fix-dmarc"><img src="https://agentmods.dev/badge/skills/dnsdoctor/claude-plugin/fix-dmarc.svg" alt="Reviewed on agentmods" width="80" height="20"></a>
Per session 94 Skills are progressive disclosure: only the name and description are preloaded; the body loads when the skill is used.
When invoked 5,272 The whole file, excluding the scripts and references it only reads on demand.
Security scan B 1 finding. A grade says what 26 rules found in the file — not that it is safe.
Origin original No closer match found in the catalogue.
Token cost

What it costs to keep this loaded

Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.

ModelPer sessionOnce invoked
Fable 5.1 $0.00094 $0.05272
Opus 5.5 $0.00038 $0.02109
Sonnet 5.5 $0.00019 $0.01054
Haiku 4.5 $0.00009 $0.00527

Measured yesterday against content hash 84be322f0133, method: parsed. Prices are Anthropic first-party input rates as of 2026-10-07, from the pricing page.

Security

Grade B, and why

fix-dmarc scanned grade B with 1 finding against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured yesterday.

A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.

Strips warnings and disclaimersmediumAnti-refusal

Omitting safety caveats hides risk from the user and is a common jailbreak preamble.

signature that proves the mail is really yours)"), and don't lecture or scare.
Origin

Copies of this mod

1 near-identical copy found in the catalogue:

skills/fix-dmarc/SKILL.md · 271 lines

How it starts

The opening of the file, as written. The whole thing — 271 lines — stays where its author put it; the contents beside it link to each section on GitHub.

Fix my DMARC

Scan, get the one next record, the user publishes it, check it. Each step ends on the next action, so the user never has to ask "what now?".

Rules

  • Never compose or edit a DMARC record. Every record comes from a DNS Doctor tool result and is printed verbatim, host and value exactly as returned. Never rewrite, reformat or "improve" it.
  • The ladder is p=none → p=quarantine → p=reject, one step at a time, never with pct. A scan can justify at most p=quarantine, and only with alignment evidence. p=reject needs weeks of aggregate-report evidence that every real sender passes; no scan gives it.
  • SPF is diagnose-only. Relay SPF findings; never propose an SPF record or edit (not even ~all to -all).
  • The user publishes every DNS change; you never change DNS for them.
  • Plain words for a non-expert: see "Explain it for a non-expert" at the end of this skill.

Flow

  1. Scan. Call scan_domain. It publishes a public report page, and so does build_dmarc_upgrade (it scans fresh too): if the user wants the domain kept private, run neither and say why. Read DMARC, SPF and DKIM failing-first: temperror is a lookup that did not complete, never a failure; info is "not found", never a failure. If the report has not_registered: true, the domain does not resolve: propose no records and ask which domain they meant.
  2. Get the record. Call build_dmarc_upgrade with the domain. It scans fresh and decides the step itself.
    • record present: print it verbatim and where it goes (_dmarc.<domain>, a TXT record). It replaces their current DMARC record; a domain must have only one. Say in one line what this step changes. End with: "Publish it at your DNS host and tell me when it's done; I'll check it."
    • record is null: relay its rationale as the answer and stop there. Never fill the gap with a record of your own. policy describes the returned record, so it is null too; the domain's observed policy is in current_policy. Common reasons: already at least as strong as the evidence allows, no alignment signal yet (reporting comes first), the DMARC lookup did not complete (try again shortly), the domain does not exist, or the domain is on Automatic DMARC (DNS Doctor serves the record and the owner applies steps from the dashboard).
  3. Re-check. When they say it is published, call check_record with kind: dmarc and expected_value set to the record. On done, call scan_domain once more and say whether DMARC now passes. On wait, say when to look again (check_again_after_seconds) and ask them to tell you then. On edit, relay found_at if it names where the value landed instead. For "has it reached everywhere?" use check_propagation on _dmarc.<domain>, type TXT (see the verify-change skill).
  4. Next step. After p=quarantine, say plainly that p=reject needs about 30 days of aggregate-report evidence, which a chat cannot collect. If the user owns the domain and wants that evidence gathered, offer DNS Doctor monitoring, set up as the dns-doctor skill describes; never promise a date.

Read the full file on GitHub · 271 lines

Changes

What this file has done since we first saw it

Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.

  1. yesterday First seen · 271 lines · 94 tokens per session scan B 84be322f0133

Subscribe to this mod's changes

fix-dmarc is a skill published in the GitHub repository dnsdoctor/claude-plugin (3 stars, last pushed yesterday), licensed Apache-2.0. It adds 94 tokens to every session and 5,272 once invoked, about $0.0004 per session on Opus 5.5. A static security scan graded it B with 1 finding (strips warnings and disclaimers). No closer match exists in the catalogue, so it is treated as the original; first seen 2026-11-04.

Related

Other skills, from other repositories

analyzing-email-headers-for-phishing-investigation

Parse and analyze email headers (Received chain, Return-Path, Message-ID) to trace the true origin of a phishing email and validate SPF, DKIM, and DMARC results to confirm or rule out sender spoofing. Use when triaging a suspicious or reported email, investigating a phishing incident, or verifying whether a message's…

mukul975/Anthropic-Cybersecurity-Skills · 84 tokens

analyzing-email-headers-for-phishing-investigation

Parse and analyze email headers to trace the origin of phishing emails, verify sender authenticity, and identify spoofing through SPF, DKIM, and DMARC validation.

xalgorix/xalgorix · 44 tokens

email-deliverability

Use when mail already sent lands in spam, is rejected, or fails the Gmail/Yahoo bulk-sender checks and the fix is authentication and reputation, not the sending code: SPF/DKIM/DMARC alignment, domain warmup, spam-complaint rate, one-click unsubscribe, BIMI. NOT putting mail on the wire through a provider API (that is…

ericrisco/rsc-harness · 84 tokens

email-security

DMARC/SPF/DKIM check, email spoofing, SMTP test, and security header analysis.

uphiago/recon-skills · 23 tokens

analyzing-email-headers-for-phishing-investigation

Parse and analyze email headers to trace the origin of phishing emails, verify sender authenticity, and identify spoofing through SPF, DKIM, and DMARC validation.

26zl/cybersec-toolkit · 44 tokens

email-service-integration

Send reliable transactional emails (order confirmations, shipping updates) via SendGrid, SES, or Postmark with templates and deliverability best practices.

finsilabs/awesome-ecommerce-skills · 32 tokens