Skip to main content
Glama
mosandlt

Bosch Smart Home Camera MCP Server

by mosandlt

Bosch Smart Home Camera — Servidor MCP

Servidor de Protocolo de Contexto de Modelo (MCP) que expone la API en la nube de Bosch Smart Home Camera como herramientas MCP. Compatible con Claude Code, Claude Desktop y cualquier cliente compatible con MCP. Reutiliza el cliente API de ingeniería inversa probado del proyecto hermano Herramienta CLI de Python.

Estado: v1.7.2 — cierre de paridad familiar (v1.7.0): zonas de movimiento, máscaras de privacidad, reglas de automatización, uso compartido de cámaras/amigos, instalación de firmware, duración de sirena, programación de iluminación, intercomunicador de audio. Más la ronda de ajuste de imagen/video y ciclo de vida de la cámara del 2026-08-19: superposición de marca de tiempo, LED de estado, elevación de lente, umbral de oscuridad, balance de blancos, brillo de LED superior/inferior, reinicio suave/duro, renombrar. 70 herramientas + 3 recursos + 2 avisos, stdio/SSE/HTTP transmisible, instalable con pipx/uvx

Licencia Mantenimiento del proyecto


Tabla de contenidos


Related MCP server: 米家 MCP Server

Este proyecto es una herramienta independiente desarrollada por la comunidad. No está afiliado, respaldado, patrocinado ni conectado oficialmente de ningún modo con Robert Bosch GmbH, Bosch Smart Home GmbH, ni con ninguna de sus subsidiarias o afiliadas. "Bosch", "Bosch Smart Home" y los nombres y logotipos relacionados son marcas registradas de Robert Bosch GmbH.

La herramienta se comunica con una API no oficial, no documentada y de ingeniería inversa. Se proporciona "tal cual", sin garantía de ningún tipo. Úsela completamente bajo su propio riesgo.

¿Por qué un servidor MCP separado?

Los proyectos hermanos se dirigen a diferentes tiempos de ejecución:

Proyecto

Versión

Tiempo de ejecución

Superficie orientada al usuario

Integración HA

v16.0.1

Home Assistant

Entidades de interfaz, tarjeta Lovelace, automatizaciones

CLI de Python

v10.12.3

terminal

Comandos bosch_camera ...

Adaptador de ioBroker

v1.8.3

ioBroker

Puntos de datos, widgets VIS-2 (BoschCamera + BoschOverview), interfaz de administración JSON

Nodos de Node-RED

v0.4.2-alpha

Node-RED

Nodos de flujo para pipelines de automatización

Frontend (NiceGUI)

v0.4.2-alpha

aplicación web independiente

Panel de control + detalle de cámara + interfaz de configuración

Servidor MCP (este repositorio)

v1.7.1

Clientes Claude

Herramientas MCP invocables desde LLMs

Casos de uso de LLM que los hermanos existentes no cubren:

  • "Toma una instantánea de la cámara del jardín y describe lo que ves."

  • "¿Cuál fue el último evento de movimiento en la terraza y a qué hora?"

  • "Habilita el modo privacidad en la cámara interior hasta las 22:00 y luego desactívalo."

  • "Panorámica la cámara de 360° hacia la izquierda y toma una instantánea."

  • "Resume los eventos de movimiento de hoy en todas las cámaras."

Estos flujos requieren un LLM en el bucle, que es exactamente para lo que sirve MCP.


Arquitectura

┌─────────────────────────┐      stdio / SSE / streamable HTTP      ┌─────────────────────────┐
│  Claude Code / Desktop  │ ←─────────────────────────────────────→ │  bosch-smart-home-      │
│  (MCP host)             │             MCP protocol                │  camera-mcp server      │
└─────────────────────────┘                                         └────────────┬────────────┘
                                                                                 │
                                                              imports / shared API client
                                                                                 │
                                                                                 ▼
                                                                  ┌─────────────────────────┐
                                                                  │ bosch_camera.py         │
                                                                  │ (sister Python CLI tool)│
                                                                  └────────────┬────────────┘
                                                                               │ HTTPS (OAuth2 PKCE)
                                                                               ▼
                                                                  ┌─────────────────────────┐
                                                                  │ residential.cbs.bosch-  │
                                                                  │ security.com (cloud)    │
                                                                  └─────────────────────────┘

El servidor MCP es una capa delgada alrededor de la capa de API del CLI de Python. No reimplementa OAuth, renovación de tokens, FCM push, RTSP o RCP; los importa.

Esta es una dependencia real en tiempo de ejecución, no solo una referencia de documentación. El servidor localiza bosch_camera.py al inicio del proceso mediante la inyección de sys.path (adapters/cli_bridge.py) en lugar de una dependencia normal de pip install; el repositorio hermano de la Herramienta CLI de Python debe estar clonado en disco, y el servidor MCP necesita saber dónde. Orden de resolución: la variable de entorno BOSCH_CAMERA_CLI_PATH si está establecida; de lo contrario, una ruta predeterminada fija utilizada por la configuración del mantenedor (no portátil; sobrescríbala). Casi todas las llamadas a herramientas terminan importando bosch_camera desde esa ruta en el momento de la llamada (ensure_cli_importable()), por lo que una ruta faltante o incorrecta se manifiesta como un ImportError en la primera invocación de la herramienta, no al inicio del servidor. En la práctica: clone ambos repositorios y luego establezca BOSCH_CAMERA_CLI_PATH=/ruta/a/Bosch-Smart-Home-Camera-Tool-Python en el entorno donde se ejecuta el servidor MCP, o edite DEFAULT_CLI_PATH en adapters/cli_bridge.py para una instalación local permanente. El mismo bosch_config.json que la herramienta CLI produce mediante bosch_camera login es lo que este servidor lee para las credenciales; consulte Modelo de autenticación.

Enrutamiento de herramientas con respaldo a LAN

