Most "AI agent" demos end the same way: a polished GIF, a cloud OAuth screen, and a quiet feeling that you just offered your personal life to a vendor with a Series B and a privacy policy written by optimism.
I didn't want that. I wanted something boring and local: my Mac already has Messages, Mail.app, Notes, and WhatsApp Desktop. The data is already on disk. The missing piece was a clean interface agents (and humans) could call without inventing a new SaaS for every surface.
So I built a small family of local-first tools — each one a real CLI first, with an MCP server on top when an agent needs it:
imsg-mcp— Messages (imsg/imsg-mcp)imail-mcp— Apple Mail (imail)inotes-mcp— Apple Notes (inotes)wa-mcp— WhatsApp Desktop (wa/wa-mcp)
Naming rule of thumb: if it's in the agent family, it's *-mcp. The one intentional exception is bitbucket-cli — that's a plain Bitbucket CLI (bb), not an MCP product, and I left it alone on purpose.
Why this made my life easier (not just cooler)
Before these existed, "ask an agent to help with my day" meant copy-paste hell:
- Screenshot a thread
- Paste into chat
- Hope the model doesn't invent a reply I never sent
- Manually do the actual send/archive/note myself
Now the loop is shorter. An agent can search recent messages, list chats, draft with context, and — only when I allow it — send. Mail can be organized by rules that respect account walls. Notes stay out of the way unless I explicitly ask. WhatsApp is available without me becoming a human USB cable between Desktop and Claude.
The win isn't "full autonomy." The win is less friction between intention and action.
How a Tuesday Actually Works Now
CLI first, MCP second
Every tool in this family is usable without an LLM. That sounds obvious until you watch teams build "MCP-only" products that are unusable from a shell and impossible to script.
My rule: if I can't do the bulk job with a one-liner, the MCP surface is a toy.
Examples of the boring jobs that actually matter:
- Organize Mail across accounts without mixing work and personal
- Search Messages for a phone number or thread without opening the UI
- Dump a Notes folder for a weekly review
- List WhatsApp chats when I'm mid-task in a terminal
MCP is for the agent loop. CLI is for the operator loop. Both matter. If you only ship MCP, you optimized for demos. If you only ship CLI, you optimized for humans who already know what they want. Shipping both is valuemaxxing.
What I actually enforced
A few non-negotiables that kept this from becoming vaporware:
- Typer CLIs with real
--helpand JSON-friendly output where it counts - Coverage gates (the family sits at a ≥90% pytest bar — not vibes)
- Publish paths that a stranger can install (PyPI
mac-*names today; Homebrew tap formulas) - Hard walls between accounts (especially mail — work Exchange stays work)
If your agent tool can't be installed with pipx / Homebrew and exercised without an IDE, it isn't a tool yet. It's a README with aspirations.
The emotional part (yes, really)
The first week I used imail organize across every Mail.app account, I felt something rare in AI tooling: relief. Not "wow, AGI." Just fewer tabs, fewer half-done cleanup Saturdays, fewer "did I reply to that?" loops at 11pm.
Same with Messages. Being able to say "find the last thread with X" without scrolling like a raccoon in a dumpster is a quality-of-life upgrade that compounds. Tiny minutes, every day.
That's the product thesis: local-first agent tools should feel like better plumbing, not a new religion.
What's next
I'm still iterating on packaging (PyPI naming got rate-limited — classic), docs, and the portfolio comparison matrix so people can see what these tools do versus cloud-only alternatives. The code is open. The binary names stay short (imsg, imail, inotes, wa). The philosophy stays simple:
Agents should meet your life where it already lives.
If you want the short version: I stopped waiting for a vendor to "integrate my life" and wrote the adapters myself. It made my days quieter. That was the whole point.
