From sundial-org-awesome-openclaw-skills-4
Queries ClickUp tasks via REST API with pagination, subtask handling, and assignee breakdown. Use for task management, reporting, and workflow automation.
How this skill is triggered — by the user, by Claude, or both
Slash command
/sundial-org-awesome-openclaw-skills-4:clickupThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Interact with ClickUp's REST API for task management, reporting, and workflow automation.
Interact with ClickUp's REST API for task management, reporting, and workflow automation.
Before using this skill, ensure the following are configured in TOOLS.md:
CLICKUP_API_KEYCLICKUP_TEAM_IDThe fastest way to query ClickUp:
# Set environment variables
export CLICKUP_API_KEY="pk_..."
export CLICKUP_TEAM_ID="90161392624"
# Get all open tasks
./scripts/clickup-query.sh tasks
# Get task counts (parent vs subtasks)
./scripts/clickup-query.sh task-count
# Get assignee breakdown
./scripts/clickup-query.sh assignees
# Get specific task
./scripts/clickup-query.sh task <task-id>
For custom queries or operations not covered by the helper script:
# Get all open tasks (with subtasks and pagination)
curl "https://api.clickup.com/api/v2/team/{team_id}/task?include_closed=false&subtasks=true" \
-H "Authorization: {api_key}"
Never query tasks without subtasks=true:
# ✅ CORRECT
?subtasks=true
# ❌ WRONG
(no subtasks parameter)
Why: Without this parameter, you miss potentially 70%+ of actual tasks. Parent tasks are just containers; real work happens in subtasks.
ClickUp API returns max 100 tasks per page. Always loop until last_page: true:
page=0
while true; do
result=$(curl -s "...&page=$page" -H "Authorization: $CLICKUP_API_KEY")
# Process tasks
echo "$result" | jq '.tasks[]'
# Check if done
is_last=$(echo "$result" | jq -r '.last_page')
[ "$is_last" = "true" ] && break
((page++))
done
Why: Workspaces with 300+ tasks need 3-4 pages. Missing pages = incomplete data.
# Parent tasks have parent=null
jq '.tasks[] | select(.parent == null)'
# Subtasks have parent != null
jq '.tasks[] | select(.parent != null)'
# Using helper script (recommended)
./scripts/clickup-query.sh task-count
# Direct API with jq
curl -s "https://api.clickup.com/api/v2/team/{team_id}/task?subtasks=true" \
-H "Authorization: {api_key}" | \
jq '{
total: (.tasks | length),
parents: ([.tasks[] | select(.parent == null)] | length),
subtasks: ([.tasks[] | select(.parent != null)] | length)
}'
# Using helper script (recommended)
./scripts/clickup-query.sh assignees
# Direct API
curl -s "https://api.clickup.com/api/v2/team/{team_id}/task?subtasks=true" \
-H "Authorization: {api_key}" | \
jq -r '.tasks[] |
if .assignees and (.assignees | length) > 0
then .assignees[0].username
else "Unassigned"
end' | sort | uniq -c | sort -rn
curl "https://api.clickup.com/api/v2/list/{list_id}/task" \
-X POST \
-H "Authorization: {api_key}" \
-H "Content-Type: application/json" \
-d '{
"name": "Task Name",
"description": "Description here",
"assignees": [user_id],
"status": "to do",
"priority": 3
}'
curl "https://api.clickup.com/api/v2/task/{task_id}" \
-X PUT \
-H "Authorization: {api_key}" \
-H "Content-Type: application/json" \
-d '{
"name": "Updated Name",
"status": "in progress",
"priority": 2
}'
# Using helper script
./scripts/clickup-query.sh task {task_id}
# Direct API
curl "https://api.clickup.com/api/v2/task/{task_id}" \
-H "Authorization: {api_key}"
curl "https://api.clickup.com/api/v2/team/{team_id}/task?space_ids[]={space_id}&subtasks=true" \
-H "Authorization: {api_key}"
curl "https://api.clickup.com/api/v2/list/{list_id}/task?subtasks=true" \
-H "Authorization: {api_key}"
curl "https://api.clickup.com/api/v2/team/{team_id}/task?include_closed=true&subtasks=true" \
-H "Authorization: {api_key}"
For detailed API documentation, query patterns, and troubleshooting:
Read: references/api-guide.md
Covers:
# Get all open tasks grouped by assignee
./scripts/clickup-query.sh assignees
# Get specific team member's tasks (use user ID, not username!)
curl "https://api.clickup.com/api/v2/team/{team_id}/task?subtasks=true&assignees[]={user_id}" \
-H "Authorization: {api_key}"
# Count tasks by status
./scripts/clickup-query.sh tasks | \
jq -r '.tasks[].status.status' | sort | uniq -c | sort -rn
# Find unassigned tasks
./scripts/clickup-query.sh tasks | \
jq '.tasks[] | select(.assignees | length == 0)'
# Count by priority
./scripts/clickup-query.sh tasks | \
jq -r '.tasks[] | .priority.priority // "none"' | sort | uniq -c | sort -rn
scripts/clickup-query.sh for common operations| head -n 5 firstassignees[]={user_id} parameter, not jq username matchingsubtasks=trueCLICKUP_API_KEY is set correctlyassignees[] param, not jq text matchingnpx claudepluginhub joshuarweaver/cascade-ai-ml-agents-misc-2 --plugin sundial-org-awesome-openclaw-skills-4Manages ClickUp tasks, sprints, comments, time tracking, custom fields, goals, and docs via the `cup` CLI tool. Useful for project management workflows.
Automates ClickUp project management including task creation, workspace navigation, comments, and team operations via Rube MCP (Composio).
Automates ClickUp project management via Composio's ClickUp toolkit, including task CRUD, workspace hierarchy navigation, comments, and team operations.