flowchart LR
    Agent["LLM / Claude Code"] -->|tool call| MCP[MCP Server]
    MCP -->|prefer_local=False| Cloud[Bosch CBS API]
    MCP -->|prefer_local=True| RCP["Camera LAN RCP\n192.168.x.y:443\nHTTPS Digest"]
    RCP -->|success| Done["return {status, method: local}"]
    RCP -->|fail| Cloud
    Cloud --> Done2["return {status, method: cloud}"]
    style RCP fill:#d4f1c4,color:#000
    style Cloud fill:#dce8fb,color:#000

Flujo de la herramienta bosch_camera_lan_ping

sequenceDiagram
    participant Agent as LLM Agent
    participant Tool as bosch_camera_lan_ping
    participant TCP as TCP connect :443

    Agent->>Tool: {camera_name: "Outdoor"}
    Tool->>Tool: resolve LAN IP from bosch_config.json
    Tool->>TCP: connect 192.168.x.y:443 (1.5 s timeout)
    TCP-->>Tool: connected / timeout
    Tool-->>Agent: {reachable: true, ip: "...", latency_ms: 12}

Herramientas MCP (70 en total, v1.7.2)

Herramienta

Descripción

Devuelve

bosch_camera_list

Lista todas las cámaras configuradas

array of {id, name, model, hw_version, status}

bosch_camera_status

Obtiene el estado en línea/fuera de línea + privacidad de una cámara

{name, status, privacy_mode, light_on, last_event_at}

bosch_camera_snapshot

Captura JPEG solo LAN (sin nube) — HTTP Digest a la IP de la cámara

{path, method, timestamp}

bosch_camera_stream_url

URL de transmisión RTSPS solo LAN (sin retransmisión en la nube) — consumible por ffmpeg/VLC/go2rtc

{camera, rtsps_url, note}

bosch_camera_events

Lista eventos recientes de movimiento/persona/audio

array of {event_id, type, tags, timestamp_iso, has_clip, clip_status}

bosch_camera_privacy_set

Activa/desactiva el modo privacidad; prefer_local=True enruta a LAN RCP primero

{name, status, privacy_mode, ...}

bosch_camera_light_set

Activa/desactiva el foco; prefer_local=True enruta a LAN RCP primero

{name, status, light_on, ...}

bosch_camera_pan

Panorámica de la cámara 360° (solo Gen1 CAMERA_360); preset: inicio (0°) / izquierda (-60°) / derecha (+60°) / trasera-izquierda (-120°) / trasera-derecha (+120°)

{name, status, privacy_mode, light_on, last_event_at}

bosch_camera_notifications_set

Activa/desactiva notificaciones push

{name, status, privacy_mode, light_on, last_event_at}

bosch_camera_lan_ping

Sonda TCP a una cámara en el puerto LAN 443 (timeout de 1,5 s)

{reachable, ip, latency_ms}

bosch_camera_maintenance_status

Obtiene el anuncio actual de mantenimiento de la nube desde el feed RSS de la comunidad

{state, title, link, pub_date, summary, …, recommended_action}

bosch_camera_audio_get

Obtiene nivel de micrófono, nivel de altavoz, indicador de intercomunicador (solo Gen2)

{microphone_level, speaker_level, intercom_enabled}

bosch_camera_audio_set

Establece nivel de micrófono y/o nivel de altavoz 0-100 (solo Gen2)

{microphone_level, speaker_level, intercom_enabled}

bosch_camera_intrusion_get

Obtiene configuración de detección de intrusión: modo, sensibilidad 0-7, distancia 1-8 m (solo Gen2)

{mode, sensitivity, distance}

bosch_camera_intrusion_set

Actualiza modo/sensibilidad/distancia de detección de intrusión (solo Gen2)

{mode, sensitivity, distance}

bosch_camera_audio_detection_get

Obtiene configuración de detección de sonido de rotura de cristal + alarma de humo/incendio (solo Gen2 Audio-Plus)

{glass_break, fire_alarm}

bosch_camera_audio_detection_set

Actualiza detección de sonido de rotura de cristal y/o alarma de incendio (solo Gen2 Audio-Plus)

{glass_break, fire_alarm}

bosch_camera_wifi

Obtiene RSSI WiFi, SSID y calidad de señal derivada 0-100%

{rssi, ssid, signal_strength}

bosch_camera_mjpeg_snapshot

Instantánea MJPEG directa por LAN mediante RTSP inst=3 (solo Gen2, ffmpeg, sin ida y vuelta a la nube)

{path, method, timestamp, camera}

bosch_camera_onvif_scopes

Lee ámbitos de dispositivo ONVIF desde LAN RCP 0x0a98 de la cámara (solo Gen2)

{name, hardware, profiles, raw_scopes}

bosch_camera_rcp_version

Lee versión de biblioteca RCP desde opcodes LAN 0xff00 + 0xff04 de la cámara

{primary, secondary, raw_primary_hex, raw_secondary_hex}

bosch_camera_feature_flags

Obtiene indicadores de funciones de la nube Bosch a nivel de cuenta (sin parámetro de cámara)

{FLAG_NAME: bool, ...}

bosch_camera_siren_trigger

Activa la sirena interior (solo Gen2 Indoor II); stop=True para cancelar

{name, status, privacy_mode, light_on, last_event_at}

bosch_camera_motion_get

Obtiene estado de detección de movimiento habilitada + sensibilidad

{enabled, sensitivity}

bosch_camera_motion_set

Establece detección de movimiento habilitada y/o sensibilidad

{enabled, sensitivity}

bosch_camera_recording_get

Obtiene configuración de sonido de grabación en la nube

{sound_on}

bosch_camera_recording_set

Establece sonido de grabación en la nube

{sound_on}

bosch_camera_autofollow_get

Obtiene estado de seguimiento automático 360° (solo Gen1 Indoor)

{enabled}

bosch_camera_autofollow_set

Establece seguimiento automático 360° (solo Gen1 Indoor)

{enabled}

bosch_camera_privacy_sound_get

Obtiene estado de campanilla de privacidad audible

{enabled}

bosch_camera_privacy_sound_set

Establece estado de campanilla de privacidad audible

{enabled}

bosch_camera_unread_get

