Skip to main content
Glama
sergioprats

io.github.sergioprats/pitwall-mcp

by sergioprats

pitwall-mcp

CI PyPI Licencia MIT

Servidor MCP local, de solo lectura, sobre la API BMW CarData de un BMW X1 sDrive18i (U11, gasolina, España).

Proyecto no afiliado a BMW AG. "BMW" y "CarData" son marcas de sus respectivos propietarios. Este proyecto no está respaldado, patrocinado ni revisado por BMW.

Le da a un asistente acceso a los datos de mantenimiento del coche — kilometraje, avisos CBS, presiones de neumáticos, batería de 12 V — sin que pueda tocar nada del vehículo, y sin agotar la cuota diaria de la API.

Qué se siente al usarlo

Le preguntas al asistente "¿qué le toca al coche?" y contesta con esto. Es una respuesta real, de la lectura del 16 de septiembre de 2026, recortada:

RESUMEN DE MANTENIMIENTO

Kilometraje: 48.731 km
Proximo servicio en: 13460 km
  OJO: hay partidas CBS que BMW ya no marca como OK; no te fies solo de la
  cifra global: Frenos delanteros [PENDING]: 1.600 km.

Partidas CBS: 5
  - Frenos delanteros [PENDING]: 1.600 km
  - Aceite de motor [OK]: 14.000 km, hasta 2027-07
  - Inspeccion tecnica (ITV) [OK]: hasta 2027-01
  conditionBasedServicesCount dice 9: es el maximo de avisos que este vehiculo
  puede transmitir, no los que tiene. El desglose trae 5, los transmitidos.

Prevision orientativa (calculo propio sobre los km de BMW, no un dato de BMW):
  Ritmo usado: 570 km/semana (media semanal que da BMW); tu historico local,
  8 dias: 420. Se usa el mayor para no quedarse corto.
  - Frenos delanteros: 1.600 km, unas 2,8 semanas, hacia el 05-10-2026.

Bateria de 12V:
  Voltaje: 13.92 V   (2026-09-14 13:49 UTC (hace 40 horas))

Dato mas antiguo utilizado: 2026-09-14 13:49 UTC (hace 40 horas).
Procedencia: cache local. Lectura realizada: 2026-09-16 06:09 UTC.

Fíjate en lo que hace esa respuesta además de dar números: avisa de que la cifra global esconde lo urgente, traduce "1.600 km" a una fecha, admite que dos cifras de BMW no cuadran en vez de elegir una, y dice de cuándo es el dato más viejo que ha usado.

Related MCP server: Tesla MCP Server

¿Te sirve a ti?

  • Sí si tienes un BMW con CarData activado y quieres saber qué cambia con el tiempo: cuándo vence cada cosa de verdad, si una rueda pierde aire, qué códigos de avería han aparecido desde la última vez.

  • No si buscas traducir códigos de avería, borrarlos o tocar cualquier ajuste del coche. Eso es terreno de un diagnóstico por OBD, no de esta API.

  • Ten en cuenta que es de uso ocasional. El dato crudo ya lo enseña la pantalla del coche; lo que aquí se añade es la serie, la previsión y los cambios.


Qué hace y qué no hace

Sí:

  • Lee datos telemáticos, datos básicos del vehículo y el diagnóstico de neumáticos, siempre a través de caché.

  • Guarda un histórico local en SQLite, para poder razonar sobre series y no sobre fotos puntuales.

  • Dice de dónde viene cada dato: timestamp de BMW, timestamp de la lectura, y si es API, caché o histórico.

  • Cuando un dato no existe, explica por qué no existe.

No, y no lo hará:

  • Ninguna herramienta escribe, manda, activa ni insinúa que puede actuar sobre el coche. CarData es una API de lectura.

  • Ninguna herramienta crea ni borra contenedores. Eso vive en un script que se lanza a mano.

  • No hay get_software_version: ese descriptor no existe en el catálogo de BMW. Lo único disponible es puStep, el paso de actualización de producto.


La cuota manda

La API REST de CarData está limitada a 50 peticiones cada 24 h y por cuenta. Pasarse devuelve 403 CU-429 hasta el día siguiente, y el contador es de BMW: incluye cualquier otra aplicación que use la misma cuenta.

Por eso:

  • Toda petición pasa obligatoriamente por caché y por un contador local.

  • El tope local por defecto es de 20 peticiones/día, para dejar margen.

  • Con un TTL de 12 h en el contenedor de mantenimiento, el uso normal son 2 peticiones al día.

  • search_descriptors y get_api_quota no gastan cuota nunca.

Consulta get_api_quota antes de encadenar llamadas.

Dato

TTL

/telematicData (contenedor de mantenimiento)

12 h

/smartMaintenanceTyreDiagnosis

7 días

/basicData

30 días

/mappings

30 días


Por qué esto y no la app oficial

