关于 Ultimate Google Docs & Drive MCP Server
Ultimate Google Docs & Drive MCP Server 将 MCP 客户端连接到 Google Docs、Sheets、Drive、Gmail 和 Calendar。它提供内容读写、文件与邮件管理及日程操作工具,并支持本地授权或远程部署到 Cloud Run。
主要功能
- 01读取和编辑 Google Docs
- 02管理 Sheets 数据、格式和表格
- 03搜索并整理 Drive 文件
- 04读取、起草和发送 Gmail 邮件
- 05列出并管理 Calendar 日程
- 06创建和更新 Apps Script 项目
适用场景
- 01通过 MCP 客户端编辑文档和电子表格
- 02搜索 Drive 文件并创建文件夹
- 03整理收件箱、起草或发送 Gmail 邮件
- 04创建和更新 Calendar 日程
MCP 相关
该服务向 MCP 客户端提供操作 Google Docs、Sheets、Drive、Gmail、Calendar 和 Apps Script 的工具。它可在本地运行,也可部署到 Cloud Run 并使用 MCP OAuth 2.1。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
Google Docs、Sheets、Drive、Gmail 和 Calendar MCP 服务

将 Claude Desktop、Cursor 或任何 MCP 客户端连接到你的 Google Docs、Google Sheets、Google Drive、Gmail 和 Google Calendar。
快速入门
1. 创建 Google Cloud OAuth 客户端
- 前往 Google Cloud Console
- 创建或选择一个项目
- 启用 Google Docs API、Google Sheets API、Google Drive API、Gmail API 和 Google Calendar API
- 配置 OAuth 同意屏幕(选择 External,将你的邮箱添加为测试用户,并在 Docs/Sheets/Drive 范围之外添加
gmail.modify和calendar.events范围) - 创建 OAuth 客户端 ID(选择 Desktop app 类型)
- 从确认页面复制 Client ID 和 Client Secret
需要更多详情?请参阅本页底部的分步说明。
2. 授权
GOOGLE_CLIENT_ID="your-client-id" \
GOOGLE_CLIENT_SECRET="your-client-secret" \
npx -y @a-bonus/google-docs-mcp auth
这会在浏览器中打开 Google 授权页面。批准后,刷新令牌会保存到 ~/.config/google-docs-mcp/token.json。
3. 添加到 MCP 客户端
Claude Desktop / Cursor / Windsurf:
{
"mcpServers": {
"google-docs": {
"command": "npx",
"args": ["-y", "@a-bonus/google-docs-mcp"],
"env": {
"GOOGLE_CLIENT_ID": "your-client-id",
"GOOGLE_CLIENT_SECRET": "your-client-secret"
}
}
}
}
MCP 客户端需要时,服务会自动启动。
远程部署(Cloud Run)
部署一次即可供团队使用——无需本地安装。该服务使用 MCP OAuth 2.1,因此 MCP 客户端会自动处理身份验证。
gcloud run deploy google-docs-mcp \
--source . \
--region europe-west3 \
--port 8080 \
--allow-unauthenticated \
--set-env-vars "^|^MCP_TRANSPORT=httpStream|BASE_URL=https://your-service.run.app|GOOGLE_CLIENT_ID=...|GOOGLE_CLIENT_SECRET=...|TOKEN_STORE=firestore|JWT_SIGNING_KEY=your-secret-key"
然后,每位用户只需将 URL 添加到自己的 MCP 客户端——无需 npx、令牌或本地配置:
{
"mcpServers": {
"google-docs": {
"type": "streamableHttp",
"url": "https://your-service.run.app/mcp"
}
}
}
首次连接时,MCP 客户端会提示用户登录 Google。详情请参阅远程部署。
它能做什么?
适用于 Google Docs、Sheets 和 Drive 的工具:
Google Docs
| Tool | 描述 |
|---|---|
readDocument | 以纯文本、JSON 或 Markdown 格式读取内容 |
appendText | 在文档末尾追加文本 |
insertText | 在指定位置插入文本 |
deleteRange | 按索引范围删除内容 |
modifyText | 替换、前置或转换文档中的文本 |
findAndReplace | 在文档中查找并替换文本 |
findElement | 定位文本出现位置(含索引范围),或列出段落/表格 |
listTabs | 列出多标签页文档中的所有标签页 |
addTab | 在文档中添加新标签页 |
renameTab | 重命名文档标签页 |
replaceDocumentWithMarkdown | 用 Markdown 替换整个文档内容 |
replaceRangeWithMarkdown | 用 Markdown 内容替换指定范围 |
appendMarkdown | 追加 Markdown 格式的内容 |
applyTextStyle | 设置粗体、斜体、颜色、字号和链接 |
applyParagraphStyle | 设置对齐方式、间距和缩进 |
insertTable | 创建空表格 |
insertTableWithData | 创建预填数据的表格 |
insertPageBreak | 插入分页符 |
insertSectionBreak | 插入分节符(NEXT_PAGE 或 CONTINUOUS) |
updateSectionStyle | 更新分节样式:切换页面方向、调整页边距 |
insertImage | 从 URL 或本地文件插入图片 |
评论
| 工具 | 描述 |
|---|---|
listComments | 查看所有评论及其作者和日期 |
getComment | 获取特定评论及其回复 |
addComment | 创建锚定到文本的评论 |
replyToComment | 回复现有评论 |
resolveComment | 将评论标记为已解决 |
deleteComment | 删除评论 |
建议
写入工具接受 suggestMode: true,可将编辑作为待审核建议应用,
而非直接编辑(需要 Node 22+;googleapis@184)。
| 工具 | 描述 |
|---|---|
listSuggestions | 查看待处理建议及其作者、日期和 ID |
manageSuggestions | 接受、拒绝或删除待处理的建议主题 |
Google Sheets
| 工具 | 描述 |
|---|---|
readSpreadsheet | 读取指定范围(A1 表示法)中的数据 |
writeSpreadsheet | 将数据写入指定范围 |
batchWrite | 在一次调用中写入多个范围 |
appendRows | 向工作表添加行 |
clearRange | 清除单元格值 |
createSpreadsheet | 创建新的电子表格 |
addSheet | 添加工作表/标签页 |
deleteSheet | 移除工作表/标签页 |
duplicateSheet | 在同一电子表格中复制工作表 |
copySheetTo | 将工作表复制到另一个电子表格 |
renameSheet | 重命名工作表/标签页 |
getSpreadsheetInfo | 获取元数据和工作表列表 |
listSpreadsheets | 查找电子表格 |
formatCells | 设置范围内的粗体、颜色、对齐方式、垂直对齐方式和换行策略 |
copyFormatting | 将一个范围的格式复制到另一个范围 |
readCellFormat | 读取单元格范围的格式详情 |
setCellBorders | 设置各边框(上/下/左/右/内部)的样式和颜色 |
freezeRowsAndColumns | 固定标题行/列 |
setDropdownValidation | 为单元格添加/移除下拉列表 |
setColumnWidths | 以像素为单位设置列宽 |
setRowHeights | 以像素为单位设置行高 |
autoResizeColumns | 根据内容自动调整列宽 |
autoResizeRows | 根据内容自动调整行高 |
protectRange | 锁定范围或整个工作表(仅显示警告或完全锁定) |
addConditionalFormatting | 添加条件格式规则 |
getConditionalFormatting | 列出条件格式规则及其索引(JSON) |
deleteConditionalFormatting | 按索引删除条件格式规则 |
groupRows | 对行进行分组,以创建可折叠的部分 |
ungroupAllRows | 移除所有行分组 |
createSheetsComment | 创建电子表格评论,可选择附带指向特定单元格的直接链接 |
createSheetsCellNote | 创建附加到单元格或范围的原生单元格备注 |
insertChart | 根据数据创建图表 |
deleteChart | 移除图表 |
Google Sheets 表格
| 工具 | 描述 |
|---|---|
createTable | 创建包含列类型的新命名表格 |
listTables | 列出电子表格或工作表中的所有表格 |
getTable | 按名称或 ID 获取详细的表格元数据 |
deleteTable | 删除表格(可选择清除数据) |
updateTableRange | 修改表格维度(添加/删除行和列) |
appendTableRows | 向表格追加行(按表格结构插入) |
Google Drive
| 工具 | 描述 |
|---|---|
listDocuments | 列出文档,可按日期筛选 |
searchDocuments | 按名称或内容搜索 |
getDocumentInfo | 获取文档元数据 |
createDocument | 创建新文档 |
createDocumentFromTemplate | 根据现有模板创建 |
createFolder | 创建文件夹 |
listFolderContents | 列出文件夹内容 |
getFolderInfo | 获取文件夹元数据 |
moveFile | 将文件移至其他文件夹 |
copyFile | 复制文件 |
renameFile | 重命名文件 |
deleteFile | 移至回收站或永久删除 |
listDriveFiles | 使用筛选条件列出 Drive 中的任意文件类型 |
searchDriveFiles | 按名称或内容搜索 Drive 中的所有文件 |
downloadFile | 下载文件内容 |
createMarkdownFile | 创建原生 Markdown(.md)文件 |
readMarkdownFile | 读取原生 .md 文件的原始源代码 |
updateMarkdownFile | 替换或追加 .md 文件的原始源代码 |
Gmail
| 工具 | 描述 |
|---|---|
listMessages | 使用 Gmail 查询语法(is:unread、from:、newer_than: 等)列出或搜索邮件 |
getMessage | 获取单封邮件,包含解码后的标头、纯文本正文、HTML 正文和附件元数据 |
sendEmail | 发送纯文本邮件。支持抄送、密送,以及通过 replyToMessageId 发送带线程的回复 |
trashMessage | 将邮件移至垃圾箱(可撤销,效果与点击 Gmail 界面中的“删除”相同) |
modifyMessageLabels | 为邮件添加或移除标签——可用于加星标、归档(移除 INBOX)、标记为已读(移除 UNREAD) |
listLabels | 列出所有系统标签和自定义标签及其 ID |
createDraft | 撰写草稿而非立即发送——适用于撰写/审核/发送工作流 |
listDrafts | 列出现有草稿及其收件人、主题和摘要 |
getDraft | 获取单封草稿的完整标头和正文 |
updateDraft | 替换现有草稿的内容(完整替换,而非补丁) |
sendDraft | 按 ID 发送现有草稿 |
deleteDraft | 永久删除草稿(不会移至垃圾箱,而是彻底删除) |
triageInbox | 组合工具: 获取未读邮件内容及启发式标记(简报、会议、待办),一次性完成收件箱分拣 |
Google Calendar
| 工具 | 描述 |
|---|---|
listEvents | 使用 q、timeMin、timeMax、maxResults 列出或搜索日程(默认使用主日历) |
createEvent | 创建日程,包含标题、开始/结束时间、描述、地点、参会者,以及可选的 Google Meet 链接 |
updateEvent | 类似 PATCH 的更新——仅更改传入的字段。可用于重新安排时间、更改标题或参会者 |
deleteEvent | 永久删除日程。可选的 sendUpdates 会向参会者发送取消通知 |
quickAddEvent | 使用自然语言创建日程:"Lunch with Sarah tomorrow 12pm"——其余内容由 Google 解析 |
Apps Script
自动化自动化流程:创建和编辑 Doc 或 Sheet 背后的 Apps Script,例如 onEdit 触发器、自定义菜单、定时任务,而不是让用户手动将代码粘贴到编辑器中。
| 工具 | 说明 |
|---|---|
createAppsScriptProject | 创建项目,可通过 parentId 将其绑定到 Doc/Sheet/Slides/Form,并在同一次调用中写入初始文件 |
getAppsScriptContent | 读取项目文件——传入 includeSource: false 可快速列出文件,或传入 versionNumber 读取已保存的版本 |
updateAppsScriptContent | 写入文件。merge(默认值)会替换同名文件并保留其余文件;replace 会让项目内容完全等于你传入的文件 |
除常规设置外,还需要满足两项条件:
- 必须为每个 Google 账号启用 Apps Script API,网址为 https://script.google.com/home/usersettings——默认处于关闭状态;如果错误消息中包含 "Apps Script API",并返回 403 错误,就说明遗漏了此步骤。
script.projects范围,该范围已包含在SCOPES中。现有安装必须重新授权一次才能启用该范围。
使用示例
Google Docs
"Read document ABC123 as markdown"
"Append 'Meeting notes for today' to document ABC123"
"Make the text 'Important' bold and red in document ABC123"
"Replace the entire document with this markdown: # Title\n\nNew content here"
"Insert a 3x4 table at index 50 in document ABC123"
Google Sheets
"Read range A1:D10 from spreadsheet XYZ789"
"Write [[Name, Score], [Alice, 95], [Bob, 87]] to range A1 in spreadsheet XYZ789"
"Create a new spreadsheet titled 'Q1 Report'"
"Format row 1 as bold with a light blue background in spreadsheet XYZ789"
"Freeze the first row in spreadsheet XYZ789"
"Add a dropdown with options [Open, In Progress, Done] to range C2:C100"
"Create a table named 'Tasks' in range A1:D10 with columns: Task (TEXT), Status (DROPDOWN: 'Not Started','In Progress','Done'), Priority (NUMBER)"
"Add a medium solid border around A1:D10 in spreadsheet XYZ789"
"Protect the header row so collaborators can't accidentally edit it"
"Auto-fit row heights for rows 2–50 after wrapping text"
Google Drive
"List my 10 most recent Google Docs"
"Search for documents containing 'project proposal'"
"Create a folder called 'Meeting Notes' and move document ABC123 into it"
Gmail
"Show me my 20 most recent unread emails"
"Search Gmail for messages from [email protected] in the last 7 days"
"Read the full body of message ID 18c3f4a2b1d9"
"Send an email to [email protected] with the subject 'Weekly update' and this body..."
"Reply to message 18c3f4a2b1d9 with 'Thanks, confirmed.'"
"Star message 18c3f4a2b1d9 and archive it"
"Move message 18c3f4a2b1d9 to Trash"
"List all my Gmail labels"
"Draft a reply to that email but don't send it yet — let me review first"
"Show me my drafts, then send the one to bob@"
"Triage my unread inbox: tell me which 20 emails need attention and which are noise"
Google Calendar
"What's on my calendar this week?"
"Create an event titled 'Project review' tomorrow from 2pm to 3pm Pacific time"
"Quick add: lunch with Alex Friday 12:30"
"Reschedule event abc123 to next Monday at 10am"
"Delete the 'Standup' event tomorrow"
"List all events on my calendar between April 15 and April 22"
"Schedule a 30-minute meeting with [email protected] next Wednesday at 11am with a Google Meet link"
Markdown 工作流
该服务支持完整的 Markdown 往返工作流:
- 将文档读取为 Markdown:使用
readDocument并设置format='markdown' - 在本地编辑 Markdown
- 推送更改:使用
replaceDocumentWithMarkdown
支持:标题、粗体、斜体、删除线、链接、项目符号列表/编号列表、水平分隔线。
实时 Docs 验证
此代码库包含针对真实 Google Docs API 的 cloneTable 实时集成测试,可选择启用。默认跳过该测试。
要求:
- 有效的
GOOGLE_CLIENT_ID和GOOGLE_CLIENT_SECRET - 已通过
npx -y @a-bonus/google-docs-mcp auth存储授权令牌
运行方式:
GOOGLE_DOCS_LIVE_TESTS=1 npm run test:live:docs
此测试会创建临时源和目标 Google Docs,验证 cloneTable,然后删除测试文件。
远程部署
将服务集中部署到 Google Cloud Run(或任何容器托管平台),让团队无需本地安装即可使用。该服务使用 MCP OAuth 2.1 和 FastMCP 内置的 GoogleProvider——MCP 客户端会自动处理身份验证流程。
访问服务根 URL(/),查看设置说明和可直接复制的客户端配置。
环境变量
| 变量 | 描述 |
|---|---|
MCP_TRANSPORT | 设置为 httpStream 以启用远程模式(默认值:stdio) |
BASE_URL | 已部署服务的公开 URL(OAuth 重定向必需) |
GOOGLE_CLIENT_ID | OAuth 客户端 ID(Web 应用类型) |
GOOGLE_CLIENT_SECRET | OAuth 客户端密钥 |
MCP_TOOL_GROUPS | 可选的逗号分隔工具组列表,用于注册:docs、drive、sheets、utils、gmail、calendar、script 或 all |
ALLOWED_DOMAINS | 允许访问的 Google Workspace 域名列表,以逗号分隔(可选) |
PORT | HTTP 端口(默认值:8080) |
TOKEN_STORE | 设置为 firestore 以持久化存储令牌(默认值:内存) |
JWT_SIGNING_KEY | 固定签名密钥,使令牌在重启后仍然有效(未设置时自动生成) |
REFRESH_TOKEN_TTL | 刷新令牌有效期(秒)(默认值:2592000 / 30 天) |
GCLOUD_PROJECT | Firestore 的 GCP 项目 ID(当 TOKEN_STORE=firestore 时必需) |
MCP_STATELESS | 设置为 true 以用于无服务器部署(Cloud Run 等)——禁用会话跟踪,以便在缩容至零后继续运行 |
GOOGLE_DOCS_MCP_DOWNLOAD_ROOTS | downloadFile 在 stdio 模式下可写入的目录,以 : 分隔(Windows 上为 ;)。默认为工作目录 |
GMAIL_ATTACHMENT_ROOTS | Gmail 草稿在 stdio 模式下可附加文件的目录,以 : 分隔(Windows 上为 ;)。未设置时禁用附件 |
设置
- 创建 GCP 项目并启用 Docs、Sheets 和 Drive API
- 创建 OAuth 客户端(Web 应用类型,而非 Desktop)
- 将授权重定向 URI 设置为
{BASE_URL}/oauth/callback - 部署到 Cloud Run:
gcloud run deploy google-docs-mcp \
--source . \
--region europe-west3 \
--port 8080 \
--allow-unauthenticated \
--set-env-vars "^|^MCP_TRANSPORT=httpStream|BASE_URL=https://your-service.run.app|ALLOWED_DOMAINS=yourdomain.com|GOOGLE_CLIENT_ID=...|GOOGLE_CLIENT_SECRET=...|TOKEN_STORE=firestore|JWT_SIGNING_KEY=your-secret-key"
注意:
^|^前缀会将环境变量分隔符从,改为|,因为ALLOWED_DOMAINS包含逗号。
工作原理
- 默认情况下,OAuth 会话存储在内存中,重启后会丢失
- 用于生产环境时,设置
TOKEN_STORE=firestore和JWT_SIGNING_KEY,以便在重新部署和冷启动后持续进行身份验证 - 在无服务器平台(Cloud Run 等)上,设置
MCP_STATELESS=true——MCP 会话保存在内存中,因此缩容至零会清除这些会话。无状态模式会完全禁用会话跟踪;每个请求都通过 JWT/Firestore 令牌流程独立进行身份验证 ALLOWED_DOMAINS限制对特定 Google Workspace 域名的访问- 访问令牌会自动刷新;不活跃的会话会在 30 天后过期
- 用户可随时通过 Google 账号权限撤销访问权限
更新部署
将更改合并到 main 不会自动更新你的 Cloud Run 服务。每次部署都是独立的——需要新功能或修复时,你必须手动重新部署。
更新方法:
-
拉取最新代码:
git pull origin main -
重新部署到 Cloud Run:
gcloud run deploy your-service-name --source . --region your-region现有环境变量会保留——无需再次传入
--set-env-vars。
重新部署时机:
- Bug 修复和安全补丁——尽快重新部署
- 新功能——方便时重新部署
- 破坏性更改——重新部署前查看发行说明
你可以在 发行页面 将当前版本与最新发行版进行比较。
身份验证选项
OAuth(默认)
将 Google Cloud OAuth 客户端凭据作为环境变量传入:
| 变量 | 描述 |
|---|---|
GOOGLE_CLIENT_ID | 来自 Google Cloud Console 的 OAuth 客户端 ID |
GOOGLE_CLIENT_SECRET | 来自 Google Cloud Console 的 OAuth 客户端密钥 |
服务账号(企业版)
适用于使用全域委派的 Google Workspace:
| 变量 | 描述 |
|---|---|
SERVICE_ACCOUNT_PATH | 服务账号 JSON 密钥文件的路径 |
GOOGLE_IMPERSONATE_USER | 要模拟的用户邮箱(可选) |
{
"mcpServers": {
"google-docs": {
"command": "npx",
"args": ["-y", "@a-bonus/google-docs-mcp"],
"env": {
"SERVICE_ACCOUNT_PATH": "/path/to/service-account-key.json",
"GOOGLE_IMPERSONATE_USER": "[email protected]"
}
}
}
}
令牌存储
OAuth 刷新令牌存储在 ~/.config/google-docs-mcp/token.json 中(遵循 XDG_CONFIG_HOME)。OAuth 客户端 ID 和客户端密钥不会存储在令牌文件中。要重新授权,请再次运行 auth 命令或删除令牌文件。
多个 Google 账号
设置 GOOGLE_MCP_PROFILE,将令牌存储在特定配置文件的子目录中。这样即可为不同项目使用不同的 Google 账号:
| 变量 | 描述 |
|---|---|
GOOGLE_MCP_PROFILE | 用于隔离令牌存储的配置文件名称(可选) |
{
"mcpServers": {
"google-docs": {
"command": "npx",
"args": ["-y", "@a-bonus/google-docs-mcp"],
"env": {
"GOOGLE_CLIENT_ID": "...",
"GOOGLE_CLIENT_SECRET": "...",
"GOOGLE_MCP_PROFILE": "work"
}
}
}
}
令牌按配置文件存储:
~/.config/google-docs-mcp/
├── token.json # default (no profile)
├── work/token.json # GOOGLE_MCP_PROFILE=work
├── personal/token.json # GOOGLE_MCP_PROFILE=personal
未设置 GOOGLE_MCP_PROFILE 时,行为保持不变。
已知限制
- 评论锚定: 通过程序创建的评论会显示在评论列表中,但在 Google Docs 界面中不会明显锚定到文本。这是 Google Drive API 的限制。
- Sheets 评论锚定: 通过 API 创建的电子表格评论可以存储锚定元数据,但 Google Workspace 编辑器会将 Drive API 锚点视为未锚定评论。使用
createSheetsComment并设置includeCellLink=true,可获取指向目标单元格的可点击链接;如果需要将审阅文字附加到单元格本身,则使用createSheetsCellNote。 - 评论解决状态: 在 Google Docs 界面中,已解决状态可能无法保留。
- 转换后的文档: 从 Word 转换而来的 Docs 可能不支持所有 API 操作。
- Markdown 图片: Markdown 到 Docs 的转换目前尚不支持图片。
- 深层嵌套列表: 嵌套层级达到 3 层或以上的列表可能会出现格式问题。
- Gmail 永久删除:
trashMessage会将邮件移至垃圾箱(可撤销)。永久删除需要更广泛的https://mail.google.com/scope,且 v0.1 尚未提供此功能。 - Gmail 附件:
getMessage会返回附件元数据,但目前尚不下载附件内容。 - Gmail 发送 HTML 邮件:
sendEmail仅发送纯文本。若要使用 HTML 正文,请将 HTML 粘贴到body字段中——内容将以文本形式发送,而不会被渲染。 - Calendar scope:
calendar.events允许对现有日历中的事件执行 CRUD 操作,但无法创建或删除整个日历。 - Apps Script API 默认关闭: 每个账号都必须在 https://script.google.com/home/usersettings 手动启用一次。工具无法代为开启。
- Apps Script 部署: 工具可以编辑项目源代码。目前尚未提供创建版本、部署和可安装触发器的功能——
onEdit和onOpen等简单触发器无需这些功能即可运行。 - Calendar 定期事件:
updateEvent和deleteEvent会修改整个定期事件系列,除非你使用listEvents(设置singleEvents=true)返回的特定实例 ID 作为目标。
故障排除
- 服务无法启动:
- 确认已在 MCP 配置的
env块中设置GOOGLE_CLIENT_ID和GOOGLE_CLIENT_SECRET。 - 尝试手动运行:
npx @a-bonus/google-docs-mcp,并检查 stderr 中是否有错误。
- 确认已在 MCP 配置的
- 授权错误:
- 确认已在 Google Cloud Console 中启用 Docs、Sheets、Drive、Gmail 和 Calendar API。
- 确认 OAuth 同意屏幕中已将你的电子邮件地址列为测试用户,并已添加所有必需的范围(Docs、Sheets、Drive、
gmail.modify、calendar.events)。 - 重新授权:
npx @a-bonus/google-docs-mcp auth - 如果正在升级,请删除
~/.config/google-docs-mcp/token.json并重新授权——Gmail 和 Calendar 范围是在较新版本中添加的,因此现有令牌必须刷新。 - 远程(Cloud Run)用户必须先在 MCP 客户端中退出登录,再重新登录,以便 Google 使用新的范围列表重新征求同意。
- 标签页错误:
- 使用
listTabs查看可用的标签页 ID。 - 对于单标签页文档,请省略
tabId。
- 使用
- 远程部署中通过 OAuth 登录时,claude.ai 显示“找不到页面”:
- 现象:点击自定义 MCP 连接器上的“连接”后,进入 Claude 的“找不到页面”页面,而不是 Google 登录页面。
- 原因:Cloud Run 冷启动。对闲置服务的首次请求会在容器完成启动前超时,Claude 随后会将失败的重定向导向其 404 页面。
- 解决方法:强制刷新页面(macOS 上按
Cmd+Shift+R,Windows/Linux 上按Ctrl+Shift+R)。第二次请求会命中已启动的实例,OAuth 流程便会正常继续。 - 永久解决方法:在 Cloud Run 服务上设置
--min-instances=1,以确保始终有一个实例处于预热状态(gcloud run services update <service> --region <region> --min-instances=1)。内存预留费用约为每月 $2–3。
- 重新部署后意外要求重新认证(远程部署):
- 原因:
JWT_SIGNING_KEY会在每次容器启动时自动生成,因此重新部署会使之前颁发的所有会话失效。 - 解决方法:在 Cloud Run 服务上设置稳定的
JWT_SIGNING_KEY环境变量,使其在重启后保持不变:gcloud run services update <service> --region <region> --update-env-vars JWT_SIGNING_KEY=$(openssl rand -hex 32)。此更改后创建的会话在之后的重新部署中仍会有效。
- 原因:
- **多个 MCP 会话导致 CPU 使用率过高:**某些客户端会非常频繁地调用
tools/list。否则,FastMCP 会在每次请求时为每个工具重新计算 JSON Schema,这可能导致每个进程占满一个 CPU 核心。此服务会在 stdio 启动前预先计算一次负载,并将tools/list处理程序替换为缓存快照。如果负载仍持续偏高,请使用sample <pid> 1 10(macOS)或node --cpu-prof采集几秒钟的数据并报告问题。
Google Cloud 设置详情
Google Cloud Console 分步说明
对于远程部署,请创建类型为 Web application 的 OAuth 客户端(而非 Desktop app)。仅在本地 stdio 用法中使用 Desktop app。
- 前往 Google Cloud Console: 打开 console.cloud.google.com
- 创建或选择项目: 点击项目下拉菜单 > “NEW PROJECT”。为项目命名(例如,“MCP Docs Server”),然后点击“CREATE”。
- 启用 API:
- 前往 “APIs & Services” > “Library”
- 搜索并启用:Google Docs API、Google Sheets API、Google Drive API、Gmail API、Google Calendar API
- 配置 OAuth 同意屏幕:
- 前往 “APIs & Services” > “OAuth consent screen”
- 选择 “External”,然后点击“CREATE”
- 填写:应用名称、用户支持邮箱、开发者联系邮箱
- 点击“SAVE AND CONTINUE”
- 添加范围:
documents、spreadsheets、drive、gmail.modify、calendar.events - 点击“SAVE AND CONTINUE”
- 将你的 Google 邮箱添加为测试用户
- 点击“SAVE AND CONTINUE”
- 创建凭据:
- 前往 “APIs & Services” > “Credentials”
- 点击“+ CREATE CREDENTIALS” > “OAuth client ID”
- 应用类型:“Desktop app”
- 点击“CREATE”
- 复制 Client ID 和 Client Secret
贡献
欢迎贡献!有关开发环境设置、架构概述和指南,请参阅 CONTRIBUTING.md。
许可证
MIT —— 详情请参阅 LICENSE。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。