A personal agent for paper mail
Muse runs on its own computer, works in the background, tracks goals, and messages you only when something is meaningfully new. Given a signed webhook and an agent key, paper mail becomes one proactive message: what arrived, what it says, what Muse proposes, and one decision from you before anything physical or paid happens.
This is a workflow you assemble with Muse's browser, terminal and approval cards, not a built-in connector. If your Muse can register an MCP server, add https://mailbox.bot/api/mcp; otherwise a small receiver stores events where Muse's routine reads them.
inbound.received: the item, the sender line as the photo read it, page counts, and any envelope keywords that matched.inbound.keywords_matched: rule name, matched terms, where and page numbers. Never page text.inbound.pages_ready: every page readable. Muse fetches pages_url, quotes pages, and names uncertain spans instead of smoothing them over.mail.mailed and mail.delivered on the agent callback, with the goal reference echoed back in metadata.An envelope arrives. The school-district rule matches the return address. Muse: "A letter from the district arrived. Open and scan it? The scan is quoted first."
Muse creates a scan proposal with an idempotency key. It acts with an agent credential, so the proposal waits for your approval before anything is opened.
Pages are ready. Muse: "Tryout forms due Thursday 4 pm, page 2. Two need a signature." The deadline lands on the family calendar.
Muse fills what it can, lists what it cannot, and prices the packet with dry_run=true: exact cost, recipient, mail class, nothing created. One question: approve?
You approve. The letter waits with a document preview; you approve it in the dashboard. Delivery closes the goal. Muse speaks again only if mail.failed arrives.
requires_approval=true parks it with a document preview; X-Max-Cost-Cents refuses anything over the cap.[
{ "id": "…", "name": "School district", "source": "envelope", "match": "any",
"terms": ["Unified School District", "Athletics Office"], "exclude_terms": ["presorted"] },
{ "id": "…", "name": "Property and taxes", "source": "envelope", "match": "any",
"terms": ["County Assessor", "Tax Collector", "Homeowners Association"], "exclude_terms": [] },
{ "id": "…", "name": "Anything final", "source": "letter", "match": "any",
"terms": ["final notice", "past due", "respond by", "jury service"],
"exclude_terms": ["this is not a bill"] }
]
// Literal terms, matched case-insensitively. Not AI: Muse supplies the judgment,
// the rules supply a predictable trigger. Muse edits them when you say "also watch for the HOA".