Easy Notion MCP
Easy Notion MCP
以 Markdown 为先的 MCP 服务器,将 AI 智能体连接到 Notion。 智能体编写 markdown —— easy-notion-mcp 将其转换为 Notion 的 block API,并再转换回来。
43 个工具 · 24 种 block 类型 · 相比官方 Notion MCP 响应 token 减少 ~6–7× · 有文档记录的往返支持
npx easy-notion-mcp查看实际效果 → 完全通过 easy-notion-mcp 创建和管理的实时 Notion 页面。

目录: easy-notion-mcp 与其他 Notion MCP 服务器相比如何? · 如何设置 easy-notion-mcp? · 用于低上下文 Notion 访问的 CLI 配置文件 · 配置 · 为什么选择 Markdown · 工作原理 · easy-notion-mcp 提供哪些工具? · 有哪些可用的 MCP 资源? · easy-notion-mcp 支持哪些 block 类型? · 我能否在保留格式的情况下读取和重写页面? · easy-notion-mcp 如何处理数据库? · 适用于你自己的智能体的 Cookbook 配方 · 安全性和提示注入怎么办? · 稳定性和版本控制 · 常见问题 · 社区
easy-notion-mcp 与其他 Notion MCP 服务器相比如何?
功能 | easy-notion-mcp | 官方 Notion MCP (npm) | better-notion-mcp |
内容格式 | ✅ 标准 GFM markdown | ❌ 原始 Notion API JSON | ⚠️ Markdown(block 类型有限) |
Block 类型 | ✅ 24(toggles、columns、callouts、equations、embeds、tables、file uploads、task lists) | ⚠️ 全部(以原始 JSON 形式) | ⚠️ ~7(headings、paragraphs、lists、code、quotes、dividers) |
往返支持 | ✅ 24 种 block 类型,有文档记录的注意事项 | ❌ 原始 JSON 需要重建 block | ⚠️ 不支持的 block 会被静默丢弃 |
工具 | 43 个独立命名的工具 | 18 个从 OpenAPI 自动生成 | 9 个复合工具(39 个操作) |
文件上传 | ✅ markdown 中的 | ❌ 开放的功能请求 | ✅ 5 步生命周期 |
提示注入防御 | ✅ 内容提示前缀 + URL 清理 | ❌ | ❌ |
数据库条目格式 | 简单的 | 简化的键值对 | 简化的键值对 |
认证选项 | API token 或 OAuth | API token 或 OAuth | API token 或 OAuth |
easy-notion-mcp 能节省多少 token?
读取页面内容的响应 token 消耗比官方 Notion MCP 服务器少约 6–7×,因为 Notion 的原始 block JSON 携带了每个 block 的元数据(block ID、时间戳、作者对象),而阅读内容的智能体根本不需要这些。通常在 ~5–7× 之间,从代码密集型页面的 ~3× 到内容丰富的页面的 ~15×,页面内容的 ≥94% 得以保留。与官方原始 JSON 服务器对比测量;与其他基于 markdown 的服务器大致相当。
优势在于省略元数据,而非编码效率。在信息量相同的情况下,两种格式的消耗大致相同(在完整表示的页面形态上,常见的中间表示比率约为 ~1.0–1.06×,在典型散文上为 1.32×),因此节省的是原始 JSON 携带而内容读取从不使用的每 block 元数据(block UUID、时间戳、作者对象、注释包装器)。数据库查询在内容完整度达到 100% 时也显示出类似的 ~7× 优势。
方法论、各类别结果以及所有注意事项:.meta/research/token-bench-results-2026-06-13.md(可通过 scripts/bench/lib/recompute-tiers.ts 重新运行)。
Related MCP server: MCP Notion Server (@suncreation)
如何设置 easy-notion-mcp?
使用 API token
创建一个 Notion 集成,复制 token,并将你的页面共享给它。
Claude Code:
claude mcp add notion -s user \
-e NOTION_TOKEN=ntn_your_integration_token \
-- npx -y easy-notion-mcp这会将服务器注册到你的 Claude Code 用户级配置(-s user)中,并通过 -e 将 NOTION_TOKEN 直接传递给 MCP 子进程。你的 shell 环境和 rcfile 不会被改动 —— token 存放在 Claude Code 的配置文件中,作用域限定于此服务器,其他进程不可见。要为 create_page 设置默认父页面,请在同一个命令中添加 -e NOTION_ROOT_PAGE_ID=<page-id>。
OpenClaw:
openclaw config set mcpServers.notion.command "npx"
openclaw config set mcpServers.notion.args '["-y","easy-notion-mcp"]'然后在启动 OpenClaw 之前,通过父 shell 环境提供 token:
export NOTION_TOKEN=ntn_your_integration_token这种 export 形式是任何继承父 shell 环境的 MCP 客户端的通用后备方案。注意:除非你将其添加到 shell rcfile 中(这本身有安全影响),否则它只对当前 shell 会话有效 —— 特别是在使用 Claude Code 时,请优先使用上面的 -e 形式。
Claude Desktop / Cursor / Windsurf —— 添加到你的 MCP 配置文件中:
{
"mcpServers": {
"notion": {
"command": "npx",
"args": ["-y", "easy-notion-mcp"],
"env": {
"NOTION_TOKEN": "ntn_your_integration_token"
}
}
}
}配置文件位置:Claude Desktop → claude_desktop_config.json · Cursor → .cursor/mcp.json · Windsurf → ~/.windsurf/mcp.json
{
"servers": {
"notion": {
"command": "npx",
"args": ["-y", "easy-notion-mcp"],
"env": {
"NOTION_TOKEN": "ntn_your_integration_token"
}
}
}
}用于低上下文 Notion 访问的 CLI 配置文件
当智能体需要访问 Notion 但不想加载完整的 MCP 工具面时,或者当你希望为不同的权限模式使用独立的 Notion 集成时,请使用 easy-notion CLI。配置文件默认位于 ~/.config/easy-notion-mcp/profiles.json,引用的是环境变量名,而非原始 token。
export NOTION_WORK_READONLY=ntn_readonly_token
export NOTION_WORK_WRITE=ntn_readwrite_token
npx -y --package easy-notion-mcp easy-notion profile add work-ro \
--token-env NOTION_WORK_READONLY \
--mode readonly \
--default
npx -y --package easy-notion-mcp easy-notion profile add work-rw \
--token-env NOTION_WORK_WRITE \
--mode readwrite \
--root-page-id your_root_page_id读取命令适用于只读配置文件:
npx -y --package easy-notion-mcp easy-notion --profile work-ro search "roadmap" --filter pages
npx -y --package easy-notion-mcp easy-notion --profile work-ro page read PAGE_ID --include-metadata
npx -y --package easy-notion-mcp easy-notion --profile work-ro content search-in-page PAGE_ID --query "launch" --within-toggle "Script"修改命令需要读写配置文件:
npx -y --package easy-notion-mcp easy-notion --profile work-rw content append PAGE_ID --markdown "## Update"
npx -y --package easy-notion-mcp easy-notion --profile work-rw content update-toggle PAGE_ID --title "Script" --markdown-file ./script.md
npx -y --package easy-notion-mcp easy-notion --profile work-rw content archive-toggle PAGE_ID --title "Done"
npx -y --package easy-notion-mcp easy-notion --profile work-rw content restore-toggle ARCHIVED_BLOCK_ID破坏性 CLI 命令支持 --dry-run 作为只读预检。它会在可能的情况下运行相同的查找和 markdown 验证,返回计划中的字段,如 would_delete_block_ids、would_update、would_archive 或 would_restore,并且不会修改 Notion。
用于智能体路由的轻量级技能发布在本仓库的 skills/easy-notion-cli/ 中。它教导智能体优先使用 CLI 进行基于配置文件的 Notion 访问,而不是注册多个 MCP 服务器。
使用 OAuth
API token + stdio 是摩擦更低的默认方案。如果你运行的是共享部署,或者需要按用户访问,OAuth 可以处理认证,无需复制粘贴 token。
启动服务器:
npx -p easy-notion-mcp easy-notion-mcp-http需要 NOTION_OAUTH_CLIENT_ID 和 NOTION_OAUTH_CLIENT_SECRET 环境变量。请参阅下面的 OAuth 设置。
Claude Code:
claude mcp add notion --transport http http://localhost:3333/mcpOpenClaw:
openclaw config set mcpServers.notion.transport "http"
openclaw config set mcpServers.notion.url "http://localhost:3333/mcp"Claude Desktop:
前往设置 → 连接器 → 添加自定义连接器,输入 http://localhost:3333/mcp。
你的浏览器将打开 Notion 的授权页面。选择要共享的页面,点击允许,完成。
如果你想按项目而不是按用户注册 easy-notion-mcp,请将以下内容粘贴到 你的 项目根目录下的 .mcp.json 文件中:
{
"mcpServers": {
"easy-notion-mcp": {
"command": "npx",
"args": ["-y", "easy-notion-mcp"],
"env": {
"NOTION_TOKEN": "ntn_your_integration_token",
"NOTION_ROOT_PAGE_ID": "your_root_page_id"
}
}
}
}将占位符值替换为你的真实 Notion 集成 token 和(可选的)根页面 ID。请注意,此文件应放在 你的 项目中,而不是本仓库中 —— Claude Code 会自动注册它在项目级 .mcp.json 中找到的任何服务器并尝试启动它,因此提交一个包含占位符凭据的文件会在打开仓库时导致“连接失败”。
Dify / n8n / FlowiseAI(基于 Docker 的平台):
在你的宿主机上运行 HTTP 服务器:
export NOTION_MCP_BEARER=$(openssl rand -hex 32)
NOTION_TOKEN=ntn_your_integration_token \
NOTION_MCP_BIND_HOST=0.0.0.0 \
NOTION_MCP_BEARER=$NOTION_MCP_BEARER \
npx -p easy-notion-mcp easy-notion-mcp-http在你平台的 MCP 服务器设置中,使用 host.docker.internal 而不是 localhost,并将 bearer 添加到请求头中:
http://host.docker.internal:3333/mcp
Authorization: Bearer <your NOTION_MCP_BEARER value>为什么不用 localhost? 这些平台通常在 Docker 中运行。容器内的
localhost指的是容器本身,而不是你的宿主机。host.docker.internal弥补了这一差距。HTTP 主机和 bearer: HTTP 服务器默认绑定
127.0.0.1,静态 token 模式需要NOTION_MCP_BEARER。host.docker.internal访问的是主机的桥接 IP,因此请在主机上设置NOTION_MCP_BIND_HOST=0.0.0.0,并在每个客户端请求中发送 bearer 头。对于共享 Docker 部署,OAuth 模式(为每个用户签发 bearer)是另一种选择。
easy-notion-mcp 可与任何兼容 MCP 的客户端配合使用。服务器通过 stdio(API token 模式)或 HTTP(OAuth 或 API token 模式)运行。
如果在设置过程中遇到问题,Discord 社区 是一个提问的好地方。#easy-notion-mcp 频道涵盖设置和设计讨论。Bug 请提交到 GitHub issues。
配置
Stdio 模式(API token)
变量 | 是否必需 | 默认值 | 描述 |
| 是 | — | Notion API 集成 token |
| 否 | — | 默认父页面 ID |
| 否 |
| 在 markdown 读取响应( |
关于
.env文件(仅限贡献者): easy-notion-mcp 通过dotenv从当前工作目录加载.env文件。实际上,这意味着只有当你从克隆的仓库检出目录运行服务器时(在npm install && npm run build之后执行node dist/index.js),.env才会“直接生效”,因为仓库根目录就是你的当前工作目录。当通过npx easy-notion-mcp或从任意目录全局安装来调用该包时,它不会被加载——这是标准的 npm CLI 行为。对于npx方式,请通过上文 Claude Code 设置 中的-e标志传递NOTION_TOKEN,或通过你的 MCP 客户端配置中的env块传递。
OAuth / HTTP 传输
运行 npx -p easy-notion-mcp easy-notion-mcp-http 以启动支持 OAuth 的 HTTP 服务器。
变量 | 是否必需 | 默认值 | 描述 |
| 是(OAuth 模式) | — | Notion 公共集成的 OAuth 客户端 ID |
| 是(OAuth 模式) | — | Notion 公共集成的 OAuth 客户端密钥 |
| 否 |
| HTTP 服务器端口 |
| 否 |
| OAuth 回调 URL |
| 否 |
| 绑定地址。默认为回环地址;设置为 |
| 是(静态令牌模式) | — | 静态令牌 HTTP 模式下客户端所需的共享密钥 bearer 令牌。没有它服务器将拒绝启动。OAuth 模式下不需要。 |
要获取 OAuth 凭据,请在 notion.so/profile/integrations 创建一个公共集成,并将 http://localhost:3333/callback 配置为重定向 URI。
在 OAuth 模式下,create_page 无需 NOTION_ROOT_PAGE_ID 即可工作——页面默认创建在用户的私有工作区部分。
HTTP 模式安全态势
HTTP 传输专为可信网络设计:单操作员自托管使用 bearer 密钥,或共享部署使用 OAuth。它并未针对直接暴露于开放互联网进行加固;如果你需要远程访问,请在其前面放置一个带 TLS 的反向代理。
静态令牌模式需要 bearer 令牌。 仅设置 NOTION_TOKEN 就启动 npx -p easy-notion-mcp easy-notion-mcp-http 将拒绝启动。请在服务器环境中设置一个共享密钥 bearer 令牌,然后配置你的 MCP 客户端,在每个 /mcp 请求中将其作为 Authorization: Bearer <secret> 发送:
export NOTION_MCP_BEARER=$(openssl rand -hex 32)
NOTION_TOKEN=ntn_your_integration_token npx -p easy-notion-mcp easy-notion-mcp-http该 bearer 令牌通过 crypto.timingSafeEqual 进行比较。缺失或错误的 bearer 令牌会收到 401 { "error": "invalid_token" }。通过使用新值重启服务器来轮换密钥。
默认绑定为回环地址。 服务器默认绑定 127.0.0.1——仅限本地进程。设置 NOTION_MCP_BIND_HOST=0.0.0.0 可暴露所有接口,或设置特定 IP(如 192.168.1.5)以暴露单个接口。无论绑定如何,都需要 bearer 令牌。
始终使用 bearer 令牌是信任边界。 /mcp 端点未启用 DNS 重绑定保护,OAuth 注册/令牌端点(/register、/token、/revoke)上的 CORS 是宽松的。请将 bearer 令牌(或 OAuth 的每用户 bearer 令牌)视为网络与你的 Notion 工作区之间唯一的屏障。即使是仅回环部署也要保持设置。如果你需要将此服务器暴露到可信网络之外,请将其放在处理 TLS 和来源检查的反向代理之后。
OAuth 模式适用于多用户/远程。 OAuth 有自己的每用户 bearer 强制机制;OAuth 模式下不需要 NOTION_MCP_BEARER。对于共享部署,OAuth 的每用户身份模型是合适的形式——静态令牌 + bearer 令牌适用于单操作员自托管。
file:// 上传仅限 stdio。 通过 HTTP 向 create_page、append_content、replace_content、update_section 或 update_page.cover 传递包含 file:// URL 的 Markdown 会被拒绝。对于本地文件工作流,请使用 stdio 模式(create_page_from_file 也仅限 stdio),或将文件托管到 HTTPS URL,并在 Markdown 中使用该 URL。

为什么以 Markdown 为先?
官方 Notion MCP npm 包返回原始 API JSON——深度嵌套的块对象,每个块带有约 120 个 token 的元数据。其他服务器会转换为 markdown,但只支持少数块类型,会静默丢弃标注(callout)、折叠块(toggle)、表格、公式等。
easy-notion-mcp 使用智能体已经熟悉的标准 GFM markdown。无需学习新内容,没有自定义标签语法,也不需要构造块对象。智能体编写 markdown,easy-notion-mcp 负责转换为 Notion 的块 API——以及反向转换,并保留 24 种块类型。
这意味着智能体可以编辑现有内容。读取页面,取回 markdown,修改字符串,再写回。对于此服务器所表示的块类型,受支持的格式和结构都会保留,已知的遗漏和降级情况记录如下。智能体编辑 Notion 页面的方式与编辑代码相同——都是作为文本来编辑。
easy-notion-mcp 是如何工作的?
页面 — 写入和读取 markdown:
create_page({
title: "Sprint Review",
markdown: "## Decisions\n\n- Ship v2 by Friday\n- [ ] Update deploy scripts\n\n> [!WARNING]\n> Deploy window is Saturday 2–4am only"
})读回时——得到相同的 markdown:
read_page({ page_id: "..." }){ "markdown": "## Decisions\n\n- Ship v2 by Friday\n- [ ] Update deploy scripts\n\n> [!WARNING]\n> Deploy window is Saturday 2–4am only" }修改字符串,调用 replace_content,完成。或者通过 update_section 按标题名称定位单个部分。或者执行精准的 find_replace,而不影响页面的其余部分。页面还可以通过 create_page 或 update_page 设置表情符号图标和封面图片。
数据库 — 写入简单的键值对:
add_database_entry({
database_id: "...",
properties: { "Status": "Done", "Priority": "High", "Due": "2026-05-15", "Tags": ["v2", "launch"] }
})不需要属性类型对象,也不需要嵌套的 { select: { name: "Done" } } 包装。easy-notion-mcp 在运行时获取数据库模式并自动转换。智能体传入 { "Status": "Done" },easy-notion-mcp 完成其余工作。
错误会告诉你如何修复。 错误的标题名称会返回可用的标题。页面缺失会提示你将其分享给集成。无效的过滤器会告诉你先调用 get_database。智能体无需向用户求助即可自行纠正。
复杂内容也能处理。 折叠块中嵌套折叠块、混合内容类型的列(列表 + 代码块 + 引用块)、深层列表嵌套,以及完整的 Unicode(日文、中文、阿拉伯文、表情符号)都包含在往返测试中。update_section 的标题搜索不区分大小写,未命中时返回可用标题。add_database_entries 处理部分失败,成功和失败的条目会分别返回,因此智能体可以只重试失败的条目。

easy-notion-mcp 提供哪些工具?
easy-notion-mcp 包含 7 个类别中的 43 个独立命名的工具(HTTP 上为 42 个,其中不包括仅限 stdio 的 create_page_from_file)。工具描述将安全关键行为内联呈现,并指向 MCP 资源以获取更长的参考资料,例如 markdown 语法、警告结构、属性分页和 update_data_source 示例。
页面(20 个工具)
工具 | 描述 |
| 从 markdown 创建页面 |
| 从本地 markdown 文件创建页面(仅限 stdio) |
| 将页面作为 markdown 读取 |
| 按标题名称读取一个部分 |
| 按 ID 读取一个块,包括容器的嵌套子块 |
| 按标题读取一个折叠块或可折叠标题 |
| 在页面或一个折叠块中搜索原始块文本 |
| 向页面追加 markdown |
| 原子地替换所有页面内容(保留匹配块的块 ID) |
| 按标题名称更新一个部分;可选择保留标题的正文替换(破坏性;对于不可替代的内容,请先使用 duplicate_page) |
| 按标题更新一个折叠块的正文(破坏性;保留折叠块容器 ID) |
| 按标题归档一个折叠块或可折叠标题 |
| 按已归档的块 ID 恢复已归档的折叠块或可折叠标题 |
| 查找并替换文本,保留文件 |
| 按 ID 更新单个块(保留块的标识,以支持深层链接和评论) |
| 更新标题、图标或封面 |
| 复制页面及其内容 |
| 将页面移至回收站 |
| 将页面移动到新的父级 |
| 恢复已归档的页面 |
破坏性工具支持 dry_run: true 作为预检。dry-run 不会上传或校验本地 file:// Markdown 上传,因为那会创建 Notion 上传;对于本地文件,请使用 HTTPS URL,或在非 dry-run 模式下运行。replace_content 的 dry-run 会翻译 Markdown 并返回翻译器警告,但它无法呈现 Notion 侧的 unmatched_blocks 或 truncated 字段,因为它不会调用 Notion 的更新端点。
restore_toggle 有意基于 ID:传入 archive_toggle 返回的已归档块 ID。Notion 不提供已归档子块的枚举来支持标题搜索,也没有 read_page include_archived 工作流,因此无法按标题恢复。
导航(3 个工具)
工具 | 描述 |
| 列出父页面下的子页面,每行包含 |
| 搜索页面和数据库 |
| 获取可分享的 URL |
每一行 list_pages 返回 id、title、created_time 和 last_edited_time,因此代理无需逐页往返即可区分活跃页面和过期页面。时间戳直接来自 Notion,精确到分钟,last_edited_time 会在页面内容和属性编辑时更新。请注意它与 search 的刻意区别:search 只返回日期形式的 last_edited,而 list_pages 返回完整的 ISO-8601 时间戳 last_edited_time。
数据库(9 个工具)
工具 | 描述 |
| 创建具有类型化架构的数据库 |
| 更新数据库架构(添加、重命名或删除属性;更改标题;移至回收站或恢复) |
| 获取数据库架构、属性名称和选项 |
| 列出集成可以访问的所有数据库 |
| 使用筛选器、排序或文本搜索进行查询 |
| 使用简单的键值对添加一行 |
| 在一次调用中添加多行 |
| 使用简单的键值对更新一行 |
| 删除(归档)一个数据库条目 |
数据库写入工具会拒绝未知属性名称和不支持的属性类型,并给出明确错误,而不是静默丢弃。 请先调用
get_database确认属性名称和类型。写入支持的属性类型:title、rich_text、number、select、multi_select、date、checkbox、url、phone、status、relation、people。对于people,传入单个用户 ID 字符串或用户 ID 数组。计算类型(formula、rollup、unique_id、created_time、last_edited_time、created_by、last_edited_by)由 Notion 填充,无法通过 API 设置。files、verification、place、location和button的值写入也会被拒绝。对于关系写入,传入单个页面 ID 字符串("Projects": "page-id")或数组("Projects": ["id-a", "id-b"]);空数组会清除该关系。
easy-notion-mcp 会获取数据库架构,将值映射为 Notion 的属性格式,并在代理传入类似 { "Status": "Done" } 的简单键值对时自动处理类型转换。架构会缓存 5 分钟,以避免批量操作期间产生冗余 API 调用。
视图(6 个工具)
工具 | 描述 |
| 列出数据库或数据源的已保存视图 |
| 获取某个已保存视图的原始配置 |
| 通过已保存视图查询条目 |
| 创建表格、列表、看板、日历、画廊或时间线视图 |
| 重命名或更新已保存视图的原始筛选/排序/配置字段 |
| 在明确确认后删除已保存视图 |
评论(2 个工具)
工具 | 描述 |
| 列出页面上的评论 |
| 向页面添加评论 |
用户(2 个工具)
工具 | 描述 |
| 列出工作区用户 |
| 获取当前机器人用户 |
服务器(1 个工具)
工具 | 描述 |
| 报告服务器自身的设置:版本、传输方式、工作区根目录和可见工具数量 |
当文件路径或配置错误让你无从下手时,get_config 就是你要用的工具。create_page_from_file 只接受工作区根目录内的路径;当路径超出该范围时,拒绝信息现在会指明解析后的根目录。get_config 让你直接读取该根目录,而无需推断。在 HTTP 模式下,工作区根目录不适用,因此路径字段为 null,状态为 not_applicable;服务器绝不会向 HTTP 调用方报告主机路径。
有哪些 MCP 资源可用?
支持 MCP 资源的客户端可以按需读取这些文档,而无需将所有参考材料加载到每个工具描述中:
资源 URI | 内容 |
| 页面写入和读取所支持的 Markdown 语法 |
| 警告代码和响应形状 |
|
|
|
|
easy-notion-mcp 支持哪些块类型?
easy-notion-mcp 支持 24 种 Notion 块类型,使用标准 Markdown 语法,并扩展了针对 Notion 特有块(如开关、分栏和标注)的约定。代理编写熟悉的 Markdown——easy-notion-mcp 负责与 Notion 块格式之间的相互转换。
标准 Markdown
语法 | Markdown |
标题 |
|
粗体、斜体、删除线 |
|
行内代码 |
|
链接 |
|
图片 |
|
无序列表 |
|
有序列表 |
|
任务列表 |
|
引用块 |
|
代码块 |
|
表格 | 标准管道表格语法 |
分隔线 |
|
Notion 特有语法
块 | 语法 |
开关 |
|
分栏 |
|
标注(备注) |
|
标注(提示) |
|
标注(警告) |
|
标注(重要) |
|
标注(信息) |
|
标注(成功) |
|
标注(错误) |
|
公式 |
|
目录 |
|
嵌入 |
|
书签 | 单独成行的裸 URL |
文件上传(图片) |
|
文件上传(文件) |
|
换行与 collapse_soft_wraps
默认情况下,段落内的单个换行符会原样写入。因此,在固定列处硬换行的 Markdown(大多数仓库中的惯例)到达 Notion 时会带有这些换行。该默认行为没有改变。
每个写入 Markdown 的工具都接受可选的 collapse_soft_wraps: true,它会改为应用 CommonMark 的软换行语义:段落内的单个换行符变为空格,因此硬换行的文件会以流畅的段落形式到达。空行仍然分隔块,围栏代码块在两种模式下都不受影响。
easy-notion page create-from-file --title "Design notes" --file ./NOTES.md --collapse-soft-wraps在重新上传从 Notion 读回的内容时,不要使用该选项,否则有意的换行会丢失。
显式硬换行(末尾反斜杠或两个末尾空格)无论是否设置该选项,行为都相同,但会因写入路径而异:
写入路径 | 硬换行行为 |
| 保留在块内 |
| Notion 的增强 Markdown 导入会将段落内的换行渲染为单独的段落,因此硬换行会以段落拆分的形式到达 |
这种差异是导入路径的属性,而不是 collapse_soft_wraps 的属性。
标题与开头 H1 重复
create_page 和 create_page_from_file 接受可选的 strip_leading_h1: true,它会移除文档开头的 H1,这样以你传入的 title 作为开头标题的文件不会在页面上重复出现该标题。它仅当第一个转换后的顶级块是普通(不可切换)的 heading_1 时生效,默认值为 false。
easy-notion page create-from-file --title "Design notes" --file ./NOTES.md --strip-leading-h1create_page、create_page_from_file、append_content、replace_content、update_section 和 update_toggle 接受 return_block_map: false,以便在不需要时省略 block_map;默认值仍为 true 且保持不变。
我能否在保留格式的情况下读取和重写页面?
可以,对于此服务器所代表的 markdown 约定而言。往返支持覆盖 24 种块类型。已知的遗漏和降级情况均有文档记录,其中许多会通过显式警告报告。
read_page 返回 create_page 接受的 markdown 约定:标题、列表、表格、标注、折叠块、分栏、公式和页面提及。
当页面包含此服务器尚不支持的 Notion 块类型(如 synced_block、child_database、child_page 或 link_to_page)时,read_page 会包含一个 warnings 字段,其中代码为 omitted_block_types,列出被省略的块 ID 和类型。通过 replace_content 将该 markdown 写回会删除这些块,因此该警告可让代理避免不安全的改写。对于内联页面提及,请使用 @[Title](notion-url),这是与 link_to_page 块类型不同的独立结构。
Notion AI 会议记录(以及已弃用的 transcription)块会渲染为一个合成折叠块,其中包含标题、可选的录制时间戳,以及 ## Summary / ## Notes 部分;只有使用 read_page include_transcript: true 时才会包含转录文本。这些渲染读取会发出 read_only_block_rendered 警告,以提示将该 markdown 写回会用普通块替换原生会议块。
某些降级不会以警告形式报告。在 replace_content 路径上,书签和嵌入会以裸 URL 形式写入(这些确实会产生警告),而 file、audio 和 video 块会被静默缩减为它们的 URL。下划线和彩色文本注释无法用 markdown 表示,在读取和写入时会被静默丢弃。
easy-notion-mcp 使代理能够读取页面、修改 markdown 字符串并写回,同时保留受支持的格式、结构和内容。无需格式转换。无需块重建。代理编辑 Notion 页面的方式与编辑代码相同——以文本形式。
find_replace 和 replace_content 之间有什么区别?
easy-notion-mcp 为不同用例提供了三种编辑策略:
replace_content— 用新的 markdown 替换页面上的所有内容。最适合整体重写。update_section— 替换由标题名称标识的单个部分。默认情况下,替换 markdown 包含标题并替换整个部分。传入preserve_heading: true(或 CLI--preserve-heading)可保留现有标题的块 ID、文本、类型、评论和可折叠状态,同时仅破坏性地替换该部分的主体。find_replace— 在页面任意位置查找并替换特定文本,保留所有其他内容和附件。最适合精准编辑。
在破坏性编辑之前,如果你想要预检响应而不是实际变更,请在 MCP 工具上传入 dry_run: true,或在 CLI 中传入 --dry-run。
easy-notion-mcp 如何处理数据库?
easy-notion-mcp 提供 9 个数据库工具,抽象掉了 Notion 复杂的属性格式。代理传入简单的键值对,如 { "Status": "Done", "Priority": "High" };easy-notion-mcp 在运行时获取数据库架构,缓存 5 分钟,并自动转换为 Notion 的属性格式。
easy-notion-mcp 支持使用类型化架构创建和更新数据库、使用过滤器和排序进行查询,以及通过 add_database_entries 进行批量操作(一次调用多行)。
食谱:为你自己的代理准备的配方
这些配方将你自己的代理指向 Notion。代理拥有智能;easy-notion-mcp 通过现有的 MCP 工具提供确定性的连接纽带,因此这些配方可按需运行,无需二次安装。它们是免费且自主的:你自己的代理、你自己的令牌、无需 OAuth 的 API 令牌设置,以及免费套餐的数据库查询。
当等效工具启用时,这些步骤可通过 MCP 工具或 claude.ai 连接器完成。配方 2 还可通过 skills/easy-notion-cli/ 中的 easy-notion CLI 技能完成;配方 1 需要 create_database、使用 search_in_page 进行源块查找,以及结构化的去重过滤器,而当前的 CLI 界面并未暴露这一完整工作流。Claude Code 代理可以使用 skills/notion-recipes/ 中的操作技能。
配方 1:从会议记录到行动项
此配方将会议记录页面或粘贴的笔记转换为 Action Items 数据库中的去重行。工具序列为:先执行一次 create_database,然后每次运行时,当源是页面时执行 read_page,使用 search_in_page 解析每个项目的源块 ID,对每个候选项目使用带有精确 Item Key 过滤器的 query_database,使用 add_database_entry 或 add_database_entries 添加新行,最后执行 query_database 进行验证。
经过验证的实际结果是,一次规划会议产生了 5 行。缺失的负责人和截止日期存储在 Flags 多选字段中,而不是 Source 中;一个 query_database 过滤器 {"property":"Item Key","rich_text":{"equals":"38bbe876-242f-81f1-97b7-df935d050a24:38bbe876-242f-81c9-86c6-d9a792fc70b7"}} 恰好返回 1 行。对相同笔记运行两次后,计数仍为 5,且零重复。对共享会议名称进行自由文本搜索会返回每一行,因为它也扫描了 Source,因此此配方使用精确的 Item Key 过滤器进行去重。
安全边界:配方 1 可安全重跑且具有幂等性,因为 Item Key 存储的是源行的稳定 Notion 身份(<pageId>:<blockId>),而不是行动措辞。
面向 claude.ai 连接器用户的复制粘贴内容,配方 1
Use the enabled easy-notion or Notion connector tools to turn my meeting notes into an Action Items database.
Note: the simple {"Property":"Value"} write format below assumes the easy-notion tools. If only the official Notion connector is enabled, wrap each value in its Notion property-type object instead.
Inputs I will provide:
- Meeting notes page or pasted meeting notes: <MEETING_NOTES_PAGE_OR_TEXT>
- Parent page for the database, if a new database is needed: <PARENT_PAGE>
- Existing Action Items database, if one already exists: <DATABASE_NAME_OR_ID>
If an Action Items database does not already exist, create one with these properties:
- Name: title
- Item Key: rich_text
- Owner: rich_text
- Due: date
- Status: status
- Flags: multi_select
- Source: rich_text
Read the meeting notes or use the pasted notes. Extract only discrete action items. For each item, derive:
- Name: the action text
- Owner: the named assignee, or blank
- Due: the stated date as ISO YYYY-MM-DD, or blank
- Item Key: the source line's stable identity, formatted as <sourcePageId>:<sourceBlockId>
- Source: the meeting title plus date, with no flags stashed here
- Status: Not started
- Flags: add needs-owner if no owner, and needs-due if no due date
Resolve sourceBlockId with search_in_page. read_page returns markdown without block IDs. For a Notion-page source, call read_page to extract items, then for each item call search_in_page with a verbatim, distinctive substring of that item's original source line. Use the matches[].block_id whose text is that source line. If several blocks match, use a longer verbatim substring to isolate one block. For pasted notes, first save them as a Notion page with create_page, then proceed through search_in_page. Do not rely on block IDs from create_page, which returns only {id,title,url}. If one source line contains multiple distinct actions, append a stable ordinal suffix in source order, such as :1 or :2, to keep keys unique.
Before inserting each item, dedupe with an exact Item Key filter:
{"property":"Item Key","rich_text":{"equals":"<that item's key>"}}
If the query returns no results, insert the row with simple key-value properties. If it returns a result, skip that item. Do not dedupe with free-text database search, because text search also scans Source and can false-match every row from the same meeting.
After inserting, query the database and summarize the rows created and skipped.
Re-running is safe and idempotent because the exact Item Key filter uses the source line's stable Notion identity, not the action wording.配方 2:批量编辑、查找替换与修复
此配方涵盖两个代理可以超越 Notion 原生限制进行迭代的方面:数据库属性修复和页面正文查找替换。对于数据库修复,序列为:get_database、遍历所有行的 query_database、构建规范化映射、对需要修复的行执行 update_database_entry,然后重新查询。对于页面文本,序列为:使用 dry_run: true 的 find_replace、使用 replace_all: true 的 find_replace,然后执行 read_page 进行验证。
经过验证的实际数据库修复将 4 行中混合的 Eng 和 engineering 值规范化为一个一致的选项,同时保持无关行不变。经过验证的实际页面编辑替换了段落和标题正文中的 4 处内容。注意:select 和 status 选项匹配不区分大小写,写入时会吸附到最早存在的选项的大小写形式。如果已存在小写变体,写入大写版本会复用现有小写选项。若要强制特定大小写,请在 Notion 的 UI 中重命名该选项,而不是写入新的大小写形式。
面向 claude.ai 连接器用户的复制粘贴内容,配方 2
Use the enabled easy-notion or Notion connector tools to repair Notion database rows or replace repeated text in a Notion page.
Note: the simple {"Property":"Value"} write format below assumes the easy-notion tools. If only the official Notion connector is enabled, wrap each value in its Notion property-type object instead.
Inputs I will provide:
- Target database for property repair: <DATABASE_NAME_OR_ID>
- Property to normalize: <PROPERTY_NAME>
- Normalization map, for example {"Eng":"Engineering","engineering":"Engineering"}
- Target page for find-replace, if needed: <PAGE_NAME_OR_ID>
- Find text and replacement text, if needed: <FIND_TEXT> -> <REPLACE_TEXT>
For database property repair:
1. Get the database schema so you know the exact property names. If select or status options are missing from the schema, query live rows and read the current values from the results.
2. Query the database rows. If the database is large, page through all results in a loop.
3. Build or use the normalization map I provide.
4. For each row whose property value needs fixing, update that row with a simple key-value map such as {"<PROPERTY_NAME>":"<CANONICAL_VALUE>"}.
5. Re-query the database and summarize how many rows changed and which values remain.
Important caveat: select and status option matching is case-insensitive, and writes snap to the earliest-existing option's casing. If a lowercase variant already exists, writing a capitalized version may reuse the lowercase option. To force specific casing, I need to rename the option in Notion's UI.
For page-body find-replace:
1. Run a dry-run find-replace with replace_all enabled and report the match count before changing anything.
2. If the match count is expected, run find-replace with replace_all enabled.
3. Read the page afterward and verify the replacement.安全性和提示注入呢?
easy-notion-mcp 为生产部署包含两层安全机制:
提示注入加固: Markdown 读取响应(read_page、read_section、read_block 和 read_toggle)包含一个内容提示前缀,指示代理将 Notion 数据视为内容而非指令。search_in_page 返回的原始片段/文本也应同样对待。这降低了页面内容引导代理行为的风险;最终行为取决于模型和客户端。如果你控制工作区,可设置 NOTION_TRUST_CONTENT=true 来禁用 markdown 提示。
URL 清理: javascript:、data: 和其他不安全的 URL 协议会被剥离并渲染为纯文本。仅允许 http:、https: 和 mailto:。

稳定性与版本管理
easy-notion-mcp 遵循 语义化版本控制。自 1.0.0 起,公共契约被冻结为仅做增量变更:工具名称、工具输入模式、工具返回形状、自定义 markdown 约定以及警告代码词汇表,在未来的 2.0 版本发布之前不会以破坏性方式更改。增量变更(新工具、新可选参数、新可选响应字段、新警告代码)不属于破坏性变更,可以在次要版本中发布。
两个层面不在冻结范围内:OAuth / HTTP 身份验证契约是实验性的,在其安全态势成熟之前可能会发生变化;easy-notion CLI 处于 1.0 之前版本,尚未覆盖。完整的契约声明和每个版本的历史记录请参阅 CHANGELOG。
常见问题
easy-notion-mcp 与官方 Notion MCP 服务器有何不同?
官方 Notion MCP npm 包(@notionhq/notion-mcp-server)是一个原始 API 代理,返回未修改的 Notion JSON,因此读取一个页面的响应令牌消耗大约是 easy-notion-mcp 的 markdown 的 6–7 倍。easy-notion-mcp 将所有内容转换为代理已经熟悉的标准 GFM markdown,支持 24 种块类型并带有文档记录的往返注意事项,并且包含提示注入加固。Notion 还提供了一个单独的托管远程 MCP 服务器(基于 OAuth),使用自定义的基于 HTML 标签的 markdown 格式,而 easy-notion-mcp 使用标准 markdown 语法。
easy-notion-mcp 支持哪些 MCP 客户端?
easy-notion-mcp 可与任何兼容 MCP 的客户端配合使用,包括 Claude Desktop、Claude Code、Cursor、VS Code Copilot、Windsurf 和 OpenClaw。它同时支持 stdio 传输(API 令牌)和 HTTP 传输(OAuth)。有关每个客户端的可复制粘贴配置,请参阅 设置说明。
easy-notion-mcp 支持文件上传吗?
支持。easy-notion-mcp 支持使用 markdown 语法中的 file:/// 协议进行文件上传。使用  上传图片,使用 [name](file:///path/to/file.pdf) 上传文件。
easy-notion-mcp 能处理嵌套和复杂内容吗?
能。折叠块内嵌套折叠块、包含混合内容类型的分栏(不同分栏中的列表、引用块和代码块)、嵌套的项目符号列表和编号列表,以及完整的 unicode 支持(包括日文、中文、俄文、阿拉伯文和表情符号),这些受支持的结构都有往返测试覆盖。
easy-notion-mcp 能处理批量操作中的部分失败吗?
能。add_database_entries 返回独立的 succeeded 和 failed 数组。如果某个条目验证失败,其他条目仍会被创建。代理可以只重试失败的条目,而无需重新发送整个批次。
社区
社区 Discord 位于 discord.gg/S8cghJSVBU。#easy-notion-mcp 频道涵盖设置问题和设计讨论,服务器的其余部分开放用于展示分享或一般交流。对于错误和具体的功能请求,GitHub issues 仍然是权威渠道。
贡献
欢迎在 GitHub 上提交 Issue 和 PR。
许可证
MIT
Available Tools
43 toolsadd_commentA
Add a comment to a page. Supports inline markdown and page mentions with @Title. 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 }.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Comment text (supports markdown inline formatting) | |
| page_id | Yes | Page ID | |
| collapse_soft_wraps | No | Collapse single line breaks to spaces per CommonMark before writing. Default false (single line breaks are kept as they are today). Recommended when posting hard-wrapped prose. Do not use when re-posting content read from Notion, or intentional line breaks will be lost. Blank lines are unaffected. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It discloses that unresolved mentions cause the call to fail, that no warning is returned, and that the response shape is { id, content }. This is meaningful transparency beyond the schema, though it does not address permissions or other side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, no filler. The primary action comes first, the important failure caveat is second, and the return shape is last. Every sentence earns its place and the description remains compact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a comment-creation tool with no output schema and no annotations, the description covers the essential operational details: what the tool does, the expected return shape, and a critical failure mode. It is not exhaustive, but it is complete enough for an agent to invoke the tool correctly in most cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value beyond the schema by spelling out the mention syntax @[Title](notion-url) and clarifying that this syntax is supported in inline comment text. This supplements the schema's simpler 'supports markdown inline formatting.'
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb and resource: 'Add a comment to a page.' It also differentiates itself from append_content by explaining a key mention-resolution difference, so an agent can distinguish this tool from a closely related sibling without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the primary use case clear—add a comment to a page—and provides a meaningful comparison to append_content regarding unresolved mentions. It does not enumerate all alternatives or edge cases, but the context is sufficient for an agent to choose this tool over sibling comment-related operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_database_entriesA
Create 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 — partial failures don't block the batch.
| Name | Required | Description | Default |
|---|---|---|---|
| entries | Yes | Array of property objects, same format as add_database_entry | |
| page_id | No | Alias accepted when database_id is absent. If the ID is a page containing exactly one inline database, it resolves to that database. Providing both database_id and page_id with different values is an error. | |
| database_id | No | Database ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden. It meaningfully reveals per-entry results and that partial failures don't block the batch, which is important batch behavior. It doesn't address permissions or failure details of the whole call, but for a create operation this is reasonable coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with no filler. The core purpose is front-loaded, and each sentence adds useful information: batch creation, format reference, and failure behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is adequate for a moderately simple batch-create tool. It covers the operation, the entry format, and the key behavioral nuance of partial failures. Minor gaps such as response shape details and any batch size limits are acceptable given the succinctness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters are documented. The description mostly restates what the entries parameter already says about using the same format as add_database_entry, adding little new parameter-level meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Create multiple entries in a database in one call.' It also clearly differentiates this from the singular sibling add_database_entry by emphasizing the batch nature.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The batch context is clear: use this when creating multiple database entries at once. It does not explicitly state exclusions or name alternatives as a routing rule, but the intent is obvious enough for an agent to choose between this and the singular sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_database_entryA
Create 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, phone: string
relation: string or array of page IDs
people: string or array of user IDs
Not writable from this tool:
formula, rollup, unique_id, created_time, last_edited_time, created_by, last_edited_by: computed by Notion
files, verification, place, location, button: not supported for value writes here
Example: { "Name": "Buy groceries", "Status": "Todo", "Priority": "High", "Due": "2025-03-20", "Tags": ["Personal"] }.
| Name | Required | Description | Default |
|---|---|---|---|
| page_id | No | Alias accepted when database_id is absent. If the ID is a page containing exactly one inline database, it resolves to that database. Providing both database_id and page_id with different values is an error. | |
| properties | Yes | Key-value property map to convert using the database schema | |
| database_id | No | Database ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses writable property types, notes date is start-only, and lists computed or unsupported properties that cannot be written. It doesn't discuss response format, failures, or permissions, but still provides substantial behavioral clarity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is structured well: purpose, prerequisite, type mappings, exclusions, and example. It is longer than average, but the density of actionable information justifies the length and it remains scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a create operation with no output schema or annotations, the description provides preconditions, accepted value shapes, and unsupported properties needed to invoke it correctly. It doesn't describe response format or error behavior, but those are less critical for a straightforward creation call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Even though schema coverage is 100%, the description adds significant meaning beyond the schema by mapping each Notion property type to concrete JSON input shapes and giving an example object. It also clarifies unsupported property categories, greatly enriching the vague 'properties' parameter description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Create one database entry using simple key-value property inputs,' naming a specific verb and resource. The singular 'one' differentiates it from siblings like add_database_entries and update_database_entry.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly directs agents to 'Call get_database first' to discover valid property names and select/status options, giving a clear prerequisite. It doesn't explicitly name alternative tools or when-not-to-use conditions, but the single-entry scope and property guidance make intended usage clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
append_contentA
Append 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. Supports the same syntax as create_page; read resource easy-notion://docs/markdown for the full syntax guide. Page mentions: @Title; a mention the integration cannot resolve is downgraded to a plain link and reported with a mention_target_unresolved warning. Returns: { success: true, blocks_added: }, plus block_map for top-level appended blocks when present and warnings when present.
| Name | Required | Description | Default |
|---|---|---|---|
| page_id | Yes | Page ID | |
| markdown | Yes | Markdown to append | |
| return_block_map | No | Include block_map in the response. Default true. Set false to skip the per-block id list when you do not plan to edit individual blocks. | |
| collapse_soft_wraps | No | Collapse single line breaks to spaces per CommonMark before writing. Default false (single line breaks are kept as they are today). Recommended when uploading hard-wrapped prose files (e.g. repo markdown wrapped at 78 columns). Do not use when re-uploading content read from Notion, or intentional line breaks will be lost. Blank lines and code blocks are unaffected. Note: replace_content renders an in-paragraph line break as a separate paragraph regardless of this option. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full responsibility for disclosing behavior, and it does so thoroughly: it explains server-side batching, rich text splitting, nested block handling, mention resolution fallback with a warning, and the exact return shape. This far exceeds typical MCP descriptions and leaves little hidden behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence earns its place: purpose, conversion semantics, rate-limit handling, syntax compatibility, mention behavior, and return payload. It is front-loaded with the core purpose and contains no filler or redundant restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there is no output schema and no annotations, the description is remarkably complete—it covers behavior, limitations, error/warning conditions, return values, and even references a syntax guide for advanced usage. The only minor omission is explicitly stating insertion position, but 'append' already conveys that clearly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds meaningful context beyond the schema by explaining the markdown conversion behavior, pointing to the full markdown syntax guide, and detailing mention fallback behavior for the markdown parameter. This materially improves parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('append'), a specific resource ('markdown content to an existing page'), and the semantics ('converts markdown into native Notion blocks'). It differentiates from sibling tools like create_page and replace_content by framing the action as additive to an existing page.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly indicates this tool is for appending to existing pages and explicitly notes that large documents can be sent in one call without pre-chunking, which guides when it is appropriate. It does not explicitly contrast with replace_content or create_page in a when-to-use/when-not-to-use list, but the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
archive_pageC
Archive a page in Notion.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | Preview the archive target without mutating Notion. Default false. | |
| page_id | Yes | Page ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description does not disclose behavioral traits beyond the minimal verb. No annotations are present, so the description must cover behaviors like reversibility or side effects, but it fails to do so. The presence of the 'dry_run' parameter implies mutability, but this is not explained.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence, concise and to the point. It could be improved by adding structured details, but it wastes no words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is minimal and does not address the tool's behavior in context. With sibling tools like 'archive_toggle', 'restore_page', and 'delete_*' operations, more context is needed to differentiate. The 'dry_run' parameter and return values are not described.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage with descriptions for both parameters. The tool description adds no additional meaning beyond the schema, so it meets the baseline of 3 without adding value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (archive) and resource (page) within Notion. It is specific enough to distinguish from sibling tools like 'archive_toggle' by resource variation, but lacks further detail on what archiving entails.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. There is no mention of prerequisites, non-archiving cases, or references to related tools like 'restore_page' or 'delete_database_entry'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
archive_toggleA
Archive 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.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Toggle title to find (case-insensitive) | |
| dry_run | No | Preview the archive target without mutating Notion. Default false. | |
| page_id | Yes | Page ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description bears full burden. Discloses recursive search, case-insensitive matching, archiving of container only (children not deleted), and behavior on missing title (returns available titles). Covers key behaviors but could mention if action is reversible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, no fluff, front-loaded with main purpose. Each sentence adds distinct value: verb, search specifics, archiving behavior, edge case.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers matching logic, archival behavior, and missing title edge case. No output schema, so return value on success is not specified, but overall complete for a simple tool. Could mention permissions or reversibility.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for all params. Description adds minimal extra meaning (e.g., 'case-insensitive trimmed text' reinforces title param, but overall adds little beyond schema). Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states verb 'archive', resource 'one toggle by title from a page', and specifies matching logic including toggle blocks and headings. Distinguishes from siblings like restore_toggle and read_toggle.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implied usage for archiving a single toggle by title, but no explicit when-to-use vs alternatives (e.g., archive_page) or when-not-to-use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_databaseA
Create 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")
rollup (required: function, relation_property, rollup_property)
relation (required: data_source_id; optional: relation_type "single_property" or "dual_property", synced_property_name)
unique_id (optional: prefix, for example "ENG")
people, files
created_time, last_edited_time, created_by, last_edited_by
verification, place, location, button
Unknown property types fail with an explicit error. No silent drops.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Database title | |
| schema | Yes | Array of {name, type} property definitions | |
| is_inline | No | Create the database inline within the parent page | |
| parent_page_id | Yes | Parent page ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries the behavioral burden. It explicitly states that unknown property types 'fail with an explicit error. No silent drops,' which is critical for safe tool invocation. It also lists supported types and optional extras, ensuring the agent knows exactly what will happen.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear opening sentence followed by a bulleted list of property types. It is informative without being verbose, though it could be slightly more concise by omitting redundant wording (e.g., 'optional' repeated). Still, it earns its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description is remarkably complete. It covers the core action, property type options, error handling, and even provides usage examples for extras. The agent has sufficient context to use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage for parameters, so the baseline is 3. The description adds significant value to the 'schema' parameter by detailing supported property types, aliases, and extras (e.g., format for number, options for select). This exceeds the schema's basic array definition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the exact action: 'Create a database under a parent page.' It lists supported property types, which distinguishes it from sibling tools like create_page or add_database_entry. The verb+resource is specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use this tool (to create a database with specific property types). It does not explicitly mention when not to use it or provide alternatives, but the extensive type list implies applicability. A brief note about alternatives (e.g., use add_database_entry for adding entries) would improve it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_pageA
Create 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. Returns { id, title, url, success: true }, note for workspace-parent pages, plus block_map for top-level created blocks when present.
| Name | Required | Description | Default |
|---|---|---|---|
| icon | No | Optional emoji icon | |
| cover | No | Optional cover image URL | |
| title | Yes | Page title | |
| markdown | Yes | Markdown content for the page body | |
| parent_page_id | No | Parent page ID. Resolution order when omitted: NOTION_ROOT_PAGE_ID env var → last used parent in this session → workspace-level private page (OAuth mode). In stdio mode without NOTION_ROOT_PAGE_ID, this is required on first use. | |
| return_block_map | No | Include block_map in the response. Default true. Set false to skip the per-block id list when you do not plan to edit individual blocks. | |
| strip_leading_h1 | No | Remove the document's leading H1 heading. Applies only when the first converted top-level block is a plain (non-toggleable) heading_1. Useful when title is also passed and the file begins with the same heading. Default false. | |
| collapse_soft_wraps | No | Collapse single line breaks to spaces per CommonMark before writing. Default false (single line breaks are kept as they are today). Recommended when uploading hard-wrapped prose files (e.g. repo markdown wrapped at 78 columns). Do not use when re-uploading content read from Notion, or intentional line breaks will be lost. Blank lines and code blocks are unaffected. Note: replace_content renders an in-paragraph line break as a separate paragraph regardless of this option. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does it well: it discloses server-side batching/splitting/nesting behavior, the stdio-only file:// upload constraint, and the return shape including block_map. It could add failure modes or permission requirements, but the major behavioral traits are transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but free of filler. Every sentence adds operational value: purpose, server-side handling, upload constraints, syntax, and return format are all covered without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a write tool with no output schema, the description adequately covers the return object, batching behavior, and syntax rules, with parameter resolution delegated to the rich input schema. The main gaps are error/failure semantics and explicit routing guidance relative to sibling tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaningful parameter-level context by defining the markdown syntax extensions (easy-notion://docs/markdown and @[Title](notion-url)) and clarifying when block_map is relevant. This goes beyond the schema's generic 'Markdown content' description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description is highly specific: 'Create a Notion page from markdown as native Notion blocks' names the verb, resource, input format, and conversion behavior. It also semantically separates itself from the sibling create_page_from_file by emphasizing in-memory markdown rather than file input.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear operational context: the server handles batching, splitting, and nesting, so the agent should not pre-chunk input. It also documents supported syntax for uploads and mentions. It stops short of explicitly naming alternative tools or saying when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_page_from_fileA
Create 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.
STDIO MODE ONLY. This tool is not available when the server runs over HTTP, because in HTTP mode the server's filesystem belongs to the server host, not the caller.
Restrictions:
file_path must be an ABSOLUTE path (no relative paths, no ~ expansion)
File must be inside the configured workspace root (defaults to the server's process.cwd(); override via the NOTION_MCP_WORKSPACE_ROOT env var)
File extension must be .md or .markdown
File size must be ≤ 1 MB (1,048,576 bytes)
File must be valid UTF-8
Symlinks are resolved and the resolved path must still be inside the workspace root
For supported markdown syntax, read resource easy-notion://docs/markdown. Page mentions: @Title. Returns: { id, title, url, success: true }, plus note only when created as a private workspace page, plus block_map for top-level created blocks when present.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Page title | |
| file_path | Yes | Absolute path to a local .md or .markdown file (≤ 1 MB, UTF-8, inside the configured workspace root) | |
| parent_page_id | No | Parent page ID. Same resolution rules as create_page. | |
| return_block_map | No | Include block_map in the response. Default true. Set false to skip the per-block id list when you do not plan to edit individual blocks. | |
| strip_leading_h1 | No | Remove the document's leading H1 heading. Applies only when the first converted top-level block is a plain (non-toggleable) heading_1. Useful when title is also passed and the file begins with the same heading. Default false. | |
| collapse_soft_wraps | No | Collapse single line breaks to spaces per CommonMark before writing. Default false (single line breaks are kept as they are today). Recommended when uploading hard-wrapped prose files (e.g. repo markdown wrapped at 78 columns). Do not use when re-uploading content read from Notion, or intentional line breaks will be lost. Blank lines and code blocks are unaffected. Note: replace_content renders an in-paragraph line break as a separate paragraph regardless of this option. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries the behavioral burden. It discloses file validation, automatic 100-block batching, 2000-char splitting, deep-nesting handling, symlink resolution, workspace-root enforcement, and the exact return shape. This is unusually transparent for a tool definition.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence earns its place. It front-loads the core purpose, then logically groups mode restrictions, file constraints, markdown reference, and return value. The bulleted restriction list improves scannability without wordiness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool with no output schema and no annotations, this description is remarkably complete: it covers prerequisites, environmental constraints, file validation rules, conversion behavior, return values, and edge-case options. An agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds significant meaning beyond the schema: absolute-path requirements, workspace-root default and override, symlink resolution, file-size and encoding limits, and detailed behavior for collapse_soft_wraps with usage recommendations. The parameter descriptions are materially enhanced.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb-resource pair ('Create a Notion page from a local markdown file') and explicitly distinguishes itself from create_page by noting it produces the same result without sending file contents through the agent context. This makes its purpose unmistakable even among many sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is explicit: it is STDIO mode only, unavailable over HTTP, and appropriate when file contents should not pass through agent context. It also names create_page as the equivalent alternative and provides concrete do/don't guidance for collapse_soft_wraps, plus a resource for supported markdown syntax.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_viewA
Create a Notion database view. Pass database_id. Dashboard views and dashboard widget placement are not supported.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | View name | |
| type | Yes | View type. Dashboard is intentionally unsupported. | |
| sorts | No | Raw Notion view sorts payload | |
| filter | No | Raw Notion view filter payload | |
| position | No | Raw Notion view tab position payload | |
| database_id | Yes | Database ID | |
| configuration | No | Raw Notion view configuration payload. Dashboard configuration is rejected. | |
| quick_filters | No | Raw Notion quick filters payload |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It notes unsupported types but fails to mention side effects, return values, or error scenarios. The minimal detail is adequate for a simple create operation but lacks depth for complex configurations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences deliver all necessary purpose and usage notes without extraneous content. The front-loading of the core function is effective.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 8 parameters, no output schema, and no annotations, the description is incomplete for a fully autonomous agent. While it covers the basic requirement and a key limitation, it lacks details on success behavior, error handling, and nested object structures.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters. The description adds only a brief instruction to pass database_id and reiterates the dashboard exclusion seen in the schema, providing marginal added value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Create a Notion database view,' specifying the verb and resource. It also distinguishes itself from sibling tools like delete_view and update_view by mentioning unsupported dashboard views, which helps avoid misuse.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description instructs to 'Pass database_id,' indicating a prerequisite, and explicitly states 'Dashboard views and dashboard widget placement are not supported,' providing clear exclusion criteria. However, it does not compare with alternatives like update_view or query_view.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_database_entryB
Delete (archive) a database entry.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | Preview the entry archive/delete target without mutating Notion. Default false. | |
| page_id | Yes | Database entry page ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description only states the action with no behavioral details like reversibility, side effects, or permissions; the dry_run parameter is not referenced, leaving the agent uninformed about preview capability.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence is concise and front-loaded with verb and object, but it could be more structured to include behavior or guidelines; still effective.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is insufficient for a deletion/archival tool; it lacks disclosure of destructive nature, reversibility, or the dry_run parameter's purpose; sibling tools like archive_page may overlap but are not differentiated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema provides full descriptions for both parameters (page_id string, dry_run boolean for preview), so description adds no additional value but also doesn't detract; baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses specific verb 'delete' with parenthetical 'archive' to clarify the action on a 'database entry', which distinguishes it from sibling tools like archive_page or update_database_entry.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No usage context is provided; the description does not differentiate when to use delete vs archive vs other database entry modifications.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_viewA
Delete a Notion database view. Destructive: confirm must be exactly true.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Must be exactly true to delete the view unless dry_run is true | |
| dry_run | No | Preview the delete target without mutating Notion. Default false. | |
| view_id | Yes | View ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavioral traits. It notes the tool is destructive and requires confirmation, but does not elaborate on side effects, permissions, or reversibility. The schema adds some transparency via confirm and dry_run, but the description itself is minimal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise with two sentences, front-loading the purpose. No unnecessary words, making it easy for an agent to quickly grasp the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the three-parameter schema with thorough descriptions and no output schema, the description is adequate but lacks broader context such as when to prefer this tool over siblings, required permissions, or typical use cases. It meets minimum completeness but has gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, providing clear purpose for each parameter. The description adds no additional meaning beyond the schema, so baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Delete' and the resource 'Notion database view', making the purpose unambiguous. It distinguishes from siblings like delete_database_entry by specifying the resource type.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description mentions that the tool is destructive and requires confirm to be true, providing a condition for safe use. However, it does not explicitly state when to use this tool over alternatives or provide exclusions, leaving some ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
duplicate_pageA
Duplicate 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 duplicated as ordinary toggle/heading/paragraph blocks (summary and notes only — transcripts are not duplicated); a read_only_block_rendered warning is emitted to identify meeting-notes blocks whose native identity was not preserved across the duplicate. Deep-duplication of subpages is not yet supported.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Title for the new page. Defaults to source title + ' (Copy)' | |
| page_id | Yes | Source page ID to duplicate | |
| parent_page_id | No | Parent page ID for the new page. Falls back to source page's parent, then follows the same resolution as create_page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses behaviors: reads all blocks, omits unsupported types with warnings, handles AI meeting notes (converts to ordinary blocks), and notes that deep-duplication is not supported. This provides comprehensive transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is detailed but not overly verbose; it front-loads the main purpose and uses examples for clarity. It could be slightly more concise, but the structure is logical and informative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema or annotations, the description fully addresses the tool's complexity: it covers behavior, warnings, limitations, and edge cases (AI meeting notes, subpages). The agent has sufficient information to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with parameter descriptions. The description adds value beyond the schema by explaining the title default behavior and parent_page_id fallback resolution, which are not fully covered in the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Duplicate a page' and specifies the action: reads all blocks and creates a new page with same content. It distinguishes from siblings like move_page (moving) and create_page (creating from scratch) by detailing the duplication behavior and limitations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implicitly guides usage by listing limitations (e.g., unsupported block types omitted, deep-duplication not supported), but does not explicitly state when to avoid the tool or name alternative tools. However, no other duplication tool exists among siblings, making the guidance adequate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_replaceA
Find 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.
| Name | Required | Description | Default |
|---|---|---|---|
| find | Yes | Text to find (exact match) | |
| dry_run | No | Preview match counts without mutating Notion. Default false. | |
| page_id | Yes | Page ID | |
| replace | Yes | Replacement text | |
| replace_all | No | Replace all occurrences. Default: first only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that find_replace preserves uploaded files and untounched blocks, indicating non-destructive behavior. It could additionally mention irreversibility, but the provided info is strong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no wasted words. The purpose is stated first, followed by valuable usage context. Perfectly front-loaded and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, full schema coverage, and lack of output schema, the description covers purpose, usage guidelines, and behavioral transparency adequately. No gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and all parameters are well-described in the schema. The description adds value by giving usage examples (typos, URLs, terms) but does not significantly extend parameter meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Find and replace text on a page.' and explicitly differentiates from sibling tool replace_content by highlighting efficiency for targeted changes like fixing typos, updating URLs, or renaming terms.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance ('targeted text changes') and when-not-to-use ('more efficient than replace_content'), along with behavioral notes like preserving untouched blocks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_configA
Report 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, workspace_root_resolved, workspace_root_status, workspace_root_source, markdown_docs, visible_tools_count }.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and it excels: it declares 'Read-only, makes no Notion API call, and never returns credentials.' This discloses safety and scope explicitly. It also states the exact return fields, adding transparency beyond typical descriptions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two well-structured sentences. The first fronts the purpose and key outputs; the second gives usage context and safety guarantees. Every sentence earns its place, and there is no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple diagnostic tool with no parameters, no annotations, and no output schema, but the description supplies everything needed: what it does, when to call it, its read-only nature, and the exact return structure. Nothing is missing for an agent to use it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema (empty) already covers them 100%. The description doesn't need to add parameter details, and the baseline for no parameters is 4. It adds no unnecessary parameter information, which is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool 'Reports this server's own settings' and names specific elements: version, transport, workspace root, and visible tools count. It is a diagnostic tool distinct from the many content-focused siblings, so an agent can tell it apart without confusion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Call this when a file-path or configuration error occurs and you need the server's actual settings rather than a guess.' This provides a concrete trigger condition. It doesn't mention when not to use it or alternatives, but the tool is unique enough that no alternative is obvious; still, some negative guidance is missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_databaseA
Get a database's schema — 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.
| Name | Required | Description | Default |
|---|---|---|---|
| page_id | No | Alias accepted when database_id is absent. If the ID is a page containing exactly one inline database, it resolves to that database. Providing both database_id and page_id with different values is an error. | |
| database_id | No | Database ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the disclosure burden. It communicates that this is a retrieval operation and specifies what the response contains, though it does not explicitly discuss errors, side effects, or permission expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with the purpose front-loaded and a concrete usage directive following immediately. Every sentence earns its place, and there is no redundant phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple schema-lookup tool, the description plus the complete schema gives the agent the accepted identifiers, the output scope, and the follow-up tools. The absence of an output schema is mitigated by the explicit summary of return content.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and both parameters are fully described in the input schema, including the page_id alias rule. The description adds no parameter-specific meaning beyond what the schema already provides, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names an explicit action and object: 'Get a database's schema' and specifies the returned content (property names, types, and select/status options). This clearly distinguishes it from query_database and other tools in the sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly tells the agent to call this before query_database or add_database_entry to discover valid property names and values. It does not describe negative cases or alternatives exhaustively, but the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_meA
Get the current bot user.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description lacks any behavioral details (e.g., read-only, permissions, or side effects). For a simple get operation, a statement like 'Read-only, returns user object' would help.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one concise sentence with no wasted words. It could be improved by adding return info without sacrificing conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless tool with no output schema, the description is minimally adequate but fails to mention what the tool returns (e.g., user object). Adding a brief return description would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and schema description coverage is 100%. According to rules, 0 parameters earns a baseline score of 4, as no additional parameter documentation is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Get the current bot user' uses a specific verb ('Get') and a clear resource ('current bot user'), which distinguishes it from sibling tools that operate on pages, comments, databases, etc.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
While no explicit when-to-use or alternative guidance is provided, the tool's purpose is unique among siblings (only tool for bot user info), so implicit context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_viewA
Retrieve 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.
| Name | Required | Description | Default |
|---|---|---|---|
| view_id | Yes | View ID | |
| include_config | No | Return the full raw Notion view objects (filter, sorts, configuration, parent) instead of the curated summary. Default false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses the default output as a curated summary with specific fields (id, name, type, url, data_source_id) and the alternative full raw object. No annotations provided, so description carries the burden well.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no wasted words. Front-loaded with core action, followed by parameter tip.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and 2 parameters with full schema coverage, the description sufficiently explains what the tool returns and the key parameter behavior. Could mention prerequisite that the view ID must exist, but not critical.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but description adds value by explaining the distinction between the default curated summary and the full object when include_config=true, beyond the schema's 'Return the full raw' statement.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description uses specific verb 'Retrieve' and resource 'Notion database view by ID', clearly distinguishing from sibling tools like create_view, delete_view, update_view, list_views.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a usage hint for the include_config parameter but does not explicitly state when to use this tool versus alternatives (e.g., list_views, query_view). The context is adequate but lacks exclusions or when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_commentsB
List comments on a page.
| Name | Required | Description | Default |
|---|---|---|---|
| page_id | Yes | Page ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description does not disclose behavioral traits such as whether it returns all comments or paginated data, ordering, or required permissions. The description carries the full burden but fails to provide this context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One succinct sentence that directly states the tool's purpose with no extraneous information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is minimal but sufficient for a simple list tool with one parameter. However, it lacks details on pagination, sorting, or comment threading, which could be relevant.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a single parameter 'page_id' described as 'Page ID'. The description adds no extra meaning beyond the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'List comments on a page.' clearly identifies the action (list) and resource (comments on a page), distinguishing it from sibling tools like add_comment or list_pages.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives (e.g., search_in_page for filtered comments) or when not to use it. The description does not provide usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_databasesA
List all databases the integration can access. Returns database names and IDs — use get_database on any result to see its schema.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so description must cover behavior. It discloses that the tool lists accessible databases, implying read-only and access control, but omits details like error handling, rate limits, or whether results are ordered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with purpose, no extraneous words. Efficient and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter list tool with no output schema, the description adequately explains what it returns and suggests a next action. Could mention empty results or errors, but is sufficient for typical use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 0 parameters with 100% coverage; baseline is 4. Description adds no parameter info, but none is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states verb "List" and resource "databases", specifies scope "all databases the integration can access", and distinguishes from sibling list tools (e.g., list_pages). Offers a concrete next step: use get_database on results.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context by stating the action and return values, and implicitly guides to use get_database for schema. However, no explicit when-not or alternative specifications.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_pagesA
List 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.
| Name | Required | Description | Default |
|---|---|---|---|
| parent_page_id | Yes | Parent page ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It usefully discloses timestamp formatting (ISO-8601, rounded to the minute), the fact that last_edited_time updates on content and property edits, and the returned row structure. It does not mention pagination or ordering, but the disclosed details are meaningful and not redundant.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the primary action appears first, followed by the returned fields and a useful timestamp caveat. Every sentence adds value, and there is no padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read tool with no output schema, the description adequately covers what the result contains and important timestamp nuances. It could also mention pagination, sorting, or whether archived pages are included, but the core invocation and return semantics are sufficiently specified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the parameter's schema description ('Parent page ID') already explains its role. The tool description adds no further parameter-level detail such as ID format or validity rules, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('List child pages under a parent page'), identifies the target resource, and lists the returned fields. This makes the tool's purpose concrete and easily distinguishable from siblings like list_databases or list_views.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes clear this tool is for listing child pages directly under a given parent page. It does not explicitly name alternatives or state when not to use it, but the parent-page scoping and single required parameter imply the correct usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_usersB
List workspace users.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description does not disclose any behavioral traits such as read-only nature, permission requirements, or output characteristics. It provides no additional behavioral context beyond the implied listing operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise with a single sentence, containing no unnecessary words. Every word is purposeful, efficiently conveying the tool's function.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simplicity of the tool (no parameters, no output schema), the description is adequate but minimal. It lacks details about pagination, sorting, or potential filtering, which could be useful context for the agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are no parameters, so schema coverage is effectively 100%. The description adds no parameter details, but none are needed. The baseline for zero parameters is 4, as the description adequately covers the schema's emptiness.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (list) and the resource (workspace users), making the purpose unambiguous. However, it does not differentiate from sibling list tools like list_pages or list_databases, which share similar verb-noun construction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. With many list tools available, the description lacks any context about prerequisites, scope, or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_viewsA
List 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.
| Name | Required | Description | Default |
|---|---|---|---|
| page_size | No | Maximum number of views to return | |
| database_id | No | Database ID | |
| start_cursor | No | Pagination cursor from a previous response | |
| data_source_id | No | Data source ID | |
| include_config | No | Return the full raw Notion view objects (filter, sorts, configuration, parent) instead of the curated summary. Default false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses return format (curated summary with fields, pagination cursors) and the effect of include_config, but does not explicitly state that the tool is read-only, which is important given no annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, each with essential information: purpose, parameter constraint, return format, and configuration option. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers main return structure and pagination, but lacks default page_size, error handling, or explicit mention of optional parameters. With no output schema, a bit more detail could be beneficial.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Adds meaning beyond schema by clarifying the exclusivity of database_id/data_source_id and the behavior of include_config. Schema coverage is 100%, so a 3 is baseline; the description provides added value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it lists Notion database views and specifies the mutually exclusive parameters (database_id or data_source_id). However, it does not differentiate from sibling tools like get_view, query_view, or create_view.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides specific guidance on parameter exclusivity and the include_config option, but no explicit guidance on when to use list_views versus alternatives like query_view or get_view.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_pageB
Move a page to a new parent page.
| Name | Required | Description | Default |
|---|---|---|---|
| page_id | Yes | Page ID to move | |
| new_parent_id | Yes | New parent page ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided; description fails to disclose side effects (e.g., child pages, permissions) or behavioral constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, front-loaded, no extraneous content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequate for a simple two-parameter tool, but lacks detail on expected behavior or return values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with clear descriptions; tool description adds no extra meaning beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states action (move), resource (page), and target (new parent page), distinguishing it from sibling tools like duplicate_page or archive_page.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool vs alternatives (e.g., duplicate or archive), nor any prerequisites or limitations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_databaseA
Query 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, warnings?: Array }. Multi-value properties are capped by max_property_items and can emit truncated_properties; read resources easy-notion://docs/property-pagination and easy-notion://docs/warnings for details.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Search text — matches across all text fields (title, rich_text, url, email, phone) | |
| sorts | No | Optional Notion sorts array | |
| filter | No | Optional Notion filter object | |
| page_id | No | Alias accepted when database_id is absent. If the ID is a page containing exactly one inline database, it resolves to that database. Providing both database_id and page_id with different values is an error. | |
| database_id | No | Database ID | |
| max_property_items | No | Max items returned per multi-value property (title, rich_text, relation, people). Default 75. Set to 0 for unlimited. Negative values rejected. When the cap is hit, the response includes a truncated_properties warning with a how_to_fetch_all hint. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It discloses the response shape, warning behavior, max_property_items cap, truncated_properties emission, and links to relevant docs. It stops short of explicitly stating read-only behavior or error handling, but overall it is transparent for a query tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with a concise purpose, followed by usage guidance and a compact response-shape explanation. Each sentence earns its place, including the links to edge-case documentation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter query tool with no output schema, the description covers the response format, parameter usage, and important edge-case behavior. It could optionally explain top-level result pagination, but the linked docs and warning details make it sufficiently complete for an agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers 100% of parameters, so baseline is 3. The description adds value by explaining text search fields, advising get_database for advanced filter options, and detailing max_property_items behavior beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool queries a database and lists the available operations: filters, sorts, and text search. It differentiates from siblings like query_view by specifying the resource as a database, though it does not explicitly name the sibling alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides practical guidance on when to use text search versus advanced filters, and instructs the agent to call get_database first for valid property names. It does not explicitly contrast with query_view or state exclusion criteria, but the in-tool routing is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_viewB
Query a Notion database view. Creates a temporary view query, fetches database row results, then deletes the query.
| Name | Required | Description | Default |
|---|---|---|---|
| view_id | Yes | View ID | |
| page_size | No | Maximum number of results to return | |
| start_cursor | No | Pagination cursor from a previous view query results response |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so description carries burden. It discloses the create-fetch-delete lifecycle, which is important behavioral context. However, it doesn't mention error states, permissions, or side effects beyond deletion of the temporary query.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence front-loading the core action. Every word is necessary and no filler. Highly efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequate for a 3-parameter tool with no output schema. The lifecycle is explained, but lacks detail on return format or error handling. Given the absence of output schema, some expectation for return structure description is unmet.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with basic descriptions. The tool description adds no additional meaning beyond the schema. At baseline, no value added.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states verb+resource: 'Query a Notion database view.' It adds lifecycle detail (creates, fetches, deletes) which distinguishes it from a simple read. However, it doesn't explicitly differentiate from sibling tool 'query_database'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives like 'query_database' or 'get_view'. No exclusive or prerequisite conditions mentioned. The description only states what it does, not when to choose it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_blockA
Read 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.
| Name | Required | Description | Default |
|---|---|---|---|
| block_id | Yes | Block ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description fully bears the burden of disclosure. It comprehensively covers behaviors: recursive children for containers, error for unsupported root blocks, omission with warnings for nested unsupported types, rendering of AI meeting-notes as synthetic toggles with warnings, and exclusion of transcripts. No missing critical traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with four sentences, each adding value. The main purpose is front-loaded. Minor redundancy could be trimmed, but overall it is efficient and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of block reading (multiple block types, recursive containers, unsupported types), the description covers key behaviors. No output schema exists, but the description partially compensates by mentioning markdown and warnings. Lacks structural details about the markdown output format.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage for the sole parameter (block_id). The description adds no additional semantic meaning beyond restating 'by ID'. Baseline of 3 is appropriate as schema already documents the parameter adequately.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reads one block by ID as markdown and includes details about container blocks and error handling. However, it does not explicitly differentiate from sibling tools like read_page or read_toggle, which reduces clarity for selection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool (to read a block by ID) but does not provide explicit guidance on when not to use it or when alternatives like read_page are more appropriate. No exclusions or contextual triggers are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_pageA
Read 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 as a synthetic toggle containing the title, an optional recording timestamp callout, and ## Summary / ## Notes heading sections. Transcript sections are included only with include_transcript: true. A read_only_block_rendered warning is emitted whenever such a block is rendered, indicating that round-tripping the markdown through replace_content will replace the native meeting-notes block with ordinary blocks.
Note on max_blocks: the cap counts top-level page blocks only; section descendants of meeting-notes blocks are fetched in full regardless of the cap, consistent with how nested children of normal blocks are fetched.
Long titles are paginated with max_property_items. For markdown conventions, warning shapes, and pagination details, read resources easy-notion://docs/markdown, easy-notion://docs/warnings, and easy-notion://docs/property-pagination.
| Name | Required | Description | Default |
|---|---|---|---|
| page_id | Yes | Page ID | |
| max_blocks | No | Maximum top-level blocks to return. Omit to return all. | |
| include_metadata | No | Include created_time, last_edited_time, created_by, last_edited_by in response. Default false. | |
| include_transcript | No | Include Notion AI meeting-notes transcript sections. Default false. Summary and Notes sections are always included when present. | |
| max_property_items | No | Max rich_text segments returned when a page title exceeds 25 segments (uncommon in practice). Default 75. Set to 0 for unlimited. Negative values rejected. When the cap is hit, the response includes a truncated_properties warning with a how_to_fetch_all hint. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, but the description fully discloses key behavioral traits: recursive fetching, handling of unsupported block types with warnings, synthetic rendering of Notion AI meeting notes, and max_blocks counting rules. This compensates for missing annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with paragraphs and bullet points, front-loading the core purpose. Slightly verbose in places, but each sentence adds value. Could be compacted slightly without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite lacking output schema, the description covers the response structure (metadata, markdown, warnings) and directs to external resources for conventions. Given the tool's complexity and 5 parameters, the description is remarkably complete and self-contained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% but the description adds significant nuance beyond the schema: max_blocks boundary behavior for meeting-notes descendants, max_property_items default and truncation handling, and include_transcript inclusion scope. Each parameter is enriched with practical context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states 'Read a page and return metadata plus markdown' and specifies recursive fetching, making the purpose clear. It distinguishes from sibling tools like read_block by focusing on entire page content with markdown conversion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides actionable guidance: warns against round-tripping markdown when omitted_block_types warnings are present, and clarifies when to use include_transcript. Does not explicitly list alternatives but the context is clear enough for correct invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_sectionA
Read 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 unsupported nested block types are omitted, the response includes 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.
| Name | Required | Description | Default |
|---|---|---|---|
| heading | Yes | Heading text to find (case-insensitive) | |
| page_id | Yes | Page ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries the burden of behavioral disclosure. It explicitly states case-insensitive heading matching, hierarchical boundary rules, handling of nested children, omission warnings for unsupported blocks, and synthetic rendering of Notion AI meeting-notes blocks with warnings.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, focused paragraph that front-loads the purpose. It is concise but includes necessary behavioral details without being verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers key aspects of behavior (heading matching, boundary rules, children rendering, warnings) but lacks explicit details about the return format and error cases (e.g., heading not found). Given no output schema, it is moderately complete but has gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both parameters. The description adds minimal additional meaning beyond confirming the case-insensitive matching behavior for the heading parameter. Per guidelines, a score of 3 is appropriate when schema coverage is high and description adds limited value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: to read a single page section by heading name. It uses a specific verb ('Read') and resource ('page section'), and distinguishes itself from siblings like update_section and read_page by referencing its unique behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the tool's behavior in detail but does not provide guidance on when to use this tool over alternatives (e.g., read_page, read_block). There are no explicit 'when to use' or 'when not to use' statements.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_toggleA
Read 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 included from these tools.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Toggle title to find (case-insensitive) | |
| page_id | Yes | Page ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description fully covers behavior: recursive search, case-insensitive trimmed matching, missing titles returning available toggle titles, synthetic toggle rendering for Notion AI meeting-notes blocks with a warning, and exclusion of transcripts.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, front-loaded with the main purpose, and every sentence adds value. It uses clear language without unnecessary repetition, making it efficient for an AI agent to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description adequately covers input usage, special behaviors, and limitations (transcripts not included). It is complete for the tool's scope and complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema describes page_id and title briefly. The description adds meaning by explaining how 'title' is matched (case-insensitive, trimmed text) and the recursive search behavior. This goes beyond the schema, though no per-parameter details are added for page_id.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reads a single toggle by title from a page, specifying it searches recursively and matches plain toggle blocks plus toggleable headings. It distinguishes itself from siblings like read_block or search by focusing on toggles by title.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for reading a specific toggle by title but lacks explicit when-to-use or when-not-to-use guidance. It does not reference alternative tools like search or read_block for other scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
replace_contentA
Replaces 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 code unmatched_blocks) are replaced with new IDs.
NOT preserved across replace_content: child_page subpages, synced_block instances, child_database views, and link_to_page references on the source page. Enhanced Markdown has no input form for these, so they are dropped from the new page content. If the source contains them, use duplicate_page first or edit those types via the Notion UI. For an inline page mention, use @Title; that is a separate construct from the link_to_page block type.
Bookmarks and embeds are written as bare URLs (Notion auto-links) and surface a bookmark_lost_on_atomic_replace or embed_lost_on_atomic_replace warning so callers know the rich preview is lost. For supported markdown syntax and warning details, read resources easy-notion://docs/markdown and easy-notion://docs/warnings. Returns: { success: true }, optionally truncated: true, optionally warnings with entries such as { code: "unmatched_blocks", block_ids: [...] }, plus block_map for the resulting top-level blocks when present. A dry run returns { success: true, dry_run: true, operation, page_id, would_update: true } and optionally warnings.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | Preview validation and planned effect without mutating Notion. Default false. | |
| page_id | Yes | Page ID | |
| markdown | Yes | Replacement markdown content | |
| return_block_map | No | Include block_map in the response. Default true. Set false to skip the per-block id list when you do not plan to edit individual blocks. | |
| collapse_soft_wraps | No | Collapse single line breaks to spaces per CommonMark before writing. Default false (single line breaks are kept as they are today). Recommended when uploading hard-wrapped prose files (e.g. repo markdown wrapped at 78 columns). Do not use when re-uploading content read from Notion, or intentional line breaks will be lost. Blank lines and code blocks are unaffected. Note: replace_content renders an in-paragraph line break as a separate paragraph regardless of this option. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden, and it delivers extensively. It discloses atomicity, block-ID preservation, unmatched block replacement, dropped page types, bookmark/embed preview loss, and warning codes. It also describes the dry-run behavior and response shape, so the agent knows exactly what to expect.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence earns its place, covering core behavior, preservation caveats, alternatives, parameter effects, docs references, and return values. The most important facts are front-loaded, with the atomic replacement behavior stated first and supporting details organized in a logical progression.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a complex tool with five parameters, no annotations, and no output schema, yet the description is nearly self-contained. It covers the return value with success/truncated/warnings/block_map details, documents the dry-run response, names warning codes, and points to docs for further detail. The only minor gap is that not every warning code is enumerated, but the description references docs and gives representative examples, which is sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds meaningful semantic value beyond the schema. It explains the effect of collapse_soft_wraps on single line breaks, mentions that replace_content renders in-paragraph line breaks as separate paragraphs regardless of the option, and clarifies that bookmarks/embeds are written as bare URLs. These details help the agent choose parameter values correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Replaces all page content with the provided markdown atomically (one Notion API call).' This makes the tool's core action unmistakable and distinguishes it from sibling tools like append_content, which adds rather than replaces content. It also clarifies that this is an all-page replacement, not a targeted edit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use and when-not-to-use guidance, including 'use duplicate_page first or edit those types via the Notion UI' when the source contains child_page subpages or other unsupported constructs. It also provides concrete parameter-level guidance, such as recommending collapse_soft_wraps for hard-wrapped prose files and warning not to use it when re-uploading content read from Notion. This routes the agent to alternatives and away from misuse.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restore_pageA
Restore an archived page.
| Name | Required | Description | Default |
|---|---|---|---|
| page_id | Yes | Page ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the burden. It only states the action without disclosing permissions, failure conditions, or return behavior, which is insufficient for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that gets straight to the point with no unnecessary words, fulfilling the requirement of being concise and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter tool, the description is minimally adequate but does not explain return values or edge cases, which would be helpful given the absence of an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage for 'page_id', and the description adds no additional meaning beyond what the schema provides. Baseline score is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool restores an archived page, using a specific verb and resource. It distinguishes itself from the sibling tool 'archive_page' which performs the opposite action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for unarchiving pages, but lacks explicit guidance on when to use this tool versus alternatives. However, the context of sibling tools makes it clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restore_toggleA
Restore 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.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | Preview the restore target without mutating Notion. Default false. | |
| block_id | Yes | Archived toggle or toggleable heading block ID returned by archive_toggle |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided; description lacks details on side effects, permissions, or consequences (e.g., what happens if block is not archived).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no filler, efficiently conveying key information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers prerequisite and limitation, but lacks details on restore behavior (e.g., children, return value) given no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions; description adds context for block_id but not significantly beyond schema. Baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it restores an archived toggle or toggleable heading by block ID, distinguishing it from siblings like archive_toggle.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Specifies to use the block ID from archive_toggle and notes that Notion does not expose archived child enumeration, guiding when and how to use the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchA
Search Notion pages or databases. Use filter: 'databases' to find databases by name, then get_database for schema details.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query | |
| filter | No | Optional object filter |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, and description lacks disclosure of behavioral traits such as read-only nature, authentication needs, rate limits, pagination, or results format. For a search tool without annotations, more transparency expected.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Extremely concise: two sentences with no filler. Front-loads the verb and resource, and includes a practical tip for using the filter. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the number of siblings and lack of output schema, the description is adequate but incomplete. It does not explain return values, pagination, or sorting. The workflow hint is helpful but not comprehensive for an agent to fully anticipate behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, but description adds value by explaining the 'databases' filter usage and linking to a workflow. The query parameter is minimally described; however, the description compensates by providing context beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'Search Notion pages or databases' with specific verb and resource, and distinguishes from sibling tools like search_in_page. It provides actionable workflow (use filter 'databases' then get_database).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use the filter for databases and directs to get_database for schema details. Does not explicitly mention when not to use, but the sibling list implies alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_in_pageA
Search 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.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Plain substring to search for (case-insensitive, non-empty) | |
| page_id | Yes | Page ID | |
| within_toggle | No | Optional toggle title to restrict search scope (case-insensitive) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of revealing behavioral traits. It discloses that matching is case-insensitive and substring-based, but does not describe what is returned (e.g., block IDs, context, count), whether pagination exists, or any side effects. For a read-only tool, this is insufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, no redundant words, and front-loads the core purpose. Every phrase earns its place without being verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description should cover what the tool returns, but it does not. It explains the search behavior and optional scope adequately, but leaves the return format and coverage (e.g., which block types) unstated. It is functional but not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description adds minimal detail: it only reemphasizes that the search is case-insensitive and that the optional scope is a toggle title. This does not add significant meaning beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it searches raw Notion block plain text inside a page, with optional scoping to a toggle. This distinguishes it from sibling tools like 'search' (global search) and 'find_replace' (find and replace). The verb 'search' and resource 'page' are specific and directly convey the function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool: for searching within a page's raw block text, optionally restricted to a toggle. However, it does not explicitly state when not to use it or contrast with alternatives like the global 'search' tool. The guidance is clear but lacks exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_blockA
Update 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 existing block. update_block cannot change a block's type, because Notion's API forbids it. To change a block's type, use replace_content or delete + append.
Updatable types: paragraph, heading_1, heading_2, heading_3, toggle, bulleted_list_item, numbered_list_item, quote, callout, to_do, code, equation. Container blocks (toggle, callout) update first-level content only, and children stay untouched. Non-updatable types (divider, table, image, bookmark, etc.) accept only archived: true to delete the block. Page mentions: @Title.
To delete a block, pass archived: true instead of markdown. Exactly one of markdown or archived is required.
| Name | Required | Description | Default |
|---|---|---|---|
| checked | No | to_do only: explicit check-state override (otherwise inferred from `- [x]` / `- [ ]`). | |
| dry_run | No | Preview validation and planned effect without mutating Notion. Default false. | |
| archived | No | Set true to delete the block (sends in_trash: true). | |
| block_id | Yes | Block ID to update | |
| markdown | No | New content for the block. Must parse to a single block of the same type as the existing block. For to_do blocks, `- [x]` / `- [ ]` syntax sets the checked state. | |
| collapse_soft_wraps | No | Collapse single line breaks to spaces per CommonMark before writing. Default false (single line breaks are kept as they are today). Recommended when uploading hard-wrapped prose files (e.g. repo markdown wrapped at 78 columns). Do not use when re-uploading content read from Notion, or intentional line breaks will be lost. Blank lines and code blocks are unaffected. Note: replace_content renders an in-paragraph line break as a separate paragraph regardless of this option. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full disclosure burden and does so extensively: it reveals type lock-in, identity preservation, container-block depth limits, non-updatable type behavior, and deletion via archived. These are non-obvious behavioral traits an agent could not infer from the schema or tool name.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The paragraphs are dense but each sentence adds a distinct constraint or usage rule; there is no filler. The core purpose is front-loaded, followed by when to use it, type restrictions, edge cases for containers and non-updatable types, and finally deletion semantics.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool with six parameters and no output schema, the description covers the full decision space: valid types, invalid types, deletion, container behavior, and alternatives. No necessary calling condition or constraint appears to be missing, so an agent has enough information to invoke it correctly and predict side effects.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds critical relational semantics: exactly one of markdown or archived is required, markdown must parse to a single block of the same type, and archived true means deletion. It also clarifies the checked parameter's relationship to to_do markdown syntax, going beyond individual field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Update a single block in place by ID,' and differentiates itself from multi-block tools by labeling these as surgical edits. It also clarifies what identity preservation means with concrete examples (deep-link anchors and inline-comment threads), leaving no ambiguity about scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use the tool ('fixing a heading, toggling a checkbox, rewriting one paragraph') and names alternatives for multi-block edits (append_content, replace_content, update_section). It also gives exclusion criteria for type changes, directing to replace_content or delete + append, so an agent can route accurately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_database_entryA
Update 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_select: array of option name strings
date: ISO date string (start only)
checkbox: boolean
url, email, phone: string
relation: string or array of page IDs
people: string or array of user IDs
Not writable from this tool:
formula, rollup, unique_id, created_time, last_edited_time, created_by, last_edited_by: computed by Notion
files, verification, place, location, button: not supported for value writes here
| Name | Required | Description | Default |
|---|---|---|---|
| page_id | Yes | Page ID for the database entry | |
| properties | Yes | Key-value property map to convert using the parent database schema |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, description fully discloses behavior: omitted properties unchanged, writable types enumerated, non-writable types listed. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with bullet points and clear sections. Front-loads purpose. Slightly verbose but every sentence is informative. Could be tightened slightly without losing clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of updating various property types, the description is complete. Covers all writable types, non-writable types, and a prerequisite step. No output schema, but behavior is fully explained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but description adds significant value by explaining the properties object format and listing all writable property types with examples, going beyond the schema's brief descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool updates an existing database entry with key-value properties. It distinguishes from siblings like add_database_entry and delete_database_entry by specifying that only properties to change are passed, and omitted properties remain unchanged.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance: call get_database first to see property names and valid options, pass only properties to change, and lists which properties are not writable. This answers when to use and what to avoid.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_data_sourceA
CRITICAL: 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 status properties). No signal is raised. If you want to preserve the meaning of existing rows when removing an option, reclassify those rows to another explicit option before removing the option from the schema. To add one option, first call get_database, then resend the full current list with your addition appended.
Cannot toggle is_inline on existing databases. is_inline is a database-level field, not a data-source field. A separate update_database tool may be added later.
Updates a database's schema: rename properties, add or update property definitions, remove properties, change the title, or move it to/from trash. Use after get_database. Supports raw Notion payloads and schema helper payloads; read resource easy-notion://docs/update-data-source for modes, examples, status notes, and limitations. At least one of title, properties, or in_trash must be provided.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | New database title | |
| page_id | No | Alias accepted when database_id is absent. If the ID is a page containing exactly one inline database, it resolves to that database. Providing both database_id and page_id with different values is an error. | |
| in_trash | No | True to trash, false to restore | |
| properties | No | Raw Notion property update map | |
| database_id | No | Database ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It does this exceptionally well, disclosing that omitted options are permanently removed, affected rows are silently reassigned with no signal, and that is_inline changes are unsupported. This is precisely the kind of destructive and surprising behavior an agent must know before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is lengthy but each sentence carries substantive guidance. It is front-loaded with the critical destructive warning, followed by the inline exception and a clear summary of what the tool does. The structure is slightly unconventional—the core purpose statement appears near the end—but the density and organization are strong enough that nothing feels wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex mutation tool with zero annotations and no output schema, this description is exceptionally complete. It covers destructive edge cases, prerequisite calls, unsupported operations, accepted payload modes, documentation references, and required arguments. An agent has everything needed to invoke the tool correctly and avoid irreversible mistakes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds meaningful semantics beyond the schema, especially for the properties parameter: it explains full-list semantics for select/status options, the silent reassignment behavior, and the safe procedure for adding an option by first calling get_database. This extra guidance justifies a score above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states that this tool updates a database's schema: renaming properties, adding/updating/removing property definitions, changing the title, and moving to/from trash. This is a specific verb+resource and clearly distinguishes it from sibling tools like update_database_entry or update_view.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage context: 'Use after get_database', mandates reading the docs resource for modes and limitations, and warns that is_inline cannot be toggled on existing databases. It also explains the required parameters ('At least one of title, properties, or in_trash must be provided'), leaving little ambiguity about when and how to invoke the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_pageA
Update 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.
| Name | Required | Description | Default |
|---|---|---|---|
| icon | No | Updated emoji icon | |
| cover | No | Updated cover image URL | |
| title | No | Updated page title | |
| page_id | Yes | Page ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries burden. It discloses that file:// URLs are rejected in HTTP transport, which is important behavioral detail. Does not cover auth or side effects, but acceptable for a simple update.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded purpose, each sentence adds necessary detail without fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but update operations often have simple responses. Description covers key behavioral nuances (URL types, transport). Missing potential partial update info, but adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, yet description adds value: clarifies icon is emoji, and cover has transport-specific handling. This goes beyond schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool updates page title, icon, or cover, with specific detail on cover URL types. This verb+resource combination is distinct from sibling tools like archive_page or duplicate_page.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides specific guidance on when to use file:// vs https:// cover URLs and notes transport-specific rejection. However, it does not explicitly compare to siblings like update_block for content updates.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_sectionA
DESTRUCTIVE, 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. Finds the heading, replaces everything from that heading to the next section boundary. For H1 headings, the section extends to the next heading of any level. For H2/H3 headings, it extends to the next heading of the same or higher level. Include the heading itself in the markdown. If the section starts at the first block, the replacement markdown must start with the same heading type so following sections stay in place. With preserve_heading:true, the existing heading block ID, text, type, comments, and toggleable state are preserved, but the section body blocks and existing toggleable-heading children are still destructively replaced; replacement markdown is treated as body-only, and a leading matching heading is stripped for compatibility. More efficient than replace_content for editing one section of a large page. Page mentions: @Title. Returns { deleted, appended }, plus deleted_blocks for the deleted top-level blocks when present and block_map for the top-level appended blocks when present. A dry run instead returns { success: true, dry_run: true, operation, page_id, heading, target_block_id, target_block_type, preserve_heading, deleted, appended, would_delete_block_ids, append_parent_id }, plus append_after_block_id when the append is anchored to a preceding block, and would_update with would_update_block_id when the heading block itself is rewritten.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | Preview validation and planned effect without mutating Notion. Default false. | |
| heading | Yes | Heading text to find (case-insensitive) | |
| page_id | Yes | Page ID | |
| markdown | Yes | Replacement markdown including the heading | |
| preserve_heading | No | Preserve the existing heading block and replace only the section body. Default false. | |
| return_block_map | No | Include block_map in the response. Default true. Set false to skip the per-block id list when you do not plan to edit individual blocks. | |
| collapse_soft_wraps | No | Collapse single line breaks to spaces per CommonMark before writing. Default false (single line breaks are kept as they are today). Recommended when uploading hard-wrapped prose files (e.g. repo markdown wrapped at 78 columns). Do not use when re-uploading content read from Notion, or intentional line breaks will be lost. Blank lines and code blocks are unaffected. Note: replace_content renders an in-paragraph line break as a separate paragraph regardless of this option. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full disclosure burden and succeeds impressively. It opens with 'DESTRUCTIVE, no rollback,' details the mid-call failure mode (section partially or fully emptied, retry can fail with 'heading not found'), and specifies exact preserve_heading semantics: which attributes survive and which blocks are still destructively replaced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but every sentence earns its place and the most critical safety warning is front-loaded. The return-value enumerations for both normal and dry-run paths are dense run-on prose rather than structured lists, which is a minor readability cost for an otherwise information-dense definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given high complexity (7 params, destructive semantics, two operational modes), zero annotations, and no output schema, this description is remarkably complete: it covers safety, failure modes, recovery, boundary semantics, preserve_heading nuances, efficiency trade-offs, mention syntax, and exact return shapes for both normal and dry-run invocations. Nothing an agent needs to call it safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds substantial meaning beyond the schema: heading boundary rules for H1 vs H2/H3, the requirement to include the heading in the markdown, the first-block edge case requiring matching heading type, the leading-heading-stripping behavior under preserve_heading, and the full dry_run return shape including would_delete_block_ids.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Update a section of a page by heading name.' It precisely defines the operation — finds the heading and replaces everything from that heading to the next section boundary — which unambiguously differentiates it from siblings like replace_content, append_content, and update_block.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description names the closest alternative and the deciding condition: 'More efficient than replace_content for editing one section of a large page.' It also gives active safety guidance — 'For irreplaceable sections, duplicate_page the target first so you have a restore point' — and explains when preserve_heading is the right mode.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_toggleA
DESTRUCTIVE, 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 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. The markdown is replacement body content, not a wrapper that renames the toggle, and the server converts it 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 send a full multi-section toggle tree in one call with no need to pre-chunk or pre-split. If the markdown parses as one matching top-level toggle or toggleable heading wrapper, that wrapper is ignored and only its children are used as the replacement body. For supported markdown syntax, read resource easy-notion://docs/markdown. Page mentions: @Title. Returns: { success: true, block_id, type, deleted, appended }, where deleted and appended are counts, plus deleted_blocks for the deleted top-level body blocks when present and block_map for the top-level appended body blocks when present. A dry run instead returns { success: true, dry_run: true, operation, page_id, title, block_id, type, deleted, appended, would_delete_block_ids, append_parent_id }.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Toggle title to find (case-insensitive) | |
| dry_run | No | Preview validation and planned effect without mutating Notion. Default false. | |
| page_id | Yes | Page ID | |
| markdown | Yes | Replacement markdown for the toggle body | |
| return_block_map | No | Include block_map in the response. Default true. Set false to skip the per-block id list when you do not plan to edit individual blocks. | |
| collapse_soft_wraps | No | Collapse single line breaks to spaces per CommonMark before writing. Default false (single line breaks are kept as they are today). Recommended when uploading hard-wrapped prose files (e.g. repo markdown wrapped at 78 columns). Do not use when re-uploading content read from Notion, or intentional line breaks will be lost. Blank lines and code blocks are unaffected. Note: replace_content renders an in-paragraph line break as a separate paragraph regardless of this option. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure, and it excels. It openly states the destructive nature, no rollback, that child block IDs change, and the risk of partial emptying on mid-call failure. It explains server-side handling of API limits (batching, splitting, nested passes) and clarifies that markdown becomes native blocks, not plain text. It also details the dry-run behavior and return structure. This is far beyond minimal transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is lengthy but every sentence earns its place given the tool's complexity. It opens with the critical destructive warning, then states the core purpose, then details behavior, limits, and response. It is well-organized, flows logically, and avoids redundancy. The density of information is appropriate for a tool with this many nuances, and there is no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's destructive nature, API limit handling, markdown-to-native-block conversion, and multiple return scenarios (including dry run), the description covers all essential aspects. It explains what changes, how failures affect state, how to create a restore point, what the server does automatically, and the exact response shape. No output schema exists, so the description's detailed return documentation is crucial, and it provides it comprehensively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides complete descriptions for all six parameters (coverage 100%), so the baseline is 3. The description adds extra meaning primarily for the 'markdown' parameter—clarifying it is replacement body content, not a wrapper, and that the server converts it to native Notion blocks. It also clarifies the effect of 'collapse_soft_wraps' under specific scenarios. This goes beyond the schema's short descriptions and justifies a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Update the body of one toggle by title from a page.' It clearly delineates scope by specifying it matches plain toggle blocks and toggleable heading_1/2/3 blocks, and distinguishes itself from siblings like replace_content by clarifying it updates a toggle's body, not renaming it or acting as a wrapper. The wording is unambiguous and directly relatable to the tool's name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
While the description does not explicitly name alternative tools like replace_content or update_section, it provides rich context on when to use it: it targets a specific toggle by title, handles nested structures, and automates API limit batching. The warning about destructiveness and the recommendation to duplicate_page for irreplaceable content implicitly conveys when caution is needed. It lacks explicit 'when not to use' exclusions, but the context is strong enough for an agent to infer appropriate usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_viewA
Update a Notion database view. Pass at least one update field. Null filter, sorts, or quick_filters values are forwarded to clear those fields.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Updated view name | |
| sorts | No | Raw Notion view sorts payload, or null to clear | |
| filter | No | Raw Notion view filter payload, or null to clear | |
| view_id | Yes | View ID | |
| configuration | No | Raw Notion view configuration payload. Dashboard configuration is rejected. | |
| quick_filters | No | Raw Notion quick filters payload, or null to clear |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It discloses that null values are forwarded to clear fields and that dashboard configuration is rejected, adding behavioral context beyond a simple 'update'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two efficient sentences front-load purpose and convey key behavioral details without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers null clearing and configuration rejection, but lacks mention of return value (no output schema) or error conditions. With 6 parameters and nested objects, more detail would be useful.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, baseline 3. Description adds value by stating 'Pass at least one update field' (required but not in schema) and clarifying null behavior for filter, sorts, and quick_filters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'Update a Notion database view' with specific verb and resource. Additional info about passing update fields and clearing with null distinguishes it from create_view, delete_view, and other siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context on how to use null values to clear filter, sorts, or quick_filters. However, does not explicitly mention when not to use (e.g., vs. query_view) or list alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
14 tool updates
v1.1.0- Changed
add_comment1 field changed- added
Input schema / properties / collapse_soft_wrapsAdded value: +{ + "description": "Collapse single line breaks to spaces per CommonMark before writing. Default false (single line breaks are kept as they are today). Recommended when posting hard-wrapped prose. Do not use when re-posting content read from Notion, or intentional line breaks will be lost. Blank lines are unaffected.", + "type": "boolean" +}
- Changed
add_database_entries3 fields changed- added
Input schema / anyOfAdded value: +[ + { + "required": [ + "database_id" + ] + }, + { + "required": [ + "page_id" + ] + } +] - added
Input schema / properties / page_idAdded value: +{ + "description": "Alias accepted when database_id is absent. If the ID is a page containing exactly one inline database, it resolves to that database. Providing both database_id and page_id with different values is an error.", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "database_id", - "entries" -]New value: +[ + "entries" +]
- Changed
add_database_entry3 fields changed- added
Input schema / anyOfAdded value: +[ + { + "required": [ + "database_id" + ] + }, + { + "required": [ + "page_id" + ] + } +] - added
Input schema / properties / page_idAdded value: +{ + "description": "Alias accepted when database_id is absent. If the ID is a page containing exactly one inline database, it resolves to that database. Providing both database_id and page_id with different values is an error.", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "database_id", - "properties" -]New value: +[ + "properties" +]
- Changed
append_content2 fields changed- added
Input schema / properties / collapse_soft_wrapsAdded value: +{ + "description": "Collapse single line breaks to spaces per CommonMark before writing. Default false (single line breaks are kept as they are today). Recommended when uploading hard-wrapped prose files (e.g. repo markdown wrapped at 78 columns). Do not use when re-uploading content read from Notion, or intentional line breaks will be lost. Blank lines and code blocks are unaffected. Note: replace_content renders an in-paragraph line break as a separate paragraph regardless of this option.", + "type": "boolean" +} - added
Input schema / properties / return_block_mapAdded value: +{ + "description": "Include block_map in the response. Default true. Set false to skip the per-block id list when you do not plan to edit individual blocks.", + "type": "boolean" +}
- Changed
create_page3 fields changed- added
Input schema / properties / collapse_soft_wrapsAdded value: +{ + "description": "Collapse single line breaks to spaces per CommonMark before writing. Default false (single line breaks are kept as they are today). Recommended when uploading hard-wrapped prose files (e.g. repo markdown wrapped at 78 columns). Do not use when re-uploading content read from Notion, or intentional line breaks will be lost. Blank lines and code blocks are unaffected. Note: replace_content renders an in-paragraph line break as a separate paragraph regardless of this option.", + "type": "boolean" +} - added
Input schema / properties / return_block_mapAdded value: +{ + "description": "Include block_map in the response. Default true. Set false to skip the per-block id list when you do not plan to edit individual blocks.", + "type": "boolean" +} - added
Input schema / properties / strip_leading_h1Added value: +{ + "description": "Remove the document's leading H1 heading. Applies only when the first converted top-level block is a plain (non-toggleable) heading_1. Useful when title is also passed and the file begins with the same heading. Default false.", + "type": "boolean" +}
- Changed
create_page_from_file3 fields changed- added
Input schema / properties / collapse_soft_wrapsAdded value: +{ + "description": "Collapse single line breaks to spaces per CommonMark before writing. Default false (single line breaks are kept as they are today). Recommended when uploading hard-wrapped prose files (e.g. repo markdown wrapped at 78 columns). Do not use when re-uploading content read from Notion, or intentional line breaks will be lost. Blank lines and code blocks are unaffected. Note: replace_content renders an in-paragraph line break as a separate paragraph regardless of this option.", + "type": "boolean" +} - added
Input schema / properties / return_block_mapAdded value: +{ + "description": "Include block_map in the response. Default true. Set false to skip the per-block id list when you do not plan to edit individual blocks.", + "type": "boolean" +} - added
Input schema / properties / strip_leading_h1Added value: +{ + "description": "Remove the document's leading H1 heading. Applies only when the first converted top-level block is a plain (non-toggleable) heading_1. Useful when title is also passed and the file begins with the same heading. Default false.", + "type": "boolean" +}
- Added
get_config - Changed
get_database3 fields changed- added
Input schema / anyOfAdded value: +[ + { + "required": [ + "database_id" + ] + }, + { + "required": [ + "page_id" + ] + } +] - added
Input schema / properties / page_idAdded value: +{ + "description": "Alias accepted when database_id is absent. If the ID is a page containing exactly one inline database, it resolves to that database. Providing both database_id and page_id with different values is an error.", + "type": "string" +} - removed
Input schema / requiredRemoved value: -[ - "database_id" -]
- Changed
query_database3 fields changed- added
Input schema / anyOfAdded value: +[ + { + "required": [ + "database_id" + ] + }, + { + "required": [ + "page_id" + ] + } +] - added
Input schema / properties / page_idAdded value: +{ + "description": "Alias accepted when database_id is absent. If the ID is a page containing exactly one inline database, it resolves to that database. Providing both database_id and page_id with different values is an error.", + "type": "string" +} - removed
Input schema / requiredRemoved value: -[ - "database_id" -]
- Changed
replace_content2 fields changed- added
Input schema / properties / collapse_soft_wrapsAdded value: +{ + "description": "Collapse single line breaks to spaces per CommonMark before writing. Default false (single line breaks are kept as they are today). Recommended when uploading hard-wrapped prose files (e.g. repo markdown wrapped at 78 columns). Do not use when re-uploading content read from Notion, or intentional line breaks will be lost. Blank lines and code blocks are unaffected. Note: replace_content renders an in-paragraph line break as a separate paragraph regardless of this option.", + "type": "boolean" +} - added
Input schema / properties / return_block_mapAdded value: +{ + "description": "Include block_map in the response. Default true. Set false to skip the per-block id list when you do not plan to edit individual blocks.", + "type": "boolean" +}
- Changed
update_block1 field changed- added
Input schema / properties / collapse_soft_wrapsAdded value: +{ + "description": "Collapse single line breaks to spaces per CommonMark before writing. Default false (single line breaks are kept as they are today). Recommended when uploading hard-wrapped prose files (e.g. repo markdown wrapped at 78 columns). Do not use when re-uploading content read from Notion, or intentional line breaks will be lost. Blank lines and code blocks are unaffected. Note: replace_content renders an in-paragraph line break as a separate paragraph regardless of this option.", + "type": "boolean" +}
- Changed
update_data_source3 fields changed- added
Input schema / anyOfAdded value: +[ + { + "required": [ + "database_id" + ] + }, + { + "required": [ + "page_id" + ] + } +] - added
Input schema / properties / page_idAdded value: +{ + "description": "Alias accepted when database_id is absent. If the ID is a page containing exactly one inline database, it resolves to that database. Providing both database_id and page_id with different values is an error.", + "type": "string" +} - removed
Input schema / requiredRemoved value: -[ - "database_id" -]
- Changed
update_section2 fields changed- added
Input schema / properties / collapse_soft_wrapsAdded value: +{ + "description": "Collapse single line breaks to spaces per CommonMark before writing. Default false (single line breaks are kept as they are today). Recommended when uploading hard-wrapped prose files (e.g. repo markdown wrapped at 78 columns). Do not use when re-uploading content read from Notion, or intentional line breaks will be lost. Blank lines and code blocks are unaffected. Note: replace_content renders an in-paragraph line break as a separate paragraph regardless of this option.", + "type": "boolean" +} - added
Input schema / properties / return_block_mapAdded value: +{ + "description": "Include block_map in the response. Default true. Set false to skip the per-block id list when you do not plan to edit individual blocks.", + "type": "boolean" +}
- Changed
update_toggle2 fields changed- added
Input schema / properties / collapse_soft_wrapsAdded value: +{ + "description": "Collapse single line breaks to spaces per CommonMark before writing. Default false (single line breaks are kept as they are today). Recommended when uploading hard-wrapped prose files (e.g. repo markdown wrapped at 78 columns). Do not use when re-uploading content read from Notion, or intentional line breaks will be lost. Blank lines and code blocks are unaffected. Note: replace_content renders an in-paragraph line break as a separate paragraph regardless of this option.", + "type": "boolean" +} - added
Input schema / properties / return_block_mapAdded value: +{ + "description": "Include block_map in the response. Default true. Set false to skip the per-block id list when you do not plan to edit individual blocks.", + "type": "boolean" +}
2 tool updates
v1.0.1- Changed
get_view1 field changed- added
Input schema / properties / include_configAdded value: +{ + "description": "Return the full raw Notion view objects (filter, sorts, configuration, parent) instead of the curated summary. Default false.", + "type": "boolean" +}
- Changed
list_views1 field changed- added
Input schema / properties / include_configAdded value: +{ + "description": "Return the full raw Notion view objects (filter, sorts, configuration, parent) instead of the curated summary. Default false.", + "type": "boolean" +}
1 tool update
v0.9.1- Changed
read_page1 field changed- added
Input schema / properties / include_transcriptAdded value: +{ + "description": "Include Notion AI meeting-notes transcript sections. Default false. Summary and Notes sections are always included when present.", + "type": "boolean" +}
19 tool updates
v0.9.0- Changed
archive_page1 field changed- added
Input schema / properties / dry_runAdded value: +{ + "description": "Preview the archive target without mutating Notion. Default false.", + "type": "boolean" +}
- Added
archive_toggle - Added
create_view - Changed
delete_database_entry1 field changed- added
Input schema / properties / dry_runAdded value: +{ + "description": "Preview the entry archive/delete target without mutating Notion. Default false.", + "type": "boolean" +}
- Added
delete_view - Changed
find_replace1 field changed- added
Input schema / properties / dry_runAdded value: +{ + "description": "Preview match counts without mutating Notion. Default false.", + "type": "boolean" +}
- Added
get_view - Added
list_views - Added
query_view - Added
read_block - Added
read_section - Added
read_toggle - Changed
replace_content1 field changed- added
Input schema / properties / dry_runAdded value: +{ + "description": "Preview validation and planned effect without mutating Notion. Default false.", + "type": "boolean" +}
- Added
restore_toggle - Added
search_in_page - Changed
update_block1 field changed- added
Input schema / properties / dry_runAdded value: +{ + "description": "Preview validation and planned effect without mutating Notion. Default false.", + "type": "boolean" +}
- Changed
update_section2 fields changed- added
Input schema / properties / dry_runAdded value: +{ + "description": "Preview validation and planned effect without mutating Notion. Default false.", + "type": "boolean" +} - added
Input schema / properties / preserve_headingAdded value: +{ + "description": "Preserve the existing heading block and replace only the section body. Default false.", + "type": "boolean" +}
- Added
update_toggle - Added
update_view
6 tool updates
v0.6.0- Changed
create_database1 field changed- added
Input schema / properties / is_inlineAdded value: +{ + "description": "Create the database inline within the parent page", + "type": "boolean" +}
- Added
create_page_from_file - Changed
query_database1 field changed- added
Input schema / properties / max_property_itemsAdded value: +{ + "description": "Max items returned per multi-value property (title, rich_text, relation, people). Default 75. Set to 0 for unlimited. Negative values rejected. When the cap is hit, the response includes a truncated_properties warning with a how_to_fetch_all hint.", + "type": "number" +}
- Changed
read_page1 field changed- added
Input schema / properties / max_property_itemsAdded value: +{ + "description": "Max rich_text segments returned when a page title exceeds 25 segments (uncommon in practice). Default 75. Set to 0 for unlimited. Negative values rejected. When the cap is hit, the response includes a truncated_properties warning with a how_to_fetch_all hint.", + "type": "number" +}
- Added
update_block - Added
update_data_source
26 tool updates
v0.2.4- First observed
add_comment - First observed
add_database_entries - First observed
add_database_entry - First observed
append_content - First observed
archive_page - First observed
create_database - First observed
create_page - First observed
delete_database_entry - First observed
duplicate_page - First observed
find_replace - First observed
get_database - First observed
get_me - First observed
list_comments - First observed
list_databases - First observed
list_pages - First observed
list_users - First observed
move_page - First observed
query_database - First observed
read_page - First observed
replace_content - First observed
restore_page - First observed
search - First observed
share_page - First observed
update_database_entry - First observed
update_page - First observed
update_section
TDQS
Scored across 43 tools
Most tools are clearly distinct by resource (page, block, toggle, database, view, comment, user). Some potential confusion exists between update_section/update_toggle/update_block and read_section/read_block/read_toggle, but descriptions clarify the target granularity. The pair add_database_entry/add_database_entries is intentionally similar but the plural is self-explanatory.
The set predominantly uses verb_noun naming (create_page, read_page, update_page, archive_page, restore_page, query_database, add_database_entry, delete_database_entry). Minor deviations exist: get_view vs list_views, get_database vs list_databases, and get_me/get_config don't follow the verb_noun pattern, but the overall convention is consistent and predictable.
43 tools is on the heavy side for a single MCP server, but the breadth roughly matches Notion's feature surface (pages, blocks, toggles, databases, views, comments, users). The count is justified by the domain, though it approaches the upper bound where navigation becomes burdensome.
The tool surface covers the full lifecycle for pages (create, read, update, archive, restore, duplicate, move), blocks (read, update, delete, append, replace), toggles (read, update, archive, restore), databases (create, get, list, query, update schema, add/update/delete entries), views (list, create, update, delete), comments, and users. Notable gaps like subpage deep-duplication and database inline toggling are explicitly documented as limitations rather than missing coverage.
Maintenance
Related MCP Connectors
Markdown-based note-taking with a hosted MCP server. Your notes serve you and your AI.
MCP-native open-source Notion alternative: read & write pages, databases and kanban boards.
One memory, every AI. A shared, user-owned markdown memory your AI clients read and write over MCP.
MCP-native collaborative markdown editor with real-time AI document editing
Related MCP Servers
- AlicenseAqualityFmaintenanceMarkdown-first MCP server for Notion that provides 7 composite action-based tools consolidating 28+ REST API endpoints, enabling AI agents to efficiently manage pages, databases, blocks, and content with automatic pagination and bulk operations.11146 npm36Apache 2.0
- AlicenseAqualityDmaintenanceAn MCP server that enables LLMs to interact with Notion workspaces via the Notion API, supporting page creation, database management, and content retrieval. It features markdown conversion to optimize token usage and enhanced error handling for more reliable workspace interactions.195 npm1MIT
- AlicenseBqualityCmaintenance🚀 Token-efficient MCP server for Confluence. Reduces LLM costs by 76% via Markdown conversion. Supports listing, searching, and fetching pages.33MIT
- AlicenseAqualityCmaintenanceA lightweight Notion MCP server that minimizes token usage by returning Markdown instead of raw JSON, enabling efficient read/write operations on Notion pages.9MIT