Skip to main content
Glama

Todokit MCP Server

npm version License: MIT Node.js TypeScript MCP SDK

Install in VS Code Install in VS Code Insiders Install in Claude Desktop Install in Cursor

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://list resource with change notifications

Tech Stack

Component

Technology

Runtime

Node.js ≥ 24

Language

TypeScript 5.9+

MCP SDK

@modelcontextprotocol/sdk ^1.26.0

Schema

Zod ^4.3.6 (z.strictObject())

Transport

stdio (JSON-RPC over stdin/stdout)

Package Manager

npm

Architecture

  1. CLI Entrypoint (src/index.ts) — Parses CLI args, wires the McpServer to a StdioServerTransport, registers signal handlers for graceful shutdown.

  2. Tool Layer (src/tools.ts) — Registers 7 tools with timeout/abort/diagnostics wrappers and cursor-based pagination.

  3. Storage Layer (src/storage.ts) — Port/Adapter pattern (FileSystemPort, LockPort) for atomic JSON file reads/writes with in-memory caching and mtime-based invalidation.

  4. Schema Layer (src/schema.ts) — Zod strict schemas for all tool inputs and outputs.

  5. Diagnostics (src/diagnostics.ts) — Publishes events on todokit:tool, todokit:storage, and todokit:lifecycle channels.

  6. 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.mjs

Requirements

  • Node.js ≥ 24

  • npm (included with Node.js)

Quickstart

Run with npx — no installation needed:

npx -y @j0hanz/todokit-mcp@latest

Add to your MCP client configuration:

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

Installation

npx -y @j0hanz/todokit-mcp@latest

Global Install

npm install -g @j0hanz/todokit-mcp
todokit-mcp

From Source

git clone https://github.com/j0hanz/todokit-mcp-server.git
cd todokit-mcp-server
npm ci
npm run build
node dist/index.js

Configuration

CLI Arguments

Flag

Short

Type

Default

Description

--todo-file

-f

string

Path to the todo JSON file

--diagnostics

-d

boolean

false

Enable diagnostics logging to stderr

--log-level

-l

string

info

Log level: error, warn, info, or debug

Environment Variables

Variable

Default

Description

TODOKIT_TODO_FILE

./todos.json

Path to the JSON storage file

TODOKIT_TOOL_TIMEOUT_MS

60000

Tool execution timeout in ms (0 to disable)

TODOKIT_LOCK_TIMEOUT_MS

5000

File lock acquisition timeout in ms

TODOKIT_MAX_TODO_FILE_BYTES

5242880 (5 MB)

Maximum allowed size of the todo file

TODOKIT_JSON_PRETTY

false

Pretty-print the JSON storage file (true/1/yes)

TODOKIT_ALLOW_OUTSIDE_CWD

Allow todo file outside the current working directory

TODOKIT_STRICT_PROTOCOL_VERSION

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 debug

MCP Surface

Tools

add_todo

Create a single task. For multiple items, prefer add_todos.

Parameter

Type

Required

Default

Description

description

string

Yes

Description of the todo (1–2000 chars)

priority

string

Yes

Task priority: low, medium, or high

category

string

Yes

Task category (1–50 chars, e.g. work, bug, testing, docs)

dueAt

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

items

array

Yes

Array of todo objects (same shape as add_todo parameters)

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

status

string

No

pending

Filter: pending, completed, or all

limit

number

No

50

Max items to return (1–100)

cursor

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

query

string

Yes

Search query (1–100 chars)

status

string

No

pending

Filter: pending, completed, or all

limit

number

No

50

Max items to return (1–100)

cursor

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

id

string

Yes

ID of the todo to update (1–100 chars)

description

string

No

New description (1–2000 chars)

priority

string

No

New priority: low, medium, or high

category

string

No

New category (1–50 chars)

dueAt

string

No

New due date/time as ISO 8601 with offset

At least one field besides id must 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

id

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

id

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

internal://instructions

text/markdown

Server usage instructions

todo://list

application/json

Live list of active (pending) todos. Supports subscriptions for change notifications.

Prompts

Name

Description

get-help

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_CWD to override. Symlink resolution is performed to prevent escaping via symlinks.

  • File locking — Concurrent access is protected by file-based locks with exponential backoff and timingSafeEqual ownership 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 ci

Scripts

Script

Command

Purpose

npm run dev

tsc --watch --preserveWatchOutput

Watch mode compilation

npm run dev:run

node --env-file=.env --watch dist/index.js

Run server with auto-reload

npm run build

Clean + compile + validate + copy assets

Production build

npm start

node dist/index.js

Run compiled server

npm run format

prettier --write .

Format code

npm run lint

eslint .

Lint code

npm run lint:fix

