Skip to main content
Glama

delete_todo

Remove a todo item from your task list, with optional dry-run mode to preview changes before deletion.

Instructions

Delete a todo item (supports dry-run)

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault

No arguments

Implementation Reference

  • Handler functions (handleDeleteTodo, handleDeleteTodoDryRun, handleDeleteTodoLive) that implement the core logic for deleting a todo item, supporting dry-run mode and selector-based resolution.
    async function handleDeleteTodoDryRun(
      input: DeleteTodoInput
    ): Promise<CallToolResult> {
      const todos = await getTodos();
      const selector =
        input.id !== undefined ? { id: input.id } : { query: input.query };
      const outcome = unwrapResolution(
        resolveTodoTargetFromTodos(todos, toResolveInput(selector))
      );
      if (outcome.kind === 'error') return outcome.response;
      if (outcome.kind === 'ambiguous') {
        return buildDryRunMultiple(outcome.previews, outcome.matches.length);
      }
      return buildDeleteResponse(outcome.todo, true);
    }
    
    async function handleDeleteTodoLive(
      input: DeleteTodoInput
    ): Promise<CallToolResult> {
      const selector =
        input.id !== undefined ? { id: input.id } : { query: input.query };
      const outcome = await deleteTodoBySelector(toResolveInput(selector));
      if (outcome.kind === 'error' || outcome.kind === 'ambiguous') {
        return outcome.response;
      }
      return buildDeleteResponse(outcome.todo, false);
    }
    
    async function handleDeleteTodo(
      input: DeleteTodoInput
    ): Promise<CallToolResult> {
      const dryRun = input.dryRun ?? false;
      if (dryRun) {
        return handleDeleteTodoDryRun(input);
      }
      return handleDeleteTodoLive(input);
    }
  • Registration of the 'delete_todo' tool with the MCP server, specifying title, description, schemas, annotations, and handler.
    export function registerDeleteTodo(server: McpServer): void {
      server.registerTool(
        'delete_todo',
        {
          title: 'Delete Todo',
          description: 'Delete a todo item (supports dry-run)',
          inputSchema: DeleteTodoSchema,
          outputSchema: DefaultOutputSchema,
          annotations: {
            readOnlyHint: false,
            idempotentHint: true,
            destructiveHint: true,
          },
        },
        async (input) => {
          try {
            return await handleDeleteTodo(input);
          } catch (err) {
            return createErrorResponse('E_DELETE_TODO', getErrorMessage(err));
          }
        }
      );
    }
  • DeleteTodoSchema: Zod schema defining the input for delete_todo tool, supporting ID or query selector with optional dryRun flag.
    const deleteTodoSelector = buildSelectorSchemas(
      'The ID of the todo to delete',
      'Search text to find a single todo to delete'
    );
    
    export const DeleteTodoSchema: ZodType<DeleteTodoInput> = z.union([
      deleteTodoSelector.byId.extend({
        dryRun: z
          .boolean()
          .optional()
          .describe('Simulate the deletion without changing data'),
      }),
      deleteTodoSelector.byQuery.extend({
        dryRun: z
          .boolean()
          .optional()
          .describe('Simulate the deletion without changing data'),
      }),
    ]);
  • deleteTodoBySelector: Storage helper that resolves a todo by selector and deletes it from the todos list, returning match outcome.
    export async function deleteTodoBySelector(
      input: ResolveTodoInput
    ): Promise<MatchOutcome> {
      return withTodos<MatchOutcome>((todos) => {
        const outcome = unwrapResolution(resolveTodoTargetFromTodos(todos, input));
        if (outcome.kind !== 'match') {
          return { todos, result: outcome };
        }
    
        const remaining = todos.filter((todo) => todo.id !== outcome.todo.id);
        if (remaining.length === todos.length) {
          return {
            todos,
            result: createNotFoundOutcome(outcome.todo.id),
          };
        }
    
        return { todos: remaining, result: { kind: 'match', todo: outcome.todo } };
      });
    }

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/j0hanz/todokit-mcp-server'

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