Outlook Calendar (Microsoft Graph)
Find a time that works, then book it in Outlook: check colleagues' free/busy with getSchedule or let findMeetingTimes suggest slots, read the week's calendarView, create or move meetings with a Teams link, and accept, decline or cancel invitations for a Microsoft 365 user.
Connect this API to an AI agent Browse all specs
What you can do with Outlook Calendar (Microsoft Graph) via MCP
Every endpoint below becomes a governed tool your AI agent (Claude, ChatGPT, or a customer-facing VX agent) can call — with scoped permissions, sandbox testing, and audit logs.
| Method | Path | Operation | Description |
|---|---|---|---|
| GET | /me/calendars |
listCalendars | List the user's calendars |
| GET | /me/calendar/calendarView |
listCalendarView | List events between a start and end time, with recurring ones expanded |
| GET | /me/events |
listEvents | List or search events (series masters, not expanded) |
| POST | /me/events |
createEvent | Create an event and send invitations |
| GET | /me/events/{event-id} |
getEvent | Get one event with attendees and their responses |
| PATCH | /me/events/{event-id} |
updateEvent | Change an event's time, title, attendees or location |
| GET | /me/events/{event-id}/instances |
listEventInstances | List the occurrences of a recurring event in a time range |
| POST | /me/calendar/getSchedule |
getSchedule | Get free/busy for people, rooms or lists over a time window |
| POST | /me/findMeetingTimes |
findMeetingTimes | Suggest meeting times when attendees are free |
| POST | /me/events/{event-id}/accept |
acceptEvent | Accept a meeting invitation |
| POST | /me/events/{event-id}/decline |
declineEvent | Decline a meeting invitation, optionally proposing a new time |
| POST | /me/events/{event-id}/tentativelyAccept |
tentativelyAcceptEvent | Tentatively accept a meeting invitation |
| POST | /me/events/{event-id}/cancel |
cancelEvent | Cancel a meeting you organise and notify attendees |
Authentication
microsoftOAuth
OAuth 2.0
Scopes: https://graph.microsoft.com/Calendars.ReadWrite https://graph.microsoft.com/Calendars.Read.Shared offline_access
How to get a credential
- Sign in to the Microsoft Entra admin center (entra.microsoft.com) with an account in your Microsoft 365 tenant.
- Go to App registrations → New registration, choose the supported account types and add the VX Agents redirect URI shown on the credential form (platform Web).
- Under Certificates & secrets, create a client secret and copy its value.
- Under API permissions → Microsoft Graph → Delegated, add the scopes below (your organisation may require admin consent).
- Enter the Application (client) ID and secret in VX Agents and sign in as the user whose calendar the agent manages.
Permissions used
| Scope | Operations |
|---|---|
| Calendars.ReadWrite | listCalendars, listCalendarView, listEvents, getEvent, listEventInstances, getSchedule, createEvent, updateEvent, acceptEvent, declineEvent, tentativelyAcceptEvent, cancelEvent |
| Calendars.Read.Shared | findMeetingTimes |
| offline_access | refresh tokens |
Common errors
- 401 Unauthorized: the token expired; reconnect the credential.
- 403 Forbidden: a scope above is missing, or
cancelEventwas called by someone who is not the organizer. - 400 Bad Request:
startDateTime/endDateTimemissing on calendarView or instances, or adateTimewithouttimeZone. - 429 Too Many Requests: Outlook throttling; wait for
Retry-After.
Store it as a VX Agents OAuth2 credential.
Usage guide
Setup
- Credential: Microsoft identity OAuth2 (authorization code, delegated) with
Calendars.ReadWrite,Calendars.Read.Sharedandoffline_access. Sign in as the user whose calendar the agent manages. - Worth knowing up front: the user's time zone (ask, or read it from existing events) so new events use the right
timeZone.
Find a time and book it
listCalendarViewwithstartDateTimeandendDateTime(ISO 8601, e.g.2026-10-20T00:00:00Z) to see what is already booked. Recurring meetings come back as separate occurrences. Use$select=subject,start,end,location,attendeesand$topto keep responses small.getSchedulewithschedules(email addresses of people or rooms),startTime/endTime({"dateTime": "2026-10-21T08:00:00", "timeZone": "Pacific Standard Time"}) andavailabilityViewIntervalin minutes. InavailabilityView, each digit is one slot (0 free, 1 tentative, 2 busy, 3 out of office);scheduleItemslists the busy blocks.- Or
findMeetingTimeswithattendees,timeConstraintandmeetingDuration(ISO 8601 duration such asPT30M) to get ranked suggestions. createEventwithsubject,start,end,attendees([{"emailAddress": {"address": "[email protected]"}, "type": "required"}]), optionallocation,body, andisOnlineMeeting: truefor a Teams link.- Move or edit with
updateEvent(send only the fields that change).
Respond to invitations
getEventto read the invite, thenacceptEvent,tentativelyAcceptEventordeclineEventwith an optionalcommentandsendResponse: true.declineEvent/tentativelyAcceptEventcan carry aproposedNewTimeif the organizer allows new time proposals.cancelEvent(withComment) only works for meetings the user organises; for others, decline instead.
Creating, updating, cancelling or answering an event emails every attendee. Show the title, time with time zone, and attendee list to the user and get a yes before calling these.
Good to know
listEventsreturns recurring series as one master event. UselistCalendarVieworlistEventInstances(needsstartDateTime/endDateTime) to see occurrences.- Event
start/endare{dateTime, timeZone}objects;dateTimehas no offset. - Follow
@odata.nextLinkfor more pages. - On 429, wait for
Retry-After.
Source: Microsoft Graph calendar API reference (https://learn.microsoft.com/en-us/graph/api/resources/calendar?view=graph-rest-1.0), checked 2026-10-19.
How to use this spec
- Create a free VX Agents account (sandbox tools included).
- Open the marketplace and connect “Outlook Calendar (Microsoft Graph)” to an agent.
- Expose it as an MCP server for Claude/ChatGPT, or chat with it directly.