MCP server for querying IoT sensor data, building information, and energy/water consumption at the University of Alicante campus
This server demonstrates solid foundational quality with comprehensive, well-documented tool descriptions and clear parameter schemas. All 5 tools have descriptions exceeding the 50-char baseline, parameter types are consistently declared with Zod, and the server provides helpful usage guidance within descriptions. However, there are notable gaps: no output schemas are documented, error handling is minimal, no tool annotations (readOnlyHint) are present, and descriptions, while good, could be more concise and LLM-optimized. The tools show moderate composition quality, they are single-responsibility, but some chains (e.g., search-campus-buildings → query-data) could be tighter. Security is acceptable (no exposed secrets, no destructive operations), but audit logging and permission gates are absent. Overall, this is a B-/C+ server that would benefit from output schema documentation and error-recovery guidance.
Devuelve una visión general de una colección IoT: su descripción y las magnitudes disponibles. USAR solo para orientarse sobre QUÉ mide una colección o qué magnitudes admite antes de consultar (p. ej. '¿qué magnitudes tiene roomsensors?', '¿qué mide la colección energy?'). NO USAR como paso previo para descubrir los dispositivos de un edificio ni para obtener metadatos de dispositivos: esa ruta es ineficiente. Para descubrir dispositivos y sus metadatos (alias, ubicación, SIGA, geolocalización) usar directamente query-data con include_metadata=true en una sola llamada. Ejemplo VÁLIDO: '¿qué se puede medir en la colección water?'. Ejemplo INVÁLIDO: '¿qué contadores de agua hay en el edificio 0038?' -> usar query-data.
Devuelve los detalles completos de un único dispositivo ya conocido: nombre, alias, geolocalización (lat/lon), ubicación dentro del edificio, organización, tipo de métrica, código SIGUA y campos personalizados. USAR EXCLUSIVAMENTE cuando ya se dispone del device_id exacto y se necesita ampliar la información de ESE dispositivo concreto (p. ej. 'dame todos los detalles del dispositivo XYZ'). NO USAR para descubrir dispositivos, para listar los dispositivos de una colección, ni para averiguar qué contadores/sensores tiene un edificio: para todo eso usar query-data con include_metadata=true, que devuelve todos los dispositivos y sus metadatos en UNA sola llamada. Si la información puede obtenerse con una única llamada a query-data, NO hagas múltiples llamadas aquí. Ejemplo VÁLIDO: ya tienes device_id='ABC123' y quieres su ubicación exacta. Ejemplo INVÁLIDO: '¿qué dispositivos hay en el edificio 0025?' -> usar query-data.
Consulta datos agregados (promedios, máximos, mínimos) en intervalos de tiempo. USAR para análisis de tendencias, gráficas, patrones diarios/semanales/mensuales, detección de anomalías y comparativas.
No output schemas documented for any tool. LLMs cannot predict what fields will be returned, forcing them to reason about response structure on the fly and increasing errors.
No error handling guidance or recovery instructions. Errors are generic; LLMs receive no hints about what to do next (retry? ask user? try different tool?).
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). All tools are read-only, but the MCP spec-compliant way to declare this is via tool annotations, not just in the description.
Inferred effective spec: 2026-07-28+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | B | 74 | 2026-07-28+ | v2 |
Herramienta CANÓNICA para (a) descubrir dispositivos de una colección junto con sus metadatos y (b) consultar lecturas CRUDAS individuales (timestamp, valor, unidad). USAR cuando el usuario quiera: saber qué dispositivos/sensores/contadores existen, descubrir los contadores o sensores de un edificio, conocer la ubicación de un dispositivo, obtener alias, geolocalización, código SIGUA, organización u otros metadatos contextuales, filtrar dispositivos por edificio/SIGUA/organización, o ver valores exactos sin procesar. Para DESCUBRIR dispositivos de una colección o de un edificio, hazlo en UNA SOLA llamada con include_metadata=true y un limit alto (p. ej. 800): devuelve TODOS los dispositivos con sus metadatos completos en una sola petición; después filtra in-memory por SIGUA/alias. NO encadenes múltiples llamadas a get-device-details para esto.
Busca edificios del campus de la Universidad de Alicante por código SIGUA o por descripción en lenguaje natural. Si la consulta es un código SIGUA ('0016', '16', 'edificio 14'), resuelve directamente al edificio. En cualquier otro caso (nombres oficiales, coloquiales, descripciones, usos: 'la poli', 'derecho', 'donde se imparte enfermería'), usa búsqueda semántica por embeddings para encontrar los edificios más relevantes. Devuelve: código SIGUA, nombre oficial, plantas disponibles, coordenadas del centro y bounding box. Usar cuando el usuario pregunta por un edificio y se necesita identificar su código SIGUA antes de consultar datos de sensores o consumo con las herramientas get-measurements-*. También útil para: '¿qué edificios hay?', '¿dónde está X?', 'listar edificios del campus'.
Parameter descriptions for 'limit' and 'offset' in query-data lack numeric constraints (min/max). LLMs may pass unreasonable values (e.g., limit=999999).
discover-collection description warns against using it for discovery, but then immediately uses it for discovery in the valid example. This is confusing and contradictory.
No audit logging or permission gates. Tools execute immediately without checking if the caller has authority. For a campus IoT system, this is a security gap.
No pagination limit stated in tool descriptions. query-data accepts a 'limit' parameter but the description does not specify min/max (e.g., '1-1000').