m365 mcp服务器
生产准备就绪 MCP(模型上下文协议)服务器 对于Microsoft 365,通过使用OAuth 2.1+PKCE的Azure AD/Entra ID身份验证提供对电子邮件、SharePoint和OneDrive的安全访问。
特性
- 电子邮件访问:列出文件夹、搜索邮件、读取电子邮件内容(包括共享邮箱)
- 日历访问:列出日历、浏览事件、展开具有日期范围的定期事件
- SharePoint/OneDrive:浏览网站、驱动器、文件夹和读取文件内容
- 文档分析:从PDF、Word、Excel、PowerPoint、CSV和HTML文件中提取可读文本
- OAuth 2.1+PKCE:通过Azure AD/Entra ID进行安全身份验证
- 委托权限:用户仅访问其授权内容
- 开放式WebUI兼容:与本机MCP或MCPO代理配合使用
- 生产就绪:Docker支持、安全强化、结构化审计日志
- 令牌撤销:符合RFC 7009的令牌吊销端点
快速开始
1.Azure AD安装程序
跟随 docs/entra-app-regulation.md 创建具有以下权限的Azure AD应用注册:
openid,offline_access(OIDC)User.Read,Mail.Read,Mail.Read.Shared,Files.Read,Sites.Read.All,Calendars.Read(微软图形)
2.配置
创建一个 .env 文件:
# Azure AD / Entra ID (required)
AZURE_CLIENT_ID=your-client-id
AZURE_CLIENT_SECRET=your-client-secret
AZURE_TENANT_ID=your-tenant-id
# Server
MCP_SERVER_PORT=3000
MCP_SERVER_BASE_URL=http://localhost:3000
SESSION_SECRET=$(openssl rand -hex 32)
# Optional
LOG_LEVEL=info
REDIS_URL=redis://localhost:6379
# OAuth signing keys (required in production)
# OAUTH_SIGNING_KEY_PRIVATE=
# OAUTH_SIGNING_KEY_PUBLIC=3.本地运行
# Install dependencies
npm install
# Development mode
npm run dev
# Production build
npm run build
npm start4.身份验证
- 打开
http://localhost:3000/auth/login在浏览器中 - 使用您的Microsoft 365帐户登录
- 注意登录后返回的会话ID
Docker部署
基本
cd docker
docker-compose up -d m365-mcp-server redis使用开放式WebUI
cd docker
docker-compose --profile with-webui up -d使用MCPO代理
cd docker
docker-compose --profile with-mcpo up -d打开WebUI集成
选项A:本地MCP(推荐)
- 在Open WebUI中,转到 管理员设置 > 工具
- 添加MCP服务器:
{
"url": "http://localhost:3000/mcp",
"transport": "streamable-http"
}- 在系统提示时完成OAuth登录
选项B:通过MCPO代理
- 使用提供的配置启动MCPO:
mcpo --config docker/mcpo-config.json --port 8000- 在Open WebUI中,添加为OpenAPI工具:
http://localhost:8000/openapi.jsonMCP工具
电子邮件工具
| 工具 | 说明 |
|---|---|
mail_list_messages | 使用可选筛选器列出邮件(支持共享邮箱) |
mail_get_message | 使用正文(HTML)获取完整的邮件详细信息→文本)、CC/BCC和附件元数据 |
mail_list_folders | 列出邮件文件夹或子文件夹(支持共享邮箱) |
mail_get_attachment | 读取和解析电子邮件附件(PDF、Word、Excel、PowerPoint、CSV、HTML→文本)。最大20MB |
所有电子邮件工具都接受可选 mailbox 访问共享邮箱的参数(电子邮件地址或用户ID)。忽略使用您的个人邮箱。需要 Mail.Read.Shared 管理员同意的权限。
SharePoint/OneDrive工具
| 工具 | 说明 |
|---|---|
sp_list_sites | 搜索并列出SharePoint网站 |
sp_list_drives | 列出驱动器(OneDrive/文档库) |
sp_list_children | 列出文件夹内容 |
sp_get_file | 通过自动文档解析(PDF、Word、Excel、PowerPoint)获取文件内容→ 文本)。最大20MB |
OneDrive工具
| 工具 | 说明 |
|---|---|
od_my_drive | 获取个人OneDrive信息,包括驱动器ID和存储配额 |
od_list_files | 列出个人OneDrive中的文件和文件夹(根目录或子文件夹) |
od_get_file | 通过自动文档解析(PDF、Word、Excel、PowerPoint)按item_id获取文件内容。最大20MB |
od_search | 仅在个人OneDrive中搜索文件 |
od_recent | 列出最近访问的文件 |
od_shared_with_me | 列出他人与您共享的文件 |
日历工具
| 工具 | 说明 |
|---|---|
cal_list_calendars | 列出所有包含元数据的日历 |
cal_list_events | 列出具有可选日期范围的事件(展开重复事件) |
cal_get_event | 获取完整的活动详细信息,包括正文/描述 |
需要 Calendars.Read 权限(无需管理员同意)。提供 start_date 和 end_date 将重复事件扩展为单个事件。
API终点
| 端点 | 方法 | 描述 |
|---|---|---|
/health | GET | 健康检查 |
/auth/login | GET | 启动OAuth登录 |
/auth/callback | GET | OAuth回调 |
/auth/logout | GET | 注销并撤销会话 |
/auth/status | GET | 检查身份验证状态 |
/revoke | POST | 令牌撤销(RFC 7009) |
/mcp | POST | MCP JSON-RPC端点 |
/mcp | GET | MCP SSE流端点 |
/mcp | DELETE | 终止MCP会话 |
安全
- OAuth 2.1+PKCE:所有身份验证流都需要
- 仅授权权限:无应用程序专用访问,只读图形范围(
Mail.Read.Shared需要管理员同意) - 令牌加密:静态会话令牌的AES-256-GCM加密
- PII补救措施:从日志中过滤的敏感数据(令牌、电子邮件、机密)
- 结构化审计日志记录:使用相关ID记录的安全事件
- 速率限制:一般每分钟100次,客户注册每小时5次
- 安全标头:HSTS、CSP(无不安全内联)、权限策略、通过头盔的X-Frame-Options
- 输入验证:所有Graph API资源ID的Zod架构+regex验证
- DCR保护:重定向URI模式白名单、速率限制、审核日志记录
- 生产执法:配置验证需要Redis、HTTPS、持久签名密钥
看 docs/security/streat-model.md 进行全面的安全分析。
建筑
┌─────────────────────────────────────────────────────────────┐
│ Open WebUI / Client │
└─────────────────────────────┬───────────────────────────────┘
│ MCP Protocol (Streamable HTTP)
▼
┌─────────────────────────────────────────────────────────────┐
│ m365-mcp-server │
│ ┌─────────────┐ ┌─────────────┐ ┌──────────────────────┐ │
│ │ OAuth 2.1 │ │ MCP Handler │ │ Microsoft Graph │ │
│ │ + PKCE │ │ (JSON-RPC) │ │ Client │ │
│ └──────┬──────┘ └─────────────┘ └──────────┬───────────┘ │
└─────────│────────────────────────────────────│──────────────┘
│ │
▼ ▼
┌──────────────────────┐ ┌─────────────────────────┐
│ Azure AD / Entra ID │ │ Microsoft Graph API │
│ (Authorization) │ │ (Data Access) │
└──────────────────────┘ └─────────────────────────┘环境变量
| 变量 | 必填 | 默认 | 描述 |
|---|---|---|---|
AZURE_CLIENT_ID | 是 | - | Azure AD应用程序客户端ID |
AZURE_CLIENT_SECRET | 是 | - | Azure AD应用程序客户端机密 |
AZURE_TENANT_ID | 是 | - | Azure AD租户ID |
SESSION_SECRET | 是 | - | 会话加密密钥(32+个字符) |
MCP_SERVER_PORT | 无 | 3000 | 服务器端口 |
MCP_SERVER_BASE_URL | 否 | http://localhost:3000 | 公共URL(生产中需要HTTPS) |
REDIS_URL | Prod | - | Redis URL(生产中需要) |
OAUTH_SIGNING_KEY_PRIVATE | Prod | - | RSA私钥PEM(生产中需要) |
OAUTH_SIGNING_KEY_PUBLIC | Prod | - | RSA公钥PEM(生产中需要) |
OAUTH_ALLOWED_REDIRECT_PATTERNS | DCR没有 | - | 逗号分隔的URI模式 |
LOG_LEVEL | 无 | 信息 | 日志级别(跟踪/调试/信息/警告/错误) |
NODE_ENV | 否 | 开发 | 环境模式 |
FILE_PARSE_TIMEOUT_MS | 否 | 30000 | 文档解析超时 |
FILE_PARSE_MAX_OUTPUT_KB | 否 | 500 | 最大解析文本输出大小 |
发展
# Install dependencies
npm install
# Run tests
npm test
# Run tests with coverage
npm run test:coverage
# Lint
npm run lint
# Type check
npm run typecheck
# Build
npm run buildMCP注册表
此服务器已发布到MCP注册表。添加到您的MCP客户端:
{
"mcpServers": {
"m365": {
"command": "npx",
"args": ["-y", "@anthropic/m365-mcp-server"],
"env": {
"AZURE_CLIENT_ID": "your-client-id",
"AZURE_CLIENT_SECRET": "your-client-secret",
"AZURE_TENANT_ID": "your-tenant-id",
"SESSION_SECRET": "your-session-secret"
}
}
}
}文档
支持的文档格式
sp_get_file 自动从这些格式中提取可读文本:
| 格式 | 扩展名 | 库 |
|---|---|---|
.pdf | pdf解析 | |
| Word | .docx, .doc | 猛犸象 |
| Excel | .xlsx, .xls | exceljs |
| PowerPoint | .pptx, .ppt | 内置ZIP/XML |
| CSV | .csv | 内置 |
| HTML | .html | 内置 |
其他二进制格式以base64返回。默认情况下,解析文本输出限制为500KB。
已知限制
- 最大文件下载大小:20MB
- 解析文本输出上限为500KB(可通过以下方式配置
FILE_PARSE_MAX_OUTPUT_KB) - SharePoint网站列表需要搜索查询(图表API限制)
- SPA场景的刷新令牌限制为24小时
- 无写操作(设计为只读)
- 访问令牌(JWT)是无状态的,不能直接撤销(自然过期)
许可证
麻省理工学院
贡献
- 分叉存储库
- 创建要素分支
- 提交拉取请求
请确保所有测试都通过,并且代码遵循现有样式。
