Check a domain's DMARC, SPF, DKIM, MX, BIMI and MTA-STS records. Generate SPF and DMARC records.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Look up a domain's live DNS and grade its email authentication: DMARC, SPF, DKIM (common selectors), MX, BIMI and MTA-STS. Returns each record, its status and the issues found, with a guide link per issue. A domain checked in the last few minutes is answered from that check (cached, with its age); pass refresh to look again after changing DNS.
The domain to check, like example.com. A URL or www. host is reduced to the domain.
Look the DNS up again instead of answering from a check made in the last few minutes, e.g. right after publishing a record. Only once the earlier answer is a minute old.
Look up a domain's live DNS and grade its email authentication: DMARC, SPF, DKIM (common selectors), MX, BIMI and MTA-STS. Returns each record, its status and the issues found, with a guide link per issue. A domain checked in the last few minutes is answered from that check (cached, with its age); pass refresh to look again after changing DNS.
| Argument | Type | Description |
|---|---|---|
| domain* | string | The domain to check, like example.com. A URL or www. host is reduced to the domain. |
| refresh | boolean | Look the DNS up again instead of answering from a check made in the last few minutes, e.g. right after publishing a record. Only once the earlier answer is a minute old. |
{
"type": "object",
"required": [
"domain"
],
"properties": {
"domain": {
"type": "string",
"maxLength": 253,
"description": "The domain to check, like example.com. A URL or www. host is reduced to the domain."
},
"refresh": {
"type": "boolean",
"description": "Look the DNS up again instead of answering from a check made in the last few minutes, e.g. right after publishing a record. Only once the earlier answer is a minute old."
}
}
}Build a DMARC TXT record and the host to publish it at, from a policy and the addresses that should receive aggregate reports. Notes what the record does not cover yet. Computes from the arguments only; nothing is looked up or stored.
| Argument | Type | Description |
|---|---|---|
| domain | string | The domain the record protects, like example.com. Used for the host name and the external reporting check. |
| policy | string | What receivers do with failing email. Start at none while you read reports. |
| strict_spf | boolean | Require an exact SPF domain match (aspf=s). |
| strict_dkim | boolean | Require an exact DKIM domain match (adkim=s). |
| report_addresses | array | Addresses that receive aggregate reports (rua=). |
| subdomain_policy | string | A different policy for subdomains (sp=). Leave out to use the main policy. |
{
"type": "object",
"properties": {
"domain": {
"type": "string",
"maxLength": 253,
"description": "The domain the record protects, like example.com. Used for the host name and the external reporting check."
},
"policy": {
"enum": [
"none",
"quarantine",
"reject"
],
"type": "string",
"default": "none",
"description": "What receivers do with failing email. Start at none while you read reports."
},
"strict_spf": {
"type": "boolean",
"description": "Require an exact SPF domain match (aspf=s)."
},
"strict_dkim": {
"type": "boolean",
"description": "Require an exact DKIM domain match (adkim=s)."
},
"report_addresses": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 5,
"description": "Addresses that receive aggregate reports (rua=)."
},
"subdomain_policy": {
"enum": [
"none",
"quarantine",
"reject"
],
"type": "string",
"description": "A different policy for subdomains (sp=). Leave out to use the main policy."
}
}
}Build an SPF TXT record from the services and servers that send email for a domain, with an estimate of the DNS lookups it uses against SPF's limit of 10. Computes from the arguments only; nothing is looked up or stored.
| Argument | Type | Description |
|---|---|---|
| a | boolean | The domain's own A record sends email. |
| mx | boolean | The domain's MX servers send email. |
| ip4 | array | IPv4 addresses or ranges that send, like 192.0.2.10 or 192.0.2.0/24. |
| ip6 | array | IPv6 addresses or ranges that send, like 2001:db8::/32. |
| includes | array | Other include: domains, like _spf.example.com. |
| services | array | Email services that send for the domain; each adds its documented include. |
| hard_fail | boolean | End with -all instead of the usual ~all. |
{
"type": "object",
"properties": {
"a": {
"type": "boolean",
"description": "The domain's own A record sends email."
},
"mx": {
"type": "boolean",
"description": "The domain's MX servers send email."
},
"ip4": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 20,
"description": "IPv4 addresses or ranges that send, like 192.0.2.10 or 192.0.2.0/24."
},
"ip6": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 20,
"description": "IPv6 addresses or ranges that send, like 2001:db8::/32."
},
"includes": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 10,
"description": "Other include: domains, like _spf.example.com."
},
"services": {
"type": "array",
"items": {
"enum": [
"google",
"microsoft",
"amazonses",
"sendgrid",
"mailgun",
"postmark",
"mandrill",
"brevo",
"salesforce",
"zendesk",
"freshdesk",
"proton",
"fastmail"
],
"type": "string"
},
"maxItems": 13,
"description": "Email services that send for the domain; each adds its documented include."
},
"hard_fail": {
"type": "boolean",
"description": "End with -all instead of the usual ~all."
}
}
}