Phase A: mail_send + mail_inbox_list + mail_inbox_read. Replaces scripts/kayos_mail.py with a typed MCP server. Outbound guarantees Date, Message-ID (own-domain), User-Agent, MIME-Version, multipart/alternative for HTML+text, multipart/mixed for attachments, In-Reply-To + References for threading. Single account in v0.1 (default_account from config). Phase B adds multi-account + threading + search; Phase C adds mark + attachments + reply helper. Stack: rmcp 0.1 (matches aldabra), lettre 0.11 + tokio-rustls, async-imap 0.10, mail-parser 0.9. Stderr-only logging (stdout is the MCP transport). Smoke verified 2026-05-21: send -> land -> read kayos@sulkta.com round trip, DKIM-Signature + Authentication-Results pass at the rspamd relay.
43 lines
1.1 KiB
TOML
43 lines
1.1 KiB
TOML
# mail-mcp — the binary. Stdio MCP server exposing SMTP send + IMAP
|
|
# read tools. Spawned per-session by any MCP client.
|
|
|
|
[package]
|
|
name = "mail-mcp"
|
|
version.workspace = true
|
|
edition.workspace = true
|
|
license.workspace = true
|
|
repository.workspace = true
|
|
authors.workspace = true
|
|
description = "Rust MCP server for Sulkta-hosted email (SMTP send + IMAP read)"
|
|
|
|
[[bin]]
|
|
name = "mail-mcp"
|
|
path = "src/main.rs"
|
|
|
|
[dependencies]
|
|
tokio = { workspace = true }
|
|
rmcp = { workspace = true }
|
|
schemars = { workspace = true }
|
|
|
|
lettre = { workspace = true }
|
|
async-imap = { workspace = true }
|
|
tokio-rustls = { workspace = true }
|
|
rustls = { workspace = true }
|
|
rustls-pki-types = { workspace = true }
|
|
webpki-roots = { workspace = true }
|
|
mail-parser = { workspace = true }
|
|
|
|
toml = { workspace = true }
|
|
serde = { workspace = true }
|
|
serde_json = { workspace = true }
|
|
uuid = { workspace = true }
|
|
base64 = { workspace = true }
|
|
|
|
anyhow = { workspace = true }
|
|
thiserror = { workspace = true }
|
|
futures = { workspace = true }
|
|
tracing = { workspace = true }
|
|
tracing-subscriber = { workspace = true }
|
|
|
|
dirs = { workspace = true }
|
|
shellexpand = { workspace = true }
|