多账户谷歌工作区+Slack MCP for Claude代码
允许Claude Code访问Gmail、Google云端硬盘、日历、表格、文档和Slack,并完全支持多个Google帐户(例如,个人+工作)。
背景
Claude Desktop和Claude Cowork都内置了谷歌工作区集成功能——只需切换一下,你就可以连接了。 克劳德代码什么都没有。 截至2026年3月,还没有官方集成,没有处理多帐户的插件,也没有关于如何设置它的文档。
这个仓库是大约6个小时的研究和调试的结果。最终的解决方案很简单,但要实现这一点,需要发现Claude Code的MCP系统、Google的OAuth2实现和 gws CLI。
是什么让这很难
这不是一个问题,而是一堆问题,每一个都没有记录:
- Claude Code默认忽略错误文件中的MCP配置。 如果你把
mcpServers在settings.local.json(在您所期望的地方),服务器不会启动。没有错误。没有日志。您可以花费数小时重新启动并重新检查JSON语法。配置必须插入.mcp.json在项目的根。 (克劳德代码问题#24477)
- 两个Google帐户的一个OAuth客户端会破坏这两个功能。 当您使用相同的OAuth客户端对帐户B进行身份验证时,Google会使帐户A的刷新令牌无效。在同一个GCP项目中,您需要单独的OAuth桌面应用程序客户端——每个帐户一个。
- 凭据文件env-var不起作用。
GOOGLE_WORKSPACE_CLI_CREDENTIALS_FILE应该让你指出 谷歌工作区CLI 在不同的凭据文件中,但它不能可靠地路由到正确的帐户。你必须铸造新的访问令牌,并通过GOOGLE_WORKSPACE_CLI_TOKEN(最高优先级的身份验证方法)。
- Go二进制文件使用单破折号。 两者
gwsCLI和slack-mcp-server是Go二进制文件。--transport stdio默默地失败了。它是-t stdio--或者干脆省略它(默认为stdio)。
- MCP服务器仅在会话启动时启动。 配置更改只有在完全重新启动Claude Code后才会生效。
每种诊断都需要30-120分钟。当它实际上是一个可解决的配置问题时,它们一起让设置感觉崩溃了。
我们尝试和拒绝的东西
| 方法 | 为什么失败 |
|---|---|
遗产 google-workspace Claude Code插件 | 仅限单个帐户,端口8000冲突阻止第二个实例 |
| 两个帐户的单个OAuth客户端 | Google在第二次身份验证时使第一个帐户的刷新令牌无效 |
CREDENTIALS_FILE 每个MCP服务器的env var | 不能可靠地路由到正确的帐户 |
mcpServers 在 settings.local.json | 被默默忽略——Claude Code从不从那里读取MCP配置 |
mcpServers 在 .claude/settings.json | 也默默地忽略了 |
| 服务帐户身份验证 | 没有域范围的委派,无法访问个人Gmail/Drive |
| 请求所有85个以上OAuth作用域 | 谷歌阻止未经验证的应用程序请求太多作用域 |
有关完整的调查日志,请参阅 docs/研究笔记.md.
解决方案
工作设置使用:
- 谷歌工作区CLI (
gwsv0.7+)——谷歌官方CLI,内置MCP服务器模式 - 单独的OAuth桌面客户端 --同一GCP项目中的每个Google帐户一个
- 令牌包装脚本 --从每个帐户的凭据文件中创建新的访问令牌,并通过最高优先级的env-var传递它们
.mcp.json在项目根 --Claude Code实际上为MCP服务器读取的唯一配置位置- slack-mcp服务器 --基于Go的Slack MCP,默认为只读
你得到了什么
| MCP服务器 | 功能 |
|---|---|
gws-personal | 您个人谷歌帐户的Gmail、云端硬盘、日历、表格、文档 |
gws-work | 同样,对于您的工作Google帐户(可选) |
slack | 阅读频道、搜索消息、浏览帖子、列出用户 |
运行后,Claude Code可以通过自然语言搜索您的电子邮件、读取Drive文件、查看日历、读/写电子表格和搜索Slack。
快速开始
先决条件
- 克劳德代码 安装和工作
- 18+(适用于
npx) - Python 3 (用于代币铸造——仅使用stdlib)
- gcloud命令行界面 (用于启用API和IAM)
- 具有Gmail/Drive访问权限的Google帐户
- (可选)Slack工作区,您可以在其中创建应用程序
AI引导设置
- 克隆此仓库 并在其中打开克劳德代码:
git clone https://github.com/YOUR_USERNAME/claude-code-google-workspace.git
cd claude-code-google-workspace
claude- 告诉克劳德密码:“为我设置谷歌工作区MCP”
这 CLAUDE.md 此存储库中包含机器可读的设置指令。Claude Code将引导您完成每个步骤,只提示您基于浏览器的OAuth步骤无法自动化。
- 重新启动Claude代码 加载新的MCP服务器。
手动设置
如果您更喜欢分步说明: docs/manual-setup.md.
完整研究日志
要了解每一个决定和失败的方法: docs/研究笔记.md.
建筑
Claude Code session start
│
├─── reads .mcp.json (project root)
│
├─── starts gws-personal server:
│ │
│ ├── gws-token-wrapper.sh personal.json
│ │ │
│ │ ├── reads personal.json (client_id_A + refresh_token)
│ │ ├── POST https://oauth2.googleapis.com/token → access_token
│ │ └── exec: GOOGLE_WORKSPACE_CLI_TOKEN= gws mcp -s gmail,drive,...
│ │
│ └── gws mcp ←→ Google APIs (Gmail, Drive, Calendar, Sheets, Docs)
│
├─── starts gws-work server:
│ │
│ └── (same flow, different credential file with client_id_B)
│
└─── starts slack server:
│
└── npx slack-mcp-server (SLACK_MCP_XOXP_TOKEN env var)为什么使用包装脚本?
这 gws CLI在内部一次存储一组凭据。对于多个帐户,我们不能依赖其凭据文件路由(CREDENTIALS_FILE env-var不可靠)。相反,我们:
- 读取导出的凭据文件(已
client_id,client_secret,refresh_token) - 直接调用Google的令牌端点以生成新的访问令牌
- 通过
GOOGLE_WORKSPACE_CLI_TOKEN--中的最高优先级身份验证方法gws身份验证链
这是15行shell+Python stdlib。没有依赖关系。
为什么要分离OAuth客户端?
OAuth2 Desktop App客户端有一种行为,即为帐户B颁发新的刷新令牌会使帐户a的现有刷新令牌无效——如果它们共享相同的刷新令牌 client_id在同一GCP项目中创建单独的OAuth桌面客户端,为每个帐户提供了自己独立的令牌生命周期。
在您自己的项目中使用
设置后,在任何需要这些MCP服务器的项目中,您都需要两件事:
.mcp.json从项目根源 --从该仓库的模板复制并填写路径~/.config/gws/--凭证文件+包装器脚本(在安装过程中创建一次,在所有项目中共享)
或者添加 mcpServers 配置到 ~/.claude.json 在每个项目中实现全球访问。
总是吉吉诺雷 .mcp.json --它包含OAuth令牌。
已知的戈查斯
这些是按照如果你在不知不觉中击中它们会花费你多少时间来排序的:
| # | Gotcha | 时间成本 | 症状 | 修复 |
|---|---|---|---|---|
| 1 | mcpServers 在 settings.local.json 是 默默地忽略 | 2+小时 | 服务器从不启动,零错误 | 使用 .mcp.json (项目根)或 ~/.claude.json (全球)。 第24477期 |
| 2 | 两个帐户使用相同的OAuth客户端 | 1-2小时 | 在第二个帐户进行身份验证后,第一个帐户停止工作 | 为每个帐户创建单独的OAuth桌面客户端 |
| 3 | CREDENTIALS_FILE env var不可靠 | 1小时 | 返回错误的帐户数据 | 使用 GOOGLE_WORKSPACE_CLI_TOKEN 通过包装脚本 |
| 4 | 工作帐户显示“访问被阻止” | 30分钟 | OAuth同意屏幕阻止非测试用户 | 在OAuth同意屏幕上将所有帐户添加为测试用户+授予IAM serviceUsageConsumer 角色 |
| 5 | MCP服务器仅在会话启动时启动 | 15分钟 | 配置更改不生效 | 任何更改后重新启动Claude代码 .mcp.json 改变 |
| 6 | Go二进制文件使用单破折号 | 15分钟 | --transport stdio 无声失败 | 使用 -t stdio 或省略(默认为stdio) |
| 7 | 访问令牌在约1小时后过期 | 5分钟 | API调用在长会话上失败 | 重新启动Claude Code以获取新令牌 |
| 8 | gws auth login 打开前台浏览器 | 5分钟 | 错误的Chrome配置文件=经过身份验证的帐户错误 | 运行前将正确的Chrome配置程序放在前面 |
| 9 | 请求的OAuth作用域太多 | 10分钟 | 谷歌阻止未经验证的应用程序 | 使用 -s drive,gmail,calendar,sheets,docs (并非所有范围) |
注意事项
- 写于2026年3月 --经过测试
gwsCLI v0.7.0和当前的Claude代码 - 谷歌和Anthropic可能会让这件事变得更容易——这个仓库填补了之前的空白
- GCP项目+OAuth同意屏幕设置需要手动浏览器步骤(不能完全自动化)
- 会话开始时生成的访问令牌将在约1小时后过期——长会话将重新启动
- 在macOS上测试-Linux应该可以工作,Windows未经测试
- 这
gwsCLI是1.0之前的版本——标志和身份验证行为可能会发生变化
参考文献
- 谷歌工作区CLI --支持Google Workspace访问的核心工具
- slack-mcp服务器 --Slack MCP服务器
- 克劳德代码MCP文档 --MCP服务器官方文档
- MCP规范 --模型上下文协议规范
- Google OAuth2文档 --OAuth流程和令牌生命周期
- 克劳德代码问题#24477 —
settings.local.json无声忽略错误
贡献
欢迎发布问题和PR。如果你遇到了新的问题,请打开一个问题——我们捕获的每一个未记录的行为都会为某人节省几个小时。
许可证
麻省理工学院
