Todokit MCP Server
The Todokit MCP Server is a task management tool that provides comprehensive CRUD operations for todos with JSON persistence, batch operations, and advanced filtering capabilities.
Core Capabilities:
Create todos - Add single or multiple todo items (up to 50 per batch) with title, description, priority (low/normal/high), tags (up to 50), and due dates (ISO format)
List and filter - Retrieve todos with flexible filtering by status (pending/completed/all), priority, tags, date ranges (dueAfter/dueBefore), and text search across titles, descriptions, and tags
Sorting & pagination - Sort by title, priority, dueDate, or createdAt in ascending/descending order with offset/limit controls (up to 200 results per query, default 50)
Update todos - Modify existing todo fields including title, description, priority, tags, and due dates
Complete todos - Mark tasks as completed or change completion status
Delete todos - Remove individual todos or bulk delete with filters, dry-run preview mode, and safety limits (default 10 items, max 100)
Key Features:
JSON persistence - Configurable storage location via
TODOKIT_TODO_FILEenvironment variable or--todo-fileCLI flag with atomic file writes and automatic cleanup when all todos are completedData validation - Strict input validation using Zod schemas with consistent error response format
Diagnostics - Optional monitoring via
--diagnosticsflag and--log-levelsettings (error/warn/info/debug) with programmatic access through Node.js diagnostics channelsConfiguration options - Customizable JSON formatting (pretty-printed or compact) via
TODOKIT_JSON_PRETTYenvironment variableClient integration - Easy setup for VS Code, Claude Desktop, and Cursor with one-click installation options
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Todokit MCP Serveradd a todo to finish the quarterly report by Friday with high priority"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Todokit MCP Server
A local, persistent task management MCP server with JSON file storage, cursor pagination, and diagnostics.
Overview
Todokit is a Model Context Protocol (MCP) server that gives AI assistants the ability to manage a structured todo list. Tasks are persisted as a JSON file on disk with atomic writes and file-based locking, so data integrity is maintained even under concurrent access. The server communicates over stdio transport and exposes 7 tools, 2 resources, and 1 prompt for complete task lifecycle management.
Related MCP server: MCP Todo Management System
Key Features
Full task lifecycle — create, list, search, update, complete, and delete todos
Batch operations — add up to 50 tasks in a single call
Cursor-based pagination — efficiently navigate large task lists (up to 100 items per page)
Fuzzy search — find tasks by description or category text
Atomic file writes — data integrity with temp-file-then-rename strategy and file-based locking
Resource subscriptions — live
todo://listresource with change notifications
Tech Stack
Component | Technology |
Runtime | Node.js ≥ 24 |
Language | TypeScript 5.9+ |
MCP SDK |
|
Schema | Zod ^4.3.6 ( |
Transport | stdio (JSON-RPC over stdin/stdout) |
Package Manager | npm |
Architecture
CLI Entrypoint (
src/index.ts) — Parses CLI args, wires theMcpServerto aStdioServerTransport, registers signal handlers for graceful shutdown.Tool Layer (
src/tools.ts) — Registers 7 tools with timeout/abort/diagnostics wrappers and cursor-based pagination.Storage Layer (
src/storage.ts) — Port/Adapter pattern (FileSystemPort,LockPort) for atomic JSON file reads/writes with in-memory caching and mtime-based invalidation.Schema Layer (
src/schema.ts) — Zod strict schemas for all tool inputs and outputs.Diagnostics (
src/diagnostics.ts) — Publishes events ontodokit:tool,todokit:storage, andtodokit:lifecyclechannels.Request Context (
src/requestContext.ts) —AsyncLocalStorage-based correlation of tool calls with storage events.
Repository Structure
├── src/
│ ├── index.ts # CLI entrypoint, server creation, transport wiring
│ ├── tools.ts # Tool registration and handler logic
│ ├── storage.ts # JSON file storage with locking and caching
│ ├── schema.ts # Zod input/output schemas
│ ├── responses.ts # createToolResponse / createErrorResponse helpers
│ ├── diagnostics.ts # node:diagnostics_channel publishers
│ ├── requestContext.ts # AsyncLocalStorage request context
│ ├── constants.ts # Error name/code constants
│ └── instructions.md # Server instructions resource
├── tests/ # node:test test files
├── scripts/
│ └── tasks.mjs # Build orchestration
├── assets/
│ └── logo.svg # Server icon
├── .github/
│ └── workflows/
│ └── publish.yml # CI/CD: npm publish on release
├── package.json
├── tsconfig.json
└── eslint.config.mjsRequirements
Node.js ≥ 24
npm (included with Node.js)
Quickstart
Run with npx — no installation needed:
npx -y @j0hanz/todokit-mcp@latestAdd to your MCP client configuration:
{
"mcpServers": {
"todokit": {
"command": "npx",
"args": ["-y", "@j0hanz/todokit-mcp@latest"]
}
}
}Installation
NPX (recommended)
npx -y @j0hanz/todokit-mcp@latestGlobal Install
npm install -g @j0hanz/todokit-mcp
todokit-mcpFrom Source
git clone https://github.com/j0hanz/todokit-mcp-server.git
cd todokit-mcp-server
npm ci
npm run build
node dist/index.jsConfiguration
CLI Arguments
Flag | Short | Type | Default | Description |
|
| string | — | Path to the todo JSON file |
|
| boolean |
| Enable diagnostics logging to stderr |
|
| string |
| Log level: |
Environment Variables
Variable | Default | Description |
|
| Path to the JSON storage file |
|
| Tool execution timeout in ms ( |
|
| File lock acquisition timeout in ms |
|
| Maximum allowed size of the todo file |
|
| Pretty-print the JSON storage file ( |
| — | Allow todo file outside the current working directory |
| — | Reject unsupported MCP protocol versions |
Usage
Todokit uses stdio transport. Start the server and communicate via JSON-RPC over stdin/stdout:
# With npx
npx -y @j0hanz/todokit-mcp@latest
# With custom todo file
npx -y @j0hanz/todokit-mcp@latest --todo-file ./my-tasks.json
# With diagnostics enabled
npx -y @j0hanz/todokit-mcp@latest --diagnostics --log-level debugMCP Surface
Tools
add_todo
Create a single task. For multiple items, prefer add_todos.
Parameter | Type | Required | Default | Description |
| string | Yes | — | Description of the todo (1–2000 chars) |
| string | Yes | — | Task priority: |
| string | Yes | — | Task category (1–50 chars, e.g. work, bug, testing, docs) |
| string | No | — | Due date/time as ISO 8601 with offset |
Returns: The created todo item with id, timestamps, and suggested next actions.
{
"ok": true,
"result": {
"item": {
"id": "a1b2c3",
"description": "Review PR #42",
"completed": false,
"priority": "high",
"category": "work",
"createdAt": "2026-02-10T12:00:00.000Z"
},
"summary": "Added todo",
"nextActions": ["list_todos", "update_todo", "complete_todo"]
}
}add_todos
Create multiple tasks in one batch call (1–50 items).
Parameter | Type | Required | Default | Description |
| array | Yes | — | Array of todo objects (same shape as |
Returns: Count of created items, their IDs, and suggested next actions.
{
"ok": true,
"result": {
"count": 3,
"ids": ["id1", "id2", "id3"],
"summary": "Added 3 todos",
"nextActions": ["list_todos", "update_todo"]
}
}list_todos
List todos with optional status filtering and cursor-based pagination.
Parameter | Type | Required | Default | Description |
| string | No |
| Filter: |
| number | No |
| Max items to return (1–100) |
| string | No | — | Opaque pagination cursor from a previous response |
Returns: Filtered todo items with counts, pagination info, and hints.
{
"ok": true,
"result": {
"items": [],
"summary": "Showing 5 pending todos (Found 10 todos (5 pending, 5 completed))",
"counts": { "total": 10, "pending": 5, "completed": 5 },
"filteredCounts": { "total": 5, "pending": 5, "completed": 0 },
"status": "pending",
"returned": 5,
"truncated": false,
"remaining": 0,
"hint": "Tip: when all todos are completed, the storage file is automatically deleted.",
"limit": 50,
"hasMore": false
}
}search_todos
Search todos by description or category text with status filtering and pagination.
Parameter | Type | Required | Default | Description |
| string | Yes | — | Search query (1–100 chars) |
| string | No |
| Filter: |
| number | No |
| Max items to return (1–100) |
| string | No | — | Opaque pagination cursor from a previous response |
Returns: Matching items with match count, pagination info, and suggested next actions.
{
"ok": true,
"result": {
"items": [],
"query": "review",
"status": "pending",
"summary": "Found 2 matches for \"review\" (pending)",
"returned": 2,
"totalMatches": 2,
"remaining": 0,
"limit": 50,
"hasMore": false,
"nextActions": ["update_todo", "complete_todo"]
}
}update_todo
Update one or more fields on an existing todo.
Parameter | Type | Required | Default | Description |
| string | Yes | — | ID of the todo to update (1–100 chars) |
| string | No | — | New description (1–2000 chars) |
| string | No | — | New priority: |
| string | No | — | New category (1–50 chars) |
| string | No | — | New due date/time as ISO 8601 with offset |
At least one field besides
idmust be provided.
Returns: The updated todo item and suggested next actions.
{
"ok": true,
"result": {
"item": {
"id": "a1b2c3",
"description": "Updated task",
"completed": false,
"priority": "medium",
"category": "work",
"createdAt": "...",
"updatedAt": "..."
},
"summary": "Updated todo",
"nextActions": ["list_todos", "complete_todo"]
}
}complete_todo
Mark a todo as completed. Idempotent — completing an already-completed todo returns success with an informational summary.
Parameter | Type | Required | Default | Description |
| string | Yes | — | ID of the todo (1–100 chars) |
Returns: The completed todo item with completedAt timestamp.
{
"ok": true,
"result": {
"item": {
"id": "a1b2c3",
"completed": true,
"completedAt": "2026-02-10T14:00:00.000Z"
},
"summary": "Completed todo",
"nextActions": ["list_todos"]
}
}delete_todo
Permanently delete a todo by ID. Destructive — cannot be undone.
Parameter | Type | Required | Default | Description |
| string | Yes | — | ID of the todo (1–100 chars) |
Returns: The deleted todo's ID and suggested next actions.
{
"ok": true,
"result": {
"deletedIds": ["a1b2c3"],
"summary": "Deleted todo",
"nextActions": ["list_todos"]
}
}Resources
URI | MIME Type | Description |
|
| Server usage instructions |
|
| Live list of active (pending) todos. Supports subscriptions for change notifications. |
Prompts
Name | Description |
| Returns concise usage instructions and best-practice workflows for Todokit tools. |
Client Configuration Examples
Add to your VS Code settings (settings.json) or use the one-click install buttons above:
{
"mcp": {
"servers": {
"todokit": {
"command": "npx",
"args": ["-y", "@j0hanz/todokit-mcp@latest"]
}
}
}
}Add to your Claude Desktop config file (claude_desktop_config.json):
{
"mcpServers": {
"todokit": {
"command": "npx",
"args": ["-y", "@j0hanz/todokit-mcp@latest"]
}
}
}Add to your Cursor MCP config (.cursor/mcp.json), or use the one-click install button above:
{
"mcpServers": {
"todokit": {
"command": "npx",
"args": ["-y", "@j0hanz/todokit-mcp@latest"]
}
}
}Add to your Windsurf MCP config (~/.windsurf/mcp.json):
{
"mcpServers": {
"todokit": {
"command": "npx",
"args": ["-y", "@j0hanz/todokit-mcp@latest"]
}
}
}Security
stdout safety — The server never writes non-MCP output to stdout. All logging goes to stderr via
console.error(), preserving JSON-RPC transport integrity.Path traversal protection — The todo file must reside within the current working directory by default. Set
TODOKIT_ALLOW_OUTSIDE_CWDto override. Symlink resolution is performed to prevent escaping via symlinks.File locking — Concurrent access is protected by file-based locks with exponential backoff and
timingSafeEqualownership verification.Atomic writes — Data is written to a temporary file first, then atomically renamed to prevent corruption on partial writes.
Size limits — The todo file is capped at 5 MB by default (
TODOKIT_MAX_TODO_FILE_BYTES) to prevent unbounded growth.
Development Workflow
Install Dependencies
npm ciScripts
Script | Command | Purpose |
|
| Watch mode compilation |
|
| Run server with auto-reload |
| Clean + compile + validate + copy assets | Production build |
|
| Run compiled server |
|
| Format code |
|
| Lint code |
|
| Auto-fix lint issues |
|
| Type-check without emitting |
| Build + | Run tests |
| Build + test with | Run tests with coverage |
|
| Check for code duplication |
|
| Detect dead/unused code |
|
| Launch MCP Inspector |
Full Validation
npm run format && npm run lint && npm run type-check && npm run build && npm testBuild and Release
The project uses GitHub Actions for CI/CD. On a GitHub Release event:
Checks out the repository
Sets up Node.js 24 with the npm registry
Installs dependencies (
npm ci)Runs lint, type-check, tests, coverage, and duplication checks
Builds the package
Publishes to npm using Trusted Publishing (OIDC — no
NODE_AUTH_TOKENneeded)
Published package: @j0hanz/todokit-mcp
Troubleshooting
Inspect the Server
Use the MCP Inspector to interactively test tools:
npx @modelcontextprotocol/inspector node dist/index.jsOr if installed from npm:
npx @modelcontextprotocol/inspector npx -y @j0hanz/todokit-mcp@latestCommon Issues
Issue | Solution |
Server not responding | Ensure nothing else is reading/writing to stdout in the process |
| Call |
| Retry the operation — another process may be holding the file lock |
| Delete completed items or increase |
| Ensure at least one field is provided when calling |
| Check enum values ( |
File outside CWD error | Set |
Storage file auto-deleted | This is expected — the file is removed when all todos are completed |
Diagnostics
Enable detailed logging to stderr:
npx -y @j0hanz/todokit-mcp@latest --diagnostics --log-level debugThis publishes events on node:diagnostics_channel channels: todokit:tool, todokit:storage, todokit:lifecycle.
Contributing
Contributions are welcome! Please ensure all changes pass the full validation sequence:
npm run format && npm run lint && npm run type-check && npm run build && npm testLicense
Available Tools
7 toolsadd_todoAdd TodoB
Add a new todo item
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | The title of the todo | |
| description | No | Optional description of the todo | |
| priority | No | Priority level (default: normal) | |
| dueDate | No | Due date in ISO format (YYYY-MM-DD) | |
| tags | No | Tags for categorization |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | |
| result | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and idempotentHint=false, so the agent knows this is a non-read-only, non-idempotent operation. The description adds minimal behavioral context beyond this - it doesn't mention whether this creates a persistent record, what happens on duplicate titles, or any rate limits. With annotations covering the basic safety profile, this earns a baseline score.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is maximally concise - a single clear sentence that states the core purpose without any wasted words. It's appropriately sized for a straightforward creation tool and gets directly to the point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that the tool has comprehensive schema documentation (100% coverage), clear annotations, and an output schema (implied by 'Has output schema: true'), the minimal description is reasonably complete. The main gap is lack of differentiation from sibling tools, but the structured data provides sufficient context for basic usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with each parameter well-documented in the schema itself (title requirements, optional description, priority enum values, date format, tags constraints). The description adds no parameter information beyond what's already in the structured schema, so it meets but doesn't exceed the baseline expectation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Add a new todo item' clearly states the verb ('Add') and resource ('todo item'), making the purpose immediately understandable. However, it doesn't differentiate from sibling tools like 'add_todos' (plural) or 'update_todo', which could cause confusion about when to use this specific tool versus alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. With sibling tools like 'add_todos' (plural), 'update_todo', and 'complete_todo', the agent has no indication whether this is for single todo creation versus batch operations, or whether it should be used for initial creation versus updates.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_todosAdd Todos (Batch)B
Add multiple todo items in one call
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | Todos to add in a single batch |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | |
| result | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate this is a non-readOnly, non-idempotent operation, which the description aligns with by implying creation ('Add'). However, the description adds minimal behavioral context beyond annotations—it doesn't disclose rate limits, authentication needs, batch size implications (e.g., partial failures), or what happens on success/failure. No contradiction with annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the core action ('Add multiple todo items') and specifies the batch mechanism ('in one call'). There is zero wasted verbiage, making it highly concise and well-structured for quick comprehension.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (batch mutation), rich input schema (100% coverage), annotations (readOnlyHint=false, idempotentHint=false), and presence of an output schema, the description is minimally adequate. However, it lacks context on batch behavior (e.g., atomicity, error handling) and doesn't leverage the output schema to hint at return values, leaving gaps for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, the input schema fully documents the 'items' parameter and its nested properties (title, description, priority, dueDate, tags). The description adds no additional parameter semantics beyond the schema, merely restating the batch concept. Baseline 3 is appropriate as the schema carries the full burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Add') and resource ('multiple todo items'), specifying it's a batch operation ('in one call'). It distinguishes from the singular 'add_todo' sibling tool by emphasizing the batch capability, though it doesn't explicitly contrast with other siblings like 'list_todos' or 'delete_todos'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention when batch addition is preferred over the singular 'add_todo', nor does it address prerequisites, error handling, or any contextual constraints for batch operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
complete_todoComplete TodoBIdempotent
Set completion status for a todo item
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | |
| result | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false (implying mutation) and idempotentHint=true (safe for retries). The description adds minimal behavioral context by implying a status change, but it doesn't disclose details like whether this toggles status, sets a specific value, requires authentication, or has side effects. With annotations covering basic safety, the description adds some value but lacks rich behavioral insights.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with no wasted words. It's front-loaded with the core action and resource, making it easy to parse quickly. Every part of the sentence contributes to understanding the tool's purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (a mutation with no parameters) and the presence of annotations (readOnlyHint=false, idempotentHint=true) and an output schema, the description is minimally adequate. It states what the tool does but lacks context on usage, behavioral nuances, or how it differs from siblings. With annotations and output schema handling some structured info, the description meets a basic threshold but has clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0 parameters with 100% coverage, meaning no parameters are documented in the schema. The description doesn't add parameter details, but since there are no parameters, this is acceptable. It implies the tool operates on a todo item without specifying how (e.g., via ID), but the baseline for 0 parameters is 4, as the description doesn't need to compensate for missing schema info.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Set completion status for a todo item' clearly states the action (set completion status) and resource (todo item), but it's vague about what 'completion status' means (e.g., marking as done vs. toggling) and doesn't distinguish it from sibling tools like 'update_todo', which might also handle status updates. It avoids tautology by not just restating the name/title.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., needing an existing todo), exclusions (e.g., not for creating todos), or comparisons to siblings like 'update_todo' that might overlap in functionality. This leaves the agent without context for tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_todoDelete TodoADestructiveIdempotent
Delete a todo item (supports dry-run)
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | |
| result | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds valuable context beyond annotations by mentioning 'supports dry-run', which is not covered by the annotations (readOnlyHint: false, idempotentHint: true, destructiveHint: true). This provides practical behavioral insight, though it could elaborate more on effects or permissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise and front-loaded, consisting of a single sentence that directly states the action and a key feature ('supports dry-run'). Every word earns its place with no wasted information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (destructive operation with no parameters) and the presence of annotations and an output schema, the description is reasonably complete. It covers the core action and a useful feature, though it could benefit from more context on when to use versus siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0 parameters and 100% schema description coverage, the schema fully documents the input (none required). The description does not need to add parameter details, but it implies a todo item is targeted, which aligns with the tool's purpose. Baseline is 4 for zero parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Delete') and resource ('a todo item'), distinguishing it from siblings like 'delete_todos' (plural) and 'complete_todo'. It directly addresses what the tool does without being vague or tautological.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for deleting a single todo item, but does not explicitly state when to use this tool versus alternatives like 'delete_todos' (for multiple items) or 'complete_todo' (for marking as done). It provides basic context but lacks explicit guidance on exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_todosDelete Todos (Bulk)ADestructive
Delete multiple todos matching filters (requires at least one filter, defaults to limit=10 for safety)
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Filter by status | |
| priority | No | Filter by priority | |
| tag | No | Filter by tag | |
| dueBefore | No | Delete todos due before this date (ISO format) | |
| dueAfter | No | Delete todos due after this date (ISO format) | |
| query | No | Search text filter | |
| dryRun | No | Preview deletion without removing data | |
| limit | No | Max items to delete (default: 10, safety limit) |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | |
| result | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true, readOnlyHint=false, and idempotentHint=false. The description adds valuable context beyond this: it specifies the safety limit (default limit=10) and the requirement for at least one filter, which are not covered by annotations. It does not contradict annotations, as 'Delete' aligns with destructiveHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the core action and key constraints (filters, safety limit). Every word serves a purpose with no redundancy, making it highly concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (destructive bulk operation with 8 parameters), annotations cover safety aspects, and an output schema exists, the description is mostly complete. It adds important behavioral context (filter requirement, safety limit) but could benefit from more explicit guidance on alternatives or error handling, though the output schema reduces the need for return value explanation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents all 8 parameters. The description adds minimal semantics by mentioning the safety limit and filter requirement, but does not provide additional meaning beyond what the schema already covers. Baseline is 3 due to high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Delete multiple todos') and scope ('matching filters'), distinguishing it from the sibling 'delete_todo' which likely deletes a single todo. It specifies bulk deletion with filtering, making the purpose specific and differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use it ('requires at least one filter') and mentions a safety default ('defaults to limit=10 for safety'), but does not explicitly state when to use this vs. alternatives like 'delete_todo' or other sibling tools. It implies usage through filtering but lacks explicit alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_todosList TodosBRead-onlyIdempotent
List todos with filtering, search, sorting, and pagination
| Name | Required | Description | Default |
|---|---|---|---|
| completed | No | Filter by completion status (deprecated; use status) | |
| status | No | Filter by status | |
| query | No | Search text in title, description, or tags | |
| priority | No | Filter by priority level | |
| tag | No | Filter by tag (must contain) | |
| dueBefore | No | Filter todos due before this date (ISO format) | |
| dueAfter | No | Filter todos due after this date (ISO format) | |
| sortBy | No | Sort results by field | |
| order | No | Sort order (default: asc) | |
| limit | No | Max number of results to return (default: 50) | |
| offset | No | Number of results to skip |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | |
| result | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and idempotentHint=true, indicating safe, repeatable read operations. The description adds value by specifying capabilities like filtering and pagination, but does not disclose additional behavioral traits such as rate limits, authentication needs, or response format details. With annotations covering safety, a 3 is appropriate as the description adds some context without contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads key information ('List todos') and succinctly lists capabilities. Every word earns its place, with no wasted text, making it highly concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (11 parameters) and rich annotations (readOnlyHint, idempotentHint) and output schema, the description is mostly complete. It covers core functionalities but lacks guidance on usage versus siblings. With output schema handling return values, the description's gaps are minor, warranting a 4.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with detailed parameter descriptions in the input schema. The description mentions filtering, search, sorting, and pagination, which aligns with parameters but does not add significant meaning beyond the schema. Baseline 3 is correct when the schema fully documents parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('List') and resource ('todos'), and specifies the capabilities ('with filtering, search, sorting, and pagination'). However, it does not explicitly differentiate from sibling tools like 'add_todo' or 'complete_todo', which would require a 5. The purpose is clear but lacks sibling distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It does not mention prerequisites, exclusions, or compare with sibling tools (e.g., 'add_todo' for creation, 'complete_todo' for updates). Usage is implied by the name 'list_todos', but no explicit context is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_todoUpdate TodoBIdempotent
Update fields on a todo item (supports search and tag ops)
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | |
| result | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false (mutation) and idempotentHint=true (safe to retry). The description adds value by mentioning 'search and tag ops' which suggests this tool might have search capabilities and tag operations beyond basic field updates. However, it doesn't specify authentication requirements, rate limits, or what happens to existing fields not mentioned in updates.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise (one sentence) and front-loaded with the core purpose. However, the phrase 'supports search and tag ops' is ambiguous and doesn't clearly earn its place in such a brief description - it creates confusion rather than adding clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that there's an output schema (which handles return values), 0 parameters (minimal complexity), and annotations covering basic behavioral traits, the description is somewhat complete. However, the mention of 'search and tag ops' creates confusion about what this tool actually does versus siblings, and the empty parameter schema contradicts the implied capabilities.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0 parameters and 100% schema description coverage, the baseline would be 4. The description adds context about 'search and tag ops' which suggests this tool might have implicit parameters or capabilities not reflected in the empty schema. However, this is somewhat confusing given the empty parameter schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the tool updates fields on a todo item, which is a clear verb+resource combination. However, it doesn't distinguish this from sibling tools like 'complete_todo' or 'add_todo' - the mention of 'search and tag ops' is vague and doesn't clarify what makes this tool unique.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives like 'complete_todo' or 'add_todo'. The mention of 'search and tag ops' is ambiguous and doesn't provide clear context for tool selection. The description lacks any when/when-not statements or alternative recommendations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
v1.0.0- Added
delete_todos - Changed
list_todos2 fields changed- removed
Input schema / properties / dueAfter / $refRemoved value: -"#/properties/dueBefore" - added
Input schema / properties / dueAfter / typeAdded value: +"string"
6 tool updates
- First observed
add_todo - First observed
add_todos - First observed
complete_todo - First observed
delete_todo - First observed
list_todos - First observed
update_todo
TDQS
Scored across 7 tools
Every tool has a clearly distinct purpose with no ambiguity. The tools cover specific operations like adding single/multiple items, completing, deleting single/multiple items, listing, and updating, each with unique scopes that don't overlap.
All tool names follow a consistent verb_noun pattern (e.g., add_todo, complete_todo, delete_todo) with clear and predictable naming conventions throughout the set.
With 7 tools, the count is well-scoped for a todo management server. Each tool earns its place by covering essential CRUD operations and bulk actions without being excessive or sparse.
The tool set provides complete CRUD/lifecycle coverage for the todo domain, including creation (add_todo, add_todos), reading (list_todos), updating (update_todo, complete_todo), and deletion (delete_todo, delete_todos), with no obvious gaps.
Maintenance
Related MCP Connectors
Local-first task manager: create, edit, and complete tasks, projects, and checklists via MCP.
Task management for people and AI agents, with scoped OAuth access to issues, projects, and docs.
AI-native task management: list, create, update and archive tasks with rich context for AI agents
ADHD-friendly tasks, notes & projects for LucidNest - 18 tools, scoped tokens, Streamable HTTP.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables task management through natural language with full CRUD operations including add, list, update, complete, and delete tasks with JSON persistence.-
- -licenseNot gradedqualityDmaintenanceA task management system that exposes CRUD operations for todos through a custom MCP protocol, enabling AI agents and CLI tools to create, read, update, and delete tasks using JSON-based communication over stdin/stdout.-
- AlicenseNot gradedqualityDmaintenanceA persistent todo list server that enables AI assistants to manage tasks across different platforms using the Model Context Protocol. It provides tools for creating, listing, updating, and deleting todos with support for priorities, tags, and due dates.MIT
- FlicenseNot gradedqualityDmaintenanceEnables users to manage a personal todo list with CRUD operations, keyword search, and local SQLite storage. Designed for AI agent productivity tools.-