MCP server for intelligent Downloads folder management
Downloads Warden provides 8 tools with basic parameter schemas and descriptions, but exhibits significant quality gaps. All tool names follow verb_noun convention (scan_, smart_sort_, sort_by_, deduplicate_, auto_extract_, clear_, find_), which is strong. However, descriptions are generic (10-100 chars, well below the 194 char baseline), parameters lack detailed constraints, and output schemas are entirely undocumented. The source reveals that tool implementations delegate to a container module (scan.execute, smart_sort.execute, etc.), but the actual return types and fields are not visible in the provided code. Parameter descriptions are minimal: 'Optional path to the Downloads folder; defaults to ~/Downloads' repeats across 8 tools without explaining validation rules, path traversal risks, or format requirements. The dry_run boolean on destructive tools is a strong pattern, but the lack of detailed error handling, permission gates, and output schema documentation keeps the score well below production baseline.
Extract ZIP archives and delete them after successful extraction.
Remove old installer files (.exe, .msi, .dmg) older than specified days.
Remove duplicate files using SHA-256 hash comparison.
Identify and remove folders with identical content.
Find files larger than specified size in MB (default 500 MB).
Analyze Downloads folder structure and return statistics about files.
Sort files into categories: Documents, Media, Installers, Code, Archives, Other.
Output schemas are entirely undocumented. All 8 tools return dict[str, object] without specifying structure, field names, or types. LLMs cannot infer what fields to expect or plan downstream operations.
Parameter descriptions are generic and non-actionable. All 8 tools repeat 'Optional path to the Downloads folder; defaults to ~/Downloads' without documenting path validation, traversal restrictions, or format constraints. dry_run and other parameters lack constraint descriptions.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 41 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 31 | - | v1 |
Sort files into folders by year-month (YYYY-MM) based on modification date.
Tool descriptions do not clarify state-modifying behavior or safety implications. 6 tools modify or delete files (smart_sort_files_tool, sort_by_date_tool, deduplicate_by_hash_tool, deduplicate_folders_tool, auto_extract_and_cleanup_tool, clear_installers_tool) but descriptions do not state 'WARNING: This tool deletes files' or explain irreversibility. LLMs need explicit state-change warnings.
auto_extract_and_cleanup_tool name violates single-responsibility principle. Tool name contains 'and', signaling it performs two distinct operations: extract archives AND delete source files. This should be split into separate tools or the description should clarify the two-step behavior.
No error handling guidance. Use case classes (BaseSortUseCase, ClearInstallersUseCase, FindLargeFilesUseCase) define exception types (CollisionError, FolderNotFoundError) but tool descriptions do not mention what errors agents should expect or how to recover. LLMs receive raw exceptions with no recovery path.
Path traversal and sanitization not documented. Parameters accept folder_path as optional string but descriptions do not explain validation against path traversal attacks (../../../etc/passwd). Given file system operations, this is a security oversight.
Numeric parameter ranges undocumented. days_old (clear_installers_tool) and min_size_mb (find_large_files_tool) lack min/max constraints. Without bounds, LLMs may pass negative or absurd values (days_old=-1, min_size_mb=999999999) that cause silent failures or unexpected behavior.
Tool descriptions under 50 characters lack context for LLM selection. scan_downloads_tool, smart_sort_files_tool, sort_by_date_tool all have single-sentence descriptions (25-35 chars) well below the 194 char baseline. LLMs cannot distinguish between tools or understand when to invoke them.