前言¶
在 DeepSeek Harness(DSH)里接 Notion,常见做法是挂 Notion 官方 MCP。官方 MCP 会暴露大量工具(数量随版本变动,往往 60+),能力重叠、命名分散。模型每轮要消化的 schema 变长,选错工具的概率也会上去,实际改一页、查一张表反而更慢。
dsh-notion 走另一条路:不维护一套独立 API 客户端,而是基于 Notion 官方的 ntn CLI,把日常最高频的动作收成 六个 具名工具(找、读、建、改、删,再加查表)。工具名即动作,没有统一的 action 参数;改正文用查找替换,不提供整页覆盖。下面介绍它是什么、怎么装、典型参数长什么样。
这是什么¶
dsh-notion 由社区维护者 tututuhehehe 发布,在 SkillHub 插件目录 中归类为「联网工具」。源码与说明见 GitHub:tututuhehehe/dsh-notion(当前 package 版本 1.1.1,许可证 MIT)。
定位一句话:为 DeepSeek Harness 提供六个收敛后的 Notion 工具,底层调用官方 ntn CLI,而不是 Notion 官方 MCP 服务器。 返回给模型的是结构化、精简的 JSON 字段,而不是整份原始 Notion 对象。写操作带校验与回滚:库页属性按 schema 校验、create 失败自动回滚、移动拒绝成环和覆盖;有子页面的删除需经 doublecheck 复核。
为什么是六个工具,而不是几十个¶
Notion 官方 MCP 工具面大,dsh-notion deliberately 缩小范围:
- 找 → 读 → 建 → 改 → 删,外加 对已知库/ data source 查行(
notion_query)。 notion_search找对象(按标题搜 page / database),notion_query查表里的行;职责不混。- 建页、改页、删页各是一个工具,参数只声明该动作真正接受的字段,避免建页误带
old_str、改页误把database:<id>当父级之类的问题。 - 后续 README 说明只会补充确实必要的能力(如评论、文件上传),不为「全」而堆工具。
| 工具 | 作用 | 典型场景 |
|---|---|---|
notion_search |
按标题搜索工作区(page / database) | 还没有 id,先「找一下某页」 |
notion_get |
读页面 Markdown,或读数据库/data source 的 schema | 读正文、看有哪些列可写 |
notion_page_create |
新建页面或数据库行 | 新建页、写列、挂父级 |
notion_page_edit |
查找替换正文、改标题/列/图标、移动父级 | 改一句话、补一段、改状态、搬家 |
notion_page_trash |
删除页面或行(有子页面时先复核) | 删掉废弃页 |
notion_query |
对已知 database/data source 做 filter / sort / 分页 | 「这个库里未完成的任务有哪些」 |
三个写工具(create / edit / trash)的 timeoutMs 均为 180 秒,isConcurrencySafe 均为 false(每个动作都可能写入)。
安装与启用¶
DSH 生态是「一切皆插件」;SkillHub 目录是社区站点,与 DeepSeek / 幻方无官方从属关系。安装前请自行查看仓库源码与 MIT 许可证。插件以当前 dsh 进程的权限运行,token 与 ntn 调用都在该环境下生效。
1. 安装官方 Notion CLI¶
先装 ntn,并确认版本:
# macOS (Homebrew)
brew install --cask notion-cli
# 或 npm
npm i -g ntn
ntn --version
登录二选一:执行 ntn login,或配置 NOTION_API_TOKEN(见下一步)。
2. 把插件装进 DeepSeek Harness¶
需要 profile 可写。README 给出的方式是本地 bundle 或 git 地址,不要凭插件名自行拼接未在文档出现的命令:
plugin_manager install_bundle target=/absolute/path/to/dsh-notion
也可以直接用 git 地址安装。装好后插件行 id 为 notion-tools,上述六个工具会出现在工具列表里。
3. 配置 token 与可选字段¶
Token 不写进插件代码,按优先级读取:
- 环境变量
NOTION_API_TOKEN - 插件目录内的
notion-token文件(首个非注释行) ntn login保存的登录态
export NOTION_API_TOKEN=secret_xxx
# 或
echo 'secret_xxx' > <插件目录>/notion-token
Integration 必须在 Notion 里 Share 给目标页面/数据库,否则 API 可能返回 404。
| 字段 | 默认 | 说明 |
|---|---|---|
tokenFile |
notion-token |
token 文件;相对路径按插件目录解析 |
workspaceId |
空 | 多 workspace token 时指定(NOTION_WORKSPACE_ID) |
ntnPath |
自动发现 | ntn 可执行文件路径 |
timeoutMs |
60000 |
单次 ntn 调用超时(毫秒) |
典型用法¶
以下 JSON 示例均来自插件 README,可直接对照工具 schema 使用。
搜索(还没有 id 时):
{ "query": "项目计划", "limit": 10, "filter_object": "page" }
读取页面 Markdown 或库 schema:
{ "id_or_url": "https://www.notion.so/<id>", "format": "md" }
{ "id_or_url": "<database-id>" }
新建子页或数据库行(body_content、icon 与 title 平级;props 只放真实列):
{ "parent": "page:<page-id>", "title": "标题",
"body_content": "# 正文标题\n\n正文", "icon": "🎯" }
{ "parent": "data-source:<ds-id>", "title": "任务 A",
"body_content": "说明",
"props": { "Status": "进行中", "标签": ["验收"],
"截止日期": "2026-01-31", "Done": false } }
改正文(查找替换;与 body_content 追加互斥,不可同传):
{ "id": "<page-id>", "edits": [
{ "old_str": "旧的那句话", "new_str": "新的那句话" } ] }
查表(已知 database / data source id):
{
"database_or_data_source": "<ds-id 或 url>",
"limit": 25,
"filter": { "property": "Status", "status": { "equals": "进行中" } },
"sort": "截止日期 asc",
"under": "<父行 id>"
}
删除(有子页面时第一次调用不删,返回 pending;后续步骤用 double_check 并传 yes: true/false):
{ "id": "<page-id>" }
notion_page_edit 一次调用可同时做正文、标题/列/图标、移动父级,固定顺序为 (1) 正文 → (2) 标题/列/图标 → (3) 移动;三步互相独立,一步失败不会取消其它步,响应中会说明哪些生效、哪些未命中。
改正文只有两条路:传 edits 做查找替换,或 不传/空 edits 且传 body_content 追加到页尾。没有整页覆盖模式;页面上未提到的内容不会因一次调用被清空。
适用场景与注意¶
适合谁:已经在 DSH 里跑智能体、希望用少量稳定工具读写 Notion 工作区的开发者;愿意先装 ntn、在 Notion 里给 Integration 授权,并接受「工具面收敛」而不是 MCP 全量能力。
注意:
- 目录页简介若写「四个工具」,以 GitHub README 为准:当前为六个工具,插件 id
notion-tools。 - 未知列名或只读列会返回可写列提示;值类型不符会指出属性与期望类型。
notion_page_edit仍兼容旧拼法props.block_update(仅当未传edits时),新调用请直接用顶层edits。- 安装与 token 配置涉及本机路径与环境变量,生产环境请按团队规范保管
secret_token。
结尾¶
dsh-notion 把 Notion 日常操作收成六个动作清晰的工具,压在官方 ntn CLI 之上,减轻 MCP 工具爆炸带来的 schema 与误选成本,并用查找替换约束改文方式、用校验与 doublecheck 约束写删风险。