From 68ae1948a35c5bd02e395bdf39aee411d1417d39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ernesto=20Garc=C3=ADa?= Date: Fri, 23 May 2025 23:40:48 -0400 Subject: [PATCH] feat: add quick add task tool --- src/mcp-server.ts | 2 ++ src/tools/quick-add-task.ts | 47 +++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 src/tools/quick-add-task.ts diff --git a/src/mcp-server.ts b/src/mcp-server.ts index 57fba5c..ecba202 100644 --- a/src/mcp-server.ts +++ b/src/mcp-server.ts @@ -4,6 +4,7 @@ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js" import type { Transport } from "@modelcontextprotocol/sdk/shared/transport.js"; import { registerTool } from "./mcp-helpers.js"; import { projectsList } from "./tools/projects-list.js"; +import { quickAddTask } from "./tools/quick-add-task.js"; import { tasksByDateRange } from "./tools/tasks-by-date-range.js"; import { tasksByProject } from "./tools/tasks-by-project.js"; import { tasksOverdue } from "./tools/tasks-overdue.js"; @@ -38,6 +39,7 @@ export async function startMcpServer({ registerTool(tasksByProject, server, todoist); registerTool(tasksSearch, server, todoist); registerTool(projectsList, server, todoist); + registerTool(quickAddTask, server, todoist); await server.connect(transport ?? new StdioServerTransport()); } diff --git a/src/tools/quick-add-task.ts b/src/tools/quick-add-task.ts new file mode 100644 index 0000000..5265bc4 --- /dev/null +++ b/src/tools/quick-add-task.ts @@ -0,0 +1,47 @@ +import { z } from "zod"; +import type { TodoistTool } from "../todoist-tool.js"; + +const ArgsSchema = { + content: z.string().min(1).describe("The content of the task to create."), + due: z + .string() + .optional() + .describe( + "The due date for the task, in natural language (e.g., 'tomorrow at 5pm', 'in 2 days', 'June 1st', 'every 23rd', etc.)", + ), + reminder: z + .string() + .optional() + .describe("A reminder for the task, in natural language."), + autoReminder: z + .boolean() + .optional() + .default(true) + .describe( + "Whether to automatically add a reminder based on the due date.", + ), + meta: z + .boolean() + .optional() + .default(true) + .describe("Whether to return extra metadata about the parsing."), +}; + +const quickAddTask = { + name: "quickAddTask", + description: + "Quickly add a task using natural language for due date and other properties.", + parameters: ArgsSchema, + async execute(args, client) { + const text = args.due ? `${args.content} ${args.due}` : args.content; + const { reminder, autoReminder, meta } = args; + return await client.quickAddTask({ + text, + reminder, + autoReminder, + meta, + }); + }, +} satisfies TodoistTool; + +export { quickAddTask };