Pear — iCloud Integration
Pear provides read/write access to iCloud Calendar, Reminders, and Contacts through 27 MCP tools. All tools are prefixed with pear_ and communicate with iCloud via CalDAV/CardDAV protocols.
When to Use
Activate this skill when the user wants to:
- Check their schedule, upcoming events, or daily agenda
- Create, update, or delete calendar events
- Manage reminders or to-do lists
- Look up, create, or update contacts
- Find free time slots or schedule meetings
- Get a daily briefing of events and tasks
- Check availability for a specific time
- Work with contact groups
- Perform bulk operations on events, reminders, or contacts
Activation triggers:
- "What's on my calendar", "my schedule", "upcoming events"
- "Remind me to", "add a reminder", "my tasks", "to-do"
- "Find contact", "add a contact", "phone number for"
- "Schedule a meeting", "find a time", "when am I free"
- "Daily briefing", "what's today look like"
- "Birthday", "anniversaries"
Do NOT activate for:
- Apple Notes (not supported — CalDAV only)
- Apple Mail or iMessage
- iCloud Drive or file storage
- Apple Music, Photos, or other non-PIM services
- Local macOS Calendar.app scripting (Pear works cross-platform via API)
Prerequisites
Required Environment Variable:
PEAR_API_KEY — Your Pear API key (format: pear_sk_...)
Optional:
PEAR_MCP_URL — Custom endpoint URL (defaults to https://pearmcp.com/api/mcp)
Tool Reference
Events (8 tools)
| Tool |
Description |
pear_list_calendars |
List all iCloud calendars (including read-only subscriptions) |
pear_list_events |
List events in a time range, with pagination and calendar filtering |
pear_search_events |
Search events by title or description within a date range |
pear_create_event |
Create an event with optional recurrence, alarms, attendees, and location |
pear_update_event |
Update an existing event's properties |
pear_delete_event |
Delete an event by filename |
pear_find_free_slots |
Find available time slots of a given duration |
pear_check_availability |
Check if a specific time slot is free, returns conflicts |
Reminders (4 tools)
| Tool |
Description |
pear_list_reminders |
List reminders with optional list filtering, includes completed toggle |
pear_create_reminder |
Create a reminder with optional due date, priority (1=high, 5=med, 9=low), and notes |
pear_update_reminder |
Update a reminder's properties |
pear_complete_reminder |
Mark a reminder as completed |
Contacts (9 tools)
| Tool |
Description |
pear_list_contacts |
List all contacts with full vCard data (phones, emails, addresses, birthdays) |
pear_search_contacts |
Search by name, email, phone, or organization |
pear_create_contact |
Create a contact with full vCard support including photo |
pear_update_contact |
Update contact fields (merges with existing data) |
pear_delete_contact |
Delete a contact |
pear_list_contact_groups |
List all contact groups with member counts |
pear_create_contact_group |
Create a new contact group |
pear_add_contact_to_group |
Add a contact to a group by name or email |
pear_update_contact_photo |
Update a contact's photo (Base64, data URI, or external URL) |
Briefing (1 tool)
| Tool |
Description |
pear_get_daily_briefing |
Get today's events and pending reminders in one call. Enriches attendees with contact data. |
Scheduling (1 tool)
| Tool |
Description |
pear_find_best_time |
AI-scored optimal meeting slots. Considers work hours, time-of-day preference, day-of-week preference, buffer time, and reminder deadlines. |
Batch Operations (4 tools)
| Tool |
Description |
pear_create_events_batch |
Create up to 50 events in one call |
pear_create_reminders_batch |
Create up to 50 reminders in one call |
pear_create_contacts_batch |
Create up to 50 contacts in one call |
pear_delete_contacts_batch |
Delete up to 50 contacts in one call |
Workflow Guidelines
Dates and Times
- Always use ISO 8601 format:
2025-06-15T14:30:00Z or 2025-06-15T14:30:00+10:00
- Timezone parameter: Pass
timezone (IANA format like America/New_York or Australia/Sydney) for user-friendly display times
- All-day events: Set
isAllDay: true and use date-only format 2025-06-15
- Date ranges:
pear_list_events requires a timeRange object: { start: "...", end: "..." }
Creating Events
When creating events, follow this pattern:
- If the user doesn't specify a calendar, omit
calendarName — Pear auto-selects the default
- For recurring events, use the
recurrence object: { frequency: "WEEKLY", interval: 1, count: 10 }
- For attendees, you can pass names — Pear resolves them against the user's contacts automatically
- Use
idempotencyKey when retrying to prevent duplicate events
- Alarms use minutes before:
{ action: "display", trigger: 15 } for a 15-minute reminder
Finding Meeting Times
For scheduling, prefer pear_find_best_time over pear_find_free_slots:
pear_find_best_time returns AI-scored slots considering work hours, preferences, and existing commitments
- Pass
preferences to customize: { timeOfDay: "morning", focusTime: true, workHoursStart: 9, workHoursEnd: 17 }
pear_find_free_slots is simpler — just returns raw available slots without scoring
Reminders
- Reminders are accessed via CalDAV (VTODO protocol) — basic operations work well (title, due date, priority, notes, completion). Modern Apple Reminders features like subtasks, tags, smart lists, and location-based reminders are not available via CalDAV.
- Priority values:
1 = high, 5 = medium, 9 = low, 0 = none
- To list only incomplete reminders, use
includeCompleted: false (default)
- Reminder lists are auto-created if they don't exist when using
listName
Contacts
pear_update_contact merges fields — it won't erase data you don't include in the update
- Birthday format:
YYYY-MM-DD for full date, --MM-DD for year-unknown
- Phone/email can be a single string or an array for multiple entries
- Contact photos accept Base64 or data URI format
Virtual Birthdays
Pear generates all-day birthday events from contact birthday fields. These appear as events on a "Birthdays" calendar when listing events. This is a synthesized feature — Apple's native Birthdays calendar is not exposed via CalDAV.
Daily Briefing
pear_get_daily_briefing is the most efficient way to give the user an overview:
- Returns today's events + pending reminders in a single call
- Automatically enriches event attendees with contact details (name, email, phone)
- Pass
timezone for correct day boundaries
- Pass
date to get a briefing for a different day
Safety & Confirmation
Actions Requiring Care
| Action |
Risk |
Guidance |
pear_delete_event |
Removes event permanently |
Confirm event title and date with user before deleting |
pear_delete_contact |
Removes contact permanently |
Always confirm — show contact name first |
pear_delete_contacts_batch |
Bulk delete up to 50 contacts |
Require explicit user confirmation with count |
pear_update_event |
Overwrites event fields |
Summarize changes before applying |
pear_complete_reminder |
Marks as done |
Safe — can be undone by updating completed: false |
| Batch create operations |
Creates up to 50 items |
Confirm count and summarize before executing |
Data Safety
- Read operations are always safe — listing, searching, and briefings have no side effects
- Updates merge, not replace —
pear_update_contact preserves fields you don't mention
- Batch operations are rate-limited — chunks of 5 with 200ms delays, no need to throttle manually
- Never expose the user's
PEAR_API_KEY — treat it as a secret
Error Handling
| Error Code |
Meaning |
What to Do |
-32001 |
Missing or invalid API key |
Check PEAR_API_KEY is set correctly |
-32602 |
Invalid parameters |
Check parameter names and types against tool reference |
-32603 |
Server error |
Retry once, then report to user |
404 on event/reminder |
Item not found |
The filename may have changed — re-list to get current filenames |
| Calendar is read-only |
Cannot modify subscription calendars |
List calendars first to check which are writable |
Common Patterns
Error Recovery (Idempotency)
Event creation failed mid-request or timed out:
→ Retry pear_create_event with the same idempotencyKey
→ Pear deduplicates — no double-booking even if the first request succeeded silently
Morning Briefing
User: "What's on my plate today?"
→ Call pear_get_daily_briefing with timezone
→ Summarize events chronologically, then pending reminders
Schedule a Meeting
User: "Find time for a 1-hour meeting this week"
→ Call pear_find_best_time with durationMinutes: 60 and this week's range
→ Present top 3 options with scores
→ On user selection, call pear_create_event
Quick Reminder
User: "Remind me to call the dentist tomorrow"
→ Call pear_create_reminder with title and dueDate set to tomorrow
Contact Lookup
User: "What's Sarah's phone number?"
→ Call pear_search_contacts with query: "Sarah"
→ Return matching contacts with phone numbers
Bulk Event Creation
User: "Add these 5 meetings to my calendar"
→ Call pear_create_events_batch with all events in one request
→ Summarize results (created count, any failures)
References
1---2name: pear-icloud-calendar-reminders-contacts3description: iCloud Calendar, Reminders & Contacts via Pear. Manage events, reminders, contacts, daily briefings, and AI scheduling. 27 tools for Apple iCloud via CalDAV/CardDAV.4---56# Pear — iCloud Integration78Pear provides read/write access to iCloud Calendar, Reminders, and Contacts through 27 MCP tools. All tools are prefixed with `pear_` and communicate with iCloud via CalDAV/CardDAV protocols.910## When to Use1112**Activate this skill when the user wants to:**13- Check their schedule, upcoming events, or daily agenda14- Create, update, or delete calendar events15- Manage reminders or to-do lists16- Look up, create, or update contacts17- Find free time slots or schedule meetings18- Get a daily briefing of events and tasks19- Check availability for a specific time20- Work with contact groups21- Perform bulk operations on events, reminders, or contacts2223**Activation triggers:**24- "What's on my calendar", "my schedule", "upcoming events"25- "Remind me to", "add a reminder", "my tasks", "to-do"26- "Find contact", "add a contact", "phone number for"27- "Schedule a meeting", "find a time", "when am I free"28- "Daily briefing", "what's today look like"29- "Birthday", "anniversaries"3031**Do NOT activate for:**32- Apple Notes (not supported — CalDAV only)33- Apple Mail or iMessage34- iCloud Drive or file storage35- Apple Music, Photos, or other non-PIM services36- Local macOS Calendar.app scripting (Pear works cross-platform via API)3738## Prerequisites3940**Required Environment Variable:**41- `PEAR_API_KEY` — Your Pear API key (format: `pear_sk_...`)42 - Sign up at [pearmcp.com](https://pearmcp.com)43 - Generate an API key from the dashboard44 - Connect your iCloud account (requires an [app-specific password](https://support.apple.com/en-us/102654))4546**Optional:**47- `PEAR_MCP_URL` — Custom endpoint URL (defaults to `https://pearmcp.com/api/mcp`)4849## Tool Reference5051### Events (8 tools)5253| Tool | Description |54|------|-------------|55| `pear_list_calendars` | List all iCloud calendars (including read-only subscriptions) |56| `pear_list_events` | List events in a time range, with pagination and calendar filtering |57| `pear_search_events` | Search events by title or description within a date range |58| `pear_create_event` | Create an event with optional recurrence, alarms, attendees, and location |59| `pear_update_event` | Update an existing event's properties |60| `pear_delete_event` | Delete an event by filename |61| `pear_find_free_slots` | Find available time slots of a given duration |62| `pear_check_availability` | Check if a specific time slot is free, returns conflicts |6364### Reminders (4 tools)6566| Tool | Description |67|------|-------------|68| `pear_list_reminders` | List reminders with optional list filtering, includes completed toggle |69| `pear_create_reminder` | Create a reminder with optional due date, priority (1=high, 5=med, 9=low), and notes |70| `pear_update_reminder` | Update a reminder's properties |71| `pear_complete_reminder` | Mark a reminder as completed |7273### Contacts (9 tools)7475| Tool | Description |76|------|-------------|77| `pear_list_contacts` | List all contacts with full vCard data (phones, emails, addresses, birthdays) |78| `pear_search_contacts` | Search by name, email, phone, or organization |79| `pear_create_contact` | Create a contact with full vCard support including photo |80| `pear_update_contact` | Update contact fields (merges with existing data) |81| `pear_delete_contact` | Delete a contact |82| `pear_list_contact_groups` | List all contact groups with member counts |83| `pear_create_contact_group` | Create a new contact group |84| `pear_add_contact_to_group` | Add a contact to a group by name or email |85| `pear_update_contact_photo` | Update a contact's photo (Base64, data URI, or external URL) |8687### Briefing (1 tool)8889| Tool | Description |90|------|-------------|91| `pear_get_daily_briefing` | Get today's events and pending reminders in one call. Enriches attendees with contact data. |9293### Scheduling (1 tool)9495| Tool | Description |96|------|-------------|97| `pear_find_best_time` | AI-scored optimal meeting slots. Considers work hours, time-of-day preference, day-of-week preference, buffer time, and reminder deadlines. |9899### Batch Operations (4 tools)100101| Tool | Description |102|------|-------------|103| `pear_create_events_batch` | Create up to 50 events in one call |104| `pear_create_reminders_batch` | Create up to 50 reminders in one call |105| `pear_create_contacts_batch` | Create up to 50 contacts in one call |106| `pear_delete_contacts_batch` | Delete up to 50 contacts in one call |107108## Workflow Guidelines109110### Dates and Times111112- **Always use ISO 8601 format**: `2025-06-15T14:30:00Z` or `2025-06-15T14:30:00+10:00`113- **Timezone parameter**: Pass `timezone` (IANA format like `America/New_York` or `Australia/Sydney`) for user-friendly display times114- **All-day events**: Set `isAllDay: true` and use date-only format `2025-06-15`115- **Date ranges**: `pear_list_events` requires a `timeRange` object: `{ start: "...", end: "..." }`116117### Creating Events118119When creating events, follow this pattern:1201211. If the user doesn't specify a calendar, omit `calendarName` — Pear auto-selects the default1222. For recurring events, use the `recurrence` object: `{ frequency: "WEEKLY", interval: 1, count: 10 }`1233. For attendees, you can pass names — Pear resolves them against the user's contacts automatically1244. Use `idempotencyKey` when retrying to prevent duplicate events1255. Alarms use minutes before: `{ action: "display", trigger: 15 }` for a 15-minute reminder126127### Finding Meeting Times128129For scheduling, prefer `pear_find_best_time` over `pear_find_free_slots`:130131- `pear_find_best_time` returns AI-scored slots considering work hours, preferences, and existing commitments132- Pass `preferences` to customize: `{ timeOfDay: "morning", focusTime: true, workHoursStart: 9, workHoursEnd: 17 }`133- `pear_find_free_slots` is simpler — just returns raw available slots without scoring134135### Reminders136137- Reminders are accessed via CalDAV (VTODO protocol) — basic operations work well (title, due date, priority, notes, completion). Modern Apple Reminders features like subtasks, tags, smart lists, and location-based reminders are not available via CalDAV.138- Priority values: `1` = high, `5` = medium, `9` = low, `0` = none139- To list only incomplete reminders, use `includeCompleted: false` (default)140- Reminder lists are auto-created if they don't exist when using `listName`141142### Contacts143144- `pear_update_contact` merges fields — it won't erase data you don't include in the update145- Birthday format: `YYYY-MM-DD` for full date, `--MM-DD` for year-unknown146- Phone/email can be a single string or an array for multiple entries147- Contact photos accept Base64 or data URI format148149### Virtual Birthdays150151Pear generates all-day birthday events from contact birthday fields. These appear as events on a "Birthdays" calendar when listing events. This is a synthesized feature — Apple's native Birthdays calendar is not exposed via CalDAV.152153### Daily Briefing154155`pear_get_daily_briefing` is the most efficient way to give the user an overview:156- Returns today's events + pending reminders in a single call157- Automatically enriches event attendees with contact details (name, email, phone)158- Pass `timezone` for correct day boundaries159- Pass `date` to get a briefing for a different day160161## Safety & Confirmation162163### Actions Requiring Care164165| Action | Risk | Guidance |166|--------|------|----------|167| `pear_delete_event` | Removes event permanently | Confirm event title and date with user before deleting |168| `pear_delete_contact` | Removes contact permanently | Always confirm — show contact name first |169| `pear_delete_contacts_batch` | Bulk delete up to 50 contacts | Require explicit user confirmation with count |170| `pear_update_event` | Overwrites event fields | Summarize changes before applying |171| `pear_complete_reminder` | Marks as done | Safe — can be undone by updating `completed: false` |172| Batch create operations | Creates up to 50 items | Confirm count and summarize before executing |173174### Data Safety175176- **Read operations are always safe** — listing, searching, and briefings have no side effects177- **Updates merge, not replace** — `pear_update_contact` preserves fields you don't mention178- **Batch operations are rate-limited** — chunks of 5 with 200ms delays, no need to throttle manually179- **Never expose the user's `PEAR_API_KEY`** — treat it as a secret180181## Error Handling182183| Error Code | Meaning | What to Do |184|------------|---------|------------|185| `-32001` | Missing or invalid API key | Check `PEAR_API_KEY` is set correctly |186| `-32602` | Invalid parameters | Check parameter names and types against tool reference |187| `-32603` | Server error | Retry once, then report to user |188| `404` on event/reminder | Item not found | The filename may have changed — re-list to get current filenames |189| Calendar is read-only | Cannot modify subscription calendars | List calendars first to check which are writable |190191## Common Patterns192193### Error Recovery (Idempotency)194```195Event creation failed mid-request or timed out:196→ Retry pear_create_event with the same idempotencyKey197→ Pear deduplicates — no double-booking even if the first request succeeded silently198```199200### Morning Briefing201```202User: "What's on my plate today?"203→ Call pear_get_daily_briefing with timezone204→ Summarize events chronologically, then pending reminders205```206207### Schedule a Meeting208```209User: "Find time for a 1-hour meeting this week"210→ Call pear_find_best_time with durationMinutes: 60 and this week's range211→ Present top 3 options with scores212→ On user selection, call pear_create_event213```214215### Quick Reminder216```217User: "Remind me to call the dentist tomorrow"218→ Call pear_create_reminder with title and dueDate set to tomorrow219```220221### Contact Lookup222```223User: "What's Sarah's phone number?"224→ Call pear_search_contacts with query: "Sarah"225→ Return matching contacts with phone numbers226```227228### Bulk Event Creation229```230User: "Add these 5 meetings to my calendar"231→ Call pear_create_events_batch with all events in one request232→ Summarize results (created count, any failures)233```234235## References236237- [Pear Documentation](https://pearmcp.com/docs)238- [Apple App-Specific Passwords](https://support.apple.com/en-us/102654)239- [CalDAV Protocol (RFC 4791)](https://www.rfc-editor.org/rfc/rfc4791)240- [CardDAV Protocol (RFC 6352)](https://www.rfc-editor.org/rfc/rfc6352)241- [IANA Timezone Database](https://www.iana.org/time-zones)