zimbra-mcp
MCP server for reading and sending emails via IMAP and SMTP, designed for Zimbra and any standard mail host.
README
zimbra-mcp
MCP server for IMAP (read) and SMTP (send), aimed at Zimbra and any standard mail host. stdio transport — works with Claude Desktop, Cursor, and other MCP clients.
npm: npmjs.com/package/zimbra-mcp · Source: github.com/TechGuyVN/zimbra-mcp
Requirements
- Node.js ≥ 18
- Mail with IMAP and SMTP enabled
Install (npm only)
npm install -g zimbra-mcp
This installs the zimbra-mcp command and the package under your global node_modules.
Entrypoint for MCP config
Use one of these in Claude/Cursor:
A — Global command (simplest if npm bin -g is on your PATH when the app starts):
{
"command": "zimbra-mcp",
"args": []
}
B — node + absolute path to dist/index.js (most reliable):
-
Print the global package root:
npm root -g -
Your file is:
{that_output}/zimbra-mcp/dist/index.js
Example macOS/Linux:/usr/local/lib/node_modules/zimbra-mcp/dist/index.js
Example Windows (typical):C:\Users\You\AppData\Roaming\npm\node_modules\zimbra-mcp\dist\index.js
{
"command": "node",
"args": ["/absolute/path/to/node_modules/zimbra-mcp/dist/index.js"]
}
Always use a real absolute path in args.
Claude Desktop + nvm: Claude prepends old Node versions to PATH (e.g. v13 first). Then /usr/bin/env node inside any shebang can pick Node 13, which breaks this package (Node ≥ 18 required). Fix: set command to an absolute Node 18+ binary and args to the script:
{
"mcpServers": {
"zimbra-mail": {
"command": "/Users/YOU/.nvm/versions/node/v20.19.5/bin/node",
"args": ["/usr/local/lib/node_modules/zimbra-mcp/dist/index.js"],
"env": {}
}
}
}
Adjust paths with which node (after nvm use 20) and npm root -g. You can use .../zimbra-mcp/bin/zimbra-mcp.mjs instead of dist/index.js if you prefer the npm bin entry (same Node binary in command).
Environment variables
Set these in the MCP env object (all values as strings). The server does not read .env by itself.
Single mailbox (flat env)
Do not set ZIMBRA_MAILBOXES_PATH. One profile named default is used; omit profile on tools.
| Variable | Required | Notes |
|---|---|---|
ZIMBRA_IMAP_HOST |
Yes | IMAP host |
ZIMBRA_IMAP_PORT |
No | Default 993 |
ZIMBRA_IMAP_USER |
Yes | Usually full email |
ZIMBRA_IMAP_PASS |
Yes | Password or app password |
ZIMBRA_IMAP_SECURE |
No | If unset: true if port 993, else false |
ZIMBRA_SMTP_HOST |
Yes | SMTP host |
ZIMBRA_SMTP_PORT |
No | Default 587 |
ZIMBRA_SMTP_USER |
Yes | Often same as IMAP |
ZIMBRA_SMTP_PASS |
Yes | Often same as IMAP |
ZIMBRA_SMTP_SECURE |
No | If unset: true if port 465, else false |
ZIMBRA_LIST_MAX |
No | Max messages per list call; default 200, hard cap 1000 |
Ports: IMAP 993 (TLS), SMTP 587 (STARTTLS, often ZIMBRA_SMTP_SECURE=false) or 465 (SSL).
Multiple mailboxes (one JSON file)
- Create a JSON file (see example below).
chmod 600it. - Set
ZIMBRA_MAILBOXES_PATHto its absolute path. - Use tool
zimbra_list_profiles, then passprofileon other tools.
| Variable | Required | Notes |
|---|---|---|
ZIMBRA_MAILBOXES_PATH |
Yes | Absolute path to the JSON file |
ZIMBRA_LIST_MAX |
No | Overrides list cap (max 1000) |
Minimal multi-profile JSON:
{
"defaultProfile": "work",
"maxListMessages": 200,
"profiles": [
{
"id": "work",
"imap": {
"host": "mail.company.com",
"port": 993,
"user": "you@company.com",
"pass": "secret"
},
"smtp": {
"host": "mail.company.com",
"port": 587,
"user": "you@company.com",
"pass": "secret"
}
},
{
"id": "personal",
"imap": {
"host": "imap.gmail.com",
"user": "you@gmail.com",
"pass": "app-password"
},
"smtp": {
"host": "smtp.gmail.com",
"user": "you@gmail.com",
"pass": "app-password"
}
}
]
}
port / secure under imap/smtp are optional (defaults: IMAP 993, SMTP 587, with TLS rules same as flat env). More examples: mailboxes.example.json on GitHub.
Claude Desktop
Config file
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
Single mailbox
{
"mcpServers": {
"zimbra-mail": {
"command": "zimbra-mcp",
"args": [],
"env": {
"ZIMBRA_IMAP_HOST": "mail.example.com",
"ZIMBRA_IMAP_PORT": "993",
"ZIMBRA_IMAP_USER": "you@example.com",
"ZIMBRA_IMAP_PASS": "your-secret",
"ZIMBRA_SMTP_HOST": "mail.example.com",
"ZIMBRA_SMTP_PORT": "587",
"ZIMBRA_SMTP_USER": "you@example.com",
"ZIMBRA_SMTP_PASS": "your-secret"
}
}
}
}
Multiple mailboxes
{
"mcpServers": {
"zimbra-mail": {
"command": "zimbra-mcp",
"args": [],
"env": {
"ZIMBRA_MAILBOXES_PATH": "/Users/you/.config/zimbra-mcp/mailboxes.json"
}
}
}
}
Restart Claude fully after edits.
Cursor
Settings → MCP (or mcp.json per Cursor docs). Use the same command / args / env shape as above, then reload MCP.
Tools
| Tool | Purpose |
|---|---|
zimbra_list_profiles |
List mailbox profiles (ZIMBRA_MAILBOXES_PATH mode). |
zimbra_list_folders |
List IMAP folders. Optional profile. |
zimbra_list_messages |
Last N messages in folder. Optional profile, limit (cap 1000). |
zimbra_get_message |
Read by UID. Optional profile. |
zimbra_send_email |
Send mail. Optional profile. |
UID is scoped to folder and profile.
Tips
- One account, many folders:
zimbra_list_foldersthenzimbra_list_messagesper folder. - Raise
ZIMBRA_LIST_MAXif you need longer lists (≤ 1000). - Listing is “last N by sequence”; filter by
datein the model if you need “today’s mail”.
Troubleshooting
| Issue | Check |
|---|---|
| MCP won’t start | node -v ≥ 18; if using zimbra-mcp, ensure global npm bin is on PATH. |
| Safer start | Use node + absolute .../zimbra-mcp/dist/index.js from npm root -g. |
| Auth errors | Host/port/TLS; app passwords; IMAP/SMTP enabled on server. |
Security
- Never paste secrets into public chats; lock down JSON and Claude config files (
chmod 600where applicable). - This MCP can read and send mail for every configured account.
Protocol & license
MCP · ISC — see package.json.
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.