msgraph mcp
特性
26工具 跨邮件、日历、联系人和日程安排:
邮件
- 阅读 --列出文件夹、邮件、搜索(OData
$search),附件(1.5 MB以下的文件采用内联base64) - 编排 --默认情况下,发送、回复、全部回复、转发带有模拟预览
- 草稿 --创建、更新、附加文件,然后在准备就绪时发送
- 组织 --标记已读/未读、标记、分类、移动到文件夹、软删除或硬删除
- 批量 --多通道过滤操作(删除、标记已读/未读、移动),带模拟运行预览,每次通话最多1000条消息
- 文件夹和别名 --创建邮件文件夹,列出发件人地址
日历
- 阅读 --列出日历、事件(默认窗口:昨天到14天后)、完整的事件详细信息
- 写 --创建、更新、删除/取消包含与会者、正文、位置和全天支持的事件
- 共享日历 --通过以下方式对其他用户的日历进行完全读/写访问
user_id参数 - 调度 --检查多个用户的忙/闲状态,或让Graph建议最佳会议时间
- 回复 --接受、拒绝或暂时接受会议邀请
联系人
- 人物搜索 -使用人员API将显示名称解析为电子邮件地址
认证
- 设备代码流 --交互式三步认证(
start_auth→ 用户批准→finish_auth) - 多账户 --缓存并在多个Microsoft帐户之间切换
- 框架模式 --通过环境变量接受预认证令牌以进行无服务器部署
工具参考
| 区域 | 工具 | 描述 |
|---|---|---|
| 认证 | auth_status | 显示配置和缓存帐户 |
| 认证 | start_auth | 开始设备代码流(返回URL+代码) |
| 认证 | finish_auth | 用户批准后完成设备代码流 |
| 邮件 | list_folders | 列出包含项目/未读计数的邮件文件夹 |
| 邮件 | list_messages | 列出文件夹中的邮件(限制50封) |
| 邮件 | get_message | 完整的消息详细信息,包括正文 |
| 邮件 | search_messages | 通过OData搜索 $search (限值50) |
| 邮件 | list_attachments | 列出邮件的附件元数据 |
| 邮件 | get_attachments | 下载单个附件 |
| 邮件 | send_message | 发送新电子邮件(默认情况下为模拟运行) |
| 邮件 | reply_to_message | 回复或全部回复(默认为模拟运行) |
| 邮件 | forward_message | 转发消息(默认情况下为模拟运行) |
| 邮件 | create_draft | 创建草稿而不发送 |
| 邮件 | manage_draft | 更新或发送现有草稿 |
| 邮件 | add_attachment_to_draft | 将文件附加到草稿中 |
| 邮件 | update_message | 标记已读/未读、标记或分类 |
| 邮件 | move_message | 移动到文件夹(支持知名名称) |
| 邮件 | delete_message | 软删除或永久删除 |
| 邮件 | bulk_manage_messages | 干运行批量过滤操作(限制1000) |
| 邮件 | create_folder | 创建新邮件文件夹 |
| 邮件 | list_aliases | 列出电子邮件别名/发件人地址 |
| 日历 | list_calendars | 列出日历(自己的或通过共享 user_id) |
| 日历 | list_events | 列出时间范围内的事件(限制100) |
| 日历 | get_event | 与会者的完整活动详情 |
| 日历 | create_event | 创建日历事件 |
| 日历 | update_event | 更新现有事件 |
| 日历 | delete_event | 删除或取消事件 |
| 日历 | respond_to_event | 接受、拒绝或暂时接受 |
| 日历 | check_availability | 忙/闲查询或会议时间建议 |
| 联系人 | search_people | 按姓名搜索联系人(限制50个) |
先决条件
- Python 3.11+
- Azure应用程序注册 具有委派的Microsoft Graph权限(见下文)
- 紫外线 (推荐)或pip
Azure应用程序注册
在中创建应用程序注册 微软Entra管理中心 (Azure AD)。
1.支持的账户类型
选择一个:
- 仅此组织目录中的帐户 --单租户
- 任何组织目录中的帐户 --多租户工作/学校账户
2.身份验证
- 启用 允许公共客户端流 (设备代码流所需)
3.API权限
添加 委派 Microsoft图形权限:
| 许可 | 目的 |
|---|---|
User.Read | 读取已登录的用户配置文件 |
Mail.ReadWrite | 读取、移动、标记、分类、删除邮件 |
Mail.Send | 发送邮件、回复、转发 |
Calendars.ReadWrite | 读取和写入日历事件 |
Calendars.ReadWrite.Shared | 访问共享/委派日历 |
People.Read | 按姓名搜索联系人 |
对于 只读 使用、更换 Mail.ReadWrite 和 Mail.Send 和 Mail.Read,以及 Calendars.ReadWrite / Calendars.ReadWrite.Shared 和 Calendars.Read写入工具将返回权限错误,但其他一切正常。
4.管理员同意
如果组织的政策要求,授予租户管理员同意。
配置
复制 .env.example 到 .env 并填写您的值:
cp .env.example .env| 变量 | 默认值 | 描述 |
|---|---|---|
MICROSOFT_CLIENT_ID | *(必填)* | Azure应用程序注册客户端ID |
MICROSOFT_TENANT_ID | common | organizations (仅限工作/学校), common (任何)或特定租户GUID |
MICROSOFT_SCOPES | User.Read Mail.ReadWrite Mail.Send Calendars.ReadWrite Calendars.ReadWrite.Shared People.Read | 以空格分隔的委派权限 |
MICROSOFT_TOKEN_CACHE_PATH | .data/msal_token_cache.json | 本地WAVEtoken缓存的路径 |
MAX_ATTACHMENT_INLINE_SIZE | 1572864 | 内联base64的最大附件大小(字节)(默认1.5 MB) |
建议租户值:
organizations--仅限工作/学校账户(最常见于企业)- 特定租户GUID--锁定单个组织的身份验证
common--任何Microsoft帐户(工作、学校或个人)
部署
本地(stdio)
默认传输是stdio,适用于桌面MCP客户端,如Claude Code、Claude desktop、Cursor和VS Code。
# Install dependencies
uv sync
# Run the server
uv run msgraph-mcp或者使用pip:
pip install -e .
msgraph-mcpMCP客户端配置
添加到MCP客户端的配置中(例如Claude Desktop claude_desktop_config.json, .mcp.json 克劳德代码等):
{
"mcpServers": {
"msgraph-mcp": {
"type": "stdio",
"command": "uv",
"args": ["run", "msgraph-mcp"],
"env": {
"MICROSOFT_CLIENT_ID": "your-client-id",
"MICROSOFT_TENANT_ID": "your-tenant-id"
}
}
}
}如果你使用 .env 项目目录中的文件 env 块可以省略。
云——带有mcp Lambda包装器的AWS Lambda(ChatGPT,Claude.ai)
用于 远程MCP客户端 与ChatGPT和Claude.ai一样,此服务器可以使用以下方式部署为无服务器AWS Lambda函数 mcp云包装该框架将任何基于stdio的MCP服务器封装在Amazon Bedrock AgentCore网关后面,并提供完整的OAuth 2.0和动态客户端注册(RFC 7591)支持——此项目中不需要更改代码。
框架提供了什么:
- 无服务器部署 --将此MCP服务器作为AgentCore网关后面的Lambda子进程运行
- 每用户OAuth --每个用户使用自己的Microsoft帐户进行身份验证;令牌存储在AWS Secrets Manager中,并自动刷新
- 呼叫者身份验证 --Cognito JWT验证所有入站请求
- 动态客户端注册 --MCP客户端(ChatGPT、Claude.ai)通过标准进行自我注册
/register端点 - 零闲置成本 --Lambda函数按需启动
它是如何工作的:
- MCP客户端向AgentCore网关端点发送工具调用
- 该框架验证调用者的JWT,提取他们的身份,并从Secrets Manager加载他们的Microsoft Graph OAuth令牌
- 令牌被注入为
GRAPH_ACCESS_TOKEN进入此服务器的环境 - 此服务器作为子进程运行,读取令牌,并对Microsoft Graph执行该工具
- 如果用户尚未进行身份验证,
start_auth返回框架的OAuth URL,而不是设备代码
该项目被用作 参考示例服务 在mcp lambda包装器中——请参见 infra/lambda/services/msgraph/ 在该仓库中查看完整配置。
快速部署(来自mcp lambda包装器仓库):
# One-time: deploy shared infrastructure (Cognito, DCR, OAuth callback)
make deploy-shared
# Create the Azure app secret
aws secretsmanager create-secret \
--name mcp-wrappers-msgraph-service-secrets \
--secret-string '{"MICROSOFT_CLIENT_ID": "your-client-id"}'
# Generate tool definitions and deploy
make gen-tools SERVICE=msgraph
make deploy-service SERVICE=msgraph框架环境变量
在框架内运行时,此服务器通过这些注入的环境变量自动检测Lambda模式:
| 变量 | 描述 |
|---|---|
GRAPH_ACCESS_TOKEN | 预认证的Microsoft Graph访问令牌(每个用户) |
OAUTH_AUTHENTICATED | 设置为 true 身份验证完成时 |
OAUTH_USER_ID | 经过身份验证的用户标识符 |
OAUTH_AUTH_URL | OAuth授权URL(当用户需要进行身份验证时显示) |
SERVICE_NAME | 框架的服务标识符 |
在此模式下:
- 绕过了SWATdevice代码流——令牌由框架注入
- 不使用本地令牌缓存(与Lambda等只读文件系统兼容
/var/task) auth_status报告框架管理的令牌状态start_auth/finish_auth返回通过框架的OAuth流进行身份验证的指导
码头工人
虽然不包含Dockerfile,但服务器可以容器化:
FROM python:3.12-slim
WORKDIR /app
COPY . .
RUN pip install --no-cache-dir .
ENV MICROSOFT_CLIENT_ID=""
ENV MICROSOFT_TENANT_ID="organizations"
EXPOSE 8000
CMD ["msgraph-mcp"]对于持久身份验证,请为令牌缓存挂载一个卷:
docker run -v msgraph-data:/app/.data \
-e MICROSOFT_CLIENT_ID=your-id \
-e MICROSOFT_TENANT_ID=your-tenant \
msgraph-mcp安全默认值
写入操作默认为安全行为:
| 功能 | 默认值 | 注释 |
|---|---|---|
send_message | dry_run=True | 创建临时草稿以供预览,然后将其删除 |
reply_to_message | dry_run=True | 发送前预览 |
forward_message | dry_run=True | 发送前预览 |
bulk_manage_messages | dry_run=True | 显示匹配项而不执行 |
delete_message | permanent=False | 移动到已删除邮件(可恢复) |
安全
- 路径段验证 --在URL插值之前,所有用户提供的ID都会根据安全字符模式进行验证,从而阻止路径遍历
- 下一环节强化 --分页仅遵循配置的Graph主机上的HTTPS URL
- 搜索净化 --从OData中删除双引号
$search查询 - 使用回退重试 --HTTP 429和暂时性5xx错误的自动重试(3次尝试,各方面
Retry-After) - 翻译错误 -原始Graph API有效负载从不向调用方公开
- 令牌缓存权限 --缓存文件
0600,父目录0700,符号链接被拒绝
看 安全\_ REVIEW.md 对于完整的威胁模型和剩余风险。
发展
# Install with dev dependencies
uv sync --dev
# Run tests
uv run pytest
# Or with pip
pip install -e '.[dev]'
pytest烟雾测试线束
用于在没有完整MCP客户端的情况下进行手动测试的CLI线束:
# Auth
python3 scripts/smoke_test.py status
python3 scripts/smoke_test.py start-auth
python3 scripts/smoke_test.py finish-auth
python3 scripts/smoke_test.py list-accounts
# Mail
python3 scripts/smoke_test.py list-folders
python3 scripts/smoke_test.py list-messages --folder inbox --limit 5
python3 scripts/smoke_test.py get-message MESSAGE_ID
python3 scripts/smoke_test.py search-messages "search term"
python3 scripts/smoke_test.py mark-message-read MESSAGE_ID
python3 scripts/smoke_test.py move-message MESSAGE_ID archive
python3 scripts/smoke_test.py delete-message MESSAGE_ID
python3 scripts/smoke_test.py bulk-manage-messages --sender-contains "newsletters" --limit 50
# Calendar
python3 scripts/smoke_test.py list-calendars
python3 scripts/smoke_test.py list-events --limit 10
python3 scripts/smoke_test.py get-event EVENT_ID许可证
看 许可证 了解详情。
