Skip to main content
Glama
imap-mail-mcp

imap-mail-mcp

imap-mail-mcp

Servidor MCP que conecta o Claude (Desktop, Code ou qualquer cliente MCP) a uma ou várias contas de e-mail IMAP/SMTP — Zimbra, Exchange, Dovecot/Postfix, cPanel, hospedagens, Gmail/Outlook com senha de app.

  • Fala IMAP4rev1 e SMTP direto com o seu servidor; nada passa por terceiros.

  • Única dependência externa: SDK mcp. Protocolo e MIME vêm da stdlib do Python.

  • Várias contas ao mesmo tempo: toda ferramenta aceita account=; search_all_accounts varre todas as caixas de uma vez.

  • Todas as operações por UID; pastas com acento em UTF-7; busca não-ASCII com CHARSET UTF-8.

Instalação

Claude Desktop — um clique (.mcpb)

Baixe o imap-mail-mcp-X.Y.Z.mcpb em Releases, abra Claude Desktop → Configurações → Extensões e arraste o arquivo. O Claude pede host, usuário e senha num formulário (a senha vai para o keychain do sistema).

Claude Code / qualquer cliente MCP (PyPI)

claude mcp add imap-mail \
  -e IMAP_HOST=mail.empresa.com.br -e SMTP_HOST=mail.empresa.com.br \
  -e MAIL_USER=voce@empresa.com.br -e MAIL_PASS='***' \
  -- uvx imap-mail-mcp

Ou no claude_desktop_config.json / .mcp.json:

{
  "mcpServers": {
    "imap-mail": {
      "command": "uvx",
      "args": ["imap-mail-mcp"],
      "env": { "IMAP_HOST": "...", "SMTP_HOST": "...", "MAIL_USER": "...", "MAIL_PASS": "..." }
    }
  }
}

A partir do código

git clone https://github.com/julioc-barros/imap-mail-mcp && cd imap-mail-mcp
uv sync && uv run imap-mail-mcp        # ou: pip install -e . && imap-mail-mcp

Related MCP server: anymail-mcp

Configuração (variáveis de ambiente)

Variável

Padrão

Descrição

IMAP_HOST

—

obrigatório

IMAP_PORT

993

993 SSL ou 143 STARTTLS

IMAP_SSL

true

false = STARTTLS na 143

SMTP_HOST

—

obrigatório

SMTP_PORT

587

587 / 465 / 25

SMTP_SECURITY

starttls

starttls | ssl | none

MAIL_USER / MAIL_PASS

—

obrigatórios

MAIL_FROM

MAIL_USER

Nome <voce@empresa.com.br>

SENT_FOLDER

auto

detecta \Sent, "Sent", "Itens Enviados"...

ATTACH_DIR

temp do usuário

%TEMP%\imap-mail-mcp (Windows) ou /tmp/imap-mail-mcp (Linux/macOS)

TLS_VERIFY

true

false só para certificado self-signed

MAX_BODY_CHARS

20000

limite do corpo em read_email

MAIL_ACCOUNT_NAME

principal

apelido da conta principal

MAIL_ACCOUNTS

—

JSON inline com contas adicionais

MAIL_ACCOUNTS_FILE

—

caminho de um JSON com contas adicionais

ATTACH_DIR aceita ~, $HOME, ${HOME}, %USERPROFILE% e %TEMP%. MAIL_FROM aceita Nome <x@y>, x@y ou só Nome (usa MAIL_USER como endereço).

Várias contas

A conta principal vem das variáveis acima. Contas extras vão em MAIL_ACCOUNTS (JSON) ou num arquivo apontado por MAIL_ACCOUNTS_FILE — veja accounts.example.json. Campos omitidos herdam da conta principal, então para várias caixas no mesmo servidor basta nome, usuário e senha:

{ "accounts": [
  { "name": "financeiro", "user": "financeiro@empresa.com.br", "password": "..." },
  { "name": "rh",         "user": "rh@empresa.com.br",         "password": "..." }
] }

Campos por conta: name, user, password, from, imap_host, imap_port, imap_ssl, smtp_host, smtp_port, smtp_security, sent_folder, attach_dir, tls_verify.

No Claude Desktop (.mcpb) o campo "Arquivo de contas adicionais" recebe esse JSON. Guarde o arquivo em local protegido — ele contém senhas.

