SAGE: The Notion MCP Academic Co-Pilot Built for Filipino Students Who Are Tired of Having 7 Tabs Open
This is a submission for the Notion MCP Challenge
notes in Google Keep. also in GDocs. also in Obsidian. also in Notion. tasks in Teams. also Google Classroom. also Canvas. also the blackboard in the room that gets erased before you can photo it — and if you did take a pic, you'd forget about it til it's too late anyway. rip bozo.
six, seven different apps, each going their own way, far from what I actually need. advanced studying? researching ahead? a completely different beast on top of all that chaos.
I'm a 2nd year BS CpE student at BulSU. my academic life was a mess. still kind of is. but I built SAGE anyway.
(college is shit. life is also shit. but at least the workspace builds itself now. probably.)
What I Built
your program, year, and semester. that's it. SAGE hooks into Notion via MCP, pulls your curriculum from Ghost Commons, and builds your entire workspace automatically.
Me: "I am a 2nd year BS CpE student, semester 1. Build my workspace."
SAGE: "We built your 2nd Year BS CpE — Semester 1 workspace! 🎉
- COE201 — Differential Equations
- COE202 — Engineering Data Analysis
- CPE201 — Discrete Mathematics
- CPE202L — Object Oriented Programming
- CPE203 — Fundamentals of Electrical Circuits
- CPE204L — Computer Aided Drafting
Each course has its own page with a Topics database and a Tasks database."
60 seconds. six course pages. topic breakdowns. task databases. done.
Ghost Commons — the Library of Alexandria
not the piracy site. and not the one that burned down. the noble one — the one that was supposed to hold all human knowledge.
Ghost Commons is a curriculum registry pre-seeded from official CHED CMO data. full topic sets, summaries, and study prompts for all six BSCPE Year 2 Semester 1 courses — structured, cached, and queryable. no scraping at runtime. no broken government links. no Cloudflare walls.
the spicy part: building this taught me exactly how painful Philippine education data is. some state universities follow CHED Memorandum Orders like a strict rulebook. others treat it more like... a suggestion. same course code, completely different content. same course name, different units. revisions on top of revisions, branches on top of branches. government websites: archaic, half behind Cloudflare, half with dead links.
normalization was its own beast — GE courses, electives, specific majors, shared majors, all overlapping across institutions. I now deeply understand the pain of anyone who's ever had to build an education system in this country.
Ghost Commons is the answer I built instead. deterministic. instant. no broken links. and it grows.
Video Demo
Show us the code
github.com/kuya-carlo/sage-mcp
the MCP server exposes tools to the agent:
"get_commons_tree" # fetch curriculum from Ghost Commons
"create_semester_tree" # build the actual Notion pages
"breakdown_task" # split overwhelming tasks into micro-steps
"get_weekly_load" # detect burnout-level weeks
"block_calendar_slot" # protect recovery time on calendar
"get_dismissed_blocks" # track dismissed burnout warnings
the agentic loop — every inference call replays the full conversation. every tool result. every message. the model's memory is too shite to do otherwise — keeping it all in the messages array is the footgun you accept to make agents work.
for iteration in range(max_iterations):
response = await call_model(messages, tools)
if response has tool_use:
result = await call_mcp_tool(tool_name, params)
messages.append(tool_result)
# loop again
else:
return response.text # done
the bug that haunted me until 1am: agent says BSCpE. database has BSCPE. SQL doing SQL things. query returned nothing. seeding kept retriggering.
fix:
program_code = program_code.upper()
one line. I want those hours back. 😭
How I Used Notion MCP
Notion MCP is the core of SAGE — not a wrapper, not an afterthought. every workspace action goes through it: creating the root page, spinning up course databases with full property schemas, inserting topic rows, querying workspace state for the load monitor.
the hardest part was making it stable at scale. building a full semester workspace means dozens of concurrent MCP calls — course pages, Topics databases, Tasks databases, individual topic entries — all in parallel. I implemented a global semaphore, persistent SSE connection pooling via an async context manager, and inter-course delays to keep the MCP server from choking.
what Notion MCP unlocks here is genuine multi-tenant isolation: every student authorizes their own Notion workspace via OAuth, and SAGE writes only to the pages they explicitly grant access to. tokens are AES-encrypted at rest. no shared state, no data leakage.
the result is a workspace that feels like it was built by hand — because structurally, it was. SAGE just does it in one shot.
Stack
- FastAPI — MCP server + Ghost Commons API
- Notion MCP — workspace orchestration
- Qwen2.5-Coder-32B via Vultr Serverless Inference (Thanks MLH)
- Supabase PostgreSQL — curriculum registry + token store
- Gaffa — CMO PDF scraping + extraction (THANKS MLH!!!)
- Docker + Podman — works on my machine AND in prod. probably.
- Cloudflare Tunnel — free HTTPS, no ingress pain
- asyncpg + Pydantic v2 — async all the things
Roadmap
- v1.1 — pgvector semantic search ("find courses related to embedded systems")
- v1.2 — Chrome extension LMS bridge (Google Classroom, Canvas, BulSU eLMS)
- v1.3 — Gmail scraper for GCash/Maya burn-rate dashboard
- v2.0 — Federated Ghost Commons with Tagalog/English bridges
built solo in under a week. 28 units. part-time job. submitted on hungarian sausages and chaos energy. 🇵🇭
college is shit. life is also shit. but at least the workspace builds itself now. probably.






Top comments (0)