lark-calendar
larksuite/cli
Manage Lark calendar events and meeting rooms: view, create, update events, check availability, and book rooms.
What is lark-calendar?
lark-calendar is a skill for coding agents that enables full management of Lark (Feishu) calendar events and meeting rooms via the lark-cli tool. It supports viewing and searching events, creating and updating events with attendees, querying free/busy status, finding available time slots, and booking meeting rooms. It does not handle past video meeting records (use lark-vc) or task management (use lark-task).
- View and search calendar events by keyword, time range, or attendee
- Create new calendar events with attendees using ISO 8601 timestamps
- Update existing events: modify fields, add/remove attendees or meeting rooms
- Query free/busy status and RSVP state for users' primary calendars
- Find available meeting rooms for specific confirmed time slots
- Get AI-suggested available time blocks when meeting time is not yet determined
How to install lark-calendar
npx skills add null --skill lark-calendar- lark-cli must be installed and available in PATH
- Lark authentication configured (see lark-shared SKILL.md for auth and permissions)
- User-level identity (--as user) required; bot identity cannot access user calendars
- Read lark-calendar-schedule-meeting.md reference before any booking or room search operation
How to use lark-calendar
- 1.Install the skill: npx skills add null --skill lark-calendar
- 2.Ensure lark-cli is installed and authenticated with user credentials
- 3.For any meeting scheduling or room booking task, read the lark-calendar-schedule-meeting.md reference first
- 4.Use +agenda shortcut to view today's or a specific day's events
- 5.Use +search-event to find events by keyword or time range
- 6.Use +create to create a new event, or +update to modify an existing one
- 7.Use +suggestion to get recommended time slots, then +room-find to find available rooms for a confirmed slot
- 8.Use +freebusy to check attendee availability before scheduling
Use cases
- Schedule a new meeting and invite specific colleagues
- Check what events are on a user's calendar today or this week
- Find an available meeting room for a 1-hour slot tomorrow afternoon
- Update an existing recurring event instance to change the time or add attendees
- Reply to a calendar event invitation (accept, decline, or tentative)
- Developers building Lark workspace automation agents
- Teams using Claude Code or Cursor with Lark (Feishu) integrations
- Agents that need to schedule, modify, or query calendar events programmatically
- Workflows requiring meeting room booking as part of event creation
lark-calendar FAQ
Bot identity can only access the bot's own (empty) calendar. Always use --as user to query a user's calendar events.
No. +room-find requires a confirmed time block. If the time is not yet determined, use +suggestion first to get recommended slots, then pass those to +room-find.
You must first locate the specific instance's event_id. Using the original recurring event ID is prohibited for instance-level edits.
Use +meeting to get the meeting_id from the event, then use lark-vc skill to retrieve historical meeting data.
No. Adding a meeting room is incremental by default and preserves existing rooms. Only explicitly saying 'replace' or 'remove' the room will delete the old one.
Full instructions (SKILL.md)
Source of truth, from larksuite/cli.
name: lark-calendar version: 1.0.0 description: "飞书日历:管理日历日程和会议室。查看/搜索日程、创建/更新日程、管理参会人、查询忙闲和推荐时段、预定会议室。当用户需要查看日程安排、创建/修改会议、查询/预定会议室时使用。不负责:查询过去的视频会议记录(走 lark-vc)、待办任务(走 lark-task)。" metadata: requires: bins: ["lark-cli"] cliHelp: "lark-cli calendar --help"
calendar (v4)
开始前先读 ../lark-shared/SKILL.md(认证、权限处理)。
CRITICAL — 凡涉及预约日程/会议或查询/搜索会议室,第一步 MUST 读 references/lark-calendar-schedule-meeting.md。禁止跳过此步直接调用 API 或 Shortcut!
身份
日程操作默认使用 --as user(查看和管理当前用户的日程)。--as bot 只能访问 bot 自己的(空)日历,会拿到空结果——不要用 bot 身份查用户日程。
# BAD — bot 身份查用户日程,返回空列表
lark-cli calendar +agenda --as bot
# GOOD — user 身份查日程
lark-cli calendar +agenda --as user
Shortcuts
| Shortcut | 说明 |
|---|---|
+agenda | 查看日程安排(默认今天) |
+search-event | 按关键词、时间范围和参会人搜索日程, 仅返回 日程ID/主题/时间等信息,详情需走 events get |
+meeting | 通过日程事件 ID 获取关联的视频会议信息(meeting_id、meeting_note),日程开过视频会议才会有meeting_id |
+create | 创建日程并邀请参会人(ISO 8601 时间) |
+update | 更新既有日程字段,或独立增量添加/移除参会人和会议室 |
+freebusy | 查询用户主日历的忙闲信息和 RSVP 状态 |
+room-find | 针对一个或多个明确的时间块查找可用会议室(无明确时间时禁止直接调用,需先走 +suggestion) |
+rsvp | 回复日程(接受/拒绝/待定) |
+suggestion | 根据非明确时间或一段时间范围,推荐多个可用时间块方案 |
前置条件路由
| 场景 | 前置要求 |
|---|---|
| 预约日程/会议、查会议室 | 先读 lark-calendar-schedule-meeting.md |
| 编辑已有日程 | 先定位目标日程 event_id;若是重复性日程,必须定位到具体实例的 event_id(禁止使用原重复日程 ID) |
| 删除/修改后验证 | 等待 2 秒再查询(API 最终一致性),不要告知用户你等待了 |
| 调用任何 Shortcut | 先读其对应 reference 文档 |
核心概念
- 日程实例(Instance):重复性日程展开后的具体时间实例。操作重复日程的某次实例时,必须先定位该实例的
event_id,禁止使用原重复日程的event_id。 - 全天日程(All-day Event):只按日期占用、没有具体起止时刻的日程,结束日期是包含在日程时间内的。
- 时间块 vs 时间范围:时间块是具体确定的连续时间段(如
14:00~15:00),时间范围是泛指(如"今天下午")。+room-find必须基于确定时间块,不能基于模糊范围。 - 会议室(Room):"room"不是"房间",是"会议室"。会议室是日程的一种参与人(resource attendee),不能脱离日程单独预定。
- 日程会议 ID(Meeting ID):日程的历史视频会议 ID,在日程上开过视频会议才会有。
术语映射
用户日常说的"帮我约个日历""查一下今天的日历",实际意图是针对**日程(Event)**的创建或查询,而非操作日历(Calendar)容器本身。自动将口语化的"日历"意图映射为"日程"操作。
意图路由
| 用户意图 | 路由到 |
|---|---|
| 查询过去的会议("昨天的会议""上周的会") | ../lark-vc/SKILL.md(会议数据含即时会议,仅查日程会遗漏) |
| 查询日历/日程或未来时间的会议 | 本 skill |
| 按关键词搜索日程 | 本 skill(+search-event) |
| 从日程获取关联的视频会议 ID 或用户绑定的会议纪要文档 | 本 skill(+meeting) |
| 从日程进一步拿 AI 智能纪要 / 逐字稿 / 妙记产物 | 先 +meeting 取 meeting_id,再 vc +detail → note +detail / minutes +detail |
| 预约/改约日程、添加/移除参会人、添加/更换会议室、调整时间 | 先判断新建 vs 编辑,再进入 schedule-meeting 工作流 |
任务类型分流
处理"预约/改约日程、添加/移除参会人、添加/更换会议室、调整时间"时,必须先判断新建 vs 编辑:
- 编辑已有日程的强信号:用户提到已存在的日程锚点(标题、时间段、
这个日程、这场会)并表达修改动作(添加、移除、改到、换会议室、调整时间)。默认走编辑流,绝不能按新建处理。 - 新建日程:用户表达新增意图("新约一个会""创建一个日程""安排一次会议"),且没有指向既有日程的修改动作。
时间推断规范
- 星期的定义:周一是一周的第一天,周日是最后一天。计算"下周一"等相对日期时,基于当前真实日期推算。
- 一天的范围:用户提到"明天""今天"等泛指某天时,时间范围应覆盖整天,不要自行缩减。
- 历史时间约束:不能预约已经完全过去的时间。唯一例外是"跨越当前时间"的日程(开始在过去、结束在未来)。
会议室规则
- 凡是"预定/查询/搜索可用会议室",都必须进入 schedule-meeting 工作流。
+room-find的时间输入必须是确定时间块,不能是时间区间搜索。- 用户仅要求"查会议室"但未提供明确时间时,必须先调用
+suggestion获取可用时间块,再将时间块交给+room-find。严禁猜测时间盲目调用。 - 编辑已有日程时,"添加会议室"默认是增量语义,保留已有会议室;只有用户明确说"更换会议室""移除会议室"时才删除旧会议室。
API Resources
lark-cli calendar <resource> <method> [flags]
calendars
create— 创建共享日历delete— 删除共享日历get— 查询日历信息list— 查询日历列表patch— 更新日历信息primary— 查询用户主日历search— 搜索日历
event.attendees
batch_delete— 删除日程参与人create— 添加日程参与人list— 获取日程参与人列表
events
create— 创建日程delete— 删除日程get— 获取日程instance_view— 查询日程视图patch— 更新日程share_info— 获取日程分享链接
freebusys
list— 查询主日历日程忙闲信息
不在本 skill 范围
注意(强制性):
- 涉及日期(时间)字符串与时间戳的相互转换时,务必调用系统命令或脚本代码等外部工具进行处理,以确保转换的绝对准确。违者将导致严重的逻辑错误!
Related skills
More from larksuite/cli and the wider catalog.
lark-doc
飞书云文档(Docx / Wiki 文档):读取和编辑飞书文档内容。当用户给出文档 URL 或 token,或需要查看、创建、编辑文档、插入或下载文档图片附件时使用。文档中嵌入的电子表格、多维表格、画板,先用本 skill 提取 token 再切到对应 skill。当用户给出 doubao.com 的 /docx/ 或 /wiki/ URL/token 时,也应直接使用本 skill;路由依据是 URL 路径模式和 token,而不是域名。不负责文档评论管理,也不负责表格或 Base 的数据操作。
lark-base
飞书多维表格(Base)操作:建表、字段、记录、视图、统计、公式/lookup、表单、仪表盘、workflow、角色权限;遇到 Base/多维表格/bitable 或 /base/ 链接时使用。文件导入转 lark-drive,认证/授权转 lark-shared。
lark-im
飞书即时通讯:收发消息和管理群聊。发送和回复消息、搜索聊天记录、管理群聊成员、上传下载图片和文件(支持大文件分片下载)、管理表情回复、发送应用内/短信/电话加急、发送和处理交互卡片(Interactive Card)、监听卡片按钮回调(card.action.trigger)。当用户需要发消息、查看或搜索聊天记录、下载聊天中的文件、查看群成员、搜索群、创建群聊或话题群、管理标记数据、管理 Feed 置顶(添加/移除/查询置顶会话)、管理标签数据、处理卡片回调时使用。
lark-drive
飞书云空间(云盘/云存储):管理 Drive 文件和文件夹,包含上传/下载、创建文件夹、复制/移动/删除、查看元数据、评论/权限/订阅、标题、版本和本地文件导入。用户需要整理云盘目录、处理云空间资源 URL/token,或导入 Word/Markdown/Excel/CSV/PPTX/.base 为 docx/sheet/bitable/slides 时使用;doubao.com 云空间 URL/token 也按资源路径和 token 路由,不回退 WebFetch。不负责:文档内容编辑(走 lark-doc)、表格/Base 表内数据操作(走 lark-sheets/lark-base)、知识空间节点/成员管理(走 lark-wiki)、原生 Markdown 文件读写/patch/diff(走 lark-markdown)。
lark-shared
Use for lark-cli setup/auth tasks: auth login/status/logout, user vs bot identity, business-domain permissions (--domain, including all/docs/drive), missing scopes, revoking authorization, or handling _notice JSON.
lark-wiki
飞书知识库:管理知识空间、空间成员和文档节点。创建和查询知识空间、查看和管理空间成员、管理节点层级结构、在知识库中组织文档和快捷方式。当用户需要在知识库中查找或创建文档、浏览知识空间结构、查看或管理空间成员、移动或复制节点时使用。当用户给出 doubao.com 的 /wiki/ URL/token 时,也应直接使用本 skill,不要因为域名不是飞书而回退到 WebFetch;路由依据是 URL 路径模式和 token,而不是域名。不负责:上传文件到知识库节点下(走 lark-drive)、编辑文档/表格/Base 内容(走 lark-doc / lark-sheets / lark-base)。