Microsoft 365集成工具

通过Graph API连接AI客户端与Microsoft 365,实现多用户协作、文件管理、邮件处理等117种工具操作。

  • by Aanerud
  • JavaScript
  • 本地部署
  • 55 星标
  • 更新于
在 GitHub 查看 Aanerud/MCP-Microsoft-Office

使用说明

MCP微软办公软件

一台MCP服务器。多个用户。测试租户上的真实Microsoft 365流量。


问题

测试租户坐空了。静态测试数据不能执行真实的工作流程。当你需要能够发送真实电子邮件、安排真实会议和在真实团队渠道中协作的代理时,模拟和存根是不够的。

这解决了什么

该项目通过Graph API将任何兼容MCP的AI客户端连接到Microsoft 365。每个代理都作为不同的租户用户进行身份验证,并对真实数据执行实际操作。

  • 117工具 跨12个模块:邮件、日历、文件、, Excel, 字, 幻灯片、团队、联系人、待办事项、组、人员、搜索
  • 多用户:一台服务器支持整个团队,每台服务器都有独立的数据
  • 实图API调用:每个操作都会击中实际租户,而不是模拟租户
  • 安全:静态加密的令牌,第三方服务器上不存储凭据

建筑

                    ┌──────────────────┐
                    │  MCP Client      │
                    │  (Claude, etc.)  │
                    └────────┬─────────┘
                             │ JSON-RPC (stdin/stdout)
                    ┌────────▼─────────┐
                    │  MCP Adapter     │
                    │  (runs locally)  │
                    └────────┬─────────┘
                             │ HTTP + Bearer Token
                    ┌────────▼─────────┐
                    │  MCP Server      │
                    │  (local or       │
                    │   remote)        │
                    └────────┬─────────┘
                             │ Microsoft Graph API
                    ┌────────▼─────────┐
                    │  Microsoft 365   │
                    │  (your tenant)   │
                    └──────────────────┘

三个部分:

  1. MCP客户端 --您与之交互的AI
  2. MCP适配器 --将MCP协议转换为HTTP请求的Node.js进程(与客户端在同一台机器上运行)
  3. MCP服务器 --处理身份验证并调用Microsoft Graph API(在本地或远程服务器上运行)

权限

服务器需要18个Microsoft Graph委托权限。十二项工作未经管理员同意。六项要求租户管理员同意。

无需管理员同意

权限 工具已解锁
User.Read 身份验证、用户配置文件
Mail.ReadWrite readMail,readMailDetails,markEmailRead,flagMail,getMailAttachments,addMailAttachment,removeMailAttachment
Mail.Send sendMail,回复ToMail
Calendars.ReadWrite getEvents、createEvent、updateEvent、cancelEvent、acceptEvent、tentiveAcceptEvent、declineEvent、getAvailability、findMeetingTimes、getRooms、getCalendars、addAttachment、removeAttachment
Files.ReadWrite.All listFiles、uploadFile、downloadFile、getFileMetadata、getFileContent、setFileContent、updateFileContent、createSharingLink、getSharingLinks、removeSharingPermission、listChannelFiles、upload FileToChannel、readChannelFile、, 所有Excel工作簿工具, 所有Word/PowerPoint工具
Contacts.ReadWrite list联系人、获取联系人、创建联系人、更新联系人、删除联系人、搜索联系人
Tasks.ReadWrite listTaskList、getTaskList、createTaskList、updateTaskList、deleteTaskList、listTasks、getTask、createTask、updateTask、deleteTask、completeTask
Chat.ReadWrite listChats,createChat,getChatMessages,sendChatMessage
Channel.ReadBasic.All listTeamChannels,getChannelMessages
ChannelMessage.Send sendChannelMessage,replyToMessage
Channel.Create 创建团队频道
OnlineMeetings.ReadWrite 创建在线会议、获取在线会议、列出在线会议、通过JoinUrl获取会议

需要管理员同意

权限 其他工具已解锁
User.Read.All 跨团队解析用户ID,人员搜索
People.Read.All 查找人员,获取相关人员,获取PersonById
Group.Read.All listGroups,getGroup,listGroupMembers,listMyGroups
ChannelMember.ReadWrite.All addChannelMember
ChannelMessage.Read.All 读取频道消息历史记录
OnlineMeetingTranscript.Read.All getMeetingTranscripts,getMeetingTranscript内容

未经管理员同意,您将获得邮件、日历、文件、Excel工作簿、Word文档、PowerPoint演示文稿、联系人、待办事项、聊天和基本团队频道操作。 经管理员同意,您可以添加人员目录搜索、组、频道成员管理和会议记录。


