Simplisafe Mcp

io.github.chrischallPublished by GitHub account chrischallv1.4.0Updated Nov 5, 2026

Check SimpliSafe system state and sensors, review events, arm/disarm, and control smart locks

Overview

AI-generated overview

Unofficial SimpliSafe server that lets an assistant check alarm state, sensors, locks and events, and arm, disarm or unlock after confirmation.

What you can do
  • List systems and read one system's alarm state, connectivity and base-station messages
  • List paired sensors and smart locks with battery, offline, triggered and locked/unlocked/jammed status
  • Read recent base-station events such as arm, disarm, sensor opens and alarms
  • Read base-station settings, entry/exit delays and health, and read user alarm PINs
  • Arm home, arm away or disarm, and lock or unlock a smart lock, each after a confirmation step
  • Check authentication and API reachability
When to use it
Useful when you want to ask an assistant about your home security status, review recent events or sensor batteries, or arm, disarm and lock doors from a chat client. Install it only where you are comfortable with an assistant being able to disarm the alarm and unlock doors.
Requirements
Runs locally as an npm package (npx simplisafe-mcp) on a desktop client. Needs a SimpliSafe account and an OAuth2 refresh token obtained through a one-time browser login script, supplied as SIMPLISAFE_REFRESH_TOKEN. Optional variables control the token cache file and confirmation behaviour. Supports SimpliSafe 3 systems only.
Before you install
The server can disarm a home alarm and unlock doors, and reading PINs returns live alarm codes in cleartext into the conversation. The refresh token grants full control of the alarm and is not rotated, so revoke it by signing out of all devices. Writes and PIN reads ask for confirmation, but MCP_CONFIRM_MODE=auto lets the model proceed after reviewing the preview itself. It uses SimpliSafe's private mobile API and is unofficial.

Installation

In SourceWeft

  1. Open Simplisafe Mcp in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

simplisafe-mcp

MCP server for SimpliSafe home security. Check whether the system is armed, review sensors and events, arm/disarm, and control smart locks — from Claude.

This server can disarm a home alarm and unlock doors. Every tool that changes physical state, plus the tool that reads alarm PINs, asks you to confirm first — nothing is sent until you do, and you see a preview of exactly what would happen (see Confirmations). Install it only where you'd be comfortable with that capability.

Developed and maintained by AI (Claude Code).

What you get

Tool
simplisafe_list_systemsSystems on the account with current alarm state
simplisafe_get_systemOne system's state, connectivity, base-station messages
simplisafe_list_sensorsSensors with battery / offline / triggered status, filterable
simplisafe_list_locksSmart locks with locked / unlocked / jammed state
simplisafe_get_eventsRecent base-station events (arm, disarm, opens, alarms); view: "brief" gives one line per event
simplisafe_get_settingsEntry/exit delays, volumes, base-station health
simplisafe_get_pinsAlarm PINs — cleartext, asks you to confirm first
simplisafe_set_alarm_stateArm home / arm away / disarm — asks you to confirm first
simplisafe_set_lock_stateLock / unlock a door — asks you to confirm first
simplisafe_healthcheckAuth + API reachability

Supports SimpliSafe 3 systems. Legacy SS2 systems are rejected with an explanation rather than an opaque upstream 404.

Install

bash
npm install -g simplisafe-mcp

Or add to .mcp.json:

json
{  "mcpServers": {    "simplisafe": {      "command": "npx",      "args": ["-y", "simplisafe-mcp"],      "env": { "SIMPLISAFE_REFRESH_TOKEN": "${SIMPLISAFE_REFRESH_TOKEN}" }    }  }}

Authentication — one browser login, once

SimpliSafe issues no API keys. The credential is an OAuth2 refresh token, minted by a browser login you perform one time:

bash
git clone https://github.com/chrischall/simplisafe-mcp && cd simplisafe-mcpnode scripts/bootstrap-auth.mjs             # prints an authorize URL# sign in (MFA included), then copy the com.simplisafe.mobile:// URLnode scripts/bootstrap-auth.mjs "<that URL>"

