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 (nooffline_access), or that don't want a long-lived refresh token warehoused by PolicyArc. Otherwise preferentra_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_schedulereturns only free/busy availability for other users, not their event details.
Prerequisites
- One PolicyArc Microsoft IdP (provider key
microsoft). For the defaultentra_refreshmode the login scopes must includeoffline_accessso a refresh token is captured;idp_passthroughdoes 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.ReadWriteandCalendars.Read.Shared. TheRead.Sharedscope is required by thefind_meeting_timesandget_scheduletools. PBAC_CREDENTIAL_KEY(or the legacyPBAC_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
| Type | Details |
|---|---|
entra_refresh | requires IdP microsoft |
idp_passthrough | requires IdP microsoft |
Setup fields
| ID | Label | Default | Secret? | Notes |
|---|---|---|---|---|
upstream_auth.type | Authentication | entra_refresh | no | Authentication 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
| Method | Pattern | Scope | Resource template |
|---|---|---|---|
GET | /v1.0/me/calendars | calendar:read | — |
GET | /v1.0/me/events | calendar:read | — |
GET | /v1.0/me/calendarView | calendar:read | — |
GET | /v1.0/me/events/{event_id} | calendar:read | event://{{event_id}} |
POST | /v1.0/me/events | calendar:write | — |
PATCH | /v1.0/me/events/{event_id} | calendar:write | event://{{event_id}} |
DELETE | /v1.0/me/events/{event_id} | calendar:write | event://{{event_id}} |
POST | /v1.0/me/events/{event_id}/{response} | calendar:write | event://{{event_id}} |
POST | /v1.0/me/findMeetingTimes | calendar:read | — |
POST | /v1.0/me/calendar/getSchedule | calendar:read | — |
MCP tools
| Name | Scope | Description |
|---|---|---|
list_calendars | calendar:read | List the signed-in user's calendars (the default calendar plus any additional or shared calendars). |
list_events | calendar:read | List 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_view | calendar:read | List 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_event | calendar:read | Get a single calendar event by its ID. |
create_event | calendar:write | Create a calendar event in the signed-in user's default calendar. Attendees receive an invitation. |
update_event | calendar:write | Update mutable properties of a calendar event (subject, body, start/end, location, attendees, online-meeting flag). |
delete_event | calendar:write | Delete a calendar event. If the event is a meeting the organizer created, attendees receive a cancellation. |
respond_to_event | calendar:write | Respond to a meeting invitation. The response is one of accept, decline, or tentativelyAccept. |
find_meeting_times | calendar:read | Suggest meeting times based on attendee availability and constraints. Requires the Calendars.Read.Shared delegated scope. |
get_schedule | calendar:read | Get free/busy availability for one or more people or rooms over a time window. Requires the Calendars.Read.Shared delegated scope. |
Send feedback about this page