Skip to main content
Glama
mosandlt

Bosch Smart Home Camera MCP Server

by mosandlt

Bosch Smart Home Camera — MCP Server

Model Context Protocol (MCP) 서버 — Bosch Smart Home Camera 클라우드 API를 MCP 도구로 노출합니다. Claude Code, Claude Desktop 및 모든 MCP 호환 클라이언트에서 바로 사용할 수 있습니다. 검증된 역공학 API 클라이언트를 자매 프로젝트인 Python CLI tool에서 재사용합니다.

상태: v1.7.2 — 제품군 동일 기능 마무리(v1.7.0): 모션 영역, 프라이버시 마스크, 자동화 규칙, 카메라 공유/친구, 펌웨어 설치, 사이렌 지속 시간, 조명 일정, 오디오 인터콤 듣기. 그리고 2026-08-19 이미지/비디오 튜닝 + 카메라 수명주기 라운드: 타임스탬프 오버레이, 상태 LED, 렌즈 상하 각도, 어둠 임계값, 화이트 밸런스, 상단/하단 LED 밝기, 소프트/하드 리셋, 이름 변경. 도구 70개 + 리소스 3개 + 프롬프트 2개, stdio/SSE/streamable-HTTP, pipx/uvx 설치 가능

License Project Maintenance


목차


Related MCP server: 米家 MCP Server

면책 조항

이 프로젝트는 독립적이고 커뮤니티에서 개발한 도구입니다. Robert Bosch GmbH, Bosch Smart Home GmbH 또는 그 자회사나 계열사와 제휴, 보증, 후원 또는 어떠한 공식적 연관 관계도 없습니다. "Bosch", "Bosch Smart Home" 및 관련 이름과 로고는 Robert Bosch GmbH의 등록 상표입니다.

이 도구는 역공학된, 문서화되지 않은 비공식 API와 통신합니다. 어떠한 종류의 보증도 없이 "있는 그대로" 제공됩니다. 전적으로 사용자 본인의 책임 하에 사용하세요.

왜 별도의 MCP 서버인가?

자매 프로젝트들은 서로 다른 런타임을 대상으로 합니다:

프로젝트

버전

런타임

사용자 인터페이스

HA Integration

v16.0.1

Home Assistant

UI 엔티티, Lovelace 카드, 자동화

Python CLI

v10.12.3

터미널

bosch_camera ... 명령어

ioBroker Adapter

v1.8.3

ioBroker

데이터포인트, VIS-2 위젯(BoschCamera + BoschOverview), JSON 구성 관리 UI

Node-RED nodes

v0.4.2-alpha

Node-RED

자동화 파이프라인용 플로우 노드

Frontend (NiceGUI)

v0.4.2-alpha

독립형 웹 앱

대시보드 + 카메라 상세 + 설정 UI

MCP Server (this repo)

v1.7.1

Claude 클라이언트

LLM에서 호출할 수 있는 MCP 도구

기존 자매 프로젝트들이 다루지 않는 LLM 사용 사례:

  • "정원 카메라의 스냅샷을 찍고 무엇이 보이는지 설명해 줘."

  • "테라스에서 마지막 모션 이벤트가 언제 발생했어?"

  • "실내 카메라의 프라이버시 모드를 22:00까지 켜고, 그다음 꺼 줘."

  • "360° 카메라를 왼쪽으로 패닝하고 스냅샷을 찍어 줘."

  • "오늘 모든 카메라의 모션 이벤트를 요약해 줘."

이런 흐름에는 LLM이 루프 안에 필요하며, 이것이 바로 MCP가 존재하는 이유입니다.


아키텍처

┌─────────────────────────┐      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)    │
                                                                  └─────────────────────────┘

MCP 서버는 Python CLI의 API 계층을 감싸는 얇은 래퍼입니다. OAuth, 토큰 갱신, FCM 푸시, RTSP 또는 RCP를 다시 구현하지 않고 이를 import해서 사용합니다.

이는 단순한 문서 참조가 아니라 실제 런타임 의존성입니다. 서버는 일반적인 pip install 의존성 방식 대신, 프로세스 시작 시 sys.path 주입(adapters/cli_bridge.py)을 통해 bosch_camera.py의 위치를 찾습니다. 즉, 자매 프로젝트인 Python CLI tool 저장소가 디스크에 체크아웃되어 있어야 하며, MCP 서버는 그 위치를 알아야 합니다. 해석 순서는 다음과 같습니다. BOSCH_CAMERA_CLI_PATH 환경 변수가 설정되어 있으면 그것을 사용하고, 그렇지 않으면 유지보수자의 자체 설정에 사용되는 고정 기본 경로를 사용합니다(이식 불가 — 재정의하세요). 거의 모든 도구 호출은 호출 시점에 ensure_cli_importable()을 통해 해당 경로에서 bosch_camera를 import하므로, 경로가 없거나 잘못되면 서버 시작 시가 아니라 첫 번째 도구 호출에서 ImportError로 표시됩니다. 실제로는 두 저장소를 클론한 다음, MCP 서버가 실행되는 환경에 BOSCH_CAMERA_CLI_PATH=/path/to/Bosch-Smart-Home-Camera-Tool-Python을 설정하거나, 로컬에 영구 설치하려면 adapters/cli_bridge.pyDEFAULT_CLI_PATH를 편집하면 됩니다. CLI 도구가 bosch_camera login으로 생성하는 bosch_config.json을 이 서버가 자격 증명으로 읽습니다 — 인증 모델을 참조하세요.

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

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}

