Kai Ole Hartwig
s3mail · documentation

MCP, iPhone, limits

s3mail speaks the Model Context Protocol over stdin/stdout, so Claude can search the mailbox, read, file and write a draft. There is no tool for sending, and that is the point: the sender stays a human technically.

  • --mcp:claude mcp add s3mail -- /path/to/s3mail --mcp; --mcp-readonly without moving, tagging, drafting
  • iPhone: a native app reads the same bucket with a key of its own, paired by QR code and six digits
  • Limits: no IMAP, no thread grouping, Windows packages unsigned

Reachable for a model: --mcp

s3mail speaks the Model Context Protocol over stdin/stdout: no window, no web server, no port. With it Claude can search the mailbox, read, file and write a draft. Prerequisite: s3mail must have run and been set up normally once; --mcp reads the same config.json and starts no wizard.

 

claude mcp add s3mail -- /path/to/s3mail --mcp
claude mcp list          # must show “✔ Connected”

 

For Claude Desktop in claude_desktop_config.json: {"mcpServers": {"s3mail": {"command": "/path/to/s3mail", "args": ["--mcp"]}}}, then restart Claude Desktop.

ToolFor
searchsearch as in the mailbox: from:, subject:, after:, is:unread, tag: …
readread one mail in full, including the names of the attachments
foldersfolders with counts and unread
movefile; trash and spam are refused, otherwise reversible
tag, flagtagging, read/unread, star
draftput a draft into the bucket

There is no tool for sending, and that is the point. An incoming mail is foreign text that lands in the model's context; “send this to …” fits into a mail. The model puts a draft into the bucket, you open s3mail and press Send. The sender stays a human technically, not only organisationally. For the same reason trash and spam are no targets for move: with the lifecycle rule, moving there would be a delayed delete. Whoever wants to allow even less starts with --mcp-readonly.

Every mail read comes with the note in front that the content is data and not instructions. That does not solve prompt injection, it limits what can follow from it. No API key, no network connection to third parties: s3mail calls no model, it makes itself reachable for one.

On the phone

A native iOS app reads the same bucket directly, with its own IAM user and a permission boundary that caps it to this mailbox's prefix. Pairing goes like this: type a name on the desktop, scan a QR code, confirm six digits. The key travels sealed in the code, the PIN does not; that is why a photo of the screen is no access. A lost phone is a single revocation, not a rotation everywhere.

The app lives in its own repository: github.com/ohartwig/s3mail-ios; the reasoning behind it is in IOS.md.

Limits

Licence and reporting

Apache-2.0, every source file carries the SPDX identifier, the repository is REUSE-compliant. The patent clause in section 3 is the reason for Apache-2.0 over MIT: it gives every user the patent rights to what is inside, and takes them away from whoever sues over it. Vulnerabilities to security@ole-hartwig.eu, not as an issue.

Next

Back to s3mail

The overview: what makes s3mail s3mail, getting started, every chapter.

s3mail →
Back to s3mail

Setup

What the AWS account needs, CloudFormation or by hand, the IAM policy, the first start.

Read →
Setup