Uso: search_emails(account="financeiro", unseen=true), send_email(account="rh", ...). account aceita o apelido ou o e-mail; vazio = conta principal.

Ferramentas

Todas aceitam account="" (apelido ou e-mail; vazio = principal).

Tool

O que faz

list_accounts

Contas configuradas e qual é a padrão

account_info

Config ativa, capacidades IMAP, pasta Enviados detectada

search_all_accounts(...)

Mesma busca em todas as contas, agrupada por conta

list_folders(with_counts)

Lista pastas, opcionalmente com total/não lidos

search_emails(...)

unseen, flagged, sender, to, subject, text, since, before, larger_than_kb, limit ou raw_criteria (IMAP SEARCH direto)

read_email(folder, uid)

Cabeçalhos + corpo (texto ou HTML) + lista de anexos

get_raw_email

Fonte RFC822 completa

download_attachment

Salva um ou todos os anexos

send_email

To/Cc/Bcc, texto ou HTML, anexos, Reply-To; cópia em Enviados

reply_email

Responde (ou a todos) com In-Reply-To/References; marca \Answered

forward_email

Encaminha com anexos originais

set_flags

\Seen, \Flagged, \Answered em lote

move_email

MOVE, ou COPY+DELETE+EXPUNGE se o servidor não suportar

delete_email

\Deleted + EXPUNGE

create_folder / rename_folder / delete_folder

Pastas

Desenvolvimento

uv sync --group dev
uv run pytest -q
npx -y @anthropic-ai/mcpb validate manifest.json
npx -y @anthropic-ai/mcpb pack . dist/imap-mail-mcp.mcpb   # bundle local

Teste de integração ponta a ponta pode ser feito contra o GreenMail standalone (-Dgreenmail.setup.test.all), portas 3143/3025.

Publicação

  1. Substitua julioc-barros em pyproject.toml, manifest.json, server.json e neste README.

  2. No PyPI, crie o projeto imap-mail-mcp e habilite Trusted Publishing apontando para este repositório / workflow release.yml.

  3. git tag v0.1.0 && git push --tags — o workflow publica no PyPI, gera o .mcpb e cria o Release.

  4. (Opcional) Registro MCP: mcp-publisher login github && mcp-publisher publish usando o server.json.

Notas de protocolo

  • Busca com termo acentuado: um termo por chamada (limitação do imaplib, um literal por comando). Para mais, use raw_criteria.

  • read_email marca como lido por padrão (mark_as_read=false usa BODY.PEEK).

  • Cópia em Enviados via IMAP APPEND; se o SMTP já grava (Exchange), use save_to_sent=false.

  • Gmail / Microsoft 365 exigem senha de aplicativo; OAuth2 não está coberto.

MIT © Julio Barros · juliocbarros339@gmail.com

Available Tools

17 tools
account_infoB

Mostra a configuração ativa de uma conta (sem senha), capacidades do servidor IMAP e a pasta de Enviados detectada.

Inputs: account.

create_folderC

Cria uma pasta. Use o delimitador do servidor para subpastas (ex.: 'INBOX/Clientes' ou 'INBOX.Clientes').

Inputs: name (required), account.

delete_emailA

Exclui e-mails (marca \Deleted e, se expunge=True, remove definitivamente da pasta). Para 'mover para a lixeira' prefira move_email para a pasta Trash/Lixeira.

Inputs: uids (required), folder (required), account, expunge.

delete_folderC

Remove uma pasta e todas as mensagens nela. Irreversível.

Inputs: name (required), account.

download_attachmentB

Salva anexos de um e-mail em disco. index=-1 salva todos; caso contrário salva só o anexo indicado (índice conforme read_email). dest_dir vazio usa a pasta de anexos da conta. Retorna os caminhos gravados.

Inputs: uid (required), folder (required), index, account, +1 more. Returns: result

forward_emailC

Encaminha um e-mail (corpo em texto + anexos originais) para novos destinatários.

Inputs: to (required), uid (required), folder (required), cc, +4 more.

get_raw_emailC

Retorna a fonte RFC822 completa da mensagem (cabeçalhos brutos + MIME). Útil para diagnóstico.

Inputs: uid (required), folder (required), account, max_chars. Returns: result

list_accountsA

Lista as contas de e-mail configuradas e qual é a padrão.

Inputs: no named parameters.

list_foldersA

Lista todas as pastas (mailboxes) de uma conta. Com with_counts=True inclui total e não lidos (mais lento). account: nome ou e-mail da conta; vazio = conta padrão.

