Bounded, ranked local file discovery for MCP clients.
Single tool with clear naming, well-structured schema, and comprehensive parameter descriptions. The tool follows verb_noun convention (find_files) and includes detailed input validation constraints. Schema includes proper type definitions, min/max bounds, and defaults. Main weakness: output schema not explicitly documented in the tool description itself, and error handling guidance is limited. The SearchResponse model is defined in search.py but not referenced in the tool's description docstring.
Find and rank matching files inside the configured workspace root.
Output schema not documented in tool description. The find_files docstring does not describe the SearchResponse structure (fields: root, query, scanned_files, skipped_entries, duration_ms, truncated, results). LLMs need to know what fields to expect for downstream reasoning and chaining.
Missing error handling guidance in tool description. The description does not explain what errors can occur (e.g., invalid root, permission denied, MAX_SCANNED_FILES exceeded) or how the LLM should respond. The code validates inputs but error recovery paths are not surfaced.
Parameter descriptions could be more prescriptive about constraints. While min_length, max_length, ge, le bounds are in the schema, the descriptions should spell them out for LLM clarity. E.g., 'query: Case-insensitive path fragment (1-200 chars)' is clearer than relying on schema metadata alone.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 64 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 36 | - | v1 |
Default for extensions and exclude is null instead of empty array. While functionally correct, this creates a type inconsistency: the parameters accept list[str] | None but the default None requires the tool to handle null checks. Using default=[] would simplify the contract.