关于 Microsoft 365 Calendar
Microsoft 365 Calendar 是通过 Microsoft Graph 管理 Outlook 日历的 MCP 服务,提供事件操作与日程可用性查询,并复用 Microsoft 365 Mail 所管理的 OAuth 凭据。
主要功能
- 01列出并查看日历事件
- 02创建、更新、取消和删除事件
- 03接受或拒绝邀请
- 04查询忙闲并建议会议时间
- 05列出可访问的日历
适用场景
- 01查看指定日期范围内的事件
- 02查找参会者都有空的时段
- 03创建或调整日历会议
MCP 相关
向 MCP 客户端提供 Microsoft Graph 日历操作,包括事件管理、日历列表、忙闲查询和会议时间建议。身份验证由主机通过 Microsoft 365 Mail 处理;此服务读取生成的凭据。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
npx -y @mindstone/mcp-server-microsoft-calendarMS_CLIENT_IDMicrosoft Entra (Azure AD) application client IDMS_CONFIG_DIRPath to the per-user Microsoft config directory (credentials/, accounts.json)MS_ACCOUNT_EMAILAccount email when running in multi-account per-instance mode (falls back to the first account in accounts.json)MS_MCP_PACKAGE_IDLogical package ID surfaced in error responsesMICROSOFT_REQUEST_TIMEOUT_MSOverride the upstream Microsoft Graph request timeout in milliseconds (max 300000 = 5 min)本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
10收录的工具列表 · 更新于 2 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| top | integer | 否 | 返回的事件数上限(默认值:50) |
| calendarId | string | 否 | 日历 ID(默认值:主日历) |
| returnText | boolean | 否 | 返回易读的日程文本,而不是 JSON(默认值:false) |
| endDateTime | any | 否 | ISO 格式的结束日期/时间(默认值:从现在起 7 天后) |
| startDateTime | string | 否 | ISO 格式的开始日期/时间(默认值:现在) |
| deviceTimezone | string | 否 | 系统提示词中的用户设备 IANA 时区(例如 "Europe/London")。当日历设置不可用时用作备用时区,并用于检测时区不匹配。 |
详细介绍
@mindstone/mcp-server-microsoft-calendar
Microsoft 365 Outlook Calendar MCP 服务——通过 Microsoft Graph API 列出、获取、创建、更新、删除、取消和响应事件,检查空闲/忙碌状态、查找会议时间并列出日历。
Microsoft 365 日历 MCP,采用群组式模式。复用由 @mindstone/mcp-server-microsoft-mail 管理的 OAuth 接入层,因此主机只需登录一次,即可使用同一组凭据访问日历、邮件、文件、Teams 和 SharePoint。
状态
- 版本: 0.2.0 · npm
- 身份验证: OAuth(由主机协调,与
mcp-server-microsoft-mail共享)(MS_CLIENT_ID) - 工具: 10(事件、日历、空闲/忙碌状态、日程安排)
- 接口: cloud-api
- 机器可读信息:
STATUS.json - 共享库:
@mindstone/mcp-server-microsoft-shared
为什么要构建此项目
2026 年 5 月将其移植过来时,Microsoft 自家的 Graph MCP 产品线尚未推出独立的 Outlook Calendar 服务,而当时的社区方案都将日历视为独立的登录入口——每个连接器都要单独进行 OAuth 授权流程,并保存各自的刷新令牌副本。我们将 MindstoneRebel 中打包的连接器拆分出来,按 1:1 方式移植,以便同一组包含五个连接器的 Microsoft 365 服务(邮件、日历、文件、Teams、SharePoint)共享一组凭据、一个用于令牌持久化和请求超时的共享库包,以及主机已知如何处理的结构化 auth_required 封装。日历复用 @mindstone/mcp-server-microsoft-mail 的 authenticate_microsoft_account 工具,而不是自行声明该工具。
交互示例
“我今天下午的日历安排是什么?另外,找一个明天我和 Alice 都有空的 30 分钟时段。”
主机调用的工具:
list_events— 查询涵盖今天剩余时间的日期范围。find_meeting_times— 建议明天 Alice 和用户都有空的时段。
响应(节选):
{
"today": [
{ "id": "AA...=", "subject": "Q3 review", "start": "2026-05-19T15:00:00Z", "end": "2026-05-19T16:00:00Z" }
],
"tomorrow_suggestions": [
{ "start": "2026-05-20T10:00:00", "end": "2026-05-20T10:30:00" },
{ "start": "2026-05-20T14:30:00", "end": "2026-05-20T15:00:00" }
]
}
要求
- Node.js 20+
- npm
- 能执行 Microsoft OAuth 流程并将每个账户的令牌文件写入
${MS_CONFIG_DIR}/credentials/${sanitised-email}.token.json,并写入${MS_CONFIG_DIR}/accounts.json索引的主机应用。此服务会读取这些文件;它本身不会发起 OAuth 流程。
一键安装
点击按钮后,宿主将提示你填写:MS_CLIENT_ID、MS_CONFIG_DIR、MS_MCP_PACKAGE_ID、MICROSOFT_REQUEST_TIMEOUT_MS。
Claude Desktop / Claude Code / Goose / Continue.dev 手动配置(Microsoft 365 Calendar)
{
"mcpServers": {
"Microsoft 365 Calendar": {
"command": "npx",
"args": [
"-y",
"@mindstone/mcp-server-microsoft-calendar"
],
"env": {
"MS_CLIENT_ID": "",
"MS_CONFIG_DIR": "",
"MS_MCP_PACKAGE_ID": "Microsoft365Calendar",
"MICROSOFT_REQUEST_TIMEOUT_MS": "60000"
}
}
}
}
快速入门
安装与构建
cd <path-to-repo>/connectors/microsoft-calendar
npm install
npm run build
npx(发布后使用)
npx -y @mindstone/mcp-server-microsoft-calendar
本地
node dist/index.js
配置
此服务与负责 Microsoft 365 OAuth 流程的宿主应用协同运行。宿主会将凭据写入磁盘;此服务会读取这些凭据。
必需的环境变量
| 名称 | 说明 |
|---|---|
MS_CLIENT_ID | Microsoft Entra(Azure AD)应用客户端 ID。 |
MS_CONFIG_DIR | 每用户 Microsoft 配置目录的路径(credentials/、accounts.json)。 |
可选环境变量
| 名称 | 说明 | 默认值 |
|---|---|---|
MS_ACCOUNT_EMAIL | 在每个实例对应多个帐户的模式下运行时使用的帐户电子邮件地址。 | accounts.json 中的第一个帐户。 |
MS_MCP_PACKAGE_ID | 错误响应中显示的逻辑包 ID。 | Microsoft365Calendar |
MICROSOFT_REQUEST_TIMEOUT_MS | 覆盖上游 Microsoft Graph 请求超时时间(最长 300000 ms)。 | 60000 |
MICROSOFT_DISABLE_REFRESH | 设置为 1 可在此界面禁用令牌刷新。工具将以结构化的 auth_required 响应安全失败,以便宿主处理重新授权。云端界面会将其设为 1。 | 未设置 |
宿主配置示例
Claude Desktop / Cursor
{
"mcpServers": {
"Microsoft365Calendar": {
"command": "npx",
"args": ["-y", "@mindstone/mcp-server-microsoft-calendar"],
"env": {
"MS_CLIENT_ID": "your-entra-application-client-id",
"MS_CONFIG_DIR": "/absolute/path/to/microsoft-config"
}
}
}
}
请先通过 @mindstone/mcp-server-microsoft-mail 的 authenticate_microsoft_account 登录;随后日历工具会复用其写入 ${MS_CONFIG_DIR}/ 的凭据。
本地开发(无需发布到 npm)
{
"mcpServers": {
"Microsoft365Calendar": {
"command": "node",
"args": ["<path-to-repo>/connectors/microsoft-calendar/dist/index.js"],
"env": {
"MS_CLIENT_ID": "your-entra-application-client-id",
"MS_CONFIG_DIR": "/absolute/path/to/microsoft-config"
}
}
}
}
工具(10)
| 工具 | 描述 |
|---|---|
list_events | 列出指定日期范围内的日历事件(JSON 格式,包含每位与会者的 RSVP 状态;也可采用议程式文本)。当 Graph 还有更多分页时,会报告 truncated: true——请缩小日期范围或提高 top(最大值为 100)。 |
get_event | 获取特定日历事件的详细信息(可选择包含附件元数据;attachmentsTruncated 表示还有更多分页)。 |
create_event | 创建新的日历事件(可选择添加 Teams 会议和重复安排)。 |
update_event | 更新现有日历事件(包括添加或移除与会者以及修改重复安排)。 |
delete_event | 删除日历事件。 |
cancel_event | 以组织者身份取消会议,并可选择向与会者发送消息。 |
respond_to_event | 接受、拒绝或暂定接受活动邀请。 |
get_free_busy | 查看用户的忙闲状态。 |
find_meeting_times | 推荐所有指定与会者都有空的时段。只有在确认每位请求的与会者的日程可用性后,才会推荐时段;否则会在 unresolvableAttendees 中列出无法确认的与会者。 |
list_calendars | 列出用户有权访问的所有日历。 |
安全说明
- 此服务不提供自己的身份验证工具;登录由
@mindstone/mcp-server-microsoft-mail负责,从而让整个套件共用一个 OAuth 接口。 - 令牌文件由宿主以
0600权限写入;此服务通过套件共享库读取文件,遇到格式错误的文件时会安全失败。 - 在云端环境中,默认启用
MICROSOFT_DISABLE_REFRESH=1,以确保桌面会话是唯一的刷新令牌授权方。 - 各工具的 Graph 调用使用由调用方超时信号与套件超时信号组合而成的信号。
- 所有来自 Graph 的文本都封装在
<untrusted-content>中;只有符合其文档规定的封闭格式的结构化字段(ID、URL、类似枚举的值、时间戳)才会原样传递,否则会进行封装。供应商错误消息在传递给模型前也会进行封装。 - 在发出任何 Graph 请求前,工具输入都会经过安全失败式验证(电子邮件地址、ISO 日期时间、有界数值、严格的重复安排对象)。
- 在插入 Graph 请求路径前,会对事件/日历 ID 进行安全失败式验证(拒绝
?、#、%、\、空白字符以及./..路径段),并在插入位置进行 URL 编码,以防精心构造的 ID 重新路由已通过身份验证的请求。 - Graph 分页不会被静默丢弃:列表端点会报告
truncated/attachmentsTruncated,而不会跟随供应商提供的延续 URL。
许可证
FSL-1.1-MIT — Functional Source License,Version 1.1,未来转为 MIT 许可证。允许免费用于非竞争用途;在 LICENSE 中指定的转换日期转为 MIT 许可证。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。