The missing ClickUp CLI. Built for developers and AI agents.
Project description
clickup-cli
The missing ClickUp CLI. Built for developers and AI agents.
There's no official ClickUp CLI. If you're a developer who lives in the terminal, or an AI agent that needs structured data from ClickUp, this fills the gap. JSON stdout, errors to stderr, dry-run on every mutation.
Documentation
Install
pip install clickup-cli
Setup
clickup init
This prompts for your API token, discovers your workspaces and spaces, identifies your user, and writes a config file to ~/.config/clickup-cli/config.json.
clickup init stores each configured space alias with its canonical space_id. It does not preload one list per space during setup. Add list_id later only if you want a cached default list for list-bound commands.
If you have a single workspace, it's selected automatically. Same for user detection in single-member workspaces.
Get your API token at app.clickup.com/settings/apps.
Quick Start
clickup spaces list # see your spaces
clickup tasks list --space <name> # list tasks
clickup tasks search "login bug" # search across workspace
clickup tasks get abc123 # get task + comments
clickup --dry-run tasks create --space <name> --name "Fix auth" # preview
clickup tasks create --space <name> --name "Fix auth" # create for real
clickup comments add abc123 --text "Done" # add a comment
For AI Agents
This CLI is designed to be used by AI coding agents (Claude Code, Codex, etc.) as a tool for interacting with ClickUp.
What makes it agent-friendly:
- All output is JSON on stdout — easy to parse
- Errors go to stderr with non-zero exit code — easy to detect
- Every command has detailed
--help— agents can self-discover usage --dry-runon all mutations — agents can preview before acting--prettyfor readable output during debugging- Flag aliases for all positional args — agents can use
--task-id,--query,--doc-id,--comment-idetc. instead of positional arguments (both forms work) - Auto-infer
--spacefrom--list—tasks create --list 12345 --name "Fix bug"works without--space - Bounded defaults with completeness metadata —
tasks listandtasks searchbound pagination by default, andtasks getbounds comment hydration by default; each response includes metadata showing whether the result is complete or truncated
Plug-and-play skill file: Copy .claude/skills/clickup-cli.md from this repo into your project's .claude/skills/ directory. It teaches Claude Code how to use the CLI: command discovery, safety patterns, common workflows.
Minimal system prompt snippet:
You have access to the `clickup` CLI for managing ClickUp tasks and docs.
Use `clickup <group> --help` to discover commands.
Always use `--dry-run` before mutating commands.
Output is JSON on stdout; errors go to stderr.
Commands
| Group | Subcommands | Description |
|---|---|---|
init |
— | Interactive workspace setup |
tasks |
list, get, create, update, search, delete, move, merge, lists, add-to-list, remove-from-list, depend, link | Full task CRUD + memberships, links, and dependencies |
comments |
list, add, update, delete, thread, reply | Full comment CRUD with threading |
docs |
list, get, create, pages, get-page, edit-page, create-page | Docs and page management |
fields |
list | Custom field discovery for list or space scope |
folders |
list, get, create, update, delete, privacy | Folder CRUD + privacy toggle |
lists |
list, get, create, update, delete, privacy | List CRUD + privacy toggle |
spaces |
list, get, create, update, delete, statuses, privacy | Full space CRUD + statuses + privacy toggle |
team |
whoami, members | Workspace and member info |
tags |
list, add, remove | Tag management |
task-types |
list | Workspace custom task type discovery |
Use clickup <group> <command> --help for detailed usage, examples, and return format.
Global Flags
--pretty Pretty-print JSON output
--dry-run Preview mutations without executing
--debug Log API requests and responses to stderr
--version Show version
Global flags can appear before or after the command group:
clickup --pretty tasks list --space <name>
clickup tasks list --space <name> --pretty
Key Behaviors
- Flag aliases — every positional argument also accepts a
--flagform.tasks get abc123andtasks get --task-id abc123are equivalent. Same for--query,--doc-id,--page-id,--folder-id,--list-id,--comment-id,--space. - Raw numeric IDs on
--spaceand--folderflags are accepted transparently alongside config aliases. On tasks commands, list-bound commands may resolve a raw space ID to its first folderless list via one API call. tasks createauto-infers--spacefrom--listvia API lookup. You can omit--spaceif--listis provided, and create also supports start/due dates, time estimates, points, repeatable--custom-fieldvalues, and--task-type.tasks updatehandles core fields, assignee diffs (--add-assignee/--remove-assignee), tag diffs (--add-tag/--remove-tag), and custom fields (--custom-field FIELD_ID=VALUE) in one call. All flags are repeatable;--dry-runreturns a structured plan.tasks lists/tasks add-to-list/tasks remove-from-listlet you inspect and manage multi-list task membership separately from home-list moves.tasks linkmanages non-blocking linked-task relationships; usetasks dependfor blocking dependencies.tasks depend—add,remove, andlistfor task dependencies. Direction required on add/remove via--depends-onor--depended-on-by.fields list/task-types listexpose custom field metadata and workspace custom item types for search/create flows.tasks list/tasks search --include-archived— second paginated call witharchived=true, merged into the default results. Since ClickUp'sarchivedparam is a filter, this is the only way to see both in one command.tasks list/tasks searchbounded defaults — by default, these commands fetch a bounded aggregate scan and returnpages_fetched,results_complete, andresults_truncated. Use--all-pagesfor an exhaustive scan.tasks list --full/tasks search --fullreturn full task objects with a normalizedstatusdict shape ({status, color, type, orderindex}), not just the compact projection.tasks getauto-fetches comments and appends them to the output. By default this is a bounded slice and the response includescomment_count_returned,comments_complete, andcomments_truncated. Use--all-commentsfor exhaustive comment hydration or--no-commentsto skip it.tasks searchauto-detects task ID patterns likePROJ-39and applies prefix filtering.docs edit-page --appendreads the current page content, appends your new content, and sends one update.- Tag names are auto-lowercased (ClickUp API stores them lowercase regardless of UI display).
- Doc ID ≠ page ID. Always use
docs pages <doc_id>to discover page IDs before usingget-pageoredit-page.
Configuration
Config file
clickup init creates ~/.config/clickup-cli/config.json:
{
"api_token": "pk_...",
"workspace_id": "12345",
"user_id": "67890",
"spaces": {
"myspace": {"space_id": "111"},
"myspace-with-default-list": {"space_id": "111", "list_id": "222"}
}
}
space_id is the identity of a configured alias. list_id is optional convenience for commands that need a default list; space-scoped commands still target the full space when the command supports full-space scope.
Config resolution order
CLICKUP_CONFIG_PATHenv var → exact file path~/.config/clickup-cli/config.json→ default locationclickup-config.jsonin current working directory → project-local override
Environment variables
| Variable | Purpose |
|---|---|
CLICKUP_API_TOKEN |
API token (overrides config file token) |
CLICKUP_WORKSPACE_ID |
Workspace ID (auto-detected if you have one workspace) |
CLICKUP_USER_ID |
User ID for task assignment |
CLICKUP_CONFIG_PATH |
Custom config file path |
You can run without a config file by setting just CLICKUP_API_TOKEN — the workspace ID is auto-detected if your account has a single workspace. Set CLICKUP_WORKSPACE_ID explicitly for multi-workspace accounts.
Coverage and Gaps
Covered: tasks (including multi-list membership, links, dependencies, custom field writes, and task-type-aware create flows), comments, docs/pages, custom field discovery, folders, lists, spaces, tags, task type discovery, team/workspace info.
Not yet covered: checklists, time tracking, attachments, goals, webhooks, automations.
Contributor Notes
Contributor setup stays intentionally standard:
pip install -e ".[dev]"pytest -vruff check src/ tests/
Project-specific maintainer automation and agent tooling live in repo-local config files and are documented in CONTRIBUTING.md, so the main README can stay focused on public CLI usage.
Contributing
git clone https://github.com/efetoker/clickup-cli.git
cd clickup-cli
pip install -e ".[dev]"
pytest -v
See CONTRIBUTING.md for the current manifest-driven command workflow, test layout, and maintainer notes. Public integration and support docs are linked in the Documentation section above.
Issues and PRs welcome at github.com/efetoker/clickup-cli.
License
MIT
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file clickup_cli-1.7.0.tar.gz.
File metadata
- Download URL: clickup_cli-1.7.0.tar.gz
- Upload date:
- Size: 105.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
36984d8b6d43b309f898da58a19bb6ee9515a407dc855f10218754e649021598
|
|
| MD5 |
b018ff60e4e87835a0398cc4852fae86
|
|
| BLAKE2b-256 |
692db44b6141b15c121f1a5fad4e6b5acdfade9d578bd5389cb02ba95b59ca20
|
File details
Details for the file clickup_cli-1.7.0-py3-none-any.whl.
File metadata
- Download URL: clickup_cli-1.7.0-py3-none-any.whl
- Upload date:
- Size: 56.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7a951920018358c4a6228b9a495b7b4f616a7ad487e57b5482567e247b781ed2
|
|
| MD5 |
4c786dbfa257bbe00ecb249e4962d2cf
|
|
| BLAKE2b-256 |
c3ee8ff5a032ffdad4b6f7a0cf34dfcaff7a4b2ddf0dd9c078e93111a8fa734d
|