Stalwart MCP

Servidor MCP para Stalwart mail server via JMAP — caixas de correio, busca, envio e administração

Documentação

mcp-server-stalwart

Servidor MCP para Stalwart Mail Server. Fornece operações de e-mail (pesquisa, leitura, envio, exclusão) via JMAP e acesso opcional à API de administração para gerenciamento do servidor.

Requisitos

  • Rust (2024 edition)
  • Um servidor de e-mail Stalwart com JMAP habilitado

Compilação

cargo build --release

O binário é gerado em target/release/mcp-server-stalwart.

Configuração

O servidor se conecta via stdio e é configurado por meio de variáveis de ambiente.

Obrigatório

VariávelDescrição
JMAP_SESSION_URLEndpoint da sessão JMAP (ex.: https://mail.example.com/jmap/session)
JMAP_USERNAMEEndereço de e-mail da conta JMAP
JMAP_PASSWORDSenha da conta JMAP

Opcional (outras caixas de correio)

Alterne as ferramentas para outra caixa de correio com account (ex.: hello@codechap.com) sem precisar da API de administração.

VariávelDescrição
JMAP_SECRETS_FILECaminho para um secrets.toml do mailman4 (tabela [passwords] de "email" = "password")
JMAP_ACCOUNTSLista email=password;other@host=password inline (substitui o arquivo em caso de conflito)

Opcional (API de administração)

VariávelDescrição
STALWART_ADMIN_URLURL base da API de administração — https://mail.example.com ou https://mail.example.com/api (ambos aceitos; /api é normalizado)
STALWART_ADMIN_USERNome de usuário do administrador (padrão: admin)
STALWART_ADMIN_PASSWORDSenha do administrador (principal diferente das senhas de caixa de correio)

Pegadinha de senha (aprendida da pior forma)

SegredoUsado paraNÃO usado para
JMAP_PASSWORD / senha da caixa de correioEnvio SMTP (smtp://user:pass@host:587), JMAP, IMAP para essa contaAPI de administração
STALWART_ADMIN_PASSWORDAPI de administração (/api/principal, /api/logs, …)DSNs de mailer de aplicativos

Se um aplicativo (mailer de fatura, WordPress, etc.) estiver configurado com a senha do administrador como segredo SMTP, o Stalwart retorna 535 Authentication credentials invalid e nada é enfileirado. check_sent mostrará corretamente zero envios. Use verify_account_auth para testar as credenciais antes de perseguir a entrega.

Configuração do MCP do Claude Code

{
  "mcpServers": {
    "stalwart": {
      "command": "/path/to/mcp-server-stalwart",
      "env": {
        "JMAP_SESSION_URL": "https://mail.example.com/jmap/session",
        "JMAP_USERNAME": "you@example.com",
        "JMAP_PASSWORD": "your-password",
        "JMAP_SECRETS_FILE": "/home/you/.local/share/mailman4/secrets.toml",
        "STALWART_ADMIN_URL": "https://mail.example.com",
        "STALWART_ADMIN_PASSWORD": "admin-password"
      }
    }
  }
}

Ferramentas

get_mailboxes

Lista todas as caixas de correio/pastas com contagens de mensagens.

ParâmetroTipoObrigatórioDescrição
accountstringnãoCaixa de correio a listar (ex.: hello@codechap.com)

create_mailbox

Cria uma nova caixa de correio/pasta.

ParâmetroTipoObrigatórioDescrição
namestringsimNome da caixa de correio
parent_idstringnãoID da caixa de correio pai para aninhamento (nível superior se omitido)
rolestringnãoFunção padrão: archive, drafts, inbox, junk, sent, trash

search_emails

Pesquisa e-mails com filtros. Retorna IDs de e-mail -- use get_emails para ler o conteúdo completo.

ParâmetroTipoObrigatórioDescrição
querystringnãoTexto para pesquisar em assunto, corpo, de, para
fromstringnãoFiltrar por endereço do remetente
tostringnãoFiltrar por endereço do destinatário
subjectstringnãoFiltrar por texto do assunto
mailbox_idstringnãoRestringir a uma caixa de correio específica
positionnumbernãoDeslocamento de paginação (padrão 0)
limitnumbernãoMáximo de resultados (padrão 10, máx. 50)
accountstringnãoCaixa de correio para pesquisar (ex.: hello@codechap.com)

get_emails

Obtém o conteúdo completo do e-mail por IDs. Retorna assunto, de, para, data, texto do corpo e metadados.

ParâmetroTipoObrigatórioDescrição
idsstring[]simLista de IDs de e-mail para recuperar
accountstringnãoCaixa de correio que possui esses e-mails

delete_emails

Exclui permanentemente e-mails por ID. Não pode ser desfeito.

ParâmetroTipoObrigatórioDescrição
idsstring[]simLista de IDs de e-mail para excluir
accountstringnãoCaixa de correio da qual excluir

send_email

Envia um e-mail com corpo HTML opcional e anexos de arquivo. Quando html_body é fornecido, o e-mail é enviado como multipart com partes de texto simples e HTML -- o cliente de e-mail do destinatário escolherá qual exibir.

ParâmetroTipoObrigatórioDescrição
tostring[]simEndereços de e-mail dos destinatários
subjectstringsimAssunto do e-mail
bodystringsimCorpo em texto simples
html_bodystringnãoCorpo HTML. Quando fornecido, o e-mail é enviado como multipart (text/plain + text/html)
ccstring[]nãoDestinatários em CC
bccstring[]nãoDestinatários em CCO
attachmentsobject[]nãoAnexos de arquivo (veja abaixo)
accountstringnãoEnviar como esta caixa de correio (ex.: hello@codechap.com) em vez do usuário JMAP padrão

Objeto de anexo:

CampoTipoObrigatórioDescrição
pathstringsimCaminho absoluto para o arquivo no disco
filenamestringsimNome do arquivo para o anexo
content_typestringnãoTipo MIME (detectado automaticamente pela extensão se omitido)

download_attachments

Baixa todos os anexos de um e-mail para um diretório local.

ParâmetroTipoObrigatórioDescrição
email_idstringsimID do e-mail do qual baixar anexos
download_dirstringsimCaminho do diretório para salvar os anexos

create_account (admin)

Cria uma nova conta de e-mail no servidor. Requer configuração da API de administração.

ParâmetroTipoObrigatórioDescrição
emailstringsimEndereço de e-mail principal
passwordstringsimSenha da conta
descriptionstringnãoNome de exibição
quotanumbernãoCota de disco em bytes (0 para ilimitado)
permissionsstring[]nãoPermissões a conceder na criação (ex.: email-send, authenticate, imap-authenticate). Sem permissões, a conta não pode autenticar ou enviar e-mail — forneça-as aqui ou chame update_account_permissions depois.

list_accounts (admin)

Lista todas as contas ou obtém detalhes de uma. Requer configuração da API de administração.

ParâmetroTipoObrigatórioDescrição
namestringnãoNome da conta para detalhes. Se omitido, lista todas as contas.

manage_aliases (admin)

Adiciona ou remove um alias de e-mail em uma conta. Requer configuração da API de administração.

ParâmetroTipoObrigatórioDescrição
accountstringsimNome da conta
actionstringsimadd ou remove
aliasstringsimE-mail de alias para adicionar/remover

update_account_permissions (admin)

Atualiza o enabledPermissions de uma conta. Principals recém-criados começam sem permissões e não podem autenticar, enviar ou receber e-mail até que as permissões sejam concedidas. Requer configuração da API de administração.

ParâmetroTipoObrigatórioDescrição
accountstringsimNome da conta de destino
actionstringnãoset (substituir lista, padrão), add (conceder) ou remove (revogar)
permissionsstring[]simNomes de permissões (ex.: email-send, authenticate, imap-authenticate, imap-append)

reset_password (admin)

Redefine a senha de uma conta. Se password for omitido, uma senha aleatória forte de 24 caracteres é gerada. A nova senha é retornada em texto simples na resposta para que possa ser entregue ao usuário. Requer configuração da API de administração.

ParâmetroTipoObrigatórioDescrição
accountstringsimNome da conta de destino
passwordstringnãoNova senha. Gerada automaticamente se omitida.

get_dsn_accounts (admin)

Lista endereços de e-mail que têm relatórios de entrega DSN (Notificação de Status de Entrega) habilitados. Requer configuração da API de administração.

set_dsn_accounts (admin)

Define quais endereços de e-mail recebem relatórios de entrega DSN (SUCCESS + FAILURE). Substitui a lista completa. Requer configuração da API de administração.

ParâmetroTipoObrigatórioDescrição
accountsstring[]simEndereços de e-mail para habilitar relatórios de entrega

check_sent (admin)

A primeira ferramenta a usar ao verificar qualquer e-mail de saída — formulários de contato, WordPress wp_mail(), mailers de fatura/extrato, redefinições de senha, e-mail transacional — qualquer coisa que precise de "isso saiu do servidor?".

Lê o /api/logs do Stalwart (autoritativo) e agrupa por queueId: envio → tentativa de entrega → status final (delivery.delivered / delivery.dsn-success / delivery.failed) mais MX upstream code/hostname.

NÃO pesquise caixas de correio primeiro — envios SMTP não são salvos automaticamente em Enviados. Comece aqui.

Como funciona a busca de log (lição de produção):
A consulta filter= do lado do servidor do Stalwart frequentemente trava em arquivos de log diários de vários GB. Por padrão, esta ferramenta busca as linhas scan_limit mais recentes sem filtro e aplica to/from/filter no lado do cliente (rápido: ~300ms para 1000 linhas). Passe use_server_filter=true somente se você souber que precisa (ex.: um queueId único em um host tranquilo).

Casos de uso comuns:

  • "O mailer de fatura / formulário de contato enviou para ap@client.com?"
  • "Um e-mail transacional foi entregue — o que o Gmail retornou?"
  • "Por que rejeição — código SMTP remoto?"
ParâmetroTipoObrigatórioDescrição
tostringnãoE-mail ou domínio do destinatário (substring no lado do cliente). Prefira isso para verificações de formulário de contato.
fromstringnãoE-mail ou domínio do remetente (substring no lado do cliente).
filterstringnãoSubstring extra no lado do cliente (ex.: queueId).
sincestringnãoLimite inferior RFC3339 nos carimbos de data/hora dos eventos.
scan_limitnumbernãoLinhas de log mais recentes a buscar (padrão 500, máx. 5000). Aumente se o envio for mais antigo que a janela.
use_server_filterboolnãoPadrão false. Se true, passe o filtro para o Stalwart (pode expirar em hosts ocupados).

Retorna messages_found, delivered_count, failed_count, linhas do tempo por mensagem (mx_code / mx_hostname), além de auth_events (sucesso/falha de autenticação de envio) e um log_window.

verify_account_auth

Testa se um nome de usuário/senha é aceito pelo Stalwart (mesmo segredo da porta SMTP 587). Use quando check_sent mostrar nenhum envio — geralmente o aplicativo tem a senha errada.

ParâmetroTipoObrigatórioDescrição
usernamestringsimE-mail da conta (ex.: hello@codechap.com)
passwordstringsimSenha candidata (segredo da caixa de correio, não do administrador)