](https://mseep.ai/app/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) │
└──────────────────┘三个部分:
- MCP客户端 --您与之交互的AI
- MCP适配器 --将MCP协议转换为HTTP请求的Node.js进程(与客户端在同一台机器上运行)
- 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演示文稿、联系人、待办事项、聊天和基本团队频道操作。 经管理员同意,您可以添加人员目录搜索、组、频道成员管理和会议记录。
______________________________________________________________________
快速开始
先决条件
步骤1:Azure应用程序注册
- 首选 Azure门户 > 微软Entra ID > 应用注册 > 新注册
- 命名它
MCP-Microsoft-Office,使用您首选的帐户类型注册 - 复制 应用程序(客户端)ID 和 目录(租户)ID
- 首选 API权限 > 添加权限 > 微软图形 > 委托权限
- 添加上面列出的18个权限
- 如果您是租户管理员,请单击 授予管理员同意
- 首选 认证 > 添加平台 > 网络
- 重定向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:webAzure应用服务
看 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)______________________________________________________________________
贡献
- 分叉存储库
- 创建要素分支
- 进行更改
- 提交拉取请求
______________________________________________________________________
许可证
MIT许可证——见 许可证 文件。
