AI-Chain

把 Google Workspace 变成可组合的 Agent 工具:深入解析 gws 的 Discovery 驱动 CLI

分享:
把 Google Workspace 变成可组合的 Agent 工具:深入解析 gws 的 Discovery 驱动 CLI

把 Google Workspace 变成可组合的 Agent 工具:深入解析 gws 的 Discovery 驱动 CLI

如果要让 AI Agent 操作 Google Workspace,最常见的做法是另外撰写一层整合程式:处理 OAuth、拼接 REST API URL、维护每个服务的参数结构,再把回应转成模型容易理解的格式。这条路可以走,但维护成本很快会跟着 Google Workspace API 的服务数量一起上升。

googleworkspace/cli 选择了另一条路:把 Google Workspace API 变成一个可探索、可组合、输出一致的命令列介面。它的可执行档名称是 gws,以 Rust 实作,能从 Google Discovery Service 在执行期间建立命令面,并以结构化 JSON 回应结果。对人类使用者而言,它减少了手写 curl 的工作;对 Agent 而言,它则提供一个比客制 MCP wrapper 更接近 Unix 工具的介面。

本文根据 GitHub repository、README、原始码结构、release 与近期 commit 查证,说明 gws 的设计取舍、实际使用方式,以及它为什么值得成为 AI 工程团队的 Workspace 自动化基础。

先说结论:gws 解决的是「介面漂移」

Google Workspace 并不是单一 API,而是一组服务集合,包含 Drive、Gmail、Calendar、Sheets、Docs、Chat、Admin 等。若把每个 endpoint 都手工包成 CLI 或 Agent tool,整合层通常会遇到三个问题:

1. 命令与 API 规格同步困难:新增方法、栏位或服务时,要同步更新程式码与说明。

1. 输出格式不一致:不同 wrapper 可能回传不同 JSON 结构,让 shell script 与 Agent prompt 都要额外适配。

1. 人类与 Agent 需要两套介面:人类需要 --help、dry run 与可读错误;Agent 需要可预测参数、结构化输出和 schema 探索。

gws 的核心策略是不要把整份命令清单硬编码在 CLI 里,而是在执行时读取 Google 的 Discovery 文件,依服务、资源和方法建立命令树。这让 API 介面的更新可以较自然地反映到 CLI,也把「如何呼叫 API」转成可以由命令列逐层探索的结构。

需要先厘清的是,README 明确声明它不是 Google 官方支援的产品。它使用 googleworkspace 组织名称与 Google Workspace API,但使用者仍应把它视为独立的开源工具,而不是 Google 的产品保证或官方支援管道。

核心架构:两阶段解析加上 Discovery 驱动

README 对执行流程的描述可以浓缩成以下五步:

1. 先读取第一个参数,辨识服务,例如 drive。

1. 取得该服务的 Discovery Document,并快取 24 小时。

1. 依文件中的 resources 和 methods 建立 clap 命令树。

1. 重新解析剩余参数。

1. 完成验证、认证、HTTP request 建立与执行。

这种两阶段解析很适合 Google API 的阶层式命名。使用者可以先执行 gws drive --help,再一路缩小到 gws drive files list --help;Agent 也可以把同样的 help 与 schema 当成工具探索入口。从程式码结构来看,discovery.rs、commands.rs、schema.rs、executor.rs 和 formatter.rs 分别承担 Discovery、命令建构、schema 查询、请求执行与输出格式化等责任,并由 crates/google-workspace-cli 组合成 CLI。

这个设计的优点不只在于「少写一些 wrapper」。更重要的是,命令面与上游 API 规格之间建立了明确的生成关系:Google 新增方法后,工具理论上不必等待另一个手工 wrapper 发版才能开始探索。代价则是执行时需要取得 Discovery 文件,第一次执行某项服务时也会比完全静态的 CLI 多一个网路依赖。

让输出同时适合 shell 和 Agent

