Microsoft 365 MCP服务器

一个生产就绪的MCP(模型上下文协议)服务器,通过Azure AD/Entra ID认证提供对电子邮件、SharePoint和OneDrive的安全访问。

  • by SwamiRama
  • TypeScript
  • 本地部署
  • 更新于
在 GitHub 查看 SwamiRama/m365-mcp-server

使用说明

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=<base64-encoded PEM>
# OAUTH_SIGNING_KEY_PUBLIC=<base64-encoded PEM>

3.本地运行

# Install dependencies
npm install

# Development mode
npm run dev

# Production build
npm run build
npm start

4.身份验证

  1. 打开 http://localhost:3000/auth/login 在浏览器中
  2. 使用您的Microsoft 365帐户登录
  3. 注意登录后返回的会话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(推荐)

  1. 在Open WebUI中,转到 管理设置 > 工具
  2. 添加MCP服务器:
    {
      "url": "http://localhost:3000/mcp",
      "transport": "streamable-http"
    }
    
  3. 在系统提示时完成OAuth登录

选项B:通过MCPO代理

  1. 使用提供的配置启动MCPO:
    mcpo --config docker/mcpo-config.json --port 8000
    
  2. 在Open WebUI中,添加为OpenAPI工具:
    http://localhost:8000/openapi.json
    

MCP工具

电子邮件工具

工具 说明
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 管理员同意的权限。

mail_list_messages, mail_get_message,以及 mail_get_attachment 返回一个简短的引用id(例如。 m_a1b2c3d4e5f6)而不是原始的Graph id。在调用后续邮件工具时,逐字传递此id。引用id在以下情况下保持可解析状态 HANDLE_TTL_SECONDS 发布后(默认 86400 =24h)。

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 最大解析文本输出大小
HANDLE_TTL_SECONDS 否 86400 邮件引用id可解析的时间有多长

发展

# 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 build

MCP注册表

此服务器已发布到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 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)是无状态的,不能直接撤销(自然过期)

许可证

麻省理工学院

贡献

  1. 分叉存储库
  2. 创建要素分支
  3. 提交拉取请求

请确保所有测试都通过,并且代码遵循现有样式。