Create and manage calendar projects for scheduling, content planning, and event management. Use when user wants to create a calendar, schedule events, or build a content/publishing calendar.
73
90%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Create and manage interactive calendar projects. Each calendar project is a folder containing index.html (visualization), magic.project.js (metadata and categories), and events/ (monthly event files). All data operations go through tools — do not manually read or edit these files.
1. Create project folder (shell_exec: mkdir)
2. setup_calendar_project → initialize calendar
3. manage_calendar → add categories (optional)
4. manage_calendar → add events (batch or one-by-one)User request
├── Create new calendar → setup_calendar_project
├── Add event/schedule/plan → manage_calendar (add_event)
├── View/query events → manage_calendar (list_events)
├── Modify existing event → manage_calendar (update_event)
├── Delete/cancel event → manage_calendar (delete_event)
├── Add event category → manage_calendar (add_category)
└── View categories → manage_calendar (list_categories)Initialize a calendar project in an existing folder. You must create the folder first via shell_exec.
| Param | Required | Type | Description |
|---|---|---|---|
project_path | yes | string | Existing folder path (relative to workspace). Name according to user's language |
calendar_name | yes | string | Calendar display name |
description | no | string | Calendar description |
timezone | no | string | IANA timezone identifier, default Asia/Shanghai |
initial_categories | no | string | JSON array string. Example: '[{"id":"publish","name":"Publish","color":"#4CAF50"}]' |
Manage calendar events and categories.
| Param | Type | Description |
|---|---|---|
action | string | add_event / list_events / update_event / delete_event / add_category / list_categories |
project_path | string | Calendar project folder path (relative to workspace) |
Only title + start are required. All other fields are optional with sensible defaults.
| Param | Required | Type | Description |
|---|---|---|---|
title | yes | string | Event title |
start | yes | string | YYYY-MM-DD HH:MM for timed events; YYYY-MM-DD for all-day events |
end | no | string | Same format as start. Default: timed +1h, all-day same day |
description | no | string | Event description |
location | no | string | Location |
status | no | string | confirmed (default) / tentative / cancelled / completed |
category | no | string | Category ID (must exist) |
recurrence | no | string | Recurrence rule as JSON string (see below) |
All filters are optional. No filters = return all events.
| Param | Type | Description |
|---|---|---|
date_from | string | Start date filter (YYYY-MM-DD) |
date_to | string | End date filter, inclusive (YYYY-MM-DD) |
category | string | Filter by category ID |
keyword | string | Search in title and description |
Partial update — only pass fields you want to change.
| Param | Required | Type | Description |
|---|---|---|---|
event_id | yes | string | Event ID (from add_event or list_events result) |
title | no | string | New title |
start | no | string | New start time |
end | no | string | New end time |
description | no | string | New description |
location | no | string | New location |
status | no | string | New status |
category | no | string | New category ID |
recurrence | no | string | New recurrence rule (JSON string) |
| Param | Required | Type | Description |
|---|---|---|---|
event_id | yes | string | Event ID |
| Param | Required | Type | Description |
|---|---|---|---|
category_id | yes | string | Alphanumeric identifier (e.g. meeting, publish) |
category_name | yes | string | Display name |
category_color | yes | string | Hex color (e.g. #4CAF50) |
No additional parameters.
Pass as JSON string in the recurrence parameter:
{"type": "daily", "interval": 1, "end_date": "2026-06-30"}
{"type": "weekly", "interval": 1, "days_of_week": [1, 3, 5]}
{"type": "monthly", "interval": 1, "day_of_month": 15, "end_date": "2026-12-31"}type: daily / weekly / monthlyinterval: repeat every N days/weeks/months, default 1days_of_week: for weekly only, 1=Mon … 7=Sunday_of_month: for monthly, defaults to the day from startend_date: YYYY-MM-DD, omit for indefinitefrom sdk.tool import tool
# 1. Create project folder
tool.call("shell_exec", {"command": "mkdir -p .workspace/content-calendar"})
# 2. Setup calendar with initial categories
tool.call("setup_calendar_project", {
"project_path": "content-calendar",
"calendar_name": "Content Publishing Calendar",
"description": "30-day rolling content plan",
"initial_categories": '[{"id":"publish","name":"Publish","color":"#4CAF50"},{"id":"review","name":"Review","color":"#2196F3"}]'
})
# 3. Minimal event (title + start only)
tool.call("manage_calendar", {
"action": "add_event",
"project_path": "content-calendar",
"title": "Weekly standup",
"start": "2026-04-21 10:00"
})
# 4. Full event
tool.call("manage_calendar", {
"action": "add_event",
"project_path": "content-calendar",
"title": "Product review video",
"start": "2026-04-22 14:00",
"end": "2026-04-22 15:30",
"category": "publish",
"location": "Studio 3F",
"description": "30s vertical tutorial"
})
# 5. Recurring event
tool.call("manage_calendar", {
"action": "add_event",
"project_path": "content-calendar",
"title": "Content review meeting",
"start": "2026-04-21 09:00",
"recurrence": '{"type":"weekly","interval":1,"days_of_week":[1,3,5],"end_date":"2026-06-30"}'
})
# 6. All-day event (date-only start)
tool.call("manage_calendar", {
"action": "add_event",
"project_path": "content-calendar",
"title": "Product launch day",
"start": "2026-05-01",
"category": "publish"
})from sdk.tool import tool
# Query by date range
result = tool.call("manage_calendar", {
"action": "list_events",
"project_path": "content-calendar",
"date_from": "2026-04-21",
"date_to": "2026-04-27"
})
print(result.content)
# Mark event as completed
tool.call("manage_calendar", {
"action": "update_event",
"project_path": "content-calendar",
"event_id": "evt_a7f3b2",
"status": "completed"
})
# Delete event
tool.call("manage_calendar", {
"action": "delete_event",
"project_path": "content-calendar",
"event_id": "evt_c3d4e5"
})setup_calendar_project does not create folders; use shell_exec beforehandid when creating; use the returned ID for update/deleteYYYY-MM-DD HH:MM for timed events, YYYY-MM-DD for all-day. No seconds or timezone suffixes41d7ef4
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.