gws 的另一个关键选择是把输出标准化为结构化 JSON。这让同一个命令可以被三种工作流重用:

  • 人类在终端机中直接检查结果。
  • Shell 以 jq 筛选栏位。
  • AI Agent 读取 JSON,接续下一个 Workspace 操作。

例如,README 示范以 --params 传入 Google API 参数,再使用 --page-all 把分页结果以 NDJSON 逐页串流:

gws drive files list --params '{"pageSize": 100}' --page-all | jq -r '.files[].name'

--page-all、--page-limit 与 --page-delay 把分页控制明确化,对批次工作尤其重要。Agent 不必一次把所有资料塞进 context,也能用 page limit 控制成本与风险。gws schema drive.files.list 则提供方法的 request/response schema 探索,降低 Agent 产生错误参数的机率。

另外,CLI 也提供 --dry-run。在会传送邮件、建立事件、修改文件或上传档案的流程中,先预览请求再执行,是比单纯依赖 prompt 提醒更可靠的操作边界。

从 OAuth 到伺服器部署:认证是设计的一部分

Workspace 自动化最容易被低估的不是 API 呼叫,而是凭证生命周期。gws 提供多种流程,涵盖互动式桌面、headless/CI、service account,以及外部工具已经取得 access token 的情境。

互动式登入可透过:

gws auth setup
gws auth login

README 说明,桌面流程的凭证会使用 AES-256-GCM 加密,金钥储存在作业系统 keyring;在 Linux 上则可依设定使用档案后端。对 headless 环境,可以在有浏览器的机器完成登入后,用 gws auth export --unmasked 汇出,再以 GOOGLE_WORKSPACE_CLI_CREDENTIALS_FILE 指向凭证档案。也可以使用 GOOGLE_WORKSPACE_CLI_TOKEN 传入既有 access token。

这些模式让同一套命令能从个人电脑延伸到 CI 或伺服器,但不代表可以忽略权限治理。Google OAuth testing mode 有 scope 数量限制,README 特别提醒 recommended preset 包含 85 个以上 scope,未验证应用程式可能超过限制;实务上应依工作所需选取服务范围,而不是一开始授予所有权限。

Agent Skills:把 API 介面提升成工作流介面

repo 内除了 CLI,也提供大量 SKILL.md。这些 skill 覆盖单一 Workspace 服务,也包含较高阶的常见流程与 recipe,例如寄信、读取 Drive 档案、建立 Calendar 事件、写入文件或整理摘要。README 在不同段落以 40+ 与 100+ 描述已包含的 skill/技能范围;这些数字会随版本与生成结果改变,因此更重要的讯息是:技能与 CLI 共用同一套命令面,而不是另外维护一组完全不同的 Agent API。

安装所有 skill 的方式是:

npx skills add https://github.com/googleworkspace/cli

也可以只挑选特定服务,例如 Drive 或 Gmail。这种粒度对团队治理很有用:需要寄信的 Agent 不必同时载入整个 Workspace 的操作说明,也能降低可用工具过多造成的选择成本。

对 AI Chain 这类重视可重现工作流的团队而言,这里有一个值得注意的模式:skill 负责描述「何时使用」与「如何组合」,gws 负责执行具体 API 呼叫。两者分工清楚,Agent 的 prompt 不必塞入整套 Google API 文件。

Helper commands 与通用 Discovery 的取舍

完全依赖 Discovery 可以覆盖广度,但常见任务仍需要更好用的捷径。因此 gws 另外提供以 + 开头的 helper commands,例如:

  • gws gmail +send、+reply、+forward:处理邮件常见流程。
  • gws calendar +agenda:取得今日或即将到来的行程,并可指定时区。
  • gws drive +upload:上传档案并处理相关 metadata。
  • gws workflow +meeting-prep、+weekly-digest:组合多个服务的工作流。
  • gws events +subscribe:操作 Workspace Events 订阅。

