命令行工具
DingTalk-Real-AI/dingtalk-workspace-cli avatar
DingTalk-Real-AI/dingtalk-workspace-cli

dws:把钉钉全产品塞进一个命令行工具,人类和 AI Agent 都能用

项目速览:钉钉工作区是钉钉官方开源的跨平台CLI工具。它将钉钉的全套产品功能统一到一个包中,专为人类用户和人工智能代理场景而设计。

3,129 个 Star242 个 ForkGoApache-2.0
GitHub

秒懂

它是什么?
DingTalk Workspace CLI(dws)是钉钉官方开源的跨平台命令行工具,把钉钉的 Aitable、日历、聊天等能力统一进单一二进制。它面向人类用户和 AI Agent 两类场景,本文基于 README 与仓库信息分析它的设计、安装方式和适用边界。
适合谁用?
dws 适合两类人:一是需要在终端里操作钉钉数据的开发者,二是需要让 AI Agent 读写企业钉钉数据的团队。不适合完全没有命令行经验、或者只想用图形界面管理钉钉的普通管理员。
能商用吗?
可以。Apache-2.0 是宽松许可证:你可以使用、修改并销售基于它的软件,只需保留版权和许可证声明。
还在维护吗?
在维护。仓库最近一次提交在 1 天前。
用什么语言写的?
主要是 Go(依据 GitHub 的语言统计)。

以上回答依据项目的 GitHub 数据(最近同步于 2026年9月17日)和我们的分析,不构成法律意见。

开源项目深度解析

钉钉为什么需要一个命令行工具

钉钉的产品线很长:Aitable、日历、聊天、文档、审批,各自有独立的客户端和 API。开发者和运维人员想在脚本里操作这些数据,通常要分别对接不同的 API,写一堆认证和请求代码。AI Agent 要调用钉钉能力,更是需要一套统一的接口。dws 把钉钉的全套产品能力打包进一个 Go 写的二进制,用子命令区分产品域,比如 dws aitable、dws calendar、dws chat。它同时服务两类用户:人类用 --help 和 --dry-run 交互,AI Agent 用结构化 JSON 响应。这个定位很直接,不是又一个 API 封装库,而是一个面向终端的统一入口。

从认证到请求:dws 的零信任设计

README 反复强调一个原则:Not a single byte can bypass authentication and audit,没有一个字节能绕过认证和审计。具体机制是 OAuth device-flow 认证,加上域名白名单和最小权限作用域。device-flow 适合 CLI 场景,用户不需要在终端里输入密码,而是通过设备码在浏览器里完成授权。域名白名单限制了工具能访问的钉钉端点,最小权限作用域则确保每个命令只申请它需要的权限。这个设计对 AI Agent 场景尤其重要,因为 Agent 可能在一个无人值守的环境里运行,如果认证和审计有漏洞,后果比人类误操作严重得多。文档没有给出审计日志的具体格式或存储位置,这是评估时需要注意的空白。

安装与升级:一条命令,但要注意网络

安装方式很常规:macOS/Linux 用 curl 管道脚本,Windows 用 PowerShell 的 irm 命令,也支持 npm、Homebrew 和源码构建。源码构建需要 Go 1.25+,仓库里已经提交了 internal/syncdata 下的静态端点数据,所以不需要额外的数据仓库。升级用内置的 dws upgrade,要求 v1.0.7 以上,支持 --check 和 --beta 参数,带 SHA256 校验和自动备份。对中国大陆用户,README 提供了 Gitee 镜像方案,通过设置 DWS_GITEE_REPO 环境变量让安装脚本从 Gitee 拉取二进制和 skills,npm 则用 npmmirror 镜像。这些细节说明项目方认真考虑了国内网络环境,不是敷衍地丢一个 GitHub 链接。

Agent Skills:mono 和 multi 两种布局的选择

dws 为 AI Agent 提供了内置的 Agent Skills,安装时可以选择两种布局。multi 模式是默认,每个产品域一个独立 skill,比如 dingtalk-aitable、dingtalk-calendar,适合单产品任务,每次调用的上下文更小。mono 模式是传统模式,一个 dws skill 覆盖所有产品,适合跨产品工作流。这个区分很实际:Agent 的上下文窗口有限,如果只操作 Aitable,加载整个 dws skill 会浪费 token。切换方式也简单,用 dws skill setup --mode mono 或 --mode multi。README 提醒,如果遇到问题可以反馈,说明两种模式还在磨合期。选择哪种取决于你的 Agent 任务类型,没有绝对的对错。

人类交互:--dry-run 和输出格式

对人类用户,dws 提供了 --dry-run 参数来预览请求,这意味着在真正执行前可以看到将要发送的 HTTP 请求内容。输出格式支持 table、json、raw 三种,table 适合人眼阅读,json 适合脚本和 Agent 解析,raw 可能用于调试。这种设计让同一个命令既能交互式使用,也能嵌入自动化流程。不过 README 没有给出具体的命令示例,比如 dws aitable 后面跟什么参数,所以实际使用前需要查 docs/reference.md。对于习惯 curl 加 jq 的开发者,dws 的价值在于省去了认证和请求构造的重复劳动,但代价是学习一套新的子命令体系。

限制与风险:co-creation 阶段和授权门槛

README 开头的 IMPORTANT 提示说得很清楚:这个项目还处于 co-creation 阶段,访问钉钉企业数据需要企业管理员授权。这意味着你不能拿个人账号直接玩,必须让管理员批准。对于评估者来说,这是一个硬门槛:如果管理员不信任第三方 CLI,你连试用都做不到。另一个限制是,dws 依赖钉钉服务端的 API,如果钉钉调整接口,CLI 可能失效,需要等待更新。仓库的 last push 显示 2026 年 8 月还有活跃发布,v1.0.61-beta 刚出,说明迭代很快,但 beta 版本意味着稳定性存疑。如果你需要的是生产环境里长期稳定的工具,当前阶段可能需要谨慎。

替代方案:官方 API 和自建脚本

dws 的替代方案不是另一个 CLI,而是直接使用钉钉开放平台的 API。钉钉提供了丰富的 HTTP API,你可以用 curl 或任何语言写脚本调用,配合 OAuth 应用凭证。区别在于:直接调 API 你需要自己处理认证、分页、错误重试,但你可以完全控制请求内容和频率;dws 把这一切封装好了,但你被限制在它定义的子命令和输出格式里。对于简单的单次查询,直接调 API 可能更轻量;对于复杂的多产品工作流,dws 的统一入口更有优势。另一个替代是钉钉官方提供的 SDK,比如 Go 或 Python SDK,适合在应用代码里集成,而不是在终端里操作。选择取决于你的使用场景是交互式还是程序化。

编辑结论

dws 适合两类人:一是需要在终端里操作钉钉数据的开发者,二是需要让 AI Agent 读写企业钉钉数据的团队。不适合完全没有命令行经验、或者只想用图形界面管理钉钉的普通管理员。采用前必须确认三件事:你的钉钉企业管理员是否愿意授权第三方 CLI 访问企业数据,你的网络环境能否稳定访问 GitHub 或 Gitee 镜像,以及你能否接受当前处于 co-creation 阶段、功能可能随版本快速变化的现实。dws 的零信任设计(OAuth device-flow、域名白名单、最小权限)在文档层面是扎实的,但实际效果取决于钉钉服务端的执行,建议先在测试企业里用 --dry-run 跑一遍核心命令再决定是否推广。

官方来源

  1. Official README
  2. Project repository
  3. Release notes
社区笔记

社区笔记