La app te enseña el estado de hoy. Esto guarda cada lectura, así que puede comparar. Cuatro cosas concretas que salen de ahí, todas vistas en este coche:

  • Cuándo, no solo cuánto. La app dice "frenos delanteros, 1.600 km". El resumen dice unas 2,8 semanas, hacia el 5 de octubre, al ritmo real de uso, y avisa si una partida vence antes por kilómetros que por fecha.

  • La cifra global no basta, y aquí se ve. Con los frenos en PENDING a 1.900 km, serviceDistance.next marcaba 13.560. Quedarse con ese número habría escondido lo único urgente, así que toda partida que BMW no marque OK sale con un aviso propio.

  • Neumáticos sin confundir el calor con una fuga. El objetivo de presión de BMW no es fijo: se ha visto en 250 kPa en frío y en 290 con el neumático caliente. Comparar la presión de hoy con un objetivo de otro momento da un diferencial falso, así que cada rueda se compara con su pareja de eje en la misma lectura, que comparte temperatura y carga.

  • Qué cambia en la memoria de averías. El 18 de septiembre, entre dos lecturas, entraron 11 códigos y salieron otros 11: apareció una centralita entera y desaparecieron tres. Eso no se ve en ningún sitio si no guardas la lectura anterior.

Y lo que no aporta, para que no haya malentendidos:

  • No traduce los códigos de avería. Su significado no está en el catálogo de BMW; inventarlo sería peor que no darlo. Para eso está una herramienta de diagnóstico por OBD, del estilo de BimmerLink, que además los lee con su descripción y puede borrarlos.

  • No escribe nada. Ni codificación, ni resets, ni una sola orden al coche. Eso es terreno de BimmerCode y de un adaptador OBD, con el coche delante.

  • No inventa lo que no llega. Un dato ausente, uno presente pero vacío y un -NA- son tres cosas distintas, y las herramientas las distinguen en vez de enseñar un cero. De los 42 descriptores del contenedor, en la última lectura llegaron 28 con valor y 14 vacíos.


Herramientas

Herramienta

Gasta cuota

Estado

search_descriptors(query, limit, include_electric)

no

funciona

get_api_quota()

no

funciona

list_vehicles()

sí (1/mes con caché)

funciona

get_vehicle_basic_data()

sí (1/mes con caché)

funciona

report_product_update_step()

sí (comparte caché con basicData)

funciona, pero este vehículo no devuelve puStep

get_telematic_data()

sí (2/día con caché)

funciona

get_vehicle_status()

sí (comparte caché)

funciona

get_tyre_diagnosis()

sí (1/semana con caché)

funciona, pero este vehículo devuelve la estructura vacía

get_maintenance_summary()

sí (compuesta)

funciona

diagnose_software_update()

sí (compuesta, comparte caché)

funciona, con veredicto acotado

get_fuel_status()

sí (comparte caché)

funciona

get_fault_memory()

sí (comparte caché)

funciona; no traduce los códigos

Las dos herramientas marcadas con una reserva funcionan y declaran la ausencia: no rellenan el hueco con ceros ni con un valor plausible. puStep no llega en /basicData para este coche, y el diagnóstico de neumáticos vuelve con etiquetas y ceros de relleno que no son medidas.

get_vehicle_status() y get_maintenance_summary() muestran también los avisos Check Control, y añaden una línea OJO cuando alguna partida CBS deja de estar en OK. La cifra global de próximo servicio no basta: con los frenos delanteros en PENDING a 1.900 km, marcaba 13.560.

get_maintenance_summary() añade además, sin gastar peticiones, una previsión en semanas y fechas y la tendencia de presiones por eje. Las dos salen del histórico local, y el porqué de cada una está en Por qué esto y no la app oficial. La previsión usa la media semanal de BMW o la del histórico, la mayor de las dos, para no quedarse corta, y avisa cuando una partida vence antes por kilómetros que por fecha.

Dos herramientas más con datos que la app oficial no enseña:

  • get_fuel_status(): depósito y autonomía, los repostajes que detecta en el histórico y el consumo real desde el último. Solo da el consumo a partir de 300 km, y siempre con su margen, porque el aforador puede desviarse hasta 6 L. Muestra también el consumo homologado (OBFCM), pero como lo que es: una cifra de por vida que en este coche no se mueve desde octubre de 2024, no el consumo de hoy.

  • get_fault_memory(): la memoria de averías que el coche guarda para el taller, agrupada por centralita, y qué códigos aparecen o desaparecen entre lecturas. No traduce ningún código: su significado no está en el catálogo de BMW, y darlo sería inventarlo.

