Physical Device Agents Need Dead-Man Switches
By wGrow Project Team ·
When Agents Meet Actuators: The Physical Cost of Software Habits
An API timeout is a log entry. A robotic arm retrying a failed liquid transfer is a bent probe, a stripped stepper coupling, and a technician’s afternoon. Anthropic’s Model Context Protocol (MCP) makes it straightforward to wire an LLM into lab instruments and manufacturing cells, not just chat windows and IDE plugins — and once that wiring reaches an actuator, an agent’s risk profile changes in a way most teams haven’t priced in yet. MCP standardises how an LLM talks to a local tool or an IoT server — which is good, in the abstract. But standardisation also makes it trivially easy to wire natural-language reasoning straight to a motor driver. Software engineers are bringing software habits into a domain where those habits break things. Literally.
In software, a failed call gets retried. In hardware, a retry loop is maintenance paperwork with velocity.
The Cost of a Software Retry in Physical Space

Agents lean on retry loops because most software failures are transient — a dropped connection, a rate limit, a malformed token the model can just regenerate. None of that logic transfers to a robotic arm or a syringe pump. A failed physical action rarely means “try the same command again and it’ll probably work.” Usually it means something is blocking the tool path, the calibration state has drifted, or a consumable ran out.
An agent that treats a stalled gripper the way it treats a 429 response will just keep sending the same move command. Each retry assumes the physical world matches the agent’s internal state. It doesn’t check. It can’t check — not without instrumentation that most integrations skip, because nobody thought to add it for a chatbot. So the agent loops, the actuator keeps trying to close on an object that isn’t there, and either the motor stalls against its own current limit or something physical gives first.
Writing “stop if resistance is detected” into the system prompt does not fix this. A system prompt is a suggestion the model is statistically likely to follow. Physics does not accept suggestions. You cannot prompt-engineer your way out of a stripped gear.
Lessons from WaterDoctor Pump Loops
We ran into a version of this problem before MCP even existed, on the automated flushing routines we built for WaterDoctor’s water-quality deployments. The control loop watched a sensor array for turbidity anomalies and triggered a flush cycle when readings crossed a threshold. Straightforward enough — until the turbidity sensor itself degraded and started reporting a flat “dirty” signal regardless of actual water state.
The controller had no way to distinguish “the water is dirty” from “the sensor is lying.” Its only instruction was: if turbidity is high, flush. With no ceiling on how many times it could act, it kept opening the flush valve and running the pump, chasing a clean reading that a broken sensor was never going to give it. Left unaddressed, that pattern floods a tank or burns out a pump motor before anyone notices the sensor, not the water, was the actual problem.
The fix we shipped wasn’t smarter logic in the loop. It was less authority in the loop. We added a hard ceiling on flush cycles per time window and a maximum cumulative pump runtime, enforced outside the decision logic that read the sensor. Once that ceiling triggered, the system stopped acting and threw a fault requiring a human look — regardless of what the sensor kept reporting. The lesson generalises directly to agentic control: a control loop chasing a bad signal with no cap on retries is exactly what happens when you let an MCP-connected agent decide, unbounded, how many times it gets to try something on real equipment.
The Classic PLC Pattern for Agentic Infrastructure
Industrial automation solved this decades before anyone had a chat interface for a robot. In a standard PLC architecture, the supervisory system — the control room, the SCADA layer, whatever sits at the top — issues requests. It does not have final authority over the actuator. The local controller enforces the physical bounds: max travel, max torque, max cycle count. The control room can ask for something outside those bounds. It will not get it.
That separation is the whole point: the layer that talks to people (or, now, to a model) is allowed to be wrong, slow, or confused. The layer that talks to the actuator isn’t, because it’s the last thing standing between a command and a physical consequence.
MCP server implementations for hardware need to adopt this pattern. In the early hardware-facing implementations I’ve reviewed, that failure boundary is usually left to ordinary software validation instead — the same retry-and-recover logic teams already lean on for APIs. The agent is the control room. The MCP server sitting between the agent and the driver is the network layer — and it’s the wrong place to stop trusting the model, but the right place to stop trusting the model’s output. If your architecture lets an LLM’s tool call reach a motor controller without a bounds check that’s independent of anything the model decided, you’ve skipped the one step PLC engineers considered non-negotiable back in the 1980s. That’s not a new-technology problem. That’s architectural negligence dressed up in a new SDK.
Hardware Interrupts

Software validation is necessary. It is not sufficient — software can be wrong in ways hardware faults simply can’t be talked out of. A physical device agent needs a cutoff that lives below the software stack entirely: a limit switch on a stepper motor, a float switch in a tank, a thermal relay on a pump’s power line. These are copper, not code.
The property that matters is that the agent cannot negotiate with them. An open circuit doesn’t parse a retry request. When an actuator crosses a physical bound, the interrupt breaks the circuit and the motor stops, independent of whatever the agent’s context window currently believes about the state of the world. It’s the same design decision behind every industrial e-stop button: it has to work even if the software controlling the machine has malfunctioned entirely.
None of this is free. Hardware interrupts add cost, and retrofitting them onto equipment that wasn’t designed with a cutoff point is genuinely harder than bolting on a software check — which is probably why so many MCP-to-hardware integrations skip it. But that difficulty is a reason to plan for it early, not an excuse to leave it out.
Deterministic Middleware Validation
Between the LLM and the copper sits the layer that should catch most problems before they ever reach a hardware interrupt: deterministic middleware in the MCP server itself. When an agent sends a payload to move an arm 50mm on an axis, that request needs to be checked against a fixed state table — known-safe travel range, known-safe force, a hard retry counter — before it’s forwarded to the driver. None of that logic should live in the model’s instructions. All of it should live in code that doesn’t care what the model “meant.”
If a request exceeds the bounding box, or the retry counter for a given action hits its limit, the middleware drops the command and returns a fatal error — not a soft warning the agent might reason its way past. The response the agent gets in that case should be “halt, flag a human.” Never “try again with adjusted parameters.” An agent that can talk itself into a workaround is an agent that will eventually talk itself into damage.
Where This Goes
MCP’s spread into lab and manufacturing tooling is likely to keep accelerating, because the standardisation genuinely solves an integration problem. What it doesn’t solve — and isn’t meant to solve — is the trust boundary between a language model’s output and a physical actuator. That boundary has to be built by whoever wires the MCP server to the driver, and it needs two layers, not one: deterministic bounds-checking in software, and a non-bypassable interrupt in hardware, in that order, with hardware getting final say. Neither layer guarantees nothing will ever go wrong — equipment fails in ways no bounds table anticipates — but together they shrink the blast radius from “damaged instrument” down to “logged fault.”
If you’re deploying an agent that can move something in the physical world, assume the model behind it is a reckless operator who’ll retry a bad action just as happily as it retries a bad API call. Then wire the safety limits so that assumption never gets the chance to matter.