Decide whether an email address is safe to send to, and find a person's business address, without burning credits or damaging sender reputation...
Sending to bad addresses is not a cosmetic problem. Mailbox providers score senders on bounce rate, and a single campaign to an unverified list can push a domain into the spam folder for months. The fix is cheap: check addresses before you send, and know what the answer means.
This skill covers how to make that decision well. It uses the ClearBounce MCP server
(verify_email, find_email, check_credits) for the live checks, but the judgement
rules below are what actually matter — most mistakes come from misreading a result, not
from missing a tool.
Verify with intent, never in bulk-by-reflex.
Every verification costs a credit. Verifying 500 addresses to send to 40 of them wastes 460 credits. Verify what you are about to use, in the order you will use it, and stop as soon as you have what you need.
find_email takes a full name and a company domain and is free. It returns:
status — found_published if the address came from a published source, or
pattern_guesses if it was derived from common company address patternsbest_match — the best address, with confidence (0–100)detected_company_pattern — the pattern this company actually uses, when knownseen_at_company — addresses already published at that domain (up to 5)candidates — the ranked alternatives, at most the top 25total_candidates — the size of the full pool, which can exceed 25found_published is a real observation. pattern_guesses is arithmetic on a name — it is
not evidence that a mailbox exists. When the status is found_published, best_match is
that published address and candidates holds the alternatives, not the match itself.
The workflow:
find_email. It is free, so always start here.total_candidates, not from the length of
candidates — the visible list is capped at 25 and can understate the pool.deliverable result. Do not verify the rest of the pool.verify_email responses include creditsRemaining).If detected_company_pattern is present, the pattern-matching candidate is usually the
first one worth spending a credit on, regardless of raw ordering. seen_at_company is the
evidence behind it — real addresses observed at that domain. Reading the pattern off those
by eye often beats trusting the ranking.
verify_email returns a status, a subStatus reason, a 0–100 score, and a checks
object. Act on the status first:
| status | Means | Do |
|---|---|---|
deliverable |
Mailbox confirmed to exist | Send |
undeliverable |
Will bounce | Remove from the list, never send |
risky |
Real risk of a bounce or a complaint | Judge — see below |
unknown |
Could not be determined this time | Do not treat as invalid — retry later |
unknown is the most commonly misread value. It means the answer is missing, not that the
answer is "no". Its sub-statuses — unavailable_smtp (the mailbox check could not be
performed) and provider_temporarily_blocked — describe a check that did not complete, not
a verdict on the mailbox. Many resolve on a later retry. Deleting unknown addresses throws
away good contacts.
The sub-statuses, by the status they belong to:
invalid_syntax and invalid_domain (malformed, or the domain
cannot receive mail at all), rejected_email (the server explicitly refused this mailbox)accepted_emaillow_quality (a disposable domain, or a likely typo);
low_deliverability (a catch-all domain that could not be confirmed);
mail_server_did_not_respondunavailable_smtp, provider_temporarily_blockedmail_server_did_not_respond deserves its own note: it means a secure email gateway
(Mimecast and similar corporate filters) intercepted the check. It is deliberately reported
as risky rather than unknown, because the mailbox behind the gateway may well exist —
but nothing observable confirms it. Treat it like a catch-all: fine for one careful message,
not for a bulk send.
This is where most verification tools quietly lie, so understand it.
A catch-all (accept-all) domain accepts mail for every address, including addresses
that do not exist. sdfgsdfg@theircompany.com gets a green light from a naive SMTP check
and bounces two days later.
When checks.isCatchAll is true, an SMTP "accepted" carries no information on its own.
Only a provider-specific signal can resolve it — which is why the result may still come
back deliverable for a catch-all domain on Google Workspace, Microsoft 365, Yahoo,
iCloud or Proton, where the mailbox can be confirmed another way. When no such signal
exists, the honest answer is risky, and that is what you get.
How to treat risky on a catch-all domain: it is not a "no". It is "we could not
confirm this mailbox". For a low-volume, high-value send (one prospect, a reply to a
person) it is usually fine. For a bulk campaign it is not — a list of catch-all guesses is
exactly how bounce rates spike.
checksisRoleBased — info@, sales@, support@, admin@. Often deliverable, but they
reach a shared inbox, get low engagement, and attract spam complaints. Keep them out of
cold outreach; they are fine for transactional or support contexts.isDisposable — a throwaway address. Deliverable today, gone next week. Never worth
a marketing send; a signup with one is a signal in itself.hasTypo — a likely misspelling with a suggested correction (e.g. gmial.com).
Do not send to the original. Offer the correction to the user; the corrected address is
worth one credit to verify.isFreeProvider — gmail.com, outlook.com and similar. Not a problem, just context:
in a B2B list it usually means a personal address rather than a work one.score starts at 100 and is reduced for each risk signal found. It drops straight to 0 on
a hard failure — bad syntax, no MX records, or a mailbox the server explicitly rejected.
So a 0 means "definitely not", but a mid-range number means "accepted, with caveats", not
"probably invalid".
riskFactors is the plain-language list of exactly which signals cost points ("Disposable/
temporary email domain", "Possible typo detected (did you mean …?)"). When a user asks
why an address is risky, read them this list rather than guessing from the score.
Use status for the send/don't-send decision and the score for ordering within a status —
which of several risky addresses to try first. Do not invent a score threshold and treat
it as a rule: a deliverable at 70 is still deliverable.
find_email and check_credits are free. verify_email costs 1 credit per call.check_credits before a run that could cost more than a handful of credits, and
tell the user what the run will cost before starting it.deliverableunknown as undeliverable and deleting the contactrisky catch-all addressesThe tools come from the ClearBounce MCP server:
{
"mcpServers": {
"clearbounce": {
"url": "https://clearbounce.net/mcp"
}
}
}
Authenticate with OAuth when the client prompts, or send a ClearBounce API key in an
X-API-Key header. New accounts include free credits. Setup details for Claude, ChatGPT,
Claude Code, Cursor and VS Code: https://clearbounce.net/mcp-server