Skip to main content
Glama

update-task

Modify existing tasks in Dooray projects by updating fields like assignees, status, tags, or priority. Use this tool to change task details while preserving unmodified data.

Instructions

Update an existing task in a Dooray project.

RECOMMENDED WORKFLOW (guide for AI assistants):

  1. Fetch Current Task: Call get-task to retrieve current values before updating

    • Preserves existing data when only updating specific fields

    • Shows current assignees, tags, milestone, workflow status

    • Use returned data to know what values to preserve

  2. Determine Changes: Identify what needs updating

    • If changing assignees/cc: Get options from get-my-member-info, get-project-member-list, get-project-member-group-list

    • Member types: {"id": "...", "type": "member|group|email"}

    • "member": organizationMemberId, "group": group id, "email": email address

  3. Handle Tags: Call get-tag-list if updating tags

    • CRITICAL: Check tagGroup.mandatory=true - MUST include tags from all mandatory groups or update fails (500 error)

    • tagGroup.selectOne=true: Select exactly ONE tag from group

    • tagGroup.selectOne=false: Select one or MORE tags from group

    • IMPORTANT: tagIds is a COMPLETE replacement, not additive

  4. Handle Workflow: Use get-project-workflow-list to see available statuses

    • Provide workflowId to change task status

    • Workflow classes: backlog (대기), registered (등록/할 일), working (진행 중), closed (완료)

IMPORTANT NOTES:

  • Complete Replacement: assignees, cc, and tagIds completely REPLACE existing values (not merged)

  • Preserve Data: Only provide fields you want to change; unprovided fields remain unchanged

  • Korean Terms: "to" = 담당자 (assignee), "cc" = 참조 (reference)

  • Priority: Use "none" to remove priority

URL Pattern Recognition: When given a Dooray task URL like "https://nhnent.dooray.com/task/PROJECT_ID/TASK_ID":

  • Extract the first numeric ID after "/task/" as projectId

  • Extract the second numeric ID as taskNumber

Examples:

  • Change priority: {"projectId": "123", "taskNumber": 42, "priority": "high"}

  • Update assignees: {"projectId": "123", "taskNumber": 42, "assignees": [{"id": "user123", "type": "member"}]}

  • Change status: {"projectId": "123", "taskNumber": 42, "workflowId": "working"}

  • Update tags: {"projectId": "123", "taskNumber": 42, "tagIds": ["tag1", "tag2"]}

  • Clear milestone: {"projectId": "123", "taskNumber": 42, "milestoneId": null}

Returns: Updated task with all current details.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
projectIdYesProject ID where the task belongs
taskNumberYesTask number to update
subjectNoNew task subject/title
bodyNoNew task body content
assigneesNoNew complete list of assignees (담당자). REPLACES all existing assignees. To get options: (1) use get-my-member-info for current user, (2) use get-project-member-list for project members, (3) use get-project-member-group-list for member groups. Each assignee object has {id: string, type: "member"|"group"|"email"}.
ccNoNew complete list of CC recipients (참조). REPLACES all existing CC recipients. To get options: (1) use get-my-member-info for current user, (2) use get-project-member-list for project members, (3) use get-project-member-group-list for member groups. Each CC object has {id: string, type: "member"|"group"|"email"}.
dueDateNoNew due date in ISO 8601 format
milestoneIdNoNew milestone ID, or null to remove milestone
tagIdsNoNew complete array of tag IDs. REPLACES all existing tags. IMPORTANT: Check for mandatory tag groups using get-tag-list tool. Projects may require specific tags from mandatory tag groups, or update will fail with 500 error.
priorityNoTask priority level (highest, high, normal, low, lowest, none)
workflowIdNoNew workflow ID (status). Use get-project-workflow-list to see available workflow statuses for this project. Workflow classes: backlog (대기), registered (등록/할 일), working (진행 중), closed (완료).