Obtiene número de eventos no leídos de una cámara

{count}

bosch_camera_health_check_all

Resumen de salud masivo para todas las cámaras (estado + WiFi + privacidad + último evento + no leídos)

array of per-camera health dicts

bosch_camera_token_status

Análisis local de JWT — devuelve validez, caducidad, correo electrónico (sin llamada de red)

{valid, expires_in_min, email}

bosch_camera_motion_zones_get

Lista rectángulos de zona de detección de movimiento (normalizados 0.0-1.0)

array of {x, y, w, h}

bosch_camera_motion_zones_set

Reemplaza todas las zonas de movimiento (reemplazo completo, no fusión)

array of {x, y, w, h}

bosch_camera_motion_zones_clear

Elimina todas las zonas de movimiento

[]

bosch_camera_privacy_masks_get

Lista rectángulos de zona de máscara de privacidad (normalizados 0.0-1.0)

array of {x, y, w, h}

bosch_camera_privacy_masks_set

Reemplaza todas las máscaras de privacidad (reemplazo completo, no fusión)

array of {x, y, w, h}

bosch_camera_privacy_masks_clear

Elimina todas las máscaras de privacidad

[]

bosch_camera_rules_list

Lista reglas de automatización (horario) para una cámara

array of {id, name, active, start, end, days}

bosch_camera_rules_add

Crea una nueva regla de horario

{id, name, active, start, end, days}

bosch_camera_rules_edit

Actualiza una regla existente (actualización parcial)

{id, name, active, start, end, days}

bosch_camera_rules_delete

Elimina una regla

{deleted, rule_id}

bosch_camera_friends_list

Lista amigos/invitaciones de uso compartido de cámara (a nivel de cuenta)

array of {id, email, nickname, status, shared_cameras}

bosch_camera_friends_invite

Invita a un amigo por correo electrónico (a nivel de cuenta)

{id, email, nickname, status, shared_cameras}

bosch_camera_friends_share

Comparte una cámara con un amigo existente (se fusiona con sus acciones existentes)

{shared, friend_id, camera}

bosch_camera_friends_unshare

Revoca todos los usos compartidos de cámara de un amigo

{unshared, friend_id}

bosch_camera_friends_remove

Elimina a un amigo por completo

{removed, friend_id}

bosch_camera_firmware_status

Obtiene versión de firmware actual/última + disponibilidad de actualización

{camera, current, up_to_date, update_available, installing}

bosch_camera_firmware_install

Instala la actualización de firmware pendiente (la cámara se reinicia en 3-7 min)

{camera, current, up_to_date, update_available, installing}

bosch_camera_siren_duration_set

Establece la duración de la alarma de sirena, 10-300 s (solo Gen2 Indoor II)

{alarm_delay_seconds}

bosch_camera_lighting_schedule_get

Obtiene el horario de iluminación LED (cámaras Eyes para exteriores)

{on_time, off_time, light_on_motion, darkness_threshold, schedule_status}

bosch_camera_lighting_schedule_set

Actualiza el horario de iluminación LED (cámaras Eyes para exteriores)

{on_time, off_time, light_on_motion, darkness_threshold, schedule_status}

bosch_camera_intercom_open

Abre una sesión de audio de escucha (micrófono de cámara → llamante); devuelve una URL RTSPS, solo escucha

{camera, rtsps_url, duration, speaker_level_set}

bosch_camera_timestamp_overlay_get

Obtiene si se graba una superposición de fecha/hora en el video

{enabled}

bosch_camera_timestamp_overlay_set

Activa/desactiva la superposición de fecha/hora en el video

{enabled}

bosch_camera_status_led_get

Obtiene el estado encendido/apagado del LED de estado de la cámara (solo Gen2)

{enabled}

bosch_camera_status_led_set

Enciende/apaga el LED de estado de la cámara (solo Gen2)

{enabled}

bosch_camera_lens_elevation_get

Obtiene la altura de montaje de la lente en metros (solo Gen2)

{meters}

bosch_camera_lens_elevation_set

Establece la altura de montaje de la lente, 0.5-5.0 m (solo Gen2)

{meters}

bosch_camera_darkness_threshold_get

Obtiene el umbral de iluminación día/noche + modo de atenuación (solo Gen2)

{threshold_percent, soft_light_fading}

bosch_camera_darkness_threshold_set

Establece el umbral de iluminación día/noche y/o modo de atenuación (solo Gen2)

{threshold_percent, soft_light_fading}

bosch_camera_white_balance_get

Obtiene el balance de blancos de la luz frontal, -1.0 frío .. 1.0 cálido (solo Gen2)

{value}

bosch_camera_white_balance_set

Establece el balance de blancos de la luz frontal (solo Gen2)

{value}

bosch_camera_led_brightness_get

Obtiene el brillo del LED superior o inferior 0-100 % (solo Gen2)

{position, brightness_percent}

bosch_camera_led_brightness_set

Establece el brillo del LED superior o inferior 0-100 % (solo Gen2)

{position, brightness_percent}

bosch_camera_soft_reset

Reinicia una cámara (reinicio suave)

{camera, rebooting}

bosch_camera_hard_reset

Restablecimiento de fábrica de una cámara — DESTRUCTIVO, desvincula la cámara; requiere confirm=True

{camera, factory_reset}

bosch_camera_rename

Renombra una cámara mediante la API de la nube

{camera, new_name}

Herramientas deliberadamente NO expuestas a los LLM (riesgo de escritura / consumen mucho tiempo):

  • Renovación de token (manejada silenciosamente por el cliente subyacente)

  • Descarga de clip en la nube (cargas útiles grandes)

  • Talk bidireccional (micrófono de la persona que llama → altavoz de la cámara): no está expuesto en absoluto por la API en la nube de Bosch (la misma limitación que tiene el CLI hermano) — bosch_camera_intercom_open es solo de escucha

