All integrations

Microsoft Calendar

MICROSOFT 365 · CALENDAR

Read free/busy and schedule meetings through Microsoft Graph.

Connect Microsoft Calendar with Fabriq Developer

Your user consents at Microsoft Calendar. The credential lands in a vault your agent cannot read, and the tool list it gets back is the intersection of that user’s grant and the agent’s own scopes.

provider “microsoft_calendar”
from af_sdk import AgenticFabriq

af = AgenticFabriq()                      # reads AF_APP_ID / AF_APP_SECRET

url = await af.initiate_connection(request, provider="microsoft_calendar")   # consent at Microsoft Calendar
return redirect(url)

async with await af.for_user(request) as session:
    tools = await session.get_tools()     # only what this user granted

Provider names are surfaces, not vendors, and the authoritative list is the capabilities endpoint rather than any page including this one — an unknown name returns 400 with the valid list. Fabriq Developer is free to start and needs no provider paperwork. Start free or read the quickstart.

Connecting Microsoft Calendar in practice

Calendar is throttled by Exchange per mailbox, not per tenant, so one app working one person’s calendar gets 10,000 requests per 10 minutes and only four concurrent requests however large the organization is. The scope names actively mislead: Calendars.Read.All is not tenant-wide calendar access but work-hours-and-locations settings, and the real tenant-wide read is the application form of plain Calendars.Read.

Scopes that draw scrutiny

  • Calendars.Read Two very different grants under one name. Delegated it reads the signed-in user’s calendars with no admin consent; as an application permission it is "Read calendars in all mailboxes" and requires admin consent.
  • Calendars.ReadWrite Same split. The application form creates, reads, updates and deletes events in every mailbox in the tenant, which is the ability to put a meeting on anyone’s calendar.
  • Calendars.Read.All Application-only and admin-consented, but it covers "work hours and locations settings, recurrences, and occurrences" — not event bodies. Teams pick it expecting tenant-wide event reads and get the wrong data.
  • Calendars.ReadBasic Delegated, no admin consent, and it excludes body, attachments and extensions. The narrowest scope that still answers "when is this person free".
  • Calendars.ReadWrite.Shared Delegated, no admin consent, and it reaches every calendar in the organization the user has access to, including delegate and shared calendars — so a user can grant well beyond their own data without an admin in the loop.

Rate limits

  • Outlook service: 10,000 API requests in a 10-minute period per app ID and mailbox combination, on both v1.0 and beta.
  • Four concurrent requests per app and mailbox. An unordered JSON batch is handed to Outlook four requests at a time, so batching buys no extra concurrency.
  • 150 MB of upload (PATCH, POST, PUT) in a 5-minute period per app and mailbox.
  • getSchedule: availabilityViewInterval defaults to 30 minutes, minimum 5, maximum 1,440.
  • Microsoft Graph global limit: 130,000 requests per 10 seconds per app across all tenants.

Who has to approve

The application forms of Calendars.Read and Calendars.ReadWrite require tenant admin consent in Microsoft Entra; their delegated forms do not. An admin can additionally apply an application access policy so that an app-only token reaches only named mailboxes even though the app holds a tenant-wide calendar permission.

Worth knowing

  • A change-notification subscription on event lasts at most 10,080 minutes (under seven days), and only 1,440 minutes (under one day) if you ask for resource data in the notification, so renewal is a scheduled job rather than a setup step.
  • A mailbox allows 1,000 active event subscriptions across all applications, not per app, so the budget is shared with every other integration the user has installed.
  • getSchedule fails with error 5006 — "The result set contains too many calendar entries. The allowed size is 1000" — when a queried slot holds more than 1,000 entries, which busy room and resource mailboxes routinely do.
  • getSchedule is not supported for personal Microsoft accounts at all, so free/busy lookup only exists for work and school tenants.

Checked against Microsoft Graph throttling limits — Outlook service (2026-09-29), Microsoft Graph permissions reference (2026-09-29), calendar: getSchedule (2026-09-29), Change notifications: supported resources and expiration (2026-09-29)

Acts as the person, not as itself

Each user connects their own account. Every call carries both identities — the agent and the person it is acting for — so the agent can never reach past what that individual can already do.

Credentials never touch the agent

Tokens live in the vault and attach server-side at call time. The agent holds a session, not a secret, and revoking access does not mean rotating a key.

