Skip to main content

MailFlat — MCP server

Native Model Context Protocol server for MailFlat. Gives Claude Desktop, Cursor, or any MCP client real inbox tooling: create inboxes, wait for OTP codes, send DKIM-signed mail, and clean up when the task is done. Each address is permanent and stays until you delete it; only the messages inside expire, on a retention window you choose. Built on the mailflat Python SDK.

Run

# zero-install, isolated (recommended)
MAILFLAT_API_KEY=mf_live_… uvx mailflat-mcp

# or install it
pipx install mailflat-mcp
MAILFLAT_API_KEY=mf_live_… mailflat-mcp

Claude Desktop / Cursor config

Add to claude_desktop_config.json (or your client's MCP config):

{
  "mcpServers": {
    "mailflat": {
      "command": "uvx",
      "args": ["mailflat-mcp"],
      "env": { "MAILFLAT_API_KEY": "mf_live_..." }
    }
  }
}

Get your API key from the MailFlat dashboard → Agents.

Tools (14)

Tool What it does
create_inbox(prefix?, label?, retention_hours?) Open an inbox; retention_hours capped by your plan
list_inboxes() All inboxes this key can see
read_messages(address, direction="in") Read messages; received mail by default (out / all for the rest)
wait_for_otp(address, timeout=30) Poll until an OTP arrives, then return it
wait_for_message(address, timeout=30) Poll until a new message arrives; ignores mail you sent
send_email(address, to, subject?, body?, html?) Send a DKIM-signed mail from the inbox
reply(address, message_id, body?, html?) Answer a message in the same conversation (threading headers filled in)
wait_until_sent(address, message_id, timeout=60) Did that mail actually go out? A timeout means still queued, not lost: do not send again
mark_read(address, message_id) Mark one message read so later polls skip it
burn_inbox(address) Delete every message but KEEP the address
delete_inbox(address) Delete the inbox and its messages
delete_message(address, message_id) Delete one message; the inbox itself stays
list_calendar_events(address, include_cancelled=False) Meetings from calendar invitations the inbox received, with this inbox's answer (my_status)
rsvp_to_invite(address, event_id, response, comment?) Accept, decline or tentatively accept; the organizer's calendar shows the answer

Reads return received mail by default. Without that, sending to a peer and then waiting for the reply would immediately match your own outgoing message.

Configuration

  • MAILFLAT_API_KEY — your account API key (required).
  • MAILFLAT_API_URL — override the API base (default https://mailflat.net; for self-hosted / BYOD).

Registry

mcp-name: io.github.MailFlat/mailflat-mcp

This line is the ownership marker the official MCP Registry looks for in a PyPI package's README. It proves the same owner controls both the GitHub namespace and the published package, so the registry entry cannot be claimed by someone else. Keep it in sync with the name field in server.json; a test asserts the two match.

License

MIT

Metadata

Release files for mailflat-mcp 0.10.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for mailflat-mcp 0.10.0
File Size Uploaded
mailflat_mcp-0.10.0.tar.gz 10.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for mailflat-mcp 0.10.0
File Interpreter ABI Platform
mailflat_mcp-0.10.0-py3-none-any.whl Python 3 none any Details

Total release size: 22.9 kB

Release files / mailflat_mcp-0.10.0.tar.gz

Download URL mailflat_mcp-0.10.0.tar.gz
Size 10.9 kB
Tags Source
SHA-256 checksum
How to use checksums
2d35858bd3f8be9cbde240550b8761bbcd2888ebb2c0ceb81083788bce9590d1
BLAKE2b-256 checksum
How to use checksums
5f7cdb3aec8fc62b0bab125ca7dcd3fc87d6ac73e2dee50210a292201ae3f55f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.11.9

Release files / mailflat_mcp-0.10.0-py3-none-any.whl

Download URL mailflat_mcp-0.10.0-py3-none-any.whl
Size 12.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
d06aa67460e5bccd3d4fcffa75924aafcc717195175ab84fd4dd2b6d9faf0316
BLAKE2b-256 checksum
How to use checksums
55ba165898ad6ef7895045ae57679fa6767a24f986d0b745eef1a671702b56e3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.11.9

Release history Release notifications | RSS feed

0.12.0

2 release files

0.11.0

2 release files

This release

0.10.0 This release

2 release files

0.9.2

2 release files

0.9.1

2 release files

0.9.0

2 release files

0.8.2

2 release files

0.8.1

2 release files

0.8.0

2 release files

0.7.0

2 release files

0.6.0

2 release files

0.5.0

2 release files

0.4.0

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.3

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page