MCP server for Microsoft Teams, Outlook Calendar, and Mail via Microsoft Graph API
Project description
Graph MCP
An MCP server that connects Claude to Microsoft Teams, Outlook Calendar, and Mail through the Microsoft Graph API.
What it does
Gives Claude access to 29 tools:
| Category | Tools |
|---|---|
| Auth | Check status, login (browser OAuth), logout |
| Chats | List chats, read/send messages, create chats, list members |
| Teams & Channels | List teams, list channels, read/send messages, list members, read/send replies |
| Calendar | List calendars, list events (with date range), get event details |
| List emails, read email, search emails, send email, reply to email | |
| Users | Search organization directory |
| Presence | Get/set your presence, get another user's presence |
| Search | Search messages across all chats and channels |
Prerequisites
You need an Azure App Registration:
-
Go to Azure Portal > App registrations > New registration
-
Set platform to Mobile and desktop applications
-
Set redirect URI to
http://localhost:3000/auth/callback -
Mark as Public client (no client secret needed)
-
Under API permissions, add these delegated permissions:
offline_access,openid,profile,User.ReadUser.ReadBasic.AllChat.Read,Chat.ReadWrite,ChatMessage.SendChannelMessage.Read.All,ChannelMessage.SendTeam.ReadBasic.All,Channel.ReadBasic.All,ChannelMember.Read.AllCalendars.ReadMail.Read,Mail.SendPresence.Read,Presence.Read.All,Presence.ReadWrite
Install
pip install graph-mcp
Or from a cloned repo:
pip install -e .
Setup
graph-mcp setup
This asks for your Azure Client ID and Tenant ID, then gives you the exact command:
claude mcp add graph -e AZURE_CLIENT_ID=your-id -e AZURE_TENANT_ID=your-tenant -- /path/to/graph-mcp
Paste it, start Claude Code, and ask Claude to log in. It opens your browser for OAuth sign-in — that's it.
How it works
Claude Code ──stdio──> graph-mcp ──HTTPS──> Microsoft Graph API
│
~/.graph-mcp/
tokens.enc (encrypted)
.key (auto-generated)
- Auth: OAuth2 Authorization Code flow with PKCE. Login opens your browser, a local callback server captures the token. No secrets stored in config.
- Token persistence: Tokens are encrypted with Fernet and stored in
~/.graph-mcp/tokens.enc. The encryption key is auto-generated on first use. Logins survive server restarts. - Token refresh: Access tokens are refreshed automatically before they expire. You only need to log in again if the refresh token itself expires.
- Rate limiting: Sliding window counter with exponential backoff. Respects
Retry-Afterheaders on 429 responses.
Configuration
All configuration is passed via environment variables (set in the MCP config's env block):
| Variable | Required | Default | Description |
|---|---|---|---|
AZURE_CLIENT_ID |
Yes | — | From your Azure App Registration |
AZURE_TENANT_ID |
No | common |
Your Azure tenant ID, or common for multi-tenant |
GRAPH_REDIRECT_URI |
No | http://localhost:3000/auth/callback |
Must match Azure app registration |
GRAPH_TOKEN_ENCRYPTION_KEY |
No | auto-generated | Fernet key for token encryption |
GRAPH_DEBUG |
No | false |
Enable verbose logging |
Troubleshooting
"Approval required" error during login Your Azure app is requesting scopes that aren't registered or need admin consent. Check the API permissions in the Azure portal match the list above.
403 Forbidden on specific tools The endpoint needs a permission that's not in your Azure app registration, or requires admin consent.
Login works but tools say "not authenticated"
Restart the MCP server (claude mcp restart graph) — it may be running an old version.
Disclaimer
This project is an independent open-source effort and is not affiliated with, endorsed by, or sponsored by Microsoft Corporation. Microsoft, Microsoft Teams, Outlook, Microsoft 365, Microsoft Graph, and Azure are trademarks of the Microsoft group of companies.
This software is provided "as is", without warranty of any kind. Use it at your own risk. The authors accept no liability for any damages, data loss, or security issues arising from the use of this software. You are responsible for complying with your organization's policies and Microsoft's API Terms of Use when using this tool.
This software accesses Microsoft services on your behalf using your own credentials and Azure app registration. Data retrieved from Microsoft Graph (emails, messages, calendar events, etc.) is passed to the LLM that invoked the tool. Be mindful of your organization's data handling policies when using this with cloud-hosted AI models.
License
MIT — see LICENSE.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file graph_mcp-0.1.0.tar.gz.
File metadata
- Download URL: graph_mcp-0.1.0.tar.gz
- Upload date:
- Size: 16.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f0034183715ab7d861faf850ea67c06e3f72a21a06f4b8f370ccfdf6709de3e3
|
|
| MD5 |
6aaae428c1ff759dd9049b7360b3407a
|
|
| BLAKE2b-256 |
0b1e0f0a6601ced15842a72d0085ff74e43cbda9234802b83146883f4ceef859
|
Provenance
The following attestation bundles were made for graph_mcp-0.1.0.tar.gz:
Publisher:
publish.yml on JustStas/Graph-MCP
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
graph_mcp-0.1.0.tar.gz -
Subject digest:
f0034183715ab7d861faf850ea67c06e3f72a21a06f4b8f370ccfdf6709de3e3 - Sigstore transparency entry: 975123983
- Sigstore integration time:
-
Permalink:
JustStas/Graph-MCP@d8d64bf751be288430f9523daec0ef7fa67d44df -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/JustStas
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@d8d64bf751be288430f9523daec0ef7fa67d44df -
Trigger Event:
release
-
Statement type:
File details
Details for the file graph_mcp-0.1.0-py3-none-any.whl.
File metadata
- Download URL: graph_mcp-0.1.0-py3-none-any.whl
- Upload date:
- Size: 21.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4ad32377c9bea1920270f24f33e4c5c993acc95ec973f4482fc6c5a297bddce3
|
|
| MD5 |
7cb97b62c28161c38eaf700fc4aa03ce
|
|
| BLAKE2b-256 |
f44f14223cc73a58e0a3e54b59068c78b08ad66210b57440145287ca24e9bbed
|
Provenance
The following attestation bundles were made for graph_mcp-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on JustStas/Graph-MCP
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
graph_mcp-0.1.0-py3-none-any.whl -
Subject digest:
4ad32377c9bea1920270f24f33e4c5c993acc95ec973f4482fc6c5a297bddce3 - Sigstore transparency entry: 975123987
- Sigstore integration time:
-
Permalink:
JustStas/Graph-MCP@d8d64bf751be288430f9523daec0ef7fa67d44df -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/JustStas
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@d8d64bf751be288430f9523daec0ef7fa67d44df -
Trigger Event:
release
-
Statement type: