Skip to Content
CoursesMCP courseScraping & custom

Module 08 · Scrape, local and chaining

Outcome: the last three tools covered, four chains you can run today, and one rule that decides the order every step goes in.

Surface
MCP server
Level
Beginner
Uses
scrape_emails_from_websitescrape_phones_from_websitegoogle_maps_listings
Credits
~1.3 for the examples, ~33 for a full chain
Prerequisite
Modules 01–07

Tools in this module

ToolCostRequired inputReturns
scrape_emails_from_website0.5urlPublished email addresses
scrape_phones_from_website0.5urlPublished phone numbers
google_maps_listings0.3queryBusiness listings, optionally with reviews

That is 50 of 50. The tools catalogue is the reference for all of them.


Example prompts

scrape_emails_from_website

The URL is reduced to the site root before crawling, so a deep link works fine.

Use scrape_emails_from_website with url "acmedental.com". Return every address found, and tell me which are role addresses (info@, sales@, hello@) and which look like named people. Then verify_email on the named ones only.

Scraped addresses are published, not enriched — expect info@ and contact@. Pair with verify_email at 0.3 before sending, and prefer named addresses when the site publishes them.

scrape_phones_from_website

Use scrape_phones_from_website with url "acmedental.com". Return every number found with the page it appeared on. Then validate_whatsapp on any mobile-format number.

At 0.5 credits, this is the cheapest phone route on the server — module 03’s lookups are 12.

google_maps_listings

Use google_maps_listings with: - query "dental clinics" - location "Austin, TX" - include_reviews true - max_results 50 Return business name, website, phone, rating and review count. Sort by review count.

include_reviews scrapes each place detail page, so it is slower and richer. Leave it off when you only need names and websites.


Four chains worth saving

1 · Verified contact from a LinkedIn URL

For https://linkedin.com/in/janedoe: 1. linkedin_profile_enrich 2. find_work_email with organization_name from step 1 3. verify_email on the result — stop if undeliverable Return: name, title, company, email, status. Report credits used.

~2.3 credits.

2 · Account brief from a domain

For stripe.com: 1. enrich_linkedin_page with identifier "stripe.com" 2. find_company_techstack with domain "stripe.com" 3. find_company_website_traffic with domain "stripe.com" 4. company_product_launch with domain "stripe.com", details "last 12 months" Return a 150-word brief plus one reason they would care about us.

~3.5 credits.

3 · Warm list from a post

1. linkedin_post_commenters, post_url <url>, sort_order "Most recent" 2. Filter to VP/Head/Director titles at 51-500 employee companies. Drop the rest before spending anything. 3. First 25 survivors: find_work_email, then verify_email. Skip anyone with no result — do not guess. Return a table with name, title, company, email, status.

~33 credits for 25 verified contacts.

4 · Local list from Google Maps

1. google_maps_listings, query "dental clinics", location "Austin, TX", max_results 50 2. For the 20 with the most reviews: scrape_emails_from_website on each website 3. verify_email on every named address found Return: business, website, email, status, review count.

~13 credits — 0.3 to source the 50, 10 to scrape 20 sites, the rest verification.


The ordering rule

Source

One search tool produces the rows. Cheap per row, and it decides everything downstream. A bad list cannot be rescued by good enrichment.

Filter

Free. It happens in the model’s context on data you already paid for. Every row cut here is a row you do not pay to enrich.

Enrich

find_work_email at 1, verify_email at 0.3, enrich_person at 1. The expensive steps, running last, on the shortest possible list.

Report

“Report credits used at the end.” A chain that quietly dropped half its rows looks identical to one that worked.

Chains that cost too much are almost always chains where step 3 ran before step 2.


Workflow prompts

The full shape: SyncGTM sources and verifies, another system stores or sends.

Local list straight into a Google Sheet

  • source the businesses
  • scrape their sites for contact details
  • verify, then write the sheet
1. google_maps_listings — query "dental clinics", location "Austin, TX", max_results 50. 0.3 credits for the search. 2. Drop any listing with no website. Rank the rest by review count. 3. For the top 20: scrape_emails_from_website and scrape_phones_from_website — 1 credit per business. 4. Split addresses into named (first.last@) and role (info@, hello@). verify_email on the named ones only. 5. Write to a new Google Sheet "Austin dental — <today>" with columns: business, website, named email, status, role email, phone, rating, reviews. Leave cells blank where nothing was published — do not guess.

Fill the gaps a CRM import left behind

  • find records with no contact route at all
  • try the company website before anything paid
  • write back only what verified
1. Pull Attio companies with no associated contact and no phone on record. 2. For each domain: scrape_emails_from_website, then scrape_phones_from_website. 1 credit per company — confirm the total. 3. verify_email on any named address found. Skip role addresses. 4. Show me the diff table first: company, found email, status, found phone. 5. On my go-ahead, write the verified email and the phone to the Attio company record. Do not overwrite anything already there.

Enrich a conference exhibitor list overnight

  • take the exhibitor page
  • pull contactable details per exhibitor
  • hand back one ranked list
1. Here are 60 exhibitor domains from <conference>. 2. scrape_emails_from_website on each — 30 credits total, confirm first. 3. For any company where nothing was published, fall back to find_people_within_company with job_title ["Head of Marketing", "VP Marketing"], max_profiles 2, then find_work_email on those. 4. verify_email on everything found. 5. Return one CSV: company, domain, contact name if any, email, source (scraped or enriched), status. Tell me the coverage rate for each source.

Best prompting practices

  • Number the steps. A numbered list is a chain; a paragraph is a suggestion.
  • Put the cap in the step that spends. “The first 25 survivors”, not “the survivors”.
  • Write the stop condition. “Skip anyone with no result — do not guess” prevents invented emails.
  • Ask for the row count at each step. Silent drops are the most common failure in a long chain.
  • Split anything past six steps. Twelve steps in one message is where a model starts skipping filters.
  • Bracket with check_credits the first time you run a new chain.

Where this breaks

Long chains drift. Six steps is fine; twelve is not. Split and check the row count between messages.

If a chain finishes suspiciously fast and your balance has not moved, no tool ran. Re-prompt with “use the SyncGTM MCP server” and the tool names. Common issues has the rest.


Further automation

MCP Local & Site Scraper  is this module as a skill file — /mcp-local-scraper sources from Maps, scrapes the sites and verifies only the named addresses.

Every chain above exists as an installable skill file — already scoped to the right tools, filters and caps, triggered with a slash command. The eight SyncGTM MCP agents are this course, one per module. Check the library before writing your own.

Browse all GTM agents →


You have finished the course

All 50 tools, one example prompt each. What to do next:

You wantGo to
Full rep workflows built on these toolsAI for Sales Reps
Agentic builds — outbound, research, CRM repairAI-Powered GTM
The same outcomes as scheduled tablesSyncGTM 101
A team rollout with credit guardrailsAI for RevOps

Reference: Scrape Emails · Scrape Phones · Google Maps Listings · Tools · Prompting guide · Common issues