A terminal-based task tracking application with MCP integration
TaskTracker MCP exhibits significant definition quality gaps across multiple dimensions. Tool naming is adequate (verb_noun pattern followed), but parameter descriptions are inconsistent and often minimal. Parameter schemas are present but lack depth, many parameters have descriptions under 20 characters. Output schemas are not explicitly documented in the code (tools return inferred types via ctx.request_context.lifespan_context["api"] calls). Error handling is minimal: tools return {'error': 'not found'} without recovery guidance. Five of 13 tools have descriptions under 30 characters (get_all_tasks_tool: 28 chars, get_all_plan_steps_tool: 33 chars). Parameter descriptions like 'The ID of the task to retrieve' (tool 2, 4) meet minimum viability but lack format/constraint details. No parameter enums or range validation visible. Schema documentation missing from docstrings, LLMs cannot infer what fields are returned. Composition is reasonable (13 tools, each with one responsibility), but the suite lacks pagination for list operations (get_all_tasks_tool, get_all_plan_steps_tool, get_notes_tool return unbounded lists). Resource-backed tools repeat data loading without pagination hints. The lifespan pattern and API abstraction are sound, but tool definitions themselves do not match production baselines (194 chars avg description, 72 chars avg param description).
Add a new plan step.
Add a new task to the system.
Delete a plan step.
Delete a task.
Get all plan steps in the system.
Get all tasks in the system.
Get all notes in the system.
Get a specific plan step by ID.
Unbounded list operations (get_all_tasks_tool, get_all_plan_steps_tool, get_notes_tool) lack pagination (limit, offset, cursor) and return all items without capping. This violates the paginated-result pattern and risks context window exhaustion when datasets grow.
Output schemas are not documented in tool docstrings. LLMs cannot determine what fields to expect from tool responses (e.g., what does get_task_tool return? Fields like id, title, description, priority, status are inferred from parameter names, not declared).
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 48 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 35 | - | v1 |
Get a specific task by ID.
Toggle the completion status of a plan step.
Update the notes content.
Update an existing plan step.
Update an existing task.
Five tools have descriptions under 30 characters (get_all_tasks_tool: 28, get_all_plan_steps_tool: 33, get_notes_tool: 35, get_plan_step_tool: 35, get_all_tasks_tool: 35). Production baselines require 34 - 392 chars (p10 - p90). Short descriptions lack context for LLM tool selection (WHEN to use this vs alternatives).
Parameter descriptions lack constraint details. Examples: 'The title of the task' (add_task, title param) does not specify length, format, or uniqueness. 'Priority level (1-3, with 1 being highest)' exists but many params like task_id or step_id have minimal context ('The ID of the task to retrieve', is it numeric, UUID, or alphanumeric?). LLMs cannot validate or self-correct without explicit format rules.
Error handling is minimal and non-recoverable. Tools return {'error': 'Task not found'} or 'Plan step not found' with no recovery guidance. Per the recovery-guide pattern, errors should suggest next steps: e.g., 'Task not found. Try get_all_tasks_tool() to see available task IDs or add_task() to create a new one.'
Destructive tools (delete_task, delete_plan_step) lack confirmation or dry-run support. Agents can invoke delete operations without a safeguard. The confirmation-request pattern recommends a dry-run or explicit confirmation step to prevent accidental data loss.
Tools with 'optional' parameters (update_task, update_plan_step) do not specify default behavior. What happens if all optional fields are omitted? Is the resource unchanged, or are optional fields cleared? This ambiguity forces LLMs to guess and risks unintended updates.
No tool annotations detected (readOnlyHint, destructiveHint, idempotentHint). MCP spec (2026-07-28) supports tool annotations for LLM planning. get_all_tasks_tool, get_task_tool, etc. should be marked readOnlyHint=true; delete_task and delete_plan_step should be marked destructiveHint=true. This enables better agent reasoning.
Parameter naming inconsistencies: add_task uses 'title' and 'description'; update_task also uses 'title' and 'description', but with '(optional)' suffix in descriptions. Enums like status ('not_started, in_progress, completed') are documented inline but not declared as JSON Schema enums. LLMs cannot validate against these constraints at parse time.