clickup

$npx mdskill add vm0-ai/vm0-skills/clickup

Execute ClickUp API tasks and manage workspaces instantly.

  • Retrieve and modify tasks across nested workspace hierarchies.
  • Depends on ClickUp API v2 with numeric resource IDs.
  • Triggers on user mentions of ClickUp or shared workspace links.
  • Returns structured JSON data for programmatic integration.
SKILL.md
.github/skills/clickupView on GitHub ↗
---
name: clickup
description: ClickUp API for tasks and spaces. Use when user mentions "ClickUp", "clickup.com",
  shares a ClickUp link, "ClickUp task", or asks about ClickUp workspace.
---

## Troubleshooting

If requests fail, run `zero doctor check-connector --env-name CLICKUP_TOKEN` or `zero doctor check-connector --url https://api.clickup.com/api/v2/user --method GET`

## How to Use

All examples below assume you have `CLICKUP_TOKEN` set.

Base URL: `https://api.clickup.com/api/v2`

ClickUp uses numeric IDs for all resources. The hierarchy is: Workspace (team) > Space > Folder > List > Task.

## User & Workspaces

### Get Authorized User

```bash
curl -s "https://api.clickup.com/api/v2/user" --header "Authorization: Bearer $CLICKUP_TOKEN" | jq '.user | {id, username, email}'
```

### List Workspaces

```bash
curl -s "https://api.clickup.com/api/v2/team" --header "Authorization: Bearer $CLICKUP_TOKEN" | jq '.teams[] | {id, name}'
```

## Spaces

### List Spaces in a Workspace

```bash
curl -s "https://api.clickup.com/api/v2/team/<team_id>/space?archived=false" --header "Authorization: Bearer $CLICKUP_TOKEN" | jq '.spaces[] | {id, name}'
```

### Get Space Details

```bash
curl -s "https://api.clickup.com/api/v2/space/<space_id>" --header "Authorization: Bearer $CLICKUP_TOKEN" | jq '.'
```

### Create Space

Write to `/tmp/clickup_request.json`:

```json
{
  "name": "New Space",
  "multiple_assignees": true,
  "features": {
    "due_dates": { "enabled": true },
    "time_tracking": { "enabled": true }
  }
}
```

```bash
curl -s -X POST "https://api.clickup.com/api/v2/team/<team_id>/space" --header "Authorization: Bearer $CLICKUP_TOKEN" --header "Content-Type: application/json" -d @/tmp/clickup_request.json | jq '{id, name}'
```

### Delete Space

```bash
curl -s -X DELETE "https://api.clickup.com/api/v2/space/<space_id>" --header "Authorization: Bearer $CLICKUP_TOKEN"
```

## Folders

### List Folders in a Space

```bash
curl -s "https://api.clickup.com/api/v2/space/<space_id>/folder?archived=false" --header "Authorization: Bearer $CLICKUP_TOKEN" | jq '.folders[] | {id, name}'
```

### Create Folder

Write to `/tmp/clickup_request.json`:

```json
{
  "name": "New Folder"
}
```

```bash
curl -s -X POST "https://api.clickup.com/api/v2/space/<space_id>/folder" --header "Authorization: Bearer $CLICKUP_TOKEN" --header "Content-Type: application/json" -d @/tmp/clickup_request.json | jq '{id, name}'
```

### Update Folder

Write to `/tmp/clickup_request.json`:

```json
{
  "name": "Updated Folder Name"
}
```

```bash
curl -s -X PUT "https://api.clickup.com/api/v2/folder/<folder_id>" --header "Authorization: Bearer $CLICKUP_TOKEN" --header "Content-Type: application/json" -d @/tmp/clickup_request.json | jq '{id, name}'
```

### Delete Folder

```bash
curl -s -X DELETE "https://api.clickup.com/api/v2/folder/<folder_id>" --header "Authorization: Bearer $CLICKUP_TOKEN"
```

## Lists

### List Lists in a Folder

