Skip to content
Report library
Purpose / Data analysis

Lark Im Skill Security Audit

What the author says it does (original text)

飞书即时通讯:收发消息和管理群聊。发送和回复消息、搜索聊天记录、管理群聊成员、上传下载图片和文件、管理表情回复、发送应用内/短信/电话加急、发送和处理交互卡片(Interactive Card)、监听卡片按钮回调(card.action.trigger)。当用户需要发消息、查看或搜索聊天记录、下载聊天中的文件、查看群成员、搜索群、创建群聊或话题群、管理标记数据、管理 Feed 置顶(添加/移除/查询置顶会话)、管理标签数据、处理卡片回调时使用。

Independent security check

Do not install or run it yet

Files checked
61
Risks found
5
Could it run dangerous commands?Looks for programs run straight after downloading, remote control of your computer, and hidden commands.Risks found: 1
Medium risk

Remote Markdown images trigger automatic network downloads and re-upload to Feishu

Source references: 6
What we found

When sending or replying with Markdown, the CLI visits embedded HTTP/HTTPS image URLs and uploads the response to Feishu. If Markdown came from a forwarded document or untrusted message, approval to “send this content” can also authorize unnoticed outbound requests and file copying. The provided material does not describe private-address blocking or a domain allowlist.

Why this matters

The remote host learns request timing and the runtime's network address. If the runtime can reach an internal URL, returned content could also be copied into a Feishu message. Failed images are merely removed with a warning and may not be obvious to recipients.

When sending or replying with Markdown, the CLI downloads remote image URLs and uploads the result to Feishu, adding an outbound request and content copy. Although recipient, content, and identity require confirmation, the shown text does not separately confirm remote fetching or describe private-address blocking/domain allowlists. Users can require remote-image resolution to be disabled, URLs previewed, or only existing `img_xxx` keys accepted.

references/lark-im-messages-send.md:49In the instructionsOpen original file
The shortcut does all of the following before sending:1. Forces `msg_type=post`2. Resolves remote Markdown images like `![x](https://...)` by downloading and uploading them first3. Normalizes the Markdown for Feishu post rendering4. Wraps the result as:
Show 5 other places
references/lark-im-messages-send.md:76In the instructionsOpen original file
- Local paths in Markdown image syntax like `![x](./a.png)` are **not** supported and will not be auto-uploaded.- Remote URLs (`https://...`) will be auto-downloaded and uploaded at runtime; if the download or upload fails, the image is removed with a warning.
references/lark-im-messages-reply.md:171In the instructionsOpen original file
- Media flags accept an existing key (`img_xxx` / `file_xxx`), an `http://` or `https://` URL, or a local file path.- Local paths must be relative to the current working directory and stay within it after resolving `..` and symlinks.- Absolute paths such as `/tmp/photo.png` are rejected. Run the command from the file's directory and pass `./photo.png`, or copy the file into the current directory first.- `--audio` sends a voice message and accepts only Opus audio (`.opus` or Ogg Opus `.ogg`) for local paths and URLs. For `mp3`, `wav`, or other non-Opus audio, convert to `.opus` before using `--audio`, or use `--file` to send the original audio as an attachment.
SKILL.md:79In the instructionsOpen original file
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.
references/lark-im-messages-send.md:11In the instructionsOpen original file
Messages sent by this tool are visible to other people. Before calling it, you **must** confirm with the user:1. The recipient (which person or which group)2. The message content3. The sending identity (user or bot)**Do not** send messages without explicit user approval.
references/lark-im-messages-send.md:74In the instructionsOpen original file
- Excess blank lines are compressed.- Already-uploaded `img_xxx` image keys are the most reliable Markdown image input.- Local paths in Markdown image syntax like `![x](./a.png)` are **not** supported and will not be auto-uploaded.- Remote URLs (`https://...`) will be auto-downloaded and uploaded at runtime; if the download or upload fails, the image is removed with a warning.
Could it expose your files or keys?Looks for uploads of files containing passwords or keys, and keys written directly in the code.Risks found: 2
High risk

