Skip to content
Back to skills

Lark Unified

ASecurity

Unified Lark/Feishu CLI suite covering messaging, documents, collaboration, scheduling, and more. Provides 200+ commands across 11 business domains including instant messaging (IM), cloud documents, spreadsheets, base/tables, calendars, mail, tasks, wikis, video conferences, and custom integrations. Use when working with Lark/Feishu through CLI or needing to understand Lark API capabilities for: sending/receiving messages, managing documents and files, creating spreadsheets, managing tasks an...

  • 279 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added September 8, 2026
businesspythonbashreactnodeapidocumentation

Works with

  • cursor
  • cli
  • api

Security analysis

A96/100
  • mediumInstalls packages at runtime which could introduce malicious dependencies

Pro scans all 14 files and shows the line behind each finding

Scanned September 8, 2026

npx -y skills add infometa/workbuddyskills --skill lark-unified --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Lark Unified?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Lark Unified
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/infometa-lark-unified/badge)](https://www.skillsdirectory.com/skills/infometa-lark-unified)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: lark-unified
description: "Unified Lark/Feishu CLI suite covering messaging, documents, collaboration, scheduling, and more. Provides 200+ commands across 11 business domains including instant messaging (IM), cloud documents, spreadsheets, base/tables, calendars, mail, tasks, wikis, video conferences, and custom integrations. Use when working with Lark/Feishu through CLI or needing to understand Lark API capabilities for: sending/receiving messages, managing documents and files, creating spreadsheets, managing tasks and calendars, searching conversations, building custom workflows, or accessing any Lark business application."
description_zh: "飞书/Lark 全能套件(消息、文档、表格、日历、任务、Wiki 等 11 个业务域)"
description_en: "Lark/Feishu unified CLI: messaging, docs, sheets, calendar, tasks, wiki & more"
version: "1.0.3"
allowed-tools: Bash, Read
---

# Lark Unified

Lark (飞书) is a comprehensive collaboration platform combining messaging, documents, spreadsheets, tables, calendars, and more. This skill provides unified access to the **Lark CLI** (`lark-cli`), a production-grade command-line tool with 200+ commands across 11 integrated business domains, along with 19 AI Agent-optimized skills.

## ⚠️ SETUP RULES — READ BEFORE DOING ANYTHING

**FORBIDDEN — never run these commands under any circumstances:**
- `lark-cli config init --new`
- `lark-cli config init` (interactive)
- `lark-cli config set-default`

These require a TTY, output a broken QR code in WorkBuddy, and must never be used.

**REQUIRED setup procedure — follow exactly:**

```bash
# Step 1: resolve or install lark-cli
LARK_CLI="$(command -v lark-cli || true)"
if [ -z "$LARK_CLI" ]; then
  env -u NODE_OPTIONS npm install -g @larksuite/cli
  LARK_CLI="$(command -v lark-cli || true)"
fi
if [ -z "$LARK_CLI" ]; then
  NPM_PREFIX="$(npm prefix -g 2>/dev/null || true)"
  LARK_CLI="$(find "$HOME/.npm-global/bin" "$NPM_PREFIX/bin" -name lark-cli -type f 2>/dev/null | head -1)"
fi
if [ -z "$LARK_CLI" ]; then
  echo "LARK_CLI_NOT_FOUND"
  exit 1
fi
"$LARK_CLI" --version

# Step 2: check if already configured (look for "appId" in output, NOT exit code)
"$LARK_CLI" config show 2>&1 | grep -q "appId" && echo "CONFIG_OK" || echo "NOT_CONFIGURED"
```

If step 2 prints `NOT_CONFIGURED`, run the setup script:

```bash
SETUP=$(find ~/.workbuddy/skills -name lark_setup.py 2>/dev/null | head -1)
LARK_CLI="$LARK_CLI" python3 "$SETUP"

# Lark (international) users:
LARK_CLI="$LARK_CLI" python3 "$SETUP" --brand lark

# If browser cannot open automatically:
# Print the URL clearly, ask the user to open it in a browser, and keep this command running while it polls.
LARK_CLI="$LARK_CLI" python3 "$SETUP" --no-browser
```

**IMPORTANT: The setup script is a multi-step device flow.**
- Step 1 (begin): The script requests a device code from Feishu. This call may return HTTP 400 transiently — **this is normal, just retry**.
- Step 2 (browser): The script opens a browser URL for the user to authorize.
- Step 3 (poll): The script polls until the user completes authorization in the browser. The poll API returns `authorization_pending` (as HTTP 400) while waiting — **this is expected, NOT an error**. Keep polling.
- Step 4 (save): Once authorized, the script saves the config.

**If the setup script fails or you ran the begin step manually:**
1. You already have the `device_code` — just keep polling with it until the user confirms in the browser.
2. Do NOT re-run the begin step unnecessarily. Reuse the existing device_code.
3. The `authorization_pending` response during polling is **normal** — it means the user hasn't finished yet. Wait and retry.

**CRITICAL: App setup is not user OAuth.** The setup script only creates/saves the app credentials. It does **not** guarantee the user is logged in. For personal data operations such as reading a user's accessible document, calendar, mail, task, or chat history, always check `auth status` first and complete user OAuth if needed.

## First-use bootstrap — app setup + user OAuth must be chained

When the user asks for a personal-resource operation (for example reading a document URL, searching docs, checking calendar, mail, tasks, or chat history), the first-use flow MUST complete both stages before attempting the business API:

1. **Resolve/install `lark-cli`** using the setup procedure above.
2. **Check app configuration** with `config show`.
3. If app configuration is missing, run `lark_setup.py` and keep polling until it saves `appId/appSecret`.
4. **Do not stop after app setup.** Immediately run `auth status`.
5. If `auth status` reports no logged-in user, run user OAuth with recommended scopes.
6. Keep polling the same `device_code` until OAuth succeeds or expires.
7. Run `auth status` again and confirm `identity` is `user` and `tokenStatus` is `valid` or refreshable.
8. Only then retry the original user task once.

Tell the user the first-use flow may show two authorization pages:

> 第一次使用飞书套件需要完成两步连接:先初始化飞书 CLI 应用配置,再授权访问你有权限的飞书数据。两步完成后我会自动继续当前任务;这不是重复授权。

Use this exact command pattern after app setup succeeds:

```bash
# App setup may have just completed. Now continue with user OAuth; do not wait for another user prompt.
"$LARK_CLI" auth status
"$LARK_CLI" auth login --domain all --recommend --no-wait --json
"$LARK_CLI" auth login --device-code "<device_code>"
"$LARK_CLI" auth status
```

If the user OAuth device flow prints a `verification_url`, show that URL clearly and keep the polling command running. Do not start a new app setup or user OAuth flow while `authorization_pending` is still polling.

**CRITICAL: polling timeout must outlive the device code.** Device codes commonly expire after 10 minutes. When running `lark_setup.py` or `lark-cli auth login --device-code`, use a tool timeout longer than `expires_in` (recommended at least 700000 ms / 11+ minutes) or run the polling command in the background. If the polling command is interrupted by a tool timeout but the device code has not expired, reuse the same `device_code` and continue polling; do not start a new `--no-wait` or app setup flow. Only generate a new code after `expired_token`, `invalid_grant`, or a confirmed deadline expiry.

## Fail-fast rules for auth and permission errors

Stop retrying business APIs when any of these errors appears. Do not switch identities or change unrelated flags repeatedly.

| Error signal | Meaning | Required action |
|---|---|---|
| `need_user_authorization` / `No user logged in` / `failed to get access token` | User OAuth is missing or expired | Stop API retries. Run user device-flow login, show the verification URL clearly, keep polling with the same `device_code`, then rerun `auth status`. |
| `forBidden` / `forbidden` with `--as bot` | The bot/app is not authorized for the target resource, commonly because it is not a document collaborator | Stop bot retries. Use `--as user` after user OAuth, or ask the user to add the bot/app as a collaborator to the document/resource. |
| `App scope not enabled` / `required scope ...` | The current app has not enabled the required Open Platform scope; user OAuth alone cannot grant it | Stop retries. Tell the user/admin which scope must be enabled in the Feishu developer console, then retry after the app scope is enabled and OAuth includes it. |
| `authorization_pending` | The user has not finished the browser authorization yet | Keep the existing polling command running. Do not start a new setup/login flow unless the device code expires. |
| `expired_token` / `invalid_grant` | The device code expired | Start exactly one new login/setup flow and give the user the new URL. |

**Retry budget:** after one failed business API call with an auth/permission error, diagnose and switch to the required auth step. Never perform repeated API attempts with `--as user`, `--as bot`, `--format`, or unrelated command variants.

## Getting Started

```bash
# Verify app setup is complete
"$LARK_CLI" config show

# Verify user authorization status
"$LARK_CLI" auth status
```

If `auth status` reports no logged-in user and personal operations are needed, run the recommended-scope login. Before starting, tell the user clearly:

> 本次将连接飞书并授权推荐权限范围,覆盖多数常见飞书操作。由于飞书权限按能力拆分,后续执行文档搜索、云盘检索、导出等更具体操作时,仍可能需要补充授权;补充授权不是重新连接,而是为当前新增能力追加 scope。

```bash
# Start user device-flow login for recommended scopes across domains
"$LARK_CLI" auth login --domain all --recommend --no-wait --json

# Tell the user: "请复制并打开 verification_url,在浏览器里完成飞书授权。"
# Then keep polling with the returned device_code until success or timeout.
"$LARK_CLI" auth login --device-code "<device_code>"

# Verify tokenStatus is valid and identity is user before reading personal resources
"$LARK_CLI" auth status
```

**When additional scopes are needed:** `--scope` cannot be combined with `--domain` or `--recommend`. Do not replace recommended login with a tiny explicit scope set unless you are intentionally narrowing the token. For a supplemental authorization, explain the exact missing capability and scope to the user, for example:

> 当前任务需要补充授权:飞书文档搜索权限 `search:docs:read`。授权后,后续搜索飞书文档不会再次要求这个权限。

Then run an explicit-scope login for the missing scope or for a maintained capability bundle, and verify with `auth status` before retrying the business API once.

All commands:
```bash
lark-cli <domain> <resource> <method> [flags]
lark-cli <domain> +<shortcut> [flags]  # shortcuts preferred
```

**Default identity**: `--as auto`. It uses the logged-in user when available and falls back to bot identity when no user is logged in. For personal resources (docs the user can open, calendar, mail, tasks, chat history), prefer `--as user` after `auth status` is valid. Use `--as bot` only for app/bot operations or resources where the bot is explicitly a member/collaborator.

## Document creation identity rules

- Default to `--as user` for user-requested docs/sheets so the user owns them.
- Use `--as bot` only when the user explicitly asks for bot/app-owned content.
- If a bot-created doc must be shared, add user permission; this requires `docs:permission.member:create`. If that scope is not enabled, stop and ask an admin to enable it.

## Core Capability Domains

Lark has 11 primary business domains. Each has dozens of commands, with high-level shortcuts for common operations:

### ✉️ Instant Messaging (lark-im)
Send/receive messages, search chat history, manage groups, download files, and manage reactions.

**Common shortcuts**: `+messages-send`, `+messages-search`, `+chat-messages-list`, `+chat-create`

**Use when**: Messaging users, retrieving conversations, building chat-based workflows, downloading attachments

→ **For detailed API reference, shortcuts, and permission requirements**: See [references/lark-im.md](references/lark-im.md)

### 📄 Cloud Documents (lark-doc)
Create and edit documents, insert media, manage document permissions, and link to wikis.

**Common shortcuts**: `+documents-create`, `+documents-list`

**Use when**: Creating documents programmatically, building document workflows, embedding content

→ **For full reference**: See [references/lark-doc.md](references/lark-doc.md)

### 💾 Cloud Drive & Files (lark-drive)
Upload/download files, manage file permissions, share links, and add comments on files.

**Common shortcuts**: `+files-upload`, `+files-download`

**Use when**: Managing file storage, automating uploads/downloads, sharing files

→ **For full reference**: See [references/lark-drive.md](references/lark-drive.md)

### 📊 Spreadsheets (lark-sheets)
Read/write/append to spreadsheets, query data, and manage sheet permissions.

**Common shortcuts**: `+spreadsheets-read`, `+spreadsheets-append`, `+spreadsheets-find`

**Use when**: Automating spreadsheet operations, reading/updating sheet data, building data workflows

→ **For full reference**: See [references/lark-sheets.md](references/lark-sheets.md)

### 🗂️ Base & Multi-Dimensional Tables (lark-base)
Query and manage multi-dimensional table records, fields, views, dashboards, and run workflows.

**Common shortcuts**: `+tables-records-list`, `+tables-records-create`, `+fields-list`

**Use when**: Managing relational data, querying tables, automating base operations, triggering workflows

→ **For full reference**: See [references/lark-base.md](references/lark-base.md)

### 📅 Calendar (lark-calendar)
Query events, check availability, suggest meeting times, and manage calendar settings.

**Common shortcuts**: `+calendars-list`, `+events-list`, `+events-search-freebusy`

**Use when**: Checking schedules, coordinating meetings, finding available time slots

→ **For full reference**: See [references/lark-calendar.md](references/lark-calendar.md)

### 📋 Tasks & To-Do (lark-task)
Create tasks, organize into lists, manage reminders, and track subtasks.

**Common shortcuts**: `+tasks-create`, `+tasks-list`, `+task-lists-list`

**Use when**: Creating tasks, building task workflows, managing team task lists

→ **For full reference**: See [references/lark-task.md](references/lark-task.md)

### 📧 Mail (lark-mail)
Compose emails, manage drafts, search messages, reply/forward, and send emails.

**Common shortcuts**: `+messages-send`, `+messages-search`, `+drafts-create`

**Use when**: Building email workflows, automating mail operations, searching email history

→ **For full reference**: See [references/lark-mail.md](references/lark-mail.md)

### 📚 Wiki & Knowledge Spaces (lark-wiki)
Create knowledge spaces, organize pages into hierarchies, and manage wiki permissions.

**Common shortcuts**: `+spaces-create`, `+wiki-pages-create`, `+wiki-pages-list`

**Use when**: Building knowledge bases, organizing documentation, creating wikis

→ **For full reference**: See [references/lark-wiki.md](references/lark-wiki.md)

### 🎥 Video Conference & Meetings (lark-vc)
Search meeting recordings, retrieve meeting notes, and manage VC settings.

**Use when**: Accessing meeting data, retrieving recordings and notes, managing video settings

→ **For full reference**: See [references/lark-vc.md](references/lark-vc.md)

### 👥 Contacts & Directory (lark-contact)
Search users, fetch contact profiles, and query user directory.

**Use when**: Searching for users, building user lookups, retrieving contact information

→ **For full reference**: See [references/lark-contact.md](references/lark-contact.md)

## Core Concepts & Common Patterns

### Identity & Authentication

- **User identity** (`--as user`): Operations run as the authenticated user. Uses `user_access_token`. Permissions depend on the user's own access.
- **Bot identity** (`--as bot`): Operations run as the app's bot. Uses `tenant_access_token`. Permissions depend on the bot's scopes and membership.

Most APIs support both modes, but behavior differs based on the caller's role and access.

### Common Entity IDs

- **User**: `open_id`, `user_id`, `email`
- **Chat**: `chat_id` (oc_xxx)
- **Message**: `message_id` (om_xxx)
- **Thread**: `thread_id`
- **Document**: `document_id`
- **File**: `file_key` or `file_id`
- **Table/Base**: `base_id`, `table_id`
- **Event**: `event_id`

### Working with the CLI

#### Using Shortcuts (Recommended)
Shortcuts are high-level wrappers around common operations. Always use shortcuts when available:
```bash
lark-cli im +messages-send --chat-id oc_xxx --text "Hello"
lark-cli sheets +spreadsheets-read --spreadsheet-id spr_xxx
```

#### Using Raw APIs
For operations without shortcuts, use raw API commands with schema inspection:
```bash
lark-cli schema im.messages.create       # View parameter structure
lark-cli im messages create --data '{...}'  # Call with structured data
```

**Important**: Always run `schema` before calling raw APIs to understand the exact parameter format.

#### Pagination & Filtering
Most list operations support:
- `--limit`: Number of records to return (default varies by API)
- `--offset` / `--page-token`: Pagination cursor
- `--filter`: Server-side filtering (format varies by resource)

#### Output Formatting
By default, commands return JSON. Common options:
- `--table`: Format output as ASCII table
- `--csv`: Export as CSV
- `--yaml`: YAML format
- `--raw`: Unformatted raw output

### Workflows

Lark offers two built-in workflow skills:
- **Meeting Summary Workflow** (`lark-workflow-meeting-summary`): Aggregate meeting notes
- **Standup Report Workflow** (`lark-workflow-standup-report`): Generate daily standup summaries

See `references/workflows.md` for details.

## Advanced Features

### Custom Skills & Integrations

Use `lark-skill-maker` to create custom skills by wrapping Lark APIs. See `references/skill-maker.md`.

### OpenAPI Discovery

Use `lark-openapi-explorer` to discover and test Lark APIs directly. See `references/openapi.md`.

### Event Subscriptions

Subscribe to real-time events via WebSocket with `lark-event`. See `references/events.md`.

### Other Domains

- **Minutes**: Meeting minutes metadata (`lark-minutes`)
- **Whiteboard**: Drawing/diagram creation with DSL (`lark-whiteboard`)
- **Shared**: Core authentication rules and identity management (`lark-shared`)

See `references/other-domains.md` for details.

## Quick Example

### Send a message to a chat
```bash
# First, find the chat
lark-cli im +chat-search --keyword "engineering"

# Then send a message
lark-cli im +messages-send --chat-id oc_xxx --text "Hello team!"
```

### Search past messages
```bash
lark-cli im +messages-search --query "deadline" --from-user ou_xxx --start-time 2024-01-01 --end-time 2024-01-31
```

### Create a spreadsheet and add data
```bash
lark-cli sheets +spreadsheets-create --title "Q1 Data"
lark-cli sheets +spreadsheets-append --spreadsheet-id spr_xxx --range "Sheet1!A1" --values "[[1,2,3]]"
```

### Query a base table
```bash
lark-cli base +tables-records-list --base-id app_xxx --table-id tbl_xxx --limit 100
```

## Need Help?

- **View all domains**: `lark-cli --help`
- **Domain-specific help**: `lark-cli <domain> --help`
- **Inspect API schema**: `lark-cli schema <domain>.<resource>.<method>`
- **Permission requirements**: Check the permission tables in each domain's reference file

## Next Steps

1. **Choose your domain** from the list above
2. **Read the domain reference** (linked in each section)
3. **Use shortcuts** for common operations
4. **Inspect schemas** if using raw APIs
5. **Check permissions** in the reference documentation

Files in this skill

  • SKILL.md18.5 KB
  • references/api_reference.md963 B
  • references/lark-base.md3.7 KB
  • references/lark-calendar.md2.3 KB
  • references/lark-doc.md3.2 KB
  • references/lark-drive.md2.4 KB
  • references/lark-im.md4 KB
  • references/lark-mail.md2.3 KB
  • references/lark-shared.md7.6 KB
  • references/lark-sheets.md2.3 KB
  • references/lark-task.md2.1 KB
  • references/lark-wiki.md2.8 KB
  • references/other-domains.md4.2 KB
  • scripts/lark_setup.py8.7 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…