MCP 도구 (총 70개, v1.7.2)

도구

설명

반환값

bosch_camera_list

구성된 모든 카메라 목록

{id, name, model, hw_version, status} 배열

bosch_camera_status

카메라 하나의 온라인/오프라인 + 프라이버시 상태 가져오기

{name, status, privacy_mode, light_on, last_event_at}

bosch_camera_snapshot

LAN 전용 JPEG 캡처(클라우드 없음) — 카메라 IP로 HTTP Digest

{path, method, timestamp}

bosch_camera_stream_url

LAN 전용 RTSPS 스트림 URL(클라우드 릴레이 없음) — ffmpeg/VLC/go2rtc에서 사용 가능

{camera, rtsps_url, note}

bosch_camera_events

최근 모션/사람/오디오 이벤트 목록

{event_id, type, tags, timestamp_iso, has_clip, clip_status} 배열

bosch_camera_privacy_set

프라이버시 모드 켜기/끄기; prefer_local=True는 먼저 LAN RCP로 라우팅

{name, status, privacy_mode, ...}

bosch_camera_light_set

스포트라이트 켜기/끄기; prefer_local=True는 먼저 LAN RCP로 라우팅

{name, status, light_on, ...}

bosch_camera_pan

360° 카메라 패닝(Gen1 CAMERA_360만); preset: home (0°) / left (-60°) / right (+60°) / back-left (-120°) / back-right (+120°)

{name, status, privacy_mode, light_on, last_event_at}

bosch_camera_notifications_set

푸시 알림 전환

{name, status, privacy_mode, light_on, last_event_at}

bosch_camera_lan_ping

LAN 포트 443에서 카메라 TCP 프로브(1.5초 타임아웃)

{reachable, ip, latency_ms}

bosch_camera_maintenance_status

커뮤니티 RSS 피드에서 현재 클라우드 유지보수 공지 가져오기

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

bosch_camera_audio_get

마이크 레벨, 스피커 레벨, 인터컴 플래그 가져오기(Gen2만)

{microphone_level, speaker_level, intercom_enabled}

bosch_camera_audio_set

마이크 레벨 및/또는 스피커 레벨 0-100 설정(Gen2만)

{microphone_level, speaker_level, intercom_enabled}

bosch_camera_intrusion_get

침입 감지 구성 가져오기: mode, sensitivity 0-7, distance 1-8m(Gen2만)

{mode, sensitivity, distance}

bosch_camera_intrusion_set

침입 감지 mode/sensitivity/distance 업데이트(Gen2만)

{mode, sensitivity, distance}

bosch_camera_audio_detection_get

유리 파손 + 연기/화재 경보 음향 감지 구성 가져오기(Gen2 Audio-Plus만)

{glass_break, fire_alarm}

bosch_camera_audio_detection_set

유리 파손 및/또는 화재 경보 음향 감지 업데이트(Gen2 Audio-Plus만)

{glass_break, fire_alarm}

bosch_camera_wifi

WiFi RSSI, SSID 및 파생 신호 품질 0-100% 가져오기

{rssi, ssid, signal_strength}

bosch_camera_mjpeg_snapshot

RTSP inst=3을 통한 직접 LAN MJPEG 스냅샷(Gen2만, ffmpeg, 클라우드 왕복 없음)

{path, method, timestamp, camera}

bosch_camera_onvif_scopes

카메라 LAN RCP 0x0a98에서 ONVIF 디바이스 스코프 읽기(Gen2만)

{name, hardware, profiles, raw_scopes}

bosch_camera_rcp_version

카메라 LAN opcode 0xff00 + 0xff04에서 RCP 라이브러리 버전 읽기

{primary, secondary, raw_primary_hex, raw_secondary_hex}

bosch_camera_feature_flags

계정 수준 Bosch 클라우드 기능 플래그 가져오기(카메라 매개변수 없음)

{FLAG_NAME: bool, ...}

bosch_camera_siren_trigger

실내 사이렌 트리거(Gen2 Indoor II만); 취소하려면 stop=True

{name, status, privacy_mode, light_on, last_event_at}

bosch_camera_motion_get

모션 감지 활성화 상태 + 민감도 가져오기

{enabled, sensitivity}

bosch_camera_motion_set

모션 감지 활성화 및/또는 민감도 설정

{enabled, sensitivity}

bosch_camera_recording_get

클라우드 녹화 사운드 설정 가져오기

{sound_on}

bosch_camera_recording_set

클라우드 녹화 사운드 설정

{sound_on}

bosch_camera_autofollow_get

360° 자동 추적 상태 가져오기(Gen1 Indoor만)

{enabled}

bosch_camera_autofollow_set

360° 자동 추적 설정(Gen1 Indoor만)

{enabled}

bosch_camera_privacy_sound_get

가청 프라이버시 차임 상태 가져오기

{enabled}

bosch_camera_privacy_sound_set

가청 프라이버시 차임 상태 설정

{enabled}

bosch_camera_unread_get

카메라의 읽지 않은 이벤트 수 가져오기

{count}

bosch_camera_health_check_all

모든 카메라 일괄 상태 요약(status + WiFi + privacy + last-event + unread)

카메라별 상태 딕셔너리 배열

bosch_camera_token_status

로컬 JWT 파싱 — 유효성, 만료, email 반환(네트워크 호출 없음)

{valid, expires_in_min, email}

bosch_camera_motion_zones_get

모션 감지 영역 사각형 목록(0.0-1.0으로 정규화)

