MCP Server Guide 2026

Connect AI Agents to Email Verification

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.

2
MCP tools — account_whoami and email_validate
1 credit
Per successful tool call
Free
account_whoami identity probe
HTTP
Streamable JSON-RPC 2.0 transport

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.

Connect Your Client

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:

Claude Code

One command in your terminal. Run it in your project directory, restart the session, and the email-check tools appear in Claude Code.
Copy command
claude mcp add --transport http email-check https://api.email-check.app/mcp --header "x-api-key: YOUR_API_KEY"

Claude (claude.ai / Desktop)

Custom connector, no CLI. Go to Customize → Connectors → Add custom connector and register the URL below. When prompted for authentication, add a custom header x-api-key with your API key as the value.
Copy URL
https://api.email-check.app/mcp

Codex (CLI, IDE & ChatGPT app)

Run the command once, then add the header line to ~/.codex/config.toml — Codex CLI, the IDE extension, and the ChatGPT desktop app all share it. Verify with codex mcp list.
Copy command
codex mcp add email-check --url https://api.email-check.app/mcp
Copy config.toml
# ~/.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" }

Any MCP Client

Generic Streamable HTTP configuration that works in any client config file. VS Code (Copilot) reads a servers key in .vscode/mcp.json; everything else uses mcpServers.
Copy JSON
{
  "mcpServers": {
    "email-check": {
      "type": "http",
      "url": "https://api.email-check.app/mcp",
      "headers": {
        "x-api-key": "YOUR_API_KEY"
      }
    }
  }
}

Also works with

MCP button in /open-api or .cursor/mcp.json
VS Code
.vscode/mcp.json (servers key)
Windsurf
~/.codeium/windsurf/mcp_config.json
Cline
~/Documents/Cline/MCP/cline_mcp_settings.json
Continue
~/.continue/config.yaml
Zed
~/.config/zed/settings.json → context_servers

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.

Create an API Key

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.

1

Open Account → API keys

Sign in to Email-Check.app and open the API keys page. Keys are created per account and work immediately.

2

Create and name the key

Choose Create API Key and name it after the pipeline that will use it — for example crm-hygiene-agent — so usage stays attributable.

3

Paste it into your client config

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.

4

Verify with a free probe

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.

First Calls with cURL

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:

Copy curl
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:

Copy curl
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:

Copy response
{
  "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 Reference

ToolCostArgumentsWhat it does
account_whoamiFreeNoneIdentity probe: which account the API key resolves to (user id, email, username). Use it to confirm credentials before spending credits.
email_validate1 creditemail (required), verifyMx, verifySmtp, detectName, suggestDomain, checkDomainAge, checkDomainRegistration, smtpDebug, timeoutFull validation: format, MX records, optional SMTP mailbox probe, disposable and free-provider detection, name detection, and domain suggestions.

email_validate arguments

ArgumentTypeDescription
emailstring (required)The email address to validate.
verifyMxbooleanCheck that the domain has MX records.
verifySmtpbooleanProbe the SMTP server for mailbox existence (slower).
detectNamebooleanDetect a probable first/last name from the local part.
suggestDomainbooleanSuggest a correction for common domain typos.
checkDomainAgebooleanReport the domain age in days.
checkDomainRegistrationbooleanInclude domain registration data.
smtpDebugbooleanInclude the SMTP transcript summary in the response.
timeoutinteger (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.

Billing and Errors

  • Every successful tool call consumes 1 credit from the API key owner.
  • account_whoami is free — use it as a connectivity and identity probe.
  • An HTTP 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.
  • A missing or invalid key returns HTTP 401; keys created on other products are rejected because keys are host-scoped.
  • Schema-invalid tool arguments return a structured error listing the offending fields — surface that message instead of silently retrying.
  • Agents receive this contract in the 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.

Discovery

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.
  • /open-api — the interactive API reference includes an MCP panel with one-click client configuration.

Frequently Asked Questions

Do I need to run my own MCP server?

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.

Which MCP clients are supported?

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.

Can I try it without a paid account?

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.

How do MCP calls appear in billing?

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.

MCP or REST API — which should my agent use?

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.

What should my agent do when validSmtp is null?

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.

Give Your Agents a Verification Tool

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