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.
Why better-mcp-notion?
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
Tools
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
No FAQ yet. Enrichment fills this from the README on the next crawl.
No tool list yet. Remote servers get one after the first health check.
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.
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.
` })
Update a page (edit the output from read)
write({ markdown: `
---
id: abc123-def456
title: Updated Title
properties:
Status: Done
---
## New content
Body replaces all existing blocks.
` })
Append content to an existing page
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.