@mcp-s/connectors 0.0.20261022190708 → 0.0.20261024071613

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"id":"outlook-calendar","status":"active","internal_status":"tool-works","applications":["outlook-calendar"],"definition":{"display":{"name":"Microsoft Outlook Calendar","description":"Manage calendar events, schedules, and meetings through Microsoft Outlook using the Microsoft Graph API. Create, update, and query events, check availability, and manage multiple calendars.","icon":"outlook-calendar.svg","website":"https://outlook.live.com/calendar/","category":"scheduling-calendar","docs_url":"https://docs.withwillow.ai/docs/mcp-servers/built-in/outlook-calendar"},"api":{"base_url":"https://graph.microsoft.com/v1.0"},"auth":{"methods":{"oauth":{"authUrl":"https://login.microsoftonline.com/common/oauth2/v2.0/authorize","tokenUrl":"https://login.microsoftonline.com/common/oauth2/v2.0/token","authInitUrlParams":{"response_mode":"query"},"scopes":["offline_access","User.Read","Calendars.Read","Calendars.ReadWrite","Calendars.Read.Shared","Calendars.ReadWrite.Shared"],"defaultScopes":["offline_access","Calendars.ReadWrite","Calendars.Read.Shared"],"pkce":true,"codeExchangeConfig":{"modelCredentialsMapping":"{\n \"access_token\": access_token,\n \"expires_at\": $fromMillis($millis() + expires_in * 1000),\n \"refresh_token\": refresh_token,\n \"scope\": scope,\n \"token_type\": token_type\n}","isForm":true}}}},"tools":[{"name":"List Events","description":"List calendar events for the authenticated user. Returns events sorted by start time. Supports filtering by date range and other criteria. Use this to view upcoming events, past events, or events in a specific time period.","slug":"list-events","ai_risk":{"level":"low","score":1,"reasoning":"This tool lists calendar events for the authenticated user and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:34:03.711Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"calendar_id":{"type":"string","description":"The calendar ID to list events from. If omitted, uses the user's default calendar."},"top":{"type":"number","description":"Number of events to return (1-100). Defaults to 25.","default":25},"filter":{"type":"string","description":"OData filter expression (e.g., \"start/dateTime ge '2024-01-01T00:00:00Z'\")."},"orderby":{"type":"string","description":"OData orderby expression (e.g., 'start/dateTime asc'). Defaults to 'start/dateTime asc'."},"select":{"type":"string","description":"Comma-separated list of fields to return (e.g., 'subject,start,end,location,organizer')."}},"additionalProperties":false},"action":{"path":"/me{calendarPath}/events","method":"GET","mapping":{"params":"{\n \"calendarPath\": $exists(arguments.calendar_id) ? \"/calendars/\" & arguments.calendar_id : \"\"\n }","query":"$sift({\n \"$top\": $exists(arguments.top) ? arguments.top : 25,\n \"$filter\": arguments.filter,\n \"$orderby\": $exists(arguments.orderby) ? arguments.orderby : \"start/dateTime asc\",\n \"$select\": arguments.select\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":true}},{"name":"Get Event","description":"Get full details of a specific calendar event by its ID, including subject, body, attendees, location, recurrence pattern, and all other properties.","slug":"get-event","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves details of a specific calendar event and is read-only, making it low risk.","calculated_at":"2026-05-22T20:34:03.711Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"event_id":{"type":"string","description":"The unique identifier of the event."},"select":{"type":"string","description":"Comma-separated list of fields to return. If omitted, all fields are returned."}},"required":["event_id"],"additionalProperties":false},"action":{"path":"/me/events/{event_id}","method":"GET","mapping":{"params":"{\n \"event_id\": arguments.event_id\n }","query":"$sift({\n \"$select\": arguments.select\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"List Calendar View","description":"Get all events in a specific time range (calendar view). Unlike List Events, this expands recurring events into individual occurrences within the time window. This is the recommended way to get events for a specific date range.","slug":"list-calendar-view","ai_risk":{"level":"low","score":1,"reasoning":"This tool provides a read-only view of events in a specific time range, posing low risk.","calculated_at":"2026-05-22T20:34:03.711Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"start_datetime":{"type":"string","description":"Start of the time range in ISO 8601 format (e.g., '2024-03-01T00:00:00Z')."},"end_datetime":{"type":"string","description":"End of the time range in ISO 8601 format (e.g., '2024-03-31T23:59:59Z')."},"calendar_id":{"type":"string","description":"Optional calendar ID. If omitted, uses the default calendar."},"top":{"type":"number","description":"Number of events to return (1-100). Defaults to 50.","default":50},"select":{"type":"string","description":"Comma-separated list of fields to return."}},"required":["start_datetime","end_datetime"],"additionalProperties":false},"action":{"path":"/me{calendarPath}/calendarView","method":"GET","mapping":{"params":"{\n \"calendarPath\": $exists(arguments.calendar_id) ? \"/calendars/\" & arguments.calendar_id : \"\"\n }","query":"$sift({\n \"startDateTime\": arguments.start_datetime,\n \"endDateTime\": arguments.end_datetime,\n \"$top\": $exists(arguments.top) ? arguments.top : 50,\n \"$select\": arguments.select\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":true}},{"name":"Find Meeting Times","description":"Suggest meeting times based on attendees' availability, location constraints, and time constraints. The Graph API analyzes calendars and returns time slots when all required attendees are free.","slug":"find-meeting-times","ai_risk":{"level":"low","score":1,"reasoning":"This tool suggests meeting times based on availability and is read-only, thus low risk.","calculated_at":"2026-05-22T20:34:03.711Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"attendees":{"type":"array","description":"List of attendee email addresses.","items":{"type":"string"}},"duration_minutes":{"type":"number","description":"Meeting duration in minutes (e.g., 30, 60). Defaults to 60.","default":60},"start_datetime":{"type":"string","description":"Start of the search window in ISO 8601 format. Defaults to now."},"end_datetime":{"type":"string","description":"End of the search window in ISO 8601 format. Defaults to 7 days from now."},"max_candidates":{"type":"number","description":"Maximum number of meeting time suggestions. Defaults to 10.","default":10}},"required":["attendees"],"additionalProperties":false},"action":{"path":"/me/findMeetingTimes","method":"POST","mapping":{"body":"$sift({\n \"attendees\": $map(arguments.attendees, function($email) {\n {\n \"emailAddress\": {\"address\": $email, \"name\": \"\"},\n \"type\": \"required\"\n }\n })[],\n \"meetingDuration\": \"PT\" & ($exists(arguments.duration_minutes) ? arguments.duration_minutes : 60) & \"M\",\n \"timeConstraint\": ($exists(arguments.start_datetime) or $exists(arguments.end_datetime)) ? {\n \"activityDomain\": \"work\",\n \"timeSlots\": [{\n \"start\": $exists(arguments.start_datetime) ? {\"dateTime\": arguments.start_datetime, \"timeZone\": \"UTC\"} : null,\n \"end\": $exists(arguments.end_datetime) ? {\"dateTime\": arguments.end_datetime, \"timeZone\": \"UTC\"} : null\n }]\n } : null,\n \"maxCandidates\": $exists(arguments.max_candidates) ? arguments.max_candidates : 10\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true}},{"name":"Get Schedule","description":"Get the free/busy availability information for one or more users over a specified time range. Returns availability blocks showing when users are free, busy, tentative, or out of office. Useful for checking availability before scheduling.","slug":"get-schedule","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves free/busy availability information and is read-only, making it low risk.","calculated_at":"2026-05-22T20:34:03.711Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"schedules":{"type":"array","description":"List of email addresses to get availability for.","items":{"type":"string"}},"start_datetime":{"type":"string","description":"Start of the time range in ISO 8601 format."},"end_datetime":{"type":"string","description":"End of the time range in ISO 8601 format."},"availability_view_interval":{"type":"number","description":"Duration of each time slot in minutes (15, 30, or 60). Defaults to 30.","default":30}},"required":["schedules","start_datetime","end_datetime"],"additionalProperties":false},"action":{"path":"/me/calendar/getSchedule","method":"POST","mapping":{"body":"{\n \"schedules\": arguments.schedules,\n \"startTime\": {\n \"dateTime\": arguments.start_datetime,\n \"timeZone\": \"UTC\"\n },\n \"endTime\": {\n \"dateTime\": arguments.end_datetime,\n \"timeZone\": \"UTC\"\n },\n \"availabilityViewInterval\": $exists(arguments.availability_view_interval) ? arguments.availability_view_interval : 30\n }"}},"annotations":{"readOnlyHint":true}},{"name":"Create Event","description":"Create a new calendar event. Supports setting subject, body, start/end times, location, attendees, reminders, online meeting, and recurrence. Attendees receive meeting invitations automatically.","slug":"create-event","ai_risk":{"level":"medium","score":5,"reasoning":"This tool creates new calendar events, which is a standard write operation and poses medium risk.","calculated_at":"2026-05-22T20:34:03.711Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"subject":{"type":"string","description":"The event subject/title."},"body":{"type":"string","description":"The event body/description (HTML supported)."},"start_datetime":{"type":"string","description":"Start date and time in ISO 8601 format (e.g., '2024-03-20T10:00:00')."},"start_timezone":{"type":"string","description":"Time zone for the start time (e.g., 'America/New_York', 'UTC'). Defaults to 'UTC'.","default":"UTC"},"end_datetime":{"type":"string","description":"End date and time in ISO 8601 format (e.g., '2024-03-20T11:00:00')."},"end_timezone":{"type":"string","description":"Time zone for the end time. Defaults to 'UTC'.","default":"UTC"},"location":{"type":"string","description":"The location of the event (e.g., 'Conference Room A', 'Virtual')."},"attendees":{"type":"array","description":"List of attendee email addresses.","items":{"type":"string"}},"is_online_meeting":{"type":"boolean","description":"Whether to create a Teams online meeting. Defaults to false.","default":false},"is_all_day":{"type":"boolean","description":"Whether this is an all-day event. Defaults to false.","default":false},"reminder_minutes":{"type":"number","description":"Reminder time in minutes before the event. Defaults to 15.","default":15},"show_as":{"type":"string","description":"How to show the time on the calendar.","enum":["free","tentative","busy","oof","workingElsewhere","unknown"],"default":"busy"},"calendar_id":{"type":"string","description":"Optional calendar ID. If omitted, creates in the default calendar."}},"required":["subject","start_datetime","end_datetime"],"additionalProperties":false},"action":{"path":"/me{calendarPath}/events","method":"POST","mapping":{"params":"{\n \"calendarPath\": $exists(arguments.calendar_id) ? \"/calendars/\" & arguments.calendar_id : \"\"\n }","body":"$sift({\n \"subject\": arguments.subject,\n \"body\": $exists(arguments.body) ? {\n \"contentType\": \"html\",\n \"content\": arguments.body\n } : null,\n \"start\": {\n \"dateTime\": arguments.start_datetime,\n \"timeZone\": $exists(arguments.start_timezone) ? arguments.start_timezone : \"UTC\"\n },\n \"end\": {\n \"dateTime\": arguments.end_datetime,\n \"timeZone\": $exists(arguments.end_timezone) ? arguments.end_timezone : \"UTC\"\n },\n \"location\": $exists(arguments.location) ? {\"displayName\": arguments.location} : null,\n \"attendees\": $exists(arguments.attendees) ? $map(arguments.attendees, function($email) {\n {\n \"emailAddress\": {\"address\": $email},\n \"type\": \"required\"\n }\n })[] : null,\n \"isOnlineMeeting\": arguments.is_online_meeting,\n \"onlineMeetingProvider\": arguments.is_online_meeting ? \"teamsForBusiness\" : null,\n \"isAllDay\": arguments.is_all_day,\n \"isReminderOn\": true,\n \"reminderMinutesBeforeStart\": $exists(arguments.reminder_minutes) ? arguments.reminder_minutes : 15,\n \"showAs\": $exists(arguments.show_as) ? arguments.show_as : \"busy\"\n }, function($v) { $v != null })"}},"annotations":{"destructiveHint":true},"requiredScopes":["Calendars.ReadWrite"]},{"name":"Update Event","description":"Update an existing calendar event. Only the properties you specify will be updated; other properties remain unchanged. Attendees are notified of changes automatically.","slug":"update-event","ai_risk":{"level":"medium","score":5,"reasoning":"This tool updates existing calendar events, representing a standard write operation and posing medium risk.","calculated_at":"2026-05-22T20:34:03.711Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"event_id":{"type":"string","description":"The unique identifier of the event to update."},"subject":{"type":"string","description":"New event subject/title."},"body":{"type":"string","description":"New event body/description (HTML supported)."},"start_datetime":{"type":"string","description":"New start date and time in ISO 8601 format."},"start_timezone":{"type":"string","description":"Time zone for the start time."},"end_datetime":{"type":"string","description":"New end date and time in ISO 8601 format."},"end_timezone":{"type":"string","description":"Time zone for the end time."},"location":{"type":"string","description":"New location for the event."},"show_as":{"type":"string","description":"How to show the time on the calendar.","enum":["free","tentative","busy","oof","workingElsewhere","unknown"]},"reminder_minutes":{"type":"number","description":"Reminder time in minutes before the event."}},"required":["event_id"],"additionalProperties":false},"action":{"path":"/me/events/{event_id}","method":"PATCH","mapping":{"params":"{\n \"event_id\": arguments.event_id\n }","body":"$sift({\n \"subject\": arguments.subject,\n \"body\": $exists(arguments.body) ? {\n \"contentType\": \"html\",\n \"content\": arguments.body\n } : null,\n \"start\": $exists(arguments.start_datetime) ? {\n \"dateTime\": arguments.start_datetime,\n \"timeZone\": $exists(arguments.start_timezone) ? arguments.start_timezone : \"UTC\"\n } : null,\n \"end\": $exists(arguments.end_datetime) ? {\n \"dateTime\": arguments.end_datetime,\n \"timeZone\": $exists(arguments.end_timezone) ? arguments.end_timezone : \"UTC\"\n } : null,\n \"location\": $exists(arguments.location) ? {\"displayName\": arguments.location} : null,\n \"showAs\": arguments.show_as,\n \"reminderMinutesBeforeStart\": arguments.reminder_minutes\n }, function($v) { $v != null })"}},"annotations":{"destructiveHint":true,"idempotentHint":true},"requiredScopes":["Calendars.ReadWrite"]},{"name":"Delete Event","description":"Delete a calendar event. If the event has attendees, cancellation notifications are sent automatically. This operation cannot be undone.","slug":"delete-event","ai_risk":{"level":"high","score":8,"reasoning":"This tool deletes calendar events permanently, which is a critical action that cannot be undone, posing high risk.","calculated_at":"2026-05-22T20:34:03.711Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"event_id":{"type":"string","description":"The unique identifier of the event to delete."}},"required":["event_id"],"additionalProperties":false},"action":{"path":"/me/events/{event_id}","method":"DELETE","mapping":{"params":"{\n \"event_id\": arguments.event_id\n }"}},"annotations":{"destructiveHint":true},"requiredScopes":["Calendars.ReadWrite"]},{"name":"RSVP to Event","description":"Respond to a meeting invitation by accepting, tentatively accepting, or declining. The organizer is notified of your response. You can optionally include a message with your response.","slug":"rsvp-to-event","ai_risk":{"level":"low","score":4,"reasoning":"This tool allows responding to meeting invitations, which modifies event participation but is less critical than deletion.","calculated_at":"2026-05-22T20:34:03.711Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"event_id":{"type":"string","description":"The unique identifier of the event to respond to."},"response":{"type":"string","description":"Your response to the meeting invitation.","enum":["accept","tentativelyAccept","decline"]},"comment":{"type":"string","description":"Optional message to include with your response."},"send_response":{"type":"boolean","description":"Whether to send a response notification to the organizer. Defaults to true.","default":true}},"required":["event_id","response"],"additionalProperties":false},"action":{"path":"/me/events/{event_id}/{response}","method":"POST","mapping":{"params":"{\n \"event_id\": arguments.event_id,\n \"response\": arguments.response\n }","body":"$sift({\n \"comment\": arguments.comment,\n \"sendResponse\": $exists(arguments.send_response) ? arguments.send_response : true\n }, function($v) { $v != null })"}},"annotations":{"destructiveHint":true},"requiredScopes":["Calendars.ReadWrite"]},{"name":"List Calendars","description":"List all calendars for the authenticated user, including the default calendar, shared calendars, and group calendars. Returns calendar name, color, owner, and permissions.","slug":"list-calendars","ai_risk":{"level":"low","score":1,"reasoning":"This tool lists all calendars for the user and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:34:03.711Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"top":{"type":"number","description":"Number of calendars to return. Defaults to 50.","default":50}},"additionalProperties":false},"action":{"path":"/me/calendars","method":"GET","mapping":{"query":"{\n \"$top\": $exists(arguments.top) ? arguments.top : 50\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Get Calendar","description":"Get details of a specific calendar including its name, color, owner, and whether it can be edited.","slug":"get-calendar","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves details of a specific calendar and is read-only, making it low risk.","calculated_at":"2026-05-22T20:34:03.711Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"calendar_id":{"type":"string","description":"The unique identifier of the calendar."}},"required":["calendar_id"],"additionalProperties":false},"action":{"path":"/me/calendars/{calendar_id}","method":"GET","mapping":{"params":"{\n \"calendar_id\": arguments.calendar_id\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Create Calendar","description":"Create a new calendar for the authenticated user. Calendars help organize events by category (e.g., 'Work', 'Personal', 'Team Events').","slug":"create-calendar","ai_risk":{"level":"medium","score":5,"reasoning":"This tool creates new calendars, which is a standard write operation and poses medium risk.","calculated_at":"2026-05-22T20:34:03.711Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"The name of the new calendar."},"color":{"type":"string","description":"The calendar color.","enum":["auto","lightBlue","lightGreen","lightOrange","lightGray","lightYellow","lightTeal","lightPink","lightBrown","lightRed","maxColor"],"default":"auto"}},"required":["name"],"additionalProperties":false},"action":{"path":"/me/calendars","method":"POST","mapping":{"body":"$sift({\n \"name\": arguments.name,\n \"color\": $exists(arguments.color) ? arguments.color : \"auto\"\n }, function($v) { $v != null })"}},"annotations":{"destructiveHint":true},"requiredScopes":["Calendars.ReadWrite"]},{"name":"Delete Calendar","description":"Delete a calendar and all its events. The default calendar cannot be deleted. This action is permanent and cannot be undone.","slug":"delete-calendar","ai_risk":{"level":"critical","score":9,"reasoning":"This tool deletes a calendar and all its events permanently, which is a critical action that cannot be undone, posing very high risk.","calculated_at":"2026-05-22T20:34:03.711Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"calendar_id":{"type":"string","description":"The unique identifier of the calendar to delete."}},"required":["calendar_id"],"additionalProperties":false},"action":{"path":"/me/calendars/{calendar_id}","method":"DELETE","mapping":{"params":"{\n \"calendar_id\": arguments.calendar_id\n }"}},"annotations":{"destructiveHint":true},"requiredScopes":["Calendars.ReadWrite"]}]}}
1
+ {"id":"outlook-calendar","status":"active","internal_status":"tool-works","applications":["outlook-calendar"],"definition":{"display":{"name":"Microsoft Outlook Calendar","description":"Manage calendar events, schedules, and meetings through Microsoft Outlook using the Microsoft Graph API. Create, update, and query events, check availability, and manage multiple calendars.","icon":"outlook-calendar.svg","website":"https://outlook.live.com/calendar/","category":"scheduling-calendar","docs_url":"https://docs.withwillow.ai/docs/mcp-servers/built-in/outlook-calendar"},"api":{"base_url":"https://graph.microsoft.com/v1.0"},"auth":{"methods":{"oauth":{"authUrl":"https://login.microsoftonline.com/common/oauth2/v2.0/authorize","tokenUrl":"https://login.microsoftonline.com/common/oauth2/v2.0/token","authInitUrlParams":{"response_mode":"query"},"scopes":["offline_access","User.Read","Calendars.Read","Calendars.ReadWrite","Calendars.Read.Shared","Calendars.ReadWrite.Shared"],"defaultScopes":["offline_access","Calendars.ReadWrite","Calendars.Read.Shared"],"scopeTemplates":[{"id":"read-only","name":"Read-only","description":"Read the user's calendars and events, calendars shared with them, and find meeting times. Can't create or change events.","scopes":["offline_access","Calendars.Read","Calendars.Read.Shared"]},{"id":"own-calendars","name":"Own calendars only","description":"Read and write the user's own calendars and events. Calendars shared with them and finding meeting times stay off.","scopes":["offline_access","Calendars.ReadWrite"]},{"id":"full-access","name":"Full access","description":"Read and write the user's calendars and calendars shared with them, RSVP to events and find meeting times.","scopes":["offline_access","User.Read","Calendars.ReadWrite","Calendars.ReadWrite.Shared"]}],"pkce":true,"codeExchangeConfig":{"modelCredentialsMapping":"{\n \"access_token\": access_token,\n \"expires_at\": $fromMillis($millis() + expires_in * 1000),\n \"refresh_token\": refresh_token,\n \"scope\": scope,\n \"token_type\": token_type\n}","isForm":true}}}},"tools":[{"name":"List Events","description":"List calendar events for the authenticated user. Returns events sorted by start time. Supports filtering by date range and other criteria. Use this to view upcoming events, past events, or events in a specific time period.","slug":"list-events","ai_risk":{"level":"low","score":1,"reasoning":"This tool lists calendar events for the authenticated user and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:34:03.711Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"calendar_id":{"type":"string","description":"The calendar ID to list events from. If omitted, uses the user's default calendar."},"top":{"type":"number","description":"Number of events to return (1-100). Defaults to 25.","default":25},"filter":{"type":"string","description":"OData filter expression (e.g., \"start/dateTime ge '2024-01-01T00:00:00Z'\")."},"orderby":{"type":"string","description":"OData orderby expression (e.g., 'start/dateTime asc'). Defaults to 'start/dateTime asc'."},"select":{"type":"string","description":"Comma-separated list of fields to return (e.g., 'subject,start,end,location,organizer')."}},"additionalProperties":false},"action":{"path":"/me{calendarPath}/events","method":"GET","mapping":{"params":"{\n \"calendarPath\": $exists(arguments.calendar_id) ? \"/calendars/\" & arguments.calendar_id : \"\"\n }","query":"$sift({\n \"$top\": $exists(arguments.top) ? arguments.top : 25,\n \"$filter\": arguments.filter,\n \"$orderby\": $exists(arguments.orderby) ? arguments.orderby : \"start/dateTime asc\",\n \"$select\": arguments.select\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":true}},{"name":"Get Event","description":"Get full details of a specific calendar event by its ID, including subject, body, attendees, location, recurrence pattern, and all other properties.","slug":"get-event","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves details of a specific calendar event and is read-only, making it low risk.","calculated_at":"2026-05-22T20:34:03.711Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"event_id":{"type":"string","description":"The unique identifier of the event."},"select":{"type":"string","description":"Comma-separated list of fields to return. If omitted, all fields are returned."}},"required":["event_id"],"additionalProperties":false},"action":{"path":"/me/events/{event_id}","method":"GET","mapping":{"params":"{\n \"event_id\": arguments.event_id\n }","query":"$sift({\n \"$select\": arguments.select\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"List Calendar View","description":"Get all events in a specific time range (calendar view). Unlike List Events, this expands recurring events into individual occurrences within the time window. This is the recommended way to get events for a specific date range.","slug":"list-calendar-view","ai_risk":{"level":"low","score":1,"reasoning":"This tool provides a read-only view of events in a specific time range, posing low risk.","calculated_at":"2026-05-22T20:34:03.711Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"start_datetime":{"type":"string","description":"Start of the time range in ISO 8601 format (e.g., '2024-03-01T00:00:00Z')."},"end_datetime":{"type":"string","description":"End of the time range in ISO 8601 format (e.g., '2024-03-31T23:59:59Z')."},"calendar_id":{"type":"string","description":"Optional calendar ID. If omitted, uses the default calendar."},"top":{"type":"number","description":"Number of events to return (1-100). Defaults to 50.","default":50},"select":{"type":"string","description":"Comma-separated list of fields to return."}},"required":["start_datetime","end_datetime"],"additionalProperties":false},"action":{"path":"/me{calendarPath}/calendarView","method":"GET","mapping":{"params":"{\n \"calendarPath\": $exists(arguments.calendar_id) ? \"/calendars/\" & arguments.calendar_id : \"\"\n }","query":"$sift({\n \"startDateTime\": arguments.start_datetime,\n \"endDateTime\": arguments.end_datetime,\n \"$top\": $exists(arguments.top) ? arguments.top : 50,\n \"$select\": arguments.select\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":true}},{"name":"Find Meeting Times","description":"Suggest meeting times based on attendees' availability, location constraints, and time constraints. The Graph API analyzes calendars and returns time slots when all required attendees are free.","slug":"find-meeting-times","ai_risk":{"level":"low","score":1,"reasoning":"This tool suggests meeting times based on availability and is read-only, thus low risk.","calculated_at":"2026-05-22T20:34:03.711Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"attendees":{"type":"array","description":"List of attendee email addresses.","items":{"type":"string"}},"duration_minutes":{"type":"number","description":"Meeting duration in minutes (e.g., 30, 60). Defaults to 60.","default":60},"start_datetime":{"type":"string","description":"Start of the search window in ISO 8601 format. Defaults to now."},"end_datetime":{"type":"string","description":"End of the search window in ISO 8601 format. Defaults to 7 days from now."},"max_candidates":{"type":"number","description":"Maximum number of meeting time suggestions. Defaults to 10.","default":10}},"required":["attendees"],"additionalProperties":false},"action":{"path":"/me/findMeetingTimes","method":"POST","mapping":{"body":"$sift({\n \"attendees\": $map(arguments.attendees, function($email) {\n {\n \"emailAddress\": {\"address\": $email, \"name\": \"\"},\n \"type\": \"required\"\n }\n })[],\n \"meetingDuration\": \"PT\" & ($exists(arguments.duration_minutes) ? arguments.duration_minutes : 60) & \"M\",\n \"timeConstraint\": ($exists(arguments.start_datetime) or $exists(arguments.end_datetime)) ? {\n \"activityDomain\": \"work\",\n \"timeSlots\": [{\n \"start\": $exists(arguments.start_datetime) ? {\"dateTime\": arguments.start_datetime, \"timeZone\": \"UTC\"} : null,\n \"end\": $exists(arguments.end_datetime) ? {\"dateTime\": arguments.end_datetime, \"timeZone\": \"UTC\"} : null\n }]\n } : null,\n \"maxCandidates\": $exists(arguments.max_candidates) ? arguments.max_candidates : 10\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true}},{"name":"Get Schedule","description":"Get the free/busy availability information for one or more users over a specified time range. Returns availability blocks showing when users are free, busy, tentative, or out of office. Useful for checking availability before scheduling.","slug":"get-schedule","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves free/busy availability information and is read-only, making it low risk.","calculated_at":"2026-05-22T20:34:03.711Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"schedules":{"type":"array","description":"List of email addresses to get availability for.","items":{"type":"string"}},"start_datetime":{"type":"string","description":"Start of the time range in ISO 8601 format."},"end_datetime":{"type":"string","description":"End of the time range in ISO 8601 format."},"availability_view_interval":{"type":"number","description":"Duration of each time slot in minutes (15, 30, or 60). Defaults to 30.","default":30}},"required":["schedules","start_datetime","end_datetime"],"additionalProperties":false},"action":{"path":"/me/calendar/getSchedule","method":"POST","mapping":{"body":"{\n \"schedules\": arguments.schedules,\n \"startTime\": {\n \"dateTime\": arguments.start_datetime,\n \"timeZone\": \"UTC\"\n },\n \"endTime\": {\n \"dateTime\": arguments.end_datetime,\n \"timeZone\": \"UTC\"\n },\n \"availabilityViewInterval\": $exists(arguments.availability_view_interval) ? arguments.availability_view_interval : 30\n }"}},"annotations":{"readOnlyHint":true}},{"name":"Create Event","description":"Create a new calendar event. Supports setting subject, body, start/end times, location, attendees, reminders, online meeting, and recurrence. Attendees receive meeting invitations automatically.","slug":"create-event","ai_risk":{"level":"medium","score":5,"reasoning":"This tool creates new calendar events, which is a standard write operation and poses medium risk.","calculated_at":"2026-05-22T20:34:03.711Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"subject":{"type":"string","description":"The event subject/title."},"body":{"type":"string","description":"The event body/description (HTML supported)."},"start_datetime":{"type":"string","description":"Start date and time in ISO 8601 format (e.g., '2024-03-20T10:00:00')."},"start_timezone":{"type":"string","description":"Time zone for the start time (e.g., 'America/New_York', 'UTC'). Defaults to 'UTC'.","default":"UTC"},"end_datetime":{"type":"string","description":"End date and time in ISO 8601 format (e.g., '2024-03-20T11:00:00')."},"end_timezone":{"type":"string","description":"Time zone for the end time. Defaults to 'UTC'.","default":"UTC"},"location":{"type":"string","description":"The location of the event (e.g., 'Conference Room A', 'Virtual')."},"attendees":{"type":"array","description":"List of attendee email addresses.","items":{"type":"string"}},"is_online_meeting":{"type":"boolean","description":"Whether to create a Teams online meeting. Defaults to false.","default":false},"is_all_day":{"type":"boolean","description":"Whether this is an all-day event. Defaults to false.","default":false},"reminder_minutes":{"type":"number","description":"Reminder time in minutes before the event. Defaults to 15.","default":15},"show_as":{"type":"string","description":"How to show the time on the calendar.","enum":["free","tentative","busy","oof","workingElsewhere","unknown"],"default":"busy"},"calendar_id":{"type":"string","description":"Optional calendar ID. If omitted, creates in the default calendar."}},"required":["subject","start_datetime","end_datetime"],"additionalProperties":false},"action":{"path":"/me{calendarPath}/events","method":"POST","mapping":{"params":"{\n \"calendarPath\": $exists(arguments.calendar_id) ? \"/calendars/\" & arguments.calendar_id : \"\"\n }","body":"$sift({\n \"subject\": arguments.subject,\n \"body\": $exists(arguments.body) ? {\n \"contentType\": \"html\",\n \"content\": arguments.body\n } : null,\n \"start\": {\n \"dateTime\": arguments.start_datetime,\n \"timeZone\": $exists(arguments.start_timezone) ? arguments.start_timezone : \"UTC\"\n },\n \"end\": {\n \"dateTime\": arguments.end_datetime,\n \"timeZone\": $exists(arguments.end_timezone) ? arguments.end_timezone : \"UTC\"\n },\n \"location\": $exists(arguments.location) ? {\"displayName\": arguments.location} : null,\n \"attendees\": $exists(arguments.attendees) ? $map(arguments.attendees, function($email) {\n {\n \"emailAddress\": {\"address\": $email},\n \"type\": \"required\"\n }\n })[] : null,\n \"isOnlineMeeting\": arguments.is_online_meeting,\n \"onlineMeetingProvider\": arguments.is_online_meeting ? \"teamsForBusiness\" : null,\n \"isAllDay\": arguments.is_all_day,\n \"isReminderOn\": true,\n \"reminderMinutesBeforeStart\": $exists(arguments.reminder_minutes) ? arguments.reminder_minutes : 15,\n \"showAs\": $exists(arguments.show_as) ? arguments.show_as : \"busy\"\n }, function($v) { $v != null })"}},"annotations":{"destructiveHint":true},"requiredScopes":["Calendars.ReadWrite"]},{"name":"Update Event","description":"Update an existing calendar event. Only the properties you specify will be updated; other properties remain unchanged. Attendees are notified of changes automatically.","slug":"update-event","ai_risk":{"level":"medium","score":5,"reasoning":"This tool updates existing calendar events, representing a standard write operation and posing medium risk.","calculated_at":"2026-05-22T20:34:03.711Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"event_id":{"type":"string","description":"The unique identifier of the event to update."},"subject":{"type":"string","description":"New event subject/title."},"body":{"type":"string","description":"New event body/description (HTML supported)."},"start_datetime":{"type":"string","description":"New start date and time in ISO 8601 format."},"start_timezone":{"type":"string","description":"Time zone for the start time."},"end_datetime":{"type":"string","description":"New end date and time in ISO 8601 format."},"end_timezone":{"type":"string","description":"Time zone for the end time."},"location":{"type":"string","description":"New location for the event."},"show_as":{"type":"string","description":"How to show the time on the calendar.","enum":["free","tentative","busy","oof","workingElsewhere","unknown"]},"reminder_minutes":{"type":"number","description":"Reminder time in minutes before the event."}},"required":["event_id"],"additionalProperties":false},"action":{"path":"/me/events/{event_id}","method":"PATCH","mapping":{"params":"{\n \"event_id\": arguments.event_id\n }","body":"$sift({\n \"subject\": arguments.subject,\n \"body\": $exists(arguments.body) ? {\n \"contentType\": \"html\",\n \"content\": arguments.body\n } : null,\n \"start\": $exists(arguments.start_datetime) ? {\n \"dateTime\": arguments.start_datetime,\n \"timeZone\": $exists(arguments.start_timezone) ? arguments.start_timezone : \"UTC\"\n } : null,\n \"end\": $exists(arguments.end_datetime) ? {\n \"dateTime\": arguments.end_datetime,\n \"timeZone\": $exists(arguments.end_timezone) ? arguments.end_timezone : \"UTC\"\n } : null,\n \"location\": $exists(arguments.location) ? {\"displayName\": arguments.location} : null,\n \"showAs\": arguments.show_as,\n \"reminderMinutesBeforeStart\": arguments.reminder_minutes\n }, function($v) { $v != null })"}},"annotations":{"destructiveHint":true,"idempotentHint":true},"requiredScopes":["Calendars.ReadWrite"]},{"name":"Delete Event","description":"Delete a calendar event. If the event has attendees, cancellation notifications are sent automatically. This operation cannot be undone.","slug":"delete-event","ai_risk":{"level":"high","score":8,"reasoning":"This tool deletes calendar events permanently, which is a critical action that cannot be undone, posing high risk.","calculated_at":"2026-05-22T20:34:03.711Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"event_id":{"type":"string","description":"The unique identifier of the event to delete."}},"required":["event_id"],"additionalProperties":false},"action":{"path":"/me/events/{event_id}","method":"DELETE","mapping":{"params":"{\n \"event_id\": arguments.event_id\n }"}},"annotations":{"destructiveHint":true},"requiredScopes":["Calendars.ReadWrite"]},{"name":"RSVP to Event","description":"Respond to a meeting invitation by accepting, tentatively accepting, or declining. The organizer is notified of your response. You can optionally include a message with your response.","slug":"rsvp-to-event","ai_risk":{"level":"low","score":4,"reasoning":"This tool allows responding to meeting invitations, which modifies event participation but is less critical than deletion.","calculated_at":"2026-05-22T20:34:03.711Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"event_id":{"type":"string","description":"The unique identifier of the event to respond to."},"response":{"type":"string","description":"Your response to the meeting invitation.","enum":["accept","tentativelyAccept","decline"]},"comment":{"type":"string","description":"Optional message to include with your response."},"send_response":{"type":"boolean","description":"Whether to send a response notification to the organizer. Defaults to true.","default":true}},"required":["event_id","response"],"additionalProperties":false},"action":{"path":"/me/events/{event_id}/{response}","method":"POST","mapping":{"params":"{\n \"event_id\": arguments.event_id,\n \"response\": arguments.response\n }","body":"$sift({\n \"comment\": arguments.comment,\n \"sendResponse\": $exists(arguments.send_response) ? arguments.send_response : true\n }, function($v) { $v != null })"}},"annotations":{"destructiveHint":true},"requiredScopes":["Calendars.ReadWrite"]},{"name":"List Calendars","description":"List all calendars for the authenticated user, including the default calendar, shared calendars, and group calendars. Returns calendar name, color, owner, and permissions.","slug":"list-calendars","ai_risk":{"level":"low","score":1,"reasoning":"This tool lists all calendars for the user and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:34:03.711Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"top":{"type":"number","description":"Number of calendars to return. Defaults to 50.","default":50}},"additionalProperties":false},"action":{"path":"/me/calendars","method":"GET","mapping":{"query":"{\n \"$top\": $exists(arguments.top) ? arguments.top : 50\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Get Calendar","description":"Get details of a specific calendar including its name, color, owner, and whether it can be edited.","slug":"get-calendar","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves details of a specific calendar and is read-only, making it low risk.","calculated_at":"2026-05-22T20:34:03.711Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"calendar_id":{"type":"string","description":"The unique identifier of the calendar."}},"required":["calendar_id"],"additionalProperties":false},"action":{"path":"/me/calendars/{calendar_id}","method":"GET","mapping":{"params":"{\n \"calendar_id\": arguments.calendar_id\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Create Calendar","description":"Create a new calendar for the authenticated user. Calendars help organize events by category (e.g., 'Work', 'Personal', 'Team Events').","slug":"create-calendar","ai_risk":{"level":"medium","score":5,"reasoning":"This tool creates new calendars, which is a standard write operation and poses medium risk.","calculated_at":"2026-05-22T20:34:03.711Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"The name of the new calendar."},"color":{"type":"string","description":"The calendar color.","enum":["auto","lightBlue","lightGreen","lightOrange","lightGray","lightYellow","lightTeal","lightPink","lightBrown","lightRed","maxColor"],"default":"auto"}},"required":["name"],"additionalProperties":false},"action":{"path":"/me/calendars","method":"POST","mapping":{"body":"$sift({\n \"name\": arguments.name,\n \"color\": $exists(arguments.color) ? arguments.color : \"auto\"\n }, function($v) { $v != null })"}},"annotations":{"destructiveHint":true},"requiredScopes":["Calendars.ReadWrite"]},{"name":"Delete Calendar","description":"Delete a calendar and all its events. The default calendar cannot be deleted. This action is permanent and cannot be undone.","slug":"delete-calendar","ai_risk":{"level":"critical","score":9,"reasoning":"This tool deletes a calendar and all its events permanently, which is a critical action that cannot be undone, posing very high risk.","calculated_at":"2026-05-22T20:34:03.711Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"calendar_id":{"type":"string","description":"The unique identifier of the calendar to delete."}},"required":["calendar_id"],"additionalProperties":false},"action":{"path":"/me/calendars/{calendar_id}","method":"DELETE","mapping":{"params":"{\n \"calendar_id\": arguments.calendar_id\n }"}},"annotations":{"destructiveHint":true},"requiredScopes":["Calendars.ReadWrite"]}]}}
@@ -1 +1 @@
1
- {"id":"outlook-mail","status":"active","internal_status":"tool-works","applications":["outlook-mail"],"definition":{"display":{"name":"Microsoft Outlook Mail","description":"Read, send, and manage emails through Microsoft Outlook using the Microsoft Graph API. Supports message management, folders, attachments, and mailbox settings.","icon":"outlook-mail.svg","website":"https://outlook.live.com/mail/","category":"communication-messaging","docs_url":"https://docs.withwillow.ai/docs/mcp-servers/built-in/outlook-mail"},"api":{"base_url":"https://graph.microsoft.com/v1.0"},"auth":{"methods":{"oauth":{"authUrl":"https://login.microsoftonline.com/common/oauth2/v2.0/authorize","tokenUrl":"https://login.microsoftonline.com/common/oauth2/v2.0/token","authInitUrlParams":{"response_mode":"query"},"scopes":["offline_access","User.Read","Mail.Read","Mail.ReadWrite","Mail.Send","MailboxSettings.Read","MailboxSettings.ReadWrite"],"defaultScopes":["offline_access","Mail.ReadWrite","Mail.Send","MailboxSettings.ReadWrite"],"pkce":true,"codeExchangeConfig":{"modelCredentialsMapping":"{\n \"access_token\": access_token,\n \"expires_at\": $fromMillis($millis() + expires_in * 1000),\n \"refresh_token\": refresh_token,\n \"scope\": scope,\n \"token_type\": token_type\n}","isForm":true}}}},"tools":[{"name":"List Messages","description":"List email messages in the authenticated user's mailbox. Returns messages sorted by received date (newest first) by default. Use this to browse the inbox or any mail folder. Supports filtering and selecting specific fields for efficient queries.","slug":"list-messages","ai_risk":{"level":"low","score":1,"reasoning":"This tool lists email messages in the user's mailbox and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:34:28.344Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"folder_id":{"type":"string","description":"The folder to list messages from. Use well-known names like 'inbox', 'sentitems', 'drafts', 'deleteditems', 'junkemail', or a folder ID. Defaults to 'inbox'."},"top":{"type":"number","description":"Number of messages to return (1-100). Defaults to 25.","default":25},"select":{"type":"string","description":"Comma-separated list of fields to return (e.g., 'subject,from,receivedDateTime,isRead'). Reduces response size."},"filter":{"type":"string","description":"OData filter expression (e.g., \"isRead eq false\", \"from/emailAddress/address eq 'user@example.com'\")."},"search":{"type":"string","description":"Search query to find messages matching keywords in subject, body, or other fields (e.g., 'project update')."},"orderby":{"type":"string","description":"OData orderby expression (e.g., 'receivedDateTime desc', 'subject asc'). Defaults to 'receivedDateTime desc'."},"skip":{"type":"number","description":"Number of messages to skip (for pagination)."}},"additionalProperties":false},"action":{"path":"/me/mailFolders/{folder_id}/messages","method":"GET","mapping":{"params":"{\n \"folder_id\": $exists(arguments.folder_id) ? arguments.folder_id : \"inbox\"\n }","query":"$sift({\n \"$top\": $exists(arguments.top) ? arguments.top : 25,\n \"$select\": arguments.select,\n \"$filter\": arguments.filter,\n \"$search\": arguments.search ? \"\\\"\" & arguments.search & \"\\\"\" : null,\n \"$orderby\": arguments.orderby,\n \"$skip\": arguments.skip\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":true}},{"name":"Get Message","description":"Get the full details of a specific email message by its ID, including body content, attachments metadata, headers, and all properties. Use this when you need to read the complete content of an email.","slug":"get-message","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves the full details of a specific email message and is read-only, making it low risk.","calculated_at":"2026-05-22T20:34:28.344Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"message_id":{"type":"string","description":"The unique identifier of the message."},"select":{"type":"string","description":"Comma-separated list of fields to return. If omitted, all fields are returned."}},"required":["message_id"],"additionalProperties":false},"action":{"path":"/me/messages/{message_id}","method":"GET","mapping":{"params":"{\n \"message_id\": arguments.message_id\n }","query":"$sift({\n \"$select\": arguments.select\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Search Messages","description":"Search for email messages across all folders using a keyword query. The search looks through subject, body, sender, and other fields. This is more powerful than filtering and supports natural language queries.","slug":"search-messages","ai_risk":{"level":"low","score":1,"reasoning":"This tool allows searching for email messages across folders and is read-only, thus it is low risk.","calculated_at":"2026-05-22T20:34:28.344Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"Search query string. Supports keywords and KQL syntax (e.g., 'from:user@example.com subject:report', 'has:attachment')."},"top":{"type":"number","description":"Number of results to return (1-100). Defaults to 25.","default":25}},"required":["query"],"additionalProperties":false},"action":{"path":"/me/messages","method":"GET","mapping":{"query":"{\n \"$search\": \"\\\"\" & arguments.query & \"\\\"\",\n \"$top\": $exists(arguments.top) ? arguments.top : 25\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":true}},{"name":"List Attachments","description":"List all attachments on a specific email message. Returns attachment metadata including name, size, content type, and whether it's inline. For file attachments, use the Get Attachment tool to retrieve the actual content.","slug":"list-attachments","ai_risk":{"level":"low","score":1,"reasoning":"This tool lists attachments on a specific email message and is read-only, resulting in low risk.","calculated_at":"2026-05-22T20:34:28.344Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"message_id":{"type":"string","description":"The unique identifier of the message."}},"required":["message_id"],"additionalProperties":false},"action":{"path":"/me/messages/{message_id}/attachments","method":"GET","mapping":{"params":"{\n \"message_id\": arguments.message_id\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Get Attachment","description":"Get a specific attachment from an email message, including the file content (base64-encoded for file attachments). Use this to download or read attachment content.","slug":"get-attachment","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves a specific attachment from an email message and is read-only, indicating low risk.","calculated_at":"2026-05-22T20:34:28.344Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"message_id":{"type":"string","description":"The unique identifier of the message."},"attachment_id":{"type":"string","description":"The unique identifier of the attachment."}},"required":["message_id","attachment_id"],"additionalProperties":false},"action":{"path":"/me/messages/{message_id}/attachments/{attachment_id}","method":"GET","mapping":{"params":"{\n \"message_id\": arguments.message_id,\n \"attachment_id\": arguments.attachment_id\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Send Mail","description":"Send a new email message. Supports plain text and HTML body content, multiple recipients (to, cc, bcc), importance settings, and file attachments. The message is sent immediately and saved to the Sent Items folder.","slug":"send-mail","ai_risk":{"level":"medium","score":5,"reasoning":"This tool sends a new email message, which is a standard write operation, thus it is medium risk.","calculated_at":"2026-05-22T20:34:28.344Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"subject":{"type":"string","description":"The email subject line."},"body":{"type":"string","description":"The email body content."},"body_type":{"type":"string","description":"The content type of the body: 'text' or 'html'. Defaults to 'html'.","enum":["text","html"],"default":"html"},"to":{"type":"array","description":"List of recipient email addresses.","items":{"type":"string"}},"cc":{"type":"array","description":"List of CC recipient email addresses.","items":{"type":"string"}},"bcc":{"type":"array","description":"List of BCC recipient email addresses.","items":{"type":"string"}},"importance":{"type":"string","description":"Message importance level.","enum":["low","normal","high"],"default":"normal"},"save_to_sent_items":{"type":"boolean","description":"Whether to save the message in Sent Items. Defaults to true.","default":true}},"required":["subject","body","to"],"additionalProperties":false},"action":{"path":"/me/sendMail","method":"POST","mapping":{"body":"{\n \"message\": $sift({\n \"subject\": arguments.subject,\n \"body\": {\n \"contentType\": $exists(arguments.body_type) ? arguments.body_type : \"html\",\n \"content\": arguments.body\n },\n \"toRecipients\": $map(arguments.to, function($email) {\n {\"emailAddress\": {\"address\": $email}}\n })[],\n \"ccRecipients\": $exists(arguments.cc) ? $map(arguments.cc, function($email) {\n {\"emailAddress\": {\"address\": $email}}\n })[] : null,\n \"bccRecipients\": $exists(arguments.bcc) ? $map(arguments.bcc, function($email) {\n {\"emailAddress\": {\"address\": $email}}\n })[] : null,\n \"importance\": $exists(arguments.importance) ? arguments.importance : \"normal\"\n }, function($v) { $v != null }),\n \"saveToSentItems\": $exists(arguments.save_to_sent_items) ? arguments.save_to_sent_items : true\n }"}},"annotations":{"destructiveHint":true},"requiredScopes":["Mail.Send"]},{"name":"Reply to Message","description":"Send a reply to an email message. The reply is sent to the sender of the original message. You can add a comment/body text to include with the reply.","slug":"reply-to-message","ai_risk":{"level":"medium","score":5,"reasoning":"This tool sends a reply to an email message, representing a standard write operation and is medium risk.","calculated_at":"2026-05-22T20:34:28.344Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"message_id":{"type":"string","description":"The unique identifier of the message to reply to."},"comment":{"type":"string","description":"The reply body content (HTML supported)."}},"required":["message_id","comment"],"additionalProperties":false},"action":{"path":"/me/messages/{message_id}/reply","method":"POST","mapping":{"params":"{\n \"message_id\": arguments.message_id\n }","body":"{\n \"comment\": arguments.comment\n }"}},"annotations":{"destructiveHint":true},"requiredScopes":["Mail.Send"]},{"name":"Reply All to Message","description":"Send a reply-all to an email message. The reply is sent to all original recipients (sender, to, and cc). You can add a comment/body text to include with the reply.","slug":"reply-all-to-message","ai_risk":{"level":"medium","score":5,"reasoning":"This tool sends a reply to all recipients of an email message, which is a standard write operation, making it medium risk.","calculated_at":"2026-05-22T20:34:28.344Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"message_id":{"type":"string","description":"The unique identifier of the message to reply to."},"comment":{"type":"string","description":"The reply body content (HTML supported)."}},"required":["message_id","comment"],"additionalProperties":false},"action":{"path":"/me/messages/{message_id}/replyAll","method":"POST","mapping":{"params":"{\n \"message_id\": arguments.message_id\n }","body":"{\n \"comment\": arguments.comment\n }"}},"annotations":{"destructiveHint":true},"requiredScopes":["Mail.Send"]},{"name":"Forward Message","description":"Forward an email message to one or more recipients. You can add a comment/body text to include with the forwarded message.","slug":"forward-message","ai_risk":{"level":"medium","score":5,"reasoning":"This tool forwards an email message to other recipients, representing a standard write operation and is medium risk.","calculated_at":"2026-05-22T20:34:28.344Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"message_id":{"type":"string","description":"The unique identifier of the message to forward."},"to":{"type":"array","description":"List of recipient email addresses to forward to.","items":{"type":"string"}},"comment":{"type":"string","description":"Optional comment to include with the forwarded message (HTML supported)."}},"required":["message_id","to"],"additionalProperties":false},"action":{"path":"/me/messages/{message_id}/forward","method":"POST","mapping":{"params":"{\n \"message_id\": arguments.message_id\n }","body":"$sift({\n \"toRecipients\": $map(arguments.to, function($email) {\n {\"emailAddress\": {\"address\": $email}}\n })[],\n \"comment\": arguments.comment\n }, function($v) { $v != null })"}},"annotations":{"destructiveHint":true},"requiredScopes":["Mail.Send"]},{"name":"Update Message","description":"Update properties of an email message such as read status, importance, categories, flag status, or recipients. Use this to mark messages as read/unread, flag for follow-up, categorize messages, or update the to/cc/bcc recipients on a draft before sending.","slug":"update-message","ai_risk":{"level":"medium","score":5,"reasoning":"This tool updates properties of an email message, which is a standard write operation, thus it is medium risk.","calculated_at":"2026-05-22T20:34:28.344Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"message_id":{"type":"string","description":"The unique identifier of the message to update."},"is_read":{"type":"boolean","description":"Set to true to mark as read, false to mark as unread."},"importance":{"type":"string","description":"Message importance level.","enum":["low","normal","high"]},"categories":{"type":"array","description":"List of categories to assign to the message.","items":{"type":"string"}},"flag":{"type":"string","description":"Flag status for follow-up.","enum":["notFlagged","flagged","complete"]}},"required":["message_id"],"additionalProperties":false},"action":{"path":"/me/messages/{message_id}","method":"PATCH","mapping":{"params":"{\n \"message_id\": arguments.message_id\n }","body":"$sift({\n \"isRead\": arguments.is_read,\n \"importance\": arguments.importance,\n \"categories\": arguments.categories,\n \"flag\": $exists(arguments.flag) ? {\"flagStatus\": arguments.flag} : null\n }, function($v) { $v != null })"}},"annotations":{"destructiveHint":true,"idempotentHint":true},"requiredScopes":["Mail.ReadWrite"]},{"name":"Move Message","description":"Move an email message to a different mail folder. Use well-known folder names like 'inbox', 'archive', 'deleteditems', 'junkemail', or a folder ID.","slug":"move-message","ai_risk":{"level":"medium","score":5,"reasoning":"This tool moves an email message to a different folder, which is a standard write operation, making it medium risk.","calculated_at":"2026-05-22T20:34:28.344Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"message_id":{"type":"string","description":"The unique identifier of the message to move."},"destination_folder_id":{"type":"string","description":"The destination folder. Use well-known names ('inbox', 'archive', 'deleteditems', 'junkemail', 'drafts', 'sentitems') or a folder ID."}},"required":["message_id","destination_folder_id"],"additionalProperties":false},"action":{"path":"/me/messages/{message_id}/move","method":"POST","mapping":{"params":"{\n \"message_id\": arguments.message_id\n }","body":"{\n \"destinationId\": arguments.destination_folder_id\n }"}},"annotations":{"destructiveHint":true},"requiredScopes":["Mail.ReadWrite"]},{"name":"Delete Message","description":"Delete an email message. The message is moved to the Deleted Items folder. To permanently delete, move to 'deleteditems' first and then delete again.","slug":"delete-message","ai_risk":{"level":"medium","score":6,"reasoning":"This tool deletes an email message, moving it to the Deleted Items folder, which poses a higher risk due to potential data loss.","calculated_at":"2026-05-22T20:34:28.344Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"message_id":{"type":"string","description":"The unique identifier of the message to delete."}},"required":["message_id"],"additionalProperties":false},"action":{"path":"/me/messages/{message_id}","method":"DELETE","mapping":{"params":"{\n \"message_id\": arguments.message_id\n }"}},"annotations":{"destructiveHint":true},"requiredScopes":["Mail.ReadWrite"]},{"name":"Create Draft","description":"Create a draft email message. The draft is saved in the Drafts folder and can be updated and sent later. Useful for composing messages that need review before sending.","slug":"create-draft","ai_risk":{"level":"medium","score":5,"reasoning":"This tool creates a draft email message, which is a standard write operation, thus it is medium risk.","calculated_at":"2026-05-22T20:34:28.344Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"subject":{"type":"string","description":"The email subject line."},"body":{"type":"string","description":"The email body content."},"body_type":{"type":"string","description":"The content type of the body: 'text' or 'html'. Defaults to 'html'.","enum":["text","html"],"default":"html"},"to":{"type":"array","description":"List of recipient email addresses.","items":{"type":"string"}},"cc":{"type":"array","description":"List of CC recipient email addresses.","items":{"type":"string"}},"importance":{"type":"string","description":"Message importance level.","enum":["low","normal","high"],"default":"normal"}},"required":["subject","body"],"additionalProperties":false},"action":{"path":"/me/messages","method":"POST","mapping":{"body":"$sift({\n \"subject\": arguments.subject,\n \"body\": {\n \"contentType\": $exists(arguments.body_type) ? arguments.body_type : \"html\",\n \"content\": arguments.body\n },\n \"toRecipients\": $exists(arguments.to) ? $map(arguments.to, function($email) {\n {\"emailAddress\": {\"address\": $email}}\n })[] : null,\n \"ccRecipients\": $exists(arguments.cc) ? $map(arguments.cc, function($email) {\n {\"emailAddress\": {\"address\": $email}}\n })[] : null,\n \"importance\": $exists(arguments.importance) ? arguments.importance : \"normal\"\n }, function($v) { $v != null })"}},"annotations":{"destructiveHint":true},"requiredScopes":["Mail.ReadWrite"]},{"name":"List Mail Folders","description":"List all mail folders in the user's mailbox. Returns the folder hierarchy including well-known folders (Inbox, Sent Items, Drafts, etc.) and custom folders. Each folder includes its ID, display name, unread count, and total item count.","slug":"list-mail-folders","ai_risk":{"level":"low","score":1,"reasoning":"This tool lists all mail folders in the user's mailbox and is read-only, indicating low risk.","calculated_at":"2026-05-22T20:34:28.344Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"top":{"type":"number","description":"Number of folders to return. Defaults to 50.","default":50},"include_hidden":{"type":"boolean","description":"Whether to include hidden folders. Defaults to false.","default":false}},"additionalProperties":false},"action":{"path":"/me/mailFolders","method":"GET","mapping":{"query":"$sift({\n \"$top\": $exists(arguments.top) ? arguments.top : 50,\n \"includeHiddenFolders\": arguments.include_hidden ? \"true\" : null\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Get Mail Folder","description":"Get details of a specific mail folder including display name, unread count, total count, and child folder count. Use well-known folder names or a folder ID.","slug":"get-mail-folder","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves details of a specific mail folder and is read-only, making it low risk.","calculated_at":"2026-05-22T20:34:28.344Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"folder_id":{"type":"string","description":"The folder ID or well-known name ('inbox', 'sentitems', 'drafts', 'deleteditems', 'junkemail', 'archive')."}},"required":["folder_id"],"additionalProperties":false},"action":{"path":"/me/mailFolders/{folder_id}","method":"GET","mapping":{"params":"{\n \"folder_id\": arguments.folder_id\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Create Mail Folder","description":"Create a new mail folder. You can create top-level folders or subfolders within an existing folder. Useful for organizing emails into custom categories.","slug":"create-mail-folder","ai_risk":{"level":"medium","score":5,"reasoning":"This tool creates a new mail folder, which is a standard write operation, thus it is medium risk.","calculated_at":"2026-05-22T20:34:28.344Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"display_name":{"type":"string","description":"The name of the new folder."},"parent_folder_id":{"type":"string","description":"Optional: The parent folder ID to create a subfolder. If omitted, creates a top-level folder."}},"required":["display_name"],"additionalProperties":false},"action":{"path":"/me/mailFolders{parentPath}","method":"POST","mapping":{"params":"{\n \"parentPath\": $exists(arguments.parent_folder_id) ? \"/\" & arguments.parent_folder_id & \"/childFolders\" : \"\"\n }","body":"{\n \"displayName\": arguments.display_name\n }"}},"annotations":{"destructiveHint":true},"requiredScopes":["Mail.ReadWrite"]},{"name":"Update Mail Folder","description":"Rename a mail folder by updating its display name.","slug":"update-mail-folder","ai_risk":{"level":"medium","score":5,"reasoning":"This tool renames a mail folder, which is a standard write operation, making it medium risk.","calculated_at":"2026-05-22T20:34:28.344Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"folder_id":{"type":"string","description":"The unique identifier of the folder to rename."},"display_name":{"type":"string","description":"The new display name for the folder."}},"required":["folder_id","display_name"],"additionalProperties":false},"action":{"path":"/me/mailFolders/{folder_id}","method":"PATCH","mapping":{"params":"{\n \"folder_id\": arguments.folder_id\n }","body":"{\n \"displayName\": arguments.display_name\n }"}},"annotations":{"destructiveHint":true,"idempotentHint":true},"requiredScopes":["Mail.ReadWrite"]},{"name":"Delete Mail Folder","description":"Delete a mail folder and all its contents. This action is permanent for custom folders. Well-known folders (Inbox, Sent Items, etc.) cannot be deleted.","slug":"delete-mail-folder","ai_risk":{"level":"high","score":7,"reasoning":"This tool deletes a mail folder and all its contents, which poses a significant risk due to potential data loss.","calculated_at":"2026-05-22T20:34:28.344Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"folder_id":{"type":"string","description":"The unique identifier of the folder to delete."}},"required":["folder_id"],"additionalProperties":false},"action":{"path":"/me/mailFolders/{folder_id}","method":"DELETE","mapping":{"params":"{\n \"folder_id\": arguments.folder_id\n }"}},"annotations":{"destructiveHint":true},"requiredScopes":["Mail.ReadWrite"]},{"name":"Get Mailbox Settings","description":"Get the user's mailbox settings including automatic replies (out of office), language, time zone, and working hours configuration.","slug":"get-mailbox-settings","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves the user's mailbox settings and is read-only, indicating low risk.","calculated_at":"2026-05-22T20:34:28.344Z"},"enabled":true,"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"action":{"path":"/me/mailboxSettings","method":"GET","mapping":{}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Update Automatic Replies","description":"Configure automatic reply (out of office) settings. You can enable/disable automatic replies, set different messages for internal and external recipients, and schedule the active period.","slug":"update-automatic-replies","ai_risk":{"level":"medium","score":5,"reasoning":"This tool configures automatic reply settings, which is a standard write operation, thus it is medium risk.","calculated_at":"2026-05-22T20:34:28.344Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"status":{"type":"string","description":"The status of automatic replies.","enum":["disabled","alwaysEnabled","scheduled"]},"internal_reply":{"type":"string","description":"The automatic reply message for internal (same organization) senders. Supports HTML."},"external_reply":{"type":"string","description":"The automatic reply message for external senders. Supports HTML."},"external_audience":{"type":"string","description":"Who outside the organization receives the external reply.","enum":["none","contactsOnly","all"],"default":"all"},"scheduled_start":{"type":"string","description":"Start date/time for scheduled replies in ISO 8601 format (e.g., '2024-12-20T08:00:00Z')."},"scheduled_end":{"type":"string","description":"End date/time for scheduled replies in ISO 8601 format (e.g., '2025-01-06T08:00:00Z')."}},"required":["status"],"additionalProperties":false},"action":{"path":"/me/mailboxSettings","method":"PATCH","mapping":{"body":"{\n \"automaticRepliesSetting\": $sift({\n \"status\": arguments.status,\n \"internalReplyMessage\": arguments.internal_reply,\n \"externalReplyMessage\": arguments.external_reply,\n \"externalAudience\": $exists(arguments.external_audience) ? arguments.external_audience : \"all\",\n \"scheduledStartDateTime\": $exists(arguments.scheduled_start) ? {\"dateTime\": arguments.scheduled_start, \"timeZone\": \"UTC\"} : null,\n \"scheduledEndDateTime\": $exists(arguments.scheduled_end) ? {\"dateTime\": arguments.scheduled_end, \"timeZone\": \"UTC\"} : null\n }, function($v) { $v != null })\n }"}},"annotations":{"destructiveHint":true,"idempotentHint":true},"requiredScopes":["MailboxSettings.ReadWrite"]}]}}
1
+ {"id":"outlook-mail","status":"active","internal_status":"tool-works","applications":["outlook-mail"],"definition":{"display":{"name":"Microsoft Outlook Mail","description":"Read, send, and manage emails through Microsoft Outlook using the Microsoft Graph API. Supports message management, folders, attachments, and mailbox settings.","icon":"outlook-mail.svg","website":"https://outlook.live.com/mail/","category":"communication-messaging","docs_url":"https://docs.withwillow.ai/docs/mcp-servers/built-in/outlook-mail"},"api":{"base_url":"https://graph.microsoft.com/v1.0"},"auth":{"methods":{"oauth":{"authUrl":"https://login.microsoftonline.com/common/oauth2/v2.0/authorize","tokenUrl":"https://login.microsoftonline.com/common/oauth2/v2.0/token","authInitUrlParams":{"response_mode":"query"},"scopes":["offline_access","User.Read","Mail.Read","Mail.ReadWrite","Mail.Send","MailboxSettings.Read","MailboxSettings.ReadWrite"],"defaultScopes":["offline_access","Mail.ReadWrite","Mail.Send","MailboxSettings.ReadWrite"],"scopeTemplates":[{"id":"read-only","name":"Read-only","description":"Read and search messages, attachments, folders and mailbox settings. Can't send, move or delete mail.","scopes":["offline_access","Mail.Read","MailboxSettings.Read"]},{"id":"send-only","name":"Send only","description":"Send email as the user without access to read the mailbox. For agents that only deliver notifications or reports.","scopes":["offline_access","Mail.Send"]},{"id":"full-access","name":"Full access","description":"Read, send, reply to, move and delete mail, manage folders and drafts, and set automatic replies.","scopes":["offline_access","User.Read","Mail.ReadWrite","Mail.Send","MailboxSettings.ReadWrite"]}],"pkce":true,"codeExchangeConfig":{"modelCredentialsMapping":"{\n \"access_token\": access_token,\n \"expires_at\": $fromMillis($millis() + expires_in * 1000),\n \"refresh_token\": refresh_token,\n \"scope\": scope,\n \"token_type\": token_type\n}","isForm":true}}}},"tools":[{"name":"List Messages","description":"List email messages in the authenticated user's mailbox. Returns messages sorted by received date (newest first) by default. Use this to browse the inbox or any mail folder. Supports filtering and selecting specific fields for efficient queries.","slug":"list-messages","ai_risk":{"level":"low","score":1,"reasoning":"This tool lists email messages in the user's mailbox and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:34:28.344Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"folder_id":{"type":"string","description":"The folder to list messages from. Use well-known names like 'inbox', 'sentitems', 'drafts', 'deleteditems', 'junkemail', or a folder ID. Defaults to 'inbox'."},"top":{"type":"number","description":"Number of messages to return (1-100). Defaults to 25.","default":25},"select":{"type":"string","description":"Comma-separated list of fields to return (e.g., 'subject,from,receivedDateTime,isRead'). Reduces response size."},"filter":{"type":"string","description":"OData filter expression (e.g., \"isRead eq false\", \"from/emailAddress/address eq 'user@example.com'\")."},"search":{"type":"string","description":"Search query to find messages matching keywords in subject, body, or other fields (e.g., 'project update')."},"orderby":{"type":"string","description":"OData orderby expression (e.g., 'receivedDateTime desc', 'subject asc'). Defaults to 'receivedDateTime desc'."},"skip":{"type":"number","description":"Number of messages to skip (for pagination)."}},"additionalProperties":false},"action":{"path":"/me/mailFolders/{folder_id}/messages","method":"GET","mapping":{"params":"{\n \"folder_id\": $exists(arguments.folder_id) ? arguments.folder_id : \"inbox\"\n }","query":"$sift({\n \"$top\": $exists(arguments.top) ? arguments.top : 25,\n \"$select\": arguments.select,\n \"$filter\": arguments.filter,\n \"$search\": arguments.search ? \"\\\"\" & arguments.search & \"\\\"\" : null,\n \"$orderby\": arguments.orderby,\n \"$skip\": arguments.skip\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":true}},{"name":"Get Message","description":"Get the full details of a specific email message by its ID, including body content, attachments metadata, headers, and all properties. Use this when you need to read the complete content of an email.","slug":"get-message","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves the full details of a specific email message and is read-only, making it low risk.","calculated_at":"2026-05-22T20:34:28.344Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"message_id":{"type":"string","description":"The unique identifier of the message."},"select":{"type":"string","description":"Comma-separated list of fields to return. If omitted, all fields are returned."}},"required":["message_id"],"additionalProperties":false},"action":{"path":"/me/messages/{message_id}","method":"GET","mapping":{"params":"{\n \"message_id\": arguments.message_id\n }","query":"$sift({\n \"$select\": arguments.select\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Search Messages","description":"Search for email messages across all folders using a keyword query. The search looks through subject, body, sender, and other fields. This is more powerful than filtering and supports natural language queries.","slug":"search-messages","ai_risk":{"level":"low","score":1,"reasoning":"This tool allows searching for email messages across folders and is read-only, thus it is low risk.","calculated_at":"2026-05-22T20:34:28.344Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"Search query string. Supports keywords and KQL syntax (e.g., 'from:user@example.com subject:report', 'has:attachment')."},"top":{"type":"number","description":"Number of results to return (1-100). Defaults to 25.","default":25}},"required":["query"],"additionalProperties":false},"action":{"path":"/me/messages","method":"GET","mapping":{"query":"{\n \"$search\": \"\\\"\" & arguments.query & \"\\\"\",\n \"$top\": $exists(arguments.top) ? arguments.top : 25\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":true}},{"name":"List Attachments","description":"List all attachments on a specific email message. Returns attachment metadata including name, size, content type, and whether it's inline. For file attachments, use the Get Attachment tool to retrieve the actual content.","slug":"list-attachments","ai_risk":{"level":"low","score":1,"reasoning":"This tool lists attachments on a specific email message and is read-only, resulting in low risk.","calculated_at":"2026-05-22T20:34:28.344Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"message_id":{"type":"string","description":"The unique identifier of the message."}},"required":["message_id"],"additionalProperties":false},"action":{"path":"/me/messages/{message_id}/attachments","method":"GET","mapping":{"params":"{\n \"message_id\": arguments.message_id\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Get Attachment","description":"Get a specific attachment from an email message, including the file content (base64-encoded for file attachments). Use this to download or read attachment content.","slug":"get-attachment","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves a specific attachment from an email message and is read-only, indicating low risk.","calculated_at":"2026-05-22T20:34:28.344Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"message_id":{"type":"string","description":"The unique identifier of the message."},"attachment_id":{"type":"string","description":"The unique identifier of the attachment."}},"required":["message_id","attachment_id"],"additionalProperties":false},"action":{"path":"/me/messages/{message_id}/attachments/{attachment_id}","method":"GET","mapping":{"params":"{\n \"message_id\": arguments.message_id,\n \"attachment_id\": arguments.attachment_id\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Send Mail","description":"Send a new email message. Supports plain text and HTML body content, multiple recipients (to, cc, bcc), importance settings, and file attachments. The message is sent immediately and saved to the Sent Items folder.","slug":"send-mail","ai_risk":{"level":"medium","score":5,"reasoning":"This tool sends a new email message, which is a standard write operation, thus it is medium risk.","calculated_at":"2026-05-22T20:34:28.344Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"subject":{"type":"string","description":"The email subject line."},"body":{"type":"string","description":"The email body content."},"body_type":{"type":"string","description":"The content type of the body: 'text' or 'html'. Defaults to 'html'.","enum":["text","html"],"default":"html"},"to":{"type":"array","description":"List of recipient email addresses.","items":{"type":"string"}},"cc":{"type":"array","description":"List of CC recipient email addresses.","items":{"type":"string"}},"bcc":{"type":"array","description":"List of BCC recipient email addresses.","items":{"type":"string"}},"importance":{"type":"string","description":"Message importance level.","enum":["low","normal","high"],"default":"normal"},"save_to_sent_items":{"type":"boolean","description":"Whether to save the message in Sent Items. Defaults to true.","default":true}},"required":["subject","body","to"],"additionalProperties":false},"action":{"path":"/me/sendMail","method":"POST","mapping":{"body":"{\n \"message\": $sift({\n \"subject\": arguments.subject,\n \"body\": {\n \"contentType\": $exists(arguments.body_type) ? arguments.body_type : \"html\",\n \"content\": arguments.body\n },\n \"toRecipients\": $map(arguments.to, function($email) {\n {\"emailAddress\": {\"address\": $email}}\n })[],\n \"ccRecipients\": $exists(arguments.cc) ? $map(arguments.cc, function($email) {\n {\"emailAddress\": {\"address\": $email}}\n })[] : null,\n \"bccRecipients\": $exists(arguments.bcc) ? $map(arguments.bcc, function($email) {\n {\"emailAddress\": {\"address\": $email}}\n })[] : null,\n \"importance\": $exists(arguments.importance) ? arguments.importance : \"normal\"\n }, function($v) { $v != null }),\n \"saveToSentItems\": $exists(arguments.save_to_sent_items) ? arguments.save_to_sent_items : true\n }"}},"annotations":{"destructiveHint":true},"requiredScopes":["Mail.Send"]},{"name":"Reply to Message","description":"Send a reply to an email message. The reply is sent to the sender of the original message. You can add a comment/body text to include with the reply.","slug":"reply-to-message","ai_risk":{"level":"medium","score":5,"reasoning":"This tool sends a reply to an email message, representing a standard write operation and is medium risk.","calculated_at":"2026-05-22T20:34:28.344Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"message_id":{"type":"string","description":"The unique identifier of the message to reply to."},"comment":{"type":"string","description":"The reply body content (HTML supported)."}},"required":["message_id","comment"],"additionalProperties":false},"action":{"path":"/me/messages/{message_id}/reply","method":"POST","mapping":{"params":"{\n \"message_id\": arguments.message_id\n }","body":"{\n \"comment\": arguments.comment\n }"}},"annotations":{"destructiveHint":true},"requiredScopes":["Mail.Send"]},{"name":"Reply All to Message","description":"Send a reply-all to an email message. The reply is sent to all original recipients (sender, to, and cc). You can add a comment/body text to include with the reply.","slug":"reply-all-to-message","ai_risk":{"level":"medium","score":5,"reasoning":"This tool sends a reply to all recipients of an email message, which is a standard write operation, making it medium risk.","calculated_at":"2026-05-22T20:34:28.344Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"message_id":{"type":"string","description":"The unique identifier of the message to reply to."},"comment":{"type":"string","description":"The reply body content (HTML supported)."}},"required":["message_id","comment"],"additionalProperties":false},"action":{"path":"/me/messages/{message_id}/replyAll","method":"POST","mapping":{"params":"{\n \"message_id\": arguments.message_id\n }","body":"{\n \"comment\": arguments.comment\n }"}},"annotations":{"destructiveHint":true},"requiredScopes":["Mail.Send"]},{"name":"Forward Message","description":"Forward an email message to one or more recipients. You can add a comment/body text to include with the forwarded message.","slug":"forward-message","ai_risk":{"level":"medium","score":5,"reasoning":"This tool forwards an email message to other recipients, representing a standard write operation and is medium risk.","calculated_at":"2026-05-22T20:34:28.344Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"message_id":{"type":"string","description":"The unique identifier of the message to forward."},"to":{"type":"array","description":"List of recipient email addresses to forward to.","items":{"type":"string"}},"comment":{"type":"string","description":"Optional comment to include with the forwarded message (HTML supported)."}},"required":["message_id","to"],"additionalProperties":false},"action":{"path":"/me/messages/{message_id}/forward","method":"POST","mapping":{"params":"{\n \"message_id\": arguments.message_id\n }","body":"$sift({\n \"toRecipients\": $map(arguments.to, function($email) {\n {\"emailAddress\": {\"address\": $email}}\n })[],\n \"comment\": arguments.comment\n }, function($v) { $v != null })"}},"annotations":{"destructiveHint":true},"requiredScopes":["Mail.Send"]},{"name":"Update Message","description":"Update properties of an email message such as read status, importance, categories, flag status, or recipients. Use this to mark messages as read/unread, flag for follow-up, categorize messages, or update the to/cc/bcc recipients on a draft before sending.","slug":"update-message","ai_risk":{"level":"medium","score":5,"reasoning":"This tool updates properties of an email message, which is a standard write operation, thus it is medium risk.","calculated_at":"2026-05-22T20:34:28.344Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"message_id":{"type":"string","description":"The unique identifier of the message to update."},"is_read":{"type":"boolean","description":"Set to true to mark as read, false to mark as unread."},"importance":{"type":"string","description":"Message importance level.","enum":["low","normal","high"]},"categories":{"type":"array","description":"List of categories to assign to the message.","items":{"type":"string"}},"flag":{"type":"string","description":"Flag status for follow-up.","enum":["notFlagged","flagged","complete"]}},"required":["message_id"],"additionalProperties":false},"action":{"path":"/me/messages/{message_id}","method":"PATCH","mapping":{"params":"{\n \"message_id\": arguments.message_id\n }","body":"$sift({\n \"isRead\": arguments.is_read,\n \"importance\": arguments.importance,\n \"categories\": arguments.categories,\n \"flag\": $exists(arguments.flag) ? {\"flagStatus\": arguments.flag} : null\n }, function($v) { $v != null })"}},"annotations":{"destructiveHint":true,"idempotentHint":true},"requiredScopes":["Mail.ReadWrite"]},{"name":"Move Message","description":"Move an email message to a different mail folder. Use well-known folder names like 'inbox', 'archive', 'deleteditems', 'junkemail', or a folder ID.","slug":"move-message","ai_risk":{"level":"medium","score":5,"reasoning":"This tool moves an email message to a different folder, which is a standard write operation, making it medium risk.","calculated_at":"2026-05-22T20:34:28.344Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"message_id":{"type":"string","description":"The unique identifier of the message to move."},"destination_folder_id":{"type":"string","description":"The destination folder. Use well-known names ('inbox', 'archive', 'deleteditems', 'junkemail', 'drafts', 'sentitems') or a folder ID."}},"required":["message_id","destination_folder_id"],"additionalProperties":false},"action":{"path":"/me/messages/{message_id}/move","method":"POST","mapping":{"params":"{\n \"message_id\": arguments.message_id\n }","body":"{\n \"destinationId\": arguments.destination_folder_id\n }"}},"annotations":{"destructiveHint":true},"requiredScopes":["Mail.ReadWrite"]},{"name":"Delete Message","description":"Delete an email message. The message is moved to the Deleted Items folder. To permanently delete, move to 'deleteditems' first and then delete again.","slug":"delete-message","ai_risk":{"level":"medium","score":6,"reasoning":"This tool deletes an email message, moving it to the Deleted Items folder, which poses a higher risk due to potential data loss.","calculated_at":"2026-05-22T20:34:28.344Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"message_id":{"type":"string","description":"The unique identifier of the message to delete."}},"required":["message_id"],"additionalProperties":false},"action":{"path":"/me/messages/{message_id}","method":"DELETE","mapping":{"params":"{\n \"message_id\": arguments.message_id\n }"}},"annotations":{"destructiveHint":true},"requiredScopes":["Mail.ReadWrite"]},{"name":"Create Draft","description":"Create a draft email message. The draft is saved in the Drafts folder and can be updated and sent later. Useful for composing messages that need review before sending.","slug":"create-draft","ai_risk":{"level":"medium","score":5,"reasoning":"This tool creates a draft email message, which is a standard write operation, thus it is medium risk.","calculated_at":"2026-05-22T20:34:28.344Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"subject":{"type":"string","description":"The email subject line."},"body":{"type":"string","description":"The email body content."},"body_type":{"type":"string","description":"The content type of the body: 'text' or 'html'. Defaults to 'html'.","enum":["text","html"],"default":"html"},"to":{"type":"array","description":"List of recipient email addresses.","items":{"type":"string"}},"cc":{"type":"array","description":"List of CC recipient email addresses.","items":{"type":"string"}},"importance":{"type":"string","description":"Message importance level.","enum":["low","normal","high"],"default":"normal"}},"required":["subject","body"],"additionalProperties":false},"action":{"path":"/me/messages","method":"POST","mapping":{"body":"$sift({\n \"subject\": arguments.subject,\n \"body\": {\n \"contentType\": $exists(arguments.body_type) ? arguments.body_type : \"html\",\n \"content\": arguments.body\n },\n \"toRecipients\": $exists(arguments.to) ? $map(arguments.to, function($email) {\n {\"emailAddress\": {\"address\": $email}}\n })[] : null,\n \"ccRecipients\": $exists(arguments.cc) ? $map(arguments.cc, function($email) {\n {\"emailAddress\": {\"address\": $email}}\n })[] : null,\n \"importance\": $exists(arguments.importance) ? arguments.importance : \"normal\"\n }, function($v) { $v != null })"}},"annotations":{"destructiveHint":true},"requiredScopes":["Mail.ReadWrite"]},{"name":"List Mail Folders","description":"List all mail folders in the user's mailbox. Returns the folder hierarchy including well-known folders (Inbox, Sent Items, Drafts, etc.) and custom folders. Each folder includes its ID, display name, unread count, and total item count.","slug":"list-mail-folders","ai_risk":{"level":"low","score":1,"reasoning":"This tool lists all mail folders in the user's mailbox and is read-only, indicating low risk.","calculated_at":"2026-05-22T20:34:28.344Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"top":{"type":"number","description":"Number of folders to return. Defaults to 50.","default":50},"include_hidden":{"type":"boolean","description":"Whether to include hidden folders. Defaults to false.","default":false}},"additionalProperties":false},"action":{"path":"/me/mailFolders","method":"GET","mapping":{"query":"$sift({\n \"$top\": $exists(arguments.top) ? arguments.top : 50,\n \"includeHiddenFolders\": arguments.include_hidden ? \"true\" : null\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Get Mail Folder","description":"Get details of a specific mail folder including display name, unread count, total count, and child folder count. Use well-known folder names or a folder ID.","slug":"get-mail-folder","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves details of a specific mail folder and is read-only, making it low risk.","calculated_at":"2026-05-22T20:34:28.344Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"folder_id":{"type":"string","description":"The folder ID or well-known name ('inbox', 'sentitems', 'drafts', 'deleteditems', 'junkemail', 'archive')."}},"required":["folder_id"],"additionalProperties":false},"action":{"path":"/me/mailFolders/{folder_id}","method":"GET","mapping":{"params":"{\n \"folder_id\": arguments.folder_id\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Create Mail Folder","description":"Create a new mail folder. You can create top-level folders or subfolders within an existing folder. Useful for organizing emails into custom categories.","slug":"create-mail-folder","ai_risk":{"level":"medium","score":5,"reasoning":"This tool creates a new mail folder, which is a standard write operation, thus it is medium risk.","calculated_at":"2026-05-22T20:34:28.344Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"display_name":{"type":"string","description":"The name of the new folder."},"parent_folder_id":{"type":"string","description":"Optional: The parent folder ID to create a subfolder. If omitted, creates a top-level folder."}},"required":["display_name"],"additionalProperties":false},"action":{"path":"/me/mailFolders{parentPath}","method":"POST","mapping":{"params":"{\n \"parentPath\": $exists(arguments.parent_folder_id) ? \"/\" & arguments.parent_folder_id & \"/childFolders\" : \"\"\n }","body":"{\n \"displayName\": arguments.display_name\n }"}},"annotations":{"destructiveHint":true},"requiredScopes":["Mail.ReadWrite"]},{"name":"Update Mail Folder","description":"Rename a mail folder by updating its display name.","slug":"update-mail-folder","ai_risk":{"level":"medium","score":5,"reasoning":"This tool renames a mail folder, which is a standard write operation, making it medium risk.","calculated_at":"2026-05-22T20:34:28.344Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"folder_id":{"type":"string","description":"The unique identifier of the folder to rename."},"display_name":{"type":"string","description":"The new display name for the folder."}},"required":["folder_id","display_name"],"additionalProperties":false},"action":{"path":"/me/mailFolders/{folder_id}","method":"PATCH","mapping":{"params":"{\n \"folder_id\": arguments.folder_id\n }","body":"{\n \"displayName\": arguments.display_name\n }"}},"annotations":{"destructiveHint":true,"idempotentHint":true},"requiredScopes":["Mail.ReadWrite"]},{"name":"Delete Mail Folder","description":"Delete a mail folder and all its contents. This action is permanent for custom folders. Well-known folders (Inbox, Sent Items, etc.) cannot be deleted.","slug":"delete-mail-folder","ai_risk":{"level":"high","score":7,"reasoning":"This tool deletes a mail folder and all its contents, which poses a significant risk due to potential data loss.","calculated_at":"2026-05-22T20:34:28.344Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"folder_id":{"type":"string","description":"The unique identifier of the folder to delete."}},"required":["folder_id"],"additionalProperties":false},"action":{"path":"/me/mailFolders/{folder_id}","method":"DELETE","mapping":{"params":"{\n \"folder_id\": arguments.folder_id\n }"}},"annotations":{"destructiveHint":true},"requiredScopes":["Mail.ReadWrite"]},{"name":"Get Mailbox Settings","description":"Get the user's mailbox settings including automatic replies (out of office), language, time zone, and working hours configuration.","slug":"get-mailbox-settings","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves the user's mailbox settings and is read-only, indicating low risk.","calculated_at":"2026-05-22T20:34:28.344Z"},"enabled":true,"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"action":{"path":"/me/mailboxSettings","method":"GET","mapping":{}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Update Automatic Replies","description":"Configure automatic reply (out of office) settings. You can enable/disable automatic replies, set different messages for internal and external recipients, and schedule the active period.","slug":"update-automatic-replies","ai_risk":{"level":"medium","score":5,"reasoning":"This tool configures automatic reply settings, which is a standard write operation, thus it is medium risk.","calculated_at":"2026-05-22T20:34:28.344Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"status":{"type":"string","description":"The status of automatic replies.","enum":["disabled","alwaysEnabled","scheduled"]},"internal_reply":{"type":"string","description":"The automatic reply message for internal (same organization) senders. Supports HTML."},"external_reply":{"type":"string","description":"The automatic reply message for external senders. Supports HTML."},"external_audience":{"type":"string","description":"Who outside the organization receives the external reply.","enum":["none","contactsOnly","all"],"default":"all"},"scheduled_start":{"type":"string","description":"Start date/time for scheduled replies in ISO 8601 format (e.g., '2024-12-20T08:00:00Z')."},"scheduled_end":{"type":"string","description":"End date/time for scheduled replies in ISO 8601 format (e.g., '2025-01-06T08:00:00Z')."}},"required":["status"],"additionalProperties":false},"action":{"path":"/me/mailboxSettings","method":"PATCH","mapping":{"body":"{\n \"automaticRepliesSetting\": $sift({\n \"status\": arguments.status,\n \"internalReplyMessage\": arguments.internal_reply,\n \"externalReplyMessage\": arguments.external_reply,\n \"externalAudience\": $exists(arguments.external_audience) ? arguments.external_audience : \"all\",\n \"scheduledStartDateTime\": $exists(arguments.scheduled_start) ? {\"dateTime\": arguments.scheduled_start, \"timeZone\": \"UTC\"} : null,\n \"scheduledEndDateTime\": $exists(arguments.scheduled_end) ? {\"dateTime\": arguments.scheduled_end, \"timeZone\": \"UTC\"} : null\n }, function($v) { $v != null })\n }"}},"annotations":{"destructiveHint":true,"idempotentHint":true},"requiredScopes":["MailboxSettings.ReadWrite"]}]}}