Skip to Content
CoursesMCP courseLead sourcing

Module 02 · Find people

Outcome: a filtered list of profiles you have not paid to enrich yet, produced by the cheapest tool that fits the shape of your ask.

Surface
MCP server
Level
Beginner
Uses
find_peoplefind_people_within_companyfind_linkedin_from_work_emailfind_linkedin_from_personal_email
Credits
~7 to run every example once
Prerequisite
Module 01

Tools in this module

ToolCostRequired inputUse it when
find_people0.3 per resultNone — pass a filterYou want people across many companies
find_people_within_company0.3 flatdomainYou already know the one company
find_linkedin_from_work_email2emailYou have a work address and want the profile
find_linkedin_from_personal_email2emailYou have a personal address and want the profile

The two search tools look identically priced and are not. find_people bills 0.3 for every profile it returns, so a page of 25 is 7.5 credits and limit is the price dial. find_people_within_company is 0.3 flat, however many come back.

That is a 25× difference on the same question asked two ways. “CTOs at stripe.com” through find_people costs 7.5; through find_people_within_company it costs 0.3.


Example prompts

find_people — across companies

Filters stack. Role, company, size, location, tenure, education, skills, network and signals are all separate families — see the full parameter table.

Use find_people with: - current_titles ["VP Sales","Head of Sales","CRO"] - exclude_current_titles ["Sales Development Representative"] - seniority_levels ["vp","c_suite"] - current_company_headcount_ranges ["51-200","201-500"] - current_company_types ["Privately Held"] - industries ["Computer Software"] - person_countries ["United States"] - min_years_at_current_company 1 - has_verified_business_email true - limit 25 Return a table: name, title, company, location, linkedin_url. Do not enrich anything yet.

Paging is where spend runs away — cap it explicitly:

Same filters, get the next page using next_cursor. Stop after 2 pages and report credits used.

find_people_within_company — one known company

Use find_people_within_company with domain "stripe.com", job_title ["VP Engineering","Head of Platform","Director of Engineering"], company_name "Stripe", max_profiles 10.

Asking find_people for “CTOs at stripe.com” works but bills 0.3 for every profile returned. For one company, find_people_within_company is 0.3 flat and takes the domain directly. Same answer, a fraction of the cost.

find_linkedin_from_work_email — reverse lookup

Use find_linkedin_from_work_email with email "jane.doe@stripe.com". Return the LinkedIn URL only.

find_linkedin_from_personal_email — reverse lookup

Use find_linkedin_from_personal_email with email "jane.doe@gmail.com" and work_email "jane.doe@stripe.com" to improve match accuracy.

Batch it when you have a list, and cap it:

For these 10 addresses, run find_linkedin_from_work_email on each. Skip anything that returns nothing — do not retry. Return a table: email, linkedin_url, found yes/no.

Workflow prompts

Sourcing is rarely the whole job — the list has to come from somewhere and go somewhere. These are the shapes people actually send.

1 · Decision-makers for a list of companies

The most common lead-sourcing job. You have accounts; you need the sales, revenue and GTM owners at each.

  • take the company list
  • find the right titles at each one
  • stop before spending on emails
Use find_people_within_company on each domain below — 0.3 credits flat per company, not per profile. For each: job_title ["VP Sales","Head of Sales","CRO","VP Revenue", "Head of Revenue Operations","RevOps","Head of GTM","Chief Revenue Officer"], max_profiles 3, and pass company_name to disambiguate. Return one table: company, domain, name, title, LinkedIn URL. Mark any company where nothing came back. Do not enrich emails yet — I will pick who is worth it. <paste domains>

find_people_within_company takes a domain, not a company name and not a LinkedIn URL. If your list has names only, resolve them with enrich_linkedin_page first.

2 · Recently funded companies in construction and finance, North America

Funding is a timing signal. find_companies carries the date filters directly.

  • filter on industry, region and last raise
  • exclude the noise industries
  • keep it to one page
Use find_companies with: - industries ["Construction","Financial Services"] - exclude_industries ["Staffing and Recruiting","Business Consulting and Services"] - countries ["United States","Canada"] - last_fundraise_after "2026-05-01" - last_funding_round_types ["seed","series_a","series_b"] - employee_count_ranges ["51-200","201-500"] - limit 25 Return: company_name, primary_domain, employee_count_range, countries, last funding round and date. Stop after one page and report credits used.

Two things break this prompt if you change them: dates must be YYYY-MM-DD — “last three months” will not parse — and industries must be the exact LinkedIn industry string. “Finance” and “Fintech” are not values; “Financial Services” is. Copy from the industry reference list .

3 · Finance and fintech accounts, then the procurement-finance buyers

Two tools, in order: companies first, people second. Never the other way round.

  • source the accounts
  • find the finance and procurement owners inside each
  • review before enriching
Step 1 — find_companies with: - industries ["Financial Services","Banking","Capital Markets"] - categories ["fintech"] - countries ["United States","United Kingdom"] - employee_count_ranges ["201-500","501-1000"] - limit 20 Show me that list and stop. Step 2 — on my go-ahead, find_people_within_company on each domain with job_title ["Head of Procurement","Procurement Manager","VP Finance", "Head of Finance","Financial Controller","Head of Payments"], max_profiles 2. Return: company, domain, name, title, LinkedIn URL. No enrichment yet.

