使用说明
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 - 启用 允许公共客户端流
- 重定向URI:
步骤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)
贡献
- 分叉存储库
- 创建要素分支
- 进行更改
- 提交拉取请求
许可证
MIT许可证——见 许可证 文件。
