MCP server that returns the README.md for any npm package (GitHub first, npm fallback).
Solid filesystem tool suite with complete schemas and consistent descriptions. All 6 tools have proper JSON Schema definitions with typed parameters and descriptions. Tool names follow verb_noun convention (ls, readFile, writeFile, mkdir, rename, rm). Descriptions are concise (10-30 chars) but lack depth on WHEN to use each tool and what happens on error. Parameters are well-typed with enums for encoding. Critical gap: no output schema documentation, no error recovery guidance, and descriptions are below the 50-200 char LLM-optimized baseline. Security is strong (path traversal protection via safe() function), but error messages are generic ('ok' responses lack context).
List directory contents.
Create directory.
Read file – utf8 or base64.
Move / rename file or dir.
Delete file or dir.
Write / append data to file.
Descriptions are too brief (10-30 chars) and lack LLM-optimized context. 'List directory contents' does not explain when to call ls vs readFile, what structure is returned, or how to interpret results. Baseline for A+ tools is 50-200 chars with WHAT/WHEN/WHY.
No output schema documentation. LLMs cannot plan downstream calls or extract fields. ls returns an array of {name, type, size, mtimeMs} but this is not documented in the tool definition. readFile returns a string but encoding format (base64 vs utf8) is not specified in output.
Error handling is generic. All success paths return 'ok' with no context. Errors are caught and returned as isError:true with String(e), which may expose stack traces or cryptic Node.js errors. No recovery guidance (e.g., 'Path escapes root, use a relative path within the project').
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 66 | 2026-07-28+ | v2 |
Destructive operations (rm, writeFile with overwrite) lack confirmation or dry-run support. An LLM could accidentally delete a directory or overwrite critical files. No idempotent hints or destructiveHint annotations.
Parameter descriptions lack format/constraint details. 'path' is described as 'Directory to list' but does not explain: relative vs absolute, what happens if path escapes root, or whether symlinks are followed. 'data' in writeFile does not specify max size or encoding behavior on invalid base64.