使用说明
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凭据
- 转到 谷歌云控制台
- 创建新项目或选择现有项目
- 启用 谷歌日历API:
- 导航到“API和服务”>“库”
- 搜索“Google日历API”并启用它
- 创建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流程:
- 启动OAuth流程 (替换
<your-worker-url>):
curl -i "https://<your-worker-url>/oauth/start"
这将把您重定向到谷歌的授权页面。按照提示授予日历访问权限。
- 完成身份验证:授权后,谷歌将重定向到
/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):要重新安排的事件的IDnewStartISO(string):ISO 8601格式的新开始时间newEndISO(string):ISO 8601格式的新结束时间timeZone(字符串,可选):时区(默认值:America/Los_Angeles)calendarId(字符串,可选):日历ID(默认:已配置DEFAULT_CALENDAR_ID)
退货: 更新了事件详细信息。
cancelConsultation
删除日历事件。
参数:
eventId(string):要取消的事件的IDcalendarId(字符串,可选):日历ID(默认:已配置DEFAULT_CALENDAR_ID)
退货: 成功确认。
连接到MCP客户端
⚠️ 重要:你 必须 使用连接 SSE(服务器发送事件)端点 (
/sse).可流式传输的HTTP端点(/mcp)是 尚未工作 不应使用。
Cloudflare AI游乐场
- 首选 Cloudflare AI游乐场
- 输入您的MCP服务器 SSE端点URL:备注:使用
https://<your-worker-url>/sse/sse仅限端点。不要使用/mcp因为它还没有功能。 - 你的谷歌日历工具将在操场上可用!
克劳德桌面版
使用以下命令从Claude Desktop连接 mcp远程代理:
- 安装mcp远程:
npm install -g mcp-remote - 打开克劳德桌面设置: 设置>开发人员>编辑配置
- 使用添加MCP服务器配置 SSE端点:
{
"mcpServers": {
"google-calendar": {
"command": "npx",
"args": [
"mcp-remote",
"https://<your-worker-url>/sse"
]
}
}
}
重要:始终使用 /sse 终点。这 /mcp 端点尚未运行。
- 重新启动克劳德桌面。您的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