Skip to main content
The calendar tools are read-write: your agent can create real events, invite real attendees, and respond to invitations on your behalf. Invitations and cancellations go out as standard iMIP emails, so attendees on any calendar system receive them. Two identifiers flow between the tools:

Schedule a meeting

Prompt
Tool call — create_calendar_event
Result
Anna receives a standard calendar invitation she can accept from Google Calendar, Outlook, or anything else that speaks iCalendar.

Block your own time

Not every calendar entry is a meeting. Omit attendees to place a personal event — a focus block, a travel buffer, a placeholder for plans still firming up — and no invitation email goes out:
Tool call — create_calendar_event
When the plans firm up, invite people with addedAttendees on update_calendar_event — they get a normal invitation at that point.

Create a recurring series

recurrence turns a single create call into a series. Use the structured form, or pass a raw RFC 5545 RRULE:
Prompt
Tool call — create_calendar_event
start and end describe the first occurrence. Bound a series with either until (an instant) or count (number of occurrences) — not both.

Reschedule or edit

An update is a diff, not a re-specification: pass the uid and only the fields that change. Everything you omit — the title, the other attendees, the recurrence rule — is kept as stored, so a series never collapses by accident.
Tool call — update_calendar_event
That moves the event and keeps its length; pass end too when the duration changes. Attendees are notified of the change automatically. Because omitting a field means “keep it”, clearing one takes an explicit empty value: attendees: [] uninvites everyone, location: "" and description: "" clear those fields, and recurrence: "none" turns a series back into a one-off.

Change just the attendees

To add or drop specific attendees without reading the list back first, pass addedAttendees / removedAttendees — they act against the stored list, so you name only the address that changes. (attendees replaces the whole list instead; read the current one from list_calendar_events if you use it.) Add notify: "none" to keep a trivial edit silent (e.g. dropping your own duplicate address without disturbing everyone else):
Tool call — update_calendar_event
To edit a single occurrence of a series, pass recurrenceId (the occurrence’s original start); the master rule and every other occurrence stay unchanged.

Cancel an event

Tool call — delete_calendar_event
Attendees receive iMIP cancellations. For a recurring event this cancels the whole series.

Cancel one occurrence

To skip a single instance of a recurring series — say this week’s standup — pass recurrenceId, the occurrence’s original start. The master rule and every other occurrence stay put, and attendees are notified so just that instance drops off their calendars.
Prompt
Tool call — delete_calendar_event
Result
recurrenceId must name an actual occurrence by its original start (find occurrences with list_calendar_events). Omit it to cancel the entire series.

RSVP to an invitation

When someone invites you, the invitation lands in your calendar and your agent can answer it:
Prompt
The agent finds the event’s uid with list_calendar_events, then:
Tool call — respond_to_event
Result
The organizer is notified automatically. respond_to_event only sets your own attendance — it never modifies the event itself.

Keep a workstream separate

A dedicated calendar keeps project events out of your personal one:
Tool call — create_calendar
Result
Pass that calendarUrl to create_calendar_event to add events to it. Calendars are plain CalDAV collections on the open-protocol surface — see Open protocols.