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 a centralised read-only kill switch on calendar
mutations during incident response.
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_GATEWAY_CREDENTIAL_KEY set on the AS (encrypts the cached tokens).
Install
Install from the admin UI (Resources → Add → Microsoft Calendar), choose your
auth mode (entra_refresh default, or idp_passthrough), and click Install.
The gateway resolves credentials from the Microsoft IdP registration.
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.
Operator data
| Key | Effect |
|---|
read_only: true | Denies every non-GET method on this connector. Reads still work; create/update/delete/respond all return a policy deny. |
(Policy rules currently ship in policy/calendar.rego but are not yet evaluated
by the gateway — connector-owned Rego packages are loaded into OPA but not
aggregated into the central decision today. Once aggregation lands, read_only
takes effect immediately without a deploy.)
Manifest reference
- ID:
identos.ms-calendar
- Version:
1.0.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 | — |
| 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. |
Operator data schema
Keys the operator can supply under data.pbac.operator.connectors["identos.ms-calendar"].* — consumed by the connector's policy.
| Key | Type | Description |
|---|
read_only | boolean | When true, disables all write operations (create/update/delete events, respond to invitations). Read paths (list/get/view/schedule) remain available. |