Multi-tool MCP server providing camera capture, terminal command execution, and weather information
Three tools with explicit FastMCP registration and visible schemas, but significant quality gaps. Tool naming lacks verb-noun clarity (capturePhoto vs capture_photo convention); descriptions are minimal (8-16 chars for some params); parameter descriptions are sparse or missing; no output schema documentation; no error guidance for LLM recovery; no input validation or constraint documentation. Schemas exist but are underspecified (missing constraints, ranges, and validation guidance). Security issues present (shell command injection risk in cmdRun despite keyword blocking). Overall falls into the 'Fair' (C) range due to missing descriptions, incomplete parameter documentation, and lack of error recovery patterns.
Captures a photo from the default camera (index 0) and saves it to the specified path
Executes a shell command with safety checks to block dangerous operations
Retrieves current weather information for a specified city
Tool naming does not follow verb_noun convention. 'capturePhoto', 'cmdRun', 'currentWeather' use camelCase instead of snake_case. LLMs parse action verbs from tool names, 'capture_photo', 'run_command', 'get_current_weather' are more discoverable and align with the 90% baseline of production tools.
Parameter 'path' in capturePhoto lacks description specifying format, validation, or permissions requirements. 'show' parameter description is only 20 chars ('Whether to display the captured image'). 'time' parameter description is 41 chars but lacks constraints (should specify milliseconds range, e.g., 1000 - 60000). No description explains what fields are returned.
cmdRun exposes dangerous functionality with only keyword-based blocking. The 'what' parameter accepts arbitrary shell commands with CRITICAL security risk: (1) keyword blocking is bypassable via encoding/obfuscation (e.g., 'del' → 'd'+'el', 'powershell' → indirect invocation); (2) dangerous commands not in BLOCKED_KEYWORDS list (e.g., 'chmod 777', 'sudo', SQL injection via shell) are unprotected; (3) no parameter description, no return schema documentation, no error recovery guidance. This violates pattern:secret-injection and pattern:tool-gateway.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 35 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 38 | - | v1 |
No output schemas documented for any tool. LLMs cannot plan downstream calls or extract required fields. Baseline from rubric: 100% of A+ tools have documented return types. Currently 0%.
Error messages lack recovery guidance. RuntimeError('Error occured while opening camera'), RuntimeError('Failed to write image'), RuntimeError(status_code) tell the LLM nothing about what to try next. Baseline: error responses must answer 'What to do next?'
currentWeather hardcodes default city 'Jaspur' without explanation. No description of parameter 'city' format, validation (required format, min/max length), or examples. No enum or constraint declaration. LLM will guess valid inputs.
API key management: Weather tool loads api via os.getenv('apiWeather'). While not exposed as a parameter (good), there is no documentation of this dependency or guidance if the key is missing. currentWeather error response does not hint the user to check API key configuration. Partial credit for not exposing the secret as a parameter, but error handling is incomplete.