微软图形mcp
🚀 Microsoft Graph MCP Server
用于AI助手的Microsoft 365集成 -将Cursor、Claude Desktop和其他MCP兼容工具直接连接到Microsoft Graph。访问Outlook、OneDrive、日历、团队,并使用AI自动化工作流程。
✅ 我们提供什么(这个项目)
| 可交付成果 |
描述 |
| 支持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 |
增加超时设置,检查网络连接 |
📖 了解更多
文档和资源
📦 包信息
🆘 需要帮助?
快速诊断检查表
| 步骤 |
检查 |
命令/操作 |
| 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服务器 框架。
发展资料
地方发展设置
- 克隆 |
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服务器 框架