This is a submission for the Notion MCP Challenge
What I Built
I maintain a couple of open source projects on my own, and the worst part has never been writing code — it's the stuff around it. Going through new issues, deciding if something's a bug or a feature request, digging into the codebase to figure out what's actually wrong, and then sitting down to fix it. Half the issues end up sitting untouched for weeks because I just don't get to them.
So I built Ghost Maintainer. It turns Notion into an operations center for a GitHub repo, and handles most of the grunt work with AI. Here's what happens when someone opens an issue:
- It shows up in a Triage Queue in Notion
- Gemini reads the issue and classifies it — bug or feature, priority level, confidence score
- Bugs go to the Maintenance Backlog, features go to the Feature Backlog
- If auto-fix is on, it reads through the codebase, figures out a fix, and opens a PR
All I have to do is review the PR and merge.
If you've turned off auto-fix (or want to handle features), there's a CLI:
ghost_maintainer fix 3
ghost_maintainer implement 9
Same pipeline — reads the code, writes a fix, opens a PR.
Setting it up is one command from inside your repo:
curl -sL https://raw.githubusercontent.com/sbis04/ghost_maintainer/main/install.sh \
-o install.sh && \
bash install.sh && \
rm install.sh
You plug in your Notion, GitHub, and Gemini tokens, and it handles the rest — creates the databases, sets up GitHub secrets, pushes the workflows.
There's also a Dart MCP server that pairs with Notion MCP (@notionhq/notion-mcp-server). Hook both up to Gemini CLI or Claude, and you can interact with your backlog in plain English — triage stuff, investigate bugs, ship fixes. 5 tools, 2 resources, 2 prompts.
The Notion workspace
- Triage Queue — everything starts here, AI sorts it out
- Maintenance Backlog — bugs, with AI summaries and PR links
- Feature Backlog — feature requests, ready when you are
- Archive — done items land here with timestamps
- Project Vision Statement — tells the AI what matters to your project
Video Demo
Link to Code on GitHub
sbis04
/
ghost_maintainer
AI-powered junior partner for solo open-source maintainers
Ghost Maintainer
Solo maintainers wear too many hats. Ghost Maintainer takes over the repetitive parts — triaging issues, reading code, writing fixes, and opening PRs — so you can focus on the work that actually needs a human.
It uses Notion as an operations center. Bugs get triaged and fixed automatically. Features queue up until you're ready. Everything stays visible in Notion so you never lose track.
Built with Dart, MCP, Google Gemini, and the Notion API.
Getting Started
You'll need Dart (>= 3.7.0) and GitHub CLI installed.
Grab three API keys before you start:
What
Where
Notes
Notion token
notion.so/profile/integrations
See steps below
GitHub PAT
github.com/settings/tokens
Classic token,
repo + actions scopes
Gemini key
aistudio.google.com/apikey
Any project works
You can either follow the steps in the next section, or have a look at the demo video to learn more about the tool and get step-by-step instruction for installing Ghost…
Three main pieces:
-
ghost_maintainer_mcp/— Dart MCP server. 5 tools, 2 resources, 2 prompts. -
notion_setup/— CLI tool + the GitHub Action scripts. -
.github/workflows/— 4 workflows covering ingestion, triage, implementation, and archival.
The CLI installs globally via dart pub global activate straight from the repo — no need to publish to pub.dev.
How I Used Notion MCP
The whole system runs on two MCP servers working together.
Notion MCP (@notionhq/notion-mcp-server) is the foundation. It's what gives the AI access to the Notion workspace — searching databases, reading pages, creating content, appending blocks. Without it, the AI would be blind to what's going on.
Ghost Maintainer MCP sits on top of that. It's a custom Dart server that adds the maintenance-specific stuff — ghost_triage_issue, ghost_investigate_issue, ghost_deploy_fix. The prompts are written to use both servers together. The triage prompt, for instance, tells the AI to search for duplicates through Notion MCP before classifying, and to append its analysis notes to the Notion page afterward.
Ghost Maintainer also exposes a couple of resources that pull from Notion — ghost://vision grabs the Project Vision Statement, and ghost://backlog/summary aggregates stats across all the databases. These save the AI from having to navigate the workspace manually every time.
Everything lives in Notion. The Triage Queue, backlogs, and archive are all databases with properties like Stage, Priority, Labels, AI Summary, and PR URL. The Vision Statement is a regular Notion page — update it and the AI adjusts. If you write "security issues are always P0" in there, that's exactly what happens.
PRs link back to the Notion page. When they get merged, the item auto-archives with a date.
The GitHub Actions pipeline handles the automated side (new issue triggers triage, etc.), but the MCP layer is what makes it interactive. Connect both servers to Gemini CLI and you get conversations like:
You: "What's in the backlog?"
AI: [uses ghost://backlog/summary] "3 bugs, 2 features..."
You: "Any duplicates for the dark mode request?"
AI: [uses Notion MCP search] "Found a similar one from last week."
You: "Triage the login crash"
AI: [uses ghost_triage_issue] "Bug, P1-High."
You: "Fix it"
AI: [uses ghost_investigate_issue + ghost_deploy_fix] "PR #15 created."
The thing I like about this is that Notion ends up being the shared workspace for both me and the AI. I open Notion and see what's going on. The AI checks the same workspace through Notion MCP. Same board, same data, no surprises.




Top comments (6)
Bro this is really cool, I did something similar using notion and Github but made a pipeline stuff
Good App!❤️
This is a profound shift in how we think about "Human-AI collaboration" in open source. Most AI tools treat the codebase as the only source of truth, but you’ve recognized that the intent—the project’s vision, priorities, and maintenance philosophy—is actually stored in the maintainer's head. By using Notion as that "Vision Layer," you’ve given the AI a pre-frontal cortex.
Notion as the AI’s "Ethos"
I love the idea of the Project Vision Statement in Notion. In most autonomous systems, the AI is a black box that categorizes issues based on generic training data. By having it read a live Notion document first, you’ve created a dynamic alignment loop. If you decide the project is moving from a "Feature Push" to a "Stability Phase," you don't rewrite code; you update a Notion page. The AI’s "reasoning logic" changes instantly because its reference signal has changed.
The Asymmetry of Triage
Solo maintenance is a battle against cognitive entropy. Every new issue is a data packet that requires decompression (reading), contextualizing (is this a bug?), and routing. By automating the "Triage Queue" into the "Backlog" with confidence scoring, you’re essentially pre-processing the noise. Even if the AI doesn't open the PR, having it summarize the "Why" in a Notion property saves you that initial 15-minute context switch.
MCP as the Conversational Bridge
Exposing the backlog and vision as MCP resources (ghost://vision) is a brilliant architectural move. It turns the "Operations Center" in Notion into a queryable API for conversational models. You aren't just looking at a dashboard; you're dialoguing with your project's current state. It moves the maintainer from "Worker" to "Orchestrator," where you can ask, "What’s the most critical bug aligned with our current stability phase?" and get a grounded answer.
A Reflective Thought
I wonder if the next evolution is a "Knowledge Transfer" layer? If the AI fixes a bug, it could write a "Post-Mortem" back into the Notion Archive, explaining not just what it changed, but why the bug existed in the first place based on the codebase patterns it read. It turns every fix into a long-term documentation asset.
Really impressive use of Dart and MCP to close the loop between GitHub and Notion. This is exactly the kind of "Junior Partner" every solo dev needs to avoid burnout.
Curious about the confidence threshold for auto-fix PRs — does Gemini ever misclassify a feature request as a bug and generate a patch for something that isn't broken?
Some comments may only be visible to logged-in visitors. Sign in to view all comments.