diagnose_software_update() razona sobre la serie del histórico, no sobre una foto. De las tres condiciones que BMW documenta para no ofrecer una actualización, CarData sólo permite observar una, y la herramienta declara las otras dos como NO OBSERVABLE POR CARDATA en lugar de razonar como si las hubiera descartado. Deja fuera cualquier voltaje de 13,5 V o más, porque eso es el alternador cargando y no dice nada de la batería en reposo. Si no le quedan al menos dos observaciones en reposo, responde SIN VEREDICTO y dice qué le falta. Y como isIgnitionOn llega vacío, avisa de que parte de cualquier pendiente puede ser sólo motor en marcha frente a motor parado, no una batería descargándose.


El informe local

El histórico que va guardando el servidor no se ve en ningún sitio: las herramientas contestan con la foto del momento, no con la serie. Para mirar la serie hay una página HTML que se genera a mano desde la SQLite:

.venv/Scripts/python.exe scripts/report.py              # captures/report-*.html
.venv/Scripts/python.exe scripts/report.py --full-vin   # con el VIN entero

No gasta ninguna petición. No usa el token, no llama a ningún endpoint y no toca el contador de cuota: sólo lee la base de datos local. La página es un único fichero sin JavaScript ni dependencias externas, imprime bien, y sale con el VIN enmascarado a captures/, que está en .gitignore.

Lo primero que enseña no es un número, es cuántos de los 42 descriptores del contenedor traen valor de verdad, y en cuál de los tres estados vacíos está cada uno de los demás.


Instalación

Requiere Python 3.12+.

git clone https://github.com/sergioprats/pitwall-mcp
cd pitwall-mcp
python -m venv .venv
.venv/Scripts/python.exe -m pip install -e ".[dev]"   # Linux/macOS: .venv/bin/python
.venv/Scripts/python.exe scripts/refresh_catalogue.py

Ese último paso no es opcional: el catálogo telemático es un documento de BMW y este repositorio no lo redistribuye, así que hay que descargarlo una vez. Viene de zweckj/bmw-cardata (MIT), no de la API de CarData, de modo que no gasta ninguna petición de tu cuota. Los detalles están en spec/README.md.

Si instalas el paquete en vez de clonar el repositorio no tienes scripts/, así que el ejecutable trae lo imprescindible: --fetch-catalogue para el catálogo y --login para autenticarte. Lo que sigue necesitando el repositorio es crear el contenedor telemático, y es a propósito: ese paso escribe en tu cuenta de BMW y por norma del proyecto no vive dentro del servidor.

pitwall-mcp --fetch-catalogue          # junto a la base de datos
pitwall-mcp --fetch-catalogue --out /otra/ruta.json

Se niega a escribir si lo que baja no es un catálogo —un portal cautivo responde 200 con HTML—, así que un catálogo que ya te funcionaba no se pierde por una descarga mala.

Los comandos de abajo usan el intérprete del entorno virtual de forma explícita (.venv/Scripts/python.exe en Windows, .venv/bin/python en Linux y macOS). Si activas el entorno (.venv/Scripts/activate, o source .venv/bin/activate), te basta con python. Sin activar y con el python del sistema, fallará con ModuleNotFoundError: No module named 'bmw_cardata'.

1. Configuración

cp .env.example .env

Rellena PITWALL_CLIENT_ID con el client id de tu aplicación CarData, creada en el portal BMW CarData. Necesitas los scopes cardata:api:read y, si algún día usas streaming, cardata:streaming:read.

2. Login

pitwall-mcp --login                              # instalado con pip
.venv/Scripts/python.exe scripts/login.py        # o desde el repositorio: hace lo mismo

Device flow: imprime una URL y un código, tú lo autorizas en el navegador. Los tokens se guardan en ~/.config/pitwall-mcp/tokens.json con permisos 600, fuera del repositorio. Habla con el OAuth de BMW, no con la API de CarData, así que no gasta cuota.

El script del repositorio es solo un envoltorio del mismo código: una única definición del flujo, y así quien instala con pip también puede autenticarse.

El refresh token dura 14 días. El servidor avisa de forma visible cuando quedan menos de 3; si caduca, hay que repetir este paso a mano.

3. Contenedor

.venv/Scripts/python.exe scripts/bootstrap_containers.py --dry-run   # muestra qué enviaría
.venv/Scripts/python.exe scripts/bootstrap_containers.py --create    # gasta 1 petición

Copia el containerId resultante a PITWALL_CONTAINER_ID en el .env. El servidor MCP solo consume ese id: nunca crea ni borra nada.

El contenedor pide 42 descriptores. Además del mantenimiento, incluye el depósito, la autonomía, el consumo homologado, la memoria de averías y la temperatura del motor. En el coche de referencia llegan todos menos tres. Si tu contenedor es de antes de esta ampliación, créalo de nuevo con el mismo script.

4. Arrancar

.venv/Scripts/python.exe -m pitwall_mcp

