From m365
Manages Microsoft 365 calendars via Microsoft Graph — view events, check free/busy time, create meetings with Teams links, and manage room bookings for MSP support scenarios.
How this skill is triggered — by the user, by Claude, or both
Slash command
/m365:calendarWhen to use
When viewing events, finding free/busy times, creating meetings, managing room bookings, or checking a user's schedule. Use when: m365 calendar, outlook calendar, calendar events m365, meeting schedule m365, find availability m365, room booking m365, m365 free busy, teams meeting create, or calendar permissions.
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Microsoft 365 calendar is powered by Exchange Online and surfaced through Microsoft Graph. For MSPs, calendar tasks include troubleshooting scheduling issues, creating meetings on behalf of users, managing room resources, and checking user availability during support incidents.
Microsoft 365 calendar is powered by Exchange Online and surfaced through Microsoft Graph. For MSPs, calendar tasks include troubleshooting scheduling issues, creating meetings on behalf of users, managing room resources, and checking user availability during support incidents.
GET /v1.0/users/{userId}/calendar/events?$select=id,subject,start,end,organizer,attendees,isOnlineMeeting,location&$orderby=start/dateTime&$top=10
GET /v1.0/users/{userId}/calendarView?startDateTime=2024-01-15T00:00:00Z&endDateTime=2024-01-22T00:00:00Z&$select=subject,start,end,organizer,attendees,isOnlineMeeting
Use
calendarView(not/events) for date-range queries — it correctly expands recurring events.
Get availability for a set of users:
POST /v1.0/users/{userId}/calendar/getSchedule
Content-Type: application/json
{
"schedules": ["[email protected]", "[email protected]"],
"startTime": { "dateTime": "2024-01-20T08:00:00", "timeZone": "Eastern Standard Time" },
"endTime": { "dateTime": "2024-01-20T17:00:00", "timeZone": "Eastern Standard Time" },
"availabilityViewInterval": 30
}
Response:
{
"value": [
{
"scheduleId": "[email protected]",
"availabilityView": "000022220000",
"scheduleItems": [
{
"status": "busy",
"start": { "dateTime": "2024-01-20T10:00:00" },
"end": { "dateTime": "2024-01-20T11:00:00" }
}
]
}
]
}
availabilityView is a string where each character represents a 30-min slot: 0=free, 1=tentative, 2=busy, 3=out-of-office, 4=working elsewhere.
POST /v1.0/users/{organizerId}/events
Content-Type: application/json
{
"subject": "IT Onboarding — Jane Smith",
"start": { "dateTime": "2024-01-20T10:00:00", "timeZone": "Eastern Standard Time" },
"end": { "dateTime": "2024-01-20T11:00:00", "timeZone": "Eastern Standard Time" },
"attendees": [
{ "emailAddress": { "address": "[email protected]" }, "type": "required" },
{ "emailAddress": { "address": "[email protected]" }, "type": "required" }
],
"isOnlineMeeting": true,
"onlineMeetingProvider": "teamsForBusiness",
"body": { "contentType": "HTML", "content": "<p>IT onboarding session agenda...</p>" }
}
GET /v1.0/places/microsoft.graph.room?$select=id,displayName,emailAddress,capacity,building,floorNumber
Use getSchedule with the room's email address as a schedule ID (same as users above).
POST /v1.0/users/{userId}/events/{eventId}/cancel
Content-Type: application/json
{
"comment": "Meeting has been rescheduled. New invite to follow."
}
PATCH /v1.0/users/{userId}/events/{eventId}
Content-Type: application/json
{
"subject": "Updated: IT Onboarding — Jane Smith",
"start": { "dateTime": "2024-01-21T14:00:00", "timeZone": "Eastern Standard Time" },
"end": { "dateTime": "2024-01-21T15:00:00", "timeZone": "Eastern Standard Time" }
}
getSchedule for all attendees + desired roomavailabilityView strings to find overlapping free slotsWhen setting OOO (via mailbox settings), also check if the user has events during their absence:
Recurring events are expanded in calendarView results. Each instance has:
seriesMasterId — the master recurring event IDtype: "occurrence" — individual instancetype: "seriesMaster" — the templateTo update all future instances: PATCH the series master.
To update only one instance: PATCH the specific occurrence.
| Error | Cause | Resolution |
|---|---|---|
ErrorCalendarNotFound | User has no calendar (no Exchange license) | Assign Exchange license |
ErrorItemNotFound | Event ID doesn't exist | May have been deleted |
ErrorAccessDenied | No Calendars.Read permission | Check app permissions |
Organizer_Invalid | Trying to create event as non-organizer | Use organizer's userId |
| Task | Microsoft Graph Permission |
|---|---|
| Read events | Calendars.Read |
| Read other users' calendars | Calendars.Read (admin consent) |
| Create/update/delete events | Calendars.ReadWrite |
| Check free/busy | Calendars.Read |
| Room directory | Place.Read.All |
npx claudepluginhub wyre-technology/msp-claude-plugins --plugin m365Automates Outlook Calendar via Rube MCP (Composio): create events, manage attendees, find meeting times, handle invitations. Always searches tools first for current schemas.
Automates Outlook Calendar tasks via Rube MCP and Composio: create events, manage attendees, find meeting times, and handle invitations.
Reads, searches, drafts, sends, and manages Outlook/Microsoft 365 email and calendar events via Microsoft Graph API. Handles mail triage, folder management, attachments, scheduling, and meeting invites.