FastMCP-based server providing internet research, URL fetching, and file management tools
Server has 7 tools with complete schemas and descriptions, but quality varies. File tools (list_files, read_file, overwrite_file, create_file) have proper async implementations and access control, with 50-100 char descriptions. Internet tools (internet_research, get_url) have detailed descriptions and reasonable parameter sets. Simple greet tool lacks depth. Output schemas are implicit (JSON dicts returned) but not formally documented. Error handling is basic, returns status/error dicts but lacks recovery guidance. No tool annotations (readOnlyHint/destructiveHint) despite clear risk distinctions (READ_ONLY vs WRITE). Parameter descriptions are present but some lack constraint details (e.g., safesearch enum not explicit in schema, timelimit format unclear).
Asynchronously create a new file with content, if it doesn't already exist.
Fetch *url* and return plain text truncated to *max_chars* characters.
Return a friendly greeting as a JSON object.
Search DuckDuckGo and optionally fetch pages; returns a JSON-safe dict.
Asynchronously list files and folders up to 50 sublevels deep. If multiple roots are configured, you can: - list a specific root: "<n>:some/subdir" - list everything: subpath="" returns a merged list prefixed with "<n>:"
Asynchronously overwrite an existing file with new content.
Asynchronously read and return the contents of a file.
Missing tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk distinctions. File write tools (overwrite_file, create_file) and read tools are unmarked.
No output schemas documented. Tools return implicit JSON dicts (e.g., {status, content/files, message}), but LLMs cannot infer field types or structure without explicit schema definitions.
Error handling lacks recovery guidance. Errors return generic dicts (status='error', message) but do not guide the LLM on next steps (retry, ask user, alternative tools). E.g., 'File not found or access denied' conflates two distinct failures.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 61 | 2026-07-28+ | v2 |
| 2026-03-09 | C | 63 | - | v1 |
Parameter constraints not enforced in schema. internet_research safesearch accepts 'off|moderate|strict' but schema type is string with no enum. timelimit accepts 'd|w|m|y' but no regex pattern in schema.
No pagination support. list_files hardcodes 2000 entry limit and silently truncates; no limit parameter or next_cursor in response. For large codebases, agents cannot retrieve complete file lists.
Destructive operations (overwrite_file, create_file) lack confirmation or dry-run mode. No way for agents to preview changes before committing. Description does not warn about irreversibility.
No size limits documented for file operations. read_file can return unbounded content; create_file/overwrite_file accept unbounded content strings. Large files could exhaust context windows or memory.