Transporte stdio. El .env se busca en el directorio desde el que se lanza el servidor y, si no aparece, en la raíz del repositorio — un cliente MCP arranca el proceso con el directorio de trabajo que le apetece. Si tu .env vive en otro sitio, indícalo con PITWALL_ENV_FILE.

Para Claude Desktop o cualquier cliente MCP:

{
  "mcpServers": {
    "pitwall": {
      "command": "/ruta/al/.venv/bin/python",
      "args": ["-m", "pitwall_mcp"],
      "env": { "PITWALL_CLIENT_ID": "...", "PITWALL_VIN": "...", "PITWALL_CONTAINER_ID": "..." }
    }
  }
}

Desarrollo

.venv/Scripts/python.exe -m pytest                              # ningún test toca la red
.venv/Scripts/python.exe scripts/refresh_catalogue.py --check   # ¿ha cambiado el catálogo?

Ningún test hace llamadas reales. Todos van contra fixtures grabados a mano a partir de los esquemas del swagger. Una suite que gaste cuota es un bug, y la fixture no_network lo hace cumplir: hace fallar cualquier intento de abrir una conexión de verdad.

Eso mismo corre en GitHub Actions en cada push y en cada pull request, sobre Linux y Windows, con Python 3.12 y 3.13. El flujo empieza descargando el catálogo, porque el repositorio no lo redistribuye, y no necesita ningún secreto: si un test intentara llamar a la API de BMW, fallaría.

Además se ejecuta una vez por semana, sin que nadie toque nada. No es por costumbre: como el catálogo se descarga en cada ejecución, esa pasada semanal avisa si el catálogo de origen deja de traer un descriptor en el que el proyecto se apoya. Entonces falla un test, y te enteras por correo en vez de por una herramienta comportándose raro meses después. Ojo con lo que eso no hace: no vigila cualquier cambio del catálogo, solo los que romperían algo.

Documentación relevante:


Estado

Todas las herramientas están implementadas contra respuestas reales grabadas como fixtures. La Fase 2 (daemon MQTT de streaming) es diseño, no código; el esquema SQLite ya reserva la columna source y la tabla stream_state para no necesitar migración.

Lo que ya se sabe de este coche, verificado con lecturas reales entre el 7 y el 18 de septiembre de 2026:

  • 13 de los 42 descriptores del contenedor llegan siempre vacíos, incluso con el contacto dado y el coche rodando. Entre ellos están el estado de carga de la batería, el sueño profundo, el contacto, si el coche se mueve y las temperaturas de los neumáticos. No es falta de lectura: este coche no los emite. El decimocuarto, el desglose CBS, va y viene: unas lecturas trae las partidas y otras llega vacío.

  • El voltaje de la batería de 12 V viaja en un grupo que por REST se refresca muy de tarde en tarde. Se le han visto cuatro refrescos, y los cuatro con el motor en marcha. Los cinco voltajes del histórico —14,39 / 14,35 / 14,77 / 13,92 / 14,80 V— son tensión de alternador, por encima del umbral de 13,5 V. Leer más veces no lo arregla, y está comprobado: ni una noche entera parado ni un trayecto por medio lo refrescan. Por REST no hay forma de construir una serie de la batería en reposo, y por eso diagnose_software_update se queda en SIN VEREDICTO en vez de fingir uno. La única vía conocida para esa serie es el streaming de la Fase 2.

  • Quedan abiertos otros tres puntos:

    • qué es la cabecera de la memoria de averías, que anuncia 72 códigos —luego 67— trayendo 44 entradas en las dos lecturas. Puede que sea un máximo, como resultó serlo el contador de avisos CBS, pero eso es una sospecha;

    • en qué huso horario reinicia BMW la cuota diaria;

    • qué es el campo de kilómetros que acompaña a los avisos Check Control. Van dos interpretaciones probadas y las dos han caído, así que la herramienta lo enseña pelado y dice que BMW no lo documenta.


Licencia

MIT, © 2026 Panesoft. Ver LICENSE.

Los documentos de BMW no se redistribuyen desde aquí. Ni el catálogo telemático ni la especificación OpenAPI están en el control de versiones: se descargan en tu máquina, y spec/ está en .gitignore. Ver spec/README.md.

Proyecto no afiliado a BMW AG. "BMW" y "CarData" son marcas de sus respectivos propietarios.

Available Tools

12 tools
diagnose_software_updateDiagnostico de actualizaciones de softwareA
Read-onlyIdempotent

