If you're building automations on top of Feishu (Lark), this gives you the full Calendar API wrapped up cleanly. You can create and update events, manage attendees, search across calendars, and even book meeting rooms by adding them as resource-type participants. The token handling is abstracted into a shared script that caches credentials and auto-refreshes when needed, so you're not wrestling with auth on every call. Covers the practical stuff like ACL management for shared calendars and pagination for bulk queries. Works well when you need to sync schedules, automate meeting creation, or build workflow triggers around calendar events without manually curling the Feishu API every time.
npx -y skills add alextangson/feishu_skills --skill feishu-calendar --agent claude-codeInstalls into .claude/skills of the current project.
通过 Calendar API 管理日程。
Base URL: https://open.feishu.cn/open-apis/calendar/v4
从 feishu_skills 根目录执行共享脚本:
TOKEN="$(./scripts/get_feishu_token.sh)"
请求头统一使用 Authorization: Bearer ${TOKEN}。
如果业务接口返回 token 无效、过期或 401,强制刷新后仅重试一次原请求:
TOKEN="$(./scripts/get_feishu_token.sh --force-refresh)"
环境变量:
FEISHU_APP_IDFEISHU_APP_SECRET本地缓存: ./.feishu_token_cache.json(未过期直接复用,默认提前 5 分钟刷新)
| API | 端点 | 方法 | 请求体示例 | 说明 |
|---|---|---|---|---|
| 创建日程 | /calendars/{calendar_id}/events | POST | {"summary":"会议标题","start_time":{"timestamp":"1770508800"},"end_time":{"timestamp":"1770512400"}} | 创建新日程 |
| 获取日程 | /calendars/{calendar_id}/events/{event_id} | GET | - | 查询日程详情 |
| 更新日程 | /calendars/{calendar_id}/events/{event_id} | PATCH | {"summary":"新标题"} | 修改日程 |
| 删除日程 | /calendars/{calendar_id}/events/{event_id} | DELETE | - | 删除日程 |
| 搜索日程 | /calendars/{calendar_id}/events/search | POST | {"query":"关键词","start_time":{"timestamp":"1770508800"}} | 条件搜索 |
| 获取日程列表 | /calendars/{calendar_id}/events | GET | - | 查询日历下所有日程 |
创建日程:
{
"summary": "会议标题",
"start_time": {"timestamp": "1770508800"},
"end_time": {"timestamp": "1770512400"},
"attendees": [{"type": "user", "attendee_id": "ou_xxx"}]
}
attendees type: user / chat / resource(会议室)
| API | 端点 | 方法 | 请求体示例 | 说明 |
|---|---|---|---|---|
| 获取参与人 | /calendars/{calendar_id}/events/{event_id}/attendees | GET | - | 查询参与人列表 |
| 添加参与人 | /calendars/{calendar_id}/events/{event_id}/attendees | POST | {"attendees":[{"type":"user","attendee_id":"ou_xxx"}]} | 邀请参与人 |
| 删除参与人 | /calendars/{calendar_id}/events/{event_id}/attendees/{attendee_id} | DELETE | - | 移除参与人 |
| 获取参与群成员 | /calendars/{calendar_id}/events/{event_id}/attendees/chat_members | GET | - | 查询群参与成员 |
| API | 端点 | 方法 | 请求体示例 | 说明 |
|---|---|---|---|---|
| 获取日历列表 | /calendars | GET | 查询参数:page_size=50&page_token=xxx | 查询所有日历(分页) |
| 获取主日历 | /calendars/primary | GET | - | 查询用户主日历 |
| 创建日历 | /calendars | POST | {"summary":"日历名称","description":"描述","permissions":"public"} | 创建共享日历 |
| 获取日历 | /calendars/{calendar_id} | GET | - | 查询日历详情 |
| 更新日历 | /calendars/{calendar_id} | PATCH | {"summary":"新名称"} | 修改日历 |
| 删除日历 | /calendars/{calendar_id} | DELETE | - | 删除日历 |
| 搜索日历 | /calendars/search | POST | {"query":"关键词"} | 搜索日历 |
| API | 端点 | 方法 | 请求体示例 | 说明 |
|---|---|---|---|---|
| 获取 ACL 列表 | /calendars/{calendar_id}/acls | GET | - | 查询日历权限 |
| 创建 ACL | /calendars/{calendar_id}/acls | POST | {"role":"reader","scope":{"type":"user","user_id":"ou_xxx"}} | 添加权限 |
| 删除 ACL | /calendars/{calendar_id}/acls/{acl_id} | DELETE | - | 移除权限 |
| 订阅日历 | /calendars/{calendar_id}/subscribe | POST | - | 订阅日历变更 |
| 取消订阅 | /calendars/{calendar_id}/unsubscribe | POST | - | 取消日历订阅 |
| 订阅日程事件 | /calendars/{calendar_id}/events/subscribe | POST | - | 订阅日程变更 |
| 取消日程订阅 | /calendars/{calendar_id}/events/unsubscribe | POST | - | 取消日程订阅 |
ACL role: none / free_busy_reader / reader / writer / owner
| API | 端点 | 方法 | 请求体示例 | 说明 |
|---|---|---|---|---|
| 获取会议室列表 | /rooms | GET | - | 查询所有会议室 |
| 获取会议室 | /rooms/{room_id} | GET | - | 查询会议室详情 |
| 查询会议室忙闲 | /rooms/{room_id}/freebusy | GET | - | 查询会议室可用时间 |
占用会议室的关键:在 attendees 中添加 type: "resource" 的参与人,attendee_id 填会议室的 room_id。
完整流程:
# 1. 获取会议室列表,拿到 room_id
curl -X GET "https://open.feishu.cn/open-apis/calendar/v4/rooms?page_size=50" \
-H "Authorization: Bearer YOUR_TOKEN"
# 2. (可选)查询会议室在目标时间段是否空闲
curl -X GET "https://open.feishu.cn/open-apis/calendar/v4/rooms/{room_id}/freebusy?start_time=1770508800&end_time=1770512400" \
-H "Authorization: Bearer YOUR_TOKEN"
# 3. 创建日程,attendees 中加入会议室
curl -X POST "https://open.feishu.cn/open-apis/calendar/v4/calendars/primary/events" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"summary": "团队会议",
"start_time": {"timestamp": "1770508800"},
"end_time": {"timestamp": "1770512400"},
"attendees": [
{"type": "user", "attendee_id": "ou_xxx"},
{"type": "resource", "attendee_id": "omcxxxxxxxxxxxxx"}
]
}'
⚠️ 若会议室在该时段已被占用,创建请求会返回冲突错误,请先查询忙闲再预订。
时间格式:
timestamp: 秒级时间戳(如 "1770508800")date: 日期字符串(如 "2026-03-07")分页参数:
page_size: 每页数量(默认 50,最大 500)page_token: 分页标记(从上次响应获取)user_id_type: 用户 ID 类型
open_id(默认)user_idunion_id获取日历列表:
curl -X GET "https://open.feishu.cn/open-apis/calendar/v4/calendars?page_size=10" \
-H "Authorization: Bearer ${TOKEN}"
创建日程:
curl -X POST "https://open.feishu.cn/open-apis/calendar/v4/calendars/primary/events" \
-H "Authorization: Bearer ${TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"summary": "团队会议",
"start_time": {"timestamp": "1709798400"},
"end_time": {"timestamp": "1709802000"}
}'
primary 作为 calendar_idjuliusbrussee/caveman
mattpocock/skills
shadcn/improve
obra/superpowers
forrestchang/andrej-karpathy-skills
vercel-labs/skills