Lark MCP Server
Lark (飛書) MCP Server - 讓 Claude 直接操作 Lark 文件、Wiki、待辦事項。
最近更新 (v3.34.0 ~ v3.35.0)
v3.35.0 — 程式碼品質重構與 Bug 修復
重構內部實作、移除 dead code、修正 todo_create 時間戳 bug。
- Bug 修復:
todo_create 的 due_time 時間戳從毫秒改為秒(Lark API 要求秒級 Unix timestamp) - 重構:抽出
getAppAccessToken() 消除重複的 app token 取得邏輯 - 重構:抽出
deleteBlockRange() 統一 5 處 inline batch_delete 呼叫 - 簡化:
getDocumentRootBlockId 直接回傳 document ID(root block ID 等於 document ID) - 清理:移除未使用的
PaginationSchema、withRetry、dead wiki fallback 程式碼 - 清理:移除不必要的
export(RetryOptions、getErrorInfo) - 改善:
tasklist_tasks limit 預設改為 10(每個任務需額外 API 呼叫) - 改善:
drive_list 遞迴搜尋新增 maxApiCalls 限制防止過量 API 呼叫
v3.34.0 — 容器 block _children 支援
寫入工具新增 _children 欄位,支援 Callout、Quote 等容器 block 自動建立父 block 並遞迴插入子 block。
基本資訊
| 項目 | 值 |
|---|
| 名稱 | lark-mcp-server |
| 版本 | 3.35.0 |
| 執行環境 | Bun |
| 認證方式 | OAuth 2.0 (User Access Token) |
| Token 儲存 | ~/.lark-token.json |
安裝
bun install
Claude Code 設定
在 ~/.claude/settings.json 中加入:
{
"mcpServers": {
"lark": {
"command": "bun",
"args": ["run", "/path/to/lark-mcp-server/src/index.ts"],
"env": {
"LARK_APP_ID": "your_app_id",
"LARK_APP_SECRET": "your_app_secret",
"LARK_CALLBACK_PORT": "9876"
}
}
}
}
授權
使用任何工具時,若 Token 不存在或已過期,會自動開啟瀏覽器並啟動 OAuth callback server。只需在瀏覽器點「同意」即可完成授權。
Callback port 由環境變數 LARK_CALLBACK_PORT 設定(必填),固定使用該 port。若被佔用會自動殺掉佔用的 process 後重新綁定。
也可手動執行 lark_auth_url 觸發授權流程。lark_auth 保留作為手動備用。
工具列表
認證工具
| 工具 | 說明 |
|---|
lark_auth_url | 自動完成 OAuth 授權(開瀏覽器 + callback server) |
lark_auth | 手動提交授權碼(備用) |
user_me | 取得當前用戶資訊(open_id、name、email) |
user_get | 查詢指定用戶資訊 |
user_list | 列出部門成員 |
Wiki 工具
| 工具 | 說明 |
|---|
wiki_spaces | 列出所有 Wiki 空間 |
wiki_list_nodes | 列出 Wiki 空間的節點 |
wiki_read | 讀取 Wiki 內容(回傳原始 blocks) |
wiki_update | 更新 Wiki 內容(範圍更新或清空重寫) |
wiki_prepend | 在 Wiki 頂部插入內容 |
wiki_append | 在 Wiki 底部追加內容 |
wiki_insert_blocks | 在指定位置插入內容 |
wiki_delete_blocks | 刪除指定範圍的區塊 |
wiki_create_node | 建立新節點(頁面) |
wiki_move_node | 移動節點(支援跨空間) |
文件工具
| 工具 | 說明 |
|---|
doc_create | 建立新文件 |
doc_read | 讀取文件(回傳原始 blocks) |
blocks_to_markdown | 將 blocks 轉換為 Markdown(顯示用) |
doc_prepend | 在文件頂部插入內容 |
doc_append | 在文件底部追加內容 |
doc_update | 更新文件內容(範圍更新或清空重寫) |
doc_delete | 刪除文件 |
doc_move | 移動檔案到指定資料夾 |
doc_insert_blocks | 在指定位置插入內容 |
doc_delete_blocks | 刪除指定範圍的區塊 |
doc_move_blocks | 移動區塊到指定位置 |
doc_search_blocks | 搜尋包含關鍵字的區塊 |
doc_indent_block | 區塊縮排/取消縮排(indent/outdent) |
doc_batch_update_blocks | 批次更新多個 block 的文字內容(適合填表格) |
drive_list | 列出雲端硬碟檔案 |
drive_recent | 列出最近存取的檔案 |
lark_search | 全域搜尋(支援我的文件資料庫、共享空間) |
待辦事項工具
| 工具 | 說明 |
|---|
todo_list | 列出待辦事項 |
todo_create | 建立待辦事項 |
todo_search | 搜尋待辦事項 |
todo_update | 更新待辦事項 |
todo_add_members | 新增任務負責人 |
todo_remove_members | 移除任務負責人 |
task_complete | 完成任務或子任務 |
task_delete | 刪除任務或子任務 |
任務清單工具
| 工具 | 說明 |
|---|
tasklist_list | 列出所有任務清單 |
tasklist_create | 建立任務清單 |
tasklist_get | 取得任務清單詳情 |
tasklist_update | 更新任務清單名稱 |
tasklist_delete | 刪除任務清單 |
tasklist_add_task | 將待辦加入清單(可指定分組) |
tasklist_remove_task | 從清單移除待辦 |
tasklist_tasks | 列出清單中的待辦(含時間欄位) |
子任務工具
| 工具 | 說明 |
|---|
subtask_create | 建立子任務(支援負責人、開始/截止時間) |
subtask_list | 列出父任務的子任務 |
subtask_update | 更新子任務(摘要、負責人、時間) |
注意:子任務的完成和刪除請使用 task_complete 和 task_delete。
任務分組工具
| 工具 | 說明 |
|---|
section_list | 列出任務分組(「我負責的」或任務清單中的分組) |
section_tasks | 列出分組中的任務(支援過濾未完成) |
section_create | 建立分組(Tasklist 或「我負責的」) |
section_delete | 刪除分組 |
注意:Lark API 限制,只有 Tasklist 中的分組支援透過 tasklist_add_task 加入任務。「我負責的」中的分組只能透過 UI 操作移動任務。
通用參數
所有列表/搜尋工具皆支援以下可選參數:
| 參數 | 類型 | 預設值 | 說明 |
|---|
| limit | number | 20(list)/ 10(search) | 最大結果數 (1-100) |
| offset | number | 0 | 分頁偏移量 |
| response_format | string | "json" | 輸出格式(僅列表/搜尋工具支援) |
讀取工具說明:wiki_read 和 doc_read 回傳原始 blocks。需要顯示給用戶時,使用 blocks_to_markdown 轉換。
MCP String Coercion:所有非 string 參數(number / boolean / array)皆支援自動從 string 轉型。MCP protocol 傳參時所有值可能為 string,Schema 會自動處理:"3" → 3、"true" → true、"[{...}]" → [{...}]。呼叫端無需手動轉型。
工具參數詳細說明
認證工具
lark_auth
| 參數 | 類型 | 必填 | 說明 |
|---|
| code | string | 是 | 從授權頁面取得的授權碼 |
user_me
無參數。回傳當前用戶的 open_id、user_id、name、email、mobile。
user_get
| 參數 | 類型 | 必填 | 說明 |
|---|
| user_id | string | 是 | 用戶 ID(open_id 或 user_id) |
user_list
| 參數 | 類型 | 必填 | 說明 |
|---|
| department_id | string | 否 | 部門 ID(不填列出根部門 "0") |
Wiki 工具
wiki_list_nodes
| 參數 | 類型 | 必填 | 說明 |
|---|
| space_id | string | 是 | Wiki 空間 ID |
| parent_node_token | string | 否 | 父節點 Token(不填列出根節點) |
wiki_read
| 參數 | 類型 | 必填 | 說明 |
|---|
| wiki_token | string | 是 | Wiki 節點 Token |
wiki_update
| 參數 | 類型 | 必填 | 說明 |
|---|
| wiki_token | string | 是 | Wiki 節點 Token |
| blocks | array | 是 | Lark Block JSON 陣列 |
| start_index | number | 否 | 起始位置(範圍更新時使用) |
| end_index | number | 否 | 結束位置(範圍更新時使用) |
wiki_prepend / wiki_append
| 參數 | 類型 | 必填 | 說明 |
|---|
| wiki_token | string | 是 | Wiki 節點 Token |
| blocks | array | 是 | Lark Block JSON 陣列 |
wiki_insert_blocks
| 參數 | 類型 | 必填 | 說明 |
|---|
| wiki_token | string | 是 | Wiki 節點 Token |
| blocks | array | 是 | Lark Block JSON 陣列 |
| index | number | 否 | 插入位置(預設 0) |
wiki_delete_blocks
| 參數 | 類型 | 必填 | 說明 |
|---|
| wiki_token | string | 是 | Wiki 節點 Token |
| start_index | number | 是 | 起始位置(從 0 開始) |
| end_index | number | 是 | 結束位置(不包含) |
wiki_create_node
| 參數 | 類型 | 必填 | 說明 |
|---|
| space_id | string | 是 | Wiki 空間 ID |
| title | string | 是 | 節點標題(最多 200 字元) |
| parent_node_token | string | 否 | 父節點 Token(不填則建立在根目錄) |
| obj_type | string | 否 | 節點類型:doc/docx/sheet/bitable/mindnote/file(預設 docx) |
| response_format | string | 否 | 輸出格式:"json" 或 "markdown"(預設 json) |
wiki_move_node
| 參數 | 類型 | 必填 | 說明 |
|---|
| space_id | string | 是 | 節點當前所在的 Wiki 空間 ID |
| node_token | string | 是 | 要移動的節點 Token |
| target_parent_token | string | 否 | 目標父節點 Token(不填則移到空間根目錄) |
| target_space_id | string | 否 | 目標空間 ID(跨空間移動時使用) |
功能說明:支援同空間或跨空間移動,子節點會一併移動。需要 wiki:node:move 權限。
文件工具
doc_create
| 參數 | 類型 | 必填 | 說明 |
|---|
| folder_token | string | 是 | 目標資料夾 Token |
| title | string | 是 | 文件標題 |
| blocks | array | 否 | 初始 Lark Block JSON 陣列 |
doc_read
| 參數 | 類型 | 必填 | 說明 |
|---|
| document_id | string | 是 | 文件 ID |
doc_prepend
| 參數 | 類型 | 必填 | 說明 |
|---|
| document_id | string | 是 | 文件 ID |
| blocks | array | 是 | Lark Block JSON 陣列 |
doc_append
| 參數 | 類型 | 必填 | 說明 |
|---|
| document_id | string | 是 | 文件 ID |
| blocks | array | 是 | Lark Block JSON 陣列 |
doc_update
| 參數 | 類型 | 必填 | 說明 |
|---|
| document_id | string | 是 | 文件 ID |
| blocks | array | 是 | Lark Block JSON 陣列 |
| start_index | number | 否 | 起始位置(範圍更新時使用) |
| end_index | number | 否 | 結束位置(範圍更新時使用) |
doc_delete
| 參數 | 類型 | 必填 | 說明 |
|---|
| document_id | string | 是 | 文件 ID |
doc_move
| 參數 | 類型 | 必填 | 說明 |
|---|
| file_token | string | 是 | 檔案 Token |
| folder_token | string | 是 | 目標資料夾 Token |
| type | string | 否 | 檔案類型:doc/docx/sheet/bitable/file/folder(預設 docx) |
| response_format | string | 否 | 輸出格式:"json" 或 "markdown"(預設 json) |
doc_insert_blocks
| 參數 | 類型 | 必填 | 說明 |
|---|
| document_id | string | 是 | 文件 ID |
| blocks | array | 是 | Lark Block JSON 陣列 |
| index | number | 否 | 插入位置(預設 0) |
doc_delete_blocks
| 參數 | 類型 | 必填 | 說明 |
|---|
| document_id | string | 是 | 文件 ID |
| start_index | number | 是 | 起始位置(從 0 開始) |
| end_index | number | 是 | 結束位置(不包含) |
doc_move_blocks
| 參數 | 類型 | 必填 | 說明 |
|---|
| document_id | string | 是 | 文件 ID |
| start_index | number | 是 | 要移動的起始位置(從 0 開始) |
| end_index | number | 是 | 要移動的結束位置(不包含) |
| target_index | number | 是 | 目標位置(從 0 開始) |
doc_search_blocks
| 參數 | 類型 | 必填 | 說明 |
|---|
| document_id | string | 是 | 文件 ID |
| keyword | string | 是 | 搜尋關鍵字 |
| case_sensitive | boolean | 否 | 區分大小寫(預設 false) |
doc_indent_block
| 參數 | 類型 | 必填 | 說明 |
|---|
| document_id | string | 是 | 文件 ID |
| block_id | string | 是 | 要縮排的 Block ID(從 doc_read 取得) |
| direction | string | 是 | indent(移到前一個 sibling 底下)或 outdent(提升到 grandparent 層級) |
注意:此為破壞性操作(delete + re-insert),含子節點的 block 會整棵子樹一併搬移。
doc_batch_update_blocks
| 參數 | 類型 | 必填 | 說明 |
|---|
| document_id | string | 是 | 文件 ID |
| requests | array | 是 | 更新請求陣列(最多 100 項) |
| requests[].block_id | string | 是 | 要更新的 Block ID(從 doc_read 取得) |
| requests[].update_text_elements | object | 是 | 文字元素更新內容 |
| requests[].update_text_elements.elements | array | 是 | 文字元素陣列 |
典型流程:doc_read → 找到 table block → 取得 cell children 的 text block_id → doc_batch_update_blocks 一次更新多個 cell。
drive_list
| 參數 | 類型 | 必填 | 說明 |
|---|
| folder_token | string | 否 | 資料夾 Token(不填列出根目錄) |
drive_recent
無必填參數。
blocks_to_markdown
| 參數 | 類型 | 必填 | 說明 |
|---|
| blocks | array | 是 | 從 wiki_read 或 doc_read 取得的 blocks 陣列 |
lark_search
| 參數 | 類型 | 必填 | 說明 |
|---|
| query | string | 是 | 搜尋關鍵字 |
| doc_type | string | 否 | 文件類型(doc/docx/sheet/bitable/wiki/file) |
| folder_token | string | 否 | 限定搜尋的資料夾 |
| wiki_space_id | string | 否 | 限定搜尋的 Wiki 空間 |
使用 /suite/docs-api/search/object API,支援搜尋所有可存取文件(包括我的文件資料庫、共享空間)。
待辦事項工具
todo_list
| 參數 | 類型 | 必填 | 說明 |
|---|
| completed | boolean | 否 | 只列出已完成(預設 false) |
todo_create
| 參數 | 類型 | 必填 | 說明 |
|---|
| summary | string | 是 | 待辦摘要 |
| description | string | 否 | 詳細描述 |
| due_time | string | 否 | 截止時間(ISO 8601) |
todo_search
| 參數 | 類型 | 必填 | 說明 |
|---|
| query | string | 是 | 搜尋關鍵字 |
| completed | boolean | 否 | 只搜尋已完成 |
task_complete / task_delete
| 參數 | 類型 | 必填 | 說明 |
|---|
| task_id | string | 是 | 任務或子任務 ID |
todo_update
| 參數 | 類型 | 必填 | 說明 |
|---|
| task_id | string | 是 | 待辦事項 ID |
| summary | string | 否 | 新摘要 |
| description | string | 否 | 新描述 |
| start_time | string | 否 | 開始時間(ISO 8601 格式) |
| due_time | string | 否 | 新截止時間(ISO 8601 格式) |
todo_add_members / todo_remove_members
| 參數 | 類型 | 必填 | 說明 |
|---|
| task_id | string | 是 | 任務 ID |
| members | string[] | 是 | 用戶 ID 清單(open_id 或 user_id) |
任務清單工具
tasklist_create
tasklist_update
| 參數 | 類型 | 必填 | 說明 |
|---|
| tasklist_id | string | 是 | 任務清單 ID |
| name | string | 是 | 新清單名稱 |
tasklist_get / tasklist_delete / tasklist_tasks
| 參數 | 類型 | 必填 | 說明 |
|---|
| tasklist_id | string | 是 | 任務清單 ID |
| completed | boolean | 否 | 過濾完成狀態(僅 tasklist_tasks) |
tasklist_add_task
| 參數 | 類型 | 必填 | 說明 |
|---|
| tasklist_id | string | 是 | 任務清單 ID |
| task_id | string | 是 | 待辦事項 ID |
| section_guid | string | 否 | 分組 GUID(不填則加入預設分組) |
提示:若任務已在該清單中,再次呼叫並指定不同的 section_guid 可直接將任務移至新分組,無需先移除。
tasklist_remove_task
| 參數 | 類型 | 必填 | 說明 |
|---|
| tasklist_id | string | 是 | 任務清單 ID |
| task_id | string | 是 | 待辦事項 ID |
子任務工具
subtask_create
| 參數 | 類型 | 必填 | 說明 |
|---|
| parent_task_id | string | 是 | 父任務 ID |
| summary | string | 是 | 子任務摘要 |
| members | string[] | 否 | 負責人 ID 清單(open_id 或 user_id) |
| start_time | string | 否 | 開始時間(ISO 8601 格式) |
| due_time | string | 否 | 截止時間(ISO 8601 格式) |
subtask_list
| 參數 | 類型 | 必填 | 說明 |
|---|
| parent_task_id | string | 是 | 父任務 ID |
subtask_update
| 參數 | 類型 | 必填 | 說明 |
|---|
| task_id | string | 是 | 子任務 ID |
| summary | string | 否 | 新摘要 |
| members | string[] | 否 | 新負責人 ID 清單 |
| start_time | string | 否 | 新開始時間(ISO 8601 格式) |
| due_time | string | 否 | 新截止時間(ISO 8601 格式) |
任務分組工具
section_list
| 參數 | 類型 | 必填 | 說明 |
|---|
| resource_type | string | 否 | 資源類型:my_tasks(我負責的)或 tasklist(清單),預設 my_tasks |
| resource_id | string | 條件 | 任務清單 GUID(當 resource_type 為 tasklist 時必填) |
section_tasks
| 參數 | 類型 | 必填 | 說明 |
|---|
| section_guid | string | 是 | 分組 GUID |
| completed | boolean | 否 | 過濾完成狀態(false 只取未完成) |
section_create
| 參數 | 類型 | 必填 | 說明 |
|---|
| name | string | 是 | 分組名稱(最多 100 字元) |
| resource_type | string | 是 | 資源類型:my_tasks 或 tasklist |
| resource_id | string | 條件 | 任務清單 GUID(當 resource_type 為 tasklist 時必填) |
section_delete
| 參數 | 類型 | 必填 | 說明 |
|---|
| section_guid | string | 是 | 分組 GUID |
Lark Block JSON 格式
寫入工具(doc_create, doc_prepend, doc_append, doc_update, doc_insert_blocks, wiki_prepend, wiki_append, wiki_update, wiki_insert_blocks)接受 Lark Block JSON 陣列。
常用 Block 結構
文字段落:
{ "block_type": 2, "text": { "elements": [{ "text_run": { "content": "Hello" } }] } }
標題(H1-H9):
{ "block_type": 3, "heading1": { "elements": [{ "text_run": { "content": "Title" } }] } }
無序列表:
{ "block_type": 12, "bullet": { "elements": [{ "text_run": { "content": "Item" } }] } }
有序列表:
{ "block_type": 13, "ordered": { "elements": [{ "text_run": { "content": "Item" } }] } }
待辦事項:
{ "block_type": 17, "todo": { "elements": [{ "text_run": { "content": "Task" } }], "style": { "done": false } } }
程式碼區塊:
{ "block_type": 14, "code": { "elements": [{ "text_run": { "content": "code" } }], "language": 40 } }
引用:
{ "block_type": 15, "quote": { "elements": [{ "text_run": { "content": "quote" } }] } }
分隔線:
{ "block_type": 22, "divider": {} }
Block Type 對照表
| Type | 名稱 | 屬性名 |
|---|
| 2 | Text | text |
| 3-11 | Heading1-9 | heading1-heading9 |
| 12 | Bullet | bullet |
| 13 | Ordered | ordered |
| 14 | Code | code |
| 15 | Quote | quote |
| 17 | Todo | todo |
| 22 | Divider | divider |
| 31 | Table | table |
Text Element 結構(支援樣式)
{
"text_run": {
"content": "文字內容",
"text_element_style": {
"bold": true,
"italic": false,
"strikethrough": false,
"inline_code": false
}
}
}
讀取與顯示
doc_read 和 wiki_read 回傳原始 blocks。使用 blocks_to_markdown 可將 blocks 轉換為 Markdown 格式顯示給用戶。
表格支援
讀取:支援兩種表格類型:
| 類型 | Block Type | 說明 |
|---|
| 原生表格 (Table) | 31 | Lark 文件中的原生表格 |
| 嵌入多維表格 (Sheet) | 30 | 嵌入的 Bitable 表格(需 bitable:app 權限) |
所需權限 (Scopes)
在 Lark 開發者後台設定以下權限:
wiki:wiki - Wiki 讀寫wiki:node:move - 移動 Wiki 節點drive:drive - 雲端硬碟(含文件操作、搜尋)bitable:app - 多維表格讀取(嵌入的 Sheet 表格)task:task:read - 讀取待辦事項task:task:write - 寫入待辦事項task:tasklist:read - 讀取任務清單task:tasklist:write - 寫入任務清單task:section:write - 任務分組(取得「我負責的」任務)contact:contact.base:readonly - 列出部門成員contact:user.base:readonly - 讀取用戶基本資訊contact:user.email:readonly - 讀取用戶 emailoffline_access - 離線存取(Refresh Token)
專案結構
src/
├── index.ts # MCP Server 入口
├── constants.ts # 常數與設定
├── types.ts # TypeScript 型別定義
├── schemas/ # Zod 驗證 Schema
│ ├── common.ts
│ ├── auth.ts
│ ├── wiki.ts
│ ├── doc.ts
│ └── todo.ts
├── services/
│ └── lark-client.ts # Lark API 客戶端
├── tools/
│ ├── auth.ts # 認證工具
│ ├── wiki.ts # Wiki 工具
│ ├── doc.ts # 文件工具
│ └── todo.ts # 待辦事項工具
└── utils/
├── errors.ts # 錯誤處理與錯誤碼定義
├── rate-limiter.ts # API 請求頻率限制
├── retry.ts # 重試機制(指數退避)
├── markdown.ts # Markdown 與 Lark Block 轉換
├── oauth-callback.ts # OAuth Callback Server(自動授權)
└── response.ts # 回應格式化工具
API 穩定性機制
Rate Limiting
自動限制 API 請求頻率,防止觸發 Lark API 限流(錯誤碼 99991400):
| 類型 | 限制 | 說明 |
|---|
| 全域限流 | 3 QPS | 所有 API 請求 |
| 文件級限流 | 3 QPS/文件 | 同一文件的編輯操作 |
自動重試
遇到可恢復錯誤時自動重試(指數退避):
| 設定 | 值 |
|---|
| 最大重試次數 | 3 次 |
| 基礎延遲 | 1 秒 |
| 最大延遲 | 10 秒 |
可重試的錯誤:
99991400 - Rate Limit99991663 / 99991665 - Token 失效(自動刷新)1770010 - 並發編輯衝突
結構化錯誤訊息
錯誤回應包含詳細資訊與建議:
Error: API request failed
**Error Code**: 99991668
**Description**: Resource access denied
**Message**: no permission to access resource
**Endpoint**: /wiki/v2/spaces/xxx
**Suggestion**: Ensure you have permission to access this resource.
更新日誌
v3.35.0
程式碼品質重構與 Bug 修復 — 重構內部實作、修正 bug、移除 dead code。
todo.ts:due_time 時間戳修正 getTime() → Math.floor(getTime() / 1000)(毫秒→秒)lark-client.ts:抽出 getAppAccessToken() 共用函數,消除 exchangeCodeForToken / refreshAccessToken 重複邏輯lark-client.ts:抽出 deleteBlockRange() 共用函數,統一 doc.ts / wiki.ts 共 8 處 inline 呼叫lark-client.ts:getDocumentRootBlockId 簡化為直接回傳 document IDlark-client.ts:移除 fetchUserTenantDomain 中無作用的 Wiki 空間 fallback 程式碼lark-client.ts:移除 existsSync import,改用 try/catch 處理schemas/common.ts:移除未使用的 PaginationSchema / PaginationInputschemas/todo.ts:tasklist_tasks limit 預設 20 → 10,最大 50tools/wiki.ts:drive_list 遞迴搜尋新增 maxApiCalls(50)限制utils/retry.ts:移除未使用的 withRetry 函數及 RetryOptions 的 exportutils/errors.ts:移除 getErrorInfo 的 export
v3.34.0
容器 block _children 支援 — 寫入工具新增 _children 欄位,支援 Callout、Quote 等容器 block 自動建立父 block 並遞迴插入子 block。
lark-client.ts:insertBlocks 新增 _children 分支,遇到時先 flush、建立父 block、再遞迴插入子 blocktools/doc.ts:doc_create、doc_update、doc_insert_blocks 的 description 補充 _children 用法tools/doc.ts:hasTable → hasNestedBlocks,語意更準確
v3.33.0
tasklist_tasks 新增 completed 過濾 — 新增 completed (boolean, optional) 參數,可依完成狀態過濾清單中的任務。
schemas/todo.ts:TasklistTasksSchema 加入 completed: coerceBoolean.optional()tools/todo.ts:handler 將 completed 傳入 API request params
v3.32.0
新增 doc_indent_block 工具 — 支援文件區塊縮排/取消縮排,透過 delete + re-insert 遞迴搬移整棵 block tree。
lark-client.ts:新增 insertSingleBlock() helper(回傳新 block ID)schemas/doc.ts:新增 DocIndentBlockSchematools/doc.ts:新增 doc_indent_block tool
v3.31.0
RateLimiter 改為 queue-based — 修復 tasklist_tasks 大量任務時約 30% 回傳 (failed to fetch) 的問題。
rate-limiter.ts:RateLimiter 從 timestamp-based 改為 promise-chain-based,並發呼叫自動排隊依序執行constants.ts:RATE_LIMIT_INTERVAL_MS 350 → 340ms
v3.30.0
新增 MCP String Coercion Helpers — 解決 Claude Code 透過 MCP protocol 呼叫工具時,所有參數值皆為 string 導致 Zod strict schema 驗證失敗(Expected array, received string 等)的問題。
修改內容:
common.ts:新增 coerceNumber、coerceBoolean、coerceArray(itemSchema) 三個 preprocess helpers,ListPaginationSchema / SearchPaginationSchema 的 limit、offset 改用 coerceNumberdoc.ts:blocks → coerceArray()、start_index / end_index / target_index / index → coerceNumber.pipe()、case_sensitive → coerceBooleanwiki.ts:blocks → coerceArray()、start_index / end_index / index → coerceNumber.pipe()todo.ts:members → coerceArray(z.string())、completed → coerceBoolean、limit(SectionList / SectionTasks)→ coerceNumber.pipe()
使用重點:
- 呼叫端傳入
"3" 或 3 皆可,Schema 自動轉為正確型別 - array 參數可傳 JSON string(如
"[{\"block_type\":2}]")或原生 array,兩者皆接受 - boolean 參數接受
"true" / "false" string 或原生 true / false - 轉型失敗時仍會拋出原始 Zod validation error,不會靜默吞錯
- 僅影響 input schema,output schema 不變
License
MIT