Informe acotado sobre por que no llega una Remote Software Upgrade. De las tres condiciones que documenta BMW, CarData solo permite observar una (la bateria de 12V); sobre las otras dos declara 'no observable por CarData'. Trabaja sobre la SERIE del historico local, no sobre una foto puntual.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark it as read-only, idempotent, and non-destructive. The description adds substantial extra behavior: it can only observe one of BMW's three conditions (12V battery) and explicitly declares the other two 'no observable por CarData', plus it requires historical series data rather than a snapshot. This is exactly the kind of limitation disclosure that helps an agent set expectations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two compact sentences with no filler. The key limitation (only one condition observable) and the data requirement (series, not snapshot) are placed immediately after the purpose statement, so every sentence carries weight.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless, read-only diagnostic with an output schema and rich annotations, the description covers the purpose, limitations, and data expectation. Nothing critical seems missing for an agent to decide whether to invoke it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and schema coverage is vacuous at 100%, so there is no parameter burden for the description to carry. The description's mention of working on the historical series is behavioral context rather than parameter documentation. Baseline 4 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb-resource combination: 'Informe acotado sobre por que no llega una Remote Software Upgrade' – a targeted report on why a remote software update isn't arriving. It clearly distinguishes itself from generic diagnostics by scoping to RSU and noting CarData's observation limits, so an agent can tell it apart from sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It implies the use case: diagnose missing Remote Software Upgrade. It also gives a contextual prerequisite: works on the SERIES of local history, not a point-in-time snapshot, which tells when it is applicable. However, it never explicitly names sibling alternatives or states 'when not to use', so it falls short of explicit routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_api_quotaEstado de la cuota de la APIA
Read-onlyIdempotent

Cuantas peticiones REST se han gastado hoy, cuantas quedan, cuando se estima que se reinicia la ventana, y el estado de la cache local. Todo se deriva de SQLite: NO gasta cuota.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint. The description adds critical behavioral context beyond those: the data is derived from SQLite and the tool does not consume API quota, which is non-obvious and important for an agent deciding whether to call it. It also discloses that the reset time is estimated and that local cache state is included.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with the main data points, and ends with a clear safety guarantee. No filler or redundancy; every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter tool with an output schema, the description fully covers purpose, behavior, and safety. The output schema presumably documents return values, so the description need not repeat them. The only potential missing detail (auth requirements) is unlikely given read-only annotations, making this complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the schema is empty with 100% coverage, so baseline for 0 params is 4. The description does not need to add parameter semantics, and it correctly avoids inventing any.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states the tool reports how many REST requests have been spent today, how many remain, the estimated window reset, and local cache state. It uses a specific verb ('Cuantas... se han gastado') and resource (API quota), and it is clearly distinguished from sibling tools which focus on vehicle data, search, or diagnostics.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use the tool: to check quota status, and importantly that it does not spend quota ('NO gasta cuota'), making it safe to call. It does not explicitly name alternatives or 'when not to use', but all siblings are unrelated to quota, so the usage context is clear. No exclusion conditions are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_fault_memoryMemoria de averiasA
Read-onlyIdempotent

Codigos de la memoria de averias del coche, agrupados por centralita, y que codigos han aparecido o desaparecido desde la lectura anterior. Cada codigo solo trae centralita y codigo: sin estado, fecha ni descripcion, y NO se traduce porque el catalogo no dice que significa. Comparte la cache del contenedor (12 h).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations (read-only, idempotent, open world), the description adds concrete behavioral details: raw codes only, no translation because the catalog lacks meanings, and a 12h container-cache sharing behavior. These disclosures help the agent set expectations without contradicting the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two dense sentences lead with the core function, then add output constraints and a caching caveat. Every clause earns its place and there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

A parameterless read tool with an output schema and rich annotations is fully covered by this description: it explains grouping, delta behavior, field limitations, lack of translation, and cache lifetime. Nothing essential is missing for correct selection and invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has zero properties, so there is no parameter vocabulary to document. The description adds no parameter details, but with 0 params the baseline is 4 and no compensation is required.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States exactly what the tool returns: fault memory codes grouped by control unit plus codes that appeared or disappeared since the last reading. It also states output limitations (only control unit and code, no status/date/description/translation), which clearly distinguishes it from related diagnostic tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes the tool's limited scope clear by warning that codes are not described or translated, so an agent can infer this is not the right tool when human-readable fault definitions are needed. However, it never explicitly names alternatives or says when-not-to-use, leaving the routing decision mostly implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_fuel_statusCombustible: deposito, repostajes y consumoA
Read-onlyIdempotent

Deposito en % y litros (+/-6 L segun el catalogo), autonomia, repostajes detectados en el historico local y consumo real desde el ultimo, con su margen de error. Incluye el consumo homologado OBFCM, marcado como lo que es: una cifra de por vida congelada desde la ultima visita al taller, no el consumo actual. Comparte la cache del contenedor (12 h).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate read-only, idempotent, non-destructive behavior. The description adds valuable behavioral caveats: measurement uncertainty, OBFCM being a frozen lifetime figure rather than current consumption, and a shared 12-hour container cache. These go well beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence earns its place: first the core fuel data, then the OBFCM caveat, then the cache behavior. No redundant filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers all important aspects of the tool's output and caveats, including measurement error and data freshness. The output schema exists, so return-value details are already structured. Nothing critical is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and schema description coverage is 100%, so there is no parameter information missing. The baseline of 4 for zero-parameter tools applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly specifies the tool's resource: fuel tank percentage and liters, range, refuels, and real consumption. It is far from a tautology and the detail about OBFCM consumption distinguishes it from generic vehicle status tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes the tool's domain unmistakably clear: fuel status, refuels, and consumption. It does not explicitly name alternative tools or state 'use when', but the context is strong enough for an agent to select it appropriately among the sibling vehicle-data tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_maintenance_summaryResumen de mantenimientoA
Read-onlyIdempotent

