Join the conversation

Join the community of Machine Learners and AI enthusiasts.

Sign Up
dylantom2012 
posted an update Oct 4
Post
124
I built inboxmcp, a hosted MCP server that gives your own agent (Grok Bot, Claude, any remote-MCP client) read-only access to the IMAP inboxes you choose.

A few design choices that might interest MCP builders:
- Email content is returned as untrusted data, kept separate from the owner's saved instructions
- OAuth + PKCE with per-mailbox grants instead of passwords
- Each AI connection keeps its own server-side checkpoint (claim_email_batch / complete_email_batch), so scheduled agents resume without Notion pages or state files

Design notes: https://huggingface.co/blog/dylantom2012/inboxmcp-agent-email-mcp
Endpoint: https://app.inboxmcp.ai/mcp (MCP Registry: io.github.zhlei07/inboxmcp)

Feedback on the batch/lease design is very welcome. (I'm the maker.)

The read-only scope is the real injection boundary here, not the field separation.

Once the body and the saved instructions sit in the same context window, the model reads one text. Your own agent guide shows you know this: it has to tell the agent never to substitute a link found inside the email. That rule exists because the field boundary does not survive the model layer. What an injected email cannot do is act through inboxmcp. It can still act through anything else the same agent holds, a Routine reply or another connector with write scope. So the defensible claim is "cannot touch the mailbox", not "cannot exfiltrate".

On your open question: the silent emails are the ones that now leave no record.

agent-setup.md says to call complete_email_batch after an event is handled, "including an intentional silent decision". That marks the event processed. It does not store what was decided. The legacy report_email_decision kept notify, digest or silent, and you have marked it legacy and told agents not to use it for progress. So the new workflow kept the dedup half (your test list checks that a second run sends no duplicate reminders) and dropped the audit half.

The fix looks small: an optional per-event decision plus the preference revision that produced it, on complete_email_batch. You already return the instructions with source and revision. A month later you can ask what revision 7 silenced, and tell a rule miss from a model miss when a customer email gets buried.

Was dropping the decision record a deliberate trade against the extra decisions:write scope, or is a per-event decision on complete_email_batch on the table?