dns-doctor
Server Details
Scan, fix and verify DNS: SPF, DMARC, DKIM, propagation, DNS health, expiry. Validated fixes.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP
- URL
- Repository
- dnsdoctor/claude-plugin
- GitHub Stars
- 2
- Server Listing
- DNS Doctor
Available Tools
16 toolsaudit_spf_includesARead-onlyIdempotentInspect
Audit a domain's SPF supply chain: walks every include and redirect it delegates to, and reports who can transitively send as it. Returns the resolved tree, per-node lookup attribution, the total authorized IPv4 address count, and typed findings — include_broken (a target that no longer publishes SPF, a PermError today), include_registrable (a delegated-to domain that does not exist, so a stranger who registers it becomes an authorized sender), include_expiring (registration lapsing within 30 days), pass_all_nested (a +all deep in the chain) and spf_record_unusable (the audited domain's OWN record is missing or does not parse, so there is no chain to walk). A domain we could not verify is reported as unverified and NEVER as available — never tell anyone a name is free on this tool's say-so unless the finding is include_registrable AND carries registry_confirmed: true. A registry_confirmed: false finding rests on DNS alone, which cannot tell an unsold name from one in redemption or on clientHold: report the mechanism as broken and the takeover risk as possible, but never as an available domain. Findings are risk analysis, not instructions: no SPF fix record exists here or anywhere else in DNS Doctor, because dropping a mechanism can silently de-authorize a real sender — relay the findings and let the domain's owner decide. Use count_spf_lookups instead when the question is only the 10-lookup limit.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already indicate a safe, read-only tool, but the description adds critical behavioral nuances: unverified domains are never reported as available, registry_confirmed must be true for include_registrable to claim availability, and it warns about the dangers of SPF changes. This goes far beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is lengthy but each sentence adds critical information for a complex audit tool. It is front-loaded with purpose and flows logically into return values, findings, and caveats. However, it is one dense paragraph and could benefit from structural breaks, so a 4.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of SPF supply chain auditing, the description covers the return shape, all finding types, edge cases (unverified, registry_confirmed), warning about availability, and the alternative tool. The presence of an output schema reduces the burden, but the description still explains the key outcomes thoroughly, earning a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already fully describes the domain parameter, including format, subdomains, unicode normalization, and exclusions. The description doesn't add new parameter semantics; it only references domain in the context of verification failure. With 100% schema coverage, the baseline is 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb and resource: 'Audit a domain's SPF supply chain' and specifies what it does: 'walks every include and redirect it delegates to, and reports who can transitively send as it.' This distinguishes it from siblings like count_spf_lookups and scan_domain by focusing on transitive delegation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly names an alternative tool: 'Use count_spf_lookups instead when the question is only the 10-lookup limit.' It also strongly advises on how to interpret findings: 'Findings are risk analysis, not instructions' and 'relay the findings and let the domain's owner decide.' This is clear guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
build_dmarc_upgradeAInspect
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; 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.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even though annotations provide openWorldHint and idempotentHint, the description adds substantial behavioral context: null is the answer, not a fault; alignment is server-side derived; existing np tags are preserved; and the returned record must be presented verbatim with human approval. No contradiction with the annotations appears.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and front-loaded with the core purpose, and nearly every clause earns its place. However, the enumeration of null-record cases is a long, winding parenthetical that could be better structured for scannability, so it is not maximally concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists, the description covers the remaining context an agent needs: null semantics, enforcement limits, np tag behavior, and the human-approval publishing constraint. The tool is complex, and this description is complete enough to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already fully documents the single `domain` parameter. The description does not add parameter-specific semantics, which is acceptable under the rubric because the schema carries the burden here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Return a validated DMARC enforcement-upgrade record for a domain.' It then clearly separates this from scanning ('A scan can justify p=quarantine at MOST') and from monitoring ('p=reject is unlocked only by aggregate-report evidence over a full reporting window (monitoring)'), which distinguishes it from siblings like scan_domain and start_monitoring_signup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-not guidance: a caller cannot assert alignment, p=reject cannot come from a scan, and a null record must not be filled. It also tells the caller exactly what to do ('relay rationale', 'Present a returned record verbatim', 'a human must approve before publishing'). This is strong usage routing relative to alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
build_parked_domain_recordsARead-onlyIdempotentInspect
Build the three-record hardening pack that makes a NON-SENDING domain unusable for spoofing: a Null MX, a hard-fail SPF record, and a p=reject; np=reject DMARC record. For parked, redirect and brand-defensive domains only — NEVER for a domain that sends any mail, including transactional or one legacy system. Do NOT set confirm_no_mail on your own judgment or because a scan looked quiet: only the human who owns the domain can confirm it sends nothing, so ask them first. That flag unlocks the question, not the answer — the server re-checks DNS itself (existence, MX, SPF, DKIM selectors) and returns records: null with a rationale when it finds evidence of mail; relay that rationale rather than retrying. A lookup failure is reported as a failure, never as a pack. Publishing is the human's decision: present the records verbatim, in the order given, and let them approve each one.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | 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. | |
| rua_email | No | Mailbox to receive DMARC aggregate (RUA) reports, as a plain address like dmarc@example.com. Strongly recommended: without it nobody can see who sends as the domain. | |
| confirm_no_mail | Yes | Must be true, and only the HUMAN who owns the domain may decide it: it records their confirmation that this domain sends no email at all. Never set it on your own judgment or because a scan looked quiet — ask them. It unlocks the question only; the server independently re-checks DNS for evidence of mail and refuses when it finds any. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint false. The description adds essential behavioral details beyond these: the server independently re-checks DNS, returns records:null with rationale when mail evidence is found, reports lookup failures as failures, and requires human approval. This significantly enriches the annotation context without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Although longer than typical, every sentence contributes critical information: the pack contents, domain eligibility, human confirmation requirement, server re-check behavior, failure handling, and publishing workflow. It is front-loaded with the core purpose and well-structured for an agent to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose, scope, human-in-the-loop safety, server-side verification, failure semantics, and output handling (records verbatim, order, approval). Given the complexity and the presence of an output schema and annotations, the description is fully complete for agent selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds extra meaning for confirm_no_mail ('that flag unlocks the question, not the answer') and domain (scope restrictions), and it reinforces the human-decision aspect. It doesn't fully detail rua_email behavior, but that's already well-described in the schema; the additional context justifies a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly specifies the tool's function: building a three-record hardening pack (Null MX, hard-fail SPF, DMARC p=reject) for non-sending domains. It distinguishes from siblings like build_dmarc_upgrade by explicitly scoping to parked/redirect/brand-defensive domains and excluding sending domains.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use guidance: 'For parked, redirect and brand-defensive domains only — NEVER for a domain that sends any mail'. It also clarifies the confirm_no_mail flag requires human confirmation and that the server re-checks DNS, with instructions to relay rationale rather than retry on null result.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_dkim_selectorARead-onlyIdempotentInspect
Check ONE specific DKIM selector on a domain — the exact selector the sending platform uses (e.g. google, s1), which a full scan's common-selector sweep may miss. Returns the verdict, its explanation, and the published key record when one resolves. No fix record is returned: a DKIM key is generated by the sending platform, so the fix is always to publish what that platform gives the owner.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | 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. | |
| selector | Yes | The DKIM selector to probe — the name before ._domainkey, e.g. 'google', 'selector1', or a dotted form like 's1.prod'. The sending platform's settings page names it; it is not guessable from the domain. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses key behavioral traits: it 'Returns the verdict, its explanation, and the published key record when one resolves' and explicitly states 'No fix record is returned' with a rationale about DKIM key generation. This adds substantial context beyond the readOnly/openWorld/idempotent annotations, making the tool's output and limitations transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core action, and every clause earns its place. It efficiently conveys purpose, distinguishes from alternatives, describes outputs, and explains the absence of a fix record without wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has only two parameters, a rich input schema, an output schema, and comprehensive annotations, the description fully covers the necessary context: what it checks, when to use it, what it returns, and why no fix record is provided. There are no significant gaps in the guidance an agent would need.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides 100% coverage with detailed descriptions for both parameters (domain and selector), including the nuance that the selector is 'not guessable from the domain.' The description adds little beyond reinforcing that the selector is the exact one used by the sending platform, so the schema does the heavy lifting; the description only marginally extends the parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with 'Check ONE specific DKIM selector on a domain', a specific verb+resource+scope, and explicitly contrasts with 'a full scan's common-selector sweep may miss', clearly distinguishing it from sibling scan tools. It also clarifies what is returned (verdict, explanation, key record), leaving no ambiguity about the tool's function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool by stating it targets 'the exact selector the sending platform uses' that a full scan might miss. This provides clear context for choosing this tool over a broader scan, though it does not explicitly name an alternative or spell out 'when not to use' scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_propagationARead-onlyIdempotentInspect
Check whether a DNS change has propagated GLOBALLY: six vantage points (five owner-run probes across four continents plus this server's own resolver) each read the same name through several resolvers, and the grid plus a deterministic verdict comes back. Call it after the human publishes a record — you have ONE network vantage point, and a record that resolves for you can still be missing elsewhere. name is the exact name (www. is not stripped, _dmarc.example.com works), record_type is A|AAAA|CNAME|MX|TXT|NS, and the optional expected_value turns each cell into match or mismatch instead of agreement-only. Observation only: no record is ever composed here. A cell that did not answer is unavailable, which is NOT a negative result, and when fewer than three vantage points were reached the verdict downgrades to unknown — report vantage_reached of vantage_total rather than calling a name converged on partial coverage.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The exact DNS name to look up, e.g. example.com, www.example.com or _dmarc.example.com. It is used as given — a leading www. is NOT stripped and underscore labels are kept — so pass the name the record is actually published at, not the registrable domain. | |
| record_type | No | The record type to read at that exact name (default A). SPF and DMARC records are TXT — pass TXT with the right name rather than expecting a derived query name. | A |
| expected_value | No | Optional value the record should now hold, e.g. '1.2.3.4' or the new DMARC record text. Supply it and each cell is reported as match or mismatch against it; omit it and the check only reports whether the vantage points agree with each other. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry readOnlyHint=true, idempotentHint=true, and destructiveHint=false, and the description reinforces this with 'Observation only: no record is ever composed here.' It goes well beyond annotations by specifying the tricky interpretation semantics: an `unavailable` cell is NOT a negative result, the verdict downgrades to `unknown` when fewer than three vantage points are reached, and the agent must report vantage_reached of vantage_total rather than declaring convergence on partial coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the global scope and six-vantage-point mechanism before anything else, and every sentence carries operational or interpretive content with no filler. The final sentence is dense — four distinct warnings packed into one long clause — but each warning is necessary, so it earns a 4 rather than a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with this complexity — multi-vantage-point reads, partial coverage, and a verdict that can degrade — the description covers the behavioral pitfalls that would cause an agent to misreport results or misinterpret absence as failure. The output schema exists and can carry the grid/verdict return shape, and the description covers what the schema cannot: when to invoke it and how to interpret non-answers.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already documents name exactness (www. NOT stripped, underscore labels kept), the record_type enum values, and expected_value's match/mismatch effect. The description restates these rather than adding new parameter semantics, so it stays at the baseline 3 for fully-schema-covered parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Check whether a DNS change has propagated GLOBALLY' — and defines the mechanism: six vantage points (five owner-run probes across four continents plus this server's own resolver). This clearly distinguishes it from sibling tools like check_record, check_dkim_selector, and check_reverse_dns, which are single-point checks; the description even contrasts the agent's single network vantage point.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent when to call this tool: 'Call it after the human publishes a record', with the rationale that a record resolving from the agent's single vantage point can still be missing elsewhere. This is clear contextual guidance, but it stops short of naming alternative tools or stating explicit when-not-to-use conditions, so it earns 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_recordARead-onlyIdempotentInspect
Check whether a DNS change has landed: reads the record from the domain's OWN nameservers (cache-free) and from two public caching resolvers, and reports whether they agree. kind is one of spf|dmarc|txt|mx|cname|a|aaaa — pass the kind, not a query name: dmarc reads TXT at _dmarc. and spf reads apex TXT, each filtered to the matching record. host prepends a label (txt, cname, a and aaaa only). Empty values mean the record is genuinely absent. When in_sync is false, max_wait_seconds is the largest remaining cached TTL — the wait before those resolvers refresh. This samples two resolvers, so never describe it as worldwide or as propagation coverage.
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | Optional label to prepend to the domain (e.g. 'mail' to check mail.<domain>) — honored for txt, cname, a and aaaa only; spf, dmarc and mx derive their own query name. | |
| kind | Yes | Which record to read; the right query is derived from it — 'dmarc' reads TXT at _dmarc.<domain> filtered to v=DMARC1, 'spf' reads the apex TXT filtered to v=spf1, so don't prefix the domain yourself. | |
| domain | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond the readOnlyHint and idempotentHint annotations. It details the exact query logic for each kind (e.g., dmarc reads TXT at _dmarc.<domain>), explains that empty values mean genuinely absent, and clarifies the meaning of in_sync false and max_wait_seconds. The caveat about sampling only two resolvers is critical behavior context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately sized and front-loaded with the main purpose, then systematically covers kind semantics, host restrictions, output interpretation, and limitations. Every sentence earns its place, with no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (multiple record kinds, derived queries, cache-free vs caching resolvers), the description covers all essential aspects. The output schema exists, and the description still explains key output semantics like empty values and max_wait_seconds, making it thoroughly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides comprehensive descriptions for all three parameters (100% coverage), including kind's derived query logic and host's allowed types. The tool description largely restates this information, adding no significant new parameter semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Check' and states the exact resource: 'whether a DNS change has landed' by reading from the domain's own nameservers and two public resolvers. This clearly distinguishes it from sibling tools like check_dkim_selector or check_reverse_dns, which target specific record types.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use: 'Check whether a DNS change has landed' and provides an exclusion: 'never describe it as worldwide or as propagation coverage' because it samples only two resolvers. However, it does not name alternative sibling tools for specific DNS checks, so it lacks explicit alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_reverse_dnsARead-onlyIdempotentInspect
Check one sending IP's forward-confirmed reverse DNS (FCrDNS): reads the IP's PTR record, then resolves that hostname back and reports whether it returns to the same IP. verdict is confirmed (the pair agrees — what receivers want to see), ptr_missing (the IP publishes no reverse record), or mismatch (a PTR that does not resolve back). A PTR on its own proves nothing, because the IP's operator writes its own reverse zone — only the forward confirmation is evidence, so never report a bare PTR as verified. The fix is always made by whoever controls the IP (the hosting or mail provider), never in the sending domain's own DNS. Pass a public IPv4 or IPv6 address.
| Name | Required | Description | Default |
|---|---|---|---|
| ip | Yes | The sending IP to check, IPv4 or IPv6. Must be a public address — private, loopback and CGNAT ranges have no meaningful reverse DNS and are refused. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly, idempotent, non-destructive), the description explains the internal two-step resolution process, defines each verdict, and warns about the misleading nature of bare PTR records. This provides rich behavioral context that annotations alone do not capture.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence in the description adds value: purpose, verdict definitions, critical warning about PTR interpretation, fix responsibility, and input requirement. It is front-loaded with the core purpose and remains compact without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple one-parameter schema, rich annotations, and existing output schema, the description fully covers what the tool does, how to interpret its output, and the operational context (who can fix issues). No significant gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers the single 'ip' parameter with full description including the public address requirement. The description repeats the constraint ('Pass a public IPv4 or IPv6 address') but adds no additional semantic meaning beyond what the schema already provides. Baseline 3 applies due to 100% schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Check') and resource ('forward-confirmed reverse DNS'), explaining the exact mechanism (PTR lookup then forward resolution) and the three possible verdicts. This clearly distinguishes it from sibling tools like check_record or check_dkim_selector.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool (checking a sending IP's FCrDNS) and crucial guidance on interpreting results ('never report a bare PTR as verified'), plus where fixes belong. It does not explicitly name alternative tools for comparison, but the usage context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
count_spf_lookupsARead-onlyIdempotentInspect
Validate an SPF record and count what it costs. Returns record_valid (the record parses as RFC 7208 SPF), findings (per-term diagnostics), has_pass_all (a +all that authorizes the whole internet to send as this domain), multiple_all (more than one all, which makes everything after the first unreachable), the parsed terms, and the lookup count against the limit of 10 with over_limit/near_limit and the offending_mechanisms that push it over. Pass EXACTLY ONE of domain (resolves the published record and counts recursively through nested includes) or record (parses a pasted record, its own terms only). This is the SPF validator — there is no separate one. Diagnose-only: no SPF fix record is ever returned, because removing a mechanism can silently de-authorize a real sender — relay the findings and let the domain's owner decide what to drop.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | No | Domain whose PUBLISHED SPF record should be resolved and counted recursively (nested includes cost lookups too). Pass exactly one of domain or record, never both. | |
| record | No | A pasted SPF record to parse instead of resolving one, e.g. 'v=spf1 include:_spf.google.com ~all'. Counts this record's own terms only. Pass exactly one of domain or record, never both. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description discloses critical behavioral traits: the diagnose-only nature with the explicit promise 'no SPF fix record is ever returned,' the rationale about silently de-authorizing senders, and the nested include recursion behavior. This adds significant context the annotations alone don't provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-structured, front-loading the main purpose and then flowing through return values, parameter usage, and an important caveat. Every sentence adds functional value, with no fluff or repetition. The length is justified by the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a rich description, full schema parameter descriptions, and an output schema present, the tool is fully specified. The description covers the 10-lookup limit, over_limit/near_limit indicators, offending_mechanisms, and the reason for not fixing records — leaving no practical questions about what the tool does and how to invoke it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Even though schema coverage is 100%, the description enriches both parameters by clarifying the exact-one constraint and behavioral difference: 'domain resolves the published record and counts recursively through nested includes' vs. 'record parses a pasted record, its own terms only.' This goes well beyond the schema's field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Validate an SPF record and count what it costs.' It clearly distinguishes this tool from siblings by stating 'This is the SPF validator — there is no separate one.' It also enumerates key outputs (record_valid, findings, has_pass_all, etc.), making the purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance including the two mutually exclusive modes: 'Pass EXACTLY ONE of domain or record' with detailed explanations of each. It also states when NOT to use it for fixes: 'Diagnose-only: no SPF fix record is ever returned' and explains why, positioning it against potential alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_dmarc_recordARead-onlyIdempotentInspect
Build a DMARC record from scratch for a domain that has none, using a validating engine — never compose one yourself. policy is none|quarantine|reject; optional rua_email (aggregate-report destination), subdomain_policy, and strict_alignment. Every generated record carries np=reject — the DMARCbis tag for non-existent subdomains, which can have no legitimate aligned mail — independently of the p= you choose. The generated record is re-validated before it is returned. Present it verbatim; a human must approve before publishing.
| Name | Required | Description | Default |
|---|---|---|---|
| policy | Yes | The requested p= policy: 'none' monitors only, 'quarantine' sends failing mail to spam, 'reject' refuses it outright. Start at 'none' unless the domain's aggregate reports already justify enforcement. | |
| rua_email | No | Mailbox to receive DMARC aggregate (RUA) reports, as a plain address like dmarc@example.com. Strongly recommended: without it nobody can see who sends as the domain. | |
| strict_alignment | No | Set true to emit strict alignment (aspf=s adkim=s), requiring an exact domain match instead of the organizational-domain match. Leave false unless you know every sender aligns strictly. | |
| subdomain_policy | No | Optional sp= policy for subdomains when it should differ from the main p= policy. Omit to let subdomains inherit p=. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral context beyond the annotations: every generated record includes 'np=reject' regardless of p=, the record is 're-validated before it is returned,' and it must be 'present[ed] verbatim' with human approval. These details are not visible in the readOnlyHint, idempotentHint, or destructiveHint annotations, and they inform the agent's action and output handling. No contradiction with annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, each earning its place: the first states the core function, the second summarizes parameters and the critical np=reject behavior, the third explains re-validation and the human-approval requirement. It is front-loaded and free of redundant or vague phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description does not need to detail return values. It covers the essential context: when to use (domain without a record), key behavioral traits (np=reject, re-validation), and process requirements (verbatim presentation, human approval). This is complete for a 4-parameter, 1-required tool and complements the rich schema and annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides 100% parameter descriptions, covering policy, rua_email, subdomain_policy, and strict_alignment. The description merely summarizes these parameters (e.g., 'policy is none|quarantine|reject') without adding semantic depth beyond the schema. The np=reject mention is about output behavior, not parameter meaning, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Build a DMARC record from scratch for a domain that has none.' This clearly distinguishes the tool from siblings like build_dmarc_upgrade (which implies working with an existing record) and validate_dmarc_record (which checks rather than builds). The phrase 'never compose one yourself' reinforces the tool's specific role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear usage condition: 'for a domain that has none,' implying this tool is for domains lacking DMARC records. It does not explicitly name alternatives or enumerate when-not-to-use scenarios, but the context is sufficiently clear. The guidance that a human must approve before publishing adds an important usage boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_alertsARead-onlyIdempotentInspect
Read the monitoring alert log for the domains the caller's account monitors, newest first. Requires an API token. Each row carries id, domain, type, check, summary, a deterministic detail map, created_at, email_sent_at, acknowledged_at and delivery_class — a 'dashboard_only' row was deliberately kept out of the digest mail, so an agent watching only the inbox would never see it; this log is the complete picture. PAGE DOWN BEFORE ADVANCING since: next_before is non-null exactly when older rows remain, and a caller that ignores it, takes a full page and moves its watermark to the newest row it saw drops every row it did not receive. since is an INCLUSIVE floor, so rows repeat rather than go missing — de-duplicate on id. READ-ONLY by decision: there is no ack and no delete here, because acknowledging an alert is the human's own triage on their dashboard and an agent that acks on their behalf silences a row they have never seen. Report what the log says and let them clear it.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Optional alert-type filter, e.g. 'record_changed'. An unknown value is rejected rather than silently returning an empty page — omit it unless you know the exact type. | |
| limit | No | Page size, 1..100 (default 50). Page down with `before` before you advance `since`, or you will skip every row you did not receive. | |
| since | No | Optional ISO-8601 timestamp: return alerts created at or after it (INCLUSIVE). Poll by storing the newest created_at you have seen and passing it back — rows repeat rather than go missing, so de-duplicate on id. | |
| before | No | The opaque cursor from a previous page's next_before, relayed verbatim to fetch the next older page. Never construct or edit one. | |
| domain | No | Optional filter to ONE of the account's verified monitored domains. Omit it for every domain the account monitors; an unowned or unknown name is refused as not found. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint, idempotentHint, destructiveHint), the description adds rich behavioral context: it requires an API token, explains why the tool is read-only (to avoid silencing unread alerts), details the `dashboard_only` delivery_class nuance, and exposes pagination edge-case behavior (dropping rows when ignoring `next_before`). No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average but every sentence carries operational weight. It is front-loaded with the core purpose and scope, followed by field highlights, then high-stakes pagination warnings in caps, and finally the read-only rationale. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given this is a data retrieval tool with a generic output schema (indicated by 'Has output schema: true'), the description covers all necessary contextual aspects: authentication, scope, field list, pagination behavior, exclusion semantics, and usage guardrails. It is complete for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds significant semantic value: it explains the inclusive `since` floor and de-duplication need, warns that `before` is an opaque cursor never to be constructed/edited, and notes that unknown `type` or `domain` values are rejected, not silently ignored. This goes well beyond the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb-resource-scope statement: "Read the monitoring alert log for the domains the caller's account monitors, newest first." This distinguishes it clearly from all sibling tools, which are about DNS/SPF/DMARC checks or report generation, not alert logs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly frames when this tool is appropriate ("agent watching only the inbox would never see it; this log is the complete picture") and when not to use it for actions ("there is no ack and no delete here"). It also gives crucial operational guidance on pagination ('PAGE DOWN BEFORE ADVANCING `since`') and the inclusive `since` semantics with de-duplication advice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_readinessARead-onlyIdempotentInspect
Read the DMARC enforcement-readiness verdict for ONE domain the caller's account monitors, computed from its aggregate (RUA) report window. Requires an API token. Returns whether the domain is ready to step its policy up, the blockers that say why it is not, the window the verdict rests on, and next_record — the validated record for the next step, generated by the engine and null while blocked. THAT NULL IS AN ANSWER: relay the blockers and never compose a stronger record to fill the gap. Present a returned record verbatim; a human must approve it before it is published. Use this before proposing enforcement — a scan can show a domain's current policy, but only this evidence window can say whether tightening it would start rejecting real mail.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | One of the token account's VERIFIED monitored domains, e.g. example.com. Any other name — another account's, or one nobody monitors — is refused as not found; ownership is never disclosed. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
While annotations declare readOnlyHint=true, the description adds critical behavioral nuance: it explains that next_record is null when blocked, and that 'THAT NULL IS AN ANSWER: relay the blockers and never compose a stronger record to fill the gap.' It also mandates presenting the record verbatim and requiring human approval, plus notes 'Requires an API token.' These details go well beyond the annotation safety profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place. It front-loads the core purpose, then explains return fields, null semantics, usage caveats, and approval requirements without repetition or filler. The structural flow is logical and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is conceptually complex (readiness verdict, blockers, null handling, human approval), yet the description covers the full context: what it returns, what null means, how to handle the record, when to use it, and the required authentication. With an output schema also present, this description is complete for correct invocation and handling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%: the domain parameter description already explains it must be a 'VERIFIED monitored domain' and that ownership is not disclosed. The tool description reinforces 'ONE domain' and 'caller's account monitors' but adds no new semantic meaning beyond the schema. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Read the DMARC enforcement-readiness verdict for ONE domain the caller's account monitors.' It clearly distinguishes this from sibling tools like scan_domain by emphasizing the evidence window and the readiness verdict, noting that 'only this evidence window can say whether tightening it would start rejecting real mail.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit guidance is provided: 'Use this before proposing enforcement' and contrasts with scan_domain ('a scan can show a domain's current policy, but only this evidence window can say whether tightening it would start rejecting real mail'). It also gives strong when-not-to instructions: 'never compose a stronger record to fill the gap' and 'a human must approve it before it is published.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_reportAIdempotentInspect
Return the stored report for a domain, scanning once only if none exists yet — the cheap read, and the right default for a first look. Returns the same seven-check report as scan_domain (SPF, DKIM, DMARC, MX, DNS hardening, domain/TLS expiry, blacklist; each with a status, the observed record and any fixengine fix_record), including scanned_at so you can judge staleness yourself. Prefer scan_domain when you specifically need state re-read right now — for example after a DNS change.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses a key behavioral trait beyond annotations: it may 'scan once only if none exists yet,' explaining why readOnlyHint is false. It also adds the `scanned_at` field so the agent can judge staleness, providing context that annotations alone do not convey. It doesn't go into error cases or rate limits, but for this tool the disclosed behavior is sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is tightly packed: two sentences deliver purpose, behavior, return contents, staleness cue, and explicit alternative. Every clause earns its place, and the most important 'cheap read' framing is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has one parameter, a rich schema, and an output schema (though not shown). The description explains the full return face (the same seven-check report as scan_domain, including statuses and observed records) and provides the alternative guidance. There are no significant gaps for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides 100% parameter coverage with a detailed description of the domain parameter including format rules and punycode normalization. The tool description does not add further parameter semantics, but it doesn't need to given the schema's richness. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's verb and resource: 'Return the stored report for a domain.' It also distinguishes itself from the sibling 'scan_domain' by framing get_report as the 'cheap read' and 'right default for a first look,' while scan_domain is for forcing a fresh scan.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit usage guidance is provided: get_report is recommended as the default first look, while 'Prefer scan_domain when you specifically need state re-read right now — for example after a DNS change.' This directly tells the agent when to choose this tool over its alternate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
parse_dmarc_reportARead-onlyIdempotentInspect
Parse ONE DMARC aggregate (RUA) report into readable per-source aggregates: who sent mail as the domain, how much, and what share was SPF/DKIM aligned. Pass the file's bytes base64-encoded in content_base64 (XML, .gz or .zip; up to 2 MiB decoded) with an optional filename. Nothing is stored — the report is parsed and discarded.
| Name | Required | Description | Default |
|---|---|---|---|
| filename | No | Optional original attachment filename, recorded in logs only — format detection is content-based, so this changes nothing about parsing. | |
| content_base64 | Yes | One DMARC aggregate (RUA) report file, base64-encoded: the .xml, .xml.gz or .zip attachment exactly as received, up to 2 MiB decoded. Encode the file bytes — do not paste raw XML here. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=true, destructiveHint=false), the description adds valuable behavioral context: 'Nothing is stored — the report is parsed and discarded' and the 2 MiB decoded size limit. This clarifies side effects and constraints, complementing the annotation-provided safety profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences: the first states purpose and output, the second provides input instructions and a key behavioral note. Every sentence earns its place, with no冗余. It is front-loaded and easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity, the description covers input format, size constraints, output summary, and side effects. An output schema exists, so return values are already structured; the description's output summary is sufficient context. No significant gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptive parameter comments. The description adds further meaning by specifying that content_base64 expects encoded file bytes (not raw XML), the decoded size limit, and that filename only affects logs, not parsing. This enriches the schema with practical usage details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Parse' with a specific resource 'DMARC aggregate (RUA) report' and defines the output as readable per-source aggregates (who sent mail, how much, alignment share). This distinguishes it from sibling tools like get_report, which likely fetches reports rather than parsing provided content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear invocation context: pass file bytes base64-encoded in content_base64, with optional filename. It also specifies supported formats and size limit. However, it does not explicitly name alternatives or when-not-to-use, though the instruction is sufficiently clear for the intended use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scan_domainAInspect
Force a fresh scan of a domain and return its full report: seven deterministic checks — SPF, DKIM, DMARC, MX, DNS hardening, domain/TLS expiry and blacklist listing — each with a status (pass/warn/fail/info/temperror), the observed record, and a fixengine-generated fix_record where one exists. Explanations are cache-first. A repeat scan of the same domain within the dedup window (about a minute) reuses the stored report rather than re-reading DNS, so scanned_at may predate a DNS change you just made — when you are verifying an edit, check scanned_at and call again after the window rather than treating an unchanged report as the new state. Use this when you need current state; use get_report when a recent cached answer will do.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses the cache-first and dedup behavior, warns that scanned_at may predate a DNS change, and clarifies that a repeat scan can reuse a stored report. This adds significant behavioral context that would otherwise be hidden. It is consistent with idempotentHint=false and openWorldHint=true, so there is no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but each sentence earns its place: the core action and return shape come first, followed by the critical dedup caveat, then the routing rule. No filler or repetition is present. The length is justified by the behavioral quirks an agent must know.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists and the description already summarizes return fields, the description covers the important operational context: what gets scanned, result statuses, cache behavior, timing gotchas, and when to prefer get_report. An agent has what it needs to call and interpret this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool description itself does not add parameter-level detail beyond saying it scans 'a domain.' However, the input schema's property description already fully documents acceptable formats, exclusions, and punycode normalization, giving 100% schema coverage. Per the baseline for high schema coverage, this is adequate even though the description adds no extra parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Force a fresh scan of a domain and return its full report.' It enumerates the seven checks and each check's result shape, and it distinguishes itself from the sibling get_report by contrasting fresh scans with cached answers. An agent can clearly tell what this tool does and how it differs from nearby alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit decision rule: 'Use this when you need current state; use get_report when a recent cached answer will do.' It also explains the dedup window and advises checking scanned_at when verifying an edit, which tells the agent not just when to call but how to interpret results. This is strong, actionable usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_monitoring_signupARead-onlyIdempotentInspect
Return a sign-up link to give to the HUMAN who owns a domain, so they can start monitoring it themselves. Nothing is created and no email is sent by this call: the returned signup_url opens a page that explains monitoring and asks them to sign in there themselves; the domain is carried over to their dashboard, already filled in, only after that, and monitoring itself starts once they prove ownership with a TXT record. Print the returned signup_url verbatim as a clickable markdown link on its own line — never paraphrase, shorten, or describe it without printing it — and relay message; never sign in on their behalf.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by explaining the deferred flow: nothing is created, no email is sent, the domain is only carried over after the human signs in, and monitoring starts only after TXT ownership verification. It also specifies exact output behavior for signup_url and message. This adds meaningful behavioral context that annotations alone do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence is an excellent front-loaded purpose statement, and the subsequent details about the signup flow and output formatting are necessary for correct agent behavior. The second sentence is long and contains many clauses, but every clause contributes operational information. It is dense rather than bloated, though not maximally concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one well-documented parameter, an output schema, and annotations covering read-only and idempotent behavior, the description supplies the missing interaction context: who receives the link, how the follow-up flow works, and how the agent must present the output. The explicit instruction to print signup_url verbatim and never sign in on the user's behalf closes the main operational gaps. Nothing essential is left ambiguous.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents the single parameter 'domain' thoroughly, including accepted formats, punycode normalization, and exclusions. The description adds no additional parameter-level semantics beyond referencing signup_url. With 100% schema description coverage, this meets the baseline but does not exceed it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence uses a specific verb and object: 'Return a sign-up link to give to the HUMAN who owns a domain, so they can start monitoring it themselves.' This clearly states what the tool does and differentiates it from the sibling checking, generation, and validation tools by emphasizing a self-service handoff. It also explicitly states what the call does not do, which removes ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear situational guidance: use this tool to hand monitoring start-up to the human domain owner, and never sign in on their behalf. It provides a strong boundary for when this tool is appropriate. However, it does not name sibling alternatives or explicitly state when another tool should be used instead, so it stops short of full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_dmarc_recordARead-onlyIdempotentInspect
Validate a pasted DMARC record: parsed tags, level'd findings, and whether it is valid. No DNS lookup — pass the record string itself. upgrade_record previews a stronger policy and is capped at p=quarantine: a pasted record carries no alignment evidence, and p=reject is unlocked only by aggregate-report evidence over a full reporting window (monitoring), never by a scan. Present any returned record verbatim.
| Name | Required | Description | Default |
|---|---|---|---|
| record | Yes | The DMARC record text to validate, e.g. 'v=DMARC1; p=none; rua=mailto:reports@example.com'. The record value only — not the _dmarc hostname it is published at. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly and idempotent, but the description adds significant behavioral specifics: no DNS lookup, the policy unlock logic, and the instruction to present returned records verbatim. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is moderately sized, with focused sentences that convey purpose, constraints, and alternatives without unnecessary filler. Slightly dense but efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists, the description covers all essential aspects: what it validates, how to pass the input, policy limitations, and references to related tools. An agent would have enough context to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides 100% coverage of the 'record' parameter with a clear example and clarification about the hostname. The description reinforces these points but adds no new parameter-level semantics beyond what the schema already offers.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb ('validate') and resource ('DMARC record') with explicit outputs (parsed tags, level'd findings, validity). Distinguishes from siblings by specifying it handles a pasted record string, not a DNS lookup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states 'No DNS lookup — pass the record string itself' and clarifies when p=reject is unlocked, referencing upgrade_record as an alternative. This provides clear context on when to use this tool versus others.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
1 tool update
- Added
check_propagation
2 tool updates
- Added
get_alerts - Added
get_readiness
2 tool updates
- Added
audit_spf_includes - Added
build_parked_domain_records
2 tool updates
- Changed
check_dkim_selector1 field changed- changed
Input schema / properties / selector / descriptionPrevious value: -"The DKIM selector to probe — the single DNS label before ._domainkey, e.g. 'google' or 'selector1'. The sending platform's settings page names it; this is not guessable from the domain."New value: +"The DKIM selector to probe — the name before ._domainkey, e.g. 'google', 'selector1', or a dotted form like 's1.prod'. The sending platform's settings page names it; it is not guessable from the domain."
- Changed
parse_dmarc_report1 field changed- changed
Input schema / properties / filename / descriptionPrevious value: -"Optional original attachment filename (e.g. 'google.com!example.com!....xml.gz') — improves format detection and error messages, changes nothing else."New value: +"Optional original attachment filename, recorded in logs only — format detection is content-based, so this changes nothing about parsing."
11 tool updates
- Changed
build_dmarc_upgrade1 field changed- added
Input schema / properties / domain / descriptionAdded 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."
- Changed
check_dkim_selector2 fields changed- added
Input schema / properties / domain / descriptionAdded 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." - added
Input schema / properties / selector / descriptionAdded value: +"The DKIM selector to probe — the single DNS label before ._domainkey, e.g. 'google' or 'selector1'. The sending platform's settings page names it; this is not guessable from the domain."
- Changed
check_record3 fields changed- added
Input schema / properties / domain / descriptionAdded 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." - added
Input schema / properties / host / descriptionAdded value: +"Optional label to prepend to the domain (e.g. 'mail' to check mail.<domain>) — honored for txt, cname, a and aaaa only; spf, dmarc and mx derive their own query name." - added
Input schema / properties / kind / descriptionAdded value: +"Which record to read; the right query is derived from it — 'dmarc' reads TXT at _dmarc.<domain> filtered to v=DMARC1, 'spf' reads the apex TXT filtered to v=spf1, so don't prefix the domain yourself."
- Changed
check_reverse_dns1 field changed- added
Input schema / properties / ip / descriptionAdded value: +"The sending IP to check, IPv4 or IPv6. Must be a public address — private, loopback and CGNAT ranges have no meaningful reverse DNS and are refused."
- Changed
count_spf_lookups2 fields changed- added
Input schema / properties / domain / descriptionAdded value: +"Domain whose PUBLISHED SPF record should be resolved and counted recursively (nested includes cost lookups too). Pass exactly one of domain or record, never both." - added
Input schema / properties / record / descriptionAdded value: +"A pasted SPF record to parse instead of resolving one, e.g. 'v=spf1 include:_spf.google.com ~all'. Counts this record's own terms only. Pass exactly one of domain or record, never both."
- Changed
generate_dmarc_record4 fields changed- added
Input schema / properties / policy / descriptionAdded value: +"The requested p= policy: 'none' monitors only, 'quarantine' sends failing mail to spam, 'reject' refuses it outright. Start at 'none' unless the domain's aggregate reports already justify enforcement." - added
Input schema / properties / rua_email / descriptionAdded value: +"Mailbox to receive DMARC aggregate (RUA) reports, as a plain address like dmarc@example.com. Strongly recommended: without it nobody can see who sends as the domain." - added
Input schema / properties / strict_alignment / descriptionAdded value: +"Set true to emit strict alignment (aspf=s adkim=s), requiring an exact domain match instead of the organizational-domain match. Leave false unless you know every sender aligns strictly." - added
Input schema / properties / subdomain_policy / descriptionAdded value: +"Optional sp= policy for subdomains when it should differ from the main p= policy. Omit to let subdomains inherit p=."
- Changed
get_report1 field changed- added
Input schema / properties / domain / descriptionAdded 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."
- Changed
parse_dmarc_report2 fields changed- added
Input schema / properties / content_base64 / descriptionAdded value: +"One DMARC aggregate (RUA) report file, base64-encoded: the .xml, .xml.gz or .zip attachment exactly as received, up to 2 MiB decoded. Encode the file bytes — do not paste raw XML here." - added
Input schema / properties / filename / descriptionAdded value: +"Optional original attachment filename (e.g. 'google.com!example.com!....xml.gz') — improves format detection and error messages, changes nothing else."
- Changed
scan_domain1 field changed- added
Input schema / properties / domain / descriptionAdded 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."
- Changed
start_monitoring_signup1 field changed- added
Input schema / properties / domain / descriptionAdded 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."
- Changed
validate_dmarc_record1 field changed- added
Input schema / properties / record / descriptionAdded value: +"The DMARC record text to validate, e.g. 'v=DMARC1; p=none; rua=mailto:reports@example.com'. The record value only — not the _dmarc hostname it is published at."
2 tool updates
- Changed
check_record1 field changed- added
Input schema / properties / kind / enumAdded value: +[ + "spf", + "dmarc", + "txt", + "mx", + "cname", + "a", + "aaaa" +]
- Changed
generate_dmarc_record2 fields changed- added
Input schema / properties / policy / enumAdded value: +[ + "none", + "quarantine", + "reject" +] - changed
Input schema / properties / subdomain_policy / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "enum": [ + "none", + "quarantine", + "reject" + ], + "type": "string" + }, + { + "type": "null" + } +]
7 tool updates
- Added
check_dkim_selector - Added
check_record - Added
check_reverse_dns - Added
count_spf_lookups - Added
generate_dmarc_record - Added
parse_dmarc_report - Added
validate_dmarc_record
2 tool updates
- Removed
enroll_monitoring_trial - Added
start_monitoring_signup
4 tool updates
- First observed
build_dmarc_upgrade - First observed
enroll_monitoring_trial - First observed
get_report - First observed
scan_domain
Frequently Asked Questions
Claiming proves that you control a remote MCP connector. It does not move, proxy, or interrupt the server.
Open the connector listing, choose Claim ownership, and sign in to Glama.
Complete one verification method:
GitHub identity — fastest for official registry listings. For a namespace such as
io.github.alice/server, link the matching GitHub user, then choose Claim with GitHub. An organization namespace such asio.github.acme/serveralso needs that organization to have installed the Glama AI GitHub App and approved its permissions, because GitHub discloses organization membership only to apps it has installed. Use HTTP or DNS when it has not.HTTP challenge — works when you can deploy a public file. Generate a token, publish the exact JSON Glama shows at
/.well-known/glama.jsonon the same origin as the connector, then choose Check HTTP challenge.DNS challenge — works when you control DNS but cannot change the server. Generate a token, create the exact TXT record Glama shows, wait for it to propagate, then choose Check DNS challenge.
After verification, Glama sends a confirmation email and gives you access to listing details, thumbnails, health checks, and analytics. Keep the HTTP file or DNS record in place: Glama periodically checks it and ownership remains verified while the token is discoverable.
The HTTP ownership file has this structure:
{
"$schema": "https://glama.ai/mcp/schemas/connector.json",
"claim": "glama_claim_..."
}Claim tokens are opaque, stable, and bound to the signed-in Glama account. They contain no email address or other personal information. If Glama can no longer discover a verified HTTP or DNS token, it starts a seven-day grace period before removing claim-based access. Restore the same token during that period to keep ownership verified. Never publish an email address, Glama session token, GitHub token, or connector credential as ownership proof.
If verification fails, confirm that you copied the current token exactly. The HTTP file must be public, return valid JSON with a successful HTTP response, and stay on the connector's origin. DNS changes may need more time to propagate. A claim cannot transfer to a different origin or hostname: if the connector target changes, Glama starts the grace period and the new target must be claimed separately after the previous claim is released.
For a connector linked to the official MCP Registry, registry updates continue to replace its name, description, and URL by default. After claiming, open Manage connector and enable Use Glama listing details as the source of truth if edits made on Glama should be preserved. Categories and thumbnails are always managed on Glama; registry linkage and technical connection settings continue to sync.
Control your server's listing on Glama, including description and metadata
Access analytics and receive server usage reports
Get monitoring and health status updates for your server
Feature your server to boost visibility and reach more users
To improve your MCP server's ranking:
Claim ownership of the server listing
Complete the server profile with an accurate description and thumbnail
Provide a test profile so Glama can connect to and evaluate the server
Keep tool definitions clear and complete to earn a high Tool Definition Quality Score (TDQS)
Route real usage through the Glama Gateway; more recorded successful server uses also improve the ranking
For users:
Full audit trail – every tool call is logged with inputs and outputs for compliance and debugging
Granular tool control – enable or disable individual tools per connector to limit what your AI agents can do
Centralized credential management – store and rotate API keys and OAuth tokens in one place
Change alerts – get notified when a connector changes its schema, adds or removes tools, or updates tool definitions, so nothing breaks silently
For server owners:
Proven adoption – public usage metrics on your listing show real-world traction and build trust with prospective users
Tool-level analytics – see which tools are being used most, helping you prioritize development and documentation
Direct user feedback – users can report issues and suggest improvements through the listing, giving you a channel you would not have otherwise
The connector status is unhealthy when Glama is unable to successfully connect to the server. This can happen for several reasons:
The server is experiencing an outage
The URL of the server is wrong
Credentials required to access the server are missing or invalid
If you are the owner of this MCP connector and would like to make modifications to the listing, including providing test credentials for accessing the server, please contact support@glama.ai.
Discussions
No comments yet. Be the first to start the discussion!
Related MCP Connectors
Scan and fix a domain's email deliverability (SPF, DKIM, DMARC, MTA-STS, BIMI, DNS blocklists).
Check SPF/DKIM/DMARC/BIMI, blacklists, SMTP/IMAP; DNS lookups; generate email DNS records.
Monitor and manage email authentication (SPF, DKIM, DMARC, MTA-STS, BIMI) for your domains.
Email posture for any domain: can it receive mail, can it be spoofed? MX, SPF and DMARC.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables DNS and email security analysis through passive and active scanning capabilities. Provides comprehensive domain security checks including SPF, DMARC, DNSSEC validation, MX record analysis, and SMTP connectivity testing.MIT
- AlicenseAqualityBmaintenanceProvides comprehensive tools for real-time DNS queries across 53 record types, global propagation checks, and SSL certificate analysis. It also enables domain security scans for SPF/DKIM/DMARC configurations and HTTP uptime monitoring.88822Apache 2.0
- AlicenseAqualityBmaintenanceA DNS and email security scanner with 77 MCP tools for assessing SPF, DMARC, DKIM, DNSSEC, SSL/TLS, and more, providing guided remediation and attack path simulation.79199Business Source 1.1
- FlicenseAqualityDmaintenanceProvides DNS lookup and email authentication diagnostic tools (SPF, DKIM, DMARC, MX, etc.) for use with MCP-compatible clients. Enables natural language queries to check DNS records and email health.7-
Glama MCP Gateway
Add one secure layer between your agents and this server.
TDQS
Each tool targets a distinct DNS or email authentication task. Despite multiple DMARC-related tools, their purposes are clearly differentiated: build_dmarc_upgrade upgrades policies, generate_dmarc_record creates new ones, validate_dmarc_record validates pasted records, and scan_domain vs get_report differentiate fresh vs cached scans.
All tool names follow a consistent verb_noun pattern in snake_case (e.g., build_dmarc_upgrade, check_record, scan_domain). No mixing of naming conventions, making the set predictable and easy to navigate.
With 11 tools, the server is well-scoped for a DNS/email authentication diagnostics tool. The number covers essential operations without being overwhelming or sparse.
The tool set covers core workflows: DMARC management (generate, validate, upgrade, parse reports), DNS checks (propagation, reverse DNS, SPF lookups), and DKIM selector checks. Minor gaps exist, such as the absence of SPF validation or DKIM signature verification, but the main diagnostic and monitoring use cases are supported.