trackmcp
Back to directory
littlebearapps

outlook-assistant

View on GitHub

MCP server for Outlook email, calendar, and contacts — let your AI assistant manage your inbox directly from the conversation.

36 stars JavaScriptOthers Updated Aug 28, 2026
aiai-agentscalendarclaudeclaude-codecontactscursoremailllmmcpmcp-servermicrosoft-365microsoft-graphmicrosoft-graph-apimodel-context-protocoloutlookwindsurfautomationproductivityemail-automation

Documentation

Outlook Assistant

MCP server for Outlook email, calendar, and contacts — let your AI assistant manage your inbox directly from the conversation.

Outlook Assistant connects AI assistants to your Microsoft Outlook account through the Model Context Protocol. Ask your AI assistant to search your inbox, send emails, schedule meetings, manage contacts, and configure mailbox settings — without leaving the conversation. Works with Claude, Cursor, Windsurf, and any MCP-compatible client.

Works with personal Outlook.com and work/school Microsoft 365 accounts.

What you can do

  • 📨 Search and read emails — find messages by sender, subject, date, or keywords; read full threads with conversation grouping; batch flag, move, export, or categorise multiple emails at once
  • 🛡️ Send emails with safety controls — dry-run preview, pre-send mail tips (out-of-office, mailbox full, delivery restrictions), session rate limiting, and recipient allowlist to prevent mistakes
  • ✏️ Draft emails for review — create, update, and send drafts; reply and forward as drafts; preview before saving with dry-run mode
  • 📅 Manage your calendar — view upcoming events, schedule meetings with attendees, decline or cancel invitations
  • 📦 Export emails — save individual messages to Markdown, EML, JSON, or CSV; export full conversation threads to MBOX or HTML; bulk-export search results in one call
  • 🔍 Investigate email headers — full raw header access (DKIM, SPF, DMARC, delivery chain, X-Mailer, X-Originating-IP) for phishing investigation and compliance review
  • 🗂️ Organise your inbox — create nested folders (addressable by path), set up inbox rules, colour-code with categories, manage Focused Inbox — all work together for complete inbox automation
  • 🔄 Track inbox changes — delta sync detects new, modified, and deleted emails since your last check, with tokens for incremental polling
  • 👥 Manage contacts — search your contact book and organisational directory, create and update contact records
  • ⚙️ Configure settings — set out-of-office auto-replies, working hours, and time zone
  • 📬 Access shared mailboxes — read team inboxes and service accounts (Microsoft 365)
  • 🏢 Find meeting rooms — search by building, floor, capacity, AV equipment, and wheelchair accessibility (Microsoft 365)

Why Outlook Assistant?

Without Outlook AssistantWith Outlook Assistant
Switch between your AI tool and Outlook to manage emailRead, search, send, and export emails directly from your AI assistant
Manually search and export email threadsFull email tools including search, threading, and bulk export
Context-switch for calendar and contactsManage calendar events, contacts, and settings in one place
Copy-paste email content into conversationsYour AI assistant reads your emails natively with full context
No programmatic access to mailbox rules or categoriesCreate inbox rules, manage categories, configure auto-replies
Manually check each email for phishing red flagsForensic header analysis — DKIM, SPF, DMARC, spam scores, and delivery chain in one call
Poll your inbox to check for new mailDelta sync returns only changes since your last check, with tokens for continuous polling

Features

ModuleToolsWhat You Can Do
Email8`search-emails` (list/search/delta/conversations), `read-email` (content + forensic headers), `send-email` (with dry-run + mail tips), `draft` (create/update/send/delete/reply/forward), `update-email` (read status, flags), `attachments`, `export`, `get-mail-tips`
Calendar3`list-events`, `create-event`, `manage-event` (update/decline/cancel/delete)
Contacts2`manage-contact` (list/search/get/create/update/delete), `search-people`
Categories3`manage-category` (CRUD), `apply-category`, `manage-focused-inbox`
Settings1`mailbox-settings` (get/set auto-replies/set working hours)
Folder1`folders` (list/create/move/stats/delete) — nested folders addressable by path (`Parent/Child`) or ID
Rules1`manage-rules` (list/create/update/reorder/delete)
Advanced2`access-shared-mailbox`, `find-meeting-rooms`
Auth1`auth` (status/authenticate/about)

