Microsoft Outlook lets you bring all your email accounts and calendars in one convenient spot.
26 actions Leo can use in the apps and agents it builds for you: 15 that read Microsoft Outlook Email data, 11 that create or update it.
Find (search, list, or count) email messages in a Microsoft Outlook mailbox via Microsoft Graph. By default a search or list request (countOnly = false) scans the WHOLE mailbox (all folders including Sent, Archive, etc.), matching what you see when searching in Outlook; a count-only request (countOnly = true) with no explicit folderScope stays inbox-scoped and counts ALL inbox messages by default, not just unread ones — also set isRead to false to count only unread messages (matching Outlook's unread inbox badge). Set folderScope explicitly to override this behavior for either mode. To search a shared mailbox, set userId (the mailbox owner's UPN or ID); add sharedFolderId to target a specific folder within it.
Retrieves mail folders from a shared or delegated mailbox (routes to /users/{userId}/mailFolders). Returns { count, folders } where folders contains each folder's id, displayName, parentFolderId, childFolderCount, totalItemCount, and unreadItemCount. The count field reflects the true API total when Microsoft Graph returns @odata.count; when Include Subfolders is true or Graph does not return @odata.count for the requested filter, count equals the number of folders actually retrieved. Use this action to resolve a shared mailbox folder display name to its ID — set Display Name to filter by exact name. Use Get Shared Folder instead when you already have the folder ID.
Get all the labels/categories that have been defined for a user.
Docs ↗Get the most important mail from the user's Inbox (messages with high importance or flagged status). Returns { count, data } where count is the true total matching message count reported by Microsoft Graph (@odata.count for the applied filter) and data is the array of retrieved messages (up to maxResults).
Retrieves mail folders for the authenticated user. Returns { count, folders } where folders contains each folder's id, displayName, parentFolderId, childFolderCount, totalItemCount, and unreadItemCount. The count field reflects the true API total when Microsoft Graph returns @odata.count (supported for top-level mailFolders queries); when Include Subfolders is true or Graph does not return @odata.count for the requested filter, count equals the number of folders actually retrieved. Use this action to resolve a folder display name to its ID — set Display Name to filter by exact name. Use Get Folder instead when you already have the folder ID.
Retrieves available options for the Folder IDs to Monitor field.
Get a contact collection from the default contacts folder. Returns { count, contacts } where count is the true total number of contacts in the collection as reported by Microsoft Graph (@odata.count), and contacts is the array of retrieved contact records (up to maxResults).
Retrieves available options for the Contact field.
Retrieve a single folder from a shared mailbox by its ID. Returns the folder's id, displayName, parentFolderId, childFolderCount, totalItemCount, and unreadItemCount. If you only have a display name and need the ID, use List Shared Folders first.
Fetch a single email message by its Microsoft Graph message ID, including full body and optional attachments. Use Find Email first to search for messages and obtain a message id; then call this tool to retrieve the full content. Set includeAttachments: true to expand attachment metadata — the id field of each attachment is required by Download Attachment. Example: after find-email(search="Eval-Festivus") returns a message with id: "AAMk...", call get-message(messageId="AAMk...", includeAttachments=true) to get the body text and attachment list.
Retrieve a single mail folder by its ID. Returns the folder's id, displayName, parentFolderId, childFolderCount, totalItemCount, and unreadItemCount. If you only have a display name and need the ID, use List Folders first.
Returns the authenticated Microsoft user's ID, display name, email, and principal name via Microsoft Graph. Call this first when the user says 'my emails', 'my inbox', or needs identity context. Use the returned id to scope queries in Find Email or identify the sender in email results.
Search for an email in a shared folder in Microsoft Outlook.
Docs ↗Search and list contacts in the authenticated user's Outlook contacts. Returns { count, contacts } where count is the Graph-reported total contact count (@odata.count) and contacts is the filtered result array. Omit searchString to return all contacts up to maxResults. When searchString is provided, filters contacts by displayName, givenName, surname, or email address (case-sensitive substring match). Important: maxResults now bounds how many contacts are fetched from Graph before filtering — contacts beyond that window will not be searched. Example: find-contacts(searchString="George Costanza", maxResults=200) → scans the first 200 contacts and returns matches. Example: find-contacts(searchString="[email protected]") → matches by email address. Use the returned contact id with Save Contact to update the contact.
Download an email attachment to /tmp. Use Find Email to locate the message, then Get Message with includeAttachments: true to get the messageId and attachment id fields. Example: after get-message(messageId="AAMk...", includeAttachments=true) returns attachments: [{ id: "AQMk...", name: "report.pdf" }], call download-attachment(messageId="AAMk...", attachmentId="AQMk...", filename="report.pdf") → writes to /tmp/report.pdf. Set convertToPdf: true to convert images, HTML, plain text, or DOCX files to PDF. For text attachments (text/*, JSON), the response includes fileContent with the decoded text (truncated at 100 KB, flagged by contentTruncated), so the content can be read directly without fetching the file.
Update an existing contact, See the docs
Send a new email, reply to an existing message, or save a draft — all in one tool. Omit inReplyToMessageId to send a new email. Provide inReplyToMessageId to reply to an existing message (threads correctly). Set isDraft: true to save to Drafts instead of sending immediately. Attach files by passing URLs or /tmp paths to files. Example (send new): send-email(recipients=["[email protected]"], subject="Hello", content="Hi there") Example (reply): send-email(inReplyToMessageId="AAMk...", content="Thanks for your note") Example (draft): send-email(recipients=["[email protected]"], subject="Weekly report", content="...", isDraft=true) Use Find Email to locate a message id before replying.
Create or update an Outlook contact (upsert). Omit contactId to create a new contact; provide contactId to update an existing one. Use Find Contacts first to look up a contact's id before updating. Example (create): save-contact(givenName="Cosmo", surname="Kramer", emailAddresses=["[email protected]"]) → creates contact, returns new contact object with id. Example (update): save-contact(contactId="AQMk...", businessPhones=["+1-555-0100"]) → patches the existing contact. See the create documentation See the update documentation
Reply to an email in Microsoft Outlook.
Docs ↗Removes a label/category from an email in Microsoft Outlook.
Docs ↗Moves an email to the specified folder in Microsoft Outlook.
Docs ↗Apply one or more state mutations to an email message: mark read/unread, add/remove categories, move to a folder, or change the flag status. All params except messageId are optional — only the ones you provide are applied. Use Find Email to obtain a message id before modifying. Recipes: Mark read: isRead: true | Mark unread: isRead: false Add category: addCategories: ["Follow Up"] | Remove category: removeCategories: ["Follow Up"] Move to archive: destinationFolderId: "archive" | Move to inbox: destinationFolderId: "inbox" Flag: flagStatus: "flagged" | Unflag: flagStatus: "notFlagged" | Mark complete: flagStatus: "complete" Example: modify-email(messageId="AAMk...", isRead=true) → marks the message as read. Example: modify-email(messageId="AAMk...", addCategories=["Eval-Seinfeld"], destinationFolderId="archive") → adds a category AND moves to archive in a single call.
Create a draft reply to an email.
Docs ↗Create a draft email,
Docs ↗Add a contact to the root Contacts folder,
Docs ↗Adds a label/category to an email in Microsoft Outlook.
Docs ↗Leo connects Microsoft Outlook Email to the ERP your business already runs on: the records it reads in Microsoft Outlook Email land in your ERP, and what changes in the ERP flows back.
Authorize Microsoft Outlook Email once, in a couple of clicks. Leo only gets the permissions you grant.
In plain language: the dashboard, portal or agent you want across Microsoft Outlook Email and your ERP. No code, no mapping spreadsheets.
Leo builds it, you review, it goes live. Agents run on a schedule or on events, under the guardrails you set.