{x, y, w, h} 배열

bosch_camera_motion_zones_set

모든 모션 영역 교체(전체 교체, 병합 아님)

{x, y, w, h} 배열

bosch_camera_motion_zones_clear

모든 모션 영역 제거

[]

bosch_camera_privacy_masks_get

프라이버시 마스크 영역 사각형 목록(0.0-1.0으로 정규화)

{x, y, w, h} 배열

bosch_camera_privacy_masks_set

모든 프라이버시 마스크 교체(전체 교체, 병합 아님)

{x, y, w, h} 배열

bosch_camera_privacy_masks_clear

모든 프라이버시 마스크 제거

[]

bosch_camera_rules_list

카메라 하나의 자동화(시간 일정) 규칙 목록

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

bosch_camera_rules_add

새 일정 규칙 생성

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

bosch_camera_rules_edit

기존 규칙 업데이트(부분 업데이트)

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

bosch_camera_rules_delete

규칙 삭제

{deleted, rule_id}

bosch_camera_friends_list

카메라 공유 친구/초대 목록(계정 수준)

{id, email, nickname, status, shared_cameras} 배열

bosch_camera_friends_invite

이메일로 친구 초대(계정 수준)

{id, email, nickname, status, shared_cameras}

bosch_camera_friends_share

기존 친구와 카메라 하나 공유(기존 공유와 병합)

{shared, friend_id, camera}

bosch_camera_friends_unshare

친구에게 부여된 모든 카메라 공유 취소

{unshared, friend_id}

bosch_camera_friends_remove

친구 완전히 제거

{removed, friend_id}

bosch_camera_firmware_status

현재/최신 펌웨어 버전 + 업데이트 가능 여부 가져오기

{camera, current, up_to_date, update_available, installing}

bosch_camera_firmware_install

보류 중인 펌웨어 업데이트 설치(카메라 3-7분 재부팅)

{camera, current, up_to_date, update_available, installing}

bosch_camera_siren_duration_set

사이렌 경보 지속 시간 10-300초 설정(Gen2 Indoor II만)

{alarm_delay_seconds}

bosch_camera_lighting_schedule_get

LED 조명 일정 가져오기(실외 Eyes 카메라)

{on_time, off_time, light_on_motion, darkness_threshold, schedule_status}

bosch_camera_lighting_schedule_set

LED 조명 일정 업데이트(실외 Eyes 카메라)

{on_time, off_time, light_on_motion, darkness_threshold, schedule_status}

bosch_camera_intercom_open

듣기 오디오 세션 열기(카메라 마이크 → 호출자); RTSPS URL 반환, 듣기 전용

{camera, rtsps_url, duration, speaker_level_set}

bosch_camera_timestamp_overlay_get

비디오에 날짜/시간 오버레이 포함 여부 가져오기

{enabled}

bosch_camera_timestamp_overlay_set

날짜/시간 비디오 오버레이 켜기/끄기

{enabled}

bosch_camera_status_led_get

카메라 상태 LED 켜짐/꺼짐 상태 가져오기(Gen2만)

{enabled}

bosch_camera_status_led_set

카메라 상태 LED 켜기/끄기(Gen2만)

{enabled}

bosch_camera_lens_elevation_get

렌즈 장착 높이(미터) 가져오기(Gen2만)

{meters}

bosch_camera_lens_elevation_set

렌즈 장착 높이 0.5-5.0m 설정(Gen2만)

{meters}

bosch_camera_darkness_threshold_get

주간/야간 조명 임계값 + 페이딩 모드 가져오기(Gen2만)

{threshold_percent, soft_light_fading}

bosch_camera_darkness_threshold_set

주간/야간 조명 임계값 및/또는 페이딩 모드 설정(Gen2만)

{threshold_percent, soft_light_fading}

bosch_camera_white_balance_get

전면등 화이트 밸런스 가져오기, -1.0 차가움 .. 1.0 따뜻함(Gen2만)

{value}

bosch_camera_white_balance_set

전면등 화이트 밸런스 설정(Gen2만)

{value}

bosch_camera_led_brightness_get

상단 또는 하단 LED 밝기 0-100% 가져오기(Gen2만)

{position, brightness_percent}

bosch_camera_led_brightness_set

상단 또는 하단 LED 밝기 0-100% 설정(Gen2만)

{position, brightness_percent}

bosch_camera_soft_reset

카메라 하나 재부팅(소프트 리셋)

{camera, rebooting}

bosch_camera_hard_reset

카메라 하나 공장 초기화 — 파괴적, 카메라 페어링 해제; confirm=True 필요

{camera, factory_reset}

bosch_camera_rename

클라우드 API를 통해 카메라 이름 변경

{camera, new_name}

Tools intentionally NOT exposed to LLMs (write-risky / time-consuming):

  • 토큰 갱신(기본 클라이언트가 자동으로 처리)

  • 클라우드 클립 다운로드(대용량 페이로드)

  • 양방향 통화(발신자 마이크 → 카메라 스피커): Bosch 클라우드 API에서 전혀 노출되지 않음(자매 CLI도 동일한 제약) — bosch_camera_intercom_open은 수신 전용

