A task management MCP server that allows users to create, complete, and delete tasks with status tracking and timestamps.
TaskTracker has clear tool names following verb_noun conventions (add_task, complete_task, delete_task) and provides descriptions for each tool. However, there are significant gaps in parameter-level documentation, error handling guidance, and output schema documentation. The server implements 3 tools with basic functionality but lacks the rigor expected for production use. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) are present despite delete_task being a DESTRUCTIVE operation. Parameter descriptions exist but are minimal (under 30 chars). Output schemas are not documented, LLMs cannot predict the response structure. Error handling returns unstructured responses with no recovery guidance.
Takes a task title (required) and an optional description. Creates a task dictionary with a unique ID, status, and timestamp. Adds it to our tasks list. Returns the created task.
The tool searches the task list for a matching ID, updates its status to "completed", and stamps it with a completion timestamp. It then returns the updated task or an error message if no match is found.
This tool searches for a task, removes it from the list, and returns confirmation with the deleted task data.
No output schema documented for any tool. LLMs cannot predict response structure or extract fields for downstream calls. Tool descriptions mention return types (task, error, success) but do not formalize the JSON structure, field types, or which fields are guaranteed.
Error responses are unstructured and lack recovery guidance. complete_task and delete_task return raw dict {'error': '...'} or {'success': False, 'error': '...'} with no hint about what the agent should do next. Per pattern:recovery-guide, errors must say 'Task not found. Try listing tasks first.' to guide the LLM.
Destructive tool (delete_task) lacks confirmation or dry-run support. Pattern:confirmation-request requires irreversible operations to support a confirmation step or require explicit user approval. Agents can accidentally delete tasks without any friction.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 52 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 42 | - | v1 |
No tool annotations present. The server does not use readOnlyHint, destructiveHint, or idempotentHint in tool definitions, despite delete_task being marked DESTRUCTIVE and add_task/complete_task being state-modifying. Tool annotations help agents reason about safety and idempotence.
Parameter descriptions are minimal. 'The ID of the task to complete' (task_id in complete_task) and 'The ID of the task to delete' (task_id in delete_task) provide no format, range, or constraint information. Per pattern:tool-description, parameter descriptions should be 30-100 chars explaining what values are valid.
In-memory storage with no persistence. Tasks are stored in a Python list (`tasks = []`) that is cleared on server restart. For a TaskTracker server, this severely limits real-world use, agents cannot rely on tasks being available across sessions.