Agent skill
fivos-contact-enrichment
Use this skill after fivos-contact-sourcing has produced a contact CSV and emails + phones are needed.
Filed under Prospecting and list building.
From fivosaresti/workflows-outbound-skills · 10 skills · 1 · pushed 2026-04-21
What it does when it runs
Use this skill after fivos-contact-sourcing has produced a contact CSV and emails + phones are needed. It runs waterfall email + phone enrichment through Find Email MCP and BetterContact MCP directly - self-sufficient, does not delegate to other skills. Trigger when the user says 'enrich the contacts', 'find emails', 'waterfall these contacts', 'pull phones', or 'run the email finder'.
Read from the skill and the 1 file bundled beside it. A skill’s own description is written to be selected by an agent, so it describes the job and not the dependencies.
- Keys and connectors you must supply
- BETTERCONTACT_API_KEY
- FINDYMAIL_API_KEY
- ZEROBOUNCE_API_KEY
- bettercontact
- findymail
- zerobounce
- Hosts it reaches
- api.zerobounce.net
- app.bettercontact.rocks
- app.findymail.com
- Tool permissions it declares
- No
allowed-toolsin the frontmatter. It does act, so it runs under whatever permissions your session already grants. - Actions present in the files
- shell
Install it
View source on GitHub ↗git clone --depth 1 --filter=blob:none --sparse https://github.com/fivosaresti/workflows-outbound-skills.git /tmp/workflows-outbound-skills git -C /tmp/workflows-outbound-skills sparse-checkout set "contact-enrichment" mkdir -p ~/.claude/skills/fivos-contact-enrichment cp -R "/tmp/workflows-outbound-skills/contact-enrichment/." ~/.claude/skills/fivos-contact-enrichment/
Picked up without a restart. A project skill of the same name is shadowed by your personal one. For one repository only, swap ~/.claude/skills for .claude/skills. Claude Code docs ↗
The folder is the same in every client that implements the format — 46 of them — so if yours is not above, only the destination changes.
Before you install: this skill will not complete its job on a bare agent. It needs bettercontact, findymail, zerobounce, BETTERCONTACT_API_KEY, FINDYMAIL_API_KEY, ZEROBOUNCE_API_KEY, which you have to obtain separately.
The skill
Source on GitHub ↗Reproduced in full from fivosaresti/workflows-outbound-skills/blob/9076ebf601c5fd71b9898101205cdb4efa6e01e9/contact-enrichment/SKILL.md, which is licensed MIT (repository). 745 words, 17 headings.
Fivos Contact Enrichment
Contact-level enrichment. Self-sufficient - every provider call happens inside this skill, no delegation to other skills.
Hard rules
- Self-sufficient. This skill calls Find Email MCP and BetterContact MCP directly. It does NOT call
bettercontact-phoneor any other skill. Every external call here is its own MCP invocation. - Email first, phone only when requested. Phone enrichment is ~10x the cost - do not run by default. Only if the play shape (from
fivos-campaign-strategist) includes a phone channel. - Verification is mandatory on every email before it reaches the copywriter. Undeliverable and catch-all-not-safe are dropped.
- Stop on deliverable. Once a contact has a deliverable or catch-all-safe email, downstream providers are not called on that contact. Saves 50%+ of waterfall spend.
- Per-column provenance is written to the CSV for every enriched field.
Inputs
- Contact CSV from
fivos-contact-sourcing(required). - Enrichment columns requested - typically
email, optionallyphone. - Budget ceiling (optional).
- Tier column (optional) - if present, allow different waterfall aggression by tier (A runs full waterfall, B/C cut off earlier).
Outputs
- Contact CSV with added columns:
email, email_status, email_source, email_verified_at, phone, phone_source, phone_verified_at. - Verification status per email (
deliverable,catch_all_safe,catch_all_not_safe,undeliverable,unknown). - Per-contact cost ledger.
- Coverage report.
Providers + MCPs
| Provider | MCP prefix | Status |
|---|---|---|
| Find Email (Findymail) | mcp__findymail__* | To be wired |
| BetterContact | mcp__bettercontact__* | To be wired |
| Zerobounce (verification) | mcp__zerobounce__* | To be wired |
Until the MCPs are registered, fall back to each provider's REST API via Bash + curl with API keys in env (FINDYMAIL_API_KEY, BETTERCONTACT_API_KEY, ZEROBOUNCE_API_KEY).
Workflow
Step 1 - Cost estimate + Gate
Contact enrichment estimate - <client> / <campaign>
Contacts: N
Columns: email, [phone]
Waterfall depth:
- Tier A: full (Find Email → BetterContact bulk)
- Tier B: Find Email only
- Tier C: Find Email only (single pass, no fallback)
Projected cost (assuming typical hit-rate cascade):
- Email: $X
- Phone: $Y (if requested)
Total: $X+Y
Proceed? Manager approval required if over budget.
Step 2 - Email waterfall
See waterfall.md for canonical order, stop-conditions, and per-provider batch sizes. High-level:
- Find Email MCP first (cheapest, highest pre-verified hit rate).
mcp__findymail__find_emails({
contacts: [
{ full_name: "<name>", domain: "<domain>" },
...
]
})
- BetterContact bulk for any contact that Find Email missed. BetterContact is async - poll until done.
mcp__bettercontact__bulk_enrich({
contacts: [
{ full_name: "<name>", domain: "<domain>", linkedin_url: "<url>" },
...
],
enrich_phone_number: false
})
# returns { id }
mcp__bettercontact__get_result({ request_id: <id> })
# poll every 30s until state == "done", typically 30-120s (up to 10min)
Stop on deliverable or catch_all_safe per contact.
Step 3 - Verify every email
Run Zerobounce on every email returned that isn't already pre-verified by the source.
mcp__zerobounce__validate_email({ email: "<addr>" })
Drop undeliverable and catch_all_not_safe. Keep deliverable and catch_all_safe (only for domains on the client's safe catch-all allow-list).
Update email_status per contact. Only rows with deliverable or catch_all_safe flow to the copywriter.
Step 4 - Phone waterfall (only if requested)
Same self-sufficient pattern. Gate explicitly on approval before running - phone is expensive.
mcp__bettercontact__bulk_enrich({
contacts: [...],
enrich_phone_number: true
})
See waterfall.md for phone provider order.
Step 5 - Coverage report
Email coverage - <client> / <campaign>
Contacts in: N
Deliverable: X (X%)
Catch-all safe: Y (Y%)
Undeliverable / dropped: Z (Z%)
By tier:
- Tier A: X% deliverable, Y% catch-all-safe
- Tier B: ...
- Tier C: ...
Phone coverage (if requested):
- Mobile found: X (X%)
- Landline only: Y
- None: Z
If Tier A email coverage is below 70%, investigate before handing off - usually a persona / domain issue from upstream.
Step 6 - Upload + handoff
Write enriched contacts to the internal DB with full provenance. Hand off to fivos-lead-scoring (if not already scored at account level) or directly to fivos-copywriter.
Cost controls
- Always stop on deliverable. Do not run later providers "for comparison" - it wastes credits.
- Skip verification when the provider returns a pre-verified email. Providers that return
verification: verifieddo not need a Zerobounce pass. - Cap waterfall depth by tier. Tier C contacts do not justify a full waterfall.
Sub-files
- waterfall.md - canonical order, stop conditions, per-provider cost + quirks, MCP call syntax per step.
References
~/.agents/skills/gtm-meta-skill/provider-playbooks/bettercontact.md~/.agents/skills/gtm-meta-skill/provider-playbooks/zerobounce.md
Files bundled with it
These load only when the skill asks for them, so they cost nothing until it runs.
Other skills for the same job
Different authors, same problem. Matched on the words in the skill name, across every library in the catalogue except this one.
- lead-enrichment by janskuba · 199
- data-enrichment-integration by louisblythe · 136
- lead-enrichment by chadboyda · 74
- trade-show-contact-finder by LensmorOfficial · 48
- data-enrichment by NEON-Rutger · 45
- contact-qualification-framework by medscout-gtm · 6
- company-enrichment by Frontal-so · 4
- people-enrichment by Frontal-so · 4
Need help setting it up?
This page tells you what fivos-contact-enrichment does and what it needs. Cheetah builds the agent setup it runs inside: data, CRM, sequencing and the guardrails.
Book a call →The directory stays free. There is nothing gated behind this.