Better Notion

io.github.ai-aviatePublished by GitHub account ai-aviatev0.3.2Updated Oct 24, 2026

Operate Notion with a single Markdown document — read, create, and update pages in one call.

The publisher's own server: Notion

Overview

AI-generated overview

Lets an assistant read, create, update, search, and organize Notion pages and databases using a single Markdown document per call.

What you can do
A local MCP server that exposes nine tools for working with Notion: read a page as Markdown with YAML frontmatter, write (create or update) pages and database entries, search the workspace, list database records or child pages, update properties quickly, view or modify database schema, add or read comments, archive pages, and move pages between parents. It is designed so one Markdown document with frontmatter and body covers a whole operation, including batch creation and append or prepend edits, instead of several round-trips.
When to use it
Worth adding when an assistant should work directly with Notion content: drafting or updating meeting notes and task entries, querying a task board with filters and sorting, restructuring database columns, or reading a page together with its child pages. It suits users who want Markdown-shaped input and output rather than raw Notion block JSON.
Requirements
Runs as a local process over stdio, installed from the npm package better-mcp-notion (for example via npx) or built from source with Node.js. Requires a Notion integration API key supplied in the environment variable NOTION_API_KEY, and the target pages or databases must be shared with that integration. Network access to Notion is needed.
Before you install
The NOTION_API_KEY secret grants access to everything shared with the integration, so scope the shared pages narrowly and keep the key out of shared config files. Write, update, schema, comment, delete, and move tools change or remove Notion content; delete archives a page rather than erasing it permanently, and updating a page body replaces existing blocks unless append or prepend is used. Page content is sent to Notion's API.

Installation

In SourceWeft

  1. Open Better Notion in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

better-mcp-notion

Japanese / 日本語

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 MCPbetter-mcp-notion
Tools16-22 tools9 tools
Create a DB entry3+ calls (search DB, get schema, create page, append blocks)1 call
Edit a page4+ calls (get page, get blocks, delete blocks, append blocks)1 call (read, edit, write)
FormatRaw JSON blocksMarkdown
Context windowHeavy (tool definitions + JSON)Light

Tools

ToolDescription
readRead a Notion page as Markdown with frontmatter. Supports recursive child page reading with depth.
writeCreate or update pages from Markdown. Supports batch operations and append/prepend.
searchSearch the workspace by keyword. Returns a Markdown-formatted list.
listList database records as a table or child pages as a list. Supports natural language filter & sort.
updateQuick property update without rewriting content. Just pass page + key-value pairs.
schemaView or modify database schema — add, remove, or rename columns.
commentAdd or read comments on a page.
deleteArchive (soft-delete) a page.
moveMove a page to a different parent page or database.

Quick Start

1. Create a Notion Integration

  1. Go to notion.so/profile/integrations and create a new integration
  2. Copy the API key (ntn_...)
  3. Share the pages/databases you want to access with the integration ("Connect to" in the page menu)

2. Add to your MCP client

Claude Code
bash
claude mcp add better-notion -- npx better-mcp-notion

Then set the environment variable:

bash
export NOTION_API_KEY=ntn_your_api_key_here
Claude Desktop / Cursor / Windsurf

Add to your MCP config file (e.g. claude_desktop_config.json, .cursor/mcp.json):

json
{  "mcpServers": {    "better-notion": {      "command": "npx",      "args": ["-y", "better-mcp-notion"],      "env": {        "NOTION_API_KEY": "ntn_your_api_key_here"      }    }  }}
From source
bash
git clone https://github.com/ai-aviate/better-mcp-notion.gitcd better-mcp-notionnpm install && npm run build

Then point your MCP config to node /path/to/better-mcp-notion/build/index.js.

Usage

Read a page

read({ page: "https://notion.so/My-Page-abc123def456" })

Returns:

markdown
---id: abc123-def456title: My Pagedatabase: task-db-idproperties:  Status: In Progress  Tags:    - backend---## Notes- Completed API design

Create a page

write({ markdown: `---title: Meeting Notesparent: "Project Alpha"icon: "📝"---## Agenda- Review progress- Discuss next steps` })

Create a database entry

write({ markdown: `---title: Fix login bugdatabase: "Task Board"properties:  Status: In Progress  Tags:    - backend    - urgent  Due Date: "2026-03-01"---## DescriptionLogin fails when password contains special chars.` })

Update a page (edit the output from read)

write({ markdown: `---id: abc123-def456title: Updated Titleproperties:  Status: Done---## New contentBody 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 sectionThis is added to the end of the page.`, position: "append" })

position: "prepend" adds content to the beginning instead.

Batch create (multiple pages in one call)

Separate pages with ===:

write({ markdown: `---title: Task 1database: "Task Board"properties:  Status: Todo---Task 1 details===---title: Task 2database: "Task Board"properties:  Status: Todo---Task 2 details` })

Query a database with filters

list({  target: "Task Board",  filter: "Status is Done AND Priority is High",  sort: "Due Date ascending"})
Filter syntax
  • Status is Done / Status = Done - equals
  • Priority != Low - not equals
  • Tags contains backend - multi-select contains
  • Done is true - checkbox
  • Score > 80 - number comparison (>, <, >=, <=)
  • Due Date after 2026-03-01 - date after/before
  • Combine with AND: Status is Done AND Priority is High
Sort syntax
  • Due Date ascending or Due Date asc
  • Created descending or Created desc

Read with child pages

read({ page: "parent-page-id", depth: 2 })

depth: 1 = current page only (default), 2 = include children, 3 = include grandchildren.

Quick property update

Update properties without rewriting content:

update({ page: "My Task", properties: { "Status": "Done", "Priority": "High" } })

Manage database schema

// View schemaschema({ database: "Task Board" })
// Add a columnschema({ database: "Task Board", action: "add", property: "Priority", type: "select", options: ["Low", "Medium", "High"] })
// Rename a columnschema({ database: "Task Board", action: "rename", property: "Due", name: "Due Date" })
// Remove a columnschema({ database: "Task Board", action: "remove", property: "Old Column" })

Comments

// Read commentscomment({ page: "abc123" })
// Add a commentcomment({ page: "abc123", body: "Looks good! Ready to ship." })

Frontmatter Reference

Write (create/update)

FieldCreateUpdateDescription
id-requiredPage ID to update
titlerecommendedoptionalPage title
parentrequired*ignoredParent page name or ID
databaserequired*ignoredDatabase name or ID (*either parent or database)
iconoptionaloptionalEmoji or image URL
coveroptionaloptionalCover image URL
propertiesoptionaloptionalDatabase properties (matched against schema)

Read (output only)

FieldDescription
idPage UUID
urlNotion page URL
titlePage title
parent / databaseParent page or database ID
icon, coverEmoji or image URL
propertiesAll database properties
created, last_editedTimestamps (read-only)

Read-only fields (url, created, last_edited, formulas, etc.) are safely ignored when passed to write.

Development

bash
npm run dev          # TypeScript watch modenpm test             # Run testsnpm run test:watch   # Test watch mode

License

Elastic License 2.0 (ELv2) — Free to use, modify, and distribute. Cannot be offered as a managed/hosted service.

Source: README.md at commit 962fe3b

Tools

0
SourceWeft has not started this package in its sandbox yet, so its tools are not known.

Version history

1
  1. v0.3.2LatestSep 16, 2026

Score

40% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts

    Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.

  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listed15 pts

    Answer tools/list without a credential, or ship a package that starts in a sandbox without one.

  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts

    Declare a license in the repository or the registry entry.

Other Notion integrations