tutamcp MCP Server

MCP server giving Claude access to Tuta mail, calendar, contacts and drive. Supports mail modes (dedicated/shared/folder), trusted sender filtering with E2E verification, and Docker-based setup.

Documentation

tutamcp

MCP server giving Claude access to a Tuta account: mail, calendar, contacts, and drive. Each module is enabled independently. Built on top of tutaproxy's TutaClient — no direct Tuta API calls.

30 MCP tools across 4 modules. Requires tutaproxy-public ≥ v1.3.10.

Quickstart — Docker

The easiest setup: no local dependencies beyond Docker. The image bundles tutaproxy at build time.

git clone https://github.com/peix2/tutamcp-public.git
cd tutamcp-public
docker build -t tutamcp .

Pin a specific tutaproxy release (default: v1.3.10):

docker build --build-arg TUTAPROXY_REF=v1.3.10 -t tutamcp .

Create a credentials file (chmod 600):

[email protected]
TUTA_PASSWORD=yourpassword

Register in Claude Code (.mcp.json or ~/.claude.json):

{
  "mcpServers": {
    "tutamcp": {
      "command": "docker",
      "args": [
        "run", "--rm", "-i",
        "-v", "/path/to/credentials.env:/creds.env:ro",
        "-e", "TUTAMCP_CREDENTIALS_FILE=/creds.env",
        "-e", "TUTAMCP_ENABLE_MAIL=1",
        "-e", "TUTAMCP_MAIL_MODE=dedicated",
        "-e", "[email protected]",
        "tutamcp"
      ]
    }
  }
}

Without Docker

Requires Python 3.11 and a local clone of tutaproxy-public.

git clone https://github.com/peix2/tutamcp-public.git
cd tutamcp-public
pip install --target=.venv/lib/python3.11/site-packages -r requirements.txt

Register in Claude Code:

{
  "mcpServers": {
    "tutamcp": {
      "command": "python3.11",
      "args": ["/path/to/tutamcp-public/run.py", "/path/to/tutamcp-public/server.py"],
      "env": {
        "TUTAPROXY_PATH": "/path/to/tutaproxy-public",
        "TUTAMCP_CREDENTIALS_FILE": "/path/to/credentials.env",
        "TUTAMCP_ENABLE_MAIL": "1",
        "TUTAMCP_MAIL_MODE": "dedicated",
        "TUTAMCP_OWNER_EMAIL": "[email protected]",
        "TUTAMCP_DOWNLOAD_DIR": "/tmp/tutamcp"
      }
    }
  }
}

For Claude Desktop, use the same block in ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows).

Configuration

See config.example.env for all variables. Key options:

Mail modes

ModeDescription
dedicatedAccount belongs to Claude only. Full access, send enabled by default.
sharedAccount shared with the user. Full read/write access; send policy controlled by TUTAMCP_MAIL_SEND.
folderShared account; Claude sees only the folder set in TUTAMCP_MAIL_FOLDER. Send is always reply-only.

Send policy

TUTAMCP_MAIL_SEND=reply_only — only tuta_mail_reply is registered; recipients are derived from the original mail only, no arbitrary addresses accepted.

TUTAMCP_MAIL_SEND=full — also registers tuta_mail_send for initiating new threads.

Default: dedicatedfull, sharedreply_only, folder → always reply_only.

Trusted senders

Used for autonomous mail handling (e.g. a background poller that wakes Claude to process incoming commands).

VariableDescription
TUTAMCP_OWNER_EMAILAlways trusted.
TUTAMCP_COMMAND_WHITELISTComma-separated list of additional trusted addresses.
TUTAMCP_TRUST_REQUIRE_E2E1 (default) — trust requires end-to-end encryption (Tuta→Tuta, TutaCrypt). Protects against spoofed From headers on external mail; owner and whitelist must use Tuta accounts. Set to 0 to trust by address alone.
TUTAMCP_MAIL_CC_OWNER1 — automatically CC the owner on every outgoing mail.

tuta_mail_list and tuta_mail_read return trusted_sender: bool and e2e: bool on every message. Pass only_trusted=True to tuta_mail_list to filter to trusted senders only.

Tools

Status

ToolDescription
tuta_statusServer info: version, enabled modules, mail mode/send policy, session state

Mail

ToolDescription
tuta_mail_list_foldersList all folders
tuta_mail_listList emails without body. Supports only_trusted, unread, pagination
tuta_mail_readRead full email with decrypted body and attachment metadata
tuta_mail_get_attachmentDownload attachment to TUTAMCP_DOWNLOAD_DIR
tuta_mail_sendSend new email (requires mail_send=full)
tuta_mail_replyReply to email; recipients derived from original only
tuta_mail_moveMove to folder
tuta_mail_deleteDelete permanently or move to trash
tuta_mail_markMark as read/unread
tuta_mail_folder_createCreate custom folder
tuta_mail_folder_renameRename custom folder
tuta_mail_folder_deleteDelete custom folder
tuta_mail_list_labelsList labels
tuta_mail_apply_labelsAdd/remove labels on a mail

Calendar

ToolDescription
tuta_calendar_list_eventsList events in a date range (recurring events always included)
tuta_calendar_create_eventCreate event with optional RRULE recurrence
tuta_calendar_update_eventUpdate event
tuta_calendar_delete_eventDelete event

Note: editing a single occurrence of a recurring series is not supported.

Contacts

ToolDescription
tuta_contacts_listList/search contacts by name, company, or email
tuta_contacts_getGet full contact details
tuta_contacts_createCreate contact
tuta_contacts_updateUpdate contact fields
tuta_contacts_deleteDelete contact

Drive

ToolDescription
tuta_drive_listList folder contents by path
tuta_drive_downloadDownload file to TUTAMCP_DOWNLOAD_DIR
tuta_drive_uploadUpload local file
tuta_drive_mkdirCreate folder
tuta_drive_renameRename file or folder
tuta_drive_moveMove file or folder
tuta_drive_deleteDelete file or folder

Drive requires a paid Tuta account. Free accounts receive an informative error rather than a crash.

Security

  • Credentials are never logged. The server warns if the credentials file permissions are wider than 600.
  • All logging goes to stderr or a log file. stdout is reserved for the MCP protocol.
  • Tool registration is conditional: a disabled module registers no tools — Claude doesn't see them at all.
  • In folder mode, all operations are scoped to the configured folder; attempts to access outside it are rejected at the tool level.
  • Reply-only policy is enforced structurally: tuta_mail_send is simply not registered, not blocked at runtime.
  • Path traversal on attachment/drive downloads is blocked (basename sanitization + regex).

License

AGPL-3.0 — see LICENSE.