Skip to Content
ResourcesIntegrationsProductivity & DocsMicrosoft Outlook Calendar

Microsoft Outlook Calendar

Service domainCALENDAR
Microsoft Outlook Calendar icon
Arcade Optimized

Arcade.dev LLM tools for Outlook Calendar

Author:Arcade
Version:3.2.0
Auth:User authorization via the Microsoft auth provider
11tools

The Microsoft Outlook Calendar toolkit connects Arcade-powered LLM agents to a user's Outlook Calendar via the Microsoft Graph API. It enables reading, searching, creating, updating, and cancelling calendar events, checking free/busy schedules, and inspecting attachments.

Capabilities

  • Event lifecycle: Create, read (single or listed), update, cancel (with attendee notification), and remove events from a calendar — with precise scope controls distinguishing organizer vs. attendee actions, one-off vs. recurring series instances, and silent vs. notifying operations.
  • Search and listing: List events over an arbitrary time range or search by property (subject, attendees, organizer, importance, online status) within a configurable window; both surfaces return summarised rows with pointers to fetch full bodies.
  • Free/busy and scheduling: Retrieve availability for one or more people over a time window, with per-interval status digits, named busy blocks, working-hours data, and explicit trust signals (mailbox / mailbox_utc / fallback) on the returned timezone.
  • Calendar and attachment discovery: Enumerate all calendars the user owns or has delegated access to; list attachment metadata on any event across owned or shared calendars.
  • Timezone and identity awareness: Resolve the authenticated user's mailbox timezone and its source (configured vs. UTC fallback) to avoid misrepresenting calendar context to users.
  • Rich body handling: Distinguish plain-text and HTML bodies throughout — preserving formatting, links, and lists when copying or creating events by routing body_html with body_format: html.

OAuth

This toolkit uses OAuth 2.0 via the Microsoft provider. See the Arcade Microsoft auth provider docs for setup instructions.

Available tools(11)