Implementation Reference

  • The main handler function that executes the 'update-task' tool logic. It calls the Dooray projects API to update the task and returns the result or formatted error.
    export async function updateTaskHandler(args: UpdateTaskInput) {
      try {
        const result = await projectsApi.updateTask(args.projectId, args.taskNumber, {
          subject: args.subject,
          body: args.body,
          users: {
            to: transformMembers(args.assignees),
            cc: transformMembers(args.cc),
          },
          dueDate: args.dueDate,
          milestoneId: args.milestoneId,
          tagIds: args.tagIds,
          priority: args.priority,
          workflowId: args.workflowId,
        });
    
        return {
          content: [
            {
              type: 'text',
              text: JSON.stringify(result, null, 2),
            },
          ],
        };
      } catch (error) {
        return {
          content: [
            {
              type: 'text',
              text: `Error: ${formatError(error)}`,
            },
          ],
          isError: true,
        };
      }
    }
  • Zod schema definitions for validating the input parameters of the 'update-task' tool, including member, body, and the main updateTaskSchema.
    const memberSchema = z.object({
      id: z.string(),
      type: z.enum(['member', 'group', 'email']),
    });
    
    const bodySchema = z.object({
      mimeType: z.enum(['text/x-markdown', 'text/html']),
      content: z.string(),
    });
    
    export const updateTaskSchema = z.object({
      projectId: z.string().describe('Project ID'),
      taskNumber: z.number().describe('Task number to update'),
      subject: z.string().optional().describe('New task subject/title'),
      body: bodySchema.optional().describe('New task body content'),
      assignees: z.array(memberSchema).optional().describe('New list of assignees'),
      cc: z.array(memberSchema).optional().describe('New list of CC recipients'),
      dueDate: z.string().optional().describe('New due date (ISO 8601 format)'),
      milestoneId: z.string().nullable().optional().describe('New milestone ID (null to remove)'),
      tagIds: z.array(z.string()).optional().describe('New array of tag IDs'),
      priority: z.enum(['highest', 'high', 'normal', 'low', 'lowest', 'none']).optional().describe('Task priority level'),
      workflowId: z.string().optional().describe('New workflow ID (status)'),
    });
  • src/index.ts:52-53 (registration)
    Registration of the 'update-task' tool in the central toolRegistry, mapping the tool name to its handler and schema for use in the MCP server.
    'create-task': { handler: createTaskHandler, schema: createTaskSchema },
    'update-task': { handler: updateTaskHandler, schema: updateTaskSchema },
  • src/index.ts:25-25 (registration)
    Import statement bringing in the updateTaskTool, handler, and schema from the implementation file.
    import { updateTaskTool, updateTaskHandler, updateTaskSchema } from './tools/projects/update-task.js';
  • Tool metadata definition including the name 'update-task', detailed description, and JSON inputSchema for MCP tool listing.
    export const updateTaskTool = {
      name: 'update-task',
      description: `Update an existing task in a Dooray project.
    
    **RECOMMENDED WORKFLOW** (guide for AI assistants):
    
    1. **Fetch Current Task**: Call get-task to retrieve current values before updating
       - Preserves existing data when only updating specific fields
       - Shows current assignees, tags, milestone, workflow status
       - Use returned data to know what values to preserve
    
    2. **Determine Changes**: Identify what needs updating
       - If changing assignees/cc: Get options from get-my-member-info, get-project-member-list, get-project-member-group-list
       - Member types: {"id": "...", "type": "member|group|email"}
       - "member": organizationMemberId, "group": group id, "email": email address
    
    3. **Handle Tags**: Call get-tag-list if updating tags
       - **CRITICAL**: Check tagGroup.mandatory=true - MUST include tags from all mandatory groups or update fails (500 error)
       - tagGroup.selectOne=true: Select exactly ONE tag from group
       - tagGroup.selectOne=false: Select one or MORE tags from group
       - **IMPORTANT**: tagIds is a COMPLETE replacement, not additive
    
    4. **Handle Workflow**: Use get-project-workflow-list to see available statuses
       - Provide workflowId to change task status
       - Workflow classes: backlog (대기), registered (등록/할 일), working (진행 중), closed (완료)
    
    **IMPORTANT NOTES**:
    - **Complete Replacement**: assignees, cc, and tagIds completely REPLACE existing values (not merged)
    - **Preserve Data**: Only provide fields you want to change; unprovided fields remain unchanged
    - **Korean Terms**: "to" = 담당자 (assignee), "cc" = 참조 (reference)
    - **Priority**: Use "none" to remove priority
    
    **URL Pattern Recognition**:
    When given a Dooray task URL like "https://nhnent.dooray.com/task/PROJECT_ID/TASK_ID":
    - Extract the first numeric ID after "/task/" as projectId
    - Extract the second numeric ID as taskNumber
    
    **Examples**:
    - Change priority: {"projectId": "123", "taskNumber": 42, "priority": "high"}
    - Update assignees: {"projectId": "123", "taskNumber": 42, "assignees": [{"id": "user123", "type": "member"}]}
    - Change status: {"projectId": "123", "taskNumber": 42, "workflowId": "working"}
    - Update tags: {"projectId": "123", "taskNumber": 42, "tagIds": ["tag1", "tag2"]}
    - Clear milestone: {"projectId": "123", "taskNumber": 42, "milestoneId": null}
    
    Returns: Updated task with all current details.`,
      inputSchema: {
        type: 'object',
        properties: {
          projectId: {
            type: 'string',
            description: 'Project ID where the task belongs',
          },
          taskNumber: {
            type: 'number',
            description: 'Task number to update',
          },
          subject: {
            type: 'string',
            description: 'New task subject/title',
          },
          body: {
            type: 'object',
            properties: {
              mimeType: {
                type: 'string',
                enum: ['text/x-markdown', 'text/html'],
              },
              content: {
                type: 'string',
              },
            },
            required: ['mimeType', 'content'],
            description: 'New task body content',
          },
          assignees: {
            type: 'array',
            items: {
              type: 'object',
              properties: {
                id: { type: 'string' },
                type: { type: 'string', enum: ['member', 'group', 'email'] },
              },
              required: ['id', 'type'],
            },
            description: 'New complete list of assignees (담당자). REPLACES all existing assignees. To get options: (1) use get-my-member-info for current user, (2) use get-project-member-list for project members, (3) use get-project-member-group-list for member groups. Each assignee object has {id: string, type: "member"|"group"|"email"}.',
          },
          cc: {
            type: 'array',
            items: {
              type: 'object',
              properties: {
                id: { type: 'string' },
                type: { type: 'string', enum: ['member', 'group', 'email'] },
              },
              required: ['id', 'type'],
            },
            description: 'New complete list of CC recipients (참조). REPLACES all existing CC recipients. To get options: (1) use get-my-member-info for current user, (2) use get-project-member-list for project members, (3) use get-project-member-group-list for member groups. Each CC object has {id: string, type: "member"|"group"|"email"}.',
          },
          dueDate: {
            type: 'string',
            description: 'New due date in ISO 8601 format',
          },
          milestoneId: {
            type: ['string', 'null'],
            description: 'New milestone ID, or null to remove milestone',
          },
          tagIds: {
            type: 'array',
            items: { type: 'string' },
            description: 'New complete array of tag IDs. REPLACES all existing tags. IMPORTANT: Check for mandatory tag groups using get-tag-list tool. Projects may require specific tags from mandatory tag groups, or update will fail with 500 error.',
          },
          priority: {
            type: 'string',
            enum: ['highest', 'high', 'normal', 'low', 'lowest', 'none'],
            description: 'Task priority level (highest, high, normal, low, lowest, none)',
          },
          workflowId: {
            type: 'string',
            description: 'New workflow ID (status). Use get-project-workflow-list to see available workflow statuses for this project. Workflow classes: backlog (대기), registered (등록/할 일), working (진행 중), closed (완료).',
          },
        },
        required: ['projectId', 'taskNumber'],
      },
    };
