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
- Make sure OpenClaw is installed (local or Docker)
- Run the install command in chat:
/install dingtalk-workspace - After installation, invoke the skill by name or use
/dingtalk-workspace - Provide required inputs per the skill's parameter spec and get structured output
What is Dingtalk Workspace?
Interact with DingTalk enterprise workspace to search contacts, send messages, manage calendars, todos, approvals, attendance, reports, and AITable data via... It is an AI Agent Skill for Claude Code / OpenClaw, with 106 downloads so far.
How do I install Dingtalk Workspace?
Run "/install dingtalk-workspace" in the OpenClaw or Claude Code chat to install it in one step — no extra setup required.
Is Dingtalk Workspace free?
Yes, Dingtalk Workspace is completely free, licensed under MIT-0. You can download, install and use it at no cost.
Which platforms does Dingtalk Workspace support?
Dingtalk Workspace is cross-platform and runs anywhere OpenClaw / Claude Code is available (cross-platform).
Who created Dingtalk Workspace?
It is built and maintained by brucezhu888 (@brucezhu888); the current version is v1.0.1.