lark-im
larksuite/cli
Lark/Feishu IM skill: send messages, manage group chats, download files, and handle interactive cards via lark-cli
What is lark-im?
lark-im is an installable skill for coding agents (Claude Code, Cursor, etc.) that exposes Lark/Feishu instant messaging capabilities through the lark-cli tool. It covers sending and replying to messages, searching chat history, managing group chat members, uploading/downloading images and files (including large-file chunked downloads), managing emoji reactions, sending urgent notifications (in-app/SMS/call), creating and handling interactive cards with button callbacks, managing bookmarks (flags), feed shortcuts, and feed group tags. Both user identity (user_access_token) and bot identity (tenant_access_token) are supported, with different permission implications for each.
- Send, reply to, and search messages in group chats and P2P conversations
- List, create, search, and update group chats and topic chats
- Upload and download images, files, audio, and video (with large-file chunked download support)
- Manage emoji reactions, message bookmarks (flags), and feed sidebar shortcuts
- Send interactive cards and listen for card button action callbacks (card.action.trigger)
- Send urgent notifications via in-app alert, SMS, or phone call
How to install lark-im
npx skills add null --skill lark-im- lark-cli must be installed and available in PATH
- Lark app credentials configured (see lark-shared SKILL.md for auth setup)
- Appropriate Lark app scopes granted (e.g. im:message, im:chat, im:message.reactions:read)
- For user-identity operations: a valid user_access_token must be available
- For bot-identity operations: a valid tenant_access_token and bot membership in target chats
How to use lark-im
- 1.Install the skill: npx skills add null --skill lark-im
- 2.Read the lark-shared SKILL.md first for authentication and permission setup (required before use)
- 3.Run lark-cli im --help to see all available commands and shortcuts
- 4.Use lark-cli im +chat-messages-list --chat-id <oc_xxx> to list messages in a chat
- 5.Use lark-cli im +chat-create to create a group or topic chat with specified members
- 6.Use lark-cli im +chat-search --query <name> to find a chat_id by group name
- 7.Add --as user or --as bot to control which identity (user vs. bot) makes the API call
- 8.Use --download-resources on listing commands to auto-download message attachments to ./lark-im-resources/
Use cases
- Automating Lark message sending or replies from a coding agent workflow
- Searching or retrieving chat history and downloading attached files programmatically
- Creating group chats or topic chats and managing their members via script
- Building interactive card flows with button callbacks handled by the agent
- Managing feed shortcuts and tag groups in a user's Lark sidebar
- Developers building automation on top of Lark/Feishu IM APIs
- Teams using Claude Code or Cursor who want agents to send Lark notifications
- Engineers integrating Lark messaging into CI/CD or workflow pipelines
- Bot developers handling interactive card callbacks in Lark apps
- Lark app developers needing file upload/download automation
lark-im FAQ
--as user uses user_access_token and acts as the authorized end user; --as bot uses tenant_access_token and acts as the app bot. Permissions, chat membership checks, and contact visibility differ between the two identities.
The bot's app visibility settings may not include the message sender, so the contact API returns no display name. Expand the app's visible range in the Lark Developer Console, or use --as user instead.
Yes. The four message-listing shortcuts (+messages-mget, +chat-messages-list, +messages-search, +threads-messages-list) automatically attach a reactions block to each message. Pass --no-reactions to opt out.
No. Resource downloads are opt-in. Pass --download-resources to the listing commands to download eligible attachments into ./lark-im-resources/. Stickers are excluded.
Only Opus audio files (.opus or Ogg Opus .ogg) are supported with --audio. For mp3, wav, or other formats, convert to .opus first or send the file as an attachment using --file.
Full instructions (SKILL.md)
Source of truth, from larksuite/cli.
name: lark-im version: 1.0.0 description: "飞书即时通讯:收发消息和管理群聊。发送和回复消息、搜索聊天记录、管理群聊成员、上传下载图片和文件(支持大文件分片下载)、管理表情回复、发送应用内/短信/电话加急、发送和处理交互卡片(Interactive Card)、监听卡片按钮回调(card.action.trigger)。当用户需要发消息、查看或搜索聊天记录、下载聊天中的文件、查看群成员、搜索群、创建群聊或话题群、管理标记数据、管理 Feed 置顶(添加/移除/查询置顶会话)、管理标签数据、处理卡片回调时使用。" metadata: requires: bins: ["lark-cli"] cliHelp: "lark-cli im --help"
im (v1)
CRITICAL — 开始前 MUST 先用 Read 工具读取 ../lark-shared/SKILL.md,其中包含认证、权限处理
Core Concepts
- Message: A single message in a chat, identified by
message_id(om_xxx). Supports types: text, post, image, file, audio, video, sticker, interactive (card), share_chat, share_user, merge_forward, etc. - Chat: A group chat or P2P conversation, identified by
chat_id(oc_xxx). - Thread: A reply thread under a message, identified by
thread_id(om_xxx or omt_xxx). - Reaction: An emoji reaction on a message.
- Flag: A bookmark on a message or thread.
- Feed Shortcut: A chat pinned to the current user's feed sidebar, identified by
feed_card_id(anoc_xxxopen_chat_id for CHAT type). - Feed Group: A tag that groups feed cards in the feed list, identified by
feed_group_id(ofg_xxx). Members are feed cards, each identified byfeed_id+feed_type. Two types:normal(members managed explicitly) andrule(members auto-derived from rules).
Resource Relationships
Chat (oc_xxx)
├── Message (om_xxx)
│ ├── Thread (reply thread)
│ ├── Reaction (emoji)
│ └── Resource (image / file / video / audio)
└── Member (user / bot)
Important Notes
Identity and Token Mapping
--as usermeans user identity and usesuser_access_token. Calls run as the authorized end user, so permissions depend on both the app scopes and that user's own access to the target chat/message/resource.--as botmeans bot identity and usestenant_access_token. Calls run as the app bot, so behavior depends on the bot's membership, app visibility, availability range, and bot-specific scopes.- If an IM API says it supports both
userandbot, the token type changes who the operator is. The same API can succeed with one identity and fail with the other because owner/admin status, chat membership, tenant boundary, or app availability are checked against the current caller.
Sender Name Resolution with Bot Identity
When using bot identity (--as bot) to fetch messages (e.g. +chat-messages-list, +threads-messages-list, +messages-mget), sender names may not be resolved (shown as open_id instead of display name). This happens when the bot cannot access the user's contact info.
Root cause: The bot's app visibility settings do not include the message sender, so the contact API returns no name.
Solution: Check the app's visibility settings in the Lark Developer Console — ensure the app's visible range covers the users whose names need to be resolved. Alternatively, use --as user to fetch messages with user identity, which typically has broader contact access.
Default message enrichment (reactions / update_time)
The four message-pulling shortcuts (+messages-mget, +chat-messages-list, +messages-search, +threads-messages-list) automatically attach a reactions block and (for edited messages) update_time to each returned message — no separate im.reactions.batch_query call is needed. Pass --no-reactions to opt out. For the full contract (output shape, the im:message.reactions:read scope requirement, and the "missing field ≠ fetch failure" data rules), read references/lark-im-message-enrichment.md.
Opt-in resource auto-download (--download-resources)
+chat-messages-list, +messages-mget, and +threads-messages-list accept --download-resources (off by default — no resources block and no extra requests when omitted). When set, eligible message resources (image/file/audio/video/media + post-embedded; stickers excluded) are downloaded into ./lark-im-resources/ and each message gains a resources array of {message_id, key, type, local_path, size_bytes}. Downloads are deduped by (message_id, file_key), run with bounded concurrency, and isolate single-resource failures (error: true + stderr warning). Scope: requires im:message:readonly (already declared by the listing commands — no extra scope); works under both user and bot identity. For one-off downloads use +messages-resources-download. Full contract: references/lark-im-message-enrichment.md.
Card Messages (Interactive)
Card messages (interactive type) are not yet supported for compact conversion in event subscriptions. The raw event data will be returned instead, with a hint printed to stderr.
interactive cards support callback events (card.action.trigger) — see references/lark-im-card-action-reply.md.
Audio Messages
--audio sends a voice message and supports only Opus audio files, for example .opus files or Ogg Opus (.ogg) files. For mp3, wav, or other non-Opus audio, either convert to .opus first and keep using --audio, or send the original file as an attachment with --file.
Sending Doc Content as a Message
When sending content fetched from a Lark doc as a message, fetch the doc with --doc-format im-markdown, then send it as a message using the --markdown format. The fetched content is already in markdown; in any content-forwarding scenario, keep the fetched original text and send it in the --markdown format. Note: if the doc contains a cite tag with type="user", keep it as-is and do not strip the tag.
Flag Types
Flags support two layers:
- Message-layer flag:
(ItemTypeDefault, FlagTypeMessage)— regular message bookmark - Feed-layer flag:
(ItemTypeThread/ItemTypeMsgThread, FlagTypeFeed)— thread as feed-layer bookmark
Item types for feed-layer flags:
- ItemTypeThread (4) = thread in a topic-style chat
- ItemTypeMsgThread (11) = thread in a regular chat
Feed Shortcut
Feed shortcuts add chats to the current user's feed sidebar. They are distinct from flags:
- Flag = bookmark on a message/thread, scoped to the user's bookmark list.
- Feed shortcut = entry in the user's feed sidebar (currently only chats).
Key limits:
- Only CHAT-type (
feed_card_idisoc_xxx) is exposed via OpenAPI; doc/app/subscription shortcuts exist internally but are not yet whitelisted. - All three operations (create/remove/list) are user-identity only — they sign with
user_access_token. - Batch size is 10 per call for create/remove; list is a one-page wrapper with opaque
page_tokenpagination.
Shortcuts(推荐优先使用)
Shortcut 是对常用操作的高级封装(lark-cli im +<verb> [flags])。有 Shortcut 的操作优先使用。
| Shortcut | 说明 |
|---|---|
+chat-create | Create a group chat or topic chat; user/bot; --chat-mode group |
+chat-list | List chats the current user/bot is a member of; defaults to groups; pass --types=p2p,group to include p2p single chats (user-only); user/bot; supports sorting, pagination, --exclude-muted (user-only) |
+chat-messages-list | List messages in a chat or P2P conversation; user/bot; accepts --chat-id or --user-id, resolves P2P chat_id, supports time range/sort/pagination |
+chat-search | Search visible group chats by --query keyword and/or --member-ids; user/bot; e.g. look up chat_id by group name; supports type filters, sorting, pagination, and --exclude-muted (user identity only) |
+chat-update | Update group chat name or description; user/bot; updates a chat's name or description |
+messages-mget | Batch get messages by IDs; user/bot; fetches up to 50 om_ message IDs, formats sender names, expands thread replies |
+messages-reply | Reply to a message (supports thread replies); user/bot; supports text/markdown/post/media replies, reply-in-thread, idempotency key |
+messages-resources-download | Download images/files from a message; user/bot; supports automatic chunked download for large files (8MB chunks), auto-detects file extension from Content-Type |
+messages-search | Search messages across chats (supports keyword, sender, time range filters) with user identity; user-only; filters by chat/sender/attachment/time, supports auto-pagination via --page-all / --page-limit, enriches results via batched mget and chats batch_query |
+messages-send | Send a message to a chat or direct message; user/bot; sends to chat-id or user-id with text/markdown/post/media, supports idempotency key |
+threads-messages-list | List messages in a thread; user/bot; accepts om_/omt_ input, resolves message IDs to thread_id, supports sort/pagination |
+flag-create | Create a bookmark on a message; user-only; defaults to message-layer flag; use --flag-type feed for feed-layer flag (item_type auto-detected from chat mode) |
+flag-cancel | Cancel (remove) a bookmark. When no --flag-type is given, best-effort double-cancel: removes message layer and (when chat_type is determinable) feed layer |
+flag-list | List bookmarks; user-only; auto-enriches feed-type thread entries with message content; supports --page-all auto-pagination |
+feed-shortcut-create | Add chats to the user's feed shortcuts; user-only; oc_xxx chat IDs only; batch up to 10 per call; --head/--tail controls insertion order; partial failures return an ok:false ledger |
+feed-shortcut-remove | Remove chats from the user's feed shortcuts; user-only; batch up to 10 per call; removing an absent shortcut is idempotent success; real per-item failures return an ok:false ledger |
+feed-shortcut-list | List one page of the user's feed shortcuts; user-only; omit --page-token for the first page; default output enriches CHAT entries under detail; pass --no-detail to skip the extra lookup and im:chat:read scope |
+feed-group-list | List the caller's feed groups (tags); user-only; supports --page-all auto-pagination |
+feed-group-list-item | List feed cards in a feed group (tag); user-only; enriches each item with chat_name resolved from feed_id; supports --page-all auto-pagination |
+feed-group-query-item | Look up specific feed cards in a feed group (tag) by ID; user-only; enriches each item with chat_name resolved from feed_id |
API Resources
lark-cli schema im.<resource>.<method> # 调用 API 前必须先查看参数结构
lark-cli im <resource> <method> [flags] # 调用 API
重要:使用原生 API 时,必须先运行
schema查看--data/--params参数结构,不要猜测字段格式。
chats
create— 创建群。Identity:botonly (tenant_access_token).get— 获取群信息。Identity: supportsuserandbot; the caller must be in the target chat to get full details, and must belong to the same tenant for internal chats.link— 获取群分享链接。Identity: supportsuserandbot; the caller must be in the target chat, must be an owner or admin when chat sharing is restricted to owners/admins, and must belong to the same tenant for internal chats.update— 更新群信息。Identity: supportsuserandbot.
chat.members
bots— 获取群内机器人列表。Identity: supportsuserandbot; the caller must be in the target chat and must belong to the same tenant for internal chats.create— 将用户或机器人拉入群聊。Identity: supportsuserandbot; the caller must be in the target chat; forbotcalls, added users must be within the app's availability; for internal chats the operator must belong to the same tenant; if only owners/admins can add members, the caller must be an owner/admin, or a chat-creator bot withim:chat:operate_as_owner.delete— 将用户或机器人移出群聊。Identity: supportsuserandbot; only group owner, admin, or creator bot can remove others; max 50 users or 5 bots per request.get— 获取群成员列表。Identity: supportsuserandbot; the caller must be in the target chat and must belong to the same tenant for internal chats.
chat.user_setting
batch_query— 批量查询当前用户在群内的个人偏好设置 (e.g.is_mutedmutes normal messages,is_mute_at_allmutes @all messages); up to 10 chats per request. Identity:useronly (user_access_token); the caller must be in each target chat.batch_update— 批量更新当前用户在群内的个人偏好设置 (e.g.is_mutedmutes normal messages,is_mute_at_allmutes @all messages); up to 10 chats per request. Identity:useronly (user_access_token); the caller must be in each target chat.
chat.nickname
get— 获取自己的群昵称。Get your own nickname in the chat (self-only). Identity:useronly (user_access_token); returns an empty string when no nickname is set.update— 设置自己的群昵称。Set or update your own nickname in the chat (self-only). Identity:useronly (user_access_token);nicknamemust be a non-empty string (max 300 bytes). Use DELETE to clear it.delete— 清空自己的群昵称。Clear your own nickname in the chat (self-only). Identity:useronly (user_access_token).
chat.managers
add_managers— 指定群管理员。Identity: supportsuserandbot; only the group owner can add managers; max 10 managers per chat (20 for super-large chats), and at most 5 bots per request.delete_managers— 删除群管理员。Identity: supportsuserandbot; only the group owner can remove managers; max 50 users or 5 bots per request.
chat.moderation
get— 获取群成员发言权限。Identity: supportsuserandbot; the caller must be in the target chat and belong to the same tenant.update— 更新群发言权限。Identity: supportsuserandbot; only the group owner (or creator bot withim:chat:operate_as_owner) can update; the caller must be in the chat.
messages
delete— 撤回消息。Identity: supportsuserandbot; forbotcalls, the bot must be in the chat to revoke group messages; to revoke another user's group message, the bot must be the owner, an admin, or the creator; for user P2P recalls, the target user must be within the bot's availability.forward— 转发消息。Identity: supportsuserandbot.merge_forward— 合并转发消息。Identity:botonly (tenant_access_token).read_users— 查询消息已读信息。Identity:botonly (tenant_access_token); the bot must be in the chat, and can only query read status for messages it sent within the last 7 days.urgent_app— 发送应用内加急。Identity:botonly (tenant_access_token); the bot must be the message sender and must be in the conversation that contains the message.urgent_phone— 发送电话加急。Identity:botonly (tenant_access_token); the bot must be the message sender and must be in the conversation that contains the message.urgent_sms— 发送短信加急。Identity:botonly (tenant_access_token); the bot must be the message sender and must be in the conversation that contains the message.
reactions
batch_query— 批量获取消息表情。Identity: supportsuserandbot.Must-readcreate— 添加消息表情回复。Identity: supportsuserandbot; the caller must be in the conversation that contains the message.Must-readdelete— 删除消息表情回复。Identity: supportsuserandbot; the caller must be in the conversation that contains the message, and can only delete reactions added by itself.Must-readlist— 获取消息表情回复。Identity: supportsuserandbot; the caller must be in the conversation that contains the message.Must-read
threads
forward— 转发话题。Identity: supportsuserandbot.
images
create— 上传图片。Identity:botonly (tenant_access_token).
pins
create— Pin 消息。Identity: supportsuserandbot.delete— 移除 Pin 消息。Identity: supportsuserandbot.list— 获取群内 Pin 消息。Identity: supportsuserandbot.
feed.groups
batch_add_item— Batch add feed cards to a feed group. Identity:useronly (user_access_token).Must-readbatch_query— Batch query feed groups. Identity:useronly (user_access_token).Must-readbatch_remove_item— Batch remove feed cards from a feed group. Identity:useronly (user_access_token).Must-readcreate— Create a feed group. Identity:useronly (user_access_token).Must-readdelete— Delete a feed group. Identity:useronly (user_access_token).Must-readupdate— Update a feed group. Identity:useronly (user_access_token).Must-read
权限表
| 方法 | 所需 scope |
|---|---|
chats.create | im:chat:create |
chats.get | im:chat:read |
chats.link | im:chat:read |
chats.update | im:chat:update |
chat.members.bots | im:chat.members:read |
chat.members.create | im:chat.members:write_only |
chat.members.delete | im:chat.members:write_only |
chat.members.get | im:chat.members:read |
chat.user_setting.batch_query | im:chat.user_setting:read |
chat.user_setting.batch_update | im:chat.user_setting:write |
chat.managers.add_managers | im:chat.managers:write_only |
chat.managers.delete_managers | im:chat.managers:write_only |
chat.moderation.get | im:chat.moderation:read |
chat.moderation.update | im:chat:moderation:write_only |
messages.delete | im:message:recall |
messages.forward | im:message |
messages.merge_forward | im:message |
messages.read_users | im:message:readonly |
messages.urgent_app | im:message.urgent |
messages.urgent_phone | im:message.urgent:phone |
messages.urgent_sms | im:message.urgent:sms |
reactions.batch_query | im:message.reactions:read |
reactions.create | im:message.reactions:write_only |
reactions.delete | im:message.reactions:write_only |
reactions.list | im:message.reactions:read |
threads.forward | im:message |
images.create | im:resource |
pins.create | im:message.pins:write_only |
pins.delete | im:message.pins:write_only |
pins.list | im:message.pins:read |
feed.groups.batch_add_item | im:feed_group_v1:write |
feed.groups.batch_query | im:feed_group_v1:read |
feed.groups.batch_remove_item | im:feed_group_v1:write |
feed.groups.create | im:feed_group_v1:write |
feed.groups.delete | im:feed_group_v1:write |
feed.groups.update | im:feed_group_v1:write |
Related skills
More from larksuite/cli and the wider catalog.
lark-doc
飞书云文档(Docx / Wiki 文档):读取和编辑飞书文档内容。当用户给出文档 URL 或 token,或需要查看、创建、编辑文档、插入或下载文档图片附件时使用。文档中嵌入的电子表格、多维表格、画板,先用本 skill 提取 token 再切到对应 skill。当用户给出 doubao.com 的 /docx/ 或 /wiki/ URL/token 时,也应直接使用本 skill;路由依据是 URL 路径模式和 token,而不是域名。不负责文档评论管理,也不负责表格或 Base 的数据操作。
lark-base
飞书多维表格(Base)操作:建表、字段、记录、视图、统计、公式/lookup、表单、仪表盘、workflow、角色权限;遇到 Base/多维表格/bitable 或 /base/ 链接时使用。文件导入转 lark-drive,认证/授权转 lark-shared。
lark-drive
飞书云空间(云盘/云存储):管理 Drive 文件和文件夹,包含上传/下载、创建文件夹、复制/移动/删除、查看元数据、评论/权限/订阅、标题、版本和本地文件导入。用户需要整理云盘目录、处理云空间资源 URL/token,或导入 Word/Markdown/Excel/CSV/PPTX/.base 为 docx/sheet/bitable/slides 时使用;doubao.com 云空间 URL/token 也按资源路径和 token 路由,不回退 WebFetch。不负责:文档内容编辑(走 lark-doc)、表格/Base 表内数据操作(走 lark-sheets/lark-base)、知识空间节点/成员管理(走 lark-wiki)、原生 Markdown 文件读写/patch/diff(走 lark-markdown)。
lark-shared
Use for lark-cli setup/auth tasks: auth login/status/logout, user vs bot identity, business-domain permissions (--domain, including all/docs/drive), missing scopes, revoking authorization, or handling _notice JSON.
lark-calendar
飞书日历:管理日历日程和会议室。查看/搜索日程、创建/更新日程、管理参会人、查询忙闲和推荐时段、预定会议室。当用户需要查看日程安排、创建/修改会议、查询/预定会议室时使用。不负责:查询过去的视频会议记录(走 lark-vc)、待办任务(走 lark-task)。
lark-wiki
飞书知识库:管理知识空间、空间成员和文档节点。创建和查询知识空间、查看和管理空间成员、管理节点层级结构、在知识库中组织文档和快捷方式。当用户需要在知识库中查找或创建文档、浏览知识空间结构、查看或管理空间成员、移动或复制节点时使用。当用户给出 doubao.com 的 /wiki/ URL/token 时,也应直接使用本 skill,不要因为域名不是飞书而回退到 WebFetch;路由依据是 URL 路径模式和 token,而不是域名。不负责:上传文件到知识库节点下(走 lark-drive)、编辑文档/表格/Base 内容(走 lark-doc / lark-sheets / lark-base)。