feishu-user-plugin
The feishu-user-plugin is a Feishu/Lark MCP server providing 85 tools across messaging, documents, and collaboration — with a unique ability to send messages as a real user (not just a bot) via cookie-based authentication. It supports three-layer auth (cookie, bot API credentials, OAuth UAT) and multi-profile management.
Messaging (as User or Bot)
Send text, rich-text (POST), images, and files as yourself (user identity) to individuals or groups
Batch-send to multiple targets; reply, forward, delete, edit, pin messages, and add/remove emoji reactions
Read group chat and P2P message history; auto-expand merge-forwarded messages
Contacts & Chat Management
Search users, bots, and group chats by name; look up user info by ID
Create/manage group chats, add/remove members, create P2P chats
Documents
Search, read (raw or Markdown), create, and edit Feishu docs and block structures
Upload/download images and files embedded in documents
Bitable (Multi-dimensional Tables)
Manage Bitable apps, tables, fields, views, and records (bulk ops up to 500 at a time)
Upload attachments to Bitable fields
Wiki (Knowledge Base)
List, search, create, rename, move, copy, and delete Wiki spaces and nodes
Resolve Wiki nodes to their underlying resource types
Drive (Cloud Storage)
List files, create folders, upload, copy, move, and delete files
Calendar
List calendars/events, create/update/delete events, respond to invitations, query free/busy times
Tasks
List, create, update, complete, and delete tasks; manage assignees and followers
OKR
List user OKRs and periods, get full OKR details, add/list/delete progress records
Real-time Events
Receive live Feishu events (e.g., new messages) via WebSocket with machine-level single-owner delivery across all MCP processes
Diagnostics & Multi-Account
Manage multiple identity profiles, check auth/session status, manage resource hints for auto-switching
feishu-user-plugin
中文 · English · Docs · CHANGELOG · npm
飞书 / Lark MCP 服务器,覆盖 IM、文档、多维表格、知识库、云空间、日历、任务 v2、OKR、实时事件。84 tools · 3 auth layers · 9 MCP prompts · MIT licensed · Node ≥18。
兼容 Claude Code、Codex、Cursor、Windsurf、VS Code、Claude Desktop、OpenClaw 等 MCP 客户端。
与其他飞书 MCP 的区别:基于 cookie + protobuf 协议路径,支持以用户本人身份发消息——飞书官方开放 API 没有 send_as_user 权限点,机器人 token 发出的消息一律标 sender_type: "app"。
三层鉴权
鉴权层 | 凭证 | 覆盖能力 | 工具数 |
用户身份(cookie + protobuf) |
| 以用户身份发文本 / 图片 / 文件 / 富文本 / @ / 批量 | 8 |
官方 API(机器人) |
| 群消息读写、文档、多维表格、知识库、云空间、日历、任务 v2、OKR、联系人、实时事件 WS | 70+ |
用户 OAuth UAT |
| P2P 私聊读取、用户 chat 列表;写入文档 / Bitable / 日历 资源时以用户为 owner | 2 显式 + 全工具 UAT-first |
三层独立 —— 配置任意一层,对应工具可用。
Related MCP server: lark-hermes-mcp
安装
npx feishu-user-plugin setup --app-id <APP_ID> --app-secret <APP_SECRET>
npx feishu-user-plugin oauth # 拿用户 OAuth UAT
# 重启 Claude Code / Codexcookie 获取:跟 Claude Code 说一句"帮我设置飞书 cookie"会自动经 Playwright 扫码登录抓取;手动方式在 feishu.cn DevTools Network 标签从请求头 Cookie 整行复制(不要用 document.cookie 或 Application > Cookies 标签—— HttpOnly 的 session / sl_session 拿不到)。
没有 APP_ID / SECRET 见下面 创建飞书应用。
用法
你:帮我以我身份给王小明发:今天的代码 review 我看完了,有 3 个 nit
Claude:[调用 send_to_user] Sent你:总结"工程组"群今天 9 点之后的讨论,发个日报到 #日报频道
Claude:[read_messages → 总结 → send_to_group] Sent创建飞书应用
LARK_APP_ID / LARK_APP_SECRET 是用 Official API(70+ 工具)的前置条件:
飞书开放平台 登录 → 创建自建应用(不能选商店应用 / 第三方应用,否则 P2P 读取会被锁)
添加应用能力 → 启用机器人
权限管理 → 添加 scope:
消息:
im:message、im:message:readonly、im:chat:readonly文档:
docx:document、bitable:record、wiki:wiki:readonly、drive:drive:readonly联系人:
contact:user.base:readonly按需:
okr:okr:readonly、calendar:calendar:readonly、task:task、drive:drive、docs:document.media:upload、wiki:wiki等
凭证与基础信息 → 复制 App ID(
cli_xxx)+ App Secret创建版本 → 提交审核 → 管理员审批
把 bot 加到要读消息的群里
工具索引(84 个)
完整工具列表 + 参数 + 跨域注意事项见 CLAUDE.md。
用户身份 —— 消息(cookie protobuf,8 个)
工具 | 说明 |
| 按名搜用户 + 发文本,一步完成 |
| 按名搜群 + 发文本,一步完成 |
| 按 chat ID 发文本,支持回复线程( |
| 以用户身份发图(v1.3.9) |
| 以用户身份发文件(需先 |
| 富文本:标题 + 段落 + @ + 超链 |
| 飞书交互卡片(机器人通道;cookie 通道服务端关闭,仅 bot 路径可用) |
| 一次发多条到不同 chat(text / image / file / post) |
用户身份 —— 联系人 / 信息(cookie,5 个)
工具 | 说明 |
| 搜用户 / bot / 群 |
| 创建或获取 P2P chat |
| 群详情(接受 |
| 用户名 / 头像查询 |
| 三层鉴权健康检查(实际跑一次 UAT 调用,不只看配置) |
用户 OAuth UAT —— P2P 读取(2 个)
工具 | 说明 |
| 读私聊历史(外部群自动 fallback) |
| 用户加入的所有群(仅群,不含 P2P;P2P 用 |
官方 API —— IM(15 个)
工具 | 说明 |
| 列 bot 加入的所有 chat |
| 读群消息(接受 chat 名 / |
| 机器人发消息 |
| 机器人回复 |
| 转发到其他 chat(自动识别 receive_id_type) |
| 撤回 / 删除 bot 消息 |
| 编辑已发消息(仅支持 text / interactive) |
| 表情回应 |
| 置顶 |
| 建群 / 改群 |
| 群成员 list / add / remove(注意 |
| 下载消息附件(image / file,> 2 MiB 必须 |
官方 API —— 文档(7 个)
工具 | 说明 |
| 关键词搜文档 |
| 结构化 JSON |
| v1.3.9 直接返回 markdown,~60% token 节省(适合 RAG / 总结) |
| 块树 |
| 创建文档(可选 |
| 块 create / update / delete(image_path / file_path / image_token / file_token 快捷) |
| 下载文档内嵌图片 |
官方 API —— 多维表格 Bitable(6 个,v1.3.7 整合)
工具 | actions | 说明 |
| create / copy / get_meta | 应用级(创建可指定 |
| list / create / update / delete | 数据表 CRUD |
| list / create / update / delete | 字段(update 必须传 |
| list / create / delete | 视图(grid / kanban / gallery / form / gantt / calendar) |
| search / get / create / update / delete | 记录 CRUD(数组:单条或最多 500) |
| — | 上传附件,返回 |
官方 API —— 知识库 Wiki(9 个)
工具 | 说明 |
| 列空间(UAT-first) |
| 搜知识库 |
| 列节点 |
| 节点 → obj_token 解析(接受 wiki node token 或 obj_token) |
| 创建节点(doc / sheet / bitable / mindnote / file / docx / slides) |
| 改名(内容编辑用 docx / bitable 工具) |
| 移动 |
| 深拷贝 |
| 删除 wiki 节点指针(底层 drive 资源用 |
官方 API —— 云空间 Drive(5 个)
工具 | 说明 |
| 列文件夹内文件 |
| 建文件夹 |
| copy / move / delete(必须传 |
| 上传图片 / 文件,返回 key |
| 上传到 Drive 文件夹(可选 |
官方 API —— OKR(6 个)
工具 | 说明 |
| 列指定用户的 OKR(必须传 user_id) |
| 批量取详情(objectives + key results + progress + alignments) |
| 列周期(季度 / 年度) |
| 添加进展记录(v1.3.7,需 |
| 列进展记录(从 |
| 删进展记录 |
官方 API —— 日历(8 个,写入 v1.3.7)
工具 | 说明 |
| 列日历(primary + 共享 + 订阅) |
| 列事件(指定时间窗) |
| 事件详情(参与人 / 地点 / 会议链接 / 附件) |
| 建事件(需 |
| 改事件 |
| 删事件(可选 |
| RSVP(accept / decline / tentative) |
| 多人 freebusy 查询 |
官方 API —— 任务 v2(7 个,v1.3.7 新域)
标识符是 task_guid(不是 v1 的 numeric task_id),需 task:task scope。
工具 | 说明 |
| 列当前用户任务 |
| 详情 |
| 建任务(summary 必填) |
| 改任务(必传 |
| 完成 / 取消完成 |
| 删 |
| add / remove 成员(assignee / follower) |
插件层 —— 诊断与多账号(4 个)
工具 | 说明 |
| 三层鉴权健康检查 |
| 列可用 profile(默认 + LARK_PROFILES_JSON / credentials.json) |
| 切 profile(缓存的 client 实例下次调用重建) |
| 查 / 改 / 清 自动切换缓存(list / set / clear) |
插件层 —— 实时事件(2 个,v1.3.9)
工具 | 说明 |
| 拉取增量事件(peek=true 不推进 cursor;filter by event_type / chat_id / since_seconds / profile) |
| info / reconnect / claim / rotate / reconfig(诊断 / 重连 / 抢锁 / 强制 events.jsonl 轮转 / 不重启重新订阅) |
9 个 MCP prompts(slash commands)
Prompt | 说明 |
| 以用户身份发消息 |
| 读最近消息然后回 |
| 群 / P2P 最近消息总结 |
| 搜联系人 / 群 |
| 搜 / 读 / 建文档 |
| 操作多维表格 |
| 搜知识库 |
| 列云空间 / 建文件夹 |
| 检查三层鉴权状态 |
客户端配置
环境变量配置一致,配置文件路径和顶层键不同。
统一 env 块:
{
"command": "npx",
"args": ["-y", "feishu-user-plugin"],
"env": {
"LARK_COOKIE": "your-cookie-string",
"LARK_APP_ID": "cli_xxxxxxxxxxxx",
"LARK_APP_SECRET": "your-app-secret",
"LARK_USER_ACCESS_TOKEN": "your-uat",
"LARK_USER_REFRESH_TOKEN": "your-refresh-token"
}
}安放位置:
客户端 | 配置文件 | 顶层键 |
Claude Code |
|
|
Claude Desktop |
|
|
Codex |
|
|
Cursor |
|
|
VS Code (Copilot) |
|
|
OpenClaw |
|
|
Windsurf |
|
|
自动化设置:
npx feishu-user-plugin setup # 默认写 Claude Code (~/.claude.json)
npx feishu-user-plugin setup --client codex # Codex (~/.codex/config.toml)
npx feishu-user-plugin setup --client both # Claude Code + Codex 都写
npx feishu-user-plugin setup --activate # 激活当前 profile各客户端完整 JSON 模板见 README.en.md MCP Client Configuration 段。
多账号(v1.3.8 / v1.3.9)
~/.feishu-user-plugin/credentials.json 支持多 profile(默认 + 任意附加),单台机器一处配置覆盖多个飞书账号 / 多个企业。
npx feishu-user-plugin list-profiles
npx feishu-user-plugin switch-profile <name>
npx feishu-user-plugin keepalive --all # 跨 profile keepalive读路径工具(read_* / list_* / get_* / search_* / download_*)失败码 91403 / 1254301 / 1254000 / 99991672 / HTTP 403 时自动跨 profile retry。写路径不自动切(避免错号创建资源)。
单调用覆盖:传 via_profile: "<name>" 钉到指定 profile,传 via_profile: "auto" 给写路径开自动切换。
详见 CLAUDE.md "Multi-profile auto-switch" 段。
实时事件(v1.3.9 机器级 SSOT)
机器上单进程持有 WS owner 锁(~/.feishu-user-plugin/ws-owner.lock,O_CREAT|O_EXCL,30s stale),所有 MCP 进程共享 ~/.feishu-user-plugin/events.jsonl(10 MB 软 / 20 MB 硬限自动轮转),events.cursor.json 是全机所有 harness 共享的 drain cursor —— 每条事件全机恰好一次。
mcp call manage_ws_status --action info # 谁在持锁、当前订阅、events.jsonl 大小
mcp call manage_ws_status --action claim --force true # 跨进程抢锁默认订阅 ["im.message.receive_v1"]。要订阅其他事件(审批 / 日历 / vc / etc),编辑 credentials.json::profiles[<active>].events,然后 manage_ws_status(action=reconfig) 不重启重新订阅。
仅支持 feishu.cn —— Lark 国际版(lark.com)的 WSClient 当前不支持。
工程细节
Token 生命周期
鉴权层 | Token | 有效期 | 续期 |
Cookie |
| 12h max-age | 4h 心跳自动刷新 |
App |
| 2h | SDK 自动管理 |
User OAuth |
| ~2h | refresh_token 自动刷新,写回 credentials.json |
Refresh Token | — | 7 天 |
|
crontab -e
# 0 */4 * * * npx feishu-user-plugin keepalive >> /tmp/feishu-keepalive.log 2>&1UAT 刷新失败 invalid_grant —— refresh token 过期 / 被撤销,重跑 npx feishu-user-plugin oauth 然后重启 Claude Code / Codex。
凭证存储(v1.3.7+)
单一可信源 ~/.feishu-user-plugin/credentials.json(mode 0600),多 harness 共享。schema 见 docs/CREDENTIALS-FORMAT.md。
npx feishu-user-plugin migrate # dry-run
npx feishu-user-plugin migrate --confirm # 真写自动 sync hooks
阶段 | 触发文件 | 作用 |
pre-commit |
| 同步到 |
pre-commit |
| 三角等价检查(version 必须一致) |
pre-commit |
| 工具个数 + README 84 tools 徽章必须一致 |
pre-commit |
| smoke test |
post-merge (main) | 任意 | 自动开 team-skills sync PR |
CI(.github/workflows/validate.yml)每个 PR 跑同样的 gate。
已知限制
Cookie 寿命:12-24 小时无心跳过期,需重新登录 feishu.cn 拿 cookie
协议变化:cookie + protobuf 层依赖飞书 web 客户端的协议,飞书更新可能失效(机器人能力不受影响)
卡片:cookie 通道发卡片服务端不可用,机器人通道可发
Lark 国际版:实时事件 WS 不支持
未实现:
search_messages(v1.3.10 计划)、md → wiki 同步(v1.3.10 主线)
完整 ROADMAP 见 ROADMAP.md。
贡献
Issues / PR 欢迎。提交前先看 CONTRIBUTING.md。
飞书改协议导致功能挂掉 —— 开 issue 带错误日志即可。
License
致谢
cv-cat/LarkAgentX —— 早期飞书 web 协议研究(Python)
cv-cat/OpenFeiShuApis —— 底层 API 研究
Model Context Protocol —— MCP 标准 + Anthropic / PulseMCP / GitHub / Stacklok 共维 registry
Available Tools
84 toolsadd_reactionA
[Official API] Add an emoji reaction to a message.
Inputs: message_id (required), emoji_type (required).
batch_sendA
[User Identity / Official API] Send the same or different content to multiple targets in one call. Each target dispatches sequentially with a small delay (anti-rate-limit) and reports per-target success/error. Identity is the cookie user (user-identity sends) unless target.via=bot. Use for broadcast / fan-out scenarios.
Inputs: targets (required), delay_ms.
complete_taskA
[Official API + UAT, v1.3.7] Mark a task complete (or uncomplete it). Convenience wrapper around update_task with completed_at.
Inputs: task_guid (required), completed.
copy_wiki_nodeA
[Official API] Deep-copy a Wiki node into a different location (and optionally a different space). Underlying resource is duplicated.
Inputs: space_id (required), node_token (required), target_parent_token, target_space_id, +1 more.
create_calendar_eventA
[Official API + UAT, v1.3.7] Create a new calendar event. Requires calendar:calendar.event:write scope (re-run npx feishu-user-plugin oauth after enabling). The current identity (UAT-first) must have writer or owner permission on the calendar.
Time fields: A time object: {timestamp:"", timezone?:"Asia/Shanghai"} OR {date:"YYYY-MM-DD"} for all-day events.
Inputs: calendar_id (required), summary (required), start_time (required), end_time (required), +8 more.
create_docA
[Official API] Create a new Feishu document. Can place directly under a Wiki space by passing wiki_space_id (optionally wiki_parent_node_token for nested placement) — the plugin creates the doc in drive then attaches it as a Wiki node.
Inputs: title (required), folder_id, wiki_space_id, wiki_parent_node_token.
create_folderC
[Official API] Create a new folder in Drive.
Inputs: name (required), parent_token.
create_groupB
[Official API] Create a new group chat (as bot). Can add initial members.
Inputs: name (required), description, user_ids.
create_okr_progress_recordA
[Official API + UAT, v1.3.7] Add a progress note to an OKR objective or key result. Feishu requires source_title, source_url, and a block-structured content; this tool exposes a simple content_text and auto-wraps it into the single-paragraph block format. Pass richer content directly if you need lists / mentions / docs links / images.
Inputs: target_id (required), target_type (required), content_text, content, +7 more.
create_p2p_chatA
[User Identity] Create or get a P2P (direct message) chat. Returns numeric chat_id.
Inputs: user_id (required).
create_taskB
[Official API + UAT, v1.3.7] Create a new task. summary is required; due / members / etc. are optional.
Inputs: summary (required), description, due, members, +2 more.
create_wiki_nodeA
[Official API] Create a new Wiki node inside a space. obj_type picks the underlying resource (doc/sheet/bitable/mindnote/file/docx/slides). UAT-first so the resource is owned by the user.
Inputs: space_id (required), obj_type (required), title, parent_node_token, +2 more.
delete_calendar_eventC
[Official API + UAT, v1.3.7] Delete a calendar event. Requires calendar:calendar.event:write scope.
Inputs: calendar_id (required), event_id (required), need_notification, meeting_chat_id.
delete_messageA
[Official API] Recall/delete a message (bot can only delete its own messages).
Inputs: message_id (required).
delete_okr_progress_recordA
[Official API + UAT, v1.3.7] Delete an OKR progress record by its progress_id (from list_okr_progress_records).
Inputs: progress_id (required).
delete_reactionB
[Official API] Remove an emoji reaction from a message.
Inputs: message_id (required), reaction_id (required).
delete_taskA
[Official API + UAT, v1.3.7] Permanently delete a task.
Inputs: task_guid (required).
delete_wiki_nodeA
[Official API, v1.3.7] Delete a Wiki node. Calls DELETE /open-apis/wiki/v2/spaces/{space_id}/nodes/{node_token}. The Feishu SDK does not type this endpoint, so the call goes through raw REST (UAT-first; bot fallback uses client.request). The underlying drive resource (docx / sheet / bitable / file) is NOT deleted — Feishu treats wiki nodes as pointers. To delete the actual resource as well, follow up with manage_drive_file(action=delete, type=<obj_type>, file_token=<obj_token>) (use get_wiki_node first to get obj_type / obj_token).
Inputs: space_id (required), node_token (required).
download_doc_imageA
[User Identity / Official API] Download an image embedded in a docx document so the model can see it. Pass the image_token from get_doc_blocks (block.image.token), and optionally the doc/wiki/URL token to scope the lookup. UAT-first.
Size cap: payloads > 2 MiB MUST pass save_path.
Inputs: image_token (required), doc_token, save_path.
download_message_resourceA
[User Identity / Official API] Download an image or file attached to a message so the model can see / store it. v1.3.7 (C2.4) consolidates the v1.3.6 download_image (mode 1) + download_file. UAT-first, falls back to app.
For images, the response includes an inline image content block so the model sees pixels. For files, the response includes the bytes as base64 (truncated for display) plus an optional save_path write.
Size cap: payloads > 2 MiB MUST pass save_path. The Anthropic API rejects responses > 5 MB; we cap at 2 MiB so multipart wrapping has headroom.
merge_forward children: Feishu keys media by the parent merge_forward id, not the child id. Use the child's parentMessageId field (returned by read_messages with expand_merge_forward) — not the child id.
Inputs: message_id (required), key (required), kind (required), save_path.
forward_messageA
[Official API] Forward a message to another chat or user. receive_id may be a group chat_id (oc_xxx), an open_id (ou_xxx), a union_id, a user_id, or an email — set receive_id_type to match (default: chat_id).
Inputs: message_id (required), receive_id (required), receive_id_type.
get_calendar_eventA
[Official API + UAT] Get full details of a single calendar event (summary, description, start/end, attendees, location, attachments, meeting link).
Inputs: calendar_id (required), event_id (required).
get_chat_infoA
[Official API + User Identity fallback] Get chat details: name, description, member count, owner. Supports both oc_xxx and numeric chat_id.
Inputs: chat_id (required).
get_doc_blocksA
[Official API] Get structured block tree of a document. Returns block types, content, and hierarchy for precise document analysis.
Inputs: document_id (required).
get_freebusyA
[Official API + UAT, v1.3.7] Query freebusy windows for one or more users in a time range. Use to find a meeting slot. Requires calendar:calendar:readonly (already in default scope set).
Inputs: time_min (required), time_max (required), user_ids (required), room_ids, +2 more.
get_login_statusA
Check cookie session validity and app credentials status. Also refreshes session.
Inputs: no named parameters.
get_new_eventsA
[Plugin v1.3.9] Drain real-time events from the machine-level shared event log. v1.3.8 used per-process in-memory buffers (with duplicate-event problem); v1.3.9 uses ~/.feishu-user-plugin/events.jsonl with a single global cursor — every event delivered exactly once across all MCP processes on this machine. Default returns events from the current active profile only; pass profile="*" to see all.
Inputs: event_type, event_types, chat_id, since_seconds, +3 more.
get_okrsB
[Official API + UAT] Batch-fetch full OKR details (objectives, key results, progress, alignments) by OKR IDs.
Inputs: okr_ids (required), user_id_type, lang.
get_taskA
[Official API + UAT, v1.3.7] Get full details of a single task by GUID.
Inputs: task_guid (required).
get_user_infoA
[User Identity] Look up a user's display name by user ID.
Inputs: user_id (required), chat_id.
get_wiki_nodeA
[Official API] Resolve a Wiki node token to its underlying object (docx / bitable / sheet / mindnote / file). Returns obj_type + obj_token + space_id so you can read/write the real resource via the usual docx / bitable tools. Accepts bare wiki node token (wikcnXXX), an underlying obj_token (docxXXX / bascnXXX from search_wiki), or a full Feishu /wiki/ URL — the handler tries the wiki endpoint first and falls back to a synthesized node-shape for non-wiki tokens.
Inputs: node_token (required).
list_calendar_eventsA
[Official API + UAT] List events in a calendar within an optional time range. Typical usage: first list_calendars to find calendar_id (primary calendar has type="primary"), then list events in e.g. [now, now+7d] (Unix seconds).
Inputs: calendar_id (required), start_time, end_time, page_size, +2 more.
list_calendarsA
[Official API + UAT] List the current user's calendars (primary + shared + subscribed). Requires UAT — app identity only sees calendars it was explicitly invited to. Requires calendar:calendar:readonly scope on the OAuth.
Inputs: page_size, page_token, sync_token.
list_chatsA
[Official API] List all chats the bot has joined. Returns chat_id, name, type.
Inputs: page_size, page_token.
list_filesB
[Official API] List files in a Drive folder.
Inputs: folder_token.
list_membersC
[Official API] List all members in a group chat.
Inputs: chat_id (required), page_size, page_token.
list_okr_periodsA
[Official API + UAT] List OKR periods (quarters / years) defined in the tenant. Use period_ids from this to filter list_user_okrs.
Inputs: page_size, page_token.
list_okr_progress_recordsA
[Official API + UAT, v1.3.7] List progress records for an OKR. Feishu has no native list endpoint — this tool calls get_okrs internally and walks the objective_list / kr_list to extract progress_record IDs (with their target_id and target_type). To read a record's full content, you currently need progressRecord.get (not yet wrapped).
Inputs: okr_id (required), user_id_type.
list_profilesA
[Plugin] List all available identity profiles (each profile has its own LARK_COOKIE / APP_ID / APP_SECRET / UAT). v1.3.9 SSOT: profiles live in ~/.feishu-user-plugin/credentials.json::profiles. Legacy fallback: LARK_PROFILES_JSON env var. Marks the currently active profile.
Inputs: no named parameters.
list_tasksA
[Official API + UAT, v1.3.7] List the current user's tasks. Filter by completion or type.
Inputs: completed, type, page_size, page_token.
list_user_chatsA
[User UAT] List group chats the user is in. Note: only returns groups, not P2P. For P2P chats, use search_contacts → create_p2p_chat → read_p2p_messages. Requires OAuth setup.
Inputs: page_size, page_token.
list_user_okrsA
[Official API + UAT] List a user's OKRs. Requires the user's open_id (get yours via get_login_status or search_contacts). Filter by period_ids to narrow to a specific quarter.
Inputs: user_id (required), user_id_type, period_ids, offset, +2 more.
list_wiki_nodesB
[Official API] List nodes in a Wiki space.
Inputs: space_id (required), parent_node_token.
list_wiki_spacesB
[Official API] List all accessible Wiki spaces.
Inputs: no named parameters.
manage_bitable_appA
[Official API] Manage a Bitable app. action=create (new app, optional wiki_space_id to attach), copy (duplicate an existing app), get_meta (read app metadata).
Inputs: action (required), app_token, name, folder_id, +2 more.
manage_bitable_fieldA
[Official API] Manage fields (columns) inside a Bitable table. action=list, create, update (Feishu requires type even when only renaming), delete.
Inputs: action (required), app_token (required), table_id (required), field_id, +3 more.
manage_bitable_recordA
[Official API] Manage records (rows) inside a Bitable table. action=search, get, create, update, delete. create/update/delete accept arrays — single record or up to 500.
Inputs: action (required), app_token (required), table_id (required), record_id, +5 more.
manage_bitable_tableA
[Official API] Manage a table inside a Bitable app. action=list, create (with optional initial fields), update (rename), delete.
Inputs: action (required), app_token (required), table_id, name, +1 more.
manage_bitable_viewA
[Official API] Manage views inside a Bitable table. action=list, create, delete. (Feishu open API does not expose view update — recreate with a new name to change.)
Inputs: action (required), app_token (required), table_id (required), view_id, +2 more.
manage_doc_blockA
[Official API] Manage content blocks in a document. Single tool replaces v1.3.6 create_doc_block / update_doc_block / delete_doc_blocks.
action=create — five modes:
(A) Generic — pass children array (e.g. [{block_type:2, text:{...}}]).
(B) Image from local file — pass image_path; plugin uploads and patches.
(C) Image from token — pass image_token (already uploaded).
(D) File attachment from local file — pass file_path; plugin handles VIEW-wrap + replace_file.
(E) File from token — pass file_token.
action=update — generic (pass update_body), image-replace (pass image_token), or file-replace (pass file_token).
action=delete — pass parent_block_id + start_index + end_index (range delete).
document_id accepts native ID, wiki node token, or Feishu URL.
Inputs: action (required), document_id (required), block_id, parent_block_id, +9 more.
manage_drive_fileA
[Official API] Manage a Drive file/doc/folder. action=copy (duplicate to a new name + folder), move (relocate, returns task_id), delete (remove, returns task_id). type is always required (Feishu rejects with 1061002 / 1062501 otherwise).
Inputs: action (required), file_token (required), type (required), name, +1 more.
manage_membersA
[Official API] Add or remove members from a group chat. The Feishu API rejects with code 9499 when the IDs in member_ids do not match member_id_type — pass member_id_type explicitly when using union_id or user_id (default: open_id).
Inputs: chat_id (required), member_ids (required), action (required), member_id_type.
manage_profile_hintsA
[Plugin v1.3.8] Inspect / set / clear profileHints — the resourceKey → profileName cache the auto-switch middleware uses to remember which profile owns each Feishu resource. Useful when a hint goes stale (e.g., a profile lost access to a doc).
Inputs: action (required), resource_key, profile.
manage_task_membersB
[Official API + UAT, v1.3.7] Add or remove members on a task. Members are objects {id:"<open_id>", role:"assignee"|"follower", type?:"user", name?:""}.
Inputs: action (required), task_guid (required), members (required).
manage_ws_statusA
[Plugin v1.3.9] Inspect or control the machine-level WS owner. Actions: info (status dump), reconnect (owner-only; restart WS), claim (try become owner; force=true to steal active lock), rotate (owner-only; force events.jsonl rotation), reconfig (owner-only; re-read credentials.json + apply event subscriptions).
Inputs: action (required), force.
move_wiki_nodeA
[Official API] Move a Wiki node to a different parent (within the same space) or to a different space. Pass at least one of target_parent_token / target_space_id.
Inputs: space_id (required), node_token (required), target_parent_token, target_space_id.
pin_messageB
[Official API] Pin or unpin a message in a chat.
Inputs: message_id (required), pinned.
read_docA
[Official API] Read the raw text content of a Feishu document.
Inputs: document_id (required).
read_doc_markdownA
[Plugin v1.3.9] Read a Feishu doc as Markdown (vs get_doc_blocks JSON). Saves ~60% tokens for RAG / digest / summarisation use cases. Accepts native docx token, wiki node token, or full Feishu URL. Embedded images / files appear as feishu://image_token/ placeholders — call download_doc_image for the binary if needed.
Inputs: document_id (required).
read_messagesA
[Official API + UAT fallback] Read message history from any group. Accepts oc_xxx ID, numeric ID, or chat name (auto-searched). Auto-falls back to UAT for external groups the bot cannot access. Returns newest messages first by default, with sender names resolved. Auto-expands merge_forward messages into their child messages (with original sender / time / content preserved) by default — disable with expand_merge_forward=false. Text messages have URLs extracted into urls; Feishu doc links are additionally surfaced as feishuDocs so agents can feed them straight into read_doc / get_doc_blocks.
Inputs: chat_id (required), page_size, start_time, end_time, +2 more.
read_p2p_messagesA
[User UAT] Read P2P (direct message) chat history using user_access_token. Works for chats the bot cannot access. Returns newest messages first by default. Auto-expands merge_forward messages into their child messages by default — disable with expand_merge_forward=false. Requires OAuth setup.
Inputs: chat_id (required), page_size, start_time, end_time, +2 more.
reply_messageA
[Official API] Reply to a specific message by message_id (as bot). Only works for text messages; other types return error 230054.
Inputs: message_id (required), text (required).
respond_calendar_eventB
[Official API + UAT, v1.3.7] Respond to an event invitation. The current identity must be in the event's attendee list. Requires calendar:calendar.event:write scope.
Inputs: calendar_id (required), event_id (required), rsvp_status (required).
search_contactsA
[User Identity] Search Feishu users, bots, or group chats by name. Returns IDs.
Inputs: query (required).
search_docsA
[Official API] Search Feishu documents by keyword.
Inputs: query (required).
search_wikiB
[Official API] Search Wiki nodes by keyword.
Inputs: query (required).
send_as_userA
[User Identity] Send a text message as the logged-in Feishu user. Supports reply threading and real @-mentions (triggers push notifications).
Inputs: chat_id (required), text (required), ats, root_id, +1 more.
send_card_as_userA
[v1.3.9+: bot-only] Send an interactive Feishu card to a chat via bot identity (Official API). User-identity cookie protobuf path is server-side disabled at the auth tier — confirmed by exhaustive brute-force in v1.3.9, see scripts/explore-card-protobuf.js. The "as_user" suffix is historical naming kept for backward compat; the tool always routes through bot. Pass card as a JSON object (Feishu card schema, see https://open.feishu.cn/cardkit).
Inputs: chat_id (required), card (required).
send_file_as_userA
[User Identity] Send a file as the logged-in user. Requires file_key (upload via Official API first).
Inputs: chat_id (required), file_key (required), file_name (required), root_id.
send_image_as_userA
[User Identity, v1.3.9] Send an image as the logged-in user (NOT bot). Requires image_key from a prior upload_image call. Cookie-protobuf wire format requires both imageKey + thumbnailKey — when no separate thumbnail is provided, plugin defaults thumbnailKey to imageKey (Feishu accepts this for messenger-uploaded images). Width/height/mime/size are optional metadata; Feishu auto-derives display sizing on its side.
Inputs: chat_id (required), image_key (required), thumbnail_key, width, +4 more.
send_message_as_botA
[Official API] Send a message as the bot to any chat. Supports text, post, interactive, etc. This is the reliable path for @-mentions: include <at user_id="ou_xxx">Name</at> inline in text content and Feishu resolves it to a real @-notification.
Inputs: chat_id (required), msg_type (required), content (required).
send_post_as_userA
[User Identity] Send a rich text (POST) message with title and formatted paragraphs. Supports real @-mentions that trigger notifications.
Inputs: chat_id (required), paragraphs (required), title, root_id.
send_to_groupB
[User Identity] Search group by name → send text message. All in one step.
Inputs: group_name (required), text (required), ats.
send_to_userA
[User Identity] Search user by name → create P2P chat → send text message. All in one step.
Inputs: user_name (required), text (required), ats.
switch_profileA
[Plugin v1.3.9] Switch the active identity profile. Atomically writes credentials.json::active; cached clients in this process are invalidated; cross-process MCPs (Codex / another Claude Code) auto-sync via dispatcher mtime check on next tool call (~10μs). To add a new profile, run npx feishu-user-plugin setup --profile <name> --app-id ... --app-secret ... --cookie ... then npx feishu-user-plugin oauth --profile <name> for UAT.
Inputs: name (required).
update_calendar_eventA
[Official API + UAT, v1.3.7] Patch fields on an existing calendar event. Pass only the fields you want to change. Requires calendar:calendar.event:write scope.
Inputs: calendar_id (required), event_id (required), summary, description, +9 more.
update_groupB
[Official API] Update group chat name or description.
Inputs: chat_id (required), name, description.
update_messageA
[Official API] Edit a sent message (bot can only edit its own messages). Feishu supports edit only for text and interactive (card) messages — other types (post, image, file, etc.) are rejected by the API.
Inputs: message_id (required), msg_type (required), content (required).
update_taskB
[Official API + UAT, v1.3.7] Patch a task. update_fields is required by Feishu — list which fields to update (e.g. ["summary","due","completed_at"]).
Inputs: task_guid (required), update_fields (required), task (required).
update_wiki_nodeA
[Official API] Rename a Wiki node (only title is updatable via the wiki API; the underlying resource content is edited via docx/bitable/sheet tools).
Inputs: space_id (required), node_token (required), title (required).
upload_bitable_attachmentA
[Official API] Upload a file as a Bitable attachment (drive/v1/medias/upload_all with parent_type=bitable_image or bitable_file). Returns file_token suitable for writing into a Bitable Attachment-type field via batch_create/update_bitable_records (the field value should be [{file_token}]).
Inputs: app_token (required), file_path (required), kind.
upload_drive_fileA
[Official API] Upload a file from disk to a Feishu Drive folder (drive/v1/files/upload_all, parent_type=explorer). Returns file_token + url. If wiki_space_id is provided, the uploaded file is then attached to that Wiki space via move_docs_to_wiki (obj_type=file). UAT-first with app fallback.
Inputs: file_path (required), folder_token (required), wiki_space_id, wiki_parent_node_token.
upload_fileA
[Official API] Upload a file to Feishu. Returns file_key for use with send_file_as_user.
Inputs: file_path (required), file_type, file_name.
upload_imageA
[Official API] Upload an image file to Feishu. Returns image_key for use with send_image_as_user.
Inputs: image_path (required), image_type.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 84 tools
While most tools target distinct resource-action pairs, there is notable overlap among send tools (e.g., send_as_user, send_message_as_bot, send_to_group) and some wrapper tools that combine search+send, creating ambiguity for an agent.
Tool names mostly follow a consistent verb_noun snake_case pattern, with minor exceptions like 'send_card_as_user' and 'send_message_as_bot' that deviate slightly from the pattern but remain readable.
84 tools is far beyond the typical well-scoped range of 3-15. While the server covers a broad domain, the sheer number makes it heavy and harder for an agent to navigate efficiently.
The server offers comprehensive coverage of Feishu's API surface, including messaging, calendar, tasks, wiki, bitable, drive, docs, OKRs, and profiles with full CRUD operations and no obvious gaps for common workflows.
Maintenance
Related MCP Connectors
One MCP endpoint for Claude, GPT & Gemini: 100+ tools + no-code connectors + agent workers.
Marketo MCP server for AI. 130 tools to operate Marketo from Claude, Cursor, or ChatGPT.
Hosted Slack MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
Remote streamable-HTTP MCP server running on a single Cloudflare Worker. Your assistant gets live Airbnb, Amazon, Booking.com, Google Flights, Maps and Reddit data, social search on X, Instagram and TikTok, the Meta Ad Library, and image/video generation without any keys. Connect your own accounts to let it send WhatsApp or Telegram messages, work an IMAP inbox, manage Meta Ads campaigns and publish to X and LinkedIn. OAuth 2.1 with PKCE; stored credentials are AES-256-GCM encrypted.
Related MCP Servers
- -licenseNot gradedqualityNot gradedmaintenanceA tool designed to help users connect AI Agents with the Feishu/Lark platform, encapsulating Feishu/Lark Open Platform API interfaces as MCP tools for document processing, conversation management, calendar scheduling and more.33,913 npm-
- AlicenseBqualityDmaintenanceAn MCP server that exposes Feishu/Lark capabilities as function tools to MCP-compatible agents like Hermes and Claude Desktop. It provides 57 tools for messaging, document management, calendar operations, and task management through both hand-written fallback tools and bridged OpenClaw SDK functionality.532MIT
- AlicenseNot gradedqualityDmaintenanceMCP server that pushes Feishu (Lark) messages to Claude Code sessions and allows Claude to reply directly in Feishu.2MIT
- AlicenseNot gradedqualityCmaintenanceMCP server for Feishu/Lark API integration, enabling AI agents to send messages, manage groups, create and edit documents and spreadsheets, and search knowledge bases.MIT