Skip to main content
Glama

DMARKOFF — DMARC, SPF & DKIM Analytics

dns_check_spf

Read-onlyIdempotent

Live SPF DNS lookup — queries DNS in real time and returns the SPF record, what receivers evaluate it to, DNS-lookup and void-lookup counts, parsed include tree, TXT diagnostics, errors and warnings. evaluation is what receivers' SPF check returns: ok (pass or fail then depends on the sending IP), none (no record), permerror or temperror. permErrorScope=record — receivers that follow RFC 7208 do not evaluate it as one record (a syntax error, several SPF records) and lookupCount 0 means "not counted"; with a syntax error SPF fails for every message, with several records (listed in records) receivers differ — some return permerror, some report fail, some evaluate one of the records — so the result is unpredictable; permErrorScope=evaluation — it breaks during evaluation (an include target without SPF, more than 10 DNS lookups, a 3rd void lookup): senders matched before that point still pass, every other sender gets permerror, senders listed later in the record included. Terms with ignored=true are never evaluated by receivers. voidLookups counts the lookups that return no records (receivers allow 2, RFC 7208 §4.6.4) for a sender the record does not list (192.0.2.1, without reverse DNS), up to where evaluation stops for it. An include or redirect whose target has no TXT records at all or does not exist counts too, beside its Critical error (a target with TXT records but no SPF does not). Terms whose name depends on the sender — exists, a or mx with a macro such as %{i}, and ptr — count too: they usually return nothing for such a sender, which is normal but counts toward the limit. A 3rd void lookup is a permerror (a Critical error, evaluation permerror), except when it is reached only with ptr: then only senders without reverse DNS get permerror, so evaluation stays ok and an Info error names the terms. That permerror does not stop the count: voidLookups goes on past the 3rd, so it can read 3 or more, and more than a later Critical error counts (that one leaves ptr out). voidLookups can also be lower than the void-lookup errors suggest: those judge each term, wherever it is. An include or redirect whose target depends on the sender (Proofpoint's include:%{ir}.%{v}.%{d}.spf.has.pphosted.com, Valimail's %{i}…) counts as one DNS lookup itself, but the terms of its target — a record of its own for each sender IP — count in neither lookupCount nor voidLookups; when that target takes the unlisted sender over either limit an Info error names the term and where receivers stop, and when the target does not exist for it, a Critical error with permerror. A name with a CNAME next to its own TXT records (DNS does not allow it, but some DNS hosts serve it) gets spfDnsConflict=true and a dns_record_found error with fix dns_fix_cname_txt_conflict, found by asking the zone's name servers directly. It is Critical when the two sides publish different SPF records: receivers that read the TXT at the name (such as Gmail and Yahoo) and receivers that follow the CNAME (such as Mail.ru and most Microsoft servers) check different records, so a sender authorized by only one of them fails SPF at the other group. It is a Warning when both sides publish the same SPF records, or neither has one. record, evaluation and the counts are then for the side this check's resolver returned (evaluation can stay ok), and txtDiag is that resolver's answer, which can show no CNAME (cnameAtQName=false); the error's text names both records. Does NOT require a project — works for any domain, even ones not monitored. Use this to verify SPF configuration, diagnose "too many DNS lookups" issues, or check a domain before adding it to a project.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "domain": "<domain>"
    },
    "name": "dns_check_spf"
  }
}

Input Schema

NameRequiredDescriptionDefault
domainYesthe domain name to check (e.g. example.com)

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observed

TDQS

A4.2/5.0
Behavior5/5

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

Annotations only declare readOnlyHint and idempotentHint; the description goes far beyond by explaining live DNS querying, evaluation semantics, permErrorScope, void-lookup limits, CNAME/TXT conflict handling, and the error/warning outputs. This supplies the behavioral context an agent needs to interpret results correctly.

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

Conciseness2/5

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

The opening summary is front-loaded and useful, but the body becomes an extremely dense multi-paragraph essay on obscure SPF edge cases. For a one-parameter lookup, many sentences exceed what an agent needs in order to select and invoke the tool, hurting scannability.

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

Completeness5/5

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

No output schema exists, so the description must carry the full burden of explaining return values; it thoroughly details the SPF record, evaluation, counts, diagnostics, and error types. The tool's complexity is matched by the explanation, leaving no critical gap for an agent.

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?

The single domain parameter is fully described in the schema, and the description adds no extra syntax, format, or validation detail beyond what the schema provides. Baseline 3 is appropriate when schema coverage is 100% and the description does not enrich parameter meaning.

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?

States a specific verb and resource (live SPF DNS lookup) and enumerates what the tool returns: SPF record, receiver evaluation, lookup counts, include tree, TXT diagnostics, errors and warnings. The 'live' and 'does NOT require a project' phrasing implicitly distinguishes it from stored-record siblings such as get_spf_records, even though no sibling is named explicitly.

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

Usage Guidelines4/5

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

The final sentence gives explicit use cases: verify SPF configuration, diagnose 'too many DNS lookups' issues, or check a domain before adding it to a project. It does not name alternatives or say when to prefer get_spf_records or dns_check_dmarc, so it falls short of full when/when-not guidance.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.