Inputs: account, with_counts. Returns: result

move_emailB

Move e-mails para outra pasta da mesma conta (usa MOVE se o servidor suportar; senão COPY + delete + EXPUNGE).

Inputs: uids (required), folder (required), destination (required), account.

read_emailB

Lê um e-mail completo pelo UID: cabeçalhos, corpo (texto por padrão, ou HTML) e lista de anexos. account: nome ou e-mail da conta; vazio = conta padrão. Use download_attachment para salvar anexos. max_chars=0 usa o limite padrão (MAX_BODY_CHARS).

Inputs: uid (required), folder (required), account, max_chars, +2 more.

rename_folderD

Renomeia uma pasta.

Inputs: name (required), new_name (required), account.

reply_emailA

Responde um e-mail existente mantendo o encadeamento (In-Reply-To/References) e marca-o como respondido. account: nome ou e-mail da conta onde o e-mail está; vazio = conta padrão.

Inputs: uid (required), body (required), folder (required), html, +5 more.

search_all_accountsB

Executa a mesma busca em TODAS as contas configuradas (mesma pasta em cada uma) e devolve os resultados agrupados por conta. Útil para 'o que chegou de novo em todas as caixas'. Erros de uma conta não interrompem as demais.

Inputs: to, text, since, before, +6 more.

search_emailsA

Busca e-mails em uma pasta de uma conta. Retorna os mais recentes primeiro com UID, remetente, assunto, data e flags. account: nome ou e-mail da conta; vazio = conta padrão. Datas no formato YYYY-MM-DD. raw_criteria permite passar critério IMAP SEARCH direto (ex.: 'UNSEEN FROM "x"'), ignorando os demais filtros. Os filtros sender/to/subject/text são substring, case-insensitive.

Inputs: to, text, limit, since, +9 more.

send_emailA

Envia um e-mail via SMTP pela conta indicada (account vazio = conta padrão). Destinatários separados por vírgula ou ponto-e-vírgula. html=True trata body como HTML. attachments = lista de caminhos locais. Grava cópia na pasta Enviados via IMAP quando save_to_sent=True.

Inputs: to (required), body (required), subject (required), cc, +6 more.

set_flagsB

Marca/desmarca flags em um ou mais UIDs: seen (lido), flagged (estrela/importante), answered. Passe True para adicionar, False para remover, omita para não alterar.

Inputs: uids (required), folder (required), seen, account, +2 more.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3/5.0

    Scored across 17 tools

    Disambiguation4/5

    Each tool maps to a distinct IMAP action (list, search, read, send, flag, move, delete, folder CRUD). Minor overlaps exist between read_email/get_raw_email and search_emails/search_all_accounts, but descriptions clarify scope (formatted vs raw source; single account vs all accounts).

    Naming Consistency4/5

    Mostly consistent verb_noun snake_case pattern: list_folders, search_emails, send_email, move_email, create_folder. The main exception is account_info (noun_noun), which breaks the pattern but does not make the naming chaotic.

    Tool Count4/5

    17 tools is slightly above the typical 3–15 sweet spot, but each maps to a necessary email action (accounts, folders, search, read/send/reply/forward, attachments, flags, move, delete). No obvious filler tools, so the count is reasonable for a full IMAP client.

    Completeness4/5

    Covers core lifecycle: account listing/config, folder CRUD, message search/read/send/reply/forward, attachment download, flags, move, delete. Minor gaps exist (e.g., draft management), but agents can work around them and the core workflows are complete.

    Maintenance

    ActivityNo data
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      B
      quality
      C
      maintenance
      Enables users to manage email accounts via IMAP/SMTP, including reading, searching, sending emails with attachments and calendar invites, all through natural language interactions with MCP-compatible clients.
      1
      4
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      Connects any IMAP/SMTP mailbox to AI agents via MCP, enabling email read, search, send, reply, and management through natural language.
      13 npm
      MIT
    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables searching, reading full conversations, and sending email across multiple IMAP/SMTP mailboxes from any MCP client, with multi-user support and per-user API tokens.
      MIT
    • F
      license
      B
      quality
      B
      maintenance
      Enables external AI agents to read, send, and manage email over IMAP/SMTP via MCP, including inbox listing, search, drafts, scheduled/batch sending, and operations like reply, archive, and labels.
      30
      3
      -