clickup-skill
Enterprise-grade ClickUp project management integration with advanced reporting, multi-workspace support.
Installation
npx clawhub@latest install clickup-skillView the full skill documentation and source below.
Documentation
ClickUp Skill
Enterprise-grade ClickUp integration for agency workflows. Manage multiple clients, projects, and workspaces with advanced reporting, automatic subtask handling, and sophisticated folder organization.
Key Benefits
| Feature | Why It Matters |
| π Always includes subtasks | Never miss 70%+ of actual work β subtasks included automatically |
| π Advanced reporting | Task counts, workload distribution, status breakdowns, standup reports |
| π’ Multi-workspace | Seamlessly switch between Client Work, Product Development, Personal Projects, and more |
| π₯ Client organization | Structured folders: π Client Overview, π Completed Work, active projects |
| π Sales pipeline | Track proposals, negotiations, and project lifecycles |
| β±οΈ Time tracking | Built-in timers and manual entries with billing support |
| π Document management | Create docs and pages via API v3 |
| π Task relationships | Dependencies, blocking/waiting, and arbitrary task linking |
Quick Start
Setup
Set your ClickUp API token:export CLICKUP_API_TOKEN="pk_your_token_here"
Get your token from: ClickUp Settings β Apps β Generate API Token
Basic Operations
List all workspaces:
python skills/clickup/scripts/clickup_client.py get_teams
Create a task:
python skills/clickup/scripts/clickup_client.py create_task list_id="123" name="New Task" status="to do"
Update a task:
python skills/clickup/scripts/clickup_client.py update_task task_id="abc" status="in progress"
Workspace Hierarchy
Team (Workspace)
βββ Spaces
β βββ Folders
β β βββ Lists β Tasks
β βββ Lists (Folderless) β Tasks
βββ Documents
All operations require explicit workspace identification via IDs.
Multi-Workspace Support
This skill supports operations across multiple ClickUp workspaces:
get_teams to list available workspacesteam_id in operationscustom_task_ids=true and team_idCommon Workflows
Workflow: Create Task in Specific Workspace
get_teamsget_spaces team_id="xxx"get_folders space_id="yyy" β get_lists folder_id="zzz"create_task list_id="aaa" name="Task" ...Workflow: Configure Space Statuses
get_space space_id="xxx"update_space space_id="xxx" statuses=[...]See API Reference for status configuration format.
Workflow: Track Time on Task
Option A - Manual Entry:
python skills/clickup_client.py create_time_entry \
team_id="xxx" \
task_id="yyy" \
duration=3600000 \
description="Worked on feature"
Option B - Timer:
# Start timer
python skills/clickup/scripts/clickup_client.py start_timer team_id="xxx" task_id="yyy"
# Stop timer (stops current running timer for user)
python skills/clickup/scripts/clickup_client.py stop_timer team_id="xxx"
Workflow: Create Document Structure
create_doc workspace_id="xxx" name="Project Docs"Note: Documents use ClickUp API v3 (workspace_id instead of team_id).
Workflow: Reporting & Analytics
Get task counts (with parent/subtask breakdown):
python skills/clickup/scripts/clickup_client.py task_counts team_id="xxx"
# Returns: {"total": 50, "parents": 20, "subtasks": 30, "unassigned": 5}
Get workload by assignee:
python skills/clickup/scripts/clickup_client.py assignee_breakdown team_id="xxx"
# Returns: {"John Doe": 15, "Jane Smith": 12, "Unassigned": 8}
Get tasks by status:
python skills/clickup/scripts/clickup_client.py status_breakdown team_id="xxx"
# Returns: {"to do": 20, "in progress": 10, "complete": 15}
Get tasks by priority:
python skills/clickup/scripts/clickup_client.py priority_breakdown team_id="xxx"
# Returns: {"urgent": 2, "high": 5, "normal": 15, "low": 8, "none": 20}
Daily standup report (grouped by status):
# All team members
python skills/clickup/scripts/clickup_client.py standup_report team_id="xxx"
# Specific person (use user ID)
python skills/clickup/scripts/clickup_client.py standup_report team_id="xxx" assignee_id="12345"
Get all tasks with pagination (auto-handled):
python skills/clickup/scripts/clickup_client.py get_all_tasks team_id="xxx"
# Always includes subtasks automatically (critical!)
Filter reports by space or assignee:
# Specific space
python skills/clickup/scripts/clickup_client.py task_counts team_id="xxx" space_ids='["SPACE_ID_HERE"]'
# Specific assignee
python skills/clickup/scripts/clickup_client.py get_all_tasks team_id="xxx" assignees='["12345"]'
# Include closed tasks
python skills/clickup/scripts/clickup_client.py task_counts team_id="xxx" include_closed="true"
Critical Rules for Reporting:
subtasks=trueget_all_tasks loops until all pages retrievedparent: null, subtasks have parent: "task_id"Workflow: Link Doc to Task
Option A - Add as attachment:
python skills/clickup/scripts/clickup_client.py link_doc_to_task \
task_id="xxx" \
doc_id="yyy"
Option B - Mention in description:
python skills/clickup/scripts/clickup_client.py mention_doc_in_task \
task_id="xxx" \
doc_id="yyy"
Both create clickable links to the document from the task.
Workflow: Task Dependencies
Set up blocking relationship:
# Task B is blocked by/waiting on Task A
python skills/clickup/scripts/clickup_client.py add_dependency \
task_id="TASK_B_ID" \
depends_on="TASK_A_ID"
# Check dependencies
python skills/clickup/scripts/clickup_client.py get_dependencies \
task_id="TASK_B_ID"
# Remove dependency
python skills/clickup/scripts/clickup_client.py remove_dependency \
task_id="TASK_B_ID" \
depends_on="TASK_A_ID"
Set up reverse dependency (task is blocking another):
# Task A is blocking Task B
python skills/clickup/scripts/clickup_client.py add_dependency \
task_id="TASK_A_ID" \
waiting_on="TASK_B_ID"
Workflow: Link Related Tasks (Non-Dependency)
For related tasks that aren't blocking each other:
# Link Task A to Task B (arbitrary relationship)
python skills/clickup/scripts/clickup_client.py link_tasks \
task_id="TASK_A_ID" \
links_to="TASK_B_ID"
# Remove link
python skills/clickup/scripts/clickup_client.py unlink_tasks \
task_id="TASK_A_ID" \
links_to="TASK_B_ID"
Note: link_tasks creates a "linked task" relationship (appears in task's "Linked Tasks" section), while add_dependency creates blocking/waiting relationships.
Workflow: Bulk Task Operations
For bulk operations, loop through tasks:
# Get tasks
TASKS=$(python skills/clickup/scripts/clickup_client.py get_tasks list_id="xxx")
# Process each (parse JSON and loop)
Script Reference
scripts/clickup_client.py
Main CLI interface for ClickUp operations.
Usage:
python scripts/clickup_client.py <command> [key=value ...]
Commands:
Workspace Operations
get_teams- List all accessible workspaces
Space Operations
get_spaces team_id="xxx"- List spacescreate_space team_id="xxx" name="Name" [options...]- Create spaceupdate_space space_id="xxx" [options...]- Update space
Folder Operations
get_folders space_id="xxx"- List folderscreate_folder space_id="xxx" name="Name"- Create folder
List Operations
get_lists folder_id="xxx"- Lists in folderget_space_lists space_id="xxx"- Folderless listscreate_list folder_id="xxx" name="Name" [options...]- Create in foldercreate_space_list space_id="xxx" name="Name" [options...]- Create folderless
Task Operations
get_task task_id="xxx"- Get task details (includes dependencies, linked tasks)get_tasks list_id="xxx" [filters...]- List taskscreate_task list_id="xxx" name="Name" [options...]- Create taskupdate_task task_id="xxx" [options...]- Update task
Time Tracking
get_time_entries team_id="xxx" [filters...]- List entriescreate_time_entry team_id="xxx" task_id="yyy" duration=3600000 [...]- Create entrystart_timer team_id="xxx" task_id="yyy"- Start timerstop_timer team_id="xxx"- Stop timer
Documents (API v3)
get_docs workspace_id="xxx"- List documentscreate_doc workspace_id="xxx" name="Name" [options...]- Create documentget_doc doc_id="xxx"- Get document details
Doc-Task Linking
link_doc_to_task task_id="xxx" doc_id="yyy"- Attach doc URL to taskmention_doc_in_task task_id="xxx" doc_id="yyy"- Add doc link to task description
Task Dependencies (Blocking/Waiting On)
add_dependency task_id="xxx" depends_on="yyy"- Task is blocked by/waiting on another taskadd_dependency task_id="xxx" waiting_on="yyy"- Another task is blocked by/waiting on this taskremove_dependency task_id="xxx" depends_on="yyy"- Remove dependencyget_dependencies task_id="xxx"- List all dependencies for a task
Task Linking (Arbitrary Relationships)
link_tasks task_id="xxx" links_to="yyy"- Create arbitrary link between tasksunlink_tasks task_id="xxx" links_to="yyy"- Remove task link
Reporting & Analytics
get_all_tasks team_id="xxx" [include_closed="true"] [space_ids='["id1"]'] [assignees='["uid1"]']- All tasks with auto-pagination (always includes subtasks)task_counts team_id="xxx" [filters...]- Count breakdown: total, parents, subtasks, unassignedassignee_breakdown team_id="xxx" [filters...]- Workload distribution by assigneestatus_breakdown team_id="xxx" [filters...]- Tasks grouped by statuspriority_breakdown team_id="xxx" [filters...]- Tasks grouped by prioritystandup_report team_id="xxx" [assignee_id="yyy"]- Daily standup report grouped by status
Documents
get_docs team_id="xxx"- List documentscreate_doc team_id="xxx" name="Name" [options...]- Create document
Advanced Configuration
Custom Fields
To work with custom fields:
GET /list/{list_id}/field (see API Reference)python skills/clickup/scripts/clickup_client.py update_task \
task_id="xxx" \
'custom_fields=[{"id":"field_id","value":"value"}]'
Status Configuration
When creating/updating spaces or lists:
python skills/clickup/scripts/clickup_client.py update_space \
space_id="xxx" \
'statuses=[{"status":"To Do","type":"open"},{"status":"Done","type":"closed"}]'
Priority Levels
1- Urgent2- High3- Normal4- Low
Error Handling
Common errors and solutions:
| Error | Cause | Solution |
401 Unauthorized | Invalid API token | Check CLICKUP_API_TOKEN |
404 Not Found | Invalid ID | Verify workspace/space/folder/list/task IDs |
429 Too Many Requests | Rate limit | Wait and retry (100 req/min limit) |
400 Bad Request | Invalid parameters | Check JSON format in arguments |
Python Client Usage
For complex operations, import the client directly:
from skills.clickup.scripts.clickup_client import ClickUpClient
client = ClickUpClient()
# Get all workspaces
teams = client.get_teams()
# Create task with full control
task = client.create_task(
list_id="123",
name="Complex Task",
description="Detailed description",
assignees=[123, 456],
tags=["urgent", "client"],
priority=2,
due_date=1704067200000,
time_estimate=14400000
)
References
- API Details: See references/api_reference.md for complete endpoint documentation, request/response formats, and field types.
- ClickUp API Docs:
Best Practices
TOOLS.md for quick reference.custom_task_ids=true and team_id in task operations.team_id when working across workspaces to avoid modifying wrong workspace.