# io.github.littlebearapps/outlook-assistant (npm · @littlebearapps/outlook-assistant)

Microsoft Outlook MCP server — 22 tools for email, calendar, contacts, and mailbox management.

- Trust score: 70/100 (medium)
- Change this week: +46
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-04

## Components

- npm · `@littlebearapps/outlook-assistant`: 70/100 (this document), [markdown](https://verifymcp.io/servers/littlebearapps-outlook-assistant/littlebearapps-outlook-assistant.md), [page](https://verifymcp.io/servers/littlebearapps-outlook-assistant/littlebearapps-outlook-assistant)

## Channel facts

- Registry: `npm`
- Package: `@littlebearapps/outlook-assistant`
- Version: `3.9.1`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-04.

- **Supply Chain Security**: 83/100
  - No malware found by supply-chain analysis.
  - CVE check failed: a known medium-severity CVE affects hono 4.12.33, reached via @modelcontextprotocol/sdk > hono. A fixed version is available.
  - No install/post-install scripts declared.
  - Only part of the dependency tree could be resolved (95 of 99), so this covers what we could see, not the whole tree.
- **Provenance & Transparency**: 97/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to littlebearapps/outlook-assistant).
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 3 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 53/100
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 7975 tokens (~362/item across 22 items; 22 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 0/100
  - Stability not yet verified: not enough scan history yet (needs a 30-day window).
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

**Unverified: 1 category.** A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

## Install

### Claude

```bash
claude mcp add littlebearapps-outlook-assistant -- npx -y @littlebearapps/outlook-assistant
```

### Codex

```bash
codex mcp add littlebearapps-outlook-assistant -- npx -y @littlebearapps/outlook-assistant
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "littlebearapps-outlook-assistant": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@littlebearapps/outlook-assistant"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add littlebearapps-outlook-assistant --command npx --arg -y --arg @littlebearapps/outlook-assistant
```

### Hermes

```yaml
mcp_servers:
  littlebearapps-outlook-assistant:
    command: "npx"
    args: ["-y", "@littlebearapps/outlook-assistant"]
```

### Other

```json
{
  "mcpServers": {
    "littlebearapps-outlook-assistant": {
      "command": "npx",
      "args": [
        "-y",
        "@littlebearapps/outlook-assistant"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-04 (score 70, −1)

- [security regression] CVE-2026-69207 affects this package: medium
- [security regression] Known CVEs: partial → fail

### 2026-08-02 (score 71, +54)

- [security improvement] Install scripts: unverified → pass
- [security improvement] Provenance: unverified → pass
- [security improvement] Known CVEs: unverified → partial
- [security improvement] Malware scan: unverified → pass
- [security] Stability: Stability not yet verified: not enough scan history yet (needs a 30-day window).
- [security] The attested source repository moved: littlebearapps/outlook-assistant
- [functional improvement] License: unverified → pass
- [functional improvement] Dependency health: unverified → partial
- [functional improvement] Maintenance: unverified → pass
- [functional improvement] MCP protocol: unverified → pass
- [functional improvement] Schema quality: unverified → good
- [functional] Licence: MIT

### 2026-08-01 (score 17, +12)

- [security] Stability: Stability not yet verified: we do not have a sandbox capture of the MCP schema this version of the package serves yet.
- [functional improvement] Tool coverage: unverified → 100
- [functional] First check of Schema quality: unverified
- [functional] First check of Tool coverage: 100
- [functional] First check of Schema quality: fail
- [functional] First check of Schema quality: fail
- [functional] Capabilities: Protocol version not yet verified: we do not have a sandbox capture of the MCP handshake this version of the package performs yet.
- [functional] Package version: 3.9.0 → 3.9.1

### 2026-07-31 (score 5, −1)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 6, −18)

- [security regression] Malware scan: pass → unverified

### 2026-07-27 (score 24)

First indexed and scored.

## MCP tools (22)

### `auth` (~280 tokens)

Manage authentication with the Microsoft Graph API. action=`status` (default) returns the current auth state and auto-refreshes the access token if it's expired but the refresh token is still valid (~90-day window) — call this first to check before other tools. action=`authenticate` starts the OAuth flow: with `method: "device-code"` (default, works headlessly) it returns a code + URL for the user to visit; with `method: "browser"` it opens the local auth server on :3333 (run `npm run auth-server` first). Pass `force: true` to re-authenticate over an existing valid session. action=`device-code-complete` finishes device-code auth after the user enters the code in their browser — call this once authentication shows as successful in the browser. action=`about` returns server version, configured audience, scope list, and other diagnostic info. Tokens persist to `~/.outlook-assistant-tokens.json` and survive server restarts.

Input parameters:

- `action` (string): Action to perform (default: status)
- `force` (boolean): Force re-authentication even if already authenticated (action=authenticate only)
- `method` (string): Auth method for action=authenticate. device-code (default): no auth server needed, works remotely. browser: traditional OAuth redirect via port 3333.

### `list-events` (~182 tokens)

List upcoming calendar events for the signed-in user (read-only). Returns an array of events with id, subject, start/end, attendees, location, organiser, and webLink. Use `count` (default 10, max 50) to control page size; this tool does not filter — use the Outlook UI or specific date ranges via Graph for filtered queries. Each start/end is returned as a canonical UTC ISO-8601 instant (e.g. `2026-04-02T22:00:00.000Z`) followed by a labelled local rendering in the configured display timezone (default Australia/Melbourne; override with `OUTLOOK_DEFAULT_TIMEZONE`) — the UTC value is authoritative, so consumers never have to guess the zone.

Input parameters:

- `count` (number): Number of events to retrieve (default: 10, max: 50)

### `create-event` (~196 tokens)

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. Times use the configured timezone (default Australia/Melbourne; override with `OUTLOOK_DEFAULT_TIMEZONE`); omit the `Z` suffix to send local time. Use `manage-event` action=`update` to modify an event after creation, or `manage-event` action=`cancel`/`delete` to remove it.

Input parameters:

- `attendees` (array): List of attendee email addresses
- `body` (string): Optional body content for the event
- `end` (string, required): The end time of the event in ISO 8601 format
- `start` (string, required): The start time of the event in ISO 8601 format
- `subject` (string, required): The subject of the event

### `manage-event` (~504 tokens)

Manage an existing calendar event (destructive: covers update/decline/cancel/delete — use dryRun where supported to preview). action=`update` edits fields in place via PATCH (subject, start, end, attendees, body, location, isOnlineMeeting, sensitivity, showAs, importance, categories, reminderMinutesBeforeStart) — only fields you pass are changed; pass `dryRun: true` to preview the PATCH payload. action=`decline` declines an invitation (optional `comment`). action=`cancel` cancels an event you organised and notifies attendees. action=`delete` permanently removes the event. Returns the updated event on update; status confirmation otherwise. Note: there is no `accept` action — accept invitations in the Outlook UI (Graph's accept verb is unreliable across personal/M365).

Input parameters:

- `action` (string, required): Action to perform (required)
- `attendees` (array): Full replacement attendee list — pass complete desired list, or [] to clear (action=update only)
- `body` (string): New body content (action=update only)
- `categories` (array): Full replacement category list — pass [] to clear (action=update only)
- `comment` (string): Optional comment for declining or cancelling the event
- `dryRun` (boolean): Preview the PATCH without applying it (action=update only). Returns the body that would be sent to Graph.
- `end`: New end time as ISO 8601 string or {dateTime, timeZone} object (action=update only)
- `eventId` (string): The ID of the event
- `id` (string): Alias for `eventId` (canonical per the v3.7.3 alias pass).
- `importance` (string): Event importance flag (action=update only)
- `isOnlineMeeting` (boolean): Toggle online meeting flag (action=update only)
- `location` (string): New location display name (action=update only)
- `reminderMinutesBeforeStart` (number): Minutes before start to fire the reminder (action=update only)
- `sensitivity` (string): Event sensitivity classification (action=update only)
- `showAs` (string): Free/busy status shown to others (action=update only)
- `start`: New start time as ISO 8601 string or {dateTime, timeZone} object (action=update only)
- `subject` (string): New subject (action=update only)

### `search-emails` (~757 tokens)

Search, list, delta-sync, or thread-group emails — six modes selected by parameters (read-only). With no params: lists recent emails in `folder` (default `inbox`). With `query`/`from`/`to`/`subject`/date filters: full search (combines via OData filter). With `searchExpression` (deprecated alias `kqlQuery`): a raw Microsoft Graph `$search` expression for advanced server-side search. With `deltaMode: true`: returns current state plus a `deltaToken`; pass the token back on the next call for incremental changes only — ideal for inbox monitoring. With `groupByConversation: true`: returns conversation threads. With `conversationId`: returns all messages in a single thread. With `internetMessageId`: looks up a message by its RFC Message-ID header. Personal Outlook.com accounts have limited `$search` support — this tool falls back through OData filters / boolean filters / recent listing automatically, but structured filters (`from`/`subject`/`receivedAfter`/`hasAttachments`/`unreadOnly`) return cleaner results. Returns paged messages with id/subject/from/receivedDateTime/preview by default; use `outputVerbosity` to expand.

Input parameters:

- `conversationId` (string): Get all messages in a conversation thread by conversationId.
- `count` (number): Number of results (list default: 25, search default: 10, max: 50)
- `deltaMode` (boolean): Enable delta sync mode. Returns only changes since last sync. Use deltaToken for subsequent calls.
- `deltaToken` (string): Token from previous delta call for incremental sync (deltaMode only)
- `folder` (string): Email folder (default: 'inbox')
- `from` (string): Filter by sender email/name
- `groupByConversation` (boolean): List conversations (threads) grouped by conversationId instead of individual emails.
- `hasAttachments` (boolean): Filter to emails with attachments
- `includeHeaders` (boolean): Include email headers for each message (conversationId only)
- `internetMessageId` (string): Look up email by Message-ID header (e.g. <abc123@example.com>). For threading/deduplication.
- `kqlQuery` (string): DEPRECATED alias for `searchExpression` (this was never full KQL — it is a Graph `$search` expression). Prefer `searchExpression`.
- `maxResults` (number): Max results per page for delta sync (default: 100, max: 200)
- `outputVerbosity` (string): Output detail level (default: standard)
- `query` (string): Search query text. Omit for list mode.
- `receivedAfter` (string): Filter emails received after date (ISO 8601)
- `receivedBefore` (string): Filter emails received before date (ISO 8601)
- `searchAllFolders` (boolean): Search across all mail folders
- `searchExpression` (string): Raw Microsoft Graph `$search` expression for advanced server-side search, e.g. `subject:"invoice"`, `from:github.com`, or `foo OR bar`. Quote your own phrases; a single bare token is auto-quoted. Pai…
- `subject` (string): Filter by subject
- `to` (string): Filter by recipient email/name
- `unreadOnly` (boolean): Filter to unread emails only

### `read-email` (~295 tokens)

Read a single email by id (read-only). Default: returns the full message body (HTML stripped to text by default), subject, from/to/cc, receivedDateTime, conversationId, attachments metadata, and webLink as Markdown. With `headersMode: true`: returns RFC-822 forensic headers instead (DKIM, SPF, DMARC, Received chain, Message-ID, Authentication-Results) — pair with `importantOnly: true` for the security-relevant subset, `groupByType: true` for category-bucketed view, or `raw: true` for JSON instead of Markdown. With `includeHeaders: true` (non-headers-mode): adds basic headers alongside body. Use `outputVerbosity` (minimal/standard/full) to control field count.

Input parameters:

- `groupByType` (boolean): Group headers by category (headersMode only, default: false)
- `headersMode` (boolean): Return forensic headers instead of email content (default: false)
- `id` (string, required): ID of the email to read
- `importantOnly` (boolean): Show only important headers (headersMode only, default: false)
- `includeHeaders` (boolean): Include basic headers alongside email content (default: false)
- `outputVerbosity` (string): Output detail level (default: standard)
- `raw` (boolean): Return raw JSON instead of Markdown (headersMode only, default: false)

### `send-email` (~331 tokens)

Compose and send an email immediately (destructive: sends external comms). Returns a confirmation with the saved-message id. Safety controls: `dryRun: true` returns the composed message for review without sending; `checkRecipients: true` runs `get-mail-tips` first to flag out-of-office / mailbox-full / delivery-restricted / external recipients; combine both for a full pre-send review. Subject to session rate limits (`OUTLOOK_MAX_EMAILS_PER_SESSION` env) and recipient allowlist (`OUTLOOK_ALLOWED_RECIPIENTS` env) when configured — calls outside the allowlist fail before any Graph request. For multi-step compose/review workflows prefer `draft` (action=`create` → `update` → `send`) since drafts can be inspected in Outlook before sending. Comma-separated recipient strings or arrays both accepted.

Input parameters:

- `bcc` (string): Comma-separated BCC email addresses
- `body` (string, required): Email body (plain text or HTML)
- `cc` (string): Comma-separated CC email addresses
- `checkRecipients` (boolean): Check recipients for out-of-office, mailbox full, delivery restrictions before sending (default: false). Combine with dryRun=true for pre-send review.
- `dryRun` (boolean): Preview email without sending (default: false). Returns composed email for review.
- `importance` (string): Email importance (default: normal)
- `saveToSentItems` (boolean): Save to sent items (default: true)
- `subject` (string, required): Email subject
- `to` (string, required): Comma-separated recipient email addresses

### `draft` (~387 tokens)

Full draft lifecycle for review-before-send workflows (destructive: covers `send` and `delete`). action=`create` saves a new draft in the Drafts folder and returns its id (use `dryRun: true` to preview without saving; `checkRecipients: true` runs mail-tips first). action=`update` patches an existing draft by `id` (only fields passed are changed). action=`send` dispatches an existing draft — shares the rate limit with `send-email`. action=`delete` removes a draft permanently. action=`reply`/`reply-all` creates a reply draft from a message `id` (use `comment` to prepend text — mutually exclusive with `body`). action=`forward` creates a forward draft (requires `id` and `to`). Recipient allowlist applies to create/update/forward. Returns the draft object on create/update/reply/forward; status confirmation on send/delete.

Input parameters:

- `action` (string, required): Action to perform (required)
- `bcc` (string): Comma-separated BCC email addresses
- `body` (string): Email body (plain text or HTML)
- `cc` (string): Comma-separated CC email addresses
- `checkRecipients` (boolean): Check recipients for out-of-office, delivery restrictions before saving (action=create, default: false)
- `comment` (string): Comment text for reply/forward (prepended to original message). Cannot combine with body.
- `dryRun` (boolean): Preview draft without saving (action=create only, default: false)
- `id` (string): Draft or message ID. Required for update/send/delete/reply/reply-all/forward.
- `importance` (string): Email importance (default: normal)
- `subject` (string): Email subject
- `to` (string): Comma-separated recipient email addresses (optional for create/update, required for forward)

### `update-email` (~242 tokens)

Update message state without modifying content (idempotent — safe to retry). action=`mark-read`/`mark-unread` toggles the `isRead` flag on a single message by `id`. action=`flag` sets a follow-up flag with optional `dueDateTime`/`startDateTime` (ISO 8601). action=`unflag` clears the flag. action=`complete` marks the flag as done. Flag/unflag/complete accept either `id` (single) or `ids` (batch array) — batch operations use Graph `$batch` for efficiency. Returns status confirmation per message.

Input parameters:

- `action` (string, required): Action to perform (required)
- `dueDateTime` (string): Due date/time for follow-up, ISO 8601 (action=flag)
- `id` (string): Single message ID (required for mark-read/mark-unread, or use instead of ids for flag actions)
- `ids` (array): Array of message IDs for batch flag/unflag/complete operations
- `startDateTime` (string): Start date/time for follow-up, ISO 8601 (action=flag)

### `attachments` (~225 tokens)

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 to disk at `outputDir` (default system tmpdir, auto-created) and returns the saved file path. `messageId` is required for all actions; `attachmentId` is required for view/download. Use `outputVerbosity` to control list field count.

Input parameters:

- `action` (string): Action to perform (default: list)
- `attachmentId` (string): Attachment ID (action=view/download, required)
- `messageId` (string, required): Email message ID (required)
- `outputDir` (string): Directory to save file (action=download, default: system tmpdir). Auto-created if missing.
- `savePath` (string): DEPRECATED alias for `outputDir`. Will be removed in a future release.

### `export` (~581 tokens)

Export emails to file formats for archival, forensics, or programmatic processing. target=`message` (default) exports a single email by `id` to `savePath` — accepts `mime`/`eml`/`markdown`/`json`/`csv`. target=`messages` batch-exports either an explicit `emailIds` array or messages matching `searchQuery` (or `query` shortcut) into `outputDir` — accepts `markdown`/`json`/`csv`. target=`conversation` exports a full thread by `conversationId` into `outputDir` (chronological by default; pass `order: "reverse"` for newest-first) — accepts `eml`/`mbox`/`markdown`/`json`/`html`/`csv`. target=`mime` returns raw RFC-822 MIME bytes for `id` (use `headersOnly` for just headers, `base64` for encoded transport, `maxSize` to cap at default 1MB). `includeAttachments` defaults to true for single-message exports and false for batch. Format support varies by target — see the format param enum.

Input parameters:

- `base64` (boolean): Return base64 encoded (target=mime)
- `conversationId` (string): Conversation ID (target=conversation, required)
- `emailIds` (array): Email IDs to export (target=messages)
- `format` (string): Export format. Valid values vary by target: target=message accepts mime/eml/markdown/json/csv (mbox and html are conversation-only). target=conversation accepts eml/mbox/markdown/json/html/csv. targe…
- `headersOnly` (boolean): MIME headers only, no body (target=mime)
- `id` (string): Email ID (target=message/mime, required)
- `includeAttachments` (boolean): Include attachments (default: true for single, false for batch)
- `maxSize` (number): Max content size in bytes (target=mime, default: 1MB)
- `order` (string): Message order (target=conversation, default: chronological)
- `outputDir` (string): Output directory (target=messages/conversation, required)
- `query` (string): Free-text search shortcut (target=messages). Equivalent to passing searchQuery: { subject: <query> }. Convenience alias for callers used to search-emails.
- `savePath` (string): File path or directory (target=message)
- `searchQuery` (object): Search query to find emails (target=messages, alternative to emailIds)
- `target` (string): Export target (default: message)

### `get-mail-tips` (~237 tokens)

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 of `send-email` or `draft` action=`create` to catch issues like OOO replies or external-recipient warnings before the message goes out; `send-email`/`draft` accept `checkRecipients: true` to invoke this automatically. Accepts either a comma-separated string or an array of addresses; `tipTypes` filters which tips are requested (defaults to all).

Input parameters:

- `recipients` (required): Email addresses to check for mail tips
- `tipTypes` (string): Comma-separated tip types to request (default: all). Options: automaticReplies, mailboxFullStatus, customMailTip, externalMemberCount, totalMemberCount, maxMessageSize, deliveryRestriction, moderatio…

### `folders` (~633 tokens)

Manage mail folders (tool-level destructiveHint=true because `delete` permanently removes a folder; `list` and `stats` are read-only sub-actions despite the annotation). Folders can be addressed by name, by a slash-separated PATH for nested folders (e.g. `Triage/Delete`, `Inbox/Clients/Acme`, case-insensitive), or by explicit ID; `list` output includes each folder's full path and `[id: …]`. A bare name resolves a unique top-level folder first, then searches nested folders (ambiguous names return the candidates — disambiguate with a path or ID). action=`list` (default) returns the folder tree (toggle `includeItemCounts` for unread/total, `includeChildren` for hierarchy). action=`create` makes a new folder under the root, or under `parentFolder` (name/path) / `parentFolderId`, and returns its id. action=`move` relocates emails (`emailIds`) into `targetFolder` (name/path) or `targetFolderId`. action=`stats` returns counts (totalItemCount/unreadItemCount) for `folder` (name/path) or `folderId`, suitable for pagination planning. action=`delete` removes a folder (by `folderName`/path or `folderId`) and its contents — on Outlook.com the folder is moved to Deleted Items (recoverable until you empty it); M365/Exchange accounts may hard-delete per retention policy.

Input parameters:

- `action` (string): Action to perform (default: list)
- `emailIds` (string): Comma-separated list of email IDs to move (action=move, required)
- `folder` (string): Folder name or path (inbox, sent, "Triage/Delete", etc.). Default: inbox (action=stats)
- `folderId` (string): Folder ID (action=stats/delete)
- `folderName` (string): Folder name or path to delete — resolved to ID (action=delete). Cannot delete protected folders (Inbox, Drafts, Sent, etc.)
- `includeChildren` (boolean): Include child folders in hierarchy (action=list)
- `includeItemCounts` (boolean): Include counts of total and unread items (action=list)
- `name` (string): Name of the folder to create (action=create, required)
- `outputVerbosity` (string): Output detail level (action=stats, default: standard)
- `parentFolder` (string): Parent folder name or path (e.g. "Clients/Acme"); default is root (action=create)
- `parentFolderId` (string): Parent folder ID — alternative to parentFolder for unambiguous targeting (action=create)
- `sourceFolder` (string): Source folder name, default is inbox (action=move)
- `targetFolder` (string): Destination folder name or path, e.g. "Triage/Delete" (action=move; or use targetFolderId)
- `targetFolderId` (string): Destination folder ID — alternative to targetFolder for unambiguous/nested targeting (action=move)

### `manage-rules` (~961 tokens)

Server-side inbox rule CRUD (destructive: covers `delete`; supports `dryRun` on create/update for preview). Rules run on the Exchange server regardless of which client is open. action=`list` (default) returns rules with id/name/sequence — pass `includeDetails: true` to expand conditions/actions/exceptions. action=`create` builds a new rule from condition params (12 supported: fromAddresses, containsSubject, bodyContains, hasAttachments, importance, sentTo, sensitivity, etc.), action params (9 supported: moveToFolder, forwardTo, redirectTo, assignCategories, markAsRead, delete, etc.), and optional `except*` exceptions. action=`update` patches the named fields by `ruleId`. action=`reorder` changes execution priority via `sequence` (lower = earlier). action=`delete` removes a rule. Recipient allowlist applies to forwardTo/redirectTo. `permanentDelete` action is intentionally omitted (too dangerous for AI use — use the Outlook UI). Subject to session rate limits (`OUTLOOK_MAX_MANAGE_RULES_PER_SESSION`).

Input parameters:

- `action` (string): Action to perform (default: list)
- `assignCategories` (string): Comma-separated Outlook categories to assign (action=create/update)
- `bodyContains` (string): Comma-separated body text keywords (OR logic) (action=create/update)
- `bodyOrSubjectContains` (string): Comma-separated keywords matching body OR subject (OR logic) (action=create/update)
- `containsSubject` (string): Comma-separated subject keywords (OR logic). e.g. "invoice, receipt, payment" (action=create/update)
- `copyToFolder` (string): Folder name to copy matching emails to (action=create/update)
- `deleteMessage` (boolean): Move matching emails to Deleted Items (action=create/update)
- `displayName` (string): Alias for `name` (matches Graph's own `displayName` field).
- `dryRun` (boolean): Preview rule without creating/updating (action=create, action=update)
- `exceptBodyContains` (string): Comma-separated body keywords to exclude (action=create/update)
- `exceptFromAddresses` (string): Comma-separated sender emails to exclude (action=create/update)
- `exceptHasAttachments` (boolean): Exclude emails with attachments (action=create/update)
- `exceptSenderContains` (string): Comma-separated partial sender matches to exclude (action=create/update)
- `exceptSubjectContains` (string): Comma-separated subject keywords to exclude (action=create/update)
- `forwardTo` (string): Comma-separated emails to forward matching messages to (action=create/update)
- `fromAddresses` (string): Comma-separated sender emails to match (action=create/update)
- `hasAttachments` (boolean): Match emails with attachments (action=create/update)
- `importance` (string): Match emails with this importance (action=create/update)
- `includeDetails` (boolean): Include detailed conditions, actions, and exceptions (action=list)
- `isAutomaticReply` (boolean): Match automatic reply emails (action=create/update)
- `isEnabled` (boolean): Enable/disable rule (action=create default: true, action=update)
- `markAsRead` (boolean): Mark matching emails as read (action=create/update)
- `markImportance` (string): Set importance on matching emails (action=create/update)
- `moveToFolder` (string): Folder name to move matching emails to (action=create/update)
- `name` (string): Rule name (action=create required, action=update to rename)
- `recipientContains` (string): Comma-separated partial recipient matches (action=create/update)
- `redirectTo` (string): Comma-separated emails to redirect matching messages to (action=create/update)
- `ruleId` (string): ID of existing rule (action=update/delete)
- `ruleName` (string): Name of existing rule (action=update/reorder/delete)
- `senderContains` (string): Comma-separated partial sender matches (action=create/update)
- `sensitivity` (string): Match emails with this sensitivity (action=create/update)
- `sentCcMe` (boolean): Match emails where I am in CC (action=create/update)
- `sentOnlyToMe` (boolean): Match emails where I am the only recipient (action=create/update)
- `sentToAddresses` (string): Comma-separated recipient emails to match (action=create/update)
- `sentToMe` (boolean): Match emails sent to me (action=create/update)
- `sequence` (number): Execution order, lower = higher priority (action=create default: auto, action=reorder required)
- `stopProcessingRules` (boolean): Stop evaluating subsequent rules (action=create/update)

### `manage-contact` (~468 tokens)

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` patches the given fields by `id` (only fields passed are changed). action=`delete` permanently removes the contact by `id`. Use `outputVerbosity` (minimal/standard/full) on list/search to control field count. Prefer `search-people` for cross-source relevance ranking (contacts + directory + recent comms) — this tool only searches your personal contact store.

Input parameters:

- `action` (string): Action to perform (default: list)
- `companyName` (string): Company name (action=create/update)
- `count` (number): Number of results (action=list default: 50, action=search default: 25)
- `displayName` (string): Full name (action=create/update)
- `email` (string): Primary email address (action=create/update)
- `emails` (array): Multiple email addresses (action=create/update). First entry is primary.
- `firstName` (string): Given name (action=create/update). Maps to Graph `givenName`. If displayName not provided, will be combined with lastName.
- `folder` (string): Contact folder ID (action=list)
- `id` (string): Contact ID (action=get/update/delete, required)
- `jobTitle` (string): Job title (action=create/update)
- `lastName` (string): Surname (action=create/update). Maps to Graph `surname`.
- `mobilePhone` (string): Mobile phone number (action=create/update)
- `notes` (string): Personal notes (action=create/update)
- `outputVerbosity` (string): Output detail level (action=list/search, default: standard)
- `query` (string): Search query for name or email (action=search, required)
- `skip` (integer): Pagination offset for action=list (default: 0). Use the value suggested by the previous page response.

### `search-people` (~134 tokens)

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 — ideal for "who is X?" or "who do I email about Y?" lookups. Use `manage-contact` action=`search` instead when you specifically need entries from your personal contact store only.

Input parameters:

- `count` (number): Maximum results to return (default: 25, max: 50)
- `query` (string, required): Search query (name, email, company)

### `manage-category` (~271 tokens)

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` removes a category — this does NOT untag messages already labelled with it; existing messages retain the orphaned label until manually cleaned. Use `apply-category` to tag/untag specific messages.

Input parameters:

- `action` (string): Action to perform (default: list). 'set' is a deprecated alias for 'update'.
- `categoryId` (string): DEPRECATED: alias for `id`. Will be removed in a future release.
- `color` (string): Color preset, e.g. preset0=Red, preset7=Blue (action=create/update)
- `displayName` (string): Category name (action=create required, action=update optional)
- `id` (string): Category ID (action=update/delete, required)
- `outputVerbosity` (string): Output detail level (action=list, default: standard)

### `apply-category` (~199 tokens)

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 via Graph `$batch`). `categories` are matched by display name — names must already exist in the master list (create via `manage-category` first). Returns per-message confirmation.

Input parameters:

- `action` (string): set (replace all), add (append), remove (remove specific). Default: set
- `categories` (array, required): Category display names to apply/remove (required)
- `messageId` (string): Single message ID to categorise
- `messageIds` (array): Array of message IDs to categorise (batch operation)

### `manage-focused-inbox` (~211 tokens)

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 override for `emailAddress`. Note: this only works on accounts that have Focused Inbox enabled — personal Outlook.com accounts without it return an empty list.

Input parameters:

- `action` (string): Action to perform (default: list)
- `classifyAs` (string): Where to put emails from this sender (action=set, default: focused)
- `emailAddress` (string): Sender email address (action=set/delete, required)
- `name` (string): Sender display name (action=set)
- `outputVerbosity` (string): Output detail level (action=list, default: standard)

### `mailbox-settings` (~469 tokens)

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 scheduled mode, `internalReplyMessage` and (optionally) `externalReplyMessage`. action=`set-working-hours` updates the schedule: `startTime`/`endTime` (HH:MM) and `daysOfWeek` (array of `monday`..`sunday`). Returns the updated settings object on set actions.

Input parameters:

- `action` (string): Action to perform (default: get)
- `daysOfWeek` (array): Work days, e.g. ['monday','tuesday','wednesday','thursday','friday'] (action=set-working-hours)
- `enabled` (boolean): Enable (true) or disable (false) automatic replies (action=set-auto-replies)
- `endDateTime` (string): End date/time for scheduled mode, ISO 8601 format (action=set-auto-replies)
- `endTime` (string): Work end time in HH:MM format, e.g. '17:00' (action=set-working-hours)
- `externalAudience` (string): Who receives external reply (action=set-auto-replies)
- `externalReplyMessage` (string): Reply message for external senders (action=set-auto-replies)
- `internalReplyMessage` (string): Reply message for internal senders (action=set-auto-replies)
- `section` (string): Specific section to retrieve (action=get, default: all)
- `startDateTime` (string): Start date/time for scheduled mode, ISO 8601 format (action=set-auto-replies)
- `startTime` (string): Work start time in HH:MM format, e.g. '09:00' (action=set-working-hours)
- `timeZone` (string): Time zone name, e.g. 'Australia/Melbourne' (action=set-working-hours)

### `access-shared-mailbox` (~243 tokens)

List emails from a shared mailbox the signed-in user has been granted access to (read-only). Returns paged messages from the named `sharedMailbox` (or alias `email`) and `folder` (default `inbox`) with id/subject/from/receivedDateTime/preview — same shape as `search-emails` list mode. Requires that the shared mailbox has been delegated to the signed-in user in Exchange (admin-configured). Use `outputVerbosity` to control field count and `count` (default 25, max 50) for page size. For full search/filter capability over a shared mailbox, prefer `search-emails` with a folder path scoped to the shared mailbox.

Input parameters:

- `count` (number): Number of emails to retrieve (default: 25, max: 50)
- `email` (string): Alias for `sharedMailbox` (more intuitive name for the same value).
- `folder` (string): Folder to read from (default: inbox)
- `outputVerbosity` (string): Output detail level (default: standard)
- `sharedMailbox` (string): Email address of the shared mailbox (required)

### `find-meeting-rooms` (~169 tokens)

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 is M365-only). Use `outputVerbosity` to control field count.

Input parameters:

- `building` (string): Filter by building name
- `capacity` (number): Minimum capacity required
- `floor` (number): Filter by floor number
- `outputVerbosity` (string): Output detail level (default: standard)
- `query` (string): Search query (room name, email)

## Diagnostics

Captured diagnostic sections: Provenance, Vulnerabilities, Dependencies. The full working is on the page: https://verifymcp.io/servers/littlebearapps-outlook-assistant/littlebearapps-outlook-assistant#diagnostics

## Score history

- 2026-08-04: 70
- 2026-08-03: 71
- 2026-08-02: 71
- 2026-08-01: 17
- 2026-07-31: 5
- 2026-07-30: 6
- 2026-07-28: 24
- 2026-07-27: 24

## Links

- npm package: https://www.npmjs.com/package/@littlebearapps/outlook-assistant
- Socket report: https://socket.dev/npm/package/@littlebearapps/outlook-assistant
- Repository: https://github.com/littlebearapps/outlook-assistant
- Changelog RSS feed: https://verifymcp.io/servers/littlebearapps-outlook-assistant/littlebearapps-outlook-assistant/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/littlebearapps-outlook-assistant/littlebearapps-outlook-assistant/changelog.json
- HTML version of this page: https://verifymcp.io/servers/littlebearapps-outlook-assistant/littlebearapps-outlook-assistant
