微软图形mcp
🚀 Microsoft Graph MCP Server
用于AI助手的Microsoft 365集成 -将Cursor、Claude Desktop和其他MCP兼容工具直接连接到Microsoft Graph。访问Outlook、OneDrive、日历、团队,并使用AI自动化工作流程。
](https://www.npmjs.com/package/microsoft-graph-mcp)  ](https://nodejs.org/)    
______________________________________________________________________
✅ 我们提供什么(这个项目)
| 可交付成果 | 描述 |
|---|---|
| 支持AI的MCP服务器 | 将Microsoft Graph功能作为AI助手的MCP工具公开 |
| 用于Microsoft Graph的REST网关 | 本地HTTP API,带有位于的OpenAPI/Swagger /docs |
| 预构建的Microsoft 365端点 | 用户、邮件(发送/回复/转发)、日历(CRUD事件)、文件/OneDrive(列表/上传/删除)、团队(团队/频道)、组(成员)、联系人、任务、订阅(Webhook)、应用程序、目录、组织、人员 |
| 通过Azure AD进行身份验证 | 应用程序注册流程使用 AZURE_CLIENT_ID, AZURE_CLIENT_SECRET, AZURE_TENANT_ID |
| 生产就绪脚手架 | 端口/配置管理、错误处理、健康检查、API信息、日志记录 |
| 经过测试的TypeScript实现 | 使用Jest测试覆盖所有端点的类型安全代码 |
| 开发人员用户体验 | 可复制粘贴 curl 例如,Swagger尝试一下,很容易在本地运行 npx |
| 安全态势 | 使用应用程序权限;服务器未保存任何数据 |
______________________________________________________________________
📊 Microsoft图形概述
Microsoft Graph跨Microsoft 365服务(团队、日历、文件、邮件、人员、任务等)连接用户、他们的活动和内容。此MCP服务器为AI助手提供了直接访问此统一数据层的权限。
______________________________________________________________________
🚀 快速开始
安装方法
| 方法 | 命令 | 最适合 |
|---|---|---|
| npx(推荐) | npx microsoft-graph-mcp | 快速测试,无需安装 |
| npm全局 | npm install -g microsoft-graph-mcp | 频繁使用,全系统访问 |
| npm本地 | npm install microsoft-graph-mcp | 项目特定集成 |
| 克隆和构建 | git clone && npm install && npm run build | 开发和定制 |
使用npx运行(推荐)
AZURE_CLIENT_ID=your-client-id \
AZURE_CLIENT_SECRET=your-client-secret \
AZURE_TENANT_ID=your-tenant-id \
npx microsoft-graph-mcp就是这样! 服务器运行在:
| 服务 | URL | 备注 |
|---|---|---|
| REST API | http://localhost:8887 | 所有端点的基本URL |
| API文档(Swagger) | http://localhost:8887/docs | 交互式文档 |
| MCP服务器 | http://localhost:8888 | 模型上下文协议服务器 |
使用.env文件运行
创建一个 .env 文件:
AZURE_CLIENT_ID=your-client-id
AZURE_CLIENT_SECRET=your-client-secret
AZURE_TENANT_ID=your-tenant-id然后运行:
npx microsoft-graph-mcp______________________________________________________________________
📋 Azure配置
配置步骤概述
| 步骤 | 操作 | 查找位置 | 环境变量 |
|---|---|---|---|
| 1 | 创建应用程序注册 | Azure门户 → Azure AD→ 应用程序注册 | - |
| 2 | 复制应用程序(客户端)ID | 应用程序注册→ 概述 | AZURE_CLIENT_ID |
| 3 | 复制目录(租户)ID | 应用程序注册→ 概述 | AZURE_TENANT_ID |
| 4 | 创建客户端密码 | 应用程序注册→ 证书和秘密 | AZURE_CLIENT_SECRET |
| 5 | 添加API权限 | 应用程序注册→ API权限 | - |
| 6 | 授予管理员同意 | API权限→ 授予管理员同意 | - |
步骤1:创建Azure应用程序注册
- 首选 Azure门户
- 导航至 Azure Active Directory > 应用程序注册
- 点击 新注册
- 填写:
- 名字:Microsoft Graph MCP服务器 - 支持的帐户类型:仅此组织目录中的帐户(或多租户) - 点击 注册
步骤2:获取凭据
- 应用程序(客户端)ID → 将此复制为
AZURE_CLIENT_ID - 目录(租户)ID → 将此复制为
AZURE_TENANT_ID - 首选 证书和秘密 → 新客户机密
- 复制 机密值 作为 AZURE_CLIENT_SECRET (只显示一次!)
步骤3:添加应用程序权限
- 首选 API权限 → 添加权限 → 微软图形 → 应用程序权限
- 添加这些权限:
| 权限 | 类型 | 描述 |
|---|---|---|
User.Read.All | 应用程序 | 读取所有用户 |
Mail.Read | 应用程序 | 读取所有邮箱中的邮件 |
Mail.Send | 应用程序 | 以任何用户身份发送邮件 |
Calendars.Read | 应用程序 | 读取所有邮箱中的日历 |
Files.Read.All | 应用程序 | 读取所有文件 |
Group.Read.All | 应用程序 | 读取所有组 |
Contacts.Read | 应用程序 | 读取联系人 |
Tasks.ReadWrite.All | 应用程序 | 读写任务 |
Organization.Read.All | 应用程序 | 读取组织信息 |
People.Read.All | 应用程序 | 读取人员配置文件 |
Application.Read.All | 应用程序 | 读取应用程序 |
Subscription.Read.All | 应用程序 | 管理订阅 |
- ⚠️ 关键: 点击 授予\[您的组织\]管理员同意
______________________________________________________________________
💻 在Cursor/Claude桌面中使用
MCP客户端配置概述
| 客户端 | 配置位置 | 如何访问 |
|---|---|---|
| 光标 | 光标设置 | 设置→ 特性→ 模型上下文协议→ 编辑配置 |
| 克劳德台式机(Mac) | 文件系统 | ~/Library/Application Support/Claude/claude_desktop_config.json |
| 克劳德桌面(Windows) | 文件系统 | %APPDATA%\Claude\claude_desktop_config.json |
| 克劳德桌面(Linux) | 文件系统 | ~/.config/Claude/claude_desktop_config.json |
配置步骤
对于光标
- 打开 光标设置 → 特性 → 模型上下文协议
- 点击 “编辑配置”
- 添加以下配置
- 保存并重新启动游标
适用于克劳德桌面
- 找到并打开配置文件(见上表)
- 添加以下配置
- 保存文件
- 重新启动克劳德桌面
配置JSON(所有客户端)
{
"mcpServers": {
"microsoft-graph-mcp": {
"command": "npx",
"args": ["-y", "microsoft-graph-mcp"],
"env": {
"AZURE_CLIENT_ID": "your-client-id",
"AZURE_CLIENT_SECRET": "your-client-secret",
"AZURE_TENANT_ID": "your-tenant-id"
}
}
}
}注: 替换 your-client-id, your-client-secret,以及 your-tenant-id 使用您的实际Azure凭据。
______________________________________________________________________
📡 使用REST API
服务器运行后,您可以通过REST端点完全访问Microsoft Graph。
🔍 交互式API文档
Swagger用户界面 (推荐-视觉界面):
http://localhost:8887/docs- 浏览所有端点
- 直接在浏览器中尝试请求
- 请参阅请求/响应模式
OpenAPI JSON:
http://localhost:8887/openapi.json- 导入Postman、Insomnia或任何与OpenAPI兼容的工具
📝 常见API示例
| 操作 | 方法 | 端点 | 示例 |
|---|---|---|---|
| 列出用户 | 得到 | /graph/users | curl "http://localhost:8887/graph/users?$top=10" |
| 获取电子邮件 | 得到 | /graph/mail | curl "http://localhost:8887/graph/mail?userId=user@domain.com&$top=10" |
| 发送邮件 | 职位 | /graph/mail | 请参阅下面的详细示例 |
| 获取日历 | 得到 | /graph/calendar | curl "http://localhost:8887/graph/calendar?userId=user@domain.com&$top=10" |
| 创建活动 | 职位 | /graph/calendar/events | 请参阅下面的详细示例 |
| 列出文件 | 得到 | /graph/files | curl "http://localhost:8887/graph/files?userId=user@domain.com&$top=20" |
| 组建团队 | 得到 | /graph/teams | curl http://localhost:8887/graph/teams |
详细示例
发送电子邮件:
curl -X POST http://localhost:8887/graph/mail \
-H "Content-Type: application/json" \
-d '{
"toRecipients": [{"emailAddress": {"address": "user@example.com"}}],
"subject": "Hello from microsoft-graph-mcp!",
"body": {"contentType": "text", "content": "This is a test message"}
}'创建日历事件:
curl -X POST http://localhost:8887/graph/calendar/events \
-H "Content-Type: application/json" \
-d '{
"subject": "Team Meeting",
"start": {"dateTime": "2024-01-15T10:00:00", "timeZone": "UTC"},
"end": {"dateTime": "2024-01-15T11:00:00", "timeZone": "UTC"},
"userId": "user@domain.com"
}'______________________________________________________________________
📚 所有可用端点
用户(6个端点)
| 方法 | 路径 | 描述 |
|---|---|---|
| 得到 | /graph/users | 获取用户列表(支持过滤、分页) |
| 得到 | /graph/users/:userId | 按ID获取特定用户 |
| 职位 | /graph/users | 创建新用户 |
| 补丁 | /graph/users/:userId | 更新用户 |
| 删除 | /graph/users/:userId | 删除用户 |
| 得到 | /graph/users/:userId/photo | 获取用户照片 |
邮件(7个端点)
| 方法 | 路径 | 描述 |
|---|---|---|
| 得到 | /graph/mail?userId=user@domain.com | 获取电子邮件(支持过滤) |
| 得到 | /graph/mail/:messageId?userId=user@domain.com | 获取特定消息 |
| 职位 | /graph/mail | 发送电子邮件 |
| 职位 | /graph/mail/:messageId/reply?userId=user@domain.com | 回复消息 |
| 职位 | /graph/mail/:messageId/forward?userId=user@domain.com | 转发消息 |
| 删除 | /graph/mail/:messageId?userId=user@domain.com | 删除邮件 |
| 得到 | /graph/mail/folders?userId=user@domain.com | 获取邮件文件夹 |
日历(5个端点)
| 方法 | 路径 | 描述 |
|---|---|---|
| 得到 | /graph/calendar?userId=user@domain.com | 获取日历事件(支持过滤) |
| 得到 | /graph/calendars?userId=user@domain.com | 获取用户日历 |
| 职位 | /graph/calendar/events | 创建日历事件(正文中包含userId) |
| 补丁 | /graph/calendar/events/:eventId?userId=user@domain.com | 更新日历事件 |
| 删除 | /graph/calendar/events/:eventId?userId=user@domain.com | 删除日历事件 |
文件/OneDrive(4个端点)
| 方法 | 路径 | 描述 |
|---|---|---|
| 得到 | /graph/files?userId=user@domain.com | 从OneDrive获取文件和文件夹 |
| 得到 | /graph/drives?userId=user@domain.com | 获取驱动器(OneDrive和SharePoint) |
| 职位 | /graph/files/upload | 将文件上传到OneDrive(正文中包含用户ID) |
| 删除 | /graph/files/:itemId?userId=user@domain.com | 删除文件或文件夹 |
组(3个端点)
| 方法 | 路径 | 描述 |
|---|---|---|
| 得到 | /graph/groups | 获取组列表 |
| 职位 | /graph/groups | 创建新组 |
| 得到 | /graph/groups/:groupId/members | 获取组成员 |
团队(2个端点)
| 方法 | 路径 | 描述 |
|---|---|---|
| 得到 | /graph/teams | 获取团队列表 |
| 得到 | /graph/teams/:teamId/channels | 获取团队频道 |
联系人(2个端点)
| 方法 | 路径 | 描述 |
|---|---|---|
| 得到 | /graph/contacts?userId=user@domain.com | 获取联系人 |
| 职位 | /graph/contacts | 创建联系人(在正文中包含userId) |
任务(2个端点)
| 方法 | 路径 | 描述 |
|---|---|---|
| 得到 | /graph/tasks?userId=user@domain.com | 获取任务/待办事项 |
| 职位 | /graph/tasks | 创建任务(在正文中包含userId) |
附加服务
| 方法 | 路径 | 描述 |
|---|---|---|
| 得到 | /graph/applications | 获取应用程序 |
| 得到 | /graph/directory | 获取目录对象 |
| 得到 | /graph/organization | 获取组织信息 |
| 得到 | /graph/people?userId=user@domain.com | 获取人员(同事和联系人) |
| 得到 | /graph/subscriptions | 获取webhook订阅 |
| 职位 | /graph/subscriptions | 创建webhook订阅 |
系统
| 方法 | 路径 | 描述 |
|---|---|---|
| 得到 | /health | 健康检查 |
| 得到 | /api-info | API信息 |
| 得到 | /openapi.json | OpenAPI规范 |
| 得到 | /docs | Swagger用户界面文档 |
所有端点都会自动作为MCP工具公开,供AI代理使用。
______________________________________________________________________
⚙️ 高级配置
环境变量
| 变量 | 必填 | 默认 | 描述 |
|---|---|---|---|
AZURE_CLIENT_ID | 是 | - | Azure AD应用程序(客户端)ID |
AZURE_CLIENT_SECRET | 是 | - | Azure AD客户端机密(值) |
AZURE_TENANT_ID | 是 | - | Azure AD目录(租户)ID |
AZURE_SCOPE | 没有 | https://graph.microsoft.com/.default | Microsoft图形范围 |
EASY_MCP_SERVER_PORT | 没有 | 8887 | REST API端口 |
EASY_MCP_SERVER_MCP_PORT | 没有 | 8888 | MCP服务器端口 |
EASY_MCP_SERVER_LOG_LEVEL | 没有 | info | 日志记录级别 |
______________________________________________________________________
🎯 用例
按用户类型
| 用户类型 | 用例 | 查询/操作示例 |
|---|---|---|
| AI助手用户 | 电子邮件管理 | “从Outlook获取我的最新电子邮件” |
| 日历安排 | “为明天下午2点创建日历活动” | |
| 文件管理 | “显示OneDrive中的文件” | |
| 团队协作 | “列出组织中的所有Microsoft团队” | |
| 沟通 | “发送电子邮件至john@example.com关于项目更新” | |
| 联系人查找 | “我有哪些联系人?” | |
| 开发者 | 自定义集成 | 构建Microsoft 365工作流自动化 |
| API测试 | 通过Swagger UI测试Microsoft Graph端点 | |
| 应用程序开发 | 创建自定义M365应用程序 | |
| 服务集成 | 将M365与第三方服务连接起来 | |
| IT管理员 | 用户管理 | 通过REST API列出和管理用户 |
| 审核和监控 | 跟踪电子邮件、日历和文件活动 | |
| 资源调配 | 自动创建用户和组 | |
| 报告 | 生成M365服务的使用情况报告 |
按界面
| 接口 | 最适合 | 接入点 |
|---|---|---|
| MCP(人工智能代理) | 自然语言查询、人工智能工作流 | Cursor、Claude Desktop、MCP兼容工具 |
| REST API | 程序化访问、自动化脚本 | http://localhost:8887/graph/\* |
| Swagger用户界面 | 视觉探索、测试、文档编制 | http://localhost:8887/docs |
______________________________________________________________________
🔧 故障排除
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| 服务器无法启动 | 端口已在使用中 | 检查端口8887/8888是否未在使用中: lsof -i :8887 |
| 无效凭据 | 验证Azure凭据是否正确 .env | |
| 错误的Node.js版本 | 确保安装了Node.js>=22.0.0: node --version | |
| 身份验证错误 | 无效凭据 | 验证 AZURE_CLIENT_ID, AZURE_CLIENT_SECRET,以及 AZURE_TENANT_ID 是正确的 |
| 已过期的客户端密码 | 在Azure门户中创建新的客户端密码 | |
| 缺少管理员同意 | 在Azure门户中单击“授予管理员同意”→ API权限 | |
| 权限类型错误 | 确保权限为“应用程序权限”(未委派) | |
| “权限不足” | 缺少权限 | 验证是否在Azure门户中添加了所有必需的权限 |
| 未授予管理员同意 | 在Azure门户中授予管理员同意→ API权限 | |
| 委派与应用程序 | 检查权限是否为应用程序权限(非委派) | |
| MCP不工作 | 配置未加载 | 添加MCP配置后重新启动Cursor/Claude |
| 服务器未运行 | 检查服务器是否正在运行: curl http://localhost:8887/health | |
| 环境变量错误 | 验证MCP配置中的环境变量是否正确 | |
| MCP连接失败 | 检查游标/克劳德日志中的MCP错误 | |
| API调用失败 | 身份验证问题 | 测试身份验证: curl http://localhost:8887/graph/users/me |
| 找不到端点 | 检查Swagger UI:http://localhost:8887/docs | |
| 缺少权限 | 验证Azure应用程序是否具有所需的权限 | |
| 服务器错误 | 查看服务器日志以了解详细的错误消息 | |
| 速率限制 | 请求太多 | 实现指数退避,降低请求频率 |
| 超时错误 | 慢速网络/API | 增加超时设置,检查网络连接 |
______________________________________________________________________
📖 了解更多
文档和资源
| 资源 | 描述 | 链接 |
|---|---|---|
| Microsoft Graph API | Microsoft Graph官方文档和API参考资料 | learn.microsoft.com/graph |
| 模型上下文协议 | MCP规范和实施指南 | 模型上下文协议.io |
| Azure应用程序注册 | 创建和配置Azure AD应用程序的指南 | learn.microsoft.com/zure |
| 图形API权限 | Microsoft Graph权限的完整列表 | learn.microsoft.com/权限 |
| 简易mcp服务器 | 定制框架文档 |
______________________________________________________________________
📦 包信息
| 资源 | 链接 |
|---|---|
| npm包 | 微软图形mcp |
| GitHub存储库 | 7160微软图形微控制器 |
| 问题追踪器 | |
| 许可证 | 麻省理工学院 |
| 支持 | info@easynet.world |
______________________________________________________________________
🆘 需要帮助?
快速诊断检查表
| 步骤 | 检查 | 命令/操作 |
|---|---|---|
| 1 | Swagger用户界面 | 打开http://localhost:8887/docs |
| 2 | 服务器运行状况 | curl http://localhost:8887/health |
| 3 | 认证 | curl http://localhost:8887/graph/users/me |
| 4 | Azure配置 | 回顾 Azure配置 章节 |
| 5 | 故障排除 | 检查 故障排除 上表 |
| 6 | 企业支持 | 联系人:info@easynet.world |
______________________________________________________________________
🛠️ 发展
此MCP服务器是使用 简易mcp服务器 框架。
发展资料
| 主题 | 描述 | 链接 |
|---|---|---|
| 自定义端点 | 如何创建自定义API端点 | 简易mcp服务器文档 |
| 项目结构 | 架构和代码组织 | 简易mcp服务器文档 |
| 测试与调试 | 测试设置和调试提示 | 简易mcp服务器文档 |
| 贡献 | 捐款准则 | 简易mcp服务器文档 |
| TypeScript | 类型定义和编译 | 请参见 tsconfig.json 和 lib/ 目录 |
地方发展设置
| 步骤 | 命令 | 目的 |
|---|
- 克隆 |
git clone https://github.com/easynet-world/7160-microsoft-graph-mcp.git|获取源代码 - 安装 |
npm install|安装依赖项 - 配置 |复制
.env.example到.env|设置环境变量 - 构建 |
npm run build|编译TypeScript - 测试 |
npm test|运行测试套件 - 开始 |
npm start|启动开发服务器
______________________________________________________________________
由...驱动 简易mcp服务器 框架
