What I learned building Pmail, an agentic email client
Notes from putting Claude in charge of an inbox — what tools to give it, what tools to absolutely not give it, and why the boring product surface matters more than the model.
Pmail started as a curiosity project: how far can you push an LLM as the primary surface for email.
Tools the agent gets
- search_inbox(query) — semantic + keyword.
- read_thread(id) — full thread context.
- draft_reply(thread_id, intent) — drafts but does not send.
- schedule_send(draft_id, when) — sends with a 60s undo.
- label, archive, snooze — cheap operations.
Tools the agent does not get
Anything that touches money, anything that messages a third party for the first time, anything that exposes credentials.
The RAG part is unglamorous
The hardest engineering was the embedding index — keeping it fresh as mail arrives, handling threading correctly.