MCP server for smart city IoT device management and analysis, providing tools for monitoring and analyzing lighting, water, and gas devices across distributed Brazilian regions
SmartCityIotServer exposes 13 tools with basic parameter schemas, but definition quality is hampered by several critical issues: (1) Tool descriptions lack depth and context for LLM selection, most are one-line Portuguese translations without guidance on when/why to use each tool or what data they return. (2) No parameter descriptions visible in any tool, LLMs cannot understand what each field controls or what values are valid. (3) Output schemas are entirely absent, the codebase provides no documentation of what fields these tools return, forcing agents to guess structure. (4) Tool names are action-verb based (list, get, analyze, detect, predict) which is good, but parameter naming uses inconsistent conventions (deviceId vs startTime vs region). (5) No evidence of error handling patterns, recovery guidance, or field matching across tool chains. The tools read as a raw API wrapper rather than a polished agent interface. Average tool score is 42/100.
Analisa consumo de energia
Analisa consumo de gás
Detecta vazamentos de água
Detecção inteligente de anomalias com sensibilidade configurável
Dashboard completo da cidade com visão geral e alertas inteligentes
Análise cruzada entre dispositivos de diferentes tipos com correlação
Relatório detalhado de saúde dos dispositivos com scores e métricas
No parameter descriptions present. All 13 tools have input parameters (region, deviceId, startTime, endTime, sensitivity, etc.) but none include descriptions explaining what each parameter controls, valid ranges, or expected formats. LLMs cannot infer meaning from names alone and will struggle to select correct parameter values.
Tool descriptions are minimal (10 - 20 chars) and lack context. Examples: 'Lista dispositivos de iluminação' (lists lighting devices), 'Analisa consumo de energia' (analyzes energy consumption). These one-liners do not answer: When should the LLM call this tool? What does it return? How does it differ from getCityDashboard or getEnergyEfficiencyReport? Descriptions must be 50 - 200 chars and include rationale for selection.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 39 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 19 | - | v1 |
Relatório completo de eficiência energética com recomendações
Consulta telemetria de iluminação
Estatísticas regionais comparativas entre todos os tipos de dispositivos
Relatório detalhado de qualidade da água com alertas de segurança
Lista dispositivos de iluminação
Predição de manutenção baseada em análise de riscos e padrões
No output schemas documented. Tools like getCityDashboard, getEnergyEfficiencyReport, and getCrossDeviceAnalysis are described as returning complex data (dashboards, reports, correlations) but the source code provides zero schema documentation. LLMs cannot plan downstream tool chains or extract specific fields without knowing response structure.
Inconsistent parameter naming conventions. Some tools use camelCase (deviceId, geoJson), others use snake_case implied (startTime, endTime, healthThreshold). Tools mixing conventions make it harder for LLMs to predict parameter names across similar tools. Standardize on one convention throughout.
No error handling guidance visible. Tools accept timestamps (startTime, endTime) and numeric thresholds (healthThreshold, riskThreshold, sensitivity) but provide no validation rules, ranges, or recovery steps. If an LLM passes an invalid timestamp or out-of-range threshold, how should the tool respond? What error message should guide recovery?
Enum constraints present but undocumented. Tools like getDeviceHealthReport (deviceType: [lighting, water, gas, all]), getCityDashboard (timeRange: [hour, day, week, month]), and getAnomalyDetection (sensitivity: [low, medium, high]) define enums in schema but parameter descriptions do not explain what each option means or when to use it. LLMs may pick wrong variants.
Tool overlap and unclear composition. Multiple tools analyze similar data: analyzeEnergyConsumption, getEnergyEfficiencyReport, getCityDashboard, and getCrossDeviceAnalysis all seem to cover energy/consumption. getWaterQualityReport and detectWaterLeaks both address water. Without clear descriptions, LLMs cannot decide which tool to call and may invoke multiple redundant tools.
No evidence of tool chaining support. Tools accept region, deviceId, and deviceType parameters but output schemas are undocumented. If listLightingDevices returns device records, do they include the deviceId field that getLightingTelemetry expects? If getRegionalStatistics returns summary data, does it include region identifiers for downstream filters? Broken chain cause discovery gaps.