macos-calendar
macOS Calendar
Manage Apple Calendar events via $SKILL_DIR/scripts/calendar.sh. All date handling uses relative math (current date + N * days) to avoid locale issues (FR/EN/DE date formats).
Quick start
List calendars
Always list calendars first to find the correct calendar name:
"$SKILL_DIR/scripts/calendar.sh" list-calendars
Create an event
echo '<json>' | "$SKILL_DIR/scripts/calendar.sh" create-event
JSON fields:
| Field | Required | Default | Description |
|---|---|---|---|
summary |
yes | - | Event title |
calendar |
no | first calendar | Calendar name (from list-calendars) |
description |
no | "" | Event notes |
offset_days |
no | 0 | Days from today (0=today, 1=tomorrow, 7=next week) |
iso_date |
no | - | Absolute date YYYY-MM-DD (overrides offset_days) |
hour |
no | 9 | Start hour (0-23) |
minute |
no | 0 | Start minute (0-59) |
duration_minutes |
no | 30 | Duration |
alarm_minutes |
no | 0 | Alert N minutes before (0=no alarm) |
all_day |
no | false | All-day event |
recurrence |
no | - | iCal RRULE string. See references/recurrence.md |
Interpreting natural language
Map user requests to JSON fields:
| User says | JSON |
|---|---|
| "tomorrow at 2pm" | offset_days: 1, hour: 14 |
| "in 3 days" | offset_days: 3 |
| "next Monday at 10am" | Calculate offset_days from today to next Monday, hour: 10 |
| "February 25 at 3:30pm" | iso_date: "2026-02-25", hour: 15, minute: 30 |
| "every weekday at 9am" | hour: 9, recurrence: "FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR" |
| "remind me 1 hour before" | alarm_minutes: 60 |
| "all day event on March 1" | iso_date: "2026-03-01", all_day: true |
For "next Monday", "next Friday" etc: compute the day offset using the current date. Use date command if needed:
# Days until next Monday (1=Monday)
target=1; today=$(date +%u); echo $(( (target - today + 7) % 7 ))
Example prompts
These are real user prompts and the commands you should run:
"Remind me to call the dentist in 2 days"
"$SKILL_DIR/scripts/calendar.sh" list-calendars
Then:
echo '{"calendar":"Personnel","summary":"Call dentist","offset_days":2,"hour":9,"duration_minutes":15,"alarm_minutes":30}' | "$SKILL_DIR/scripts/calendar.sh" create-event
"Schedule a team sync every Tuesday at 2pm with a 10-min reminder"
echo '{"calendar":"Work","summary":"Team sync","hour":14,"duration_minutes":60,"recurrence":"FREQ=WEEKLY;BYDAY=TU","alarm_minutes":10}' | "$SKILL_DIR/scripts/calendar.sh" create-event
"Block July 15 as a vacation day"
echo '{"calendar":"Personnel","summary":"Vacances","iso_date":"2026-07-15","all_day":true}' | "$SKILL_DIR/scripts/calendar.sh" create-event
"I have a doctor appointment next Thursday at 3:30pm, remind me 1 hour before"
# First compute offset_days to next Thursday (4=Thursday)
target=4; today=$(date +%u); offset=$(( (target - today + 7) % 7 )); [ "$offset" -eq 0 ] && offset=7
Then:
echo "{\"calendar\":\"Personnel\",\"summary\":\"Doctor appointment\",\"offset_days\":$offset,\"hour\":15,\"minute\":30,\"duration_minutes\":60,\"alarm_minutes\":60}" | "$SKILL_DIR/scripts/calendar.sh" create-event
"Set up a daily standup at 9am on weekdays for the next 4 weeks"
echo '{"calendar":"Work","summary":"Daily standup","hour":9,"duration_minutes":15,"recurrence":"FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR;COUNT=20"}' | "$SKILL_DIR/scripts/calendar.sh" create-event
"Add a biweekly 1-on-1 with my manager on Fridays at 11am"
echo '{"calendar":"Work","summary":"1-on-1 Manager","hour":11,"duration_minutes":30,"recurrence":"FREQ=WEEKLY;INTERVAL=2;BYDAY=FR","alarm_minutes":5}' | "$SKILL_DIR/scripts/calendar.sh" create-event
Critical rules
- Always list calendars first if the user hasn't specified one — calendars marked
[read-only]cannot be used for event creation - Never use hardcoded date strings in AppleScript — always use
offset_daysoriso_date - Confirm the calendar name with the user if multiple personal calendars exist
- Never target a
[read-only]calendar — the script will reject it with an error - For recurring events, consult references/recurrence.md for RRULE syntax
- Pass JSON via stdin — never as a CLI argument (avoids leaking data in process list)
- All fields are validated by the script (type coercion, range checks, format validation) — invalid input is rejected with an error message
- All actions are logged to
logs/calendar.logwith timestamp, command, calendar, and summary
More from lucaperret/agent-skills
macos-reminders
Create, list, and manage macOS Reminders via AppleScript. Use when the user asks to create a reminder, add a to-do, make a task, set a reminder for something, or anything involving Apple Reminders on macOS. Triggers on requests like "remind me to buy milk", "add a to-do to call the dentist", "create a reminder for Friday", "add to my shopping list", "flag this as important". macOS only.
46macos-notes
Create, read, search, and manage macOS Notes via AppleScript. Use when the user asks to take a note, jot something down, save an idea, create meeting notes, read a note, search notes, or anything involving Apple Notes on macOS. Triggers on requests like "note this down", "save this as a note", "create a note about X", "show my notes", "search my notes for X", "what did I write about X". macOS only.
33mcp-oauth
Add OAuth 2.0 PKCE authentication to a remote MCP server. Use this skill whenever the user wants to add authentication to an MCP server, protect MCP tools with OAuth, implement login flow for an MCP connector, add user auth to an MCP endpoint, or set up token-based access for MCP. Also triggers on: 'MCP OAuth', 'MCP authentication', 'withMcpAuth', 'MCP login flow', 'protect MCP endpoint', 'MCP token auth', 'dynamic client registration MCP', 'Claude connector OAuth'. Even if the user just says 'add auth to my MCP server' or 'my MCP server needs login', use this skill.
8mcp-vercel
Deploy a remote MCP server on Vercel with Next.js and mcp-handler. Use this skill whenever the user wants to create an MCP server, deploy MCP to Vercel, set up a remote MCP endpoint, add MCP tools to a Next.js app, or host an MCP server in the cloud. Also triggers on: 'deploy MCP', 'remote MCP', 'MCP endpoint', 'mcp-handler', 'MCP on Vercel', 'Streamable HTTP MCP', 'Claude connector backend', 'host MCP server for Claude Desktop'. Even if the user just says 'I want to make my API available to Claude' or 'set up an MCP server', use this skill.
8anthropic-connector-submit
Prepare and submit an MCP server to Anthropic's Connectors Directory. Use this skill whenever the user wants to list their MCP server on Claude's connector marketplace, submit to Anthropic's directory, get their MCP server featured in Claude Desktop or claude.ai, or prepare a connector submission. Also triggers on: 'submit to Anthropic', 'Claude connector directory', 'list on Claude marketplace', 'Anthropic MCP submission', 'get listed in Claude connectors', 'MCP directory submission form'. Even if the user just says 'how do I get my MCP server in the Claude directory' or 'I want Claude users to find my server', use this skill.
8