```bash
curl -s "https://api.clickup.com/api/v2/folder/<folder_id>/list?archived=false" --header "Authorization: Bearer $CLICKUP_TOKEN" | jq '.lists[] | {id, name, task_count}'
```

### List Folderless Lists in a Space

```bash
curl -s "https://api.clickup.com/api/v2/space/<space_id>/list?archived=false" --header "Authorization: Bearer $CLICKUP_TOKEN" | jq '.lists[] | {id, name, task_count}'
```

### Create List

Write to `/tmp/clickup_request.json`:

```json
{
  "name": "New List",
  "content": "List description here"
}
```

```bash
curl -s -X POST "https://api.clickup.com/api/v2/folder/<folder_id>/list" --header "Authorization: Bearer $CLICKUP_TOKEN" --header "Content-Type: application/json" -d @/tmp/clickup_request.json | jq '{id, name}'
```

### Update List

Write to `/tmp/clickup_request.json`:

```json
{
  "name": "Updated List Name",
  "content": "Updated description"
}
```

```bash
curl -s -X PUT "https://api.clickup.com/api/v2/list/<list_id>" --header "Authorization: Bearer $CLICKUP_TOKEN" --header "Content-Type: application/json" -d @/tmp/clickup_request.json | jq '{id, name}'
```

### Delete List

```bash
curl -s -X DELETE "https://api.clickup.com/api/v2/list/<list_id>" --header "Authorization: Bearer $CLICKUP_TOKEN"
```

## Tasks

### List Tasks in a List

```bash
curl -s "https://api.clickup.com/api/v2/list/<list_id>/task?archived=false" --header "Authorization: Bearer $CLICKUP_TOKEN" | jq '.tasks[] | {id, name, status: .status.status, assignees: [.assignees[].username], due_date}'
```

### Get Task Details

```bash
curl -s "https://api.clickup.com/api/v2/task/<task_id>" --header "Authorization: Bearer $CLICKUP_TOKEN" | jq '{id, name, description, status: .status.status, priority: .priority, due_date, assignees: [.assignees[].username]}'
```

### Create Task

Write to `/tmp/clickup_request.json`:

```json
{
  "name": "New Task",
  "description": "Task description here",
  "status": "to do",
  "priority": 3,
  "due_date": 1774934400000,
  "due_date_time": false
}
```

```bash
curl -s -X POST "https://api.clickup.com/api/v2/list/<list_id>/task" --header "Authorization: Bearer $CLICKUP_TOKEN" --header "Content-Type: application/json" -d @/tmp/clickup_request.json | jq '{id, name, status: .status.status}'
```

### Create Task with Assignees

Write to `/tmp/clickup_request.json`:

```json
{
  "name": "Assigned Task",
  "description": "Task with assignees",
  "assignees": [123456],
  "status": "to do",
  "priority": 2
}
```

```bash
curl -s -X POST "https://api.clickup.com/api/v2/list/<list_id>/task" --header "Authorization: Bearer $CLICKUP_TOKEN" --header "Content-Type: application/json" -d @/tmp/clickup_request.json | jq '{id, name, assignees: [.assignees[].username]}'
```

### Update Task

Write to `/tmp/clickup_request.json`:

```json
{
  "name": "Updated Task Name",
  "description": "Updated description",
  "status": "in progress",
  "priority": 1
}
```

```bash
curl -s -X PUT "https://api.clickup.com/api/v2/task/<task_id>" --header "Authorization: Bearer $CLICKUP_TOKEN" --header "Content-Type: application/json" -d @/tmp/clickup_request.json | jq '{id, name, status: .status.status}'
```

### Delete Task

```bash
curl -s -X DELETE "https://api.clickup.com/api/v2/task/<task_id>" --header "Authorization: Bearer $CLICKUP_TOKEN"
```

### Get Filtered Team Tasks

```bash
curl -s "https://api.clickup.com/api/v2/team/<team_id>/task?statuses[]=to%20do&statuses[]=in%20progress&assignees[]=<user_id>&page=0" --header "Authorization: Bearer $CLICKUP_TOKEN" | jq '.tasks[] | {id, name, status: .status.status}'
```

