Skip to main content
Glama
Leanware-io

ClickUp MCP Integration

by Leanware-io

clickup_update_task_by_custom_id

Modify ClickUp tasks using their custom IDs to update names, descriptions, priorities, due dates, tags, time estimates, assignees, and parent relationships.

Instructions

Update a task by its custom ID

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
custom_idYesClickUp custom task ID
nameNoTask name
markdown_descriptionNoTask description in markdown format
priorityNoTask priority (1-4): 1=Urgent, 2=High, 3=Normal, 4=Low
due_dateNoDue date as Unix timestamp in milliseconds
tagsNoArray of tag names to add to the task
time_estimateNoTime estimate in milliseconds
assigneesNoUser IDs to add or remove from the task
parentNoParent task ID to move this task as a subtask

Implementation Reference

  • Defines the MCP tool 'clickup_update_task_by_custom_id' including input schema, description, and handler function. The handler extracts parameters, constructs UpdateTaskParams, calls taskService.updateTaskByCustomId, and returns the JSON response.
    const updateTaskByCustomIdTool = defineTool((z) => ({
      name: "clickup_update_task_by_custom_id",
      description: "Update a task by its custom ID",
      inputSchema: {
        custom_id: z.string().describe("ClickUp custom task ID"),
        name: z.string().optional().describe("Task name"),
        markdown_description: z
          .string()
          .optional()
          .describe("Task description in markdown format"),
        priority: z
          .number()
          .optional()
          .describe("Task priority (1-4): 1=Urgent, 2=High, 3=Normal, 4=Low"),
        due_date: z
          .number()
          .optional()
          .describe("Due date as Unix timestamp in milliseconds"),
        tags: z
          .array(z.string())
          .optional()
          .describe("Array of tag names to add to the task"),
        time_estimate: z
          .number()
          .optional()
          .describe("Time estimate in milliseconds"),
        assignees: z
          .object({
            add: z
              .array(z.number())
              .optional()
              .describe("Array of user IDs to add to the task"),
            rem: z
              .array(z.number())
              .optional()
              .describe("Array of user IDs to remove from the task"),
          })
          .optional()
          .describe("User IDs to add or remove from the task"),
        parent: z
          .string()
          .optional()
          .describe("Parent task ID to move this task as a subtask"),
      },
      handler: async (input): Promise<any> => {
        const { custom_id, ...updateData } = input;
        const taskParams: UpdateTaskParams = {
          name: updateData.name,
          markdown_description: updateData.markdown_description,
          priority: updateData.priority,
          due_date: updateData.due_date,
          tags: updateData.tags,
          time_estimate: updateData.time_estimate,
          assignees: updateData.assignees,
          parent: updateData.parent,
        };
    
        const response = await taskService.updateTaskByCustomId(
          custom_id,
          taskParams
        );
        return {
          content: [{ type: "text", text: JSON.stringify(response) }],
        };
      },
    }));
  • Implements the core logic for updating a ClickUp task by custom ID via PUT request to the ClickUp API endpoint /task/{customId} with custom_task_ids=true.
    async updateTaskByCustomId(
      customId: string,
      params: UpdateTaskParams
    ): Promise<ClickUpTask> {
      return this.request<ClickUpTask>(
        `/task/${customId}?custom_task_ids=true&team_id=${this.workspaceId}`,
        {
          method: "PUT",
          body: JSON.stringify(params),
        }
      );
    }
  • src/index.ts:89-91 (registration)
    Registers all tools, including 'clickup_update_task_by_custom_id', to the MCP server by calling server.tool() in a loop over the tools array.
    tools.forEach((tool) => {
      server.tool(tool.name, tool.description, tool.inputSchema, tool.handler);
    });
  • src/index.ts:35-35 (registration)
    Includes the updateTaskByCustomIdTool in the tools array used for registration.
    updateTaskByCustomIdTool,
  • Exports the defined tool for use in registration.
    export {
      getTaskByCustomIdTool,
      getTaskTool,
      createTaskTool,
      updateTaskTool,
      updateTaskByCustomIdTool,
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden for behavioral disclosure. While 'Update' implies a mutation operation, the description doesn't address permissions required, whether updates are partial or complete, what happens to unspecified fields, error conditions, or rate limits. This leaves significant behavioral gaps for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, clear sentence that states exactly what the tool does without any wasted words. It's perfectly front-loaded with the essential information and achieves maximum efficiency in minimal space.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with 9 parameters, no annotations, and no output schema, the description is inadequate. It doesn't explain what fields can be updated, how partial updates work, what the response contains, or error handling. The combination of mutation complexity and lack of structured metadata demands more comprehensive description content.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 100% description coverage, providing detailed documentation for all 9 parameters including the nested 'assignees' object. The description adds no additional parameter information beyond what's already in the schema, so it meets the baseline expectation but doesn't enhance understanding of parameter usage or relationships.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb ('Update') and resource ('a task by its custom ID'), making the purpose immediately understandable. However, it doesn't differentiate this tool from its sibling 'clickup_update_task' (which presumably updates by regular ID rather than custom ID), missing an opportunity for full sibling distinction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance about when to use this tool versus alternatives like 'clickup_update_task' or 'clickup_get_task_by_custom_id'. There's no mention of prerequisites, constraints, or appropriate contexts for choosing this specific update method over others.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Leanware-io/clickup-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server