+ 前缀的意义在于把手工设计的高阶体验与 Discovery 生成的方法区分开来,避免名称冲突。这是一个务实的折衷:底层 API 保持完整,高频任务则有更适合人类与 Agent 的介面。

安全边界:可预览、可稽核,但仍要正确设定

gws 提供结构化 exit codes,将成功、API error、auth error、validation error、Discovery error 与 internal error 分开。对 CI 来说,这比解析一段自然语言错误讯息更容易建立可靠的 retry 或告警规则。

它也支援把 API 回应交给 Google Cloud Model Armor 做 prompt injection 扫描,并可选择 warn 或 block 模式。这对「Agent 读取邮件、文件或 Chat 内容后继续执行」的情境特别有价值,因为外部内容可能含有不应被当成命令的文字。不过,安全扫描功能仍需要自行设定 Model Armor template,不能取代最小权限、dry run、人工核准和输出验证。

实际部署时,建议至少采用以下原则:

1. 将 access token 与 credentials file 放在 secret manager 或受限档案权限中,避免写入 log。

1. 对寄信、删除、分享和权限变更等副作用操作先启用 dry run 或审批闸门。

1. 只授予 Agent 必需的 Workspace scopes,并依任务分开帐号或 service account。

1. 让脚本检查 exit code 与 JSON schema,不要只根据终端机文字判断成功。

1. 若 Agent 会读取不可信的邮件或文件,评估 Model Armor 与额外的内容隔离策略。

快速上手与适用场景

官方 README 建议优先使用 GitHub Releases 的预建 binary,也提供 npm、Cargo、Nix 与 Homebrew 安装方式。以 npm 为例:

npm install -g @googleworkspace/cli

完成认证后,可以从低风险的读取操作开始:

gws drive files list --params '{"pageSize": 5}'
gws calendar +agenda --today

gws 特别适合下列场景:

  • 需要让 Agent 读写多个 Workspace 服务,但不想逐一维护 API wrapper。
  • 已有 shell/CI 自动化,希望以 JSON 与 exit code 接入 Agent。
  • 想把 Workspace 操作拆成可审查、可重用的 skill 与 recipe。
  • 需要在本机、CI 与伺服器之间共用同一套命令。

相对地,如果需求只是单一固定 API、对延迟有极端要求,或组织必须依赖 Google 官方支援产品,则应先评估直接使用官方 client library 或自行维护整合层。

为什么现在值得关注?

截至本次查证,googleworkspace/cli 在 GitHub 上约有 3.07 万颗星,采 Apache-2.0 授权,且 repository 仍在近期更新;近期 release 为 v0.22.5。它并不是因为「把所有 API 包成一个命令」就值得注意,而是把三个原本分离的层次接在一起:

  • Discovery 提供可更新的 API 命令面。
  • JSON、schema、pagination 与 exit code 提供可组合的执行介面。
  • Agent Skills 与 helper commands 提供接近实际工作流的高阶语意。

这让 Workspace 自动化从「为每个服务写一个专案」转向「用一个可探索的执行核心,加上按需载入的技能」。对正在建立 Agent 平台的团队而言,这种架构比单纯增加另一个 connector 更值得研究。

结语

gws 的价值不在于取代 Google Workspace API,而在于提供一个介于原始 API 与高阶 Agent workflow 之间的稳定边界。它用 Discovery 解决介面同步,用结构化输出解决组合问题,再以 OAuth、dry run、exit code、helper 和 skills 补足生产环境需要的可操作性。

目前专案仍明确处于 v1.0 前的积极开发阶段,README 也提醒可能出现 breaking changes。因此最适合的采用方式不是直接把它当成永远不变的基础层,而是锁定版本、建立自己的 smoke tests,并针对高风险操作加上审批与权限限制。做到这些之后,gws 会是一个很有潜力的 Workspace Agent 执行底座。

参考资料