Email-Check.app ships a hosted Model Context Protocol (MCP) server at https://api.email-check.app/mcp. Register one URL and any MCP-compatible agent gains email validation tools — no self-hosted wrapper, no custom tool code.
The Model Context Protocol lets AI agents discover and call external tools over standard JSON-RPC. The Email-Check.app server speaks Streamable HTTP — every call is a POST with an Accept: application/json, text/event-stream header — and exposes two read-only tools: email_validate for full validation and account_whoami as a free identity probe.
Every Streamable HTTP client connects with the same three pieces: the endpoint URL, an API key header, and a server name. Copy the block for your client:
email-check tools appear in Claude Code.claude mcp add --transport http email-check https://api.email-check.app/mcp --header "x-api-key: YOUR_API_KEY"x-api-key with your API key as the value.https://api.email-check.app/mcp~/.codex/config.toml — Codex CLI, the IDE extension, and the ChatGPT desktop app all share it. Verify with codex mcp list.codex mcp add email-check --url https://api.email-check.app/mcp# ~/.codex/config.toml — shared by the Codex CLI, IDE extension, and desktop app
[mcp_servers.email-check]
url = "https://api.email-check.app/mcp"
env_http_headers = { "x-api-key" = "EMAIL_CHECK_API_KEY" }servers key in .vscode/mcp.json; everything else uses mcpServers.{
"mcpServers": {
"email-check": {
"type": "http",
"url": "https://api.email-check.app/mcp",
"headers": {
"x-api-key": "YOUR_API_KEY"
}
}
}
}Also works with
Replace YOUR_API_KEY with a real key from Account → API keys. Prefer to keep every request on one origin? https://email-check.app/mcp is a thin same-origin proxy that forwards to the same canonical endpoint.
Keys are host-scoped to Email-Check.app — keys issued for other products are rejected, and each key you create works on the MCP server and the REST API alike.
Sign in to Email-Check.app and open the API keys page. Keys are created per account and work immediately.
Choose Create API Key and name it after the pipeline that will use it — for example crm-hygiene-agent — so usage stays attributable.
Replace YOUR_API_KEY in the connect blocks above. Keep the key in your MCP client configuration or server-side environment — never in prompts, repositories, or browser code.
Ask your agent "which account is my key connected to?" — the account_whoami tool answers for free and confirms the credential before you spend credits.
Want to try before signing up? The key demo-key with a valid TOTP in the x-ct header grants limited, rate-limited trial access.
Every MCP session starts with initialize. The response includes the server's instructions for agents — how to authenticate, what a call costs, and what an HTTP 402 means:
curl -X POST 'https://api.email-check.app/mcp' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-H 'x-api-key: YOUR_API_KEY' \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2025-06-18",
"capabilities": {},
"clientInfo": { "name": "curl", "version": "1.0.0" }
}
}'Then validate an address by calling email_validate. MX and SMTP probes are opt-in through the arguments:
curl -X POST 'https://api.email-check.app/mcp' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-H 'x-api-key: YOUR_API_KEY' \
-d '{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "email_validate",
"arguments": {
"email": "support@example.com",
"verifyMx": true
}
}
}'The result carries both a machine-readable structuredContent object (validated against the tool's output schema) and a text mirror for clients that only render text:
{
"jsonrpc": "2.0",
"id": 2,
"result": {
"content": [{ "type": "text", "text": "..." }],
"structuredContent": {
"email": "support@example.com",
"validFormat": true,
"validMx": false,
"validSmtp": null,
"isDisposable": false,
"isFree": false,
"detectedName": null,
"domainSuggestion": null
}
}
}support@example.com passes the syntax check, but the reserved example.com domain accepts no mail — so validMx comes back false and the SMTP probe is skipped, leaving validSmtp null. Read the fields the way the schema intends:
validFormat — a hard verdict on syntax.validMx, validSmtp — nullable probes; null means the probe was not requested or could not conclude, never a failure.isDisposable, isFree — provider signals (throwaway or free mailbox domains).detectedName — { firstName, lastName, confidence } when the local part yields a probable name, otherwise null.domainSuggestion — { original, suggested } on likely typos, otherwise null.domainAge, smtpDebug — opt-in diagnostics via checkDomainAge and smtpDebug.| Tool | Cost | Arguments | What it does |
|---|---|---|---|
| account_whoami | Free | None | Identity probe: which account the API key resolves to (user id, email, username). Use it to confirm credentials before spending credits. |
| email_validate | 1 credit | email (required), verifyMx, verifySmtp, detectName, suggestDomain, checkDomainAge, checkDomainRegistration, smtpDebug, timeout | Full validation: format, MX records, optional SMTP mailbox probe, disposable and free-provider detection, name detection, and domain suggestions. |
| Argument | Type | Description |
|---|---|---|
| string (required) | The email address to validate. | |
| verifyMx | boolean | Check that the domain has MX records. |
| verifySmtp | boolean | Probe the SMTP server for mailbox existence (slower). |
| detectName | boolean | Detect a probable first/last name from the local part. |
| suggestDomain | boolean | Suggest a correction for common domain typos. |
| checkDomainAge | boolean | Report the domain age in days. |
| checkDomainRegistration | boolean | Include domain registration data. |
| smtpDebug | boolean | Include the SMTP transcript summary in the response. |
| timeout | integer (ms) | Per-check timeout. Default 2000, maximum 10000. |
Both tools are read-only and idempotent. Probes are opt-in so a signup screen can run fast format and MX checks, while a scheduled hygiene job pays for the slower SMTP mailbox probe only where it needs the answer.
account_whoami is free — use it as a connectivity and identity probe.402 PAYMENT_REQUIRED response means the account is out of credits. Stop the batch, point the operator at email-check.app/pricing to top up, then resume — retrying the same call cannot succeed.401; keys created on other products are rejected because keys are host-scoped.initialize result instructions, so well-behaved clients explain a 402 without extra prompting.Credit packs and subscription plans are compared on the pricing page. Usage from MCP calls appears in your account usage reporting like any other API call.
The server publishes machine-readable metadata so clients and crawlers can find it without reading this page:
/llms.txt — a crawl-friendly summary of the product, the MCP endpoint, tools, and billing for LLM clients./.well-known/mcp/server-card.json — machine-readable server metadata (v1 shape) other clients read to learn what this server offers.No. Email-Check.app hosts the server at https://api.email-check.app/mcp. You register the endpoint URL and an API key in your MCP client; there is nothing to deploy or maintain.
Any client that speaks the Streamable HTTP transport: Claude Code, Claude on claude.ai and Desktop, Codex (CLI, IDE extension, and the ChatGPT desktop app), Cursor, VS Code, Windsurf, Cline, Continue, Zed, and SDKs that implement the http server type. The same JSON-RPC 2.0 flow also works over plain curl.
Yes. The key demo-key with a valid TOTP in the x-ct header gives limited, rate-limited trial access. Full tool access uses a standard API key from your account.
Each successful tool call records usage like any other API call — 1 credit per call, with account_whoami free. Check remaining credits any time with account_whoami.
They return the same validation data. MCP saves you from writing and maintaining tool wrappers and works across agent environments out of the box. Use the REST endpoint when you are already inside a custom runtime with its own tool registration.
Treat it as inconclusive — not invalid. Schedule a bounded retry instead of looping until the answer changes, and keep the contact out of automated campaigns until its disposition is resolved.
Create an API key, register the MCP server, and let agents validate emails inside their next task.
Hosted MCP server at https://api.email-check.app/mcp • 1 credit per call • account_whoami free
How format, MX, SMTP, and risk signals fit together
What the mailbox probe does and where it is inconclusive
Use isDisposable signals to block throwaway signups
Industry standards and implementation tips
Client setup, email_validate walkthrough, and pipeline patterns
Four production agent pipelines built on the MCP tools