Skip to main content
Glama

add-task

Add a new task to a Todo.txt file with optional priority, contexts, and projects. Specify a plain text description and format tags with @ for contexts and + for projects.

Instructions

Add a new task to the todo list. Description must be plain text. Priority must be a single uppercase letter (A-Z). Contexts must start with @, projects with +.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
descriptionYes
priorityNo
contextsNo
projectsNo
extensionsNo

Implementation Reference

  • The handler function for the 'add-task' tool. Validates inputs defensively, loads existing tasks, creates a new Item with the provided description and optional properties (priority, contexts, projects, extensions), appends it to the list, saves to file, and returns success message with new task ID.
    async ({ description, priority, contexts, projects, extensions }) => { // Handler-level validation (defensive) if (priority && typeof priority === "string" && !/^[A-Z]$/.test(priority)) { return { content: [{ type: "text", text: "Invalid priority: must be a single uppercase letter (A-Z)." }], isError: true }; } if (Array.isArray(contexts) && contexts.some((ctx: string) => !/^@\w+$/.test(ctx))) { return { content: [{ type: "text", text: "Invalid context: must start with @ and contain only word characters." }], isError: true }; } if (Array.isArray(projects) && projects.some((proj: string) => !/^\+\w+$/.test(proj))) { return { content: [{ type: "text", text: "Invalid project: must start with + and contain only word characters." }], isError: true }; } const tasks = await loadTasks(); const newTask = new Item(description as string); if (priority && typeof priority === "string") newTask.setPriority(priority); if (Array.isArray(contexts)) contexts.forEach((context: string) => newTask.addContext(context)); if (Array.isArray(projects)) projects.forEach((project: string) => newTask.addProject(project)); if (extensions) { Object.entries(extensions).forEach(([key, value]) => newTask.setExtension(key as string, value as string)); } tasks.push(newTask); await saveTasks(tasks); return { content: [ { type: "text", text: `Task added successfully. ID: ${tasks.length - 1}` }, ], }; }
  • Input schema for 'add-task' tool using Zod: required description (non-empty, single-line <=200 chars), optional priority (single A-Z), contexts (array of @word), projects (+word), extensions (object).
    { description: z.string().min(1, "Description cannot be empty").max(200, "Description too long").regex(/^[^\n\r]+$/, "Description must be a single line"), priority: z.string().regex(/^[A-Z]$/, "Priority must be a single uppercase letter (A-Z)").optional(), contexts: z.array(z.string().regex(/^@\w+$/, "Contexts must start with @ and contain only word characters")).optional(), projects: z.array(z.string().regex(/^\+\w+$/, "Projects must start with + and contain only word characters")).optional(), extensions: z.record(z.string(), z.string()).optional(), },
  • src/tools.ts:20-22 (registration)
    Registration of the 'add-task' tool via server.tool() call, providing name, description, schema, and handler.
    server.tool( "add-task", "Add a new task to the todo list. Description must be plain text. Priority must be a single uppercase letter (A-Z). Contexts must start with @, projects with +.",
  • Helper function saveTasks used by 'add-task' (and others) to persist the updated task list to the TODO_FILE_PATH.
    async function saveTasks(tasks: Item[]) { const content = tasks.map((task) => task.toString()).join("\n"); await fs.writeFile(TODO_FILE_PATH, content, "utf-8"); }

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/guifelix/mcp-server-todotxt'

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