calendar-management — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited calendar-management (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
This skill guides you through effective use of che-ical-mcp for calendar and task management on macOS.
CRITICAL: Always use ISO8601 format with timezone for all date/time parameters:
2026-01-18T14:00:00+08:00 (correct)
2026-01-18 14:00 (wrong - will fail)Use the user's local timezone. For Taiwan: +08:00. An event module's events follow the module (a conference's sessions use the conference's zone; its all-day umbrella takes date-only values).
Before creating or modifying, always check existing state:
list_calendars → See all calendars and their sources
list_events_quick → Quick view: "today", "this_week", "next_7_days"
list_reminders → See tasks by list or completion status| Task | Tool | Key Parameters |
|---|---|---|
| View schedule | list_events | start_date, end_date, calendar_name |
| Quick view | list_events_quick | range: "today", "tomorrow", "this_week", week_starts_on |
| Create event | create_event | title, start_time, end_time, calendar_name (required) |
| Search | search_events | keyword/keywords, match_mode ("any"/"all") |
| Check availability | check_conflicts | start_time, end_time |
Week Start Day (v0.8.2+): For this_week/next_week ranges, use week_starts_on:
system (default): Use system localemonday: ISO 8601 (Europe, Asia)sunday: US, Japansaturday: Middle East| Task | Tool | Key Parameters |
|---|---|---|
| List tasks | list_reminders | calendar_name, completed (JSON boolean; omit/null = all; strings/numbers rejected) |
| Create task | create_reminder | title, calendar_name (required), due_date (bare YYYY-MM-DD = date-only, no time) |
| Complete | complete_reminder | reminder_id, completed (JSON boolean, default true; strings/numbers rejected) |
Every boolean argument on every tool (all_day,clear_*,include_completed,dry_run,delete_original, …) is a strict JSON boolean (#207): strings and numbers are rejected; omit ornullkeeps the default.
Recurring reminders (#194): list/search items carryhas_recurrence,recurrence_rulesand adueobject (date/time/timezone/date_time).complete_reminderreturnsoperation(write outcome),observed(the saved object) andnext_occurrence. Read `operation.status`, not `is_completed`: completing a recurring reminder advances the same item to its next occurrence, sois_completedcan befalseafter a successful write.next_occurrence.status: "confirmed"carries the next due (also in the message);"unknown"is not a failure — never repeat the write because of it.
| Task | Tool | When to Use |
|---|---|---|
| Create multiple | create_events_batch | Recurring meetings, series (it cannot set reminders: an event module creates its events one by one with create_event) |
| Move multiple | move_events_batch | Calendar migration |
| Delete multiple | delete_events_batch | Cleanup old events |
| Find duplicates | find_duplicate_events | Before merging calendars |
If the input matches a module's trigger in rules/event-modules.md (today: a conference program or a booking for a stay) and that module is on, build it as the module says instead of the steps below for what the module handles (a program, a stay); other items in the same message, such as a flight, still go through the steps below; otherwise carry on below.
1. Resolve calendar_name → name from the user, else the folder's calendar_routing rules (rules/calendar-routing.md), else ask
2. check_conflicts(start_time, end_time) → Ensure no overlap
3. create_event(title, start_time, end_time, calendar_name, location?, alarms_minutes_offsets?)
4. Report how the calendar was decided (the `Routed to …` / `Not routed: …` line)Skip specific dates (e.g. holidays) when creating a recurring event, via recurrence.excluded_occurrence_dates:
create_event({
"title": "Weekly seminar",
"start_time": "2026-09-07T14:00:00+08:00",
"end_time": "2026-09-07T16:00:00+08:00",
"calendar_name": "Work",
"recurrence": {
"frequency": "weekly",
"excluded_occurrence_dates": ["2026-09-28", "2026-10-05"]
}
})occurrence_date; date-only values are interpreted in the event timezone. Max 100, duplicates rejected.undo removes the whole series including exclusions.excluded_occurrence_dates (normalized yyyy-MM-dd) + exclusion_count. Also available per-item in create_events_batch (reported per-item).update_event and create_reminder reject this field — it is creation-time only.1. list_events_quick(range: "this_week") → See upcoming events
2. list_reminders(completed: false) → See pending tasks
3. search_events(keywords: ["important"]) → Find priority items1. list_calendars() → Identify source/target
2. find_duplicate_events(calendars, date_range) → Check for duplicates
3. move_events_batch(event_ids, target_calendar) → Move eventsWhen multiple calendars have the same name (e.g., "Work" in both iCloud and Google):
create_event(
calendar_name: "Work",
calendar_source: "iCloud", ← Specify the source
...
)Available sources: "iCloud", "Google", "Exchange", "CalDAV", "Local"
rules/calendar-routing.md first; ask only when no rule applies~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.