{"name":"io.github.littlebearapps/outlook-assistant","slug":"littlebearapps-outlook-assistant","title":"Outlook Assistant","description":"Microsoft Outlook MCP server — 22 tools for email, calendar, contacts, and mailbox management.","url":"https://mcp.market/server/littlebearapps-outlook-assistant","rating":null,"grade":"A","score":85,"certified":false,"status":"active","category":"email","tags":["email","productivity"],"presence":{"score":47,"stars":39,"forks":18,"downloads_week":500,"last_push_at":"2026-10-13T10:40:40.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"npm","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/littlebearapps/outlook-assistant","website":"https://littlebearapps.com/builds/outlook-assistant","version":"3.14.1","remotes":[],"packages":[{"registryType":"npm","identifier":"@littlebearapps/outlook-assistant","version":"3.14.1","transport":{"type":"stdio"},"environmentVariables":[{"description":"Azure AD application (client) ID. Optional: if it is not set here, supply it at sign-in with the auth tool (action=authenticate clientId=<id>)","format":"string","name":"OUTLOOK_CLIENT_ID"},{"description":"Azure AD application client secret value. Only needed for the browser sign-in flow; the default device-code flow doesn't use it","format":"string","isSecret":true,"name":"OUTLOOK_CLIENT_SECRET"}]}],"tools":[{"name":"access-shared-mailbox","description":"List emails or folders in a shared mailbox the signed-in user can access (read-only). Returns messages from `sharedMailbox` (alias `email`) and `folder` (default `inbox`) with id/subject/from/receivedDateTime/preview, the same shape as `search-emails` list mode. `folder` takes a well-known name (inbox, sent, archive…), a custom/localized display name (e.g. `Archiv`), a nested path (e.g. `Inbox/Ven","write_action":false,"price_micros":0,"input_schema":null},{"name":"apply-category","description":"Tag or untag email messages with master categories (those created via `manage-category`). action=`set` (default) replaces the message's category set with the supplied `categories` array. action=`add` appends categories to whatever's already on the message. action=`remove` removes only the named categories, leaving the rest. Accepts either `messageId` (single) or `messageIds` (batch: one request pe","write_action":false,"price_micros":0,"input_schema":null},{"name":"attachments","description":"Inspect or retrieve email attachments. action=`list` (default) returns metadata for all attachments on `messageId` (id, name, contentType, size, isInline) — read-only. action=`view` returns inline content for text/JSON/XML attachments via `attachmentId`; binary types require download. action=`download` saves the attachment under a new, unique name in `outputDir` (default system temp directory, aut","write_action":false,"price_micros":0,"input_schema":null},{"name":"auth","description":"Manage authentication with the Microsoft Graph API. action=`status` (default) returns the current auth state, refreshing an expired access token while the refresh token is still valid (~90 days); call it first to check before other tools. action=`authenticate` starts sign-in: `method: \"device-code\"` (default, works headlessly) returns a code + URL for the user to visit; `method: \"browser\"` uses th","write_action":false,"price_micros":0,"input_schema":null},{"name":"create-event","description":"Create a new calendar event on the signed-in user's default calendar. Returns the created event with its `id`, `webLink`, and (if attendees are present) an auto-generated online-meeting URL — attendees receive invitations on save, so pass `dryRun: true` first to preview who would be invited (and how many are external) without creating anything. When `OUTLOOK_ALLOWED_RECIPIENTS` is set, every atten","write_action":true,"price_micros":0,"input_schema":null},{"name":"draft","description":"Draft lifecycle for review-before-send workflows (destructive: covers `send` and `delete`). action=`create` saves a new draft and returns its id (`dryRun: true` previews without saving; `checkRecipients: true` runs mail-tips first). action=`update` patches a draft by `id` (only fields passed change). action=`send` sends a draft and counts against the `send-email` session limit (0 refuses every sen","write_action":false,"price_micros":0,"input_schema":null},{"name":"export","description":"Export emails to files. target=`message` (default) exports one email by `id` (mime/eml/markdown/json/csv) to `savePath`: a directory (or a path ending in `/`, created if missing) gets a new, unique file name; a file path is created new and an existing file is replaced only with `overwrite: true`. target=`messages` batch-exports `emailIds`, or matches for `searchQuery`/`query`, into `outputDir`, at","write_action":false,"price_micros":0,"input_schema":null},{"name":"find-meeting-rooms","description":"Discover bookable meeting rooms in the user's organisation via the Graph rooms endpoint (read-only). Returns room resources with displayName, emailAddress, building, floor, capacity, and bookingType — suitable for piping into `create-event` as attendees. Filter by `query` (matches name/email), `building`, `floor`, or minimum `capacity`. Returns empty list on personal accounts (the rooms endpoint i","write_action":false,"price_micros":0,"input_schema":null},{"name":"folders","description":"Manage mail folders. Address a folder by name, by slash-separated path for nested folders (e.g. `Inbox/Clients/Acme`, case-insensitive) or by ID; a bare name matches a unique top-level folder first, then nested ones (an ambiguous name returns the candidates). action=`list` (default) returns the tree with each folder's path and id (`includeItemCounts`, `includeChildren`). action=`create` makes `nam","write_action":false,"price_micros":0,"input_schema":null},{"name":"get-mail-tips","description":"Pre-send recipient validation via Graph `POST /me/getMailTips` (read-only; uses the existing `Mail.Read` scope — no extra permissions). Returns per-recipient tips covering automatic replies (out-of-office), mailbox full status, custom admin mail tips, delivery restrictions, moderation requirements, external-vs-internal scope, max message size, and group member counts (total + external). Use ahead ","write_action":false,"price_micros":0,"input_schema":null},{"name":"list-events","description":"List calendar events for the signed-in user (read-only). By default returns upcoming events (start ≥ now). Optional `startAfter`, `startBefore` and `subject` filters find past, current or specifically-named events; supplying any of them replaces the default \"now\" lower bound and the filters are AND-ed together. Results are oldest first, except when the search only looks backwards (`startBefore` wi","write_action":false,"price_micros":0,"input_schema":null},{"name":"mailbox-settings","description":"Read or update mailbox-level settings (idempotent — safe to retry; sets are PATCH-style and merge with existing state). action=`get` (default) returns settings — use `section` to filter (`language`, `timeZone`, `workingHours`, `automaticRepliesSetting`, or `all`). action=`set-auto-replies` configures out-of-office: `enabled` true/false, optional `startDateTime`/`endDateTime` (ISO 8601) for schedul","write_action":false,"price_micros":0,"input_schema":null},{"name":"manage-category","description":"Manage the user's master category list (the colour-coded labels available across mail/calendar/contacts). action=`list` (default) returns categories with id/displayName/color. action=`create` adds a new category — `displayName` required, `color` optional (preset0-preset24, e.g. preset0=Red, preset7=Blue). action=`update` (alias `set` — deprecated) changes name/colour by `id`. action=`delete` remov","write_action":false,"price_micros":0,"input_schema":null},{"name":"manage-contact","description":"Full CRUD over the signed-in user's personal Outlook contacts (destructive: covers `delete` action). action=`list` (default) returns contacts with pagination via `skip`/`count` (default 50). action=`search` returns contacts matching `query` against name/email (default 25). action=`get` returns full contact detail by `id`. action=`create` adds a new contact and returns its `id`. action=`update` pat","write_action":false,"price_micros":0,"input_schema":null},{"name":"manage-event","description":"Manage an existing calendar event. `dryRun: true` previews any action without changing or sending anything: who would be emailed, with an external count (update also: who is added or removed, and the PATCH body). action=`update` edits fields via PATCH (subject, start, end, attendees, body, location, isOnlineMeeting, sensitivity, showAs, importance, categories, reminderMinutesBeforeStart); only fie","write_action":false,"price_micros":0,"input_schema":null},{"name":"manage-focused-inbox","description":"Manage Focused Inbox sender overrides — explicit rules that force messages from a given sender into Focused or Other regardless of the ML classifier. action=`list` (default) returns existing overrides with id/sender/classifyAs. action=`set` creates or updates an override for `emailAddress` (optional `name`), routing future mail to `focused` (default) or `other`. action=`delete` removes the overrid","write_action":false,"price_micros":0,"input_schema":null},{"name":"manage-rules","description":"Server-side inbox rules (destructive: covers `delete`; `dryRun` previews create/update). Rules run on the Exchange server whichever client is open. action=`list` (default) returns rules with id/name/sequence; `includeDetails: true` adds conditions/actions/exceptions. action=`create` builds a rule from condition params (12, e.g. fromAddresses, containsSubject, bodyContains, hasAttachments, importan","write_action":false,"price_micros":0,"input_schema":null},{"name":"read-email","description":"Read a single email by id (read-only). Returns subject, from/to/cc, date and the body as Markdown (HTML stripped to text): up to 2,000 characters by default, up to 40,000 with `outputVerbosity: full`; a cut body ends with a note on how to get the rest. With `headersMode: true`: returns RFC-822 forensic headers in place of the body (DKIM, SPF, DMARC, Received chain, Message-ID, Authentication-Resul","write_action":true,"price_micros":0,"input_schema":null},{"name":"search-emails","description":"Search, list, delta-sync or thread-group emails (read-only); parameters set the mode. No params: recent emails in `folder` (default `inbox`). `query`/`from`/`to`/`subject`/date filters: search, combined as an OData filter. `searchExpression` (deprecated alias `kqlQuery`): a raw Graph `$search` expression. `deltaMode: true`: current state plus a `deltaToken` to pass back next time for changes only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"search-people","description":"Relevance-ranked search across personal contacts, organisation directory, and recent communications via the Microsoft Graph People API (read-only). Returns people objects with `displayName`, `emailAddresses`, `companyName`, `jobTitle`, and relevance metadata, for \"who is X?\" or \"who do I email about Y?\" lookups. For entries from your personal contact store only, use `manage-contact` action=`search","write_action":false,"price_micros":0,"input_schema":null},{"name":"send-email","description":"Compose and send an email immediately (destructive: sends external comms). Returns a confirmation. Safety controls: `dryRun: true` returns the composed message for review without sending; `checkRecipients: true` runs `get-mail-tips` first and returns its warnings. If the tips show an out-of-office reply, a full mailbox, a delivery restriction or external recipients, the send is refused until repea","write_action":true,"price_micros":0,"input_schema":null},{"name":"update-email","description":"Update message state without modifying content (idempotent — safe to retry). action=`mark-read`/`mark-unread` sets `isRead` on a single message by `id`. action=`flag` sets a follow-up flag with optional `dueDateTime`/`startDateTime`: ISO 8601 with a time, kept as that exact instant when it has `Z` or a ±hh:mm offset and read in OUTLOOK_DEFAULT_TIMEZONE when it has none; date-only or unparseable va","write_action":true,"price_micros":0,"input_schema":null}],"scan":{"score":85,"grade":"A","scanned_at":"2026-10-15T05:15:55.750Z","report":{"scannerVersion":"0.1.10","scannedAt":"2026-10-15T05:15:55.726Z","components":{"code":{"score":25,"max":25,"notes":["70 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":6,"max":15,"notes":["static API keys via environment variables"]},"maintenance":{"score":15,"max":15,"notes":["last push 2 days ago"]},"identity":{"score":9,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[],"inputs":{"packages":[{"registryType":"npm","identifier":"@littlebearapps/outlook-assistant","version":"3.14.1","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":2,"publishedAt":"2026-10-05T03:14:28.963Z","repositoryUrl":"git+https://github.com/littlebearapps/outlook-assistant.git","weeklyDownloads":500}],"repo":{"found":true,"owner":"littlebearapps","repo":"outlook-assistant","archived":false,"pushedAt":"2026-10-13T10:40:40Z","stars":39,"forks":18,"openIssues":70,"ownerType":"Organization","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/220834681?v=4","ownerCreatedAt":"2025-07-15T05:51:33Z","license":"MIT"},"icon":{"url":"https://raw.githubusercontent.com/littlebearapps/outlook-assistant/main/docs/assets/outlook-assistant-logo-icon.png","source":"registry","width":1000,"height":1000},"presence":{"stars":39,"forks":18,"downloadsWeek":500,"license":"MIT","lastPushAt":"2026-10-13T10:40:40.000Z","score":47}}}},"grade_history":[],"reviews":[]}