
Connect your stack
27 native integrations. 3,200+ tools via managed connectors. Most are one-click OAuth, some use API keys - Viktor handles auth and starts working. No webhooks, no Zapier zaps.
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.
Free to start · No credit card · SOC 2 Type 1 · Works in Slack & Microsoft Teams
Messages you'd actually send. Paste one into Slack or Microsoft Teams, swap in your specifics, and Viktor takes it from there.
“Summarize everything new in Outlook from the last 24 hours and flag what needs a reply.”
— you, in Slack or Teams
“Draft a reply to the latest Outlook thread about the renewal and send it after I approve.”
— you, in Slack or Teams
“Search Outlook for the conversation about the Q3 launch and pull out the action items.”
— you, in Slack or Teams
“Watch Outlook for anything mentioning invoices and log it in a sheet every Friday.”
— you, in Slack or Teams
Ask in plain English in Slack or Microsoft Teams. Viktor picks the right Outlook actions, runs the work, and reports back. No workflows to build.
Update an existing contact.
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.
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 an email in Microsoft Outlook.
Removes a label/category from an email in Microsoft Outlook.
Moves an email to the specified folder in Microsoft Outlook.
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.
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.
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.
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).
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 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 a draft reply to an email.
Create a draft email.
Add a contact to the root Contacts folder.
Adds a label/category to an email in Microsoft Outlook.

27 native integrations. 3,200+ tools via managed connectors. Most are one-click OAuth, some use API keys - Viktor handles auth and starts working. No webhooks, no Zapier zaps.
Message Viktor in Slack like you'd message a teammate. "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." Plain English, any tool.
Viktor opens Outlook, runs the work, and posts back what changed. Sensitive actions wait for your approval. Everything is logged. You stop doing the work and start reviewing it.
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.
Outlook is Microsoft's email and calendaring platform integrating contacts and scheduling, enabling users to manage communications and events in a unified workspace
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.
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.