Card callbacks can expose password-style input and complete form values in listener output

Source references: 6
What we found

Card inputs support a `password` type, while form submission places all fields in `form_value`. The listener workflow treats every event as a stdout JSON line for immediate agent processing, so passwords, personal data, or approval notes may enter terminal logs, agent context, and run history.

Why this matters

If a card collects credentials, tokens, or other secrets, anyone with access to terminal or agent logs may see them. The update token can also modify the card for 30 minutes.

The input component permits a `password` type, and form submission places all field values in `form_value`. The listener processes each event as a stdout JSON line, so passwords or other sensitive entries could reach process output and agent context. No redaction is described. Users should avoid collecting passwords in cards and ask the author to prohibit sensitive fields and add redaction/log filtering.

references/card/components/input.md:27In the instructionsOpen original file
| `label_position` | 否 | String | top | `top` / `left`(窄屏自动转 top) || `input_type` | 否 | String | text | `text` / `multiline_text`(多行,回调含 `\n`) / `password` || `rows` | 否 | Number | 5 | 多行时默认行数 |
Show 5 other places
references/lark-im-card-action-reply.md:42In the instructionsOpen original file
| `timezone` | string | User timezone, e.g. `Asia/Shanghai`; only populated for date/time picker interactions || `form_value` | string (JSON) | All form field values as JSON string, keyed by component `name`; only present when a button inside a form container is clicked || `input_value` | string | Input text; only for standalone `input` components (not inside a form) || `option` | string | Selected value for standalone single-select: `select_static`, `select_person`, `overflow`, `date_picker`, `picker_time`, `picker_datetime` |
references/lark-im-card-action-reply.md:101In the instructionsOpen original file
When a `card.action.trigger` event arrives (**each stdout JSON line is one event — process it immediately**):
references/lark-im-card-action-reply.md:37In the instructionsOpen original file
| `host` | string | `im_message` (chat card) or `im_top_notice` (top banner) || `token` | string | Delayed-update token; valid 30 min, max 2 uses || `action_tag` | string | Component type that was triggered (see decision table) |
references/card/lark-im-card-create.md:131In the instructionsOpen original file
**form 提交统一回调(按钮用 `form_action_type: "submit"`,无需 behaviors):**- form 内所有表单组件的值通过 `action.form_value` 一次性回传
references/lark-im-card-action-reply.md:99In the instructionsOpen original file
## Agent workflowWhen a `card.action.trigger` event arrives (**each stdout JSON line is one event — process it immediately**):
Medium risk

Routine message reads expand by default to reactions and up to 500 thread replies

Source references: 3
What we found

When reading messages, the Skill queries reactions by default. mget and chat-message listing also fetch replies for every message with a thread_id, with a default cumulative limit of 500. This can read substantially more colleague conversation than a request for one page or message implies, and requires an additional reaction-reading scope.

Why this matters

More chat content, participants, and interaction history enter CLI output and the agent context, increasing the amount of sensitive work information that may be logged, summarized, or misused.

Message-reading shortcuts query reactions by default; mget and chat-list also expand thread replies, up to 50 per thread and 500 per page by default. This can exceed the intuitive scope of “read one message/page” and requires reaction-read permission. A user can request `--no-reactions` and ask the author for an option to disable thread expansion or lower its limits.