Bloque de texto listo para pegar en un prompt: kilometraje, partidas CBS con km y fecha restantes, presiones de las cuatro ruedas en bar contra su objetivo, y la fecha del dato mas antiguo utilizado.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish read-only, idempotent, non-destructive behavior. The description adds useful behavioral context beyond that: the output is a pre-formatted text block, pressures are compared against targets, and the result includes the date of the oldest data used, which signals data freshness. There is no contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence front-loads the core purpose ('Bloque de texto listo para pegar en un prompt') and then uses a colon-delimited list to enumerate the exact contents. There is no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter read-only tool, the description is complete: it names the output format, the specific data points included, units for tyre pressure, and a data-freshness qualifier. The presence of an output schema also reduces the need to explain return values further.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the schema shows 100% coverage by having no properties. With no parameters to document, the baseline is 4; the description does not need to explain argument semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns a ready-to-paste text block containing maintenance information: mileage, CBS items with remaining km and date, tyre pressures in bar versus targets, and the age of the oldest data used. This is a specific resource plus an explicit deliverable, though it does not explicitly contrast itself with sibling tools like get_vehicle_status or get_tyre_diagnosis.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage when a copy-paste maintenance summary is needed and even mentions the intended use in a prompt, but it gives no explicit when-to-use versus alternatives, no exclusions, and no guidance about overlapping sibling tools. The usage context is only implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_telematic_dataDatos telematicos del contenedorA
Read-onlyIdempotent

Lee el contenedor de mantenimiento completo: kilometraje, CBS, bateria de 12V, presiones y estado de sueno. Fuente: GET /telematicData. Cache de 12 h.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, but the description adds meaningful behavioral context: 'Fuente: GET /telematicData' indicates the underlying HTTP call, and 'Cache de 12 h' warns that data may be cached for up to 12 hours. This goes beyond what annotations provide and does not contradict them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short sentences with no filler. The main purpose and data contents are front-loaded, followed by two compact implementation details (source and cache). Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only tool with an output schema and read/idempotent annotations, the description is nearly complete: it names the resource, lists key data fields, identifies the source endpoint, and notes the cache duration. The only minor gap is the lack of explicit differentiation from sibling maintenance tools, but that does not impair invocation correctness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the schema reflects that, so the baseline is 4. The description appropriately omits parameter details and instead supplies source and cache information, which is the only relevant invocation context.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Lee el contenedor de mantenimiento completo' and enumerates the included data fields (kilometraje, CBS, bateria de 12V, presiones, estado de sueno). This level of detail distinguishes it from sibling tools like get_maintenance_summary or get_vehicle_status without requiring schema inspection.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage when a full maintenance telematics read is needed and provides useful context (source and cache), but it does not explicitly state when to use this tool versus alternatives such as get_maintenance_summary or get_tyre_diagnosis. No when-not conditions or alternative routing are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_tyre_diagnosisDiagnostico de neumaticosA
Read-onlyIdempotent

Desgaste, defectos, dimensiones, fechas de montaje y fabricacion, temporada, runflat y dibujo. NO devuelve presiones: esas vienen del contenedor telematico. Verificado en este vehiculo: BMW responde con la estructura vacia, y los ceros que trae NO son medidas. Cache de 7 dias.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the tool read-only, idempotent, and non-destructive, but the description adds valuable behavioral context beyond that: the exclusion of pressures, the 7-day cache, and the verified BMW anomaly where an empty structure and zero values are not genuine measurements. This meaningfully informs interpretation of results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: it starts with the returned data categories, then gives the important exclusion, then adds caveats about reliability and caching. Every sentence carries distinct, useful information with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that the tool has no parameters and an output schema exists, the description covers the key remaining context an agent needs: what data is included, what is explicitly excluded, where to get that excluded data, known empty-response behavior, and cache freshness. Nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so there is nothing for the description to add about parameter meaning. The schema already covers the empty parameter set completely, and the description does not need to compensate for any undocumented parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific resource (tyre diagnosis) and lists the concrete data categories returned: wear, defects, dimensions, mounting/manufacturing dates, season, runflat, and tread. It further differentiates itself by explicitly stating it does NOT return pressures and pointing to the telematics container for those.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells the agent when not to use this tool for pressure data and where those values come from instead. The BMW warning provides condition-specific guidance: if the vehicle is a BMW, an empty structure with zeros should be treated as missing measurements, not real values.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_vehicle_basic_dataDatos basicos del vehiculoA
Read-onlyIdempotent

