lark-all-in-one
Feishu / Lark Comprehensive Skill
Prerequisite: You must have the official Lark MCP server running before using this skill. Setup:
npx -y @larksuiteoapi/lark-mcp mcp -a <APP_ID> -s <APP_SECRET>For user-identity APIs (useUAT): first runnpx -y @larksuiteoapi/lark-mcp login -a <APP_ID> -s <APP_SECRET>To enable Video Conferencing + Minutes APIs, add:-t preset.calendar.default,vc.v1.reserve.apply,vc.v1.meeting.get,vc.v1.meetingRecording.get,minutes.v1.minute.get,minutes.v1.minuteTranscript.get,minutes.v1.minuteStatistic.getFull docs: https://open.larkoffice.com/document/home/index
Core Concepts
Tool Naming
All MCP tools use the prefix mcp__lark-mcp__. Example:
mcp__lark-mcp__im.v1.message.create
Identity Types
| Parameter | Value | Meaning |
|---|---|---|
useUAT |
true |
Act as the logged-in user — resources are owned by the user, directly accessible |
useUAT |
false (default) |
Act as the app/bot — resources owned by the application |
Use useUAT: true for most interactive operations. Use false for background automation.
Standard Parameter Structure
path: # URL path parameters (IDs, tokens)
params: # Query string parameters (pagination, filters, id_type)
data: # Request body payload
useUAT: # true = user identity, false = app identity
Common ID Types
| ID | Format | Represents |
|---|---|---|
app_token |
appXXX |
Bitable application |
table_id |
tblXXX |
Bitable table |
record_id |
recXXX |
Bitable record |
open_id |
ou_XXX |
User (OpenID) |
union_id |
on_XXX |
User (UnionID, cross-app) |
chat_id |
oc_XXX |
Group/DM chat |
message_id |
om_XXX |
Individual message |
document_id |
doxcXXX |
Docs document |
file_token |
varies | Drive file |
node_token |
varies | Wiki node |
event_uid |
varies | Calendar event |
task_guid |
varies | Task |
approval_code |
varies | Approval definition |
1. Messaging (IM)
Send a Message
Tool: mcp__lark-mcp__im.v1.message.create
params:
receive_id_type: "chat_id" # or: open_id, union_id, email, user_id
data:
receive_id: "oc_xxx"
msg_type: "text" # text | post | image | interactive | file | audio | media | sticker | share_chat | share_user
content: '{"text":"Hello!"}'
useUAT: true
Message types and content formats:
text:{"text": "Hello @user"}post(rich text):{"zh_cn": {"title": "Title", "content": [[{"tag":"text","text":"body"}]]}}interactive(card): JSON card definition — use Card Builder at https://open.larkoffice.com/cardkitimage:{"image_key": "img_xxx"}(upload image first via Drive)share_chat:{"chat_id": "oc_xxx"}
Reply to a Message
Tool: mcp__lark-mcp__im.v1.message.reply
path:
message_id: "om_xxx"
data:
content: '{"text":"Got it!"}'
msg_type: "text"
reply_in_thread: false # true = create/continue a thread
useUAT: true
List Messages in a Chat
Tool: mcp__lark-mcp__im.v1.message.list
params:
container_id_type: "chat"
container_id: "oc_xxx"
page_size: 20
sort_type: "ByCreateTimeDesc"
start_time: "1700000000" # optional Unix timestamp
end_time: "1700100000" # optional Unix timestamp
Get a Single Message
Tool: mcp__lark-mcp__im.v1.message.get
path:
message_id: "om_xxx"
Delete a Message
Tool: mcp__lark-mcp__im.v1.message.delete
path:
message_id: "om_xxx"
useUAT: true
Update / Edit a Message (cards or text)
Tool: mcp__lark-mcp__im.v1.message.update
path:
message_id: "om_xxx"
data:
msg_type: "interactive"
content: '{"config":{},"elements":[...]}'
useUAT: true
Add a Message Reaction (Emoji)
Tool: mcp__lark-mcp__im.v1.messageReaction.create
path:
message_id: "om_xxx"
data:
reaction_type:
emoji_type: "THUMBSUP" # THUMBSUP, OK, HEART, etc.
useUAT: true
List Message Reactions
Tool: mcp__lark-mcp__im.v1.messageReaction.list
path:
message_id: "om_xxx"
params:
reaction_type: "THUMBSUP" # optional filter
Pin / Unpin a Message
Tool: mcp__lark-mcp__im.v1.pin.create / mcp__lark-mcp__im.v1.pin.delete
data:
message_id: "om_xxx"
chat_id: "oc_xxx"
useUAT: true
Read Receipts (who has read)
Tool: mcp__lark-mcp__im.v1.message.readUsers
path:
message_id: "om_xxx"
params:
user_id_type: "open_id"
page_size: 50
2. Group / Chat Management
List All Chats the Bot Is In
Tool: mcp__lark-mcp__im.v1.chat.list
params:
user_id_type: "open_id"
page_size: 20
List Chats the User Is In
Tool: mcp__lark-mcp__im.v1.chat.list
params:
user_id_type: "open_id"
page_size: 20
useUAT: true
Get Chat Info
Tool: mcp__lark-mcp__im.v1.chat.get
path:
chat_id: "oc_xxx"
params:
user_id_type: "open_id"
Create a Group Chat
Tool: mcp__lark-mcp__im.v1.chat.create
data:
name: "Project Alpha"
description: "Discuss Project Alpha here"
owner_id: "ou_xxx" # optional, defaults to app/user
user_id_list: ["ou_xxx", "ou_yyy"]
bot_id_list: []
chat_mode: "group"
chat_type: "private" # private | public
external: false
useUAT: true
Update Group Info
Tool: mcp__lark-mcp__im.v1.chat.update
path:
chat_id: "oc_xxx"
data:
name: "New Name"
description: "Updated description"
owner_id: "ou_xxx" # transfer ownership
add_member_permission: "all_members"
at_all_permission: "all_members"
edit_permission: "all_members"
useUAT: true
Disband a Group
Tool: mcp__lark-mcp__im.v1.chat.delete
path:
chat_id: "oc_xxx"
useUAT: true
List Chat Members
Tool: mcp__lark-mcp__im.v1.chatMembers.get
path:
chat_id: "oc_xxx"
params:
member_id_type: "open_id"
page_size: 50
Add Members to Chat
Tool: mcp__lark-mcp__im.v1.chatMembers.create
path:
chat_id: "oc_xxx"
params:
member_id_type: "open_id"
data:
id_list: ["ou_xxx", "ou_yyy"]
useUAT: true
Remove Members from Chat
Tool: mcp__lark-mcp__im.v1.chatMembers.delete
path:
chat_id: "oc_xxx"
params:
member_id_type: "open_id"
data:
id_list: ["ou_xxx"]
useUAT: true
Search Public Chats
Tool: mcp__lark-mcp__im.v1.chat.search
params:
query: "design team"
page_size: 20
useUAT: true
List Chat Tabs
Tool: mcp__lark-mcp__im.v1.chatTab.listTabs
path:
chat_id: "oc_xxx"
Get Chat Announcement
Tool: mcp__lark-mcp__im.v1.chatAnnouncement.get
path:
chat_id: "oc_xxx"
params:
user_id_type: "open_id"
Update Chat Announcement
Tool: mcp__lark-mcp__im.v1.chatAnnouncement.patch
path:
chat_id: "oc_xxx"
data:
revision_id: 1
requests: ['{"requestType":"InsertBlocksAtDocumentTail","insertBlocksAtDocumentTailRequest":{"payload":{"blocks":[{"blockType":2,"text":{"elements":[{"textRun":{"content":"New announcement"}}],"style":{}}}]}}}']
useUAT: true
3. Bitable (Multi-Dimensional Tables / Base)
Create a Bitable App
Tool: mcp__lark-mcp__bitable.v1.app.create
data:
name: "Project Tracker"
folder_token: "" # optional: Drive folder to place it in
useUAT: true
Get Bitable App Info
Tool: mcp__lark-mcp__bitable.v1.app.get
path:
app_token: "appXXX"
Update Bitable App
Tool: mcp__lark-mcp__bitable.v1.app.update
path:
app_token: "appXXX"
data:
name: "New Name"
is_advanced: true # enable advanced features
useUAT: true
List Tables in a Bitable App
Tool: mcp__lark-mcp__bitable.v1.appTable.list
path:
app_token: "appXXX"
params:
page_size: 20
Create a Table
Tool: mcp__lark-mcp__bitable.v1.appTable.create
path:
app_token: "appXXX"
data:
table:
name: "Tasks"
default_view_name: "Grid View"
fields:
- field_name: "Task Name"
type: 1 # 1=text, 2=number, 3=single-select, 4=multi-select, 5=date, 7=checkbox, 11=person, 15=url, 99001=phone
- field_name: "Status"
type: 3
property:
options:
- name: "To Do"
color: 0
- name: "In Progress"
color: 1
- name: "Done"
color: 2
- field_name: "Assignee"
type: 11
- field_name: "Due Date"
type: 5
useUAT: true
Delete a Table
Tool: mcp__lark-mcp__bitable.v1.appTable.delete
path:
app_token: "appXXX"
table_id: "tblXXX"
useUAT: true
List Fields in a Table
Tool: mcp__lark-mcp__bitable.v1.appTableField.list
path:
app_token: "appXXX"
table_id: "tblXXX"
params:
page_size: 50
view_id: "" # optional: filter by view
Create a Field
Tool: mcp__lark-mcp__bitable.v1.appTableField.create
path:
app_token: "appXXX"
table_id: "tblXXX"
data:
field_name: "Priority"
type: 3 # single-select
property:
options:
- name: "High"
color: 0
- name: "Medium"
color: 1
- name: "Low"
color: 2
useUAT: true
Update a Field
Tool: mcp__lark-mcp__bitable.v1.appTableField.update
path:
app_token: "appXXX"
table_id: "tblXXX"
field_id: "fldXXX"
data:
field_name: "Renamed Field"
property:
options:
- name: "Critical"
color: 0
useUAT: true
Delete a Field
Tool: mcp__lark-mcp__bitable.v1.appTableField.delete
path:
app_token: "appXXX"
table_id: "tblXXX"
field_id: "fldXXX"
useUAT: true
Search / List Records
Tool: mcp__lark-mcp__bitable.v1.appTableRecord.search
path:
app_token: "appXXX"
table_id: "tblXXX"
params:
user_id_type: "open_id"
page_size: 100
page_token: "" # for pagination
data:
view_id: "" # optional
field_names: ["Task Name", "Status", "Assignee"] # optional: only return these fields
sort:
- field_name: "Due Date"
desc: false
filter:
conjunction: "and" # and | or
conditions:
- field_name: "Status"
operator: "is" # is | isNot | contains | doesNotContain | isEmpty | isNotEmpty | isGreater | isLess
value: ["In Progress"]
automatic_fields: false
useUAT: true
Get a Single Record
Tool: mcp__lark-mcp__bitable.v1.appTableRecord.get
path:
app_token: "appXXX"
table_id: "tblXXX"
record_id: "recXXX"
params:
user_id_type: "open_id"
Create a Record
Tool: mcp__lark-mcp__bitable.v1.appTableRecord.create
path:
app_token: "appXXX"
table_id: "tblXXX"
params:
user_id_type: "open_id"
data:
fields:
"Task Name": "Fix login bug"
"Status": "To Do"
"Assignee": [{"id": "ou_xxx"}]
"Due Date": 1700000000000 # milliseconds timestamp
useUAT: true
Batch Create Records
Tool: mcp__lark-mcp__bitable.v1.appTableRecord.batchCreate
path:
app_token: "appXXX"
table_id: "tblXXX"
params:
user_id_type: "open_id"
data:
records:
- fields:
"Task Name": "Task 1"
"Status": "To Do"
- fields:
"Task Name": "Task 2"
"Status": "In Progress"
useUAT: true
Update a Record
Tool: mcp__lark-mcp__bitable.v1.appTableRecord.update
path:
app_token: "appXXX"
table_id: "tblXXX"
record_id: "recXXX"
params:
user_id_type: "open_id"
data:
fields:
"Status": "Done"
useUAT: true
Batch Update Records
Tool: mcp__lark-mcp__bitable.v1.appTableRecord.batchUpdate
path:
app_token: "appXXX"
table_id: "tblXXX"
params:
user_id_type: "open_id"
data:
records:
- record_id: "recXXX"
fields:
"Status": "Done"
- record_id: "recYYY"
fields:
"Status": "In Progress"
useUAT: true
Delete a Record
Tool: mcp__lark-mcp__bitable.v1.appTableRecord.delete
path:
app_token: "appXXX"
table_id: "tblXXX"
record_id: "recXXX"
useUAT: true
Batch Delete Records
Tool: mcp__lark-mcp__bitable.v1.appTableRecord.batchDelete
path:
app_token: "appXXX"
table_id: "tblXXX"
data:
records: ["recXXX", "recYYY"]
useUAT: true
List Views
Tool: mcp__lark-mcp__bitable.v1.appTableView.list
path:
app_token: "appXXX"
table_id: "tblXXX"
params:
page_size: 20
Create a View
Tool: mcp__lark-mcp__bitable.v1.appTableView.create
path:
app_token: "appXXX"
table_id: "tblXXX"
data:
view_name: "Kanban"
view_type: "kanban" # grid | kanban | gallery | gantt | form
useUAT: true
Manage Bitable Collaborators
Tool: mcp__lark-mcp__bitable.v1.appRoleMember.create
path:
app_token: "appXXX"
role_id: "roleXXX"
data:
member_id: "ou_xxx"
member_id_type: "open_id"
useUAT: true
4. Documents (Docs)
Search Documents
Tool: mcp__lark-mcp__drive.v1.file.search (or docx.builtin.search)
params:
query: "Q4 report"
page_size: 20
useUAT: true
Get Document Content (plain text)
Tool: mcp__lark-mcp__docx.v1.document.rawContent
path:
document_id: "doxcXXX"
params:
lang: 0 # 0=default
useUAT: true
Get Document Metadata
Tool: mcp__lark-mcp__docx.v1.document.get
path:
document_id: "doxcXXX"
useUAT: true
Create a New Document
Tool: mcp__lark-mcp__docx.v1.document.create
data:
folder_token: "" # optional: Drive folder
title: "Meeting Notes - 2026-03-06"
useUAT: true
List Document Blocks
Tool: mcp__lark-mcp__docx.v1.documentBlock.list
path:
document_id: "doxcXXX"
params:
page_size: 50
document_revision_id: -1 # -1 = latest
useUAT: true
Update Document Blocks (insert content)
Tool: mcp__lark-mcp__docx.v1.documentBlockChildren.batchUpdate
path:
document_id: "doxcXXX"
block_id: "doxcXXX" # parent block (document root = document_id)
data:
requests:
- insertBlocksAfterBlockRequest:
targetBlockId: "blockXXX"
payload:
blocks:
- blockType: 2 # 2=text, 3=heading1, 4=heading2, 12=bullet, 22=code
text:
elements:
- textRun:
content: "New paragraph content"
revision_id: -1 # -1 = latest
useUAT: true
5. Cloud Drive (Drive)
List Files in Root or Folder
Tool: mcp__lark-mcp__drive.v1.file.list
params:
folder_token: "" # empty = root ("My Drive")
page_size: 20
order_by: "EditedTime" # EditedTime | CreatedTime | Name
direction: "DESC"
useUAT: true
Create a Folder
Tool: mcp__lark-mcp__drive.v1.file.createFolder
data:
name: "Q1 Reports"
folder_token: "" # parent folder, empty = root
useUAT: true
Move a File
Tool: mcp__lark-mcp__drive.v1.file.move
path:
file_token: "xxx"
data:
type: "doc" # doc | sheet | bitable | mindnote | file | wiki | docx
folder_token: "targetFolderToken"
useUAT: true
Copy a File
Tool: mcp__lark-mcp__drive.v1.file.copy
path:
file_token: "xxx"
data:
name: "Copy of Report"
type: "docx"
folder_token: "targetFolderToken"
useUAT: true
Delete a File
Tool: mcp__lark-mcp__drive.v1.file.delete
path:
file_token: "xxx"
params:
type: "docx"
useUAT: true
Get File Statistics
Tool: mcp__lark-mcp__drive.v1.fileStatistics.get
path:
file_token: "xxx"
file_type: "docx" # docx | sheet | bitable | file
Manage File Permissions (add collaborator)
Tool: mcp__lark-mcp__drive.v1.permissionMember.create
path:
token: "xxx"
type: "docx"
data:
member_type: "openid" # openid | unionid | email | opendepartmentid | groupid
member_id: "ou_xxx"
perm: "view" # view | edit | full_access
useUAT: true
List File Collaborators
Tool: mcp__lark-mcp__drive.v1.permissionMember.list
path:
token: "xxx"
type: "docx"
useUAT: true
Get File Comments
Tool: mcp__lark-mcp__drive.v1.fileComment.list
path:
file_token: "xxx"
file_type: "docx"
params:
is_solved: false
page_size: 20
useUAT: true
Add a File Comment
Tool: mcp__lark-mcp__drive.v1.fileComment.create
path:
file_token: "xxx"
file_type: "docx"
data:
reply_list:
replies:
- content:
elements:
- type: "text_run"
text_run:
text: "Great work on this section!"
useUAT: true
6. Calendar
List All Calendars
Tool: mcp__lark-mcp__calendar.v4.calendar.list
params:
page_size: 20
useUAT: true
Get Primary Calendar
Tool: mcp__lark-mcp__calendar.v4.calendar.primary
params:
user_id_type: "open_id"
useUAT: true
Create a Calendar
Tool: mcp__lark-mcp__calendar.v4.calendar.create
data:
summary: "Team Calendar"
description: "Shared team schedule"
permissions: "public" # private | show_only_free_busy | public
color: -1
summary_alias: ""
useUAT: true
List Events
Tool: mcp__lark-mcp__calendar.v4.calendarEvent.list
path:
calendar_id: "primary" # or specific calendar ID
params:
start_time: "1700000000"
end_time: "1702600000"
page_size: 50
useUAT: true
Get a Calendar Event
Tool: mcp__lark-mcp__calendar.v4.calendarEvent.get
path:
calendar_id: "primary"
event_id: "xxx"
params:
user_id_type: "open_id"
useUAT: true
Create a Calendar Event
Tool: mcp__lark-mcp__calendar.v4.calendarEvent.create
path:
calendar_id: "primary"
data:
summary: "Team Standup"
description: "Daily sync"
start_time:
timestamp: "1700000000"
timezone: "Asia/Shanghai"
end_time:
timestamp: "1700003600"
timezone: "Asia/Shanghai"
attendees:
- type: "user"
user_id: "ou_xxx"
need_notification: true
visibility: "default" # default | public | private
free_busy_status: "busy" # busy | free
color: -1
reminders:
- minutes: 10
recurrence_rule: "" # e.g. "FREQ=DAILY;COUNT=5" for recurring events
useUAT: true
Update a Calendar Event
Tool: mcp__lark-mcp__calendar.v4.calendarEvent.patch
path:
calendar_id: "primary"
event_id: "xxx"
data:
summary: "Updated Meeting Title"
description: "Updated description"
useUAT: true
Delete a Calendar Event
Tool: mcp__lark-mcp__calendar.v4.calendarEvent.delete
path:
calendar_id: "primary"
event_id: "xxx"
params:
need_notification: true
useUAT: true
List Event Attendees
Tool: mcp__lark-mcp__calendar.v4.calendarEventAttendee.list
path:
calendar_id: "primary"
event_id: "xxx"
params:
user_id_type: "open_id"
page_size: 50
useUAT: true
Add Attendees to an Event
Tool: mcp__lark-mcp__calendar.v4.calendarEventAttendee.create
path:
calendar_id: "primary"
event_id: "xxx"
data:
attendees:
- type: "user"
user_id: "ou_xxx"
need_notification: true
useUAT: true
Get User Free/Busy
Tool: mcp__lark-mcp__calendar.v4.freebusy.list
data:
time_min: "2026-03-06T09:00:00+08:00"
time_max: "2026-03-06T18:00:00+08:00"
user_id_list: ["ou_xxx", "ou_yyy"]
useUAT: true
7. Tasks
List Tasks
Tool: mcp__lark-mcp__task.v2.task.list
params:
completed: false
type: "my" # my | created | assigned
page_size: 50
useUAT: true
Get a Task
Tool: mcp__lark-mcp__task.v2.task.get
path:
task_guid: "xxx"
params:
user_id_type: "open_id"
useUAT: true
Create a Task
Tool: mcp__lark-mcp__task.v2.task.create
params:
user_id_type: "open_id"
data:
summary: "Write Q4 report"
description: "Compile all metrics and write the Q4 summary report"
due:
timestamp: "1700000000000" # milliseconds
is_all_day: false
origin:
platform_i18n_name: '{"zh_cn":"来自OpenClaw","en_us":"From OpenClaw"}'
members:
- id: "ou_xxx"
type: "user"
role: "assignee" # assignee | follower
task_list_configs:
- tasklist_guid: "tsklistXXX" # optional: add to a task list
repeat_rule: "" # e.g. "FREQ=WEEKLY;BYDAY=MO" for recurring
useUAT: true
Update a Task
Tool: mcp__lark-mcp__task.v2.task.patch
path:
task_guid: "xxx"
params:
user_id_type: "open_id"
data:
task:
summary: "Updated task name"
due:
timestamp: "1700100000000"
update_fields: ["summary", "due"] # specify which fields to update
useUAT: true
Complete a Task
Tool: mcp__lark-mcp__task.v2.task.complete
path:
task_guid: "xxx"
useUAT: true
Uncomplete a Task
Tool: mcp__lark-mcp__task.v2.task.uncomplete
path:
task_guid: "xxx"
useUAT: true
Delete a Task
Tool: mcp__lark-mcp__task.v2.task.delete
path:
task_guid: "xxx"
useUAT: true
Add a Task Comment
Tool: mcp__lark-mcp__task.v2.taskComment.create
path:
task_guid: "xxx"
data:
content: "Progress update: 80% complete"
reply_to_comment_id: "" # optional
useUAT: true
List Task Comments
Tool: mcp__lark-mcp__task.v2.taskComment.list
path:
task_guid: "xxx"
params:
page_size: 20
useUAT: true
List Task Lists
Tool: mcp__lark-mcp__task.v2.tasklist.list
params:
user_id_type: "open_id"
page_size: 20
useUAT: true
Create a Task List
Tool: mcp__lark-mcp__task.v2.tasklist.create
data:
name: "Sprint 12"
members:
- id: "ou_xxx"
type: "user"
role: "editor"
useUAT: true
Add Task to a Task List
Tool: mcp__lark-mcp__task.v2.task.addTasklist
path:
task_guid: "xxx"
data:
tasklist_guid: "tsklistXXX"
section_guid: "" # optional: specific section
useUAT: true
8. Contacts (Users & Departments)
Get User by Open ID
Tool: mcp__lark-mcp__contact.v3.user.get
path:
user_id: "ou_xxx"
params:
user_id_type: "open_id"
useUAT: true
Batch Get Users by Email or Phone
Tool: mcp__lark-mcp__contact.v3.user.batchGetId
params:
user_id_type: "open_id"
data:
emails: ["user@company.com"]
mobiles: ["+8613800000000"]
useUAT: true
Search Users
Tool: mcp__lark-mcp__contact.v3.user.findByDepartment
params:
user_id_type: "open_id"
department_id_type: "open_department_id"
department_id: "od_xxx"
page_size: 50
useUAT: true
Get Current User Info
Tool: mcp__lark-mcp__authen.v1.userInfo.get
useUAT: true
List Departments
Tool: mcp__lark-mcp__contact.v3.department.children
params:
department_id_type: "open_department_id"
parent_department_id: "0" # "0" = root
page_size: 50
fetch_child: false
useUAT: true
Get Department Info
Tool: mcp__lark-mcp__contact.v3.department.get
path:
department_id: "od_xxx"
params:
department_id_type: "open_department_id"
user_id_type: "open_id"
useUAT: true
9. Wiki / Knowledge Base
List Wiki Spaces
Tool: mcp__lark-mcp__wiki.v2.space.list
params:
page_size: 20
useUAT: true
Get Wiki Space Info
Tool: mcp__lark-mcp__wiki.v2.space.get
path:
space_id: "xxx"
useUAT: true
List Wiki Nodes
Tool: mcp__lark-mcp__wiki.v2.spaceNode.list
path:
space_id: "xxx"
params:
parent_node_token: "" # empty = root level
page_size: 50
useUAT: true
Search Wiki
Tool: mcp__lark-mcp__wiki.v2.spaceNode.search
path:
space_id: "xxx"
params:
keyword: "onboarding guide"
page_size: 20
useUAT: true
Get Wiki Node Info
Tool: mcp__lark-mcp__wiki.v2.spaceNode.get
params:
token: "wikcXXX"
useUAT: true
Create a Wiki Node (new page)
Tool: mcp__lark-mcp__wiki.v2.spaceNode.create
path:
space_id: "xxx"
data:
node_type: "origin" # origin = new doc; copy = copy existing
parent_node_token: "wikcXXX" # parent page token
title: "New Page Title"
useUAT: true
Move a Wiki Node
Tool: mcp__lark-mcp__wiki.v2.spaceNode.move
path:
space_id: "xxx"
node_token: "wikcXXX"
data:
target_parent_token: "wikcYYY"
target_space_id: "" # empty = same space
useUAT: true
10. Approval Workflows
Get Approval Definition
Tool: mcp__lark-mcp__approval.v4.approval.get
path:
approval_code: "xxx"
params:
locale: "zh-CN" # zh-CN | en-US | ja-JP
Create an Approval Instance (submit for approval)
Tool: mcp__lark-mcp__approval.v4.instance.create
data:
approval_code: "xxx"
open_id: "ou_xxx" # submitter
form: '[{"id":"widget1","type":"input","value":"Expense claim for $500"}]'
node_approver_open_id_list: [] # optional: specify approvers per node
useUAT: true
Get an Approval Instance
Tool: mcp__lark-mcp__approval.v4.instance.get
path:
instance_id: "xxx"
params:
locale: "zh-CN"
user_id: "ou_xxx"
user_id_type: "open_id"
useUAT: true
List Approval Instances
Tool: mcp__lark-mcp__approval.v4.instance.list
params:
approval_code: "xxx"
start_time: "1700000000000"
end_time: "1702600000000"
page_size: 100
Approve an Instance
Tool: mcp__lark-mcp__approval.v4.instance.approve
data:
approval_code: "xxx"
instance_code: "xxx"
user_id: "ou_xxx"
task_id: "xxx"
comment: "Looks good, approved!"
useUAT: true
Reject an Instance
Tool: mcp__lark-mcp__approval.v4.instance.reject
data:
approval_code: "xxx"
instance_code: "xxx"
user_id: "ou_xxx"
task_id: "xxx"
comment: "Please revise the budget figures"
useUAT: true
Cancel an Approval Instance
Tool: mcp__lark-mcp__approval.v4.instance.cancel
data:
approval_code: "xxx"
instance_code: "xxx"
user_id: "ou_xxx"
useUAT: true
Add a Comment to an Approval Instance
Tool: mcp__lark-mcp__approval.v4.instanceComment.create
path:
instance_id: "xxx"
data:
content: "Please check the attached receipts"
at_info_list:
- user_id: "ou_xxx"
name: "John"
offset: "14"
useUAT: true
11. Common Workflows
Workflow: Find User and Send DM
1. mcp__lark-mcp__contact.v3.user.batchGetId
→ emails: ["user@company.com"] → get open_id
2. mcp__lark-mcp__im.v1.message.create
→ receive_id_type: "open_id"
→ receive_id: <open_id from step 1>
→ send the message
Workflow: Create Bitable Table and Populate from Data
1. mcp__lark-mcp__bitable.v1.app.create → get app_token
2. mcp__lark-mcp__bitable.v1.appTable.create → define schema → get table_id
3. mcp__lark-mcp__bitable.v1.appTableRecord.batchCreate → insert records (up to 500 per call)
Workflow: Weekly Report to Group
1. mcp__lark-mcp__bitable.v1.appTableRecord.search
→ filter: Status = "Done", Due Date in last 7 days
→ collect completed items
2. Format into rich-text post or interactive card
3. mcp__lark-mcp__im.v1.message.create
→ msg_type: "post" or "interactive"
→ send to project group chat_id
Workflow: Schedule a Meeting with Free/Busy Check
1. mcp__lark-mcp__calendar.v4.freebusy.list
→ check availability of all attendees in target window
2. Pick a free slot
3. mcp__lark-mcp__calendar.v4.calendarEvent.create
→ add all attendees, set reminders
4. mcp__lark-mcp__im.v1.message.create
→ notify attendees with meeting details
Workflow: Submit and Track Approval
1. mcp__lark-mcp__approval.v4.approval.get → inspect form fields
2. mcp__lark-mcp__approval.v4.instance.create
→ fill form data, submit
3. mcp__lark-mcp__approval.v4.instance.get
→ poll for status: PENDING | APPROVED | REJECTED | CANCELED
Workflow: Create Task and Assign
1. mcp__lark-mcp__contact.v3.user.batchGetId → resolve assignee email → open_id
2. mcp__lark-mcp__task.v2.task.create
→ summary, description, due date, members with role "assignee"
3. Optionally: mcp__lark-mcp__im.v1.message.create
→ notify assignee via DM
12. Error Reference
| Error Code | Meaning | Fix |
|---|---|---|
99991663 |
Token expired | Re-login or refresh token |
99991664 |
Invalid token | Check app credentials |
99991400 |
Permission denied | Grant required scopes in developer console |
230001 |
Bot not in chat | Add bot to the group first |
1254502 |
Record not found | Verify record_id is correct |
1254520 |
Field not found | Check field_name spelling exactly |
1300006 |
Event not found | Verify event_id and calendar_id |
1100003 |
Meeting not found | Meeting may have ended or reserve_id is wrong |
1100007 |
Meeting not active | Use reserve.get to check status first |
1100032 |
Not meeting host | Only host can perform this action |
1700001 |
Minutes not found | Check minute_token format (obcn...) |
1700002 |
Minutes not ready | Transcription still processing, retry later |
Common Issues
- "Tool not found": MCP server not running. Start with
npx -y @larksuiteoapi/lark-mcp mcp -a <APP_ID> -s <APP_SECRET> - Resources inaccessible: Use
useUAT: true— resources created by bot identity may not be visible to users - Permission error: In Feishu Open Platform console, enable the required permissions scopes (e.g.
bitable:app,im:message,calendar:calendar,task:task:write) - message_id not found: Messages expire or may require
im:message:send_as_botscope - user_access_token expired: Run
npx -y @larksuiteoapi/lark-mcp loginto refresh (valid 2h, refreshable with offline_access scope)
13. Video Conferencing (vc.v1)
Note: Video Conferencing APIs require the
vc:meetingscope family and generally needuseUAT: true(user identity). Enable via-t vc.v1.*in lark-mcp or add individually.
Schedule / Reserve a Meeting
Tool: mcp__lark-mcp__vc.v1.reserve.apply
data:
end_time: "1700003600" # Unix timestamp seconds
meeting_settings:
topic: "Q4 Planning Meeting"
action_permissions:
- permission: 1 # 1=invite members 2=share screen 3=record
permission_checker_type: 1 # 1=host only 2=everyone
meeting_initial_type: 1 # 1=video 2=audio
auto_record: false
enable_waiting_room: false
allow_screen_sharing: true
only_employee_join: false
join_meeting_permission: 1 # 1=any Feishu user 2=only invited 3=only org members
push_question_to_vc: false
meeting_reminder: true
useUAT: true
Returns: reserve_id, reserve_token — save these to manage the reservation.
Update a Meeting Reservation
Tool: mcp__lark-mcp__vc.v1.reserve.update
path:
reserve_id: "xxx"
data:
end_time: "1700007200"
meeting_settings:
topic: "Updated Meeting Title"
useUAT: true
Delete / Cancel a Reservation
Tool: mcp__lark-mcp__vc.v1.reserve.delete
path:
reserve_id: "xxx"
useUAT: true
Get Reservation Details
Tool: mcp__lark-mcp__vc.v1.reserve.get
path:
reserve_id: "xxx"
params:
with_meeting_info: true # also return active meeting info
useUAT: true
Get Active Meeting from a Reservation
Tool: mcp__lark-mcp__vc.v1.reserve.getActiveMeeting
path:
reserve_id: "xxx"
params:
with_participants: true
useUAT: true
Get Meeting Details (by meeting_id)
Tool: mcp__lark-mcp__vc.v1.meeting.get
path:
meeting_id: "xxx"
params:
with_participants: true
with_meeting_ability: true
useUAT: true
List Meetings by No (meeting number)
Tool: mcp__lark-mcp__vc.v1.meeting.listByNo
params:
meeting_no: "123456789" # 9-digit meeting number shown in UI
start_time: "1700000000"
end_time: "1700100000"
page_size: 20
useUAT: true
Invite Participants to a Meeting
Tool: mcp__lark-mcp__vc.v1.meeting.invite
path:
meeting_id: "xxx"
data:
invitees:
- id: "ou_xxx"
type: 1 # 1=Feishu user, 2=room, 3=phone, 5=SIP/H323
useUAT: true
Kick a Participant from a Meeting
Tool: mcp__lark-mcp__vc.v1.meeting.kickout
path:
meeting_id: "xxx"
data:
kickout_users:
- id: "ou_xxx"
type: 1
useUAT: true
Set Host of a Meeting
Tool: mcp__lark-mcp__vc.v1.meeting.setHost
path:
meeting_id: "xxx"
data:
host_user:
id: "ou_xxx"
type: 1
old_host_user:
id: "ou_yyy"
type: 1
useUAT: true
End a Meeting
Tool: mcp__lark-mcp__vc.v1.meeting.end
path:
meeting_id: "xxx"
useUAT: true
List Meeting Participants
Tool: mcp__lark-mcp__vc.v1.participant.list
params:
meeting_id: "xxx"
meeting_start_time: "1700000000"
meeting_end_time: "1700003600"
page_size: 100
useUAT: true
Get Meeting Recording
Tool: mcp__lark-mcp__vc.v1.meetingRecording.get
path:
meeting_id: "xxx"
useUAT: true
Returns: recording file URL, duration, size.
Set Recording Permissions
Tool: mcp__lark-mcp__vc.v1.meetingRecording.setPermission
path:
meeting_id: "xxx"
data:
permission_objects:
- id: "ou_xxx"
type: 1 # 1=user, 2=department
permission: 1 # 1=view
action_type: 1 # 1=set 2=add 3=remove
useUAT: true
Export Meeting Attendance Report
Tool: mcp__lark-mcp__vc.v1.export.meetingList
data:
start_time: "1700000000"
end_time: "1700100000"
meeting_status: 3 # 1=not started, 2=in progress, 3=ended
page_size: 100
useUAT: true
Export Participant Quality Report
Tool: mcp__lark-mcp__vc.v1.export.participantList
data:
meeting_start_time: "1700000000"
meeting_end_time: "1700003600"
meeting_no: "123456789"
page_size: 100
useUAT: true
Get Room (Conference Room) Info
Tool: mcp__lark-mcp__vc.v1.room.get
path:
room_id: "xxx"
params:
user_id_type: "open_id"
List Rooms
Tool: mcp__lark-mcp__vc.v1.room.list
params:
page_size: 20
room_level_id: "" # optional: filter by building/floor
14. Meeting Minutes (minutes.v1)
Feishu Minutes (妙记) is the AI-powered meeting transcription and notes product. Note: Minutes APIs require
minutes:minute:readonlyscope. Currently read-only via API (no write endpoints). Minutes are auto-generated from video conference recordings or uploaded audio/video files.
Get Minutes Metadata
Tool: mcp__lark-mcp__minutes.v1.minute.get
path:
minute_token: "obcnXXXXXX" # token from the Minutes URL: feishu.cn/minutes/obcnXXX
params:
user_id_type: "open_id"
useUAT: true
Returns: title, duration, owner, creation time, video status, transcription status.
Get Minutes Transcript (full text)
Tool: mcp__lark-mcp__minutes.v1.minuteTranscript.get
path:
minute_token: "obcnXXXXXX"
params:
user_id_type: "open_id"
useUAT: true
Returns: array of transcript segments, each with:
start_time/end_time(milliseconds)paragraph— spoken text contentspeaker_id,speaker_name— who said it
List Statistics / Participants in Minutes
Tool: mcp__lark-mcp__minutes.v1.minuteStatistic.get
path:
minute_token: "obcnXXXXXX"
params:
user_id_type: "open_id"
useUAT: true
Returns: list of participants with speaking time and word counts.
Get Minutes Audio/Video File (metadata only)
Tool: mcp__lark-mcp__minutes.v1.minuteMedia.get
path:
minute_token: "obcnXXXXXX"
params:
type: 1 # 1=video file 2=audio file
useUAT: true
Returns: download URL for the original recording.
⚠️ File download/upload is not supported by lark-mcp directly. Use the URL to stream/access externally.
How to Get a minute_token
Minutes tokens can be found:
- From the meeting recording — the Minutes URL shown after a meeting ends
- From the calendar event after the meeting (included in event details)
- Format:
obcnfollowed by alphanumeric characters (e.g.obcn6qGKMiZy0eNFSKl6e8XXXXX)
Workflow: Post Meeting Summary to Group
1. mcp__lark-mcp__minutes.v1.minuteTranscript.get
→ get all transcript segments
2. Summarize transcript with LLM (handled by OpenClaw automatically)
3. mcp__lark-mcp__minutes.v1.minuteStatistic.get
→ get participant list and speaking stats
4. mcp__lark-mcp__im.v1.message.create
→ send summary + participant stats as rich card to the meeting group chat
15. Enhanced Group Chat Workflows
This section covers advanced group chat scenarios beyond basic CRUD.
Find a Group by Name
1. mcp__lark-mcp__im.v1.chat.list → fetch all chats (paginate as needed)
2. Filter by name field client-side
OR
mcp__lark-mcp__im.v1.chat.search → params: query: "group name"
Send an @mention Message
# Tool: mcp__lark-mcp__im.v1.message.create
data:
receive_id: "oc_xxx"
msg_type: "text"
content: '{"text":"<at user_id=\"ou_xxx\">John</at> please review this"}'
# For @all:
# content: '{"text":"<at user_id=\"all\">All</at> meeting in 5 minutes"}'
useUAT: true
Send an Interactive Card to a Group
# Tool: mcp__lark-mcp__im.v1.message.create
data:
receive_id: "oc_xxx"
msg_type: "interactive"
content: |
{
"config": {"wide_screen_mode": true},
"header": {
"title": {"tag": "plain_text", "content": "Action Required"},
"template": "red"
},
"elements": [
{
"tag": "div",
"text": {"tag": "lark_md", "content": "**Task**: Please approve the Q4 budget\n**Deadline**: Tomorrow 5pm"}
},
{
"tag": "action",
"actions": [
{"tag": "button", "text": {"tag": "plain_text", "content": "Approve"}, "type": "primary", "value": {"action": "approve"}},
{"tag": "button", "text": {"tag": "plain_text", "content": "Reject"}, "type": "danger", "value": {"action": "reject"}}
]
}
]
}
useUAT: true
Create a Dedicated Project Group with Bot and Members
1. mcp__lark-mcp__contact.v3.user.batchGetId
→ resolve member emails → open_ids
2. mcp__lark-mcp__im.v1.chat.create
→ name: "Project X - Team"
→ user_id_list: [all open_ids]
→ chat_type: "private"
3. mcp__lark-mcp__im.v1.message.create
→ send a welcome card message introducing the project
Set a Group-Wide Announcement
1. mcp__lark-mcp__im.v1.chatAnnouncement.patch
→ insert new announcement text block at document tail
→ all members see the pinned announcement at top of chat
Monitor Group Messages (Event-driven)
Register the
im.message.receive_v1event in Feishu Open Platform to receive all messages sent in groups where the bot is present. OpenClaw's Feishu channel handles this automatically when configured — no polling needed.
Event payload includes: message_id, chat_id, sender.open_id, message.content, message.msg_type
Batch Notify Multiple Groups
1. Prepare list of chat_ids (from mcp__lark-mcp__im.v1.chat.list)
2. Loop: for each chat_id call mcp__lark-mcp__im.v1.message.create
→ throttle to avoid rate limits: ~5 req/sec recommended
Thread / Reply to Specific Message in Group
# Tool: mcp__lark-mcp__im.v1.message.reply
path:
message_id: "om_xxx" # the specific message to reply to
data:
content: '{"text":"Thanks for the update!"}'
msg_type: "text"
reply_in_thread: true # creates or continues a message thread
useUAT: true
Forward a Message to Another Chat
# Tool: mcp__lark-mcp__im.v1.message.forward
path:
message_id: "om_xxx"
params:
receive_id_type: "chat_id"
data:
receive_id: "oc_yyy"
useUAT: true
Merge Forward Multiple Messages
# Tool: mcp__lark-mcp__im.v1.message.mergeForward
params:
receive_id_type: "chat_id"
data:
receive_id: "oc_yyy"
message_id_list: ["om_xxx", "om_yyy", "om_zzz"]
useUAT: true
Get Unread Messages for a User
# Tool: mcp__lark-mcp__im.v1.message.list
params:
container_id_type: "chat"
container_id: "oc_xxx"
sort_type: "ByCreateTimeDesc"
page_size: 50
useUAT: true
# Then filter client-side for messages after last-read timestamp
Transfer Group Ownership
# Tool: mcp__lark-mcp__im.v1.chat.update
path:
chat_id: "oc_xxx"
data:
owner_id: "ou_new_owner"
useUAT: true
Workflow: Post Meeting Notes to Group After VC
1. [Meeting ends] → get minute_token from calendar event or meeting recording
2. mcp__lark-mcp__minutes.v1.minuteTranscript.get
→ retrieve full transcript
3. Summarize with AI → key decisions, action items, owners
4. mcp__lark-mcp__im.v1.message.create
→ msg_type: "interactive"
→ send structured card to the meeting group with:
- Meeting summary
- Action items (bullet list)
- Recording link
- Participants
5. mcp__lark-mcp__task.v2.task.create (repeat for each action item)
→ assign to relevant team members
→ link due dates from discussion
16. Required App Permissions Reference
| Feature | Required Scopes |
|---|---|
| Send messages | im:message |
| Read messages | im:message:readonly |
| Group management | im:chat, im:chat:write |
| Forward messages | im:message |
| Bitable (read) | bitable:app:readonly |
| Bitable (write) | bitable:app |
| Documents (read) | docs:doc:readonly |
| Documents (write) | docs:doc |
| Cloud Drive | drive:drive |
| Calendar (read) | calendar:calendar:readonly |
| Calendar (write) | calendar:calendar |
| Tasks | task:task:write |
| Contacts | contact:user.base:readonly |
| Wiki | wiki:wiki:readonly |
| Approvals | approval:approval:readonly, approval:instance |
| Video Conf (reserve/manage) | vc:meeting |
| Video Conf (participants) | vc:meeting:readonly |
| Video Conf (recording) | vc:record |
| Video Conf (rooms) | vc:room:readonly |
| Video Conf (export reports) | vc:export |
| Minutes (read transcript) | minutes:minute:readonly |