---
name: moltsets-find-and-enrich
description: Use this skill whenever the user wants to go from names (and optionally companies) directly to contact information - without LinkedIn URLs already in hand.
---

# Find and Enrich

End-to-end workflow: search contacts at each company, match people by name, then retrieve their contact data. Works for one person or a bulk list.

For name + company → business email, prefer `MoltSets:search_business_email_by_name` (one call, returns the email + matched LinkedIn URL). Otherwise use `MoltSets:search_people` to find people by name (filtering by company), then `MoltSets:linkedin_to_business_email`, `MoltSets:linkedin_to_best_email` (hybrid), `MoltSets:linkedin_to_personal_email`, and/or `MoltSets:linkedin_to_mobile_phone` to retrieve contact data.

## Triggers

"find the email for [Name] at [Company]", "get contact info for [Name]", "I have a list of names and companies, enrich them", "look up and enrich these people", or any request combining finding people AND getting their contact details in one go. Works for a single person or a bulk list of names. Use this instead of running find-person and enrich-contact separately when the intent is clearly to end up with contact data.

## Finding people

For a single name + company where you only need the business email, prefer `search_business_email_by_name` (`name` or `first_name`+`last_name`, plus `company` or `company_domain`) - one call returns the email and matched LinkedIn URL.

Otherwise use `search_people`, which searches by name and filters by company attributes. Params:

- `query` - free-text across full name, company, and title. Put the person's NAME or role keywords here to search by name.
- `company` - company name. `company_domain` - exact company domain (e.g. `acme.com`), no protocol. (The param is `company_domain`, not `domain`.)
- `seniority`, `industry`, `department`, `functional_area`, `country` - optional people filters (use the exact enum values; pick `department` or `functional_area`, not both).
- `limit` - default 10, max 25 per page. `offset` - pagination; increase to page deeper.

Each record returns `full_name`, `first_name`, `last_name`, `title`, `seniority`, `country`, `linkedin_url`, `business_email`, company data, and `_score`. When grouping a list by company, one `company_domain` search returns up to 25 contacts at that company, so a single search can cover several targets there - match each name against `full_name`.

## API rules for enrichment tools

- **Email tools** (`linkedin_to_best_email`, `linkedin_to_business_email`, `linkedin_to_personal_email`): pass a single `linkedin_url`. No batch array - fire one call per URL, in parallel where possible.
- **Phone** (`linkedin_to_mobile_phone`): pass `linkedin_url` for one, or `linkedin_urls` (array, max 100) for a list. This is the only tool that takes a batch array; do NOT send both.
- Credits only charged when data is found.

---

## Set Expectations

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

Facts to work with:
- Single person: name + company → email in one call (or search-and-match, then enrich), ~10–15 seconds (business email is often already in the search result)
- Bulk: one search per company (names grouped by company), match names against the returned records, then enrichment - email lookups are one call per URL in parallel; phone is a single array call. For lists spanning many companies, that's roughly one search per company plus enrichment on top
- For lists spanning 10+ companies, flag that the search phase will take a moment

## Single person workflow

### Step 1 - Resolve company domain
If the user gives a company name rather than a domain:
- Infer confidently for well-known companies (HubSpot to `hubspot.com`)
- For unfamiliar companies, ask the user for the domain

### Step 2 - Find the person and match the name
If you only need the business email, try `search_business_email_by_name` (name + `company_domain` or `company`) first. Otherwise call `search_people` with the name in `query` plus `company_domain` (preferred) or `company`, `limit: 25`. Then scan the returned records for the target name in `full_name`:
- **No match on first page** to page with `offset` (25, 50, …); if still nothing with `company_domain`, retry with `company`. Report what you tried.
- **One match** to take it.
- **Multiple plausible matches** to present options.

### Step 3 - Confirm the match
- **Unambiguous single match**: proceed directly to enrichment. Say: "Found Jane Smith, Head of Marketing at Acme Corp - pulling her contact info now..."
- **Multiple matches**: present as a numbered list (Name | Title | Company | LinkedIn URL) and ask the user to pick one

### Step 4 - Enrich and present
If the matched record already carries `business_email`, that field is in hand without a call. Run the appropriate enrichment tools for anything still missing (see what-to-run table below). Present as a contact block:

```
Jane Smith - Head of Marketing, Acme Corp
LinkedIn: https://www.linkedin.com/in/janesmith

Business email: jane@acmecorp.com (validated 2024-11-03)
Personal email: Not found
Mobile: +1 415 555 0192
```

---

## Bulk workflow (list of names)

When the user provides multiple names (pasted list, CSV, etc.):

### Step 1 - Parse the input
Extract rows into: Name | Company (or domain). Infer domains for well-known companies. Flag any rows where the company is unknown and you can't infer a domain - ask the user to fill these in, or skip them. Group names by company so each company can be searched once.

### Step 2 - Confirm before running
Tell the user: "I have X people across Y companies to look up. I'll search each company, match names, auto-select the best match, and enrich. This may take a moment." Wait for confirmation before proceeding.

### Step 3 - Search per company
For each company (not each person):
1. Call `search_people` with `company_domain` (or `company`), `limit: 25`. Page with `offset` if the company has more than 25 contacts and a target name isn't yet found.
2. For each target name at that company, match against the returned records' `full_name`:
   - One match to take its `linkedin_url` (and `business_email` if present).
   - Multiple plausible matches to take the closest (name + seniority/title), note as "auto-selected".
   - No match after paging to mark that person "Not found".

Do not pause on individual matches during bulk processing - resolve automatically and flag anything uncertain in the final output.

### Step 4 - Bulk enrich
Once all LinkedIn URLs are resolved, enrich them. For email, fire one call per URL across the email tool(s), in parallel where possible. For phone, pass all the URLs as a single `linkedin_urls` array (up to 100) to `linkedin_to_mobile_phone`. Skip business-email enrichment for anyone whose `business_email` already came back in the search.

### Step 5 - Present results as a table

| Name | Company | LinkedIn URL | Business Email | Personal Email | Mobile |
|---|---|---|---|---|---|
| Jane Smith | Acme Corp | linkedin.com/in/janesmith | jane@acme.com | Not found | +1 415 555 0192 |
| John Doe | Initech | Not found | - | - | - |

Flag auto-selected rows. Summarise at the end: "Found LinkedIn profiles for X of Y people. Retrieved emails for X, phone numbers for X."

---

## What to retrieve

| User says... | Run... |
|---|---|
| "email" (unspecified) | `linkedin_to_best_email` (hybrid - business preferred, personal fallback) |
| "business email" / "work email" | `linkedin_to_business_email` only |
| "personal email" | `linkedin_to_personal_email` only |
| "phone" / "mobile" | `linkedin_to_mobile_phone` only |
| "contact info" / "everything" / no preference | `linkedin_to_business_email` + `linkedin_to_personal_email` + `linkedin_to_mobile_phone` |

## Edge cases

- If the user provides LinkedIn URLs directly (not names), skip to enrichment via the enrich-contact skill
- For bulk runs, group names by company and search once per company with `company_domain` (or `company`), matching names against the returned records via `query`; for a lone name + company, `search_business_email_by_name` resolves the email in one call
- For lists spanning many companies (50+), set expectations that the search phase will take time
- Never fabricate data - only surface what the API returns
