# Outlook AI agent for Slack & Microsoft Teams

Viktor is an AI employee that connects to Outlook in one click via OAuth and helps you stay on top of your inbox and get replies out, running 26 Outlook actions for you like Send Email, Get Folder, and Find Email. Ask in plain English in Slack or Microsoft Teams; Viktor does the work in Outlook and reports back. Setup takes about two minutes.

- Tool: Outlook
- Category: Communication
- Connection: One-click OAuth
- Actions available: 26
- Works from: Slack and Microsoft Teams
- Page: https://viktor.com/integrations/outlook

## What can you ask Viktor to do in Outlook?

- "Summarize everything new in Outlook from the last 24 hours and flag what needs a reply."
- "Draft a reply to the latest Outlook thread about the renewal and send it after I approve."
- "Search Outlook for the conversation about the Q3 launch and pull out the action items."
- "Watch Outlook for anything mentioning invoices and log it in a sheet every Friday."

## What can Viktor do in Outlook? (26 actions)

- **Update Contact** - Update an existing contact.
- **Send Email** - 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=["you@example.com"], subject="Hello", content="Hi there") Example (reply): send-email(inReplyToMessageId="AAMk...", content="Thanks for your note") Example (draft): send-email(recipients=["boss@example.com"], subject="Weekly report", content="...", isDraft=true) Use Find Email to locate a message id before replying.
- **Save Contact** - 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=["kramer@kramerica.com"]) → 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 Email** - Reply to an email in Microsoft Outlook.
- **Remove Label from Email** - Removes a label/category from an email in Microsoft Outlook.
- **Move Email to Folder** - Moves an email to the specified folder in Microsoft Outlook.
- **Modify Email** - 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.
- **List Shared Folders** - 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.
- **List Labels** - Get all the labels/categories that have been defined for a user.
- **List Important Mail** - 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).
- **List Folders** - 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.
- **List Folder IDs to Monitor Options** - Retrieves available options for the Folder IDs to Monitor field.
- **List Contacts** - 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).
- **List Contact Options** - Retrieves available options for the Contact field.
- **Get Shared Folder** - 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.
- **Get Message** - 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.
- **Get Folder** - 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.
- **Get Current User** - 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.
- **Find Shared Folder Email** - Search for an email in a shared folder in Microsoft Outlook.
- **Find Email** - Search and filter email messages in Microsoft Outlook. Returns metadata only (subject, from, date, isRead, hasAttachments, etc.) — body is excluded from list results. Use Get Message to fetch the full body or attachment details for a specific message ID. Use Get Current User first when the user says 'my email' to confirm identity. Set isRead: false to find unread messages — builds the OData filter automatically, no filter syntax required. Set folderScope: "inbox" to restrict results to the inbox only, preventing Sent/Drafts/Junk from inflating counts. Set countOnly: true to return { count: N } in a single API call without paginating — ideal for 'how many unread' queries. search and isRead can be used together — when both are set, search is automatically converted to contains(subject,...) so both constraints are applied (Graph cannot combine KQL $search with OData $filter natively). Note: this narrows the match scope to subject only, whereas a bare $search also matches body and from. countOnly cannot be combined with search. For shared mailboxes, set both userId and sharedFolderId. Example: find-email(isRead=false, folderScope="inbox", countOnly=true) → { count: 47 } for unread inbox count. Example: find-email(search="Eval-Festivus", folderScope="inbox", maxResults=5) → array of messages with id, subject, from, receivedDateTime, isRead (no body — call Get Message next for body).
- **Find Contacts** - 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="george@vandelay.com") → matches by email address. Use the returned contact id with Save Contact to update the contact.
- **Download Attachment** - 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.
- **Create Draft Reply** - Create a draft reply to an email.
- **Create Draft Email** - Create a draft email.
- **Create Contact** - Add a contact to the root Contacts folder.
- **Add Label to Email** - Adds a label/category to an email in Microsoft Outlook.

## How does Viktor work with Outlook?

1. Add Viktor to Slack or Microsoft Teams.
2. Connect Outlook with one-click OAuth - Viktor handles authentication.
3. Ask in plain English. Viktor runs the Outlook actions, chains them with your other tools when needed, and reports back. Sensitive actions wait for your approval.

