使用说明
MS365电子邮件MCP服务器
用于Microsoft 365 Outlook电子邮件操作的基于Python的模型上下文协议(MCP)服务器。此服务器使用 OAuth 2.0客户端凭据流 对于身份验证,使其成为自主代理和服务器到服务器场景的理想选择。
内置 FastMCP 为了简化服务器实现,请遵循 AWS API MCP服务器.
特性
此MCP服务器提供以下电子邮件操作:
- 列出邮件 -列出收件箱或特定文件夹中的邮件
- 列出邮件文件夹 -列出所有邮件文件夹
- 列出邮件文件夹邮件 -列出特定文件夹中的邮件
- 获取邮件消息 -按ID获取特定邮件
- 发送邮件 -发送电子邮件
- 删除邮件 -删除邮件
- 创建电子邮件草稿 -创建电子邮件草稿
- 移动邮件 -将邮件移动到另一个文件夹
认证
此服务器使用 OAuth 2.0客户端凭据流 (仅限应用程序的身份验证),非常适合自主代理和后台服务。不需要用户交互。
先决条件
1.Azure应用程序注册
您需要在Azure AD中注册一个应用程序 应用程序权限 (未授权):
- 首选 Azure门户 → Azure Active Directory→ 应用程序注册
- 创建新注册
- 记下:
- 应用程序(客户端)ID
- 目录(租户)ID
- 创建一个 客户端密钥:
- 转到证书和机密→ 新客户机密
- 立即复制机密值(不会再次显示)
- 配置 API权限:
- 转到API权限→ 添加权限→ Microsoft Graph
- 选择 应用程序权限 (未授权)
- 添加以下权限:
Mail.Read-读取用户邮件Mail.ReadWrite-读写用户邮件Mail.Send-以用户身份发送邮件
- 授予管理员同意 (应用程序权限所需)
重要:应用程序权限需要管理员同意。应用程序必须获得同意才能使用这些权限。
2.环境变量
MS365_CLIENT_ID=your-azure-ad-client-id
MS365_CLIENT_SECRET=your-azure-ad-client-secret
MS365_TENANT_ID=your-tenant-id
# Optional: For Government Cloud
MS365_CLOUD_TYPE=gov # Options: "commercial" (default), "gov", "government", "usgov"
# Optional: For shared mailboxes (required for Client Credentials Flow)
MS365_USER_IDENTIFIER=user@domain.com # UserPrincipalName or Graph ID of the shared mailbox
对于共享邮箱很重要:使用客户端凭据流(仅应用程序身份验证)时,您 必须 提供 MS365_USER_IDENTIFIER 因为 /me/ 没有登录用户,端点无法工作。使用UserPrincipalName(例如。, shared-mailbox@domain.com)或共享邮箱的图形ID。
地方发展
此项目使用 紫外线 对于依赖关系管理,类似于 AWS API MCP服务器.
1.安装UV
# Install UV using pip
pip install uv
# Or using Homebrew (macOS)
brew install uv
# Or using the official installer
curl -LsSf https://astral.sh/uv/install.sh | sh
2.安装依赖项
# Install project dependencies
uv sync
# Or install in development mode with dev dependencies
uv sync --dev
3.设置环境变量
export MS365_CLIENT_ID="your-client-id"
export MS365_CLIENT_SECRET="your-client-secret"
export MS365_TENANT_ID="your-tenant-id"
export PORT="8100" # Optional, defaults to 8100
export HOST="0.0.0.0" # Optional, defaults to 0.0.0.0
export LOG_LEVEL="INFO" # Optional, defaults to INFO
export STATELESS_HTTP="true" # Optional, defaults to true
4.运行服务器
使用紫外线(推荐):
# Run using UV
uv run ms365-email-mcp-server
# Or run directly with Python (after uv sync)
python -m ms365_email_mcp_server.server
服务器将于启动 http://localhost:8100 与:
- SSE端点:
http://localhost:8100/message - 健康检查:
http://localhost:8100/health
Docker使用
构建Docker镜像
Dockerfile使用UV进行依赖管理:
docker build -t email-mcp-server .
运行容器
docker run -d \
-p 8100:8100 \
-e MS365_CLIENT_ID="your-client-id" \
-e MS365_CLIENT_SECRET="your-client-secret" \
-e MS365_TENANT_ID="your-tenant-id" \
-e MS365_CLOUD_TYPE="commercial" \
email-mcp-server
使用Docker Compose
创建一个 .env 文件:
MS365_CLIENT_ID=your-client-id
MS365_CLIENT_SECRET=your-client-secret
MS365_TENANT_ID=your-tenant-id
MS365_CLOUD_TYPE=commercial
然后运行:
docker-compose up
或者在分离模式下:
docker-compose up -d
MCP客户端配置
HTTP/SSE端点
服务器作为HTTP/SSE服务器运行。使用以下方式连接到它:
- SSE端点:
http://localhost:8100/message - 健康检查:
http://localhost:8100/health
与MCP客户端一起使用
选项1:HTTP/SSE传输(推荐)
对于支持HTTP/SSE传输的客户端,请配置:
{
"mcpServers": {
"ms365-email": {
"url": "http://localhost:8100/message",
"transport": "sse"
}
}
}
选项2:使用紫外线(用于stdio传输)
如果您想使用UV运行服务器(类似于AWS API MCP服务器),您可以配置:
{
"mcpServers": {
"ms365-email": {
"command": "uvx",
"args": [
"ms365-email-mcp-server@latest"
],
"env": {
"MS365_CLIENT_ID": "your-client-id",
"MS365_CLIENT_SECRET": "your-client-secret",
"MS365_TENANT_ID": "your-tenant-id",
"LOG_LEVEL": "INFO"
}
}
}
}
备注:这需要将包发布到PyPI。对于本地开发,请使用选项1或手动运行服务器 uv run ms365-email-mcp-server.
API 参考
使用的Microsoft Graph API端点
- 列出邮件: 获取/我/消息
- 发送邮件: POST/me/sendMail
- 获取消息:
GET /me/messages/{id} - 删除邮件:
DELETE /me/messages/{id} - 创建草稿:
POST /me/messages - 移动消息:
POST /me/messages/{id}/move - 列出文件夹:
GET /me/mailFolders
政府云支持
对于Azure政府云,设置:
export MS365_CLOUD_TYPE="gov"
这将使用:
- 权限:
https://login.microsoftonline.us - 图形API:
https://graph.microsoft.us
安全说明
- 永远不要将客户端机密提交给版本控制
- 使用环境变量或秘密管理系统
- 定期轮换客户端机密
- 考虑在Azure中使用托管身份进行生产
- 应用程序权限需要管理员同意
故障排除
“获取令牌失败”
- 验证您的
MS365_CLIENT_ID,MS365_CLIENT_SECRET,以及MS365_TENANT_ID是正确的 - 确保已授予应用程序权限的管理员同意
- 检查客户端密码是否未过期
“权限不足”
- 验证是否已授予所有必需权限的管理员同意
- 检查您是否正在使用 应用程序权限 (非委托权限)
“无效租户”
- 验证您的
MS365_TENANT_ID是正确的 - 对于政府云,确保
MS365_CLOUD_TYPE设置为"gov"
许可证
麻省理工学院
