Overview
Calendar data services built on iCalendar (RFC 5545) and CalDAV standards. Events support start/end times, all-day events, RRULE recurrence, attendees with RSVP, timezones, and cross-domain links to contacts, tasks, and notes. Calendars are named containers (like “Work”, “Personal”) that hold events. Each tenant can have multiple calendars.Data Model
Entities
| Entity | Description |
|---|---|
| Calendar | A named container for events (e.g., “Work”, “Personal”) |
| Event | A scheduled item with start/end time, location, description |
| Event Attendee | A person invited to an event with RSVP status |
| Event Link | A cross-domain link from an event to another entity (contact, task, note, deal) |
Relationships
- A Calendar has many Events
- An Event has many Attendees and Links
- Attendees reference contacts by
contact_idor external email
Key Concepts
All-day events
Events have anis_all_day boolean. All-day events have a date but no specific time. They span the full day in the event’s timezone.
Event types
| Type | Description |
|---|---|
event | Standard calendar event (default) |
focus_time | Blocked time for focused work |
out_of_office | Away/vacation time |
working_location | Where you are working from |
reminder | A time-based reminder |
RRULE recurrence
Events support iCalendar RRULE strings for recurrence:next_occurrence field is maintained for efficient querying — you can filter or sort by it without expanding the full recurrence.
Timezone handling
All times are stored as UTC in the database. Events carry atimezone field (IANA timezone name like America/New_York) for display purposes. Convert UTC times to the event’s timezone when displaying to users.
Attendees
Attendees are linked to an event and can reference a contact bycontact_id or include an external email. Each attendee has an RSVP status:
| Status | Description |
|---|---|
pending | No response yet |
accepted | Accepted the invitation |
declined | Declined the invitation |
tentative | Tentatively accepted |
Cross-domain links
Events can be linked to entities in other domains (contacts, tasks, notes, deals) via Event Links. Each link has anentity_type and entity_id. This enables the MCP prepare_for_meeting composite tool to pull related context automatically.
Full-text search
Search across event titles, descriptions, and locations usingGET /api/v1/events/search?q=....
MCP Tools
| Tool | Description |
|---|---|
events_list | List events in a date range, optionally filtered by calendar or type |
events_get | Get full event details with attendees and links |
events_create | Create a new event with attendees and recurrence |
events_update | Modify event details |
events_delete | Remove an event |
events_check_availability | Check if a time slot is free |
events_search | Free-text search across events |
