# Microsoft Outlook

> Send and manage email, calendars and contacts in Microsoft Outlook.

App · Email · 54 actions · 1 trigger. Web page: https://docs.lodol.com/docs/integrations/microsoft-outlook

## Triggers

Start a workflow when something happens in Microsoft Outlook. See [how triggers work](https://docs.lodol.com/docs/concepts/triggers.md).

### New Outlook email

Triggers when a new email arrives in a folder of an Outlook mailbox - the inbox unless you choose another - optionally only from one sender or domain. Runs once for each email, with its text.

**Filters**: Narrow which events start a run.

- `mailbox` (required): The mailbox to watch: a user's email address in the Microsoft 365 tenant the app was consented in.
- `sender`: Only emails from this address, or from a whole domain written as @example.com. Leave blank for every new email.
- `folder`: The folder to watch: a folder ID or a well-known name such as inbox, junkemail or archive. Leave blank for the inbox.

**Event fields**: What a run starts with. Later steps read each field with an @ reference.

- `message_id` (text)
- `mailbox` (text)
- `folder` (text)
- `conversation_id` (text)
- `from` (text)
- `from_address` (text)
- `from_name` (text)
- `to` (text)
- `cc` (text)
- `subject` (text)
- `received_at` (text)
- `body` (text)
- `snippet` (text)
- `has_attachments` (true/false)
- `is_read` (true/false)
- `categories` (list)
- `web_link` (text)

## Actions

### Add attachment

Attach one or more files to an existing draft message.

**Inputs**

- Mailbox (`mailbox`, text, required): The mailbox to act on: a user's email address (userPrincipalName) or Microsoft user ID. App-only access has no signed-in user, so the mailbox must be named explicitly. It has to be a mailbox in the same Microsoft 365 tenant the app registration was consented in -- an outside address such as a personal Gmail or outlook.com account is not reachable this way. The picker is populated from the directory when the app has the optional User.Read.All permission; otherwise type the address.
- Message ID (`message_id`, text, required): The ID of the message.
- Attachments (`attachments`, list, required): Files to attach. Upload a file or reference a document (or list of documents) from an earlier step. Microsoft Graph limits an attachment sent in a single request to under 3 MB; use Add large attachment for a larger file.

**Outputs**

- `attachments` (list): The attachments that were created.
- `count` (number): Number attached.
- `message_id` (text): Draft message ID.

**Example output**

```json
{
  "attachments": [
    {
      "id": "AAMkAGI2TG93AAA=",
      "name": "q3-notes.pdf",
      "size": 84213
    }
  ],
  "count": 1,
  "message_id": "AAMkAGI2NGVhZTIyLTAzYzUt"
}
```

### Add large attachment

Attach a file between 3 MB and 150 MB to a draft using an upload session. Use Add attachment for anything smaller. Note that Exchange Online's default message size limit is 35 MB unless an administrator has raised it.

**Inputs**

- Mailbox (`mailbox`, text, required): The mailbox to act on: a user's email address (userPrincipalName) or Microsoft user ID. App-only access has no signed-in user, so the mailbox must be named explicitly. It has to be a mailbox in the same Microsoft 365 tenant the app registration was consented in -- an outside address such as a personal Gmail or outlook.com account is not reachable this way. The picker is populated from the directory when the app has the optional User.Read.All permission; otherwise type the address.
- Message ID (`message_id`, text, required): The ID of the message.
- Attachment (`attachment`, list, required): The file to attach. Upload a file or reference a document from an earlier step.

**Outputs**

- `attachment_id` (text): ID of the created attachment.
- `message_id` (text): Draft ID.
- `name` (text): File name.
- `size` (number): Size in bytes.

**Example output**

```json
{
  "attachment_id": "AAMkAGI2TG93AAB=",
  "message_id": "AAMkAGI2NGVhZTIyLTAzYzUt",
  "name": "quarterly-deck.pdf",
  "size": 18874368
}
```

### Cancel event

Cancel a meeting you organise and send a cancellation notice to every attendee. Cancelling also removes the meeting from your own calendar, so there is no need to delete it afterwards; a Delete event step on the same ID will fail with not found.

**Inputs**

- Mailbox (`mailbox`, text, required): The mailbox to act on: a user's email address (userPrincipalName) or Microsoft user ID. App-only access has no signed-in user, so the mailbox must be named explicitly. It has to be a mailbox in the same Microsoft 365 tenant the app registration was consented in -- an outside address such as a personal Gmail or outlook.com account is not reachable this way. The picker is populated from the directory when the app has the optional User.Read.All permission; otherwise type the address.
- Event ID (`event_id`, text, required): The ID of the calendar event.
- Comment (`comment`, text): Optional message to include.

**Outputs**

- `status` (text): Operation status.

**Example output**

```json
{
  "event_id": "AAMkAGViNDU3ZDI4LTZmNzMt",
  "status": "cancelled"
}
```

### Copy message

Copy a message into another folder. The copy gets its own ID, which is returned; the original keeps its ID.

**Inputs**

- Mailbox (`mailbox`, text, required): The mailbox to act on: a user's email address (userPrincipalName) or Microsoft user ID. App-only access has no signed-in user, so the mailbox must be named explicitly. It has to be a mailbox in the same Microsoft 365 tenant the app registration was consented in -- an outside address such as a personal Gmail or outlook.com account is not reachable this way. The picker is populated from the directory when the app has the optional User.Read.All permission; otherwise type the address.
- Message ID (`message_id`, text, required): The ID of the message.
- Destination folder ID (`destination_folder_id`, text, required): Destination folder. Accepts a folder ID or a well-known name: inbox, drafts, sentitems, deleteditems, junkemail or archive.

**Outputs**

- `bodyPreview` (text): First 255 characters.
- `from` (object): Sender recipient object.
- `hasAttachments` (true/false): Attachment present.
- `id` (text): Message ID.
- `isRead` (true/false): Whether it has been read.
- `receivedDateTime` (text): ISO 8601 timestamp.
- `subject` (text): Message subject.
- `webLink` (text): Open in Outlook on the web.

**Example output**

```json
{
  "bodyPreview": "Here are the notes from this morning's planning session...",
  "from": {
    "emailAddress": {
      "address": "alexw@contoso.com",
      "name": "Alex Wilbur"
    }
  },
  "hasAttachments": true,
  "id": "AAMkAGI2NGVhZTIyLTAzYzUt",
  "isRead": false,
  "receivedDateTime": "2026-09-18T14:02:11Z",
  "subject": "Q3 planning notes",
  "webLink": "https://outlook.office365.com/owa/?ItemID=AAMkAGI2NGVhZTIy"
}
```

### Create category

Add a category to a mailbox's master list so it can be applied to messages, events and contacts.

**Inputs**

- Mailbox (`mailbox`, text, required): The mailbox to act on: a user's email address (userPrincipalName) or Microsoft user ID. App-only access has no signed-in user, so the mailbox must be named explicitly. It has to be a mailbox in the same Microsoft 365 tenant the app registration was consented in -- an outside address such as a personal Gmail or outlook.com account is not reachable this way. The picker is populated from the directory when the app has the optional User.Read.All permission; otherwise type the address.
- Display name (`display_name`, text, required): Category name. Must be unique in the mailbox and cannot be changed afterwards.
- Color (`color`, text): One of Outlook's 25 preset colours ('preset0' is red, 'preset4' green, 'preset7' blue), or 'none'.

**Outputs**

- `color` (text): Preset colour.
- `displayName` (text): Category name.
- `id` (text): Category ID.

**Example output**

```json
{
  "color": "preset0",
  "displayName": "Needs follow-up",
  "id": "5a9a6aa8-b65f-4357-b1f9-60c6bf6330d8"
}
```

### Create contact

Create a contact in a mailbox's Contacts folder.

**Inputs**

- Mailbox (`mailbox`, text, required): The mailbox to act on: a user's email address (userPrincipalName) or Microsoft user ID. App-only access has no signed-in user, so the mailbox must be named explicitly. It has to be a mailbox in the same Microsoft 365 tenant the app registration was consented in -- an outside address such as a personal Gmail or outlook.com account is not reachable this way. The picker is populated from the directory when the app has the optional User.Read.All permission; otherwise type the address.
- Given name (`given_name`, text): First name.
- Surname (`surname`, text): Last name.
- Display name (`display_name`, text): Name the contact is shown under. Outlook may regenerate this from other fields on later updates.
- Email addresses (`email_addresses`, list): Email addresses for the contact.
- Business phones (`business_phones`, list): Business phone numbers.
- Mobile phone (`mobile_phone`, text): Mobile phone number.
- Job title (`job_title`, text): Job title.
- Company name (`company_name`, text): Company name.
- Department (`department`, text): Department.
- Office location (`office_location`, text): Office location.
- Personal notes (`personal_notes`, text): Free-text notes about the contact.
- Categories (`categories`, list): Categories to assign. Each must already exist in the mailbox's category list.
- Folder ID (`folder_id`, text): Contact folder to create in. Leave blank for the default Contacts folder.

**Outputs**

- `businessPhones` (list): Business phone numbers.
- `companyName` (text): Company name.
- `displayName` (text): Contact display name.
- `emailAddresses` (list): Email addresses.
- `id` (text): Contact ID.
- `jobTitle` (text): Job title.

**Example output**

```json
{
  "businessPhones": [
    "+1 425 555 0109"
  ],
  "companyName": "Contoso",
  "displayName": "Dana Swope",
  "emailAddresses": [
    {
      "address": "danas@contoso.com",
      "name": "Dana Swope"
    }
  ],
  "id": "AAMkAGE1Mjc1YmUwLTIzZjQt",
  "jobTitle": "Operations Lead"
}
```

### Create draft

Create a draft email without sending it. Send it later with Send draft. Set 'Reply to message' to draft a reply in that message's conversation, with the original quoted below.

**Inputs**

- Mailbox (`mailbox`, text, required): The mailbox to act on: a user's email address (userPrincipalName) or Microsoft user ID. App-only access has no signed-in user, so the mailbox must be named explicitly. It has to be a mailbox in the same Microsoft 365 tenant the app registration was consented in -- an outside address such as a personal Gmail or outlook.com account is not reachable this way. The picker is populated from the directory when the app has the optional User.Read.All permission; otherwise type the address.
- Subject (`subject`, text): Subject of the draft. Required unless 'Reply to message' is set, when leaving it blank reuses that message's subject.
- Body (`body`, text): Plain text body content of the draft.
- HTML body (`html_body`, text): Formatted (HTML) version of the body. If provided, it is used instead of the plain text body.
- To (`to`, text): Comma-separated list of recipient email addresses. A reply left blank goes to the original's sender.
- CC (`cc`, text): Comma-separated list of Cc recipients.
- BCC (`bcc`, text): Comma-separated list of Bcc recipients.
- Importance (`importance`, text): Importance of the item. One of: `low`, `normal`, `high`.
- Attachments (`attachments`, list): Files to attach. Upload a file or reference a document (or list of documents) from an earlier step. Microsoft Graph limits an attachment sent in a single request to under 3 MB; for a larger file, create a draft and use Add large attachment.
- Reply to message (`reply_to_message_id`, text): The ID of a message to draft a reply to. The draft is saved in that message's conversation and threads with it when sent. Leave blank for a new email.

**Outputs**

- `bodyPreview` (text): First 255 characters.
- `from` (object): Sender recipient object.
- `hasAttachments` (true/false): Attachment present.
- `id` (text): Message ID.
- `isRead` (true/false): Whether it has been read.
- `receivedDateTime` (text): ISO 8601 timestamp.
- `subject` (text): Message subject.
- `webLink` (text): Open in Outlook on the web.

**Example output**

```json
{
  "bodyPreview": "Here are the notes from this morning's planning session...",
  "from": {
    "emailAddress": {
      "address": "alexw@contoso.com",
      "name": "Alex Wilbur"
    }
  },
  "hasAttachments": true,
  "id": "AAMkAGI2NGVhZTIyLTAzYzUt",
  "isDraft": true,
  "isRead": false,
  "receivedDateTime": "2026-09-18T14:02:11Z",
  "subject": "Q3 planning notes",
  "webLink": "https://outlook.office365.com/owa/?ItemID=AAMkAGI2NGVhZTIy"
}
```

### Create event

Create a calendar event and invite attendees, optionally as a Microsoft Teams online meeting.

**Inputs**

- Mailbox (`mailbox`, text, required): The mailbox to act on: a user's email address (userPrincipalName) or Microsoft user ID. App-only access has no signed-in user, so the mailbox must be named explicitly. It has to be a mailbox in the same Microsoft 365 tenant the app registration was consented in -- an outside address such as a personal Gmail or outlook.com account is not reachable this way. The picker is populated from the directory when the app has the optional User.Read.All permission; otherwise type the address.
- Subject (`subject`, text, required): Title of the event.
- Start date time (`start_date_time`, date and time, required): When the event starts.
- End date time (`end_date_time`, date and time, required): When the event ends.
- Time zone (`time_zone`, text): Time zone for the supplied times, in Windows or IANA format, for example 'Pacific Standard Time' or 'America/Los_Angeles'. Defaults to UTC.
- Calendar ID (`calendar_id`, text): Calendar to create in. Leave blank for the default.
- Body (`body`, text): Plain text description of the event.
- HTML body (`html_body`, text): Formatted (HTML) version of the body. If provided, it is used instead of the plain text body.
- Location (`location`, text): Where the event takes place.
- Attendees (`attendees`, text): Comma-separated addresses of required attendees.
- Optional attendees (`optional_attendees`, text): Comma-separated addresses of optional attendees.
- Is all day (`is_all_day`, true/false): All-day event. Start and end must be midnight in the same time zone. Default: `false`.
- Is online meeting (`is_online_meeting`, true/false): Create a Microsoft Teams meeting and include the join link. Cannot be turned off again afterwards. Default: `false`.
- Reminder minutes before start (`reminder_minutes_before_start`, number): Minutes before the start to show a reminder. At least 0.
- Show as (`show_as`, text): How the time appears to others. One of: `free`, `tentative`, `busy`, `oof` (Out of office), `workingElsewhere` (Working elsewhere).
- Importance (`importance`, text): Importance of the item. One of: `low`, `normal`, `high`.
- Sensitivity (`sensitivity`, text): Privacy level of the event. One of: `normal`, `personal`, `private`, `confidential`.
- Categories (`categories`, list): Categories to assign. Each must already exist in the mailbox's category list.

**Outputs**

- `attendees` (list): Attendee list.
- `end` (object): End dateTimeTimeZone.
- `id` (text): Event ID.
- `location` (object): Event location.
- `onlineMeeting` (object): Join information.
- `start` (object): Start dateTimeTimeZone.
- `subject` (text): Event subject.
- `webLink` (text): Open in Outlook on the web.

**Example output**

```json
{
  "attendees": [
    {
      "emailAddress": {
        "address": "alexw@contoso.com",
        "name": "Alex Wilbur"
      },
      "type": "required"
    }
  ],
  "end": {
    "dateTime": "2026-09-22T16:00:00.0000000",
    "timeZone": "UTC"
  },
  "id": "AAMkAGViNDU3ZDI4LTZmNzMt",
  "location": {
    "displayName": "Conference room 3"
  },
  "onlineMeeting": {
    "joinUrl": "https://teams.microsoft.com/l/meetup-join/19%3a..."
  },
  "start": {
    "dateTime": "2026-09-22T15:00:00.0000000",
    "timeZone": "UTC"
  },
  "subject": "Q3 planning",
  "webLink": "https://outlook.office365.com/calendar/item/AAMkAGViNDU3ZDI4"
}
```

### Create inbox rule

Create an inbox rule that acts on incoming mail. Supply at least one action; conditions are optional and are combined with AND.

**Inputs**

- Mailbox (`mailbox`, text, required): The mailbox to act on: a user's email address (userPrincipalName) or Microsoft user ID. App-only access has no signed-in user, so the mailbox must be named explicitly. It has to be a mailbox in the same Microsoft 365 tenant the app registration was consented in -- an outside address such as a personal Gmail or outlook.com account is not reachable this way. The picker is populated from the directory when the app has the optional User.Read.All permission; otherwise type the address.
- Display name (`display_name`, text, required): Name for the rule.
- Sequence (`sequence`, number): Order this rule runs in, relative to other rules. At least 1. Default: `1`.
- Is enabled (`is_enabled`, true/false): Whether the rule is active once created. Default: `true`.
- Sender contains (`sender_contains`, list): Match when the sender contains any of these strings.
- Subject contains (`subject_contains`, list): Match when the subject contains any of these strings.
- Body contains (`body_contains`, list): Match when the body contains any of these strings.
- Move to folder ID (`move_to_folder_id`, text): Move matching messages to this folder.
- Forward to (`forward_to`, text): Comma-separated addresses to forward matches to.
- Mark as read (`mark_as_read`, true/false): Mark matching messages as read. Default: `false`.
- Mark importance (`mark_importance`, text): Set the importance of matching messages. One of: `low`, `normal`, `high`.
- Delete message (`delete_message`, true/false): Move matching messages to Deleted Items. Default: `false`.
- Stop processing rules (`stop_processing_rules`, true/false): Stop evaluating later rules once this one matches. Default: `false`.

**Outputs**

- `actions` (object): Rule actions.
- `conditions` (object): Rule conditions.
- `displayName` (text): Rule name.
- `id` (text): Rule ID.
- `isEnabled` (true/false): Active state.

**Example output**

```json
{
  "actions": {
    "moveToFolder": "AAMkAGI2AAAAAEMkAAB="
  },
  "conditions": {
    "subjectContains": [
      "invoice"
    ]
  },
  "displayName": "Invoices to Finance",
  "id": "AQAAAJ5dZqA=",
  "isEnabled": true
}
```

### Create mail folder

Create a mail folder at the top level of a mailbox or inside another folder. The name must be unique among the folders beside it; a duplicate fails with folder exists.

**Inputs**

- Mailbox (`mailbox`, text, required): The mailbox to act on: a user's email address (userPrincipalName) or Microsoft user ID. App-only access has no signed-in user, so the mailbox must be named explicitly. It has to be a mailbox in the same Microsoft 365 tenant the app registration was consented in -- an outside address such as a personal Gmail or outlook.com account is not reachable this way. The picker is populated from the directory when the app has the optional User.Read.All permission; otherwise type the address.
- Display name (`display_name`, text, required): Name for the new folder.
- Parent folder ID (`parent_folder_id`, text): Create the folder inside this one. Leave blank to create it at the top level.

**Outputs**

- `displayName` (text): Folder name.
- `id` (text): Folder ID.
- `parentFolderId` (text): Parent folder ID.

**Example output**

```json
{
  "displayName": "Invoices",
  "id": "AAMkAGI2AAAAAEMkAAB=",
  "parentFolderId": "AAMkAGI2AAAAAEMkAAA="
}
```

### Create search folder

Create a virtual folder that always holds the messages matching a filter. Exchange Online deletes a search folder after 45 days of no use and caps how many can exist per source folder, so treat one as a cache you can recreate rather than as durable storage.

**Inputs**

- Mailbox (`mailbox`, text, required): The mailbox to act on: a user's email address (userPrincipalName) or Microsoft user ID. App-only access has no signed-in user, so the mailbox must be named explicitly. It has to be a mailbox in the same Microsoft 365 tenant the app registration was consented in -- an outside address such as a personal Gmail or outlook.com account is not reachable this way. The picker is populated from the directory when the app has the optional User.Read.All permission; otherwise type the address.
- Display name (`display_name`, text, required): Name for the search folder.
- Filter query (`filter_query`, text, required): OData $filter that selects the messages, for example "contains(subject, 'invoice')".
- Source folder IDS (`source_folder_ids`, list): Folders to search. Defaults to the inbox. Accepts well-known names.
- Include nested folders (`include_nested_folders`, true/false): Search child folders of each source folder too. Default: `true`.
- Parent folder ID (`parent_folder_id`, text): Where the folder is created. Defaults to 'searchfolders', which is where Outlook for Windows shows them.

**Outputs**

- `displayName` (text): Folder name.
- `filterQuery` (text): The filter the folder applies.
- `id` (text): Folder ID.
- `sourceFolderIds` (list): Folders being searched.

**Example output**

```json
{
  "displayName": "Unread invoices",
  "filterQuery": "contains(subject, 'invoice')",
  "id": "AAMkAGI2AAAAAEMkAAC=",
  "sourceFolderIds": [
    "inbox"
  ]
}
```

### Delete category

Remove a category from a mailbox's master list.

**Inputs**

- Mailbox (`mailbox`, text, required): The mailbox to act on: a user's email address (userPrincipalName) or Microsoft user ID. App-only access has no signed-in user, so the mailbox must be named explicitly. It has to be a mailbox in the same Microsoft 365 tenant the app registration was consented in -- an outside address such as a personal Gmail or outlook.com account is not reachable this way. The picker is populated from the directory when the app has the optional User.Read.All permission; otherwise type the address.
- Category ID (`category_id`, text, required): The ID of the category, from List categories.

**Outputs**

- `status` (text): Operation status.

**Example output**

```json
{
  "category_id": "5a9a6aa8-b65f-4357-b1f9-60c6bf6330d8",
  "status": "deleted"
}
```

### Delete contact

Delete a contact from a mailbox.

**Inputs**

- Mailbox (`mailbox`, text, required): The mailbox to act on: a user's email address (userPrincipalName) or Microsoft user ID. App-only access has no signed-in user, so the mailbox must be named explicitly. It has to be a mailbox in the same Microsoft 365 tenant the app registration was consented in -- an outside address such as a personal Gmail or outlook.com account is not reachable this way. The picker is populated from the directory when the app has the optional User.Read.All permission; otherwise type the address.
- Contact ID (`contact_id`, text, required): The ID of the contact.

**Outputs**

- `status` (text): Operation status.

**Example output**

```json
{
  "contact_id": "AAMkAGE1Mjc1YmUwLTIzZjQt",
  "status": "deleted"
}
```

### Delete event

Delete a calendar event. For a meeting you organise, use Cancel event instead so attendees are notified. After a meeting is cancelled it stays on each attendee's calendar, marked cancelled, until deleted: use this on the attendee's mailbox, with the event ID from their calendar, to clear it.

**Inputs**

- Mailbox (`mailbox`, text, required): The mailbox to act on: a user's email address (userPrincipalName) or Microsoft user ID. App-only access has no signed-in user, so the mailbox must be named explicitly. It has to be a mailbox in the same Microsoft 365 tenant the app registration was consented in -- an outside address such as a personal Gmail or outlook.com account is not reachable this way. The picker is populated from the directory when the app has the optional User.Read.All permission; otherwise type the address.
- Event ID (`event_id`, text, required): The ID of the calendar event.

**Outputs**

- `status` (text): Operation status.

**Example output**

```json
{
  "event_id": "AAMkAGViNDU3ZDI4LTZmNzMt",
  "status": "deleted"
}
```

### Delete Focused Inbox override

Remove a Focused Inbox override from this mailbox.

**Inputs**

- Mailbox (`mailbox`, text, required): The mailbox to act on: a user's email address (userPrincipalName) or Microsoft user ID. App-only access has no signed-in user, so the mailbox must be named explicitly. It has to be a mailbox in the same Microsoft 365 tenant the app registration was consented in -- an outside address such as a personal Gmail or outlook.com account is not reachable this way. The picker is populated from the directory when the app has the optional User.Read.All permission; otherwise type the address.
- Override ID (`override_id`, text, required): The ID of the override, from List Focused Inbox overrides.

**Outputs**

- `status` (text): Operation status.

**Example output**

```json
{
  "override_id": "98f5bdef-576a-404d-a2ea-07a3cf11a9b9",
  "status": "deleted"
}
```

### Delete inbox rule

Delete an inbox rule.

**Inputs**

- Mailbox (`mailbox`, text, required): The mailbox to act on: a user's email address (userPrincipalName) or Microsoft user ID. App-only access has no signed-in user, so the mailbox must be named explicitly. It has to be a mailbox in the same Microsoft 365 tenant the app registration was consented in -- an outside address such as a personal Gmail or outlook.com account is not reachable this way. The picker is populated from the directory when the app has the optional User.Read.All permission; otherwise type the address.
- Rule ID (`rule_id`, text, required): The ID of the rule, from List inbox rules.

**Outputs**

- `status` (text): Operation status.

**Example output**

```json
{
  "rule_id": "AQAAAJ5dZqA=",
  "status": "deleted"
}
```

### Delete mail folder

Delete a mail folder and everything inside it.

**Inputs**

- Mailbox (`mailbox`, text, required): The mailbox to act on: a user's email address (userPrincipalName) or Microsoft user ID. App-only access has no signed-in user, so the mailbox must be named explicitly. It has to be a mailbox in the same Microsoft 365 tenant the app registration was consented in -- an outside address such as a personal Gmail or outlook.com account is not reachable this way. The picker is populated from the directory when the app has the optional User.Read.All permission; otherwise type the address.
- Folder ID (`folder_id`, text, required): The folder to delete.

**Outputs**

- `status` (text): Operation status.

**Example output**

```json
{
  "folder_id": "AAMkAGI2AAAAAEMkAAB=",
  "status": "deleted"
}
```

### Delete message

Delete a message. It goes to the mailbox's hidden Recoverable Items, not the Deleted Items folder: users can restore it with Recover deleted items in Outlook until the retention period ends (14 days by default). To put a message in Deleted Items instead, use Move message with the destination deleteditems.

**Inputs**

- Mailbox (`mailbox`, text, required): The mailbox to act on: a user's email address (userPrincipalName) or Microsoft user ID. App-only access has no signed-in user, so the mailbox must be named explicitly. It has to be a mailbox in the same Microsoft 365 tenant the app registration was consented in -- an outside address such as a personal Gmail or outlook.com account is not reachable this way. The picker is populated from the directory when the app has the optional User.Read.All permission; otherwise type the address.
- Message ID (`message_id`, text, required): The ID of the message.

**Outputs**

- `status` (text): Operation status.

**Example output**

```json
{
  "message_id": "AAMkAGI2NGVhZTIyLTAzYzUt",
  "status": "deleted"
}
```

### Find meeting times

Ask Microsoft Graph to suggest meeting times based on attendee availability.

**Inputs**

- Mailbox (`mailbox`, text, required): The mailbox to act on: a user's email address (userPrincipalName) or Microsoft user ID. App-only access has no signed-in user, so the mailbox must be named explicitly. It has to be a mailbox in the same Microsoft 365 tenant the app registration was consented in -- an outside address such as a personal Gmail or outlook.com account is not reachable this way. The picker is populated from the directory when the app has the optional User.Read.All permission; otherwise type the address.
- Attendees (`attendees`, list, required): Addresses of the people who need to attend.
- Meeting duration minutes (`meeting_duration_minutes`, number): How long the meeting needs to be, in minutes. At least 1. Default: `30`.
- Start date time (`start_date_time`, date and time): Earliest time to consider. Pair with an end time.
- End date time (`end_date_time`, date and time): Latest time to consider. Pair with a start time.
- Time zone (`time_zone`, text): Time zone for the supplied times, in Windows or IANA format, for example 'Pacific Standard Time' or 'America/Los_Angeles'. Defaults to UTC.
- Max candidates (`max_candidates`, number): Maximum number of suggestions to return. From 1 to 100. Default: `10`.
- Minimum attendee percentage (`minimum_attendee_percentage`, number): Minimum percentage of attendees that must be free for a time to be suggested. From 0 to 100.

**Outputs**

- `emptySuggestionsReason` (text): Why no times were suggested, when empty.
- `meetingTimeSuggestions` (list): Suggested slots, most confident first.

**Example output**

```json
{
  "meetingTimeSuggestions": [
    {
      "confidence": 100.0,
      "meetingTimeSlot": {
        "end": {
          "dateTime": "2026-09-23T15:30:00.0000000",
          "timeZone": "UTC"
        },
        "start": {
          "dateTime": "2026-09-23T15:00:00.0000000",
          "timeZone": "UTC"
        }
      },
      "organizerAvailability": "free"
    }
  ]
}
```

### Forward event

Forward a meeting invitation to additional recipients.

**Inputs**

- Mailbox (`mailbox`, text, required): The mailbox to act on: a user's email address (userPrincipalName) or Microsoft user ID. App-only access has no signed-in user, so the mailbox must be named explicitly. It has to be a mailbox in the same Microsoft 365 tenant the app registration was consented in -- an outside address such as a personal Gmail or outlook.com account is not reachable this way. The picker is populated from the directory when the app has the optional User.Read.All permission; otherwise type the address.
- Event ID (`event_id`, text, required): The ID of the calendar event.
- To (`to`, text, required): Comma-separated list of recipient email addresses.
- Comment (`comment`, text): Optional message to include.

**Outputs**

- `status` (text): Operation status.

**Example output**

```json
{
  "event_id": "AAMkAGViNDU3ZDI4LTZmNzMt",
  "status": "forwarded"
}
```

### Forward message

Forward a message to one or more new recipients. Success means Exchange accepted the message, not that it was delivered: a delivery failure arrives later as a bounce in the sender's inbox, and List message traces shows what happened.

**Inputs**

- Mailbox (`mailbox`, text, required): The mailbox to act on: a user's email address (userPrincipalName) or Microsoft user ID. App-only access has no signed-in user, so the mailbox must be named explicitly. It has to be a mailbox in the same Microsoft 365 tenant the app registration was consented in -- an outside address such as a personal Gmail or outlook.com account is not reachable this way. The picker is populated from the directory when the app has the optional User.Read.All permission; otherwise type the address.
- Message ID (`message_id`, text, required): The ID of the message.
- To (`to`, text, required): Comma-separated list of recipient email addresses.
- Comment (`comment`, text): Optional message to include.

**Outputs**

- `status` (text): Operation status.

**Example output**

```json
{
  "message_id": "AAMkAGI2NGVhZTIyLTAzYzUt",
  "status": "sent"
}
```

### Get attachment

Fetch one attachment, including its base64 content for file attachments. Item and reference attachments return metadata only.

**Inputs**

- Mailbox (`mailbox`, text, required): The mailbox to act on: a user's email address (userPrincipalName) or Microsoft user ID. App-only access has no signed-in user, so the mailbox must be named explicitly. It has to be a mailbox in the same Microsoft 365 tenant the app registration was consented in -- an outside address such as a personal Gmail or outlook.com account is not reachable this way. The picker is populated from the directory when the app has the optional User.Read.All permission; otherwise type the address.
- Message ID (`message_id`, text, required): The ID of the message.
- Attachment ID (`attachment_id`, text, required): The ID of the attachment, from List attachments.

**Outputs**

- `attachment_type` (text): fileAttachment, itemAttachment or referenceAttachment.
- `content_bytes` (text): Base64 content, for file attachments only.
- `content_type` (text): MIME type.
- `id` (text): Attachment ID.
- `is_inline` (true/false): Inline flag.
- `name` (text): File name.
- `size` (number): Size in bytes.

**Example output**

```json
{
  "attachment_type": "fileAttachment",
  "content_bytes": "JVBERi0xLjQKJeLjz9MK",
  "content_type": "application/pdf",
  "id": "AAMkAGI2TG93AAA=",
  "is_inline": false,
  "name": "q3-notes.pdf",
  "size": 84213
}
```

### Get contact

Read a single contact.

**Inputs**

- Mailbox (`mailbox`, text, required): The mailbox to act on: a user's email address (userPrincipalName) or Microsoft user ID. App-only access has no signed-in user, so the mailbox must be named explicitly. It has to be a mailbox in the same Microsoft 365 tenant the app registration was consented in -- an outside address such as a personal Gmail or outlook.com account is not reachable this way. The picker is populated from the directory when the app has the optional User.Read.All permission; otherwise type the address.
- Contact ID (`contact_id`, text, required): The ID of the contact.

**Outputs**

- `businessPhones` (list): Business phone numbers.
- `companyName` (text): Company name.
- `displayName` (text): Contact display name.
- `emailAddresses` (list): Email addresses.
- `id` (text): Contact ID.
- `jobTitle` (text): Job title.

**Example output**

```json
{
  "businessPhones": [
    "+1 425 555 0109"
  ],
  "companyName": "Contoso",
  "displayName": "Dana Swope",
  "emailAddresses": [
    {
      "address": "danas@contoso.com",
      "name": "Dana Swope"
    }
  ],
  "id": "AAMkAGE1Mjc1YmUwLTIzZjQt",
  "jobTitle": "Operations Lead"
}
```

### Get event

Read a single calendar event.

**Inputs**

- Mailbox (`mailbox`, text, required): The mailbox to act on: a user's email address (userPrincipalName) or Microsoft user ID. App-only access has no signed-in user, so the mailbox must be named explicitly. It has to be a mailbox in the same Microsoft 365 tenant the app registration was consented in -- an outside address such as a personal Gmail or outlook.com account is not reachable this way. The picker is populated from the directory when the app has the optional User.Read.All permission; otherwise type the address.
- Event ID (`event_id`, text, required): The ID of the calendar event.
- Time zone (`time_zone`, text): Time zone for the supplied times, in Windows or IANA format, for example 'Pacific Standard Time' or 'America/Los_Angeles'. Defaults to UTC.

**Outputs**

- `attendees` (list): Attendee list.
- `end` (object): End dateTimeTimeZone.
- `id` (text): Event ID.
- `location` (object): Event location.
- `onlineMeeting` (object): Join information.
- `start` (object): Start dateTimeTimeZone.
- `subject` (text): Event subject.
- `webLink` (text): Open in Outlook on the web.

**Example output**

```json
{
  "attendees": [
    {
      "emailAddress": {
        "address": "alexw@contoso.com",
        "name": "Alex Wilbur"
      },
      "type": "required"
    }
  ],
  "end": {
    "dateTime": "2026-09-22T16:00:00.0000000",
    "timeZone": "UTC"
  },
  "id": "AAMkAGViNDU3ZDI4LTZmNzMt",
  "location": {
    "displayName": "Conference room 3"
  },
  "onlineMeeting": {
    "joinUrl": "https://teams.microsoft.com/l/meetup-join/19%3a..."
  },
  "start": {
    "dateTime": "2026-09-22T15:00:00.0000000",
    "timeZone": "UTC"
  },
  "subject": "Q3 planning",
  "webLink": "https://outlook.office365.com/calendar/item/AAMkAGViNDU3ZDI4"
}
```

### Get free/busy schedule

Get free/busy availability for a set of users, distribution lists or room resources over a time range.

**Inputs**

- Mailbox (`mailbox`, text, required): The mailbox to act on: a user's email address (userPrincipalName) or Microsoft user ID. App-only access has no signed-in user, so the mailbox must be named explicitly. It has to be a mailbox in the same Microsoft 365 tenant the app registration was consented in -- an outside address such as a personal Gmail or outlook.com account is not reachable this way. The picker is populated from the directory when the app has the optional User.Read.All permission; otherwise type the address.
- Schedules (`schedules`, list, required): Addresses to check availability for.
- Start date time (`start_date_time`, date and time, required): Start of the window to check.
- End date time (`end_date_time`, date and time, required): End of the window to check.
- Time zone (`time_zone`, text): Time zone for the supplied times, in Windows or IANA format, for example 'Pacific Standard Time' or 'America/Los_Angeles'. Defaults to UTC.
- Availability view interval (`availability_view_interval`, number): Size of each availability slot, in minutes. From 5 to 1440. Default: `30`.

**Outputs**

- `count` (number): Number returned.
- `schedules` (list): Availability per requested address.

**Example output**

```json
{
  "count": 1,
  "schedules": [
    {
      "availabilityView": "000022000000",
      "scheduleId": "alexw@contoso.com",
      "scheduleItems": [
        {
          "end": {
            "dateTime": "2026-09-22T16:00:00.0000000",
            "timeZone": "UTC"
          },
          "start": {
            "dateTime": "2026-09-22T15:00:00.0000000",
            "timeZone": "UTC"
          },
          "status": "busy",
          "subject": "Q3 planning"
        }
      ]
    }
  ]
}
```

### Get mail tips

Check recipients before sending: whether they have an out-of-office reply on, a full mailbox, or a message size limit.

**Inputs**

- Mailbox (`mailbox`, text, required): The mailbox to act on: a user's email address (userPrincipalName) or Microsoft user ID. App-only access has no signed-in user, so the mailbox must be named explicitly. It has to be a mailbox in the same Microsoft 365 tenant the app registration was consented in -- an outside address such as a personal Gmail or outlook.com account is not reachable this way. The picker is populated from the directory when the app has the optional User.Read.All permission; otherwise type the address.
- Email addresses (`email_addresses`, list, required): Recipient addresses to check.
- Mail tips options (`mail_tips_options`, list): Which tips to request. Defaults to automatic replies and mailbox full status. One or more of: `automaticReplies` (Automatic replies), `mailboxFullStatus` (Mailbox full), `maxMessageSize` (Max message size), `deliveryRestriction` (Delivery restriction), `recipientScope` (Recipient scope), `moderationStatus` (Moderation status), `totalMemberCount` (Total members), `externalMemberCount` (External members), `customMailTip` (Custom mail tip).

**Outputs**

- `count` (number): Number returned.
- `mail_tips` (list): One entry per requested address.

**Example output**

```json
{
  "count": 1,
  "mail_tips": [
    {
      "automaticReplies": {
        "message": "I am on vacation right now."
      },
      "emailAddress": {
        "address": "danas@contoso.com",
        "name": ""
      },
      "mailboxFull": false
    }
  ]
}
```

### Get mailbox settings

Read a mailbox's settings: automatic replies, time zone, language, date and time format, and working hours.

**Inputs**

- Mailbox (`mailbox`, text, required): The mailbox to act on: a user's email address (userPrincipalName) or Microsoft user ID. App-only access has no signed-in user, so the mailbox must be named explicitly. It has to be a mailbox in the same Microsoft 365 tenant the app registration was consented in -- an outside address such as a personal Gmail or outlook.com account is not reachable this way. The picker is populated from the directory when the app has the optional User.Read.All permission; otherwise type the address.

**Outputs**

- `automaticRepliesSetting` (object): Out-of-office configuration.
- `language` (object): Locale information.
- `timeZone` (text): Mailbox time zone.
- `workingHours` (object): Working days and hours.

**Example output**

```json
{
  "automaticRepliesSetting": {
    "externalAudience": "none",
    "status": "disabled"
  },
  "language": {
    "displayName": "English (United States)",
    "locale": "en-US"
  },
  "timeZone": "Pacific Standard Time",
  "workingHours": {
    "daysOfWeek": [
      "monday",
      "tuesday",
      "wednesday",
      "thursday",
      "friday"
    ],
    "endTime": "17:00:00.0000000",
    "startTime": "09:00:00.0000000"
  }
}
```

### Get message

Read a single message including its full body.

**Inputs**

- Mailbox (`mailbox`, text, required): The mailbox to act on: a user's email address (userPrincipalName) or Microsoft user ID. App-only access has no signed-in user, so the mailbox must be named explicitly. It has to be a mailbox in the same Microsoft 365 tenant the app registration was consented in -- an outside address such as a personal Gmail or outlook.com account is not reachable this way. The picker is populated from the directory when the app has the optional User.Read.All permission; otherwise type the address.
- Message ID (`message_id`, text, required): The ID of the message.
- Body format (`body_format`, text): Convert the body to this format. Leave blank to keep the stored format. One of: `text` (Plain text), `html`.

**Outputs**

- `bodyPreview` (text): First 255 characters.
- `from` (object): Sender recipient object.
- `hasAttachments` (true/false): Attachment present.
- `id` (text): Message ID.
- `isRead` (true/false): Whether it has been read.
- `receivedDateTime` (text): ISO 8601 timestamp.
- `subject` (text): Message subject.
- `webLink` (text): Open in Outlook on the web.

**Example output**

```json
{
  "bodyPreview": "Here are the notes from this morning's planning session...",
  "from": {
    "emailAddress": {
      "address": "alexw@contoso.com",
      "name": "Alex Wilbur"
    }
  },
  "hasAttachments": true,
  "id": "AAMkAGI2NGVhZTIyLTAzYzUt",
  "isRead": false,
  "receivedDateTime": "2026-09-18T14:02:11Z",
  "subject": "Q3 planning notes",
  "webLink": "https://outlook.office365.com/owa/?ItemID=AAMkAGI2NGVhZTIy"
}
```

### Get message trace details

Get the per-hop delivery events for one traced message and recipient: where it was received, what was applied, and whether it was delivered. Needs the same permission and service principal as List message traces.

**Inputs**

- Message trace ID (`message_trace_id`, text, required): The trace ID, from List message traces.
- Recipient address (`recipient_address`, text, required): The recipient whose delivery path to show, from the trace's recipient address in List message traces.

**Outputs**

- `count` (number): Number returned.
- `events` (list): Delivery events in order.

**Example output**

```json
{
  "count": 2,
  "events": [
    {
      "action": "",
      "dateTime": "2026-09-17T10:30:05Z",
      "description": "Message received by: MN2PR00MB0670.namprd00.prod.outlook.com",
      "event": "Receive"
    },
    {
      "action": "",
      "dateTime": "2026-09-17T10:30:10Z",
      "description": "The message was successfully delivered.",
      "event": "Deliver"
    }
  ]
}
```

### List attachments

List the attachments on a message, without their content.

**Inputs**

- Mailbox (`mailbox`, text, required): The mailbox to act on: a user's email address (userPrincipalName) or Microsoft user ID. App-only access has no signed-in user, so the mailbox must be named explicitly. It has to be a mailbox in the same Microsoft 365 tenant the app registration was consented in -- an outside address such as a personal Gmail or outlook.com account is not reachable this way. The picker is populated from the directory when the app has the optional User.Read.All permission; otherwise type the address.
- Message ID (`message_id`, text, required): The ID of the message.

**Outputs**

- `attachments` (list): Attachment metadata.
- `count` (number): Number returned.

**Example output**

```json
{
  "attachments": [
    {
      "contentType": "application/pdf",
      "id": "AAMkAGI2TG93AAA=",
      "isInline": false,
      "name": "q3-notes.pdf",
      "size": 84213
    }
  ],
  "count": 1
}
```

### List calendars

List the calendars in a mailbox.

**Inputs**

- Mailbox (`mailbox`, text, required): The mailbox to act on: a user's email address (userPrincipalName) or Microsoft user ID. App-only access has no signed-in user, so the mailbox must be named explicitly. It has to be a mailbox in the same Microsoft 365 tenant the app registration was consented in -- an outside address such as a personal Gmail or outlook.com account is not reachable this way. The picker is populated from the directory when the app has the optional User.Read.All permission; otherwise type the address.
- Limit (`limit`, number): Maximum number of results to return (1-500). From 1 to 500. Default: `25`.

**Outputs**

- `calendars` (list): The mailbox's calendars.
- `count` (number): Number returned.

**Example output**

```json
{
  "calendars": [
    {
      "canEdit": true,
      "id": "AAMkAGViNDU3AAAuAAA=",
      "isDefaultCalendar": true,
      "name": "Calendar"
    }
  ],
  "count": 1
}
```

### List categories

List the categories defined in a mailbox's master list.

**Inputs**

- Mailbox (`mailbox`, text, required): The mailbox to act on: a user's email address (userPrincipalName) or Microsoft user ID. App-only access has no signed-in user, so the mailbox must be named explicitly. It has to be a mailbox in the same Microsoft 365 tenant the app registration was consented in -- an outside address such as a personal Gmail or outlook.com account is not reachable this way. The picker is populated from the directory when the app has the optional User.Read.All permission; otherwise type the address.

**Outputs**

- `categories` (list): The mailbox's categories.
- `count` (number): Number returned.

**Example output**

```json
{
  "categories": [
    {
      "color": "preset0",
      "displayName": "Needs follow-up",
      "id": "5a9a6aa8-b65f-4357-b1f9-60c6bf6330d8"
    }
  ],
  "count": 1
}
```

### List contact folders

List the contact folders in a mailbox.

**Inputs**

- Mailbox (`mailbox`, text, required): The mailbox to act on: a user's email address (userPrincipalName) or Microsoft user ID. App-only access has no signed-in user, so the mailbox must be named explicitly. It has to be a mailbox in the same Microsoft 365 tenant the app registration was consented in -- an outside address such as a personal Gmail or outlook.com account is not reachable this way. The picker is populated from the directory when the app has the optional User.Read.All permission; otherwise type the address.
- Limit (`limit`, number): Maximum number of results to return (1-500). From 1 to 500. Default: `25`.

**Outputs**

- `count` (number): Number returned.
- `folders` (list): The contact folders.

**Example output**

```json
{
  "count": 1,
  "folders": [
    {
      "displayName": "Suppliers",
      "id": "AAMkAGE1Mjc1AAAuAAA="
    }
  ]
}
```

### List contacts

List a mailbox's contacts, optionally within one contact folder or matching a search or filter.

**Inputs**

- Mailbox (`mailbox`, text, required): The mailbox to act on: a user's email address (userPrincipalName) or Microsoft user ID. App-only access has no signed-in user, so the mailbox must be named explicitly. It has to be a mailbox in the same Microsoft 365 tenant the app registration was consented in -- an outside address such as a personal Gmail or outlook.com account is not reachable this way. The picker is populated from the directory when the app has the optional User.Read.All permission; otherwise type the address.
- Folder ID (`folder_id`, text): Contact folder to read. Leave blank for the default Contacts folder.
- Search (`search`, text): Free-text search across the contact. Microsoft Graph cannot combine a search with a filter.
- Filter query (`filter_query`, text): OData $filter expression, for example "companyName eq 'Contoso'". With a filter, the limit applies before the results are sorted by name, so you get the first matches Exchange returns, sorted, rather than the alphabetically first matches.
- Limit (`limit`, number): Maximum number of results to return (1-500). From 1 to 500. Default: `25`.

**Outputs**

- `contacts` (list): The matching contacts.
- `count` (number): Number returned.

**Example output**

```json
{
  "contacts": [
    {
      "businessPhones": [
        "+1 425 555 0109"
      ],
      "companyName": "Contoso",
      "displayName": "Dana Swope",
      "emailAddresses": [
        {
          "address": "danas@contoso.com",
          "name": "Dana Swope"
        }
      ],
      "id": "AAMkAGE1Mjc1YmUwLTIzZjQt",
      "jobTitle": "Operations Lead"
    }
  ],
  "count": 1
}
```

### List events

List calendar events. Supplying a start and end returns the calendar view, which expands recurring series into individual occurrences; without a range, a recurring series appears once as its master.

**Inputs**

- Mailbox (`mailbox`, text, required): The mailbox to act on: a user's email address (userPrincipalName) or Microsoft user ID. App-only access has no signed-in user, so the mailbox must be named explicitly. It has to be a mailbox in the same Microsoft 365 tenant the app registration was consented in -- an outside address such as a personal Gmail or outlook.com account is not reachable this way. The picker is populated from the directory when the app has the optional User.Read.All permission; otherwise type the address.
- Calendar ID (`calendar_id`, text): Calendar to read. Leave blank for the default calendar.
- Start date time (`start_date_time`, date and time): Start of the time range. Must be paired with an end.
- End date time (`end_date_time`, date and time): End of the time range. Must be paired with a start.
- Time zone (`time_zone`, text): Time zone for the supplied times, in Windows or IANA format, for example 'Pacific Standard Time' or 'America/Los_Angeles'. Defaults to UTC.
- Filter query (`filter_query`, text): OData $filter expression, for example "isCancelled eq false".
- Limit (`limit`, number): Maximum number of results to return (1-500). From 1 to 500. Default: `25`.

**Outputs**

- `count` (number): Number returned.
- `events` (list): The matching events.

**Example output**

```json
{
  "count": 1,
  "events": [
    {
      "attendees": [
        {
          "emailAddress": {
            "address": "alexw@contoso.com",
            "name": "Alex Wilbur"
          },
          "type": "required"
        }
      ],
      "end": {
        "dateTime": "2026-09-22T16:00:00.0000000",
        "timeZone": "UTC"
      },
      "id": "AAMkAGViNDU3ZDI4LTZmNzMt",
      "location": {
        "displayName": "Conference room 3"
      },
      "onlineMeeting": {
        "joinUrl": "https://teams.microsoft.com/l/meetup-join/19%3a..."
      },
      "start": {
        "dateTime": "2026-09-22T15:00:00.0000000",
        "timeZone": "UTC"
      },
      "subject": "Q3 planning",
      "webLink": "https://outlook.office365.com/calendar/item/AAMkAGViNDU3ZDI4"
    }
  ]
}
```

### List Focused Inbox overrides

List the senders pinned to Focused or Other for this mailbox.

**Inputs**

- Mailbox (`mailbox`, text, required): The mailbox to act on: a user's email address (userPrincipalName) or Microsoft user ID. App-only access has no signed-in user, so the mailbox must be named explicitly. It has to be a mailbox in the same Microsoft 365 tenant the app registration was consented in -- an outside address such as a personal Gmail or outlook.com account is not reachable this way. The picker is populated from the directory when the app has the optional User.Read.All permission; otherwise type the address.

**Outputs**

- `count` (number): Number returned.
- `overrides` (list): The mailbox's overrides.

**Example output**

```json
{
  "count": 1,
  "overrides": [
    {
      "classifyAs": "focused",
      "id": "98f5bdef-576a-404d-a2ea-07a3cf11a9b9",
      "senderEmailAddress": {
        "address": "samanthab@contoso.com",
        "name": "Samantha Booth"
      }
    }
  ]
}
```

### List inbox rules

List the inbox rules defined for a mailbox.

**Inputs**

- Mailbox (`mailbox`, text, required): The mailbox to act on: a user's email address (userPrincipalName) or Microsoft user ID. App-only access has no signed-in user, so the mailbox must be named explicitly. It has to be a mailbox in the same Microsoft 365 tenant the app registration was consented in -- an outside address such as a personal Gmail or outlook.com account is not reachable this way. The picker is populated from the directory when the app has the optional User.Read.All permission; otherwise type the address.

**Outputs**

- `count` (number): Number returned.
- `rules` (list): The inbox rules.

**Example output**

```json
{
  "count": 1,
  "rules": [
    {
      "actions": {
        "moveToFolder": "AAMkAGI2AAAAAEMkAAB="
      },
      "conditions": {
        "subjectContains": [
          "invoice"
        ]
      },
      "displayName": "Invoices to Finance",
      "id": "AQAAAJ5dZqA=",
      "isEnabled": true,
      "sequence": 1
    }
  ]
}
```

### List mail folders

List a mailbox's mail folders, or the child folders of one folder.

**Inputs**

- Mailbox (`mailbox`, text, required): The mailbox to act on: a user's email address (userPrincipalName) or Microsoft user ID. App-only access has no signed-in user, so the mailbox must be named explicitly. It has to be a mailbox in the same Microsoft 365 tenant the app registration was consented in -- an outside address such as a personal Gmail or outlook.com account is not reachable this way. The picker is populated from the directory when the app has the optional User.Read.All permission; otherwise type the address.
- Parent folder ID (`parent_folder_id`, text): List the children of this folder instead of the top level. Leave blank for top-level folders.
- Include hidden (`include_hidden`, true/false): Include folders marked hidden. Default: `false`.
- Limit (`limit`, number): Maximum number of results to return (1-500). From 1 to 500. Default: `25`.

**Outputs**

- `count` (number): Number returned.
- `folders` (list): The mail folders.

**Example output**

```json
{
  "count": 1,
  "folders": [
    {
      "displayName": "Inbox",
      "id": "AAMkAGI2AAAAAEMkAAA=",
      "totalItemCount": 412,
      "unreadItemCount": 7
    }
  ]
}
```

### List message traces

Trace what Exchange Online did with messages: delivered, failed, quarantined or filtered as spam. Tenant-wide rather than per-mailbox. Requires the optional ExchangeMessageTrace.Read.All permission and a service principal an administrator must provision. Throttled to 100 requests per 5 minutes, and available only in the global service. A newly sent message can take a few minutes to appear. For up to several hours after the service principal is created, calls can fail with service principal not found while it propagates.

**Inputs**

- Sender address (`sender_address`, text): Only messages from this address.
- Recipient address (`recipient_address`, text): Only messages to this address.
- Subject contains (`subject_contains`, text): Only messages whose subject contains this text.
- Status (`status`, text): Only messages with this delivery status. One of: `delivered`, `pending`, `failed`, `quarantined`, `filteredAsSpam` (Filtered as spam), `expanded`, `gettingStatus` (Getting status).
- Start date time (`start_date_time`, date and time): Start of the window. Must be paired with an end, span at most 10 days, and start no more than 90 days ago.
- End date time (`end_date_time`, date and time): End of the window. Must be paired with a start.
- Limit (`limit`, number): Maximum number of results to return (1-500). From 1 to 500. Default: `25`.

**Outputs**

- `count` (number): Number returned.
- `traces` (list): The matching message traces.

**Example output**

```json
{
  "count": 1,
  "traces": [
    {
      "id": "4451a062-48cb-e80d-e8c0-196330437ae6",
      "receivedDateTime": "2026-09-17T10:30:00Z",
      "recipientAddress": "danas@contoso.com",
      "senderAddress": "alexw@contoso.com",
      "status": "delivered",
      "subject": "Quarterly Report"
    }
  ]
}
```

### List messages

List messages in a mailbox, optionally limited to one folder, to unread messages, or to a search or filter expression. Results come back newest first.

**Inputs**

- Mailbox (`mailbox`, text, required): The mailbox to act on: a user's email address (userPrincipalName) or Microsoft user ID. App-only access has no signed-in user, so the mailbox must be named explicitly. It has to be a mailbox in the same Microsoft 365 tenant the app registration was consented in -- an outside address such as a personal Gmail or outlook.com account is not reachable this way. The picker is populated from the directory when the app has the optional User.Read.All permission; otherwise type the address.
- Folder ID (`folder_id`, text): Folder to read from. Accepts a folder ID or a well-known name: inbox, drafts, sentitems, deleteditems, junkemail or archive. Leave blank to search the whole mailbox.
- Search (`search`, text): Free-text search across the message. Microsoft Graph cannot combine a search with a filter or with 'unread only'.
- Filter query (`filter_query`, text): OData $filter expression, for example "importance eq 'high'". Results are still sorted newest first, so the filter needs no $orderby.
- Unread only (`unread_only`, true/false): Return only unread messages. Default: `false`.
- Limit (`limit`, number): Maximum number of results to return (1-500). From 1 to 500. Default: `25`.

**Outputs**

- `count` (number): Number of messages returned.
- `messages` (list): The matching messages.

**Example output**

```json
{
  "count": 1,
  "messages": [
    {
      "bodyPreview": "Here are the notes from this morning's planning session...",
      "from": {
        "emailAddress": {
          "address": "alexw@contoso.com",
          "name": "Alex Wilbur"
        }
      },
      "hasAttachments": true,
      "id": "AAMkAGI2NGVhZTIyLTAzYzUt",
      "isRead": false,
      "receivedDateTime": "2026-09-18T14:02:11Z",
      "subject": "Q3 planning notes",
      "webLink": "https://outlook.office365.com/owa/?ItemID=AAMkAGI2NGVhZTIy"
    }
  ]
}
```

### List room lists

List the room lists (building or floor groupings) defined in the tenant. Requires the optional Place.Read.All application permission.

**Inputs**

- Limit (`limit`, number): Maximum number of results to return (1-500). From 1 to 500. Default: `25`.

**Outputs**

- `count` (number): Number returned.
- `room_lists` (list): The tenant's room lists.

**Example output**

```json
{
  "count": 1,
  "room_lists": [
    {
      "displayName": "Building 2 rooms",
      "emailAddress": "building2rooms@contoso.com",
      "id": "3162F1E1-C4C0-604B-51D8-91DA78989EB1"
    }
  ]
}
```

### List rooms

List bookable meeting rooms, tenant-wide or within one room list. Requires the optional Place.Read.All application permission. A room is a mailbox, so pair this with Get free/busy schedule to check availability and Create event to book one.

**Inputs**

- Room list (`room_list`, text): SMTP address of a room list to search within. Leave blank for every room in the tenant.
- Limit (`limit`, number): Maximum number of results to return (1-500). From 1 to 500. Default: `25`.

**Outputs**

- `count` (number): Number returned.
- `rooms` (list): The matching rooms.

**Example output**

```json
{
  "count": 1,
  "rooms": [
    {
      "building": "Building 2",
      "capacity": 8,
      "displayName": "Conf Room Rainier",
      "emailAddress": "rainier@contoso.com",
      "floorNumber": 3,
      "id": "3162F1E1-C4C0-604B-51D8-91DA78989EB2"
    }
  ]
}
```

### List users

List the mailboxes in the tenant. Requires the optional User.Read.All application permission; it is also what populates the mailbox picker on every other action.

**Inputs**

- Search (`search`, text): Match against display name. Cannot be combined with a filter.
- Filter query (`filter_query`, text): OData $filter expression, for example "department eq 'Finance'".
- Limit (`limit`, number): Maximum number of results to return (1-500). From 1 to 500. Default: `25`.

**Outputs**

- `count` (number): Number returned.
- `users` (list): The matching users.

**Example output**

```json
{
  "count": 1,
  "users": [
    {
      "department": "Operations",
      "displayName": "Alex Wilbur",
      "id": "8ae6f565-0d7f-4ead-853e-7db94c912a1f",
      "jobTitle": "Operations Lead",
      "mail": "alexw@contoso.com",
      "userPrincipalName": "alexw@contoso.com"
    }
  ]
}
```

### Move message

Move a message to another folder. Microsoft Graph assigns the moved copy a new ID, which is returned.

**Inputs**

- Mailbox (`mailbox`, text, required): The mailbox to act on: a user's email address (userPrincipalName) or Microsoft user ID. App-only access has no signed-in user, so the mailbox must be named explicitly. It has to be a mailbox in the same Microsoft 365 tenant the app registration was consented in -- an outside address such as a personal Gmail or outlook.com account is not reachable this way. The picker is populated from the directory when the app has the optional User.Read.All permission; otherwise type the address.
- Message ID (`message_id`, text, required): The ID of the message.
- Destination folder ID (`destination_folder_id`, text, required): Destination folder. Accepts a folder ID or a well-known name: inbox, drafts, sentitems, deleteditems, junkemail or archive.

**Outputs**

- `bodyPreview` (text): First 255 characters.
- `from` (object): Sender recipient object.
- `hasAttachments` (true/false): Attachment present.
- `id` (text): Message ID.
- `isRead` (true/false): Whether it has been read.
- `receivedDateTime` (text): ISO 8601 timestamp.
- `subject` (text): Message subject.
- `webLink` (text): Open in Outlook on the web.

**Example output**

```json
{
  "bodyPreview": "Here are the notes from this morning's planning session...",
  "from": {
    "emailAddress": {
      "address": "alexw@contoso.com",
      "name": "Alex Wilbur"
    }
  },
  "hasAttachments": true,
  "id": "AAMkAGI2NGVhZTIyLTAzYzUt",
  "isRead": false,
  "receivedDateTime": "2026-09-18T14:02:11Z",
  "subject": "Q3 planning notes",
  "webLink": "https://outlook.office365.com/owa/?ItemID=AAMkAGI2NGVhZTIy"
}
```

### Reply all to message

Reply to every recipient of a message. Success means Exchange accepted the message, not that it was delivered: a delivery failure arrives later as a bounce in the sender's inbox, and List message traces shows what happened.

**Inputs**

- Mailbox (`mailbox`, text, required): The mailbox to act on: a user's email address (userPrincipalName) or Microsoft user ID. App-only access has no signed-in user, so the mailbox must be named explicitly. It has to be a mailbox in the same Microsoft 365 tenant the app registration was consented in -- an outside address such as a personal Gmail or outlook.com account is not reachable this way. The picker is populated from the directory when the app has the optional User.Read.All permission; otherwise type the address.
- Message ID (`message_id`, text, required): The ID of the message.
- Comment (`comment`, text): Plain text to add above the quoted message.
- HTML body (`html_body`, text): Formatted (HTML) version of the body. If provided, it is used instead of the plain text body.

**Outputs**

- `status` (text): Operation status.

**Example output**

```json
{
  "message_id": "AAMkAGI2NGVhZTIyLTAzYzUt",
  "status": "sent"
}
```

### Reply to message

Reply to the sender of a message. The reply is saved in Sent Items. Success means Exchange accepted the message, not that it was delivered: a delivery failure arrives later as a bounce in the sender's inbox, and List message traces shows what happened.

**Inputs**

- Mailbox (`mailbox`, text, required): The mailbox to act on: a user's email address (userPrincipalName) or Microsoft user ID. App-only access has no signed-in user, so the mailbox must be named explicitly. It has to be a mailbox in the same Microsoft 365 tenant the app registration was consented in -- an outside address such as a personal Gmail or outlook.com account is not reachable this way. The picker is populated from the directory when the app has the optional User.Read.All permission; otherwise type the address.
- Message ID (`message_id`, text, required): The ID of the message.
- Comment (`comment`, text): Plain text to add above the quoted message.
- HTML body (`html_body`, text): Formatted (HTML) version of the body. If provided, it is used instead of the plain text body.

**Outputs**

- `status` (text): Operation status.

**Example output**

```json
{
  "message_id": "AAMkAGI2NGVhZTIyLTAzYzUt",
  "status": "sent"
}
```

### Respond to event

Accept, tentatively accept, or decline a meeting invitation as the invitee. The mailbox is the invitee's, and the event ID must come from their own calendar (List events on that mailbox); the organiser's ID for the same meeting will not work. A cancelled meeting cannot be responded to.

**Inputs**

- Mailbox (`mailbox`, text, required): The mailbox to act on: a user's email address (userPrincipalName) or Microsoft user ID. App-only access has no signed-in user, so the mailbox must be named explicitly. It has to be a mailbox in the same Microsoft 365 tenant the app registration was consented in -- an outside address such as a personal Gmail or outlook.com account is not reachable this way. The picker is populated from the directory when the app has the optional User.Read.All permission; otherwise type the address.
- Event ID (`event_id`, text, required): The ID of the calendar event.
- Response (`response`, text, required): How to respond to the invitation. One of: `accept`, `tentativelyAccept` (Tentative), `decline`.
- Comment (`comment`, text): Optional message to include.
- Send response (`send_response`, true/false): Send the reply to the organiser. Default: `true`.

**Outputs**

- `status` (text): Operation status.

**Example output**

```json
{
  "event_id": "AAMkAGViNDU3ZDI4LTZmNzMt",
  "status": "accept"
}
```

### Send draft

Send a draft that was created earlier. The sent message gets a new ID in Sent Items, so the draft's ID stops working. Success means Exchange accepted the message, not that it was delivered: a delivery failure arrives later as a bounce in the sender's inbox, and List message traces shows what happened.

**Inputs**

- Mailbox (`mailbox`, text, required): The mailbox to act on: a user's email address (userPrincipalName) or Microsoft user ID. App-only access has no signed-in user, so the mailbox must be named explicitly. It has to be a mailbox in the same Microsoft 365 tenant the app registration was consented in -- an outside address such as a personal Gmail or outlook.com account is not reachable this way. The picker is populated from the directory when the app has the optional User.Read.All permission; otherwise type the address.
- Message ID (`message_id`, text, required): The ID of the message.

**Outputs**

- `status` (text): Operation status.

**Example output**

```json
{
  "message_id": "AAMkAGI2NGVhZTIyLTAzYzUt",
  "status": "sent"
}
```

### Send email

Send an email through Microsoft Outlook. Success means Exchange accepted the message, not that it was delivered: a delivery failure arrives later as a bounce in the sender's inbox, and List message traces shows what happened.

**Inputs**

- Sender (`sender`, text, required): The sender's email address or Microsoft sign-in name. Like the mailbox on other actions, it has to be a mailbox in the Microsoft 365 tenant the app was consented in.
- To (`to`, text, required): Comma-separated list of recipient email addresses.
- Subject (`subject`, text, required): Subject of the email.
- Body (`body`, text, required): Plain text body content of the email.
- HTML body (`html_body`, text): Formatted (HTML) version of the email body. If provided, it is used instead of the plain text body.
- Attachments (`attachments`, list): Files to attach. Upload a file or reference a document (or list of documents) from an earlier step. Microsoft Graph limits an attachment sent in a single request to under 3 MB; for a larger file, create a draft and use Add large attachment.
- CC (`cc`, text): Comma-separated list of Cc recipients.
- BCC (`bcc`, text): Comma-separated list of Bcc recipients.
- Reply to (`reply_to`, text): Comma-separated addresses that replies should go to.
- Importance (`importance`, text): Importance of the item. One of: `low`, `normal`, `high`.
- Save to sent items (`save_to_sent_items`, true/false): Save a copy in the sender's Sent Items folder. Default: `true`.

**Outputs**

- `status` (text): Send status.

**Example output**

```json
{
  "status": "success"
}
```

### Set automatic replies

Turn out-of-office automatic replies on, off, or on for a scheduled date range.

**Inputs**

- Mailbox (`mailbox`, text, required): The mailbox to act on: a user's email address (userPrincipalName) or Microsoft user ID. App-only access has no signed-in user, so the mailbox must be named explicitly. It has to be a mailbox in the same Microsoft 365 tenant the app registration was consented in -- an outside address such as a personal Gmail or outlook.com account is not reachable this way. The picker is populated from the directory when the app has the optional User.Read.All permission; otherwise type the address.
- Status (`status`, text, required): Whether automatic replies are off, always on, or scheduled. One of: `disabled` (Off), `alwaysEnabled` (Always on), `scheduled`.
- Internal reply message (`internal_reply_message`, text): Reply sent to people inside the organisation.
- External reply message (`external_reply_message`, text): Reply sent to people outside the organisation.
- External audience (`external_audience`, text): Who outside the organisation receives a reply. One of: `none` (Nobody), `contactsOnly` (Contacts only), `all` (Everyone).
- Scheduled start (`scheduled_start`, date and time): Start of the scheduled window. Required when status is 'scheduled'.
- Scheduled end (`scheduled_end`, date and time): End of the scheduled window. Required when status is 'scheduled'.
- Time zone (`time_zone`, text): Time zone for the supplied times, in Windows or IANA format, for example 'Pacific Standard Time' or 'America/Los_Angeles'. Defaults to UTC.

**Outputs**

- `automaticRepliesSetting` (object): The updated out-of-office configuration.

**Example output**

```json
{
  "automaticRepliesSetting": {
    "externalAudience": "all",
    "externalReplyMessage": "I am out of the office until Monday.",
    "internalReplyMessage": "I am out of the office until Monday.",
    "scheduledEndDateTime": {
      "dateTime": "2026-09-28T17:00:00.0000000",
      "timeZone": "UTC"
    },
    "scheduledStartDateTime": {
      "dateTime": "2026-09-21T09:00:00.0000000",
      "timeZone": "UTC"
    },
    "status": "scheduled"
  }
}
```

### Set Focused Inbox override

Always classify a sender's mail as Focused or as Other for this mailbox.

**Inputs**

- Mailbox (`mailbox`, text, required): The mailbox to act on: a user's email address (userPrincipalName) or Microsoft user ID. App-only access has no signed-in user, so the mailbox must be named explicitly. It has to be a mailbox in the same Microsoft 365 tenant the app registration was consented in -- an outside address such as a personal Gmail or outlook.com account is not reachable this way. The picker is populated from the directory when the app has the optional User.Read.All permission; otherwise type the address.
- Sender address (`sender_address`, text, required): The sender the override applies to.
- Classify as (`classify_as`, text, required): Where this sender's mail should land. One of: `focused`, `other`.
- Sender name (`sender_name`, text): Display name for the sender. Optional.

**Outputs**

- `classifyAs` (text): focused or other.
- `id` (text): Override ID.
- `senderEmailAddress` (object): The sender the rule applies to.

**Example output**

```json
{
  "classifyAs": "focused",
  "id": "98f5bdef-576a-404d-a2ea-07a3cf11a9b9",
  "senderEmailAddress": {
    "address": "samanthab@contoso.com",
    "name": "Samantha Booth"
  }
}
```

### Update contact

Update a contact. Only the fields you supply change.

**Inputs**

- Mailbox (`mailbox`, text, required): The mailbox to act on: a user's email address (userPrincipalName) or Microsoft user ID. App-only access has no signed-in user, so the mailbox must be named explicitly. It has to be a mailbox in the same Microsoft 365 tenant the app registration was consented in -- an outside address such as a personal Gmail or outlook.com account is not reachable this way. The picker is populated from the directory when the app has the optional User.Read.All permission; otherwise type the address.
- Contact ID (`contact_id`, text, required): The ID of the contact.
- Given name (`given_name`, text): First name.
- Surname (`surname`, text): Last name.
- Display name (`display_name`, text): Name the contact is shown under. Include it whenever you update other fields, or Outlook may regenerate it.
- Email addresses (`email_addresses`, list): Replaces the contact's email addresses.
- Business phones (`business_phones`, list): Replaces the contact's business phone numbers.
- Mobile phone (`mobile_phone`, text): Mobile phone number.
- Job title (`job_title`, text): Job title.
- Company name (`company_name`, text): Company name.
- Department (`department`, text): Department.
- Office location (`office_location`, text): Office location.
- Personal notes (`personal_notes`, text): Free-text notes about the contact.
- Categories (`categories`, list): Categories to assign. Each must already exist in the mailbox's category list.

**Outputs**

- `businessPhones` (list): Business phone numbers.
- `companyName` (text): Company name.
- `displayName` (text): Contact display name.
- `emailAddresses` (list): Email addresses.
- `id` (text): Contact ID.
- `jobTitle` (text): Job title.

**Example output**

```json
{
  "businessPhones": [
    "+1 425 555 0109"
  ],
  "companyName": "Contoso",
  "displayName": "Dana Swope",
  "emailAddresses": [
    {
      "address": "danas@contoso.com",
      "name": "Dana Swope"
    }
  ],
  "id": "AAMkAGE1Mjc1YmUwLTIzZjQt",
  "jobTitle": "Operations Lead"
}
```

### Update event

Update a calendar event. Only the fields you supply change.

**Inputs**

- Mailbox (`mailbox`, text, required): The mailbox to act on: a user's email address (userPrincipalName) or Microsoft user ID. App-only access has no signed-in user, so the mailbox must be named explicitly. It has to be a mailbox in the same Microsoft 365 tenant the app registration was consented in -- an outside address such as a personal Gmail or outlook.com account is not reachable this way. The picker is populated from the directory when the app has the optional User.Read.All permission; otherwise type the address.
- Event ID (`event_id`, text, required): The ID of the calendar event.
- Subject (`subject`, text): New title for the event.
- Start date time (`start_date_time`, date and time): New start time.
- End date time (`end_date_time`, date and time): New end time.
- Time zone (`time_zone`, text): Time zone for the supplied times, in Windows or IANA format, for example 'Pacific Standard Time' or 'America/Los_Angeles'. Defaults to UTC.
- Body (`body`, text): New plain text description.
- HTML body (`html_body`, text): Formatted (HTML) version of the body. If provided, it is used instead of the plain text body.
- Location (`location`, text): New location.
- Attendees (`attendees`, text): Comma-separated attendee addresses. Replaces the whole attendee list.
- Is all day (`is_all_day`, true/false): Whether the event lasts all day.
- Show as (`show_as`, text): How the time appears to others. One of: `free`, `tentative`, `busy`, `oof` (Out of office), `workingElsewhere` (Working elsewhere).
- Importance (`importance`, text): Importance of the item. One of: `low`, `normal`, `high`.
- Categories (`categories`, list): Categories to assign. Each must already exist in the mailbox's category list.

**Outputs**

- `attendees` (list): Attendee list.
- `end` (object): End dateTimeTimeZone.
- `id` (text): Event ID.
- `location` (object): Event location.
- `onlineMeeting` (object): Join information.
- `start` (object): Start dateTimeTimeZone.
- `subject` (text): Event subject.
- `webLink` (text): Open in Outlook on the web.

**Example output**

```json
{
  "attendees": [
    {
      "emailAddress": {
        "address": "alexw@contoso.com",
        "name": "Alex Wilbur"
      },
      "type": "required"
    }
  ],
  "end": {
    "dateTime": "2026-09-22T16:00:00.0000000",
    "timeZone": "UTC"
  },
  "id": "AAMkAGViNDU3ZDI4LTZmNzMt",
  "location": {
    "displayName": "Conference room 3"
  },
  "onlineMeeting": {
    "joinUrl": "https://teams.microsoft.com/l/meetup-join/19%3a..."
  },
  "start": {
    "dateTime": "2026-09-22T15:00:00.0000000",
    "timeZone": "UTC"
  },
  "subject": "Q3 planning",
  "webLink": "https://outlook.office365.com/calendar/item/AAMkAGViNDU3ZDI4"
}
```

### Update message

Update a message: mark it read or unread, change its subject, importance, categories or follow-up flag.

**Inputs**

- Mailbox (`mailbox`, text, required): The mailbox to act on: a user's email address (userPrincipalName) or Microsoft user ID. App-only access has no signed-in user, so the mailbox must be named explicitly. It has to be a mailbox in the same Microsoft 365 tenant the app registration was consented in -- an outside address such as a personal Gmail or outlook.com account is not reachable this way. The picker is populated from the directory when the app has the optional User.Read.All permission; otherwise type the address.
- Message ID (`message_id`, text, required): The ID of the message.
- Is read (`is_read`, true/false): Mark the message as read (true) or unread (false).
- Subject (`subject`, text): New subject for the message.
- Importance (`importance`, text): Importance of the item. One of: `low`, `normal`, `high`.
- Categories (`categories`, list): Categories to assign. Each must already exist in the mailbox's category list.
- Flag status (`flag_status`, text): Follow-up flag state. One of: `notFlagged` (Not flagged), `flagged`, `complete`.

**Outputs**

- `bodyPreview` (text): First 255 characters.
- `from` (object): Sender recipient object.
- `hasAttachments` (true/false): Attachment present.
- `id` (text): Message ID.
- `isRead` (true/false): Whether it has been read.
- `receivedDateTime` (text): ISO 8601 timestamp.
- `subject` (text): Message subject.
- `webLink` (text): Open in Outlook on the web.

**Example output**

```json
{
  "bodyPreview": "Here are the notes from this morning's planning session...",
  "from": {
    "emailAddress": {
      "address": "alexw@contoso.com",
      "name": "Alex Wilbur"
    }
  },
  "hasAttachments": true,
  "id": "AAMkAGI2NGVhZTIyLTAzYzUt",
  "isRead": true,
  "receivedDateTime": "2026-09-18T14:02:11Z",
  "subject": "Q3 planning notes",
  "webLink": "https://outlook.office365.com/owa/?ItemID=AAMkAGI2NGVhZTIy"
}
```