22 tools total — consolidated from 55 for optimal AI performance. See the Tools Reference for complete parameter details.

Export Formats

Format support varies by `target`:

FormatExtension`target=message` (single)`target=messages` (batch)`target=conversation` (thread)
`mime` / `eml``.eml`
`mbox``.mbox`
`markdown``.md`
`json``.json`
`html``.html`
`csv``.csv`

Export individual emails, search results, or entire conversation threads — use `target=messages` with a search query (or the `query` shortcut) to batch-export without manually collecting IDs.

Account Compatibility

Outlook Assistant works with both personal and work/school Microsoft accounts, but some features behave differently:

FeaturePersonal (Outlook.com)Work/School (Microsoft 365)
Email read, send, searchFull supportFull support
Calendar eventsFull supportFull support
Contacts CRUDFull supportFull support
Inbox rulesFull supportFull support
FoldersFull supportFull support
Free-text `query` searchLimited — use `subject`, `from`, `to` filters insteadFull KQL support
CategoriesFull supportFull support
Mailbox settingsFull supportFull support
Focused InboxAPI works (overrides stored) but mail routing not affectedFull support
Shared mailboxesNot availableRequires `Mail.Read.Shared`
Meeting room searchNot availableRequires `Place.Read.All` + admin consent

> Note: On personal accounts, Microsoft's `$search` API has limited support for free-text queries. Outlook Assistant handles this automatically with progressive search — if your query returns no results, it falls back through OData filters, boolean filters, and recent message listing to find your emails. For the most direct results on personal accounts, use the structured filter parameters (`from`, `subject`, `to`, `receivedAfter`).

What Makes This Different

  • Progressive search — on accounts where Microsoft's `$search` API is limited, Outlook Assistant automatically falls back through up to 4 search strategies to find your emails. Most Graph API wrappers fail silently; this one adapts.
  • Email forensics — raw header access for DKIM, SPF, DMARC, delivery chain, X-Mailer, X-Originating-IP, and spam scores. Returns the full data so you can investigate phishing, audit compliance, or trace delivery issues. (Auto-verdict is on the roadmap; today the data is surfaced and analysed in-conversation.)
  • Delta sync — incremental inbox monitoring returns only what changed since your last check, with tokens for continuous polling. Designed for agent workflows that need to watch a mailbox.
  • Batch operations — flag, move, export, or categorise multiple emails in a single call. Search-driven export lets you batch-export results without collecting IDs manually.
  • Pre-send intelligence — check recipients for out-of-office, full mailbox, delivery restrictions, and moderation status before sending — no other Outlook MCP server offers this.
  • Compound automation — rules, categories, folders, and Focused Inbox work together. Set up complete inbox management through your AI assistant in one conversation.

Safety & Token Efficiency

Outlook Assistant is designed with safety-first principles for AI-driven email access:

Destructive action safeguards — Every tool carries MCP annotations (`readOnlyHint`, `destructiveHint`, `idempotentHint`) so AI clients can auto-approve safe reads and prompt for confirmation on destructive operations like sending email or deleting events.

Send-email protections — The `send-email` tool includes:

  • Pre-send mail tips (`checkRecipients: true`) — check recipients for out-of-office, mailbox full, delivery restrictions before sending
  • Dry-run mode (`dryRun: true`) — preview composed emails without sending
  • Session rate limiting — configurable via `OUTLOOK_MAX_EMAILS_PER_SESSION` (default: unlimited)
  • Recipient allowlist — restrict sending to approved addresses/domains via `OUTLOOK_ALLOWED_RECIPIENTS`

> Recommended setup: enable both safety belts in your `.mcp.json` from day one. They're off by default; `auth action=about` reports their state and prints a setup hint when unset. See `.mcp.json.example` for a copy-paste template.

