outlook-mcp
A small, self-hosted MCP server that gives an LLM (Claude Code, Claude Desktop, or any MCP client) read-only access to a personal Outlook.com mailbox (outlook.com / hotmail.com / live.com) through the Microsoft Graph API.
It authenticates against Microsoft's consumer OAuth endpoint (/consumers), which is
what lets personal Microsoft accounts sign in. Most "Microsoft 365" connectors are
registered as work/school-only apps and will reject a personal account — this one is built
specifically for personal mailboxes.
Your data stays local. The server runs on your machine and caches your OAuth token in
~/.outlook-mcp/token.json(file permissions600). Nothing is sent anywhere except directly to Microsoft Graph.
Tools
| Tool | Description |
|---|---|
search_mail(query, max_results) |
Full-text search across the mailbox. |
list_recent_mail(max_results, unread_only) |
Newest inbox messages. |
get_message(message_id) |
Full content of one message. |
All tools are read-only — the app requests only the Mail.Read scope. No send, no delete.
Setup
1. Register your own Azure app (free — no paid subscription needed)
Each user brings their own app registration, so no shared infrastructure or credentials.
- Go to https://entra.microsoft.com → App registrations → New registration.
- Name: anything, e.g.
Outlook MCP. - Supported account types: Personal Microsoft accounts only (or "any org directory and personal Microsoft accounts" if you also use work accounts).
- Redirect URI: platform Public client/native (mobile & desktop), value:
http://localhost:8765/callback - Register, then copy the Application (client) ID from the Overview page.
- Authentication → enable Allow public client flows → Save.
- API permissions → Add a permission → Microsoft Graph → Delegated →
add
Mail.Read(alsooffline_accessandUser.Readif not auto-added). No admin consent is required for a personal account.
2. Install
With uv (recommended):
# clone, then from the repo root:
uv sync
Or install into any environment with pip:
pip install .
3. Configure and sign in (one time)
# PowerShell
$env:OUTLOOK_MCP_CLIENT_ID = "<your-application-client-id>"
uv run outlook-mcp-auth
# bash / zsh
export OUTLOOK_MCP_CLIENT_ID="<your-application-client-id>"
uv run outlook-mcp-auth
A browser opens; sign in and approve. Your refresh token is cached and auto-renews after that.
4. Register with your MCP client
Claude Code:
claude mcp add --scope user outlook \
--env OUTLOOK_MCP_CLIENT_ID=<client-id> \
-- uv --directory /path/to/outlook-mcp run outlook-mcp
Claude Desktop / other clients — add to the MCP config file:
{
"mcpServers": {
"outlook": {
"command": "uv",
"args": ["--directory", "/path/to/outlook-mcp", "run", "outlook-mcp"],
"env": { "OUTLOOK_MCP_CLIENT_ID": "<client-id>" }
}
}
}
A one-click Desktop Extension bundle (manifest.json) is also included — see
Desktop Extension below.
Configuration
| Env var | Required | Default | Purpose |
|---|---|---|---|
OUTLOOK_MCP_CLIENT_ID |
yes | — | Application (client) ID from your Azure app registration. |
OUTLOOK_MCP_REDIRECT_PORT |
no | 8765 |
Loopback port; must match the redirect URI port you registered. |
Desktop Extension
manifest.json follows the MCP Bundle / Desktop Extension
spec. It prompts the user for their client ID on install. To build the installable bundle:
npx @anthropic-ai/mcpb pack
Then open the resulting .mcpb file with Claude Desktop.
Re-authenticating
If the cached token is revoked or expires beyond refresh, just run the sign-in again:
uv run outlook-mcp-auth
Security notes
- Read-only (
Mail.Read) — the server cannot send, move, or delete mail. - Tokens never leave your machine;
~/.outlook-mcp/token.jsonis excluded from git. - Each user uses their own Azure app registration, so there is no shared client secret.
License
MIT — see LICENSE.
Metadata
Release files for outlook-personal-mcp 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| outlook_personal_mcp-0.1.0.tar.gz | 67.1 kB | With provenance | Details for outlook_personal_mcp-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| outlook_personal_mcp-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for outlook_personal_mcp-0.1.0-py3-none-any.whl |
Total release size: 76.1 kB
Release files / outlook_personal_mcp-0.1.0.tar.gz
| Download URL | outlook_personal_mcp-0.1.0.tar.gz |
|---|---|
| Size | 67.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ebff1c5848cc66c3c4fca2a7c44f51c72b028f27531eec1b79522b5a1a9123ac
|
|
BLAKE2b-256 checksum How to use checksums |
ddd1e70c3ff1def518b0410463df54629c5f4ff70cb75430a806386dcc044b54
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 29, 2026.
Transparency logRelease files / outlook_personal_mcp-0.1.0-py3-none-any.whl
| Download URL | outlook_personal_mcp-0.1.0-py3-none-any.whl |
|---|---|
| Size | 9.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
6b392cf5dc2f29c417ac1f4f06e637d6dd7fbf86aacd430542b47c095e252c0f
|
|
BLAKE2b-256 checksum How to use checksums |
d176d548eb3261e056e57d2f8127a98c993f5eec35ff7f234d5380537b70eed7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 29, 2026.
Transparency logSecurity for outlook-personal-mcp 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for outlook_personal_mcp-0.1.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 29, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.