协作办公
需要从命令行或 AI Agent 管理钉钉通讯录、日历…
通过钉钉官方跨平台 CLI `dws`,在命令行或 AI Agent 工作流中以结构化 JSON 管理钉钉联系人、日历、待办、群聊、考勤、审批、DING、AI Table 等。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
需要从命令行或 AI Agent 管理钉特定
解决思路
- 安装 dws(推荐一行命令):macOS/Linux 运行 `curl -fsSL https://raw.githubusercontent.com/DingTalk-Real-AI/dingtalk-workspace-cli/main/scripts/install.sh | sh`;Windows PowerShell 运行 `irm https://raw.githubusercontent.com/DingTalk-Real-AI/dingtalk-workspace-cli/main/scripts/install.ps1 | iex`。
- 安装器会自动检测 OS 和架构,下载预编译二进制到 `~/.local/bin`,并把 Agent Skills 安装到 `~/.agents/skills/dws`。
- 如果 PATH 中没有 dws,执行 `export PATH="$HOME/.local/bin:$PATH"`,并把该行加入 `~/.bashrc` 或 `~/.zshrc` 持久化。
- 从源码构建:`git clone https://github.com/DingTalk-Real-AI/dingtalk-workspace-cli.git`,`cd dingtalk-workspace-cli`,`make build`,`./dws version`。
- 前置准备 1:到钉钉开放平台创建企业内部应用,记录 Client ID (AppKey) 和 Client Secret (AppSecret)。
- 前置准备 2:在应用的安全设置中添加重定向 URL `http://127.0.0.1`。
- 前置准备 3:进入 App Release → Version Management 发布应用,使其处于 active 状态。
- 前置准备 4(beta 白名单):加入钉钉 DWS 群并提供 Client ID 和企业管理员确认,申请加入白名单。
- 认证方式一:`dws auth login --client-id $DWS_CLIENT_ID --client-secret $DWS_CLIENT_SECRET`。
- 认证方式二:先 `export DWS_CLIENT_ID=your-app-key`、`export DWS_CLIENT_SECRET=your-app-secret`,再执行 `dws auth login`。
- Token 存储:使用 PBKDF2 (600,000 iterations) + AES-256-GCM 加密,并绑定设备 MAC 地址。
- 环境变量:`DWS_CLIENT_ID` 为 OAuth Client ID (DingTalk AppKey);`DWS_CLIENT_SECRET` 为 OAuth Client Secret (DingTalk AppSecret);`DWS_CONFIG_DIR` 覆盖默认配置目录;`DWS_SERVERS_URL` 自定义服务注册端点;`DWS_TRUSTED_DOMAINS` 为 bearer token 的逗号分隔域名,默认 `*.dingtalk.com`;`DWS_ALLOW_HTTP_ENDPOINTS=1` 仅开发时允许 loopback HTTP。
- 认证管理:`dws auth login` 通过 OAuth device flow 认证;`dws auth logout` 删除已存凭据;`dws auth status` 查看当前认证状态。
- 通讯录:`dws contact user search --keyword "Alice"` 搜索用户;`dws contact department list` 列出部门;`dws contact user get --user-id <userId>` 获取用户详情。
- 日历:`dws calendar event list` 列出事件;`dws calendar event create --title "Q2 Planning" --start "2026-04-01T10:00:00+08:00" --end "2026-04-01T11:00:00+08:00" --attendees "<userId1>,<userId2>"` 创建事件;`dws calendar room list` 检查会议室可用性。
- 待办:`dws todo task list` 列出任务;`dws todo task create --title "Prepare quarterly report" --executors "<userId>"` 创建任务;`dws todo task complete --task-id <taskId>` 完成任务。
- 聊天:`dws chat group list` 列出群组;`dws chat webhook send --url $DINGTALK_WEBHOOK_URL --content "Deployment succeeded ✅"` 通过 webhook 发消息;`dws chat robot send --group-id <groupId> --content "Hello from dws"` 发送机器人消息。
- 考勤:`dws attendance record list --user-id <userId> --date "2026-03-01"` 获取考勤记录;`dws attendance shift list` 列出班次。
- 审批:`dws approval template list` 列出审批模板;`dws approval instance create --process-code <processCode> --form-values '{"key":"value"}'` 提交审批实例;`dws approval instance list --status RUNNING` 查询审批实例。
- DING 消息:`dws ding send --receiver-ids "<userId>" --content "Urgent: please review PR"` 发送;`dws ding recall --ding-id <dingId>` 撤回。
- AI Table (aitable):`dws aitable table list --space-id <spaceId>` 列出表;`dws aitable record list --table-id <tableId>` 查询记录。
- 开发者文档:`dws devdoc search --keyword "webhook"` 搜索钉钉开放平台文档。
- 工作台:`dws workbench app list` 列出工作台应用。
- 输出格式:所有命令支持 `-f` / `--format`;`-f table` 为人类可读表格(默认);`-f json` 为结构化 JSON(适合 agent 和管道);`-f raw` 为原始 API 响应。
- 保存输出到文件:`dws contact user search --keyword "Alice" -f json -o results.json`。
- Dry run:用 `--dry-run` 预览 MCP tool 调用而不执行,例如 `dws todo task list --dry-run`、`dws calendar event create --title "Test" --dry-run`。
- Shell completion:Bash 执行 `dws completion bash > /etc/bash_completion.d/dws`;Zsh 执行 `dws completion zsh > "${fpath[1]}/_dws"`;Fish 执行 `dws completion fish > ~/.config/fish/completions/dws.fish`。
- 退出码:0 Success;1 API(MCP tool call 或上游 API 失败);2 Auth(认证或授权失败);3 Validation(输入 flag 或 schema 不匹配);4 Discovery(服务发现或缓存失败);5 Internal(意外内部错误)。
- 结构化错误:使用 `-f json` 时,错误会包含 `category`、`reason`、`hint`、`actions` 字段。
- 脚本模式:查找用户并创建指派给 TA 的待办:`set -euo pipefail`;`USER_ID=$(dws contact user search --keyword "Alice" -f json | jq -r '.data[0].userId')`;`echo "Found user: $USER_ID"`;`dws todo task create --title "Review design doc" --executors "$USER_ID" -f json`。
- 脚本模式:发送每日站会提醒:`dws ding send --receiver-ids "$TEAM_USER_IDS" --content "🕘 Daily standup in 5 minutes — please join!" -f json`。
- CI/CD:发送构建状态到钉钉群:`STATUS=${1:-"unknown"}`;`EMOJI=$([[ "$STATUS" == "success" ]] && echo "✅" || echo "❌")`;`dws chat webhook send --url "$DINGTALK_WEBHOOK_URL" --content "$EMOJI Build #$BUILD_NUMBER $STATUS — $BUILD_URL"`。
- Go 项目集成:在 Go 中用 `os/exec` 执行 `dws contact user search --keyword <keyword> -f json`,再用 `json.Unmarshal` 解析 `data[].userId` 和 `data[].name`。
- AI Agent 集成:`dws` 会自动安装 Agent Skills,大多数 AI coding agents(Claude Code、Cursor、Windsurf 等)会自动发现 `.agents/skills/` 中的 skills。
- 为特定项目安装 skills:运行 `curl -fsSL https://raw.githubusercontent.com/DingTalk-Real-AI/dingtalk-workspace-cli/main/scripts/install-skills.sh | sh`,skills 会放到 `./.agents/skills/dws/`,可提交到仓库让协作者和 agent 自动获得钉钉能力。
- 典型 agent prompts:"Find the user ID for Alice in DingTalk"、"Create a todo assigned to Bob for reviewing the PR"、"List my calendar events for tomorrow"、"Send a DING message to the team leads"、"Check attendance records for user X this month"。
- 实现架构(用于调试):discovery-driven pipeline 为 Market Registry → Discovery → IR → CLI (Cobra) → Transport (MCP JSON-RPC);Market 从 `mcp.dingtalk.com` 拉取 MCP 服务注册表;Discovery 解析服务能力并写入磁盘缓存(TTL + stale fallback 支持离线);IR 统一成 product/tool catalog;CLI 挂载到 Cobra 命令树并把 flags 映射为 MCP 输入参数;Transport 执行 MCP JSON-RPC 调用,带 retry、auth injection 和 response size limits。
- 开发命令:`make build` 构建二进制;`make test` 跑单元测试;`make lint` 格式化 + lint;`make package` 本地构建所有 release artifacts(goreleaser snapshot);`make release` 通过 goreleaser 构建并发布。
- 排障 command not found:执行 `export PATH="$HOME/.local/bin:$PATH"`。
- 排障 Auth errors(exit code 2):检查 `DWS_CLIENT_ID` 和 `DWS_CLIENT_SECRET` 是否正确;确认应用已发布且重定向 URL `http://127.0.0.1` 已配置;确认企业已加入白名单(beta 期间需要)。
- 排障 Discovery failures(exit code 4):`dws` 会缓存服务发现,若缓存过期可删除 `rm -rf "${DWS_CONFIG_DIR:-$HOME/.config/dws}/cache"`;若使用自定义注册表,设置 `DWS_SERVERS_URL`。
- 排障 API errors(exit code 1):运行 `dws todo task list -f json` 获取结构化错误详情,响应包含 `category`、`reason`、`hint`、`actions`。
- 检查原始请求:运行 `dws contact user search --keyword "Alice" -f raw`。
- 本地开发/测试允许 HTTP:执行 `export DWS_ALLOW_HTTP_ENDPOINTS=1`。
适用边界 · 注意事项
- 不适用于非钉钉环境,或无法在钉钉开放平台创建、发布企业内部应用并完成 OAuth 授权/白名单的场景。
- 不适用于需要完全离线、不能访问 `mcp.dingtalk.com` 服务发现且无法使用自定义注册表的场景。
- 如果只需要一次性简单通知且已有其他可用 webhook 工具,不必安装完整 dws。