Imported from Findymail/findymail-cursor-plugin (
skills/email-verification/SKILL.md). Install upstream withnpx skills add Findymail/findymail-cursor-plugin --skill email-verification. Copyright stays with the author.
Email verification and reverse lookup
Two jobs, one skill:
- Verify: tell whether addresses that came from elsewhere (a CRM export, a spreadsheet, a signup form) will deliver, without sending anything.
- Identify: put a name, a LinkedIn profile and optionally a phone number on an address that arrived without context.
Tools and cost
| Tool | Use it for | Cost |
|---|---|---|
verify_email |
Deliverability of one address | 1 verifier credit per check. Verifier credits are a separate pool from finder credits. |
reverse_email_lookup |
Who owns the address | 1 finder credit for the LinkedIn URL, 2 with with_profile: true, free if nobody matches |
find_phone |
Phone from a LinkedIn URL | 10 finder credits if found |
One address per call. There is no batch endpoint.
Verify a list
1. Prepare the list, free
- Extract every address, lowercase it, and deduplicate.
- Drop anything that is not syntactically an email (no
@, spaces, missing TLD). Mark itmalformedwithout spending a credit. - Flag role accounts (
info@,sales@,support@,noreply@) in anotecolumn. They can still be verified, but the user usually wants to know. - Skip addresses that Findymail produced. Results from
find_emailandgenerate_lead_listare already verified.
2. Confirm the spend
Cost is 1 verifier credit per remaining address. For more than 25 addresses, state the count and wait for a go-ahead.
3. Verify
Call verify_email once per address. The response carries verified (true or false) and the mail provider (for example Google or Microsoft). Record:
validwhenverifiedis trueinvalidwhenverifiedis falseerrorwith the message when the call fails, and keep going
4. Deliver
- File input: write
<original-name>-verified.csvnext to the input with the original columns plusemail_status(valid,invalid,malformed,error),provider, andnote. Never overwrite the original. - Inline input: a markdown table.
- Close with counts per status and the number of verifier credits used. Recommend removing
invalidandmalformedrows before any outreach sequence.
Write the file every 20 rows on long lists. On resume, skip rows that already have a final status and retry only error.
Identify who is behind an address
- Call
reverse_email_lookupwith theemail.with_profile: false(default) returns the LinkedIn URL for 1 credit.with_profile: truealso returns the profile (name, title, company) for 2 credits. Use it when the user needs more than the URL, since it saves a separate lookup.
- A no-match is free. Personal addresses (gmail.com and similar) match less often than work addresses. Say so rather than guessing.
- Reverse lookup says nothing about deliverability. If the goal is to reply or reach out, also run
verify_email. - Phone: only when asked. Pass the returned
linkedin_urltofind_phone(10 credits per number found) after confirming the cost.
Clean a CRM export end to end
When the user hands over an export and wants it "cleaned":
- Prepare and verify every address as above.
- For
validrows missing a name or company, offer to runreverse_email_lookupwithwith_profile: true(2 credits each) and confirm the spend. - Deliver one file with both sets of columns and a summary of what changed.
Errors
- 402 "Not enough credits": stop, deliver partial results, point the user to https://app.findymail.com. Note that verifier and finder credits are bought separately.
- 429: pause and retry the same address.
- 401: ask the user to reconnect the Findymail MCP server in Cursor settings.
Example prompts
- "Verify the emails in signups.csv before I add them to the sequence"
- "Is jane.doe@acme.com still valid?"
- "Who is behind m.rossi@brembo.com? I got a reply and don't know them"
- "Clean this HubSpot export: check every email and fill in the missing names"