On this page
- Step 0 — install the MCP server once
- Step 1 — drop the list into Claude
- Step 2 — create a dataset and scrape
- Step 3 — run the four enrichers
- 3.1 — find_emails
- 3.2 — email_verify
- 3.3 — find_socials
- 3.4 — find_company_info
- Step 4 — export the CSV
- The cost sheet, exact numbers
- Step 5 — schedule it (optional)
- What this replaces
- Next steps
You have a list of 50 company URLs. A CSV from LinkedIn Sales Navigator, a crawl result from a conference site, a starter list a salesperson dumped in Slack. By tomorrow morning, you want a row per company with a verified email, a LinkedIn URL, basic company info, and a source link. No spreadsheet acrobatics, no Clay workflow, no third-party vendor spraying your list into four Hunter-adjacent databases.
This tutorial walks through building that pipeline inside a Claude Desktop conversation, using the Stekpad MCP server and four of our 19 native enrichers. We will go from raw URLs to an exportable CSV in one session. Every prompt below is something you can paste directly into Claude. Every number is real.
Time and cost budget, up front. 50 URLs through scrape plus four enrichers is 50 credits for the initial scrape, 4 credits per row for the enrichment pass (1 credit per enricher per row), 200 credits for enrichment. Total: 250 credits. That is about 1.25 euros on our 2,000-credit pack. End-to-end wall clock: 6 to 12 minutes, mostly spent on the scrape phase because enrichment is parallel.
Step 0 — install the MCP server once
If you have not wired Claude Desktop to Stekpad yet, do it first. Open your Claude Desktop config, usually at ~/Library/Application Support/Claude/claude_desktop_config.json on macOS, and add:
{ "mcpServers": { "stekpad": { "command": "npx", "args": ["-y", "@stekpad/mcp"], "env": { "STEKPAD_API_KEY": "stkpd_live_..." } } }}Restart Claude Desktop. You should see Stekpad tools appear in the MCP indicator. If you are on Cursor or Claude Code, the MCP setup guide has the equivalent config blocks.
Grab your API key from the dashboard at /pricing if you do not have one yet. The free tier gives you 300 credits a month, which is enough to run this whole tutorial with 50 credits to spare.
Step 1 — drop the list into Claude
The first prompt is about loading, not enriching. You want Claude to understand the shape of what you are bringing in before it starts calling tools.
I have a list of 50 company URLs I want to enrich. I will paste them below. For each URL, I want: the company name, a primary email address I can contact, a LinkedIn company URL, and basic company info (employee count, headquarters, industry). Do not call any tools yet. Just confirm you see the list.
Paste the URLs, one per line. Claude will echo back what it sees and wait. This is deliberate. You do not want the model to run off and scrape 50 pages before you have confirmed the list is correct.
Step 2 — create a dataset and scrape
The next prompt kicks off the scrape pass.
Please create a new Stekpad dataset called "enrichment-pipeline-apr14". Then scrape all 50 URLs into that dataset. Use formats ["markdown", "json"]. Return the run ids and the dataset id when you are done. Stop there, do not enrich yet.
Claude will call scrape 50 times. Under the hood each call looks like this:
curl -X POST https://api.stekpad.com/v1/scrape \ -H "Authorization: Bearer stkpd_live_..." \ -H "Content-Type: application/json" \ -d '{ "url": "https://example.com", "formats": ["markdown", "json"], "dataset_id": "ds_01HP71..." }'Each call is 1 credit, each call is sync under 60 seconds, and Claude will run them in parallel up to the tool concurrency limit. 50 scrapes typically finish in about 3 to 6 minutes.
The response shape Claude reads back is:
{ "run_id": "run_01HP71KX7Q", "url": "https://example.com", "status": "succeeded", "markdown": "# Example Co\n\nWe build...", "json": { "title": "Example Co", "description": "We build..." }, "dataset_id": "ds_01HP71...", "credits_charged": 1}At the end Claude will tell you something like "50 scrapes succeeded, dataset ds_01HP71... now has 50 rows, 50 credits charged". If a URL failed, Claude will list it and you can decide to re-try or skip.
Step 3 — run the four enrichers
This is where the native enrichment surface earns its keep. Stekpad ships 19 enrichers. For this pipeline we are using four.
3.1 — find_emails
find_emails scans the scraped page and any linked contact or about pages to return one or more email addresses, with a confidence score per hit. 1 credit per row.
Run the findemails enricher on every row in dataset ds01HP71.... Return the rows where at least one email was found.
Behind the scenes Claude calls the enrich tool:
curl -X POST https://api.stekpad.com/v1/datasets/ds_01HP71.../enrich \ -H "Authorization: Bearer stkpd_live_..." \ -H "Content-Type: application/json" \ -d '{"enricher": "find_emails"}'The response adds an emails column to each row. Typical hit rate on a public corporate homepage is 60 to 80 percent, depending on how aggressively the site hides contact info. 50 rows times 1 credit is 50 credits.
3.2 — email_verify
Finding an email is not the same as proving it is real. email_verify does an MX check and an SMTP handshake without actually sending mail. It returns a status: valid, invalid, risky, or unknown. 1 credit per row.
Now run email_verify on the emails column for every row that has at least one email. Only keep the rows where status is valid.
You will lose some rows here. That is the point. A CRM full of unverified emails is a bounce rate waiting to happen. Better to ship 32 valid rows than 50 rows with 18 timebombs. 50 rows times 1 credit is another 50 credits.
3.3 — find_socials
find_socials parses the scraped markdown and JSON for social links and classifies them. We care about the LinkedIn company URL, but you also get Twitter, GitHub, YouTube, and a few others as a side effect. 1 credit per row.
Run findsocials on the remaining rows. Extract the linkedinurl as its own column.
The enricher returns a socials object:
{ "socials": { "linkedin": "https://www.linkedin.com/company/example-co", "twitter": "https://twitter.com/exampleco", "github": "https://github.com/exampleco" }}Claude will project out the linkedin_url column automatically if you ask it to. 50 rows times 1 credit is 50 credits.
3.4 — findcompanyinfo
The last enricher is find_company_info. It combines the scraped page text with a lookup against OpenCorporates and Companies House where available, and returns a structured company profile: name, headquarters, employee range, industry, founding year. 1 credit per row.
Run findcompanyinfo on the final set of rows. Include the employee_range, headquarters, and industry columns.
{ "company_info": { "name": "Example Co", "employee_range": "51-200", "headquarters": "Berlin, Germany", "industry": "SaaS / Developer Tools", "founded": 2019 }}At this point every surviving row has: URL, company name, verified email, LinkedIn URL, employee range, HQ, industry. That is the shape you wanted in Step 1.
Step 4 — export the CSV
Last prompt.
Export the final dataset as a CSV with these columns: url, companyname, email, linkedinurl, employee_range, headquarters, industry. Give me a download link.
Claude calls the export tool and returns a signed URL. The CSV lives in your workspace for 30 days (or longer on Cloud plans). Download it, import it into your CRM, ship your campaign on Friday.
The cost sheet, exact numbers
Here is the actual total for 50 URLs through this pipeline, assuming an 80 percent email hit rate and a 90 percent verification pass rate (typical for corporate homepages).
- Scrape 50 URLs: 50 credits
- find_emails on 50 rows: 50 credits
- email_verify on ~40 rows (the ones with emails): 40 credits
- find_socials on ~36 rows (valid email pass): 36 credits
- findcompanyinfo on ~36 rows: 36 credits
Total: 212 credits, around 1.06 euros on the 2,000-credit pack. Final output: ~36 fully enriched rows from a starting list of 50 URLs.
Compare to running the same pipeline through a third-party-vendor tool that charges per result from Hunter plus per result from Apollo plus per result from a clearout service. You are looking at $0.10 to $0.30 per row once all three vendors have billed you. On 50 rows, that is $5 to $15. And you are sending your list to three different companies in the process.
The economics of native enrichment are different from the economics of vendor brokerage. We run the enricher, we own the cost, you pay 1 credit. That is it.
Step 5 — schedule it (optional)
If this is a one-off, you are done. If you want this pipeline to run weekly on a fresh list, upgrade to a Cloud plan and wire the same dataset to a scheduled crawl. The same four enrichers can run on schedule via the dataset's enrichment recipe. You define the pipeline once, Stekpad runs it on a cron, the rows land in storage, you pull the latest CSV every Monday.
This is the one place in the product where cron is the right tool. The consumer is a human sales team on a weekly rhythm, not a live Claude session. For that shape, scheduled is correct. For the live case, stay on pull-time via MCP.
What this replaces
If you were going to build this in Clay, you would wire four third-party vendors (Hunter for emails, NeverBounce for verification, LinkedIn Sales Nav for profiles, Clearbit for company info), pay a subscription between $149 and $1,350 per month, and ship your list to four different data brokers along the way. See our Clay alternative post for the side-by-side.
If you were going to build this in Python scripts, you would write 400 lines of HTTP clients, rate limiters, retry logic, MX checking, and HTML parsers. You would spend two days debugging. You would not ship by Friday.
The MCP + Stekpad version is one conversation. You talk to Claude in natural language, the model calls tools on your behalf, the rows land in a dataset you own, the CSV drops into your downloads folder. That is the entire pipeline.
Next steps
- Read the enrichers feature page for the full list of 19 enrichers with credit costs.
- See the extract API reference if you want to go further with schema-based extraction.
- Compare approaches in our Clay alternative post before you commit.
- Check pricing — PAYG packs, 12-month credit expiration, no subscription required.