快速开始

先决条件

  • Node.js 18+ (下载)
  • 克劳德桌面 (下载)或另一个MCP客户端
  • Microsoft 365帐户 (工作、学校或个人)

步骤1:Azure应用程序注册

  1. 首选 Azure门户 > 微软Entra ID > 应用注册 > 新注册
  2. 命名它 MCP-Microsoft-Office,使用您首选的帐户类型注册
  3. 复制 应用程序(客户端)ID 和 目录(租户)ID
  4. 首选 API权限 > 添加权限 > 微软图形 > 委托权限
  5. 添加上面列出的18个权限
  6. 如果您是租户管理员,请单击 授予管理员同意
  7. 首选 认证 > 添加平台 > 网络
    • 重定向URI: http://localhost:3000/api/auth/callback
    • 启用 允许公共客户端流

步骤2:克隆和配置

git clone https://github.com/Aanerud/MCP-Microsoft-Office.git
cd MCP-Microsoft-Office
npm install

复制 .env.example 到 .env 并填写您的Azure应用程序详细信息:

MICROSOFT_CLIENT_ID=your-client-id
MICROSOFT_TENANT_ID=your-tenant-id

步骤3:启动服务器并进行身份验证

npm run dev:web

打开 http://localhost:3000 在您的浏览器中。点击 使用Microsoft登录,登录并授予权限。然后单击 生成MCP令牌 并复制令牌。

步骤4:配置Claude桌面

编辑您的Claude Desktop配置:

macOS: ~/Library/Application Support/Claude/claude_desktop_config.json 视窗: %APPDATA%\Claude\claude_desktop_config.json

Claude Desktop的实际限制是每个MCP服务器约55个工具。该项目公开了117个工具,因此我们将它们分为三个共享相同适配器和后端的服务器:

{
  "mcpServers": {
    "microsoft-365": {
      "command": "node",
      "args": ["/path/to/MCP-Microsoft-Office/mcp-adapter.cjs"],
      "env": {
        "MCP_SERVER_URL": "http://localhost:3000",
        "MCP_BEARER_TOKEN": "paste-your-token-here",
        "MCP_MODULES": "search,mail,calendar,files,people,contacts,groups,query"
      }
    },
    "microsoft-365-teams": {
      "command": "node",
      "args": ["/path/to/MCP-Microsoft-Office/mcp-adapter.cjs"],
      "env": {
        "MCP_SERVER_URL": "http://localhost:3000",
        "MCP_BEARER_TOKEN": "paste-your-token-here",
        "MCP_MODULES": "teams,todo"
      }
    },
    "microsoft-365-office": {
      "command": "node",
      "args": ["/path/to/MCP-Microsoft-Office/mcp-adapter.cjs"],
      "env": {
        "MCP_SERVER_URL": "http://localhost:3000",
        "MCP_BEARER_TOKEN": "paste-your-token-here",
        "MCP_MODULES": "excel,word,powerpoint,files"
      }
    }
  }
}

MCP_MODULES 过滤适配器暴露的模块。省略它以显示所有117个工具(适用于没有工具盖的客户端)。

集 MCP_DEBUG=1 在 env 块以启用到stderr的诊断日志记录,这对于排除工具调度问题非常有用。

重新启动克劳德桌面。问: “今天我的日历上有什么?” 或 “使用预算表创建Excel工作簿。”


工具(117)

邮件(9)

工具 说明
readMail 阅读收件箱消息
sendMail 发送电子邮件
replyToMail 回复电子邮件
readMailDetails 获取完整的电子邮件内容
markEmailRead 将电子邮件标记为已读/未读
flagMail 标记或取消标记电子邮件
getMailAttachments 列出电子邮件附件
addMailAttachment 在电子邮件中添加附件
removeMailAttachment 从电子邮件中删除附件

日历(13)

工具 说明
getEvents 获取日历事件
createEvent 创建会议或活动
updateEvent 修改现有事件
cancelEvent 取消活动
acceptEvent 接受会议邀请
tentativelyAcceptEvent 暂时接受
declineEvent 拒绝会议邀请
getAvailability 查看空闲/繁忙时间
findMeetingTimes 查找最佳会议时段
getRooms 查找会议室
getCalendars 列出所有日历
addAttachment 向事件添加附件
removeAttachment 删除事件附件

文件(10)

工具 说明
listFiles 列出OneDrive文件
uploadFile 上传文件
downloadFile 下载文件
getFileMetadata 获取文件信息
getFileContent 读取文件内容
setFileContent 写入文件内容
updateFileContent 更新现有文件
createSharingLink 创建共享链接
getSharingLinks 列出共享链接
removeSharingPermission 删除共享访问权限

