DEV Community

Daniel Ainoko
Daniel Ainoko

Posted on

I Built a Cold Outreach Agent with Claude + Notion MCP

Notion MCP Challenge Submission 🧠

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]
Enter fullscreen mode Exit fullscreen mode

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 (fetch to https://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 Email 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:

  1. You create an empty Notion database yourself (takes 10 seconds)
  2. Copy the database ID from the URL into your config
  3. Run setup_notion_db once

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)