HA 통합에서 이식했지만 의도적으로 추가하지 않음(아키텍처 불일치 — 전체 근거는 docs/family-parity-plan.md 2026-08-19 감사 참조):

  • open_live_connection(명시적 세션 열기/유지) — MCP 도구는 일회성 요청/응답 호출이며 호출 사이에 세션을 유지할 백그라운드 프로세스가 없음. bosch_camera_stream_url은 이미 호출마다 새롭고 즉시 사용 가능한 URL을 발급하므로 MCP 형태에 맞는 동등 기능임.

  • Frigate/외부-RTSP "현관문"(지속적인 무인증 RTSP 서버) — 동일한 이유: 장기 실행 서버 프로세스가 필요한데, 이 무상태 도구 표면에는 그런 프로세스가 없음.

  • delete_event / send_event_webhook — 둘 다 HA 자체 로컬 디스크 이벤트 파일 캐시와 webhook_url/enable_webhook_delivery 설정에 대해 동작하는데, 이 도구에는 그런 인프라가 없음(여기서 이벤트는 Bosch 클라우드에서 온디맨드로 가져오며 로컬에 저장되지 않음).

  • AI 알림 기록 읽기 — HA의 ai_alert_store.py는 HA 자체 스토리지 구조의 hass.config.path 기준 파일을 읽음. MCP 클라이언트가 일반적으로 분석을 수행하는 LLM 자체인 경우, 그에 결합하는 것은 취약하고 명확히 유용하지 않음.

  • video_quality / stream_mode 선택 및 image_rotation_180 — 세 가지 모두 HA의 클라이언트 측 전용 기본 설정(Bosch 클라우드 API 호출이 전혀 없음: quality는 RTSPS inst= 매개변수를 선택하고, stream_mode는 LOCAL과 REMOTE를 선택하며, rotation은 표시 전용 CSS/PIL 변환)이며 여기에 연결할 영구적인 세션별 상태가 없음. pan_preset은 이미 지원됨 — bosch_camera_pan(preset=...)은 v1.x부터 제공됨.

안정성 — 투명한 자격 증명 순환

prefer_local=True LAN-RCP 쓰기 경로(bosch_camera_privacy_set, bosch_camera_light_set)는 bosch_config.json에서 새 Digest 자격 증명을 다시 가져온 후 HTTP 401에서 자동으로 한 번 재시도함. 사용자에게 보이는 API 변경은 없음 — 재시도는 자동이며 순환이 필요했는지 여부와 관계없이 도구 결과는 동일함. 이는 캐시된 Digest nonce가 만료되었을 때 콜드 스타트 실패를 제거함. bosch_camera_pan은 현재 prefer_local 매개변수를 사용하지 않음 — pan은 항상 Bosch 클라우드를 통해 수행됨.

MCP 리소스

Resource URI

Description

bosch://cameras

모든 카메라의 JSON 목록(id, name, model, status, firmware, mac, description)

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

최신 캐시된 JPEG, 캐시가 비어 있으면 새로 캡처

bosch://cameras/{name}/events

최근 50개 이벤트(motion, person, audio)의 JSON 목록

bosch://cameras는 정적 리소스입니다. {name} 변형은 리소스 템플릿입니다.

MCP 프롬프트

Prompt

Arguments

Description

daily-camera-summary

hours: int = 24

다단계 보고서: 카메라별 이벤트, 유형별 분류, 시간 분포, 이상 징후 하이라이트

pre-leave-check

(없음)

모든 카메라 스냅샷 촬영, 장면 설명, 이상 징후 표시, 실내 프라이버시 모드 권장

프라이버시 입장 — 미디어 작업은 LAN 전용

스냅샷과 스트림 URL은 MCP 호스트에서 LAN을 통해 카메라로 직접 전송되며 Bosch 클라우드 릴레이를 거치지 않습니다. 나머지 도구(status, events, privacy/light/pan/notifications)는 해당 엔드포인트에 대해 현재 로컬 API가 노출되지 않으므로 여전히 클라우드를 사용합니다.

Tool

Path

bosch_camera_snapshot

LAN 전용 — 카메라 IP에 HTTP Digest

bosch_camera_stream_url

LAN 전용 — 로컬 Bosch TLS 프록시를 통한 RTSPS

bosch_camera_lan_ping

LAN 전용 — 카메라 포트 443에 TCP 연결

bosch_camera_list / status / events

Bosch 클라우드(아직 로컬 API 없음)

bosch_camera_privacy_set / light_set (기본값)

Bosch 클라우드

bosch_camera_privacy_set / light_set (prefer_local=True)

LAN-RCP 우선, 클라우드 폴백 — Gen2 전용

bosch_camera_pan / notifications_set

Bosch 클라우드(아직 로컬 API 없음)

미디어 도구가 작동하려면 MCP 호스트가 카메라와 동일한 네트워크에 있어야 합니다. 그렇지 않은 경우 스냅샷/스트림 도구는 설계상 클라우드로 폴백하지 않고 local_unavailable을 표시합니다.

인증 모델

서버는 자매 Python CLI 도구의 기존 bosch_config.json 으로 실행됩니다 — 별도의 OAuth 흐름이 없고 이 저장소가 자격 증명을 저장하지 않습니다. CLI의 bosch_camera login(브라우저 기반 OAuth2 PKCE)으로 한 번 생성한 다음 MCP 서버가 이를 가리키도록 지정합니다:

  • --config <path> / BOSCH_CAMERA_CONFIG=<path> 환경 변수: bosch_config.json의 명시적 경로.

  • 둘 다 설정되지 않은 경우, 브리지는 get_session_and_cameras()의 기본 해석이 자매 CLI 체크아웃 옆에서 찾는 것으로 폴백합니다(아키텍처 참조 — 자매 CLI의 위치 자체는 BOSCH_CAMERA_CLI_PATH 또는 고정 기본 경로를 통해 해석됨).

