用途
cws-mcp 是一个 MCP(Model Context Protocol)服务器,用于从 Claude Code 或任何 MCP 客户端管理 Chrome Web Store 扩展。典型用途包括:上传扩展新版本作为草稿、提交审核并发布、查询扩展的审核状态与版本信息、更新扩展描述或分类、取消正在审核的提交,以及为扩展设置分阶段发布并逐步提升部署比例。
主要能力
该服务器覆盖 Chrome Web Store API v2 的全部端点。所有 API 请求均使用 v2。可用的操作方向包括:
- 状态查询:查看审核状态、版本以及部署百分比。
- 上传与发布:将构建好的 ZIP 作为草稿上传;提交审核并上线;也可带跳过审核(skip-review)选项发布。
- 分阶段发布:使用 publish 配置分阶段发布,再通过 deploy-percentage 逐步提高部署比例。
- 取消提交:撤回处于审核中的提交。
- 元数据更新:读取或保存上架字段(不提交审核)。
需要注意,公开 API 没有上架文案的读写端点,因此仪表盘相关工具使用 Playwright 和一个单独的已登录 Chrome 配置文件来操作。保存上架字段永远不会提交审核。缺失字段、不匹配的分类以及未确认的保存会返回错误而非成功。
使用方式
- 创建 OAuth2 凭据:前往 Google Cloud Console,创建或选择项目,启用 Chrome Web Store API,创建 OAuth2 凭据(桌面应用类型),记录 Client ID 和 Client Secret。
- 获取 refresh token:按照 Google 针对桌面应用的 OAuth 流程,使用本地回环重定向 URI、PKCE 以及作用域 https://www.googleapis.com/auth/chromewebstore。请求离线访问(access_type=offline;需要新的 refresh token 时使用 prompt=consent)。使用相同的重定向 URI 交换授权码,并将 refresh token 保存在 MCP 客户端的密钥/环境设置中。Google 已不再支持旧的复制粘贴式 OOB 重定向。
- 配置 MCP:添加到 Claude Code 的 MCP 设置(~/.claude/settings.local.json),或通过 npm 全局安装。
环境变量方面,资料中提及:STAGED_PUBLISH 用于在批准后暂缓发布(它并非发布比例,发布比例应单独使用 deployPercentage);默认值为 false 的配置项与 API 保持一致;即使发布成功也应检查返回的 warningInfo.warnings。仪表盘浏览器配置文件路径默认是 ~/.cws-mcp-profile,可通过 CWS_DASHBOARD_PROFILE_DIR 覆盖。首次运行若需要登录,请使用 headless=false。
适用场景
- 需要在对话式 MCP 客户端中直接完成 Chrome 扩展的版本上传、审核提交与状态跟踪。
- 需要以分阶段方式逐步放量发布扩展。
- 需要通过 Playwright 操作仪表盘来读取或保存上架文案草稿,而不触发审核提交。
- 需要取消误提交的审核请求。
限制
- 仪表盘工具会读取/保存当前仪表盘的草稿,而不是已发布的上架文案或任意语言区域;请先在仪表盘中选择目标本地化内容,字段不明确时会安全失败。
- category 必须与当前仪表盘语言中可见的选项标签完全匹配;资料说明支持英文和韩文字段标签。
- 标题、摘要和默认语言区域需在 manifest.json / 本地化消息中修改,重新构建并上传 ZIP;图标和截图请直接使用仪表盘操作。
- storeIconPath 不再被接受为可用的上传方式;此前通用的文件输入方式无法验证改变了哪个资源,请在开发者仪表盘中上传图标。
- 必须安装 Google Chrome。仪表盘 UI 变更可能需要更新选择器;未经验证的保存会返回错误。遇到不明确的失败时,请先检查仪表盘再重试。
- deploy-percentage 仅适用于过去七天活跃用户数达到 10,000+ 的扩展,且新的百分比必须始终高于当前目标。
- 从 1.x 迁移到 2.0:Google 将于 2026 年 10 月 15 日关闭 API v1;2.0 不再调用它。get 现在返回 v2 状态,其旧的 projection 参数会被拒绝,请使用 get-metadata-ui 获取草稿上架文案;已发布的上架文案不通过 v2 暴露。update-metadata 现在与 update-metadata-ui 使用相同的仪表盘工作流,因此需要 Chrome 登录,而不仅仅是 API token。裸元数据、title、summary 和 defaultLocale 输入会被拒绝并给出指引;不支持的输入不会被静默忽略。