Config is the same across clients — only the file and path differ.
{
"mcpServers": {
"better-notion": {
"env": {
"NOTION_API_KEY": "ntn_your_api_key_here"
},
"args": [
"-y",
"better-mcp-notion"
],
"command": "npx"
}
}
}Are you the author?
Add this badge to your README to show your security score and help users find safe servers.
An MCP server that lets you operate Notion with a single Markdown document.
Run this in your terminal to verify the server starts. Then let us know if it worked — your result helps other developers.
npx -y 'better-mcp-notion' 2>&1 | head -1 && echo "✓ Server started successfully"
After testing, let us know if it worked:
Five weighted categories — click any category to see the underlying evidence.
No known CVEs.
Checked better-mcp-notion against OSV.dev.
Be the first to review
Have you used this server?
Share your experience — it helps other developers decide.
Sign in to write a review.
Others in productivity / writing
Dynamic problem-solving through sequential thought chains
Persistent memory using a knowledge graph
A markdown editor — and the bridge to your LLM. Local-first, MIT, ~15 MB. Bundled MCP server lets Claude Code / Codex / Cursor drive your vault directly. 14 AI providers BYOK.
Official Miro MCP server - Supports context to code and creating diagrams, docs, and data tables.
MCP Security Weekly
Get CVE alerts and security updates for io.github.ai-aviate/better-notion and similar servers.
Start a conversation
Ask a question, share a tip, or report an issue.
Sign in to join the discussion.
An MCP server that lets you operate Notion with a single Markdown document.
Existing Notion MCP servers are thin API wrappers that require multiple round-trips for a single operation. better-mcp-notion uses one Markdown document (YAML frontmatter + body) to read, create, and update pages in a single call.
| Traditional Notion MCP | better-mcp-notion | |
|---|---|---|
| Tools | 16-22 tools | 9 tools |
| Create a DB entry | 3+ calls (search DB, get schema, create page, append blocks) | 1 call |
| Edit a page | 4+ calls (get page, get blocks, delete blocks, append blocks) | 1 call (read, edit, write) |
| Format | Raw JSON blocks | Markdown |
| Context window | Heavy (tool definitions + JSON) | Light |
| Tool | Description |
|---|---|
read | Read a Notion page as Markdown with frontmatter. Supports recursive child page reading with depth. |
write | Create or update pages from Markdown. Supports batch operations and append/prepend. |
search | Search the workspace by keyword. Returns a Markdown-formatted list. |
list | List database records as a table or child pages as a list. Supports natural language filter & sort. |
update | Quick property update without rewriting content. Just pass page + key-value pairs. |
schema | View or modify database schema — add, remove, or rename columns. |
comment | Add or read comments on a page. |
delete | Archive (soft-delete) a page. |
move | Move a page to a different parent page or database. |
ntn_...)claude mcp add better-notion -- npx better-mcp-notion
Then set the environment variable:
export NOTION_API_KEY=ntn_your_api_key_here
Add to your MCP config file (e.g. claude_desktop_config.json, .cursor/mcp.json):
{
"mcpServers": {
"better-notion": {
"command": "npx",
"args": ["-y", "better-mcp-notion"],
"env": {
"NOTION_API_KEY": "ntn_your_api_key_here"
}
}
}
}
git clone https://github.com/ai-aviate/better-mcp-notion.git
cd better-mcp-notion
npm install && npm run build
Then point your MCP config to node /path/to/better-mcp-notion/build/index.js.
read({ page: "https://notion.so/My-Page-abc123def456" })
Returns:
---
id: abc123-def456
title: My Page
database: task-db-id
properties:
Status: In Progress
Tags:
- backend
---
## Notes
- Completed API design
write({ markdown: `
---
title: Meeting Notes
parent: "Project Alpha"
icon: "📝"
---
## Agenda
- Review progress
- Discuss next steps
` })
write({ markdown: `
---
title: Fix login bug
database: "Task Board"
properties:
Status: In Progress
Tags:
- backend
- urgent
Due Date: "2026-03-01"
---
## Description
Login fails when password contains special chars.
` })
write({ markdown: `
---
id: abc123-def456
title: Updated Title
properties:
Status: Done
---
## New content
Body replaces all existing blocks.
` })
Use position: "append" to add content to the end without rewriting the entire page.
Only the new content needs to be provided — existing content is preserved.
write({ markdown: `
---
id: abc123-def456
---
## New section
This is added to the end of the page.
`, position: "append" })
position: "prepend" adds content to the beginning instead.