Skip to main content
Glama
ssk1noscai

email-mcp-postale

by ssk1noscai
README.md
# Email MCP Server for Postale.io

An MCP server that gives Claude Desktop / Cowork access to your Postale.io email mailboxes.
Supports **multiple accounts**, reading, searching, replying, drafts, deleting, and batch operations.

## Features

| Tool | Description |
|------|-------------|
| `list_accounts` | Show all configured email accounts |
| `list_folders` | Show folder structure of an account |
| `get_unread_emails` | Fetch unread emails |
| `get_recent_emails` | Fetch recent emails from the last X days |
| `read_email` | Read a single email in full |
| `search_emails` | Search emails (subject, sender, body) |
| `send_email` | Send an email (with reply threading) |
| `save_draft` | Save a draft (visible in Spark) |
| `move_email` | Move an email to another folder |
| `delete_email` | Move an email to trash |
| `batch_delete_emails` | Delete multiple emails at once |
| `mark_as_read` | Mark as read |
| `mark_as_unread` | Mark as unread |
| `get_mailbox_stats` | Stats: unread per folder |
| `get_all_unread_summary` | Across ALL accounts: summarize unread |

## Setup

### 1. Clone and install dependencies

```bash
git clone https://github.com/ssk-machines/email-mcp-postale.git
cd email-mcp-postale
pip install -r requirements.txt
# or with uv:
uv pip install -r requirements.txt
```

### 2. Create configuration

```bash
cp config.json.example config.json
```

Then edit `config.json` — add an account entry for **each** mailbox:

```json
{
  "accounts": [
    {
      "name": "My Account",
      "email": "me@example.com",
      "imap_host": "mail.postale.io",
      "imap_port": 993,
      "smtp_host": "mail.postale.io",
      "smtp_port": 465,
      "username": "me@example.com",
      "password": "your-password"
    },
    {
      "name": "Support",
      "email": "support@example.com",
      ...
    }
  ]
}
```

**Tip:** On Postale.io, the username is always the full email address.

### 3. Test

```bash
python server.py
```

If no errors appear, the server is running correctly in stdio mode.

### 4. Add to Claude Desktop

Open `~/Library/Application Support/Claude/claude_desktop_config.json` and add:

**With uv:**

```json
{
  "mcpServers": {
    "email": {
      "command": "uv",
      "args": [
        "--directory", "/path/to/email-mcp-postale",
        "run", "server.py"
      ]
    }
  }
}
```

**Or with Python directly:**

```json
{
  "mcpServers": {
    "email": {
      "command": "python3",
      "args": ["/path/to/email-mcp-postale/server.py"],
      "env": {
        "EMAIL_MCP_CONFIG": "/path/to/email-mcp-postale/config.json"
      }
    }
  }
}
```

> Replace `/path/to/email-mcp-postale` with the actual path where you cloned the repo.

### 5. Restart Claude Desktop

After saving the config, fully quit and reopen Claude Desktop.
The email connector should appear as active under "Connectors".

## Scheduled Tasks (Cowork)

### Morning Briefing (daily, 7:00 AM)

```
Every morning at 7:00 AM:
1. Call get_all_unread_summary to fetch all unread emails across all accounts.
2. Categorize each email as:
   - 🔴 URGENT: Needs immediate reply (customers, partners, investors)
   - 🟡 REPLY NEEDED: Needs a reply, but not time-critical
   - 🟢 FYI: Just read, no action needed
   - ⚪ UNIMPORTANT: Newsletters, marketing, spam
3. Draft a reply for each 🔴 and 🟡 email using save_draft.
4. Mark ⚪ emails as read with mark_as_read.
5. Create a clear summary as a briefing.
```

### Cleanup Task (weekly, Friday 5:00 PM)

```
Every Friday at 5:00 PM:
1. Search all accounts for newsletter and marketing emails from the past week.
2. Create a list for batch deletion.
3. Show me the list for confirmation before deleting.
```

## Security Notes

- Passwords are stored in plaintext in `config.json` — protect the file with `chmod 600 config.json`
- Alternatively: use Postale.io app passwords (if supported)
- **Do NOT commit config.json to git**

## License

MIT