AI agents (MCP)
Give Claude, ChatGPT, Cursor or VS Code 10 tools over your monitored domains. Sign in once; there is no token to copy.
Two servers
https://emailsecops.com/mcp
Your monitored domains, history, DKIM key inventory, DMARC reports and alerts, plus live checks. Sign in with your EmailSecOps account (OAuth) or send a team token. On Starter, Pro, Enterprise.
https://emailsecops.com/mcp/public
No account: the free DNS checks on any domain (check_domain, check_dkim, verify_dkim_signature, check_email). 30 calls a minute and 500 a day per IP. It never sees team data.
Connect your client
Paste the team server URL into your client and sign in when it asks. Each client in a line or two:
https://emailsecops.com/mcp
Claude claude.ai and the Claude desktop app
- Open Settings → Connectors and choose Add custom connector.
- Name it EmailSecOps and paste the URL above; leave the OAuth fields empty.
- Click Connect, sign in to EmailSecOps and choose Allow. Then turn it on in a chat from the tools menu.
ChatGPT chatgpt.com with developer mode
- Open Settings → Apps & Connectors → Advanced and turn on Developer mode.
- Create a connector named EmailSecOps with the URL above and authentication OAuth.
- Sign in to EmailSecOps when asked and choose Allow.
Claude Code the terminal
- Add the server:
claude mcp add --transport http emailsecops https://emailsecops.com/mcp
- Run /mcp, pick emailsecops and choose Authenticate. Or skip the browser and add --header "Authorization: Bearer eso_live_…" with a team token.
Cursor ~/.cursor/mcp.json
- Add the server to the file:
{"mcpServers":{"emailsecops":{"url":"https://emailsecops.com/mcp"}}} - Cursor lists it as Needs login: click it, sign in and choose Allow.
VS Code .vscode/mcp.json
- Add the server to the file:
{"servers":{"emailsecops":{"type":"http","url":"https://emailsecops.com/mcp"}}} - Start it from the file, sign in and choose Allow.
Tools
List the team's monitored domains with score, grade, DMARC policy and verification state.
Run a live email sender-policy check (SPF, DKIM, DMARC, MX, MTA-STS, TLS-RPT, BIMI, reverse DNS, DNS blacklists) for any domain and return score, grade, records and prioritised recommendations with exact DNS fixes.
Live DKIM lookup for any domain. With selectors: checks exactly those. Without: scans the default selectors of every major provider. Per selector: key type, bits and SHA-256 fingerprint, CNAME delegation and the owning provider (Microsoft 365, SendGrid, …), testing/revoked flags, every RFC 6376/8301/8463 defect, and a corrected record when the fix is mechanical. Selectors of Amazon SES, Postmark and HubSpot are random or dated and cannot be discovered; ask for them or use list_dkim_selectors on a monitored domain.
For a domain the team monitors: every DKIM selector we know (discovered, added, or seen signing in DMARC reports) with status, health, provider, key type/bits/fingerprint, key age and age bucket, rotation count and key history size, plus which selectors and signing domains (d=) actually sign mail and how often they pass, and findings that need history (keys due for rotation, selectors failing in reports, unpublished signing selectors, third-party signers that do not align). Answers "which DKIM keys are old?", "is SendGrid signing with our domain?", "why does DKIM fail for X?".
Cryptographically re-verify every DKIM-Signature in a raw RFC 5322 message (all headers, a blank line, then the body exactly as received): canonicalization, body hash (bh=), RSA or Ed25519 signature (b=) against the key published in DNS, expiry, and alignment of d= with the From domain. Explains failures (body modified, header changed, key missing/revoked, SHA-1 retired). Does not trust Authentication-Results headers. Up to 1 MB.
Add a DKIM selector to a monitored domain so every check watches it (needed for selectors that cannot be discovered, e.g. Amazon SES tokens or dated Postmark keys). Looks it up immediately and returns its status. Requires a token with write access (or a team owner/admin). Adding an existing selector changes nothing.
What changed between consecutive checks of a monitored domain, newest first: records added/removed/changed (SPF, DMARC, BIMI, MTA-STS, TLS-RPT, MX), DMARC policy changes, DKIM selectors added/removed, DKIM key rotations and revocations, blacklist listings, score moves — each with severity and old/new values. Answers "what changed on example.com this week?".
The team's alerts, newest first: DNS drift (SPF/DKIM/DMARC/MX changes), score drops, blacklist listings, DMARC failure spikes, expiring registrations or certificates, and DKIM findings (keys due for rotation, failing or unpublished selectors). Filter by domain and open (unresolved) only.
For a monitored domain, summarise DMARC aggregate-report data (alignment rate, top sources, failing known senders) and say whether it is safe to move to p=quarantine / p=reject, with the exact record to publish.
Introduction/KYC-style check of a single email address: syntax, MX, provider, free/disposable/role flags, the domain's SPF/DKIM/DMARC strength, and a risk score with reasons.
What a connection may do
- A signed-in connection acts as you, for the team selected in your dashboard at the time of each call. Switch teams there and the agent follows.
- Owners and admins can let it change data (a tool marked “changes data”); members and viewers get read-only access. Team tokens need the write permission for those tools.
- No tool can change your DNS or send mail. Fixes come back as records for you to publish.
- Calls count against the team's monthly quota, shared with the REST API: Starter 2,000, Pro 20,000, Enterprise 200,000.
Clients without sign-in
Send a team token as Authorization: Bearer eso_live_…. Create one under MCP & API in the dashboard. For Claude Code:
claude mcp add --transport http emailsecops https://emailsecops.com/mcp --header "Authorization: Bearer eso_live_…"
Keep tokens out of files that get committed; Cursor's global ~/.cursor/mcp.json and VS Code's prompted inputs work for that.
See and disconnect agents
MCP & API in the dashboard lists every agent signed in as you, where it sends sign-ins and when its access was last renewed. Disconnect revokes its access at once; it has to sign in again to come back. Revoking a team token stops everything that uses it.