Every call on the record

Who asked, which agent acted, which action ran, and the verdict that let it through — one audit trail across every integration, not one per vendor.

What an agent can do

Each action is granted on its own. An agent allowed to read is not thereby allowed to write, and the scope beside each row is what the acting user must have connected for it to run at all.

microsoft_calendar_check_availabilityREAD

Check free/busy availability for one or more users over a time range. Requires Schedule.Read.All.

Schedule.Read.All
microsoft_calendar_create_eventWRITE

Create a new calendar event.

Calendars.ReadWrite
microsoft_calendar_create_event_in_shared_calendarWRITE

Create an event in a calendar shared with the user. Requires Calendars.ReadWrite.Shared.

Calendars.ReadWrite.Shared
microsoft_calendar_delete_eventWRITE

Delete a calendar event.

Calendars.ReadWrite
microsoft_calendar_delete_event_in_shared_calendarWRITE

Delete an event in a shared calendar. Requires Calendars.ReadWrite.Shared.

Calendars.ReadWrite.Shared
microsoft_calendar_find_meeting_timesWRITE

Find available meeting times for a group of attendees using Microsoft's scheduling intelligence. Requires Schedule.Read.All. User.ReadBasic.All is used to resolve attendee names.

Schedule.Read.All
microsoft_calendar_get_eventREAD

Get a specific calendar event by ID.

Calendars.Read
microsoft_calendar_get_free_busyREAD

Get free/busy status for users without exposing event details. Requires Calendars.ReadBasic (lower privilege than get_schedule).

Calendars.ReadBasic
microsoft_calendar_get_scheduleREAD

Get full schedule including calendar items for users over a time range. Requires Schedule.Read.All.

Schedule.Read.All
microsoft_calendar_get_user_timezoneREAD

Get the user's configured time zone from mailbox settings. Requires MailboxSettings.Read. This timezone is used by Calendar to display event times and affects scheduling.

MailboxSettings.Read
microsoft_calendar_get_user_working_hoursREAD

Get the user's configured working hours from mailbox settings. Requires MailboxSettings.Read. Working hours determine availability shown to others in scheduling and Bookings.

MailboxSettings.Read
microsoft_calendar_list_calendarsREAD

List the user's Microsoft calendars.

Calendars.Read
microsoft_calendar_list_eventsREAD

List calendar events in a time range.

Calendars.Read
microsoft_calendar_list_room_listsREAD

List room lists (building/floor groupings of meeting rooms) in the organization. Requires Place.Read.All. Use to browse rooms by physical location before creating events.

Place.Read.All
microsoft_calendar_list_roomsREAD

List bookable meeting rooms in the organization. Requires Place.Read.All. Returns room name, email address, capacity, and location — used to select a physical location when creating calendar events.

Place.Read.All
microsoft_calendar_list_shared_calendar_eventsREAD

List events in a calendar shared with the user. Requires Calendars.Read.Shared.

Calendars.Read.Shared
microsoft_calendar_list_shared_calendarsREAD

List calendars shared with the authenticated user. Requires Calendars.Read.Shared.

Calendars.Read.Shared
microsoft_calendar_resolve_attendeesREAD

Search for users by name or email prefix to resolve full email addresses. Requires User.ReadBasic.All. Use before find_meeting_times or create_event to look up attendee addresses from partial names.

User.ReadBasic.All
microsoft_calendar_update_eventWRITE

Update an existing calendar event.

Calendars.ReadWrite
microsoft_calendar_update_event_in_shared_calendarWRITE

Update an event in a shared calendar. Requires Calendars.ReadWrite.Shared.

Calendars.ReadWrite.Shared
microsoft_calendar_update_user_timezoneWRITE

Update the user's time zone in mailbox settings. Requires MailboxSettings.ReadWrite. Affects how calendar events are displayed and scheduled for this user across all Microsoft 365 apps.

MailboxSettings.ReadWrite
microsoft_calendar_update_user_working_hoursWRITE

Update the user's working hours in mailbox settings. Requires MailboxSettings.ReadWrite. Affects the user's availability block visible to others when scheduling meetings.

MailboxSettings.ReadWrite

Put Microsoft Calendar behind one governed endpoint.

Same permissions, same audit trail, whatever else you connect next.