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
Set up a 45-minute review with anna@example.com next Tuesday at 10:00 Berlin time.
Tool call — create_calendar_event
{
  "title": "Review",
  "start": "2026-07-14T10:00:00+02:00",
  "end": "2026-07-14T10:45:00+02:00",
  "attendees": ["anna@example.com"]
}
Result
Event "Review" created and invitations sent to 1 attendee(s): anna@example.com.
uid: 9b1de2a4-6f0e-4c8b-a1d2-3e4f5a6b7c8d@langmail.me
calendarUrl: https://mail.langmail.me/dav/cal/you/default/
Anna receives a standard calendar invitation she can accept from Google Calendar, Outlook, or anything else that speaks iCalendar.

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
Create a weekly team standup, Mondays 9:00–9:15 Berlin time, with team@example.com.
Tool call — create_calendar_event
{
  "title": "Team standup",
  "start": "2026-07-13T09:00:00+02:00",
  "end": "2026-07-13T09:15:00+02:00",
  "attendees": ["team@example.com"],
  "recurrence": { "frequency": "weekly", "byDay": ["MO"] }
}
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

Updates are full replacements: pass the complete event, not a diff. For a recurring event, an update edits the entire series — pass recurrence again to keep it recurring.
Tool call — update_calendar_event
{
  "uid": "9b1de2a4-6f0e-4c8b-a1d2-3e4f5a6b7c8d@langmail.me",
  "title": "Review",
  "start": "2026-07-15T14:00:00+02:00",
  "end": "2026-07-15T14:45:00+02:00",
  "attendees": ["anna@example.com"]
}
Attendees are notified of the change automatically. Editing a single occurrence of a series is not supported — split it into separate events if one instance must differ.

Cancel an event

Tool call — delete_calendar_event
{ "uid": "9b1de2a4-6f0e-4c8b-a1d2-3e4f5a6b7c8d@langmail.me" }
Attendees receive iMIP cancellations.

RSVP to an invitation

When someone invites you, the invitation lands in your calendar and your agent can answer it:
Prompt
Accept the invite to Friday's planning meeting.
The agent finds the event’s uid with list_calendar_events, then:
Tool call — respond_to_event
{ "uid": "5f2e...@example.com", "response": "accept" }
Result
RSVP'd accepted to "Planning".
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
{ "name": "Marketing", "color": "#7FA6C9" }
Result
Calendar "Marketing" created.
calendarUrl: https://mail.langmail.me/dav/cal/you/a1b2c3/
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.