Portado desde la integración de HA pero deliberadamente NO añadido (desajuste de arquitectura — ver docs/family-parity-plan.md auditoría 2026-08-19 para el razonamiento completo):

  • open_live_connection (apertura explícita de sesión / keep-alive) — las herramientas MCP son llamadas de solicitud/respuesta de un solo disparo sin proceso de fondo persistente para mantener una sesión abierta entre llamadas; bosch_camera_stream_url ya acuña una URL fresca e inmediatamente utilizable por llamada, que es el equivalente con forma de MCP.

  • "Puerta de entrada" Frigate/RTSP externo (servidor RTSP persistente sin credenciales) — misma razón: requiere un proceso de servidor de larga duración, que esta superficie de herramientas sin estado no tiene.

  • delete_event / send_event_webhook — ambos operan en la caché de archivos de eventos en disco local de HA y en la configuración webhook_url/enable_webhook_delivery, infraestructura que esta herramienta no tiene (los eventos aquí se extraen bajo demanda de la nube de Bosch, nunca se almacenan localmente).

  • Lectura del historial de alertas de IA — ai_alert_store.py de HA lee archivos relativos a hass.config.path en el propio diseño de almacenamiento de HA; acoplarse a eso sería frágil y no es claramente útil cuando el cliente MCP es en sí mismo típicamente el LLM que realiza el análisis.

  • Selectores de video_quality / stream_mode y image_rotation_180 — los tres son preferencias solo del lado del cliente en HA (sin llamada a la API en la nube de Bosch en absoluto: la calidad elige el parámetro inst= de RTSPS, stream_mode elige LOCAL vs REMOTE, la rotación es una transformación CSS/PIL solo de visualización) sin estado persistente por sesión al que adjuntarlos aquí. pan_preset ya está cubierto — bosch_camera_pan(preset=...) se ha enviado desde v1.x.

Fiabilidad — rotación transparente de credenciales

La ruta de escritura LAN-RCP prefer_local=True (bosch_camera_privacy_set, bosch_camera_light_set) reintenta automáticamente una vez en HTTP 401 después de volver a obtener credenciales Digest frescas de bosch_config.json. Sin cambio de API visible para el usuario — el reintento es silencioso y el resultado de la herramienta es idéntico tanto si se necesitó rotación como si no. Esto elimina fallos de arranque en frío cuando el nonce Digest en caché ha expirado. bosch_camera_pan actualmente no toma un parámetro prefer_local — el pan siempre va a través de la nube de Bosch.

Recursos MCP

URI de recurso

Descripción

bosch://cameras

Lista JSON de todas las cámaras (id, nombre, modelo, estado, firmware, mac, descripción)

bosch://cameras/{name}/snapshot.jpg

Último JPEG en caché, o captura fresca si la caché está vacía

bosch://cameras/{name}/events

Últimos 50 eventos (movimiento, persona, audio) como lista JSON

bosch://cameras es un recurso estático. Las variantes {name} son plantillas de recursos.

Prompts MCP

Prompt

Argumentos

Descripción

daily-camera-summary

hours: int = 24

Informe de varios pasos: eventos por cámara, desglose por tipo, distribución temporal, aspectos destacados de anomalías

pre-leave-check

(ninguno)

Instantánea de cada cámara, describir escena, marcar anomalías, recomendar modo de privacidad interior

Postura de privacidad — las operaciones de medios son solo LAN

Las instantáneas y las URL de transmisión van directamente del host MCP a la cámara a través de la LAN — sin retransmisión en la nube de Bosch. Las herramientas restantes (estado, eventos, privacidad/luz/pan/notificaciones) todavía usan la nube porque no hay una API local expuesta actualmente para esos endpoints.

Herramienta

Ruta

bosch_camera_snapshot

Solo LAN — HTTP Digest a la IP de la cámara

bosch_camera_stream_url

Solo LAN — RTSPS a través del proxy TLS local de Bosch

bosch_camera_lan_ping

Solo LAN — conexión TCP al puerto 443 de la cámara

bosch_camera_list / status / events

Nube de Bosch (sin API local todavía)

bosch_camera_privacy_set / light_set (predeterminado)

Nube de Bosch

bosch_camera_privacy_set / light_set (prefer_local=True)

LAN-RCP primero, respaldo en la nube — solo Gen2

bosch_camera_pan / notifications_set

Nube de Bosch (sin API local todavía)

El host MCP debe estar en la misma red que las cámaras para que las herramientas de medios funcionen. Si no lo está, las herramientas de instantánea/transmisión muestran local_unavailable en lugar de recurrir a la nube — por diseño.

Modelo de autenticación

El servidor se ejecuta con el bosch_config.json existente del usuario de la herramienta CLI Python hermana — sin flujo OAuth separado, sin credenciales almacenadas por este repositorio. Genérelo una vez a través del bosch_camera login del CLI (OAuth2 PKCE basado en navegador), luego apunte el servidor MCP a él:

  • --config <ruta> / variable de entorno BOSCH_CAMERA_CONFIG=<ruta>: ruta explícita a bosch_config.json.

  • Si no se establece ninguno, el puente recurre a lo que la resolución predeterminada de get_session_and_cameras() encuentre junto al checkout del CLI hermano (ver Arquitectura — la ubicación del CLI hermano se resuelve a su vez mediante BOSCH_CAMERA_CLI_PATH o una ruta predeterminada fija).

El servidor MCP nunca lee ni escribe credenciales más allá de lo que la herramienta CLI ya hace (renovación de token en 401, guardado atómico) — llama directamente al código de sesión/configuración del CLI a través de la importación cli_bridge.

Modos de transporte

Se admiten tres modos de transporte a través de la bandera --transport:

Modo

Bandera

Caso de uso

stdio

--transport stdio (predeterminado)

Claude Code / Claude Desktop — subproceso local

streamable-http

--transport http

Implementaciones remotas / multi-cliente sobre HTTP

sse

--transport sse

Clientes SSE heredados

Los modos HTTP y SSE se vinculan a 127.0.0.1:8765 por defecto (solo local, seguro). Pase --http-host 0.0.0.0 solo en entornos de red confiables y con firewall.

# stdio (default) — used by Claude Code / Claude Desktop
bosch-smart-home-camera-mcp --config ~/.config/bosch-camera/bosch_config.json

