日历事件管理服务

一个基于Cloudflare Workers的Google Calendar集成服务,提供日程查询、预约创建与事件管理功能。

  • by TanujKS
  • TypeScript
  • 本地部署
  • 2 星标
  • 更新于
在 GitHub 查看 TanujKS/google-calendar-mcp

使用说明

Cloudflare Workers上的Google日历MCP服务器

一个远程模型上下文协议(MCP)服务器,提供谷歌日历集成工具,用于安排咨询、检查可用性和管理日历事件。使用Cloudflare Workers和Durable Objects构建,用于安全的令牌存储。

特性

此MCP服务器提供以下工具:

  • getAvailability -查看Google日历中的可用时间段
  • createConsultation -使用客户详细信息创建新的日历事件
  • rescheduleConsultation -更新现有事件的时间
  • cancelConsultation -删除日历事件

快速开始

先决条件

  • 启用Workers的Cloudflare帐户
  • 具有OAuth凭据的Google Cloud项目
  • 本地安装Node.js和npm
  • Wrangler CLI已安装: npm install -g wrangler

1.克隆和安装

git clone <your-repo-url>
cd my-mcp-server
npm install

2.设置Google OAuth凭据

  1. 转到 谷歌云控制台
  2. 创建新项目或选择现有项目
  3. 启用 谷歌日历API:
    • 导航到“API和服务”>“库”
    • 搜索“Google日历API”并启用它
  4. 创建OAuth 2.0凭据:
    • 转到“API和服务”>“凭据”
    • 点击“创建凭据”>“OAuth客户端ID”
    • 选择“Web应用程序”作为应用程序类型
    • 添加授权重定向URI:
      • 生产: https://<your-worker-name>.<your-account>.workers.dev/oauth/callback
      • 对于当地发展: https://localhost:8787/oauth/callback (如果使用wrangler-dev)
    • 保存 客户端ID 和 客户端密钥

3.配置环境变量

更新 wrangler.jsonc 根据您的配置:

{
  "vars": {
    "GOOGLE_CLIENT_ID": "your-client-id.apps.googleusercontent.com",
    "GOOGLE_REDIRECT_URI": "https://your-worker-name.your-account.workers.dev/oauth/callback",
    "DEFAULT_CALENDAR_ID": "primary",  // or a specific calendar ID
    "DEFAULT_TIMEZONE": "America/Los_Angeles"  // your timezone
  }
}

4.设置秘密

对于敏感值,请使用Wrangler secrets(建议用于生产):

# Set the Google Client Secret
wrangler secret put GOOGLE_CLIENT_SECRET
# Enter your client secret when prompted

为了地方发展,创建一个 .dev.vars file(不应提交此文件):

GOOGLE_CLIENT_ID=your-client-id.apps.googleusercontent.com
GOOGLE_CLIENT_SECRET=your-client-secret
GOOGLE_REDIRECT_URI=https://localhost:8787/oauth/callback
DEFAULT_CALENDAR_ID=primary
DEFAULT_TIMEZONE=America/Los_Angeles

5.部署Worker

npm run deploy

这将把您的MCP服务器部署到Cloudflare Workers。注意你部署的worker的URL(例如。, my-mcp-server.your-account.workers.dev).

MCP端点:

  • ✅ SSE端点: https://<your-worker-url>/sse (使用这个)
  • ❌ 可流式传输的HTTP端点: https://<your-worker-url>/mcp (尚未工作-请勿使用)

6.使用谷歌日历进行身份验证

在MCP服务器可以访问您的日历之前,您需要完成OAuth流程:

  1. 启动OAuth流程 (替换 <your-worker-url>):
curl -i "https://<your-worker-url>/oauth/start"

这将把您重定向到谷歌的授权页面。按照提示授予日历访问权限。

  1. 完成身份验证:授权后,谷歌将重定向到 /oauth/callback,您的刷新令牌将安全地存储在持久对象中。

备注:如果您看到“未返回refresh_token”,您可能需要在您的 Google帐户权限 然后再试一次。如果应用程序之前已获得授权,但未请求离线访问,则会发生这种情况。

7.验证身份验证

一旦通过身份验证,MCP服务器将自动:

  • 将刷新令牌存储在持久对象中
  • 根据需要刷新访问令牌
  • 使用存储的凭据访问日历

可用工具

getAvailability

检查日期范围内的可用时间段。

参数:

  • startISO (字符串):ISO 8601格式的开始时间
  • endISO (字符串):ISO 8601格式的结束时间
  • durationMinutes (数字):所需时隙持续时间(5-240分钟)
  • timeZone (字符串,可选):时区(默认值: America/Los_Angeles)
  • calendarId (字符串,可选):日历ID(默认:已配置 DEFAULT_CALENDAR_ID)

