MCP Server
The clickup-cli CLI (or clkup for short) includes a built-in Model Context Protocol server, allowing LLMs to interact with ClickUp through structured tool calls instead of shell commands.
143 tools covering 100% of the ClickUp API — every endpoint available via CLI is also available as an MCP tool.
Setup
Claude Desktop
Add to your Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"clickup": {
"command": "clickup-cli",
"args": ["mcp", "serve"]
}
}
}
Cursor
Add to your Cursor MCP settings:
{
"mcpServers": {
"clickup": {
"command": "clickup-cli",
"args": ["mcp", "serve"]
}
}
}
Claude Code
Add .mcp.json to your project root:
{
"mcpServers": {
"clickup-cli": {
"command": "/opt/homebrew/bin/clickup-cli",
"args": ["mcp", "serve"]
}
}
}
Or generate it automatically:
clickup-cli agent-config init --mcp
Note: Use the full path to clickup-cli (run which clickup-cli to find it). Use clickup-cli as the server name to avoid conflicts with other ClickUp MCP integrations.
Docker
Run the MCP server as a Docker container:
# Build
docker build -t clickup-cli .
# Run MCP server (stdio)
docker run -i --rm \
-v ~/.config/clickup-cli:/root/.config/clickup-cli \
clickup-cli mcp serve
Or configure with environment variable:
docker run -i --rm \
-e CLICKUP_TOKEN=pk_your_token \
-e CLICKUP_WORKSPACE=your_workspace_id \
clickup-cli mcp serve
Use in .mcp.json:
{
"mcpServers": {
"clickup-cli": {
"command": "docker",
"args": ["run", "-i", "--rm", "-e", "CLICKUP_TOKEN=pk_your_token", "-e", "CLICKUP_WORKSPACE=your_workspace_id", "clickup-cli", "mcp", "serve"]
}
}
}
Prerequisites
Run clickup-cli setup --token pk_your_token first, or create a project-level .clickup.toml:
clickup-cli agent-config init --token pk_your_token --workspace 12345 --mcp
This creates both .clickup.toml (auth config) and .mcp.json (MCP server config) in one command.
Limiting MCP tools
By default clickup-cli mcp serve exposes all 143 tools. You can restrict this at startup to shrink the LLM’s context and enforce access control. The server also logs the active filter to stderr on startup (e.g. MCP: profile=read, exposing 52/143 tools), so you can verify the configuration at a glance. Flags and matching env vars:
| Flag | Env var | Purpose |
|---|---|---|
--profile <name> |
CLICKUP_MCP_PROFILE |
Preset: all (default), read, safe |
--read-only |
CLICKUP_MCP_READ_ONLY=1 |
Alias for --profile read |
--groups a,b,c |
CLICKUP_MCP_GROUPS |
Include only these resource groups |
--exclude-groups x,y |
CLICKUP_MCP_EXCLUDE_GROUPS |
Drop these groups |
--tools t1,t2 |
CLICKUP_MCP_TOOLS |
Include only these tools by exact name |
--exclude-tools t1 |
CLICKUP_MCP_EXCLUDE_TOOLS |
Drop these tools |
--read-only agent:
{
"mcpServers": {
"clickup": {
"command": "clickup-cli",
"args": ["mcp", "serve", "--read-only"]
}
}
}
Task-focused agent (task + comment + time groups only):
{
"mcpServers": {
"clickup": {
"command": "clickup-cli",
"args": ["mcp", "serve", "--groups", "task,comment,time"]
}
}
}
Filtered tools are rejected at tools/call as well as hidden from tools/list, so a misbehaving agent can’t smuggle a destructive call past the filter.
vs. ClickUp’s official MCP server
ClickUp ships its own MCP server. Both are valid, aimed at different use cases.
clickup-cli mcp serve (this project) |
ClickUp official MCP | |
|---|---|---|
| Auth | Personal API token | OAuth only |
| Hosting | Local (stdio) | ClickUp-hosted (HTTPS) |
| Data residency | Stays on your machine | Routed through ClickUp |
| Tool count | 143 (100% API coverage) | Curated subset |
| Output | Token-optimized (~98% smaller than raw JSON) | Not specified |
| Filtering | --profile read/safe/all + group/tool allowlist/denylist |
— |
| Offline / air-gapped | ✅ | ❌ |
| Setup | clickup-cli mcp serve (or via .mcp.json) |
OAuth flow |
Pick this project when you want local execution, personal-token auth, complete API coverage, and the ability to shape a read-only or task-focused agent via the filter flags.
Pick ClickUp’s official when you want OAuth (multi-user), zero install, or a curated tool set that ClickUp maintains.
Available Tools (143)
| Category | Tools | Count |
|---|---|---|
| Auth | whoami, auth_check | 2 |
| Workspaces | workspace_list, workspace_seats, workspace_plan | 3 |
| Spaces | space_list, space_get, space_create, space_update, space_delete | 5 |
| Folders | folder_list, folder_get, folder_create, folder_update, folder_delete | 5 |
| Lists | list_list, list_get, list_create, list_update, list_delete, list_add_task, list_remove_task | 7 |
| Tasks | task_list, task_get, task_create, task_update, task_delete, task_search, task_time_in_status, task_move, task_set_estimate, task_replace_estimates, task_add_dep, task_remove_dep, task_link, task_unlink, task_add_tag, task_remove_tag | 16 |
| Checklists | checklist_create, checklist_update, checklist_delete, checklist_add_item, checklist_update_item, checklist_delete_item | 6 |
| Comments | comment_list, comment_create, comment_update, comment_delete, comment_replies, comment_reply | 6 |
| Tags | tag_list, tag_create, tag_update, tag_delete | 4 |
| Custom Fields | field_list, field_set, field_unset | 3 |
| Task Types | task_type_list | 1 |
| Attachments | attachment_list, attachment_upload | 2 |
| Time Tracking | time_list, time_get, time_create, time_update, time_delete, time_start, time_stop, time_current, time_tags, time_add_tags, time_remove_tags, time_rename_tag, time_history | 13 |
| Goals | goal_list, goal_get, goal_create, goal_update, goal_delete, goal_add_kr, goal_update_kr, goal_delete_kr | 8 |
| Views | view_list, view_get, view_create, view_update, view_delete, view_tasks | 6 |
| Members | member_list | 1 |
| Users | user_get, user_invite, user_update, user_remove | 4 |
| Chat (v3) | chat_channel_list, chat_channel_create, chat_channel_get, chat_channel_update, chat_channel_delete, chat_channel_followers, chat_channel_members, chat_dm, chat_message_list, chat_message_send, chat_message_update, chat_message_delete, chat_reaction_list, chat_reaction_add, chat_reaction_remove, chat_reply_list, chat_reply_send, chat_tagged_users | 18 |
| Docs (v3) | doc_list, doc_get, doc_create, doc_pages, doc_get_page, doc_add_page, doc_edit_page | 7 |
| Webhooks | webhook_list, webhook_create, webhook_update, webhook_delete | 4 |
| Templates | template_list, template_apply_task, template_apply_list, template_apply_folder | 4 |
| Guests | guest_get, guest_invite, guest_update, guest_remove, guest_share_task, guest_unshare_task, guest_share_list, guest_unshare_list, guest_share_folder, guest_unshare_folder | 10 |
| Groups | group_list, group_create, group_update, group_delete | 4 |
| Roles | role_list | 1 |
| Shared | shared_list | 1 |
| Audit Logs | audit_log_query | 1 |
| ACLs | acl_update | 1 |
All tool names are prefixed with clickup_ (e.g., clickup_task_list).
How It Works
The MCP server uses JSON-RPC 2.0 over stdio. It reads requests from stdin and writes responses to stdout. The server uses the same HTTP client and authentication as the CLI commands, and returns token-efficient compact responses — the same field flattening as the CLI’s table output, but as JSON. Status objects, priority objects, assignee arrays, and timestamps are all flattened to simple values.
LLM ↔ JSON-RPC (stdio) ↔ clickup-cli mcp serve ↔ ClickUp API
↓
Compact JSON response
(flattened, essential fields only)
CLI vs MCP
| CLI Mode (recommended) | MCP Mode | |
|---|---|---|
| Setup cost | ~1,000 tokens (once) | 143 tool schemas loaded into context |
| Setup | clickup-cli agent-config inject |
Add to MCP server config |
| Output | Token-efficient tables (default) | Token-efficient compact JSON |
| Integration | Shell commands via agent | Native tool calls |
| Coverage | All ~130 endpoints | All ~130 endpoints (143 tools) |
| Best for | Claude Code, shell-based agents | Claude Desktop, Cursor, VS Code |
The CLI approach is preferred for token efficiency — it costs ~1,000 tokens once for the full command reference, while MCP tool schemas consume significantly more context per session. Both have 100% API coverage with token-efficient output.
Use MCP when your tool requires native tool integration (e.g., Claude Desktop doesn’t run shell commands).
Both modes deliver ~98% token reduction compared to raw API JSON. Both use the same authentication and config file.