MCP 서버는 CLI 도구가 이미 수행하는 것(401 시 토큰 갱신, 원자적 저장) 외에 자격 증명을 읽거나 쓰지 않습니다 — cli_bridge 임포트를 통해 CLI의 자체 세션/설정 코드를 직접 호출합니다.

전송 모드

--transport 플래그를 통해 세 가지 전송 모드를 지원합니다:

Mode

Flag

Use case

stdio

--transport stdio (기본값)

Claude Code / Claude Desktop — 로컬 하위 프로세스

streamable-http

--transport http

HTTP를 통한 원격 / 다중 클라이언트 배포

sse

--transport sse

레거시 SSE 클라이언트

HTTP 및 SSE 모드는 기본적으로 127.0.0.1:8765에 바인딩됩니다(보안상 안전한 로컬 전용). 신뢰할 수 있는 방화벽 네트워크 환경에서만 --http-host 0.0.0.0을 전달하세요.

# 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

기술 스택

  • Python 3.10+

  • mcp — 공식 MCP Python SDK

  • 도구 스키마용 pydantic(mcp의 전이적 종속성)

  • 재사용: 자매 CLI 저장소의 bosch_camera.py, 런타임에 sys.path 주입(BOSCH_CAMERA_CLI_PATH 환경 변수 또는 구성 가능한 기본값)으로 위치 확인 — pip 설치 종속성이 아님, 아키텍처 참조

설치

# 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]

유지 관리자: PyPI 게시는 자동화되어 있습니다 — v*.*.* 태그를 푸시하면 publish-pypi 워크플로가 OIDC 신뢰 게시자를 통해 트리거됩니다. twine upload를 수동으로 실행하지 마십시오.

Claude Code에 추가 — stdio(로컬, 권장)

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

Claude Code에 추가 — streamable-HTTP(원격 서버)

# 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

Claude Desktop에 추가

claude_desktop_config.json(macOS에서는 일반적으로 ~/Library/Application Support/Claude/claude_desktop_config.json, Windows에서는 %APPDATA%\Claude\claude_desktop_config.json)에 다음을 추가하세요:

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

/path/to/bosch_config.json을 실제 bosch_config.json 경로(자매 Python CLI 도구의 bosch_camera login으로 생성)로 바꾸세요. 서버는 로컬 stdio 하위 프로세스로 실행되므로 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 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