## Comments

### List Task Comments

```bash
curl -s "https://api.clickup.com/api/v2/task/<task_id>/comment" --header "Authorization: Bearer $CLICKUP_TOKEN" | jq '.comments[] | {id, comment_text, user: .user.username, date}'
```

### Create Task Comment

Write to `/tmp/clickup_request.json`:

```json
{
  "comment_text": "This is a comment on the task."
}
```

```bash
curl -s -X POST "https://api.clickup.com/api/v2/task/<task_id>/comment" --header "Authorization: Bearer $CLICKUP_TOKEN" --header "Content-Type: application/json" -d @/tmp/clickup_request.json | jq '.'
```

### Update Comment

Write to `/tmp/clickup_request.json`:

```json
{
  "comment_text": "Updated comment text."
}
```

```bash
curl -s -X PUT "https://api.clickup.com/api/v2/comment/<comment_id>" --header "Authorization: Bearer $CLICKUP_TOKEN" --header "Content-Type: application/json" -d @/tmp/clickup_request.json | jq '.'
```

### Delete Comment

```bash
curl -s -X DELETE "https://api.clickup.com/api/v2/comment/<comment_id>" --header "Authorization: Bearer $CLICKUP_TOKEN"
```

## Time Tracking

### List Time Entries

```bash
curl -s "https://api.clickup.com/api/v2/team/<team_id>/time_entries" --header "Authorization: Bearer $CLICKUP_TOKEN" | jq '.data[] | {id, task: .task.name, duration, start, end}'
```

### Create Time Entry

Write to `/tmp/clickup_request.json`:

```json
{
  "description": "Working on task",
  "start": 1774934400000,
  "duration": 3600000,
  "tid": "<task_id>"
}
```

```bash
curl -s -X POST "https://api.clickup.com/api/v2/team/<team_id>/time_entries" --header "Authorization: Bearer $CLICKUP_TOKEN" --header "Content-Type: application/json" -d @/tmp/clickup_request.json | jq '.data | {id, duration, start}'
```

### Delete Time Entry

```bash
curl -s -X DELETE "https://api.clickup.com/api/v2/team/<team_id>/time_entries/<timer_id>" --header "Authorization: Bearer $CLICKUP_TOKEN"
```

## Tags

### List Space Tags

```bash
curl -s "https://api.clickup.com/api/v2/space/<space_id>/tag" --header "Authorization: Bearer $CLICKUP_TOKEN" | jq '.tags[] | {name, tag_fg, tag_bg}'
```

### Add Tag to Task

```bash
curl -s -X POST "https://api.clickup.com/api/v2/task/<task_id>/tag/<tag_name>" --header "Authorization: Bearer $CLICKUP_TOKEN"
```

### Remove Tag from Task

```bash
curl -s -X DELETE "https://api.clickup.com/api/v2/task/<task_id>/tag/<tag_name>" --header "Authorization: Bearer $CLICKUP_TOKEN"
```

## Guidelines

1. ClickUp uses numeric IDs for all resources. Use `jq` to extract `id` and `name` fields.
2. The resource hierarchy is: Workspace (team) > Space > Folder > List > Task. Lists can also exist directly under a Space (folderless lists).
3. Task statuses are lowercase strings (e.g., `to do`, `in progress`, `complete`). Available statuses depend on the list configuration.
4. Priority values: 1 (urgent), 2 (high), 3 (normal), 4 (low). Use `null` for no priority.
5. Dates are Unix timestamps in milliseconds. Convert with: `date -d "2026-04-01" +%s000`.
6. Pagination: tasks endpoint returns up to 100 results per page. Use `page=0`, `page=1`, etc.
7. Use `archived=false` query parameter to exclude archived items from list endpoints.
8. Write request bodies to `/tmp/clickup_request.json` before sending.
9. Rate limits: ClickUp allows 100 requests per minute per token. Back off on 429 responses.
10. Use `<placeholder>` for dynamic IDs that the user must replace (e.g., `<task_id>`, `<list_id>`).
More from vm0-ai/vm0-skills