npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

@alanse/clickup-multi-mcp-server

v1.0.1

Published

ClickUp MCP Server with Multi-Workspace Support - Integrate multiple ClickUp workspaces with AI through Model Context Protocol

Readme

🎯 Key Feature: Multi-Workspace Support

This fork adds support for 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

Based on the excellent clickup-mcp-server by Talib Kareem.

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" });

Smithery Installation (Quick Start)

smithery badge

The server is hosted on Smithery. There, you can preview the available tools or copy the commands to run on your specific client app.

NPX Installation

NPM Version Dependency Status NPM Downloads

Add this entry to your client's MCP settings JSON file:

{
  "mcpServers": {
    "ClickUp": {
      "command": "npx",
      "args": [
        "-y",
        "@taazkareem/clickup-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 @taazkareem/clickup-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_TOOLS is specified, only those tools will be available (takes precedence over DISABLED_TOOLS)
  • If only DISABLED_TOOLS is 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 @taazkareem/clickup-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",
        "@taazkareem/clickup-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 @taazkareem/clickup-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 @taazkareem/clickup-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:

  1. Start the clickup-mcp-server with SSE enabled
  2. In n8n, add a new "MCP AI Tool" node
  3. 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 @taazkareem/clickup-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• Move and duplicate tasks anywhere• Support for single and bulk operations• Set start/due dates with natural language• Create and manage subtasks• Add comments and attachments | • Create, update, and delete space tags• Add and remove tags from tasks• Use natural language color commands• Automatic contrasting foreground colors• View all space tags• Tag-based task organization across workspace | | ⏱️ Time Tracking | 🌳 Workspace Organization | | • View time entries for tasks• Start/stop time tracking on tasks• Add manual time entries• Delete time entries• View currently running timer• Track billable and non-billable time | • Navigate spaces, folders, and lists• Create and manage folders• Organize lists within spaces• Create lists in folders• View workspace hierarchy• Efficient path navigation | | 📄 Document Management | 👥 Member Management | | • Document Listing through all workspace• Document Page listing• Document Page Details• Document Creation• Document page update (append & prepend) | • Find workspace members by name or email• Resolve assignees for tasks• View member details and permissions• Assign tasks to users during creation and updates• Support for user IDs, emails, or usernames• Team-wide user management | | ⚡ Integration Features | 🏗️ Architecture & Performance | | • Global name or ID-based lookups• Case-insensitive matching• Markdown formatting support• Built-in rate limiting• Error handling and validation• Comprehensive API coverage | • 70% codebase reduction for improved performanceUnified architecture across all transport typesZero code duplicationHTTP Streamable transport (MCP Inspector compatible)Legacy SSE support for backwards compatibility |

Available Tools (36 Total)

| Tool | Description | Required Parameters | | ------------------------------------------------------------------ | ------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | | get_workspace_hierarchy | Get workspace structure | 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 | | 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": ["[email protected]", "Jane Smith"]  // Emails, usernames, or user IDs
}

Updating task assignees:

{
  "taskId": "abc123",
  "assignees": ["[email protected]"]  // 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.

Support the Developer

When using this server, you may occasionally see a small sponsor message with a link to this repository included in tool responses. I hope you can support the project! If you find this project useful, please consider supporting:

Sponsor TaazKareem

Acknowledgements

Special thanks to ClickUp for their excellent API and services that make this integration possible.

Contributing

Contributions are welcome! Please read our Contributing Guide for details.

License

License: MIT

This project is licensed under the MIT License - see the LICENSE file for details.

Disclaimer

This software makes use of third-party APIs and may reference trademarks or brands owned by third parties. The use of such APIs or references does not imply any affiliation with or endorsement by the respective companies. All trademarks and brand names are the property of their respective owners. This project is an independent work and is not officially associated with or sponsored by any third-party company mentioned.