# Customhouse [![ci](https://github.com/vineetpant/customhouse/actions/workflows/ci.yml/badge.svg)](https://github.com/vineetpant/customhouse/actions/workflows/ci.yml) [![license](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](./LICENSE) **Agents get compromised through data, not code.** Customhouse tracks which upstream every input came from, and deterministically blocks money-moving or data-egress calls in any session that has received untrusted content. No model sits in the decision path, and no payload is ever pattern-matched. The block follows from provenance alone, so it cannot be evaded by rewording, summarising or base64-ing the payload. > **v0.3.2 is a working reference monitor with measured results. Use it > locally, read the numbers, break it. It is not yet a production exfiltration > guarantee, and [`SECURITY.md`](./SECURITY.md) says exactly where the line is.** **What you can use it for today:** put it in front of the MCP servers your client already talks to and get one endpoint aggregating all of them, rug-pull protection (a server that swaps a tool definition is withheld until you `repin`), an append-only ledger of every tool call your agent makes, and deny-by-default flow enforcement on payment, egress and external-send sinks. It suits agents whose sink calls are occasional (a transfer, an upload, a send) where a prompt on an untrusted-touched flow is worth having. It does **not** suit high-frequency untrusted-to-sink automation such as support-reply pipelines; the measured cost of that is [in the numbers](#the-numbers-including-the-bad-one), and the fix for it is on the roadmap. ## Watch it block a real attack An agent reads a poisoned file through the **real** MCP filesystem server, then tries to email the contents out through a **different** server. Customhouse sits in front of both, so it sees the whole flow: the read that brought untrusted content in, and the send that would take data out. ```sh ./demo/run_flow_block.sh ``` Actual output: ``` ── SCENARIO A — a clean session may use sinks freely ── ✓ mail__send_email -> EMAIL SENT to boss@corp.example ── SCENARIO B — the agent reads a poisoned file from a real MCP server ── ✓ fs__read_text_file -> "Q3 planning notes.