emailsecops
Docs

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

Team server
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.

Public server
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:

Server URL
https://emailsecops.com/mcp
Claude claude.ai and the Claude desktop app
  1. Open Settings → Connectors and choose Add custom connector.
  2. Name it EmailSecOps and paste the URL above; leave the OAuth fields empty.
  3. 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
  1. Open Settings → Apps & Connectors → Advanced and turn on Developer mode.
  2. Create a connector named EmailSecOps with the URL above and authentication OAuth.
  3. Sign in to EmailSecOps when asked and choose Allow.
Claude Code the terminal
  1. Add the server:
    claude mcp add --transport http emailsecops https://emailsecops.com/mcp
  2. 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
  1. Add the server to the file:
    {"mcpServers":{"emailsecops":{"url":"https://emailsecops.com/mcp"}}}
  2. Cursor lists it as Needs login: click it, sign in and choose Allow.
VS Code .vscode/mcp.json
  1. Add the server to the file:
    {"servers":{"emailsecops":{"type":"http","url":"https://emailsecops.com/mcp"}}}
  2. Start it from the file, sign in and choose Allow.

Tools

list_domains

List the team's monitored domains with score, grade, DMARC policy and verification state.

check_domain also public

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.

check_dkim also public

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.

list_dkim_selectors

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?".

verify_dkim_signature also public

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_dkim_selectorchanges data

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.

list_domain_changes

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?".

list_alerts

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.

dmarc_advice

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.

check_email also public

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.