Skip to main content
Glama

Build DMARC Upgrade Record

build_dmarc_upgrade

Build a validated DMARC enforcement-upgrade record for a domain: determine the safe next policy step, with scan justification capped at quarantine and reject unlocked only by monitoring evidence.

Instructions

Use this when the user asks how to move DMARC on from p=none, whether it is safe to tighten DMARC, or what the next DMARC policy step is for a domain (a scan can justify quarantine at most; reject needs monitoring evidence) — and after any report showing DMARC below enforcement. Return a validated DMARC enforcement-upgrade record for a domain. A scan can justify p=quarantine at MOST: the alignment signal (valid aligned SPF and a DKIM selector) is derived server-side — a caller can never assert it — and p=reject is unlocked only by aggregate-report evidence over a full reporting window (monitoring), never by a scan. record is null when there is no honest upgrade to offer (the domain does not exist; the DMARC lookup itself hit NXDOMAIN while the existence probe did not resolve; the DMARC lookup temp-failed; no alignment signal was observed at all, so a non-enforcing domain is told to publish rua= reporting first and an enforcing one is left alone; the domain is on Automatic DMARC, where DNS Doctor serves its record and the owner applies each step from the dashboard; or the domain already applies a policy at least as strong as this scan justifies): a null record is the ANSWER, not a fault — relay rationale and never compose a record to fill the gap. A returned record also carries np=reject (the DMARCbis tag covering non-existent subdomains, which can have no legitimate aligned mail) unless the domain already publishes an np tag, which is preserved as-is. Present a returned record verbatim; a human must approve before publishing.

Input Schema

NameRequiredDescriptionDefault
domainYesThe domain to check, e.g. example.com. Bare registrable names and subdomains both work; scheme, path or port do not belong here. Unicode names are accepted and normalized to punycode.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changedv1.2.1
    • addedInput schema / properties / domain / description
      Added value: +"The domain to check, e.g. example.com. Bare registrable names and subdomains both work; scheme, path or port do not belong here. Unicode names are accepted and normalized to punycode."
  2. First observedv0.1.0

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With annotations only declaring safety flags, the description carries real behavioral weight: the alignment signal is derived server-side and cannot be asserted by the caller, np=reject is injected unless an np tag already exists, a null record is a legitimate answer with enumerated causes, and the record must be presented verbatim pending human approval. None of that is recoverable from readOnlyHint/destructiveHint/openWorldHint.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is correctly front-loaded — the triggering situations come first, then the return contract, then the null-case rules. The content mostly earns its place, though the long parenthetical null-case enumeration and semicolon-chained clauses make it dense and harder to scan than a short bulleted breakdown would be.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter tool with no output schema, the definition covers the decision logic, the np-tag behavior, and how to treat a null record. The only real gap is that a returned record's shape is never sketched (only `rationale` is named), leaving the agent reliant on 'present verbatim' to handle it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the single `domain` parameter is already fully documented in the schema (bare registrable names, subdomains, punycode normalization). The description adds only the phrase 'for a domain' and no extra syntax or constraint detail; baseline 3 applies when the schema does the work.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb and resource — 'Return a validated DMARC enforcement-upgrade record for a domain' — and immediately bounds what such a record can be (scan justifies at most p=quarantine; p=reject requires aggregate-report monitoring evidence). That framing separates it from a generic record builder or a raw domain scan without the agent needing the sibling schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It opens with explicit triggers ('when the user asks how to move DMARC on from p=none, whether it is safe to tighten DMARC, or what the next DMARC policy step is') and adds a second condition ('after any report showing DMARC below enforcement'). It also enumerates the when-not cases via the null-record list and warns 'never compose a record to fill the gap,' which is a usable exclusion rule rather than inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.