DEV Community

juvet manga
juvet manga

Posted on

I Built a Notion MCP Job Alert Bot to Help My Designer Brother Find Work online from a developing country

(I made this post intially for the Notion MCP challenge but since it is more storydriven I prepared another version to submit and use this one to share to the community, with my back story for building my tool Nancy. Sorry in advance if at some point it sounds like an ad for Notion MCP) - Read the short version here

There's a version of this story where I talk about architecture patterns and API design. I'll get there. But first, let me tell you why this project exists.

My brother is one of the most talented designers I know. We live in Cameroon, work together at a startup that doesn't pay enough yet, and needed side gigs to survive.

  • We tried Upwork but payments aren't supported in our country, so your earnings just sit there, locked, visible but untouchable.
  • We tried Fiverr but my brother's account got blocked immediately after we landed our first client, no warning, no reason given. He tried to verify his identity with his national ID card and couldn't, because Fiverr only accepted passports at the time (even though they'd accepted ID cards before). Support never replied by the way.

We spent over two months living on less than $100. Combined.

I decided to stop waiting for platforms to decide our fate. I built Nancy (named after my niece), a service that scrapes Dribbble for new design job postings and sends us a Telegram alert the moment one appears.

The idea was simple: my brother would see job postings before almost anyone else in the world. An edge, however small.

Sad part though, It didn't land us a job (despite being very useful). Most positions required US (or Europe) residency or full-time availability, which we couldn't offer. Hopefully we had a gig with a local company that paid enough for a while.

Anyway it was worth every line of code. I enjoyed fighting fate alongside my brother.

TL;DR: I built a Python bot called Nancy that scrapes Dribbble
job listings and sends Telegram alerts. After adding Notion MCP,
Notion became both the config layer (live settings) and the data
layer (job pipeline tracking). Full source on GitHub.


What Is Nancy? (A Notion MCP-Powered Job Alert Bot)

How It Scrapes and Alerts in Real Time

Nancy is a Python bot that:

  1. Scrapes Dribbble job listings on a schedule
  2. Summarizes each job description using HuggingFace's facebook/bart-large-cnn model
  3. Sends a formatted alert to a Telegram channel with one-tap apply buttons
  4. Tracks everything so the same job is never sent twice

The stack is intentionally lean: Python, FastAPI, BeautifulSoup, and Notion MCP for state management and configuration.

Telegram channel with Nancy job alert bot

Before Notion, Nancy stored state in flat JSON files and had zero configuration — to change anything you had to redeploy. It worked, but it was not practical.

Hacker note: I used a very interesting tip to get my service working live without ever paying anything. What I did was to use Render.com hosting service to host my app as a web app (Not background or CRON jobs!! These are billed services) and deploy it with an endpoint allowing me to trigger scraping. Then I created an account on the tool Uptime Robot, where I set it to hit my endpoint after every 15 minutes, this way it makes the service stay alive and always act like a live monitoring service.
It is also possible to create a background task service on Render but it's paid, I opted for this free workaround instead (it's got its limitations too but works pretty fine for personal usage). Share me your reviews if you try this tip! 🤓

Video Demo

Using Notion MCP as a Control Plane (Not Just a Destination)

The Notion MCP integration transforms Nancy from a one-trick scraper into a bidirectional job intelligence system. Notion is now both the control plane (Nancy reads its instructions from Notion) and the data layer (every job Nancy finds lives in Notion with full status tracking).

The Config Database: Live Settings Without Redeployment

Most tutorials on Notion MCP show it as an output layer. Nancy flips that.

Notion dashboard with config settings

Nancy reads a live config from a Notion database on every single run:

Setting Example Value Effect
keywords designer, UX, product Only alert on jobs matching these terms
job_types Full-time, Contract Filter by employment type
max_pages 3 How many Dribbble pages to scrape per run
active true / false Kill switch — pause Nancy without touching code

Want to focus only on freelance roles this week? Edit one cell in Notion. Want to pause Nancy while you're away? Flip active to false. No redeployment, no code changes, no terminal.

`# Nancy reads this on every trigger
config = notion_tracker.get_config()

if config.get("active", "true").lower() == "false":
return {"status": "paused", "detail": "Nancy is paused via Notion config."}

max_pages = int(config.get("max_pages", 2))
keywords = [k.strip().lower() for k in config.get("keywords", "").split(",") if k.strip()]`

