todoist_create_comment
Add comments to Todoist tasks or projects to provide context, share updates, or attach files for better collaboration and task clarity.
Instructions
Create a new comment on a task or project
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | The content/text of the comment | |
| taskId | No | Task ID to add comment to (provide either taskId or projectId, not both) | |
| projectId | No | Project ID to add comment to (provide either taskId or projectId, not both) | |
| attachment | No | Optional file attachment (optional) |
Implementation Reference
- src/index.ts:1720-1738 (handler)Handler for the 'todoist_create_comment' tool. Validates arguments using isCreateCommentArgs type guard, constructs comment data, calls todoistClient.addComment(), formats the response using formatComment helper, and handles errors.if (name === "todoist_create_comment") { if (!isCreateCommentArgs(args)) { return { content: [{ type: "text", text: "Invalid arguments for create_comment" }], isError: true }; } try { const commentData: any = { content: args.content }; if (args.taskId) commentData.taskId = args.taskId; if (args.projectId) commentData.projectId = args.projectId; if (args.attachment) commentData.attachment = args.attachment; const comment = await todoistClient.addComment(commentData); return { content: [{ type: "text", text: `Comment created:\n${formatComment(comment)}` }], isError: false }; } catch (error: any) { return { content: [{ type: "text", text: `Error creating comment: ${error.message}` }], isError: true }; } }
- src/index.ts:583-614 (schema)Tool schema definition for 'todoist_create_comment', specifying input parameters: required 'content', optional 'taskId' or 'projectId' (exactly one), and optional 'attachment' object.const CREATE_COMMENT_TOOL: Tool = { name: "todoist_create_comment", description: "Create a new comment on a task or project", inputSchema: { type: "object", properties: { content: { type: "string", description: "The content/text of the comment" }, taskId: { type: "string", description: "Task ID to add comment to (provide either taskId or projectId, not both)" }, projectId: { type: "string", description: "Project ID to add comment to (provide either taskId or projectId, not both)" }, attachment: { type: "object", description: "Optional file attachment (optional)", properties: { fileName: { type: "string" }, fileType: { type: "string" }, fileUrl: { type: "string" }, resourceType: { type: "string" } } } }, required: ["content"] } };
- src/index.ts:1083-1121 (registration)Registration of the 'todoist_create_comment' tool (via CREATE_COMMENT_TOOL) in the ListToolsRequestSchema handler, making it available in the server's tool list.server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: [ // Task tools CREATE_TASK_TOOL, QUICK_ADD_TASK_TOOL, GET_TASKS_TOOL, GET_TASK_TOOL, UPDATE_TASK_TOOL, DELETE_TASK_TOOL, COMPLETE_TASK_TOOL, REOPEN_TASK_TOOL, SEARCH_TASKS_TOOL, MOVE_TASK_TOOL, BULK_MOVE_TASKS_TOOL, // Project tools GET_PROJECTS_TOOL, GET_PROJECT_TOOL, CREATE_PROJECT_TOOL, UPDATE_PROJECT_TOOL, DELETE_PROJECT_TOOL, // Section tools GET_SECTIONS_TOOL, CREATE_SECTION_TOOL, UPDATE_SECTION_TOOL, DELETE_SECTION_TOOL, // Label tools CREATE_LABEL_TOOL, GET_LABEL_TOOL, GET_LABELS_TOOL, UPDATE_LABEL_TOOL, DELETE_LABEL_TOOL, // Comment tools CREATE_COMMENT_TOOL, GET_COMMENT_TOOL, GET_COMMENTS_TOOL, UPDATE_COMMENT_TOOL, DELETE_COMMENT_TOOL, ], }));
- src/index.ts:1016-1037 (helper)Helper type guard 'isCreateCommentArgs' used by the handler to validate input arguments, ensuring 'content' is string and exactly one of 'taskId' or 'projectId' is provided.function isCreateCommentArgs(args: unknown): args is { content: string; taskId?: string; projectId?: string; attachment?: { fileName?: string; fileType?: string; fileUrl?: string; resourceType?: string; } | null; } { if (typeof args !== "object" || args === null || !("content" in args) || typeof (args as any).content !== "string") { return false; } const { taskId, projectId } = args as any; const targets = [taskId, projectId]; const providedTargets = targets.filter(target => target !== undefined && target !== null && String(target).trim() !== ''); // Exactly one target must be provided and be a non-empty string return providedTargets.length === 1 && providedTargets.every(target => typeof target === 'string'); }
- src/index.ts:732-742 (helper)Helper function 'formatComment' used to format the created comment details for the response output.function formatComment(comment: any): string { let commentDetails = `- ID: ${comment.id}\n Content: ${comment.content}`; if (comment.postedAt) commentDetails += `\n Posted At: ${comment.postedAt}`; if (comment.taskId) commentDetails += `\n Task ID: ${comment.taskId}`; if (comment.projectId) commentDetails += `\n Project ID: ${comment.projectId}`; if (comment.attachment) { commentDetails += `\n Attachment: ${comment.attachment.fileName || 'File'} (${comment.attachment.fileType})`; if (comment.attachment.fileUrl) commentDetails += `\n File URL: ${comment.attachment.fileUrl}`; } return commentDetails; }