Dingtalk Workspace
/install dingtalk-workspace
DingTalk Workspace Skill
Use the dws CLI to interact with DingTalk enterprise workspace. This skill covers all 12 products: contact, chat, bot, calendar, todo, oa (approval), attendance, ding, report, aitable, workbench, and devdoc.
⚠️ Security & Safety Notes
Read before installing:
-
Credentials Required: This skill requires OAuth credentials (DWS_CLIENT_ID, DWS_CLIENT_SECRET) from a DingTalk Open Platform app. Enterprise admin approval may be needed.
-
Install Safely: The
dwsCLI installer fetches from GitHub. Review the installer script before running: -
Autonomous Execution Risk: This skill can perform destructive actions (approve workflows, send messages, delete records). Always use
--dry-runfirst and restrict autonomous invocation unless you trust the agent. -
Least Privilege: Use scoped OAuth credentials with minimum permissions. Test in a sandbox enterprise first.
Prerequisites
Installation
Option 1: Install from release (recommended)
Download pre-built binary from https://github.com/DingTalk-Real-AI/dingtalk-workspace-cli/releases
Option 2: Build from source (safer)
git clone https://github.com/DingTalk-Real-AI/dingtalk-workspace-cli.git
cd dingtalk-workspace-cli
go build -o dws ./cmd
cp dws ~/.local/bin/
Option 3: Install script (review first!)
# macOS / Linux - REVIEW SCRIPT BEFORE RUNNING
curl -fsSL https://raw.githubusercontent.com/DingTalk-Real-AI/dingtalk-workspace-cli/main/scripts/install.sh | sh
# Windows (PowerShell) - REVIEW SCRIPT BEFORE RUNNING
irm https://raw.githubusercontent.com/DingTalk-Real-AI/dingtalk-workspace-cli/main/scripts/install.ps1 | iex
Authentication
# First-time login (credentials saved to system Keychain)
dws auth login --client-id \x3Cyour-app-key> --client-secret \x3Cyour-app-secret>
# Or via environment variables
export DWS_CLIENT_ID=\x3Cyour-app-key>
export DWS_CLIENT_SECRET=\x3Cyour-app-secret>
dws auth login
Safe Execution Guidelines
For Agents
--dry-run: ALWAYS use first for mutations to preview API calls--yes: Skip confirmation prompts (use only after verifying with --dry-run)--jq: Extract specific fields to reduce token consumption--fields: Return only needed fields
Recommended Workflow
# 1. Preview the operation
dws todo task create --title "Test" --executors "user123" --dry-run
# 2. Verify the output looks correct
# 3. Execute (only if preview was correct)
dws todo task create --title "Test" --executors "user123" --yes
Auto-Correction
dws automatically corrects common AI mistakes:
--baseId→--base-id(camelCase to kebab-case)--timeout30→--timeout 30(sticky argument splitting)--tabel-id→--table-id(fuzzy matching)"yes"→true,"2024/03/29"→"2024-03-29"(value normalization)
Discovery & Introspection
Before making calls, discover available capabilities:
# List all products and tool counts
dws schema --jq '.products[] | {id, tool_count: (.tools | length)}'
# Inspect a specific tool's parameter schema
dws schema aitable.query_records --jq '.tool.parameters'
# View required fields
dws schema aitable.query_records --jq '.tool.required'
# List all product IDs
dws schema --jq '.products[].id'
Quick Reference by Product
Contact
# Search users by keyword
dws contact user search --keyword "engineering"
# Get current user profile
dws contact user get-self --jq '.result[0].orgEmployeeModel | {name: .orgUserName, dept: .depts[0].deptName}'
# Search department by name
dws contact dept search --keyword "Engineering"
# List department members
dws contact dept members --dept-id \x3Cdept-id>
Chat
# Send message as bot
dws chat message send-by-bot --robot-code \x3CBOT_CODE> --group \x3CGROUP_ID> --title "Weekly Report" --text @report.md
# List groups
dws chat group list
# Get group info
dws chat group get --group-id \x3CGROUP_ID>
Calendar
# List calendar events
dws calendar event list
# Create event
dws calendar event create --title "Team Meeting" --start "2024-03-29T14:00:00Z" --end "2024-03-29T15:00:00Z"
# Find free slots
dws calendar participant busy --user-ids \x3Cuser-id-1>,\x3Cuser-id-2> --start "2024-03-29" --end "2024-03-30"
# Search meeting rooms
dws calendar room search --keyword "Meeting Room"
Todo
# Create todo
dws todo task create --title "Review PR" --executors "\x3Cyour-userId>" --yes
# List todos
dws todo task list
# Mark as done
dws todo task done --task-id \x3Ctask-id>
Approval (OA)
# List pending approvals
dws oa approval list --status pending
# Approve instance
dws oa approval approve --instance-id \x3Cinstance-id> --comment "Approved"
# Reject instance
dws oa approval reject --instance-id \x3Cinstance-id> --comment "Needs revision"
Attendance
# View my attendance records
dws attendance record list --user-id \x3Cyour-userId>
# View team shift schedule
dws attendance shift list --dept-id \x3Cdept-id>
Report
# View today's received reports
dws report list --type received --start-date "2024-03-29" --end-date "2024-03-29"
# Create report
dws report create --template-id \x3Ctemplate-id> --content @report.md
AITable
# Query records
dws aitable record query --base-id \x3CBASE_ID> --table-id \x3CTABLE_ID> --limit 10
# Create record
dws aitable record create --base-id \x3CBASE_ID> --table-id \x3CTABLE_ID> --fields '{"name": "Task 1", "status": "open"}'
# List bases
dws aitable base list
# List tables in a base
dws aitable table list --base-id \x3CBASE_ID>
Output Control
jq Filtering
# Extract specific fields
dws contact user search --keyword "engineering" --jq '.result[] | {name: .orgUserName, userId: .userId}'
# Count results
dws todo task list --jq '.result | length'
Field Selection
# Return only specific fields
dws aitable record query --base-id \x3CBASE_ID> --table-id \x3CTABLE_ID> --fields invocation,response
File Input
# Read from file
dws chat message send-by-bot --robot-code \x3CBOT_CODE> --group \x3CGROUP_ID> --text @message.md
# Pipe from stdin
cat message.md | dws chat message send-by-bot --robot-code \x3CBOT_CODE> --group \x3CGROUP_ID>
Common Workflows
See bundled scripts in scripts/ for batch operations:
| Script | Description |
|---|---|
calendar_schedule_meeting.py |
Create event + add participants + book meeting room |
calendar_free_slot_finder.py |
Find common free slots across multiple people |
todo_batch_create.py |
Batch create todos from JSON |
contact_dept_members.py |
Search department and list all members |
report_inbox_today.py |
View today's received reports |
Error Handling
Common Error Codes
INVALID_TOKEN: Re-authenticate withdws auth loginPERMISSION_DENIED: Check app permissions in DingTalk Open PlatformRESOURCE_NOT_FOUND: Verify IDs withdws schemaintrospection
Recovery
When encountering RECOVERY_EVENT_ID, use:
dws --recovery \x3CRECOVERY_EVENT_ID>
Security Notes
- Credentials are stored encrypted in system Keychain (never in config files)
- All requests use HTTPS to
*.dingtalk.comonly - Use
--dry-runbefore any mutation to preview the API call - Token refresh is automatic; no manual intervention needed
Reference Files
- Product commands: See
references/products/*.mdfor detailed command reference per product - Intent guide: See
references/intent-guide.mdfor disambiguation (e.g., report vs todo) - Error codes: See
references/error-codes.mdfor debugging workflows - Global reference: See
references/global-reference.mdfor auth, output formats, global flags
- 确保已安装 OpenClaw(本地或 Docker 部署)
- 在对话框中输入安装命令:
/install dingtalk-workspace - 安装完成后,直接呼叫该 Skill 的名称或使用
/dingtalk-workspace触发 - 根据 Skill 的参数说明提供必要输入,即可获得结构化输出
Dingtalk Workspace 是什么?
Interact with DingTalk enterprise workspace to search contacts, send messages, manage calendars, todos, approvals, attendance, reports, and AITable data via... 它是一个面向 Claude Code / OpenClaw 的 AI Agent Skill 插件,目前累计下载 106 次。
如何安装 Dingtalk Workspace?
在 OpenClaw 或 Claude Code 对话框中运行命令「/install dingtalk-workspace」即可一键安装,无需额外配置。
Dingtalk Workspace 是免费的吗?
是的,Dingtalk Workspace 完全免费,采用 MIT-0 许可证,可自由下载、安装和使用。
Dingtalk Workspace 支持哪些平台?
Dingtalk Workspace 跨平台运行,可在任意部署了 OpenClaw / Claude Code 的环境中使用(cross-platform)。
谁开发了 Dingtalk Workspace?
由 brucezhu888(@brucezhu888)开发并维护,当前版本 v1.0.1。