11 of 11 tools
Operations
Behavior
Tool nameDescriptionSecrets
Cancel a meeting you organize and email a cancellation to every invitee. Irreversible. Invitees keep a cancelled copy. Refused when nobody else is invited. this_and_future ends the series the day before the given date, so invitees get an updated invitation instead, with no note. Use is_organizer, attendees, event_type and series_master_id from an earlier read to choose this tool and scope. Only events in your own mailbox, not shared or delegated calendars.
Create an event in the authenticated user's default calendar. body is stored as plain text unless body_format says html, in which case it is stored as markup and rendered rather than shown literally. Copying a description from an event that was read means passing that event's body_html as body with body_format html. Its body field is the same description with the markup stripped, so an agenda copied from there arrives with its links, lists and emphasis gone. Ignores timezone offsets provided in the start_date_time and end_date_time parameters. Instead, uses the user's default calendar timezone to filter events. If the user has not set a timezone for their calendar, then the timezone will be UTC.
Get one event from the user's calendar, with everything known about it. Returns an EventDetail: the event's subject, full body, times, location, organizer and attendees, plus change_key (the token identifying which version of the event this is), event_type and series_master_id (which together say whether this is a one-off event, one date of a recurring series, or the series itself), and online_meeting_join_url (the link that joins the online meeting, distinct from web_link, which opens the event in Outlook). Both forms of the description come back: body is the plain text with markup stripped, and body_html is the stored markup, whole, which a listing row does not carry at all. Take body_html when the formatting, links or lists matter, and supply it as the body of a new event with body_format set to html, or it is stored as literal text. An event with no description still returns a non-empty body_html, because Outlook stores an empty scaffold; body being empty is what says there is no agenda. Use this to read an event in full, or after a listing to see a body the listing only summarised. start, end, organizer and response_status always come back, with their own fields empty when Microsoft Graph returned no underlying object. An empty start is a value the event is missing, not an event that is missing.
Get the free/busy availability of one or more people over a time range. Timezone offsets in start_date_time and end_date_time are ignored. The window is anchored in the returned time_zone, which is the authenticated user's mailbox timezone, and may be a Windows name such as "Eastern Standard Time" rather than an IANA identifier - that names a zone observing daylight saving, not a fixed offset. time_zone_source says how far to trust that zone: "mailbox" means the mailbox names it and the times can be stated as the user's own; "mailbox_utc" means the mailbox reads UTC, which a mailbox nobody ever configured also reads, so it may not be where the user is; "fallback" means the mailbox names no zone or its settings could not be read and UTC was applied by default. On "mailbox_utc" and "fallback" treat every time in the response as unconfirmed and check the intended zone before acting. Each person's availability_view has one digit per interval, beginning at start_date_time in that time_zone: 0 = free (or working elsewhere), 1 = tentative, 2 = busy, 3 = out of office. For the specific times a person is busy, prefer schedule_items, which lists each block with absolute start and end times; each item's status is one of free, tentative, busy, oof, workingElsewhere, or unknown. When Graph provides it, working_hours gives the days and hours a person works. These are on that person's own clock - named by working_hours.time_zone when Graph resolves it - and are not converted to the window's time_zone, so do not compare them directly against availability_view without accounting for the difference. Results cover only each person's primary calendar. Events that live solely on a secondary calendar do not mark them busy, so free/busy can read clear while such an event exists. Visibility depends on your access to each person's calendar. Colleagues, rooms, and resources whose free/busy is shared with you return busy/free times; an event's subject, location, and is_private flag appear only when its details are shared with you. A calendar you cannot see is returned all-free with no error, which is indistinguishable from genuinely free, so every all-free result carries a "note" marking it unconfirmed. An address Graph could not resolve or read carries an "error" instead, and is still listed so that no requested address is silently dropped. One address failing does not affect the rest, and an error naming too many calendar entries is worth retrying for that address alone over a shorter range.
List all calendars the user has access to. Returns the user's own calendars plus any shared or delegated calendars. Each calendar includes its ID, name, owner, and permissions. Use a calendar_id from the results to target a specific calendar in other calendar tools.
List attachment metadata for a calendar event. Returns metadata only (name, size, type, etc.). Attachment content is not included. Use this tool when the user wants to know what files are attached to a calendar event or meeting. Pass a calendar_id to list attachments on events in shared or delegated calendars.
List everything on the user's calendar between two times. Use this when the request is about a stretch of the calendar -- what is on today, this week, between two clock times -- rather than about a property of one particular event, which a filtered search answers better. Returns a ListEventsResult: an events list of EventListItem rows, a num_events count and truncated_by. Each row carries a short plain-text summary of the event as its body, not the full description -- read the event by its event_id to get the body in full. body_has_formatting says whether the description holds links, lists or styling that the stripped text cannot carry; a row never carries the markup itself, so read the event by its event_id when that formatting matters. Each row also carries the event_type and series_master_id that say whether it is a one-off event, one date of a recurring series, or the series itself. truncated_by is limit when Microsoft Graph offered another page, which usually but not always means more events remain, and empty when it offered none and the list is the whole window. No continuation cursor is issued, so narrow the window to reach the rest, or raise limit while it is below its maximum. An empty list with an empty truncated_by means nothing is scheduled in this window. Ignores timezone offsets provided in the start_date_time and end_date_time parameters. Instead, uses the user's default calendar timezone to filter events. If the user has not set a timezone for their calendar, then the timezone will be UTC.
Take an event off your calendar without emailing anyone. For a meeting someone else organizes, or your own appointment with no invitees. Other attendees keep their copies. An organizer in your organization sees you declined; one outside it is not told. Refused for a meeting you organize with invitees. Irreversible. Use is_organizer, attendees, event_type and series_master_id from an earlier read to choose this tool and scope. A cancelled meeting stays on your calendar with is_cancelled true, and listings hide it unless asked. Only events in your own mailbox, not shared or delegated calendars.
Find calendar events by what is true about them: subject text, who attends, who organised them, importance, or whether they are online. Use this when the request names a property of the event. When the request is about a stretch of the calendar instead -- what is on Tuesday, this week's meetings -- reading the whole time range fits better, because this search covers only a 90-day window either side of today unless dates are given. Returns a SearchEventsResult: an events list of SearchEventItem rows plus num_events, searched_window, truncated_by, and the filter_expression / client_side_filters that say where each filter was applied. Results are in chronological order. Each row carries a short plain-text summary of the event as its body, not the full description. Read one event by its event_id to get the body in full. An empty events list means nothing matched inside searched_window; it does not mean no such event exists. Widen the range or drop a filter before reporting that there is none. On truncated_by scan_cap the scan stopped early and no continuation token is issued, so narrow the window or the filters instead of paging -- an empty list there says even less.
Change one event in the user's calendar, in place. Returns an UpdateEventResult: the updated event in full, plus changed and fields_changed (what was actually written, which is nothing when the event already said what was asked for), change_key, concurrency_checked, applied_scope, online_meeting_preserved, attendees_not_found, and the record of how the event was resolved. Everyone invited is mailed an updated invitation for any change this writes, so an edit to a meeting with guests is not a quiet one. Every input left out leaves that part of the event alone, so this changes only what is named and never cancels, deletes or re-creates the event. Adding or dropping a guest is merged over the people already invited rather than replacing them; set_attendee_emails states the whole invitation list and replaces it. An event that turns out to be a recurring series itself is refused: edit one of its dates instead.
Get information about the current user and their Outlook Calendar environment. mailbox_timezone is the time zone this mailbox's dates are expressed in. It may be a Windows name such as "Eastern Standard Time" rather than an IANA identifier - that names a zone observing daylight saving, not a fixed offset. mailbox_timezone_source says where it came from: "mailbox" and "mailbox_utc" mean the mailbox itself names the zone, whereas "default_not_configured" (the mailbox names none) and "default_unreadable" (the setting could not be read) mean UTC is a fallback this toolkit applied, not a zone the mailbox is set to. On either fallback, do not tell the user their mailbox is configured for that zone.
Last updated on