## What is a Outlook AI agent?

A Outlook AI agent is an AI that connects to your Outlook account and completes work in it - it doesn't just answer questions about Outlook, it takes the actions. Viktor is that agent: an AI employee that works in Outlook on your behalf and delivers the finished result in Slack or Microsoft Teams.

Unlike workflow builders such as Zapier or Make, there is nothing to configure - no triggers to map, no workflows to maintain. You describe the outcome in plain English, and Viktor picks the right Outlook actions, chains them with the other 3,200+ tools it connects to, and asks for approval before anything sensitive runs.

### About Outlook

Outlook is Microsoft's email and calendaring platform integrating contacts and scheduling, enabling users to manage communications and events in a unified workspace

## Security and permissions

- One-click OAuth - Viktor never sees your password, and you can revoke access at any time.
- Review-first approvals: sensitive Outlook actions wait for your sign-off before they run.
- Isolated compute per team, encrypted in transit and at rest - and your data is never used to train models.
- SOC 2 Type 1 compliant, with Type 2 and ISO 27001 in progress.

## FAQ

### Does Viktor integrate with Outlook?

Yes. Outlook is one of the 3,200+ tools Viktor connects to, via a managed connector. Once connected, anyone on your team can put Viktor to work in Outlook from Slack or Microsoft Teams - no workflow builder, no code.

### How do I connect Outlook to Viktor?

Ask Viktor in Slack or Microsoft Teams to connect Outlook, then approve the one-click OAuth prompt. Viktor never sees your password, handles authentication itself, and starts working right away. Setup takes about two minutes, and you can revoke access at any time.

### What can Viktor do in Outlook?

Viktor can run 26 Outlook actions, including Send Email, Get Folder, and Find Email - and chain them with other tools in a single request. In practice that means Viktor helps you stay on top of your inbox and get replies out. If a task spans several actions, Viktor plans the sequence itself and reports back when the work is done.

### Do I need to build workflows to automate Outlook?

No. Viktor isn't a workflow builder - there are no triggers to map and no workflows to maintain. You ask for the outcome in plain English in Slack or Microsoft Teams, and Viktor decides which Outlook actions to take, runs them, and reports back.

### Is my Outlook data secure with Viktor?

Yes. Viktor connects to Outlook in one click via OAuth, runs in an isolated environment per team, and never trains models on your data. Sensitive actions wait for your approval, and you can revoke access at any time. Viktor is SOC 2 Type 1 compliant, with Type 2 and ISO 27001 in progress.

### How much does the Outlook integration cost?

Nothing extra - every integration, including Outlook, is available on every plan. You can start free with up to $100 in credits, no credit card required; paid plans start at $50/month.

### Can Viktor use Outlook together with my other tools?

Yes - that's the point. Viktor connects to 3,200+ tools and works across them in a single run: it can pull data from Outlook, cross-reference it with another tool - for example Gmail or Google Sheets, and deliver the finished result in Slack or Microsoft Teams.

## Viktor uses Outlook together with

- [Gmail](https://viktor.com/integrations/gmail)
- [Google Sheets](https://viktor.com/integrations/google-sheets)
- [HubSpot](https://viktor.com/integrations/hubspot)
- [Notion](https://viktor.com/integrations/notion)
- [Salesforce](https://viktor.com/integrations/salesforce)
- [Stripe](https://viktor.com/integrations/stripe)

## More Communication integrations

- [Slack](https://viktor.com/integrations/slack)
- [Slackbot](https://viktor.com/integrations/slackbot)
- [Telegram](https://viktor.com/integrations/telegram)
- [Zoom Admin](https://viktor.com/integrations/zoom-admin)
- [Microsoft Outlook Email](https://viktor.com/integrations/microsoft-outlook-email)
- [Bot for Slack](https://viktor.com/integrations/bot-for-slack)
- [Twilio](https://viktor.com/integrations/twilio)
- [Discord Bot](https://viktor.com/integrations/discord-bot)

## Get started

Viktor is free to start - up to $100 in credits, no credit card required. All 3,200+ integrations are included on every plan. Sign up at https://viktor.com or browse all integrations at https://viktor.com/integrations.
