Markdown-first Notion MCP server. ~6-7x fewer response tokens vs official Notion MCP. 43 tools.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
Markdown-first MCP server that connects AI agents to Notion.
Agents write markdown β easy-notion-mcp converts it to Notion's block API and back again.
43 tools Β· 24 block types Β· ~6β7Γ fewer response tokens vs official Notion MCP Β· Documented round-trip support
See it in action β Live Notion page created and managed entirely through easy-notion-mcp.

Contents: Comparison Β· Setup Β· CLI profiles Β· Config Β· Why markdown Β· How it works Β· Tools Β· MCP resources Β· Block types Β· Round-trip Β· Databases Β· Cookbook Β· Security Β· Stability Β· FAQ Β· Community
| Feature | easy-notion-mcp | Official Notion MCP (npm) | better-notion-mcp |
|---|---|---|---|
| Content format | β Standard GFM markdown | β Raw Notion API JSON | β οΈ Markdown (limited block types) |
| Block types | β 24 (toggles, columns, callouts, equations, embeds, tables, file uploads, task lists) | β οΈ All (as raw JSON) | β οΈ ~7 (headings, paragraphs, lists, code, quotes, dividers) |
| Round-trip support | β 24 block types, documented caveats | β Raw JSON requires block reconstruction | β οΈ Unsupported blocks silently dropped |
| Tools | 43 individually-named tools | 18 auto-generated from OpenAPI | 9 composite tools (39 actions) |
| File uploads | β
file:///path in markdown | β Open feature request | β 5-step lifecycle |
| Prompt injection defense | β Content notice prefix + URL sanitization | β | β |
| Database entry format | Simple {"Status": "Done"} key-value pairs | Simplified key-value pairs | Simplified key-value pairs |
| Auth options | API token or OAuth | API token or OAuth | API token or OAuth |
Reading a page's content costs about 6β7Γ fewer response tokens than the official Notion MCP server, because Notion's raw block JSON carries per-block metadata (block IDs, timestamps, author objects) that an agent reading for content never needs. Typically ~5β7Γ, ranging from ~3Γ on code-heavy pages to ~15Γ on rich pages, with β₯94% of the page's content preserved. Measured against the official raw-JSON server; roughly on par with other markdown-based servers.
The win is metadata omission, not encoding efficiency. At equal information the two formats cost about the same (the common intermediate-representation ratio is ~1.0β1.06Γ on fully represented page shapes, and 1.32Γ on typical prose), so the saving is the per-block metadata (block UUIDs, timestamps, author objects, annotation wrappers) that raw JSON carries and a content read never uses. Database queries show a similar ~7Γ win at full content completeness.
Methodology, per-class results, and every caveat: .meta/research/token-bench-results-2026-06-13.md (re-run via scripts/bench/lib/recompute-tiers.ts).
Create a Notion integration, copy the token, share your pages with it.
Claude Code:
This registers the server in your Claude Code user-level config (-s user) and passes NOTION_TOKEN directly to the MCP child process via -e. Your shell environment and rcfiles are untouched β the token lives in Claude Code's config file, scoped to this server, and is not visible to other processes. To set a default parent page for create_page, add -e NOTION_ROOT_PAGE_ID=<page-id> to the same command.
OpenClaw:
Then provide the token via the parent shell environment before starting OpenClaw:
This export form is the generic fallback for any MCP client that inherits the parent shell environment. Caveat: it only persists for the current shell session unless you add it to your shell rcfile, which has its own security implications β prefer the -e form above when using Claude Code specifically.
Claude Desktop / Cursor / Windsurf β add to your MCP config file:
Config file locations: Claude Desktop β claude_desktop_config.json Β· Cursor β .cursor/mcp.json Β· Windsurf β ~/.windsurf/mcp.json
.vscode/mcp.json (uses servers not mcpServers)Use the easy-notion CLI when an agent needs Notion access without loading the full MCP tool surface, or when you want separate Notion integrations for different permission modes. Profiles live in ~/.config/easy-notion-mcp/profiles.json by default and reference environment variable names, not raw tokens.
Read commands work with readonly profiles:
Mutating commands require a readwrite profile:
Destructive CLI commands support --dry-run as a readonly preflight. It runs
the same lookup and markdown validation where possible, returns planned fields
such as would_delete_block_ids, would_update, would_archive, or
would_restore, and does not mutate Notion.
The lightweight skill for agent routing is published in this repo at skills/easy-notion-cli/. It teaches agents to prefer the CLI for profile-based Notion access instead of registering multiple MCP servers.
API-token + stdio is the lower-friction default. If you're running a shared deployment or want per-user access, OAuth handles authentication with no token to copy-paste.
Start the server:
Requires NOTION_OAUTH_CLIENT_ID and NOTION_OAUTH_CLIENT_SECRET env vars. See OAuth setup below.
Claude Code:
OpenClaw:
Claude Desktop:
Go to Settings β Connectors β Add custom connector, enter http://localhost:3333/mcp.
Your browser will open to Notion's authorization page. Pick the pages to share, click Allow, done.
.mcp.json at your project rootIf you want to register easy-notion-mcp per-project instead of user-wide, paste the following into a .mcp.json file at your project's root:
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/easy-notion)<a href="https://allmcps.com/mcp/easy-notion"><img src="https://allmcps.com/api/badge/easy-notion?style=directory" alt="Easy Notion on AllMCPs" /></a>