前言¶
在 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 約束寫刪風險。