ClickUp Multi-Workspace MCP Server
Enables AI agents to interact with tasks, spaces, lists, and folders across multiple ClickUp workspaces via the Model Context Protocol.
README
<p align="center"> <img src="assets/images/clickup-social.png" alt="ClickUp Multi-Workspace MCP Server" width="100%"> </p>
<h1 align="center">ClickUp Multi-Workspace MCP Server</h1>
<p align="center"> <a href="https://github.com/alanse-inc/clickup-multi-mcp-server/stargazers"> <img src="https://img.shields.io/github/stars/alanse-inc/clickup-multi-mcp-server?style=flat&logo=github" alt="GitHub Stars"> </a> <a href="https://www.npmjs.com/package/@alanse/clickup-multi-mcp-server"> <img src="https://img.shields.io/npm/v/@alanse/clickup-multi-mcp-server.svg?style=flat&logo=npm" alt="NPM Version"> </a> </p>
<p align="center"> A Model Context Protocol (MCP) server for integrating <strong>multiple ClickUp workspaces</strong> with AI applications. This server allows AI agents to interact with tasks, spaces, lists, and folders across different ClickUp workspaces through a standardized protocol. </p>
🎯 Key Feature: Multi-Workspace Support
This MCP server supports managing multiple ClickUp workspaces simultaneously, allowing you to:
- Work with multiple ClickUp accounts/teams
- Switch between workspaces seamlessly
- Maintain separate configurations for each workspace
- Full backwards compatibility with single workspace setup
Developed and maintained by Alanse Inc.
Requirements
- Node.js v18.0.0 or higher (required for MCP SDK compatibility)
- ClickUp API key and Team ID for each workspace you want to integrate
Quick Start
Claude Code CLI Setup
The easiest way to add this MCP server to Claude Code:
Single Workspace:
claude mcp add clickup \
-e CLICKUP_API_KEY=your_api_key_here \
-e CLICKUP_TEAM_ID=your_team_id_here \
-- npx -y @alanse/clickup-multi-mcp-server@latest
Multiple Workspaces:
claude mcp add clickup \
-e CLICKUP_WORKSPACES='{"default":"work","workspaces":{"work":{"token":"pk_xxx_work","teamId":"123456"},"personal":{"token":"pk_xxx_personal","teamId":"789012"}}}' \
-- npx -y @alanse/clickup-multi-mcp-server@latest
Manual Configuration
Single Workspace (Backwards Compatible)
The traditional single workspace setup still works exactly as before:
{
"mcpServers": {
"ClickUp": {
"command": "npx",
"args": ["-y", "@alanse/clickup-multi-mcp-server@latest"],
"env": {
"CLICKUP_API_KEY": "your-api-key",
"CLICKUP_TEAM_ID": "your-team-id"
}
}
}
}
Multiple Workspaces (New Feature)
Configure multiple workspaces using the CLICKUP_WORKSPACES environment variable.
Step 1: Create your workspace configuration
Create a JSON structure like this:
{
"default": "work",
"workspaces": {
"work": {
"token": "pk_xxx_work",
"teamId": "123456",
"description": "Work workspace"
},
"personal": {
"token": "pk_xxx_personal",
"teamId": "789012",
"description": "Personal projects"
}
}
}
Step 2: Use in your MCP settings
You can specify the configuration in a more readable multi-line format:
{
"mcpServers": {
"ClickUp": {
"command": "npx",
"args": ["-y", "@alanse/clickup-multi-mcp-server@latest"],
"env": {
// Multi-line format (most readable)
"CLICKUP_WORKSPACES": {
"default": "work",
"workspaces": {
"work": {
"token": "pk_xxx_work",
"teamId": "123456",
"description": "Work workspace"
},
"personal": {
"token": "pk_xxx_personal",
"teamId": "789012",
"description": "Personal projects"
}
}
}
}
}
}
}
Or as a JSON string (if your MCP client requires string format):
{
"mcpServers": {
"ClickUp": {
"command": "npx",
"args": ["-y", "@alanse/clickup-multi-mcp-server@latest"],
"env": {
"CLICKUP_WORKSPACES": "{\"default\":\"work\",\"workspaces\":{\"work\":{\"token\":\"pk_xxx_work\",\"teamId\":\"123456\"},\"personal\":{\"token\":\"pk_xxx_personal\",\"teamId\":\"789012\"}}}"
}
}
}
}
💡 Tip: Use an online JSON minifier and then escape the quotes, or use a script to generate the escaped string:
const config = {
default: "work",
workspaces: {
work: { token: "pk_xxx_work", teamId: "123456", description: "Work workspace" },
personal: { token: "pk_xxx_personal", teamId: "789012", description: "Personal projects" }
}
};
console.log(JSON.stringify(config));
// Copy the output and use it as CLICKUP_WORKSPACES value
Using Workspace Parameter
All tools now support an optional workspace parameter:
// Get tasks from default workspace
await getTasks({ list_id: "123456789" });
// Get tasks from specific workspace
await getTasks({ workspace: "personal", list_id: "987654321" });
// Get workspace hierarchy for a specific workspace
await getWorkspaceHierarchy({ workspace: "work" });
Local Development Setup
For local development or when running the server directly from source code:
1. Clone and Install
git clone https://github.com/alanse-inc/clickup-multi-mcp-server.git
cd clickup-multi-mcp-server
npm install
2. Configure Environment Variables
Copy .env.example to .env and configure your ClickUp credentials:
cp .env.example .env
Edit .env file:
# Multi-workspace configuration
CLICKUP_WORKSPACES={"default":"alanse","workspaces":{"alanse":{"token":"pk_YOUR_TOKEN_1","teamId":"YOUR_TEAM_ID_1","description":"Alanse workspace"},"potz":{"token":"pk_YOUR_TOKEN_2","teamId":"YOUR_TEAM_ID_2","description":"Potz workspace"}}}
# Or use single workspace (legacy)
# CLICKUP_API_KEY=your_api_key_here
# CLICKUP_TEAM_ID=your_team_id_here
Note: The .env file is automatically loaded when the server starts. Environment variables in .env are automatically picked up without needing to pass them via command line.
3. Build and Run
# Build the project
npm run build
# Run locally
node build/index.js
4. Configure Claude Code for Local Development
If you want to use your local build with Claude Code, update ~/.claude.json:
{
"mcpServers": {
"clickup": {
"type": "stdio",
"command": "node",
"args": ["/absolute/path/to/clickup-multi-mcp-server/build/index.js"]
}
}
}
Important: When using local build with Claude Code:
- Environment variables are loaded from
.envfile in the project root - No need to specify
envin~/.claude.json(unless you want to override.envvalues) - Rebuild after making changes:
npm run build
NPM Installation
This package is available on npm as @alanse/clickup-multi-mcp-server.
Add this entry to your client's MCP settings JSON file:
{
"mcpServers": {
"ClickUp": {
"command": "npx",
"args": [
"-y",
"@alanse/clickup-multi-mcp-server@latest"
],
"env": {
"CLICKUP_API_KEY": "your-api-key",
"CLICKUP_TEAM_ID": "your-team-id",
"DOCUMENT_SUPPORT": "true"
}
}
}
}
Or use this npx command:
npx -y @alanse/clickup-multi-mcp-server@latest --env CLICKUP_API_KEY=your-api-key --env CLICKUP_TEAM_ID=your-team-id
Obs: if you don't pass "DOCUMENT_SUPPORT": "true", the default is false and document support will not be active.
Tool Filtering
You can control which tools are available using two complementary environment variables:
ENABLED_TOOLS (Recommended)
Use ENABLED_TOOLS to specify exactly which tools should be available:
# Environment variable
export ENABLED_TOOLS="create_task,get_task,update_task,get_workspace_hierarchy"
# Command line argument
--env ENABLED_TOOLS=create_task,get_task,update_task,get_workspace_hierarchy
DISABLED_TOOLS (Legacy)
Use DISABLED_TOOLS to disable specific tools while keeping all others enabled:
# Environment variable
export DISABLED_TOOLS="delete_task,delete_bulk_tasks"
# Command line argument
--env DISABLED_TOOLS=delete_task,delete_bulk_tasks
Precedence Rules
- If
ENABLED_TOOLSis specified, only those tools will be available (takes precedence overDISABLED_TOOLS) - If only
DISABLED_TOOLSis specified, all tools except those listed will be available - If neither is specified, all tools are available (default behavior)
Example:
# Only enable task creation and reading tools
npx -y @alanse/clickup-multi-mcp-server@latest \
--env CLICKUP_API_KEY=your-api-key \
--env CLICKUP_TEAM_ID=your-team-id \
--env ENABLED_TOOLS=create_task,get_task,get_workspace_hierarchy
Please filter tools you don't need if you are having issues with the number of tools or any context limitations.
Running with HTTP Transport Support
The server supports both modern HTTP Streamable transport (MCP Inspector compatible) and legacy SSE (Server-Sent Events) transport for backwards compatibility.
{
"mcpServers": {
"ClickUp": {
"command": "npx",
"args": [
"-y",
"@alanse/clickup-multi-mcp-server@latest"
],
"env": {
"CLICKUP_API_KEY": "your-api-key",
"CLICKUP_TEAM_ID": "your-team-id",
"ENABLE_SSE": "true",
"PORT": "3231"
}
}
}
}
Endpoints:
- Primary:
http://127.0.0.1:3231/mcp(Streamable HTTP) - Legacy:
http://127.0.0.1:3231/sse(SSE for backwards compatibility)
Command Line Usage
npx -y @alanse/clickup-multi-mcp-server@latest --env CLICKUP_API_KEY=your-api-key --env CLICKUP_TEAM_ID=your-team-id --env ENABLE_SSE=true --env PORT=3231
Available configuration options:
| Option | Description | Default |
|---|---|---|
ENABLED_TOOLS |
Comma-separated list of tools to enable (takes precedence) | All tools |
DISABLED_TOOLS |
Comma-separated list of tools to disable | None |
ENABLE_SSE |
Enable the HTTP/SSE transport | false |
PORT |
Port for the HTTP server | 3231 |
ENABLE_STDIO |
Enable the STDIO transport | true |
ENABLE_SECURITY_FEATURES |
Enable security headers and logging | false |
ENABLE_HTTPS |
Enable HTTPS/TLS encryption | false |
ENABLE_ORIGIN_VALIDATION |
Validate Origin header against whitelist | false |
ENABLE_RATE_LIMIT |
Enable rate limiting protection | false |
🔒 Security Features
The server includes optional security enhancements for production deployments. All security features are opt-in and disabled by default to maintain backwards compatibility.
Quick security setup:
# Generate SSL certificates for HTTPS
./scripts/generate-ssl-cert.sh
# Start with full security
ENABLE_SECURITY_FEATURES=true \
ENABLE_HTTPS=true \
ENABLE_ORIGIN_VALIDATION=true \
ENABLE_RATE_LIMIT=true \
SSL_KEY_PATH=./ssl/server.key \
SSL_CERT_PATH=./ssl/server.crt \
npx @alanse/clickup-multi-mcp-server@latest --env CLICKUP_API_KEY=your-key --env CLICKUP_TEAM_ID=your-team --env ENABLE_SSE=true
HTTPS Endpoints:
- Primary:
https://127.0.0.1:3443/mcp(Streamable HTTPS) - Legacy:
https://127.0.0.1:3443/sse(SSE HTTPS for backwards compatibility) - Health:
https://127.0.0.1:3443/health(Health check)
For detailed security configuration, see Security Features Documentation.
n8n Integration
To integrate with n8n:
- Start the clickup-mcp-server with SSE enabled
- In n8n, add a new "MCP AI Tool" node
- Configure the node with:
- Transport: SSE
- Server URL:
http://localhost:3231(or your server address) - Tools: Select the ClickUp tools you want to use
Example Client
An example SSE client is provided in the examples directory. To run it:
# Start the server with SSE enabled
ENABLE_SSE=true PORT=3231 npx -y @alanse/clickup-multi-mcp-server@latest --env CLICKUP_API_KEY=your-api-key --env CLICKUP_TEAM_ID=your-team-id
# In another terminal, run the example client
cd examples
npm install
npm run sse-client
Features
| 📝 Task Management | 🏷️ Tag Management |
|---|---|
| • Create, update, and delete tasks<br>• Move and duplicate tasks anywhere<br>• Support for single and bulk operations<br>• Set start/due dates with natural language<br>• Create and manage subtasks<br>• Add comments and attachments | • Create, update, and delete space tags<br>• Add and remove tags from tasks<br>• Use natural language color commands<br>• Automatic contrasting foreground colors<br>• View all space tags<br>• Tag-based task organization across workspace |
| ⏱️ Time Tracking | 🌳 Workspace Organization |
| • View time entries for tasks<br>• Start/stop time tracking on tasks<br>• Add manual time entries<br>• Delete time entries<br>• View currently running timer<br>• Track billable and non-billable time | • Navigate spaces, folders, and lists<br>• Create and manage folders<br>• Organize lists within spaces<br>• Create lists in folders<br>• View workspace hierarchy<br>• Efficient path navigation |
| 📄 Document Management | 👥 Member Management |
| • Document Listing through all workspace<br>• Document Page listing<br>• Document Page Details<br>• Document Creation<br>• Document page update (append & prepend) | • Find workspace members by name or email<br>• Resolve assignees for tasks<br>• View member details and permissions<br>• Assign tasks to users during creation and updates<br>• Support for user IDs, emails, or usernames<br>• Team-wide user management |
| 👁️ View Management | |
| • Create and manage views across all hierarchy levels (Workspace, Space, Folder, List)<br>• Support for list, board, calendar, table, gantt, timeline, workload and more<br>• Update view grouping, sorting, and filter settings<br>• Delete views<br>• Retrieve tasks within a specific view (with pagination) | |
| ⚡ Integration Features | 🏗️ Architecture & Performance |
| • Global name or ID-based lookups<br>• Case-insensitive matching<br>• Markdown formatting support<br>• Built-in rate limiting<br>• Error handling and validation<br>• Comprehensive API coverage | • 70% codebase reduction for improved performance<br>• Unified architecture across all transport types<br>• Zero code duplication<br>• HTTP Streamable transport (MCP Inspector compatible)<br>• Legacy SSE support for backwards compatibility |
Available Tools (81 Total, 74 non-document)
| Tool | Description | Required Parameters |
|---|---|---|
| get_workspace_hierarchy | Get workspace structure | None |
| get_available_workspaces | Get all available workspaces | None |
| create_task | Create a task | name, (listId/listName) |
| create_bulk_tasks | Create multiple tasks | tasks[] |
| update_task | Modify task | taskId/taskName |
| update_bulk_tasks | Update multiple tasks | tasks[] with IDs or names |
| get_tasks | Get tasks from list | listId/listName |
| get_task | Get single task details | taskId/taskName (with smart disambiguation) |
| get_workspace_tasks | Get tasks with filtering | At least one filter (tags, list_ids, space_ids, etc.) |
| get_task_comments | Get comments on a task | taskId/taskName |
| create_task_comment | Add a comment to a task | commentText, (taskId/(taskName+listName)) |
| attach_task_file | Attach file to a task | taskId/taskName, (file_data or file_url) |
| delete_task | Remove task | taskId/taskName |
| delete_bulk_tasks | Remove multiple tasks | tasks[] with IDs or names |
| move_task | Move task | taskId/taskName, listId/listName |
| move_bulk_tasks | Move multiple tasks | tasks[] with IDs or names, target list |
| duplicate_task | Copy task | taskId/taskName, listId/listName |
| merge_task | Merge two tasks | taskId, mergeFromId |
| get_task_time_in_status | Get time in status for a task | taskId/taskName |
| get_bulk_tasks_time_in_status | Get bulk time in status | taskIds[] |
| add_task_to_list | Add task to additional list | listId, taskId |
| remove_task_from_list | Remove task from list | listId, taskId |
| create_list | Create list in space | name, spaceId/spaceName |
| create_folder | Create folder | name, spaceId/spaceName |
| create_list_in_folder | Create list in folder | name, folderId/folderName |
| get_folder | Get folder details | folderId/folderName |
| update_folder | Update folder properties | folderId/folderName |
| delete_folder | Delete folder | folderId/folderName |
| get_list | Get list details | listId/listName |
| update_list | Update list properties | listId/listName |
| delete_list | Delete list | listId/listName |
| get_space_tags | Get space tags | spaceId/spaceName |
| create_space_tag | Create tag | tagName, spaceId/spaceName |
| update_space_tag | Update tag | tagName, spaceId/spaceName |
| delete_space_tag | Delete tag | tagName, spaceId/spaceName |
| add_tag_to_task | Add tag to task | tagName, taskId/(taskName+listName) |
| remove_tag_from_task | Remove tag from task | tagName, taskId/(taskName+listName) |
| get_task_time_entries | Get time entries for a task | taskId/taskName |
| start_time_tracking | Start time tracking on a task | taskId/taskName |
| stop_time_tracking | Stop current time tracking | None |
| add_time_entry | Add manual time entry to a task | taskId/taskName, start, duration |
| delete_time_entry | Delete a time entry | timeEntryId |
| get_current_time_entry | Get currently running timer | None |
| get_workspace_members | Get all workspace members | None |
| find_member_by_name | Find member by name or email | nameOrEmail |
| resolve_assignees | Resolve member names to IDs | assignees[] |
| create_document | Create a document | workspaceId, name, parentId/parentType, visibility, create_pages |
| get_document | Get a document | workspaceId/documentId |
| list_documents | List documents | workspaceId, documentId/creator/deleted/archived/parent_id/parent_type/limit/next_cursor |
| list_document_pages | List document pages | documentId/documentName |
| get_document_pages | Get document pages | documentId/documentName, pageIds |
| create_document_pages | Create a document page | workspaceId/documentId, parent_page_id/name/sub_title,content/content_format |
| update_document_page | Update a document page | workspaceId/documentId, name/sub_title,content/content_edit_mode/content_format |
See full documentation for optional parameters and advanced usage.
Member Management Tools
When creating or updating tasks, you can assign users using the assignees parameter. The parameter accepts an array of user IDs, emails, or usernames:
Creating tasks with assignees:
{
"name": "New Task",
"description": "This is a new task.",
"assignees": ["jdoe@example.com", "Jane Smith"] // Emails, usernames, or user IDs
}
Updating task assignees:
{
"taskId": "abc123",
"assignees": ["newuser@example.com"] // Replace existing assignees
}
The member management tools help resolve user references when needed.
Prompts
Not yet implemented and not supported by all client apps. Request a feature for a Prompt implementation that would be most beneficial for your workflow (without it being too specific). Examples:
| Prompt | Purpose | Features |
|---|---|---|
| summarize_tasks | Task overview | Status summary, priorities, relationships |
| analyze_priorities | Priority optimization | Distribution analysis, sequencing |
| generate_description | Task description creation | Objectives, criteria, dependencies |
Error Handling
The server provides clear error messages for:
- Missing required parameters
- Invalid IDs or names
- Items not found
- Permission issues
- API errors
- Rate limiting
The LOG_LEVEL environment variable can be specified to control the verbosity of server logs. Valid values are trace, debug, info, warn, and error (default).
This can be also be specified on the command line as, e.g. --env LOG_LEVEL=info.
License
This project is licensed under the MIT License - see the LICENSE file for details.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。