内容
# Google Docs、Sheets、Drive、Gmail 和日历 MCP 服务器

将 Claude Desktop、Cursor 或任何 MCP 客户端连接到您的 Google Docs、Google Sheets、Google Drive、Gmail 和 Google 日历。
> **Fork 通知。** 这是 [a-bonus/google-docs-mcp](https://github.com/a-bonus/google-docs-mcp) 的一个硬分叉,由 [@fryorcraken](https://github.com/fryorcraken) 维护。它添加了 Google Slides 支持,修复了已知的上游错误,并且在 MIT 或 Apache-2.0 下双重许可(参见 [LICENSE-MIT](LICENSE-MIT)、[LICENSE-APACHE](LICENSE-APACHE) 和 [NOTICE](NOTICE))。原始作品由 Alain Bonus 和上游贡献者所有。
---
## 快速开始
### 1. 创建 Google Cloud OAuth 客户端
1. 前往 [Google Cloud 控制台](https://console.cloud.google.com/)
2. 创建或选择一个项目
3. 启用 **Google Docs API**、**Google Sheets API**、**Google Drive API**、**Gmail API** 和 **Google Calendar API**
4. 配置 **OAuth 同意屏幕**(外部,添加您的电子邮件作为测试用户,并添加 `gmail.modify` 和 `calendar.events` 范围以及 Docs/Sheets/Drive 范围)
5. 创建一个 **OAuth 客户端 ID**(桌面应用程序类型)
6. 从确认屏幕复制 **客户端 ID** 和 **客户端密钥**
> 需要更多详细信息?请查看本页面底部的 [逐步说明](#google-cloud-setup-details)。
### 2. 授权
```bash
GOOGLE_CLIENT_ID="您的客户端 ID" \
GOOGLE_CLIENT_SECRET="您的客户端密钥" \
npx -y @fryorcraken/google-docs-mcp auth
```
这将打开您的浏览器进行 Google 授权。授权后,刷新令牌将保存到 `~/.config/google-docs-mcp/token.json`。
### 3. 添加到您的 MCP 客户端
**Claude Desktop / Cursor / Windsurf:**
```json
{
"mcpServers": {
"google-docs": {
"command": "npx",
"args": ["-y", "@fryorcraken/google-docs-mcp"],
"env": {
"GOOGLE_CLIENT_ID": "您的客户端 ID",
"GOOGLE_CLIENT_SECRET": "您的客户端密钥"
}
}
}
}
```
服务器在 MCP 客户端需要时自动启动。
### 远程部署(Cloud Run)
为您的团队一次性部署 - 无需本地安装。服务器使用 MCP OAuth 2.1,因此您的 MCP 客户端自动处理身份验证。
```bash
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,无需令牌,无需本地设置:
```json
{
"mcpServers": {
"google-docs": {
"type": "streamableHttp",
"url": "https://your-service.run.app/mcp"
}
}
}
```
您的 MCP 客户端将在首次连接时提示进行 Google 登录。有关详细信息,请参阅 [远程部署](#remote-deployment)。
---
## 功能
Google Docs、Sheets 和 Drive 工具:
### Google Docs
| 工具 | 描述 |
| --- | --- |
| `readDocument` | 以纯文本、JSON 或 Markdown 读取内容 |
| `appendText` | 在文档中追加文本 |
| `insertText` | 在特定位置插入文本 |
| `deleteRange` | 删除索引范围内的内容 |
| `modifyText` | 替换、添加或转换文档中的文本 |
| `findAndReplace` | 在文档中查找和替换文本 |
| `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` | 删除评论 |
### 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` | 删除所有行分组 |
| `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 文件 |
### Gmail
| 工具 | 描述 |
| --- | --- |
| `listMessages` | 使用 Gmail 查询语法列出或搜索消息(`is:unread`、`from:`、`newer_than:`等) |
| `getMessage` | 获取具有解码标头、纯文本正文、HTML 正文和附件元数据的单个消息 |
| `sendEmail` | 发送纯文本电子邮件。支持 cc/bcc 和通过 `replyToMessageId` 进行线程回复 |
| `trashMessage` | 将消息移至回收站(可逆转,与 Gmail 界面中的删除相同) |
| `modifyMessageLabels` | 添加或删除消息上的标签 - 用于加星、存档(删除 `INBOX`)、标记已读(删除 `UNREAD`) |
| `listLabels` | 列出所有系统和自定义标签及其 ID |
| `createDraft` | 编写草稿而不是立即发送 - 用于撰写/审核/发送工作流 |
| `listDrafts` | 列出具有收件人、主题和摘要的现有草稿 |
| `getDraft` | 获取具有完整标头和正文的单个草稿 |
| `updateDraft` | 替换现有草稿的内容(完整替换,非补丁) |
| `sendDraft` | 发送现有草稿按 ID |
| `deleteDraft` | 永久删除草稿(不移至回收站 - 消失) |
| `triageInbox` | **复合:** 获取具有内容 + 启发式标志(新闻通讯、会议、操作)的未读消息以进行一次性收件箱分类 |
### Google 日历
| 工具 | 描述 |
| --- | --- |
| `listEvents` | 使用 `q`、`timeMin`、`timeMax`、`maxResults` 列出或搜索事件(默认为主要日历) |
| `createEvent` | 创建具有标题、开始/结束、描述、位置、与会者、可选 Google Meet 链接的事件 |
| `updateEvent` | PATCH 样式更新 - 仅更改您传递的字段。用于重新安排、重新命名、更改与会者 |
| `deleteEvent` | 永久删除事件。可选 `sendUpdates` 电子邮件通知与会者取消 |
| `quickAddEvent` | 自然语言事件创建:`"明天 12pm 与 Sarah 共进午餐"` - Google 解析其余部分 |
---
## 使用示例
### Google Docs
```
"以 Markdown 读取文档 ABC123"
"在文档 ABC123 中追加 '今日会议记录'"
"在文档 ABC123 中将文本 '重要' 变为粗体和红色"
"用此 Markdown 替换整个文档:# 标题\n\n此处为新内容"
"在文档 ABC123 中插入 3x4 表格,索引为 50"
```
### Google Sheets
```
"从表格 XYZ789 读取范围 A1:D10"
"将 [[姓名, 分数], [Alice, 95], [Bob, 87]] 写入表格 XYZ789 的范围 A1"
"创建一个名为 'Q1 报告' 的新表格"
"在表格 XYZ789 中格式化第 1 行为粗体,背景为浅蓝色"
"冻结表格 XYZ789 中的第一行"
"在范围 C2:C100 中添加一个带有选项 [Open, In Progress, Done] 的下拉菜单"
"在范围 A1:D10 中创建名为 '任务' 的表格,列为:任务(TEXT)、状态(DROPDOWN: '未开始','进行中','完成')、优先级(NUMBER)"
"在表格 XYZ789 中为范围 A1:D10 添加一个中等实线边框"
"保护表头行,以免协作者意外编辑"
"自动调整行高以适应 2-50 行的文本"
```
### Google Drive
```
"列出我的 10 个最新 Google 文档"
"搜索包含 '项目提案' 的文档"
"创建一个名为 '会议记录' 的文件夹,并将文档 ABC123 移入其中"
```
### Gmail
```
"显示我最近 20 条未读邮件"
"在 Gmail 中搜索来自 alice@example.com 的邮件,限过去 7 天"
"阅读邮件 ID 18c3f4a2b1d9 的全文"
"发送一封电子邮件给 bob@example.com,主题为 '每周更新',内容如下..."
"回复邮件 18c3f4a2b1d9,内容为 '谢谢,确认。'"
"为邮件 18c3f4a2b1d9 加星并存档"
"将邮件 18c3f4a2b1d9 移至回收站"
"列出所有 Gmail 标签"
"草拟一份回复邮件,但不要立即发送 - 让我先审阅"
"显示我的草稿,然后发送给 bob@"
"分类我的未读收件箱:告诉我哪些 20 封邮件需要关注,哪些是噪音"
```
### Google 日历
```
"我的日历本周有什么安排?"
"创建一个事件,名为 '项目审查',明天 2pm 至 3pm,太平洋时间"
"快速添加:周五 12:30 与 Alex 共进午餐"
"将事件 abc123 调整到下周一 10am"
"删除明天 的 'Standup' 事件"
"列出日历中 April 15 至 April 22 之间的所有事件"
"在 Wednesday 11am 时与 bob@example.com 安排 30 分钟会议,并附上 Google Meet 链接"
```
### Markdown 工作流
服务器支持完整的 Markdown 工作流:
1. 以 Markdown 读取文档:`readDocument`,格式为 `markdown`
2. 在本地编辑 Markdown
3. 推送更改:`replaceDocumentWithMarkdown`
支持:标题、粗体、斜体、删除线、链接、项目符号/编号列表、水平线。
### Live Docs 验证
存储库中包含一个用于 `cloneTable` 的实时集成测试,针对真正的 Google Docs API。默认情况下跳过此测试。
要求:
- 有效的 `GOOGLE_CLIENT_ID` 和 `GOOGLE_CLIENT_SECRET`
- 已通过 `npx -y @fryorcraken/google-docs-mcp auth` 存储的授权令牌
使用以下命令运行:
```bash
GOOGLE_DOCS_LIVE_TESTS=1 npm run test:live:docs
```
此测试创建临时源/目标 Google 文档,验证 `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 客户端密钥 |
| `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` 时需要) |
| `GOOGLE_MCP_SCOPES` | `docs`、`sheets`、`slides`、`drive`、`gmail`、`calendar` 的逗号分隔子集,以限制身份验证范围和已注册的工具(默认:全部) |
| `MCP_LAZY_TOOLS` | 设置为 `1` 以仅在 `tools/list` 处公开 3 个元工具(`searchTools`/`describeTool`/`callTool`)。将每会话工具目录从约 32k 个令牌降低到约 500 个。工具仍然可以通过 `callTool({name, args})` 调用。 |
### 设置
1. 创建一个 GCP 项目并启用 Docs、Sheets 和 Drive API
2. 创建一个 OAuth 客户端(**Web 应用程序** 类型,而不是桌面应用程序)
3. 将授权重定向 URI 设置为 `{BASE_URL}/oauth/callback`
4. 部署到 Cloud Run:
```bash
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` 以实现跨部署和冷启动的持久身份验证
- `ALLOWED_DOMAINS` 限制对特定 Google Workspace 域的访问
- 访问令牌会自动刷新;不活动的会话在 30 天后过期
- 用户可以随时通过 [Google 账户权限](https://myaccount.google.com/permissions) 撤销访问权限
### 更新部署
将更改合并到 `main` 不会自动更新您的 Cloud Run 服务。每个部署都是独立的 - 您需要在需要新功能或修复时手动重新部署。
**更新:**
1. 拉取最新代码:
```bash
git pull origin main
```
2. 重新部署到 Cloud Run:
```bash
gcloud run deploy your-service-name --source . --region your-region
```
您的现有环境变量将被保留 - 无需再次传递 `--set-env-vars`。
**何时重新部署:**
- **错误修复和安全补丁** - 请尽快重新部署
- **新功能** - 您可以根据需要重新部署
- **重大更改** - 请查看发行说明,然后再重新部署
您可以在 [发行页面](https://github.com/fryorcraken/google-docs-mcp/releases) 上查看您当前的版本与最新发行版的对比。
---
## 身份验证选项
### OAuth(默认)
传递您的 Google Cloud OAuth 客户端凭证作为环境变量:
| 变量名 | 描述 |
| ---------------------- | --------------------------------------------- |
| `GOOGLE_CLIENT_ID` | 来自 Google Cloud 控制台的 OAuth 客户端 ID |
| `GOOGLE_CLIENT_SECRET` | 来自 Google Cloud 控制台的 OAuth 客户端密钥 |
### 服务账户(企业)
适用于具有域范围委派的 Google Workspace:
| 变量名 | 描述 |
| ------------------------- | ------------------------------------------- |
| `SERVICE_ACCOUNT_PATH` | 服务账户 JSON 密钥文件的路径 |
| `GOOGLE_IMPERSONATE_USER` | 要模拟的用户邮箱(可选) |
```json
{
"mcpServers": {
"google-docs": {
"command": "npx",
"args": ["-y", "@fryorcraken/google-docs-mcp"],
"env": {
"SERVICE_ACCOUNT_PATH": "/path/to/service-account-key.json",
"GOOGLE_IMPERSONATE_USER": "user@yourdomain.com"
}
}
}
}
```
### 令牌存储
OAuth 刷新令牌存储在 `~/.config/google-docs-mcp/token.json`(遵循 `XDG_CONFIG_HOME`)。要重新授权,请再次运行 `auth` 命令或删除令牌文件。
### 多个 Google 账户
设置 `GOOGLE_MCP_PROFILE` 以在特定于个人资料的子目录中存储令牌。这允许为不同的项目使用不同的 Google 账户:
| 变量名 | 描述 |
| -------------------- | -------------------------------------------------- |
| `GOOGLE_MCP_PROFILE` | 隔离令牌存储的个人资料名称(可选) |
```json
{
"mcpServers": {
"google-docs": {
"command": "npx",
"args": ["-y", "@fryorcraken/google-docs-mcp"],
"env": {
"GOOGLE_CLIENT_ID": "...",
"GOOGLE_CLIENT_SECRET": "...",
"GOOGLE_MCP_PROFILE": "work"
}
}
}
}
```
令牌按个人资料存储:
```
~/.config/google-docs-mcp/
├── token.json # 默认(无个人资料)
├── work/token.json # GOOGLE_MCP_PROFILE=work
├── personal/token.json # GOOGLE_MCP_PROFILE=personal
```
如果没有 `GOOGLE_MCP_PROFILE`,行为保持不变。
---
## 已知限制
- **评论锚点:** 以编程方式创建的评论出现在评论列表中,但并未在 Google Docs UI 中可见地锚定到文本。这是 Google Drive API 的限制。
- **评论解决:** 已解决状态可能不会在 Google Docs UI 中持续存在。
- **转换后的文档:** 从 Word 转换的文档可能不支持所有 API 操作。
- **Markdown 表格/图像:** 尚不支持 markdown 到 Docs 的转换中的 Markdown 表格/图像。
- **深度嵌套的列表:** 具有 3+ 个嵌套级别的列表可能存在格式问题。
- **Gmail 硬删除:** `trashMessage` 会将邮件移至垃圾箱(可逆)。永久删除需要更广泛的 `https://mail.google.com/` 范围,并且在 v0.1 中未公开。
- **Gmail 附件:** `getMessage` 返回附件元数据,但不下载附件字节。
- **Gmail HTML 电子邮件发送:** `sendEmail` 仅发送纯文本。对于 HTML 正文,请在 `body` 字段中粘贴 HTML - 它将被传递为文本,而不是呈现。
- **日历范围:** `calendar.events` 允许对现有日历进行事件 CRUD 操作,但不能创建或删除整个日历。
- **日历重复事件:** `updateEvent` 和 `deleteEvent` 修改整个重复系列,除非您针对 `listEvents` 返回的特定实例 ID 与 `singleEvents=true`。
## 故障排除
- **服务器无法启动:**
- 验证 `GOOGLE_CLIENT_ID` 和 `GOOGLE_CLIENT_SECRET` 是否在您的 MCP 配置的 `env` 块中设置。
- 尝试手动运行:`npx @fryorcraken/google-docs-mcp` 并在 stderr 中检查错误。
- **授权错误:**
- 确保在 Google Cloud 控制台中启用了 Docs、Sheets、Drive、Gmail 和 Calendar API。
- 确认您的电子邮件已在 OAuth 同意屏幕上列为测试用户,并且所有必需的范围(Docs、Sheets、Drive、 `gmail.modify` 、 `calendar.events`)已添加到同意屏幕。
- 重新授权:`npx @fryorcraken/google-docs-mcp auth`
- 删除 `~/.config/google-docs-mcp/token.json` 并重新授权,如果升级 - Gmail 和 Calendar 范围在后续版本中添加,因此现有的令牌必须刷新。
- 远程(Cloud Run)用户必须退出并重新登录他们的 MCP 客户端,以便 Google 重新发出具有新范围列表的同意。
- **标签错误:**
- 使用 `listTabs` 查看可用的标签 ID。
- 对于单标签文档,省略 `tabId`。
- **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 架构,这可能会锁定一个 CPU 核心。此服务器预先计算有效载荷,然后在 stdio 启动前用缓存的快照替换 `tools/list` 处理程序。如果您仍然看到持续的负载,请使用 `sample <pid> 1 10`(macOS)或 `node --cpu-prof` 捕获几秒钟并报告。
---
## Google Cloud 设置详情
<details>
<summary>逐步 Google Cloud 控制台说明</summary>
> 对于**远程部署**,创建类型为 **Web 应用程序** 的 OAuth 客户端(而非桌面应用程序)。仅在本地 stdio 使用时使用桌面应用程序。
1. **进入 Google Cloud 控制台:** 打开 [console.cloud.google.com](https://console.cloud.google.com/)
2. **创建或选择项目:** 点击项目下拉菜单 > “新建项目”。命名它(例如,“MCP Docs Server”)并点击“创建”。
3. **启用 API:**
- 导航到“API 和服务”>“库”
- 搜索并启用:**Google Docs API**、**Google Sheets API**、**Google Drive API**、**Gmail API**、**Google Calendar API**
4. **配置 OAuth 同意屏幕:**
- 进入“API 和服务”>“OAuth 同意屏幕”
- 选择“外部”并点击“创建”
- 填写:应用程序名称、用户支持电子邮件、开发者联系电子邮件
- 点击“保存并继续”
- 添加范围:`documents`、`spreadsheets`、`drive`、`gmail.modify`、`calendar.events`
- 点击“保存并继续”
- 将您的 Google 电子邮件添加为测试用户
- 点击“保存并继续”
5. **创建凭证:**
- 进入“API 和服务”>“凭证”
- 点击“+ 创建凭证”>“OAuth 客户端 ID”
- 应用程序类型:“桌面应用程序”
- 点击“创建”
- 复制 **客户端 ID** 和 **客户端密钥**
</details>
---
## 贡献
欢迎贡献!请参阅 [CONTRIBUTING.md](CONTRIBUTING.md) 以获取开发设置、架构概述和指南。
## 许可证
MIT -- 请参阅 [LICENSE](LICENSE) 以获取详细信息。
MCP 配置
以下是此 MCP Server 的配置信息,可直接复制到 Cursor 或其他 MCP 客户端中使用。
mcp.json
连接信息
猜你喜欢
暂无推荐服务器