MCP Hub
Back to servers

todokit-mcp-server

A task management MCP server that provides comprehensive todo operations including batch processing, rich filtering by priority and due dates, and persistent JSON storage.

Tools
7
Updated
Jan 9, 2026
Validated
Jan 11, 2026

todokit-mcp

Todokit MCP Server Logo

An MCP server for Todokit, a task management and productivity tool with JSON storage.

npm version License Node.js

One-Click Install

Install with NPX in VS CodeInstall with NPX in VS Code Insiders

Install in Cursor

Features

  • Task management: add, update, complete/reopen, and delete todos.
  • Batch operations: add multiple todos and bulk delete with filters.
  • Rich filtering: status, priority, tags, due dates, and free-text search.
  • Tagging: tags are normalized (trimmed, lowercase, unique) and can be added or removed.
  • Safe deletion: dry-run previews before deleting; bulk delete defaults to a safety limit.
  • JSON persistence with queued writes and atomic file writes.
  • Optional diagnostics events (tool calls/results, storage, lifecycle) via Node diagnostics channels.
  • List summaries with counts (pending, completed, overdue) and pagination metadata.

Quick Start

npx -y @j0hanz/todokit-mcp@latest

The server runs over stdio (no HTTP endpoint) and registers MCP tools on startup.

Installation

NPX (recommended)

npx -y @j0hanz/todokit-mcp@latest

Global install

npm install -g @j0hanz/todokit-mcp

Then run:

todokit-mcp

From source

git clone https://github.com/j0hanz/todokit-mcp-server.git
cd todokit-mcp-server
npm install
npm run build
npm start

Configuration

Storage path

By default, todos are stored in todos.json next to the server package (the project root when running from source). To control where data is written, set the TODOKIT_TODO_FILE environment variable to an absolute or relative path ending with .json. Relative paths resolve from the current working directory. The directory is created as needed; if the file does not exist, the server starts with an empty list.

Examples:

# macOS/Linux
TODOKIT_TODO_FILE=/path/to/todos.json npx -y @j0hanz/todokit-mcp@latest
# Windows PowerShell
$env:TODOKIT_TODO_FILE = 'C:\path\to\todos.json'
npx -y @j0hanz/todokit-mcp@latest

JSON formatting

By default, todos are written as pretty-printed JSON (2-space indentation). To write compact JSON instead, set TODOKIT_JSON_PRETTY to 0 or false.

TODOKIT_JSON_PRETTY=0 npx -y @j0hanz/todokit-mcp@latest

CLI options

The server accepts a few CLI flags (use -- to forward args when running via npx).

npx -y @j0hanz/todokit-mcp@latest -- --todo-file ./todos.json --diagnostics --log-level debug
FlagAliasDescription
--todo-file-fOverride the todo storage path (same as TODOKIT_TODO_FILE).
--diagnostics-dEnable diagnostics output (JSON lines) to stderr.
--log-level-lDiagnostics log level: error, warn, info, debug (default: info).

The log level is only used when diagnostics output is enabled.

Diagnostics

Diagnostics events are always published on Node's diagnostics_channel and can be subscribed to programmatically. When --diagnostics is set, the server attaches default subscribers and prints JSON events to stderr (stdout stays reserved for MCP traffic).

Channels:

  • todokit:tool — tool call + tool result events
  • todokit:storage — read/write/close events
  • todokit:lifecycle — shutdown events

Tools

All tools return a JSON payload in both content (stringified) and structuredContent. Inputs are validated with strict Zod schemas, so unknown fields are rejected.

Success payload:

{
  "ok": true,
  "result": {}
}

Error payload:

{
  "ok": false,
  "error": { "code": "E_CODE", "message": "Details" }
}

The result shape is tool-specific. If a query matches multiple todos, most tools return E_AMBIGUOUS with preview matches and a hint to use an exact id. delete_todo with dryRun: true instead returns an ok response with matches and totalMatches for preview.

add_todo

Add a new todo item.

ParameterTypeRequiredDefaultDescription
titlestringYes-The title of the todo (1-200 chars)
descriptionstringNo-Optional description (max 2000 chars)
prioritystringNonormalPriority level: low, normal, high
dueDatestringNo-Due date in ISO format (YYYY-MM-DD)
tagsarrayNo-Array of tags (max 50, 1-50 chars)

Result fields:

  • item (todo)
  • summary
  • nextActions

add_todos

Add multiple todo items in one call.

ParameterTypeRequiredDefaultDescription
itemsarrayYes-Array of todo objects (same fields as add_todo, 1-50 items)

Result fields:

  • items (todos)
  • summary
  • nextActions

list_todos

List todos with filtering, search, sorting, and pagination.

ParameterTypeRequiredDefaultDescription
statusstringNoallFilter by status: pending, completed, all
completedbooleanNo-Deprecated; status takes precedence when provided
prioritystringNo-Filter by priority: low, normal, high
tagstringNo-Filter by tag (must contain)
querystringNo-Search text in title, description, or tags
dueBeforestringNo-Filter todos due before this date (YYYY-MM-DD)
dueAfterstringNo-Filter todos due after this date (YYYY-MM-DD)
sortBystringNocreatedAtSort by: dueDate, priority, createdAt, title
orderstringNoascSort order: asc, desc
limitnumberNo50Max number of results (1-200)
offsetnumberNo0Number of results to skip (0-10000)