Modelo, serie, motor, fecha de construccion, lista de equipamiento y puStep. Fuente: GET /customers/vehicles/{vin}/basicData. Cache de 30 dias.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the tool as read-only, idempotent, and non-destructive. The description adds meaningful context beyond those annotations by specifying the API source endpoint and the 30-day cache, which informs the agent about data freshness expectations. No contradiction with annotations exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence that front-loads the data contents and immediately follows with the source and caching behavior. Every element adds value without repetition or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-parameter read-only tool with an output schema and robust annotations, the description is largely sufficient. It covers the data contents, the source endpoint, and the cache duration. Minor ambiguity remains around the meaning of 'puStep', but this does not significantly impair tool selection or invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero parameters, so the baseline is 4. The description adds the endpoint pattern with {vin}, clarifying that the data is VIN-scoped even though no CLI parameters are exposed. There are no parameter semantics to document further.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly enumerates the specific contents returned by the tool: model, series, engine, construction date, equipment list, and 'puStep'. It identifies the source endpoint, making the resource and scope unambiguous, and the listed fields distinguish it from sibling vehicle tools like get_vehicle_status or get_telematic_data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies this tool is for fetching basic vehicle data, but it provides no explicit guidance about when to choose it over sibling tools such as get_vehicle_status, get_maintenance_summary, or get_fault_memory. No alternatives or exclusion criteria are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_vehicle_statusEstado del vehiculo: kilometraje y CBSC
Read-onlyIdempotent

Kilometraje y avisos de mantenimiento (CBS). El desglose CBS por partida esta pendiente de verificar contra una respuesta real: la estructura de El desglose por partida esta verificado contra una respuesta real.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and non-destructive behavior. The description attempts to add a verification caveat about the CBS breakdown, but the phrasing is self-contradictory ('pendiente de verificar' vs 'verificado'), leaving the data trustworthiness unclear.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The first sentence is concise and useful, but the second sentence is garbled, repetitive, and internally contradictory. It does not earn its place and undermines the overall clarity of the description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero parameters, a full output schema, and safety annotations, the description only needs to clarify purpose and data caveats. It conveys the core purpose but the confusing verification statement leaves important ambiguity about the reliability of the CBS breakdown.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so parameter semantics are not a concern. The baseline of 4 applies because there is nothing the description needs to add beyond what the empty schema already indicates.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the resource and payload: mileage and CBS maintenance reminders. It is not a tautology and conveys a specific read operation, although it does not explicitly differentiate this tool from get_maintenance_summary or other vehicle-data siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance about when to use this tool instead of siblings such as get_vehicle_basic_data, get_maintenance_summary, or get_fuel_status. No alternatives, selection criteria, or exclusions are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_vehiclesListar vehiculos de la cuentaA
Read-onlyIdempotent

VINs mapeados a la cuenta, con mappedSince y mappingType (PRIMARY o SECONDARY). Fuente: GET /customers/vehicles/mappings. Cache de 30 dias.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish readOnly/idempotent/non-destructive behavior, so the description only needs to add extra context. It adds a 30-day cache and the source endpoint, which are useful behavioral traits not present in annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences pack the output fields, source endpoint, and cache policy without repetition. Information is front-loaded and every phrase earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no parameters, a rich annotation set, and an output schema present, the description covers the remaining essentials: what is returned (VINs, mappedSince, mappingType), where it comes from, and staleness via cache. Nothing critical is missing for invoking the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters and schema description coverage is 100%, so the baseline is 4. The description has no parameter documentation burden; no additional parameter semantics are needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The title supplies the verb 'Listar' and the description identifies the exact resource: VINs mapped to the account, with fields mappedSince and mappingType. The source endpoint /customers/vehicles/mappings also distinguishes it from sibling get_* tools that return telematics, status, or diagnostics.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given for when to prefer list_vehicles over search_descriptors or get_vehicle_basic_data. The usage context is only implicit from the title and fields; there are no explicit when-to-use rules, alternatives, or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

report_product_update_stepPaso de actualizacion de producto (puStep)A
Read-onlyIdempotent