eslint . --fix

Auto-fix lint issues

npm run type-check

tsc --noEmit

Type-check without emitting

npm test

Build + node --test with tsx

Run tests

npm run test:coverage

Build + test with --experimental-test-coverage

Run tests with coverage

npm run dup-check

jscpd --config .jscpd.json

Check for code duplication

npm run knip

knip

Detect dead/unused code

npm run inspector

npx @modelcontextprotocol/inspector

Launch MCP Inspector

Full Validation

npm run format && npm run lint && npm run type-check && npm run build && npm test

Build and Release

The project uses GitHub Actions for CI/CD. On a GitHub Release event:

  1. Checks out the repository

  2. Sets up Node.js 24 with the npm registry

  3. Installs dependencies (npm ci)

  4. Runs lint, type-check, tests, coverage, and duplication checks

  5. Builds the package

  6. Publishes to npm using Trusted Publishing (OIDC — no NODE_AUTH_TOKEN needed)

Published package: @j0hanz/todokit-mcp

Troubleshooting

Inspect the Server

Use the MCP Inspector to interactively test tools:

npx @modelcontextprotocol/inspector node dist/index.js

Or if installed from npm:

npx @modelcontextprotocol/inspector npx -y @j0hanz/todokit-mcp@latest

Common Issues

Issue

Solution

Server not responding

Ensure nothing else is reading/writing to stdout in the process

E_NOT_FOUND

Call list_todos first to verify the todo ID exists

E_STORAGE_CONFLICT

Retry the operation — another process may be holding the file lock

E_STORAGE_TOO_LARGE

Delete completed items or increase TODOKIT_MAX_TODO_FILE_BYTES

E_BAD_REQUEST

Ensure at least one field is provided when calling update_todo

E_INVALID_PARAMS

Check enum values (priority, status) and ISO 8601 date formats

File outside CWD error

Set TODOKIT_ALLOW_OUTSIDE_CWD=true or use a path within CWD

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 debug

This 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 test

License

MIT

Available Tools

7 tools
add_todoAdd TodoB

Add a new todo item

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesThe title of the todo
descriptionNoOptional description of the todo
priorityNoPriority level (default: normal)
dueDateNoDue date in ISO format (YYYY-MM-DD)
tagsNoTags for categorization

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
errorNo
resultNo

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYesTodos to add in a single batch

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
errorNo
resultNo

TDQS

B3.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 TodoB
Idempotent

Set completion status for a todo item

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
errorNo
resultNo

TDQS

B3.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose3/5

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.

Usage Guidelines2/5

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 TodoA
DestructiveIdempotent

Delete a todo item (supports dry-run)

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
errorNo
resultNo

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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)A
Destructive

Delete multiple todos matching filters (requires at least one filter, defaults to limit=10 for safety)

ParametersJSON Schema
NameRequiredDescriptionDefault
statusNoFilter by status
priorityNoFilter by priority
tagNoFilter by tag
dueBeforeNoDelete todos due before this date (ISO format)
dueAfterNoDelete todos due after this date (ISO format)
queryNoSearch text filter
dryRunNoPreview deletion without removing data
limitNoMax items to delete (default: 10, safety limit)

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
errorNo
resultNo

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 TodosB
Read-onlyIdempotent

List todos with filtering, search, sorting, and pagination

ParametersJSON Schema
NameRequiredDescriptionDefault
completedNoFilter by completion status (deprecated; use status)
statusNoFilter by status
queryNoSearch text in title, description, or tags
priorityNoFilter by priority level
tagNoFilter by tag (must contain)
dueBeforeNoFilter todos due before this date (ISO format)
dueAfterNoFilter todos due after this date (ISO format)
sortByNoSort results by field
orderNoSort order (default: asc)
limitNoMax number of results to return (default: 50)
offsetNoNumber of results to skip

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
errorNo
resultNo

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 TodoB
Idempotent

Update fields on a todo item (supports search and tag ops)

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
errorNo
resultNo

TDQS

B3.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose3/5

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.

Usage Guidelines2/5

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.

  1. 2 tool updatesv1.0.0
    • Addeddelete_todos
    • Changedlist_todos2 fields changed
      • removedInput schema / properties / dueAfter / $ref
        Removed value: -"#/properties/dueBefore"
      • addedInput schema / properties / dueAfter / type
        Added value: +"string"
  2. 6 tool updates
    • First observedadd_todo
    • First observedadd_todos
    • First observedcomplete_todo
    • First observeddelete_todo
    • First observedlist_todos
    • First observedupdate_todo

TDQS

A3.9/5.0

Scored across 7 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • -
    license
    Not graded
    quality
    D
    maintenance
    A 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.
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    A 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