Skip to main content
Glama
kydycode

Enhanced Todoist MCP Server Extended

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
NameRequiredDescriptionDefault
contentYesThe content/text of the comment
taskIdNoTask ID to add comment to (provide either taskId or projectId, not both)
projectIdNoProject ID to add comment to (provide either taskId or projectId, not both)
attachmentNoOptional file attachment (optional)

Implementation Reference

  • 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 }; } }
  • 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, ], }));
  • 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'); }
  • 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; }

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/kydycode/todoist-mcp-server-ext'

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