Task Manager MCP Server
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., "@Task Manager MCP ServerCreate a high-priority task to review the budget by Friday"
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.
Task Manager MCP Server
A comprehensive task management MCP server built with FastMCP, featuring full CRUD operations, intelligent filtering, and productivity-focused prompts. This project serves as Phase 1 of building a production-ready MCP multi-tenant server.
Features
š ļø Tools (Actions)
create_task: Create new tasks with priority, due dates, and tags
list_tasks: List tasks with filtering by status and priority
get_task: Get detailed information for a specific task
update_task: Update any aspect of existing tasks
delete_task: Remove tasks from the system
complete_task: Quick action to mark tasks as completed
get_task_summary: Get comprehensive task statistics
š Resources (Data Access)
tasks://all: Formatted list of all tasks
tasks://task/{id}: Detailed view of specific task
tasks://status/{status}: Tasks filtered by status
tasks://priority/{priority}: Tasks filtered by priority
tasks://summary: Task statistics dashboard
tasks://overdue: All overdue tasks with urgency indicators
š¬ Prompts (AI Assistance)
Daily Planning: Context-aware daily planning with current task status
Task Breakdown: Break complex tasks into manageable subtasks
Weekly Review: Productivity review with accomplishment tracking
Project Planning: Comprehensive project planning assistance
Task Prioritization: Systematic task prioritization using current data
Related MCP server: task-manager-mcp
Installation
Clone and setup:
git clone <repository>
cd task-manager
uv venv && source .venv/bin/activate
uv add "mcp[cli]" pydantic python-dotenvConfigure environment:
cp .env.example .env
# Edit .env with your preferencesRun the server:
python -m server.task_serverDevelopment Journey & Challenges Solved
This project was built as a learning exercise to understand MCP (Model Context Protocol) fundamentals before building a multi-tenant architecture. Here are the key challenges encountered and solutions implemented:
Challenge 1: Python Module Path Issues
Problem: ModuleNotFoundError: No module named 'database' when running the server.
Root Cause: Python couldn't find the database module because it wasn't in the Python path.
Solution: Added project root to Python path in server/task_server.py:
import sys
import os
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))Alternative Solution: Run from project root using module syntax:
python -m server.task_serverChallenge 2: Pydantic Validation Errors
Problem: ValidationError: Field required errors during server startup for TaskSummary model.
Root Cause: The Pydantic model defined more fields than the database query was providing.
Solution: Updated the get_summary() method in database/connection.py to provide all required fields:
return TaskSummary(
total_tasks=total_tasks,
pending_tasks=pending_tasks,
in_progress_tasks=in_progress_tasks,
completed_tasks=completed_tasks,
cancelled_tasks=cancelled_tasks, # Added missing field
high_priority_tasks=high_priority_tasks,
medium_priority_tasks=medium_priority_tasks, # Added missing field
low_priority_tasks=low_priority_tasks, # Added missing field
over_due_tasks=over_due_tasks,
)Challenge 3: DateTime Type Mismatches
Problem: ValidationError: Input should be a valid string for datetime fields.
Root Cause: Pydantic model expected string dates but SQLite returned datetime objects.
Solution: Updated the Task model in database/models.py to use proper datetime types:
class Task(BaseModel):
created_at: Optional[datetime] = None # Changed from str to datetime
updated_at: Optional[datetime] = None # Changed from str to datetime
due_date: Optional[datetime] = None # Changed from str to datetimeChallenge 4: WSL + Windows Claude Desktop Integration
Problem: Developed in WSL (Ubuntu) but Claude Desktop runs on Windows, causing path and execution issues.
Root Cause: Claude Desktop on Windows couldn't directly access WSL file paths and commands.
Solutions Tried:
Direct WSL paths - Didn't work
Copying code to Windows - Would work but requires syncing
WSL integration - Final working solution
Working Solution: WSL command integration in Claude Desktop config:
{
"mcpServers": {
"task-manager": {
"command": "wsl",
"args": ["-d", "Ubuntu", "-e", "bash", "-c", "cd /home/ibejih/projects/task-manager && /home/ibejih/.local/bin/uv run python -m server.task_server"]
}
}
}Key Discoveries:
Used
which uvto find the full uv path:/home/ibejih/.local/bin/uvPowerShell requires
$env:APPDATAinstead of%APPDATA%Claude Desktop config location:
%APPDATA%\Claude\claude_desktop_config.json
Challenge 5: Claude Desktop Not Showing Tools
Problem: Tools not appearing in Claude Desktop interface after configuration.
Root Cause: Claude Desktop processes weren't fully restarted.
Solution: Complete process termination using Task Manager:
Press
Ctrl+Shift+Escto open Task ManagerFind all "Claude" processes
Right-click and "End Task" on each process
Restart Claude Desktop from Start menu
Lesson Learned: Simply closing the window doesn't fully restart Claude Desktop - must kill all processes.
Testing
Comprehensive Test Suite
Run the complete test suite to verify all functionality:
python test_complete.pyThis tests:
ā Database operations (CRUD)
ā MCP tools functionality
ā MCP resources serving
ā MCP prompts generation
Manual Testing Commands
Test with Claude Desktop using these commands:
"Create a task to review quarterly reports with high priority"
"Show me all my current tasks"
"Give me a task summary"
"Help me plan my day focusing on development work"Claude Desktop Integration
For WSL + Windows Users
Find your uv path in WSL:
which uv
# Output: /home/username/.local/bin/uvCreate config file at
%APPDATA%\Claude\claude_desktop_config.json:
{
"mcpServers": {
"task-manager": {
"command": "wsl",
"args": ["-d", "Ubuntu", "-e", "bash", "-c", "cd /path/to/your/task-manager && /path/to/uv run python -m server.task_server"]
}
}
}Test the WSL command first:
wsl -d Ubuntu -e bash -c "cd /path/to/task-manager && /path/to/uv run python -m server.task_server"Completely restart Claude Desktop:
Use Task Manager to end all Claude processes
Restart from Start menu
For Native Linux/macOS Users
{
"mcpServers": {
"task-manager": {
"command": "uv",
"args": [
"--directory",
"/absolute/path/to/task-manager",
"run",
"python",
"-m",
"server.task_server"
]
}
}
}Architecture & Design Decisions
Database Design
SQLite: Perfect for learning and single-tenant operations
Pydantic Models: Type-safe data validation and serialization
Proper Indexing: Optimized queries for status, priority, and due dates
MCP Implementation
FastMCP SDK: Leverages Anthropic's official implementation
Structured Output: Rich data exchange using Pydantic models
Error Handling: Comprehensive validation throughout the stack
Context Integration: Proper logging and progress reporting
Project Structure
task-manager/
āāā database/ # Data models and connection logic
ā āāā models.py # Pydantic models with validation
ā āāā connection.py # Database operations and queries
āāā server/ # MCP server implementation
ā āāā task_server.py # Main server with lifecycle management
ā āāā tools.py # MCP tools (actions)
ā āāā resources.py # MCP resources (data serving)
ā āāā prompts.py # MCP prompts (AI assistance)
āāā test_complete.py # Comprehensive test suite
āāā README.md # This documentationUsage Examples
Creating and Managing Tasks
User: "Create a task to review the quarterly reports with high priority and due date 2024-02-15"
Claude: [Calls create_task tool] "I've created the task 'Review quarterly reports' with high priority and due date February 15, 2024."
User: "Show me all pending tasks"
Claude: [Accesses tasks://status/pending resource] "Here are your pending tasks: ..."
User: "Mark task 1 as completed"
Claude: [Calls complete_task tool] "Task 1 has been marked as completed."Planning and Productivity
User: "Help me plan my day focusing on development work"
Claude: [Uses daily_planning prompt with current task data] "Based on your current tasks, here's a focused plan for your development work today..."Key Learning Outcomes
This project demonstrates:
ā MCP Protocol Understanding: Complete implementation of tools, resources, and prompts
ā Production Patterns: Error handling, validation, and lifecycle management
ā Database Integration: SQLite with proper connection management
ā Cross-Platform Development: WSL + Windows integration strategies
ā Structured Data Exchange: Pydantic models for type-safe MCP communication
Next Steps: Multi-Tenant Architecture
This server serves as Phase 1 foundation for building a multi-tenant MCP platform. The next phase will involve:
Tenant Isolation: Schema-per-tenant database design
Server Factory: Programmatic MCP server instance creation
Django Integration: REST API for tenant management
Production Deployment: Scalable multi-tenant infrastructure
The solid understanding of MCP fundamentals gained from this project makes the multi-tenant challenge much more manageable.
Troubleshooting
Common Issues
Import Errors: Ensure you're running from project root or using module syntax Validation Errors: Check that Pydantic models match database schema Claude Desktop Connection: Verify config file location and restart all processes WSL Integration: Test WSL commands manually before adding to Claude Desktop config
Debug Commands
# Test basic functionality
python test_complete.py
# Test MCP Inspector (alternative to Claude Desktop)
uv run mcp dev server/task_server.py
# Check database operations
python -c "from database.connection import get_database; print(get_database().get_summary())"Contributing
This project was built as a learning exercise, but improvements are welcome! Focus areas:
Additional MCP tool implementations
Enhanced prompt templates
Better error messages
Performance optimizations
License
MIT License - Built for learning and sharing MCP implementation patterns.
Available Tools
7 toolscomplete_taskC
Mark a task as completed
Args:
task_id: ID of the task to complete
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It doesn't disclose whether completion is reversible, whether it triggers side effects (notifications, timestamps), what happens if the task is already completed, or what error conditions exist.
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?
Very short and front-loaded, though the 'Args:' formatting is a code-doc artifact rather than conversational prose. No wasted words.
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?
A mutation tool with no annotations, no output schema, and no side-effect disclosure. The description should at least describe state transitions or idempotency for an agent to call it safely.
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 0%, but there is only one parameter with an obvious name (task_id). The description restates that it's the ID of the task to complete, which is marginally helpful but adds little beyond the schema's property name. With a single obvious param, baseline is near 3.
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?
States a clear verb (mark as completed) and resource (task), distinguishing it from siblings like update_task or delete_task. Slightly weaker than a 5 because 'completed' vs 'done' state terminology isn't elaborated.
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 guidance on when to use this versus update_task, which could presumably also change status. No prerequisites or context provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_taskB
Create a new task
Args:
title: Task title (required)
description: Detailed description of the task
priority: Task priority (low, medium, high, urgent)
due_date: Due date in YYYY-MM-DD format
tags: Comma-separated tags (e.g., "work,urgent,meeting")
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | ||
| title | Yes | ||
| due_date | No | ||
| priority | No | medium | |
| description | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full behavioral burden. It says a task is created, but does not disclose side effects, required permissions, persistence behavior, return value, or what happens on invalid input.
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 front-loaded with the action and then structured as an Args list. It is reasonably concise, though the Args block could be tighter and includes some self-evident labels.
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?
The description covers purpose and all parameters, which is adequate for a simple create tool. However, with no annotations and no output schema, it omits behavioral context such as permissions, side effects, and whether the created task or its ID is returned.
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 0%, so the description must compensate for all five parameters. It documents required title, meaning of description, allowed priority values, due_date format, and tags format, adding meaningful semantics beyond the bare 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 a specific verb and resource: 'Create a new task.' This clearly distinguishes it from CRUD siblings like update_task, delete_task, and complete_task, but it does not explicitly call out the distinction or alternative tools.
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 gives no guidance on when to use this tool versus alternatives, no prerequisites, and no conditions for choosing create_task over update_task or other siblings. It only states what the tool does.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_taskC
Delete a task
Args:
task_id: ID of the task to delete
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden for a destructive operation, and it fails to meet it. It never states whether deletion is permanent or reversible, whether it cascades to subtasks/comments, what permissions are required, or how failures manifest. Only the verb "delete" hints at a write/mutation.
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 text is short and the action is front-loaded, and the Args block is a conventional docstring pattern. But its brevity reflects under-specification rather than disciplined conciseness, since the content contains almost no information an agent could not get from the tool name.
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?
For a destructive single-parameter tool with no annotations, no output schema, and 0% schema description coverage, the description is insufficient. It omits reversibility, side effects, and permission requirements, which are exactly the details an agent needs before invoking a delete.
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 0%, so the description must compensate. It only restates the parameter name as "ID of the task to delete," adding no type, format, or sourcing guidance beyond the schema's title. A single param at zero coverage demands more than a name echo.
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?
"Delete a task" names a specific verb and resource, so the core action is unambiguous. However, it adds nothing beyond the tool name delete_task and gives no scope detail (permanent vs. soft delete, cascade behavior), and it does not distinguish itself from siblings like complete_task or update_task. Minimally viable but thin.
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?
There is no when-to-use guidance, no prerequisites, and no mention of alternatives such as complete_task (which may be the correct action when work is finished rather than abandoned). The agent must infer everything from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_taskC
Get a specific task by ID
Args:
task_id: The ID of the task to retrieve
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It does not disclose what happens when the task ID does not exist, whether authentication or workspace scoping is required, or what the return payload contains. For a read tool with zero annotation coverage, this is a significant gap.
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 short and front-loaded with the core action, and the Args block maps cleanly to the single parameter. It is minimally wasteful, though the docstring-style Args block adds little for a one-parameter tool.
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?
With no output schema and no annotations, the description should explain what a successful retrieval returns and how failures surface, but it says nothing about either. For a lookup tool this leaves material gaps for an agent that must decide whether to call it and how to interpret the result.
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 0%, so the description's 'The ID of the task to retrieve' is the only semantic guidance for task_id, which is better than nothing. However, it does not clarify the ID format, whether it is a numeric internal ID versus a human-readable key, or where the caller obtains valid IDs.
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 a clear verb and resource: 'Get a specific task by ID.' It is distinguishable from create/update/delete/complete by the read nature of the operation, but it does not differentiate itself from get_task_summary or clarify how it differs from list_tasks.
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?
There is no explicit guidance on when to use this tool versus get_task_summary or list_tasks. The 'by ID' phrasing weakly implies it is for fetching one known task, but the agent is left to infer this from the sibling names alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_task_summaryB
Get summary statistics for all tasks
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It implies a read operation via 'Get' but does not state what statistics are returned, whether the operation is read-only, what scope 'all tasks' covers, or any auth or rate-limit requirements.
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, front-loaded sentence with no wasted words. It is appropriately sized for a simple no-parameter tool.
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?
With no annotations and no output schema, the description should explain return values or at least what summary statistics are computed. It only says 'summary statistics for all tasks', which is too vague for an agent to know what to expect or how to use the result.
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 tool has zero parameters, so the baseline score is 4. There are no parameters for the description to add meaning to, and the schema is empty.
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 a specific verb (Get) and resource (summary statistics for all tasks), clearly distinguishing it from siblings like get_task or list_tasks. However, it does not explicitly contrast itself with list_tasks or explain what 'summary statistics' includes, leaving some ambiguity.
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?
There is no guidance on when to use this tool versus list_tasks or get_task. The description only states what it does, with no alternatives or exclusions mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tasksB
List all tasks with optional filtering
Args:
status: Filter by status (pending, in_progress, completed, cancelled)
priority: Filter by priority (low, medium, high, urgent)
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | ||
| priority | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full behavioral burden and largely drops it: nothing is said about pagination, result ordering, result-size limits, or required permissions. For a list tool that can return 'all tasks', the absence of any pagination or volume disclosure is a real gap.
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?
Purpose is front-loaded in the first line and the two parameters are listed compactly with no filler. The 'Args:' block is slightly boilerplate but earns its place by supplying enum values absent from the schema.
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?
There is no output schema, no annotations, and only two bare-typed parameters, so the description is the only source of behavioral detail ā yet it says nothing about the shape of results, pagination, or ordering. It is adequate for selecting the tool but incomplete for invoking it correctly at scale.
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 coverage is 0% and the schema defines no enums, but the description compensates by naming both parameters and enumerating their allowed values (pending/in_progress/completed/cancelled, low/medium/high/urgent). It omits default/null behavior and whether filters combine with AND semantics, keeping it below a 5.
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 opens with a specific verb+resource ('List all tasks') and adds a scope modifier ('with optional filtering'), so the agent knows exactly what the tool returns. It does not, however, distinguish itself from siblings like get_task_summary or get_task, so it stops short of a 5.
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?
Calling the filters 'optional' implies the tool can be invoked bare to fetch everything or narrowed with status/priority, which is usable implied guidance. There is no statement of when to prefer this over get_task_summary or get_task, and no exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_taskB
Update an existing task
Args:
task_id: ID of the task to update
title: New title for the task
description: New description for the task
priority: New priority (low, medium, high, urgent)
status: New status (pending, in_progress, completed, cancelled)
due_date: New due date in YYYY-MM-DD format
tags: New comma-separated tags
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | ||
| title | No | ||
| status | No | ||
| task_id | Yes | ||
| due_date | No | ||
| priority | No | ||
| description | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden, yet it says nothing about whether omitted fields are preserved or cleared (the schema's single required field implies partial update, but this is never stated), what happens if task_id is invalid, or whether the operation is idempotent. For a mutation tool with zero annotation coverage this is a substantial gap.
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 purpose line is front-loaded and the per-argument list is efficient and scannable. The repeated 'New X for the task' phrasing on title/description is slightly redundant but costs little.
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?
With no output schema and no annotations, the description should say more about the return value and about partial-update semantics for a 7-parameter mutation tool. The parameter documentation is solid, but the behavioral envelope an agent must know to call it safely is left implicit.
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 0%, but the description compensates well: it supplies the enumerated values for priority (low, medium, high, urgent) and status (pending, in_progress, completed, cancelled) and the YYYY-MM-DD date format and comma-separated tag format, none of which appear in the bare schema. It falls short of explaining whether tags replace or append to existing tags.
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?
States a specific verb ('Update') and resource ('an existing task'), so the operation is unambiguous. It does not, however, distinguish itself from the overlapping sibling 'complete_task' (which also changes status), leaving that routing decision to the caller.
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?
There is no guidance on when to use this versus its siblings, and no mention that 'complete_task' is the dedicated path for finishing a task or that this tool should be used for partial edits. The reader must infer usage entirely from the tool name.
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.
7 tool updates
v0.1.0- First observed
complete_task - First observed
create_task - First observed
delete_task - First observed
get_task - First observed
get_task_summary - First observed
list_tasks - First observed
update_task
TDQS
Scored across 7 tools
Most tools have clearly distinct purposes (create, list, get, update, delete), but complete_task overlaps with update_task since the latter can also set status to completed. The descriptions make the distinction clear enough, but it's a minor point of confusion.
All tool names follow a consistent snake_case verb_noun pattern: create_task, list_tasks, get_task, update_task, delete_task, complete_task, get_task_summary. No deviations or mixed conventions.
Seven tools provide a well-scoped set covering standard task management operations plus a summary helper. Each tool earns its place without redundancy.
The toolset provides full CRUD coverage (create, read, list, update, delete), a dedicated complete action, and summary statistics. No obvious lifecycle gaps for a task manager; filters are available on list_tasks.
Maintenance
Related MCP Connectors
Nifty's MCP server ā exposes tasks, projects, messages, and files as tools for AI agents.
Local-first task manager: create, edit, and complete tasks, projects, and checklists via MCP.
- mcpOAuthnet.todoist
Official Todoist MCP server for AI assistants to manage tasks, projects, and workflows.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceA local task management MCP server that enables users to create, update, and manage tasks through natural language conversations with Claude. It provides nine tools for comprehensive task management including creation, filtering, searching, and daily planning without requiring a separate UI or backend service.-
- FlicenseNot gradedqualityDmaintenanceA task manager MCP server that demonstrates all three MCP primitives (tools, resources, prompts). Enables users to manage tasks, read task summaries and details, and run structured planning/review prompts through natural language.-
- FlicenseNot gradedqualityBmaintenanceA lightweight task management MCP server that enables CRUD operations on tasks stored in a single JSON file, including listing, creating, updating progress, and setting priorities.215 npm-
- FlicenseNot gradedqualityCmaintenanceA personal task management MCP server that allows LLM clients to create, read, update, and delete tasks with projects, labels, and comments, using a local SQLite database that can also be accessed via a web UI.-