Microsoft Graph MCP服务器
提供对Microsoft Graph API的身份验证访问的FastMCP服务器,可使用Azure Developer CLI(azd)部署到Azure应用程序服务。
此MCP服务器使AI助手能够通过使用Azure AD的安全、基于令牌的身份验证流,代表用户与Microsoft 365服务进行交互。
特性
- Azure AD 身份验证:使用代表(OBO)流进行安全的OAuth2身份验证
- Microsoft图形集成:访问用户配置文件、电子邮件和其他Microsoft 365资源
- FastMCP框架:基于FastMCP构建,便于MCP服务器开发
- Azure部署就绪:包括完整的基础设施代码和二头肌模板
可用工具
服务器公开了以下MCP工具:
get_user_info:从访问令牌声明中返回有关经过身份验证的Azure用户的信息greet_user:从Microsoft Graph检索用户的个人资料并返回个性化问候语display_access_token:为直接API调用返回用户的Graph API访问令牌list_email_messages:电子邮件检索占位符(正在实施中)
建筑
服务器使用:
- FastMCP 使用针对OAuth2流的Azure身份验证提供程序
- 代表流动:将MCP连接令牌替换为Microsoft Graph令牌
- Microsoft Graph SDK:用于类型安全的Graph API交互
- 图形助手:自定义包装(
src/graph_helpers/graph.py)用于Graph客户端管理
认证流程
- 客户端使用Azure AD进行身份验证并获取访问令牌
- 客户端使用访问令牌连接到MCP服务器
- 服务器使用验证令牌
AzureProvider - 对于Graph API调用,服务器使用OBO流将令牌交换为Graph访问令牌
- 服务器代表用户进行经过身份验证的Graph API调用
先决条件
- Azure开发者命令行界面(azd)
- Python 3.12或更高版本
- Azure订阅
- 具有适当Microsoft Graph权限的Azure AD应用程序注册
所需的环境变量
创建一个 .env 文件或设置以下环境变量:
AZURE_CLIENT_ID=
AZURE_CLIENT_SECRET=
AZURE_TENANT_ID=
AZURE_GRAPH_USER_SCOPES="User.Read Mail.Read" # Space-separated scopesAzure AD应用程序配置
您的Azure AD应用程序注册需要:
- API权限:
- Microsoft Graph>委派权限> User.Read - Microsoft Graph>委派权限> Mail.Read (如果使用电子邮件功能)
- 认证:
- 根据部署需要配置重定向URI - 在身份验证设置中启用“访问令牌”和“ID令牌”
- 公开API:
- 添加应用ID URI(例如。, api://) - 定义范围(例如。, read)那场比赛 required_scopes 在 app.py
- 证书和秘密:
- 创建客户端密钥并安全存储
用法
地方发展
- 克隆存储库
git clone
cd graph_mcp- 安装依赖项
pip install -e .- 在中配置环境变量
.env
- 在本地运行服务器
python src/app.py服务器将于启动 http://localhost:8000
部署到Azure
- 克隆仓库并安装AZD
- 登录到您的Azure帐户。
azd auth login注意:如果使用政府云,您需要在登录前配置azd以使用该云
azd config set cloud.name AzureUSGovernment
azd auth login- 运行以下命令以构建应用程序的可部署副本,将模板的基础架构配置到Azure,并将应用程序代码部署到新配置的资源。
azd up注意:第一次运行会提示您 Enter a unique environment name: 这将用作将创建的用于保存所有Azure资源的资源组的前缀。此名称在您的Azure订阅中应该是唯一的。此命令将提示您输入以下信息:
Azure Location:部署资源的Azure位置。Azure Subscription:部署资源的Azure订阅。
注意:这可能需要一段时间才能完成,因为它执行三个命令:azd package(构建应用程序的可部署副本),azd provision(提供Azure资源),以及azd deploy(部署应用程序代码)。在打包、配置和部署应用程序时,您将看到一个进度指示器。
- 然后更改app.py并运行
azd deploy再次更新您的更改。
项目结构
graph_mcp/
├── src/
│ ├── app.py # Main FastMCP server with authentication
│ ├── requirements.txt # Python dependencies
│ └── graph_helpers/
│ └── graph.py # Microsoft Graph client wrapper
├── infra/
│ ├── main.bicep # Main Bicep infrastructure template
│ ├── main.parameters.json # Infrastructure parameters
│ └── resources.bicep # Azure resources definition
├── azure.yaml # Azure Developer CLI configuration
├── pyproject.toml # Python project configuration
└── README.md应用服务定价
该模板使用Azure应用服务。您可以通过编辑选择不同的定价级别 /infra/resources.bicep:
- 自由层(F1):最多10个应用程序,CPU/RAM有限-将第58行更改为
"F1" - 基本级别(B1):默认,适合开发-
"B1"(当前设置) - 开发人员级别(D1):更多应用程序的折扣率-
"D1"
请参阅 应用服务定价指南 了解详情。
添加更多工具
要使用其他Microsoft Graph功能扩展服务器,请执行以下操作:
- 在中添加新的工具功能
src/app.py使用@mcp.tool()装饰器 - 使用
get_access_token()检索经过身份验证的用户的令牌 - 呼叫
_get_graph_client(token)获取经过身份验证的Graph客户端 - 使用Graph SDK方法与Microsoft 365服务交互
例子:
@mcp.tool()
async def get_calendar_events() -> dict:
"""Get the user's calendar events."""
token = get_access_token()
graph = await _get_graph_client(user_token=token)
# Use graph.user_client.me.calendar.events.get() etc.
...安全考虑
- 安全地存储机密(在生产中使用Azure密钥库)
- 为Graph API访问实现正确的范围验证
- 对所有生产部署使用HTTPS
- 遵循Graph API权限最小的原则
- 定期轮换客户机密
故障排除
身份验证错误:验证您的Azure AD应用程序注册设置,并确保客户端ID、机密和租户ID正确。
图形API权限错误:检查您的应用程序注册是否具有所需的委托权限和管理员同意(如果需要)。
海外建筑运营管理局流程问题:确保 identifier_uri 在 app.py 与Azure AD应用程序的应用程序ID URI匹配。
资源
许可证
看 许可证 文件以获取详细信息。
