MailProbe
mailprobe-mcp
Official Model Context Protocol server of the MailProbe API. Your AI assistant checks whether email addresses exist and can receive mail, in real time and without sending anything: one address, or a list before a campaign. Verification runs on OVHcloud servers in France, and the API stores no address.
Installation · Tools · How it behaves · Development
There are two ways to reach it, with the same two tools:
the remote server that MailProbe runs at
https://mailprobe.dev/mcp, for a client that connects to a remote server and can send a header: nothing to install;the local server of this package,
npx -y mailprobe-mcp, for a client that starts its servers on your computer.
This repository also holds the Claude Code plugin and the skill that tells an assistant how to read a result and how to go through a list.
Installation
Create an account on mailprobe.dev. It comes with 100 free credits; see pricing for more.
Create an API key, which starts with
mp_live_, under Developer in your account. MailProbe shows it only once, at creation.Add one of the two servers to your MCP client.
Remote server
The key goes in the Authorization header. In Claude Code:
claude mcp add --transport http mailprobe https://mailprobe.dev/mcp --header "Authorization: Bearer mp_live_..."In Cursor, in .cursor/mcp.json:
{
"mcpServers": {
"mailprobe": {
"url": "https://mailprobe.dev/mcp",
"headers": { "Authorization": "Bearer mp_live_..." }
}
}
}Any other client that connects to a remote MCP server and can send a header works the same way.
Local server
The key goes in the MAILPROBE_API_KEY environment variable, and the server needs Node.js 22 or later. In Claude Desktop and the other clients configured with a JSON file:
{
"mcpServers": {
"mailprobe": {
"command": "npx",
"args": ["-y", "mailprobe-mcp"],
"env": { "MAILPROBE_API_KEY": "mp_live_..." }
}
}
}The Claude and ChatGPT apps connect to a remote server only through an OAuth sign-in, which MailProbe does not offer yet. Claude Desktop takes the local server above; elsewhere, MailProbe is available through Zapier MCP.
Claude Code plugin
The plugin connects Claude Code to the remote server and adds a skill that tells the assistant how to read a result, what a call costs, and how to go through a list.
/plugin marketplace add jamalofski/mailprobe-mcp
/plugin install mailprobe@mailprobeClaude Code asks for the API key when the plugin is enabled, and keeps it in the credential store of the system, not in a settings file. To set it later, run /plugin configure mailprobe@mailprobe, or open /plugin, Installed tab, mailprobe, Configure options. A remote server you added by hand at the same address takes precedence over the one of the plugin.
Then ask for what you need: "does jane@example.com exist?", "check the addresses of contacts.csv before I send the newsletter", "which of these sign-ups are disposable?".
Related MCP server: mailverdict
Tools
Tool | What it does |
| Verifies 1 to 20 addresses and returns one result per address, in the order given: |
| Returns the credits left on the account of the API key |
The fields of a result are those of the API: see the API documentation.
How it behaves
Nothing is sent to the address. MailProbe checks the syntax, the mail servers of the domain, then asks the mail server whether the mailbox exists, and stops there.
Nothing is stored. An address verified through the API is processed in memory and gone when the response is sent. No result is reused for a later request.
The same tools on both servers. The local server carries the instructions and the tool definitions of the remote one, word for word, and words a refusal the same way. It adds nothing between the assistant and the API: it sends the addresses to
https://mailprobe.dev/api/v1and returns the answer.Credits. One credit per address actually probed, taken from your account as with the API. An address repeated in the same call, an entry that is not a well-formed address, an address that could not be probed in time and one whose server refused the connection cost nothing.
get_creditsis free.Rate limit. The API accepts 60 calls per minute for an API key, and a call of 20 addresses counts as one. A refused call gives the number of seconds to wait. The local server waits by itself and tries again, twice at most and only for delays of 30 seconds or less; otherwise the assistant gets the delay to wait.
Response time. A call answers within about 95 seconds, however slow the mail servers are. An address that could not be probed by then comes back
unknownwith the reasontimeout, at no charge.Long lists. A call takes 20 addresses, so an assistant sends a list in several calls. Above a few hundred addresses, the batch screen of your account is the right tool: a pasted list of up to 500 addresses, or a CSV or TXT file of up to 250,000, verified in the background.
Errors. A refusal comes back to the assistant as a sentence it can act on: the key to set, the credits to buy, the delay to wait.
Without a key. The local server starts and lists its tools; a call explains how to set
MAILPROBE_API_KEY.
Every request of the local server carries User-Agent: mailprobe-mcp/<version>. Mention it when you contact support: it tells your calls apart in the API's logs.
Development
The local server has no dependency: Node.js runs the sources as they are. It talks to its client over stdio and serves both eras of the protocol from the same process: revision 2026-07-28, where each request carries its protocol version, and the earlier revisions (2025-11-25 down to 2024-11-05), which start with an initialize handshake.
npm testruns the tests against a fake MailProbe API on a local port: no key and no network are needed. They also check that the package, the plugin, the skill and this README agree.
npm run check-toolscompares the instructions and the tool definitions of this package with those of the remote server, which gives them without a key.
Plugin
plugin/ holds the Claude Code plugin: its manifest, the .mcp.json that points at the remote server, and the skill, plugin/skills/mailprobe/SKILL.md. .claude-plugin/marketplace.json is the catalog that lets Claude Code install the plugin from this repository. Neither is part of the npm package.
claude plugin validate . --strict
claude --plugin-dir ./plugincheck the manifests, then start a session with the plugin loaded from the folder, without installing it. A user gets a change of the plugin or of the skill when the version changes: it ships with a release.
Releasing
Set the version in
package.jsonandplugin/.claude-plugin/plugin.json, and date its section inCHANGELOG.md.Run
npm testandnpm run check-tools.Commit, then push a tag named after the version: the Publish workflow publishes the package to npm through Trusted Publishing, with a provenance statement.
Resources
Support
Open an issue or write to contact@mailprobe.dev.
License
MIT, see LICENSE.
Available Tools
2 toolsget_creditsGet Credit BalanceARead-onlyInspect
Returns the number of verification credits left on the MailProbe account that owns the API key. Reading the balance uses no credit.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false. The description adds value beyond that by disclosing that reads consume no credit and that the balance is scoped to the API key's owning account, though it says nothing about rate limits or return format.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the return value, then the cost caveat. Every clause carries information and nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read with no output schema, the description fully covers what is returned (a credit count), whose balance it is, and the cost of calling it. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. The description correctly implies no inputs are needed and instead explains what account context is used implicitly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a precise verb and resource ('Returns the number of verification credits left') and scopes it to the account owning the API key. It does not explicitly name or contrast with the sibling verify_emails, but the resource is distinct enough that an agent can tell them apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Reading the balance uses no credit' implies the tool is free/safe to call, which is implicit usage guidance about cost. However, there is no explicit when-to-use or when-not-to-use statement relative to verify_emails, so guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_emailsVerify Email AddressesARead-onlyInspect
Checks whether email addresses exist and can receive mail, in real time and without sending anything. Returns one result per address, in input order. Act on status: valid is safe to send, invalid must not be used, risky is accepted but uncertain (catch-all domain, role or disposable address, provider that blocks probing) and unknown could not be determined. score is a 0-100 confidence value, reason explains a verdict that is not plainly deliverable and did_you_mean suggests a fix for a likely typo. One credit per address actually probed: duplicates and malformed addresses are free. At most 20 addresses per call: split a longer list into several calls.
| Name | Required | Description | Default |
|---|---|---|---|
| emails | Yes | Email addresses to verify, 1 to 20. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint. The description goes well beyond them: probing is real-time and non-sending, one credit is charged per address actually probed, duplicates and malformed entries are free, and a hard cap of 20 addresses per call applies. That is the billing and rate-limit context an agent needs before invoking.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core behavior leads, then result interpretation, then the billing/limit constraints. Every clause carries information — no restatement of the tool name or title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must carry return semantics, and it does: one result per address in input order, the four `status` values with their meanings, plus `score`, `reason` and `did_you_mean`. An agent has everything required to call it and interpret the response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single `emails` param is self-explanatory, so the baseline is 3. The description adds genuine meaning the schema lacks: duplicates and malformed entries are not billed, and the 1-20 limit is a per-call constraint requiring batching rather than a hard rejection of longer lists.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Checks whether email addresses exist and can receive mail') and immediately bounds the mechanism ('in real time and without sending anything'). The only sibling, get_credits, is clearly unrelated, so an agent can route this without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives strong operational guidance: act on `status`, split lists over 20 into several calls, and the cost implication of duplicates/malformed addresses. It does not name an alternative tool or state an explicit when-not-to-use condition, which keeps it short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
v1.1.0- First observed
get_credits - First observed
verify_emails
TDQS
Scored across 2 tools
The two tools target entirely different concerns: verifying addresses versus reading the account credit balance. There is no plausible way to confuse one with the other, and the descriptions make the boundary explicit ('Reading the balance uses no credit').
Both names follow a clean verb_noun snake_case pattern (verify_emails, get_credits) with the noun reflecting the resource being acted on. No mixing of conventions.
Two tools is thin for a standalone server, even a narrowly scoped one. The surface is arguably complete for a pure verification API, but a status/account or batch-history tool would round it out.
verify_emails is a fully-featured core operation (batch limits, per-status semantics, scoring, typo suggestions) and get_credits covers the account concern. Minor gaps remain, such as account details or a past-verification history/results lookup.
Maintenance
Related MCP Connectors
Verify email deliverability by SMTP. Catch-all/disposable/role detection. EU-hosted, GDPR-ready.
Mailvett: validate emails. MX, provider, disposable/role/free flags, typo fix, verdict.
Mailvett: validate emails. MX, provider, disposable/role/free flags, typo fix, verdict.
Verify emails — deliverability, disposable/role/free detection, MX validity, domain age.
Related MCP Servers
- AlicenseAqualityCmaintenanceEmail validation MCP server using MailboxValidator API to determine validity of an email address.337 npm1MIT
- AlicenseNot gradedqualityBmaintenanceKeyless email validation: disposable/burner, role-account, and free-provider detection, MX checks, and typo suggestions. Tools: check_email, check_domain.MIT
- FlicenseNot gradedqualityDmaintenanceComprehensive email validation MCP server that checks syntax, MX records, disposable domains, role-based accounts, SPF/DKIM, typo suggestions, and risk scoring.-
- FlicenseNot gradedqualityCmaintenanceProvides email verification as an MCP tool, checking format, disposable domains, and mail server availability with structured results.-