Excel(30)

直接使用存储在OneDrive或SharePoint中的Excel工作簿,无需下载文件。所有操作都通过Microsoft Graph的工作簿API进行透明的会话管理。

工具 说明
createWorkbookSession 打开工作簿会话(持久或临时)
closeWorkbookSession 关闭活动工作簿会话
listWorksheets 列出工作簿中的所有工作表
addWorksheet 添加新工作表
getWorksheet 按名称或ID获取工作表
updateWorksheet 重命名、重新定位或隐藏工作表
deleteWorksheet 删除工作表
getRange 读取单元格值、公式和格式
updateRange 将值写入单元格范围
getRangeFormat 获取格式(字体、填充、边框)
updateRangeFormat 设置格式(粗体、颜色、数字格式)
sortRange 在一定范围内对单元格进行排序
mergeRange 合并单元格
unmergeRange 取消合并单元格
listTables 列出工作表中的所有表
createTable 从范围创建表
updateTable 重命名或重新设置表样式
deleteTable 删除表格
listTableRows 列出表中的所有行
addTableRow 向表中添加行
deleteTableRow 按索引删除行
listTableColumns 列出表中的所有列
addTableColumn 向表中添加列
deleteTableColumn 删除列
sortTable 按列对表进行排序
filterTable 对表列应用筛选器
clearTableFilter 清除列筛选器
convertTableToRange 将表转换回纯范围
callWorkbookFunction 调用300多个Excel函数中的任何一个(SUM、VLOOKUP、PMT等)
calculateWorkbook 重新计算所有公式

单词(5)

创建、阅读和转换Word文档。文档由结构化JSON创建并存储在OneDrive中。阅读使用多库回退链:mammath(.docx的最佳HTML)→ 单词提取器(同时处理.doc和.docx)→ webUrl回退。二进制下载使用Graph测试版 /contentStream 用于可靠二进制传输的端点。

工具 说明
createWordDocument 从结构化内容(标题、段落、表格、列表、图像)创建.docx
readWordDocument 以HTML和纯文本形式读取文档
getWordDocumentMetadata 获取标题、作者、日期、关键字
getWordDocumentAsHtml 将文档内容转换为HTML
convertDocumentToPdf 将Word文档转换为PDF

注: 一些SharePoint租户在上传后几秒钟内将上传的.docx文件转换为OLE2二进制格式。当这种情况发生时,客户端解析库无法读取文件。服务器优雅地返回 webUrl 因此用户可以在浏览器中打开文档。

PowerPoint(4)

创建、阅读和转换PowerPoint演示文稿。演示文稿由结构化幻灯片数据构建并存储在OneDrive中。阅读使用Graph HTML转换和jszip回退进行幻灯片级文本提取。

工具 说明
createPresentation 创建一个包含标题、内容和空白幻灯片的.pptx
readPresentation 读取幻灯片内容(每张幻灯片的文本元素)
getPresentationMetadata 获取标题、作者、幻灯片数量、日期
convertPresentationToPdf 将演示文稿转换为PDF

团队(21)

工具 说明
listChats 列出团队聊天记录
createChat 创建新聊天
getChatMessages 阅读聊天信息
sendChatMessage 发送聊天消息
listJoinedTeams 列出你的团队
listTeamChannels 列出团队频道
createTeamChannel 创建频道
addChannelMember 将成员添加到频道
getChannelMessages 读取频道消息
sendChannelMessage 发布到频道
replyToMessage 回复频道消息
listChannelFiles 列出频道中的文件
uploadFileToChannel 将文件上传到频道
readChannelFile 读取频道文件
createOnlineMeeting 创建团队会议
getOnlineMeeting 获取会议详细信息
listOnlineMeetings 列出在线会议
getMeetingByJoinUrl 通过加入URL查找会议
getMeetingTranscripts 获取会议记录
getMeetingTranscriptContent 阅读成绩单内容

(注: addChannelMember 仅适用于私人频道。标准频道自动包括所有团队成员。)

联系人(6)

工具 说明
listContacts 列出联系人
getContact 获取联系方式
createContact 创建联系人
updateContact 更新联系信息
deleteContact 删除联系人
searchContacts 搜索联系人

待办事项(11)

工具 说明
listTaskLists 列出任务列表
getTaskList 获取任务列表
createTaskList 创建任务列表
updateTaskList 重命名任务列表
deleteTaskList 删除任务列表
listTasks 列出任务
getTask 获取任务详细信息
createTask 创建任务
updateTask 更新任务
deleteTask 删除任务
completeTask 标记任务完成

