[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"similar-taylorwilsdon--google_workspace_mcp":3,"tool-taylorwilsdon--google_workspace_mcp":64},[4,17,27,35,43,56],{"id":5,"name":6,"github_repo":7,"description_zh":8,"stars":9,"difficulty_score":10,"last_commit_at":11,"category_tags":12,"status":16},3808,"stable-diffusion-webui","AUTOMATIC1111\u002Fstable-diffusion-webui","stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面，旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点，将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。\n\n无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师，还是想要深入探索模型潜力的开发者与研究人员，都能从中获益。其核心亮点在于极高的功能丰富度：不仅支持文生图、图生图、局部重绘（Inpainting）和外绘（Outpainting）等基础模式，还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外，它内置了 GFPGAN 和 CodeFormer 等人脸修复工具，支持多种神经网络放大算法，并允许用户通过插件系统无限扩展能力。即使是显存有限的设备，stable-diffusion-webui 也提供了相应的优化选项，让高质量的 AI 艺术创作变得触手可及。",162132,3,"2026-04-05T11:01:52",[13,14,15],"开发框架","图像","Agent","ready",{"id":18,"name":19,"github_repo":20,"description_zh":21,"stars":22,"difficulty_score":23,"last_commit_at":24,"category_tags":25,"status":16},1381,"everything-claude-code","affaan-m\u002Feverything-claude-code","everything-claude-code 是一套专为 AI 编程助手（如 Claude Code、Codex、Cursor 等）打造的高性能优化系统。它不仅仅是一组配置文件，而是一个经过长期实战打磨的完整框架，旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。\n\n通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能，everything-claude-code 能显著提升 AI 在复杂任务中的表现，帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略，使得模型响应更快、成本更低，同时有效防御潜在的攻击向量。\n\n这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库，还是需要 AI 协助进行安全审计与自动化测试，everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目，它融合了多语言支持与丰富的实战钩子（hooks），让 AI 真正成长为懂上",138956,2,"2026-04-05T11:33:21",[13,15,26],"语言模型",{"id":28,"name":29,"github_repo":30,"description_zh":31,"stars":32,"difficulty_score":23,"last_commit_at":33,"category_tags":34,"status":16},2271,"ComfyUI","Comfy-Org\u002FComfyUI","ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎，专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式，采用直观的节点式流程图界面，让用户通过连接不同的功能模块即可构建个性化的生成管线。\n\n这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景，也能自由组合模型、调整参数并实时预览效果，轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性，不仅支持 Windows、macOS 和 Linux 全平台，还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构，并率先支持 SDXL、Flux、SD3 等前沿模型。\n\n无论是希望深入探索算法潜力的研究人员和开发者，还是追求极致创作自由度的设计师与资深 AI 绘画爱好者，ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能，使其成为当前最灵活、生态最丰富的开源扩散模型工具之一，帮助用户将创意高效转化为现实。",107662,"2026-04-03T11:11:01",[13,14,15],{"id":36,"name":37,"github_repo":38,"description_zh":39,"stars":40,"difficulty_score":23,"last_commit_at":41,"category_tags":42,"status":16},3704,"NextChat","ChatGPTNextWeb\u002FNextChat","NextChat 是一款轻量且极速的 AI 助手，旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性，以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发，NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。\n\n这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言，它也提供了便捷的自托管方案，支持一键部署到 Vercel 或 Zeabur 等平台。\n\nNextChat 的核心亮点在于其广泛的模型兼容性，原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型，让用户在一个界面即可自由切换不同 AI 能力。此外，它还率先支持 MCP（Model Context Protocol）协议，增强了上下文处理能力。针对企业用户，NextChat 提供专业版解决方案，具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能，满足公司对数据隐私和个性化管理的高标准要求。",87618,"2026-04-05T07:20:52",[13,26],{"id":44,"name":45,"github_repo":46,"description_zh":47,"stars":48,"difficulty_score":23,"last_commit_at":49,"category_tags":50,"status":16},2268,"ML-For-Beginners","microsoft\u002FML-For-Beginners","ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程，旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周，包含 26 节精炼课程和 52 道配套测验，内容涵盖从基础概念到实际应用的完整流程，有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。\n\n无论是希望转型的开发者、需要补充算法背景的研究人员，还是对人工智能充满好奇的普通爱好者，都能从中受益。课程不仅提供了清晰的理论讲解，还强调动手实践，让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持，通过自动化机制提供了包括简体中文在内的 50 多种语言版本，极大地降低了全球不同背景用户的学习门槛。此外，项目采用开源协作模式，社区活跃且内容持续更新，确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路，ML-For-Beginners 将是理想的起点。",84991,"2026-04-05T10:45:23",[14,51,52,53,15,54,26,13,55],"数据工具","视频","插件","其他","音频",{"id":57,"name":58,"github_repo":59,"description_zh":60,"stars":61,"difficulty_score":10,"last_commit_at":62,"category_tags":63,"status":16},3128,"ragflow","infiniflow\u002Fragflow","RAGFlow 是一款领先的开源检索增强生成（RAG）引擎，旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体（Agent）能力相结合，不仅支持从各类文档中高效提取知识，还能让模型基于这些知识进行逻辑推理和任务执行。\n\n在大模型应用中，幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构（如表格、图表及混合排版），显著提升了信息检索的准确度，从而有效减少模型“胡编乱造”的现象，确保回答既有据可依又具备时效性。其内置的智能体机制更进一步，使系统不仅能回答问题，还能自主规划步骤解决复杂问题。\n\n这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统，还是致力于探索大模型在垂直领域落地的创新者，都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口，既降低了非算法背景用户的上手门槛，也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目，它正成为连接通用大模型与行业专有知识之间的重要桥梁。",77062,"2026-04-04T04:44:48",[15,14,13,26,54],{"id":65,"github_repo":66,"name":67,"description_en":68,"description_zh":69,"ai_summary_zh":70,"readme_en":71,"readme_zh":72,"quickstart_zh":73,"use_case_zh":74,"hero_image_url":75,"owner_login":76,"owner_name":77,"owner_avatar_url":78,"owner_bio":79,"owner_company":80,"owner_location":81,"owner_email":82,"owner_twitter":82,"owner_website":83,"owner_url":84,"languages":85,"stars":97,"forks":98,"last_commit_at":99,"license":100,"difficulty_score":101,"env_os":102,"env_gpu":103,"env_ram":103,"env_deps":104,"category_tags":110,"github_topics":111,"view_count":23,"oss_zip_url":82,"oss_zip_packed_at":82,"status":16,"created_at":132,"updated_at":133,"faqs":134,"releases":171},2129,"taylorwilsdon\u002Fgoogle_workspace_mcp","google_workspace_mcp","Control Gmail, Google Calendar, Docs, Sheets, Slides, Chat, Forms, Tasks, Search & Drive with AI - Comprehensive Google Workspace \u002F G Suite MCP Server & CLI Tool","google_workspace_mcp 是一款功能全面的开源工具，旨在让人工智能助手通过自然语言直接操控谷歌全家桶服务。它无缝连接 Gmail、日历、文档、表格、幻灯片、云端硬盘、聊天及任务等核心应用，让用户能用对话方式完成邮件收发、日程安排、文件编辑和数据检索等复杂操作，彻底打破了传统图形界面与 AI 交互之间的壁垒。\n\n该工具主要解决了现有 AI 集成方案中功能碎片化、多用户支持不足以及部署安全性欠缺的痛点。无论是个人用户希望提升办公效率，还是企业需要为整个团队构建安全统一的 AI 后端，它都能提供稳定可靠的解决方案。\n\ngoogle_workspace_mcp 非常适合开发者、技术研究人员以及希望深度定制 AI 工作流的高级用户。其独特的技术亮点包括原生支持 OAuth 2.1 协议，实现了安全的无状态多用户认证模式；支持外部认证服务器，便于企业集中管控权限；同时提供功能强大的命令行界面（CLI），可轻松集成到 Claude Code、VS Code 等各类开发环境中。凭借对免费谷歌账号及各类企业版计划的广泛兼容，它是目前生态中最完整且适合组织级部署的谷歌工作区 MCP 服务器","google_workspace_mcp 是一款功能全面的开源工具，旨在让人工智能助手通过自然语言直接操控谷歌全家桶服务。它无缝连接 Gmail、日历、文档、表格、幻灯片、云端硬盘、聊天及任务等核心应用，让用户能用对话方式完成邮件收发、日程安排、文件编辑和数据检索等复杂操作，彻底打破了传统图形界面与 AI 交互之间的壁垒。\n\n该工具主要解决了现有 AI 集成方案中功能碎片化、多用户支持不足以及部署安全性欠缺的痛点。无论是个人用户希望提升办公效率，还是企业需要为整个团队构建安全统一的 AI 后端，它都能提供稳定可靠的解决方案。\n\ngoogle_workspace_mcp 非常适合开发者、技术研究人员以及希望深度定制 AI 工作流的高级用户。其独特的技术亮点包括原生支持 OAuth 2.1 协议，实现了安全的无状态多用户认证模式；支持外部认证服务器，便于企业集中管控权限；同时提供功能强大的命令行界面（CLI），可轻松集成到 Claude Code、VS Code 等各类开发环境中。凭借对免费谷歌账号及各类企业版计划的广泛兼容，它是目前生态中最完整且适合组织级部署的谷歌工作区 MCP 服务器之一。","\u003C!-- mcp-name: io.github.taylorwilsdon\u002Fworkspace-mcp -->\n\n\u003Cdiv align=\"center\">\n\n# \u003Cspan style=\"color:#cad8d9\">Google Workspace MCP Server\u003C\u002Fspan> \u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Ftaylorwilsdon_google_workspace_mcp_readme_1b5b70028737.png\" width=\"80\" align=\"right\" \u002F>\n\n[![License: MIT](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FLicense-MIT-yellow.svg)](https:\u002F\u002Fopensource.org\u002Flicenses\u002FMIT)\n[![Python 3.10+](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FPython-3.10%2B-blue.svg)](https:\u002F\u002Fwww.python.org\u002Fdownloads\u002F)\n[![PyPI](https:\u002F\u002Fimg.shields.io\u002Fpypi\u002Fv\u002Fworkspace-mcp.svg)](https:\u002F\u002Fpypi.org\u002Fproject\u002Fworkspace-mcp\u002F)\n[![PyPI Downloads](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Ftaylorwilsdon_google_workspace_mcp_readme_d474481733b0.png)](https:\u002F\u002Fpepy.tech\u002Fprojects\u002Fworkspace-mcp)\n[![Website](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FWebsite-workspacemcp.com-green.svg)](https:\u002F\u002Fworkspacemcp.com)\n\n*Full natural language control over Google Calendar, Drive, Gmail, Docs, Sheets, Slides, Forms, Tasks, Contacts, and Chat through all MCP clients, AI assistants and developer tools. Includes a full featured CLI for use with tools like Claude Code and Codex!*\n\n**The most feature-complete Google Workspace MCP server**, with Remote OAuth2.1 multi-user support and 1-click Claude installation. With native OAuth 2.1, stateless mode and external auth server support, it's the only Workspace MCP you can host for your whole organization centrally & securely!\n\n###### Support for all free Google accounts (Gmail, Docs, Drive etc) & Google Workspace plans (Starter, Standard, Plus, Enterprise, Non Profit) with expanded app options like Chat & Spaces. \u003Cbr\u002F>\u003Cbr \u002F> Interested in a private, managed cloud instance? [That can be arranged.](https:\u002F\u002Fworkspacemcp.com\u002Fworkspace-mcp-cloud)\n\n\n\u003C\u002Fdiv>\n\n\u003Cdiv align=\"center\">\n\u003Ca href=\"https:\u002F\u002Fwww.pulsemcp.com\u002Fservers\u002Ftaylorwilsdon-google-workspace\">\n\u003Cimg width=\"375\" src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Ftaylorwilsdon_google_workspace_mcp_readme_61f51ba916c3.png\" align=\"center\"\u002F>\n\u003C\u002Fa>\n\u003C\u002Fdiv>\n\n---\n\n\u003Cdiv align=\"center\">\n\u003Ctable>\n\u003Ctr>\n\u003Ctd align=\"center\">\n\u003Cb>⚡ Start\u003C\u002Fb>\u003Cbr>\n\u003Csub>\n\u003Ca href=\"#quick-start\">Quick Start\u003C\u002Fa> · \u003Ca href=\"#prerequisites\">Prerequisites\u003C\u002Fa>\u003Cbr>\n\u003Ca href=\"#configuration\">Google Cloud\u003C\u002Fa> · \u003Ca href=\"#-credential-configuration\">Credentials\u003C\u002Fa>\n\u003C\u002Fsub>\n\u003C\u002Ftd>\n\u003Ctd align=\"center\">\n\u003Cb>🧰 Tools\u003C\u002Fb>\u003Cbr>\n\u003Csub>\n\u003Ca href=\"#-available-tools\">All Tools\u003C\u002Fa> · \u003Ca href=\"#tool-tiers\">Tool Tiers\u003C\u002Fa>\u003Cbr>\n\u003Ca href=\"#cli\">CLI\u003C\u002Fa> · \u003Ca href=\"#start-the-server\">Start Server\u003C\u002Fa>\n\u003C\u002Fsub>\n\u003C\u002Ftd>\n\u003Ctd align=\"center\">\n\u003Cb>🔌 Connect\u003C\u002Fb>\u003Cbr>\n\u003Csub>\n\u003Ca href=\"#one-click-claude-desktop-install-claude-desktop-only-stdio-single-user\">1-Click Install\u003C\u002Fa> · \u003Ca href=\"#connect-to-claude-desktop\">Claude Desktop\u003C\u002Fa>\u003Cbr>\n\u003Ca href=\"#claude-code-mcp-client-support\">Claude Code\u003C\u002Fa> · \u003Ca href=\"#vs-code-mcp-client-support\">VS Code\u003C\u002Fa> · \u003Ca href=\"#connect-to-lm-studio\">LM Studio\u003C\u002Fa>\n\u003C\u002Fsub>\n\u003C\u002Ftd>\n\u003Ctd align=\"center\">\n\u003Cb>🚀 Deploy\u003C\u002Fb>\u003Cbr>\n\u003Csub>\n\u003Ca href=\"#oauth-21-support-multi-user-bearer-token-authentication\">OAuth 2.1\u003C\u002Fa> · \u003Ca href=\"#stateless-mode-container-friendly\">Stateless\u003C\u002Fa>\u003Cbr>\n\u003Ca href=\"#external-oauth-21-provider-mode\">External OAuth\u003C\u002Fa> · \u003Ca href=\"#reverse-proxy-setup\">Reverse Proxy\u003C\u002Fa>\n\u003C\u002Fsub>\n\u003C\u002Ftd>\n\u003Ctd align=\"center\">\n\u003Cb>📐 Develop\u003C\u002Fb>\u003Cbr>\n\u003Csub>\n\u003Ca href=\"#-development\">Architecture\u003C\u002Fa> · \u003Ca href=\"#local-development-setup\">Dev Setup\u003C\u002Fa>\u003Cbr>\n\u003Ca href=\"#-security\">Security\u003C\u002Fa> · \u003Ca href=\"#-license\">License\u003C\u002Fa>\n\u003C\u002Fsub>\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\n**See it in action:**\n\u003Cdiv align=\"center\">\n  \u003Cvideo width=\"400\" src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002Fa342ebb4-1319-4060-a974-39d202329710\">\u003C\u002Fvideo>\n\u003C\u002Fdiv>\n\n---\n\n## \u003Cspan style=\"color:#adbcbc\">Overview\u003C\u002Fspan>\n\nWorkspace MCP is the single most complete MCP server that integrates all major Google Workspace services with AI assistants. It supports both single-user operation and multi-user authentication via OAuth 2.1, making it a powerful backend for custom applications. Built with FastMCP for optimal performance, featuring advanced authentication handling, service caching, and streamlined development patterns. The entire toolset is available for CLI usage supporting both local and remote instances.\n\n**Simplified Setup**: Now uses Google Desktop OAuth clients - no redirect URIs or port configuration needed!\n\n\n## \u003Cspan style=\"color:#adbcbc\">Features\u003C\u002Fspan>\n\n> **12 services** &ensp;—&ensp; Gmail · Drive · Calendar · Docs · Sheets · Slides · Forms · Chat · Apps Script · Tasks · Contacts · Search\n\n\u003Ctable>\n\u003Ctr>\n\u003Ctd valign=\"top\" width=\"50%\">\n\n**📧 Gmail** — Complete email management, end-to-end coverage\u003Cbr>\n**📁 Drive** — File operations with sharing, permissions & Office formats\u003Cbr>\n**📅 Calendar** — Full event management with advanced features\u003Cbr>\n**📝 Docs** — Deep, fine-grained editing, formatting & comments\u003Cbr>\n**📊 Sheets** — Flexible cell management, formatting & conditional rules\u003Cbr>\n**🖼️ Slides** — Presentation creation, updates & content manipulation\u003Cbr>\n**📋 Forms** — Creation, publish settings & response management\u003Cbr>\n**💬 Chat** — Space management, messaging & reactions\n\n\u003C\u002Ftd>\n\u003Ctd valign=\"top\" width=\"50%\">\n\n**⚡ Apps Script** — Cross-application workflow automation\u003Cbr>\n\u003Csub>&ensp;Projects · deployments · versions · execution · debugging\u003C\u002Fsub>\n\n**✅ Tasks** — Task & list management with hierarchy\u003Cbr>\n**👤 Contacts** — People API with groups & batch operations\u003Cbr>\n**🔍 Custom Search** — Programmable Search Engine integration\n\n---\n\n**🔐 Authentication & Security**\u003Cbr>\n\u003Csub>OAuth 2.0 & 2.1 · auto token refresh · multi-user bearer tokens · transport-aware callbacks · CORS proxy\u003C\u002Fsub>\n\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftable>\n\n---\n\n## Quick Start\n\n> Set credentials → pick a launch command → connect your client\n\n```bash\n# 1. Credentials\nexport GOOGLE_OAUTH_CLIENT_ID=\"...\"\nexport GOOGLE_OAUTH_CLIENT_SECRET=\"...\"\n\n# 2. Launch — pick a tier\nuvx workspace-mcp --tool-tier core       # essential tools\nuvx workspace-mcp --tool-tier extended   # core + management ops\nuvx workspace-mcp --tool-tier complete   # everything\n\n# Or cherry-pick services\nuv run main.py --tools gmail drive calendar\n```\n\n\u003Csub>[Credential setup →](#-credential-configuration) · [All launch options →](#start-the-server) · [Tier details →](#tool-tiers)\u003C\u002Fsub>\n\n\u003Cdetails open>\n\u003Csummary>\u003Cb>Environment Variable Reference\u003C\u002Fb>\u003C\u002Fsummary>\n\u003Csub>\n\n| Variable | | Purpose |\n|----------|:---:|---------|\n| **🔐 Authentication** | | |\n| `GOOGLE_OAUTH_CLIENT_ID` | **required** | OAuth client ID from Google Cloud |\n| `GOOGLE_OAUTH_CLIENT_SECRET` | **required** | OAuth client secret |\n| `OAUTHLIB_INSECURE_TRANSPORT` | **required**&ast; | Set to `1` for development — allows `http:\u002F\u002F` redirect |\n| `USER_GOOGLE_EMAIL` | | Default email for single-user auth |\n| `GOOGLE_CLIENT_SECRET_PATH` | | Custom path to `client_secret.json` |\n| `GOOGLE_MCP_CREDENTIALS_DIR` | | Credential storage directory — default `~\u002F.google_workspace_mcp\u002Fcredentials` |\n| **🖥️ Server** | | |\n| `WORKSPACE_MCP_BASE_URI` | | Base server URI (no port) — default `http:\u002F\u002Flocalhost` |\n| `WORKSPACE_MCP_PORT` | | Listening port — default `8000` |\n| `WORKSPACE_MCP_HOST` | | Bind host — default `0.0.0.0` |\n| `WORKSPACE_EXTERNAL_URL` | | External URL for reverse proxy setups |\n| `WORKSPACE_ATTACHMENT_DIR` | | Downloaded attachments dir — default `~\u002F.workspace-mcp\u002Fattachments\u002F` |\n| `WORKSPACE_MCP_URL` | | Remote MCP endpoint URL for CLI |\n| `ALLOWED_FILE_DIRS` | | Colon-separated allowlist for local file reads |\n| **🔑 OAuth 2.1 & Multi-User** | | |\n| `MCP_ENABLE_OAUTH21` | | `true` to enable OAuth 2.1 multi-user support |\n| `EXTERNAL_OAUTH21_PROVIDER` | | `true` for external OAuth flow with bearer tokens |\n| `WORKSPACE_MCP_STATELESS_MODE` | | `true` for stateless container-friendly operation |\n| `GOOGLE_OAUTH_REDIRECT_URI` | | Override OAuth callback URL — default auto-constructed |\n| `OAUTH_CUSTOM_REDIRECT_URIS` | | Comma-separated additional redirect URIs |\n| `OAUTH_ALLOWED_ORIGINS` | | Comma-separated additional CORS origins |\n| `WORKSPACE_MCP_OAUTH_PROXY_STORAGE_BACKEND` | | `memory`, `disk`, or `valkey` — see [storage backends](#oauth-proxy-storage-backends) |\n| `FASTMCP_SERVER_AUTH_GOOGLE_JWT_SIGNING_KEY` | | Custom encryption key for OAuth proxy storage |\n| **🔍 Custom Search** | | |\n| `GOOGLE_PSE_API_KEY` | | API key for Programmable Search Engine |\n| `GOOGLE_PSE_ENGINE_ID` | | Search Engine ID for PSE |\n\n&ast;Required for development only. Claude Desktop stores credentials securely in the OS keychain — set them once in the extension pane.\n\n\u003C\u002Fsub>\n\u003C\u002Fdetails>\n\n---\n\n### One-Click Claude Desktop Install\n\n> `.dxt` bundles server, deps & manifest — download → double-click → done. No terminal, no JSON editing.\n\n1. **Download** the latest `google_workspace_mcp.dxt` from [Releases](https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Freleases)\n2. **Install** — double-click the file, Claude Desktop prompts to install\n3. **Configure** — Settings → Extensions → Google Workspace MCP, paste your OAuth credentials\n4. **Use it** — start a new Claude chat and call any Google Workspace tool\n\n\u003Cdiv align=\"center\">\n  \u003Cvideo width=\"832\" src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F83cca4b3-5e94-448b-acb3-6e3a27341d3a\">\u003C\u002Fvideo>\n\u003C\u002Fdiv>\n\n---\n\n### Prerequisites\n\n**Python 3.10+** · **[uv\u002Fuvx](https:\u002F\u002Fgithub.com\u002Fastral-sh\u002Fuv)** · **Google Cloud Project** with OAuth 2.0 credentials\n\n### Configuration\n\n\u003Cdetails open>\n\u003Csummary>\u003Cb>Google Cloud Setup\u003C\u002Fb>\u003C\u002Fsummary>\n\n1. **Create Project** — [Open Console →](https:\u002F\u002Fconsole.cloud.google.com\u002F) → Create new project\n2. **Create OAuth Credentials** — APIs & Services → Credentials → Create Credentials → OAuth Client ID\n   - Choose **Desktop Application** (no redirect URIs needed!)\n   - Download and note your Client ID & Client Secret\n3. **Enable APIs** — APIs & Services → Library, then enable each service:\n\n   | | | | |\n   |:--|:--|:--|:--|\n   | [Calendar](https:\u002F\u002Fconsole.cloud.google.com\u002Fflows\u002Fenableapi?apiid=calendar-json.googleapis.com) | [Drive](https:\u002F\u002Fconsole.cloud.google.com\u002Fflows\u002Fenableapi?apiid=drive.googleapis.com) | [Gmail](https:\u002F\u002Fconsole.cloud.google.com\u002Fflows\u002Fenableapi?apiid=gmail.googleapis.com) | [Docs](https:\u002F\u002Fconsole.cloud.google.com\u002Fflows\u002Fenableapi?apiid=docs.googleapis.com) |\n   | [Sheets](https:\u002F\u002Fconsole.cloud.google.com\u002Fflows\u002Fenableapi?apiid=sheets.googleapis.com) | [Slides](https:\u002F\u002Fconsole.cloud.google.com\u002Fflows\u002Fenableapi?apiid=slides.googleapis.com) | [Forms](https:\u002F\u002Fconsole.cloud.google.com\u002Fflows\u002Fenableapi?apiid=forms.googleapis.com) | [Tasks](https:\u002F\u002Fconsole.cloud.google.com\u002Fflows\u002Fenableapi?apiid=tasks.googleapis.com) |\n   | [Chat](https:\u002F\u002Fconsole.cloud.google.com\u002Fflows\u002Fenableapi?apiid=chat.googleapis.com) | [People](https:\u002F\u002Fconsole.cloud.google.com\u002Fflows\u002Fenableapi?apiid=people.googleapis.com) | [Custom Search](https:\u002F\u002Fconsole.cloud.google.com\u002Fflows\u002Fenableapi?apiid=customsearch.googleapis.com) | [Apps Script](https:\u002F\u002Fconsole.cloud.google.com\u002Fflows\u002Fenableapi?apiid=script.googleapis.com) |\n\n4. **Set Credentials** — see [Environment Variable Reference](#quick-start) above, or:\n   ```bash\n   export GOOGLE_OAUTH_CLIENT_ID=\"your-client-id\"\n   export GOOGLE_OAUTH_CLIENT_SECRET=\"your-secret\"\n   ```\n\n\u003Csub>[Full OAuth documentation →](https:\u002F\u002Fdevelopers.google.com\u002Fworkspace\u002Fguides\u002Fauth-overview) · [Credential setup details →](#-credential-configuration)\u003C\u002Fsub>\n\n\u003C\u002Fdetails>\n\n### Google Custom Search Setup\n\n\u003Cdetails open>\n\u003Csummary>◆ \u003Cb>Custom Search Configuration\u003C\u002Fb> \u003Csub>\u003Csup>← Enable web search capabilities\u003C\u002Fsup>\u003C\u002Fsub>\u003C\u002Fsummary>\n\n\u003Ctable>\n\u003Ctr>\n\u003Ctd width=\"33%\" align=\"center\">\n\n**1. Create Search Engine**\n```text\nprogrammablesearchengine.google.com\n\u002Fcontrolpanel\u002Fcreate\n\n→ Configure sites or entire web\n→ Note your Engine ID (cx)\n```\n\u003Csub>[Open Control Panel →](https:\u002F\u002Fprogrammablesearchengine.google.com\u002Fcontrolpanel\u002Fcreate)\u003C\u002Fsub>\n\n\u003C\u002Ftd>\n\u003Ctd width=\"33%\" align=\"center\">\n\n**2. Get API Key**\n```text\ndevelopers.google.com\n\u002Fcustom-search\u002Fv1\u002Foverview\n\n→ Create\u002Fselect project\n→ Enable Custom Search API\n→ Create credentials (API Key)\n```\n\u003Csub>[Get API Key →](https:\u002F\u002Fdevelopers.google.com\u002Fcustom-search\u002Fv1\u002Foverview)\u003C\u002Fsub>\n\n\u003C\u002Ftd>\n\u003Ctd width=\"34%\" align=\"center\">\n\n**3. Set Variables**\n```bash\nexport GOOGLE_PSE_API_KEY=\\\n  \"your-api-key\"\nexport GOOGLE_PSE_ENGINE_ID=\\\n  \"your-engine-id\"\n```\n\u003Csub>Configure in environment\u003C\u002Fsub>\n\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd colspan=\"3\">\n\n\u003Cdetails open>\n\u003Csummary>≡ \u003Cb>Quick Setup Guide\u003C\u002Fb> \u003Csub>\u003Csup>← Step-by-step instructions\u003C\u002Fsup>\u003C\u002Fsub>\u003C\u002Fsummary>\n\n**Complete Setup Process:**\n\n1. **Create Search Engine** - Visit the [Control Panel](https:\u002F\u002Fprogrammablesearchengine.google.com\u002Fcontrolpanel\u002Fcreate)\n   - Choose \"Search the entire web\" or specify sites\n   - Copy the Search Engine ID (looks like: `017643444788157684527:6ivsjbpxpqw`)\n\n2. **Enable API & Get Key** - Visit [Google Developers Console](https:\u002F\u002Fconsole.cloud.google.com\u002F)\n   - Enable \"Custom Search API\" in your project\n   - Create credentials → API Key\n   - Restrict key to Custom Search API (recommended)\n\n3. **Configure Environment** - Add to your shell or `.env`:\n   ```bash\n   export GOOGLE_PSE_API_KEY=\"AIzaSy...\"\n   export GOOGLE_PSE_ENGINE_ID=\"01764344478...\"\n   ```\n\n≡ [Full Documentation →](https:\u002F\u002Fdevelopers.google.com\u002Fcustom-search\u002Fv1\u002Foverview)\n\n\u003C\u002Fdetails>\n\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftable>\n\n\u003C\u002Fdetails>\n\n### Start the Server\n\n> **📌 Transport Mode Guidance**: Use **streamable HTTP mode** (`--transport streamable-http`) for all modern MCP clients including Claude Code, VS Code MCP, and MCP Inspector. Stdio mode is only for clients with incomplete MCP specification support.\n\n\u003Cdetails open>\n\u003Csummary>▶ \u003Cb>Launch Commands\u003C\u002Fb> \u003Csub>\u003Csup>← Choose your startup mode\u003C\u002Fsup>\u003C\u002Fsub>\u003C\u002Fsummary>\n\n\u003Ctable>\n\u003Ctr>\n\u003Ctd width=\"33%\" align=\"center\">\n\n**▶ Legacy Mode**\n```bash\nuv run main.py\n```\n\u003Csub>⚠️ Stdio mode (incomplete MCP clients only)\u003C\u002Fsub>\n\n\u003C\u002Ftd>\n\u003Ctd width=\"33%\" align=\"center\">\n\n**◆ HTTP Mode (Recommended)**\n```bash\nuv run main.py \\\n  --transport streamable-http\n```\n\u003Csub>✅ Full MCP spec compliance & OAuth 2.1\u003C\u002Fsub>\n\n\u003C\u002Ftd>\n\u003Ctd width=\"34%\" align=\"center\">\n\n**@ Single User**\n```bash\nuv run main.py \\\n  --single-user\n```\n\u003Csub>Simplified authentication\u003C\u002Fsub>\n\u003Csub>⚠️ Cannot be used with OAuth 2.1 mode\u003C\u002Fsub>\n\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd colspan=\"3\">\n\n\u003Cdetails open>\n\u003Csummary>◆ \u003Cb>Advanced Options\u003C\u002Fb> \u003Csub>\u003Csup>← Tool selection, tiers & Docker\u003C\u002Fsup>\u003C\u002Fsub>\u003C\u002Fsummary>\n\n**▶ Selective Tool Loading**\n```bash\n# Load specific services only\nuv run main.py --tools gmail drive calendar\nuv run main.py --tools sheets docs\n\n# Combine with other flags\nuv run main.py --single-user --tools gmail\n```\n\n\n**🔒 Read-Only Mode**\n```bash\n# Requests only read-only scopes & disables write tools\nuv run main.py --read-only\n\n# Combine with specific tools or tiers\nuv run main.py --tools gmail drive --read-only\nuv run main.py --tool-tier core --read-only\n```\nRead-only mode provides secure, restricted access by:\n- Requesting only `*.readonly` OAuth scopes (e.g., `gmail.readonly`, `drive.readonly`)\n- Automatically filtering out tools that require write permissions at startup\n- Allowing read operations: list, get, search, and export across all services\n\n**🔐 Granular Permissions**\n```bash\n# Per-service permission levels\nuv run main.py --permissions gmail:organize drive:readonly\n\n# Combine permissions with tier filtering\nuv run main.py --permissions gmail:send drive:full --tool-tier core\n```\nGranular permissions mode provides service-by-service scope control:\n- Format: `service:level` (one entry per service)\n- Gmail levels: `readonly`, `organize`, `drafts`, `send`, `full` (cumulative)\n- Tasks levels: `readonly`, `manage`, `full` (cumulative; `manage` allows create\u002Fupdate\u002Fmove but denies `delete` and `clear_completed`)\n- Other services currently support: `readonly`, `full`\n- `--permissions` and `--read-only` are mutually exclusive\n- `--permissions` cannot be combined with `--tools`; enabled services are determined by the `--permissions` entries (optionally filtered by `--tool-tier`)\n- With `--tool-tier`, only tier-matched tools are enabled and only services that have tools in the selected tier are imported\n\n**★ Tool Tiers**\n```bash\nuv run main.py --tool-tier core      # ● Essential tools only\nuv run main.py --tool-tier extended  # ◐ Core + additional\nuv run main.py --tool-tier complete  # ○ All available tools\n```\n\n**◆ Docker Deployment**\n```bash\ndocker build -t workspace-mcp .\ndocker run -p 8000:8000 -v $(pwd):\u002Fapp \\\n  workspace-mcp --transport streamable-http\n\n# With tool selection via environment variables\ndocker run -e TOOL_TIER=core workspace-mcp\ndocker run -e TOOLS=\"gmail drive calendar\" workspace-mcp\n```\n\n**Available Services**: `gmail` • `drive` • `calendar` • `docs` • `sheets` • `forms` • `tasks` • `contacts` • `chat` • `search`\n\n\u003C\u002Fdetails>\n\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftable>\n\n\u003C\u002Fdetails>\n\n### CLI\n\nThe `workspace-cli` command lists tools and calls them against a running server — with encrypted, disk-backed OAuth token caching so you only authenticate once. On first run it opens a browser for Google consent; subsequent runs reuse the cached tokens automatically.\n\nTokens are stored encrypted at `~\u002F.workspace-mcp\u002Fcli-tokens\u002F` using a Fernet key auto-generated at `~\u002F.workspace-mcp\u002F.cli-encryption-key`.\n\n\u003Cdetails open>\n\u003Csummary>▶ \u003Cb>workspace-cli Commands\u003C\u002Fb> \u003Csub>\u003Csup>← Persistent OAuth, no re-auth on every call\u003C\u002Fsup>\u003C\u002Fsub>\u003C\u002Fsummary>\n\n\u003Ctable>\n\u003Ctr>\n\u003Ctd width=\"50%\" align=\"center\">\n\n**▶ List Tools**\n```bash\nuv run workspace-cli list\nuv run workspace-cli --url https:\u002F\u002Fcustom.server\u002Fmcp list\n\n# Or, if installed globally:\nworkspace-cli list\nworkspace-cli --url https:\u002F\u002Fcustom.server\u002Fmcp list\n```\n\u003Csub>View all available tools\u003C\u002Fsub>\n\n\u003C\u002Ftd>\n\u003Ctd width=\"50%\" align=\"center\">\n\n**◆ Call a Tool**\n```bash\nuv run workspace-cli call search_gmail_messages \\\n  query=\"is:unread\" max_results=5\n```\n\u003Csub>Execute a tool with key=value arguments\u003C\u002Fsub>\n\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftable>\n\nSet URL for remote endpoints with `--url` or the `WORKSPACE_MCP_URL` environment variable.\n\n\u003Cdetails open>\n\u003Csummary>≡ \u003Cb>Advanced: FastMCP CLI\u003C\u002Fb> \u003Csub>\u003Csup>← inspect, install, discover\u003C\u002Fsup>\u003C\u002Fsub>\u003C\u002Fsummary>\n\nThe upstream [FastMCP CLI](https:\u002F\u002Fgofastmcp.com\u002Fcli) is also bundled and provides additional commands for schema inspection, client installation, and editor discovery. Note that `fastmcp` uses in-memory token storage, so each invocation may re-trigger the OAuth flow.\n\n```bash\nfastmcp inspect fastmcp_server.py                        # print tools, resources, prompts\nfastmcp install claude-code fastmcp_server.py             # one-command client setup\nfastmcp install cursor fastmcp_server.py\nfastmcp discover                                          # find servers configured in editors\n```\n\nSee `fastmcp --help` or the [FastMCP CLI docs](https:\u002F\u002Fgofastmcp.com\u002Fcli) for the full command reference.\n\n\u003C\u002Fdetails>\n\n\u003C\u002Fdetails>\n\n### Tool Tiers\n\nThe server organizes tools into **three progressive tiers** for simplified deployment. Choose a tier that matches your usage needs and API quota requirements.\n\n\u003Ctable>\n\u003Ctr>\n\u003Ctd width=\"65%\" valign=\"top\">\n\n#### \u003Cspan style=\"color:#72898f\">Available Tiers\u003C\u002Fspan>\n\n**\u003Cspan style=\"color:#2d5b69\">●\u003C\u002Fspan> Core** (`--tool-tier core`)\nEssential tools for everyday tasks. Perfect for light usage with minimal API quotas. Includes search, read, create, and basic modify operations across all services.\n\n**\u003Cspan style=\"color:#72898f\">●\u003C\u002Fspan> Extended** (`--tool-tier extended`)\nCore functionality plus management tools. Adds labels, folders, batch operations, and advanced search. Ideal for regular usage with moderate API needs.\n\n**\u003Cspan style=\"color:#adbcbc\">●\u003C\u002Fspan> Complete** (`--tool-tier complete`)\nFull API access including comments, headers\u002Ffooters, publishing settings, and administrative functions. For power users needing maximum functionality.\n\n\u003C\u002Ftd>\n\u003Ctd width=\"35%\" valign=\"top\">\n\n#### \u003Cspan style=\"color:#72898f\">Important Notes\u003C\u002Fspan>\n\n\u003Cspan style=\"color:#72898f\">▶\u003C\u002Fspan> **Start with `core`** and upgrade as needed\n\u003Cspan style=\"color:#72898f\">▶\u003C\u002Fspan> **Tiers are cumulative** – each includes all previous\n\u003Cspan style=\"color:#72898f\">▶\u003C\u002Fspan> **Mix and match** with `--tools` for specific services\n\u003Cspan style=\"color:#72898f\">▶\u003C\u002Fspan> **Configuration** in `core\u002Ftool_tiers.yaml`\n\u003Cspan style=\"color:#72898f\">▶\u003C\u002Fspan> **Authentication** included in all tiers\n\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftable>\n\n#### \u003Cspan style=\"color:#72898f\">Usage Examples\u003C\u002Fspan>\n\n```bash\n# Basic tier selection\nuv run main.py --tool-tier core                            # Start with essential tools only\nuv run main.py --tool-tier extended                        # Expand to include management features\nuv run main.py --tool-tier complete                        # Enable all available functionality\n\n# Selective service loading with tiers\nuv run main.py --tools gmail drive --tool-tier core        # Core tools for specific services\nuv run main.py --tools gmail --tool-tier extended          # Extended Gmail functionality only\nuv run main.py --tools docs sheets --tool-tier complete    # Full access to Docs and Sheets\n\n# Combine tier selection with granular permission levels\nuv run main.py --permissions gmail:organize drive:full --tool-tier core\n```\n\n## 📋 Credential Configuration\n\n\u003Cdetails open>\n\u003Csummary>🔑 \u003Cb>OAuth Credentials Setup\u003C\u002Fb> \u003Csub>\u003Csup>← Essential for all installations\u003C\u002Fsup>\u003C\u002Fsub>\u003C\u002Fsummary>\n\n\u003Ctable>\n\u003Ctr>\n\u003Ctd width=\"33%\" align=\"center\">\n\n**🚀 Environment Variables**\n```bash\nexport GOOGLE_OAUTH_CLIENT_ID=\\\n  \"your-client-id\"\nexport GOOGLE_OAUTH_CLIENT_SECRET=\\\n  \"your-secret\"\n```\n\u003Csub>Best for production\u003C\u002Fsub>\n\n\u003C\u002Ftd>\n\u003Ctd width=\"33%\" align=\"center\">\n\n**📁 File-based**\n```bash\n# Download & place in project root\nclient_secret.json\n\n# Or specify custom path\nexport GOOGLE_CLIENT_SECRET_PATH=\\\n  \u002Fpath\u002Fto\u002Fsecret.json\n```\n\u003Csub>Traditional method\u003C\u002Fsub>\n\n\u003C\u002Ftd>\n\u003Ctd width=\"34%\" align=\"center\">\n\n**⚡ .env File**\n```bash\ncp .env.oauth21 .env\n# Edit .env with credentials\n```\n\u003Csub>Best for development\u003C\u002Fsub>\n\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd colspan=\"3\">\n\n\u003Cdetails open>\n\u003Csummary>📖 \u003Cb>Credential Loading Details\u003C\u002Fb> \u003Csub>\u003Csup>← Understanding priority & best practices\u003C\u002Fsup>\u003C\u002Fsub>\u003C\u002Fsummary>\n\n**Loading Priority**\n1. Environment variables (`export VAR=value`)\n2. `.env` file in project root (warning - if you run via `uvx` rather than `uv run` from the repo directory, you are spawning a standalone process not associated with your clone of the repo and it will not find your .env file without specifying it directly)\n3. `client_secret.json` via `GOOGLE_CLIENT_SECRET_PATH`\n4. Default `client_secret.json` in project root\n\n**Why Environment Variables?**\n- ✅ **Docker\u002FK8s ready** - Native container support\n- ✅ **Cloud platforms** - Heroku, Railway, Vercel\n- ✅ **CI\u002FCD pipelines** - GitHub Actions, Jenkins\n- ✅ **No secrets in git** - Keep credentials secure\n- ✅ **Easy rotation** - Update without code changes\n\n\u003C\u002Fdetails>\n\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftable>\n\n\u003C\u002Fdetails>\n\n---\n\n## 🧰 Available Tools\n\n> **Note**: All tools support automatic authentication via `@require_google_service()` decorators with 30-minute service caching.\n\n#### 📅 Google Calendar \u003Csub>[`calendar_tools.py`](gcalendar\u002Fcalendar_tools.py)\u003C\u002Fsub>\n\n| \u003Csub>Tool\u003C\u002Fsub> | \u003Csub>Tier\u003C\u002Fsub> | \u003Csub>Description\u003C\u002Fsub> |\n|------|------|-------------|\n| \u003Csub>`list_calendars`\u003C\u002Fsub> | \u003Csub>Core\u003C\u002Fsub> | \u003Csub>List accessible calendars\u003C\u002Fsub> |\n| \u003Csub>`get_events`\u003C\u002Fsub> | \u003Csub>Core\u003C\u002Fsub> | \u003Csub>Retrieve events with time range filtering\u003C\u002Fsub> |\n| \u003Csub>`manage_event`\u003C\u002Fsub> | \u003Csub>Core\u003C\u002Fsub> | \u003Csub>Create, update, or delete calendar events\u003C\u002Fsub> |\n| \u003Csub>`manage_out_of_office`\u003C\u002Fsub> | \u003Csub>Extended\u003C\u002Fsub> | \u003Csub>Create, list, update, or delete Out of Office events\u003C\u002Fsub> |\n\n#### 📁 Google Drive \u003Csub>[`drive_tools.py`](gdrive\u002Fdrive_tools.py)\u003C\u002Fsub>\n\n| \u003Csub>Tool\u003C\u002Fsub> | \u003Csub>Tier\u003C\u002Fsub> | \u003Csub>Description\u003C\u002Fsub> |\n|------|------|-------------|\n| \u003Csub>`search_drive_files`\u003C\u002Fsub> | \u003Csub>Core\u003C\u002Fsub> | \u003Csub>Search files with query syntax\u003C\u002Fsub> |\n| \u003Csub>`get_drive_file_content`\u003C\u002Fsub> | \u003Csub>Core\u003C\u002Fsub> | \u003Csub>Read file content (Office formats)\u003C\u002Fsub> |\n| \u003Csub>`get_drive_file_download_url`\u003C\u002Fsub> | \u003Csub>Core\u003C\u002Fsub> | \u003Csub>Download Drive files to local disk\u003C\u002Fsub> |\n| \u003Csub>`create_drive_file`\u003C\u002Fsub> | \u003Csub>Core\u003C\u002Fsub> | \u003Csub>Create files or fetch from URLs\u003C\u002Fsub> |\n| \u003Csub>`create_drive_folder`\u003C\u002Fsub> | \u003Csub>Core\u003C\u002Fsub> | \u003Csub>Create empty folders in Drive or shared drives\u003C\u002Fsub> |\n| \u003Csub>`import_to_google_doc`\u003C\u002Fsub> | \u003Csub>Core\u003C\u002Fsub> | \u003Csub>Import files (MD, DOCX, HTML, etc.) as Google Docs\u003C\u002Fsub> |\n| \u003Csub>`get_drive_shareable_link`\u003C\u002Fsub> | \u003Csub>Core\u003C\u002Fsub> | \u003Csub>Get shareable links for a file\u003C\u002Fsub> |\n| \u003Csub>`list_drive_items`\u003C\u002Fsub> | \u003Csub>Extended\u003C\u002Fsub> | \u003Csub>List folder contents\u003C\u002Fsub> |\n| \u003Csub>`copy_drive_file`\u003C\u002Fsub> | \u003Csub>Extended\u003C\u002Fsub> | \u003Csub>Copy existing files (templates) with optional renaming\u003C\u002Fsub> |\n| \u003Csub>`update_drive_file`\u003C\u002Fsub> | \u003Csub>Extended\u003C\u002Fsub> | \u003Csub>Update file metadata, move between folders\u003C\u002Fsub> |\n| \u003Csub>`manage_drive_access`\u003C\u002Fsub> | \u003Csub>Extended\u003C\u002Fsub> | \u003Csub>Grant, update, revoke permissions, and transfer ownership\u003C\u002Fsub> |\n| \u003Csub>`set_drive_file_permissions`\u003C\u002Fsub> | \u003Csub>Extended\u003C\u002Fsub> | \u003Csub>Set link sharing and file-level sharing settings\u003C\u002Fsub> |\n| \u003Csub>`get_drive_file_permissions`\u003C\u002Fsub> | \u003Csub>Complete\u003C\u002Fsub> | \u003Csub>Get detailed file permissions\u003C\u002Fsub> |\n| \u003Csub>`check_drive_file_public_access`\u003C\u002Fsub> | \u003Csub>Complete\u003C\u002Fsub> | \u003Csub>Check public sharing status\u003C\u002Fsub> |\n\n#### 📧 Gmail \u003Csub>[`gmail_tools.py`](gmail\u002Fgmail_tools.py)\u003C\u002Fsub>\n\n| \u003Csub>Tool\u003C\u002Fsub> | \u003Csub>Tier\u003C\u002Fsub> | \u003Csub>Description\u003C\u002Fsub> |\n|------|------|-------------|\n| \u003Csub>`search_gmail_messages`\u003C\u002Fsub> | \u003Csub>Core\u003C\u002Fsub> | \u003Csub>Search with Gmail operators\u003C\u002Fsub> |\n| \u003Csub>`get_gmail_message_content`\u003C\u002Fsub> | \u003Csub>Core\u003C\u002Fsub> | \u003Csub>Retrieve message content\u003C\u002Fsub> |\n| \u003Csub>`get_gmail_messages_content_batch`\u003C\u002Fsub> | \u003Csub>Core\u003C\u002Fsub> | \u003Csub>Batch retrieve message content\u003C\u002Fsub> |\n| \u003Csub>`send_gmail_message`\u003C\u002Fsub> | \u003Csub>Core\u003C\u002Fsub> | \u003Csub>Send emails\u003C\u002Fsub> |\n| \u003Csub>`get_gmail_thread_content`\u003C\u002Fsub> | \u003Csub>Extended\u003C\u002Fsub> | \u003Csub>Get full thread content\u003C\u002Fsub> |\n| \u003Csub>`modify_gmail_message_labels`\u003C\u002Fsub> | \u003Csub>Extended\u003C\u002Fsub> | \u003Csub>Modify message labels\u003C\u002Fsub> |\n| \u003Csub>`list_gmail_labels`\u003C\u002Fsub> | \u003Csub>Extended\u003C\u002Fsub> | \u003Csub>List available labels\u003C\u002Fsub> |\n| \u003Csub>`list_gmail_filters`\u003C\u002Fsub> | \u003Csub>Extended\u003C\u002Fsub> | \u003Csub>List Gmail filters\u003C\u002Fsub> |\n| \u003Csub>`manage_gmail_label`\u003C\u002Fsub> | \u003Csub>Extended\u003C\u002Fsub> | \u003Csub>Create\u002Fupdate\u002Fdelete labels\u003C\u002Fsub> |\n| \u003Csub>`manage_gmail_filter`\u003C\u002Fsub> | \u003Csub>Extended\u003C\u002Fsub> | \u003Csub>Create or delete Gmail filters\u003C\u002Fsub> |\n| \u003Csub>`draft_gmail_message`\u003C\u002Fsub> | \u003Csub>Extended\u003C\u002Fsub> | \u003Csub>Create drafts\u003C\u002Fsub> |\n| \u003Csub>`get_gmail_threads_content_batch`\u003C\u002Fsub> | \u003Csub>Complete\u003C\u002Fsub> | \u003Csub>Batch retrieve thread content\u003C\u002Fsub> |\n| \u003Csub>`batch_modify_gmail_message_labels`\u003C\u002Fsub> | \u003Csub>Complete\u003C\u002Fsub> | \u003Csub>Batch modify labels\u003C\u002Fsub> |\n| \u003Csub>`start_google_auth`\u003C\u002Fsub> | \u003Csub>Complete\u003C\u002Fsub> | \u003Csub>Legacy OAuth 2.0 auth (disabled when OAuth 2.1 is enabled)\u003C\u002Fsub> |\n\n\u003Cdetails open>\n\u003Csummary>\u003Cb>📎 Email Attachments\u003C\u002Fb> \u003Csub>\u003Csup>← Send emails with files\u003C\u002Fsup>\u003C\u002Fsub>\u003C\u002Fsummary>\n\nBoth `send_gmail_message` and `draft_gmail_message` support attachments via two methods:\n\n**Option 1: File Path** (local server only)\n```python\nattachments=[{\"path\": \"\u002Fpath\u002Fto\u002Freport.pdf\"}]\n```\nReads file from disk, auto-detects MIME type. Optional `filename` override.\n\n**Option 2: Base64 Content** (works everywhere)\n```python\nattachments=[{\n    \"filename\": \"report.pdf\",\n    \"content\": \"JVBERi0xLjQK...\",  # base64-encoded\n    \"mime_type\": \"application\u002Fpdf\"   # optional\n}]\n```\n\n**⚠️ Centrally Hosted Servers**: When the MCP server runs remotely (cloud, shared instance), it cannot access your local filesystem. Use **Option 2** with base64-encoded content. Your MCP client must encode files before sending.\n\n\u003C\u002Fdetails>\n\n\u003Cdetails open>\n\u003Csummary>\u003Cb>📥 Downloaded Attachment Storage\u003C\u002Fb> \u003Csub>\u003Csup>← Where downloaded files are saved\u003C\u002Fsup>\u003C\u002Fsub>\u003C\u002Fsummary>\n\nWhen downloading Gmail attachments (`get_gmail_attachment_content`) or Drive files (`get_drive_file_download_url`), files are saved to a persistent local directory rather than a temporary folder in the working directory.\n\n**Default location:** `~\u002F.workspace-mcp\u002Fattachments\u002F`\n\nFiles are saved with their original filename plus a short UUID suffix for uniqueness (e.g., `invoice_a1b2c3d4.pdf`). In **stdio mode**, the tool returns the absolute file path for direct filesystem access. In **HTTP mode**, it returns a download URL via the `\u002Fattachments\u002F{file_id}` endpoint.\n\nTo customize the storage directory:\n```bash\nexport WORKSPACE_ATTACHMENT_DIR=\"\u002Fpath\u002Fto\u002Fcustom\u002Fdir\"\n```\n\nSaved files expire after 1 hour and are cleaned up automatically.\n\n\u003C\u002Fdetails>\n\n#### 📝 Google Docs \u003Csub>[`docs_tools.py`](gdocs\u002Fdocs_tools.py)\u003C\u002Fsub>\n\n| \u003Csub>Tool\u003C\u002Fsub> | \u003Csub>Tier\u003C\u002Fsub> | \u003Csub>Description\u003C\u002Fsub> |\n|------|------|-------------|\n| \u003Csub>`get_doc_content`\u003C\u002Fsub> | \u003Csub>Core\u003C\u002Fsub> | \u003Csub>Extract document text\u003C\u002Fsub> |\n| \u003Csub>`create_doc`\u003C\u002Fsub> | \u003Csub>Core\u003C\u002Fsub> | \u003Csub>Create new documents\u003C\u002Fsub> |\n| \u003Csub>`modify_doc_text`\u003C\u002Fsub> | \u003Csub>Core\u003C\u002Fsub> | \u003Csub>Insert, replace, and richly format text with tab\u002Fsegment targeting, append-to-segment support, advanced typography, and link management\u003C\u002Fsub> |\n| \u003Csub>`search_docs`\u003C\u002Fsub> | \u003Csub>Extended\u003C\u002Fsub> | \u003Csub>Find documents by name\u003C\u002Fsub> |\n| \u003Csub>`find_and_replace_doc`\u003C\u002Fsub> | \u003Csub>Extended\u003C\u002Fsub> | \u003Csub>Find and replace text\u003C\u002Fsub> |\n| \u003Csub>`list_docs_in_folder`\u003C\u002Fsub> | \u003Csub>Extended\u003C\u002Fsub> | \u003Csub>List docs in folder\u003C\u002Fsub> |\n| \u003Csub>`insert_doc_elements`\u003C\u002Fsub> | \u003Csub>Extended\u003C\u002Fsub> | \u003Csub>Add tables, lists, page breaks\u003C\u002Fsub> |\n| \u003Csub>`update_paragraph_style`\u003C\u002Fsub> | \u003Csub>Extended\u003C\u002Fsub> | \u003Csub>Apply advanced paragraph styling including headings, spacing, direction, pagination controls, shading, and bulleted\u002Fnumbered\u002Fcheckbox lists with nesting\u003C\u002Fsub> |\n| \u003Csub>`get_doc_as_markdown`\u003C\u002Fsub> | \u003Csub>Extended\u003C\u002Fsub> | \u003Csub>Export document as formatted Markdown with optional comments\u003C\u002Fsub> |\n| \u003Csub>`insert_doc_image`\u003C\u002Fsub> | \u003Csub>Complete\u003C\u002Fsub> | \u003Csub>Insert images from Drive\u002FURLs\u003C\u002Fsub> |\n| \u003Csub>`update_doc_headers_footers`\u003C\u002Fsub> | \u003Csub>Complete\u003C\u002Fsub> | \u003Csub>Create or update headers and footers with correct segment-aware writes\u003C\u002Fsub> |\n| \u003Csub>`batch_update_doc`\u003C\u002Fsub> | \u003Csub>Complete\u003C\u002Fsub> | \u003Csub>Execute atomic multi-step Docs API operations including named ranges, section breaks, document\u002Fsection layout, header\u002Ffooter creation, segment-aware inserts, images, tables, and rich formatting\u003C\u002Fsub> |\n| \u003Csub>`inspect_doc_structure`\u003C\u002Fsub> | \u003Csub>Complete\u003C\u002Fsub> | \u003Csub>Analyze document structure, including safe insertion points, tables, section breaks, headers\u002Ffooters, and named ranges\u003C\u002Fsub> |\n| \u003Csub>`export_doc_to_pdf`\u003C\u002Fsub> | \u003Csub>Extended\u003C\u002Fsub> | \u003Csub>Export document to PDF\u003C\u002Fsub> |\n| \u003Csub>`create_table_with_data`\u003C\u002Fsub> | \u003Csub>Complete\u003C\u002Fsub> | \u003Csub>Create data tables\u003C\u002Fsub> |\n| \u003Csub>`debug_table_structure`\u003C\u002Fsub> | \u003Csub>Complete\u003C\u002Fsub> | \u003Csub>Debug table issues\u003C\u002Fsub> |\n| \u003Csub>`list_document_comments`\u003C\u002Fsub> | \u003Csub>Complete\u003C\u002Fsub> | \u003Csub>List all document comments\u003C\u002Fsub> |\n| \u003Csub>`manage_document_comment`\u003C\u002Fsub> | \u003Csub>Complete\u003C\u002Fsub> | \u003Csub>Create, reply to, or resolve comments\u003C\u002Fsub> |\n\n#### 📊 Google Sheets \u003Csub>[`sheets_tools.py`](gsheets\u002Fsheets_tools.py)\u003C\u002Fsub>\n\n| \u003Csub>Tool\u003C\u002Fsub> | \u003Csub>Tier\u003C\u002Fsub> | \u003Csub>Description\u003C\u002Fsub> |\n|------|------|-------------|\n| \u003Csub>`read_sheet_values`\u003C\u002Fsub> | \u003Csub>Core\u003C\u002Fsub> | \u003Csub>Read cell ranges\u003C\u002Fsub> |\n| \u003Csub>`modify_sheet_values`\u003C\u002Fsub> | \u003Csub>Core\u003C\u002Fsub> | \u003Csub>Write\u002Fupdate\u002Fclear cells\u003C\u002Fsub> |\n| \u003Csub>`create_spreadsheet`\u003C\u002Fsub> | \u003Csub>Core\u003C\u002Fsub> | \u003Csub>Create new spreadsheets\u003C\u002Fsub> |\n| \u003Csub>`list_spreadsheets`\u003C\u002Fsub> | \u003Csub>Extended\u003C\u002Fsub> | \u003Csub>List accessible spreadsheets\u003C\u002Fsub> |\n| \u003Csub>`get_spreadsheet_info`\u003C\u002Fsub> | \u003Csub>Extended\u003C\u002Fsub> | \u003Csub>Get spreadsheet metadata\u003C\u002Fsub> |\n| \u003Csub>`format_sheet_range`\u003C\u002Fsub> | \u003Csub>Extended\u003C\u002Fsub> | \u003Csub>Apply colors, number formats, text wrapping, alignment, bold\u002Fitalic, font size\u003C\u002Fsub> |\n| \u003Csub>`create_sheet`\u003C\u002Fsub> | \u003Csub>Complete\u003C\u002Fsub> | \u003Csub>Add sheets to existing files\u003C\u002Fsub> |\n| \u003Csub>`list_spreadsheet_comments`\u003C\u002Fsub> | \u003Csub>Complete\u003C\u002Fsub> | \u003Csub>List all spreadsheet comments\u003C\u002Fsub> |\n| \u003Csub>`manage_spreadsheet_comment`\u003C\u002Fsub> | \u003Csub>Complete\u003C\u002Fsub> | \u003Csub>Create, reply to, or resolve comments\u003C\u002Fsub> |\n| \u003Csub>`manage_conditional_formatting`\u003C\u002Fsub> | \u003Csub>Complete\u003C\u002Fsub> | \u003Csub>Add, update, or delete conditional formatting rules\u003C\u002Fsub> |\n\n#### 🖼️ Google Slides \u003Csub>[`slides_tools.py`](gslides\u002Fslides_tools.py)\u003C\u002Fsub>\n\n| \u003Csub>Tool\u003C\u002Fsub> | \u003Csub>Tier\u003C\u002Fsub> | \u003Csub>Description\u003C\u002Fsub> |\n|------|------|-------------|\n| \u003Csub>`create_presentation`\u003C\u002Fsub> | \u003Csub>Core\u003C\u002Fsub> | \u003Csub>Create new presentations\u003C\u002Fsub> |\n| \u003Csub>`get_presentation`\u003C\u002Fsub> | \u003Csub>Core\u003C\u002Fsub> | \u003Csub>Retrieve presentation details\u003C\u002Fsub> |\n| \u003Csub>`batch_update_presentation`\u003C\u002Fsub> | \u003Csub>Extended\u003C\u002Fsub> | \u003Csub>Apply multiple updates\u003C\u002Fsub> |\n| \u003Csub>`get_page`\u003C\u002Fsub> | \u003Csub>Extended\u003C\u002Fsub> | \u003Csub>Get specific slide information\u003C\u002Fsub> |\n| \u003Csub>`get_page_thumbnail`\u003C\u002Fsub> | \u003Csub>Extended\u003C\u002Fsub> | \u003Csub>Generate slide thumbnails\u003C\u002Fsub> |\n| \u003Csub>`list_presentation_comments`\u003C\u002Fsub> | \u003Csub>Complete\u003C\u002Fsub> | \u003Csub>List all presentation comments\u003C\u002Fsub> |\n| \u003Csub>`manage_presentation_comment`\u003C\u002Fsub> | \u003Csub>Complete\u003C\u002Fsub> | \u003Csub>Create, reply to, or resolve comments\u003C\u002Fsub> |\n\n#### 📋 Google Forms \u003Csub>[`forms_tools.py`](gforms\u002Fforms_tools.py)\u003C\u002Fsub>\n\n| \u003Csub>Tool\u003C\u002Fsub> | \u003Csub>Tier\u003C\u002Fsub> | \u003Csub>Description\u003C\u002Fsub> |\n|------|------|-------------|\n| \u003Csub>`create_form`\u003C\u002Fsub> | \u003Csub>Core\u003C\u002Fsub> | \u003Csub>Create new forms\u003C\u002Fsub> |\n| \u003Csub>`get_form`\u003C\u002Fsub> | \u003Csub>Core\u003C\u002Fsub> | \u003Csub>Retrieve form details & URLs\u003C\u002Fsub> |\n| \u003Csub>`set_publish_settings`\u003C\u002Fsub> | \u003Csub>Complete\u003C\u002Fsub> | \u003Csub>Configure form settings\u003C\u002Fsub> |\n| \u003Csub>`get_form_response`\u003C\u002Fsub> | \u003Csub>Complete\u003C\u002Fsub> | \u003Csub>Get individual responses\u003C\u002Fsub> |\n| \u003Csub>`list_form_responses`\u003C\u002Fsub> | \u003Csub>Extended\u003C\u002Fsub> | \u003Csub>List all responses with pagination\u003C\u002Fsub> |\n| \u003Csub>`batch_update_form`\u003C\u002Fsub> | \u003Csub>Complete\u003C\u002Fsub> | \u003Csub>Apply batch updates (questions, settings)\u003C\u002Fsub> |\n\n#### ✓ Google Tasks \u003Csub>[`tasks_tools.py`](gtasks\u002Ftasks_tools.py)\u003C\u002Fsub>\n\n| \u003Csub>Tool\u003C\u002Fsub> | \u003Csub>Tier\u003C\u002Fsub> | \u003Csub>Description\u003C\u002Fsub> |\n|------|------|-------------|\n| \u003Csub>`list_tasks`\u003C\u002Fsub> | \u003Csub>Core\u003C\u002Fsub> | \u003Csub>List tasks with filtering\u003C\u002Fsub> |\n| \u003Csub>`get_task`\u003C\u002Fsub> | \u003Csub>Core\u003C\u002Fsub> | \u003Csub>Retrieve task details\u003C\u002Fsub> |\n| \u003Csub>`manage_task`\u003C\u002Fsub> | \u003Csub>Core\u003C\u002Fsub> | \u003Csub>Create, update, delete, or move tasks\u003C\u002Fsub> |\n| \u003Csub>`list_task_lists`\u003C\u002Fsub> | \u003Csub>Complete\u003C\u002Fsub> | \u003Csub>List task lists\u003C\u002Fsub> |\n| \u003Csub>`get_task_list`\u003C\u002Fsub> | \u003Csub>Complete\u003C\u002Fsub> | \u003Csub>Get task list details\u003C\u002Fsub> |\n| \u003Csub>`manage_task_list`\u003C\u002Fsub> | \u003Csub>Complete\u003C\u002Fsub> | \u003Csub>Create, update, delete task lists, or clear completed tasks\u003C\u002Fsub> |\n\n#### 👤 Google Contacts \u003Csub>[`contacts_tools.py`](gcontacts\u002Fcontacts_tools.py)\u003C\u002Fsub>\n\n| \u003Csub>Tool\u003C\u002Fsub> | \u003Csub>Tier\u003C\u002Fsub> | \u003Csub>Description\u003C\u002Fsub> |\n|------|------|-------------|\n| \u003Csub>`search_contacts`\u003C\u002Fsub> | \u003Csub>Core\u003C\u002Fsub> | \u003Csub>Search contacts by name, email, phone\u003C\u002Fsub> |\n| \u003Csub>`get_contact`\u003C\u002Fsub> | \u003Csub>Core\u003C\u002Fsub> | \u003Csub>Retrieve detailed contact info\u003C\u002Fsub> |\n| \u003Csub>`list_contacts`\u003C\u002Fsub> | \u003Csub>Core\u003C\u002Fsub> | \u003Csub>List contacts with pagination\u003C\u002Fsub> |\n| \u003Csub>`manage_contact`\u003C\u002Fsub> | \u003Csub>Core\u003C\u002Fsub> | \u003Csub>Create, update, or delete contacts\u003C\u002Fsub> |\n| \u003Csub>`list_contact_groups`\u003C\u002Fsub> | \u003Csub>Extended\u003C\u002Fsub> | \u003Csub>List contact groups\u002Flabels\u003C\u002Fsub> |\n| \u003Csub>`get_contact_group`\u003C\u002Fsub> | \u003Csub>Extended\u003C\u002Fsub> | \u003Csub>Get group details with members\u003C\u002Fsub> |\n| \u003Csub>`manage_contacts_batch`\u003C\u002Fsub> | \u003Csub>Complete\u003C\u002Fsub> | \u003Csub>Batch create, update, or delete contacts\u003C\u002Fsub> |\n| \u003Csub>`manage_contact_group`\u003C\u002Fsub> | \u003Csub>Complete\u003C\u002Fsub> | \u003Csub>Create, update, delete groups, or modify membership\u003C\u002Fsub> |\n\n#### 💬 Google Chat \u003Csub>[`chat_tools.py`](gchat\u002Fchat_tools.py)\u003C\u002Fsub>\n\n| \u003Csub>Tool\u003C\u002Fsub> | \u003Csub>Tier\u003C\u002Fsub> | \u003Csub>Description\u003C\u002Fsub> |\n|------|------|-------------|\n| \u003Csub>`list_spaces`\u003C\u002Fsub> | \u003Csub>Extended\u003C\u002Fsub> | \u003Csub>List chat spaces\u002Frooms\u003C\u002Fsub> |\n| \u003Csub>`get_messages`\u003C\u002Fsub> | \u003Csub>Core\u003C\u002Fsub> | \u003Csub>Retrieve space messages\u003C\u002Fsub> |\n| \u003Csub>`send_message`\u003C\u002Fsub> | \u003Csub>Core\u003C\u002Fsub> | \u003Csub>Send messages to spaces\u003C\u002Fsub> |\n| \u003Csub>`search_messages`\u003C\u002Fsub> | \u003Csub>Core\u003C\u002Fsub> | \u003Csub>Search across chat history\u003C\u002Fsub> |\n| \u003Csub>`create_reaction`\u003C\u002Fsub> | \u003Csub>Core\u003C\u002Fsub> | \u003Csub>Add emoji reaction to a message\u003C\u002Fsub> |\n| \u003Csub>`download_chat_attachment`\u003C\u002Fsub> | \u003Csub>Extended\u003C\u002Fsub> | \u003Csub>Download attachment from a chat message\u003C\u002Fsub> |\n\n#### 🔍 Google Custom Search \u003Csub>[`search_tools.py`](gsearch\u002Fsearch_tools.py)\u003C\u002Fsub>\n\n| \u003Csub>Tool\u003C\u002Fsub> | \u003Csub>Tier\u003C\u002Fsub> | \u003Csub>Description\u003C\u002Fsub> |\n|------|------|-------------|\n| \u003Csub>`search_custom`\u003C\u002Fsub> | \u003Csub>Core\u003C\u002Fsub> | \u003Csub>Perform web searches (supports site restrictions via sites parameter)\u003C\u002Fsub> |\n| \u003Csub>`get_search_engine_info`\u003C\u002Fsub> | \u003Csub>Complete\u003C\u002Fsub> | \u003Csub>Retrieve search engine metadata\u003C\u002Fsub> |\n\n#### ⚡ Google Apps Script \u003Csub>[`apps_script_tools.py`](gappsscript\u002Fapps_script_tools.py)\u003C\u002Fsub>\n\n| \u003Csub>Tool\u003C\u002Fsub> | \u003Csub>Tier\u003C\u002Fsub> | \u003Csub>Description\u003C\u002Fsub> |\n|------|------|-------------|\n| \u003Csub>`list_script_projects`\u003C\u002Fsub> | \u003Csub>Core\u003C\u002Fsub> | \u003Csub>List accessible Apps Script projects\u003C\u002Fsub> |\n| \u003Csub>`get_script_project`\u003C\u002Fsub> | \u003Csub>Core\u003C\u002Fsub> | \u003Csub>Get complete project with all files\u003C\u002Fsub> |\n| \u003Csub>`get_script_content`\u003C\u002Fsub> | \u003Csub>Core\u003C\u002Fsub> | \u003Csub>Retrieve specific file content\u003C\u002Fsub> |\n| \u003Csub>`create_script_project`\u003C\u002Fsub> | \u003Csub>Core\u003C\u002Fsub> | \u003Csub>Create new standalone or bound project\u003C\u002Fsub> |\n| \u003Csub>`update_script_content`\u003C\u002Fsub> | \u003Csub>Core\u003C\u002Fsub> | \u003Csub>Update or create script files\u003C\u002Fsub> |\n| \u003Csub>`run_script_function`\u003C\u002Fsub> | \u003Csub>Core\u003C\u002Fsub> | \u003Csub>Execute function with parameters\u003C\u002Fsub> |\n| \u003Csub>`list_deployments`\u003C\u002Fsub> | \u003Csub>Extended\u003C\u002Fsub> | \u003Csub>List all project deployments\u003C\u002Fsub> |\n| \u003Csub>`manage_deployment`\u003C\u002Fsub> | \u003Csub>Extended\u003C\u002Fsub> | \u003Csub>Create, update, or delete script deployments\u003C\u002Fsub> |\n| \u003Csub>`list_script_processes`\u003C\u002Fsub> | \u003Csub>Extended\u003C\u002Fsub> | \u003Csub>View recent executions and status\u003C\u002Fsub> |\n\n\u003Csub>\n\n**Tool Tier Legend:**\u003Cbr>\n\u003Cspan style=\"color:#2d5b69\">●\u003C\u002Fspan> **Core** — Essential tools for basic functionality · Minimal API usage · Getting started\u003Cbr>\n\u003Cspan style=\"color:#72898f\">●\u003C\u002Fspan> **Extended** — Core + additional features · Regular usage · Expanded capabilities\u003Cbr>\n\u003Cspan style=\"color:#adbcbc\">●\u003C\u002Fspan> **Complete** — All available tools including advanced features · Power users · Full API access\n\n\u003C\u002Fsub>\n\n---\n\n### Connect to Claude Desktop\n\nThe server supports two transport modes:\n\n#### Stdio Mode (Legacy - For Clients with Incomplete MCP Support)\n\n> **⚠️ Important**: Stdio mode is a **legacy fallback** for clients that don't properly implement the MCP specification with OAuth 2.1 and streamable HTTP support. **Claude Code and other modern MCP clients should use streamable HTTP mode** (`--transport streamable-http`) for proper OAuth flow and multi-user support.\n\nIn general, you should use the one-click DXT installer package for Claude Desktop.\nIf you are unable to for some reason, you can configure it manually via `claude_desktop_config.json`\n\n**Manual Claude Configuration (Alternative)**\n\n\u003Cdetails open>\n\u003Csummary>📝 \u003Cb>Claude Desktop JSON Config\u003C\u002Fb> \u003Csub>\u003Csup>← Click for manual setup instructions\u003C\u002Fsup>\u003C\u002Fsub>\u003C\u002Fsummary>\n\n1. Open Claude Desktop Settings → Developer → Edit Config\n   - **macOS**: `~\u002FLibrary\u002FApplication Support\u002FClaude\u002Fclaude_desktop_config.json`\n   - **Windows**: `%APPDATA%\\Claude\\claude_desktop_config.json`\n\n2. Add the server configuration:\n```json\n{\n  \"mcpServers\": {\n    \"google_workspace\": {\n      \"command\": \"uvx\",\n      \"args\": [\"workspace-mcp\"],\n      \"env\": {\n        \"GOOGLE_OAUTH_CLIENT_ID\": \"your-client-id\",\n        \"GOOGLE_OAUTH_CLIENT_SECRET\": \"your-secret\",\n        \"OAUTHLIB_INSECURE_TRANSPORT\": \"1\"\n      }\n    }\n  }\n}\n```\n\u003C\u002Fdetails>\n\n### Connect to LM Studio\n\nAdd a new MCP server in LM Studio (Settings → MCP Servers) using the same JSON format:\n\n```json\n{\n  \"mcpServers\": {\n    \"google_workspace\": {\n      \"command\": \"uvx\",\n      \"args\": [\"workspace-mcp\"],\n      \"env\": {\n        \"GOOGLE_OAUTH_CLIENT_ID\": \"your-client-id\",\n        \"GOOGLE_OAUTH_CLIENT_SECRET\": \"your-secret\",\n        \"OAUTHLIB_INSECURE_TRANSPORT\": \"1\",\n      }\n    }\n  }\n}\n```\n\n\n### 2. Advanced \u002F Cross-Platform Installation\n\nIf you’re developing, deploying to servers, or using another MCP-capable client, keep reading.\n\n#### Instant CLI (uvx)\n\n\u003Cdetails open>\n\u003Csummary>⚡ \u003Cb>Quick Start with uvx\u003C\u002Fb> \u003Csub>\u003Csup>← No installation required!\u003C\u002Fsup>\u003C\u002Fsub>\u003C\u002Fsummary>\n\n```bash\n# Requires Python 3.10+ and uvx\n# First, set credentials (see Credential Configuration above)\nuvx workspace-mcp --tool-tier core  # or --tools gmail drive calendar\n```\n\n> **Note**: Configure [OAuth credentials](#credential-configuration) before running. Supports environment variables, `.env` file, or `client_secret.json`.\n\n\u003C\u002Fdetails>\n\n### Local Development Setup\n\n\u003Cdetails open>\n\u003Csummary>🛠️ \u003Cb>Developer Workflow\u003C\u002Fb> \u003Csub>\u003Csup>← Install deps, lint, and test\u003C\u002Fsup>\u003C\u002Fsub>\u003C\u002Fsummary>\n\n```bash\n# Install everything needed for linting, tests, and release tooling\nuv sync --group dev\n\n# Run the same linter that git hooks invoke automatically\nuv run ruff check .\n\n# Execute the full test suite (async fixtures require pytest-asyncio)\nuv run pytest\n```\n\n- `uv sync --group test` installs only the testing stack if you need a slimmer environment.\n- `uv run main.py --transport streamable-http` launches the server with your checked-out code for manual verification.\n- Ruff is part of the `dev` group because pre-push hooks call `ruff check` automatically—run it locally before committing to avoid hook failures.\n\n\u003C\u002Fdetails>\n\n### OAuth 2.1 Support (Multi-User Bearer Token Authentication)\n\nThe server includes OAuth 2.1 support for bearer token authentication, enabling multi-user session management. **OAuth 2.1 automatically reuses your existing `GOOGLE_OAUTH_CLIENT_ID` and `GOOGLE_OAUTH_CLIENT_SECRET` credentials** - no additional configuration needed!\n\n**When to use OAuth 2.1:**\n- Multiple users accessing the same MCP server instance\n- Need for bearer token authentication instead of passing user emails\n- Building web applications or APIs on top of the MCP server\n- Production environments requiring secure session management\n- Browser-based clients requiring CORS support\n\n**⚠️ Important: OAuth 2.1 and Single-User Mode are mutually exclusive**\n\nOAuth 2.1 mode (`MCP_ENABLE_OAUTH21=true`) cannot be used together with the `--single-user` flag:\n- **Single-user mode**: For legacy clients that pass user emails in tool calls\n- **OAuth 2.1 mode**: For modern multi-user scenarios with bearer token authentication\n\nChoose one authentication method - using both will result in a startup error.\n\n**Enabling OAuth 2.1:**\nTo enable OAuth 2.1, set the `MCP_ENABLE_OAUTH21` environment variable to `true`.\n\n```bash\n# OAuth 2.1 requires HTTP transport mode\nexport MCP_ENABLE_OAUTH21=true\nuv run main.py --transport streamable-http\n```\n\nIf `MCP_ENABLE_OAUTH21` is not set to `true`, the server will use legacy authentication, which is suitable for clients that do not support OAuth 2.1.\n\n\u003Cdetails open>\n\u003Csummary>🔐 \u003Cb>How the FastMCP GoogleProvider handles OAuth\u003C\u002Fb> \u003Csub>\u003Csup>← Advanced OAuth 2.1 details\u003C\u002Fsup>\u003C\u002Fsub>\u003C\u002Fsummary>\n\nFastMCP ships a native `GoogleProvider` that we now rely on directly. It solves the two tricky parts of using Google OAuth with MCP clients:\n\n1.  **Dynamic Client Registration**: Google still doesn't support OAuth 2.1 DCR, but the FastMCP provider exposes the full DCR surface and forwards registrations to Google using your fixed credentials. MCP clients register as usual and the provider hands them your Google client ID\u002Fsecret under the hood.\n\n2.  **CORS & Browser Compatibility**: The provider includes an OAuth proxy that serves all discovery, authorization, and token endpoints with proper CORS headers. We no longer maintain custom `\u002Foauth2\u002F*` routes—the provider handles the upstream exchanges securely and advertises the correct metadata to clients.\n\nThe result is a leaner server that still enables any OAuth 2.1 compliant client (including browser-based ones) to authenticate through Google without bespoke code.\n\n\u003C\u002Fdetails>\n\n### Stateless Mode (Container-Friendly)\n\nThe server supports a stateless mode designed for containerized environments where file system writes should be avoided:\n\n**Enabling Stateless Mode:**\n```bash\n# Stateless mode requires OAuth 2.1 to be enabled\nexport MCP_ENABLE_OAUTH21=true\nexport WORKSPACE_MCP_STATELESS_MODE=true\nuv run main.py --transport streamable-http\n```\n\n**Key Features:**\n- **No file system writes**: Credentials are never written to disk\n- **No debug logs**: File-based logging is completely disabled\n- **Memory-only sessions**: All tokens stored in memory via OAuth 2.1 session store\n- **Container-ready**: Perfect for Docker, Kubernetes, and serverless deployments\n- **Token per request**: Each request must include a valid Bearer token\n\n**Requirements:**\n- Must be used with `MCP_ENABLE_OAUTH21=true`\n- Incompatible with single-user mode\n- Clients must handle OAuth flow and send valid tokens with each request\n\nThis mode is ideal for:\n- Cloud deployments where persistent storage is unavailable\n- Multi-tenant environments requiring strict isolation\n- Containerized applications with read-only filesystems\n- Serverless functions and ephemeral compute environments\n\n**MCP Inspector**: No additional configuration needed with desktop OAuth client.\n\n**Claude Code**: No additional configuration needed with desktop OAuth client.\n\n### OAuth Proxy Storage Backends\n\nThe server supports pluggable storage backends for OAuth proxy state management via FastMCP 2.13.0+. Choose a backend based on your deployment needs.\n\n**Available Backends:**\n\n| Backend | Best For | Persistence | Multi-Server |\n|---------|----------|-------------|--------------|\n| Memory | Development, testing | ❌ | ❌ |\n| Disk | Single-server production | ✅ | ❌ |\n| Valkey\u002FRedis | Distributed production | ✅ | ✅ |\n\n**Configuration:**\n\n```bash\n# Memory storage (fast, no persistence)\nexport WORKSPACE_MCP_OAUTH_PROXY_STORAGE_BACKEND=memory\n\n# Disk storage (persists across restarts)\nexport WORKSPACE_MCP_OAUTH_PROXY_STORAGE_BACKEND=disk\nexport WORKSPACE_MCP_OAUTH_PROXY_DISK_DIRECTORY=~\u002F.fastmcp\u002Foauth-proxy\n\n# Valkey\u002FRedis storage (distributed, multi-server)\nexport WORKSPACE_MCP_OAUTH_PROXY_STORAGE_BACKEND=valkey\nexport WORKSPACE_MCP_OAUTH_PROXY_VALKEY_HOST=redis.example.com\nexport WORKSPACE_MCP_OAUTH_PROXY_VALKEY_PORT=6379\n```\n\n> Disk support requires `workspace-mcp[disk]` (or `py-key-value-aio[disk]`) when installing from source.\n> The official Docker image includes the `disk` extra by default.\n> Valkey support is optional. Install `workspace-mcp[valkey]` (or `py-key-value-aio[valkey]`) only if you enable the Valkey backend.\n> Windows: building `valkey-glide` from source requires MSVC C++ build tools with C11 support. If you see `aws-lc-sys` C11 errors, set `CFLAGS=\u002Fstd:c11`.\n\n\u003Cdetails open>\n\u003Csummary>🔐 \u003Cb>Valkey\u002FRedis Configuration Options\u003C\u002Fb>\u003C\u002Fsummary>\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `WORKSPACE_MCP_OAUTH_PROXY_VALKEY_HOST` | localhost | Valkey\u002FRedis host |\n| `WORKSPACE_MCP_OAUTH_PROXY_VALKEY_PORT` | 6379 | Port (6380 auto-enables TLS) |\n| `WORKSPACE_MCP_OAUTH_PROXY_VALKEY_DB` | 0 | Database number |\n| `WORKSPACE_MCP_OAUTH_PROXY_VALKEY_USE_TLS` | auto | Enable TLS (auto if port 6380) |\n| `WORKSPACE_MCP_OAUTH_PROXY_VALKEY_USERNAME` | - | Authentication username |\n| `WORKSPACE_MCP_OAUTH_PROXY_VALKEY_PASSWORD` | - | Authentication password |\n| `WORKSPACE_MCP_OAUTH_PROXY_VALKEY_REQUEST_TIMEOUT_MS` | 5000 | Request timeout for remote hosts |\n| `WORKSPACE_MCP_OAUTH_PROXY_VALKEY_CONNECTION_TIMEOUT_MS` | 10000 | Connection timeout for remote hosts |\n\n**Encryption:** Disk and Valkey storage are encrypted with Fernet. The encryption key is derived from `FASTMCP_SERVER_AUTH_GOOGLE_JWT_SIGNING_KEY` if set, otherwise from `GOOGLE_OAUTH_CLIENT_SECRET`.\n\n\u003C\u002Fdetails>\n\n### External OAuth 2.1 Provider Mode\n\nThe server supports an external OAuth 2.1 provider mode for scenarios where authentication is handled by an external system. In this mode, the MCP server does not manage the OAuth flow itself but expects valid bearer tokens in the Authorization header of tool calls.\n\n**Enabling External OAuth 2.1 Provider Mode:**\n```bash\n# External OAuth provider mode requires OAuth 2.1 to be enabled\nexport MCP_ENABLE_OAUTH21=true\nexport EXTERNAL_OAUTH21_PROVIDER=true\nuv run main.py --transport streamable-http\n```\n\n**How It Works:**\n- **Protocol-level auth enabled**: All MCP requests (including `initialize` and `tools\u002Flist`) require a valid Bearer token, following the standard OAuth 2.1 flow. Unauthenticated requests receive a `401` with resource metadata pointing to Google's authorization server.\n- **External OAuth flow**: Your external system handles the OAuth flow and obtains Google access tokens (`ya29.*`)\n- **Token validation**: Server validates bearer tokens by calling Google's userinfo API\n- **Multi-user support**: Each request is authenticated independently based on its bearer token\n- **Resource metadata discovery**: The server serves `\u002F.well-known\u002Foauth-protected-resource` (RFC 9728) advertising Google as the authorization server and the required scopes\n\n**Key Features:**\n- **No local OAuth flow**: Server does not provide `\u002Fauthorize`, `\u002Ftoken`, or `\u002Fregister` endpoints — only resource metadata\n- **Bearer token only**: All authentication via `Authorization: Bearer \u003Ctoken>` headers\n- **Stateless by design**: Works seamlessly with `WORKSPACE_MCP_STATELESS_MODE=true`\n- **External identity providers**: Integrate with your existing authentication infrastructure\n\n**Requirements:**\n- Must be used with `MCP_ENABLE_OAUTH21=true`\n- OAuth credentials still required for token validation (`GOOGLE_OAUTH_CLIENT_ID`, `GOOGLE_OAUTH_CLIENT_SECRET`)\n- External system must obtain valid Google OAuth access tokens (ya29.*)\n- Each tool call request must include valid bearer token\n\n**Use Cases:**\n- Integrating with existing authentication systems\n- Custom OAuth flows managed by your application\n- API gateways that handle authentication upstream\n- Multi-tenant SaaS applications with centralized auth\n- Mobile or web apps with their own OAuth implementation\n\n\n### VS Code MCP Client Support\n\n> **✅ Recommended**: VS Code MCP extension properly supports the full MCP specification. **Always use HTTP transport mode** for proper OAuth 2.1 authentication.\n\n\u003Cdetails open>\n\u003Csummary>🆚 \u003Cb>VS Code Configuration\u003C\u002Fb> \u003Csub>\u003Csup>← Setup for VS Code MCP extension\u003C\u002Fsup>\u003C\u002Fsub>\u003C\u002Fsummary>\n\n```json\n{\n    \"servers\": {\n        \"google-workspace\": {\n            \"url\": \"http:\u002F\u002Flocalhost:8000\u002Fmcp\u002F\",\n            \"type\": \"http\"\n        }\n    }\n}\n```\n\n*Note: Make sure to start the server with `--transport streamable-http` when using VS Code MCP.*\n\u003C\u002Fdetails>\n\n### Claude Code MCP Client Support\n\n> **✅ Recommended**: Claude Code is a modern MCP client that properly supports the full MCP specification. **Always use HTTP transport mode** with Claude Code for proper OAuth 2.1 authentication and multi-user support.\n\n\u003Cdetails open>\n\u003Csummary>🆚 \u003Cb>Claude Code Configuration\u003C\u002Fb> \u003Csub>\u003Csup>← Setup for Claude Code MCP support\u003C\u002Fsup>\u003C\u002Fsub>\u003C\u002Fsummary>\n\n```bash\n# Start the server in HTTP mode first\nuv run main.py --transport streamable-http\n\n# Then add to Claude Code\nclaude mcp add --transport http workspace-mcp http:\u002F\u002Flocalhost:8000\u002Fmcp\n```\n\u003C\u002Fdetails>\n\n#### Reverse Proxy Setup\n\nIf you're running the MCP server behind a reverse proxy (nginx, Apache, Cloudflare, etc.), you have two configuration options:\n\n**Problem**: When behind a reverse proxy, the server constructs OAuth URLs using internal ports (e.g., `http:\u002F\u002Flocalhost:8000`) but external clients need the public URL (e.g., `https:\u002F\u002Fyour-domain.com`).\n\n**Solution 1**: Set `WORKSPACE_EXTERNAL_URL` for all OAuth endpoints:\n```bash\n# This configures all OAuth endpoints to use your external URL\nexport WORKSPACE_EXTERNAL_URL=\"https:\u002F\u002Fyour-domain.com\"\n```\n\n**Solution 2**: Set `GOOGLE_OAUTH_REDIRECT_URI` for just the callback:\n```bash\n# This only overrides the OAuth callback URL\nexport GOOGLE_OAUTH_REDIRECT_URI=\"https:\u002F\u002Fyour-domain.com\u002Foauth2callback\"\n```\n\nYou also have options for:\n| `OAUTH_CUSTOM_REDIRECT_URIS` *(optional)* | Comma-separated list of additional redirect URIs |\n| `OAUTH_ALLOWED_ORIGINS` *(optional)* | Comma-separated list of additional CORS origins |\n\n**Important**:\n- Use `WORKSPACE_EXTERNAL_URL` when all OAuth endpoints should use the external URL (recommended for reverse proxy setups)\n- Use `GOOGLE_OAUTH_REDIRECT_URI` when you only need to override the callback URL\n- The redirect URI must exactly match what's configured in your Google Cloud Console\n- Your reverse proxy must forward OAuth-related requests (`\u002Foauth2callback`, `\u002Foauth2\u002F*`, `\u002F.well-known\u002F*`) to the MCP server\n\n\u003Cdetails open>\n\u003Csummary>🚀 \u003Cb>Advanced uvx Commands\u003C\u002Fb> \u003Csub>\u003Csup>← More startup options\u003C\u002Fsup>\u003C\u002Fsub>\u003C\u002Fsummary>\n\n```bash\n# Configure credentials first (see Credential Configuration section)\n\n# Start with specific tools only\nuvx workspace-mcp --tools gmail drive calendar tasks\n\n# Start with tool tiers (recommended for most users)\nuvx workspace-mcp --tool-tier core      # Essential tools\nuvx workspace-mcp --tool-tier extended  # Core + additional features\nuvx workspace-mcp --tool-tier complete  # All tools\n\n# Start in HTTP mode for debugging\nuvx workspace-mcp --transport streamable-http\n```\n\u003C\u002Fdetails>\n\n*Requires Python 3.10+ and [uvx](https:\u002F\u002Fgithub.com\u002Fastral-sh\u002Fuv). The package is available on [PyPI](https:\u002F\u002Fpypi.org\u002Fproject\u002Fworkspace-mcp).*\n\n### Development Installation\n\nFor development or customization:\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp.git\ncd google_workspace_mcp\nuv run main.py\n```\n\n**Development Installation (For Contributors)**:\n\n\u003Cdetails open>\n\u003Csummary>🔧 \u003Cb>Developer Setup JSON\u003C\u002Fb> \u003Csub>\u003Csup>← For contributors & customization\u003C\u002Fsup>\u003C\u002Fsub>\u003C\u002Fsummary>\n\n```json\n{\n  \"mcpServers\": {\n    \"google_workspace\": {\n      \"command\": \"uv\",\n      \"args\": [\n        \"run\",\n        \"--directory\",\n        \"\u002Fpath\u002Fto\u002Frepo\u002Fgoogle_workspace_mcp\",\n        \"main.py\"\n      ],\n      \"env\": {\n        \"GOOGLE_OAUTH_CLIENT_ID\": \"your-client-id\",\n        \"GOOGLE_OAUTH_CLIENT_SECRET\": \"your-secret\",\n        \"OAUTHLIB_INSECURE_TRANSPORT\": \"1\"\n      }\n    }\n  }\n}\n```\n\u003C\u002Fdetails>\n\n#### HTTP Mode (For debugging or web interfaces)\nIf you need to use HTTP mode with Claude Desktop:\n\n```json\n{\n  \"mcpServers\": {\n    \"google_workspace\": {\n      \"command\": \"npx\",\n      \"args\": [\"mcp-remote\", \"http:\u002F\u002Flocalhost:8000\u002Fmcp\"]\n    }\n  }\n}\n```\n\n*Note: Make sure to start the server with `--transport streamable-http` when using HTTP mode.*\n\n### First-Time Authentication\n\nThe server uses **Google Desktop OAuth** for simplified authentication:\n\n- **No redirect URIs needed**: Desktop OAuth clients handle authentication without complex callback URLs\n- **Automatic flow**: The server manages the entire OAuth process transparently\n- **Transport-agnostic**: Works seamlessly in both stdio and HTTP modes\n\nWhen calling a tool:\n1. Server returns authorization URL\n2. Open URL in browser and authorize\n3. Google provides an authorization code\n4. Paste the code when prompted (or it's handled automatically)\n5. Server completes authentication and retries your request\n\n---\n\n## \u003Cspan style=\"color:#adbcbc\">◆ Development\u003C\u002Fspan>\n\n### \u003Cspan style=\"color:#72898f\">Project Structure\u003C\u002Fspan>\n\n```\ngoogle_workspace_mcp\u002F\n├── auth\u002F              # Authentication system with decorators\n├── core\u002F              # MCP server and utilities\n├── g{service}\u002F        # Service-specific tools\n├── main.py            # Server entry point\n├── client_secret.json # OAuth credentials (not committed)\n└── pyproject.toml     # Dependencies\n```\n\n### Adding New Tools\n\n```python\nfrom auth.service_decorator import require_google_service\n\n@require_google_service(\"drive\", \"drive_read\")  # Service + scope group\nasync def your_new_tool(service, param1: str, param2: int = 10):\n    \"\"\"Tool description\"\"\"\n    # service is automatically injected and cached\n    result = service.files().list().execute()\n    return result  # Return native Python objects\n```\n\n### Architecture Highlights\n\n- **Service Caching**: 30-minute TTL reduces authentication overhead\n- **Scope Management**: Centralized in `SCOPE_GROUPS` for easy maintenance\n- **Error Handling**: Native exceptions instead of manual error construction\n- **Multi-Service Support**: `@require_multiple_services()` for complex tools\n\n### Credential Store System\n\nThe server includes an abstract credential store API and a default backend for managing Google OAuth\ncredentials with support for multiple storage backends:\n\n**Features:**\n- **Abstract Interface**: `CredentialStore` base class defines standard operations (get, store, delete, list users)\n- **Local File Storage**: `LocalDirectoryCredentialStore` implementation stores credentials as JSON files\n- **Configurable Storage**: Environment variable `GOOGLE_MCP_CREDENTIALS_DIR` sets storage location\n- **Multi-User Support**: Store and manage credentials for multiple Google accounts\n- **Automatic Directory Creation**: Storage directory is created automatically if it doesn't exist\n\n**Configuration:**\n```bash\n# Optional: Set custom credentials directory\nexport GOOGLE_MCP_CREDENTIALS_DIR=\"\u002Fpath\u002Fto\u002Fcredentials\"\n\n# Default locations (if GOOGLE_MCP_CREDENTIALS_DIR not set):\n# - ~\u002F.google_workspace_mcp\u002Fcredentials (if home directory accessible)\n# - .\u002F.credentials (fallback)\n```\n\n**Usage Example:**\n```python\nfrom auth.credential_store import get_credential_store\n\n# Get the global credential store instance\nstore = get_credential_store()\n\n# Store credentials for a user\nstore.store_credential(\"user@example.com\", credentials)\n\n# Retrieve credentials\ncreds = store.get_credential(\"user@example.com\")\n\n# List all users with stored credentials\nusers = store.list_users()\n```\n\nThe credential store automatically handles credential serialization, expiry parsing, and provides error handling for storage operations.\n\n---\n\n## \u003Cspan style=\"color:#adbcbc\">⊠ Security\u003C\u002Fspan>\n- **Prompt Injection**: This MCP server has the capability to retrieve your email, calendar events and drive files. Those emails, events and files could potentially contain prompt injections - i.e. hidden white text that tells it to forward your emails to a different address. You should exercise caution and in general, only connect trusted data to an LLM!\n- **Credentials**: Never commit `.env`, `client_secret.json` or the `.credentials\u002F` directory to source control!\n- **OAuth Callback**: Uses `http:\u002F\u002Flocalhost:8000\u002Foauth2callback` for development (requires `OAUTHLIB_INSECURE_TRANSPORT=1`)\n- **Transport-Aware Callbacks**: Stdio mode starts a minimal HTTP server only for OAuth, ensuring callbacks work in all modes\n- **Production**: Use HTTPS & OAuth 2.1 and configure accordingly\n- **Scope Minimization**: Tools request only necessary permissions\n- **Local File Access Control**: Tools that read local files (e.g., attachments, `file:\u002F\u002F` uploads) are restricted to the user's home directory by default. Override this with the `ALLOWED_FILE_DIRS` environment variable:\n  ```bash\n  # Colon-separated list of directories (semicolon on Windows) from which local file reads are permitted\n  export ALLOWED_FILE_DIRS=\"\u002Fhome\u002Fuser\u002Fdocuments:\u002Fdata\u002Fshared\"\n  ```\n  Regardless of the allowlist, access to sensitive paths (`.env`, `.ssh\u002F`, `.aws\u002F`, `\u002Fetc\u002Fshadow`, credential files, etc.) is always blocked.\n\n---\n\n\n---\n\n## \u003Cspan style=\"color:#adbcbc\">≡ License\u003C\u002Fspan>\n\nMIT License - see `LICENSE` file for details.\n\n---\n\nValidations:\n[![MCP Badge](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Ftaylorwilsdon_google_workspace_mcp_readme_6533e1db5b36.png)](https:\u002F\u002Flobehub.com\u002Fmcp\u002Ftaylorwilsdon-google_workspace_mcp)\n\n[![Verified on MseeP](https:\u002F\u002Fmseep.ai\u002Fbadge.svg)](https:\u002F\u002Fmseep.ai\u002Fapp\u002Feebbc4a6-0f8c-41b2-ace8-038e5516dba0)\n\n\n\u003Cdiv align=\"center\">\n\u003Cimg width=\"842\" alt=\"Batch Emails\" src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Ftaylorwilsdon_google_workspace_mcp_readme_f53ea62a59bd.png\" \u002F>\n\u003C\u002Fdiv>\n","\u003C!-- mcp-name: io.github.taylorwilsdon\u002Fworkspace-mcp -->\n\n\u003Cdiv align=\"center\">\n\n# \u003Cspan style=\"color:#cad8d9\">Google Workspace MCP 服务器\u003C\u002Fspan> \u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Ftaylorwilsdon_google_workspace_mcp_readme_1b5b70028737.png\" width=\"80\" align=\"right\" \u002F>\n\n[![许可证：MIT](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FLicense-MIT-yellow.svg)](https:\u002F\u002Fopensource.org\u002Flicenses\u002FMIT)\n[![Python 3.10+](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FPython-3.10%2B-blue.svg)](https:\u002F\u002Fwww.python.org\u002Fdownloads\u002F)\n[![PyPI](https:\u002F\u002Fimg.shields.io\u002Fpypi\u002Fv\u002Fworkspace-mcp.svg)](https:\u002F\u002Fpypi.org\u002Fproject\u002Fworkspace-mcp\u002F)\n[![PyPI 下载量](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Ftaylorwilsdon_google_workspace_mcp_readme_d474481733b0.png)](https:\u002F\u002Fpepy.tech\u002Fprojects\u002Fworkspace-mcp)\n[![官网](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FWebsite-workspacemcp.com-green.svg)](https:\u002F\u002Fworkspacemcp.com)\n\n*通过所有 MCP 客户端、AI 助手和开发者工具，实现对 Google 日历、云端硬盘、Gmail、文档、表格、幻灯片、表单、任务、联系人和聊天的完全自然语言控制。包含功能齐全的命令行界面，可与 Claude Code 和 Codex 等工具配合使用！*\n\n**功能最全面的 Google Workspace MCP 服务器**，支持远程 OAuth2.1 多用户认证，并提供一键式 Claude 安装。凭借原生 OAuth 2.1、无状态模式和外部认证服务器支持，它是唯一一款可供整个组织集中且安全托管的 Workspace MCP！\n\n###### 支持所有免费 Google 账号（Gmail、文档、云端硬盘等）及 Google Workspace 各种方案（Starter、Standard、Plus、Enterprise、Non Profit），并扩展了聊天和 Spaces 等应用选项。\u003Cbr\u002F>\u003Cbr \u002F> 您是否对私有、托管云实例感兴趣？[我们可以安排。](https:\u002F\u002Fworkspacemcp.com\u002Fworkspace-mcp-cloud)\n\n\n\u003C\u002Fdiv>\n\n\u003Cdiv align=\"center\">\n\u003Ca href=\"https:\u002F\u002Fwww.pulsemcp.com\u002Fservers\u002Ftaylorwilsdon-google-workspace\">\n\u003Cimg width=\"375\" src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Ftaylorwilsdon_google_workspace_mcp_readme_61f51ba916c3.png\" align=\"center\"\u002F>\n\u003C\u002Fa>\n\u003C\u002Fdiv>\n\n---\n\n\u003Cdiv align=\"center\">\n\u003Ctable>\n\u003Ctr>\n\u003Ctd align=\"center\">\n\u003Cb>⚡ 开始\u003C\u002Fb>\u003Cbr>\n\u003Csub>\n\u003Ca href=\"#quick-start\">快速入门\u003C\u002Fa> · \u003Ca href=\"#prerequisites\">先决条件\u003C\u002Fa>\u003Cbr>\n\u003Ca href=\"#configuration\">Google Cloud\u003C\u002Fa> · \u003Ca href=\"#-credential-configuration\">凭据配置\u003C\u002Fa>\n\u003C\u002Fsub>\n\u003C\u002Ftd>\n\u003Ctd align=\"center\">\n\u003Cb>🧰 工具\u003C\u002Fb>\u003Cbr>\n\u003Csub>\n\u003Ca href=\"#-available-tools\">所有工具\u003C\u002Fa> · \u003Ca href=\"#tool-tiers\">工具层级\u003C\u002Fa>\u003Cbr>\n\u003Ca href=\"#cli\">命令行界面\u003C\u002Fa> · \u003Ca href=\"#start-the-server\">启动服务器\u003C\u002Fa>\n\u003C\u002Fsub>\n\u003C\u002Ftd>\n\u003Ctd align=\"center\">\n\u003Cb>🔌 连接\u003C\u002Fb>\u003Cbr>\n\u003Csub>\n\u003Ca href=\"#one-click-claude-desktop-install-claude-desktop-only-stdio-single-user\">一键安装\u003C\u002Fa> · \u003Ca href=\"#connect-to-claude-desktop\">Claude Desktop\u003C\u002Fa>\u003Cbr>\n\u003Ca href=\"#claude-code-mcp-client-support\">Claude Code\u003C\u002Fa> · \u003Ca href=\"#vs-code-mcp-client-support\">VS Code\u003C\u002Fa> · \u003Ca href=\"#connect-to-lm-studio\">LM Studio\u003C\u002Fa>\n\u003C\u002Fsub>\n\u003C\u002Ftd>\n\u003Ctd align=\"center\">\n\u003Cb>🚀 部署\u003C\u002Fb>\u003Cbr>\n\u003Csub>\n\u003Ca href=\"#oauth-21-support-multi-user-bearer-token-authentication\">OAuth 2.1\u003C\u002Fa> · \u003Ca href=\"#stateless-mode-container-friendly\">无状态模式\u003C\u002Fa>\u003Cbr>\n\u003Ca href=\"#external-oauth-21-provider-mode\">外部 OAuth\u003C\u002Fa> · \u003Ca href=\"#reverse-proxy-setup\">反向代理设置\u003C\u002Fa>\n\u003C\u002Fsub>\n\u003C\u002Ftd>\n\u003Ctd align=\"center\">\n\u003Cb>📐 开发\u003C\u002Fb>\u003Cbr>\n\u003Csub>\n\u003Ca href=\"#-development\">架构\u003C\u002Fa> · \u003Ca href=\"#local-development-setup\">开发环境搭建\u003C\u002Fa>\u003Cbr>\n\u003Ca href=\"#-security\">安全性\u003C\u002Fa> · \u003Ca href=\"#-license\">许可证\u003C\u002Fa>\n\u003C\u002Fsub>\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\n**观看实际演示：**\n\u003Cdiv align=\"center\">\n  \u003Cvideo width=\"400\" src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002Fa342ebb4-1319-4060-a974-39d202329710\">\u003C\u002Fvideo>\n\u003C\u002Fdiv>\n\n---\n\n## \u003Cspan style=\"color:#adbcbc\">概述\u003C\u002Fspan>\n\nWorkspace MCP 是集成所有主要 Google Workspace 服务与 AI 助手的最完整 MCP 服务器。它既支持单用户操作，也支持通过 OAuth 2.1 进行多用户认证，是自定义应用程序的强大后端。基于 FastMCP 构建，具有卓越性能、先进的认证处理、服务缓存和精简的开发模式。整个工具集均可用于命令行界面，支持本地和远程实例。\n\n**简化设置**：现采用 Google Desktop OAuth 客户端——无需配置重定向 URI 或端口！\n\n\n## \u003Cspan style=\"color:#adbcbc\">特性\u003C\u002Fspan>\n\n> **12 项服务** — Gmail · 云端硬盘 · 日历 · 文档 · 表格 · 幻灯片 · 表单 · 聊天 · Apps Script · 任务 · 联系人 · 搜索\n\n\u003Ctable>\n\u003Ctr>\n\u003Ctd valign=\"top\" width=\"50%\">\n\n**📧 Gmail** — 完整的电子邮件管理，端到端覆盖\u003Cbr>\n**📁 云端硬盘** — 文件操作，支持共享、权限及 Office 格式\u003Cbr>\n**📅 日历** — 全面的事件管理，具备高级功能\u003Cbr>\n**📝 文档** — 深度、精细化编辑、格式化和评论\u003Cbr>\n**📊 表格** — 灵活的单元格管理、格式化和条件规则\u003Cbr>\n**🖼️ 幻灯片** — 演示文稿创建、更新和内容操作\u003Cbr>\n**📋 表单** — 创建、发布设置和回复管理\u003Cbr>\n**💬 聊天** — 空间管理、消息传递和反应\n\n\u003C\u002Ftd>\n\u003Ctd valign=\"top\" width=\"50%\">\n\n**⚡ Apps Script** — 跨应用工作流自动化\u003Cbr>\n\u003Csub>&ensp;项目、部署、版本、执行、调试\u003C\u002Fsub>\n\n**✅ 任务** — 带层次结构的任务和清单管理\u003Cbr>\n**👤 联系人** — People API，支持群组和批量操作\u003Cbr>\n**🔍 自定义搜索** — 可编程搜索引擎集成\n\n---\n\n**🔐 认证与安全**\u003Cbr>\n\u003Csub>OAuth 2.0 和 2.1 · 自动刷新令牌 · 多用户承载令牌 · 传输感知回调 · CORS 代理\u003C\u002Fsub>\n\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftable>\n\n---\n\n## 快速入门\n\n> 设置凭据 → 选择启动命令 → 连接客户端\n\n```bash\n# 1. 凭据\nexport GOOGLE_OAUTH_CLIENT_ID=\"...\"\nexport GOOGLE_OAUTH_CLIENT_SECRET=\"...\"\n\n# 2. 启动 — 选择层级\nuvx workspace-mcp --tool-tier core       # 基础工具\nuvx workspace-mcp --tool-tier extended   # 基础 + 管理操作\nuvx workspace-mcp --tool-tier complete   # 全部\n\n# 或者选择性地运行特定服务\nuv run main.py --tools gmail drive calendar\n```\n\n\u003Csub>[凭据设置 →](#-credential-configuration) · [所有启动选项 →](#start-the-server) · [层级详情 →](#tool-tiers)\u003C\u002Fsub>\n\n\u003Cdetails open>\n\u003Csummary>\u003Cb>环境变量参考\u003C\u002Fb>\u003C\u002Fsummary>\n\u003Csub>\n\n| 变量 | | 用途 |\n|----------|:---:|---------|\n| **🔐 认证** | | |\n| `GOOGLE_OAUTH_CLIENT_ID` | **必填** | 来自 Google Cloud 的 OAuth 客户端 ID |\n| `GOOGLE_OAUTH_CLIENT_SECRET` | **必填** | OAuth 客户端密钥 |\n| `OAUTHLIB_INSECURE_TRANSPORT` | **必填**&ast; | 开发时设为 `1` — 允许使用 `http:\u002F\u002F` 重定向 |\n| `USER_GOOGLE_EMAIL` | | 单用户认证的默认邮箱 |\n| `GOOGLE_CLIENT_SECRET_PATH` | | 自定义 `client_secret.json` 文件路径 |\n| `GOOGLE_MCP_CREDENTIALS_DIR` | | 凭据存储目录 — 默认 `~\u002F.google_workspace_mcp\u002Fcredentials` |\n| **🖥️ 服务器** | | |\n| `WORKSPACE_MCP_BASE_URI` | | 服务器基础 URI（不带端口）— 默认 `http:\u002F\u002Flocalhost` |\n| `WORKSPACE_MCP_PORT` | | 监听端口 — 默认 `8000` |\n| `WORKSPACE_MCP_HOST` | | 绑定主机 — 默认 `0.0.0.0` |\n| `WORKSPACE_EXTERNAL_URL` | | 反向代理部署时的外部 URL |\n| `WORKSPACE_ATTACHMENT_DIR` | | 下载附件的目录 — 默认 `~\u002F.workspace-mcp\u002Fattachments\u002F` |\n| `WORKSPACE_MCP_URL` | | CLI 使用的远程 MCP 端点 URL |\n| `ALLOWED_FILE_DIRS` | | 本地文件读取的白名单，用冒号分隔 |\n| **🔑 OAuth 2.1 和多用户** | | |\n| `MCP_ENABLE_OAUTH21` | | 设置为 `true` 启用 OAuth 2.1 多用户支持 |\n| `EXTERNAL_OAUTH21_PROVIDER` | | 设置为 `true` 使用携带令牌的外部 OAuth 流程 |\n| `WORKSPACE_MCP_STATELESS_MODE` | | 设置为 `true` 实现无状态的容器友好型运行 |\n| `GOOGLE_OAUTH_REDIRECT_URI` | | 覆盖 OAuth 回调 URL — 默认自动构建 |\n| `OAUTH_CUSTOM_REDIRECT_URIS` | | 逗号分隔的额外重定向 URI 列表 |\n| `OAUTH_ALLOWED_ORIGINS` | | 逗号分隔的额外 CORS 域列表 |\n| `WORKSPACE_MCP_OAUTH_PROXY_STORAGE_BACKEND` | | 可选值为 `memory`、`disk` 或 `valkey` — 见 [存储后端](#oauth-proxy-storage-backends) |\n| `FASTMCP_SERVER_AUTH_GOOGLE_JWT_SIGNING_KEY` | | 用于 OAuth 代理存储的自定义加密密钥 |\n| **🔍 自定义搜索** | | |\n| `GOOGLE_PSE_API_KEY` | | 可编程搜索引擎的 API 密钥 |\n| `GOOGLE_PSE_ENGINE_ID` | | PSE 的搜索引擎 ID |\n\n&ast;仅开发时需要。Claude Desktop 会将凭据安全地存储在操作系统钥匙串中——只需在扩展设置中配置一次即可。\n\n\u003C\u002Fsub>\n\u003C\u002Fdetails>\n\n---\n\n### 一键安装 Claude Desktop\n\n> `.dxt` 包含服务器、依赖项和清单文件——下载后双击即可完成安装，无需终端操作或编辑 JSON 文件。\n\n1. **下载** 最新的 `google_workspace_mcp.dxt` 文件，访问 [Releases](https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Freleases)\n2. **安装** — 双击该文件，Claude Desktop 会提示您进行安装\n3. **配置** — 进入设置 → 扩展程序 → Google Workspace MCP，粘贴您的 OAuth 凭据\n4. **使用** — 打开一个新的 Claude 对话，即可调用任何 Google Workspace 工具\n\n\u003Cdiv align=\"center\">\n  \u003Cvideo width=\"832\" src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F83cca4b3-5e94-448b-acb3-6e3a27341d3a\">\u003C\u002Fvideo>\n\u003C\u002Fdiv>\n\n---\n\n### 先决条件\n\n**Python 3.10+** · **[uv\u002Fuvx](https:\u002F\u002Fgithub.com\u002Fastral-sh\u002Fuv)** · **Google Cloud 项目** 并具备 OAuth 2.0 凭据\n\n### 配置\n\n\u003Cdetails open>\n\u003Csummary>\u003Cb>Google Cloud 设置\u003C\u002Fb>\u003C\u002Fsummary>\n\n1. **创建项目** — [打开控制台 →](https:\u002F\u002Fconsole.cloud.google.com\u002F) → 创建新项目\n2. **创建 OAuth 凭据** — API 和服务 → 凭据 → 创建凭据 → OAuth 客户端 ID\n   - 选择 **桌面应用**（无需设置重定向 URI！）\n   - 下载并记下您的客户端 ID 和客户端密钥\n3. **启用 API** — API 和服务 → 库，然后逐一启用以下服务：\n\n   | | | | |\n   |:--|:--|:--|:--|\n   | [日历](https:\u002F\u002Fconsole.cloud.google.com\u002Fflows\u002Fenableapi?apiid=calendar-json.googleapis.com) | [云端硬盘](https:\u002F\u002Fconsole.cloud.google.com\u002Fflows\u002Fenableapi?apiid=drive.googleapis.com) | [Gmail](https:\u002F\u002Fconsole.cloud.google.com\u002Fflows\u002Fenableapi?apiid=gmail.googleapis.com) | [文档](https:\u002F\u002Fconsole.cloud.google.com\u002Fflows\u002Fenableapi?apiid=docs.googleapis.com) |\n   | [表格](https:\u002F\u002Fconsole.cloud.google.com\u002Fflows\u002Fenableapi?apiid=sheets.googleapis.com) | [幻灯片](https:\u002F\u002Fconsole.cloud.google.com\u002Fflows\u002Fenableapi?apiid=slides.googleapis.com) | [表单](https:\u002F\u002Fconsole.cloud.google.com\u002Fflows\u002Fenableapi?apiid=forms.googleapis.com) | [任务](https:\u002F\u002Fconsole.cloud.google.com\u002Fflows\u002Fenableapi?apiid=tasks.googleapis.com) |\n   | [Chat](https:\u002F\u002Fconsole.cloud.google.com\u002Fflows\u002Fenableapi?apiid=chat.googleapis.com) | [People](https:\u002F\u002Fconsole.cloud.google.com\u002Fflows\u002Fenableapi?apiid=people.googleapis.com) | [自定义搜索](https:\u002F\u002Fconsole.cloud.google.com\u002Fflows\u002Fenableapi?apiid=customsearch.googleapis.com) | [Apps Script](https:\u002F\u002Fconsole.cloud.google.com\u002Fflows\u002Fenableapi?apiid=script.googleapis.com) |\n\n4. **设置凭据** — 参见上方的 [环境变量参考](#quick-start)，或者：\n   ```bash\n   export GOOGLE_OAUTH_CLIENT_ID=\"your-client-id\"\n   export GOOGLE_OAUTH_CLIENT_SECRET=\"your-secret\"\n   ```\n\n\u003Csub>[完整的 OAuth 文档 →](https:\u002F\u002Fdevelopers.google.com\u002Fworkspace\u002Fguides\u002Fauth-overview) · [凭据设置详情 →](#-credential-configuration)\u003C\u002Fsub>\n\n\u003C\u002Fdetails>\n\n### Google 自定义搜索设置\n\n\u003Cdetails open>\n\u003Csummary>◆ \u003Cb>自定义搜索配置\u003C\u002Fb> \u003Csub>\u003Csup>← 启用网络搜索功能\u003C\u002Fsup>\u003C\u002Fsub>\u003C\u002Fsummary>\n\n\u003Ctable>\n\u003Ctr>\n\u003Ctd width=\"33%\" align=\"center\">\n\n**1. 创建搜索引擎**\n```text\nprogrammablesearchengine.google.com\n\u002Fcontrolpanel\u002Fcreate\n\n→ 配置特定站点或整个网页\n→ 记下您的引擎 ID (cx)\n```\n\u003Csub>[打开控制面板 →](https:\u002F\u002Fprogrammablesearchengine.google.com\u002Fcontrolpanel\u002Fcreate)\u003C\u002Fsub>\n\n\u003C\u002Ftd>\n\u003Ctd width=\"33%\" align=\"center\">\n\n**2. 获取 API 密钥**\n```text\ndevelopers.google.com\n\u002Fcustom-search\u002Fv1\u002Foverview\n\n→ 创建或选择项目\n→ 启用自定义搜索 API\n→ 创建凭据（API 密钥）\n```\n\u003Csub>[获取 API 密钥 →](https:\u002F\u002Fdevelopers.google.com\u002Fcustom-search\u002Fv1\u002Foverview)\u003C\u002Fsub>\n\n\u003C\u002Ftd>\n\u003Ctd width=\"34%\" align=\"center\">\n\n**3. 设置变量**\n```bash\nexport GOOGLE_PSE_API_KEY=\\\n  \"your-api-key\"\nexport GOOGLE_PSE_ENGINE_ID=\\\n  \"your-engine-id\"\n```\n\u003Csub>在环境变量中配置\u003C\u002Fsub>\n\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd colspan=\"3\">\n\n\u003Cdetails open>\n\u003Csummary>≡ \u003Cb>快速设置指南\u003C\u002Fb> \u003Csub>\u003Csup>← 分步说明\u003C\u002Fsup>\u003C\u002Fsub>\u003C\u002Fsummary>\n\n**完整设置流程：**\n\n1. **创建搜索引擎** - 访问 [控制面板](https:\u002F\u002Fprogrammablesearchengine.google.com\u002Fcontrolpanel\u002Fcreate)\n   - 选择“搜索整个网页”或指定特定站点\n   - 复制搜索引擎 ID（格式如：`017643444788157684527:6ivsjbpxpqw`）\n\n2. **启用 API 并获取密钥** - 访问 [Google 开发者控制台](https:\u002F\u002Fconsole.cloud.google.com\u002F)\n   - 在您的项目中启用“自定义搜索 API”\n   - 创建凭据 → API 密钥\n   - 建议将密钥限制为仅用于自定义搜索 API\n\n3. **配置环境变量** - 添加到您的 shell 或 `.env` 文件中：\n   ```bash\n   export GOOGLE_PSE_API_KEY=\"AIzaSy...\"\n   export GOOGLE_PSE_ENGINE_ID=\"01764344478...\"\n   ```\n\n≡ [完整文档 →](https:\u002F\u002Fdevelopers.google.com\u002Fcustom-search\u002Fv1\u002Foverview)\n\n\u003C\u002Fdetails>\n\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftable>\n\n\u003C\u002Fdetails>\n\n### 启动服务器\n\n> **📌 传输模式指南**：对于所有现代 MCP 客户端，包括 Claude Code、VS Code MCP 和 MCP Inspector，请使用 **流式 HTTP 模式**（`--transport streamable-http`）。Stdio 模式仅适用于不完全支持 MCP 规范的客户端。\n\n\u003Cdetails open>\n\u003Csummary>▶ \u003Cb>启动命令\u003C\u002Fb> \u003Csub>\u003Csup>← 选择您的启动模式\u003C\u002Fsup>\u003C\u002Fsub>\u003C\u002Fsummary>\n\n\u003Ctable>\n\u003Ctr>\n\u003Ctd width=\"33%\" align=\"center\">\n\n**▶ 传统模式**\n```bash\nuv run main.py\n```\n\u003Csub>⚠️ Stdio 模式（仅限不完全支持 MCP 的客户端）\u003C\u002Fsub>\n\n\u003C\u002Ftd>\n\u003Ctd width=\"33%\" align=\"center\">\n\n**◆ HTTP 模式（推荐）**\n```bash\nuv run main.py \\\n  --transport streamable-http\n```\n\u003Csub>✅ 完全符合 MCP 规范及 OAuth 2.1\u003C\u002Fsub>\n\n\u003C\u002Ftd>\n\u003Ctd width=\"34%\" align=\"center\">\n\n**@ 单用户模式**\n```bash\nuv run main.py \\\n  --single-user\n```\n\u003Csub>简化身份验证\u003C\u002Fsub>\n\u003Csub>⚠️ 不能与 OAuth 2.1 模式同时使用\u003C\u002Fsub>\n\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd colspan=\"3\">\n\n\u003Cdetails open>\n\u003Csummary>◆ \u003Cb>高级选项\u003C\u002Fb> \u003Csub>\u003Csup>← 工具选择、层级与 Docker\u003C\u002Fsup>\u003C\u002Fsub>\u003C\u002Fsummary>\n\n**▶ 选择性加载工具**\n```bash\n# 只加载特定服务\nuv run main.py --tools gmail drive calendar\nuv run main.py --tools sheets docs\n\n# 结合其他标志\nuv run main.py --single-user --tools gmail\n```\n\n\n**🔒 只读模式**\n```bash\n# 请求只读权限范围，并禁用写入工具\nuv run main.py --read-only\n\n# 结合特定工具或层级\nuv run main.py --tools gmail drive --read-only\nuv run main.py --tool-tier core --read-only\n```\n只读模式通过以下方式提供安全受限的访问：\n- 仅请求 `*.readonly` OAuth 范围（例如 `gmail.readonly`、`drive.readonly`）\n- 在启动时自动过滤掉需要写入权限的工具\n- 允许对所有服务执行读取操作：列出、获取、搜索和导出\n\n**🔐 细粒度权限**\n```bash\n# 按服务设置权限级别\nuv run main.py --permissions gmail:organize drive:readonly\n\n# 将权限与层级筛选结合\nuv run main.py --permissions gmail:send drive:full --tool-tier core\n```\n细粒度权限模式可逐项控制各服务的权限范围：\n- 格式：`service:level`（每项服务一个条目）\n- Gmail 权限级别：`readonly`、`organize`、`drafts`、`send`、`full`（累积）\n- Tasks 权限级别：`readonly`、`manage`、`full`（累积；`manage` 允许创建\u002F更新\u002F移动，但禁止删除和清除已完成任务）\n- 其他服务目前支持：`readonly`、`full`\n- `--permissions` 和 `--read-only` 互斥\n- `--permissions` 不能与 `--tools` 同时使用；启用的服务由 `--permissions` 条目决定（可选地通过 `--tool-tier` 进行筛选）\n- 使用 `--tool-tier` 时，仅启用对应层级的工具，并且仅导入包含该层级工具的服务\n\n**★ 工具层级**\n```bash\nuv run main.py --tool-tier core      # ● 仅核心工具\nuv run main.py --tool-tier extended  # ◐ 核心工具 + 其他\nuv run main.py --tool-tier complete  # ○ 所有可用工具\n```\n\n**◆ Docker 部署**\n```bash\ndocker build -t workspace-mcp .\ndocker run -p 8000:8000 -v $(pwd):\u002Fapp \\\n  workspace-mcp --transport streamable-http\n\n# 通过环境变量选择工具\ndocker run -e TOOL_TIER=core workspace-mcp\ndocker run -e TOOLS=\"gmail drive calendar\" workspace-mcp\n```\n\n**可用服务**：`gmail` • `drive` • `calendar` • `docs` • `sheets` • `forms` • `tasks` • `contacts` • `chat` • `search`\n\n\u003C\u002Fdetails>\n\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftable>\n\n\u003C\u002Fdetails>\n\n### CLI\n\n`workspace-cli` 命令会列出工具并调用正在运行的服务器上的这些工具——它采用加密且基于磁盘的 OAuth 令牌缓存，因此您只需进行一次身份验证。首次运行时，它会打开浏览器以获取 Google 同意；后续运行则会自动重用已缓存的令牌。\n\n令牌以加密形式存储在 `~\u002F.workspace-mcp\u002Fcli-tokens\u002F` 中，使用在 `~\u002F.workspace-mcp\u002F.cli-encryption-key` 自动生成的 Fernet 密钥进行加密。\n\n\u003Cdetails open>\n\u003Csummary>▶ \u003Cb>workspace-cli 命令\u003C\u002Fb> \u003Csub>\u003Csup>← 持久化 OAuth，无需每次调用都重新认证\u003C\u002Fsup>\u003C\u002Fsub>\u003C\u002Fsummary>\n\n\u003Ctable>\n\u003Ctr>\n\u003Ctd width=\"50%\" align=\"center\">\n\n**▶ 列出工具**\n```bash\nuv run workspace-cli list\nuv run workspace-cli --url https:\u002F\u002Fcustom.server\u002Fmcp list\n\n# 或者，如果已全局安装：\nworkspace-cli list\nworkspace-cli --url https:\u002F\u002Fcustom.server\u002Fmcp list\n```\n\u003Csub>查看所有可用工具\u003C\u002Fsub>\n\n\u003C\u002Ftd>\n\u003Ctd width=\"50%\" align=\"center\">\n\n**◆ 调用工具**\n```bash\nuv run workspace-cli call search_gmail_messages \\\n  query=\"is:unread\" max_results=5\n```\n\u003Csub>使用 key=value 参数执行工具\u003C\u002Fsub>\n\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftable>\n\n使用 `--url` 或 `WORKSPACE_MCP_URL` 环境变量设置远程端点的 URL。\n\n\u003Cdetails open>\n\u003Csummary>≡ \u003Cb>高级：FastMCP CLI\u003C\u002Fb> \u003Csub>\u003Csup>← 检查、安装、发现\u003C\u002Fsup>\u003C\u002Fsub>\u003C\u002Fsummary>\n\n上游 [FastMCP CLI](https:\u002F\u002Fgofastmcp.com\u002Fcli) 也已捆绑提供，它包含用于模式检查、客户端安装和编辑器发现的额外命令。请注意，`fastmcp` 使用内存中的令牌存储，因此每次调用都可能重新触发 OAuth 流程。\n\n```bash\nfastmcp inspect fastmcp_server.py                        # 打印工具、资源、提示\nfastmcp install claude-code fastmcp_server.py             # 一键式客户端设置\nfastmcp install cursor fastmcp_server.py\nfastmcp discover                                          # 查找在编辑器中配置的服务器\n```\n\n有关完整命令参考，请参阅 `fastmcp --help` 或 [FastMCP CLI 文档](https:\u002F\u002Fgofastmcp.com\u002Fcli)。\n\n\u003C\u002Fdetails>\n\n\u003C\u002Fdetails>\n\n### 工具层级\n\n该服务器将工具组织成**三个递进的层级**，以简化部署。请根据您的使用需求和 API 配额要求选择合适的层级。\n\n\u003Ctable>\n\u003Ctr>\n\u003Ctd width=\"65%\" valign=\"top\">\n\n#### \u003Cspan style=\"color:#72898f\">可用层级\u003C\u002Fspan>\n\n**\u003Cspan style=\"color:#2d5b69\">●\u003C\u002Fspan> 核心** (`--tool-tier core`)\n日常任务所需的基本工具。非常适合轻量级使用且对 API 配额要求较低的情况。包括所有服务中的搜索、读取、创建以及基本的修改操作。\n\n**\u003Cspan style=\"color:#72898f\">●\u003C\u002Fspan> 扩展** (`--tool-tier extended`)\n核心功能加上管理工具。新增标签、文件夹、批量操作和高级搜索功能。适合常规使用且对 API 需求适中的场景。\n\n**\u003Cspan style=\"color:#adbcbc\">●\u003C\u002Fspan> 完整** (`--tool-tier complete`)\n全面的 API 访问权限，包括评论、页眉\u002F页脚、发布设置以及管理功能。适用于需要最大功能性的高级用户。\n\n\u003C\u002Ftd>\n\u003Ctd width=\"35%\" valign=\"top\">\n\n#### \u003Cspan style=\"color:#72898f\">重要说明\u003C\u002Fspan>\n\n\u003Cspan style=\"color:#72898f\">▶\u003C\u002Fspan> **从 `core` 开始**，并根据需要升级\n\u003Cspan style=\"color:#72898f\">▶\u003C\u002Fspan> **层级具有累积性**——每一层都包含前一层的所有功能\n\u003Cspan style=\"color:#72898f\">▶\u003C\u002Fspan> **可结合 `--tools` 对特定服务进行混合搭配**\n\u003Cspan style=\"color:#72898f\">▶\u003C\u002Fspan> **配置**位于 `core\u002Ftool_tiers.yaml`\n\u003Cspan style=\"color:#72898f\">▶\u003C\u002Fspan> **所有层级均包含身份验证**\n\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftable>\n\n#### \u003Cspan style=\"color:#72898f\">使用示例\u003C\u002Fspan>\n\n```bash\n# 基本层级选择\nuv run main.py --tool-tier core                            # 仅启动基本工具\nuv run main.py --tool-tier extended                        # 扩展到包含管理功能\nuv run main.py --tool-tier complete                        # 启用所有可用功能\n\n# 结合层级选择按需加载特定服务\nuv run main.py --tools gmail drive --tool-tier core        # 为特定服务启用核心工具\nuv run main.py --tools gmail --tool-tier extended          # 仅启用 Gmail 的扩展功能\nuv run main.py --tools docs sheets --tool-tier complete    # 全面访问 Docs 和 Sheets\n\n# 将层级选择与细粒度权限级别结合使用\nuv run main.py --permissions gmail:organize drive:full --tool-tier core\n```\n\n## 📋 凭证配置\n\n\u003Cdetails open>\n\u003Csummary>🔑 \u003Cb>OAuth 凭证设置\u003C\u002Fb> \u003Csub>\u003Csup>← 所有安装的必要步骤\u003C\u002Fsup>\u003C\u002Fsub>\u003C\u002Fsummary>\n\n\u003Ctable>\n\u003Ctr>\n\u003Ctd width=\"33%\" align=\"center\">\n\n**🚀 环境变量**\n```bash\nexport GOOGLE_OAUTH_CLIENT_ID=\\\n  \"your-client-id\"\nexport GOOGLE_OAUTH_CLIENT_SECRET=\\\n  \"your-secret\"\n```\n\u003Csub>最适合生产环境\u003C\u002Fsub>\n\n\u003C\u002Ftd>\n\u003Ctd width=\"33%\" align=\"center\">\n\n**📁 基于文件**\n```bash\n# 下载并放置于项目根目录\nclient_secret.json\n\n# 或指定自定义路径\nexport GOOGLE_CLIENT_SECRET_PATH=\\\n  \u002Fpath\u002Fto\u002Fsecret.json\n```\n\u003Csub>传统方法\u003C\u002Fsub>\n\n\u003C\u002Ftd>\n\u003Ctd width=\"34%\" align=\"center\">\n\n**⚡ .env 文件**\n```bash\ncp .env.oauth21 .env\n# 编辑 .env 文件填写凭证\n```\n\u003Csub>最适合开发环境\u003C\u002Fsub>\n\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd colspan=\"3\">\n\n\u003Cdetails open>\n\u003Csummary>📖 \u003Cb>凭证加载详情\u003C\u002Fb> \u003Csub>\u003Csup>← 了解优先级及最佳实践\u003C\u002Fsup>\u003C\u002Fsub>\u003C\u002Fsummary>\n\n**加载优先级**\n1. 环境变量（`export VAR=value`）\n2. 项目根目录下的 `.env` 文件（注意：如果您通过 `uvx` 而不是从仓库目录运行 `uv run`，您将启动一个独立进程，该进程与您的仓库克隆无关，因此不会找到您的 `.env` 文件，除非您直接指定它）\n3. 通过 `GOOGLE_CLIENT_SECRET_PATH` 加载的 `client_secret.json`\n4. 项目根目录下的默认 `client_secret.json`\n\n**为何使用环境变量？**\n- ✅ **适用于 Docker\u002FK8s**——原生容器支持\n- ✅ **适用于云平台**——Heroku、Railway、Vercel\n- ✅ **适用于 CI\u002FCD 流水线**——GitHub Actions、Jenkins\n- ✅ **无需将密钥提交到 Git**——确保凭证安全\n- ✅ **易于轮换**——无需更改代码即可更新凭证\n\n\u003C\u002Fdetails>\n\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftable>\n\n\u003C\u002Fdetails>\n\n---\n\n## 🧰 可用工具\n\n> **注意**：所有工具均支持通过 `@require_google_service()` 装饰器实现自动身份验证，并具备 30 分钟的服务缓存机制。\n\n#### 📅 Google 日历 \u003Csub>[`calendar_tools.py`](gcalendar\u002Fcalendar_tools.py)\u003C\u002Fsub>\n\n| \u003Csub>工具\u003C\u002Fsub> | \u003Csub>层级\u003C\u002Fsub> | \u003Csub>描述\u003C\u002Fsub> |\n|------|------|-------------|\n| \u003Csub>`list_calendars`\u003C\u002Fsub> | \u003Csub>核心\u003C\u002Fsub> | \u003Csub>列出可访问的日历\u003C\u002Fsub> |\n| \u003Csub>`get_events`\u003C\u002Fsub> | \u003Csub>核心\u003C\u002Fsub> | \u003Csub>检索带有时间范围筛选的事件\u003C\u002Fsub> |\n| \u003Csub>`manage_event`\u003C\u002Fsub> | \u003Csub>核心\u003C\u002Fsub> | \u003Csub>创建、更新或删除日历事件\u003C\u002Fsub> |\n| \u003Csub>`manage_out_of_office`\u003C\u002Fsub> | \u003Csub>扩展\u003C\u002Fsub> | \u003Csub>创建、列出、更新或删除“不在办公室”事件\u003C\u002Fsub> |\n\n#### 📁 Google 云端硬盘 \u003Csub>[`drive_tools.py`](gdrive\u002Fdrive_tools.py)\u003C\u002Fsub>\n\n| \u003Csub>工具\u003C\u002Fsub> | \u003Csub>层级\u003C\u002Fsub> | \u003Csub>描述\u003C\u002Fsub> |\n|------|------|-------------|\n| \u003Csub>`search_drive_files`\u003C\u002Fsub> | \u003Csub>核心\u003C\u002Fsub> | \u003Csub>使用查询语法搜索文件\u003C\u002Fsub> |\n| \u003Csub>`get_drive_file_content`\u003C\u002Fsub> | \u003Csub>核心\u003C\u002Fsub> | \u003Csub>读取文件内容（Office 格式）\u003C\u002Fsub> |\n| \u003Csub>`get_drive_file_download_url`\u003C\u002Fsub> | \u003Csub>核心\u003C\u002Fsub> | \u003Csub>将 Drive 文件下载到本地磁盘\u003C\u002Fsub> |\n| \u003Csub>`create_drive_file`\u003C\u002Fsub> | \u003Csub>核心\u003C\u002Fsub> | \u003Csub>创建文件或从 URL 获取\u003C\u002Fsub> |\n| \u003Csub>`create_drive_folder`\u003C\u002Fsub> | \u003Csub>核心\u003C\u002Fsub> | \u003Csub>在 Drive 或共享云端硬盘中创建空文件夹\u003C\u002Fsub> |\n| \u003Csub>`import_to_google_doc`\u003C\u002Fsub> | \u003Csub>核心\u003C\u002Fsub> | \u003Csub>将文件（MD、DOCX、HTML 等）导入为 Google 文档\u003C\u002Fsub> |\n| \u003Csub>`get_drive_shareable_link`\u003C\u002Fsub> | \u003Csub>核心\u003C\u002Fsub> | \u003Csub>获取文件的可分享链接\u003C\u002Fsub> |\n| \u003Csub>`list_drive_items`\u003C\u002Fsub> | \u003Csub>扩展\u003C\u002Fsub> | \u003Csub>列出文件夹内容\u003C\u002Fsub> |\n| \u003Csub>`copy_drive_file`\u003C\u002Fsub> | \u003Csub>扩展\u003C\u002Fsub> | \u003Csub>复制现有文件（模板），可选重命名\u003C\u002Fsub> |\n| \u003Csub>`update_drive_file`\u003C\u002Fsub> | \u003Csub>扩展\u003C\u002Fsub> | \u003Csub>更新文件元数据，在不同文件夹之间移动\u003C\u002Fsub> |\n| \u003Csub>`manage_drive_access`\u003C\u002Fsub> | \u003Csub>扩展\u003C\u002Fsub> | \u003Csub>授予、更新、撤销权限，以及转移所有权\u003C\u002Fsub> |\n| \u003Csub>`set_drive_file_permissions`\u003C\u002Fsub> | \u003Csub>扩展\u003C\u002Fsub> | \u003Csub>设置链接共享和文件级别的共享设置\u003C\u002Fsub> |\n| \u003Csub>`get_drive_file_permissions`\u003C\u002Fsub> | \u003Csub>完整\u003C\u002Fsub> | \u003Csub>获取详细的文件权限\u003C\u002Fsub> |\n| \u003Csub>`check_drive_file_public_access`\u003C\u002Fsub> | \u003Csub>完整\u003C\u002Fsub> | \u003Csub>检查公开共享状态\u003C\u002Fsub>\n\n#### 📧 Gmail \u003Csub>[`gmail_tools.py`](gmail\u002Fgmail_tools.py)\u003C\u002Fsub>\n\n| \u003Csub>工具\u003C\u002Fsub> | \u003Csub>层级\u003C\u002Fsub> | \u003Csub>描述\u003C\u002Fsub> |\n|------|------|-------------|\n| \u003Csub>`search_gmail_messages`\u003C\u002Fsub> | \u003Csub>核心\u003C\u002Fsub> | \u003Csub>使用 Gmail 操作符进行搜索\u003C\u002Fsub> |\n| \u003Csub>`get_gmail_message_content`\u003C\u002Fsub> | \u003Csub>核心\u003C\u002Fsub> | \u003Csub>检索邮件内容\u003C\u002Fsub> |\n| \u003Csub>`get_gmail_messages_content_batch`\u003C\u002Fsub> | \u003Csub>核心\u003C\u002Fsub> | \u003Csub>批量检索邮件内容\u003C\u002Fsub> |\n| \u003Csub>`send_gmail_message`\u003C\u002Fsub> | \u003Csub>核心\u003C\u002Fsub> | \u003Csub>发送电子邮件\u003C\u002Fsub> |\n| \u003Csub>`get_gmail_thread_content`\u003C\u002Fsub> | \u003Csub>扩展\u003C\u002Fsub> | \u003Csub>获取完整线程内容\u003C\u002Fsub> |\n| \u003Csub>`modify_gmail_message_labels`\u003C\u002Fsub> | \u003Csub>扩展\u003C\u002Fsub> | \u003Csub>修改邮件标签\u003C\u002Fsub> |\n| \u003Csub>`list_gmail_labels`\u003C\u002Fsub> | \u003Csub>扩展\u003C\u002Fsub> | \u003Csub>列出可用标签\u003C\u002Fsub> |\n| \u003Csub>`list_gmail_filters`\u003C\u002Fsub> | \u003Csub>扩展\u003C\u002Fsub> | \u003Csub>列出 Gmail 过滤器\u003C\u002Fsub> |\n| \u003Csub>`manage_gmail_label`\u003C\u002Fsub> | \u003Csub>扩展\u003C\u002Fsub> | \u003Csub>创建\u002F更新\u002F删除标签\u003C\u002Fsub> |\n| \u003Csub>`manage_gmail_filter`\u003C\u002Fsub> | \u003Csub>扩展\u003C\u002Fsub> | \u003Csub>创建或删除 Gmail 过滤器\u003C\u002Fsub> |\n| \u003Csub>`draft_gmail_message`\u003C\u002Fsub> | \u003Csub>扩展\u003C\u002Fsub> | \u003Csub>创建草稿\u003C\u002Fsub> |\n| \u003Csub>`get_gmail_threads_content_batch`\u003C\u002Fsub> | \u003Csub>完整\u003C\u002Fsub> | \u003Csub>批量检索线程内容\u003C\u002Fsub> |\n| \u003Csub>`batch_modify_gmail_message_labels`\u003C\u002Fsub> | \u003Csub>完整\u003C\u002Fsub> | \u003Csub>批量修改标签\u003C\u002Fsub> |\n| \u003Csub>`start_google_auth`\u003C\u002Fsub> | \u003Csub>完整\u003C\u002Fsub> | \u003Csub>旧版 OAuth 2.0 认证（启用 OAuth 2.1 后禁用）\u003C\u002Fsub>\n\n\u003Cdetails open>\n\u003Csummary>\u003Cb>📎 邮件附件\u003C\u002Fb> \u003Csub>\u003Csup>← 附带文件发送邮件\u003C\u002Fsup>\u003C\u002Fsub>\u003C\u002Fsummary>\n\n`send_gmail_message` 和 `draft_gmail_message` 均支持通过两种方式添加附件：\n\n**选项 1：文件路径**（仅限本地服务器）\n```python\nattachments=[{\"path\": \"\u002Fpath\u002Fto\u002Freport.pdf\"}]\n```\n从磁盘读取文件，自动检测 MIME 类型。可选覆盖 `filename`。\n\n**选项 2：Base64 编码内容**（适用于所有环境）\n```python\nattachments=[{\n    \"filename\": \"report.pdf\",\n    \"content\": \"JVBERi0xLjQK...\",  # base64 编码\n    \"mime_type\": \"application\u002Fpdf\"   # 可选\n}]\n```\n\n**⚠️ 中央托管服务器**：当 MCP 服务器运行在远程环境（云、共享实例）时，无法访问您的本地文件系统。请使用 **选项 2**，即 Base64 编码的内容。您的 MCP 客户端必须在发送前对文件进行编码。\n\u003C\u002Fdetails>\n\n\u003Cdetails open>\n\u003Csummary>\u003Cb>📥 下载附件存储\u003C\u002Fb> \u003Csub>\u003Csup>← 下载文件保存的位置\u003C\u002Fsup>\u003C\u002Fsub>\u003C\u002Fsummary>\n\n在下载 Gmail 附件（`get_gmail_attachment_content`）或 Drive 文件（`get_drive_file_download_url`）时，文件会被保存到一个持久化的本地目录，而不是工作目录中的临时文件夹。\n\n**默认位置：** `~\u002F.workspace-mcp\u002Fattachments\u002F`\n\n文件会以原始文件名加上一个简短的 UUID 后缀来确保唯一性（例如：`invoice_a1b2c3d4.pdf`）。在 **stdio 模式**下，工具会返回文件的绝对路径，以便直接访问文件系统。而在 **HTTP 模式**下，则会通过 `\u002Fattachments\u002F{file_id}` 端点返回下载链接。\n\n要自定义存储目录：\n```bash\nexport WORKSPACE_ATTACHMENT_DIR=\"\u002Fpath\u002Fto\u002Fcustom\u002Fdir\"\n```\n\n已保存的文件会在 1 小时后过期，并自动清理。\n\u003C\u002Fdetails>\n\n#### 📝 Google 文档 \u003Csub>[`docs_tools.py`](gdocs\u002Fdocs_tools.py)\u003C\u002Fsub>\n\n| \u003Csub>工具 \u003C\u002Fsub> | \u003Csub> 层次 \u003C\u002Fsub> | \u003Csub> 描述 \u003C\u002Fsub> |\n|------|------|-------------|\n| \u003Csub>`get_doc_content`\u003C\u002Fsub> | \u003Csub>核心 \u003C\u002Fsub> | \u003Csub> 提取文档文本 \u003C\u002Fsub> |\n| \u003Csub>`create_doc`\u003C\u002Fsub> | \u003Csub>核心 \u003C\u002Fsub> | \u003Csub> 创建新文档 \u003C\u002Fsub> |\n| \u003Csub>`modify_doc_text`\u003C\u002Fsub> | \u003Csub>核心 \u003C\u002Fsub> | \u003Csub> 通过标签\u002F段落定位、支持追加到段落、高级排版和链接管理，插入、替换并富格式化文本 \u003C\u002Fsub> |\n| \u003Csub>`search_docs`\u003C\u002Fsub> | \u003Csub> 扩展 \u003C\u002Fsub> | \u003Csub> 按名称查找文档 \u003C\u002Fsub> |\n| \u003Csub>`find_and_replace_doc`\u003C\u002Fsub> | \u003Csub> 扩展 \u003C\u002Fsub> | \u003Csub> 查找并替换文本 \u003C\u002Fsub> |\n| \u003Csub>`list_docs_in_folder`\u003C\u002Fsub> | \u003Csub> 扩展 \u003C\u002Fsub> | \u003Csub> 列出文件夹中的文档 \u003C\u002Fsub> |\n| \u003Csub>`insert_doc_elements`\u003C\u002Fsub> | \u003Csub> 扩展 \u003C\u002Fsub> | \u003Csub> 添加表格、列表、分页符 \u003C\u002Fsub> |\n| \u003Csub>`update_paragraph_style`\u003C\u002Fsub> | \u003Csub> 扩展 \u003C\u002Fsub> | \u003Csub> 应用高级段落样式，包括标题、间距、方向、分页控制、底纹以及带嵌套的项目符号\u002F编号\u002F复选框列表 \u003C\u002Fsub> |\n| \u003Csub>`get_doc_as_markdown`\u003C\u002Fsub> | \u003Csub> 扩展 \u003C\u002Fsub> | \u003Csub> 将文档导出为带格式的 Markdown，可选添加注释 \u003C\u002Fsub> |\n| \u003Csub>`insert_doc_image`\u003C\u002Fsub> | \u003Csub> 完整 \u003C\u002Fsub> | \u003Csub> 从云端硬盘\u002FURL 插入图片 \u003C\u002Fsub> |\n| \u003Csub>`update_doc_headers_footers`\u003C\u002Fsub> | \u003Csub> 完整 \u003C\u002Fsub> | \u003Csub> 创建或更新页眉和页脚，并确保正确地根据段落进行写入 \u003C\u002Fsub> |\n| \u003Csub>`batch_update_doc`\u003C\u002Fsub> | \u003Csub> 完整 \u003C\u002Fsub> | \u003Csub> 执行原子性的多步骤 Docs API 操作，包括命名范围、分节符、文档\u002F节布局、页眉\u002F页脚创建、基于段落的插入、图片、表格以及富格式化等 \u003C\u002Fsub> |\n| \u003Csub>`inspect_doc_structure`\u003C\u002Fsub> | \u003Csub> 完整 \u003C\u002Fsub> | \u003Csub> 分析文档结构，包括安全的插入点、表格、分节符、页眉\u002F页脚以及命名范围 \u003C\u002Fsub> |\n| \u003Csub>`export_doc_to_pdf`\u003C\u002Fsub> | \u003Csub> 扩展 \u003C\u002Fsub> | \u003Csub> 将文档导出为 PDF \u003C\u002Fsub> |\n| \u003Csub>`create_table_with_data`\u003C\u002Fsub> | \u003Csub> 完整 \u003C\u002Fsub> | \u003Csub> 创建数据表格 \u003C\u002Fsub> |\n| \u003Csub>`debug_table_structure`\u003C\u002Fsub> | \u003Csub> 完整 \u003C\u002Fsub> | \u003Csub> 调试表格问题 \u003C\u002Fsub> |\n| \u003Csub>`list_document_comments`\u003C\u002Fsub> | \u003Csub> 完整 \u003C\u002Fsub> | \u003Csub> 列出所有文档评论 \u003C\u002Fsub> |\n| \u003Csub>`manage_document_comment`\u003C\u002Fsub> | \u003Csub> 完整 \u003C\u002Fsub> | \u003Csub> 创建、回复或解决评论 \u003C\u002Fsub> |\n\n#### 📊 Google 表格 \u003Csub>[`sheets_tools.py`](gsheets\u002Fsheets_tools.py)\u003C\u002Fsub>\n\n| \u003Csub>工具\u003C\u002Fsub> | \u003Csub>层次\u003C\u002Fsub> | \u003Csub>描述\u003C\u002Fsub> |\n|------|------|-------------|\n| \u003Csub>`read_sheet_values`\u003C\u002Fsub> | \u003Csub>核心 \u003C\u002Fsub> | \u003Csub> 读取单元格区域 \u003C\u002Fsub> |\n| \u003Csub>`modify_sheet_values`\u003C\u002Fsub> | \u003Csub>核心 \u003C\u002Fsub> | \u003Csub> 写入\u002F更新\u002F清除单元格 \u003C\u002Fsub> |\n| \u003Csub>`create_spreadsheet`\u003C\u002Fsub> | \u003Csub>核心 \u003C\u002Fsub> | \u003Csub> 创建新的电子表格 \u003C\u002Fsub> |\n| \u003Csub>`list_spreadsheets`\u003C\u002Fsub> | \u003Csub>扩展\u003C\u002Fsub> | \u003Csub>列出可访问的电子表格\u003C\u002Fsub> |\n| \u003Csub>`get_spreadsheet_info`\u003C\u002Fsub> | \u003Csub>扩展\u003C\u002Fsub> | \u003Csub>获取电子表格元数据\u003C\u002Fsub> |\n| \u003Csub>`format_sheet_range`\u003C\u002Fsub> | \u003Csub>扩展\u003C\u002Fsub> | \u003Csub>应用颜色、数字格式、文本换行、对齐方式、加粗\u002F斜体、字体大小等\u003C\u002Fsub> |\n| \u003Csub>`create_sheet`\u003C\u002Fsub> | \u003Csub>完整\u003C\u002Fsub> | \u003Csub>向现有文件添加工作表\u003C\u002Fsub> |\n| \u003Csub>`list_spreadsheet_comments`\u003C\u002Fsub> | \u003Csub>完整\u003C\u002Fsub> | \u003Csub>列出所有电子表格评论\u003C\u002Fsub> |\n| \u003Csub>`manage_spreadsheet_comment`\u003C\u002Fsub> | \u003Csub>完整\u003C\u002Fsub> | \u003Csub>创建、回复或解决评论\u003C\u002Fsub> |\n| \u003Csub>`manage_conditional_formatting`\u003C\u002Fsub> | \u003Csub>完整\u003C\u002Fsub> | \u003Csub>添加、更新或删除条件格式规则\u003C\u002Fsub> |\n\n#### 🖼️ Google 幻灯片 \u003Csub>[`slides_tools.py`](gslides\u002Fslides_tools.py)\u003C\u002Fsub>\n\n| \u003Csub>工具\u003C\u002Fsub> | \u003Csub>层次\u003C\u002Fsub> | \u003Csub>描述\u003C\u002Fsub> |\n|------|------|-------------|\n| \u003Csub>`create_presentation`\u003C\u002Fsub> | \u003Csub>核心 \u003C\u002Fsub> | \u003Csub> 创建新演示文稿 \u003C\u002Fsub> |\n| \u003Csub>`get_presentation`\u003C\u002Fsub> | \u003Csub> 核心 \u003C\u002Fsub> | \u003Csub> 获取演示文稿详情 \u003C\u002Fsub> |\n| \u003Csub>`batch_update_presentation`\u003C\u002Fsub> | \u003Csub> 扩展 \u003C\u002Fsub> | \u003Csub> 应用多项更新 \u003C\u002Fsub> |\n| \u003Csub>`get_page`\u003C\u002Fsub> | \u003Csub> 扩展 \u003C\u002Fsub> | \u003Csub> 获取特定幻灯片信息 \u003C\u002Fsub> |\n| \u003Csub>`get_page_thumbnail`\u003C\u002Fsub> | \u003Csub> 扩展 \u003C\u002Fsub> | \u003Csub> 生成幻灯片缩略图 \u003C\u002Fsub> |\n| \u003Csub>`list_presentation_comments`\u003C\u002Fsub> | \u003Csub> 完整 \u003C\u002Fsub> | \u003Csub> 列出所有演示文稿评论 \u003C\u002Fsub> |\n| \u003Csub>`manage_presentation_comment`\u003C\u002Fsub> | \u003Csub> 完整 \u003C\u002Fsub> | \u003Csub> 创建、回复或解决评论 \u003C\u002Fsub> |\n\n#### 📋 Google 表单 \u003Csub>[`forms_tools.py`](gforms\u002Fforms_tools.py)\u003C\u002Fsub>\n\n| \u003Csub>工具\u003C\u002Fsub> | \u003Csub>层次\u003C\u002Fsub> | \u003Csub>描述\u003C\u002Fsub> |\n|------|------|-------------|\n| \u003Csub>`create_form`\u003C\u002Fsub> | \u003Csub>核心 \u003C\u002Fsub> | \u003Csub> 创建新表单 \u003C\u002Fsub> |\n| \u003Csub>`get_form`\u003C\u002Fsub> | \u003Csub>核心 \u003C\u002Fsub> | \u003Csub> 获取表单详情及 URL \u003C\u002Fsub> |\n| \u003Csub>`set_publish_settings`\u003C\u002Fsub> | \u003Csub>完整\u003C\u002Fsub> | \u003Csub>配置表单设置\u003C\u002Fsub> |\n| \u003Csub>`get_form_response`\u003C\u002Fsub> | \u003Csub>完整\u003C\u002Fsub> | \u003Csub>获取单个回答\u003C\u002Fsub> |\n| \u003Csub>`list_form_responses`\u003C\u002Fsub> | \u003Csub>扩展\u003C\u002Fsub> | \u003Csub>分页列出所有回答\u003C\u002Fsub> |\n| \u003Csub>`batch_update_form`\u003C\u002Fsub> | \u003Csub>完整\u003C\u002Fsub> | \u003Csub>批量更新（题目、设置）\u003C\u002Fsub> |\n\n#### ✓ Google 任务 \u003Csub>[`tasks_tools.py`](gtasks\u002Ftasks_tools.py)\u003C\u002Fsub>\n\n| \u003Csub>工具\u003C\u002Fsub> | \u003Csub>层次\u003C\u002Fsub> | \u003Csub>描述\u003C\u002Fsub> |\n|------|------|-------------|\n| \u003Csub>`list_tasks`\u003C\u002Fsub> | \u003Csub>核心 \u003C\u002Fsub> | \u003Csub>列出带筛选的任务\u003C\u002Fsub> |\n| \u003Csub>`get_task`\u003C\u002Fsub> | \u003Csub>核心 \u003C\u002Fsub> | \u003Csub>获取任务详情\u003C\u002Fsub> |\n| \u003Csub>`manage_task`\u003C\u002Fsub> | \u003Csub>核心 \u003C\u002Fsub> | \u003Csub>创建、更新、删除或移动任务\u003C\u002Fsub> |\n| \u003Csub>`list_task_lists`\u003C\u002Fsub> | \u003Csub>完整\u003C\u002Fsub> | \u003Csub>列出任务清单\u003C\u002Fsub> |\n| \u003Csub>`get_task_list`\u003C\u002Fsub> | \u003Csub>完整\u003C\u002Fsub> | \u003Csub>获取任务清单详情\u003C\u002Fsub> |\n| \u003Csub>`manage_task_list`\u003C\u002Fsub> | \u003Csub>完整\u003C\u002Fsub> | \u003Csub>创建、更新、删除任务清单，或清除已完成的任务\u003C\u002Fsub> |\n\n#### 👤 Google 联系人 \u003Csub>[`contacts_tools.py`](gcontacts\u002Fcontacts_tools.py)\u003C\u002Fsub>\n\n| \u003Csub>工具\u003C\u002Fsub> | \u003Csub>层次\u003C\u002Fsub> | \u003Csub>描述\u003C\u002Fsub> |\n|------|------|-------------|\n| \u003Csub>`search_contacts`\u003C\u002Fsub> | \u003Csub>核心 \u003C\u002Fsub> | \u003Csub>按姓名、邮箱、电话搜索联系人\u003C\u002Fsub> |\n| \u003Csub>`get_contact`\u003C\u002Fsub> | \u003Csub>核心 \u003C\u002Fsub> | \u003Csub>获取详细的联系人信息\u003C\u002Fsub> |\n| \u003Csub>`list_contacts`\u003C\u002Fsub> | \u003Csub>核心 \u003C\u002Fsub> | \u003Csub>分页列出联系人\u003C\u002Fsub> |\n| \u003Csub>`manage_contact`\u003C\u002Fsub> | \u003Csub>核心 \u003C\u002Fsub> | \u003Csub>创建、更新或删除联系人\u003C\u002Fsub> |\n| \u003Csub>`list_contact_groups`\u003C\u002Fsub> | \u003Csub>扩展 \u003C\u002Fsub> | \u003Csub>列出联系人群组\u002F标签\u003C\u002Fsub> |\n| \u003Csub>`get_contact_group`\u003C\u002Fsub> | \u003Csub>扩展 \u003C\u002Fsub> | \u003Csub>获取群组详情及其成员\u003C\u002Fsub> |\n| \u003Csub>`manage_contacts_batch`\u003C\u002Fsub> | \u003Csub>完整 \u003C\u002Fsub> | \u003Csub>批量创建、更新或删除联系人\u003C\u002Fsub> |\n| \u003Csub>`manage_contact_group`\u003C\u002Fsub> | \u003Csub>完整 \u003C\u002Fsub> | \u003Csub>创建、更新、删除群组，或修改成员关系\u003C\u002Fsub> |\n\n#### 💬 Google Chat \u003Csub>[`chat_tools.py`](gchat\u002Fchat_tools.py)\u003C\u002Fsub>\n\n| \u003Csub>工具\u003C\u002Fsub> | \u003Csub>等级\u003C\u002Fsub> | \u003Csub>描述\u003C\u002Fsub> |\n|------|------|-------------|\n| \u003Csub>`list_spaces`\u003C\u002Fsub> | \u003Csub>扩展\u003C\u002Fsub> | \u003Csub>列出聊天空间\u002F聊天室\u003C\u002Fsub> |\n| \u003Csub>`get_messages`\u003C\u002Fsub> | \u003Csub>核心\u003C\u002Fsub> | \u003Csub>获取空间消息\u003C\u002Fsub> |\n| \u003Csub>`send_message`\u003C\u002Fsub> | \u003Csub>核心\u003C\u002Fsub> | \u003Csub>向空间发送消息\u003C\u002Fsub> |\n| \u003Csub>`search_messages`\u003C\u002Fsub> | \u003Csub>核心\u003C\u002Fsub> | \u003Csub>跨聊天历史搜索\u003C\u002Fsub> |\n| \u003Csub>`create_reaction`\u003C\u002Fsub> | \u003Csub>核心\u003C\u002Fsub> | \u003Csub>为消息添加表情反应\u003C\u002Fsub> |\n| \u003Csub>`download_chat_attachment`\u003C\u002Fsub> | \u003Csub>扩展\u003C\u002Fsub> | \u003Csub>从聊天消息中下载附件\u003C\u002Fsub> |\n\n#### 🔍 Google 自定义搜索 \u003Csub>[`search_tools.py`](gsearch\u002Fsearch_tools.py)\u003C\u002Fsub>\n\n| \u003Csub>工具\u003C\u002Fsub> | \u003Csub>等级\u003C\u002Fsub> | \u003Csub>描述\u003C\u002Fsub> |\n|------|------|-------------|\n| \u003Csub>`search_custom`\u003C\u002Fsub> | \u003Csub>核心\u003C\u002Fsub> | \u003Csub>执行网页搜索（支持通过 sites 参数限制站点）\u003C\u002Fsub> |\n| \u003Csub>`get_search_engine_info`\u003C\u002Fsub> | \u003Csub>完整\u003C\u002Fsub> | \u003Csub>获取搜索引擎元数据\u003C\u002Fsub> |\n\n#### ⚡ Google Apps Script \u003Csub>[`apps_script_tools.py`](gappsscript\u002Fapps_script_tools.py)\u003C\u002Fsub>\n\n| \u003Csub>工具\u003C\u002Fsub> | \u003Csub>等级\u003C\u002Fsub> | \u003Csub>描述\u003C\u002Fsub> |\n|------|------|-------------|\n| \u003Csub>`list_script_projects`\u003C\u002Fsub> | \u003Csub>核心\u003C\u002Fsub> | \u003Csub>列出可访问的 Apps Script 项目\u003C\u002Fsub> |\n| \u003Csub>`get_script_project`\u003C\u002Fsub> | \u003Csub>核心\u003C\u002Fsub> | \u003Csub>获取包含所有文件的完整项目\u003C\u002Fsub> |\n| \u003Csub>`get_script_content`\u003C\u002Fsub> | \u003Csub>核心\u003C\u002Fsub> | \u003Csub>检索特定文件内容\u003C\u002Fsub> |\n| \u003Csub>`create_script_project`\u003C\u002Fsub> | \u003Csub>核心\u003C\u002Fsub> | \u003Csub>创建新的独立或绑定项目\u003C\u002Fsub> |\n| \u003Csub>`update_script_content`\u003C\u002Fsub> | \u003Csub>核心\u003C\u002Fsub> | \u003Csub>更新或创建脚本文件\u003C\u002Fsub> |\n| \u003Csub>`run_script_function`\u003C\u002Fsub> | \u003Csub>核心\u003C\u002Fsub> | \u003Csub>执行带参数的函数\u003C\u002Fsub> |\n| \u003Csub>`list_deployments`\u003C\u002Fsub> | \u003Csub>扩展\u003C\u002Fsub> | \u003Csub>列出所有项目部署\u003C\u002Fsub> |\n| \u003Csub>`manage_deployment`\u003C\u002Fsub> | \u003Csub>扩展\u003C\u002Fsub> | \u003Csub>创建、更新或删除脚本部署\u003C\u002Fsub> |\n| \u003Csub>`list_script_processes`\u003C\u002Fsub> | \u003Csub>扩展\u003C\u002Fsub> | \u003Csub>查看最近的执行记录和状态\u003C\u002Fsub> |\n\n\u003Csub>\n\n**工具等级说明:**\u003Cbr>\n\u003Cspan style=\"color:#2d5b69\">●\u003C\u002Fspan> **核心** — 基本功能所需的核心工具 · 最小化 API 使用 · 入门级\u003Cbr>\n\u003Cspan style=\"color:#72898f\">●\u003C\u002Fspan> **扩展** — 核心功能 + 额外特性 · 常规使用 · 功能更全面\u003Cbr>\n\u003Cspan style=\"color:#adbcbc\">●\u003C\u002Fspan> **完整** — 包含高级特性的所有可用工具 · 高级用户 · 完全 API 访问权限\n\n\u003C\u002Fsub>\n\n---\n\n\n\n### 连接到 Claude Desktop\n\n该服务器支持两种传输模式：\n\n#### Stdio 模式（旧版 - 适用于不完全支持 MCP 的客户端）\n\n> **⚠️ 重要提示**: Stdio 模式是针对那些未正确实现带有 OAuth 2.1 和可流式传输 HTTP 支持的 MCP 规范的客户端的 **遗留回退方案**。**Claude Code 及其他现代 MCP 客户端应使用可流式传输 HTTP 模式** (`--transport streamable-http`)，以实现正确的 OAuth 流程和多用户支持。\n\n通常情况下，您应该使用 Claude Desktop 的一键 DXT 安装包。如果您因某种原因无法使用，则可以通过 `claude_desktop_config.json` 手动配置。\n\n**手动 Claude 配置（替代方案）**\n\n\u003Cdetails open>\n\u003Csummary>📝 \u003Cb>Claude Desktop JSON 配置\u003C\u002Fb> \u003Csub>\u003Csup>← 单击以获取手动设置说明\u003C\u002Fsup>\u003C\u002Fsub>\u003C\u002Fsummary>\n\n1. 打开 Claude Desktop 设置 → 开发者 → 编辑配置\n   - **macOS**: `~\u002FLibrary\u002FApplication Support\u002FClaude\u002Fclaude_desktop_config.json`\n   - **Windows**: `%APPDATA%\\Claude\\claude_desktop_config.json`\n\n2. 添加服务器配置：\n```json\n{\n  \"mcpServers\": {\n    \"google_workspace\": {\n      \"command\": \"uvx\",\n      \"args\": [\"workspace-mcp\"],\n      \"env\": {\n        \"GOOGLE_OAUTH_CLIENT_ID\": \"您的客户端 ID\",\n        \"GOOGLE_OAUTH_CLIENT_SECRET\": \"您的密钥\",\n        \"OAUTHLIB_INSECURE_TRANSPORT\": \"1\"\n      }\n    }\n  }\n}\n```\n\u003C\u002Fdetails>\n\n### 连接到 LM Studio\n\n在 LM Studio 中添加一个新的 MCP 服务器（设置 → MCP 服务器），使用相同的 JSON 格式：\n\n```json\n{\n  \"mcpServers\": {\n    \"google_workspace\": {\n      \"command\": \"uvx\",\n      \"args\": [\"workspace-mcp\"],\n      \"env\": {\n        \"GOOGLE_OAUTH_CLIENT_ID\": \"您的客户端 ID\",\n        \"GOOGLE_OAUTH_CLIENT_SECRET\": \"您的密钥\",\n        \"OAUTHLIB_INSECURE_TRANSPORT\": \"1\",\n      }\n    }\n  }\n}\n```\n\n\n### 2. 高级 \u002F 跨平台安装\n\n如果您正在开发、部署到服务器上，或使用其他支持 MCP 的客户端，请继续阅读。\n\n#### 即时 CLI (uvx)\n\n\u003Cdetails open>\n\u003Csummary>⚡ \u003Cb>快速入门 uvx\u003C\u002Fb> \u003Csub>\u003Csup>← 无需安装！\u003C\u002Fsup>\u003C\u002Fsub>\u003C\u002Fsummary>\n\n```bash\n# 需要 Python 3.10+ 和 uvx\n# 首先设置凭据（参见上方的凭据配置）\nuvx workspace-mcp --tool-tier core  # 或 --tools gmail drive calendar\n```\n\n> **注意**: 在运行之前，请先配置 [OAuth 凭据](#credential-configuration)。支持环境变量、`.env` 文件或 `client_secret.json`。\n\n\u003C\u002Fdetails>\n\n### 本地开发设置\n\n\u003Cdetails open>\n\u003Csummary>🛠️ \u003Cb>开发者工作流程\u003C\u002Fb> \u003Csub>\u003Csup>← 安装依赖、代码检查和测试\u003C\u002Fsup>\u003C\u002Fsub>\u003C\u002Fsummary>\n\n```bash\n# 安装进行代码检查、测试和发布工具所需的全部内容\nuv sync --group dev\n\n# 运行与 git hooks 自动调用的相同 linter\nuv run ruff check .\n\n# 执行完整的测试套件（异步 fixture 需要 pytest-asyncio）\nuv run pytest\n```\n\n- 如果需要更精简的环境，可以使用 `uv sync --group test` 仅安装测试相关依赖。\n- `uv run main.py --transport streamable-http` 可以使用您检出的代码启动服务器，以便手动验证。\n- Ruff 属于 `dev` 组，因为预推送钩子会自动调用 `ruff check`——请在提交前在本地运行，以免触发钩子失败。\n\n\u003C\u002Fdetails>\n\n### OAuth 2.1 支持（多用户 Bearer 令牌认证）\n\n服务器包含用于承载令牌认证的 OAuth 2.1 支持，可实现多用户会话管理。**OAuth 2.1 会自动复用您现有的 `GOOGLE_OAUTH_CLIENT_ID` 和 `GOOGLE_OAUTH_CLIENT_SECRET` 凭证**——无需额外配置！\n\n**何时使用 OAuth 2.1：**\n- 多个用户访问同一个 MCP 服务器实例\n- 需要使用承载令牌认证而非传递用户邮箱\n- 在 MCP 服务器之上构建 Web 应用程序或 API\n- 生产环境需要安全的会话管理\n- 基于浏览器的客户端需要 CORS 支持\n\n**⚠️ 重要提示：OAuth 2.1 与单用户模式互斥**\n\nOAuth 2.1 模式（`MCP_ENABLE_OAUTH21=true`）不能与 `--single-user` 标志同时使用：\n- **单用户模式**：适用于在工具调用中传递用户邮箱的旧版客户端\n- **OAuth 2.1 模式**：适用于使用承载令牌认证的现代多用户场景\n\n请仅选择一种认证方式；同时使用两者会导致启动错误。\n\n**启用 OAuth 2.1：**\n要启用 OAuth 2.1，请将 `MCP_ENABLE_OAUTH21` 环境变量设置为 `true`。\n\n```bash\n# OAuth 2.1 需要 HTTP 传输模式\nexport MCP_ENABLE_OAUTH21=true\nuv run main.py --transport streamable-http\n```\n\n如果未将 `MCP_ENABLE_OAUTH21` 设置为 `true`，服务器将使用传统认证方式，这适用于不支持 OAuth 2.1 的客户端。\n\n\u003Cdetails open>\n\u003Csummary>🔐 \u003Cb>FastMCP GoogleProvider 如何处理 OAuth\u003C\u002Fb> \u003Csub>\u003Csup>← 高级 OAuth 2.1 详情\u003C\u002Fsup>\u003C\u002Fsub>\u003C\u002Fsummary>\n\nFastMCP 自带一个原生的 `GoogleProvider`，我们现在直接依赖它。它解决了在 MCP 客户端中使用 Google OAuth 的两个棘手问题：\n\n1.  **动态客户端注册**：Google 仍然不支持 OAuth 2.1 DCR，但 FastMCP 提供者暴露了完整的 DCR 接口，并使用您固定的凭证将注册请求转发给 Google。MCP 客户端按常规注册，提供者会在后台为其分配您的 Google 客户端 ID\u002F密钥。\n\n2.  **CORS 和浏览器兼容性**：该提供者包含一个 OAuth 代理，可为所有发现、授权和令牌端点提供带有正确 CORS 头部的服务。我们不再维护自定义的 `\u002Foauth2\u002F*` 路由——提供者会安全地处理上游交互，并向客户端发布正确的元数据。\n\n其结果是，服务器更加精简，但仍能使任何符合 OAuth 2.1 标准的客户端（包括基于浏览器的客户端）通过 Google 进行认证，而无需编写定制代码。\n\n\u003C\u002Fdetails>\n\n### 无状态模式（适合容器化环境）\n\n服务器支持无状态模式，专为应避免文件系统写入的容器化环境设计：\n\n**启用无状态模式：**\n```bash\n# 无状态模式要求启用 OAuth 2.1\nexport MCP_ENABLE_OAUTH21=true\nexport WORKSPACE_MCP_STATELESS_MODE=true\nuv run main.py --transport streamable-http\n```\n\n**主要特性：**\n- **不写入文件系统**：凭据绝不会写入磁盘\n- **无调试日志**：完全禁用基于文件的日志记录\n- **仅内存会话**：所有令牌通过 OAuth 2.1 会话存储保存在内存中\n- **适合容器**：非常适合 Docker、Kubernetes 和无服务器部署\n- **每请求令牌**：每个请求必须包含有效的 Bearer 令牌\n\n**要求：**\n- 必须与 `MCP_ENABLE_OAUTH21=true` 一起使用\n- 不兼容单用户模式\n- 客户端必须自行完成 OAuth 流程，并在每次请求中发送有效令牌\n\n此模式非常适合：\n- 无法使用持久化存储的云部署\n- 需要严格隔离的多租户环境\n- 具有只读文件系统的容器化应用\n- 无服务器函数和临时计算环境\n\n**MCP Inspector**：使用桌面 OAuth 客户端时无需额外配置。\n**Claude Code**：使用桌面 OAuth 客户端时无需额外配置。\n\n### OAuth 代理存储后端\n\n服务器支持可插拔的存储后端，用于通过 FastMCP 2.13.0+ 管理 OAuth 代理的状态。请根据您的部署需求选择合适的后端。\n\n**可用后端：**\n\n| 后端       | 最佳用途                     | 持久性   | 多服务器支持 |\n|------------|------------------------------|----------|--------------|\n| 内存       | 开发、测试                   | ❌       | ❌           |\n| 磁盘       | 单服务器生产环境            | ✅       | ❌           |\n| Valkey\u002FRedis | 分布式生产环境              | ✅       | ✅           |\n\n**配置：**\n\n```bash\n# 内存存储（速度快，无持久性）\nexport WORKSPACE_MCP_OAUTH_PROXY_STORAGE_BACKEND=memory\n\n# 磁盘存储（重启后仍保留数据）\nexport WORKSPACE_MCP_OAUTH_PROXY_STORAGE_BACKEND=disk\nexport WORKSPACE_MCP_OAUTH_PROXY_DISK_DIRECTORY=~\u002F.fastmcp\u002Foauth-proxy\n\n# Valkey\u002FRedis 存储（分布式，支持多服务器）\nexport WORKSPACE_MCP_OAUTH_PROXY_STORAGE_BACKEND=valkey\nexport WORKSPACE_MCP_OAUTH_PROXY_VALKEY_HOST=redis.example.com\nexport WORKSPACE_MCP_OAUTH_PROXY_VALKEY_PORT=6379\n```\n\n> 磁盘支持需要在源码安装时指定 `workspace-mcp[disk]`（或 `py-key-value-aio[disk]`）。\n> 官方 Docker 镜像默认包含 `disk` 附加组件。\n> Valkey 支持是可选的。仅当启用 Valkey 后端时，才需安装 `workspace-mcp[valkey]`（或 `py-key-value-aio[valkey]`）。\n> Windows：从源码构建 `valkey-glide` 需要支持 C11 的 MSVC C++ 编译工具。如果出现 `aws-lc-sys` C11 错误，请设置 `CFLAGS=\u002Fstd:c11`。\n\n\u003Cdetails open>\n\u003Csummary>🔐 \u003Cb>Valkey\u002FRedis 配置选项\u003C\u002Fb>\u003C\u002Fsummary>\n\n| 变量                        | 默认值        | 描述                                       |\n|-----------------------------|---------------|--------------------------------------------|\n| `WORKSPACE_MCP_OAUTH_PROXY_VALKEY_HOST` | localhost     | Valkey\u002FRedis 主机                          |\n| `WORKSPACE_MCP_OAUTH_PROXY_VALKEY_PORT` | 6379          | 端口（6380 自动启用 TLS）                 |\n| `WORKSPACE_MCP_OAUTH_PROXY_VALKEY_DB`    | 0             | 数据库编号                                 |\n| `WORKSPACE_MCP_OAUTH_PROXY_VALKEY_USE_TLS` | auto          | 启用 TLS（端口 6380 自动启用 TLS）         |\n| `WORKSPACE_MCP_OAUTH_PROXY_VALKEY_USERNAME` | -             | 认证用户名                                 |\n| `WORKSPACE_MCP_OAUTH_PROXY_VALKEY_PASSWORD` | -             | 认证密码                                   |\n| `WORKSPACE_MCP_OAUTH_PROXY_VALKEY_REQUEST_TIMEOUT_MS` | 5000          | 远程主机的请求超时                         |\n| `WORKSPACE_MCP_OAUTH_PROXY_VALKEY_CONNECTION_TIMEOUT_MS` | 10000         | 远程主机的连接超时                         |\n\n**加密**：磁盘和 Valkey 存储采用 Fernet 加密。加密密钥源自 `FASTMCP_SERVER_AUTH_GOOGLE_JWT_SIGNING_KEY`（若已设置），否则源自 `GOOGLE_OAUTH_CLIENT_SECRET`。\n\n\u003C\u002Fdetails>\n\n### 外部 OAuth 2.1 提供者模式\n\n服务器支持外部 OAuth 2.1 提供者模式，适用于由外部系统负责认证的场景。在此模式下，MCP 服务器本身不管理 OAuth 流程，而是期望在工具调用的 Authorization 头中接收到有效的承载令牌。\n\n**启用外部 OAuth 2.1 提供者模式：**\n```bash\n\n# 外部 OAuth 提供者模式需要启用 OAuth 2.1\nexport MCP_ENABLE_OAUTH21=true\nexport EXTERNAL_OAUTH21_PROVIDER=true\nuv run main.py --transport streamable-http\n```\n\n**工作原理：**\n- **协议级认证已启用**：所有 MCP 请求（包括 `initialize` 和 `tools\u002Flist`）都需要有效的 Bearer 令牌，遵循标准的 OAuth 2.1 流程。未通过认证的请求将收到 `401` 响应，其中包含指向 Google 授权服务器的资源元数据。\n- **外部 OAuth 流程**：您的外部系统负责处理 OAuth 流程并获取 Google 访问令牌（`ya29.*`）。\n- **令牌验证**：服务器通过调用 Google 的 userinfo API 来验证 Bearer 令牌。\n- **多用户支持**：每个请求都根据其 Bearer 令牌独立进行认证。\n- **资源元数据发现**：服务器会提供 `\u002F.well-known\u002Foauth-protected-resource`（RFC 9728），声明 Google 为授权服务器，并列出所需的范围。\n\n**关键特性：**\n- **无本地 OAuth 流程**：服务器不提供 `\u002Fauthorize`、`\u002Ftoken` 或 `\u002Fregister` 端点——仅提供资源元数据。\n- **仅支持 Bearer 令牌**：所有认证均通过 `Authorization: Bearer \u003Ctoken>` 头部完成。\n- **设计上无状态**：与 `WORKSPACE_MCP_STATELESS_MODE=true` 无缝兼容。\n- **外部身份提供商**：可与您现有的认证基础设施集成。\n\n**要求：**\n- 必须与 `MCP_ENABLE_OAUTH21=true` 一起使用。\n- 仍需 OAuth 凭证用于令牌验证（`GOOGLE_OAUTH_CLIENT_ID`、`GOOGLE_OAUTH_CLIENT_SECRET`）。\n- 外部系统必须获取有效的 Google OAuth 访问令牌（ya29.*）。\n- 每个工具调用请求都必须包含有效的 Bearer 令牌。\n\n**使用场景：**\n- 集成现有认证系统。\n- 由您的应用程序管理的自定义 OAuth 流程。\n- 在上游处理认证的 API 网关。\n- 具有集中式认证的多租户 SaaS 应用程序。\n- 自带 OAuth 实现的移动或 Web 应用程序。\n\n\n### VS Code MCP 客户端支持\n\n> **✅ 推荐**：VS Code MCP 扩展完全支持完整的 MCP 规范。请务必使用 HTTP 传输模式以实现正确的 OAuth 2.1 认证。\n\n\u003Cdetails open>\n\u003Csummary>🆚 \u003Cb>VS Code 配置\u003C\u002Fb> \u003Csub>\u003Csup>← VS Code MCP 扩展的设置\u003C\u002Fsup>\u003C\u002Fsub>\u003C\u002Fsummary>\n\n```json\n{\n    \"servers\": {\n        \"google-workspace\": {\n            \"url\": \"http:\u002F\u002Flocalhost:8000\u002Fmcp\u002F\",\n            \"type\": \"http\"\n        }\n    }\n}\n```\n\n*注意：使用 VS Code MCP 时，请确保以 `--transport streamable-http` 启动服务器。*\n\u003C\u002Fdetails>\n\n### Claude Code MCP 客户端支持\n\n> **✅ 推荐**：Claude Code 是一款现代的 MCP 客户端，能够正确支持完整的 MCP 规范。为了实现正确的 OAuth 2.1 认证和多用户支持，始终建议使用 HTTP 传输模式。\n\n\u003Cdetails open>\n\u003Csummary>🆚 \u003Cb>Claude Code 配置\u003C\u002Fb> \u003Csub>\u003Csup>← 为 Claude Code 设置 MCP 支持\u003C\u002Fsup>\u003C\u002Fsub>\u003C\u002Fsummary>\n\n```bash\n# 首先以 HTTP 模式启动服务器\nuv run main.py --transport streamable-http\n\n# 然后添加到 Claude Code\nclaude mcp add --transport http workspace-mcp http:\u002F\u002Flocalhost:8000\u002Fmcp\n```\n\u003C\u002Fdetails>\n\n#### 反向代理设置\n\n如果您将 MCP 服务器部署在反向代理（nginx、Apache、Cloudflare 等）之后，您有两种配置选项：\n\n**问题**：当位于反向代理之后时，服务器会使用内部端口构建 OAuth URL（例如 `http:\u002F\u002Flocalhost:8000`），但外部客户端需要的是公共 URL（例如 `https:\u002F\u002Fyour-domain.com`）。\n\n**解决方案 1**：为所有 OAuth 端点设置 `WORKSPACE_EXTERNAL_URL`：\n```bash\n# 此配置会使所有 OAuth 端点使用您的外部 URL\nexport WORKSPACE_EXTERNAL_URL=\"https:\u002F\u002Fyour-domain.com\"\n```\n\n**解决方案 2**：仅为回调设置 `GOOGLE_OAUTH_REDIRECT_URI`：\n```bash\n# 这仅会覆盖 OAuth 回调 URL\nexport GOOGLE_OAUTH_REDIRECT_URI=\"https:\u002F\u002Fyour-domain.com\u002Foauth2callback\"\n```\n\n此外，您还可以选择以下配置：\n| `OAUTH_CUSTOM_REDIRECT_URIS` *(可选)* | 逗号分隔的额外重定向 URI 列表 |\n| `OAUTH_ALLOWED_ORIGINS` *(可选)* | 逗号分隔的额外 CORS 域列表 |\n\n**重要提示**：\n- 当所有 OAuth 端点都应使用外部 URL 时，请使用 `WORKSPACE_EXTERNAL_URL`（推荐用于反向代理设置）。\n- 当只需覆盖回调 URL 时，请使用 `GOOGLE_OAUTH_REDIRECT_URI`。\n- 重定向 URI 必须与 Google Cloud 控制台中配置的完全一致。\n- 您的反向代理必须将 OAuth 相关请求（`\u002Foauth2callback`、`\u002Foauth2\u002F*`、`\u002F.well-known\u002F*`）转发至 MCP 服务器。\n\n\u003Cdetails open>\n\u003Csummary>🚀 \u003Cb>高级 uvx 命令\u003C\u002Fb> \u003Csub>\u003Csup>← 更多启动选项\u003C\u002Fsup>\u003C\u002Fsub>\u003C\u002Fsummary>\n\n```bash\n# 首先配置凭据（参见凭据配置部分）\n\n# 仅启动特定工具\nuvx workspace-mcp --tools gmail drive calendar tasks\n\n# 按工具层级启动（推荐给大多数用户）\nuvx workspace-mcp --tool-tier core      # 核心工具\nuvx workspace-mcp --tool-tier extended  # 核心工具 + 高级功能\nuvx workspace-mcp --tool-tier complete  # 所有工具\n\n# 以 HTTP 模式启动以便调试\nuvx workspace-mcp --transport streamable-http\n```\n\u003C\u002Fdetails>\n\n*需要 Python 3.10+ 和 [uvx](https:\u002F\u002Fgithub.com\u002Fastral-sh\u002Fuv)。该软件包可在 [PyPI](https:\u002F\u002Fpypi.org\u002Fproject\u002Fworkspace-mcp) 上找到。*\n\n### 开发安装\n\n用于开发或自定义：\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp.git\ncd google_workspace_mcp\nuv run main.py\n```\n\n**开发安装（适用于贡献者）**：\n\n\u003Cdetails open>\n\u003Csummary>🔧 \u003Cb>开发者设置 JSON\u003C\u002Fb> \u003Csub>\u003Csup>← 适用于贡献者及自定义\u003C\u002Fsup>\u003C\u002Fsub>\u003C\u002Fsummary>\n\n```json\n{\n  \"mcpServers\": {\n    \"google_workspace\": {\n      \"command\": \"uv\",\n      \"args\": [\n        \"run\",\n        \"--directory\",\n        \"\u002Fpath\u002Fto\u002Frepo\u002Fgoogle_workspace_mcp\",\n        \"main.py\"\n      ],\n      \"env\": {\n        \"GOOGLE_OAUTH_CLIENT_ID\": \"your-client-id\",\n        \"GOOGLE_OAUTH_CLIENT_SECRET\": \"your-secret\",\n        \"OAUTHLIB_INSECURE_TRANSPORT\": \"1\"\n      }\n    }\n  }\n}\n```\n\u003C\u002Fdetails。\n\n#### HTTP 模式（用于调试或 Web 界面）\n如果您需要在 Claude Desktop 中使用 HTTP 模式：\n\n```json\n{\n  \"mcpServers\": {\n    \"google_workspace\": {\n      \"command\": \"npx\",\n      \"args\": [\"mcp-remote\", \"http:\u002F\u002Flocalhost:8000\u002Fmcp\"]\n    }\n  }\n}\n```\n\n*注意：使用 HTTP 模式时，请确保以 `--transport streamable-http` 启动服务器。*\n\n### 首次认证\n\n服务器使用 **Google Desktop OAuth** 进行简化认证：\n\n- **无需重定向 URI**：桌面 OAuth 客户端无需复杂的回调 URL 即可完成认证\n- **自动流程**：服务器会透明地管理整个 OAuth 流程\n- **传输无关性**：无论是在 stdio 模式还是 HTTP 模式下都能无缝工作\n\n调用工具时：\n1. 服务器返回授权 URL\n2. 在浏览器中打开该 URL 并进行授权\n3. Google 提供授权码\n4. 按提示粘贴授权码（或由系统自动处理）\n5. 服务器完成认证并重新尝试您的请求\n\n---\n\n## \u003Cspan style=\"color:#adbcbc\">◆ 开发\u003C\u002Fspan>\n\n### \u003Cspan style=\"color:#72898f\">项目结构\u003C\u002Fspan>\n\n```\ngoogle_workspace_mcp\u002F\n├── auth\u002F              # 带装饰器的认证系统\n├── core\u002F              # MCP 服务器及实用工具\n├── g{service}\u002F        # 各服务专用工具\n├── main.py            # 服务器入口文件\n├── client_secret.json # OAuth 凭证文件（未提交到版本库）\n└── pyproject.toml     # 依赖项\n```\n\n### 添加新工具\n\n```python\nfrom auth.service_decorator import require_google_service\n\n@require_google_service(\"drive\", \"drive_read\")  # 服务 + 权限范围组\nasync def your_new_tool(service, param1: str, param2: int = 10):\n    \"\"\"工具描述\"\"\"\n    # service 会自动注入并缓存\n    result = service.files().list().execute()\n    return result  # 返回原生 Python 对象\n```\n\n### 架构亮点\n\n- **服务缓存**：30 分钟 TTL 降低认证开销\n- **权限范围管理**：集中于 `SCOPE_GROUPS`，便于维护\n- **错误处理**：使用原生异常，而非手动构造错误\n- **多服务支持**：`@require_multiple_services()` 用于复杂工具\n\n### 凭证存储系统\n\n服务器包含一个抽象的凭证存储 API 和一个默认后端，用于管理 Google OAuth 凭证，并支持多种存储后端：\n\n**特性：**\n- **抽象接口**：`CredentialStore` 基类定义了标准操作（获取、存储、删除、列出用户）\n- **本地文件存储**：`LocalDirectoryCredentialStore` 实现将凭证以 JSON 文件形式存储\n- **可配置存储位置**：环境变量 `GOOGLE_MCP_CREDENTIALS_DIR` 可设置存储路径\n- **多用户支持**：可为多个 Google 账号存储和管理凭证\n- **自动创建目录**：如果存储目录不存在，则会自动创建\n\n**配置：**\n```bash\n# 可选：设置自定义凭证目录\nexport GOOGLE_MCP_CREDENTIALS_DIR=\"\u002Fpath\u002Fto\u002Fcredentials\"\n\n# 默认位置（若未设置 GOOGLE_MCP_CREDENTIALS_DIR）：\n# - ~\u002F.google_workspace_mcp\u002Fcredentials（若主目录可访问）\n# - .\u002F.credentials（备用）\n```\n\n**使用示例：**\n```python\nfrom auth.credential_store import get_credential_store\n\n# 获取全局凭证存储实例\nstore = get_credential_store()\n\n# 存储某用户的凭证\nstore.store_credential(\"user@example.com\", credentials)\n\n# 获取凭证\ncreds = store.get_credential(\"user@example.com\")\n\n# 列出所有已存储凭证的用户\nusers = store.list_users()\n```\n\n凭证存储会自动处理凭证序列化、过期解析，并为存储操作提供错误处理。\n\n---\n\n## \u003Cspan style=\"color:#adbcbc\">⊠ 安全\u003C\u002Fspan>\n- **提示注入**：此 MCP 服务器具备检索您的电子邮件、日历事件和云端硬盘文件的能力。这些邮件、事件和文件可能包含提示注入——即隐藏的白色文本，指示其将您的邮件转发至其他地址。请务必谨慎操作，通常仅应将可信数据连接到 LLM！\n- **凭证安全**：切勿将 `.env`、`client_secret.json` 或 `.credentials\u002F` 目录提交到版本控制系统！\n- **OAuth 回调**：开发时使用 `http:\u002F\u002Flocalhost:8000\u002Foauth2callback`（需设置 `OAUTHLIB_INSECURE_TRANSPORT=1`）\n- **传输感知回调**：在 stdio 模式下，仅启动一个最小化的 HTTP 服务器用于 OAuth，确保回调在所有模式下均能正常工作。\n- **生产环境**：请使用 HTTPS 和 OAuth 2.1，并相应配置。\n- **权限范围最小化**：工具仅请求必要的权限。\n- **本地文件访问控制**：读取本地文件的工具（例如附件、`file:\u002F\u002F` 上传）默认仅允许访问用户的主目录。可通过 `ALLOWED_FILE_DIRS` 环境变量覆盖此限制：\n  ```bash\n  # 以冒号分隔的目录列表（Windows 使用分号），指定允许读取本地文件的目录\n  export ALLOWED_FILE_DIRS=\"\u002Fhome\u002Fuser\u002Fdocuments:\u002Fdata\u002Fshared\"\n  ```\n  不论白名单如何，对敏感路径（`.env`、`.ssh\u002F`、`.aws\u002F`、`\u002Fetc\u002Fshadow`、凭证文件等）的访问始终被禁止。\n\n---\n\n\n---\n\n## \u003Cspan style=\"color:#adbcbc\">≡ 许可证\u003C\u002Fspan>\n\nMIT 许可证——详情请参阅 `LICENSE` 文件。\n\n---\n\n验证：\n[![MCP 标识](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Ftaylorwilsdon_google_workspace_mcp_readme_6533e1db5b36.png)](https:\u002F\u002Flobehub.com\u002Fmcp\u002Ftaylorwilsdon-google_workspace_mcp)\n\n[![已在 MseeP 上验证](https:\u002F\u002Fmseep.ai\u002Fbadge.svg)](https:\u002F\u002Fmseep.ai\u002Fapp\u002Feebbc4a6-0f8c-41b2-ace8-038e5516dba0)\n\n\n\u003Cdiv align=\"center\">\n\u003Cimg width=\"842\" alt=\"批量邮件\" src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Ftaylorwilsdon_google_workspace_mcp_readme_f53ea62a59bd.png\" \u002F>\n\u003C\u002Fdiv>","# Google Workspace MCP 快速上手指南\n\nGoogle Workspace MCP 是一个功能完备的模型上下文协议（MCP）服务器，允许 AI 助手通过自然语言全面控制 Google 全家桶（Gmail、Drive、日历、文档、表格等）。它支持单用户本地运行及多用户 OAuth 2.1 部署。\n\n## 环境准备\n\n在开始之前，请确保满足以下系统要求：\n\n*   **操作系统**：Linux, macOS, 或 Windows\n*   **Python 版本**：Python 3.10 或更高版本\n*   **包管理器**：推荐安装 [uv](https:\u002F\u002Fgithub.com\u002Fastral-sh\u002Fuv) (高性能 Python 包管理工具)\n    ```bash\n    # 安装 uv (Linux\u002FmacOS)\n    curl -LsSf https:\u002F\u002Fastral.sh\u002Fuv\u002Finstall.sh | sh\n    \n    # 安装 uv (Windows PowerShell)\n    powershell -c \"irm https:\u002F\u002Fastral.sh\u002Fuv\u002Finstall.ps1 | iex\"\n    ```\n*   **Google Cloud 项目**：需要拥有一个 Google Cloud 项目并启用相关 API。\n\n## 安装与配置步骤\n\n### 1. 配置 Google Cloud 凭证\n\n这是最关键的一步，用于授权 MCP 访问你的 Google 服务。\n\n1.  **创建项目与凭证**：\n    *   访问 [Google Cloud Console](https:\u002F\u002Fconsole.cloud.google.com\u002F) 创建新项目。\n    *   进入 **API 和服务** > **凭据** > **创建凭据** > **OAuth 客户端 ID**。\n    *   **应用类型**选择：**桌面应用 (Desktop Application)**。\n    *   *注意：选择桌面应用无需配置重定向 URI，简化了设置。*\n    *   下载生成的 `client_secret.json` 或记录 **Client ID** 和 **Client Secret**。\n\n2.  **启用必要的 API**：\n    在 **API 和服务** > **库** 中，搜索并启用你需要的服务 API，例如：\n    *   Gmail API, Google Drive API, Google Calendar API\n    *   Google Docs API, Sheets API, Slides API\n    *   Tasks API, People API (Contacts), Chat API 等。\n\n3.  **设置环境变量**：\n    在终端中导出你的凭证信息（开发模式下需允许非安全传输）：\n\n    ```bash\n    export GOOGLE_OAUTH_CLIENT_ID=\"你的_CLIENT_ID\"\n    export GOOGLE_OAUTH_CLIENT_SECRET=\"你的_CLIENT_SECRET\"\n    \n    # 开发环境必需：允许 http 重定向\n    export OAUTHLIB_INSECURE_TRANSPORT=1\n    ```\n\n### 2. 安装与启动服务器\n\n推荐使用 `uvx` 直接运行，无需手动创建虚拟环境。你可以根据需求选择不同的工具集层级：\n\n```bash\n# 选项 A: 启动核心工具集 (Gmail, Drive, Calendar 等基础功能)\nuvx workspace-mcp --tool-tier core\n\n# 选项 B: 启动扩展工具集 (核心 + 管理操作)\nuvx workspace-mcp --tool-tier extended\n\n# 选项 C: 启动完整工具集 (包含所有支持的服务，如 Forms, Chat, Apps Script)\nuvx workspace-mcp --tool-tier complete\n\n# 选项 D: 仅启动特定服务 (例如只启用 Gmail 和 Drive)\nuv run main.py --tools gmail drive\n```\n\n*首次运行时，终端会输出一个链接，点击该链接并在浏览器中完成 Google 账号授权，授权后凭证将自动保存。*\n\n### 3. 连接 AI 客户端 (以 Claude Desktop 为例)\n\n#### 方法一：一键安装 (推荐)\n1.  从项目的 [Releases 页面](https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Freleases) 下载最新的 `google_workspace_mcp.dxt` 文件。\n2.  双击该文件，Claude Desktop 会自动提示安装。\n3.  在 Claude Desktop 的 **Settings** > **Extensions** 中找到 Google Workspace MCP，粘贴你的 OAuth Client ID 和 Secret。\n4.  重启 Claude Desktop 即可使用。\n\n#### 方法二：手动配置 (stdio 模式)\n如果你使用的是其他支持 MCP 的客户端（如 VS Code MCP 插件），请在配置文件中添加以下内容：\n\n```json\n{\n  \"mcpServers\": {\n    \"google-workspace\": {\n      \"command\": \"uvx\",\n      \"args\": [\"workspace-mcp\", \"--tool-tier\", \"complete\"],\n      \"env\": {\n        \"GOOGLE_OAUTH_CLIENT_ID\": \"你的_CLIENT_ID\",\n        \"GOOGLE_OAUTH_CLIENT_SECRET\": \"你的_CLIENT_SECRET\",\n        \"OAUTHLIB_INSECURE_TRANSPORT\": \"1\"\n      }\n    }\n  }\n}\n```\n\n## 基本使用示例\n\n配置完成后，你可以在支持的 AI 助手（如 Claude）中直接使用自然语言操作 Google 服务。\n\n**示例对话：**\n\n> **用户**: \"帮我查一下明天上午 10 点有没有空，如果有，创建一个名为'项目评审'的会议邀请，并把我 Drive 里最新的'项目计划.docx'附件加进去。\"\n>\n> **AI (调用 MCP 工具)**:\n> 1.  调用 `calendar_list_events` 检查明天上午时段。\n> 2.  调用 `drive_search_files` 查找 \"项目计划.docx\"。\n> 3.  调用 `calendar_create_event` 创建会议并附加文件链接。\n>\n> **AI 回复**: \"已为您安排明天上午 10 点的'项目评审'会议，并附上了最新的 project_plan.docx 文档。\"\n\n> **用户**: \"把上周收到的所有来自老板的邮件标记为重要，并总结主要内容。\"\n>\n> **AI (调用 MCP 工具)**:\n> 1.  调用 `gmail_search_messages` 筛选发件人和时间。\n> 2.  调用 `gmail_modify_labels` 添加 \"IMPORTANT\" 标签。\n> 3.  读取邮件内容并生成总结。\n\n现在，你已经成功部署并开始使用 Google Workspace MCP！","某科技公司的项目经理需要在每周例会后，迅速整理会议记录、更新项目进度表并同步给所有相关人员。\n\n### 没有 google_workspace_mcp 时\n- **手动切换繁琐**：需要在 Gmail、Google Docs、Sheets 和 Calendar 等多个网页标签间反复跳转，复制粘贴数据极易出错。\n- **信息同步滞后**：会议结束后需人工逐一向团队成员发送邮件摘要，并手动在任务列表（Tasks）中创建待办事项，耗时且容易遗漏。\n- **数据一致性差**：口头讨论的截止日期变更，往往忘记同步更新到共享日历或项目排期表中，导致团队协作出现时间偏差。\n- **检索效率低下**：查找过往相关项目的会议纪要或附件时，需在 Google Drive 和邮件中通过关键词反复搜索，难以快速定位上下文。\n\n### 使用 google_workspace_mcp 后\n- **自然语言一键联动**：直接在 AI 助手对话框输入“根据刚才的会议录音整理纪要存入 Docs，并提取关键数据更新 Sheets\"，google_workspace_mcp 自动跨应用执行操作。\n- **自动化工作流闭环**：AI 自动将生成的任务项添加至 Tasks，向参会人员发送包含文档链接的 Gmail 通知，并即时调整 Calendar 中的下次会议时间。\n- **实时数据强一致**：所有对话中确认的日期变更，由 google_workspace_mcp 实时写入日历和表格，确保全员看到的永远是最新状态。\n- **语义化精准检索**：只需询问“上个季度关于 API 重构的讨论文件”，google_workspace_mcp 即可结合 Drive 内容和邮件历史，直接返回最相关的文档片段。\n\ngoogle_workspace_mcp 将原本割裂的办公套件转化为一个可被自然语言统一调度的智能中枢，让协作流程从“人找工具”变为“工具随人动”。","https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Ftaylorwilsdon_google_workspace_mcp_1b5b7002.png","taylorwilsdon","Taylor Wilsdon","https:\u002F\u002Foss.gittoolsai.com\u002Favatars\u002Ftaylorwilsdon_c232b36b.png","infra leadership @yelp\r\n& occasionally still ship some code ","@yelp","New York City",null,"https:\u002F\u002Ftaylorwilsdon.com","https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon",[86,90,94],{"name":87,"color":88,"percentage":89},"Python","#3572A5",99.8,{"name":91,"color":92,"percentage":93},"Go Template","#00ADD8",0.1,{"name":95,"color":96,"percentage":93},"Dockerfile","#384d54",2024,590,"2026-04-05T03:24:44","MIT",4,"Linux, macOS, Windows","未说明",{"notes":105,"python":106,"dependencies":107},"该工具是一个 Google Workspace MCP 服务器，主要用于集成 Gmail、Drive、日历等谷歌服务，不涉及深度学习模型推理，因此无 GPU 需求。运行前需在 Google Cloud 控制台创建项目并配置 OAuth 2.0 桌面应用凭证（Client ID 和 Secret）。支持通过 uvx 直接运行或作为 Claude Desktop 扩展安装。开发模式下需设置环境变量 OAUTHLIB_INSECURE_TRANSPORT=1。","3.10+",[108,109],"uv\u002Fuvx","FastMCP",[15,26,14,13],[112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131],"ai","gmail","google-calendar","google-workspace","llm","llm-tools","mcp","mcp-server","google-chat","google-drive","google-sheets","model-context-protocol","model-context-protocol-server","model-context-protocol-servers","google-docs","google-forms","google-tasks","g-suite","gsuite","workspace","2026-03-27T02:49:30.150509","2026-04-06T05:37:55.864524",[135,140,145,150,155,159,163,167],{"id":136,"question_zh":137,"answer_zh":138,"source_url":139},9801,"如何在 LibreChat 中配置 Google Workspace MCP 以实现多用户 OAuth 隔离？","在 LibreChat 的 docker-compose.override.yml 中配置 MCP 服务容器，确保设置以下环境变量：\n- GOOGLE_OAUTH_CLIENT_ID 和 GOOGLE_OAUTH_CLIENT_SECRET\n- MCP_ENABLE_OAUTH21: \"true\"\n- WORKSPACE_MCP_STATELESS_MODE: \"true\"\n- WORKSPACE_EXTERNAL_URL 指向容器地址（如 http:\u002F\u002Fmcp-google-workspace:8000）\n\n启动命令示例：\nuv run main.py --transport streamable-http --tool-tier core --tools docs drive\n\nLibreChat 会自动处理每个用户的 OAuth 重定向回调 (\u002Fapi\u002Fmcp\u002F{server_name}\u002Foauth\u002Fcallback) 并将令牌按用户存储在数据库中，从而实现数据隔离。","https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fissues\u002F162",{"id":141,"question_zh":142,"answer_zh":143,"source_url":144},9802,"为什么在 Claude Desktop 中使用 list_tasks 工具时出现\"Input validation error\"错误？","该错误是因为 tasks 工具使用了非字符串类型的参数（如列表或布尔值），而基于文本的 MCP 协议主要依赖字符串类型。维护者已确认这是一个已知问题，并计划将所有工具的 Optional[x] 类型参数转换为具体的字符串类型（Optional[str]）以避免此类验证错误。临时解决方法是确保传递给 tasks 工具的参数均为字符串格式。","https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fissues\u002F180",{"id":146,"question_zh":147,"answer_zh":148,"source_url":149},9803,"如何在 Windows 上通过 Streamable HTTP 连接 MCP Inspector？","在 Windows 上无法直接使用 uvx netshow 命令检查端口可用性，因为该命令仅适用于 Linux\u002FMac（Windows 缺少 os.geteuid()）。建议手动检查端口是否被占用（例如使用 netstat -ano | findstr :8000），然后启动服务器：\n1. 确保配置了有效的 GOOGLE_OAUTH_CLIENT_ID 和 CLIENT_SECRET\n2. 设置 transport 为 streamable-http\n3. 访问 http:\u002F\u002Flocalhost:8000 进行连接\n若遇到端口冲突，请更改配置中的端口号。","https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fissues\u002F152",{"id":151,"question_zh":152,"answer_zh":153,"source_url":154},9804,"require_multiple_services 装饰器为何没有移除服务参数导致客户端报错？","这是一个已知的设计缺陷：auth.require_multiple_services 装饰器未从包装函数的签名中移除服务参数，导致 MCP 客户端仍被要求提供这些参数。目前需手动修改工具定义，显式声明所需服务参数并在内部处理认证逻辑，或等待官方修复该装饰器的行为。","https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fissues\u002F244",{"id":156,"question_zh":157,"answer_zh":158,"source_url":139},9805,"如何启用 OAuth 2.1 支持以提升安全性？","设置环境变量 MCP_ENABLE_OAUTH21=true 即可启用 OAuth 2.1 支持。同时建议配合以下配置：\n- OAUTHLIB_INSECURE_TRANSPORT=1（仅用于本地 HTTP 开发环境，生产环境必须使用 HTTPS）\n- 确保 Google Cloud 控制台中的应用已注册正确的重定向 URI\n启用后，服务器将使用更安全的 PKCE 流程进行身份验证，替代传统的基于工具的身份验证方式。",{"id":160,"question_zh":161,"answer_zh":162,"source_url":139},9806,"单用户模式与多用户模式有何区别？如何切换？","通过设置 MCP_SINGLE_USER_MODE 环境变量控制：\n- false（默认）：多用户模式，每个用户独立认证，令牌按用户隔离存储，适合团队部署（如 LibreChat 集成）\n- true：单用户模式，使用预设的 USER_GOOGLE_EMAIL 自动登录，适合个人本地使用\n在多用户模式下，必须配合支持每用户 OAuth 流的前端平台（如 LibreChat）才能实现正确隔离。",{"id":164,"question_zh":165,"answer_zh":166,"source_url":149},9807,"启动时出现\"GOOGLE_OAUTH_CLIENT_SECRET: Invalid or too short\"错误怎么办？","此错误表示提供的 Google OAuth Client Secret 无效或长度不足。解决方法：\n1. 登录 Google Cloud Console，确认已创建 OAuth 2.0 客户端 ID\n2. 复制完整的 Client Secret（通常以 GOCSPX-开头）\n3. 确保环境变量 GOOGLE_OAUTH_CLIENT_SECRET 的值完整无误，无多余空格或换行\n4. 若使用配置文件，检查引号是否正确闭合\n注意：不要将 Client ID 误填为 Client Secret。",{"id":168,"question_zh":169,"answer_zh":170,"source_url":144},9808,"如何自定义启用的 Google 服务范围（如只启用 Drive 和 Calendar）？","通过启动命令的 --tools 参数指定需要的服务模块。例如：\nuv run main.py --transport streamable-http --tools drive calendar\n支持的服务包括：gmail, drive, calendar, docs, sheets, chat, forms, slides, tasks, search\n未在列表中指定的服务将不会加载，从而减少权限请求范围和潜在的安全风险。",[172,177,182,187,192,197,202,207,212,217,222,227,232,237,242,247,252,257,262,267],{"id":173,"version":174,"summary_zh":175,"released_at":176},107101,"v1.17.2","## What's Changed\r\n* feat(calendar): add manage_focus_time tool by @PanaBs in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F648\r\n* feat: render smart chips, tabs, and all paragraph elements in markdown by @georgebashi in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F649\r\n* feat: default user_google_email to USER_GOOGLE_EMAIL env var in single-user mode by @gitchrisqueen in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F644\r\n* feat(sheets): add structured table support by @abedegno in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F643\r\n* feat(calendar): add rsvp_event tool for non-organizer RSVP responses by @thagale in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F639\r\n* fix: strip UTC offset from dateTime when IANA timezone is provided by @xor-me in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F655\r\n* fix(gdocs): create_table_with_data silently fails to populate cells by @cfdude in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F653\r\n\r\nTons of new contributors, thanks everyone! \r\n\r\n## New Contributors\r\n* @PanaBs made their first contribution in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F648\r\n* @gitchrisqueen made their first contribution in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F644\r\n* @abedegno made their first contribution in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F643\r\n* @thagale made their first contribution in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F639\r\n* @xor-me made their first contribution in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F655\r\n\r\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fcompare\u002Fv1.17.1...v1.17.2","2026-04-04T01:15:28",{"id":178,"version":179,"summary_zh":180,"released_at":181},107102,"v1.17.1","## What's Changed\r\n* fix: add missing pytz dependency for calendar tools by @mickey-mikey in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F646\r\n\r\n\r\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fcompare\u002Fv1.17.0...v1.17.1","2026-04-02T17:22:40",{"id":183,"version":184,"summary_zh":185,"released_at":186},107103,"v1.17.0","This version resolves the disk storage type issues by bumping to FastMCP v3.2.0 and adds some new community features as well as a comprehensive overhaul of Drafts capabilities!\r\n\r\n## What's Changed\r\n* chore(deps): bump fastmcp from 3.1.1 to 3.2.0 in the uv group across 1 directory by @dependabot[bot] in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F641\r\n* enh: Overhaul and improve Drafts capability  by @taylorwilsdon in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F631\r\n* feat(sheets): add include_formulas parameter to read_sheet_values by @adamthomson in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F633\r\n* Add Out of Office calendar event management by @emanuilo in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F637\r\n\r\nAs always, huge thanks to our contributors! \r\n## New Contributors\r\n* @adamthomson made their first contribution in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F633\r\n\r\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fcompare\u002Fv1.16.2...v1.17.0","2026-04-01T15:04:04",{"id":188,"version":189,"summary_zh":190,"released_at":191},107104,"v1.16.2","## What's Changed\r\n* Issues\u002F550 by @taylorwilsdon in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F628\r\n\r\nThis one looks small, but it completely changes how effective Google Docs creation with highly sophisticated formatting can be. Let me know what you think! Very, very pleased with the improvements. \r\n\r\nBefore:\r\n\u003Cimg width=\"602\" height=\"881\" alt=\"image\" src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F05b6ac64-c524-433e-988f-af5218846ab6\" \u002F>\r\n\r\n\r\nAfter:\r\n\u003Cimg width=\"765\" height=\"403\" alt=\"image\" src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F3a886f2f-e861-417b-b34b-4c1274517ebf\" \u002F>\r\n\r\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fcompare\u002Fv1.16.1...v1.16.2","2026-03-29T00:30:28",{"id":193,"version":194,"summary_zh":195,"released_at":196},107105,"v1.16.1","## What's Changed\r\n* fix dxt build \u002F legacy stdio in claude desktop by @taylorwilsdon in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F626\r\n* enh: refac readme by @taylorwilsdon in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F621\r\n* chore(deps): bump cryptography from 46.0.5 to 46.0.6 in the uv group across 1 directory by @dependabot[bot] in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F620\r\n* feat: add body_format parameter for HTML and raw email retrieval by @seidnerj in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F571\r\n\r\n\r\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fcompare\u002Fv1.16.0...v1.16.1","2026-03-28T19:38:15",{"id":198,"version":199,"summary_zh":200,"released_at":201},107106,"v1.16.0","## What's Changed\r\n\r\nAdded a persistent workspace-cli tool for listing and invoking MCP tools with encrypted, disk-backed OAuth token caching. Super useful for machine to machine, OpenClaw, enterprise settings with a central instance etc. \r\n\r\n* enh: FastMCP-native CLI Mode with Cloud Support by @taylorwilsdon in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F618\r\n\r\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fcompare\u002Fv1.15.3...v1.16.0","2026-03-27T19:58:41",{"id":203,"version":204,"summary_zh":205,"released_at":206},107107,"v1.15.1","Release v1.15.1 contains somewhat hacky workaround fixes for Claude Cowork \u002F Claude Desktop due to a bizarre issue they have passing invalid json to list and dict payload required tools. It will be removed once they come back into compliance with the MCP client spec. \r\n\r\n## What's Changed\r\n* Add suggestionsViewMode support and improve comment tools by @reinlemmens in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F602\r\n* fix: Issues\u002F611 by @taylorwilsdon in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F613\r\n* chore(deps-dev): bump requests from 2.32.5 to 2.33.0 in the uv group across 1 directory by @dependabot[bot] in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F617\r\n* fix(gmail): coerce JSON-string dict params in manage_gmail_filter by @kickinrad in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F612\r\n* feat(gmail): expose mailing list headers for bulk email detection by @jonzarecki in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F600\r\n\r\n## New Contributors\r\n* @kickinrad made their first contribution in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F612\r\n* @jonzarecki made their first contribution in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F600\r\n\r\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fcompare\u002Fv1.15.0...v1.15.1","2026-03-27T15:42:39",{"id":208,"version":209,"summary_zh":210,"released_at":211},107108,"v1.15.0","## Highlights\r\n\r\n`v1.15.0` is a quality-of-life release with real improvements across auth reliability, Gmail reply behavior, and day-to-day Workspace tooling. The big theme is fewer \"almost works\" edges: reply drafts thread correctly, quoted replies render more naturally, OAuth flow improvements, and more of the metadata real world users actually care about now shows up in tool output.\r\n\r\n## Authentication, Runtime, and Deployment\r\n\r\n- Single-user `stdio` sessions now refresh invalid cached credentials whenever a refresh token is available, instead of bouncing users back into OAuth just because the token was invalid but not explicitly marked expired. This closes a frustrating reauth loop for long-lived local setups. ([#579](https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F579)) by [@Bortlesboat](https:\u002F\u002Fgithub.com\u002FBortlesboat)\r\n- `WORKSPACE_MCP_STATELESS_MODE=true` now actually reaches FastMCP's `stateless_http` runtime flag. Before this, the app advertised stateless behavior while FastMCP still kept in-memory sessions, which could break clients after a pod or process restart. ([#582](https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F582)) by [@vdemay](https:\u002F\u002Fgithub.com\u002Fvdemay)\r\n- Re-auth flows now choose `select_account` when the user already has the required scopes, instead of forcing an unnecessary consent prompt. The callback path also preserves an existing refresh token when Google omits it on reauth, which makes repeat auth materially less fragile. ([#586](https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F586)) by [@taylorwilsdon](https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon)\r\n- macOS startup now captures stray stdout during module initialization and replays it to stderr so the MCP JSON-RPC handshake is not corrupted by platform strings or other unexpected startup noise. ([#577](https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F577)) by [@Bortlesboat](https:\u002F\u002Fgithub.com\u002FBortlesboat)\r\n- OAuth callback handling is more robust in two places: the browser response pages now degrade cleanly when `window.close()` is blocked, and the stdio auth flow now checks that the callback server is actually listening before sending users through Google auth. ([#573](https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F573), [#572](https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F572)) by [@seidnerj](https:\u002F\u002Fgithub.com\u002Fseidnerj)\r\n- External OAuth mode documentation was tightened up to reflect the current runtime behavior more clearly, which should reduce setup mistakes for deployments using an external identity layer. ([#599](https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F599)) by [@taylorwilsdon](https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon)\r\n- Dependency maintenance in this release updates `authlib` from `1.6.7` to `1.6.9` and `pyasn1` from `0.6.2` to `0.6.3`. ([#583](https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F583), [#587](https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F587)) by [@dependabot](https:\u002F\u002Fgithub.com\u002Fapps\u002Fdependabot)\r\n\r\n## Gmail Reply Quality\r\n\r\n- Reply drafts can now auto-populate `In-Reply-To` and `References` from the Gmail thread when only a `thread_id` is provided. In practice, this fixes the classic \"draft exists but does not render inline in the conversation\" problem. ([#578](https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F578)) by [@Bortlesboat](https:\u002F\u002Fgithub.com\u002FBortlesboat)\r\n- Reply drafts can optionally include quoted original content, and the implementation deliberately puts the Gmail signature above the quoted block so the result looks like a native human reply instead of an awkward append-only transcript. Both HTML and plaintext paths are covered. ([#581](https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F581)) by [@Bortlesboat](https:\u002F\u002Fgithub.com\u002FBortlesboat)\r\n- Gmail reply handling is also stricter about RFC-style threading identifiers and now exposes `In-Reply-To` \u002F `References` metadata more consistently, which helps keep agent-generated replies standards-compliant and easier to debug. ([#560](https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F560)) by [@hindmakarem-qa](https:\u002F\u002Fgithub.com\u002Fhindmakarem-qa)\r\n\r\n## Workspace Tooling Improvements\r\n\r\n- `read_sheet_values` can now include cell notes, not just raw values. That is especially useful for operational sheets where the real instructions live in comments\u002Fnotes rather than the visible cells. The implementation also keeps metadata fetches bounded to the tight populated range instead of blindly expanding grid reads. ([#580](https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F580)) by [@Bortlesboat](https:\u002F\u002Fgithub.com\u002FBortlesboat)\r\n- Google Docs paragraph styling now explicitly supports `TITLE` and `SUBTITLE`, and validation now rejects conflicting `heading_level` plus `named_style_type` combinations instead of trying to guess intent. ([#563](https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F563)) by [@reinlemmens](https:\u002F\u002Fgithub.c","2026-03-22T15:14:51",{"id":213,"version":214,"summary_zh":215,"released_at":216},107109,"v1.14.3","## What's Changed\r\n* fix: only suggest re-authentication for auth-related HTTP errors by @taylorwilsdon in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F541\r\n* feat: add tasks:manage permission level by @mickey-mikey in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F540\r\n* fix: Issues\u002F552 - Docker [disk] storage  by @taylorwilsdon in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F554\r\n* enh: expand get_form schema by @taylorwilsdon in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F553\r\n* Add create_bullet_list operation to batch_update_doc by @reinlemmens in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F564\r\n\r\n## New Contributors\r\n* @reinlemmens made their first contribution in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F564\r\n\r\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fcompare\u002Fv1.14.2...v1.14.3","2026-03-15T16:16:42",{"id":218,"version":219,"summary_zh":220,"released_at":221},107110,"v1.14.2","## What's Changed\r\n* enh: better fallback logic for html in emails by @taylorwilsdon in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F538\r\n* Add support for GDoc Tabs by @slowpoison in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F539\r\n* feat: Add USER_GOOGLE_EMAIL to server instructions for single-user mode by @gpminsuk in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F423\r\n\r\n## New Contributors\r\n* @slowpoison made their first contribution in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F539\r\n* @gpminsuk made their first contribution in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F423\r\n\r\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fcompare\u002Fv1.14.1...v1.14.2","2026-03-03T23:19:19",{"id":223,"version":224,"summary_zh":225,"released_at":226},107111,"v1.14.1","**Warning - [v1.14.0 is a breaking change](https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Freleases\u002Ftag\u002Fv1.14.0)** if for some crazy reason you've predicated certain things on specific client commands. Anyone using it in a normal way shouldn't see anything, but if you've got some pre-baked agent with this in the mix somehow, proceed with caution.\r\n\r\nThis one is just a little QoL fix for auth in stdio, with each passing day driving me closer to dropping the stdio\u002Flegacy mode :D but until then, we support what we ship\r\n\r\n## What's Changed\r\n* Fix PKCE code verifier not generated for initial OAuth flow by @isair in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F532\r\n* Fix TypeError: CORSMiddleware.__call__() missing 2 required positiona… by @jack-distl in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F523\r\n\r\n## New Contributors\r\n* @isair made their first contribution in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F532\r\n* @jack-distl made their first contribution in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F523\r\n\r\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fcompare\u002Fv1.14.0...v1.14.1","2026-03-01T23:29:56",{"id":228,"version":229,"summary_zh":230,"released_at":231},107112,"v1.14.0","Warning - this is a breaking change if for some crazy reason you've predicated certain things on specific client commands. Anyone using it in a normal way shouldn't see anything, but if you've got some pre-baked agent with this in the mix somehow, proceed with caution. \r\n\r\nIn short, what it does is:\r\n* Replaced many single-purpose CRUD tools with action-based tools:\r\n  * manage_event\r\n  * manage_drive_access\r\n  * manage_task\r\n  * manage_task_list\r\n  * manage_contact\r\n  * manage_contacts_batch\r\n  * manage_contact_group\r\n  * manage_deployment\r\n  * manage_gmail_filter\r\n  * manage_conditional_formatting\r\n\r\n\r\n## What's Changed\r\n* enh: Docs Checkbox Handling by @taylorwilsdon in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F528\r\n* Fix docs: hyphenation for compound adjectives by @04cb in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F524\r\n* fix: issues\u002F525 and issues\u002F485 by @taylorwilsdon in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F530\r\n* enh: Tool Consolidation by @taylorwilsdon in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F531\r\n* enh: defusedxml by @taylorwilsdon in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F533\r\n\r\n## New Contributors\r\n* @04cb made their first contribution in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F524\r\n\r\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fcompare\u002Fv1.13.1...v1.14.0","2026-03-01T22:27:10",{"id":233,"version":234,"summary_zh":235,"released_at":236},107113,"v1.13.1","## What's Changed\r\n* Optional hidden details in drive search and list by @fmgs31 in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F515\r\n* fix: pcke by @taylorwilsdon in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F520\r\n* enh: Partial Scope Grants & Granular Permissions by @taylorwilsdon in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F510\r\n* Bugfix: Adding missing nextPageToken for pagination in drive tools by @fmgs31 in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F513\r\n* feat: Search with file type by @fmgs31 in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F508\r\n* fix: attachment route handler signature (Request vs path params) in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F521\r\n\r\nAs always, thank you to our contributors! \r\n\r\n## New Contributors\r\n* @fmgs31 made their first contribution in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F515\r\n* @dsh made their first contribution in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F521\r\n\r\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fcompare\u002Fv1.13.0...v1.13.1","2026-02-28T22:15:49",{"id":238,"version":239,"summary_zh":240,"released_at":241},107114,"v1.13.0","This release brings us into the next generation of FastMCP, along with some QoL fixes. As always, a huge thanks to our new contributors! \r\n\r\n## What's Changed\r\n* Fix Windows attachment corruption: add O_BINARY flag to os.open by @mickey-mikey in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F495\r\n* fix: use RFC 2231 encoding for non-ASCII attachment filenames by @stakeswky in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F502\r\n* enh: Implement FastMCP v3 by @taylorwilsdon in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F468\r\n\r\n## New Contributors\r\n* @mickey-mikey made their first contribution in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F495\r\n* @stakeswky made their first contribution in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F502\r\n\r\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fcompare\u002Fv1.12.0...v1.13.0","2026-02-24T15:25:29",{"id":243,"version":244,"summary_zh":245,"released_at":246},107115,"v1.12.0","## What's Changed\r\n* feat(chat): People API sender resolution, rich links, threads, and reactions by @drewgillson in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F482\r\n* enh: Refresh flow when scopes change since last authorization by @taylorwilsdon in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F486\r\n* Add chat.spaces.readonly scope for listing spaces by @sethladd in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F484\r\n* feat(docs): add get_doc_as_markdown tool with comment context by @MaxGhenis in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F490\r\n* feat: surface quotedFileContent (anchor text) in comment reading by @MaxGhenis in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F489\r\n* Add chat attachment support: surface metadata and download files by @drewgillson in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F488\r\n* feat(drive): add create_drive_folder tool and unit test by @francescomucio in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F428\r\n\r\nA big thanks to all our new contributors! \r\n## New Contributors \r\n* @drewgillson made their first contribution in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F482\r\n* @sethladd made their first contribution in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F484\r\n* @MaxGhenis made their first contribution in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F490\r\n* @francescomucio made their first contribution in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F428\r\n\r\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fcompare\u002Fv1.11.5...v1.12.0","2026-02-19T15:05:55",{"id":248,"version":249,"summary_zh":250,"released_at":251},107116,"v1.11.5","**Full Changelog**: https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fcompare\u002Fv1.11.2...v1.11.5\r\n\r\nAdds hyperlink support (thanks @the-gigi) and a few housekeeping items. ","2026-02-17T21:54:15",{"id":253,"version":254,"summary_zh":255,"released_at":256},107117,"v1.11.2","## What's Changed\r\n* enh: harden security around attachment functionality by @taylorwilsdon in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F470\r\n* fix(auth): filter non-credential files from list_users() by @cfdude in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F471\r\n* feat(docs): add update_paragraph_style to batch operations by @cfdude in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F472\r\n* fix: use absolute path for attachment storage and improve filename resolution by @xuiltul in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F415\r\n\r\n## New Contributors\r\n* @xuiltul made their first contribution in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F415\r\n\r\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fcompare\u002Fv1.11.1...v1.11.2","2026-02-15T22:02:46",{"id":258,"version":259,"summary_zh":260,"released_at":261},107118,"v1.11.1","## What's Changed\r\n* fix issues\u002F443 by @taylorwilsdon in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F444\r\n* fix: use getContent() instead of get() for Apps Script file retrieval by @Leandro3996 in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F442\r\n* fix: cli mode google functions by @taylorwilsdon in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F450\r\n* fix: prune logs & persist refresh by @taylorwilsdon in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F451\r\n* Bump cryptography from 46.0.4 to 46.0.5 in the uv group across 1 directory by @dependabot[bot] in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F454\r\n* fix: add SSRF protection to create_drive_file by @consciousfounders in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F453\r\n* enh: add message id headers for proper threading in in non-gmail clients by @taylorwilsdon in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F458\r\n* fix(auth): add cross-service Drive scopes for docs and sheets tools by @Milofax in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F432\r\n* fix: Issues\u002F440 by @taylorwilsdon in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F459\r\n* Update GitHub Actions workflows: standardize action versions and add Docker publish workflow by @DrFaust92 in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F346\r\n* fix: clean up bodyparams logic by @taylorwilsdon in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F467\r\n* Potential fix for code scanning alert no. 51: Workflow does not contain permissions by @taylorwilsdon in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F463\r\n* fix: add missing token_uri, client_id, client_secret to OAuth 2.1 refresh store_session by @NxFerrara in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F469\r\n\r\n**Huge thank you to all our new contributors!** The pace of development has grown significantly and we're thrilled to have ya :D\r\n\r\n## New Contributors\r\n* @Leandro3996 made their first contribution in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F442\r\n* @consciousfounders made their first contribution in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F453\r\n* @Milofax made their first contribution in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F432\r\n* @DrFaust92 made their first contribution in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F346\r\n* @NxFerrara made their first contribution in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F469\r\n\r\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fcompare\u002Fv1.10.7...v1.11.1","2026-02-13T19:36:23",{"id":263,"version":264,"summary_zh":265,"released_at":266},107119,"v1.10.7","No functionality changes, required to ingest to MCP Registry ","2026-02-09T02:10:56",{"id":268,"version":269,"summary_zh":270,"released_at":271},107120,"v1.10.1","## What's Changed\r\n* enh: add drive perms tool by @taylorwilsdon in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F435\r\n* Remove Windows-incompatible filename with asterisk character by @Copilot in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F437\r\n* enh: Add paragraph-level list formatting support to Google Docs + Hyperlinks for sheets by @taylorwilsdon in https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fpull\u002F438\r\n\r\n\r\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Ftaylorwilsdon\u002Fgoogle_workspace_mcp\u002Fcompare\u002Fv1.10.0...v1.10.1","2026-02-09T00:04:49"]