# streamable-HTTP — local port for multi-client use
bosch-smart-home-camera-mcp --transport http --http-port 8765

# streamable-HTTP — expose to LAN (ensure firewall rules!)
bosch-smart-home-camera-mcp --transport http --http-host 0.0.0.0 --http-port 8765

Pila tecnológica

  • Python 3.10+

  • mcp — SDK oficial de MCP para Python

  • pydantic (ya una dependencia transitiva de mcp) para esquemas de herramientas

  • Reutilización: bosch_camera.py del repositorio CLI hermano, ubicado en tiempo de ejecución mediante inyección de sys.path (variable de entorno BOSCH_CAMERA_CLI_PATH o un valor predeterminado configurable) — no es una dependencia instalada por pip, ver Arquitectura

Instalación

# via pipx (recommended for end users — isolated environment, PATH entry)
pipx install bosch-smart-home-camera-mcp

# via uvx (zero-install, one-shot — no persistent env needed)
uvx bosch-smart-home-camera-mcp --help

# from source (for development)
pip install -e .[test]

Mantenedores: La publicación en PyPI está automatizada — empujar una etiqueta v*.*.* activa el flujo de trabajo publish-pypi a través de OIDC Trusted Publisher. No ejecute twine upload manualmente.

Añadir a Claude Code — stdio (local, recomendado)

claude mcp add bosch-camera -- bosch-smart-home-camera-mcp \
  --config ~/.config/bosch-camera/bosch_config.json

Añadir a Claude Code — streamable-HTTP (servidor remoto)

# Start server first:
bosch-smart-home-camera-mcp --transport http --http-port 8765

# Then register the HTTP endpoint:
claude mcp add bosch-camera --transport http http://127.0.0.1:8765/mcp

Añadir a Claude Desktop

Añada lo siguiente a su claude_desktop_config.json (normalmente ~/Library/Application Support/Claude/claude_desktop_config.json en macOS o %APPDATA%\Claude\claude_desktop_config.json en Windows):

{
  "mcpServers": {
    "bosch-camera": {
      "command": "bosch-smart-home-camera-mcp",
      "args": [
        "--config",
        "/path/to/bosch_config.json"
      ]
    }
  }
}

Reemplace /path/to/bosch_config.json con la ruta real a su bosch_config.json (generado por la herramienta CLI Python hermana mediante bosch_camera login). El servidor se ejecuta como un subproceso stdio local — no se necesita puerto de red para Claude Desktop.

Estructura del repositorio

