Agent skill
outlook-calendar
Read Outlook calendar events via ICS subscription. Use when user asks about meetings, schedule, calendar, appointments, or availability.
Install this agent skill to your Project
npx add-skill https://github.com/keith-hung/Calendar-Skill/tree/main/outlook-calendar
SKILL.md
Outlook Calendar Reader
Overview
This skill reads calendar events from Outlook via ICS subscription URL.
When to Use
- User asks about today's meetings or schedule
- User asks about upcoming events
- User wants to check availability
- User asks "What's on my calendar?"
ICS URL Configuration
ICS URL: <YOUR_ICS_URL_HERE>
⚠️ Setup Required: Replace
<YOUR_ICS_URL_HERE>above with your actual ICS URL.How to get your ICS URL:
- Open Outlook Web
- Go to Calendar → Settings (gear icon) → View all Outlook settings
- Calendar → Shared calendars → Publish a calendar
- Select calendar and permissions → Publish → Copy ICS link
Execution Steps
Method 1: Use ics_parser.py (Recommended)
The skill includes ics_parser.py that handles all parsing and RRULE expansion.
Prerequisite: uv must be installed.
# Get today's date
TODAY=$(date +%Y-%m-%d)
# Parse events for today
uv run ~/.claude/skills/outlook-calendar/ics_parser.py \
--url "ICS_URL_HERE" \
--start "$TODAY" \
--end "$TODAY"
# Parse events for a date range
uv run ~/.claude/skills/outlook-calendar/ics_parser.py \
--url "ICS_URL_HERE" \
--start 2025-12-01 \
--end 2025-12-31
# Output as JSON
uv run ~/.claude/skills/outlook-calendar/ics_parser.py \
--url "ICS_URL_HERE" \
--start 2025-12-01 \
--end 2025-12-31 \
--format json
# Debug mode (shows event counts)
uv run ~/.claude/skills/outlook-calendar/ics_parser.py \
--url "ICS_URL_HERE" \
--start 2025-12-01 \
--end 2025-12-31 \
--debug
Method 2: Manual Parsing with WebFetch
If the script is not available, use WebFetch and parse manually:
- Fetch ICS: Use WebFetch to retrieve the ICS URL
- Parse Events: Extract VEVENT blocks
- Handle RRULE: Expand recurring events (see RRULE Reference below)
- Filter & Format: Filter by date range and output as table
Script Features
The ics_parser.py script handles:
- ✅ All 3 DTSTART formats (UTC, TZID, all-day)
- ✅ RRULE expansion (WEEKLY, DAILY with BYDAY, INTERVAL, UNTIL, COUNT)
- ✅ Automatic timezone conversion (UTC → Taipei UTC+8)
- ✅ Dependencies auto-installed by uv
- ✅ Table or JSON output format
- ✅ Debug mode for troubleshooting
Output Format
The script outputs a markdown table:
| Date | Time | Event | Location |
|---|---|---|---|
| 2025-12-02 (Tue) | 10:30-11:00 | 🔄 Standup Meeting | Microsoft Teams |
| 2025-12-02 (Tue) | 14:00-15:00 | 🔄 Weekly Meeting | Conference Room |
| 2025-12-03 (Wed) | 09:00-10:00 | Project Review | Zoom |
- 🔄 indicates a recurring event
RRULE Reference
Identify Recurring Events
A VEVENT with RRULE is a recurring event:
BEGIN:VEVENT
DTSTART;TZID=Taipei Standard Time:20250424T103000
RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR
SUMMARY:Standup Meeting
END:VEVENT
Common RRULE Parameters
| Parameter | Meaning | Example |
|---|---|---|
FREQ |
Frequency | DAILY, WEEKLY, MONTHLY, YEARLY |
INTERVAL |
Every N periods | 2 = every 2 weeks |
BYDAY |
Day of week | MO, TU, WE, TH, FR, SA, SU |
UNTIL |
End date | 20251231T235959Z |
COUNT |
Total occurrences | 10 |
DTSTART Formats
Outlook ICS uses 3 different formats:
| Format | Example | Timezone |
|---|---|---|
| UTC | DTSTART:20251211T060000Z |
UTC (convert +8) |
| With TZID | DTSTART;TZID=Taipei Standard Time:20250424T103000 |
Local time |
| All-day | DTSTART;VALUE=DATE:20251225 |
Date only |
Example Queries
- "What meetings do I have today?"
- "Show my calendar for this week"
- "Am I free tomorrow afternoon?"
- "What's on my schedule for 12/5?"
Troubleshooting
Quick Debug
# Run with debug flag
uv run ics_parser.py --url "..." --start 2025-12-01 --end 2025-12-31 --debug
Output shows:
- Total VEVENTs in ICS
- Number of recurring events
- Whether dateutil is available
- Events found in range
Common Issues
| Issue | Solution |
|---|---|
uv: command not found |
Install uv: curl -LsSf https://astral.sh/uv/install.sh | sh |
| No events found | Check date range matches your query |
| Script not found | Run install.sh to install skill |
| ICS URL placeholder | Edit SKILL.md and configure your ICS URL |
Error Handling
- If ICS URL shows placeholder: Guide user to edit this file and configure their ICS URL
- If uv not found: Install uv first (see README)
- If no events found: Confirm the date range and calendar permissions
- If parsing fails: Use
--debugflag to see event counts
Recommended Agent Skills
Expand your agent's capabilities with these related and highly-rated skills.
setup-pre-commit
Set up Husky pre-commit hooks with lint-staged (Prettier), type checking, and tests in the current repo. Use when user wants to add pre-commit hooks, set up Husky, configure lint-staged, or add commit-time formatting/typechecking/testing.
git-guardrails-claude-code
Set up Claude Code hooks to block dangerous git commands (push, reset --hard, clean, branch -D, etc.) before they execute. Use when user wants to prevent destructive git operations, add git safety hooks, or block git push/reset in Claude Code.
scaffold-exercises
Create exercise directory structures with sections, problems, solutions, and explainers that pass linting. Use when user wants to scaffold exercises, create exercise stubs, or set up a new course section.
migrate-to-shoehorn
Migrate test files from `as` type assertions to @total-typescript/shoehorn. Use when user mentions shoehorn, wants to replace `as` in tests, or needs partial test data.
obsidian-vault
Search, create, and manage notes in the Obsidian vault with wikilinks and index notes. Use when user wants to find, create, or organize notes in Obsidian.
handoff
Compact the current conversation into a handoff document for another agent to pick up.
Didn't find tool you were looking for?