Behavior5/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure and does so comprehensively. It explains critical behavioral traits: that assignees, cc, and tagIds completely replace existing values (not merged), that unprovided fields remain unchanged, that mandatory tag groups must be included or updates fail with 500 errors, and that Korean terms have specific meanings. It also provides URL pattern recognition guidance and multiple concrete examples of usage.

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

Conciseness4/5

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

The description is well-structured with clear sections (Recommended Workflow, Important Notes, URL Pattern Recognition, Examples) and uses bold formatting for emphasis. While lengthy, every section serves a clear purpose - the workflow steps are essential guidance, the notes cover critical behaviors, and the examples provide concrete usage patterns. The information is front-loaded with the core purpose first.

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

Completeness5/5

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

Given the complexity of this update tool with 11 parameters, nested objects, and no annotations or output schema, the description provides exceptional completeness. It covers the full update workflow, explains behavioral constraints, provides error prevention guidance (mandatory tag groups), includes localization notes (Korean terms), offers URL parsing help, and gives multiple examples. For a mutation tool with this complexity and no structured metadata, the description leaves no significant gaps.

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

Parameters4/5

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

While the input schema has 100% description coverage, the description adds significant semantic value beyond the schema. It explains the complete replacement behavior for assignees, cc, and tagIds (which the schema mentions but the description elaborates), provides workflow context for using other tools to get parameter values, explains Korean terminology, and gives concrete examples showing how parameters work together in practice. The description compensates for the lack of output schema by explaining what gets returned.

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

Purpose5/5

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

The description clearly states the specific action ('Update an existing task') and resource ('in a Dooray project'), distinguishing it from sibling tools like create-task (for new tasks) and get-task (for reading). The opening sentence provides immediate clarity about the tool's function.

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

Usage Guidelines5/5

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

The description provides explicit guidance on when and how to use this tool versus alternatives, including a detailed 4-step workflow that references sibling tools like get-task, get-my-member-info, get-project-member-list, get-project-member-group-list, get-tag-list, and get-project-workflow-list. It clearly explains prerequisites and dependencies for successful updates.

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/jhl8041/dooray-mcp'

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