InnerOS Ambient Guardian
Built for the Alexa+ platform, enabling voice-driven interaction with the guardian through a simulated Alexa+ experience with typed and spoken input for ambient security monitoring.
Integrates with Ring devices via an event-adapter architecture and safe simulator, allowing the AI guardian to receive and correlate camera/security events for context-aware monitoring and response.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@InnerOS Ambient GuardianIs everything okay at home? Show me recent events."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
InnerOS Ambient Guardian
Alexa becomes the voice of a local-first AI guardian that explains home incidents, prepares bounded actions, requires separate human approval, and returns verified evidence.
Built for Build, Ship, Shape: Amazon Developer Hackathon 2026.
Primary track: Alexa+
Mini challenges: AWS Builder, Open Source
Ring track: the private Ring app and its official Amazon Vision Playground flow are
OFFICIAL_SANDBOX_VERIFIED; the official sandbox returned a device, status, capabilities, and a WHEP session. Physical-device/provider-live evidence remains unclaimed, and local demo events stay visiblySIMULATED.
Why this exists
Smart-home systems produce many alerts but still make a person answer the hard questions manually: What happened? Is it important? What should happen next? Did the action actually work?
Ambient Guardian gives Alexa a safe orchestration surface through an official MCP server and a signed Custom Skill gateway. It correlates property context, reasons locally, prepares only allowlisted actions, waits for a separate human approval, executes through an adapter, verifies observed state, and records evidence. Direct Alexa+ MCP remains explicitly CODE_READY / NOT_PROVEN until the account and device entitlement are demonstrated.
The core invariant is deliberately strict:
No human approval, no consequential physical action. Low-risk reversible ambience commands are separately allowlisted. No verification, no success claim.
The public hackathon build controls only a simulator. Private customer/device configuration is not copied into this repository.
Related MCP server: ProvenDone
What is functional
Official MCP Python SDK v2 server at
/mcpStreamable HTTP transport, modern MCP protocol with backward compatibility for the hackathon-required
2025-11-25generationMCP tools for status, events, time-bounded incident reconstruction, local reasoning, action preparation, evidence, and integration diagnostics
No
approve_actionMCP tool. A model can prepare an action but cannot approve its own requestAlexa+ web simulation with typed input, browser speech recognition, and spoken responses
Signed physical-Alexa Custom Skill gateway with Amazon certificate, timestamp, Skill ID, Account Linking, Voice ID/PIN, and a shared-secret loopback trust boundary
Live Evidence Console for utterance, intent, consulted systems, Incident Receipt, prepared action, approval, PBX result, evidence digest, and REAL/SIMULATED/CODE_READY labels
Ring-compatible normalized demo ingress for safe public testing, plus a separate official Ring/Amazon Vision adapter with fail-closed signed webhook verification. Demo events remain explicitly SIMULATED unless a real provider session/signature is verified.
Optional Home Assistant + Alexa Devices bridge for real Echo/Fire endpoints, read-only alarm context, owner-authorized speech, and allowlisted reversible lighting; direct Alexa+ MCP Toolkit linking remains separate and unclaimed
InnerOS DMX / Art-Net bridge to the existing loopback-only lighting engine for allowlisted colors/scenes Alexa does not natively understand
Real Home Assistant timeline for alarm zones, lights, solar/battery transitions, and network availability, kept separate from truth-labeled Ring demo events
Two-phase UniFi restart for explicitly allowlisted devices: Alexa prepares; InnerOS sends an authenticated WhatsApp approval; only the owner confirmation executes and checks state/uptime evidence
Local Qwen/vLLM reasoning using an OpenAI-compatible endpoint
Deterministic local fallback if the LLM is unavailable
AWS Strands Agents SDK as a real read-only orchestration/synthesis layer against the local OpenAI-compatible Qwen endpoint
One-time expiring approval tokens, replay protection, and concurrent-consumption protection
Post-action verification evidence
Persistent Home Flight Recorder / Incident Receipts backed by SQLite, with immutable incident IDs and SHA-256 digests recoverable across sessions
Action evidence digests linked back to the latest incident receipt
VoiceOps/PBX callback preparation linked to the exact Incident Receipt that existed at PREPARE time; VoiceOps alone owns the private extension and SIP/PBX credentials
Docker packaging and CI that boots the actual server and connects with a real MCP HTTP client
Architecture
Physical Echo Custom Skill / Judge Mode / entitlement-gated Alexa+ MCP
|
v
Official MCP Python SDK v2 / Streamable HTTP
|
+--> read-only context tools
| |
| +--> AWS Strands Agent --> local OpenAI-compatible Qwen/vLLM
| +--> deterministic local fallback
|
+--> prepare_action (never executes)
|
v
INNEROS OWNER WHATSAPP APPROVAL
(not an MCP/web tool)
|
v
adapter.execute()
|
v
verify()
|
v
evidenceThe Strands agent is intentionally created without physical-action tools. It can synthesize context and recommendations; deterministic application code owns action parsing, authorization, execution, and verification.
More detail: docs/ARCHITECTURE.md and docs/SECURITY.md.
Quick start
python -m venv .venv
source .venv/bin/activate
python -m pip install -r requirements.txt
PYTHONPATH=src python -m ambient_guardian.official_serverOpen:
UI:
http://127.0.0.1:8787/Health:
http://127.0.0.1:8787/healthMCP:
http://127.0.0.1:8787/mcp
Run all tests:
PYTHONPATH=src pytest -qRun an actual Streamable HTTP MCP client against the running server:
PYTHONPATH=src python scripts/http_mcp_smoke.pyLocal-first Qwen / vLLM
Point the app at any OpenAI-compatible local endpoint:
export INNEROS_LOCAL_LLM_URL=http://127.0.0.1:8000
export INNEROS_LOCAL_LLM_MODEL=QuantTrio/Qwen3-Coder-30B-A3B-Instruct-AWQSensitive local addresses are runtime configuration, never committed to the public repository.
AWS Strands Builder path
Strands is installed as part of the standard project environment so the AWS Builder integration is reproducible. Enable it explicitly:
export AWS_STRANDS_ENABLED=1
export AMBIENT_GUARDIAN_STRANDS_PROVIDER=local-openai
export INNEROS_LOCAL_LLM_URL=http://127.0.0.1:8000
PYTHONPATH=src python scripts/strands_local_smoke.pyThe integration uses strands.Agent with strands.models.openai.OpenAIModel, pointed at the local vLLM OpenAI-compatible endpoint. Bedrock is an optional provider, not a dependency of the safety path.
Demo flow
The strongest Judge Mode path is a three-part story rather than a feature tour:
Home status: ask
Alexa, is everything okay at home?to prove read-only context.What happened at 3 AM?: the demo injects truth-labeled Ring-compatible events at 03:04, 03:07 and 03:11, then reconstructs the incident through the real normalized event pipeline and the read-only
incident_summaryMCP tool.Prepare lock: ask
Alexa, prepare to lock the front door. The system returns an expiring proposal withexecuted=false. Only the separate human approval surface may execute the bounded simulator action and emit verification evidence.PBX escalation: ask
Alexa, call me through my PBX and give me the incident reportfor the private softphone alias, orAlexa, ask Atlas Control to call my cell phone using Grandstreamfor the single owner-mobile alias. Both are prepare-only in Alexa; InnerOS sends WhatsApp approval, VoiceOps rejects supplied numbers, and a confirmed request records sanitized verification evidence.Governed UniFi restart: ask Alexa to restart an allowlisted UniFi device. Alexa only prepares it; InnerOS sends Confirm/Cancel to the enrolled owner's WhatsApp. Approval is durable, expires after a bounded interval, executes at most once, and sends verified completion back to WhatsApp.
The demo always distinguishes the SIMULATED Ring edge from the REAL MCP/runtime, temporal correlation, policy and evidence pipeline. The 3 AM scenario also writes a persistent Incident Receipt so the same incident can be recovered in a later session.
MCP tools
Tool | Mutates state? | Purpose |
| No | Current property summary |
| No | Recent normalized events |
| No | Reconstructs normalized activity around an ISO-8601 time window and records an immutable receipt |
| No | Lists durable incident receipts from current and prior sessions |
| No | Retrieves one persisted incident snapshot by receipt ID |
| No | Local-first safety answer |
| Proposal only | Creates an expiring bounded proposal |
| Proposal only | Prepares an owner PBX callback tied to the latest Incident Receipt; never places a call |
| No | Returns verified action evidence |
| No | Reports MCP/Strands/Ring/local model state |
There is deliberately no MCP execution/approval tool.
Alexa, PBX, and Ring readiness
The project reports each integration separately so a code-complete path is never presented as live evidence:
Physical Echo via Custom Skill: code-complete signed gateway at
/alexa/skill, with owner Account Linking and authenticated gateway-to-backend identity forwarding. It remainsCODE_READYuntil a physical request/response is captured.Direct Alexa+ MCP Toolkit: entitlement is
NOT_PROVEN; it is not claimed as LIVE.VoiceOps/PBX: the app sends only a stable server-side alias, never a number, extension, or SIP credential. After WhatsApp owner approval it calls the private VoiceOps contract and verifies the dispatch receipt.
voiceops.owner.mobileis limited to one preconfigured route-verified number; arbitrary and autonomous PSTN stay disabled. Simulator mode is explicitlySIMULATED.Ring: the official adapter targets
https://api.amazonvision.com/v1, verifies signed webhook ingress fail-closed, and normalizes JSON:API events. The official Ring Playground device/status/capabilities/WHEP path is verified. A physical device and signed live webhook remain unclaimed; local demo ingress is always labelledSIMULATED.
Alexa speech from Ambient Guardian is intentionally not an MCP tool. It requires a separate owner-authorized HTTP route, an explicit enable flag, and an allowlisted Home Assistant notify entity.
Docker
docker build -t inneros-ambient-guardian .
docker run --rm -p 8080:8080 inneros-ambient-guardianSee docs/DEPLOYMENT.md for production host/origin settings.
Environment variables
Variable | Default | Purpose |
|
| HTTP port |
| unset | OpenAI-compatible local model base URL |
| Qwen3-Coder AWQ | Model ID |
|
| Placeholder key for compatible local servers |
|
| Enables Strands read-only synthesis |
|
|
|
| unset | Host allowlist for public MCP deployment |
| unset | Browser origin allowlist when needed |
| unset | Home Assistant base URL for the optional real-home bridge |
| unset | Home Assistant bearer token; runtime secret, never commit |
| unset | Selected read-only alarm entity for Guardian context |
|
| Enables the owner-only physical Alexa speech route |
| unset | Comma-separated allowlist of HA |
|
| Enables Ring event speech through the allowlisted Echo target |
|
| Separately enables truth-labelled simulated Ring alerts |
|
| Allowlisted Echo endpoint for Ring alerts |
|
| Fixed language for deterministic Ring announcements |
|
| Displays official Playground evidence separately from physical/provider-live proof |
| unset | Required owner token for owner-only Home Assistant routes |
| unset | Shared runtime secret authenticating the loopback Custom Skill gateway to |
|
| Fail closed with an Alexa |
|
| Owner Account Linking validation endpoint |
|
| Truth flag set only after physical Echo evidence exists |
|
| Truth flag set only after real Alexa+ MCP entitlement is proven |
| unset | Private/loopback VoiceOps runtime; enables real mode when configured |
| unset | Optional runtime-only VoiceOps bearer token; never exposed in UI/MCP/Git |
|
| Enables bounded, reversible Home Assistant light control |
| unset | Comma-separated allowlist of Home Assistant |
| unset | Comma-separated HA Recorder entities; a trailing |
| unset | JSON object mapping history entity IDs to safe spoken labels |
|
| Timezone used for deterministic overnight/today summaries |
|
| Canonical installed battery profile name |
|
| Installed nominal battery energy used for runtime estimates |
|
| Conservative reserve target; runtime never plans to the BMS cutoff |
|
| Conservative DC-to-AC efficiency used in spoken estimates |
| existing Pi01 SQLite path | Read-only solar flight recorder used for exact outage start and aggregate consumption |
|
| Allowlisted Echo targets for outage, restoration, and bounded status alerts |
|
| Spoken language for energy alerts |
|
| First local hour in which periodic outage status is allowed |
|
| Local hour when periodic outage status enters critical-only quiet mode |
|
| Daytime interval for spoken status while an outage remains active |
|
| Remaining-runtime threshold that may override quiet mode once |
|
| Battery threshold that may override quiet mode once |
| user state directory | Durable transition, interval, and critical-threshold deduplication state |
|
| Maximum age reused across serialized USB/HID inverter reads |
|
| Enables only the two-phase owner-approved UniFi restart path |
| unset | JSON allowlist mapping spoken aliases to HA restart, status, and uptime entities |
|
| Bounded post-approval state/uptime verification window, maximum 90 seconds |
|
| Uses the existing authenticated InnerOS WhatsApp owner lane for governed UniFi and VoiceOps decisions |
|
| Expiry for a prepared physical action |
|
| Durable, single-consumer action state and replay protection |
| InnerOS platform path | Existing approval runtime; no WhatsApp credentials are copied into this project |
| platform virtualenv Python | Executes the narrow local approval adapter |
| unset | Loopback-only InnerOS DMX API base URL |
|
| Enables bounded DMX/Art-Net lighting control |
| unset | Comma-separated safe scene allowlist |
| unset | Comma-separated target allowlist such as |
Testing and evidence
CI performs all of the following from a clean environment:
installs declared dependencies,
compiles source/tests/scripts,
runs the full pytest suite,
boots the official MCP + web server,
connects to
/mcpwith the official MCP client over real HTTP,verifies tool discovery and calls,
builds the Docker image.
The security regression suite includes unlock/negation parsing, token expiration, replay, concurrent approval consumption, durable action recovery, and WhatsApp approve/reject behavior.
Final-sprint reproducible result on 2026-10-13: 112 tests passed, compileall passed, and scripts/runtime_smoke.py connected to the running Streamable HTTP server with the official MCP client. Tool discovery confirmed that MCP exposes preparation but no approval, execution, or speaker tool.
Hackathon evidence
Amazon integration notes:
docs/AMAZON_INTEGRATIONS.mdFriction log:
docs/FRICTION_LOG.mdDemo outline:
docs/DEMO_SCRIPT.mdDevpost draft:
devpost-submission.md
Links
Devpost: https://devpost.com/software/inneros-ambient-guardian
Repository: https://github.com/Rafa-Innerchispa/inneros-ambient-guardian-amazon-2026
License
MIT. See LICENSE.
Hackathon Judge Mode
Judge Mode preserves three deterministic scenarios and adds a Live Evidence Console. The final physical video path uses the Custom Skill when physical verification is available; the browser remains the reproducible fallback and never impersonates an Echo.
Open the web UI and use the three Judge Mode scenarios:
Home status — read-only property context.
What happened at 3 AM? — truth-labeled Ring-compatible demo events -> real temporal incident reconstruction.
Prepare lock — bounded proposal with
executed=falseuntil a separate human approval step.
Truth boundary shown in the UI:
REAL: MCP Streamable HTTP runtime and Guardian policy/state.
CODE_READY: signed Alexa Custom Skill gateway, until physical proof is captured.
CODE_READY / NOT_PROVEN: direct Alexa+ MCP entitlement.
OFFICIAL_SANDBOX_VERIFIED: the Amazon Ring Playground returned a sandbox device, online status, AVC 1080p capabilities, and a successful WHEP motion session.
SIMULATED: the event injected into Atlas remains a truth-labelled Ring-compatible fixture. A real owner account, physical device, and signed webhook are still pending.
SAFE: MCP/model cannot approve or execute its own physical action.
See docs/JUDGE_DEMO.md and docs/DEMO_SCRIPT.md for the reproducible judge flow and recording script.
This server cannot be deployed
Maintenance
Related MCP Connectors
Bounded authorization and independently verifiable execution evidence for agents.
Preflight, approve, and prove consequential agent actions with signed evidence and x402 tools.
Context and control for any AI. Agent identity, scoped access, and proof across tools.
Machine-verifiable authorization checks for autonomous AI agents.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables autonomous AI governance and pre-action verification for Alexa+ agents, blocking high-risk operations like unlocking doors or financial transactions while grounding decisions in verifiable policy and AWS Bedrock reasoning.MIT
- AlicenseNot gradedqualityBmaintenanceEnables Alexa+ assistants to run multi-step personal-ops tasks and produce machine-checkable receipts with per-step evidence, so actions are only claimed done when actually verified.MIT
- AlicenseNot gradedqualityCmaintenanceEnables Alexa+ to correlate Ring-style physical perimeter events with Wi-Fi router telemetry to detect stealth cyber-physical threats like wardriving. It also supports threat analysis, honeypot containment, device trust/blocking, guest access, and rendering a 3D security dashboard.MIT
- AlicenseNot gradedqualityBmaintenanceEnables an Alexa+ console to check suspicious calls for coercion, arbitrate simulated household emergencies with reversible safety actions, and compile timestamped insurance claim dossiers over a self-hosted Streamable HTTP MCP endpoint.1MIT