内容
# m365-actions-mcp-server
MCP 服务器,添加**写操作**和**共享邮箱搜索**到 Microsoft 365 —— Anthropic 只读 ms365 连接器的缺失部分,使其成为一个完整的双向集成。
## 为什么存在
Anthropic 内置的 Microsoft 365 连接器为 Claude 提供了强大的读取权限:搜索电子邮件、浏览日历、查找 Teams 消息、查询 SharePoint。但它**无法发送、创建、更新或删除任何内容**,并且对**共享/委托邮箱的支持有限**。该服务器填补了这两个空白。
两个连接器一起运行,Claude 可以完成端到端的完整工作流:读取电子邮件并回复,检查日历可用性并预订会议,查找 Teams 会话并回复 —— 所有这些都不需要离开聊天。
## 可用工具
### 电子邮件
| 工具 | 描述 | 适用 |
|------|-------------|------------|
| `m365_send_mail` | 发送新电子邮件 | — |
| `m365_reply_mail` | 回复现有电子邮件(回复 / 回复所有人) | `outlook_email_search`(Anthropic)获取消息 ID |
| `m365_get_attachments` | 从电子邮件中下载附件 | `outlook_email_search`(Anthropic)获取消息 ID |
| `m365_search_shared_mail` | 在共享/委托邮箱中搜索电子邮件 | 独立使用,通过 Graph API /users/{mailbox}/messages,支持 KQL 搜索 |
### 日历
| 工具 | 描述 | 适用 |
|------|-------------|------------|
| `m365_create_event` | 创建日历事件(可选 Teams 链接) | `find_meeting_availability`(Anthropic)检查时间段 |
| `m365_update_event` | 更新现有事件 | `outlook_calendar_search`(Anthropic)获取事件 ID |
| `m365_delete_event` | 删除事件 | `outlook_calendar_search`(Anthropic)获取事件 ID |
### Teams
| 工具 | 描述 | 适用 |
|------|-------------|------------|
| `m365_list_teams_and_channels` | 列出已加入的 Teams 及其频道 | — |
| `m365_send_channel_message` | 向 Teams 频道发送消息 | `m365_list_teams_and_channels` 获取 ID |
| `m365_send_chat_message` | 在 Teams 聊天中发送消息(1:1 或群组) | `chat_message_search`(Anthropic)获取聊天 ID |
| `m365_reply_to_message` | 回复现有的 Teams 消息 | `chat_message_search`(Anthropic)获取消息 ID |
## 与 Anthropic 连接器配合使用
```
Anthropic ms365 连接器(读取) m365-actions-mcp-server(写入)
───────────────────────────────── ──────────────────────────────────
outlook_email_search ──→ m365_send_mail / m365_reply_mail
outlook_calendar_search ──→ m365_create_event / m365_update_event
find_meeting_availability ──→ m365_create_event
chat_message_search ──→ m365_send_chat_message / m365_reply_to_message
sharepoint_search ──→ (只读,无需写入)
```
Claude 会自动将这些工具链接在一起。例如:“查找 Marco 关于发票的电子邮件并回复说我们将在周五付款”会触发 `outlook_email_search`(Anthropic),接着是 `m365_reply_mail`(此服务器)。
## 共享邮箱搜索
`m365_search_shared_mail` 工具填补了 Anthropic 连接器的一项空白:跨共享/委托邮箱的可靠搜索。它直接通过 Microsoft Graph API 访问 /users/{mailbox}/messages,支持:
- **KQL 搜索**(from:, subject:, 自由文本)通过 search 参数
- **日期范围过滤**通过 OData 过滤器
- **分页回退**,在搜索不可用时进行客户端过滤
- **文件夹定位**(收件箱,已发送邮件等)
这是必要的,因为 Anthropic 连接器 `outlook_email_search` 对共享邮箱的索引不可靠,可能会在高容量邮箱中漏掉邮件。
`Mail.Read.Shared` 委托权限必须在 Azure AD 中授予此工具才能使用。
## 先决条件
- Node.js >= 18
- 在 Azure AD / Entra ID 中注册的应用
### Azure 应用配置
1. 进入 [Entra ID](https://portal.azure.com) -> 应用注册 -> 新注册
2. 名称:`M365 Actions MCP Server`
3. 支持的帐户类型:**单租户**
4. 重定向 URI:平台 **Web**,URI `http://localhost:3939/auth/callback`
5. 创建一个**客户端密钥**(Certificates & secrets -> 新客户端密钥)
6. 添加**委托**权限(API permissions -> Microsoft Graph):
- `Mail.Send`
- `Mail.Read`
- `Mail.Read.Shared`
- `Calendars.ReadWrite`
- `Chat.ReadWrite`
- `ChannelMessage.Send`
- `Team.ReadBasic.All`
- `Channel.ReadBasic.All`
- `User.Read`
- `offline_access`
7. 点击 **授予管理员同意**
## 安装
```bash
git clone https://github.com/dfsolutions/m365-actions-mcp-server.git
cd m365-actions-mcp-server
npm install
```
## 配置
复制 `.env.example` 到 `.env` 并填写您的 Azure 应用凭证:
```bash
cp .env.example .env
```
```env
M365_CLIENT_ID=您的客户端 ID
M365_CLIENT_SECRET=您的客户端密钥
M365_TENANT_ID=您的租户 ID
M365_REDIRECT_URI=http://localhost:3939/auth/callback
M365_USER_EMAIL=您的邮箱@域名.com
```
## 构建和运行
```bash
npx tsc
node dist/index.js
```
在第一次运行,浏览器将打开用于 Microsoft 登录。令牌缓存在 `~/.m365-actions-tokens.json` 中,并自动在到期时续期。
## 与 Claude Desktop / Cowork 集成
添加到您的 MCP 配置文件:
```json
{
"mcpServers": {
"m365-actions": {
"command": "node",
"args": ["/完整路径/to/m365-actions-mcp-server/dist/index.js"],
"env": {
"M365_CLIENT_ID": "您的客户端 ID",
"M365_CLIENT_SECRET": "您的客户端密钥",
"M365_TENANT_ID": "您的租户 ID",
"M365_REDIRECT_URI": "http://localhost:3939/auth/callback",
"M365_USER_EMAIL": "您的邮箱@域名.com"
}
}
}
}
```
或者,如果变量位于 `.env` 文件中:
```json
{
"mcpServers": {
"m365-actions": {
"command": "node",
"args": ["/完整路径/to/m365-actions-mcp-server/dist/index.js"]
}
}
}
```
## 身份验证
服务器使用 MSAL 和 **授权代码(委托)** 流:
- 在第一次运行时,它会打开浏览器进行登录
- 在 `~/.m365-actions-tokens.json` 中保存访问 + 刷新令牌
- 在到期时自动续期令牌
- 刷新令牌持续 ~90 天,然后需要新的登录
## 许可证
MIT