Skip to main content
Glama

camsentry-mcp is an unofficial MCP server that gives a local model eyes on Wyze cameras. Ask it "is there a package at the front door?" or "arm the cameras and tell me if anyone shows up", and it answers from what your cameras actually recorded.

NOTE

Independent project. camsentry-mcp is not affiliated with, endorsed by or sponsored by Wyze Labs, Inc. "Wyze" and "Wyze Cam" are trademarks of Wyze Labs, Inc., used here only to say which cameras this software works with.

Why this one

Related MCP server: DesktopBridge

How it works

flowchart LR
    M[Local model + MCP client] -- stdio --> S[camsentry-mcp]
    S -- session tokens from OS keychain --> W[Wyze cloud: cameras, events, event images]
    S -- frame --> V[Local vision model, 127.0.0.1]
    S -. optional live frame .-> B[wyze-bridge on your LAN]

Quick start

You need: Python 3.12 – 3.14, a Wyze account, Ollama (or another local model server), and an OS keychain (Windows Credential Manager, macOS Keychain, or GNOME Keyring / KWallet on Linux).

1. Install

pipx install git+https://github.com/14manj01/camsentry-mcp
# or: uv tool install git+https://github.com/14manj01/camsentry-mcp

2. Get a small vision model

ollama pull gemma3:4b

It analyses a frame in about a second on a GPU that fits it.

3. Connect your Wyze account

Create a free API key at https://developer-api-console.wyze.com/#/apikey/view, then:

camsentry-mcp login

You are asked for your Wyze email, password, API Key ID and API Key (and a 2FA code if your account uses one). They are exchanged for session tokens, the tokens are saved to the OS keychain, and the password and API key are discarded.

camsentry-mcp status    # checks the Wyze session, the vision model and your settings
camsentry-mcp logout    # revokes the session with Wyze and deletes the tokens

4. Add it to your MCP client

Any MCP client that launches stdio servers works (LM Studio, Jan, Open WebUI via mcpo, ollmcp, …). There are no secrets in this block, so it is safe to share or commit:

{
  "mcpServers": {
    "camsentry": {
      "command": "camsentry-mcp",
      "env": {
        "CAMSENTRY_VISION_MODEL": "gemma3:4b",
        "CAMSENTRY_ARMED_HOURS": "22:00-06:00"
      }
    }
  }
}

5. Ask

Check my cameras.

Is there a package at the front door?

Arm the cameras and tell me if anyone shows up.

Tools

Tool

What it does

list_cameras

Cameras on the account, online state, arming state.

get_events

Recent motion/sound events with Wyze's own AI tags. No vision model involved.

watch_cameras

Events that are new since the previous call, each analysed by the local vision model. Poll this to "watch".

analyze_camera

Run the vision model on one frame: counts of people and packages, pets, intruder alerts, one-line summary.

view_camera

Return the frame itself, for chat models that accept images.

set_armed

on / off / schedule: when a detected person counts as an intruder.

{
  "camera": "Front Door",
  "source": "event",
  "time": "2026-03-01T23:41:07-06:00",
  "wyze_tags": ["Person"],
  "armed": true,
  "detection": {"people": 1, "pets": [], "packages": 1, "suspicious": false, "suspicious_reason": "", "summary": "A courier places a box on the porch."},
  "alerts": [
    {"type": "person", "reason": "1 visible; tagged by Wyze"},
    {"type": "package", "reason": "1 visible"},
    {"type": "intruder", "reason": "person detected while armed"}
  ]
}

How alerts are decided

Alert

Raised when

🧍 person

The local vision model sees a person, or Wyze tagged the event.

🐾 pet

The local vision model sees an animal, or Wyze tagged the event.

πŸ“¦ package

The local vision model sees an unattended parcel, or Wyze tagged the event.

🚨 intruder

A person is detected while the system is armed (CAMSENTRY_ARMED_HOURS, or set_armed on), or the vision model flags clearly suspicious behaviour such as testing a door or taking a package.

Wyze's own tags need Cam Plus; the local model does not.

NOTE

Detection quality is that of the vision model you choose. With the defaultgemma3:4b, "is there a person / pet / package" is dependable but head counts in busy scenes are approximate. Larger models are not required and can be too slow: if the model does not fit in GPU memory a frame can take minutes, longer than most MCP clients wait for a tool.

WARNING

Treat alerts as a prompt to look, not as proof. Do not rely on this project as your only security system.

Settings

All optional, all non-secret environment variables.

Variable

Default

Meaning

CAMSENTRY_VISION_URL

http://127.0.0.1:11434/v1

OpenAI-compatible endpoint of your local vision model server.

CAMSENTRY_VISION_MODEL

gemma3:4b

Vision model name on that server.

CAMSENTRY_ALLOW_REMOTE_VISION

unset

Set to 1 to allow a vision endpoint that is not on this machine. Camera frames will be sent there.

CAMSENTRY_ARMED_HOURS

unset

Daily local-time window, e.g. 22:00-06:00, in which any person is an intruder.

CAMSENTRY_BRIDGE_URL

unset

Base URL of a wyze-bridge, e.g. http://192.168.1.50:5080, for live frames.

Out of the box the server sees what the Wyze app's Events tab sees: a still image per motion event. Without Cam Plus, Wyze limits how often cameras record events.

For a frame from right now, run a wyze-bridge on your network and set CAMSENTRY_BRIDGE_URL. analyze_camera and view_camera then use a live snapshot when no event_id is given. If the bridge has BRIDGE_AUTH enabled, store its credentials in the keychain with camsentry-mcp bridge-auth.

Security

IMPORTANT

No secret is ever written to a file by this project, so there is nothing to accidentally commit. Plaintext and missing keychains are refused rather than silently used.

  • πŸ–ΌοΈ Camera frames go to the vision endpoint only. It must be a loopback address unless you opt in.

  • 🧱 Tools take camera names and event ids, never URLs or file paths.

  • 🧹 Error messages and logs are scrubbed of tokens, pre-signed image URLs and raw Wyze responses.

  • πŸ”Ž This repository runs secret scanning (gitleaks) on every push and pull request.

The full threat model, including what a manipulated model can and cannot do, is in SECURITY.md.

Limitations

  • Wyze has no official public API. This project uses the community wyze-sdk, which can break when Wyze changes their service.

  • Wyze's Terms of Service restrict third-party applications that interact with their service. Using this project with your account may breach those terms, and Wyze could suspend the account. That risk is yours to weigh.

  • watch_cameras is a poll, not a push: the model (or your client's scheduler) has to call it.

  • set_armed and the "already reported" memory of watch_cameras reset when the server restarts.

Development

git clone https://github.com/14manj01/camsentry-mcp
cd camsentry-mcp
python -m venv .venv
.venv/bin/pip install -e ".[dev]"      # Windows: .venv\Scripts\pip
.venv/bin/pytest

Tool Schema Changelog

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

Loading tool schema changelog…

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      C
      maintenance
      Enables local macOS automation via the Model Context Protocol, allowing file operations, system monitoring, shell commands, clipboard access, and screenshots with configurable security restrictions.
      14
      MIT
    • A
      license
      B
      quality
      B
      maintenance
      Lets Claude Code see through and control local ONVIF/RTSP IP cameras entirely on your own network: snapshots with cropped region detail, baseline comparison and change detection, short video recordings, pan/tilt movement and preset management. It can also add, rename and remove cameras without hand-editing config, keeping credentials out of the conversation and each camera's media in its own folder.
      21
      3
      MIT