Result fields:

  • items (todos)
  • summary
  • counts (total, pending, completed, overdue)
  • limit
  • offset
  • hasMore (true if more results are available after this page)

Notes:

  • Overdue calculations compare dueDate against the server's local calendar date (YYYY-MM-DD).

update_todo

Update fields on a todo item. Provide either id or query to identify the todo.

ParameterTypeRequiredDefaultDescription
idstringNo-The ID of the todo to update
querystringNo-Search text to find a single todo to update
titlestringNo-New title
descriptionstringNo-New description
completedbooleanNo-Completion status
prioritystringNo-New priority level
dueDatestringNo-New due date (YYYY-MM-DD)
tagsarrayNo-Replace all tags (max 50)
tagOpsobjectNo-Tag modifications to apply (add/remove arrays)
clearFieldsarrayNo-Fields to clear: description, dueDate, tags

Notes:

  • If both tags and tagOps are provided, tags wins and replaces the list.
  • If no updatable fields are provided, the tool returns an error.

Result fields:

  • item (todo)
  • summary
  • nextActions

complete_todo

Set completion status for a todo item. Provide either id or query.

ParameterTypeRequiredDefaultDescription
idstringNo-The ID of the todo to complete
querystringNo-Search text to find a single todo
completedbooleanNotrueSet completion status

Result fields:

  • item (todo)
  • summary (includes already-complete or reopen messages)
  • nextActions

delete_todo

Delete a todo item. Provide either id or query.

ParameterTypeRequiredDefaultDescription
idstringNo-The ID of the todo to delete
querystringNo-Search text to find a single todo
dryRunbooleanNofalseSimulate deletion without changing data

Result fields:

  • deletedIds (array)
  • summary
  • nextActions (only when not dryRun)
  • dryRun (when dryRun is true)
  • matches, totalMatches (dry-run + multiple matches)

delete_todos

Delete multiple todos matching filters. At least one filter is required; defaults to limit=10 for safety.

ParameterTypeRequiredDefaultDescription
statusstringNo-Filter by status: pending, completed, all
prioritystringNo-Filter by priority: low, normal, high
tagstringNo-Filter by tag
dueBeforestringNo-Delete todos due before this date (YYYY-MM-DD)
dueAfterstringNo-Delete todos due after this date (YYYY-MM-DD)
querystringNo-Search text filter (1-200 chars)
dryRunbooleanNofalsePreview deletion without removing data
limitnumberNo10Max items to delete (1-100, safety limit)

Notes:

  • At least one filter (status, priority, tag, dueBefore, dueAfter, query) is required.
  • The default limit of 10 prevents accidental mass deletions.

Result fields:

  • deletedIds (array)
  • summary
  • totalMatched
  • matches (dry-run only, array of previews)
  • dryRun (when dryRun is true)
  • nextActions (only when not dryRun)

Data Model

A todo item has the following shape:

{
  "id": "string",
  "title": "string",
  "description": "string?",
  "completed": false,
  "priority": "low|normal|high",
  "dueDate": "YYYY-MM-DD?",
  "tags": ["string"],
  "createdAt": "ISO timestamp with offset",
  "updatedAt": "ISO timestamp with offset?",
  "completedAt": "ISO timestamp with offset?"
}

Notes:

  • dueDate uses YYYY-MM-DD (date only).
  • createdAt, updatedAt, and completedAt are ISO 8601 timestamps with offset (e.g., 2025-02-28T10:30:00Z).

Client Configuration

VS Code

Add this to your mcpServers configuration in settings.json:

{
  "todokit": {
    "command": "npx",
    "args": ["-y", "@j0hanz/todokit-mcp@latest"]
  }
}
Claude Desktop

Add this to your claude_desktop_config.json:

{
  "mcpServers": {
    "todokit": {
      "command": "npx",
      "args": ["-y", "@j0hanz/todokit-mcp@latest"]
    }
  }
}
Cursor
  1. Go to Cursor Settings > Features > MCP
  2. Click + Add New MCP Server
  3. Name: todokit
  4. Type: command
  5. Command: npx -y @j0hanz/todokit-mcp@latest

Development

Prerequisites

  • Node.js >= 20.0.0

Scripts

CommandDescription
npm run buildCompile TypeScript to JavaScript
npm run devRun server in watch mode for development
npm startRun the built server
npm run testRun unit tests (node --test + tsx)
npm run test:coverageRun unit tests with coverage
npm run lintRun ESLint
npm run formatFormat with Prettier
npm run format:checkCheck formatting with Prettier
npm run type-checkRun TypeScript type checking
npm run dup-checkRun duplicate code checks (jscpd)
npm run cleanRemove the dist/ build output
npm run inspectorLaunch the MCP inspector (pass server cmd after --)

Manual verification

npm run build
npm run inspector -- node dist/index.js

Project structure

src/
  index.ts   # MCP server entrypoint (stdio)
  tools/     # Tool registrations
  schemas/   # Zod input/output schemas
  lib/       # Storage, matching, shared helpers
tests/       # Unit tests
docs/        # Assets (logo)

Contributing

Contributions are welcome. Please run npm run format, npm run lint, npm run type-check, npm run build, npm test, npm run test:coverage, and npm run dup-check before opening a PR.

License

This project is licensed under the MIT License - see the LICENSE file for details.

Reviews

No reviews yet

Sign in to write a review