Sulkta naming convention. Carrier (the carrier pigeon — single- purpose, reliable, comes back every time) sits alongside Aldabra (giant tortoise), Hawk (eBay-resale eyes), Skald (Norse storyteller), cWHO (monitoring), Cauldron (meal planning), Clawdforge (build), tny (URL shortener), ktra (cargo registry). The full audit/cleanup/Phase-A-B-C arc happened under the mail-mcp name; this commit just renames the identity: - Cargo workspace + crate package name: mail-mcp -> carrier - Binary name: mail-mcp -> carrier - USER_AGENT header: mail-mcp/<ver> -> carrier/<ver> - Config env var: MAIL_MCP_CONFIG -> CARRIER_CONFIG - Default config path: ~/.config/mail-mcp/config.toml -> ~/.config/carrier/config.toml - ServerHandler instructions reference: 'mail-mcp' -> 'Carrier' - README + repo URL refs updated - Workspace path: /root/build/mail-mcp -> /root/build/carrier - Git remote: gitea:Sulkta-Coop/mail-mcp -> gitea:Sulkta-Coop/carrier Tool names stay mail_* (mail_send, mail_inbox_list, mail_reply, etc.) because they describe the email domain — same convention as Aldabra keeps wallet_*/chain_*/dao_*/escrow_*. The server-level identity is Carrier; the tools it carries are mail.
90 lines
3.3 KiB
TOML
90 lines
3.3 KiB
TOML
# Cargo workspace root for Carrier — Sulkta's Rust MCP email server.
|
|
#
|
|
# Named after the carrier pigeon: single-purpose, reliable, comes back
|
|
# every time. Carries Sulkta-hosted mail (kayos@/cobb@/abby@/bay@/jay@)
|
|
# to and from any MCP client.
|
|
#
|
|
# One crate today (carrier), workspace shape so we can grow without
|
|
# rework. Same pattern as aldabra.
|
|
#
|
|
# Workspace deps pinned here; each crate references with `foo = { workspace = true }`.
|
|
[workspace]
|
|
resolver = "2"
|
|
members = ["crates/carrier"]
|
|
|
|
[workspace.package]
|
|
version = "0.1.0"
|
|
edition = "2021"
|
|
license = "MIT"
|
|
repository = "http://192.168.0.5:3001/Sulkta-Coop/carrier"
|
|
authors = ["Cobb <cobb@sulkta.com>", "Kayos <kayos@sulkta.com>"]
|
|
|
|
[workspace.dependencies]
|
|
tokio = { version = "1", features = ["full"] }
|
|
|
|
# MCP — same crate aldabra uses. Pinned to 0.1 series; bump together
|
|
# across repos when we move.
|
|
rmcp = { version = "0.1", features = ["server", "transport-io"] }
|
|
schemars = "0.8"
|
|
|
|
# SMTP — lettre handles RFC-5322 headers (Date, Message-ID), STARTTLS,
|
|
# multipart/alternative + multipart/mixed natively. rustls-tls so we
|
|
# don't pull openssl. No `hostname` feature — we override Message-ID
|
|
# with our own UUID@<from_domain>, so lettre never needs the system
|
|
# hostname.
|
|
lettre = { version = "0.11", default-features = false, features = [
|
|
"tokio1-rustls-tls",
|
|
"smtp-transport",
|
|
"builder",
|
|
] }
|
|
|
|
# IMAP — async-imap is tokio-native and supports UID-based addressing
|
|
# (which we use throughout the API surface).
|
|
async-imap = { version = "0.10", default-features = false, features = ["runtime-tokio"] }
|
|
# tokio-rustls default-features pulls in aws-lc-rs via rustls's default
|
|
# feature chain. We use `ring` exclusively (installed once in main.rs);
|
|
# turn off defaults and add back only the small pieces we want.
|
|
tokio-rustls = { version = "0.26", default-features = false, features = ["logging", "tls12", "ring"] }
|
|
rustls = { version = "0.23", default-features = false, features = ["std", "tls12", "ring"] }
|
|
rustls-pki-types = "1"
|
|
webpki-roots = "0.26"
|
|
|
|
# Email parsing on the read side. mail-parser is fast, no_std-friendly,
|
|
# and handles the RFC-5322 + MIME zoo without surprises.
|
|
mail-parser = "0.9"
|
|
|
|
# Config + serde
|
|
toml = "0.8"
|
|
serde = { version = "1", features = ["derive"] }
|
|
serde_json = "1"
|
|
|
|
# UUID for Message-ID generation when lettre's auto isn't appropriate
|
|
# (we want our own domain in the Message-ID, not lettre's local-hostname
|
|
# default).
|
|
uuid = { version = "1", features = ["v4"] }
|
|
|
|
# Base64 for attachments
|
|
base64 = "0.22"
|
|
|
|
# Errors — anyhow at module boundaries; rmcp tool methods return
|
|
# `Result<String, String>` and convert via the IntoMcpError trait.
|
|
anyhow = "1"
|
|
|
|
# Stream adapter (.next() on async-imap fetch streams)
|
|
futures = "0.3"
|
|
|
|
# RFC-3339 timestamps for SendOutput.sent_at and parsed header dates.
|
|
# default-features=false keeps us off the system-locale crate; we only
|
|
# need the UTC clock + serialization helpers.
|
|
chrono = { version = "0.4", default-features = false, features = ["clock"] }
|
|
|
|
# Logging — stderr only, never stdout (stdio is the MCP transport).
|
|
tracing = "0.1"
|
|
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
|
|
|
|
# Dirs lookup for `~/.config/carrier/config.toml` default path
|
|
dirs = "5"
|
|
|
|
# Shell-style env-var expansion for the `password_file` setting
|
|
# (`~/.config/...` paths). shellexpand is small + maintained.
|
|
shellexpand = "3"
|