Skip to main content
Glama
dhtim135

outlook-mcp-server

by dhtim135
README.md
# outlook-mcp-server

A lightweight [Model Context Protocol (MCP)](https://modelcontextprotocol.io) server for personal Microsoft Outlook / Hotmail accounts. It connects Claude (or any MCP-compatible AI) to your inbox via the Microsoft Graph API, using OAuth 2.0 device-code flow — no service account or admin consent required.

## Tools

| Tool | Parameters | Description |
|---|---|---|
| `search_emails` | `query`, `max_results` | Search your inbox using KQL (Keyword Query Language). Supports filtering by sender, subject, date, attachment presence, and more. |
| `read_email` | `message_id` | Fetch the full body (plain text + HTML) and headers of a specific email. |
| `list_attachments` | `message_id` | List all attachments on an email, including their IDs, names, sizes, and content types. |
| `download_attachment` | `message_id`, `attachment_id`, `save_path` | Download an attachment and save it to a local file path. |
| `mark_as_read` | `message_id`, `read` | Mark an email as read or unread. |
| `move_email` | `message_id`, `folder` | Move an email to a folder by well-known name (e.g. `inbox`, `deleteditems`, `archive`) or folder ID. |

These tools compose naturally for email-automation workflows — for example: search by sender → read body → download attachments → mark read → move to archive.

## Setup

### 1. Azure App Registration (one-time)

Personal Microsoft accounts still require an Azure App Registration to call Graph.

1. Go to <https://portal.azure.com> → **Microsoft Entra ID** → **App registrations** → **New registration**.
2. Name: `outlook-mcp-server` (or anything).
3. **Supported account types**: choose **"Personal Microsoft accounts only"**.
4. **Redirect URI**: leave blank for now.
5. After creation, copy the **Application (client) ID** — this is your `OUTLOOK_MCP_CLIENT_ID`.
6. Open **Authentication** → enable **"Allow public client flows"** = **Yes** → Save.
7. Open **API permissions** → **Add a permission** → **Microsoft Graph** → **Delegated permissions** → check **`Mail.ReadWrite`** → **Add**. (No admin consent needed for personal accounts.)

### 2. Install

```bash
git clone https://github.com/dhtim135/outlook-mcp-server
cd outlook-mcp-server
uv sync
```

### 3. Authenticate (one-time)

```bash
export OUTLOOK_MCP_CLIENT_ID="<your-client-id>"
uv run python login.py
```

Follow the device code prompt — visit the URL in any browser, enter the code, sign in
with your Hotmail/Outlook.com account, and approve the `Mail.ReadWrite` permission.

The token is cached at `~/.config/outlook-mcp/token-cache.json` (mode 0600). Refresh
tokens are rotated automatically as long as the server is used at least every ~90 days.

### 4. Register with Claude Code

```bash
claude mcp add outlook \
  --env OUTLOOK_MCP_CLIENT_ID="<your-client-id>" \
  -- uv --directory /path/to/outlook-mcp-server run python server.py
```

Or add manually to your MCP config:

```json
{
  "mcpServers": {
    "outlook": {
      "command": "uv",
      "args": [
        "--directory", "/path/to/outlook-mcp-server",
        "run", "python", "server.py"
      ],
      "env": {
        "OUTLOOK_MCP_CLIENT_ID": "<your-client-id>"
      }
    }
  }
}
```

## KQL search examples

```
from:amazon.com
subject:invoice
from:receipts@uber.com received>=2026-01-01
hasattachment:yes from:doordash.com
```

Multiple terms are AND-ed. Quote phrases with spaces.

## Re-authentication

If you see `Token refresh failed`, just re-run `uv run python login.py`.

TDQS

A3.8/5.0

Scored across 6 tools

Disambiguation5/5

Each tool targets a distinct operation (downloading, listing, marking, moving, reading, searching) with no overlap. The resource (email or attachment) and action are clearly separated.

Naming Consistency5/5

All tools follow a consistent verb_noun pattern in snake_case (download_attachment, list_attachments, etc.), making it predictable and easy to navigate.

Tool Count5/5

6 tools is a well-scoped number for an email client MCP server. It covers the essential operations without being bloated or too sparse.

Completeness4/5

The set covers reading, searching, moving, marking read, and attachment handling. Missing send/compose and delete operations, which are common but not critical for a read-focused server.

Maintenance

ActivityInactive
ResponsivenessNo issues