Bosch-Smart-Home-Camera-Tool-MCP/
├── README.md                         this file
├── CHANGELOG.md                      full version history
├── LICENSE                           MIT
├── pyproject.toml                    build + tool config
├── requirements.txt                  runtime pins (mcp, etc.)
├── requirements-test.txt             pytest, pytest-asyncio, mocks
├── src/
│   └── bosch_camera_mcp/
│       ├── __init__.py
│       ├── server.py                 FastMCP server + all 70 MCP tools
│       ├── adapters/
│       │   ├── cli_bridge.py         sys.path bridge to the sister Python CLI for cloud ops
│       │   └── __init__.py
│       ├── lan_rcp.py                direct LAN HTTPS+Digest for RCP writes
│       ├── cloud_ssl.py              pinned Bosch cloud CA / SSL context (CWE-295)
│       ├── time_utils.py             Bosch timestamp cleanup helpers
│       ├── maintenance.py            cloud maintenance RSS feed fetcher
│       ├── errors.py                 shared error types (MCPError)
│       ├── resources.py              MCP resources (bosch://cameras/…)
│       └── prompts.py                MCP prompts (daily-summary, pre-leave)
├── tests/                            30+ test modules — tool behavior, LAN-RCP/cred-rotation,
│                                      cert pinning, transports, resources, prompts, packaging
├── docs/
│   ├── architecture.md
│   └── release-process.md
└── .gitignore

Historial de versiones

  • v0.1.0 — documento conceptual + servidor esqueleto, todas las herramientas definidas pero aún no implementadas (devuelve NotImplementedError) ✅

  • v0.2.0 — las 8 herramientas conectadas: herramientas de lectura (list, status, events, snapshot) + herramientas de escritura (privacy, light, pan, notifications) mediante inyección de sys.path (Opción C) ✅

  • v0.4.0 — recursos (bosch://cameras, bosch://cameras/{name}/snapshot.jpg, bosch://cameras/{name}/events) + prompts (daily-camera-summary, pre-leave-check) ✅

  • v0.5.0 — transporte streamable-HTTP (--transport http|sse|stdio), empaquetado para pipx/uvx, 24 pruebas nuevas ✅

  • v1.0.0 — primera versión estable: 106 pruebas, wheel + sdist publicados en GitHub Releases, publicación en PyPI pendiente ✅

  • v1.1.0 — ruta de medios solo-LAN (privacidad reforzada): bosch_camera_snapshot y el nuevo bosch_camera_stream_url van directamente a la cámara por LAN, sin retransmisión en la nube de Bosch para medios. 113 pruebas. ✅

  • v1.2.0 — herramienta bosch_camera_maintenance_status: obtiene anuncios de mantenimiento en la nube de fuentes RSS de la comunidad; devuelve estado (activo/programado/pasado/reciente/desconocido/inactivo), título, ventana de tiempo, enlace. ✅

  • v1.3.0 — conjunto de funciones de respaldo LAN (portado desde la integración HA v12.4.10/v12.4.11): herramienta bosch_camera_lan_ping (sonda TCP para cualquier cámara en LAN); prefer_local=True en bosch_camera_privacy_set / bosch_camera_light_set (ruta de escritura RCP-LAN, Gen2, respaldo en la nube en caso de error); campo recommended_action en bosch_camera_maintenance_status ("check_lan" cuando está activo, "wait" cuando está programado). 173 pruebas. ✅

  • v1.3.3 — obtener/establecer audio, obtener/establecer detección de intrusión, información WiFi (portado desde HA v12.7.0). 16 herramientas. ✅

  • v1.3.4 — presets PTZ con nombre (bosch_camera_pan preset= acepta home / left / right / back-left / back-right); rotación transparente de credenciales en 401 para herramientas LAN-RCP (reintento silencioso, sin cambio de API). ✅

  • v1.3.6 — 9 correcciones de errores de la auditoría en vivo 2026-05-24 (lista de cámaras siempre en vivo desde la nube, hw_version Gen1/Gen2, resolución de UUID, mapeo de campos de eventos, audio camelCase, compuerta de intrusión Gen2, códigos de error, marca de tiempo de instantánea, espejo de requirements-test.txt). ✅

  • v1.4.0 — 4 herramientas nuevas: bosch_camera_mjpeg_snapshot, bosch_camera_onvif_scopes, bosch_camera_rcp_version, bosch_camera_feature_flags. Ayudante asíncrono _fetch_rcp_lan. 20 herramientas en total. ✅

  • v1.5.0 — 11 herramientas nuevas + 8 correcciones de errores de la auditoría de cámaras en vivo (4 unidades de hardware, las 4 generaciones): disparador de sirena, obtener/establecer movimiento, obtener/establecer grabación, obtener/establecer autoseguimiento, obtener/establecer sonido de privacidad, recuento de no leídos, verificación de salud de todo, estado de token. ✅

  • v1.5.1 — corregido _fetch_rcp_lan (usaba un aiohttp.DigestAuth inexistente → onvif_scopes / rcp_version siempre fallaban por LAN; ahora httpx.DigestAuth). Cobertura de pruebas 83→98%, fixtures saneados, CI actualizado a versiones principales de acciones nativas de Node-24. ✅

  • v1.5.2 — higiene de dependencias: se eliminó la dependencia de ejecución aiohttp no utilizada (solo para pruebas ahora), se añadieron pisos de seguridad pyjwt>=2.13.0 / starlette>=1.0.1 (pip-audit limpio), se corrigió una prueba que simulaba la pila HTTP incorrecta. ✅

  • v1.5.3 — parche de seguridad: fijar CA de la nube de Bosch para la sesión de nube MCP (CWE-295, GHSA-6qh5-x5m5-vj6v); cierra MITM de red adyacente en tokens OAuth. La fijación TOFU local no cambia. ✅

  • v1.5.4 — las marcas de tiempo de eventos ya no pierden el desplazamiento de zona horaria: /v11/events devuelve marcas de tiempo con desplazamiento (p. ej. +02:00[Europe/Berlin]); el servidor ahora elimina solo el sufijo [zone] final en lugar de truncar a 19 caracteres, preservando el desplazamiento UTC explícito. ✅

  • v1.5.5 — el recurso camera_events ahora usa eventType + eventTags para una clasificación correcta de eventos. ✅

  • v1.6.0 — 2 herramientas nuevas: bosch_camera_audio_detection_get / bosch_camera_audio_detection_set — detección de sonido de rotura de cristal + alarma de humo/incendio para cámaras Gen2 Audio-Plus (portado desde la integración HA v14.2.0). 34 herramientas en total. ✅

  • v1.7.0 — cierre de paridad familiar (docs/family-parity-plan.md §2b): 21 herramientas nuevas que cierran la brecha de capacidades MCP-vs-HA/CLI — obtener/establecer/limpiar zonas de movimiento, obtener/establecer/limpiar máscaras de privacidad, listar/añadir/editar/eliminar reglas de automatización, listar/invitar/compartir/dejar de compartir/eliminar uso compartido de cámaras/amigos, estado/instalación de firmware (refleja la protección async_install_firmware de HA), duración de sirena, obtener/establecer programación de iluminación LED, y una herramienta de intercomunicador de audio de escucha (micrófono de cámara → llamante, URL RTSPS; la conversación bidireccional no está expuesta en absoluto por la API en la nube de Bosch, misma limitación que la CLI hermana). Refuerzo de CI: compuerta de cobertura (--cov-fail-under=96), pip-audit (solo dependencias de ejecución), pylint, codespell, CodeQL, escaneo de secretos gitleaks, y un flujo de trabajo de revisión de dependencias — paridad de nivel Oro con las compuertas de calidad de la integración HA. 55 herramientas en total. ✅

  • v1.7.2 — solo documentación: corregida la fila de Login de este repositorio en la tabla de Comparación de Integraciones, sin cambios funcionales. ✅

Lanzamientos

Última: v1.7.2 — consulta la página de lanzamientos de GitHub para las notas completas: Notas del lanzamiento v1.7.2 →

Todos los lanzamientos

Página de lanzamientos de GitHub — cada versión etiquetada con notas + recursos descargables

Historial completo

CHANGELOG.md — las mismas notas, navegables dentro del repositorio

Comparación de Integraciones

La API de Bosch Smart Home Camera con ingeniería inversa se expone a través de cinco proyectos hermanos. Elige el que se adapte a tu plataforma.

Característica

Home Assistant Integration

Python CLI Tool

ioBroker Adapter

MCP Server

Frontend (NiceGUI)

Node-RED

Madurez

v15.0+ — Escala de Calidad de HA Platinum

v10.12+ estable (Mini-NVR BETA)

v1.8+ estable · npm

v1.7+ estable · PyPI

v0.4.0 alpha · PyPI

v0.4.0 alpha · npm

Plataforma

Home Assistant (HACS)

CLI independiente de Python 3.10+

ioBroker (npm)

Python 3.10+ · pipx / uvx · stdio + streamable-HTTP para clientes MCP (Claude Desktop, Claude Code, personalizados)

Aplicación web NiceGUI · Python 3.10+

Paleta Node-RED · npm

Inicio de sesión

OAuth2 PKCE (navegador)

OAuth2 PKCE (navegador)

OAuth2 PKCE (navegador)

◑ comparte bosch_config.json de la CLI

◑ comparte bosch_config.json de la CLI

◑ token de actualización desde la CLI

Instantáneas

Camera.image nativo

✅ comando snapshot

✅ Almacenamiento de archivos + DP base64

bosch_camera_snapshot (solo LAN)

✅ en vivo + respaldo de eventos

✅ nodo snapshot

Transmisión RTSP en vivo (LAN)

✅ mediante el componente HA Stream

✅ salida ffmpeg/RTSPS

✅ proxy TLS → RTSP local

bosch_camera_stream_url (solo LAN, sin retransmisión en la nube)

◑ interno (go2rtc)

◑ nodo stream-url (solo URL)

WebRTC (latencia de menos de un segundo)

✅ mediante go2rtc integrado

(v10.6.0) live --webrtc

✅ mediante go2rtc (si no, instantánea)

URL de doble transmisión (principal + secundaria)

sensor.bosch_<n>_stream_url + _sub (v12.4.0, opt-in por cámara)

info muestra ambas · live --sub (v10.5.0)

stream_url + stream_url_sub (v0.5.3 experimental)

bosch_camera_stream_url — solo transmisión principal

(solo transmisión secundaria)

◑ Solo URL — sin opción secundaria

Grabador externo (BlueIris, Frigate)

✅ mediante go2rtc

✅ tubería stdout

✅ URL con credenciales Digest + opción de enlace LAN

✅ URL devuelta, transferencia a ffmpeg / go2rtc posterior

stream-url → conectar posteriormente

Modo privacidad

✅ entidad de interruptor

✅ comando

✅ DP

bosch_camera_privacy_set (respaldo LAN mediante prefer_local)

✅ alternar

✅ nodo privacy

Foco frontal (Gen1/Gen2)

✅ entidad de luz

✅ comando

✅ DP

bosch_camera_light_set (respaldo LAN)

(esquema de la Fase 2)

✅ nodo bosch-camera-light (v0.3.0-alpha)

Lavaparedes RGB (Gen2 Outdoor II)

✅ luz con RGB

◑ solo encendido/apagado — sin RGB

✅ DP de color + brillo

(solo encendido/apagado — RGB no expuesto)

◑ solo encendido/apagado + intensidad — sin RGB (v0.3.0-alpha)

Sirena de alarma de pánico

✅ entidad de botón (Gen2 Indoor II)

✅ comando (solo Gen2 Indoor II)

✅ DP

bosch_camera_siren_trigger (solo Gen2 Indoor II)

✅ activación + duración (solo Gen2 Indoor II)

Actualización de firmware

✅ Entidad de actualización + flujo de reparación de Repairs, botón de instalación (v14.4.10)

✅ estado + instalación (v10.11.0)

✅ estados de firmware + activación de instalación, protección de bloqueo de escritura (v1.8.0)

✅ estado + herramientas de instalación (v1.7.0)

◑ visualización de estado de solo lectura, sin acción de instalación

✅ nodos de estado + instalación (v0.4.0-alpha)

Rotación de imagen 180°

✅ interruptor

✅ DP

Eventos de movimiento / persona / audio

✅ push FCM + respaldo de sondeo

◑ solo comando watch (comando de eventos eliminado)

✅ push FCM + respaldo de sondeo

bosch_camera_events (extracción bajo demanda)

◑ tabla de eventos solo de extracción

✅ nodo event (sondeo)

Estado de activación por flanco de movimiento

binary_sensor.motion

n/a

motion_active DP (v0.5.3)

n/a (solicitud-respuesta, sin suscripción)

Instantánea automática al detectar movimiento

✅ actualiza la entidad Camera

n/a

✅ escribe last_event_image en base64 (v0.5.3)

n/a (sin bucle en segundo plano)

Activación de movimiento sintético (sensor externo)

✅ servicio

n/a

✅ DP

Zonas de movimiento / máscaras de privacidad

✅ lectura + escritura

✅ lectura + escritura

✅ lectura + escritura (v1.8.0)

✅ obtener / establecer / borrar (v1.7.0)

(aún sin editor visual)

Reglas de automatización / programaciones

✅ lectura + escritura

✅ lectura + escritura

✅ CRUD completo (v1.8.0)

✅ listar / añadir / editar / eliminar (v1.7.0)

✅ CRUD completo (listar/añadir/editar/eliminar)

Programación de iluminación

✅ lectura (escritura mediante servicio, solo Gen1 Eyes Outdoor)

✅ lectura + escritura

✅ lectura (solo Gen1, v1.2.0)

✅ obtener / establecer (v1.7.0)

✅ lectura + escritura (cámaras Eyes de exterior)

Descarga de clips en la nube (historial ~30 días)

✅ mediante Media Browser

(en pausa — aún sin solicitud de la comunidad)

(intencionalmente no expuesto — cargas grandes)

(use la CLI)

clip_url en la carga del evento

Mini-NVR (grabación local)

✅ continua + con búfer de eventos, preroll de búfer circular (v11.2.0 BETA → modos v14.7.0)

◑ multiplexado de segmentos activado por eventos, sin anillo de preroll (v10.7.0 BETA)

(delega en un grabador externo mediante un endpoint RTSP sin credenciales)

(sin concepto de NVR)

◑ solo continua, sin búfer de eventos (v0.4.0-alpha)

◑ solo continua mediante el nodo bosch-camera-nvr-record (v0.4.0-alpha)

Carga de clips SMB / NAS

(v10.7.0 BETA)

Compartir cámara (amigos)

✅ servicios (compartir / invitar / listar)

✅ comando

✅ compartir / invitar / eliminar (solo Gen2, v1.8.0)

✅ listar / invitar / compartir / dejar de compartir / eliminar (v1.7.0)

✅ listar/invitar/eliminar/compartir/dejar de compartir

Panorámica / inclinación (360° Gen1)

✅ servicios

✅ comando

pan_position DP

bosch_camera_pan

✅ control deslizante conectado a la API en vivo

Preajustes de panorámica con nombre (home / left / right / back-left / back-right)

✅ entidad de selección opt-in

✅ indicador pan --preset

pan_preset DP

bosch_camera_pan preset=

Audio bidireccional / intercomunicador

✅ comando

◑ solo escucha bosch_camera_intercom_open (v1.7.0)

Entrega de webhooks en eventos

✅ servicio + opciones opt-in

watch --webhook URL

✅ mediante puente MQTT

(modelo de solicitud-respuesta)

Puente de eventos MQTT (movimiento / audio / persona)

n/a (bus de eventos nativo de HA)

n/a (ejecución única)

✅ configuración de administrador

n/a

Apple HomeKit (mediante puente HA Core)

✅ documentado

n/a

n/a

n/a

n/a

n/a

Programador de instantáneas / time-lapse

✅ ejemplos/ YAML

✅ ejemplos de cron + ffmpeg

✅ ejemplo de Blockly

n/a

Tarjeta / widget nativo de panel

✅ 2 tarjetas Lovelace (individual + cuadrícula)

n/a

✅ 2 widgets vis-2 — BoschCamera + BoschOverview multicámara

n/a

(es en sí mismo un panel web)

Picture-in-Picture sobrevive a la pestaña en segundo plano

✅ keep-alive hass-suspend-when-hidden (v14.0.0)

n/a (sin interfaz)

✅ PiP propio + recuperación de congelación, latido de Web-Worker (v1.7.2/v1.7.3)

n/a (sin interfaz)

✅ tiempo de espera de reconexión + recuperación de congelación (v0.4.0-alpha)

n/a (sin interfaz)

Respaldo REMOTO de retransmisión en la nube

✅ cambio automático cuando la LAN no está disponible

✅ modo remoto

(solo LOCAL por diseño)

(multimedia solo LAN; estado/eventos mediante la nube)

◑ hereda de la CLI

◑ opción REMOTO (manual)

Interfaz de administración / configuración basada en navegador

✅ Flujo de configuración de HA

n/a (CLI)

✅ pestañas de configuración JSON

n/a (mediado por LLM; configuración mediante CLI / cliente MCP)

✅ página de configuración

◑ nodo de configuración del editor

Idiomas de la interfaz

EN · DE · FR · ES · IT · NL · PL · PT · RU · UK · ZH-Hans (v12.4.0)

EN · DE · FR · ES · IT · NL · PL · PT · RU · UK · ZH-Hans (v10.3.0)

EN · DE · FR · ES · IT · NL · PL · PT · RU · UK · ZH-CN

n/a (sin interfaz — el LLM es el front-end)

◑ i18n del backend · interfaz mayormente en EN

n/a (solo inglés)

Leyenda: ✅ compatible · ❌ no compatible / no planificado · n/a no aplicable para esta plataforma.

Los cuatro proyectos comparten la misma investigación de protocolo RCP + API de nube con ingeniería inversa, pero evolucionan de forma independiente. La integración con Home Assistant es la implementación de referencia más completa en cuanto a funciones; la CLI de Python es la superficie de más bajo nivel / programable; el adaptador de ioBroker está orientado a paneles VIS y automatizaciones Blockly; el servidor MCP expone una superficie de herramientas seleccionada, priorizando LAN, a los clientes MCP (Claude Desktop, Claude Code, personalizados) para el control de cámaras en lenguaje natural.


Proyectos relacionados

Parte de una familia de cinco implementaciones para Bosch Smart Home Cameras (más un frontend alfa):

Implementación

Repositorio

Estado

🏆 Integración con Home Assistant

Bosch-Smart-Home-Camera-Tool-HomeAssistant

v16.0.1 · HA Quality Scale Platinum · listo para producción

🐍 CLI de Python

Bosch-Smart-Home-Camera-Tool-Python

v10.12.3 · Mini-NVR + carga SMB (BETA) · respaldo LAN (ping / --local) · presets PTZ · entrega por webhook · captura / investigación / independiente

🟢 Adaptador ioBroker

ioBroker.bosch-smart-home-camera

v1.8.3 · estable · npm · rotación de Digest con interruptor de privacidad · puente MQTT · presets PTZ · widgets VIS-2 (BoschCamera + BoschOverview)

🤖 Servidor MCP (este repositorio)

Bosch-Smart-Home-Camera-Tool-MCP

v1.7.2 · rotación de credenciales · presets PTZ · fijación de certificados TOFU · CA de nube fijada (CWE-295) · ping LAN + prefer_local · zonas/máscaras/reglas/amigos/instalación de firmware · integración con Claude Code / Claude Desktop

🔴 Nodos Node-RED (alfa)

Bosch-Smart-Home-Camera-Tool-NodeRED

v0.4.2-alpha · nodos para evento / instantánea / privacidad / configuración / más

También: Bosch Smart Home Camera — Python Frontend (NiceGUI) — v0.4.2-alpha (panel + detalle de cámara + ajustes) — se agradece el interés de la comunidad

HA sigue siendo la implementación de referencia — las funciones llegan allí primero; la CLI de Python, el Adaptador ioBroker y el Servidor MCP se ponen al día con el tiempo.


Licencia

MIT — ver LICENSE.

A
license - permissive license
A
quality
A
maintenance

Maintenance

Maintainers
Response time
4dRelease cycle
21Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    A
    quality
    F
    maintenance
    Enables controlling and querying Home Assistant devices and services via natural language. Supports state retrieval, listing states, and calling any Home Assistant service.
    13
    276
    5
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables natural language control of Xiaomi smart home devices through MCP, focusing on homes, rooms, device names, and scenes without requiring protocol details.
    65
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables natural language control of Loxone smart home systems, including lighting, audio, climate, and environmental monitoring, through MCP-compatible clients.
    15
    2
    AGPL 3.0
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables control of local Xiaomi smart home devices via MCP, allowing reading real-time status and setting properties through natural language, without relying on the Xiaomi cloud.
    MIT

View all related MCP servers

Related MCP Connectors

  • Official Microsoft MCP Server to query Microsoft Entra data using natural language

  • MCP server wrapping the Tesla Fleet API and TeslaMate API

  • MCP server exposing the AceDataCloud Fish Audio API (text-to-speech with voice conditioning)

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/mosandlt/Bosch-Smart-Home-Camera-Tool-MCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server