rename: mail-mcp -> Carrier

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: mail-mcp -> carrier
- Git remote: mail-mcp -> 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.
This commit is contained in:
Sulkta 2026-05-21 11:19:09 -07:00
parent bcf8a46713
commit 6b751558fb
10 changed files with 101 additions and 70 deletions

View file

@ -1,17 +1,17 @@
# mail-mcp — the binary. Stdio MCP server exposing SMTP send + IMAP
# Carrier — the binary. Stdio MCP server exposing SMTP send + IMAP
# read tools. Spawned per-session by any MCP client.
[package]
name = "mail-mcp"
name = "carrier"
version.workspace = true
edition.workspace = true
license.workspace = true
repository.workspace = true
authors.workspace = true
description = "Rust MCP server for email (SMTP send + IMAP read)"
description = "Carrier — Rust MCP server for email (SMTP send + IMAP read)"
[[bin]]
name = "mail-mcp"
name = "carrier"
path = "src/main.rs"
[dependencies]

View file

@ -1,6 +1,6 @@
//! TOML config + password resolution.
//!
//! Config path: `$MAIL_MCP_CONFIG` env, or `~/.config/mail-mcp/config.toml`.
//! Config path: `$CARRIER_CONFIG` env, or `~/.config/carrier/config.toml`.
//!
//! Password lookup per account:
//! 1. env var named by `password_env`
@ -160,12 +160,12 @@ fn check_chmod(_path: &std::path::Path) -> Result<()> {
}
fn config_path() -> Result<PathBuf> {
if let Ok(p) = std::env::var("MAIL_MCP_CONFIG") {
if let Ok(p) = std::env::var("CARRIER_CONFIG") {
return Ok(PathBuf::from(shellexpand::tilde(&p).into_owned()));
}
let home = dirs::config_dir()
.ok_or_else(|| anyhow!("could not resolve $XDG_CONFIG_HOME / ~/.config"))?;
Ok(home.join("mail-mcp").join("config.toml"))
Ok(home.join("carrier").join("config.toml"))
}
#[cfg(test)]

View file

@ -1,8 +1,14 @@
//! mail-mcp — MCP server entry point.
//! Carrier — a Rust MCP email server.
//!
//! Speaks MCP over stdio. Any MCP client launches this as a
//! subprocess
//! and gets `mail_send` + `mail_inbox_list` + `mail_inbox_read`.
//! and gets the 10-tool mail surface (mail_send / mail_inbox_list /
//! mail_inbox_read / mail_folder_list / mail_search / mail_thread /
//! mail_move / mail_mark / mail_attachment_get / mail_reply).
//!
//! Named after the carrier pigeon — single-purpose, reliable, comes
//! back every time. Tool names stay `mail_*` because they describe
//! the domain; only the server identity is Carrier.
//!
//! Logging is stderr-only — stdout belongs to the JSON-RPC transport.
@ -50,7 +56,7 @@ async fn run() -> Result<()> {
tracing::info!(
accounts = cfg.accounts.len(),
default_account = %cfg.default_account,
"mail-mcp starting"
"carrier starting"
);
let service = MailService::new(cfg);

View file

@ -5,7 +5,7 @@
//! - `Message-ID` — `<uuid-v4@{message_id_domain}>` — own-domain, not local hostname
//! - `From` — `name <addr>`
//! - `MIME-Version` — lettre auto
//! - `User-Agent` — `mail-mcp/<crate version>`
//! - `User-Agent` — `carrier/<crate version>`
//! - `In-Reply-To` — if provided
//! - `References` — if provided (space-joined)
//!
@ -52,7 +52,7 @@ pub struct SendOutput {
pub sent_at: String, // RFC-3339
}
const USER_AGENT: &str = concat!("mail-mcp/", env!("CARGO_PKG_VERSION"));
const USER_AGENT: &str = concat!("carrier/", env!("CARGO_PKG_VERSION"));
/// Hard caps to keep an MCP-driver-gone-wrong from OOM-ing the box.
/// Match Gmail's effective 25 MB per-message ceiling — any single attachment

View file

@ -601,7 +601,7 @@ impl ServerHandler for MailService {
ServerInfo {
capabilities: ServerCapabilities::builder().enable_tools().build(),
instructions: Some(
"mail-mcp — Rust MCP server for Sulkta-hosted email. Tools: \
"Carrier — a Rust MCP email server. Tools: \
mail_send, mail_inbox_list, mail_inbox_read, mail_folder_list, \
mail_search, mail_thread, mail_move, mail_mark, \
mail_attachment_get, mail_reply. Default account from config; \