Expone puStep, el paso de actualizacion de PRODUCTO. NO es la version de software del vehiculo: ese descriptor no existe en el catalogo de BMW. Verificado en este vehiculo: /basicData NO devuelve puStep, asi que la herramienta explica esa ausencia en vez de sustituirla por otra cosa.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint, openWorldHint, idempotentHint, and non-destructive. The description adds valuable behavioral context beyond those: it verifies that /basicData does not return puStep and explains that the tool reports the absence rather than substituting fabricated data. This tells the agent exactly what to expect when the data is missing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, each earning its place: the first states the core purpose, the second prevents a critical misinterpretation, and the third explains the tool's observed behavior. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter tool with an output schema and comprehensive annotations, the description provides all necessary context. It clarifies what the tool exposes, what it does NOT expose, and how it behaves when the underlying data is absent. Nothing important is missing for correct invocation and interpretation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and schema description coverage is 100%, so the baseline of 4 applies. There are no parameter details to add; the description correctly focuses on the tool's purpose and behavior.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific action and resource: 'Expone puStep, el paso de actualizacion de PRODUCTO.' It clearly distinguishes the tool from a vehicle software version, which is a likely confusion point, by stating that descriptor does not exist in the BMW catalog. It could be even stronger by naming a specific sibling tool, but the core purpose is unambiguous and differentiated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-not guidance: it is NOT the vehicle software version and that descriptor is absent from both the BMW catalog and /basicData for this vehicle. This helps an agent avoid using it as a software-version lookup. However, it does not explicitly name which sibling tool to use instead for software-version queries, so the guidance is strong but not fully complete.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_descriptorsBuscar descriptores telematicosA
Read-onlyIdempotent

Busca en el catalogo telematico local de BMW CarData (294 descriptores). Acepta consultas en espanol o en ingles. NO gasta cuota de la API: el catalogo es un fichero local. Es la unica fuente de verdad sobre que descriptores existen.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes
include_electricNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/destructive hints. The description adds important non-obvious behavior: the catalog is a local file, has 294 entries, does not spend API quota, and accepts Spanish or English input. This goes beyond the annotations without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short, focused sentences with no filler. The main purpose is front-loaded, followed by high-value operational details such as API quota usage and language support.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers purpose, local scope, quota behavior, and the catalog as source of truth, and the output schema handles return values. However, with no parameter descriptions in the schema and 0% coverage, the missing explanation of limit and include_electric leaves the tool incompletely specified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, but it only clarifies that queries may be in Spanish or English. It does not explain the semantics of 'limit' or 'include_electric', which are not self-evident from the schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource: 'Busca en el catalogo telematico local de BMW CarData (294 descriptores).' It also clearly states the tool is the 'unica fuente de verdad' for which descriptors exist, which distinguishes it from sibling data-retrieval tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context on when to use the tool: it searches a local catalog, accepts Spanish/English queries, and does not consume API quota. It does not explicitly name alternatives or exclusions, but it makes the intended use obvious.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 12 tool updatesv0.1.0
    • First observeddiagnose_software_update
    • First observedget_api_quota
    • First observedget_fault_memory
    • First observedget_fuel_status
    • First observedget_maintenance_summary
    • First observedget_telematic_data
    • First observedget_tyre_diagnosis
    • First observedget_vehicle_basic_data
    • First observedget_vehicle_status
    • First observedlist_vehicles
    • First observedreport_product_update_step
    • First observedsearch_descriptors

TDQS

A3.7/5.0

Scored across 12 tools

Disambiguation3/5

Several tools overlap in scope: get_telematic_data and get_vehicle_status both return mileage and CBS data, and get_vehicle_basic_data vs report_product_update_step both touch puStep. The descriptions help somewhat, but agents could easily select the wrong tool when looking for basic maintenance information.

Naming Consistency4/5

Tool names largely follow a snake_case verb_noun pattern (get_*, list_*, search_*, report_*, diagnose_*). The consistent use of get_ for most data-access operations is clear, though the mix of verbs like report and diagnose with more generic get_/list_ prevents a perfect 5.

Tool Count5/5

12 tools is well within the ideal range for a vehicle-data-focused server. Each tool maps to a distinct BMW CarData concern (catalog search, quota, vehicle mappings, basic data, telematics, tyres, fuel, faults, etc.), and the count feels neither sparse nor bloated.

Completeness3/5

The toolset covers major vehicle data areas well, but there is no way to fetch arbitrary descriptor values even though search_descriptors exposes a local catalog of 294 descriptors. This creates a notable dead end: agents can discover descriptors but cannot retrieve their actual values through the MCP surface.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides intelligent Tesla vehicle analytics and control through the Tessie API, including real-time status monitoring, charging cost optimization, efficiency trend analysis, trip planning, and predictive insights for Tesla owners.
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables control and monitoring of Tesla vehicles through the Tessie API, providing access to vehicle state (battery, location, climate) and commands (lock/unlock, climate control, navigation) with support for both local and Cloudflare Worker deployment.
    11
    -
  • F
    license
    Not graded
    quality
    D
    maintenance
    Provides access to Tesla vehicle telemetry data via the Tessie API, enabling real-time monitoring of battery status, charging state, climate controls, location, and other vehicle metrics through 30+ tools with intelligent caching.
    -