退货: 可用时隙阵列 { startISO, endISO } 物体。

createConsultation

创建新的日历事件。

参数:

  • customerName (string):客户名称
  • customerEmail (字符串,可选):电子邮件地址
  • startISO (string):ISO 8601格式的事件开始时间
  • endISO (string):ISO 8601格式的事件结束时间
  • timeZone (字符串,可选):时区(默认值: America/Los_Angeles)
  • notes (字符串,可选):附加注释
  • calendarId (字符串,可选):日历ID(默认:已配置 DEFAULT_CALENDAR_ID)

退货: 创建的事件详细信息包括 eventId, htmlLink以及定时信息。

rescheduleConsultation

更新现有事件的开始和结束时间。

参数:

  • eventId (string):要重新安排的事件的ID
  • newStartISO (string):ISO 8601格式的新开始时间
  • newEndISO (string):ISO 8601格式的新结束时间
  • timeZone (字符串,可选):时区(默认值: America/Los_Angeles)
  • calendarId (字符串,可选):日历ID(默认:已配置 DEFAULT_CALENDAR_ID)

退货: 更新了事件详细信息。

cancelConsultation

删除日历事件。

参数:

  • eventId (string):要取消的事件的ID
  • calendarId (字符串,可选):日历ID(默认:已配置 DEFAULT_CALENDAR_ID)

退货: 成功确认。

连接到MCP客户端

⚠️ 重要:你 必须 使用连接 SSE(服务器发送事件)端点 (/sse).可流式传输的HTTP端点(/mcp)是 尚未工作 不应使用。

Cloudflare AI游乐场

  1. 首选 Cloudflare AI游乐场
  2. 输入您的MCP服务器 SSE端点URL:
    https://<your-worker-url>/sse
    
    备注:使用 /sse 仅限端点。不要使用 /mcp 因为它还没有功能。
  3. 你的谷歌日历工具将在操场上可用!

克劳德桌面版

使用以下命令从Claude Desktop连接 mcp远程代理:

  1. 安装mcp远程: npm install -g mcp-remote
  2. 打开克劳德桌面设置: 设置>开发人员>编辑配置
  3. 使用添加MCP服务器配置 SSE端点:
{
  "mcpServers": {
    "google-calendar": {
      "command": "npx",
      "args": [
        "mcp-remote",
        "https://<your-worker-url>/sse"
      ]
    }
  }
}

重要:始终使用 /sse 终点。这 /mcp 端点尚未运行。

  1. 重新启动克劳德桌面。您的Google日历工具将会出现!

本地开发

在本地运行worker:

npm run dev

工人将在 http://localhost:8787。更新您的 .dev.vars 该文件具有用于本地测试的适当重定向URI。

建筑

  • Cloudflare员工:承载MCP服务器端点
  • 耐用物品:安全地存储OAuth刷新令牌
  • 谷歌日历API:通过OAuth 2.0提供日历访问
  • MCP协议:工具集成的标准协议
  • 运输:SSE(服务器发送事件)端点位于 /sse -这就是 唯一工作端点.可流式传输HTTP /mcp 尚未运行。

安全须知

  • OAuth令牌存储在持久对象中(每个帐户的独立存储)
  • 使用存储的刷新令牌自动刷新访问令牌
  • 将Wrangler机密用于生产部署(切勿将机密提交给git)
  • OAuth流使用状态验证来防止CSRF攻击

故障排除

“未存储刷新令牌”错误

这意味着OAuth尚未完成。按照设置步骤6中的描述运行OAuth流。

OAuth回调失败

  • 验证Google Cloud Console中的重定向URI是否与您的工作URL完全匹配
  • 检查一下 GOOGLE_REDIRECT_URI 在您的配置中匹配授权的重定向URI
  • 确保OAuth状态参数有效(应由重定向自动处理)

日历访问被拒绝

  • 验证Google日历API是否已在您的Google Cloud项目中启用
  • 检查OAuth作用域是否包括 calendar.events 和 calendar.readonly
  • 如果权限似乎不正确,则撤销并重新授权应用程序

与MCP客户端的连接问题

  • 始终使用 /sse 端点 -这是唯一可用的端点
  • 这 /mcp 可流式传输的HTTP端点尚未正常工作
  • 确保您的客户端支持SSE(服务器发送事件)传输
  • 对于Cloudflare AI游乐场,请使用: https://<your-worker-url>/sse
  • 对于配备mcp-remote的Claude Desktop,请使用: https://<your-worker-url>/sse