>

> ```json

> "env": {

> "OUTLOOK_CLIENT_ID": "…",

> "OUTLOOK_CLIENT_SECRET": "…",

> "OUTLOOK_MAX_EMAILS_PER_SESSION": "10",

> "OUTLOOK_ALLOWED_RECIPIENTS": "your-domain.com,trusted@example.com"

> }

> ```

Draft protections — The `draft` tool shares `send-email` safety controls: dry-run preview, recipient allowlist, mail-tips validation, and rate limiting. The `send` action shares the `send-email` rate limit counter, preventing circumvention via the draft-then-send pathway.

Token-optimised architecture — Tools are consolidated using the STRAP (Single Tool, Resource, Action Pattern) approach. 22 tools instead of 55 reduces per-turn overhead by ~11,000 tokens (~64%), keeping more of the AI's context window available for your actual conversation. Fewer tools also means the AI selects the right tool more accurately — research shows tool selection degrades beyond ~40 tools.

> Important: These safeguards are defence-in-depth measures that reduce risk, but they are not a guarantee against unintended actions. AI-driven access to your email is inherently sensitive — always review tool calls before approving, particularly for sends and deletes. No automated guardrail is foolproof, and you remain responsible for actions taken through your mailbox.

Quick Start

1. Install

bash
npm install -g @littlebearapps/outlook-assistant

Or run directly without installing:

bash
npx @littlebearapps/outlook-assistant

2. Register an Azure App

You need a Microsoft Azure app registration to authenticate. See the **Azure Setup Guide** for a detailed walkthrough (including first-time Azure account creation), or if you've done this before:

1. Create a new app registration at portal.azure.com

2. Add Microsoft Graph delegated permissions (Mail, Calendar, Contacts)

3. Create a client secret and copy the Value (not the Secret ID)

4. Under Authentication > Add a platform > Mobile and desktop applications — check `nativeclient` URI

5. Enable "Allow public client flows" in Authentication > Advanced settings

6. _(Optional)_ Set redirect URI to `http://localhost:3333/auth/callback` — only needed for browser auth flow

3. Configure Your MCP Client

Add to your MCP client config:

Claude Desktop (claude_desktop_config.json)

json
{
  "mcpServers": {
    "outlook": {
      "command": "npx",
      "args": ["@littlebearapps/outlook-assistant"],
      "env": {
        "OUTLOOK_CLIENT_ID": "your-application-client-id",
        "OUTLOOK_CLIENT_SECRET": "your-client-secret-VALUE"
      }
    }
  }
}

Claude Code (CLI)

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

Then set environment variables in your `.env` or shell.

Cursor (.cursor/mcp.json)

Install in Cursor

Or add manually to `.cursor/mcp.json`:

json
{
  "mcpServers": {
    "outlook": {
      "command": "npx",
      "args": ["@littlebearapps/outlook-assistant"],
      "env": {
        "OUTLOOK_CLIENT_ID": "your-application-client-id",
        "OUTLOOK_CLIENT_SECRET": "your-client-secret-VALUE"
      }
    }
  }
}

Windsurf (~/.codeium/windsurf/mcp_config.json)

json
{
  "mcpServers": {
    "outlook": {
      "command": "npx",
      "args": ["@littlebearapps/outlook-assistant"],
      "env": {
        "OUTLOOK_CLIENT_ID": "your-application-client-id",
        "OUTLOOK_CLIENT_SECRET": "your-client-secret-VALUE"
      }
    }
  }
}

4. Authenticate

1. Start the auth server: `outlook-assistant-auth` (or `npx @littlebearapps/outlook-assistant-auth`)

2. In your AI assistant, use the `auth` tool with `action=authenticate` to get an OAuth URL

3. Open the URL, sign in with your Microsoft account, and grant permissions

4. Tokens are saved locally and refresh automatically

> Note: The auth server needs `OUTLOOK_CLIENT_ID` and `OUTLOOK_CLIENT_SECRET` environment variables. Your MCP client's `"env"` config only applies to the MCP server process — when running the auth server separately, ensure these are set in a `.env` file or exported in your shell.

