Requirements
- Target platform
- OpenClaw
- Install method
- Manual import
- Extraction
- Extract archive
- Prerequisites
- OpenClaw
- Primary doc
- SKILL.md
Comprehensive Lark/Feishu API skill for OpenClaw agents. Covers all Lark operations via three access paths: claw-lark plugin (message tool), MCP tools (mcpor...
Comprehensive Lark/Feishu API skill for OpenClaw agents. Covers all Lark operations via three access paths: claw-lark plugin (message tool), MCP tools (mcpor...
Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.
I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete.
I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run.
This skill is a documentation-only reference guide. It contains no executable code that accesses credentials automatically. Required credentials (user-provided, never bundled): Lark App ID (app_id) โ from Lark Developer Console Lark App Secret (app_secret) โ from the same console How credentials are used: All API examples in SKILL.md use placeholders (<APP_ID>, <APP_SECRET>, CHAT_ID, etc.) โ no real secrets The scripts/get_token.sh helper obtains a temporary tenant_access_token from Lark's auth API. It reads credentials from (in order): Command-line arguments LARK_APP_ID / LARK_APP_SECRET environment variables ~/.openclaw/openclaw.json (standard OpenClaw config, path channels.lark.accounts.default.appId/appSecret) The script prints the config source to stderr when falling back to the config file No credentials are hardcoded, cached to disk, logged, or transmitted beyond the single Lark auth API call The token is exported as LARK_TOKEN env var for subsequent commands in the same shell session
NeedPathWhenSend/receive messagesclaw-lark plugin (message tool)Basic text, media, reactions โ simplestStructured CRUD opsMCP tools via mcporterBitable, calendar, docs, tasks, OKR โ 38 toolsEverything elseDirect API (curl)Contacts, member mgmt, anything MCP doesn't cover Rule: claw-lark first โ MCP second โ direct API as fallback.
TOKEN=$(curl -s -X POST 'https://open.larksuite.com/open-apis/auth/v3/tenant_access_token/internal' \ -H 'Content-Type: application/json' \ -d '{"app_id":"<APP_ID>","app_secret":"<APP_SECRET>"}' \ | python3 -c "import sys,json; print(json.load(sys.stdin)['tenant_access_token'])") Or use the helper: bash scripts/get_token.sh Token validity: ~2 hours. Cache it.
PlatformAPI BaseDev ConsoleLark Internationalhttps://open.larksuite.com/open-apis/https://open.larksuite.com/appFeishu (China)https://open.feishu.cn/open-apis/https://open.feishu.cn/app โ ๏ธ Lark โ Feishu. Always confirm which platform the tenant uses.
curl -X POST "https://open.larksuite.com/open-apis/im/v1/messages?receive_id_type=chat_id" \ -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \ -d '{"receive_id":"CHAT_ID","msg_type":"text","content":"{\"text\":\"hello\"}"}'
curl -X POST "https://open.larksuite.com/open-apis/im/v1/messages/MSG_ID/reply" \ -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \ -d '{"msg_type":"text","content":"{\"text\":\"reply\"}","reply_in_thread":true}'
curl -X POST "https://open.larksuite.com/open-apis/im/v1/messages/MSG_ID/reactions" \ -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \ -d '{"reaction_type":{"emoji_type":"THUMBSUP"}}' Emoji types: THUMBSUP HEART LAUGH OK COOL FINGERHEART SMILE JIAYOU
# List root departments curl -s -H "Authorization: Bearer $TOKEN" \ 'https://open.larksuite.com/open-apis/contact/v3/departments?parent_department_id=0&page_size=50&fetch_child=true' # List users in a department curl -s -H "Authorization: Bearer $TOKEN" \ 'https://open.larksuite.com/open-apis/contact/v3/users?department_id=<DEPT_ID>&page_size=50' Key fields: name, open_id, employee_type (1=regular, 2=intern), department_ids
curl -s -H "Authorization: Bearer $TOKEN" \ 'https://open.larksuite.com/open-apis/im/v1/messages?container_id_type=chat&container_id=<CHAT_ID>&page_size=20&sort_type=ByCreateTimeDesc'
curl -X POST "https://open.larksuite.com/open-apis/im/v1/chats/<CHAT_ID>/members?member_id_type=app_id" \ -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \ -d '{"id_list":["<BOT_APP_ID>"]}'
mcporter call lark-mcp.<tool_name> key=value Full catalog with parameters: references/mcp-tools.md
ModuleKey ToolsBitablecreate apps/tables, CRUD records, list fieldsCalendarcreate/get/patch events, free/busy, primary calendarDocsread content, search, import, set permissionsIMcreate/list groups, get members, send messages, list historyOKRbatch get, list periods, CRUD progress, query reviewsReportquery rules/tasks, manage viewsTaskcreate/patch tasks, add members/remindersWikisearch nodes, get node detailsContactsbatch get user IDs by email/phone
List users by department โ GET /contact/v3/users?department_id= List departments โ GET /contact/v3/departments Add/remove group members โ POST /im/v1/chats/{chat_id}/members Send reactions โ POST /im/v1/messages/{msg_id}/reactions Upload images/files โ POST /im/v1/images / POST /im/v1/files
Most list APIs use cursor-based pagination: ?page_size=50&page_token=<token_from_previous_response> Check has_more in response.
CodeMeaning0Success99991663Token expired โ refresh99991664Token invalid99991400Bad request99991403No permission โ check app permissions
Lark โ Feishu โ International uses open.larksuite.com, China uses open.feishu.cn open_id is per-app โ Same user has different open_id across different Lark apps Webhook 5s timeout โ Return 200 immediately, process async Event dedup โ Use event_id (Lark retries up to 3x) Bot-to-bot blind spot โ Lark does NOT push Bot A's messages to Bot B's webhook Publishing required โ Permission/event changes only take effect after publishing a new app version ngrok IPv6 trap โ Use 127.0.0.1:PORT not localhost:PORT in ngrok config ngrok free domain โ Returns interstitial HTML that Lark rejects. Use paid domain.
Bot setup playbook: references/bot-setup.md API reference: references/api-reference.md MCP tools catalog: references/mcp-tools.md Webhook & tunnel: references/webhook-setup.md Troubleshooting: references/troubleshooting.md Permissions: references/permissions.md
Code helpers, APIs, CLIs, browser automation, testing, and developer operations.
Largest current source with strong distribution and engagement signals.