references/lark-im-message-enrichment.md:7In the instructionsOpen original file
- **`reactions`** — populated from `im.reactions.batch_query` as `{counts, details}`. The field is only attached when the server actually returns data; messages with no reactions omit it. Replies inside `thread_replies` are enriched alongside their parent (collected into the same id set), so outer and inner messages follow identical semantics. The id set is split into batches of <= 20 (server-side cap) and the batches are dispatched with bounded concurrency (up to 4 in flight), so high-N pulls — e.g. page 50 + ~500 expanded thread replies = 550 ids → ⌈550 / 20⌉ = **28 batches** — finish in a few round-trips instead of serializing into tens of seconds.- **`update_time`** — emitted only when `updated == true` (message was actually edited). The server echoes `update_time == create_time` for unedited messages too, but the CLI gates that output away so consumers don't misread every message as "edited".- **Opt-out** — each shortcut accepts `--no-reactions` to skip the extra round-trip when the caller only needs message bodies.
Show 2 other places
references/lark-im-message-enrichment.md:13In the instructionsOpen original file
`+messages-mget` and `+chat-messages-list` also auto-expand thread replies: any returned message that carries a `thread_id` triggers a fetch of that thread's replies, which are attached as a `thread_replies` array on the host. Fetches across distinct threads run with bounded concurrency (up to 4 in flight). Two caps gate the result:- **`perThread` (default 50)** — max replies fetched for any single thread.- **`totalLimit` (default 500)** — max cumulative replies across all threads on the page.
references/lark-im-message-enrichment.md:39In the instructionsOpen original file
The default enrichment requires `im:message.reactions:read`, already declared in each shortcut's `UserScopes` / `BotScopes` (or `Scopes` for the search command), so the framework's pre-flight check surfaces a `missing_scope` error before the request is sent. Bots that were registered before this scope was added need an incremental authorization in the Feishu developer console; users can run:
Could it delete files or keep running?Looks for broad file deletion, disk overwrites, and programs set to start automatically.No risks found
Could it bypass safety checks?Looks for skipped website security checks, excessive file access, or actions that skip your approval.Risks found: 2
Medium risk

The default unflag operation removes two layers, not just one visible bookmark

Source references: 5
What we found

When `--flag-type` is omitted, the command always removes the message-layer flag and, when chat type can be determined, also removes the Feed-layer flag. This is broader than a simple request to unbookmark a message, and the documentation discourages listing flags to verify the result.

Why this matters

A user may unintentionally lose both a message bookmark and a Feed/thread bookmark, changing personal organization state. Because canceling an absent flag also succeeds, success does not reveal which layers previously existed.

Omitting `--flag-type` actively attempts to cancel both the message-layer and feed-layer flags, rather than only one. Server-side idempotency for absent flags does not prevent removal of another existing flag the user intended to keep; the guide also discourages list verification. Users can explicitly require `--flag-type message` or `feed` and ask for the affected layer to be stated before execution.

references/lark-im-flag-cancel.md:13In the instructionsOpen original file
**When no `--flag-type` is specified, the shortcut performs best-effort double-cancel**: the message-layer flag is always removed; the feed-layer flag is also removed when the chat type can be determined (otherwise a warning is printed on stderr and the feed layer is skipped). The server handles cancel requests for non-existent flags idempotently, so this is safe.
Show 4 other places
references/lark-im-flag-cancel.md:40In the instructionsOpen original file
| `--message-id <om_xxx>` | Required | Message ID || `--flag-type <name>` | No | `message` or `feed`; **when omitted, best-effort double-cancel of both layers** || `--item-type <name>` | No | `default\|thread\|msg_thread`; required when `--flag-type feed` |
references/lark-im-flag-cancel.md:55In the instructionsOpen original file
- **Do not call +flag-list for verification**: If the cancel API returns success, the flag is removed. Calling +flag-list to verify is expensive (requires full pagination) and unnecessary.
references/lark-im-flag-cancel.md:9In the instructionsOpen original file
A message can have flags on both layers simultaneously:- Message layer: `(default, message)`- Feed layer: `(thread, feed)` or `(msg_thread, feed)` depending on chat type**When no `--flag-type` is specified, the shortcut performs best-effort double-cancel**: the message-layer flag is always removed; the feed-layer flag is also removed when the chat type can be determined (otherwise a warning is printed on stderr and the feed layer is skipped). The server handles cancel requests for non-existent flags idempotently, so this is safe.
references/lark-im-flag-cancel.md:39In the instructionsOpen original file
|------|------|------|| `--message-id <om_xxx>` | Required | Message ID || `--flag-type <name>` | No | `message` or `feed`; **when omitted, best-effort double-cancel of both layers** || `--item-type <name>` | No | `default\|thread\|msg_thread`; required when `--flag-type feed` || `--as user` | Required | Currently only supports user identity |
Medium risk

