An MCP server that provides vehicle filtering and search capabilities via HTTP API integration, designed to work with an AI agent for vehicle inquiries
Single tool with mediocre quality. The tool name follows verb_noun pattern (get_vehicle_by_attributes), which is good, but the implementation has several critical gaps. Description is present but vague (49 chars, below the 50-200 char optimal range for LLM comprehension). Input schema is visible and uses proper JSON Schema with types, but many parameters lack specificity, critical semantic gaps around complex parameters (mileage, price as dicts), no enums for constrained values (fuel_type, transmission), no validation guidance. Output is returned as raw string (response.text) with no documented schema, making it impossible for LLMs to understand the structure of returned data. Error handling returns generic error messages without recovery guidance. The tool violates several composition patterns: it performs a single lookup operation (good), but the parameters accept MongoDB-style operators ($lt, $gt, $eq) in nested dicts without documenting this domain knowledge, forcing LLMs to guess at valid operator syntax.
Filtra veículos usando múltiplos atributos via chamada HTTP para o serviço FastAPI.
Output schema entirely undocumented. Tool returns response.text (raw HTTP response) with no structure guidance. LLMs cannot parse vehicle records, extract fields, or plan downstream operations. Returns unstructured string instead of JSON.
Tool description too vague and under optimal length (49 chars). 'Filtra veículos usando múltiplos atributos via chamada HTTP para o serviço FastAPI' lacks clarity on WHEN to use this tool, what it returns, or how to interpret results. Should be 50-200 chars with explicit intent.
Complex parameters (mileage, price) documented as 'dict with operators like $lt, $gt, $eq' but LLMs cannot reliably construct nested JSON with undocumented operator syntax. No enum constraints. fuel_type lists examples 'Gasolina, Diesel, Elétrico, Flex' as string description instead of enum, inviting hallucinated values. transmission mentions 'Manual, Automático' in description, should be enums.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 40 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 38 | - | v1 |
Error handling returns generic error string 'Erro ao buscar veículos pela API: {str(e)}' with no recovery guidance. LLMs cannot determine if error is retryable, user-fixable, or fatal. No distinction between network timeout, invalid parameters, and API failure.
Parameter descriptions lack constraints. 'Year of the vehicle' (int) has no min/max bounds, LLM could pass 1800 or 9999. 'Number of doors' has no validation. 'Maximum number of results' (limit) has no stated max cap, could pass 10000 and timeout. Numeric ranges prevent garbage input.
All parameters marked required=false with None defaults, but tool behavior when ALL params are None is undocumented. Does it return all vehicles unbounded? This invites runaway API calls and context window exhaustion.
Tool accepts dict parameters for mileage and price filtering but converts them to strings (params['mileage'] = str(mileage)) before passing as query params. This serialization is lossy and undocumented, LLMs will not understand that dicts become stringified.