lark-calendar
SkillCommunityTranslated from ChineseThis skill provides comprehensive management for Lark calendars and events. It supports searching, creating, and updating events, managing attendees, checking availability, and booking meeting rooms.
npx skills add open.feishu.cn/lark-calendarcalendar (v4)
CRITICAL, Before starting, you MUST use the Read tool to read ../lark-shared/SKILL.md, which contains information on authentication and permission handling.
CRITICAL, Before executing any Shortcuts, you must use the Read tool to read their corresponding documentation. Do not call commands blindly.
CRITICAL, For any tasks involving "scheduling meetings/events" or "querying/searching for meeting rooms," the first step MUST be to use the Read tool to read references/lark-calendar-schedule-meeting.md. Skipping this step to call an API or Shortcut directly is prohibited!
CRITICAL, Terminology constraint: When users say things like "help me schedule a calendar" or "check today's calendar," their actual intent is usually to create or query an Event, not to operate on the Calendar container itself. Please automatically map colloquial "calendar" intents to "event" operations (e.g., +create, +agenda).
CRITICAL, Intent routing for meetings and events:
- Querying past meetings: If a user explicitly queries past meetings (e.g., "yesterday's meeting," "last week's meeting"), prioritize using
../lark-vc/SKILL.mdto search meeting records. This is because meeting data includes not only meetings initiated from events but also instant meetings; querying only event data will result in incomplete information. - Querying calendars/events or future meetings: If the user explicitly expresses "calendar," "event," or involves future arrangements, it falls under the business domain of this skill (lark-calendar). Please continue to use this skill for processing. CRITICAL, Task type triage: When handling "scheduling/rescheduling events, adding/removing attendees, adding/changing meeting rooms, or adjusting times," you must first determine whether the user is "creating a new event" or "editing an existing event."
- Strong signals for editing an existing event: The user explicitly mentions an existing event anchor (e.g., title, time slot, "this event," "this meeting") and expresses a modification action (e.g., "add," "remove," "change to," "change meeting room," "adjust time"). Such requests default to editing an existing event and must never be treated as a new creation.
- Prerequisite for editing an existing event: Once identified as an edit, you MUST first locate the
event_idof the target event or specific instance before proceeding. If it is a recurring event, you MUST first locate theevent_idof the corresponding instance. - Creating a new event: Only enter the new creation flow when the user expresses an intent to "schedule a new meeting/create an event/arrange a meeting" and there is no modification action pointing to an existing event.
CRITICAL, Verification and synchronization delay: After deleting an event (delete), modifying an event (patch), or adding/removing attendees/meeting rooms, if you need to perform a secondary query to verify the result, you MUST wait at least 2 seconds before querying to prevent missing the latest data due to synchronization delays. Note: Do not mention to the user that you waited for these 2 seconds.
CRITICAL, Operations on recurring event instances: You now have the full capability to operate on specific instances of a recurring event (e.g., editing a specific instance, deleting a specific instance, adding/removing attendees for a specific instance, adding/removing meeting rooms for a specific instance). Simply pass the event_id of the corresponding instance in the operation. Therefore, you MUST first locate the event_id of that specific instance (this can be obtained via events search_event or by checking +agenda for the relevant time range). It is strictly prohibited to use the event_id of the original recurring event directly for these operations.
Time and date inference specifications: To ensure accuracy, strictly follow these rules when inferring time:
- Definition of a week: Monday is the first day of the week, and Sunday is the last day. When calculating relative dates like "next Monday," be sure to base it on the current real date and the day of the week to avoid calculation errors.
- Range of a day: When a user mentions "tomorrow," "today," etc., the time range should default to cover the entire day. Do not reduce the query range on your own, as this may cause you to miss evening arrangements.
- Historical time constraint: You cannot schedule time that has already completely passed. The only exception is an event that "spans the current time," meaning the event start time is in the past but the end time is in the future.
Core Scenarios
1. Scheduling new events/meetings, editing existing events, querying/searching for available meeting rooms
BLOCKING REQUIREMENT: As long as the user's intent includes "scheduling an event/meeting" or "querying/searching for available meeting rooms," you must immediately stop other thinking and prioritize using the Read tool to fully read references/lark-calendar-schedule-meeting.md! Executing any event creation or meeting room query operation before reading this file is strictly prohibited.
CRITICAL: You must strictly follow the workflow defined in the aforementioned document to execute subsequent operations. When handling this scenario, act as an "intelligent assistant," not a "form filler." Fill in default values where possible, and only ask follow-up questions when there are time conflicts, results cannot be uniquely determined, or there is ambiguity in time semantics.
CRITICAL: The execution order must be fixed: first determine the task type (new/edit); if editing, first locate the target event_id; then fill in default values or inherit known information from the located event; then determine if the time is clear; finally, enter the "clear time" or "fuzzy time/no time information" branch. Do not skip steps.
CRITICAL: When the time is clear and a meeting room is needed, first execute +room-find based on the finalized time block, then execute +freebusy as needed; when the time is fuzzy or there is no time information, first use +suggestion, and if a meeting room is needed, perform batch +room-find. If editing an existing event without changing the time, and only adding a meeting room, you must execute +room-find based on the original time of the located event, and by default, retain existing meeting rooms; only delete the original meeting room if the user explicitly expresses "change meeting room" or "remove meeting room."
CRITICAL: When a user says "check meeting rooms," "find meeting rooms," "search for available meeting rooms," or "recommend common meeting rooms," it defaults to checking meeting room availability, not checking a directory of meeting room resources. It is strictly prohibited to pull historical event data for statistical analysis. The complete rules are subject to lark-calendar-schedule-meeting.md.
BLOCKING REQUIREMENT: Even if the user's core request is "check meeting rooms," if they have not provided a clear start and end time, it is strictly prohibited to call +room-find directly! You must first enter the "no time/fuzzy time" branch, call +suggestion to get candidate time blocks, and then pass the time block to +room-find.
BLOCKING REQUIREMENT: Whenever you are faced with a choice of time slots or meeting room options (such as fuzzy time, no time, or needing a meeting room), you must present the candidate options to the user and wait for their explicit confirmation before finally executing the creation of a new event or updating an existing one. It is strictly prohibited to make decisions for the user without authorization.
Core Concepts
- Calendar: A container for events. Each user has a primary calendar and can also create or subscribe to shared calendars.
- Event: A single item in a calendar, containing attributes such as start/end time, location, title, and attendees. Supports single events and recurring events, following the RFC5545 iCalendar international standard.
- All-day Event: An event that occupies time by date only, without specific start/end times. The end date is included in the event time.
- Instance: A specific time instance of an event, which is essentially an expansion of the event. Regular events and exception events correspond to 1 instance, while recurring events correspond to N instances. When querying by time period, recurring events can be expanded into independent instances via the instance view for accurate display and management on a timeline.
- Rrule/Recurrence Rule: Defines the repetition rule for a recurring event, e.g.,
FREQ=DAILY;UNTIL=20230307T155959Z;INTERVAL=14means it repeats every 14 days. - Exception: An event within a recurring series that differs from the original recurrence rule.
- Attendee: A participant in an event, which can be a user, group, meeting room resource, external email address, etc. Each attendee has an independent RSVP status.
- RSVP: The response status of an attendee to an event invitation (accepted/declined/tentative).
- FreeBusy: Queries the busy/free status of a user during a specified time period, used for meeting time coordination.
- Room: Refers to a meeting room. Please accurately map "room" to "meeting room" and its related operations when understanding and processing intents.
- Time Slot / Time Block: Refers to a specific and definite continuous time period (e.g.,
14:00~15:00). In the documentation, it is strictly distinguished from general "time ranges/intervals" (e.g., "this afternoon," "next week"). When calling exact operations like booking or querying available meeting rooms, you must base them on a definite "time block" rather than a fuzzy "time range."
Resource Relationships
Calendar
└── Event
├── Attendee
└── Reminder
Shortcuts (Recommended for priority use)
Shortcuts are high-level encapsulations of common operations (lark-cli calendar +<verb> [flags]). Use Shortcuts whenever available.
| Shortcut | Description |
|---|---|
+agenda | View event schedule (defaults to today) |
+create | Create an event and invite attendees (ISO 8601 time) |
+update | Update existing event fields, or independently add/remove attendees and meeting rooms |
+freebusy | Query busy/free information and RSVP status of the user's primary calendar |
+room-find | Find available meeting rooms for one or more definite time blocks (Do not call directly without a clear time; use +suggestion first) |
+rsvp | Respond to an event (accept/decline/tentative) |
+suggestion | Recommend multiple available time block options based on non-definite times or time ranges |
Meeting Room Rules
- Meeting rooms are a type of attendee (resource attendee) for an event and cannot exist or be booked independently of an event.
- Whenever the user's intent is "booking/querying/searching for available meeting rooms," you must enter the
references/lark-calendar-schedule-meeting.mdworkflow for processing. - The time input for
+room-findmust be a definite time block, not a time range search. - Mandatory constraint: If the user only requests "check meeting rooms" but does not provide a clear time, you must first call
+suggestionto obtain available time blocks, and then pass the time blocks to+room-findfor batch querying. It is strictly prohibited to guess the time and call+room-findblindly. - When editing an existing event, if the user expresses "add a meeting room/add another meeting room," the default semantics are incremental addition, and existing meeting rooms must be retained; only perform deletion of old meeting rooms if the user explicitly expresses "change meeting room," "replace the original meeting room," or "remove meeting room."
API Resources
lark-cli schema calendar.<resource>.<method> # Must check parameter structure before calling API
lark-cli calendar <resource> <method> [flags] # Call API
Important: When using native APIs, you must first run
schemato view the--data/--paramsparameter structure. Do not guess field formats.
calendars
create, Create a shared calendardelete, Delete a shared calendarget, Query calendar informationlist, Query calendar listpatch, Update calendar informationprimary, Query user's primary calendarsearch, Search calendars
event.attendees
batch_delete, Delete event attendeescreate, Add event attendeeslist, Get list of event attendees
events
create, Create an eventdelete, Delete an eventget, Get an eventinstance_view, Query event viewpatch, Update an eventsearch_event, Search events (Note: Currently only returns event ID, subject, and time information; for more details, use theevents getcommand)share_info, Get event share link
freebusys
list, Query busy/free information for the primary calendar
Permissions Table
| Method | Required Scope |
|---|---|
calendars.create | calendar:calendar:create |
calendars.delete | calendar:calendar:delete |
calendars.get | calendar:calendar:read |
calendars.list | calendar:calendar:read |
calendars.patch | calendar:calendar:update |
calendars.primary | calendar:calendar:read |
calendars.search | calendar:calendar:read |
event.attendees.batch_delete | calendar:calendar.event:update |
event.attendees.create | calendar:calendar.event:update |
event.attendees.list | calendar:calendar.event:read |
events.create | calendar:calendar.event:create |
events.delete | calendar:calendar.event:delete |
events.get | calendar:calendar.event:read |
events.instance_view | calendar:calendar.event:read |
events.patch | calendar:calendar.event:update |
events.search_event | calendar:calendar.event:read |
events.share_info | calendar:calendar.event:read |
freebusys.list | calendar:calendar.free_busy:read |
Note (Mandatory):
- When involving conversions between date (time) strings and timestamps, be sure to call system commands or script code and other external tools to ensure absolute accuracy in the conversion. Violations will lead to serious logical errors!
calendar (v4)
CRITICAL — 开始前 MUST 先用 Read 工具读取 ../lark-shared/SKILL.md,其中包含认证、权限处理
CRITICAL — 所有的 Shortcuts 在执行之前,务必先使用 Read 工具读取其对应的说明文档,禁止直接盲目调用命令。
CRITICAL — 凡涉及【预约日程/会议】或【查询/搜索会议室】,第一步 MUST 强制使用 Read 工具读取 references/lark-calendar-schedule-meeting.md。禁止跳过此步直接调用 API 或 Shortcut!
CRITICAL — 术语约束:用户日常表达中常说的“帮我约个日历”、“查一下今天的日历”等,其实际意图通常是针对 日程(Event) 的创建或查询,而非操作 日历(Calendar) 容器本身。请自动将口语化的“日历”意图映射为“日程”操作(如 +create, +agenda)。
CRITICAL — 会议与日程的意图路由:
- 查询过去时间的会议:如果用户明确查询过去时间的会议(如“昨天的会议”、“上周的会议”),优先使用
../lark-vc/SKILL.md搜索会议记录。因为会议数据不仅包含从日程发起的视频会议,还包含即时会议,仅查询日程数据会导致结果不全。 - 查询日历/日程或未来时间的会议:如果用户明确表达的是“日历”、“日程”,或者涉及未来时间的安排,则属于本技能(lark-calendar)的业务域,请继续使用本技能处理。 CRITICAL — 任务类型分流:处理“预约/改约日程、添加/移除参会人、添加/更换会议室、调整时间”时,必须先判断用户是在“新建日程”还是“编辑已有日程”。
- 编辑已有日程的强信号:用户明确提到某个已存在的日程锚点(如标题、时间段、
这个日程、这场会)并表达修改动作(如“添加”“移除”“改到”“换会议室”“调整时间”)。这类请求默认走编辑已有日程,绝不能直接按新建处理。 - 编辑已有日程的前置步骤:一旦判定为编辑,MUST 先定位目标日程或具体实例的
event_id,再继续后续流程。若是重复性日程,MUST 先定位到对应实例的event_id。 - 新建日程:只有当用户表达的是“新约一个会/创建一个日程/安排一次会议”等新增意图,且没有指向某个既有日程的修改动作时,才进入新建流程。
CRITICAL — 验证与同步延迟:在涉及删除日程(delete)、修改日程(patch)或者涉及添加移除参与人/会议室之后,如果需要进行二次查询验证操作结果,MUST 等待至少 2 秒后再进行查询,以防止因数据同步延迟导致查不到最新数据。注意:不要向用户提及你等待了这 2 秒钟的事情。
CRITICAL — 重复性日程的实例操作:目前已经完全具备对重复性日程的某个具体实例进行操作的能力(例如:编辑某个实例、删除某个实例、为某个实例添加/删除参与人、为某个实例添加/移除会议室)。只要在对应的操作中传递对应实例的 event_id 即可。因此,MUST 先定位到对应的那次实例的 event_id(可通过 events search_event 搜索日程,或 +agenda 查看对应时间范围的日程等相关查询获取),绝对禁止直接使用原重复性日程的 event_id 进行操作。
时间与日期推断规范: 为确保准确性,在涉及时间推断时,请严格遵循以下规则:
- 星期的定义:周一是一周的第一天,周日是一周的最后一天。计算
下周一等相对日期时,务必基于当前真实日期和星期基准进行推算,避免算错日期。 - 一天的范围:当用户提到
明天、今天等泛指某一天时,时间范围应默认覆盖整天时间范围。切勿自行缩减查询范围,以免遗漏晚上的时间安排。 - 历史时间约束:不能预约已经完全过去的时间。唯一的例外情况是“跨越当前时间”的日程,即日程的开始时间在过去,但结束时间在未来。
核心场景
1. 预约新日程/会议、编辑已有日程、查询/搜索可用会议室
BLOCKING REQUIREMENT (阻塞性要求): 只要用户的意图包含“预约日程/会议”或“查询/搜索可用会议室”,你必须立即停止其他思考,优先使用 Read 工具完整读取 references/lark-calendar-schedule-meeting.md!未读取该文件前,绝对禁止执行任何日程创建或会议室查询操作。
CRITICAL: 必须严格按照上述文档中定义的工作流(Workflow)执行后续操作。处理该场景时,默认做“智能助理”,不要做“表单填写机”。能补全的默认值先补全,只有在时间冲突、结果无法唯一确定、时间语义存在歧义时才主动追问。
CRITICAL: 执行顺序必须固定为:先判断任务类型(新建/编辑);若为编辑先定位目标日程 event_id;再补默认值或继承已定位日程的已知信息;再判断时间是否明确;最后进入“明确时间”或“模糊时间/无时间信息”分支。不要跳步。
CRITICAL: 明确时间且需要会议室时,先基于最终确定的时间块执行 +room-find,再按需执行 +freebusy;模糊时间或无时间信息时,先 +suggestion,如需会议室再批量 +room-find。如果是编辑已有日程且不改时间,只新增会议室,则必须基于已定位日程的原始时间执行 +room-find,且最终落地时默认保留已存在的会议室;只有用户明确表达“更换会议室”或“移除会议室”时,才删除原会议室。
CRITICAL: 当用户说“查会议室”“找会议室”“搜可用会议室”或“推荐常用会议室”时,默认是查会议室可用性,不是查会议室资源名录,更严禁拉取历史日程做统计分析。完整规则以 lark-calendar-schedule-meeting.md 为准。
BLOCKING REQUIREMENT: 即使用户的核心诉求是“查会议室”,只要【没有提供明确的起止时间】,绝对禁止直接调用 +room-find!必须先进入【无时间/模糊时间】分支,调用 +suggestion 拿到候选时间块后,再将时间块传给 +room-find。
BLOCKING REQUIREMENT: 只要面临时间方案或会议室方案的选择(如模糊时间、无时间或需要会议室),在最终执行创建新日程或更新既有日程之前,必须先向用户展示候选方案并等待用户明确确认。绝对禁止擅自替用户做决定。
核心概念
- 日历(Calendar):日程的容器。每个用户有一个主日历(primary calendar),也可以创建或订阅共享日历。
- 日程(Event):日历中的单个日程,包含起止时间、地点、标题、参与人等属性。支持单次日程和重复日程,遵循RFC5545 iCalendar国际标准。
- 全天日程(All-day Event): 只按日期占用、没有具体起止时刻的日程,结束日期是包含在日程时间内的。
- 日程实例(Instance):日程的具体时间实例,本质是对日程的展开。普通日程和例外日程对应1个Instance,重复性日程对应N个Instance。在按时间段查询时,可通过实例视图将重复日程展开为独立的实例返回,以便在时间线上准确展示和管理。
- 重复规则(Rrule/Recurrence Rule):定义重复性日程的重复规则,比如
FREQ=DAILY;UNTIL=20230307T155959Z;INTERVAL=14表示每14天重复一次。 - 例外日程(Exception):重复性日程中与原重复性日程不一致的日程。
- 参会人(Attendee):日程的参与者,可以是用户、群、会议室资源、外部邮箱地址等。每个参与人有独立的RSVP状态。
- 响应状态(RSVP):参与人对日程邀请的回复状态(接受/拒绝/待定)。
- 忙闲时间(FreeBusy):查询用户在指定时间段的忙闲状态,用于会议时间协调。
- 会议室(Room):“room”不是“房间”,是“会议室”。请在理解和处理意图时将“room”和“房间”准确映射为“会议室”及其相关操作。
- 时间块(Time Slot / Time Block):指一个具体且确定的连续时间段(如
14:00~15:00)。在文档中,它与泛指的“时间范围/区间”(如“今天下午”、“下周”)有严格区别。在调用预定、查询可用会议室等确切操作时,必须基于确定的“时间块”而非模糊的“时间范围”。
资源关系
Calendar (日历)
└── Event (日程)
├── Attendee (参会人)
└── Reminder (提醒)
Shortcuts(推荐优先使用)
Shortcut 是对常用操作的高级封装(lark-cli calendar +<verb> [flags])。有 Shortcut 的操作优先使用。
| Shortcut | 说明 |
|---|---|
+agenda | 查看日程安排(默认今天) |
+create | 创建日程并邀请参会人(ISO 8601 时间) |
+update | 更新既有日程字段,或独立增量添加/移除参会人和会议室 |
+freebusy | 查询用户主日历的忙闲信息和rsvp的状态 |
+room-find | 针对一个或多个明确的时间块查找可用会议室(无明确时间时禁止直接调用,需先走 +suggestion) |
+rsvp | 回复日程(接受/拒绝/待定) |
+suggestion | 根据非明确时间或一段时间范围,推荐多个可用时间块方案 |
会议室相关规则
- 会议室是日程的一种参与人(resource attendee),不能脱离日程单独存在或单独预定。
- 凡是用户意图是“预定/查询/搜索可用会议室”时,都必须进入
references/lark-calendar-schedule-meeting.md工作流处理。 +room-find的时间输入必须是确定时间块,不能是时间区间搜索。- 强制约束:如果用户仅要求“查询会议室”但未提供明确时间,必须先调用
+suggestion获取可用时间块,然后再将时间块交给+room-find批量查询。严禁直接猜测时间并盲目调用+room-find。 - 编辑已有日程时,如果用户表达的是“添加会议室/再加一个会议室”,默认语义是增量添加,必须保留已有会议室;只有在用户明确表达“更换会议室”“把原会议室换掉”“移除会议室”时,才执行旧会议室删除。
API Resources
lark-cli schema calendar.<resource>.<method> # 调用 API 前必须先查看参数结构
lark-cli calendar <resource> <method> [flags] # 调用 API
重要:使用原生 API 时,必须先运行
schema查看--data/--params参数结构,不要猜测字段格式。
calendars
create— 创建共享日历delete— 删除共享日历get— 查询日历信息list— 查询日历列表patch— 更新日历信息primary— 查询用户主日历search— 搜索日历
event.attendees
batch_delete— 删除日程参与人create— 添加日程参与人list— 获取日程参与人列表
events
create— 创建日程delete— 删除日程get— 获取日程instance_view— 查询日程视图patch— 更新日程search_event— 搜索日程(注:目前只会返回日程id、日程主题、日程时间的信息,需要更多的日程详情,需要走events get命令)share_info— 获取日程分享链接
freebusys
list— 查询主日历日程忙闲信息
权限表
| 方法 | 所需 scope |
|---|---|
calendars.create | calendar:calendar:create |
calendars.delete | calendar:calendar:delete |
calendars.get | calendar:calendar:read |
calendars.list | calendar:calendar:read |
calendars.patch | calendar:calendar:update |
calendars.primary | calendar:calendar:read |
calendars.search | calendar:calendar:read |
event.attendees.batch_delete | calendar:calendar.event:update |
event.attendees.create | calendar:calendar.event:update |
event.attendees.list | calendar:calendar.event:read |
events.create | calendar:calendar.event:create |
events.delete | calendar:calendar.event:delete |
events.get | calendar:calendar.event:read |
events.instance_view | calendar:calendar.event:read |
events.patch | calendar:calendar.event:update |
events.search_event | calendar:calendar.event:read |
events.share_info | calendar:calendar.event:read |
freebusys.list | calendar:calendar.free_busy:read |
注意(强制性):
- 涉及日期(时间)字符串与时间戳的相互转换时,务必调用系统命令或脚本代码等外部工具进行处理,以确保转换的绝对准确。违者将导致严重的逻辑错误!
Installs
201,808First seen
Jun 10, 2026
Auto-fetched from GitHub .
Stats via skills.sh.
Skills similar to lark-calendar:
Installs
Installs
Installs