Multi-provider calendar CLI for AI agents.
agentcal unifies local calendar data from:
- Google Calendar
- Microsoft Outlook (Graph API)
- iCloud (CalDAV / ICS)
It is designed for OpenClaw workflows where agents need fast, local calendar reads without opening web UIs.
- Single command view of today
- 7-day week agenda
- Provider sync helper
- Interactive setup wizard
- Natural language availability checks (
"tomorrow 2pm-4pm")
git clone https://github.com/perryraskin/agentcal.git
cd agentcal
chmod +x scripts/*.shOptional: add aliases or a wrapper in your PATH.
agentcal/
SKILL.md
README.md
scripts/
today.sh
week.sh
sync.sh
setup.sh
available.sh
references/
google-setup.md
microsoft-setup.md
icloud-setup.md
agentcal reads already-synced local files in ~/.calendars/:
- Google:
~/.calendars/google/*.json- Expects
items[].start.dateTimeoritems[].start.date - Event title from
items[].summary
- Expects
- Outlook:
~/.calendars/outlook/events.json- Expects
value[].start.dateTime - Event title from
value[].subject
- Expects
- iCloud:
~/.calendars/icloud/**/*.ics- Parses
DTSTARTandSUMMARYfrom ICS entries
- Parses
./scripts/today.shExample output:
=== Today's Schedule (2026-02-25) ===
09:00 AM Standup [Outlook]
03:00 PM Client call [Google]
./scripts/week.sh./scripts/sync.shThis calls existing local tooling if available:
~/.openclaw/workspace/scripts/calendar/fetch-calendars.sh~/.openclaw/workspace/scripts/calendar/fetch-outlook-graph.shvdirsyncer sync icloud_calendar
./scripts/setup.shInteractive guide for:
- Google OAuth app + Calendar API
- Microsoft Entra app + Graph device code flow
- iCloud app-specific password + CalDAV/vdirsyncer
./scripts/available.sh "tomorrow 2pm-4pm"
./scripts/available.sh "friday 10am-11:30am"
./scripts/available.sh "2026-03-01 09:00-12:00"Output:
✓ Available- or
✗ Conflict: <event> at <time>
This repository includes SKILL.md metadata for OpenClaw.
Typical agent flow:
- Run
scripts/sync.sh - Read schedule with
scripts/today.shorscripts/week.sh - Validate slots via
scripts/available.sh "..."
- Times are normalized to local timezone where possible.
- All-day events render at
12:00 AMon their date. - Missing/unconfigured providers are skipped gracefully.