关于 better-notion
better-notion 是通过带 YAML frontmatter 的 Markdown 文档操作 Notion 的 MCP 服务。它可在单次调用中读取、创建和编辑页面,并通过 9 个工具提供工作区、数据库和评论操作。
主要功能
- 01以 Markdown 读取和写入页面
- 02搜索工作区页面
- 03筛选并列出数据库记录
- 04更新属性和数据库结构
- 05管理评论与页面位置
适用场景
- 01一次调用创建或编辑页面
- 02按条件查询数据库记录
- 03追加笔记而不替换页面内容
- 04修改数据库列或页面评论
MCP 相关
该项目是 MCP 服务,提供 9 个工具来读取、写入、搜索、列出、更新和管理 Notion 页面及数据库。它通过 Notion 集成 API 密钥连接。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
9收录的工具列表 · 更新于 2 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| page | string | 是 | Notion 页面 URL(https://notion.so/...)或页面 ID(UUID 或 32 位十六进制) |
| depth | integer | 否 | 读取子页面的深度:1 = 仅此页面(默认),2 = 包含子页面,3 = 包含孙页面 |
详细介绍
better-mcp-notion
一个 MCP 服务,让你只需使用一份 Markdown 文档即可操作 Notion。
现有的 Notion MCP 服务只是单薄的 API 封装,完成一项操作需要多次往返调用。better-mcp-notion 使用一份 Markdown 文档(YAML frontmatter + 正文),即可通过一次调用读取、创建和更新页面。
为什么选择 better-mcp-notion?
| 传统 Notion MCP | better-mcp-notion | |
|---|---|---|
| 工具 | 16-22 个工具 | 9 个工具 |
| 创建数据库条目 | 3 次以上调用(搜索数据库、获取架构、创建页面、追加区块) | 1 次调用 |
| 编辑页面 | 4 次以上调用(获取页面、获取区块、删除区块、追加区块) | 1 次调用(读取、编辑、写入) |
| 格式 | 原始 JSON 区块 | Markdown |
| 上下文窗口 | 开销大(工具定义 + JSON) | 开销小 |
工具
| 工具 | 描述 |
|---|---|
read | 将 Notion 页面读取为带 frontmatter 的 Markdown。支持通过 depth 递归读取子页面。 |
write | 根据 Markdown 创建或更新页面。支持批量操作以及追加/前置内容。 |
search | 按关键词搜索工作区。返回 Markdown 格式的列表。 |
list | 将数据库记录列为表格,或将子页面列为列表。支持自然语言筛选和排序。 |
update | 快速更新属性,无需重写内容。只需传入页面和键值对。 |
schema | 查看或修改数据库架构——添加、移除或重命名列。 |
comment | 添加或读取页面评论。 |
delete | 归档(软删除)页面。 |
move | 将页面移动到其他父页面或数据库。 |
快速开始
1. 创建 Notion 集成
- 前往 notion.so/profile/integrations 并创建新的集成
- 复制 API 密钥(
ntn_...) - 将你要访问的页面/数据库分享给该集成(在页面菜单中选择“Connect to”)
2. 添加到 MCP 客户端
Claude Code
claude mcp add better-notion -- npx better-mcp-notion
然后设置环境变量:
export NOTION_API_KEY=ntn_your_api_key_here
Claude Desktop / Cursor / Windsurf
将以下内容添加到 MCP 配置文件中(例如 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
然后将 MCP 配置指向 node /path/to/better-mcp-notion/build/index.js。
用法
读取页面
read({ page: "https://notion.so/My-Page-abc123def456" })
返回:
---
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.
` })
更新页面(编辑 read 的输出)
write({ markdown: `
---
id: abc123-def456
title: Updated Title
properties:
Status: Done
---
## New content
Body replaces all existing blocks.
` })
向现有页面追加内容
使用 position: "append" 可在末尾添加内容,而无需重写整个页面。
只需提供新增内容——现有内容会保留。
write({ markdown: `
---
id: abc123-def456
---
## New section
This is added to the end of the page.
`, position: "append" })
position: "prepend" 则会在开头添加内容。
批量创建(一次调用创建多个页面)
使用 === 分隔页面:
write({ markdown: `
---
title: Task 1
database: "Task Board"
properties:
Status: Todo
---
Task 1 details
===
---
title: Task 2
database: "Task Board"
properties:
Status: Todo
---
Task 2 details
` })
使用筛选条件查询数据库
list({
target: "Task Board",
filter: "Status is Done AND Priority is High",
sort: "Due Date ascending"
})
筛选语法
Status is Done/Status = Done- 等于Priority != Low- 不等于Tags contains backend- 多选包含Done is true- 复选框Score > 80- 数值比较(>、<、>=、<=)Due Date after 2026-03-01- 日期晚于/早于- 使用
AND组合:Status is Done AND Priority is High
排序语法
Due Date ascending或Due Date ascCreated descending或Created desc
读取页面及其子页面
read({ page: "parent-page-id", depth: 2 })
depth: 1 = 仅当前页面(默认),2 = 包含子页面,3 = 包含孙级页面。
快速更新属性
无需重写内容即可更新属性:
update({ page: "My Task", properties: { "Status": "Done", "Priority": "High" } })
管理数据库架构
// View schema
schema({ database: "Task Board" })
// Add a column
schema({ database: "Task Board", action: "add", property: "Priority", type: "select", options: ["Low", "Medium", "High"] })
// Rename a column
schema({ database: "Task Board", action: "rename", property: "Due", name: "Due Date" })
// Remove a column
schema({ database: "Task Board", action: "remove", property: "Old Column" })
评论
// Read comments
comment({ page: "abc123" })
// Add a comment
comment({ page: "abc123", body: "Looks good! Ready to ship." })
Frontmatter 参考
写入(创建/更新)
| 字段 | 创建 | 更新 | 说明 |
|---|---|---|---|
id | - | 必填 | 要更新的页面 ID |
title | 建议填写 | 可选 | 页面标题 |
parent | 必填* | 忽略 | 父页面名称或 ID |
database | 必填* | 忽略 | 数据库名称或 ID(*parent 和 database 二选一) |
icon | 可选 | 可选 | 表情符号或图片 URL |
cover | 可选 | 可选 | 封面图片 URL |
properties | 可选 | 可选 | 数据库属性(与架构匹配) |
读取(仅输出)
| 字段 | 说明 |
|---|---|
id | 页面 UUID |
url | Notion 页面 URL |
title | 页面标题 |
parent / database | 父页面或数据库 ID |
icon、cover | 表情符号或图片 URL |
properties | 所有数据库属性 |
created、last_edited | 时间戳(只读) |
传入 write 时,只读字段(url、created、last_edited、公式等)会被安全忽略。
开发
npm run dev # TypeScript watch mode
npm test # Run tests
npm run test:watch # Test watch mode
许可证
Elastic License 2.0 (ELv2) — 可免费使用、修改和分发。不得将其作为托管服务提供。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。