Skip to main content
ClaudeWave

Servidor MCP de solo lectura sobre la API BMW CarData: mantenimiento, neumaticos y bateria de 12V. No afiliado a BMW AG.

ToolsOfficial Registry0 stars0 forksPythonMITUpdated today
ClaudeWave Trust Score
87/100
Trusted
Passed
  • Open-source license (MIT)
  • Actively maintained (<30d)
  • Clear description
  • Documented (README)
Last scanned: 9/20/2026
Get started
Method: Clone
Terminal
git clone https://github.com/sergioprats/pitwall-mcp
1. Clone the repository.
2. Follow the README for installation and usage instructions.
Use cases

Tools overview

# pitwall-mcp

<!-- mcp-name: io.github.sergioprats/pitwall-mcp -->

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
  AVISO: conditionBasedServicesCount dice 9 pero el desglose trae 5 partidas.
  BMW no documenta la diferencia y no se explica aqui: se dan los dos numeros.

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.

## ¿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](#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 ma

What people ask about pitwall-mcp

What is sergioprats/pitwall-mcp?

+

sergioprats/pitwall-mcp is tools for the Claude AI ecosystem. Servidor MCP de solo lectura sobre la API BMW CarData: mantenimiento, neumaticos y bateria de 12V. No afiliado a BMW AG. It has 0 GitHub stars and its last recorded update is dated 2026-09-19.

How do I install pitwall-mcp?

+

You can install pitwall-mcp by cloning the repository (https://github.com/sergioprats/pitwall-mcp) or following the README instructions on GitHub. ClaudeWave also provides quick install blocks on this page.

Is sergioprats/pitwall-mcp safe to use?

+

Our security agent has analyzed sergioprats/pitwall-mcp and assigned a Trust Score of 87/100 (tier: Trusted). See the full breakdown of passed checks and flags on this page.

Who maintains sergioprats/pitwall-mcp?

+

sergioprats/pitwall-mcp is maintained by sergioprats. The last recorded GitHub activity is dated 2026-09-19, with 0 open issues.

Are there alternatives to pitwall-mcp?

+

Yes. On ClaudeWave you can browse similar tools at /categories/tools, sorted by popularity or recent activity.

Deploy pitwall-mcp to your cloud

Ship this repo to production in minutes. Each platform spins up its own environment with editable env vars.

Maintain this repo? Add a badge to your README

Drop the badge into your GitHub README to show it's tracked on ClaudeWave. Each badge links back to this page and reflects the live Trust Score.

Featured on ClaudeWave: sergioprats/pitwall-mcp
[![Featured on ClaudeWave](https://claudewave.com/api/badge/sergioprats-pitwall-mcp)](https://claudewave.com/repo/sergioprats-pitwall-mcp)
<a href="https://claudewave.com/repo/sergioprats-pitwall-mcp"><img src="https://claudewave.com/api/badge/sergioprats-pitwall-mcp" alt="Featured on ClaudeWave: sergioprats/pitwall-mcp" width="320" height="64" /></a>

More Tools

pitwall-mcp alternatives