谷歌日历任务mcp
用于谷歌日历、谷歌任务和Gmail的MCP服务器,带有安全护栏。
专为配合使用而设计 克劳德代码 以及任何MCP兼容客户端。
特性
- 21工具:日历事件、任务和Gmail邮件的完整CRUD
- 安全护栏:每日写入限制、受保护的日历/任务列表、过去事件保护、定期系列保护、Gmail发送批准
- 可选审计日志记录:每月跟踪所有写入操作的JSON文件
- 跨平台:Windows、macOS、Linux
- 可配置的 通过环境变量和
guardrails.json - 测试模式 用于在没有Google API证书的情况下进行开发
先决条件
- Node.js 18+
- 启用了日历、任务和Gmail API的Google Cloud项目
- OAuth 2.0客户端ID(类型:桌面)
快速开始
# 1. Clone and install
git clone https://github.com/talh/google-calendar-tasks-mcp.git
cd google-calendar-tasks-mcp
npm install
# 2. Build
npm run build
# 3. Authenticate (one-time)
node auth.js
# 4. Test with MCP Inspector
npm run inspect谷歌云项目设置
- 首选 console.cloud.google.com
- 创建新项目(或选择现有项目)
- 启用 谷歌日历API:
- 导航到API和服务>库 - 搜索“Google日历API”并启用它
- 启用 谷歌任务API:
- 搜索“Google任务API”并启用它
- 启用 Gmail API:
- 搜索“Gmail API”并启用它
- 配置 OAuth 授权界面:
- 导航到API和服务>OAuth同意屏幕 - 选择“外部”用户类型 - 填写必填字段(应用程序名称、支持电子邮件) - 添加作用域: calendar.events, tasks,以及 gmail.modify - 将自己添加为测试用户
- 创建 OAuth 2.0凭据:
- 导航到API和服务>凭据 - 点击“创建凭据”>“OAuth客户端ID” - 选择“桌面应用程序”作为应用程序类型 - 注意客户端ID和客户端密码
认证
运行auth脚本以设置OAuth凭据:
node auth.js脚本将:
- 提示输入您的客户端ID和客户端密码
- 打开浏览器进入谷歌同意屏幕
- 监听OAuth回调
http://localhost:3000/callback - 将凭据保存到特定于操作系统的默认路径
凭证存储位置:
- 窗户:
%APPDATA%\google-calendar-tasks-mcp\credentials.json - macOS/Linux:
~/.config/google-calendar-tasks-mcp/credentials.json
覆盖 GOOGLE_MCP_CREDENTIALS_PATH 环境变量。
Claude代码配置
添加到您的Claude Code MCP设置(项目级别 .mcp.json 或全局设置):
{
"mcpServers": {
"google-calendar-tasks": {
"command": "node",
"args": ["/absolute/path/to/google-calendar-tasks-mcp/build/index.js"],
"env": {
"GOOGLE_MCP_TIMEZONE": "America/New_York"
}
}
}
}工具参考
日历工具
calendar_list_calendars
列出用户有权访问的所有日历。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| *(无)* |
calendar_list_events
列出日期或日期范围的日历事件。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
calendarId | string | 否 | 日历ID。默认为 "primary" |
date | string | 否 | 单日期 YYYY-MM-DD 格式 |
startDate | string | 否 | 范围起始于 YYYY-MM-DD |
endDate | string | 否 | 范围以结尾 YYYY-MM-DD |
maxResults | number | 否 | 要返回的最大事件数(1-250,默认值50) |
提供其中之一 date 或两者 startDate 和 endDate.
calendar_get_event
获取单个日历事件的完整详细信息。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
calendarId | string | 否 | 日历ID。默认为 "primary" |
eventId | string | 是 | 谷歌事件ID |
calendar_create_event
创建新的日历事件。受护栏约束。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
calendarId | string | 否 | 日历ID。默认为 "primary" |
title | string | 是 | 事件标题 |
date | string | 是 | 日期 YYYY-MM-DD |
startTime | string | 是 | 开始时间 HH:MM (24小时) |
endTime | string | 是 | 结束时间 HH:MM (24小时) |
location | string | 否 | 事件位置 |
description | string | 否 | 事件描述 |
calendar_update_event
更新现有日历事件。受护栏约束。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
calendarId | string | 否 | 日历ID。默认为 "primary" |
eventId | string | 是 | 谷歌事件ID |
title | string | 否 | 新标题 |
date | string | 否 | 新日期 YYYY-MM-DD |
startTime | string | 否 | 新的开始时间 HH:MM |
endTime | string | 否 | 中的新结束时间 HH:MM |
location | string | 否 | 新位置 |
description | string | 否 | 新描述 |
对于早于以下时间的事件被阻止 pastEventProtectionDays.
calendar_delete_event
删除单个日历事件。受护栏约束。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
calendarId | string | 否 | 日历ID。默认为 "primary" |
eventId | string | 是 | 谷歌事件ID |
对于过去的事件和重复出现的系列主控,已被阻止(除非 allowRecurringSeriesDelete 这是真的)。
任务工具
tasks_list_tasklists
列出所有任务列表。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| *(无)* |
tasks_list
在给定的列表中列出任务。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
taskListId | string | 否 | 任务列表ID。默认为默认列表 |
showCompleted | boolean | 否 | 包括已完成的任务(默认为false) |
maxResults | number | 否 | 要返回的最大任务数(1-100,默认值100) |
tasks_get
获取单个任务的完整详细信息。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
taskListId | string | 是 | 任务列表ID |
taskId | string | 是 | 谷歌任务ID |
tasks_create
创建新任务。受护栏约束。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
taskListId | string | 否 | 任务列表ID。默认为默认列表 |
title | string | 是 | 任务标题 |
due | string | 否 | 到期日期 YYYY-MM-DD |
notes | string | 否 | 任务注释/描述 |
tasks_update
更新现有任务。受护栏约束。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
taskListId | string | 是 | 任务列表ID |
taskId | string | 是 | 谷歌任务ID |
title | string | 否 | 新标题 |
due | string | 否 | 中的新截止日期 YYYY-MM-DD |
notes | string | 否 | 新注释 |
status | string | 否 | "needsAction" 或 "completed" |
tasks_delete
删除单个任务。受护栏约束。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
taskListId | string | 是 | 任务列表ID |
taskId | string | 是 | 谷歌任务ID |
tasks_complete
将任务标记为已完成。受护栏约束。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
taskListId | string | 是 | 任务列表ID |
taskId | string | 是 | 谷歌任务ID |
tasks_move
将任务移动到其他列表。计为2次写入操作(创建+删除)。受护栏约束。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
sourceListId | string | 是 | 源任务列表ID |
taskId | string | 是 | 谷歌任务ID |
destinationListId | string | 是 | 目标任务列表ID |
Gmail工具
gmail_list_messages
搜索并列出电子邮件。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
query | string | 否 | Gmail搜索查询(与Gmail搜索栏语法相同。, is:unread, from:sender@email.com) |
labelIds | string\[\] | 否 | 按标签ID过滤(例如。, ["INBOX", "UNREAD"]) |
maxResults | number | No | 要返回的最大消息数(1-100,默认值20) |
gmail_get_message
获取一封电子邮件的完整内容。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
messageId | string | 是 | Gmail邮件ID |
format | string | 否 | "full" (默认), "metadata",或 "minimal" |
gmail_get_attachment
从电子邮件中下载特定附件。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
messageId | string | 是 | Gmail邮件ID |
attachmentId | string | 是 | 附件ID来自 gmail_get_message 回应 |
gmail_modify_message
在电子邮件中添加或删除标签。移除 INBOX 存档。添加 TRASH 垃圾。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
messageId | string | 是 | Gmail邮件ID |
addLabelIds | string\[\] | 否 | 要添加的标签ID |
removeLabelIds | string\[\] | 否 | 要删除的标签ID |
受护栏约束。
gmail_list_labels
列出所有Gmail标签(系统和用户创建)。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| *(无)* |
gmail_create_label
创建一个新的Gmail标签。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
name | string | 是 | 标签名称。使用 / 用于嵌套(例如。, DPA/Processed) |
labelListVisibility | string | 否 | "labelShow" (默认), "labelShowIfUnread",或 "labelHide" |
受护栏约束。
gmail_send_message
发送电子邮件(回复或新建)。 需要明确批准 — requireApproval 必须 true.
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
to | string | 是 | 收件人电子邮件地址 |
subject | string | 是 | 电子邮件主题 |
body | string | 是 | 电子邮件正文(纯文本) |
requireApproval | boolean | 是 | 必须是 true --确认用户明确批准发送 |
threadId | string | 否 | 用于线程回复的Gmail线程ID |
inReplyTo | string | 否 | 正在回复的电子邮件的邮件ID标头 |
受护栏约束。这 requireApproval: true 标志由服务器强制执行——没有标志的调用将被拒绝。
配置
环境变量
| 变量 | 默认值 | 描述 |
|---|---|---|
GOOGLE_MCP_TIMEZONE | 系统时区 | IANA时区(例如。, America/New_York) |
GOOGLE_MCP_CREDENTIALS_PATH | 特定于操作系统的路径 | OAuth凭据文件的路径 |
GOOGLE_MCP_AUDIT_LOG_DIR | *(残疾)* | 审核日志文件目录 |
GOOGLE_MCP_GUARDRAILS_PATH | ./guardrails.json | 护栏配置路径 |
GOOGLE_MCP_TEST_MODE | false | 使用模拟Google API运行 |
护栏配置
创建或编辑 guardrails.json 在服务器目录中:
{
"dailyWriteLimit": 50,
"pastEventProtectionDays": 7,
"protectedCalendars": [],
"protectedTaskLists": [],
"allowRecurringSeriesDelete": false,
"gmail": {
"sendRequiresApproval": true,
"maxSendsPerDay": 10
}
}| 选项 | 默认值 | 描述 |
|---|---|---|
dailyWriteLimit | 50 | UTC日最大写入操作数 |
pastEventProtectionDays | 7 | 阻止对超过N天的事件进行编辑/删除 |
protectedCalendars | [] | 无法写入的日历ID |
protectedTaskLists | [] | 无法写入的任务列表ID |
allowRecurringSeriesDelete | false | 允许删除整个重复事件系列 |
gmail.sendRequiresApproval | true | 需要 requireApproval: true 发送标志 |
gmail.maxSendsPerDay | 10 | 每个UTC日可以发送的最大电子邮件数 |
审计日志
通过设置启用 GOOGLE_MCP_AUDIT_LOG_DIR 到目录路径。服务器每月写入JSON文件(operations_YYYY-MM.json)跟踪所有创建、更新、删除、完成和移动操作。
每个条目包括:操作类型、服务、项目标题、Google ID、时间戳和所做的任何更改。
发展
npm run build # Compile TypeScript
npm test # Run all tests
npm run test:unit # Run unit tests only
npm run test:integration # Run integration tests only
npm run inspect # Launch MCP Inspector测试模式
集 GOOGLE_MCP_TEST_MODE=true 使用模拟Google API运行。适用于没有真实证书的开发和测试。
许可证
麻省理工学院
