I Got Tired of Cold Outreach. So I Made Claude Do It.
This is a submission for the Notion MCP Challenge
What I Built
Cold outreach is one of those things everyone knows works — and almost nobody does consistently. Because it's exhausting.
To send one good cold email, you have to:
- Find a company that actually fits your skills
- Read their website and figure out what they're building
- Spot a pain point or a reason to reach out
- Hunt down a contact email
- Write something that doesn't sound like a template
- Send it
- Log it somewhere so you remember you did it
That's 30–45 minutes. Per company. And if you're serious about cold outreach, one email isn't enough. You need 10–15 a week to see results.
Do the math. That's a part-time job just for outreach.
So I built Cold Outreach MCP — a custom MCP server that turns Claude into a fully automated cold email agent. You paste your CV once. Claude does the rest.
Here's the actual flow:
You: "Here's my CV. Find companies that match my background,
research each one, show me your recommendations."
Claude: [scrapes, researches, thinks]
1. stripe.com → opportunity_pitch
"Checkout onboarding has visible friction — strong UX match"
2. linear.app → role_inquiry
"Fast-growing eng team, no clear gap but strong culture fit"
... up to 13 more
You: "Looks good. Send as recommended."
Claude: [generates tailored emails, sends them all, logs everything to Notion]
What used to take a full day now takes under 5 minutes.
The part that actually matters — the emails don't sound like a robot wrote them
Most "automation" tools skip the hardest part. They send templated garbage:
"Hi [First Name], I came across [Company Name] and I was really impressed by your innovative approach to [Industry]..."
Nobody replies to that. It goes straight to the bin.
Cold Outreach MCP reads the company's actual website before writing anything. It spots specific things — a clunky onboarding flow, a product expansion, a hiring signal — and writes something that references what it found:
"Noticed you're expanding into enterprise — that usually comes with a documentation problem. I've solved exactly this before. Worth a quick chat?"
That's an email someone opens. The tone rules are baked into the prompts: under 120 words, no buzzwords, short sentences, one real observation, one clear ask. It sounds human because it's explicitly told not to sound like an AI.
The 10 tools
| Tool | What it does |
|---|---|
setup_notion_db |
One-time migration — provisions all required columns in your Notion database |
parse_profile |
Extracts your role, skills, experience and strengths from CV text |
discover_companies |
Finds real, matching companies based on your profile — no manual URL input |
find_company_email |
Scrapes a company site to extract a contact email |
research_company |
Analyzes a company — summary, problems spotted, email type recommendation |
generate_email |
Writes a human-sounding outreach email tailored to the company |
send_email |
Sends via SMTP (Gmail, Outlook, anything) |
log_to_notion |
Logs an outreach record to your Notion tracker |
retry_failed |
Re-attempts any failed sends automatically |
bulk_outreach |
Full pipeline for up to 15 companies in one shot (two-phase: research → confirm → send) |
Video Demo
Show Us the Code
GitHub: github.com/TheCodeDaniel/reachout_mcp
Built with:
-
@modelcontextprotocol/sdk— MCP server -
@anthropic-ai/sdk— Claude with adaptive thinking for research + email generation -
axios+cheerio— website scraping and email extraction -
nodemailer— SMTP sending - Raw Notion REST API (
fetchtohttps://api.notion.com/v1/...) — reliable and direct - TypeScript, Node.js 18+, ES modules
How I Used Notion MCP
Notion is the memory layer of this entire system. Without it, you're flying blind.
Every outreach action — sent, failed, pending, replied — gets logged to a Notion database automatically, in real time, with zero manual input from you.
The database looks like this after a run:
| Company | Type | Status | Date Sent | Notes | |
|---|---|---|---|---|---|
| Stripe | hello@stripe.com | opportunity_pitch | sent | 2026-03-26 | full email body |
| Linear | team@linear.app | role_inquiry | sent | 2026-03-26 | full email body |
| Vercel | contact@vercel.com | opportunity_pitch | failed | 2026-03-26 | SMTP timeout |
No spreadsheet. No "I think I emailed them last week". No duplicate outreach because you forgot. Notion becomes your outreach CRM — built automatically, maintained automatically.
The Notion setup works exactly like a backend database migration
This was important to me. I didn't want users to manually create 7 columns with the right types and names every time they set this up. That's brittle and error-prone.
Instead:
- You create an empty Notion database yourself (takes 10 seconds)
- Copy the database ID from the URL into your config
- Run
setup_notion_dbonce
The tool calls PATCH https://api.notion.com/v1/databases/{id} directly and provisions all the required columns — renaming the default "Name" column to "Company", adding select fields with pre-configured options, URL fields, email fields, date fields. Everything.
It's idempotent. Run it again — nothing breaks, nothing duplicates. Exactly like prisma migrate or rails db:migrate.
What Notion MCP unlocks that nothing else does
The integration isn't just logging. It's the difference between outreach that goes into a black hole and outreach you can actually manage.
When someone replies, you update their status in Notion to "replied". When a send fails, the error message is right there in the Notes column. When you want to retry failed sends, retry_failed queries Notion for every row with status = failed and re-attempts them — automatically.
Notion becomes the source of truth. Claude acts on it. The loop closes.
Built by Daniel Ainoko — THECODEDANIEL
The grind is real. Automate the boring parts.
Top comments (0)