Skip to main content
Glama

complete_todo

Mark a todo item as completed to track progress in task management. This tool updates completion status within the Todokit MCP Server's local JSON storage.

Instructions

Set completion status for a todo item

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault

No arguments

Implementation Reference

  • The main handler function that processes the complete_todo tool input: resolves the todo selector, calls the storage mutation, and constructs the tool response.
    async function handleCompleteTodo(
      input: CompleteTodoInput
    ): Promise<CallToolResult> {
      const targetCompleted = input.completed ?? true;
      const selector =
        input.id !== undefined ? { id: input.id } : { query: input.query };
      const outcome = await completeTodoBySelector(
        toResolveInput(selector),
        targetCompleted
      );
      return buildOutcomeResponse(outcome, targetCompleted);
    }
  • Zod schema for CompleteTodoInput: union of selector by ID or query, with optional 'completed' boolean.
    const completeTodoSelector = buildSelectorSchemas(
      'The ID of the todo to complete',
      'Search text to find a single todo to complete'
    );
    
    export const CompleteTodoSchema: ZodType<CompleteTodoInput> = z.union([
      completeTodoSelector.byId.extend({
        completed: z
          .boolean()
          .optional()
          .describe('Set completion status (default: true)'),
      }),
      completeTodoSelector.byQuery.extend({
        completed: z
          .boolean()
          .optional()
          .describe('Set completion status (default: true)'),
      }),
    ]);
  • Registers the complete_todo tool on the MCP server with input/output schemas, metadata, and error-handling wrapper around the handler.
    export function registerCompleteTodo(server: McpServer): void {
      server.registerTool(
        'complete_todo',
        {
          title: 'Complete Todo',
          description: 'Set completion status for a todo item',
          inputSchema: CompleteTodoSchema,
          outputSchema: DefaultOutputSchema,
          annotations: {
            readOnlyHint: false,
            idempotentHint: true,
          },
        },
        async (input) => {
          try {
            return await handleCompleteTodo(input);
          } catch (err) {
            return createErrorResponse('E_COMPLETE_TODO', getErrorMessage(err));
          }
        }
      );
    }
  • Storage layer function that resolves the todo selector, toggles completion status if needed, handles 'already' case, and persists changes via withTodos.
    export async function completeTodoBySelector(
      input: ResolveTodoInput,
      completed: boolean
    ): Promise<CompleteTodoOutcome> {
      return withTodos<CompleteTodoOutcome>((todos) => {
        const outcome = unwrapResolution(resolveTodoTargetFromTodos(todos, input));
        if (outcome.kind !== 'match') {
          return { todos, result: outcome };
        }
    
        if (outcome.todo.completed === completed) {
          return { todos, result: { kind: 'already', todo: outcome.todo } };
        }
    
        const updated = applyUpdateToTodos(todos, outcome.todo.id, { completed });
        if (!updated.result) {
          return {
            todos,
            result: createNotFoundOutcome(outcome.todo.id),
          };
        }
    
        return {
          todos: updated.todos,
          result: { kind: 'match', todo: updated.result },
        };
      });
    }

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