{"openapi":"3.0.0","info":{"title":"Purple Suite Calendar API","description":"Microsoft Graph-compatible Calendar API for Purple Suite\n\n---\n\n**Acting as a user (`X-PS-Impersonate-User`).** Every endpoint accepts an optional `X-PS-Impersonate-User` request header whose value is the email of the instance user to act as. The effective user resolves in this order: the header if present, else the instance's configured default MCP user, else none. User-scoped paths additionally accept the literal `me` in place of an email, and Graph-style apps also serve `/me/…` twins of their `/users/{email}/…` paths that resolve the same way. This header is honored by all operations but is intentionally omitted from each operation's parameter list so it is not surfaced as a per-tool argument by MCP clients; see the `ImpersonateUser` entry under `components.parameters`.","version":"1.0.0"},"servers":[{"url":"https://marketplace.moveworks.com/api/purple-suite/calendar"}],"security":[{"patAuth":[]}],"components":{"securitySchemes":{"patAuth":{"type":"http","scheme":"bearer"}},"parameters":{"InstanceId":{"in":"header","name":"X-Instance-ID","required":true,"schema":{"type":"string"}},"Top":{"in":"query","name":"$top","schema":{"type":"integer","default":50},"description":"Number of items to return"},"Skip":{"in":"query","name":"$skip","schema":{"type":"integer","default":0},"description":"Number of items to skip"},"ImpersonateUser":{"in":"header","name":"X-PS-Impersonate-User","required":false,"schema":{"type":"string","format":"email"},"description":"Optional. Act as a specific user in the target instance — the value is that user's email (must exist in the instance). Resolution order for the effective user: (1) this header, if set; (2) the instance's configured default MCP user; (3) otherwise no user is bound. User-scoped paths (e.g. /users/{email}/…) also accept the literal \"me\", and Graph-style apps serve /me/… twins of those paths (Graph: /me ≡ /users/{signed-in-user}) — both resolve to whatever this header (or the default MCP user) points at. An explicit path email always wins over the header. The unified MCP server does not send this header — it relies on the per-instance default — so it is primarily for direct REST/HTTP callers."}},"schemas":{"DateTimeTimeZone":{"type":"object","properties":{"dateTime":{"type":"string","description":"Naive ISO 8601 date-time (no Z suffix when a timeZone is supplied)","example":"2026-06-02T09:00:00.0000000"},"timeZone":{"type":"string","description":"IANA or Windows timezone name","example":"Pacific Standard Time"}},"required":["dateTime","timeZone"]},"EmailAddress":{"type":"object","properties":{"name":{"type":"string","example":"Alice Chen"},"address":{"type":"string","format":"email","example":"alice.chen@acme.com"}}},"ItemBody":{"type":"object","properties":{"contentType":{"type":"string","enum":["text","html"],"example":"text"},"content":{"type":"string","example":"15-minute team standup — share blockers and updates."}}},"Location":{"type":"object","properties":{"displayName":{"type":"string","example":"Sequoia (HQ 2F)"},"locationType":{"type":"string","example":"conferenceRoom"},"uniqueId":{"type":"string"},"uniqueIdType":{"type":"string"}}},"Attendee":{"type":"object","properties":{"emailAddress":{"$ref":"#/components/schemas/EmailAddress"},"type":{"type":"string","enum":["required","optional","resource"],"example":"required"},"status":{"type":"object","properties":{"response":{"type":"string","enum":["none","organizer","tentativelyAccepted","accepted","declined","notResponded"],"example":"accepted"},"time":{"type":"string","format":"date-time","example":"2026-05-29T10:00:00.000Z"}}}}},"PatternedRecurrence":{"type":"object","nullable":true,"properties":{"pattern":{"type":"object","properties":{"type":{"type":"string","enum":["daily","weekly","absoluteMonthly","relativeMonthly","absoluteYearly","relativeYearly"],"example":"weekly"},"interval":{"type":"integer","example":1},"daysOfWeek":{"type":"array","items":{"type":"string"},"example":["monday","tuesday","wednesday","thursday","friday"]},"dayOfMonth":{"type":"integer"},"month":{"type":"integer"},"firstDayOfWeek":{"type":"string","example":"sunday"},"index":{"type":"string"}}},"range":{"type":"object","properties":{"type":{"type":"string","enum":["endDate","noEnd","numbered"],"example":"noEnd"},"startDate":{"type":"string","format":"date","example":"2026-06-02"},"endDate":{"type":"string","format":"date"},"numberOfOccurrences":{"type":"integer"},"recurrenceTimeZone":{"type":"string","example":"Pacific Standard Time"}}}}},"Event":{"type":"object","properties":{"id":{"type":"string","readOnly":true,"example":"EVT-0001"},"subject":{"type":"string","example":"Daily Standup"},"body":{"$ref":"#/components/schemas/ItemBody"},"bodyPreview":{"type":"string","readOnly":true,"example":"15-minute team standup — share blockers and updates."},"start":{"$ref":"#/components/schemas/DateTimeTimeZone"},"end":{"$ref":"#/components/schemas/DateTimeTimeZone"},"location":{"$ref":"#/components/schemas/Location"},"locations":{"type":"array","items":{"$ref":"#/components/schemas/Location"}},"attendees":{"type":"array","items":{"$ref":"#/components/schemas/Attendee"}},"organizer":{"type":"object","properties":{"emailAddress":{"$ref":"#/components/schemas/EmailAddress"}}},"isAllDay":{"type":"boolean","example":false},"isCancelled":{"type":"boolean","readOnly":true,"example":false},"isDraft":{"type":"boolean","readOnly":true,"example":false},"isOnlineMeeting":{"type":"boolean","example":true},"isOrganizer":{"type":"boolean","readOnly":true,"example":true},"isReminderOn":{"type":"boolean","example":true},"onlineMeeting":{"type":"object","nullable":true,"properties":{"joinUrl":{"type":"string","example":"https://zoom.us/j/1234567890"},"conferenceId":{"type":"string","nullable":true},"tollNumber":{"type":"string","nullable":true}}},"onlineMeetingProvider":{"type":"string","enum":["unknown","teamsForBusiness","skypeForBusiness","skypeForConsumer"],"example":"teamsForBusiness"},"importance":{"type":"string","enum":["low","normal","high"],"example":"normal"},"sensitivity":{"type":"string","enum":["normal","personal","private","confidential"],"example":"normal"},"showAs":{"type":"string","enum":["free","tentative","busy","oof","workingElsewhere","unknown"],"example":"busy"},"recurrence":{"$ref":"#/components/schemas/PatternedRecurrence"},"categories":{"type":"array","items":{"type":"string"}},"allowNewTimeProposals":{"type":"boolean","example":true},"hideAttendees":{"type":"boolean","example":false},"reminderMinutesBeforeStart":{"type":"integer","example":15},"responseRequested":{"type":"boolean","example":true},"responseStatus":{"type":"object","properties":{"response":{"type":"string","example":"organizer"},"time":{"type":"string","format":"date-time"}}},"type":{"type":"string","enum":["singleInstance","occurrence","exception","seriesMaster"],"readOnly":true,"example":"singleInstance"},"seriesMasterId":{"type":"string","nullable":true,"readOnly":true,"description":"For occurrences and exceptions, the id of the recurring series master; null otherwise","example":null},"cancellationComment":{"type":"string","readOnly":true,"description":"Cancellation message sent to attendees (set by POST /events/{id}/cancel)","example":"Meeting is no longer needed."},"iCalUId":{"type":"string","readOnly":true,"example":"EVT-0001@purple-suite"},"webLink":{"type":"string","readOnly":true,"example":""},"changeKey":{"type":"string","readOnly":true,"example":""},"hasAttachments":{"type":"boolean","readOnly":true,"example":false},"roomId":{"type":"string","nullable":true,"description":"Purple Suite room id (ROOM-xxx); null if no room booked","example":"ROOM-001"},"calendarId":{"type":"string","description":"Calendar this event belongs to","example":"CAL-001"},"createdDateTime":{"type":"string","format":"date-time","readOnly":true},"lastModifiedDateTime":{"type":"string","format":"date-time","readOnly":true}}},"Calendar":{"type":"object","properties":{"id":{"type":"string","readOnly":true,"example":"CAL-001"},"name":{"type":"string","example":"Alice Chen"},"color":{"type":"string","enum":["auto","lightBlue","lightGreen","lightOrange","lightGray","lightYellow","lightTeal","lightPink","lightBrown","lightRed","maxColor"],"example":"auto"},"hexColor":{"type":"string","readOnly":true,"example":"#4285F4"},"isDefaultCalendar":{"type":"boolean","example":true},"canEdit":{"type":"boolean","readOnly":true,"example":true},"canShare":{"type":"boolean","readOnly":true,"example":true},"canViewPrivateItems":{"type":"boolean","readOnly":true,"example":true},"allowedOnlineMeetingProviders":{"type":"array","items":{"type":"string"},"example":["teamsForBusiness"]},"defaultOnlineMeetingProvider":{"type":"string","example":"teamsForBusiness"},"isRemovable":{"type":"boolean","example":false},"isTallyingResponses":{"type":"boolean","example":true},"owner":{"$ref":"#/components/schemas/EmailAddress"},"changeKey":{"type":"string","readOnly":true,"example":""},"createdDateTime":{"type":"string","format":"date-time","readOnly":true},"lastModifiedDateTime":{"type":"string","format":"date-time","readOnly":true}}},"Room":{"type":"object","properties":{"@odata.type":{"type":"string","default":"#microsoft.graph.room","example":"#microsoft.graph.room"},"id":{"type":"string","readOnly":true,"example":"ROOM-001"},"displayName":{"type":"string","example":"Sequoia"},"emailAddress":{"type":"string","format":"email","example":"sequoia-2f@acme.com"},"capacity":{"type":"integer","example":8},"building":{"type":"string","example":"HQ"},"floorNumber":{"type":"integer","example":2},"floorLabel":{"type":"string","example":"2"},"nickname":{"type":"string","example":"sequoia"},"label":{"type":"string","example":"Sequoia (HQ 2F)"},"bookingType":{"type":"string","enum":["unknown","standard","reserved"],"example":"standard"},"isWheelChairAccessible":{"type":"boolean","example":false},"phone":{"type":"string","nullable":true,"example":null},"tags":{"type":"array","items":{"type":"string"},"description":"Equipment tags (e.g. whiteboard, tv, video_conferencing, phone)","example":["whiteboard","tv","video_conferencing"]},"audioDeviceName":{"type":"string","nullable":true,"example":"Polycom"},"videoDeviceName":{"type":"string","nullable":true,"example":"Logitech Rally"},"displayDeviceName":{"type":"string","nullable":true,"example":"Samsung Display"},"address":{"type":"object","nullable":true,"properties":{"street":{"type":"string"},"city":{"type":"string"},"state":{"type":"string"},"postalCode":{"type":"string"},"countryOrRegion":{"type":"string"}}},"geoCoordinates":{"type":"object","nullable":true},"createdDateTime":{"type":"string","format":"date-time","readOnly":true},"lastModifiedDateTime":{"type":"string","format":"date-time","readOnly":true}}},"DistributionList":{"type":"object","properties":{"id":{"type":"string","readOnly":true,"example":"DL-001"},"name":{"type":"string","example":"Engineering All"},"email":{"type":"string","format":"email","example":"engineering-all@acme.com"},"description":{"type":"string","example":"All engineering team members"},"type":{"type":"string","enum":["static","dynamic"],"example":"static"},"members":{"type":"array","items":{"type":"string","format":"email"},"description":"Member email addresses","example":["alice.chen@acme.com","bob.martinez@acme.com"]},"memberCount":{"type":"integer","readOnly":true,"example":2,"description":"Maintained automatically when members are added/removed"},"createdAt":{"type":"string","format":"date-time","readOnly":true},"updatedAt":{"type":"string","format":"date-time","readOnly":true}}},"UserSettings":{"type":"object","properties":{"id":{"type":"string","readOnly":true,"example":"USET-001"},"email":{"type":"string","format":"email","example":"alice.chen@acme.com"},"displayName":{"type":"string","example":"Alice Chen"},"title":{"type":"string","example":"Engineering Manager"},"avatarColor":{"type":"string","description":"Hex color used for the user avatar in the UI","example":"#4285F4"},"timeZone":{"type":"string","description":"IANA timezone string","example":"America/Los_Angeles"},"dateFormat":{"type":"string","example":"MM/dd/yyyy"},"timeFormat":{"type":"string","example":"h:mm tt"},"language":{"type":"object","properties":{"locale":{"type":"string","example":"en-US"},"displayName":{"type":"string","example":"English (United States)"}}},"workingHours":{"type":"object","properties":{"daysOfWeek":{"type":"array","items":{"type":"string"},"example":["monday","tuesday","wednesday","thursday","friday"]},"startTime":{"type":"string","description":"HH:MM:SS.0000000 format","example":"08:00:00.0000000"},"endTime":{"type":"string","description":"HH:MM:SS.0000000 format","example":"17:00:00.0000000"},"timeZone":{"type":"object","properties":{"name":{"type":"string","example":"America/Los_Angeles"}}}}},"automaticRepliesSetting":{"type":"object","properties":{"status":{"type":"string","enum":["disabled","alwaysEnabled","scheduled"],"example":"disabled"},"externalAudience":{"type":"string","enum":["none","contactsOnly","all"],"example":"all"},"internalReplyMessage":{"type":"string","example":""},"externalReplyMessage":{"type":"string","example":""}}},"delegateMeetingMessageDeliveryOptions":{"type":"string","example":"sendToDelegateOnly"},"userPurpose":{"type":"string","readOnly":true,"example":"user"},"createdAt":{"type":"string","format":"date-time","readOnly":true},"updatedAt":{"type":"string","format":"date-time","readOnly":true}}},"MailboxSettings":{"type":"object","description":"Graph-compatible mailbox settings projection of UserSettings. GET/PATCH via /users/{email}/mailboxSettings.","properties":{"timeZone":{"type":"string","example":"America/Los_Angeles"},"dateFormat":{"type":"string","example":"MM/dd/yyyy"},"timeFormat":{"type":"string","example":"h:mm tt"},"language":{"type":"object","properties":{"locale":{"type":"string","example":"en-US"},"displayName":{"type":"string","example":"English (United States)"}}},"workingHours":{"type":"object","properties":{"daysOfWeek":{"type":"array","items":{"type":"string"},"example":["monday","tuesday","wednesday","thursday","friday"]},"startTime":{"type":"string","example":"08:00:00.0000000"},"endTime":{"type":"string","example":"17:00:00.0000000"},"timeZone":{"type":"object","properties":{"name":{"type":"string","example":"America/Los_Angeles"}}}}},"automaticRepliesSetting":{"type":"object","properties":{"status":{"type":"string","enum":["disabled","alwaysEnabled","scheduled"],"example":"disabled"},"externalAudience":{"type":"string","enum":["none","contactsOnly","all"],"example":"all"},"internalReplyMessage":{"type":"string","example":""},"externalReplyMessage":{"type":"string","example":""}}},"delegateMeetingMessageDeliveryOptions":{"type":"string","example":"sendToDelegateOnly"},"userPurpose":{"type":"string","readOnly":true,"example":"user"}}},"ScheduleInformation":{"type":"object","properties":{"scheduleId":{"type":"string","format":"email","example":"alice.chen@acme.com"},"availabilityView":{"type":"string","description":"Encoded string: 0=free, 1=tentative, 2=busy, 3=oof, 4=workingElsewhere","example":"0020000"},"scheduleItems":{"type":"array","items":{"type":"object","properties":{"status":{"type":"string","example":"busy"},"subject":{"type":"string","example":"Daily Standup"},"location":{"type":"string","example":""},"start":{"$ref":"#/components/schemas/DateTimeTimeZone"},"end":{"$ref":"#/components/schemas/DateTimeTimeZone"},"isPrivate":{"type":"boolean","example":false}}}},"workingHours":{"type":"object","properties":{"daysOfWeek":{"type":"array","items":{"type":"string"},"example":["monday","tuesday","wednesday","thursday","friday"]},"startTime":{"type":"string","example":"08:00:00.0000000"},"endTime":{"type":"string","example":"17:00:00.0000000"},"timeZone":{"type":"object","properties":{"name":{"type":"string","example":"America/Los_Angeles"}}}}}}}}},"paths":{"/events":{"get":{"summary":"List Purple Calendar events","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"$ref":"#/components/parameters/Top"},{"$ref":"#/components/parameters/Skip"},{"in":"query","name":"limit","schema":{"type":"integer","default":50},"description":"Alias for $top — max items per page (default 50)"}],"responses":{"200":{"description":"Paginated list of events","content":{"application/json":{"schema":{"type":"object","properties":{"value":{"type":"array","items":{"$ref":"#/components/schemas/Event"}},"@odata.nextLink":{"type":"string","nullable":true,"description":"OData next-page link, absent on the last page"}}}}}}},"description":"Every meeting and appointment stored in Purple Calendar, across all users, as Microsoft Graph-shaped Event objects in a `value` array. This op only pages with _top/_skip — when the question is about a person or a date range, prefer the calendarView tools, which take startDateTime/endDateTime."},"post":{"summary":"Schedule a calendar event","parameters":[{"$ref":"#/components/parameters/InstanceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"}}}}},"description":"Creates a meeting in Purple Calendar — subject, start/end as DateTimeTimeZone, attendees, location or room, and optional recurrence (which makes it a series master). It does not check availability: use the free/busy schedule or findMeetingTimes tools first if the time isn't already agreed."}},"/events/{id}":{"get":{"summary":"Get event","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"}}}},"404":{"description":"Not found"}}},"patch":{"summary":"Update a calendar event","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"Fields to update (partial)","required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"}}}},"responses":{"200":{"description":"Updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"}}}},"404":{"description":"Not found"}},"description":"Partially updates an existing Purple Calendar event — reschedule its times, change the subject/body, or amend the attendee list. To call a meeting off, prefer the cancel tool, which keeps the record and marks it isCancelled."},"delete":{"summary":"Delete a calendar event","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No content"},"404":{"description":"Not found"}},"description":"Permanently removes an event from Purple Calendar. Destructive and irreversible, and it leaves attendees no cancellation record — use the cancel tool instead whenever a meeting is simply called off."}},"/users/{email}/events/{id}/accept":{"post":{"summary":"Accept event invitation","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"email","required":true,"schema":{"type":"string","format":"email"},"description":"User email — or the literal \"me\" to act as the current impersonated user (the X-PS-Impersonate-User header, or the instance's configured default MCP user)."},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"comment":{"type":"string","example":"Looking forward to it!"},"sendResponse":{"type":"boolean","example":true}}}}}},"responses":{"202":{"description":"Accepted"},"404":{"description":"Not found"}}}},"/users/{email}/events/{id}/decline":{"post":{"summary":"Decline event invitation","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"email","required":true,"schema":{"type":"string","format":"email"},"description":"User email — or the literal \"me\" to act as the current impersonated user (the X-PS-Impersonate-User header, or the instance's configured default MCP user)."},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"comment":{"type":"string","example":"Conflict — will catch the recording."},"sendResponse":{"type":"boolean","example":true},"proposedNewTime":{"type":"object","nullable":true}}}}}},"responses":{"202":{"description":"Accepted"},"404":{"description":"Not found"}}}},"/users/{email}/events/{id}/tentativelyAccept":{"post":{"summary":"Tentatively accept event invitation","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"email","required":true,"schema":{"type":"string","format":"email"},"description":"User email — or the literal \"me\" to act as the current impersonated user (the X-PS-Impersonate-User header, or the instance's configured default MCP user)."},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"comment":{"type":"string","example":"Will try to join."},"sendResponse":{"type":"boolean","example":true},"proposedNewTime":{"type":"object","nullable":true}}}}}},"responses":{"202":{"description":"Accepted"},"404":{"description":"Not found"}}}},"/events/{id}/cancel":{"post":{"summary":"Cancel event (bare path alias)","description":"Cancels the event (sets isCancelled: true, showAs: free). Does not delete the event. Cancelling a seriesMaster cancels the whole series; cancelling a generated occurrence (id in the form seriesMasterId_yyyymmdd) cancels just that date by materializing an exception. Also available at /users/{email}/events/{id}/cancel.","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"comment":{"type":"string","description":"Cancellation message","example":"Meeting is no longer needed."}}}}}},"responses":{"202":{"description":"Accepted"},"404":{"description":"Not found"}}}},"/users/{email}/events/{id}/cancel":{"post":{"summary":"Cancel event (user-scoped path)","description":"Cancels the event (sets isCancelled: true, showAs: free). Does not delete the event. Cancelling a seriesMaster cancels the whole series; cancelling a generated occurrence (id in the form seriesMasterId_yyyymmdd) cancels just that date by materializing an exception.","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"email","required":true,"schema":{"type":"string","format":"email"},"description":"User email — or the literal \"me\" to act as the current impersonated user (the X-PS-Impersonate-User header, or the instance's configured default MCP user)."},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"comment":{"type":"string","description":"Cancellation message","example":"Meeting is no longer needed."}}}}}},"responses":{"202":{"description":"Accepted"},"404":{"description":"Not found"}}}},"/events/{id}/instances":{"get":{"summary":"List occurrences of an event series (bare path alias)","description":"Expands a seriesMaster into its occurrence instances within the time window (stored exceptions included). For a non-recurring event, returns the event itself when it intersects the window. Also available at /users/{email}/events/{id}/instances.","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}},{"in":"query","name":"startDateTime","required":true,"schema":{"type":"string","format":"date-time"},"example":"2026-06-01T00:00:00Z"},{"in":"query","name":"endDateTime","required":true,"schema":{"type":"string","format":"date-time"},"example":"2026-06-30T23:59:59Z"}],"responses":{"200":{"description":"Occurrences in range","content":{"application/json":{"schema":{"type":"object","properties":{"value":{"type":"array","items":{"$ref":"#/components/schemas/Event"}}}}}}},"400":{"description":"startDateTime and endDateTime are required"},"404":{"description":"Not found"}}}},"/users/{email}/events/{id}/instances":{"get":{"summary":"List occurrences of an event series (user-scoped path)","description":"Expands a seriesMaster into its occurrence instances within the time window (stored exceptions included). For a non-recurring event, returns the event itself when it intersects the window.","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"email","required":true,"schema":{"type":"string","format":"email"},"description":"User email — or the literal \"me\" to act as the current impersonated user (the X-PS-Impersonate-User header, or the instance's configured default MCP user)."},{"in":"path","name":"id","required":true,"schema":{"type":"string"}},{"in":"query","name":"startDateTime","required":true,"schema":{"type":"string","format":"date-time"},"example":"2026-06-01T00:00:00Z"},{"in":"query","name":"endDateTime","required":true,"schema":{"type":"string","format":"date-time"},"example":"2026-06-30T23:59:59Z"}],"responses":{"200":{"description":"Occurrences in range","content":{"application/json":{"schema":{"type":"object","properties":{"value":{"type":"array","items":{"$ref":"#/components/schemas/Event"}}}}}}},"400":{"description":"startDateTime and endDateTime are required"},"404":{"description":"Not found"}}}},"/findMeetingTimes":{"post":{"summary":"Find meeting time suggestions (bare path)","description":"Suggests meeting times when all attendees are available, based on their calendar events. Also available at /users/{email}/findMeetingTimes.","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"header","name":"Prefer","schema":{"type":"string"},"description":"Optional response timezone override, e.g. `outlook.timezone=\"Pacific Standard Time\"`","example":"outlook.timezone=\"Pacific Standard Time\""}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"attendees":{"type":"array","items":{"type":"object","properties":{"emailAddress":{"$ref":"#/components/schemas/EmailAddress"},"type":{"type":"string","enum":["required","optional","resource"]}}},"example":[{"emailAddress":{"address":"bob.martinez@acme.com","name":"Bob Martinez"},"type":"required"}]},"timeConstraint":{"type":"object","properties":{"activityDomain":{"type":"string","enum":["work","personal","unrestricted"],"example":"work"},"timeSlots":{"type":"array","items":{"type":"object","properties":{"start":{"$ref":"#/components/schemas/DateTimeTimeZone"},"end":{"$ref":"#/components/schemas/DateTimeTimeZone"}}},"example":[{"start":{"dateTime":"2026-06-02T08:00:00.0000000","timeZone":"Pacific Standard Time"},"end":{"dateTime":"2026-06-02T17:00:00.0000000","timeZone":"Pacific Standard Time"}}]}}},"meetingDuration":{"type":"string","description":"ISO 8601 duration, e.g. PT1H, PT30M","default":"PT30M","example":"PT30M"},"maxCandidates":{"type":"integer","default":5,"example":5},"minimumAttendeePercentage":{"type":"number","default":50,"example":50},"isOrganizerOptional":{"type":"boolean","default":false,"example":false},"returnSuggestionReasons":{"type":"boolean","default":false,"example":false}}}}}},"responses":{"200":{"description":"Meeting time suggestions","content":{"application/json":{"schema":{"type":"object","properties":{"emptySuggestionsReason":{"type":"string","example":""},"meetingTimeSuggestions":{"type":"array","items":{"type":"object","properties":{"confidence":{"type":"number","example":100},"order":{"type":"integer","example":1},"organizerAvailability":{"type":"string","example":"free"},"suggestionReason":{"type":"string"},"attendeeAvailability":{"type":"array","items":{"type":"object","properties":{"attendee":{"type":"object"},"availability":{"type":"string"}}}},"locations":{"type":"array","items":{"type":"object"}},"meetingTimeSlot":{"type":"object","properties":{"start":{"$ref":"#/components/schemas/DateTimeTimeZone"},"end":{"$ref":"#/components/schemas/DateTimeTimeZone"}}}}}}}}}}}}}},"/users/{email}/findMeetingTimes":{"post":{"summary":"Find meeting time suggestions (user-scoped path)","description":"Organizer-scoped variant. Uses the organizer's timezone from their mailboxSettings for activityDomain filtering.","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"email","required":true,"schema":{"type":"string","format":"email"},"description":"User email — or the literal \"me\" to act as the current impersonated user (the X-PS-Impersonate-User header, or the instance's configured default MCP user)."},{"in":"header","name":"Prefer","schema":{"type":"string"},"description":"Optional response timezone override, e.g. `outlook.timezone=\"Pacific Standard Time\"`","example":"outlook.timezone=\"Pacific Standard Time\""}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"attendees":{"type":"array","items":{"type":"object","properties":{"emailAddress":{"$ref":"#/components/schemas/EmailAddress"},"type":{"type":"string","enum":["required","optional","resource"]}}},"example":[{"emailAddress":{"address":"bob.martinez@acme.com","name":"Bob Martinez"},"type":"required"}]},"timeConstraint":{"type":"object","properties":{"activityDomain":{"type":"string","enum":["work","personal","unrestricted"],"example":"work"},"timeSlots":{"type":"array","items":{"type":"object","properties":{"start":{"$ref":"#/components/schemas/DateTimeTimeZone"},"end":{"$ref":"#/components/schemas/DateTimeTimeZone"}}},"example":[{"start":{"dateTime":"2026-06-02T08:00:00.0000000","timeZone":"Pacific Standard Time"},"end":{"dateTime":"2026-06-02T17:00:00.0000000","timeZone":"Pacific Standard Time"}}]}}},"meetingDuration":{"type":"string","description":"ISO 8601 duration, e.g. PT1H, PT30M","default":"PT30M","example":"PT30M"},"maxCandidates":{"type":"integer","default":5,"example":5},"minimumAttendeePercentage":{"type":"number","default":50,"example":50},"isOrganizerOptional":{"type":"boolean","default":false,"example":false},"returnSuggestionReasons":{"type":"boolean","default":false,"example":false}}}}}},"responses":{"200":{"description":"Meeting time suggestions","content":{"application/json":{"schema":{"type":"object","properties":{"emptySuggestionsReason":{"type":"string","example":""},"meetingTimeSuggestions":{"type":"array","items":{"type":"object","properties":{"confidence":{"type":"number","example":100},"order":{"type":"integer","example":1},"organizerAvailability":{"type":"string","example":"free"},"suggestionReason":{"type":"string"},"attendeeAvailability":{"type":"array","items":{"type":"object","properties":{"attendee":{"type":"object"},"availability":{"type":"string"}}}},"locations":{"type":"array","items":{"type":"object"}},"meetingTimeSlot":{"type":"object","properties":{"start":{"$ref":"#/components/schemas/DateTimeTimeZone"},"end":{"$ref":"#/components/schemas/DateTimeTimeZone"}}}}}}}}}}}}}},"/calendarView":{"get":{"summary":"Get calendar view — all events in time range","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"query","name":"startDateTime","required":true,"schema":{"type":"string","format":"date-time"},"example":"2026-06-02T00:00:00Z"},{"in":"query","name":"endDateTime","required":true,"schema":{"type":"string","format":"date-time"},"example":"2026-06-06T23:59:59Z"},{"$ref":"#/components/parameters/Top"},{"$ref":"#/components/parameters/Skip"},{"in":"query","name":"limit","schema":{"type":"integer","default":50},"description":"Alias for $top — max items per page (default 50)"}],"responses":{"200":{"description":"Events in range","content":{"application/json":{"schema":{"type":"object","properties":{"value":{"type":"array","items":{"$ref":"#/components/schemas/Event"}},"@odata.nextLink":{"type":"string","nullable":true,"description":"OData next-page link, absent on the last page"}}}}}},"400":{"description":"startDateTime and endDateTime are required"}}}},"/users/{email}/calendarView":{"get":{"summary":"Get calendar view for a specific user (events in time range)","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"email","required":true,"schema":{"type":"string","format":"email"},"description":"User email — or the literal \"me\" to act as the current impersonated user (the X-PS-Impersonate-User header, or the instance's configured default MCP user)."},{"in":"query","name":"startDateTime","required":true,"schema":{"type":"string","format":"date-time"},"example":"2026-06-02T00:00:00Z"},{"in":"query","name":"endDateTime","required":true,"schema":{"type":"string","format":"date-time"},"example":"2026-06-06T23:59:59Z"}],"responses":{"200":{"description":"User events in range","content":{"application/json":{"schema":{"type":"object","properties":{"value":{"type":"array","items":{"$ref":"#/components/schemas/Event"}}}}}}},"400":{"description":"startDateTime and endDateTime are required"}}}},"/users/{email}/events":{"get":{"summary":"List all events for a specific user","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"email","required":true,"schema":{"type":"string","format":"email"},"description":"User email — or the literal \"me\" to act as the current impersonated user (the X-PS-Impersonate-User header, or the instance's configured default MCP user)."},{"$ref":"#/components/parameters/Top"},{"$ref":"#/components/parameters/Skip"},{"in":"query","name":"limit","schema":{"type":"integer","default":50},"description":"Alias for $top — max items per page (default 50)"}],"responses":{"200":{"description":"User events","content":{"application/json":{"schema":{"type":"object","properties":{"value":{"type":"array","items":{"$ref":"#/components/schemas/Event"}},"@odata.nextLink":{"type":"string","nullable":true,"description":"OData next-page link, absent on the last page"}}}}}}}},"post":{"x-mcp":false,"summary":"Create event (user-scoped path)","description":"User-scoped twin of POST /events. Defaults the organizer to the resolved user when the body doesn't set one.","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"email","required":true,"schema":{"type":"string","format":"email"},"description":"User email — or the literal \"me\" to act as the current impersonated user (the X-PS-Impersonate-User header, or the instance's configured default MCP user)."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"}}}}}}},"/users/{email}/events/{id}":{"get":{"x-mcp":false,"summary":"Get event (user-scoped path)","description":"User-scoped twin of GET /events/{id}.","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"email","required":true,"schema":{"type":"string","format":"email"},"description":"User email — or the literal \"me\" to act as the current impersonated user (the X-PS-Impersonate-User header, or the instance's configured default MCP user)."},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"}}}},"404":{"description":"Not found"}}},"patch":{"x-mcp":false,"summary":"Update event (user-scoped path)","description":"User-scoped twin of PATCH /events/{id}.","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"email","required":true,"schema":{"type":"string","format":"email"},"description":"User email — or the literal \"me\" to act as the current impersonated user (the X-PS-Impersonate-User header, or the instance's configured default MCP user)."},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"Fields to update (partial)","required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"}}}},"responses":{"200":{"description":"Updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"}}}},"404":{"description":"Not found"}}},"delete":{"x-mcp":false,"summary":"Delete event (user-scoped path)","description":"User-scoped twin of DELETE /events/{id}.","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"email","required":true,"schema":{"type":"string","format":"email"},"description":"User email — or the literal \"me\" to act as the current impersonated user (the X-PS-Impersonate-User header, or the instance's configured default MCP user)."},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No content"},"404":{"description":"Not found"}}}},"/users/{email}/calendars":{"get":{"x-mcp":false,"summary":"List all calendars (user-scoped alias — returns all instance calendars)","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"email","required":true,"schema":{"type":"string","format":"email"},"description":"User email — or the literal \"me\" to act as the current impersonated user (the X-PS-Impersonate-User header, or the instance's configured default MCP user)."},{"$ref":"#/components/parameters/Top"},{"$ref":"#/components/parameters/Skip"},{"in":"query","name":"limit","schema":{"type":"integer","default":50},"description":"Alias for $top — max items per page (default 50)"}],"responses":{"200":{"description":"Collection of calendars","content":{"application/json":{"schema":{"type":"object","properties":{"value":{"type":"array","items":{"$ref":"#/components/schemas/Calendar"}},"@odata.nextLink":{"type":"string","nullable":true,"description":"OData next-page link, absent on the last page"}}}}}}}},"post":{"x-mcp":false,"summary":"Create calendar (user-scoped path)","description":"User-scoped twin of POST /calendars. Defaults the owner to the resolved user when the body doesn't set one.","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"email","required":true,"schema":{"type":"string","format":"email"},"description":"User email — or the literal \"me\" to act as the current impersonated user (the X-PS-Impersonate-User header, or the instance's configured default MCP user)."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Calendar"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Calendar"}}}}}}},"/users/{email}/calendars/{id}":{"get":{"x-mcp":false,"summary":"Get calendar (user-scoped path)","description":"User-scoped twin of GET /calendars/{id}.","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"email","required":true,"schema":{"type":"string","format":"email"},"description":"User email — or the literal \"me\" to act as the current impersonated user (the X-PS-Impersonate-User header, or the instance's configured default MCP user)."},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Calendar"}}}},"404":{"description":"Not found"}}},"patch":{"x-mcp":false,"summary":"Update calendar (user-scoped path)","description":"User-scoped twin of PATCH /calendars/{id}.","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"email","required":true,"schema":{"type":"string","format":"email"},"description":"User email — or the literal \"me\" to act as the current impersonated user (the X-PS-Impersonate-User header, or the instance's configured default MCP user)."},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"Fields to update (partial)","required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Calendar"}}}},"responses":{"200":{"description":"Updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Calendar"}}}},"404":{"description":"Not found"}}},"delete":{"x-mcp":false,"summary":"Delete calendar (user-scoped path)","description":"User-scoped twin of DELETE /calendars/{id}.","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"email","required":true,"schema":{"type":"string","format":"email"},"description":"User email — or the literal \"me\" to act as the current impersonated user (the X-PS-Impersonate-User header, or the instance's configured default MCP user)."},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No content"},"404":{"description":"Not found"}}}},"/users/{email}/calendars/{id}/events":{"get":{"summary":"List events for a specific calendar (user-scoped path)","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"email","required":true,"schema":{"type":"string","format":"email"},"description":"User email — or the literal \"me\" to act as the current impersonated user (the X-PS-Impersonate-User header, or the instance's configured default MCP user)."},{"in":"path","name":"id","required":true,"schema":{"type":"string"},"description":"Calendar id"},{"in":"query","name":"startDateTime","schema":{"type":"string","format":"date-time"},"example":"2026-06-02T00:00:00Z"},{"in":"query","name":"endDateTime","schema":{"type":"string","format":"date-time"},"example":"2026-06-06T23:59:59Z"}],"responses":{"200":{"description":"Events for the calendar","content":{"application/json":{"schema":{"type":"object","properties":{"value":{"type":"array","items":{"$ref":"#/components/schemas/Event"}}}}}}},"404":{"description":"Calendar not found"}}},"post":{"summary":"Create event in a specific calendar (user-scoped path)","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"email","required":true,"schema":{"type":"string","format":"email"},"description":"User email — or the literal \"me\" to act as the current impersonated user (the X-PS-Impersonate-User header, or the instance's configured default MCP user)."},{"in":"path","name":"id","required":true,"schema":{"type":"string"},"description":"Calendar id"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"}}}},"responses":{"201":{"description":"Created event","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"}}}},"404":{"description":"Calendar not found"}}}},"/calendars":{"get":{"summary":"List Purple Calendar calendars","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"$ref":"#/components/parameters/Top"},{"$ref":"#/components/parameters/Skip"},{"in":"query","name":"limit","schema":{"type":"integer","default":50},"description":"Alias for $top — max items per page (default 50)"}],"responses":{"200":{"description":"Paginated list of calendars","content":{"application/json":{"schema":{"type":"object","properties":{"value":{"type":"array","items":{"$ref":"#/components/schemas/Calendar"}},"@odata.nextLink":{"type":"string","nullable":true,"description":"OData next-page link, absent on the last page"}}}}}}},"description":"The calendar containers in this instance — each person's default calendar plus any shared or resource calendars, with owner, colour and sharing flags. These are the buckets events live in, not the events themselves; use it to resolve a calendar id before listing or creating events inside one."},"post":{"summary":"Create calendar","parameters":[{"$ref":"#/components/parameters/InstanceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Calendar"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Calendar"}}}}}}},"/calendars/{id}":{"get":{"summary":"Get calendar","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Calendar"}}}},"404":{"description":"Not found"}}},"patch":{"summary":"Update calendar","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"Fields to update (partial)","required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Calendar"}}}},"responses":{"200":{"description":"Updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Calendar"}}}},"404":{"description":"Not found"}}},"delete":{"summary":"Delete calendar","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No content"},"404":{"description":"Not found"}}}},"/calendars/{id}/events":{"get":{"summary":"List events for a specific calendar","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}},{"in":"query","name":"startDateTime","schema":{"type":"string","format":"date-time"},"example":"2026-06-02T00:00:00Z"},{"in":"query","name":"endDateTime","schema":{"type":"string","format":"date-time"},"example":"2026-06-06T23:59:59Z"}],"responses":{"200":{"description":"Events for the calendar","content":{"application/json":{"schema":{"type":"object","properties":{"value":{"type":"array","items":{"$ref":"#/components/schemas/Event"}}}}}}},"404":{"description":"Calendar not found"}}},"post":{"summary":"Create event in a specific calendar","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"}}}},"responses":{"201":{"description":"Created event","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"}}}},"404":{"description":"Calendar not found"}}}},"/calendar/getSchedule":{"post":{"summary":"Get free/busy schedule for users (bare path alias)","description":"Returns availability view and schedule items for each requested SMTP address. Also available at /users/{email}/calendar/getSchedule.","parameters":[{"$ref":"#/components/parameters/InstanceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"schedules":{"type":"array","items":{"type":"string","format":"email"},"description":"SMTP addresses to query","example":["alice.chen@acme.com","bob.martinez@acme.com"]},"startTime":{"allOf":[{"$ref":"#/components/schemas/DateTimeTimeZone"}],"example":{"dateTime":"2026-06-02T08:00:00.0000000","timeZone":"Pacific Standard Time"}},"endTime":{"allOf":[{"$ref":"#/components/schemas/DateTimeTimeZone"}],"example":{"dateTime":"2026-06-06T18:00:00.0000000","timeZone":"Pacific Standard Time"}},"availabilityViewInterval":{"type":"integer","default":30,"description":"Minutes per availability slot","example":30}},"required":["schedules","startTime","endTime"]}}}},"responses":{"200":{"description":"Schedule information","content":{"application/json":{"schema":{"type":"object","properties":{"value":{"type":"array","items":{"$ref":"#/components/schemas/ScheduleInformation"}}}}}}},"400":{"description":"schedules, startTime, and endTime are required"}}}},"/users/{email}/calendar/getSchedule":{"post":{"summary":"Get free/busy schedule for users (user-scoped path)","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"email","required":true,"schema":{"type":"string","format":"email"},"description":"User email — or the literal \"me\" to act as the current impersonated user (the X-PS-Impersonate-User header, or the instance's configured default MCP user)."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"schedules":{"type":"array","items":{"type":"string","format":"email"},"description":"SMTP addresses to query","example":["alice.chen@acme.com","bob.martinez@acme.com"]},"startTime":{"allOf":[{"$ref":"#/components/schemas/DateTimeTimeZone"}],"example":{"dateTime":"2026-06-02T08:00:00.0000000","timeZone":"Pacific Standard Time"}},"endTime":{"allOf":[{"$ref":"#/components/schemas/DateTimeTimeZone"}],"example":{"dateTime":"2026-06-06T18:00:00.0000000","timeZone":"Pacific Standard Time"}},"availabilityViewInterval":{"type":"integer","default":30,"description":"Minutes per availability slot","example":30}},"required":["schedules","startTime","endTime"]}}}},"responses":{"200":{"description":"Schedule information","content":{"application/json":{"schema":{"type":"object","properties":{"value":{"type":"array","items":{"$ref":"#/components/schemas/ScheduleInformation"}}}}}}}}}},"/places":{"get":{"summary":"List bookable meeting rooms","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"$ref":"#/components/parameters/Top"},{"$ref":"#/components/parameters/Skip"},{"in":"query","name":"limit","schema":{"type":"integer","default":50},"description":"Alias for $top — max items per page (default 50)"}],"responses":{"200":{"description":"Paginated list of rooms","content":{"application/json":{"schema":{"type":"object","properties":{"value":{"type":"array","items":{"$ref":"#/components/schemas/Room"}},"@odata.nextLink":{"type":"string","nullable":true,"description":"OData next-page link, absent on the last page"}}}}}}},"description":"Physical meeting rooms in Purple Calendar — display name, room mailbox address, capacity, building/floor, accessibility and equipment tags (whiteboard, tv, video_conferencing). Use it to pick a room to attach as an event location or resource attendee; it is not an office/site directory and holds no people. Pages with _top/_skip."},"post":{"summary":"Create room","parameters":[{"$ref":"#/components/parameters/InstanceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Room"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Room"}}}}}}},"/places/{id}":{"get":{"summary":"Get room","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Room"}}}},"404":{"description":"Not found"}}},"patch":{"summary":"Update room","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"Fields to update (partial)","required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Room"}}}},"responses":{"200":{"description":"Updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Room"}}}},"404":{"description":"Not found"}}},"delete":{"summary":"Delete room","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No content"},"404":{"description":"Not found"}}}},"/users/{email}/mailboxSettings":{"get":{"summary":"Get user mailbox settings","description":"Returns a Graph-compatible MailboxSettings projection of the stored UserSettings record. Returns sensible defaults for unknown users.","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"email","required":true,"schema":{"type":"string","format":"email"},"description":"User email — or the literal \"me\" to act as the current impersonated user (the X-PS-Impersonate-User header, or the instance's configured default MCP user)."}],"responses":{"200":{"description":"Mailbox settings","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailboxSettings"}}}}}},"patch":{"summary":"Update user mailbox settings","description":"Merges the provided fields into the user's settings. Creates a record if none exists. Validates timeZone and workingHours.","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"email","required":true,"schema":{"type":"string","format":"email"},"description":"User email — or the literal \"me\" to act as the current impersonated user (the X-PS-Impersonate-User header, or the instance's configured default MCP user)."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailboxSettings"}}}},"responses":{"200":{"description":"Updated mailbox settings","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailboxSettings"}}}},"422":{"description":"Invalid timeZone or workingHours"}}}},"/distribution_lists":{"get":{"summary":"List email distribution lists","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"query","name":"limit","schema":{"type":"integer","default":50},"description":"Max items per page (default 50)"},{"in":"query","name":"cursor","schema":{"type":"string"},"description":"Pass the previous response's nextCursor to fetch the next page"},{"in":"query","name":"$filter","schema":{"type":"string"},"description":"OData filter expression. Comparison operators: eq, ne, gt, ge, lt, le. Logical: and, or, not, with parentheses for grouping. String functions: contains(field,'x'), startswith(field,'x'), endswith(field,'x'). Membership: field in ('a','b'). Case-insensitive matching via tolower(field) / toupper(field). Nested fields use a slash, e.g. pto_balance/vacation_days. String literals use single quotes; dates are ISO-8601. Examples: \"status eq 'active'\"; \"salary gt 50000 and department eq 'Engineering'\"; \"contains(tolower(name),'acme')\"; \"closeDate gt 2026-01-01\"."},{"in":"query","name":"$select","schema":{"type":"string"},"description":"Comma-separated list of fields to return, e.g. \"id,firstName,email\". Nested fields via slash (\"pto_balance/vacation_days\"). The id field is always included."},{"in":"query","name":"$orderby","schema":{"type":"string"},"description":"Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."},{"in":"query","name":"$search","schema":{"type":"string"},"description":"Free-text, case-insensitive substring match across the resource's searchable fields."},{"in":"query","name":"$top","schema":{"type":"integer"},"description":"Maximum number of items to return (page size)."},{"in":"query","name":"$skip","schema":{"type":"integer"},"description":"Number of matching items to skip before returning results (offset paging). Combine with $top."},{"in":"query","name":"$count","schema":{"type":"boolean"},"description":"When true, include @odata.count (total matches after $filter/$search, before paging) in the response."}],"responses":{"200":{"description":"Paginated list of distribution lists","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/DistributionList"}},"nextCursor":{"type":"string","nullable":true,"description":"Cursor for the next page, or null on the last page"},"total":{"type":"integer","description":"Total documents in the collection"}}}}}}},"description":"Named email groups in Purple Calendar (e.g. engineering-all@acme.com) with their member addresses and memberCount — used to invite a whole group to a meeting. These are mailing groups, not chat channels (see the chat app) or HR departments (see the hris app). Supports server-side querying with _filter/_search/_orderby/_select/_top/_skip/_count (OData $-params, renamed with a leading underscore for MCP)."},"post":{"summary":"Create distribution list","parameters":[{"$ref":"#/components/parameters/InstanceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DistributionList"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DistributionList"}}}}}}},"/distribution_lists/{id}":{"get":{"summary":"Get distribution list","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DistributionList"}}}},"404":{"description":"Not found"}}},"patch":{"summary":"Update distribution list","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"Fields to update (partial)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DistributionList"}}}},"responses":{"200":{"description":"Updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DistributionList"}}}},"404":{"description":"Not found"}}},"delete":{"summary":"Delete distribution list","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Deleted","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"}}}}}},"404":{"description":"Not found"}}}},"/distribution_lists/{id}/members":{"post":{"summary":"Add members to a distribution list","description":"Appends new email addresses to the members array (duplicates are silently skipped). Updates memberCount.","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"emails":{"type":"array","items":{"type":"string","format":"email"},"example":["carol.johnson@acme.com","dave.williams@acme.com"]}},"required":["emails"]}}}},"responses":{"200":{"description":"Updated distribution list","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DistributionList"}}}},"404":{"description":"Not found"},"422":{"description":"emails array is required and must not be empty"}}}},"/distribution_lists/{id}/members/{email}":{"delete":{"summary":"Remove a member from a distribution list","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}},{"in":"path","name":"email","required":true,"schema":{"type":"string","format":"email"},"description":"Email address of the member to remove"}],"responses":{"200":{"description":"Updated distribution list","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DistributionList"}}}},"404":{"description":"Not found (list or member)"}}}},"/user_settings":{"get":{"summary":"List calendar user (mailbox) settings","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"query","name":"limit","schema":{"type":"integer","default":50},"description":"Max items per page (default 50)"},{"in":"query","name":"cursor","schema":{"type":"string"},"description":"Pass the previous response's nextCursor to fetch the next page"},{"in":"query","name":"$filter","schema":{"type":"string"},"description":"OData filter expression. Comparison operators: eq, ne, gt, ge, lt, le. Logical: and, or, not, with parentheses for grouping. String functions: contains(field,'x'), startswith(field,'x'), endswith(field,'x'). Membership: field in ('a','b'). Case-insensitive matching via tolower(field) / toupper(field). Nested fields use a slash, e.g. pto_balance/vacation_days. String literals use single quotes; dates are ISO-8601. Examples: \"status eq 'active'\"; \"salary gt 50000 and department eq 'Engineering'\"; \"contains(tolower(name),'acme')\"; \"closeDate gt 2026-01-01\"."},{"in":"query","name":"$select","schema":{"type":"string"},"description":"Comma-separated list of fields to return, e.g. \"id,firstName,email\". Nested fields via slash (\"pto_balance/vacation_days\"). The id field is always included."},{"in":"query","name":"$orderby","schema":{"type":"string"},"description":"Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."},{"in":"query","name":"$search","schema":{"type":"string"},"description":"Free-text, case-insensitive substring match across the resource's searchable fields."},{"in":"query","name":"$top","schema":{"type":"integer"},"description":"Maximum number of items to return (page size)."},{"in":"query","name":"$skip","schema":{"type":"integer"},"description":"Number of matching items to skip before returning results (offset paging). Combine with $top."},{"in":"query","name":"$count","schema":{"type":"boolean"},"description":"When true, include @odata.count (total matches after $filter/$search, before paging) in the response."}],"responses":{"200":{"description":"Paginated list of user settings","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/UserSettings"}},"nextCursor":{"type":"string","nullable":true,"description":"Cursor for the next page, or null on the last page"},"total":{"type":"integer","description":"Total documents in the collection"}}}}}}},"description":"Raw UserSettings records — one per mailbox in Purple Calendar — holding each person's email, display name, timezone, working hours, date/time format, locale and auto-reply setting. This is the storage-level view and the way to enumerate who has a mailbox; for one known user prefer the Graph-shaped mailboxSettings tool. Supports server-side querying with _filter/_search/_orderby/_select/_top/_skip/_count (OData $-params, renamed with a leading underscore for MCP)."},"post":{"summary":"Create user settings record","parameters":[{"$ref":"#/components/parameters/InstanceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSettings"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSettings"}}}}}}},"/user_settings/{id}":{"get":{"summary":"Get user settings record","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSettings"}}}},"404":{"description":"Not found"}}},"patch":{"summary":"Update a calendar user settings record","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"Fields to update (partial)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSettings"}}}},"responses":{"200":{"description":"Updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSettings"}}}},"404":{"description":"Not found"}},"description":"Partially updates one raw UserSettings record by its document id (timezone, working hours, locale, auto-replies). Use the mailboxSettings update tool instead when you have the person's email address rather than the record id."},"delete":{"summary":"Delete user settings record","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Deleted","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"}}}}}},"404":{"description":"Not found"}}}},"/me/events/{id}/accept":{"post":{"summary":"Accept event invitation (/me alias)","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"comment":{"type":"string","example":"Looking forward to it!"},"sendResponse":{"type":"boolean","example":true}}}}}},"responses":{"202":{"description":"Accepted"},"404":{"description":"Not found"}},"x-mcp":false,"description":"Alias of /users/{email}/events/{id}/accept: acts as the impersonated user (X-PS-Impersonate-User header, or the instance's default MCP user)."}},"/me/events/{id}/decline":{"post":{"summary":"Decline event invitation (/me alias)","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"comment":{"type":"string","example":"Conflict — will catch the recording."},"sendResponse":{"type":"boolean","example":true},"proposedNewTime":{"type":"object","nullable":true}}}}}},"responses":{"202":{"description":"Accepted"},"404":{"description":"Not found"}},"x-mcp":false,"description":"Alias of /users/{email}/events/{id}/decline: acts as the impersonated user (X-PS-Impersonate-User header, or the instance's default MCP user)."}},"/me/events/{id}/tentativelyAccept":{"post":{"summary":"Tentatively accept event invitation (/me alias)","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"comment":{"type":"string","example":"Will try to join."},"sendResponse":{"type":"boolean","example":true},"proposedNewTime":{"type":"object","nullable":true}}}}}},"responses":{"202":{"description":"Accepted"},"404":{"description":"Not found"}},"x-mcp":false,"description":"Alias of /users/{email}/events/{id}/tentativelyAccept: acts as the impersonated user (X-PS-Impersonate-User header, or the instance's default MCP user)."}},"/me/events/{id}/cancel":{"post":{"summary":"Cancel event (user-scoped path) (/me alias)","description":"Cancels the event (sets isCancelled: true, showAs: free). Does not delete the event. Cancelling a seriesMaster cancels the whole series; cancelling a generated occurrence (id in the form seriesMasterId_yyyymmdd) cancels just that date by materializing an exception. Alias of /users/{email}/events/{id}/cancel: acts as the impersonated user (X-PS-Impersonate-User header, or the instance's default MCP user).","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"comment":{"type":"string","description":"Cancellation message","example":"Meeting is no longer needed."}}}}}},"responses":{"202":{"description":"Accepted"},"404":{"description":"Not found"}},"x-mcp":false}},"/me/events/{id}/instances":{"get":{"summary":"List occurrences of an event series (user-scoped path) (/me alias)","description":"Expands a seriesMaster into its occurrence instances within the time window (stored exceptions included). For a non-recurring event, returns the event itself when it intersects the window. Alias of /users/{email}/events/{id}/instances: acts as the impersonated user (X-PS-Impersonate-User header, or the instance's default MCP user).","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}},{"in":"query","name":"startDateTime","required":true,"schema":{"type":"string","format":"date-time"},"example":"2026-06-01T00:00:00Z"},{"in":"query","name":"endDateTime","required":true,"schema":{"type":"string","format":"date-time"},"example":"2026-06-30T23:59:59Z"}],"responses":{"200":{"description":"Occurrences in range","content":{"application/json":{"schema":{"type":"object","properties":{"value":{"type":"array","items":{"$ref":"#/components/schemas/Event"}}}}}}},"400":{"description":"startDateTime and endDateTime are required"},"404":{"description":"Not found"}},"x-mcp":false}},"/me/findMeetingTimes":{"post":{"summary":"Find meeting time suggestions (user-scoped path) (/me alias)","description":"Organizer-scoped variant. Uses the organizer's timezone from their mailboxSettings for activityDomain filtering. Alias of /users/{email}/findMeetingTimes: acts as the impersonated user (X-PS-Impersonate-User header, or the instance's default MCP user).","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"header","name":"Prefer","schema":{"type":"string"},"description":"Optional response timezone override, e.g. `outlook.timezone=\"Pacific Standard Time\"`","example":"outlook.timezone=\"Pacific Standard Time\""}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"attendees":{"type":"array","items":{"type":"object","properties":{"emailAddress":{"$ref":"#/components/schemas/EmailAddress"},"type":{"type":"string","enum":["required","optional","resource"]}}},"example":[{"emailAddress":{"address":"bob.martinez@acme.com","name":"Bob Martinez"},"type":"required"}]},"timeConstraint":{"type":"object","properties":{"activityDomain":{"type":"string","enum":["work","personal","unrestricted"],"example":"work"},"timeSlots":{"type":"array","items":{"type":"object","properties":{"start":{"$ref":"#/components/schemas/DateTimeTimeZone"},"end":{"$ref":"#/components/schemas/DateTimeTimeZone"}}},"example":[{"start":{"dateTime":"2026-06-02T08:00:00.0000000","timeZone":"Pacific Standard Time"},"end":{"dateTime":"2026-06-02T17:00:00.0000000","timeZone":"Pacific Standard Time"}}]}}},"meetingDuration":{"type":"string","description":"ISO 8601 duration, e.g. PT1H, PT30M","default":"PT30M","example":"PT30M"},"maxCandidates":{"type":"integer","default":5,"example":5},"minimumAttendeePercentage":{"type":"number","default":50,"example":50},"isOrganizerOptional":{"type":"boolean","default":false,"example":false},"returnSuggestionReasons":{"type":"boolean","default":false,"example":false}}}}}},"responses":{"200":{"description":"Meeting time suggestions","content":{"application/json":{"schema":{"type":"object","properties":{"emptySuggestionsReason":{"type":"string","example":""},"meetingTimeSuggestions":{"type":"array","items":{"type":"object","properties":{"confidence":{"type":"number","example":100},"order":{"type":"integer","example":1},"organizerAvailability":{"type":"string","example":"free"},"suggestionReason":{"type":"string"},"attendeeAvailability":{"type":"array","items":{"type":"object","properties":{"attendee":{"type":"object"},"availability":{"type":"string"}}}},"locations":{"type":"array","items":{"type":"object"}},"meetingTimeSlot":{"type":"object","properties":{"start":{"$ref":"#/components/schemas/DateTimeTimeZone"},"end":{"$ref":"#/components/schemas/DateTimeTimeZone"}}}}}}}}}}}},"x-mcp":false}},"/me/calendarView":{"get":{"summary":"Get calendar view for a specific user (events in time range) (/me alias)","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"query","name":"startDateTime","required":true,"schema":{"type":"string","format":"date-time"},"example":"2026-06-02T00:00:00Z"},{"in":"query","name":"endDateTime","required":true,"schema":{"type":"string","format":"date-time"},"example":"2026-06-06T23:59:59Z"}],"responses":{"200":{"description":"User events in range","content":{"application/json":{"schema":{"type":"object","properties":{"value":{"type":"array","items":{"$ref":"#/components/schemas/Event"}}}}}}},"400":{"description":"startDateTime and endDateTime are required"}},"x-mcp":false,"description":"Alias of /users/{email}/calendarView: acts as the impersonated user (X-PS-Impersonate-User header, or the instance's default MCP user)."}},"/me/events":{"get":{"summary":"List all events for a specific user (/me alias)","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"$ref":"#/components/parameters/Top"},{"$ref":"#/components/parameters/Skip"},{"in":"query","name":"limit","schema":{"type":"integer","default":50},"description":"Alias for $top — max items per page (default 50)"}],"responses":{"200":{"description":"User events","content":{"application/json":{"schema":{"type":"object","properties":{"value":{"type":"array","items":{"$ref":"#/components/schemas/Event"}},"@odata.nextLink":{"type":"string","nullable":true,"description":"OData next-page link, absent on the last page"}}}}}}},"x-mcp":false,"description":"Alias of /users/{email}/events: acts as the impersonated user (X-PS-Impersonate-User header, or the instance's default MCP user)."},"post":{"x-mcp":false,"summary":"Create event (user-scoped path) (/me alias)","description":"User-scoped twin of POST /events. Defaults the organizer to the resolved user when the body doesn't set one. Alias of /users/{email}/events: acts as the impersonated user (X-PS-Impersonate-User header, or the instance's default MCP user).","parameters":[{"$ref":"#/components/parameters/InstanceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"}}}}}}},"/me/events/{id}":{"get":{"x-mcp":false,"summary":"Get event (user-scoped path) (/me alias)","description":"User-scoped twin of GET /events/{id}. Alias of /users/{email}/events/{id}: acts as the impersonated user (X-PS-Impersonate-User header, or the instance's default MCP user).","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"}}}},"404":{"description":"Not found"}}},"patch":{"x-mcp":false,"summary":"Update event (user-scoped path) (/me alias)","description":"User-scoped twin of PATCH /events/{id}. Alias of /users/{email}/events/{id}: acts as the impersonated user (X-PS-Impersonate-User header, or the instance's default MCP user).","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"Fields to update (partial)","required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"}}}},"responses":{"200":{"description":"Updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"}}}},"404":{"description":"Not found"}}},"delete":{"x-mcp":false,"summary":"Delete event (user-scoped path) (/me alias)","description":"User-scoped twin of DELETE /events/{id}. Alias of /users/{email}/events/{id}: acts as the impersonated user (X-PS-Impersonate-User header, or the instance's default MCP user).","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No content"},"404":{"description":"Not found"}}}},"/me/calendars":{"get":{"x-mcp":false,"summary":"List all calendars (user-scoped alias — returns all instance calendars) (/me alias)","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"$ref":"#/components/parameters/Top"},{"$ref":"#/components/parameters/Skip"},{"in":"query","name":"limit","schema":{"type":"integer","default":50},"description":"Alias for $top — max items per page (default 50)"}],"responses":{"200":{"description":"Collection of calendars","content":{"application/json":{"schema":{"type":"object","properties":{"value":{"type":"array","items":{"$ref":"#/components/schemas/Calendar"}},"@odata.nextLink":{"type":"string","nullable":true,"description":"OData next-page link, absent on the last page"}}}}}}},"description":"Alias of /users/{email}/calendars: acts as the impersonated user (X-PS-Impersonate-User header, or the instance's default MCP user)."},"post":{"x-mcp":false,"summary":"Create calendar (user-scoped path) (/me alias)","description":"User-scoped twin of POST /calendars. Defaults the owner to the resolved user when the body doesn't set one. Alias of /users/{email}/calendars: acts as the impersonated user (X-PS-Impersonate-User header, or the instance's default MCP user).","parameters":[{"$ref":"#/components/parameters/InstanceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Calendar"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Calendar"}}}}}}},"/me/calendars/{id}":{"get":{"x-mcp":false,"summary":"Get calendar (user-scoped path) (/me alias)","description":"User-scoped twin of GET /calendars/{id}. Alias of /users/{email}/calendars/{id}: acts as the impersonated user (X-PS-Impersonate-User header, or the instance's default MCP user).","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Calendar"}}}},"404":{"description":"Not found"}}},"patch":{"x-mcp":false,"summary":"Update calendar (user-scoped path) (/me alias)","description":"User-scoped twin of PATCH /calendars/{id}. Alias of /users/{email}/calendars/{id}: acts as the impersonated user (X-PS-Impersonate-User header, or the instance's default MCP user).","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"Fields to update (partial)","required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Calendar"}}}},"responses":{"200":{"description":"Updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Calendar"}}}},"404":{"description":"Not found"}}},"delete":{"x-mcp":false,"summary":"Delete calendar (user-scoped path) (/me alias)","description":"User-scoped twin of DELETE /calendars/{id}. Alias of /users/{email}/calendars/{id}: acts as the impersonated user (X-PS-Impersonate-User header, or the instance's default MCP user).","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No content"},"404":{"description":"Not found"}}}},"/me/calendars/{id}/events":{"get":{"summary":"List events for a specific calendar (user-scoped path) (/me alias)","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"},"description":"Calendar id"},{"in":"query","name":"startDateTime","schema":{"type":"string","format":"date-time"},"example":"2026-06-02T00:00:00Z"},{"in":"query","name":"endDateTime","schema":{"type":"string","format":"date-time"},"example":"2026-06-06T23:59:59Z"}],"responses":{"200":{"description":"Events for the calendar","content":{"application/json":{"schema":{"type":"object","properties":{"value":{"type":"array","items":{"$ref":"#/components/schemas/Event"}}}}}}},"404":{"description":"Calendar not found"}},"x-mcp":false,"description":"Alias of /users/{email}/calendars/{id}/events: acts as the impersonated user (X-PS-Impersonate-User header, or the instance's default MCP user)."},"post":{"summary":"Create event in a specific calendar (user-scoped path) (/me alias)","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"},"description":"Calendar id"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"}}}},"responses":{"201":{"description":"Created event","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"}}}},"404":{"description":"Calendar not found"}},"x-mcp":false,"description":"Alias of /users/{email}/calendars/{id}/events: acts as the impersonated user (X-PS-Impersonate-User header, or the instance's default MCP user)."}},"/me/calendar/getSchedule":{"post":{"summary":"Get free/busy schedule for users (user-scoped path) (/me alias)","parameters":[{"$ref":"#/components/parameters/InstanceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"schedules":{"type":"array","items":{"type":"string","format":"email"},"description":"SMTP addresses to query","example":["alice.chen@acme.com","bob.martinez@acme.com"]},"startTime":{"allOf":[{"$ref":"#/components/schemas/DateTimeTimeZone"}],"example":{"dateTime":"2026-06-02T08:00:00.0000000","timeZone":"Pacific Standard Time"}},"endTime":{"allOf":[{"$ref":"#/components/schemas/DateTimeTimeZone"}],"example":{"dateTime":"2026-06-06T18:00:00.0000000","timeZone":"Pacific Standard Time"}},"availabilityViewInterval":{"type":"integer","default":30,"description":"Minutes per availability slot","example":30}},"required":["schedules","startTime","endTime"]}}}},"responses":{"200":{"description":"Schedule information","content":{"application/json":{"schema":{"type":"object","properties":{"value":{"type":"array","items":{"$ref":"#/components/schemas/ScheduleInformation"}}}}}}}},"x-mcp":false,"description":"Alias of /users/{email}/calendar/getSchedule: acts as the impersonated user (X-PS-Impersonate-User header, or the instance's default MCP user)."}},"/me/mailboxSettings":{"get":{"summary":"Get user mailbox settings (/me alias)","description":"Returns a Graph-compatible MailboxSettings projection of the stored UserSettings record. Returns sensible defaults for unknown users. Alias of /users/{email}/mailboxSettings: acts as the impersonated user (X-PS-Impersonate-User header, or the instance's default MCP user).","parameters":[{"$ref":"#/components/parameters/InstanceId"}],"responses":{"200":{"description":"Mailbox settings","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailboxSettings"}}}}},"x-mcp":false},"patch":{"summary":"Update user mailbox settings (/me alias)","description":"Merges the provided fields into the user's settings. Creates a record if none exists. Validates timeZone and workingHours. Alias of /users/{email}/mailboxSettings: acts as the impersonated user (X-PS-Impersonate-User header, or the instance's default MCP user).","parameters":[{"$ref":"#/components/parameters/InstanceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailboxSettings"}}}},"responses":{"200":{"description":"Updated mailbox settings","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailboxSettings"}}}},"422":{"description":"Invalid timeZone or workingHours"}},"x-mcp":false}}}}