This filesystem MCP server has 18 tools with good naming conventions and basic schema documentation. Most tools start with action verbs (ls, cd, read_file, write_file, mkdir, rm, cp, mv, grep, ruff_check, ruff_format, shell_command), following the verb_noun or verb pattern established in production tools. All tools have descriptions present. However, there are significant gaps: (1) many parameter descriptions are minimal (10-30 chars), below the 72-char baseline for production tools; (2) no explicit output schema documentation visible in the code, return types are inferred from type hints but not formally described for LLM consumption; (3) no error handling guidance in descriptions, e.g., 'ls' does not explain what happens if the path does not exist; (4) no input validation constraints documented (e.g., read_file should warn about file size limits); (5) no tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk levels assigned; (6) shell_command is extremely permissive with no execution constraints or safety notes. Per-tool analysis shows naming quality at ~80 (clear action verbs), description quality at ~50 (present but sparse), and schema quality at ~55 (basic types visible in code but not formally documented for the LLM).
Change the current working directory.
Copy file or directory.
Apply sequence of search/replace operations to a file.
Search for pattern in file(s).
List files in a directory.
Create a directory.
Move file or directory.
Read a file from the filesystem.
Parameter descriptions are too brief (10-40 chars on average), below the 72-char production baseline. Examples: 'rm' description 'Path to remove. Can be relative.' is only 35 chars and lacks error guidance; 'mkdir' description 'Directory path to create. Can be relative.' (42 chars) does not explain behavior if the path already exists.
No output schema documentation for LLM consumption. Tools return typed objects (list, dict, str) visible in code, but there is no formal description of return fields, structure, or constraints. Example: 'read_files' returns Dict[str, str] but the description does not specify the structure or that file contents are returned as full strings (not paginated or truncated).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 44 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 48 | - | v1 |
Read multiple files.
Remove a file or empty directory.
Remove directory and all its contents.
Run ruff linter on specified files. Useful to check that nothing was broken.
Format files using ruff. Useful for fixing formatting issues after edits.
Run a shell command and return its output.
Generate summaries for multiple files.
Generate a summary of a Python or Markdown file.
Change to directory, list its contents, get the notes from CLAUDE.md. Useful for getting familiar with a project at the start of a chat.
Write content to a file.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk levels assigned (READ_ONLY, WRITE, DESTRUCTIVE, IRREVERSIBLE). The schema declaration visible in the input does not translate to tool definition annotations visible in the code. This prevents the LLM and client from understanding tool safety profiles.
No error handling guidance in tool descriptions. Examples: 'ls' does not explain what happens if the path does not exist (FileNotFoundError); 'read_file' does not document encoding errors or permission denied behavior; 'edit_file' raises ValueError with a message on search failure, but the description does not guide the LLM on recovery.
'shell_command' tool is extremely permissive and underconstrained. Description does not mention security implications, injection risks, or limitations. No parameter constraints on 'command' or 'cmdline' (no regex, no allowlist, no denial list). This violates the principle that all agent-provided input must be treated as untrusted and sanitized against command injection.
No pagination support for tools that return multiple items. 'grep' and 'read_files' can return large result sets without limit or pagination parameters, risking context window exhaustion. Production baseline expects limit and page/offset parameters on list-like operations.
Tools that modify state (write_file, edit_file, rm, rmdir, cp, mv, ruff_format) lack confirmation or dry-run capabilities. Agents make mistakes, irreversible operations like rmdir should support a confirmation step or dry-run preview.
'cd' tool modifies server-side state (current working directory) in a stateful manner. This is problematic for stateless MCP design, subsequent tool calls depend on prior 'cd' invocations, creating hidden ordering constraints and making agent plans fragile. Consider accepting optional 'cwd' parameters on all tools instead.
Parameter type constraints are not documented. Example: 'timeout' in shell_command defaults to 30 but has no minimum/maximum documented (should be 1-3600 or similar). No constraints on 'path' parameters (e.g., max length, character restrictions).