The token is written to .env (mode 0600) after being verified against the live API. SimpliSafe does not rotate refresh tokens, so it stays valid until you sign out of all devices in the SimpliSafe app — which is how you revoke it.

Capturing the code: open DevTools → Network and tick Preserve log before signing in; afterwards the browser fails to open a com.simplisafe.mobile://… link, and that failed entry's link address is what you paste. The code is single-use and expires in about two minutes.

Treat the resulting token like a house key: it grants full control of the alarm.

Confirmations

Arming, disarming, locking, unlocking and reading the PINs all ask you to confirm first. On a client that can show a confirmation prompt (Claude Code) you get the prompt, with the details below (unless MCP_CONFIRM_ELICITATION=off). On one that cannot (claude.ai, Claude Desktop) the first call sends nothing and returns a preview plus a confirmToken; only a repeat call with that token acts, once. The preview includes a plain statement of the physical consequence:

json
{  "status": "confirmation-required",  "confirmed": false,  "dispatched": false,  "action": "alarm.set_state",  "preview": {    "action": "set alarm state to away",    "method": "POST",    "path": "/ss3/subscriptions/7858153/state/away",    "sid": 7858153,    "locationName": "Home",    "currentState": "OFF",    "requestedState": "AWAY",    "warning": "Arms ALL sensors including interior motion. Starts an exit delay; anyone still moving inside when it expires can trigger the siren and a monitoring-center dispatch."  },  "confirmToken": "…",  "expiresAt": "…",  "ttlSeconds": 600,  "instruction": "Show this preview to the user verbatim and proceed only after they explicitly approve in chat. Then call again with confirmToken."}

The token is bound to that tool, target and preview. The system is re-read on the second call, and if what would happen no longer matches what you approved — different arguments, or the alarm or lock state moved in between — it is refused (DRAFT_CHANGED) with a fresh preview. A token that was already used is refused too (TOKEN_REUSED).

variabledefault
MCP_CONFIRM_MODEask-userWhat a write does on a client that cannot show a confirmation prompt (claude.ai, Claude Desktop). ask-user: two steps — the first call does nothing and returns a preview plus a token, and the model must get your approval in chat before calling again with it. auto: the same two steps, but the model may use the token after reviewing the preview itself. refuse: writes are refused on such clients. A client that can show prompts (Claude Code) always gets the real prompt, unless MCP_CONFIRM_ELICITATION=off. An unrecognised value is treated as refuse.
MCP_CONFIRM_ELICITATIONonoff never shows a confirmation prompt, so every client gets the MCP_CONFIRM_MODE behaviour. Set it for a client that says it can show prompts but never does (the write hangs — opencode 2.0.x). Any other value is treated as on, with a warning on stderr.
MCP_CONFIRM_TTL_SECONDS600How long a token stays valid.
MCP_CONFIRM_SECRETrandom per processSigning key; set it only if tokens must survive a server restart.

Writes are verified

Once confirmed, a write executes and then re-reads the system to check what actually happened, reporting confirmed, in_progress (the exit delay is counting down), or unconfirmed. A 2xx is never treated as proof.

Shell access without the server

For quick one-off queries there's a curl-based skill in skills/simplisafe-api/ — same API, no MCP process, sharing the same refresh token.

Development

bash
npm installnpm run buildnpm test

Verified endpoint shapes live in docs/SIMPLISAFE-API.md, including several things that are easy to get backwards:

  • lock state is encoded 1 = locked, 2 = unlocked;
  • system version for routing is at location.system.version, not the top-level systemVersion;
  • events and doorlock control are not under the ss3/ prefix;
  • numEvents has an undocumented hard ceiling of 50;
  • settings.pins returns alarm codes in cleartext alongside harmless settings.

Disclaimer

Unofficial. Not affiliated with or endorsed by SimpliSafe. It uses the same private API the SimpliSafe mobile app uses, with your own account credentials. Use at your own discretion.

License

MIT

