Scheduling
Apple Calendar
API integration
Ship Scheduling features without building the integration. Full Apple Calendar API access via Proxy and 10+ MCP-ready tools for AI agents — extend models and mappings to fit your product.
Talk to usUse Cases
Why integrate with Apple Calendar
Common scenarios for SaaS companies building Apple Calendar integrations for their customers.
Offer scheduling for Apple-first users
Booking and scheduling platforms can let freelancers, consultants, and solopreneurs connect their iCloud Calendar to prevent double-booking. Truto abstracts away CalDAV, principal discovery, and partition routing so you can ship this without touching XML or .ics parsing.
Sync CRM meetings to personal iCloud calendars
CRMs used by real estate agents, agencies, and independent professionals can push deal-related meetings directly into a user's Apple Calendar and pull back manually-created events. This keeps the source of truth aligned without asking users to switch calendar providers.
Provision dedicated calendars for SaaS-generated events
ATSs, project tools, and coaching platforms can create a dedicated calendar inside a user's iCloud account (e.g., 'Interviews' or 'Client Sessions') to isolate app-generated events from personal ones. This keeps the user's main calendar clean and gives your product a clear ownership boundary.
Enable personal availability shadowing for enterprise users
Productivity and calendar tools can let users connect their personal Apple Calendar to block time on their work calendar without exposing event details. This is a common ask for professionals who keep work on Google or Outlook but manage life on iCloud.
Automate time tracking from iCloud events
Time tracking and billing tools can read events from a consultant's Apple Calendar and turn them into suggested time entries. Truto handles polling and normalization so your app receives clean event objects instead of raw iCalendar payloads.
What You Can Build
Ship these features with Truto + Apple Calendar
Concrete product features your team can ship faster by leveraging Truto’s Apple Calendar integration instead of building from scratch.
Two-way event sync with iCloud
Create, read, update, and delete events on a user's Apple Calendar and mirror user-initiated changes back into your product.
Automatic calendar provisioning
Create a dedicated sub-calendar inside the user's iCloud account at connection time so all app-generated events live in an isolated, brand-owned space.
Multi-calendar selector at connect time
List all calendars on the user's iCloud account and let them choose which ones to read from or write to during onboarding.
Calendar lifecycle management
Rename, update, or delete the calendars your app provisions so users can clean up or rebrand without leaving your product.
Event lookup and enrichment
Fetch a single event by ID to enrich records in your CRM, ATS, or PM tool with structured meeting metadata.
Server and account health checks
Resolve the user's principal, calendar home, and server partition on connection to confirm the account is reachable and correctly routed before you start syncing.
SuperAI
Apple Calendar AI agent tools
Comprehensive AI agent toolset with fine-grained control. Integrates with MCP clients like Cursor and Claude, or frameworks like LangChain.
get_single_apple_calendar_principal_by_id
Return the current-user-principal of the connected iCloud account via CalDAV PROPFIND on the root resource (207 Multi-Status XML containing e.g. /200385701/principal/). Truto runs this when the account connects and stores the number, so other tools never need it as input.
get_single_apple_calendar_calendar_home_by_id
Return the calendar-home-set of the connected iCloud account via CalDAV PROPFIND (207 Multi-Status XML), e.g. https://p34-caldav.icloud.com:443/200385701/calendars/. Informational only: every other tool already works on caldav.icloud.com. The iCloud account number is found and stored when the account connects. The id argument is not used: the account always has exactly one calendar home, so any value (for example "me") returns it.
list_all_apple_calendar_calendars
List all calendars of the connected iCloud account via CalDAV PROPFIND (207 Multi-Status XML). Each calendar's href ends in its id; props include displayname, calendar-color, calendar-description, supported-calendar-component-set, getctag and sync-token. The iCloud account number is found and stored when the account connects, so no user id is needed.
get_single_apple_calendar_calendar_by_id
Get a single Apple Calendar calendar by id via CalDAV PROPFIND. Returns displayname, calendar-color, calendar-description, supported-calendar-component-set, getctag and sync-token. Required: id. The iCloud account number is found and stored when the account connects, so no user id is needed.
create_a_apple_calendar_calendar
Create a new Apple Calendar (iCloud) calendar via CalDAV extended MKCOL. calendar_id must be a new UUID. Send the mkcol body (see its example) with a display name. Required: calendar_id.
update_a_apple_calendar_calendar_by_id
Update an Apple Calendar (iCloud) calendar's properties, such as its name, color or description, via CalDAV PROPPATCH. Send the change in the propertyupdate body (see its examples). Returns Apple's 207 Multi-Status response, which shows a status for each property. Required: id (the calendar id from the calendar list).
delete_a_apple_calendar_calendar_by_id
Delete an Apple Calendar calendar and all its events. Returns an empty 204 response on success. Required: id. This operation is irreversible. The iCloud account number is found and stored when the account connects, so no user id is needed.
apple_calendar_calendars_search
Run a CalDAV REPORT on one Apple Calendar (iCloud) calendar. For a plain list of events in a date range, use list_all_apple_calendar_events instead. Send exactly one body key: calendar-query (find events by time range, returns each event's iCalendar data), calendar-multiget (fetch specific events by href) or sync-collection (changes since the last sync token; iCloud has no webhooks). The body is the XML report written as JSON (element names as keys, attributes in "_attributes", text in "_text"); see each key for a working example. Returns the 207 Multi-Status response as JSON. Required: calendar_id.
create_a_apple_calendar_event
Create a new Apple Calendar (iCloud) event. Send the full event as iCalendar text in ics (see its example): SUMMARY is the title, DTSTART and DTEND are the times. event_id must be a new UUID WITHOUT the .ics suffix (.ics is added for you; passing it creates an id ending in .ics.ics). The UID line inside ics must be exactly event_id. iCloud does not check either rule, so get them right. If an event with this id already exists, Apple returns 412 and nothing is overwritten. Through the Truto Proxy API, send the iCalendar text as the raw request body with Content-Type: text/calendar and the query parameter truto_body_passthrough=true. Required: calendar_id, event_id, ics.
get_single_apple_calendar_event_by_id
Get a single Apple Calendar (iCloud) event. The result is the event's full iCalendar (VCALENDAR) text. The id is the event file name including the .ics suffix, as returned in the hrefs from list_all_apple_calendar_events. Required: calendar_id, id.
update_a_apple_calendar_event_by_id
Update an existing Apple Calendar (iCloud) event by replacing its whole iCalendar text. iCloud has no partial update: first get the event with get_single_apple_calendar_event_by_id (this also confirms it exists), change only the lines you need, keep the same UID, and send the full text back in ics. Use the id exactly as returned by list events, including the .ics suffix. Note: iCloud treats an update to an id that does not exist as a create, so always get the event first. Through the Truto Proxy API, send the iCalendar text as the raw request body with Content-Type: text/calendar and the query parameter truto_body_passthrough=true. Required: calendar_id, id (the event file name including .ics), ics.
delete_a_apple_calendar_event_by_id
Delete an Apple Calendar event via HTTP DELETE on its .ics resource URL. Use If-Match with the event ETag for safe conditional deletion. Required: calendar_id, id (filename including .ics suffix). The iCloud account number is found and stored when the account connects, so no user id is needed.
list_all_apple_calendar_events
List events in one Apple Calendar (iCloud) calendar between start and end, via a CalDAV calendar-query REPORT. Returns one item per event. In each item, href ends with the event id (for example 3c3d6703-8e4d-4968-9186-cda04a40c796.ics) to use with the get, update and delete event tools, and propstat.prop.calendar-data._cdata is the event's iCalendar text: SUMMARY is the title, DTSTART and DTEND are the start and end, plus LOCATION, DESCRIPTION and ATTENDEE lines. Recurring events are expanded: each occurrence in the range is its own VEVENT with a RECURRENCE-ID, and iCloud returns at most about 50 occurrences per recurring event, so keep the range tight. start and end must be UTC in the form YYYYMMDDTHHMMSSZ (for example 20261105T000000Z); a plain date such as 2026-11-05 is not valid. With no start and end, every event is returned. limit is ignored: iCloud returns all matching events at once. Required: calendar_id.
get_single_apple_calendar_server_by_id
Get the capabilities of the connected Apple Calendar (iCloud) account's calendar home via CalDAV PROPFIND: the reports it supports (supported-report-set), what the account may do there (current-user-privilege-set) and storage quota used and available. Does not return calendars or events.
Why Truto
Why use Truto’s MCP server for Apple Calendar
Other MCP servers give you a static tool list for one app. Truto gives you a managed, multi-tenant MCP infrastructure across 950+ integrations.
Auto-generated, always up to date
Tools are dynamically generated from curated documentation — not hand-coded. As integrations evolve, tools stay current without manual maintenance.
Fine-grained access control
Scope each MCP server to read-only, write-only, specific methods, or tagged tool groups. Expose only what your AI agent needs — nothing more.
Multi-tenant by design
Each MCP server is scoped to a single connected account with its own credentials. The URL itself is the auth token — no shared secrets, no credential leaking across tenants.
Works with every MCP client
Standard JSON-RPC 2.0 protocol. Paste the URL into Claude, ChatGPT, Cursor, or any MCP-compatible agent framework — tools are discovered automatically.
Built-in auth, rate limits, and error handling
Tool calls execute through Truto’s proxy layer with automatic OAuth refresh, rate-limit handling, and normalized error responses. No raw API plumbing in your agent.
Expiring and auditable servers
Create time-limited MCP servers for contractors or automated workflows. Optional dual-auth requires both the URL and a Truto API token for high-security environments.
For your product
Ship Apple Calendar tools in your product
Give the AI in your product access to each customer’s own Apple Calendar account, with one MCP server per connected account.
Rather talk it through? Book a demo
For your own team
Use Apple Calendar in ChatGPT or Claude yourself
Connect your company’s Apple Calendar once, then ask in the AI you already use, with exactly your own access.
From the team behind Truto · 14-day free trial
How It Works
From zero to integrated
Go live with Apple Calendar in under an hour. No boilerplate, no maintenance burden.
Link your customer’s Apple Calendar account
Use Truto’s frontend SDK to connect your customer’s Apple Calendar account. We handle all OAuth and API key flows — you don’t need to create the OAuth app.
We handle authentication
Don’t spend time refreshing access tokens or figuring out secure storage. We handle it and inject credentials into every API request.
Call our API, we call Apple Calendar
Truto’s Proxy API is a 1-to-1 mapping of the Apple Calendar API. You call us, we call Apple Calendar, and pass the response back in the same cycle.
Unified response format
Every response follows a single format across all integrations. We translate Apple Calendar’s pagination into unified cursor-based pagination. Data is always in the result attribute.
FAQs
Common questions about Apple Calendar on Truto
Authentication, rate limits, data freshness, and everything else you need to know before you integrate.
How does authentication with Apple Calendar work?
Apple Calendar uses CalDAV, which authenticates with the user's Apple ID and an app-specific password generated from appleid.apple.com. Truto handles the connection flow and the underlying CalDAV auth so your app only deals with a standard connected account.
Does Apple Calendar support webhooks for real-time updates?
No. Apple Calendar has no webhook mechanism. Data freshness relies on polling the CalDAV sync-collection endpoint, which Truto manages on your behalf so you can consume changes without implementing the polling loop yourself.
Do I need to parse iCalendar (.ics) or CalDAV XML?
No. Even though Apple Calendar is CalDAV under the hood, Truto exposes calendars and events as normalized JSON via tools like list_all_apple_calendar_calendars, create_a_apple_calendar_event, and update_a_apple_calendar_event_by_id. You never touch VCALENDAR, VEVENT, or PROPFIND XML.
How does Truto handle iCloud's partitioned hosts?
iCloud shards accounts across partition hosts (e.g., p34-caldav.icloud.com) that must be discovered per user. Truto resolves the principal, calendar home, and server via get_single_apple_calendar_principal_by_id, get_single_apple_calendar_calendar_home_by_id, and get_single_apple_calendar_server_by_id so requests are always routed to the correct partition.
What operations are supported on events?
You can create, retrieve, update, and delete events on any calendar the user has write access to via create_a_apple_calendar_event, get_single_apple_calendar_event_by_id, update_a_apple_calendar_event_by_id, and delete_a_apple_calendar_event_by_id. Truto handles the underlying ETag and conditional PUT logic so concurrent updates don't clobber each other.
Can I search calendars or manage multiple calendars per user?
Yes. Use list_all_apple_calendar_calendars to enumerate all calendars on a user's account, apple_calendar_calendars_search to filter them, and create_a_apple_calendar_calendar / update_a_apple_calendar_calendar_by_id / delete_a_apple_calendar_calendar_by_id to manage app-owned calendars in the user's iCloud account.
From the Blog
Apple Calendar integration guides
Deep dives, architecture guides, and practical tutorials for building Apple Calendar integrations.
Apple Calendar
Get Apple Calendar integrated into your app
Our team understands what it takes to make a Apple Calendar integration successful. A short, crisp 30 minute call with folks who understand the problem.