릴리스 내역

  • v0.1.0 — 개념 문서 + 스켈레톤 서버, 모든 도구가 정의만 되고 아직 구현되지 않음(NotImplementedError 반환) ✅

  • v0.2.0 — 8개 도구 모두 연결: 읽기 도구(list, status, events, snapshot) + 쓰기 도구(privacy, light, pan, notifications)를 sys.path 주입(옵션 C)으로 연결 ✅

  • v0.4.0 — 리소스(bosch://cameras, bosch://cameras/{name}/snapshot.jpg, bosch://cameras/{name}/events) + 프롬프트(daily-camera-summary, pre-leave-check) ✅

  • v0.5.0 — 스트리밍 가능한 HTTP 전송(--transport http|sse|stdio), pipx/uvx용 패키징, 신규 테스트 24개 ✅

  • v1.0.0 — 첫 안정 릴리스: 테스트 106개, GitHub Releases에 wheel + sdist 게시, PyPI 게시 대기 중 ✅

  • v1.1.0 — LAN 전용 미디어 경로(프라이버시 강화): bosch_camera_snapshot 및 신규 bosch_camera_stream_url이 LAN을 통해 카메라로 직접 접근하며, 미디어에 Bosch 클라우드 중계를 사용하지 않음. 테스트 113개. ✅

  • v1.2.0bosch_camera_maintenance_status 도구: 커뮤니티 RSS 피드에서 클라우드 유지보수 공지를 가져옴. 상태(active/scheduled/past/recent/unknown/idle), 제목, 시간 범위, 링크를 반환. ✅

  • v1.3.0 — LAN 폴백 기능 세트(HA 통합 v12.4.10/v12.4.11에서 이식): bosch_camera_lan_ping 도구(LAN의 모든 카메라에 TCP 프로브); bosch_camera_privacy_set / bosch_camera_light_setprefer_local=True(RCP-LAN 쓰기 경로, Gen2, 실패 시 클라우드 폴백); bosch_camera_maintenance_statusrecommended_action 필드(active일 때 "check_lan", scheduled일 때 "wait"). 테스트 173개. ✅

  • v1.3.3 — 오디오 get/set, 침입 감지 get/set, WiFi 정보(HA v12.7.0에서 크로스 포팅). 도구 16개. ✅

  • v1.3.4 — PTZ 명명된 프리셋(bosch_camera_pan preset=에서 home / left / right / back-left / back-right 허용); LAN-RCP 도구의 401 시 자격 증명 자동 순환(조용한 재시도, API 변경 없음). ✅

  • v1.3.6 — 2026-05-24 라이브 감사에서 나온 버그 수정 9건(카메라 목록은 항상 클라우드에서 실시간 조회, Gen1/Gen2 hw_version, UUID 해석, events 필드 매핑, audio camelCase, intrusion Gen2 게이트, 오류 코드, 스냅샷 타임스탬프, requirements-test.txt 미러). ✅

  • v1.4.0 — 신규 도구 4개: bosch_camera_mjpeg_snapshot, bosch_camera_onvif_scopes, bosch_camera_rcp_version, bosch_camera_feature_flags. _fetch_rcp_lan 비동기 헬퍼. 총 도구 20개. ✅

  • v1.5.0 — 신규 도구 11개 + 라이브 카메라 감사에서 나온 버그 수정 8건(하드웨어 4대, 4개 세대 모두): 사이렌 트리거, 모션 get/set, 녹화 get/set, 자동 추적 get/set, 프라이버시 사운드 get/set, unread-count, health-check-all, token-status. ✅

  • v1.5.1_fetch_rcp_lan 수정(존재하지 않는 aiohttp.DigestAuth를 사용해 onvif_scopes / rcp_version이 LAN에서 항상 실패했음. 이제 httpx.DigestAuth 사용). 테스트 커버리지 83→98%, 픽스처 정리, CI를 Node-24 네이티브 액션 메이저 버전으로 업그레이드. ✅

  • v1.5.2 — 의존성 정리: 사용하지 않는 aiohttp 런타임 의존성 제거(이제 테스트 전용), pyjwt>=2.13.0 / starlette>=1.0.1 보안 하한선 추가(pip-audit 클린), 잘못된 HTTP 스택을 목킹한 테스트 수정. ✅

  • v1.5.3 — 보안 패치: MCP 클라우드 세션에 Bosch 클라우드 CA 고정(CWE-295, GHSA-6qh5-x5m5-vj6v). OAuth 토큰에 대한 인접 네트워크 MITM 공격을 차단. 로컬 TOFU 고정은 변경 없음. ✅

  • v1.5.4 — 이벤트 타임스탬프가 더 이상 시간대 오프셋을 누락하지 않음: /v11/events가 오프셋을 포함한 타임스탬프를 반환(예: +02:00[Europe/Berlin]). 서버는 이제 19자로 잘라내는 대신 끝의 [zone] 접미사만 제거하여 명시적 UTC 오프셋을 보존. ✅

  • v1.5.5camera_events 리소스가 올바른 이벤트 분류를 위해 이제 eventType + eventTags를 사용. ✅

  • v1.6.0 — 신규 도구 2개: bosch_camera_audio_detection_get / bosch_camera_audio_detection_set — Gen2 Audio-Plus 카메라용 유리 파손음 + 연기/화재 경보음 감지(HA 통합 v14.2.0에서 크로스 포팅). 총 도구 34개. ✅

  • v1.7.0 — 제품군 동등성 마감(docs/family-parity-plan.md §2b): MCP-vs-HA/CLI 기능 격차를 해소하는 신규 도구 21개 — 모션 영역 get/set/clear, 프라이버시 마스크 get/set/clear, 자동화 규칙 list/add/edit/delete, 카메라 공유/친구 목록/invite/share/unshare/remove, 펌웨어 상태/설치(HA의 async_install_firmware 가드를 미러링), 사이렌 지속 시간, LED 조명 일정 get/set, 그리고 듣기 전용 오디오 인터콤 도구(카메라 마이크 → 발신자, RTSPS URL. 양방향 통화는 Bosch 클라우드 API에서 전혀 제공되지 않으며, 자매 CLI와 동일한 제약). CI 강화: 커버리지 게이트(--cov-fail-under=96), pip-audit(런타임 의존성만), pylint, codespell, CodeQL, gitleaks 시크릿 스캔, 의존성 검토 워크플로우 — HA 통합의 품질 게이트와 Gold 등급 동등성. 총 도구 55개. ✅

  • v1.7.2 — 문서 전용: 이 저장소의 통합 비교 표에 있는 Login 행 수정, 기능 변경 없음. ✅

릴리스

최신: v1.7.2 — 전체 노트는 GitHub 릴리스 페이지를 참조하세요: v1.7.2 릴리스 노트 →

전체 릴리스

GitHub Releases 페이지 — 노트 + 다운로드 가능한 자산이 포함된 모든 태그 버전

전체 기록

CHANGELOG.md — 동일한 노트, 저장소 내에서 열람 가능

통합 비교

Bosch Smart Home Camera 리버스 엔지니어링 API는 다섯 개의 자매 프로젝트를 통해 제공됩니다. 사용자 플랫폼에 맞는 것을 선택하세요.

기능

Home Assistant Integration

Python CLI Tool

ioBroker Adapter

MCP Server

Frontend (NiceGUI)

Node-RED

성숙도

v15.0+ — HA 품질 스케일 Platinum

v10.12+ 안정 (Mini-NVR BETA)

v1.8+ 안정 · npm

v1.7+ 안정 · PyPI

v0.4.0 alpha · PyPI

v0.4.0 alpha · npm

플랫폼

Home Assistant (HACS)

독립형 Python 3.10+ CLI

ioBroker (npm)

Python 3.10+ · pipx / uvx · stdio + streamable-HTTP (MCP 클라이언트용: Claude Desktop, Claude Code, 커스텀)

NiceGUI 웹 앱 · Python 3.10+

Node-RED 팔레트 · npm

로그인

OAuth2 PKCE (브라우저)

OAuth2 PKCE (브라우저)

OAuth2 PKCE (브라우저)

◑ CLI bosch_config.json 공유

◑ CLI bosch_config.json 공유

◑ CLI에서 리프레시 토큰

스냅샷

✅ 네이티브 Camera.image

snapshot 명령

✅ 파일 저장소 + base64 DP

bosch_camera_snapshot (LAN 전용)

✅ 라이브 + 이벤트 폴백

snapshot 노드

라이브 RTSP 스트림 (LAN)

✅ HA Stream 컴포넌트 통해

✅ ffmpeg/RTSPS 출력

✅ TLS 프록시 → 로컬 RTSP

bosch_camera_stream_url (LAN 전용, 클라우드 릴레이 없음)

◑ 내부 (go2rtc)

stream-url 노드 (URL만)

WebRTC (1초 미만 지연)

✅ 통합 go2rtc 통해

(v10.6.0) live --webrtc

✅ go2rtc 통해 (그 외 스냅샷)

듀얼 스트림 URL (메인 + 서브)

sensor.bosch_<n>_stream_url + _sub (v12.4.0, 카메라별 옵트인)

info 둘 다 표시 · live --sub (v10.5.0)

stream_url + stream_url_sub (v0.5.3 실험적)

bosch_camera_stream_url — 메인 스트림만

(서브 스트림만)

◑ URL만 — 서브 옵션 없음

외부 레코더 (BlueIris, Frigate)

✅ go2rtc 통해

✅ stdout 파이프

✅ Digest 자격 증명 URL + LAN 바인드 옵션

✅ URL 반환, 다운스트림 ffmpeg / go2rtc에 전달

stream-url → 다운스트림 연결

프라이버시 모드

✅ 스위치 엔티티

✅ 명령

✅ DP

bosch_camera_privacy_set (prefer_local 통한 LAN 폴백)

✅ 토글

privacy 노드

전면 스포트라이트 (Gen1/Gen2)

✅ 조명 엔티티

✅ 명령

✅ DP

bosch_camera_light_set (LAN 폴백)

(2단계 스텁)

bosch-camera-light 노드 (v0.3.0-alpha)

RGB 월워셔 (Gen2 Outdoor II)

✅ RGB 지원 조명

◑ 켜기/끄기만 — RGB 없음

✅ 색상 + 밝기 DP

(켜기/끄기만 — RGB 미노출)

◑ 켜기/끄기 + 강도만 — RGB 없음 (v0.3.0-alpha)

패닉 알람 사이렌

✅ 버튼 엔티티 (Gen2 Indoor II)

✅ 명령 (Gen2 Indoor II만)

✅ DP

bosch_camera_siren_trigger (Gen2 Indoor II만)

✅ 트리거 + 지속 시간 (Gen2 Indoor II만)

펌웨어 업데이트

✅ 업데이트 엔티티 + Repairs 수정 흐름, 설치 버튼 (v14.4.10)

✅ 상태 + 설치 (v10.11.0)

✅ 펌웨어 상태 + 설치 트리거, 쓰기 잠금 가드 (v1.8.0)

✅ 상태 + 설치 도구 (v1.7.0)

◑ 읽기 전용 상태 표시, 설치 동작 없음

✅ 상태 + 설치 노드 (v0.4.0-alpha)

이미지 180° 회전

✅ 스위치

✅ DP

모션 / 사람 / 오디오 이벤트

✅ FCM 푸시 + 폴링 폴백

watch 명령만 (이벤트 명령 제거됨)

✅ FCM 푸시 + 폴링 폴백

bosch_camera_events (온디맨드 풀)

◑ 풀 전용 이벤트 테이블

event 노드 (폴)

모션 엣지 트리거 상태

binary_sensor.motion

n/a

motion_active DP (v0.5.3)

n/a (요청-응답, 구독 없음)

모션 시 자동 스냅샷

✅ Camera 엔티티 새로고침

n/a

last_event_image base64 기록 (v0.5.3)

n/a (백그라운드 루프 없음)

합성 모션 트리거 (외부 센서)

✅ 서비스

n/a

✅ DP

모션 영역 / 프라이버시 마스크

✅ 읽기 + 쓰기

✅ 읽기 + 쓰기

✅ 읽기 + 쓰기 (v1.8.0)

✅ get / set / clear (v1.7.0)

(아직 비주얼 편집기 없음)

자동화 규칙 / 일정

✅ 읽기 + 쓰기

✅ 읽기 + 쓰기

✅ 전체 CRUD (v1.8.0)

✅ list / add / edit / delete (v1.7.0)

✅ 전체 CRUD (list/add/edit/delete)

조명 일정

✅ 읽기 (서비스 통한 쓰기, Gen1 Eyes Outdoor만)

✅ 읽기 + 쓰기

✅ 읽기 (Gen1 전용, v1.2.0)

✅ get / set (v1.7.0)

✅ 읽기 + 쓰기 (실외 Eyes 카메라)

클라우드 클립 다운로드 (기록 ~30일)

✅ Media Browser 통해

(보류 — 아직 커뮤니티 요청 없음)

(의도적으로 미노출 — 대용량 페이로드)

(CLI 사용)

◑ 이벤트 페이로드의 clip_url

미니 NVR (로컬 녹화)

✅ 연속 + 이벤트 버퍼링, 링 버퍼 프리롤 (v11.2.0 BETA → v14.7.0 모드)

◑ 이벤트 트리거 세그먼트 먹싱, 프리롤 링 없음 (v10.7.0 BETA)

(자격 증명 없는 RTSP 엔드포인트 통해 외부 레코더에 위임)

(NVR 개념 없음)

◑ 연속만, 이벤트 버퍼링 없음 (v0.4.0-alpha)

bosch-camera-nvr-record 노드 통해 연속만 (v0.4.0-alpha)

SMB / NAS 클립 업로드

(v10.7.0 BETA)

카메라 공유 (친구)

✅ 서비스 (share / invite / list)

✅ 명령

✅ share / invite / remove (Gen2만, v1.8.0)

✅ list / invite / share / unshare / remove (v1.7.0)

✅ list/invite/remove/share/unshare

팬 / 틸트 (360° Gen1)

✅ 서비스

✅ 명령

pan_position DP

bosch_camera_pan

✅ 라이브 API에 연결된 슬라이더

이름 지정 팬 프리셋 (홈 / 왼쪽 / 오른쪽 / 뒤-왼쪽 / 뒤-오른쪽)

✅ 옵트인 선택 엔티티

pan --preset 플래그

pan_preset DP

bosch_camera_pan preset=

양방향 오디오 / 인터콤

✅ 명령

◑ 듣기 전용 bosch_camera_intercom_open (v1.7.0)

이벤트 시 웹훅 전달

✅ 서비스 + 옵트인 옵션

watch --webhook URL

✅ MQTT 브리지 통해

(요청-응답 모델)

MQTT 이벤트 브리지 (모션 / 오디오 / 사람)

n/a (HA 이벤트 버스 네이티브)

n/a (단일 실행)

✅ 관리자 구성

n/a

Apple HomeKit (HA Core 브리지 통해)

✅ 문서화됨

n/a

n/a

n/a

n/a

n/a

스냅샷 스케줄러 / 타임랩스

✅ examples/ YAML

✅ cron + ffmpeg 예제

✅ Blockly 예제

n/a

네이티브 대시보드 카드 / 위젯

✅ Lovelace 카드 2개 (단일 + 그리드)

n/a

✅ vis-2 위젯 2개 — BoschCamera + BoschOverview 멀티캠

n/a

(그 자체로 웹 대시보드)

백그라운드 탭에서도 유지되는 PiP

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

n/a (UI 없음)

✅ 자체 PiP + 프리즈 복구, Web-Worker 하트비트 (v1.7.2/v1.7.3)

n/a (UI 없음)

✅ 재연결 타임아웃 + 프리즈 복구 (v0.4.0-alpha)

n/a (UI 없음)

클라우드 릴레이 REMOTE 폴백

✅ LAN 연결 불가 시 자동 전환

✅ 원격 모드

(설계상 LOCAL 전용)

(미디어 LAN 전용; 상태/이벤트는 클라우드 통해)

◑ CLI 상속

◑ REMOTE 옵트 (수동)

브라우저 기반 관리 / 구성 UI

✅ HA Config Flow

n/a (CLI)

✅ JSON 구성 탭

n/a (LLM 매개; CLI / MCP 클라이언트 통한 구성)

✅ 설정 페이지

◑ 편집기 구성 노드

UI 언어

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 (UI 없음 — LLM이 프런트엔드)

◑ 백엔드 i18n · UI 대부분 EN

n/a (영어 전용)

범례: ✅ 지원됨 · ❌ 지원되지 않음 / 계획되지 않음 · n/a 이 플랫폼에는 적용되지 않음.

네 프로젝트 모두 동일한 리버스 엔지니어링 Cloud API + RCP 프로토콜 연구를 공유하지만, 각자 독립적으로 발전합니다. Home Assistant 연동이 가장 기능이 완전한 레퍼런스 구현체이며, Python CLI는 가장 저수준/스크립팅 가능한 인터페이스이고, ioBroker 어댑터는 VIS 대시보드와 Blockly 자동화를 대상으로 합니다. MCP 서버는 MCP 클라이언트(Claude Desktop, Claude Code, 커스텀)에게 자연어 카메라 제어를 위한 선별된 LAN 우선 도구 표면을 노출합니다.


관련 프로젝트

Bosch Smart Home Cameras를 위한 5가지 구현체 계열 중 하나입니다(알파 프론트엔드 포함):

Implementation

Repo

Status

🏆 Home Assistant Integration

Bosch-Smart-Home-Camera-Tool-HomeAssistant

v16.0.1 · HA Quality Scale Platinum · 프로덕션 준비 완료

🐍 Python CLI

Bosch-Smart-Home-Camera-Tool-Python

v10.12.3 · Mini-NVR + SMB 업로드(BETA) · LAN 폴백(ping / --local) · PTZ 프리셋 · 웹훅 전달 · 캡처 / 연구 / 독립 실행형

🟢 ioBroker Adapter

ioBroker.bosch-smart-home-camera

v1.8.3 · 안정적 · npm · privacy-toggle Digest 로테이션 · MQTT 브리지 · PTZ 프리셋 · VIS-2 위젯(BoschCamera + BoschOverview)

🤖 MCP Server (이 저장소)

Bosch-Smart-Home-Camera-Tool-MCP

v1.7.2 · cred-rotation · PTZ 프리셋 · TOFU 인증서 고정 · 클라우드 CA 고정 (CWE-295) · LAN-ping + prefer_local · zones/masks/rules/friends/firmware-install · Claude Code / Claude Desktop 통합

🔴 Node-RED nodes (alpha)

Bosch-Smart-Home-Camera-Tool-NodeRED

v0.4.2-alpha · 이벤트 / 스냅샷 / 프라이버시 / 설정 / 그 외를 위한 노드

또한: Bosch Smart Home Camera — Python Frontend (NiceGUI) — v0.4.2-alpha (대시보드 + 카메라 상세 + 설정) — 커뮤니티 관심 환영

HA는 레퍼런스 구현체로 유지됩니다 — 기능은 먼저 HA에 반영되며, Python CLI, ioBroker Adapter, MCP Server는 시간이 지나면서 따라잡습니다.


라이선스

MIT — 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