Back to Skills
    🦞

    lark-calendar

    Create, update, and delete calendar events and tasks in Lark

    By @boyangwang
    View on GitHub
    SKILL.md
    ---
    name: lark-calendar
    description: Create, update, and delete calendar events and tasks in Lark (Feishu). Includes employee directory for automatic name-to-user_id resolution.
    version: 1.0.0
    author: Claw AI
    ---
    
    # Lark Calendar & Task Skill
    
    Create, update, and delete calendar events and tasks in Lark (Feishu).
    
    ## Overview
    
    This skill provides full CRUD operations for:
    - **Calendar Events** β€” meetings, appointments, schedules
    - **Tasks (Todo)** β€” action items with deadlines
    
    ## Configuration
    
    **Required Environment Variables** (in `.secrets.env`):
    ```bash
    FEISHU_APP_ID=cli_a9f52a4ed7b8ded4
    FEISHU_APP_SECRET=<your-app-secret>
    ```
    
    **Default Calendar:** `feishu.cn_caF80RJxgGcbBGsQx64bCh@group.calendar.feishu.cn` (Claw calendar)
    
    **Default Timezone:** `Asia/Singapore`
    
    ## Quick Reference
    
    ### Create Calendar Event
    
    ```bash
    node skills/lark-calendar/scripts/create-event.mjs \
      --title "Meeting with Team" \
      --description "Discuss Q2 roadmap" \
      --start "2026-02-03 14:00:00" \
      --end "2026-02-03 15:00:00" \
      --attendees "Boyang,RK" \
      --location "Meeting Room A"
    ```
    
    **Parameters:**
    | Param | Required | Description |
    |-------|----------|-------------|
    | `--title` | βœ… | Event title |
    | `--description` | ❌ | Event description |
    | `--start` | βœ… | Start time (YYYY-MM-DD HH:MM:SS) |
    | `--end` | βœ… | End time (YYYY-MM-DD HH:MM:SS) |
    | `--attendees` | ❌ | Comma-separated names (auto-resolved to user_ids) |
    | `--attendee-ids` | ❌ | Comma-separated user_ids directly |
    | `--location` | ❌ | Event location |
    | `--timezone` | ❌ | Timezone (default: Asia/Singapore) |
    | `--calendar` | ❌ | Calendar ID (uses default if omitted) |
    
    ### Update Calendar Event
    
    ```bash
    node skills/lark-calendar/scripts/update-event.mjs \
      --event-id "f9900f6b-b472-4b17-a818-7b5584abdc37_0" \
      --title "Updated Title" \
      --start "2026-02-03 15:00:00" \
      --end "2026-02-03 16:00:00"
    ```
    
    ### Delete Calendar Event
    
    ```bash
    node skills/lark-calendar/scripts/delete-event.mjs \
      --event-id "f9900f6b-b472-4b17-a818-7b5584abdc37_0"
    ```
    
    ### List Calendar Events
    
    ```bash
    # List events for next 7 days
    node skills/lark-calendar/scripts/list-events.mjs
    
    # List events in date range
    node skills/lark-calendar/scripts/list-events.mjs \
      --start "2026-02-01" \
      --end "2026-02-28"
    ```
    
    ### Create Task
    
    ```bash
    node skills/lark-calendar/scripts/create-task.mjs \
      --title "Review PR #123" \
      --description "Code review for authentication module" \
      --due "2026-02-05 18:00:00" \
      --assignees "Boyang,jc"
    ```
    
    **Parameters:**
    | Param | Required | Description |
    |-------|----------|-------------|
    | `--title` | βœ… | Task title |
    | `--description` | ❌ | Task description |
    | `--due` | βœ… | Due date (YYYY-MM-DD HH:MM:SS) |
    | `--assignees` | ❌ | Comma-separated names (auto-resolved) |
    | `--assignee-ids` | ❌ | Comma-separated user_ids directly |
    | `--timezone` | ❌ | Timezone (default: Asia/Singapore) |
    
    ### Update Task
    
    ```bash
    node skills/lark-calendar/scripts/update-task.mjs \
      --task-id "35fc5310-a1b1-49c7-be75-be631d3079ee" \
      --title "Updated Task" \
      --due "2026-02-06 18:00:00"
    ```
    
    ### Delete Task
    
    ```bash
    node skills/lark-calendar/scripts/delete-task.mjs \
      --task-id "35fc5310-a1b1-49c7-be75-be631d3079ee"
    ```
    
    ### Manage Event Attendees
    
    ```bash
    # Add attendees
    node skills/lark-calendar/scripts/manage-attendees.mjs \
      --event-id "xxx" --add "RK,jc"
    
    # Remove attendees  
    node skills/lark-calendar/scripts/manage-attendees.mjs \
      --event-id "xxx" --remove "jc"
    ```
    
    ### Manage Task Members
    
    ```bash
    # Add members
    node skills/lark-calendar/scripts/manage-task-members.mjs \
      --task-id "xxx" --add "RK,jc"
    
    # Remove members
    node skills/lark-calendar/scripts/manage-task-members.mjs \
      --task-id "xxx" --remove "jc"
    ```
    
    ## Employee Directory
    
    Names are auto-resolved to Lark user_ids. Supported names:
    
    | user_id | Names | Role |
    |---------|-------|------|
    | `dgg163e1` | Boyang, by, εšζ΄‹ | Boss |
    | `gb71g28b` | RK | Leadership, R&D |
    | `53gc5724` | Ding | Leadership, Operations |
    | `217ec2c2` | Charline | HR |
    | `f2bfd283` | ζ›Ύζ™“ηŽ², xiaoling | HR |
    | `f26fe45d` | HH | Research |
    | `45858f91` | zan, Eva | - |
    | `7f79b6de` | Issac | Operations |
    | `1fb2547g` | ηŽ‹ι“ζŸ± | Operations |
    | `e5997acd` | ε°Όε…‹, Nico | Operations |
    | `438c3c1f` | Ivan | Operations |
    | `17g8bab2` | Dodo | R&D, Product |
    | `73b45ec5` | 启袅, QiChaoShi | R&D, Design |
    | `d1978a39` | chenglin | R&D, Frontend |
    | `ef6fc4a7` | ε† ζž—, Green | R&D, Frontend |
    | `b47fa8f2` | sixian, sx, Sixian-Yu | R&D, Frontend |
    | `934fbf15` | jc, sagiri, δΏŠζ™¨ | R&D, Backend |
    | `8c4aad87` | 倧明, daming | R&D, Backend |
    | `ab87g5e1` | Emily Yobal | Intern |
    | `55fa337f` | jingda, ζ™―θΎΎ | Intern |
    | `333c7cf1` | 刘ηΊͺ源, ηΊͺ源, Aiden | Intern |
    
    ## Business Rules
    
    1. **Boyang is always added** as attendee to every calendar event (automatic)
    2. **Timezone handling:** Uses IANA identifiers (e.g., `Asia/Singapore`, `Asia/Shanghai`)
    3. **Time format:** Always `YYYY-MM-DD HH:MM:SS`
    4. **user_id vs open_id:** This skill uses `user_id` format (e.g., `dgg163e1`), NOT `open_id` (e.g., `ou_xxx`)
    
    ## Programmatic Usage
    
    ```javascript
    import { createEvent, updateEvent, deleteEvent } from './skills/lark-calendar/lib/calendar.mjs';
    import { createTask, updateTask, deleteTask } from './skills/lark-calendar/lib/task.mjs';
    import { resolveNames } from './skills/lark-calendar/lib/employees.mjs';
    
    // Create event
    const result = await createEvent({
      title: 'Team Sync',
      description: 'Weekly standup',
      startTime: '2026-02-03 10:00:00',
      endTime: '2026-02-03 10:30:00',
      attendeeIds: ['dgg163e1', 'gb71g28b'],
      location: 'Zoom',
      timezone: 'Asia/Singapore'
    });
    
    // Create task
    const task = await createTask({
      title: 'Review document',
      description: 'Q2 planning doc',
      dueTime: '2026-02-05 18:00:00',
      assigneeIds: ['dgg163e1'],
      timezone: 'Asia/Singapore'
    });
    ```
    
    ## Lark API Reference
    
    - [Calendar Events API](https://open.larksuite.com/document/server-docs/calendar-v4/calendar-event/create)
    - [Calendar Attendees API](https://open.larksuite.com/document/server-docs/calendar-v4/calendar-event-attendee/create)
    - [Tasks API](https://open.larksuite.com/document/server-docs/task-v2/task/create)
    
    ## Permissions Required
    
    Ensure your Lark app has these scopes:
    - `calendar:calendar` β€” Read/write calendar βœ… (already enabled)
    - `calendar:calendar:readonly` β€” Read calendar βœ… (already enabled)
    - `task:task:write` β€” Write tasks ⚠️ (needs to be added for task creation)
    - `task:task:read` β€” Read tasks
    - `contact:user.employee_id:readonly` β€” Read user info βœ… (already enabled)
    
    **To add permissions:**
    1. Go to [Lark Open Platform](https://open.larksuite.com/app/cli_a9f52a4ed7b8ded4/auth)
    2. Add scopes: `task:task:write`, `contact:contact:readonly` (for dynamic employee lookup)
    3. Re-publish the app version
    
    **Note:** Without `contact:contact:readonly`, the skill uses a static fallback employee list. Update `lib/employees.mjs` when team changes.