企业级ClickUp项目管理系统集成,具备高级报表、多工作区支持及客户/项目追踪。核心功能: (1)多工作区任务管理,支持自动切换工作区; (2)高级分析与报表(任务计数、负责人拆分、状态/优先级分析、每日站会报告),自动包含子任务并支持分页; (3)客户文件夹组织与项目跟踪; (4)对空间、文件夹、列表、任务及自定义字段的完整 CRUD 操作; (5)时间追踪与计时管理,支持计费; (6)文档创建与页面管理(API v3); (7)任务依赖、链接与关系映射; (8)销售管道追踪,涵盖潜在客户/项目状态; (9)常驻服务与周期性账单管理。专为在复杂工作区层级下管理多客户的代理机构打造。
Enterprise-grade ClickUp integration for agency workflows. Manage multiple clients, projects, and workspaces with advanced reporting, automatic subtask handling, and sophisticated folder organization.
FeatureWhy It Matters🔍 Always includes subtasksNever miss 70%+ of actual work — subtasks included automatically📊 Advanced reportingTask counts, workload distribution, status breakdowns, standup reports🏢 Multi-workspaceSeamlessly switch between Elevated, Atrium, Winch Life, and more👥 Client organizationStructured folders: 📋 Client Overview, 📁 Completed Work, active projects📈 Sales pipelineTrack proposals, negotiations, and project lifecycles**⏱️ Time trackingBuilt-in timers and manual entries with billing support📄 Document managementCreate docs and pages via API v3🔗 Task relationships**Dependencies, blocking/waiting, and arbitrary task linking
Set your ClickUp API token:
bash
export CLICKUP_API_TOKEN="pk_your_token_here"
Get your token from: ClickUp Settings → Apps → Generate API Token
List all workspaces:
bash
python scripts/clickup_client.py get_teams
Create a task:
bash
python scripts/clickup_client.py create_task list_id="123" name="New Task" status="to do"
Update a task:
bash
python scripts/clickup_client.py update_task task_id="abc" status="in progress"
text
Team (Workspace)
├── Spaces
│ ├── Folders
│ │ └── Lists → Tasks
│ └── Lists (Folderless) → Tasks
└── Documents
All operations require explicit workspace identification via IDs.
This skill supports operations across multiple ClickUp workspaces:
get_teams to list available workspacesteam_id in operationscustom_task_ids=true and team_idget_teamsget_spaces team_id="xxx"get_folders space_id="yyy" → get_lists folder_id="zzz"create_task list_id="aaa" name="Task" ...get_space space_id="xxx"update_space space_id="xxx" statuses=[...]See API Reference for status configuration format.
Option A - Manual Entry:
bash
python scripts/clickup_client.py create_time_entry \
team_id="xxx" \
task_id="yyy" \
duration=3600000 \
description="Worked on feature"
Option B - Timer:
bash
# Start timer
python scripts/clickup_client.py start_timer team_id="xxx" task_id="yyy"
# Stop timer (stops current running timer for user)
python scripts/clickup_client.py stop_timer team_id="xxx"
create_doc workspace_id="xxx" name="Project Docs"Note: Documents use ClickUp API v3 (workspace_id instead of team_id).
Get task counts (with parent/subtask breakdown):
bash
python scripts/clickup_client.py task_counts team_id="xxx"
# Returns: {"total": 50, "parents": 20, "subtasks": 30, "unassigned": 5}
Get workload by assignee:
bash
python scripts/clickup_client.py assignee_breakdown team_id="xxx"
# Returns: {"John Doe": 15, "Jane Smith": 12, "Unassigned": 8}
Get tasks by status:
bash
python scripts/clickup_client.py status_breakdown team_id="xxx"
# Returns: {"to do": 20, "in progress": 10, "complete": 15}
Get tasks by priority:
bash
python 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):
bash
# All team members
python scripts/clickup_client.py standup_report team_id="xxx"
# Specific person (use user ID)
python scripts/clickup_client.py standup_report team_id="xxx" assignee_id="12345"
Get all tasks with pagination (auto-handled):
bash
python scripts/clickup_client.py get_all_tasks team_id="xxx"
# Always includes subtasks automatically (critical!)
Filter reports by space or assignee:
bash
# Specific space
python scripts/clickup_client.py task_counts team_id="xxx" space_ids='["90172290075"]'
# Specific assignee
python scripts/clickup_client.py get_all_tasks team_id="xxx" assignees='["12345"]'
# Include closed tasks
python 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"Option A - Add as attachment:
bash
python scripts/clickup_client.py link_doc_to_task \
task_id="xxx" \
doc_id="yyy"
Option B - Mention in description:
bash
python scripts/clickup_client.py mention_doc_in_task \
task_id="xxx" \
doc_id="yyy"
Both create clickable links to the document from the task.
Set up blocking relationship:
bash
# Task B is blocked by/waiting on Task A
python scripts/clickup_client.py add_dependency \
task_id="TASK_B_ID" \
depends_on="TASK_A_ID"
# Check dependencies
python scripts/clickup_client.py get_dependencies \
task_id="TASK_B_ID"
# Remove dependency
python scripts/clickup_client.py remove_dependency \
task_id="TASK_B_ID" \
depends_on="TASK_A_ID"
Set up reverse dependency (task is blocking another):
bash
# Task A is blocking Task B
python scripts/clickup_client.py add_dependency \
task_id="TASK_A_ID" \
waiting_on="TASK_B_ID"
For related tasks that aren't blocking each other:
bash
# Link Task A to Task B (arbitrary relationship)
python scripts/clickup_client.py link_tasks \
task_id="TASK_A_ID" \
links_to="TASK_B_ID"
# Remove link
python 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.
For bulk operations, loop through tasks:
bash
# Get tasks
TASKS=$(python scripts/clickup_client.py get_tasks list_id="xxx")
# Process each (parse JSON and loop)
Main CLI interface for ClickUp operations.
Usage:
bash
python scripts/clickup_client.py <command> [key=value ...]
Commands:
get_teams - List all accessible workspacesget_spaces team_id="xxx" - List spacescreate_space team_id="xxx" name="Name" [options...] - Create spaceupdate_space space_id="xxx" [options...] - Update spaceget_folders space_id="xxx" - List folderscreate_folder space_id="xxx" name="Name" - Create folderget_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 folderlessget_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 taskget_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 timerget_docs workspace_id="xxx" - List documentscreate_doc workspace_id="xxx" name="Name" [options...] - Create documentget_doc doc_id="xxx" - Get document detailsNote on Pages: Doc pages API is in beta. Pages may need to be created via ClickUp UI.
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 descriptionadd_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 tasklink_tasks task_id="xxx" links_to="yyy" - Create arbitrary link between tasksunlink_tasks task_id="xxx" links_to="yyy" - Remove task linkget_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 statusget_docs team_id="xxx" - List documentscreate_doc team_id="xxx" name="Name" [options...] - Create documentTo work with custom fields:
Get field definitions: GET /list/{list_id}/field (see API Reference)
Set values when creating/updating tasks: bash
python scripts/clickup_client.py update_task \
task_id="xxx" \
'custom_fields=[{"id":"field_id","value":"value"}]'
When creating/updating spaces or lists:
bash
python scripts/clickup_client.py update_space \
space_id="xxx" \
'statuses=[{"status":"To Do","type":"open"},{"status":"Done","type":"closed"}]'
1 - Urgent2 - High3 - Normal4 - LowCommon errors and solutions:
ErrorCauseSolution401 UnauthorizedInvalid API tokenCheck CLICKUP_API_TOKEN404 Not FoundInvalid IDVerify workspace/space/folder/list/task IDs429 Too Many RequestsRate limitWait and retry (100 req/min limit)400 Bad RequestInvalid parametersCheck JSON format in arguments
For complex operations, import the client directly:
python
from 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
)
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.