Agent calendar & meeting invites

Inboxes

Every inbox has its own calendar. Agents can host meetings (attendees get a real .ics invite by email), update or cancel them, and accept invites that arrive by email. The desktop and mobile clients render all of it.

Endpoints

All scoped to one inbox: /v1/inboxes/{id}/calendar/…

MethodPathWhat it does
POST/eventsCreate an event. With attendees, emails each external attendee an invite (iTIP REQUEST).
GET/events?start&endList events in a window (default: next 30 days). Includes invites this inbox received.
GET/events/{uid}One event, with each attendee's RSVP status (partstat).
PATCH/events/{uid}Update an event you organize (time, title, location, description, attendees). Attendees get an "Updated invitation" that their calendar applies in place: same uid, higher SEQUENCE, no cancel/re-accept. Removed attendees get a cancellation.
POST/events/{uid}/rsvpRespond to an invite this inbox received: {"status": "accepted" | "declined" | "tentative"}. The organizer gets an iTIP REPLY.
DELETE/events/{uid}Cancel. Attendees get a cancellation.
GET/free-busy?start&endBusy intervals, for proposing open slots.

Across inboxes: GET /v1/calendar/events?start&end[&inboxId] returns the merged agenda for every inbox the key can see, each event tagged with inboxId and inboxEmail, plus an inboxes list with each inbox's own addresses. One request, however many inboxes. SDK calendar.listAllEvents(), MCP list_all_calendar_events, CLI calendar agenda.

Create and invite

POST /v1/inboxes/{id}/calendar/events
{
  "summary": "Intro call",
  "start": "2026-08-20T15:00:00Z",
  "end":   "2026-08-20T15:30:00Z",
  "location": "https://meet.google.com/abc-defg-hij",
  "attendees": ["lead@acme.com", { "email": "cto@acme.com", "name": "Sam" }]
}

Attendees accept a bare email string or { email, name }. Put the video link in location; calendar apps show it as the meeting place. The organizer is the inbox's primary address (its custom-domain alias if one is set as primary).

Check that the invite actually went out

Create, update and delete responses carry inviteSent and inviteRecipients. inviteSent: false means the calendar entry exists but the invite email could not be handed to the mail relay: attendees were not notified. Treat it as an error in your agent, not a success.

{ "uid": "mam-…@send.myagentmail.com", "sequence": 0, "inviteSent": true, "inviteRecipients": ["lead@acme.com"], … }

Update in place

PATCH /v1/inboxes/{id}/calendar/events/{uid}
{ "location": "https://meet.google.com/abc-defg-hij", "start": "2026-08-20T16:00:00Z", "end": "2026-08-20T16:30:00Z" }

Only the fields you pass change. RSVP state is preserved for attendees who remain. Only the organizer can update; use RSVP for invites you received.

Invites that arrive by email

When a message carries a text/calendar part, the API parses it and attaches it to the message as calendarInvite (on GET /messages/{id} and thread reads). Message lists carry hasCalendarInvite: true. Shape:

"calendarInvite": {
  "method": "REQUEST",          // REQUEST = invite, REPLY = someone answered you, CANCEL, COUNTER = proposed new time
  "uid": "…", "summary": "Intro call",
  "start": "…", "end": "…", "location": "…",
  "organizer": "sam@acme.com",
  "attendees": [{ "email": "agent@yourdomain.com", "partstat": "NEEDS-ACTION" }]
}

To accept, call POST /calendar/events/{calendarInvite.uid}/rsvp on the same inbox. The invite is also filed on the inbox's calendar automatically, so it appears in GET /calendar/events. Webhooks: calendar.invite.received, calendar.invite.replied, calendar.invite.cancelled, calendar.invite.countered (attendee proposed a new time; event.start/end are the proposed slot. To accept it, PATCH the event to those times).

In the apps

The desktop and mobile clients (and /client on the web) show a Calendar tab: a merged agenda across all your inboxes with create, edit, RSVP and cancel. Inbound invites render as a card in the message with Accept / Maybe / Decline; RSVP replies from your attendees show as "accepted" / "declined" cards. Desktop builds for macOS (universal, notarized) and Windows (x64, signed) are on the downloads page; the web client is myagentmail.com/client.

MCP, SDK, CLI

  • MCP: create_calendar_event, update_calendar_event, list_calendar_events, list_all_calendar_events, get_calendar_event, rsvp_calendar_event, delete_calendar_event, get_calendar_free_busy
  • SDK: client.calendar.createEvent / updateEvent / listEvents / getEvent / rsvp / deleteEvent / freeBusy
  • CLI: myagentmail calendar create | update | list | get | rsvp | delete | free-busy