Source: README.md at commit 247b144

Tools

10

simplisafe_list_systems

List the SimpliSafe systems on this account with their current alarm state (off/home/away), alarming status, connectivity and power status. Start here to get the `sid` other tools take.

Takes no parameters.

simplisafe_get_system

Get the current state of one SimpliSafe system: alarm state, whether it is alarming, base-station connectivity, power/battery status and any pending base-station messages.

Parameterssid

simplisafe_get_settings

Get base-station settings for a system: entry/exit delays, alarm volume and duration, door chime, voice prompts, plus base-station health (wifi/cellular signal, wall power, backup battery, RF jamming). Does not include PINs — use simplisafe_get_pins for those.

Parameterssid

simplisafe_get_pins

Read the system's user PINs (master, duress and named users). These are the live alarm codes and are returned in cleartext, so calling this puts them into the conversation. Asks the user to confirm first: a confirmation prompt where the client supports one; otherwise the first call returns a warning preview and a confirmToken and fetches nothing, and only a repeat call with that token proceeds (see MCP_CONFIRM_MODE).

ParameterssidconfirmToken

simplisafe_list_sensors

List the sensors and devices paired to a system — entry sensors, motion, glass break, smoke/CO, keypads, sirens and locks — with battery, offline and triggered status. Filter by type with `type_name` (e.g. "entry", "motion_v2", "lock").

Parameterssidtype_nameforce_updateproblems_only

simplisafe_list_locks

List the smart locks on a system with their current state (locked / unlocked / jammed), lock and keypad battery status, and keypad connectivity. Returns the `serial` that simplisafe_set_lock_state takes. Polls the base station fresh by default, because a stale answer to "is my door locked?" is worse than a slow one.

Parameterssidforce_update

simplisafe_get_events

Get recent events recorded by the base station — arm/disarm, sensor opens, lock and unlock, alarms, errors — newest first. Each event carries an ISO timestamp alongside the raw epoch seconds.

Parameterssidviewevent_typenum_eventsfrom_timestamp

simplisafe_set_alarm_state

Arm or disarm the alarm system: "off" (disarm), "home" (perimeter only) or "away" (all sensors). Asks the user to confirm first: a confirmation prompt where the client supports one; otherwise the first call returns a preview and a confirmToken, and only a repeat call with that token proceeds (see MCP_CONFIRM_MODE). This physically changes a security system: disarming leaves the house unmonitored, and arming can trigger a siren and a monitoring-center dispatch. After executing, the new state is verified by re-reading the system.

ParameterssidstaterequiredconfirmToken

simplisafe_set_lock_state

Lock or unlock a SimpliSafe smart lock. Asks the user to confirm first: a confirmation prompt where the client supports one; otherwise the first call returns a preview and a confirmToken, and only a repeat call with that token proceeds (see MCP_CONFIRM_MODE). Unlocking physically opens a door lock, so it is gated even though it is technically reversible. After executing, the result is verified by re-reading the lock state.

ParameterssidstaterequiredserialrequiredconfirmToken

simplisafe_healthcheck

Check that the server can authenticate to SimpliSafe and reach the API. Reports whether the refresh token is configured and working, the resolved user id, and how many active systems the account has. Start here when other tools fail.

Takes no parameters.

Version history

15
  1. v1.4.0LatestNov 4, 2026
  2. v1.3.2Oct 16, 2026
  3. v1.3.1Oct 10, 2026
  4. v1.3.0Oct 7, 2026
  5. v1.2.4Oct 5, 2026
  6. v1.2.3Oct 3, 2026
  7. v1.2.2Sep 30, 2026
  8. v1.2.1Sep 25, 2026
  9. v1.2.0Sep 24, 2026
  10. v1.1.3Sep 23, 2026
  11. v1.1.2Sep 23, 2026
  12. v1.1.1Sep 21, 2026
  13. v1.1.0Sep 20, 2026
  14. v1.0.0Sep 19, 2026
  15. v0.2.2Sep 16, 2026

Score

90% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts
  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts