用途
easy-notion-mcp 是一个生产级的 Model Context Protocol(MCP)服务器,用于在 AI 智能体与 Notion 之间建立桥梁。它的核心设计是让智能体使用 GitHub 风格 Markdown 而非原始 Notion API JSON 来读写 Notion 内容,从而降低智能体处理 Notion 数据的复杂度。项目提供 42 个 MCP 工具,覆盖页面、数据库、搜索、文件和区块操作,并支持 24 种区块类型(包括折叠列表、分栏、标注、表格和文件上传)的双向保真转换。
主要能力
- Markdown 优先的输入输出:智能体只需处理 Markdown,服务器负责所有 Notion 区块 JSON 的转换。
- 数据库易用性:可写入简洁的属性对象(如 { "Status": "Done" }),服务器自动完成 schema 映射。
- 双传输方式:支持 Stdio(API Token)或 HTTP(OAuth/Bearer Token)。
- 可选 Redis:用于多实例部署时的共享 schema 缓存与 OAuth 持久化。
- 安全默认值:内容净化、URL 校验、工作区根目录文件限制。
使用方式
安装
推荐使用 npx 快速启动,在 MCP 客户端(如 Claude Desktop、Cursor 等)中配置:
{
"mcpServers": {
"notion": {
"command": "npx",
"args": ["-y", "easy-notion-mcp"],
"env": {
"NOTION_TOKEN": "YOUR_NOTION_INTEGRATION_TOKEN"
}
}
}
}
从源码安装:
git clone https://github.com/Grey-Iris/easy-notion-mcp.git
cd easy-notion-mcp
npm install
npm run build
MCP 客户端配置:
{
"mcpServers": {
"notion": {
"command": "node",
"args": ["/absolute/path/to/easy-notion-mcp/dist/index.js"],
"env": {
"NOTION_TOKEN": "YOUR_NOTION_INTEGRATION_TOKEN",
"NOTION_ROOT_PAGE_ID": "optional_default_parent_page_id"
}
}
}
}
获取 Notion Integration Token
- 访问 https://www.notion.so/my-integrations
- 点击 + New integration
- 命名集成并选择能力
- 复制 Internal Integration Token(以 ntn_ 开头)
- 将目标页面/数据库共享给你的集成
配置
核心环境变量:
# stdio 传输必需
NOTION_TOKEN=ntn_your_integration_token_here
# 可选:create_page 的默认父页面
NOTION_ROOT_PAGE_ID=abc123def456
# 禁用读取时的内容提示前缀(默认:false)
NOTION_TRUST_CONTENT=false
# file:// 上传的根目录(默认:cwd)
NOTION_MCP_WORKSPACE_ROOT=/path/to/workspace
# 日志级别:debug, info, warn, error(默认:info)
LOG_LEVEL=info
HTTP 传输(OAuth 或静态 Bearer):
# /mcp 端点的静态 bearer token
NOTION_MCP_BEARER=your_random_secret_token
# OAuth 配置
NOTION_OAUTH_CLIENT_ID=your_oauth_client_id
NOTION_OAUTH_CLIENT_SECRET=your_oauth_client_secret
# HTTP 服务器设置
PORT=3333
NOTION_MCP_BIND_HOST=127.0.0.1
Redis(可选多实例持久化):
# 启用 Redis(设置 REDIS_URL 时自动启用)
REDIS_ENABLED=true
REDIS_URL=redis://127.0.0.1:6379/0
# 或单独配置:
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
REDIS_PASSWORD=your_redis_password
REDIS_DB=0
REDIS_KEY_PREFIX=easy-notion:
REDIS_CONNECT_TIMEOUT_MS=10000
REDIS_MAX_RETRIES=3
.env 文件设置:
cp .env.example .env
# 编辑 .env 填入你的配置
MCP 工具参考
页面操作
read_page:以 Markdown 读取 Notion 页面。create_page:用 Markdown 内容创建新页面。update_page:用 Markdown 更新页面内容(mode 可为 replace 或 append)。append_to_page:向已有页面追加 Markdown。delete_page:将页面移入回收站。
数据库操作
query_database:带过滤和排序查询数据库。get_database:获取数据库 schema 和属性。add_database_entry:创建数据库条目并自动转换 schema。update_database_entry:更新数据库条目属性或内容。
搜索操作
search_notion:跨工作区全文搜索。
文件操作
upload_file:上传本地文件到页面(仅 stdio 传输)。add_image:从 URL 向页面添加图片。
区块操作
create_block:创建特定区块类型(如 callout、toggle 等)。
CLI 用法
项目包含 CLI,用于低上下文访问 Notion:
# 只读模式
npx easy-notion-mcp --profile readonly
# 读写模式
npx easy-notion-mcp --profile readwrite
# 自定义配置
NOTION_TOKEN=ntn_xxx npx easy-notion-mcp --profile readwrite
开发工作流
# 安装依赖
npm install
# 开发监听模式
npm run dev
# 本地运行 stdio 服务器
NOTION_TOKEN=ntn_xxx npm start
# 运行 HTTP 服务器
NOTION_TOKEN=ntn_xxx NOTION_MCP_BEARER=$(openssl rand -hex 32) npm run start:http
测试:
npm test
npm run test:watch
npm run typecheck
npm run lint
npm run build
集成测试:
cp .env.example .env
# 设置 E2E_ROOT_PAGE_ID 为测试页面
npm run test:e2e
HTTP 传输设置
静态 Bearer Token:
export NOTION_MCP_BEARER=$(openssl rand -hex 32)
NOTION_TOKEN=ntn_xxx NOTION_MCP_BEARER=$NOTION_MCP_BEARER npm run start:http
HTTP 客户端配置:
{
"mcpServers": {
"notion-http": {
"url": "http://127.0.0.1:3333/mcp",
"transport": "http",
"headers": {
"Authorization": "Bearer YOUR_BEARER_TOKEN"
}
}
}
}
OAuth 流程:
NOTION_OAUTH_CLIENT_ID=your_client_id \
NOTION_OAUTH_CLIENT_SECRET=your_client_secret \
npm run start:http
# 访问 http://localhost:3333/auth/login
# 完成 OAuth 流程
# Token 存储在 Redis 或加密文件中
适用场景
- 让 AI 智能体以 Markdown 方式读写 Notion 页面与数据库。
- 在 Claude Desktop、Cursor 等 MCP 客户端中集成 Notion 操作。
- 需要多实例部署并通过 Redis 共享 schema 缓存与 OAuth 持久化的场景。
- 需要 HTTP 传输与 OAuth/Bearer 认证的远程或服务化部署。
- 需要文件上传、图片添加、区块创建等丰富内容操作的自动化流程。
限制与注意事项
- 文件上传(file:// URL)仅支持 stdio 传输,且所有路径必须位于 NOTION_MCP_WORKSPACE_ROOT 内,符号链接会被校验以防止逃逸;HTTP 传输应使用 HTTPS URL。
- 默认所有读取操作会附带内容提示前缀,警告智能体内容可能不可信;仅在受信任工作区可设置 NOTION_TRUST_CONTENT=true 禁用。
- 属性名称区分大小写,遇到未知属性名错误时应先调用 get_database 获取当前 schema。
- schema 缓存 TTL 未直接提供配置项,需在代码中调整(src/persistence/cache-store.ts 中 DEFAULT_TTL = 3600)。
- Redis 连接警告需启动 Redis 或显式禁用(REDIS_ENABLED=false)。
- 401 invalid_token(HTTP 模式)需确认客户端与服务端 bearer token 一致。
- 关于收费、价格、平台支持范围等具体信息,资料中暂未提供。