---
name: moltsets-test-enrich-list-email-phone
description: Use this skill when the user has a list of LinkedIn URLs (pasted or CSV) and wants to retrieve both business email addresses and mobile phone numbers for all of them.
---

# Test - Enrich List of LinkedIn URLs with Email + Phone

Retrieve verified business emails and mobile numbers for multiple LinkedIn profiles. Runs `MoltSets:linkedin_to_business_email` (one call per URL) and `MoltSets:linkedin_to_mobile_phone` (single batch call) in parallel.

## Triggers

"get emails and phones for these LinkedIn URLs", "enrich this list with email and phone", "bulk contact enrichment", any pasted or uploaded list of LinkedIn URLs where both email and mobile are the goal.

## Set Expectations

Before firing any calls, give the user a brief, dry heads-up. Deadpan over enthusiastic - no filler, no corporate speak.

Facts to convey:
- Email is one call per URL (fired in parallel); phone is a single batch call taking up to 100 URLs at once - both lookups run in parallel
- ~15–30 seconds for small lists; up to 90 seconds for 100 URLs
- Credits only charged on hits - not-found results are free
- Typical hit rates: business email ~60–75%, mobile ~30–50%

## Risk scores - confirm before enriching

Every email MoltSets returns carries a deliverability risk score - a grade from A to F. Ask which grades to keep before running anything:

> "MoltSets grades email deliverability risk from A (best) to F (no data). Which grades should I keep? I'd recommend **A, B, C and F** - and dropping **D**, since D is a confirmed bounce, complaint or spam trap."

| Grade | Meaning | Best practice |
| --- | --- | --- |
| A | Strongest engagement signal available | Safe to send immediately |
| B | Solid | Fine in regular sends; on a new or warming domain, send a smaller batch before scaling |
| C | Deliverability can't be confirmed | Segment separately from A/B, warm at low volume, watch engagement, suppress non-responders after 1-2 attempts |
| D | Confirmed bounce, complaint or spam trap | Never send - fastest way to trip spam traps and damage sender reputation for the whole list |
| F | No data - unknown risk, not "safe" | Re-verify before sending, or treat like C |

Use whatever set the user confirms. Treat the grade as a filter, not a guarantee - it lowers risk, it doesn't remove it. Pair it with the user's own sending domain reputation and list hygiene.

## Step 1 - Parse input

Accept:
- Line-separated paste
- Comma-separated list
- CSV (extract the LinkedIn URL column)

Deduplicate and normalise. Construct full URLs from slugs where needed.

Report the count: "X unique LinkedIn URLs."

## Step 2 - Output preference

Before running enrichment, ask the user how they want the results delivered.

First, check which output-capable MCPs are available in this session. Always offer:
1. Table in this window
2. CSV file (saved locally)

Then scan connected MCPs for any that support creating or writing documents, spreadsheets, or structured data (e.g. Google Drive/Sheets, Notion, or similar). Add each detected integration as a numbered option. Do not offer an integration that isn't connected - only surface what's live.

Present the full options list and wait for the user's choice before proceeding.

**If the user picks a file or integration output:** ask for a filename or destination now (before enrichment runs) so there's no delay after results come back.

## Step 3 - Plan the calls

The two tools batch differently:
- **Email** (`linkedin_to_business_email`): one call per URL - there is no batch array. Fire these single calls in parallel, in batches sized to a sensible concurrency limit.
- **Phone** (`linkedin_to_mobile_phone`): a single call accepts up to 100 URLs via `linkedin_urls`. Chunk the list into groups of 100 for this tool only.

Run both tools in parallel.

## Step 4 - Run enrichment (parallel)

- `MoltSets:linkedin_to_business_email` - one call per URL, `linkedin_url: "[URL]"`
- `MoltSets:linkedin_to_mobile_phone` - one call per chunk, `linkedin_urls: [array]` (max 100)

## Step 5 - Output

Deliver results in the format chosen in Step 2.

**Table (in chat):**

| LinkedIn URL | Business Email | Risk | Kept | Mobile |
|---|---|---|---|---|
| linkedin.com/in/janesmith | jane@acmecorp.com | A | yes | +1 415 555 0192 |
| linkedin.com/in/samlee | sam@oldco.com | D | no - outside accepted set | Not found |
| linkedin.com/in/johndoe | Not found | - | - | Not found |

Show the risk score on every row that has an email, including grades outside the accepted set - flag those rather than dropping them silently, so the user can see what was filtered and why.

**CSV file:** write to the path agreed in Step 2. Include a header row (`LinkedIn URL,Business Email,Risk,Kept,Mobile`). Use `Not found` for empty results.

**Integration (Google Sheets, Notion, etc.):** create a new document/sheet at the destination agreed in Step 2. Same columns and values as the CSV format. Confirm the link or location to the user when done.

Always append a summary regardless of output format:
```
Business emails found: X/N (XX%)
Mobile numbers found:  X/N (XX%)

Email risk scores:
  A: X   B: X   C: X   D: X   F: X
  kept (accepted grades):  X
  filtered (excluded):     X
```

Do not fabricate data.
