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 for efficient querying. Postgres indexes this computed field.
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 |
