Bosch Smart Home Camera Tool Mcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Bosch Smart Home Camera Tool Mcp (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Model Context Protocol (MCP) server that exposes the Bosch Smart Home Camera cloud API as MCP tools. Drop-in for Claude Code, Claude Desktop, and any MCP-compatible client. Reuses the proven reverse-engineered API client from the sister Python CLI tool.
>
Status: v1.5.3 — security patch: Bosch cloud CA pinned for the MCP cloud session (CWE-295). 32 tools + 3 resources + 2 prompts, stdio/SSE/streamable-HTTP, pipx/uvx-installable
[![License][license-shield]](LICENSE) [![Project Maintenance][maintenance-shield]][user_profile]
[license-shield]: https://img.shields.io/badge/license-MIT-blue.svg?style=for-the-badge [maintenance-shield]: https://img.shields.io/badge/maintainer-%40mosandlt-blue.svg?style=for-the-badge [user_profile]: https://github.com/mosandlt
This project is an independent, community-developed tool. It is not affiliated with, endorsed by, sponsored by, or in any way officially connected to Robert Bosch GmbH, Bosch Smart Home GmbH, or any of their subsidiaries or affiliates. "Bosch", "Bosch Smart Home", and related names and logos are registered trademarks of Robert Bosch GmbH.
The tool communicates with a reverse-engineered, undocumented, unofficial API. Provided "as is", without warranty of any kind. Use entirely at your own risk.
The sister projects target different runtimes:
| Project | Version | Runtime | User-facing surface |
|---|---|---|---|
| HA Integration | v13.5.14 | Home Assistant | UI entities, Lovelace card, automations |
| Python CLI | v10.10.2 | terminal | bosch_camera ... commands |
| ioBroker Adapter | v1.5.2 | ioBroker | datapoints, VIS-2 widgets (BoschCamera + BoschOverview), JSON-config admin UI |
| Node-RED nodes | v0.2.2-alpha | Node-RED | flow nodes for automation pipelines |
| MCP Server (this repo) | v1.5.3 | Claude clients | MCP tools callable from LLMs |
LLM use-cases the existing sisters don't cover:
These flows require an LLM in the loop — which is exactly what MCP is for.
┌─────────────────────────┐ 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) │
└─────────────────────────┘The MCP server is a thin wrapper around the Python CLI's API layer. It does not re-implement OAuth, token refresh, FCM push, RTSP, or RCP — it imports them.
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:#000bosch_camera_lan_ping tool flowsequenceDiagram
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}| Tool | Description | Returns |
|---|---|---|
bosch_camera_list | List all configured cameras | array of {id, name, model, hw_version, status} |
bosch_camera_status | Get online/offline + privacy state for one camera | {name, status, privacy_mode, light_on, last_event_at} |
bosch_camera_snapshot | LAN-only JPEG capture (no cloud) — HTTP Digest to camera IP | {path, method, timestamp} |
bosch_camera_stream_url | LAN-only RTSPS stream URL (no cloud relay) — consumable by ffmpeg/VLC/go2rtc | {camera, rtsps_url, note} |
bosch_camera_events | List recent motion/person/audio events | array of {event_id, type, timestamp, has_clip} |
bosch_camera_privacy_set | Turn privacy mode on/off; prefer_local=True routes to LAN RCP first | {name, status, privacy_mode, ...} |
bosch_camera_light_set | Turn spotlight on/off; prefer_local=True routes to LAN RCP first | {name, status, light_on, ...} |
bosch_camera_pan | Pan the 360° camera; preset: home (0°) / left (-60°) / right (+60°) / back-left (-120°) / back-right (+120°) | {camera, direction, preset?} |
bosch_camera_notifications_set | Toggle push notifications | {camera, notifications_on} |
bosch_camera_lan_ping | TCP-probe a camera on LAN port 443 (1.5 s timeout) | {reachable, ip, latency_ms} |
bosch_camera_maintenance_status | Fetch current cloud maintenance announcement from community RSS feed | {state, title, link, pub_date, summary, …, recommended_action} |
bosch_camera_audio_get | Get microphone level, speaker level, intercom flag (Gen2 only) | {microphone_level, speaker_level, intercom_enabled} |
bosch_camera_audio_set | Set microphone level and/or speaker level 0-100 (Gen2 only) | {microphone_level, speaker_level, intercom_enabled} |
bosch_camera_intrusion_get | Get intrusion detection config: mode, sensitivity 0-7, distance 1-8 m (Gen2 only) | {mode, sensitivity, distance} |
bosch_camera_intrusion_set | Update intrusion detection mode/sensitivity/distance (Gen2 only) | {mode, sensitivity, distance} |
bosch_camera_wifi | Get WiFi RSSI, SSID, and derived signal quality 0-100 % | {rssi, ssid, signal_strength} |
bosch_camera_mjpeg_snapshot | Direct LAN MJPEG snapshot via RTSP inst=3 (Gen2 only, ffmpeg, no cloud roundtrip) | {path, method, timestamp, camera} |
bosch_camera_onvif_scopes | Read ONVIF device scopes from camera LAN RCP 0x0a98 (Gen2 only) | {name, hardware, profiles, raw_scopes} |
bosch_camera_rcp_version | Read RCP library version from camera LAN opcodes 0xff00 + 0xff04 | {primary, secondary, raw_primary_hex, raw_secondary_hex} |
bosch_camera_feature_flags | Fetch account-level Bosch cloud feature flags (no camera param) | {FLAG_NAME: bool, ...} |
bosch_camera_siren_trigger | Trigger the indoor siren (Gen2 Indoor II only); stop=True to cancel | {camera, status} |
bosch_camera_motion_get | Get motion detection enabled state + sensitivity | {enabled, sensitivity} |
bosch_camera_motion_set | Set motion detection enabled and/or sensitivity | {enabled, sensitivity} |
bosch_camera_recording_get | Get cloud recording sound setting | {record_sound} |
bosch_camera_recording_set | Set cloud recording sound | {record_sound} |
bosch_camera_autofollow_get | Get 360° auto-tracking state (Gen1 Indoor only) | {enabled} |
bosch_camera_autofollow_set | Set 360° auto-tracking (Gen1 Indoor only) | {enabled} |
bosch_camera_privacy_sound_get | Get audible privacy-chime state | {enabled} |
bosch_camera_privacy_sound_set | Set audible privacy-chime state | {enabled} |
bosch_camera_unread_get | Get unread event count for a camera | {count} |
bosch_camera_health_check_all | Bulk health summary for all cameras (status + WiFi + privacy + last-event + unread) | array of per-camera health dicts |
bosch_camera_token_status | Local JWT parse — returns validity, expiry, email (no network call) | {valid, expires_in_min, email} |
Tools intentionally NOT exposed to LLMs (write-risky / time-consuming):
LAN-RCP tools (bosch_camera_privacy_set, bosch_camera_light_set, bosch_camera_pan with prefer_local=True) automatically retry once on HTTP 401 after re-fetching fresh Digest credentials from bosch_config.json. No user-visible API change — the retry is silent and the tool result is identical whether or not rotation was needed. This eliminates cold-start failures when the cached Digest nonce has expired.
| Resource URI | Description |
|---|---|
bosch://cameras | JSON list of all cameras (id, name, model, status, firmware, mac, description) |
bosch://cameras/{name}/snapshot.jpg | Latest cached JPEG, or fresh capture if cache empty |
bosch://cameras/{name}/events | Last 50 events (motion, person, audio) as JSON list |
bosch://cameras is a static resource. The {name} variants are resource templates.
| Prompt | Arguments | Description |
|---|---|---|
daily-camera-summary | hours: int = 24 | Multi-step report: events per camera, type breakdown, time distribution, anomaly highlights |
pre-leave-check | _(none)_ | Snapshot every camera, describe scene, flag anomalies, recommend indoor privacy mode |
Snapshots and stream URLs go directly from the MCP host to the camera over the LAN — no Bosch cloud relay. The remaining tools (status, events, privacy/light/pan/notifications) still use the cloud because no local API is currently exposed for those endpoints.
| Tool | Path |
|---|---|
bosch_camera_snapshot | LAN only — HTTP Digest to camera IP |
bosch_camera_stream_url | LAN only — RTSPS via local Bosch TLS proxy |
bosch_camera_lan_ping | LAN only — TCP connect to camera port 443 |
bosch_camera_list / status / events | Bosch cloud (no local API yet) |
bosch_camera_privacy_set / light_set (default) | Bosch cloud |
bosch_camera_privacy_set / light_set (prefer_local=True) | LAN-RCP first, cloud fallback — Gen2 only |
bosch_camera_pan / notifications_set | Bosch cloud (no local API yet) |
The MCP host must be on the same network as the cameras for media tools to work. If it isn't, the snapshot/stream tools surface local_unavailable rather than falling back to cloud — by design.
Server runs with the user's existing `bosch_config.json` from the sister Python tool — no separate OAuth flow. Two startup modes:
--config-from-cli (default): expects bosch_config.json next to bosch_camera.py in a sibling checkout--config <path>: explicit path to a bosch_config.jsonThe MCP server never reads or writes credentials beyond what the CLI tool already does (token refresh on 401, atomic save).
Three transport modes are supported via the --transport flag:
| Mode | Flag | Use case |
|---|---|---|
stdio | --transport stdio (default) | Claude Code / Claude Desktop — local subprocess |
streamable-http | --transport http | Remote / multi-client deployments over HTTP |
sse | --transport sse | Legacy SSE clients |
HTTP and SSE modes bind to 127.0.0.1:8765 by default (security-safe local-only). Pass --http-host 0.0.0.0 only in trusted, firewalled network environments.
# 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 8765mcp — official MCP Python SDKpydantic (already a transitive dep of mcp) for tool schemasbosch_camera.py from sister repo as a Git submodule or as a Python import path# 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]Maintainers: PyPI publishing is automated — pushing av*.*.*tag triggers the publish-pypi workflow via OIDC Trusted Publisher. Do not runtwine uploadmanually.
claude mcp add bosch-camera -- bosch-smart-home-camera-mcp \
--config ~/.config/bosch-camera/bosch_config.json# 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/mcpAdd the following to your claude_desktop_config.json (usually ~/Library/Application Support/Claude/claude_desktop_config.json on macOS or %APPDATA%\Claude\claude_desktop_config.json on Windows):
{
"mcpServers": {
"bosch-camera": {
"command": "bosch-smart-home-camera-mcp",
"args": [
"--config",
"/path/to/bosch_config.json"
]
}
}
}Replace /path/to/bosch_config.json with the actual path to your bosch_config.json (generated by the sister Python CLI tool via bosch_camera login). The server runs as a local stdio subprocess — no network port needed for Claude Desktop.
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 32 MCP tools
│ ├── adapters/
│ │ ├── cli_bridge.py bridge to Python CLI for cloud ops
│ │ └── __init__.py
│ ├── lan_rcp.py direct LAN HTTPS+Digest for RCP writes
│ ├── maintenance.py cloud maintenance RSS feed fetcher
│ ├── errors.py shared error types
│ ├── resources.py MCP resources (bosch://cameras/…)
│ └── prompts.py MCP prompts (daily-summary, pre-leave)
├── tests/
│ ├── test_tools_integration.py
│ ├── test_audio_intrusion_wifi.py
│ ├── test_cert_pinning.py
│ ├── test_cred_rotation.py
│ ├── test_lan_ping.py
│ ├── test_lan_rcp_https.py
│ ├── test_maintenance.py
│ ├── test_packaging.py
│ ├── test_pan_presets.py
│ ├── test_prompts.py
│ ├── test_resources.py
│ ├── test_skeleton.py
│ ├── test_transport.py
│ └── test_v160_features.py
├── docs/
│ ├── architecture.md
│ └── release-process.md
└── .gitignoreNotImplementedError) ✅bosch://cameras, bosch://cameras/{name}/snapshot.jpg, bosch://cameras/{name}/events) + prompts (daily-camera-summary, pre-leave-check) ✅--transport http|sse|stdio), packaging for pipx/uvx, 24 new tests ✅bosch_camera_snapshot and new bosch_camera_stream_url go directly to camera over LAN, no Bosch cloud relay for media. 113 tests. ✅bosch_camera_maintenance_status tool: fetches cloud maintenance announcements from community RSS feeds; returns state (active/scheduled/past/recent/unknown/idle), title, time window, link. ✅bosch_camera_lan_ping tool (TCP-probe any camera on LAN); prefer_local=True on bosch_camera_privacy_set / bosch_camera_light_set (RCP-LAN write path, Gen2, cloud fallback on failure); recommended_action field on bosch_camera_maintenance_status ("check_lan" when active, "wait" when scheduled). 173 tests. ✅bosch_camera_pan preset= accepts home / left / right / back-left / back-right); transparent cred-rotation on 401 for LAN-RCP tools (silent retry, no API change). ✅bosch_camera_mjpeg_snapshot, bosch_camera_onvif_scopes, bosch_camera_rcp_version, bosch_camera_feature_flags. _fetch_rcp_lan async helper. 20 tools total. ✅_fetch_rcp_lan (used a non-existent aiohttp.DigestAuth → onvif_scopes / rcp_version always failed over LAN; now httpx.DigestAuth). Test coverage 83→98%, fixtures sanitized, CI bumped to Node-24-native action majors. ✅aiohttp runtime dep (test-only now), added pyjwt>=2.13.0 / starlette>=1.0.1 security floors (pip-audit clean), fixed a test that mocked the wrong HTTP stack. ✅Latest: v1.5.3 — see the GitHub release page for full notes: v1.5.3 release notes →
| All releases | GitHub Releases page — every tagged version with notes + downloadable assets |
| Full history | CHANGELOG.md — same notes, browseable inside the repo |
The Bosch Smart Home Camera reverse-engineered API is exposed via four sibling projects. Pick the one that fits your platform.
| Feature | Home Assistant Integration | Python CLI Tool | ioBroker Adapter | MCP Server | Frontend (NiceGUI) | Node-RED |
|---|---|---|---|---|---|---|
| Maturity | v13.5+ — HA Quality Scale Platinum | v10.10+ stable (Mini-NVR BETA) | v1.5+ stable · npm | v1.5+ stable · PyPI | v0.1.2 alpha · PyPI | v0.2.3 alpha · npm |
| Platform | Home Assistant (HACS) | Standalone Python 3.10+ CLI | ioBroker (npm) | Python 3.10+ · pipx / uvx · stdio + streamable-HTTP for MCP clients (Claude Desktop, Claude Code, custom) | NiceGUI web app · Python 3.10+ | Node-RED palette · npm |
| Login | OAuth2 PKCE (browser) | OAuth2 PKCE (browser) | OAuth2 PKCE (browser) | OAuth2 PKCE (browser, one-time) | ◑ shares CLI bosch_config.json | ◑ refresh-token from CLI |
| Snapshots | ✅ Native Camera.image | ✅ snapshot command | ✅ File-store + base64 DP | ✅ bosch_camera_snapshot (LAN-only) | ✅ live + event fallback | ✅ snapshot node |
| Live RTSP stream (LAN) | ✅ via HA Stream component | ✅ ffmpeg/RTSPS output | ✅ TLS proxy → local RTSP | ✅ bosch_camera_stream_url (LAN-only, no cloud relay) | ◑ internal (go2rtc) | ◑ stream-url node (URL only) |
| WebRTC (sub-second latency) | ✅ via integrated go2rtc | ✅ (v10.6.0) live --webrtc | ❌ | ❌ | ✅ via go2rtc (else snapshot) | ❌ |
| Dual-stream URL (main + sub) | ✅ sensor.bosch_<n>_stream_url + _sub (v12.4.0, opt-in per cam) | ✅ info shows both · live --sub (v10.5.0) | ✅ stream_url + stream_url_sub (v0.5.3 experimental) | ◑ bosch_camera_stream_url — main stream only | ❌ (sub-stream only) | ◑ URL only — no sub option |
| External recorder (BlueIris, Frigate) | ✅ via go2rtc | ✅ stdout pipe | ✅ Digest-creds URL + LAN bind option | ✅ URL returned, hand off to ffmpeg / go2rtc downstream | ❌ | ◑ stream-url → wire downstream |
| Privacy mode | ✅ switch entity | ✅ command | ✅ DP | ✅ bosch_camera_privacy_set (LAN-fallback via prefer_local) | ✅ toggle | ✅ privacy node |
| Front spotlight (Gen1/Gen2) | ✅ light entity | ✅ command | ✅ DP | ✅ bosch_camera_light_set (LAN-fallback) | ❌ (Phase 2 stub) | ❌ |
| RGB wallwasher (Gen2 Outdoor II) | ✅ light w/ RGB | ◑ on/off only — no RGB | ✅ color + brightness DPs | ❌ (on/off only — RGB not exposed) | ❌ | ❌ |
| Panic-alarm siren | ✅ button entity (Gen2 Indoor II) | ✅ command (Gen2 Indoor II only) | ✅ DP | ✅ bosch_camera_siren_trigger (Gen2 Indoor II only) | ❌ | ❌ |
| Image rotation 180° | ✅ switch | ❌ | ✅ DP | ❌ | ❌ | ❌ |
| Motion / person / audio events | ✅ FCM push + polling fallback | ◑ watch command only (events cmd removed) | ✅ FCM push + polling fallback | ✅ bosch_camera_events (on-demand pull) | ◑ pull-only events table | ✅ event node (poll) |
| Motion edge-trigger state | ✅ binary_sensor.motion | n/a | ✅ motion_active DP (v0.5.3) | n/a (request-response, no subscription) | ❌ | ❌ |
| Auto-snapshot on motion | ✅ refreshes Camera entity | n/a | ✅ writes last_event_image base64 (v0.5.3) | n/a (no background loop) | ❌ | ❌ |
| Synthetic motion trigger (external sensor) | ✅ service | n/a | ✅ DP | ❌ | ❌ | ❌ |
| Motion zones / privacy masks (read) | ✅ | ✅ | ✅ read-only (v1.2.0) | ❌ | ❌ | ❌ |
| Automation rules / schedules (read) | ✅ | ✅ | ◑ read-only count + JSON (v1.2.0) | ❌ | ❌ | ❌ |
| Lighting schedule (read) | ✅ | ✅ | ✅ read (Gen1-only, v1.2.0) | ❌ | ❌ | ❌ |
| Cloud clip download (history ~30 d) | ✅ via Media Browser | ❌ | ❌ (parked — no community request yet) | ❌ (intentionally not exposed — large payloads) | ❌ (use CLI) | ◑ clip_url in event payload |
| Mini-NVR (motion-triggered local recording) | ✅ (v11.2.0 BETA) | ✅ (v10.7.0 BETA) | ❌ | ❌ | ❌ | ❌ |
| SMB / NAS clip upload | ✅ | ✅ (v10.7.0 BETA) | ❌ | ❌ | ❌ | ❌ |
| Camera sharing (friends) | ✅ services (share / invite / list) | ✅ command | ◑ read-only list (v1.2.0) | ❌ (intentionally not exposed — needs user-driven flow) | ❌ | ❌ |
| Pan / tilt (360° Gen1) | ✅ services | ✅ command | ✅ pan_position DP | ✅ bosch_camera_pan | ❌ (Phase 2 stub) | ❌ |
| Named pan presets (home / left / right / back-left / back-right) | ✅ opt-in select entity | ✅ pan --preset flag | ✅ pan_preset DP | ✅ bosch_camera_pan preset= | ❌ | ❌ |
| Two-way audio / intercom | ❌ | ✅ command | ❌ | ❌ (intentionally not exposed — timing-sensitive) | ❌ | ❌ |
| Webhook delivery on events | ✅ service + opt-in options | ✅ watch --webhook URL | ✅ via MQTT bridge | ❌ (request-response model) | ❌ | ❌ |
| MQTT event bridge (motion / audio / person) | n/a (HA event bus native) | n/a (single-run) | ✅ admin-config | n/a | ❌ | ❌ |
| Apple HomeKit (via HA Core bridge) | ✅ documented | n/a | n/a | n/a | n/a | n/a |
| Snapshot scheduler / time-lapse | ✅ examples/ YAML | ✅ cron + ffmpeg examples | ✅ Blockly example | n/a | ❌ | ❌ |
| Native dashboard card / widget | ✅ 2 Lovelace cards (single + grid) | n/a | ✅ 2 vis-2 widgets — BoschCamera + BoschOverview multi-cam | n/a | ✅ (is itself a web dashboard) | ❌ |
| Cloud-relay REMOTE fallback | ✅ auto-switch when LAN unreachable | ✅ remote mode | ❌ (LOCAL-only by design) | ❌ (media LAN-only; status/events via cloud) | ◑ inherits CLI | ◑ REMOTE opt (manual) |
| Browser-based admin / config UI | ✅ HA Config Flow | n/a (CLI) | ✅ JSON-config tabs | n/a (LLM-mediated; config via CLI / MCP client) | ✅ Settings page | ◑ editor config node |
| UI languages | 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 (no UI — LLM is the front-end) | ◑ backend i18n · UI mostly EN | n/a (English only) |
Legend: ✅ supported · ❌ not supported / not planned · n/a not applicable for this platform.
All four projects share the same reverse-engineered Cloud API + RCP protocol research, but evolve independently. The Home Assistant integration is the most feature-complete reference implementation; the Python CLI is the lowest-level / scriptable surface; the ioBroker adapter targets VIS dashboards and Blockly automations; the MCP server exposes a curated, LAN-first tool surface to MCP clients (Claude Desktop, Claude Code, custom) for natural-language camera control.
Part of a five-implementation family for Bosch Smart Home Cameras (plus an alpha frontend):
| Implementation | Repo | Status |
|---|---|---|
| 🏆 Home Assistant Integration | Bosch-Smart-Home-Camera-Tool-HomeAssistant | v13.5.14 · HA Quality Scale Platinum · production-ready |
| 🐍 Python CLI | Bosch-Smart-Home-Camera-Tool-Python | v10.10.2 · Mini-NVR + SMB upload (BETA) · LAN-fallback (ping / --local) · PTZ presets · webhook delivery · capture / research / standalone |
| 🟢 ioBroker Adapter | ioBroker.bosch-smart-home-camera | v1.5.2 · stable · npm · privacy-toggle Digest rotation · MQTT bridge · PTZ presets · VIS-2 widgets (BoschCamera + BoschOverview) |
| 🤖 MCP Server (this repo) | Bosch-Smart-Home-Camera-Tool-MCP | v1.5.3 · cred-rotation · PTZ presets · TOFU cert pinning · cloud CA pinned (CWE-295) · LAN-ping + prefer_local · Claude Code / Claude Desktop integration |
| 🔴 Node-RED nodes (alpha) | Bosch-Smart-Home-Camera-Tool-NodeRED | v0.2.2-alpha · 4 nodes (event / snapshot / privacy / config) |
Also: Bosch Smart Home Camera — Python Frontend (NiceGUI) — v0.1.1-alpha (dashboard + camera detail + settings) — community interest welcome
HA stays the reference implementation — features land there first; the Python CLI, ioBroker Adapter and MCP Server catch up over time.
MIT — see LICENSE.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.