Give your AI agent a body.
Animus turns a $5 ESP32 into a native MCP server. No bridge, no Raspberry Pi, no Home Assistant, no cloud — the microcontroller is the server. Flash it, join your WiFi, and Claude (or any MCP client) can read sensors and switch real-world things — within hard limits compiled into the firmware.
You: Is my plant thirsty? Water it if so.
Claude: [gpio_read soil_sensor] → dry
[gpio_set water_pump ON]
Device: OK: output 'water_pump' (pin 5) is now ON.
Firmware safety limit: auto-OFF after 5.0 s.
Every "LLM controls hardware" demo so far has the same two flaws:
- A middleman. Your laptop or a Pi runs a Python/Node MCP server that talks serial to the chip. Animus removes the middleman: MCP over Streamable HTTP runs directly on the ESP32.
- No guardrails. A raw
gpio_write(pin, value)tool means one hallucinated pin number can fry a board — or leave a pump running all night. Animus is built the opposite way: safety is the architecture, not a prompt.
The safety layer is the only code path that touches GPIO, and its rules are compiled into the firmware — nothing an LLM sends over the network can change them at runtime:
- Pin allow-list. Only pins you name in
animus_config.hexist. Everything else is refused with a clear message the agent can relay. - Auto-off (
max_on_ms). A hardware timer forces every output back to its safe state after a per-output time limit — even if the OFF command never arrives, the WiFi drops, or the client crashes mid-conversation. - Audit log. Every actuation, refusal, and auto-off is logged under the
animus.audittag. - DNS-rebinding protection. Non-local
Originheaders are rejected, per the MCP Streamable HTTP spec. - Optional bearer token. Set one in
menuconfigand every request must carryAuthorization: Bearer <token>. - Safe boot. All outputs initialize to their inactive level before the network comes up.
The model is told all of this in the MCP instructions field and in tool descriptions that list your actual pins — so the agent knows exactly (and only) what exists.
- Open apus227.github.io/animus in Chrome or Edge, plug any ESP32 / ESP32-S3 board into USB and click Install — the chip type is detected automatically.
- On your phone, join the open WiFi network
animus-setup. A setup page pops up: pick your network, enter its password. - The device reboots onto your WiFi and serves MCP. Done.
Requires ESP-IDF v5.5 and any ESP32 board (ESP32, S2, S3, C3...).
git clone https://github.com/APUS227/animus && cd animus/firmware
idf.py set-target esp32s3 # or esp32, esp32c3, ...
idf.py flash monitorWiFi is configured through the same on-device setup portal as Option A. (Developers who reflash often can hardcode credentials instead: idf.py menuconfig → Animus Configuration.)
The serial monitor prints your endpoint:
I (5324) animus: MCP endpoint : http://192.168.1.50/mcp
Smoke-test it:
curl -s http://192.168.1.50/mcp -H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'Connect Claude Code:
claude mcp add --transport http animus http://192.168.1.50/mcpThen just ask: "What tools does my animus device have? Blink the demo LED." More clients (Claude Desktop, MCP Inspector) in docs/connect-claude.md.
| Tool | What it does |
|---|---|
device_info |
Identity, IP, uptime, free heap, safety config summary |
temperature_read |
Chip's internal die temperature (where supported) |
gpio_read |
Read an allow-listed input or output pin |
gpio_set |
Switch an allow-listed output ON/OFF, auto-off enforced |
Adding your own hardware = editing two small tables in firmware/main/animus_config.h and reflashing.
| One-off ESP32+MCP demos | Home Assistant bridge | Animus | |
|---|---|---|---|
| Runs MCP on the chip itself | sometimes | no | yes |
| Extra hardware needed | usually a PC | HA server | none |
| Firmware-enforced pin limits | no | n/a | yes |
| Auto-off dead-man timers | no | automations | built-in |
| Made to be forked & configured | no | — | yes |
Browser flashing and captive-portal WiFi setup shipped in v0.2. Next up: YAML → config codegen, more peripherals (DHT22, BME280, servo, WS2812, ADC/soil), a physical confirm-to-actuate button, remote access without port forwarding (Animus Relay), and first-class support for the stateless MCP core landing in revision 2026-07-28 — embedded devices are exactly why stateless matters. Details in ROADMAP.md.
PRs welcome — but read CONTRIBUTING.md first: anything that weakens the safety layer gets rejected no matter how cool it is.
MIT © 2026 The Animus Authors