Skills dingtalk-workspace
Interact with DingTalk enterprise workspace using the `dws` CLI. Use for: (1) searching contacts and departments, (2) sending chat messages, (3) managing calendar events and meeting rooms, (4) creating and managing todos, (5) approval workflows, (6) attendance records, (7) AITable CRUD operations, (8) report management. Requires dws CLI installed and authenticated via OAuth.
git clone https://github.com/openclaw/skills
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/brucezhu888/dingtalk-workspace" ~/.claude/skills/openclaw-skills-dingtalk-workspace && rm -rf "$T"
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.openclaw/skills && cp -r "$T/skills/brucezhu888/dingtalk-workspace" ~/.openclaw/skills/openclaw-skills-dingtalk-workspace && rm -rf "$T"
skills/brucezhu888/dingtalk-workspace/SKILL.mdDingTalk 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
CLI installer fetches from GitHub. Review the installer script before running:dws -
Autonomous Execution Risk: This skill can perform destructive actions (approve workflows, send messages, delete records). Always use
first and restrict autonomous invocation unless you trust the agent.--dry-run -
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 <your-app-key> --client-secret <your-app-secret> # Or via environment variables export DWS_CLIENT_ID=<your-app-key> export DWS_CLIENT_SECRET=<your-app-secret> dws auth login
Safe Execution Guidelines
For Agents
: ALWAYS use first for mutations to preview API calls--dry-run
: Skip confirmation prompts (use only after verifying with --dry-run)--yes
: Extract specific fields to reduce token consumption--jq
: Return only needed fields--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
(camelCase to kebab-case)--base-id
→--timeout30
(sticky argument splitting)--timeout 30
→--tabel-id
(fuzzy matching)--table-id
→"yes"
,true
→"2024/03/29"
(value normalization)"2024-03-29"
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 <dept-id>
Chat
# Send message as bot dws chat message send-by-bot --robot-code <BOT_CODE> --group <GROUP_ID> --title "Weekly Report" --text @report.md # List groups dws chat group list # Get group info dws chat group get --group-id <GROUP_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 <user-id-1>,<user-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 "<your-userId>" --yes # List todos dws todo task list # Mark as done dws todo task done --task-id <task-id>
Approval (OA)
# List pending approvals dws oa approval list --status pending # Approve instance dws oa approval approve --instance-id <instance-id> --comment "Approved" # Reject instance dws oa approval reject --instance-id <instance-id> --comment "Needs revision"
Attendance
# View my attendance records dws attendance record list --user-id <your-userId> # View team shift schedule dws attendance shift list --dept-id <dept-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 <template-id> --content @report.md
AITable
# Query records dws aitable record query --base-id <BASE_ID> --table-id <TABLE_ID> --limit 10 # Create record dws aitable record create --base-id <BASE_ID> --table-id <TABLE_ID> --fields '{"name": "Task 1", "status": "open"}' # List bases dws aitable base list # List tables in a base dws aitable table list --base-id <BASE_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 <BASE_ID> --table-id <TABLE_ID> --fields invocation,response
File Input
# Read from file dws chat message send-by-bot --robot-code <BOT_CODE> --group <GROUP_ID> --text @message.md # Pipe from stdin cat message.md | dws chat message send-by-bot --robot-code <BOT_CODE> --group <GROUP_ID>
Common Workflows
See bundled scripts in
scripts/ for batch operations:
| Script | Description |
|---|---|
| Create event + add participants + book meeting room |
| Find common free slots across multiple people |
| Batch create todos from JSON |
| Search department and list all members |
| View today's received reports |
Error Handling
Common Error Codes
: Re-authenticate withINVALID_TOKENdws auth login
: Check app permissions in DingTalk Open PlatformPERMISSION_DENIED
: Verify IDs withRESOURCE_NOT_FOUND
introspectiondws schema
Recovery
When encountering
RECOVERY_EVENT_ID, use:
dws --recovery <RECOVERY_EVENT_ID>
Security Notes
- Credentials are stored encrypted in system Keychain (never in config files)
- All requests use HTTPS to
only*.dingtalk.com - Use
before any mutation to preview the API call--dry-run - Token refresh is automatic; no manual intervention needed
Reference Files
- Product commands: See
for detailed command reference per productreferences/products/*.md - Intent guide: See
for disambiguation (e.g., report vs todo)references/intent-guide.md - Error codes: See
for debugging workflowsreferences/error-codes.md - Global reference: See
for auth, output formats, global flagsreferences/global-reference.md