Installation

Prerequisites

  • Node.js 18.0.0 or higher
  • npm (included with Node.js)
  • Azure account for app registration (free tier works)
bash
npm install -g @littlebearapps/outlook-assistant

From source

bash
git clone https://github.com/littlebearapps/outlook-assistant.git
cd outlook-assistant
npm install

Azure App Registration

> First time with Azure? The Azure Setup Guide covers everything from creating an account to your first authentication, including billing setup and common pitfalls.

Create the App

1. Open Azure Portal

2. Sign in with a Microsoft Work or Personal account

3. Search for App registrations and click New registration

4. Enter a name (e.g. "Outlook Assistant Server")

5. Select Accounts in any organizational directory and personal Microsoft accounts

6. Set redirect URI: platform Web, URI `http://localhost:3333/auth/callback`

7. Click Register

8. Copy the Application (client) ID

Add Permissions

1. Go to API permissions > Add a permission > Microsoft Graph > Delegated permissions

2. Add these required permissions:

    3. Optionally add org-only permissions (work/school accounts only):

      4. Click Add permissions

      Create a Client Secret

      1. Go to Certificates & secrets > New client secret

      2. Enter a description and select expiration

      3. Click Add

      4. Copy the secret Value immediately — you won't be able to see it again. Use the Value, not the Secret ID.

      Configuration

      Environment Variables

      Create a `.env` file from the example:

      bash
      cp .env.example .env

      Edit with your Azure credentials:

      bash
      OUTLOOK_CLIENT_ID=your-application-client-id
      OUTLOOK_CLIENT_SECRET=your-client-secret-VALUE
      USE_TEST_MODE=false

      > Note: The server also accepts `MS_CLIENT_ID` and `MS_CLIENT_SECRET` for backwards compatibility.

      Optional overrides (v3.8.0+) — see `.env.example` for the full list with commented worked examples:

      VariablePurposeDefault
      `OUTLOOK_AUTH_AUDIENCE`OAuth audience: `common`, `consumers` (personal-only Azure apps), `organizations`, or single-tenant GUID. Fixes `AADSTS9002331` for personal-only app registrations.`common`
      `OUTLOOK_DEFAULT_TIMEZONE`IANA timezone applied to calendar events when callers don't pass one (e.g. `Europe/London`, `America/New_York`).`Australia/Melbourne`
      `OUTLOOK_MAX_EMAILS_PER_SESSION`Cap on `send-email` + `draft send` per MCP server lifetime.unlimited
      `OUTLOOK_ALLOWED_RECIPIENTS`Comma-separated allowlist of domains/addresses for sends, drafts, and rule forwards.unrestricted

      MCP Client Configuration

      See Quick Start — Configure Your MCP Client above for Claude Desktop, Claude Code, Cursor, and Windsurf configs.

      If installed from source, use `node` instead of `npx`:

      json
      {
        "mcpServers": {
          "outlook": {
            "command": "node",
            "args": ["/path/to/outlook-assistant/index.js"],
            "env": {
              "OUTLOOK_CLIENT_ID": "your-application-client-id",
              "OUTLOOK_CLIENT_SECRET": "your-client-secret-VALUE"
            }
          }
        }
      }

      Authentication Flow

      No auth server needed. Works everywhere, including remote/headless environments.

      1. Ask your AI assistant to authenticate (calls `auth` tool with `action=authenticate`)

      2. Visit the URL shown (`microsoft.com/devicelogin`) on any browser, any device

      3. Enter the code, sign in with your Microsoft account, and grant permissions

      4. Tell your AI assistant to complete authentication (calls `auth` with `action=device-code-complete`)

      5. Tokens are saved to `~/.outlook-assistant-tokens.json` and refresh automatically

      > Prerequisite: Enable "Allow public client flows" in Azure Portal > your app > Authentication > Advanced settings.

      >

      > Server restarts (v3.7.2+): Device code state is persisted to `~/.outlook-assistant-pending-auth.json`, so `device-code-complete` works even if the MCP server restarts between steps 1 and 4 (e.g., Untether/Telegram bridge, Claude Desktop session changes).

      Browser Redirect Flow (Alternative)

      For localhost development or if you prefer the traditional OAuth flow:

      bash
      npm run auth-server

      This starts a local server on port 3333 to handle the OAuth callback.

      1. In your AI assistant, use the `auth` tool with `action=authenticate, method=browser`

      2. Open the provided URL in your browser

      3. Sign in and grant permissions — tokens are saved automatically

      > Note: The auth server reads `OUTLOOK_CLIENT_ID` and `OUTLOOK_CLIENT_SECRET` from environment variables. Your MCP client's `"env"` config only applies to the MCP server process, not a separately-started auth server.

      Directory Structure

      code
      outlook-assistant/
      ├── index.js                 # Main entry point (22 tools)
      ├── config.js                # Configuration settings
      ├── outlook-auth-server.js   # OAuth server (port 3333)
      ├── auth/                    # Authentication module (1 tool)
      ├── email/                   # Email module (7 tools)
      │   ├── mail-tips.js         # Pre-send recipient validation
      │   ├── headers.js           # Email header retrieval
      │   ├── mime.js              # Raw MIME/EML content
      │   ├── conversations.js     # Thread listing/export
      │   ├── attachments.js       # Attachment operations
      │   └── ...
      ├── calendar/                # Calendar module (3 tools)
      ├── contacts/                # Contacts module (2 tools)
      ├── categories/              # Categories module (3 tools)
      ├── settings/                # Settings module (1 tool)
      ├── folder/                  # Folder module (1 tool)
      ├── rules/                   # Rules module (1 tool)
      ├── advanced/                # Advanced module (2 tools)
      └── utils/
          ├── graph-api.js         # Microsoft Graph API client (includes $batch)
          ├── safety.js            # Rate limiting, recipient allowlist, dry-run
          ├── odata-helpers.js     # OData query building
          ├── field-presets.js     # Token-efficient field selections
          ├── response-formatter.js # Verbosity levels
          └── mock-data.js         # Test mode data

      Troubleshooting

      "Cannot find module '@modelcontextprotocol/sdk/server/index.js'"

      bash
      npm install

      "EADDRINUSE: address already in use :::3333"

      bash
      npx kill-port 3333
      npm run auth-server

      "Invalid client secret" (AADSTS7000215)

      You're using the Secret ID instead of the Secret Value. Go to Azure Portal > Certificates & secrets and copy the Value column.

      Authentication URL doesn't work

      If using browser flow: start the auth server first with `npm run auth-server`. If using device code flow: visit `microsoft.com/devicelogin` instead.

      Device code "invalid_client"

      Enable "Allow public client flows" in Azure Portal > App registrations > Authentication > Advanced settings.

      Token refresh fails after ~60 minutes (device code auth)

      Fixed in v3.7.2. Earlier versions sent `client_secret` in token refresh requests for device-code auth, which Microsoft rejects for public client flows. Update to v3.7.2+ or re-authenticate.

      Empty API responses

      Check authentication status with the `auth` tool (action=status). Tokens may have expired — re-authenticate if needed.

      Development

      Running Tests

      bash
      npm test                     # Jest unit tests
      npm run inspect              # MCP Inspector (interactive)

      Test Mode

      Run with mock data (no real API calls):

      bash
      USE_TEST_MODE=true npm start

      Extending the Server

      1. Create a new module directory (e.g. `tasks/`)

      2. Implement tool handlers in separate files

      3. Export tool definitions from the module's `index.js`

      4. Import and add tools to the `TOOLS` array in main `index.js`

      5. Add tests in `test/`

      6. Update `docs/quickrefs/tools-reference.md`

      Documentation

      GuideDescription
      Getting StartedInstall, configure, and authenticate — start here
      Azure Setup GuideAzure account creation, app registration, permissions, and secrets
      How-To Guides29 practical guides for email, calendar, contacts, and settings
      RoadmapActive milestones (v3.7.5, v3.8.x, v3.10.0+) and recent releases
      Troubleshooting & FAQCommon problems, re-authentication, and frequently asked questions
      Tools ReferenceAll 22 tools with parameters
      AI Agent GuideTool selection and workflow patterns for AI agents

      Full documentation: docs/

      Known Limitations

      • Personal account search: Free-text `query` and the raw `searchExpression` (formerly `kqlQuery`) rely on Microsoft's `$search` API, which has limited support on personal Outlook.com accounts — field-scoped raw `$search` (e.g. `subject:"…"`) may return nothing there. `query` mitigates this with progressive fallback (OData filters, then client-side), so for reliable personal-account search prefer structured filters (`from`, `subject`, `to`, `receivedAfter`) or `query`. Cross-folder search (`searchAllFolders: true`) returns a superset of inbox-only results.
      • Focused Inbox: Only available on work/school Microsoft 365 accounts.
      • Shared mailboxes: Require `Mail.Read.Shared` permission and a work/school account.
      • Meeting room search: Requires `Place.Read.All` permission with admin consent (work/school accounts only).
      • Export default path: Exports save to the system temp directory by default. Use `savePath` or `outputDir` to specify a different location.

      Contributing

      Contributions are welcome! Please see CONTRIBUTING.md for guidelines.

      Security

      For security concerns, please see our Security Policy. Do not open public issues for vulnerabilities.

      Changelog

      See CHANGELOG.md for version history.

      About

      Built and maintained by Little Bear Apps. Outlook Assistant is open source under the MIT License.

      Frequently asked questions

      What is outlook-assistant?

      outlook-assistant is MCP server for Outlook email, calendar, and contacts — let your AI assistant manage your inbox directly from the conversation.

      How do I install outlook-assistant?

      Open the GitHub repository and follow its README. Most MCP servers are added to your client's MCP config, then called by your agent.

      Is outlook-assistant open source?

      Yes — it is hosted on GitHub at https://github.com/littlebearapps/outlook-assistant and has 36 stars.

      Related MCP tools

      atlassianatlassian-mcp-server

      Official remote MCP server for Atlassian. Securely connect Jira, Confluence, Jira Service Management, Bitbucket, and Compass to Claude, ChatGPT, Cursor, VS Code, and other AI tools using OAuth 2.1 or API tokens.

      1,015 JavaScript
      aiai-agentsatlassian+17
      IvanMurzakUnity-MCP

      AI Skills, MCP Tools, and CLI for Unity Engine. Full AI develop and test loop. Use cli for quick setup. Efficient token usage, advanced tools. Any C# method may be turned into a tool by a single line. Works with Claude Code, Gemini, Copilot, Cursor and any other absolutely for free.

      4,137 C#
      aiai-integrationgame-development+16
      jgravellejcodemunch-mcp

      Cut AI token costs 95%+ on code exploration. The leading MCP server for precise, symbol-level GitHub code retrieval via tree-sitter AST. Works with Claude Code, Cursor & any MCP client. 313B+ tokens saved.

      2,651 Python
      claudeclaude-codeai-coding+17
      riponcmprojectmem

      Open-source coding agent memory. Records issues, attempts, fixes and decisions, then warns your agent before it repeats an approach that already failed. Native MCP server for Claude Code, Cursor, Antigravity and Codex. 100% local, no cloud, no telemetry. MIT.

      796 Python
      ai-agentsai-memoryai-tools+17
      sonnylazuardicursor-talk-to-figma-mcp

      CTTF: MCP integration between Cursor and Figma, allowing Cursor Agentic AI to communicate with Figma for reading designs and modifying them programmatically.

      5,539 JavaScript
      agentagenticagentic-ai+11
      CoplayDevunity-mcp

      Unity MCP acts as a bridge between AI assistants and your Unity Editor. Give your LLM tools to manage assets, control scenes, edit scripts, and automate tasks within Unity.

      13,915 C#
      aiai-integrationmcp+13

      Run your own MCP server? See who uses it and what to fix.

      Measure it with TrackMCP