At 0.3 per company returned plus 0.3 flat per company searched, 20 accounts is about 12 credits before you spend anything on contact details.

4 · 50 restaurants in Sydney, with emails

Local businesses are not in a B2B database. Source them from Maps and scrape the sites — the tools live in module 08, the job is lead sourcing.

  • pull the listings
  • drop anything with no website
  • scrape published addresses, verify the named ones
1. google_maps_listings — query "restaurants", location "Sydney, Australia", max_results 50. 0.3 credits. 2. Drop every listing with no website. Tell me how many survived. 3. For each survivor: scrape_emails_from_website on its website — 0.5 credits each, so confirm the total with me before starting. 4. Split what comes back into named addresses (owner@, firstname@) and role addresses (info@, bookings@). verify_email on the named ones only. 5. Return a CSV: business, website, phone, named email, status, role email, rating, review count. Leave blanks where nothing was published — do not guess an address.

Expect gaps. Plenty of restaurants publish a booking form and no address at all — that is a real coverage limit, not a failed run.

5 · Companies on Shopify between $1M and $10M revenue

The reverse tech-stack search does not exist yet. find_company_techstack goes domain → stack. Stack → companies is on the coming soon list.

So you source on the filters that do exist, then confirm the stack per company and cut:

Step 1 — find_companies with: - min_revenue_usd 1000000 - max_revenue_usd 10000000 - industries ["Retail","Consumer Goods","Apparel & Fashion"] - countries ["United States"] - limit 50 Step 2 — for each domain returned, find_company_techstack — 1 credit each, so that is up to 50 credits. Confirm with me first. Step 3 — keep ONLY companies whose stack includes Shopify or Shopify Plus. Tell me the hit rate: how many of the 50 were actually on Shopify. Return: company, domain, revenue band, Shopify edition, other notable tools.

The hit rate from step 3 is the number worth writing down — it tells you whether your industry filter is aimed at the right segment before you scale the run.

6 · Excluding companies and profiles you already have

There is no exclude-by-domain parameter on find_companies, and no exclude-by-profile on find_people. Exclusion happens in two places instead, and only one of them is free.

In the tool — free, use it always:

ToolParameterDrops
find_companiesexclude_industriesWhole industries — agencies, staffing, consultancies
find_peopleexclude_current_titlesTitles you never sell to — interns, SDRs, students
search_linkedin_job_openingsexclude_recruiting_agenciesAgency-posted roles

In the conversation — for your own customers and open deals:

1. Pull every company domain already in HubSpot with a lifecycle stage of Customer, Opportunity or Disqualified. Hold that as my exclusion list. 2. find_companies — industries ["Financial Services"], countries ["United States"], employee_count_ranges ["201-500"], exclude_industries ["Staffing and Recruiting"], limit 100. 3. Drop every result whose primary_domain is in the exclusion list from step 1. Tell me how many were dropped and name them. 4. Return only the remaining companies.

For people, dedupe on the LinkedIn URL rather than the name — names collide, URLs do not:

Before enriching anyone: drop every profile whose LinkedIn URL already exists in Attio. Report the count dropped. Then enrich only what is left.

The dedupe step must sit above the enrichment step. Filtering costs nothing; running find_work_email on 40 people you already own costs 40 credits and teaches you nothing.


How to use it

Start narrow

Two or three filters, limit: 25. A broad filter set returns loose matches and you pay 0.3 credits for each one.

Read the output before tightening

If half the rows are agencies or recruiters, add exclude_current_titles or industries rather than filtering by hand afterwards.

Filter in the conversation

Cutting rows in the model’s context is free. Do it before any enrichment step.

Enrich only the survivors

Module 03 is the paid half. Ten survivors at 1 credit beats 200 rows at 1 credit.


Best prompting practices

  • Use the exact enum strings. c_suite, vp, director, senior for seniority_levels. “C-level” and “Vice President” are not accepted values.
  • Use domains, not company names. current_company_domains is exact matching; names are easy to get wrong.
  • Set limit deliberately on find_people. Every returned profile is 0.3 credits. Default is 25, maximum is 100 — a full page is 30 credits. find_people_within_company has no such dial; it is 0.3 whatever comes back.
  • Cap the paging. “Stop after 2 pages” is the single most useful sentence in a search prompt.
  • Exclude early. exclude_current_titles costs nothing and removes rows you would otherwise clean by hand.
  • Search first, enrich second. Always.

Where this breaks

A search with no filters still bills 0.3 credits per profile returned, and returns noise. If your prompt has no filter in it, the tool has nothing to match on.

find_people returns profiles, never emails or phones. If your prompt asks for “people with emails”, the client will chain into paid enrichment. Say “do not enrich anything yet” when you only want the list.


Further automation

MCP People Search  is this module as a skill file — /mcp-people-search picks the tool, maps your ask onto real filter names and caps the run.

Lead List Builder goes further: an ICP description in, a filtered and enriched list out.

Browse all GTM agents →


Next module

03 — Get contact details, turning these profiles into verified emails and, when it is worth 12 credits, a phone number.

Reference: Find People · Find People Within Company · Find LinkedIn From Work Email · Find LinkedIn From Personal Email