Easy Notion MCP server
io.github.misterwigglesworth/easy-notion·v1.1.0·55 starsMarkdown-first Notion MCP server. ~6-7x fewer response tokens vs official Notion MCP. 43 tools.
55 stars390 downloads/wk
Reviews
Write oneNobody has reviewed Easy Notion yet.
If you have run it, two minutes of your experience saves the next person an afternoon.
Easy Notion tools (43, 15 write)
write = sends, deletes, buys or postsRead from the package source without running it. The installed server may list more.
add_commentAdd a comment to a page. Supports inline markdown and page mentions with @[Title](notion-url). Unlike append_content, a mention the integration cannot resolve is not downgraded to a plain link and returns no warning, so the call can fail. Returns { id, content }.
add_database_entrieswrite actionCreate multiple entries in a database in one call. Each entry uses the same simple key-value format as add_database_entry. Returns per-entry results \u2014 partial failures don't block the batch.
add_database_entrywrite actionCreate one database entry using simple key-value property inputs. Call get_database first to see available property names and valid select/status options. Writable property values use simple inputs: - title, rich_text: string - number: number - select, status: option name string - multi_select: array of option name strings - date: ISO date string (start only) - checkbox: boolean - url, email, phon
append_contentAppend markdown content to an existing page. The server converts markdown into native Notion blocks, not flat/plain text. The server automatically handles Notion API limits: batches more than 100 child blocks, splits rich text over 2000 characters, and writes deeply nested blocks in additional passes, so callers can append large documents in one call with no need to pre-chunk or pre-split. Support
archive_pageArchive a page in Notion.
archive_toggleArchive one toggle by title from a page. Searches recursively and matches plain toggle blocks plus toggleable heading_1, heading_2, and heading_3 blocks using case-insensitive trimmed text. Archives the matched container block; children are not deleted individually. Missing titles return the available toggle titles.
create_databasewrite actionCreate a database under a parent page. Supported property types and extras: - title - rich_text (alias: text) - number (optional: format, for example "dollar", "percent", "number_with_commas") - select, multi_select, status (optional: options array of strings or {name, color, description}) - date, checkbox, url, email, phone - formula (required: expression, for example "prop(\"Count\") * 2") - rol
create_pagewrite actionCreate a Notion page from markdown as native Notion blocks. Server handles 100-block batching, 2000-char splitting, and deep nesting, so no pre-chunking. Supports stdio-only file:// uploads. Syntax: easy-notion://docs/markdown. Mentions: @[Title](notion-url). Returns { id, title, url, success: true }, note for workspace-parent pages, plus block_map for top-level created blocks when present.
create_page_from_filewrite actionCreate a Notion page from a local markdown file. The server reads and validates the file, then creates the same result as create_page without sending file contents through the agent context. The server converts the markdown to native Notion blocks (not flat text) and automatically handles Notion's limits (100-block batching, 2000-char splitting, deep nesting), so large files need no pre-chunking.
create_viewwrite actionCreate a Notion database view. Pass database_id. Dashboard views and dashboard widget placement are not supported.
delete_database_entrywrite actionDelete (archive) a database entry.
delete_viewwrite actionDelete a Notion database view. Destructive: confirm must be exactly true.
duplicate_pageDuplicate a page. Reads all blocks from the source and creates a new page with the same content that this server can represent. If the source contains block types this server does not yet support (e.g. child_page subpages, synced_block, child_database, link_to_page), those are omitted from the duplicate AND listed in a `warnings` field with code `omitted_block_types`. Notion AI meeting notes are d
find_replaceFind and replace text on a page. Preserves uploaded files and blocks that aren't touched. More efficient than replace_content for targeted text changes like fixing typos, updating URLs, or renaming terms.
get_configReport this server's own settings: version, transport, the workspace root that bounds create_page_from_file file paths, and how many tools are visible. Call this when a file-path or configuration error occurs and you need the server's actual settings rather than a guess. Read-only, makes no Notion API call, and never returns credentials. Returns { version, transport, workspace_root_configured, wor
get_databaseGet a database's schema \u2014 property names, types, and select/status options. Call this before query_database or add_database_entry to know the exact property names and valid values.
get_meGet the current bot user.
get_viewRetrieve one Notion database view by ID. Returns a curated summary (id, name, type, url, data_source_id); set include_config: true for the full raw Notion view object.
list_commentsList comments on a page.
list_databasesList all databases the integration can access. Returns database names and IDs \u2014 use get_database on any result to see its schema.
list_pagesList child pages under a parent page. Each row returns id, title, created_time, and last_edited_time. Timestamps are full ISO-8601 values from Notion, rounded to the minute, and last_edited_time advances on page content and property edits.
list_usersList workspace users.
list_viewsList Notion database views. Pass exactly one of database_id or data_source_id. Returns a curated summary of each view (id, name, type, url, data_source_id) plus pagination cursors; set include_config: true for the full raw Notion view objects.
move_pageMove a page to a new parent page.
query_databaseQuery a database with optional filters, sorts, or text search. Use text for simple keyword search across title, rich_text, url, email, and phone fields. For advanced filters, pass Notion filter syntax and call get_database first to see property names and valid options. Response shape: { results: Array<entry>, warnings?: Array<warning> }. Multi-value properties are capped by max_property_items and
query_viewQuery a Notion database view. Creates a temporary view query, fetches database row results, then deletes the query.
read_blockRead one block by ID as markdown. Container blocks are fetched recursively with children. Unsupported root block types return a clear error; unsupported nested blocks are omitted and listed in warnings. Notion AI meeting-notes blocks encountered in the result are rendered as a synthetic toggle and produce a `read_only_block_rendered` warning. Transcripts are not included from these tools.
read_pageRead a page and return metadata plus markdown. Recursively fetches nested blocks and uses the same markdown conventions accepted by create_page. If unsupported block types are omitted from the markdown, they are listed in warnings. Do NOT round-trip markdown through replace_content when omitted_block_types warnings are present; omitted blocks would be deleted. Notion AI meeting notes are rendered
read_sectionRead a single page section by heading name. Uses the same heading matching and boundary rules as update_section: headings are matched case-insensitively, H1 sections end at the next heading of any level, and H2/H3 sections end at the next heading of the same or higher level. Includes the heading block itself and recursively renders nested children only for blocks inside the selected section. If un
read_toggleRead one toggle by title from a page. Searches recursively and matches plain toggle blocks plus toggleable heading_1, heading_2, and heading_3 blocks using case-insensitive trimmed text. Missing titles return the available toggle titles. Notion AI meeting-notes blocks encountered in the result are rendered as a synthetic toggle and produce a `read_only_block_rendered` warning. Transcripts are not
replace_contentReplaces all page content with the provided markdown atomically (one Notion API call). Notion's atomic markdown endpoint converts the markdown to native Notion blocks in that one API call. On matched blocks Notion preserves the original block IDs, so deep-link anchors (`#block-id`) and inline-comment threads attached to those blocks survive the edit. Unmatched blocks (returned in `warnings` with c
restore_pageRestore an archived page.
restore_toggleRestore an archived toggle or toggleable heading by archived block ID. Use the block ID returned by archive_toggle; Notion does not expose archived child enumeration for title search or read_page include_archived.
searchSearch Notion pages or databases. Use filter: 'databases' to find databases by name, then get_database for schema details.
search_in_pageSearch raw Notion block plain text inside a page, optionally scoped to one toggle or toggleable heading by title. Matching is case-insensitive plain substring search.
share_pageReturn the page URL that can be shared from Notion.
update_blockwrite actionUpdate a single block in place by ID. Preserves the block's identity (deep-link anchors and inline-comment threads attached to the block survive the edit). Use this for surgical edits: fixing a heading, toggling a checkbox, rewriting one paragraph. For multi-block edits, use append_content, replace_content, or update_section. Type lock-in: the markdown must parse to the same block type as the exis
update_data_sourcewrite actionCRITICAL: full-list semantics. When you update a select or status property's `options` array, you MUST send the full desired list. Any existing option you omit will be permanently removed from the database, along with any relationship to rows currently using it. Rows that currently reference a removed option are silently reassigned to the default group's first option (for example "Not started" for
update_database_entrywrite actionUpdate an existing database entry using simple key-value property inputs. Pass only properties to change; omitted properties are left unchanged. Call get_database first to see available property names and valid select/status options. Writable property values use the same simple inputs as add_database_entry: - title, rich_text: string - number: number - select, status: option name string - multi_se
update_pagewrite actionUpdate page title, icon, or cover. Cover accepts an image URL, or a file:// path (stdio transport only) which will be uploaded to Notion. In HTTP transport, the file:// form is rejected — use an HTTPS URL instead.
update_sectionwrite actionDESTRUCTIVE, no rollback: this tool deletes blocks in the section, then writes new blocks. If the write fails mid-call, the section is left partially or fully emptied; for most sections the heading anchor is deleted, so a retry can fail with "heading not found." For irreplaceable sections, duplicate_page the target first so you have a restore point. Update a section of a page by heading name. Find
update_togglewrite actionDESTRUCTIVE, no rollback: this tool preserves the matched toggle container block ID, then deletes its body children and appends replacement body blocks. Child block IDs inside the body change, and if the write fails mid-call the toggle can be left partially or fully emptied. For irreplaceable content, duplicate_page the target first so you have a restore point. Update the body of one toggle by tit
update_viewwrite actionUpdate a Notion database view. Pass at least one update field. Null filter, sorts, or quick_filters values are forwarded to clear those fields.
Public scan report
scanner v0.1.10 · 2026-10-30 · same rubric, same numbers if you re-run it
- Code scan40 source files scanned25/25
- –Live reliabilityno gateway calls yet and no remote to proben/a
- –Tool poisoningtools not inspected (local package is not executed); not countedn/a
- Auth qualitystatic API keys via environment variables6/15
- Maintenancelast push 49 days ago12/15
- Maintainer identitynamespace and repository owner differ4/10
How Easy Notion compares
Against every graded Productivity MCP server, from our own scans and uptime checks. Updated after each scan run.
- Safety score
- 72/100
- higher than 33% of 1,299 Productivity servers
- Tools
- 43
- the typical Productivity server has 7
- Tools that change things
- 35%
- typical: 0%. Fewer write tools means less an agent can break
- GitHub stars
- 55
- more than 90% of 854 Productivity servers
- Downloads a week
- 390
- more than 80% of 427 Productivity servers with a package
What its tools let an agent do: 22 read · 7 create · 9 change · 4 delete · 1 send or post
Install Easy Notion in Claude Code, Cursor or VS Code
Runs npx -y easy-notion-mcp on your machine. Read the scan report first; the gateway never runs local packages.
claude mcp add easy-notion -- npx -y easy-notion-mcp
What the publisher says
From the Easy Notion repository's README, as published. We do not edit it. Read it on GitHub
Easy Notion MCP
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
npx easy-notion-mcpSee 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
How does easy-notion-mcp compare to other Notion MCP servers?
How many tokens does easy-notion-mcp save?
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.
Shortened. The full README is on GitHub.
Nothing above is checked by us. What we check is on the safety report.
Easy Notion: common questions
- Is Easy Notion MCP server safe?
- Mostly: it is graded B (72/100). Read the Easy Notion safety report
- How do I install Easy Notion?
- It runs on your machine. Copy the Claude Code, Cursor, VS Code or Claude Desktop config from the install section.
- Does Easy Notion need an API key?
- Yes. The registry entry asks for
NOTION_TOKEN. - Is Easy Notion maintained?
- The last commit was 53 days ago (2026-09-11). The latest release is v1.1.0.
- What can I use instead of Easy Notion?
- Servers from other publishers that do the same job: Better Notion MCP server, Notion MCP server and Exomem MCP server.
- How does Easy Notion compare with other Productivity MCP servers?
- safety score 72/100 (higher than 33% of 1,299 Productivity servers); tools 43 (the typical Productivity server has 7); tools that change things 35% (typical: 0%. Fewer write tools means less an agent can break). Full comparison.
Alternatives to Easy Notion
Same job from other publishers: the closest match first, then the best rated.
- Better NotionMarkdown-first Notion for AI agents -- pages, databases, blocks, and comments in one call.not reviewedEstablishedB
- NotionA Model Context Protocol server for connecting Notion to MCP-compatible clientsnot reviewedEstablishedA
ExomemLocal Markdown/Obsidian knowledge substrate for MCP agents with governed memory and hybrid search.not reviewedEstablishedA- OrchestKit Docs MCPRead-only MCP server for the OrchestKit docs: full-text search + Markdown fetch. No auth.not reviewedEstablishedA
- lociCross-session memory and hybrid RAG over your notes and docs. Local-first, with cited answers.not reviewedEstablishedA