Skip to main content

Microsoft Calendar (identos.ms-calendar)

User-delegated proxy for the Microsoft Graph Calendar API. Every call runs as the signed-in user, so Outlook calendar permissions and boundaries apply naturally. Two upstream-auth modes are supported:

  • entra_refresh (default) — PolicyArc uses the refresh token captured at the user's Microsoft sign-in to mint a fresh, correctly-audienced Graph token per call. One sign-in works across any combination of Microsoft connectors — Graph (Mail, OneDrive, Teams, Calendar) and Azure DevOps together. The minted token is cached per (user, resource) and re-minted on expiry.
  • idp_passthrough — forwards the user's Microsoft sign-in token directly to Graph, with no exchange. That sign-in token carries a single audience, so passthrough works for only one Microsoft resource — either Graph (Mail/OneDrive/Teams/Calendar) or Azure DevOps, not both. Choose this only for strict tenants that disable refresh-token issuance (no offline_access), or that don't want a long-lived refresh token warehoused by PolicyArc. Otherwise prefer entra_refresh.

When to use it​

  • An agent or workflow needs to read the caller's calendar — list calendars and events, pull a time-window view, or check free/busy availability.
  • An agent needs to schedule on the caller's behalf — create events, update or cancel them, respond to invitations, or suggest meeting times.
  • An operator needs to stop calendar mutations during incident response. This connector has no switch of its own; the Operator read-only mode control does it for any connector.

What it does NOT do​

  • No service-account / domain-wide delegation. Microsoft Graph requires per-user OAuth for calendar writes; there is no shared service account.
  • No cross-user calendar access beyond free/busy. Routes are under /me/...; get_schedule returns only free/busy availability for other users, not their event details.

Prerequisites​

  • One PolicyArc Microsoft IdP (provider key microsoft). For the default entra_refresh mode the login scopes must include offline_access so a refresh token is captured; idp_passthrough does not need it. This is the same IdP the other Microsoft connectors use — shared, not per-connector.
  • The Entra app granted these delegated Microsoft Graph permissions with admin consent: Calendars.ReadWrite and Calendars.Read.Shared. The Read.Shared scope is required by the find_meeting_times and get_schedule tools.
  • PBAC_CREDENTIAL_KEY (or the legacy PBAC_GATEWAY_CREDENTIAL_KEY) set on the AS (encrypts the cached tokens).

Install​

Install from the Admin Portal (APIs & Connectors → + Connect a resource → Microsoft Calendar), choose your auth mode (entra_refresh default, or idp_passthrough), and select Connect. The gateway resolves credentials from the Microsoft IdP registration.

Tool surface (10 tools)​

Read paths (list_calendars, list_events, calendar_view, get_event, find_meeting_times, get_schedule) use the calendar:read scope; mutations (create_event, update_event, delete_event, respond_to_event) use calendar:write. The autogenerated reference below this README has the full list with route patterns and input schemas.

identos.google-calendar also names its read scope calendar:read. The gateway does not refuse a token of another connector type whose scope names match a route's scope (see Check the scope and resource). In our run a client_credentials token issued for the identos.ms-calendar type with calendar:read got 200 on a Google Calendar resource's /calendar/v3/calendars/ceo@example.com/events, over REST and over MCP, even with that connector's room_only_mode on. The other way round, a token issued for the identos.google-calendar type with calendar:read got 200 from an identos.ms-calendar resource's list_events. calendar:read and dropbox:files:write are the only scope names that two shipped connectors share.

Operator data​

This connector reads no operator data. Its policy package, policy/calendar.rego, holds no rules. The read_only key that earlier releases documented here was removed in 0.43.0 because it never fired, and nothing reads it.

To make a Calendar resource read-only, add its managed-resource name to resources in pbac.operator.controls.resource_read_only. The Operator read-only mode control then denies every scope that writes. On this connector that is calendar:write and also calendar:read. find_meeting_times and get_schedule are POST routes under calendar:read, so the control counts that scope as both read and write and denies it with resource_read_only_mixed_scope. A read-only Calendar resource refuses reads too.

Manifest reference​

  • ID: identos.ms-calendar
  • Version: 1.1.0
  • Resource type: urn:connector:identos:ms-calendar
  • Capabilities: mcp

Supported auth modes​

TypeDetails
entra_refreshrequires IdP microsoft
idp_passthroughrequires IdP microsoft

Setup fields​

IDLabelDefaultSecret?Notes
upstream_auth.typeAuthenticationentra_refreshnoAuthentication mode. entra_refresh (default) mints a separate per-resource token for each Microsoft service from your one sign-in, so a single login works across any mix of Microsoft connectors — Graph (Mail/OneDrive/Teams) and Azure DevOps together. idp_passthrough instead forwards your Microsoft sign-in token as-is, and that token is valid for only one audience: passthrough therefore works for either Graph (Mail/OneDrive/Teams) or Azure DevOps, not both. Use entra_refresh if you need more than one.

Scopes​

Scope
calendar:read
calendar:write

Routes​

MethodPatternScopeResource template
GET/v1.0/me/calendarscalendar:read—
GET/v1.0/me/eventscalendar:read—
GET/v1.0/me/calendarViewcalendar:read—
GET/v1.0/me/events/{event_id}calendar:readevent://{{event_id}}
POST/v1.0/me/eventscalendar:write—
PATCH/v1.0/me/events/{event_id}calendar:writeevent://{{event_id}}
DELETE/v1.0/me/events/{event_id}calendar:writeevent://{{event_id}}
POST/v1.0/me/events/{event_id}/{response}calendar:writeevent://{{event_id}}
POST/v1.0/me/findMeetingTimescalendar:read—
POST/v1.0/me/calendar/getSchedulecalendar:read—

MCP tools​

NameScopeDescription
list_calendarscalendar:readList the signed-in user's calendars (the default calendar plus any additional or shared calendars).
list_eventscalendar:readList events in the signed-in user's default calendar. Recurring events are returned as the series master; use calendar_view to expand a time window into instances.
calendar_viewcalendar:readList the events in a time window, with recurring events expanded into individual instances. startDateTime and endDateTime are required (ISO-8601, e.g. 2026-07-01T00:00:00Z).
get_eventcalendar:readGet a single calendar event by its ID.
create_eventcalendar:writeCreate a calendar event in the signed-in user's default calendar. Attendees receive an invitation.
update_eventcalendar:writeUpdate mutable properties of a calendar event (subject, body, start/end, location, attendees, online-meeting flag).
delete_eventcalendar:writeDelete a calendar event. If the event is a meeting the organizer created, attendees receive a cancellation.
respond_to_eventcalendar:writeRespond to a meeting invitation. The response is one of accept, decline, or tentativelyAccept.
find_meeting_timescalendar:readSuggest meeting times based on attendee availability and constraints. Requires the Calendars.Read.Shared delegated scope.
get_schedulecalendar:readGet free/busy availability for one or more people or rooms over a time window. Requires the Calendars.Read.Shared delegated scope.