The Jobs Database: A Full Application Pipeline in Notion

Notion table with job postings

Every new job Nancy finds is saved to a Notion database with full metadata:

  • Job Title, Company, Location, Job Type
  • Status — New → Notified → Reviewing → Applied → Archived
  • URL — used for deduplication (no more duplicate alerts)
  • Summary — the HuggingFace-generated summary
  • Date Found — when Nancy discovered it
  • Telegram Sent — checkbox confirming the alert was delivered

The Pipeline Board view turns Notion into a job application tracker. You see every opportunity at a glance, and you move cards as you progress. Nancy handles discovery; you handle decisions.

Notion Kanban view with job posts scraped by Nancy

The Full Flow: From Scrape to Telegram Alert

/trigger-scraper called
→ read config FROM Notion (active? max_pages? keywords? job_types?)
→ if active=false → return "paused"
→ load existing job URLs from Notion (deduplication)
→ scrape Dribbble up to max_pages
→ for each new job matching filters:
→ summarize via HuggingFace API
→ send Telegram notification
→ save to Notion (Status=New)
→ mark Telegram Sent → Status=Notified

New API Endpoints: /config and /jobs

Two new endpoints complete the picture:

GET /config — returns the live Notion config so you can verify what Nancy is running with:

{
"source": "notion",
"config": {
"keywords": "designer, UX, product",
"job_types": "Full-time, Contract",
"max_pages": "3",
"active": "true"
}
}

GET /jobs — returns all jobs stored in Notion, filterable by status. Falls back to local JSON if Notion isn't configured.

Tech Stack

  • Python 3.11 + FastAPI — web service and API
  • BeautifulSoup4 — Dribbble scraping
  • HuggingFace (facebook/bart-large-cnn) — job description summarization
  • python-telegram-bot — Telegram channel notifications
  • notion-client — official Notion Python SDK
  • Render — cloud deployment
  • Notion MCP — control plane + data layer

Why This Architecture Actually Matters

Notion as Source, Not Just Output

Most Notion integrations treat Notion as a destination — a place to dump output. What makes this different is that Notion is also the source. Nancy checks Notion before it does anything. That's the MCP model: your workspace becomes an operating surface, not just a display.

For us, concretely, this means:

  • My brother can adjust what kinds of jobs Nancy watches for without asking me to redeploy anything
  • Every lead is tracked in one place, not scattered across Telegram history
  • The pipeline view makes it obvious which opportunities are worth pursuing

Source Code

The full project is open source: github.com/juv85/Nancy-v2-alt

To run your own instance, clone the repo and set these environment variables:

TELEGRAM_BOT_TOKEN=
TELEGRAM_CHANNEL_ID=
HF_TOKEN=
NOTION_TOKEN=
NOTION_JOBS_DB_ID=
NOTION_CONFIG_DB_ID=

.env.example is included as a template.

What's Next: Toward an Autonomous Job Application Agent

I want to be honest: what Nancy does today with Notion is not yet even close to the full power of what MCP makes possible.

Anyway the vision is to build an autonomous job application agent.

With Notion MCP, the agent gains long-term memory. Not just a database of
scraped jobs, but a living context store with an overview of the user's
identity and metadata on jobs that matter to the user.

The agent this way will know what is relevant to highlight when drafting assets to apply, and also what to apply.

Thanks for reading

Juvet Manga


Extras:

Thanks for reading this far.
The story I shared is actually true and you can find my brother's portfolio, website and LinkedIn profile here:

If you want high quality work related to design especially in tech (UI/UX for mobile and web apps, Dashboards designs, Pitch-deck slides, brand design etc.) feel free to reach out - leperfectionniste123@gmail.com

📣 Need help with AI for your mobile app ?

As someone who's solved these challenges I offer technical consulting specifically for:

  • Building Custom Text classification and QA models for mobile apps
  • NLP model integration in React Native apps
  • Mobile-optimized AI architecture
  • AI project ideation and conception

I am also available for freelance gigs related to :

  • Mobile app development with React Native
  • Backend development with Django
  • Web apps development with React
  • CI/CD setup using Github Actions
  • n8n setup
  • AI automation Reach out here - mangajuvet87@gmail.com

Let’s connect:

Top comments (0)