Bot-created groups add the current user by default even when membership was not requested

Source references: 4
What we found

The group-creation guidance tells the bot flow to search for the current user by name or email and add that user to the new group by default, omitting them only after an explicit “do not add me” or “bot-only group” request. This expands an unspecified group-creation request into contact lookup and membership modification.

Why this matters

The user's membership becomes visible to other group participants and may generate messages or notifications. Contact search also requires directory access. This may violate expectations when the user only asked the app to create a group.

The bot group-creation guidance searches for the current user's open_id by name or email and adds that user by default, omitting them only after an explicit refusal. This expands a member-unspecified request into a contact lookup and membership change and makes the group visible to that user. Users can say “bot-only/do not add me” and ask the author to require explicit opt-in before adding members.

references/lark-im-chat-create.md:76In the instructionsOpen original file
1. **Get the current user's open_id:** Run `lark-cli contact +search-user --query "<name or email>"` to retrieve it.2. **Create the group — by default include the current user:**
Show 3 other places
references/lark-im-chat-create.md:77In the instructionsOpen original file
1. **Get the current user's open_id:** Run `lark-cli contact +search-user --query "<name or email>"` to retrieve it.2. **Create the group — by default include the current user:**   ```bash   lark-cli im +chat-create --name "<group name>" \     --users "<current user open_id>" --as bot   ```   **Default behavior:** Always add the current user to the group, unless the user explicitly says "do not add me" or "bot-only group" — only then omit `--users`.
references/lark-im-chat-create.md:48In the instructionsOpen original file
# Preview the request without creating anythinglark-cli im +chat-create --name "My Group" --dry-run```
references/lark-im-chat-create.md:74In the instructionsOpen original file
Bot may fail to invite users who are mutually invisible to it during group creation (error 232043). To avoid this, use the **two-step flow** below instead of passing other users' open_ids in `--users`.1. **Get the current user's open_id:** Run `lark-cli contact +search-user --query "<name or email>"` to retrieve it.2. **Create the group — by default include the current user:**
Could it mislead the AI or hide text?Checks the skill instructions for requests to ignore you, influence the report, or hide text in invisible characters.No risks found
Could it change links or payment recipients without asking?Looks for forced referral or payment changes combined with instructions to hide the change.No risks found

Inside this skill

6 instruction sections

This Skill uses lark-cli with either a user token or a bot token to operate Feishu messages, group membership/settings, files, and personal Feed data. The selected identity determines whether actions run as the end user or the app.