团体(4)

工具 说明
listGroups 列出Microsoft 365组
getGroup 获取组详细信息
listGroupMembers 列出组成员
listMyGroups 列出您的组

人(3)

工具 说明
findPeople 搜索目录
getRelevantPeople 频繁联系
getPersonById 获取人员详细信息

搜索(1)

工具 说明
search 跨电子邮件、文件、事件和聊天消息的统一搜索

多用户

每个用户都独立进行身份验证。服务器通过用户身份隔离所有数据。

  Alice (alice@contoso.com)          Bob (bob@contoso.com)
  ├─ Her own Microsoft tokens        ├─ His own Microsoft tokens
  ├─ Her own session                  ├─ His own session
  └─ Claude Desktop (her laptop)     └─ Claude Desktop (his PC)

              Complete data isolation.
         Alice never sees Bob's data.

对于 使用多个代理进行自动化测试,使用ROPC(资源所有者密码凭据)流以编程方式进行身份验证:

# Start the server
npm run dev:web

# Run the E2E test suite (authenticates 3 users via ROPC)
node tests/run-all.cjs

该测试套件对多个用户进行身份验证,然后在12个模块和5个跨模块工作流中练习所有117个工具。看 tests/ 为了全面实施。


E2E测试套件

该项目包括一个涵盖所有117个工具的全面测试套件。

# Run all tests (requires server running)
node tests/run-all.cjs

# Run a single module
node tests/run-all.cjs --bucket mail --buckets-only

# Run only workflows
node tests/run-all.cjs --workflows-only

测试结构:

tests/
  lib/           Shared auth, HTTP client, reporter
  buckets/       One file per module (12 files, 117 tools)
  workflows/     Cross-module tests (5 files)
  run-all.cjs    Master runner

测试通过ROPC进行身份验证(无需手动令牌管理),并在约100秒内运行。


环境变量

复制 .env.example 到 .env 并配置:

变量 必填 描述
MICROSOFT_CLIENT_ID 是 Azure应用程序客户端ID
MICROSOFT_TENANT_ID 是 Azure租户ID
MICROSOFT_REDIRECT_URI 否 OAuth回调URL(默认值: http://localhost:3000/api/auth/callback)
DEVICE_REGISTRY_ENCRYPTION_KEY 生产 用于令牌存储的32字节加密密钥
JWT_SECRET 生产 签署JWT代币的秘密
CORS_ALLOWED_ORIGINS 生产 逗号分隔的允许来源
PORT 无 服务器端口(默认值: 3000)
NODE_ENV 没有 development 或 production

部署

本地(建议入门)

npm install
npm run dev:web

Azure应用服务

看 docs/azure-deployment.md 使用GitHub Actions进行CI/CD部署。


安全

  • 加密存储:所有使用AES-256静态加密的Microsoft令牌
  • 没有客户机密:使用公共客户端流(PKCE)进行桌面身份验证
  • 令牌隔离:每个用户的令牌分别存储在不同的加密密钥中
  • 速率限制:内置速率限制可防止滥用
  • CORS保护:生产中的起源异物种
  • 会话到期:会话将在24小时后过期

生产清单

  • []设置 NODE_ENV=production
  • []设置 DEVICE_REGISTRY_ENCRYPTION_KEY (32字节)
  • []设置 JWT_SECRET (强随机字符串)
  • []设置 CORS_ALLOWED_ORIGINS
  • []使用带有有效证书的HTTPS

项目结构

MCP-Microsoft-Office/
├── mcp-adapter.cjs          MCP protocol adapter (runs locally with Claude Desktop)
├── src/
│   ├── api/                 Express routes and controllers
│   ├── auth/                MSAL authentication (OAuth2, ROPC, token exchange)
│   ├── core/                Services (cache, storage, tools, error handling)
│   ├── graph/               Microsoft Graph API services
│   │   ├── graph-client.cjs   HTTP client with retry, binary support, sessions
│   │   ├── files-service.cjs  OneDrive file operations
│   │   ├── excel-service.cjs  Workbook API (sessions, ranges, tables, functions)
│   │   ├── word-service.cjs   Word create/read (docx + mammoth + word-extractor)
│   │   └── powerpoint-service.cjs  PPT create/read (pptxgenjs + jszip)
│   └── modules/             Feature modules (mail, calendar, excel, word, powerpoint, etc.)
├── public/                  Web UI for authentication
└── tests/                   E2E test suite (gitignored)

贡献

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

许可证

MIT许可证——见 许可证 文件。