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
安裝
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
參數
類型
必填
說明
name
string
是
清單名稱
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 節點
docx:document - 新版文檔讀寫(doc_append / doc_update 等寫入操作必需)
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 - 讀取用戶 email
offline_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 Limit
99991663 / 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 ID
lark-client.ts:移除 fetchUserTenantDomain 中無作用的 Wiki 空間 fallback 程式碼
lark-client.ts:移除 existsSync import,改用 try/catch 處理
schemas/common.ts:移除未使用的 PaginationSchema / PaginationInput
schemas/todo.ts:tasklist_tasks limit 預設 20 → 10,最大 50
tools/wiki.ts:drive_list 遞迴搜尋新增 maxApiCalls(50)限制
utils/retry.ts:移除未使用的 withRetry 函數及 RetryOptions 的 export
utils/errors.ts:移除 getErrorInfo 的 export
v3.34.0
容器 block _children 支援 — 寫入工具新增 _children 欄位,支援 Callout、Quote 等容器 block 自動建立父 block 並遞迴插入子 block。
lark-client.ts:insertBlocks 新增 _children 分支,遇到時先 flush、建立父 block、再遞迴插入子 block
tools/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:新增 DocIndentBlockSchema
tools/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 改用 coerceNumber
doc.ts:blocks → coerceArray()、start_index / end_index / target_index / index → coerceNumber.pipe()、case_sensitive → coerceBoolean
wiki.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