View source
SKILL.md:44In the instructionsOpen original file
- `--as user` means **user identity** and uses `user_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 bot` means **bot identity** and uses `tenant_access_token`. Calls run as the app bot, so behavior depends on the bot's membership, app visibility, availability range, and bot-specific scopes.
SKILL.md:45In the instructionsOpen original file
- `--as user` means **user identity** and uses `user_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 bot` means **bot identity** and uses `tenant_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 `user` and `bot`, 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.

The send and reply documentation explicitly requires confirmation of the recipient, content, and sending identity before execution, and provides dry-run support. This is a clear confirmation control for externally visible communication.

View source
references/lark-im-messages-send.md:11In the instructionsOpen original file
Messages sent by this tool are visible to other people. Before calling it, you **must** confirm with the user:1. The recipient (which person or which group)2. The message content3. The sending identity (user or bot)
references/lark-im-messages-send.md:17In the instructionsOpen original file
**Do not** send messages without explicit user approval.

Message reads return more than message bodies: reactions are queried by default and thread replies may be expanded automatically. Attachment download is opt-in and writes to a dedicated directory under the current working directory.

View source
references/lark-im-message-enrichment.md:13In the instructionsOpen original file
`+messages-mget` and `+chat-messages-list` also auto-expand thread replies: any returned message that carries a `thread_id` triggers a fetch of that thread's replies, which are attached as a `thread_replies` array on the host. Fetches across distinct threads run with bounded concurrency (up to 4 in flight). Two caps gate the result:
references/lark-im-message-enrichment.md:24In the instructionsOpen original file
`+chat-messages-list`, `+messages-mget`, and `+threads-messages-list` accept an **opt-in** `--download-resources` flag. It is **off by default** — when omitted, output and the request count are identical to before (no `resources` block, no extra round-trips).

Interactive-card callbacks arrive through the bot WebSocket and contain the operator, conversation, input/form values, and an update token. Updating a card sends a complete replacement card to the Feishu API.

View source
references/lark-im-card-action-reply.md:37In the instructionsOpen original file
| `host` | string | `im_message` (chat card) or `im_top_notice` (top banner) || `token` | string | Delayed-update token; valid 30 min, max 2 uses || `action_tag` | string | Component type that was triggered (see decision table) || `action_value` | string | Developer-defined value on the component; serialized to JSON string || `action_name` | string | `name` attribute of the component || `timezone` | string | User timezone, e.g. `Asia/Shanghai`; only populated for date/time picker interactions || `form_value` | string (JSON) | All form field values as JSON string, keyed by component `name`; only present when a button inside a form container is clicked || `input_value` | string | Input text; only for standalone `input` components (not inside a form) || `option` | string | Selected value for standalone single-select: `select_static`, `select_person`, `overflow`, `date_picker`, `picker_time`, `picker_datetime` |
references/lark-im-card-action-reply.md:128In the instructionsOpen original file
```bashlark-cli api POST /open-apis/interactive/v1/card/update --as bot \  --data '{"token":"<token>","card":<new_card_json>}'```
Start here · InstructionsSKILL.md
lark-im
Lines connect the instruction file to its sections, not an observed execution order. Select a section to read the source.

File reference map

References: 40
Files making referencesReferenced content
Lines show actual file references, not execution order. Select a node to highlight its connections and inspect the files and source locations. Dashed lines include files that still need locating.
Files and check records61 files

Coverage and gaps

Content covered in each file

These are the source ranges included in this check, not a guarantee that every issue has been resolved.

  • SKILL.mdFull text included
  • references/card/lark-im-card-create.mdFull text included
  • references/lark-im-card-action-reply.mdFull text included
  • references/lark-im-chat-create.mdFull text included
  • references/lark-im-chat-list.mdFull text included
  • references/lark-im-chat-members-list.mdFull text included
  • references/lark-im-chat-messages-list.mdFull text included
  • references/lark-im-chat-search.mdFull text included
  • references/lark-im-chat-update.mdFull text included
  • references/lark-im-feed-group-list-item.mdFull text included
  • references/lark-im-feed-group-list.mdFull text included
  • references/lark-im-feed-group-query-item.mdFull text included
  • references/lark-im-feed-groups.mdFull text included
  • references/lark-im-feed-shortcut-create.mdFull text included
  • references/lark-im-feed-shortcut-list.mdFull text included
  • references/lark-im-feed-shortcut-remove.mdFull text included
  • references/lark-im-flag-cancel.mdFull text included
  • references/lark-im-flag-create.mdFull text included
  • references/lark-im-flag-list.mdFull text included
  • references/lark-im-message-enrichment.mdFull text included
  • references/lark-im-message-read-status.mdFull text included
  • references/lark-im-messages-edit.mdFull text included
  • references/lark-im-messages-mget.mdFull text included
  • references/lark-im-messages-reply.mdFull text included
  • references/lark-im-messages-resources-download.mdFull text included
  • references/lark-im-messages-search.mdFull text included
  • references/lark-im-messages-send.mdFull text included
  • references/lark-im-reactions.mdFull text included
  • references/lark-im-threads-messages-list.mdFull text included
  • references/card/components/button.mdFull text included
  • references/card/components/chart.mdFull text included
  • references/card/components/checker.mdFull text included
  • references/card/components/collapsible_panel.mdFull text included
  • references/card/components/column_set.mdFull text included
  • references/card/components/date_picker.mdFull text included
  • references/card/components/div.mdFull text included
  • references/card/components/form.mdFull text included
  • references/card/components/header.mdFull text included
  • references/card/components/hr.mdFull text included
  • references/card/components/img_combination.mdFull text included
  • references/card/components/img.mdFull text included
  • references/card/components/input.mdFull text included
  • references/card/components/interactive_container.mdFull text included
  • references/card/components/markdown.mdFull text included
  • references/card/components/multi_select_person.mdFull text included
  • references/card/components/multi_select_static.mdFull text included
  • references/card/components/overflow.mdFull text included
  • references/card/components/person_list.mdFull text included
  • references/card/components/person.mdFull text included
  • references/card/components/picker_datetime.mdFull text included
  • references/card/components/picker_time.mdFull text included
  • references/card/components/recycling_container.mdFull text included
  • references/card/components/select_img.mdFull text included
  • references/card/components/select_person.mdFull text included
  • references/card/components/select_static.mdFull text included
  • references/card/components/table.mdFull text included
  • references/lark-im-chat-identity.mdFull text included
  • references/card/card-2.0-schema.mdFull text included
  • references/card/lark-im-card-style.mdFull text included
  • references/card/resource/colors.mdFull text included
  • references/card/resource/icons.mdFull text included

This report is for the version above. We read the available code and instructions without running the skill or checking extra packages it installs. This is not a promise of safety: a different version or setup may behave differently.

  • SKILL.mdInstructions
  • references/card/card-2.0-schema.mdSupporting file
  • references/card/components/button.mdSupporting file
  • references/card/components/chart.mdSupporting file
  • references/card/components/checker.mdSupporting file
  • references/card/components/collapsible_panel.mdSupporting file
  • references/card/components/column_set.mdSupporting file
  • references/card/components/date_picker.mdSupporting file
  • references/card/components/div.mdSupporting file
  • references/card/components/form.mdSupporting file
  • references/card/components/header.mdSupporting file
  • references/card/components/hr.mdSupporting file
  • references/card/components/img.mdSupporting file
  • references/card/components/img_combination.mdSupporting file
  • references/card/components/input.mdSupporting file
  • references/card/components/interactive_container.mdSupporting file
  • references/card/components/markdown.mdSupporting file
  • references/card/components/multi_select_person.mdSupporting file
  • references/card/components/multi_select_static.mdSupporting file
  • references/card/components/overflow.mdSupporting file
  • references/card/components/person.mdSupporting file
  • references/card/components/person_list.mdSupporting file
  • references/card/components/picker_datetime.mdSupporting file
  • references/card/components/picker_time.mdSupporting file
  • references/card/components/recycling_container.mdSupporting file
  • references/card/components/select_img.mdSupporting file
  • references/card/components/select_person.mdSupporting file
  • references/card/components/select_static.mdSupporting file
  • references/card/components/table.mdSupporting file
  • references/card/lark-im-card-create.mdSupporting file
  • references/card/lark-im-card-style.mdSupporting file
  • references/card/resource/colors.mdSupporting file
  • references/card/resource/icons.mdSupporting file
  • references/lark-im-card-action-reply.mdSupporting file
  • references/lark-im-chat-create.mdSupporting file
  • references/lark-im-chat-identity.mdSupporting file
  • references/lark-im-chat-list.mdSupporting file
  • references/lark-im-chat-members-list.mdSupporting file
  • references/lark-im-chat-messages-list.mdSupporting file
  • references/lark-im-chat-search.mdSupporting file
  • references/lark-im-chat-update.mdSupporting file
  • references/lark-im-feed-group-list-item.mdSupporting file
  • references/lark-im-feed-group-list.mdSupporting file
  • references/lark-im-feed-group-query-item.mdSupporting file
  • references/lark-im-feed-groups.mdSupporting file
  • references/lark-im-feed-shortcut-create.mdSupporting file
  • references/lark-im-feed-shortcut-list.mdSupporting file
  • references/lark-im-feed-shortcut-remove.mdSupporting file
  • references/lark-im-flag-cancel.mdSupporting file
  • references/lark-im-flag-create.mdSupporting file
  • references/lark-im-flag-list.mdSupporting file
  • references/lark-im-message-enrichment.mdSupporting file
  • references/lark-im-message-read-status.mdSupporting file
  • references/lark-im-messages-edit.mdSupporting file
  • references/lark-im-messages-mget.mdSupporting file
  • references/lark-im-messages-reply.mdSupporting file
  • references/lark-im-messages-resources-download.mdSupporting file
  • references/lark-im-messages-search.mdSupporting file
  • references/lark-im-messages-send.mdSupporting file
  • references/lark-im-reactions.mdSupporting file
  • references/lark-im-threads-messages-list.mdSupporting file

Operations mentioned in code and instructions

Connect to websites
SKILL.md:40In the instructionsOpen original file
Prefer CLI-returned links: use `chat_app_link` to open joined conversations, `message_app_link` to open messages, and `share_link` to invite others to groups. If manually building a joined-conversation AppLink, use `https://<applink_host>/client/chat/open?openChatId=<oc_xxx>`, never `chatId=<oc_xxx>` or `lark://...chat_id=<oc_xxx>`.
SKILL.md:246In the instructionsOpen original file
| `chat.moderation.update` | `im:chat:moderation:write_only` || `chat.join_requests.list` | `im:chat.membership_application:read` || `chat.join_requests.handle` | `im:chat.membership_application:write` |
SKILL.md:247In the instructionsOpen original file
| `chat.join_requests.list` | `im:chat.membership_application:read` || `chat.join_requests.handle` | `im:chat.membership_application:write` || `+messages-read-status` | user: `im:message:readonly` (recommended), `im:message`, or `im:message:get_as_user` |
Run commands
SKILL.md:137In the instructionsOpen original file
```bashlark-cli schema im.<resource>.<method>   # 调用 API 前必须先查看参数结构
references/card/lark-im-card-create.md:101In the instructionsOpen original file
```bash# 发送到群聊
references/lark-im-card-action-reply.md:89In the instructionsOpen original file
Once the listener is running, check whether your agent runtime supports background eventmonitoring (i.e. can receive and process stdout lines from a running subprocess whilecontinuing to respond to the user). If it does, prompt the user:
Read files
references/lark-im-messages-edit.md:45In the instructionsOpen original file
- **`--set-attachments` is a replace, not an append:** the flag values become the final `files` array. Send/reply's `--attachment` merges; edit's `--set-attachments` replaces.- **Mutually exclusive with `--content` carrying files:** when `--content` already contains a `files` array, `--set-attachments` and `--clear-attachments` are rejected — declare the attachment zone either via `--content` or via the attachment flags, not both. Use `--markdown` (which never emits a `files` array) or a `--content` without `files` together with the attachment flags.- The server fills name/size/mime/is_folder from file service metadata; the client does not (and cannot) override the display name.
references/lark-im-messages-send.md:200In the instructionsOpen original file
> **Mutual exclusivity rule:** `--text`, `--markdown`, `--content`, and `--image`/`--file`/`--video`/`--audio` cannot be used together. Media flags are also mutually exclusive with each other. `--attachment` cannot be combined with a `--content` that already contains a `files` array (the attachment zone is declared either via `--content` or via `--attachment`, not both).>
Lines read
5,909
File checksum (to compare versions)
640cc3e364856c6d4d62960f9b3e213eec61b6c43fb84d0bbe4262d3f20f3ac4