Skip to main content
Glama
shaack

mcp-for-apple-mail

by shaack
README.md
# mcp-for-apple-mail

Ein kleiner MCP-Server (Model Context Protocol), der Apple Mail auf dem Mac per
AppleScript kapselt. Er hilft, Rechnungs-PDFs aus dem Posteingang zu finden und
gezielt abzulegen, ohne Zugangsdaten zu hinterlegen: Apple Mail hat eine
vollständige AppleScript-Schnittstelle und die Konten sind bereits eingerichtet.

## Was ist ein MCP-Server?

MCP (Model Context Protocol) ist ein offener Standard, über den KI-Anwendungen
(der Host, etwa Claude Desktop oder Claude Code) mit externen Werkzeugen und
Daten sprechen. Ein Server stellt Fähigkeiten bereit und weiß selbst nichts von
KI. Drei Arten:

- **Tools** — Aktionen, die das Modell aufrufen kann (hier: suchen, speichern).
- **Resources** — Daten zum Lesen (hier nicht genutzt).
- **Prompts** — Vorlagen (hier nicht genutzt).

Kommunikation läuft über JSON-RPC 2.0, hier per stdio (lokaler Prozess).

## Tools

| Tool | Zweck |
|------|-------|
| `list_mailboxes` | Alle Konten und Mailboxen als `<Konto>:<Mailbox>` auflisten |
| `search_messages` | Nach Absender-Stichworten und/oder nur geflaggten Nachrichten im Zeitfenster suchen, mit Anhangnamen und Flaggen-Markierung (⚑) |
| `save_attachment` | Ersten passenden PDF-Anhang (Name enthält Schlüssel, endet auf .pdf) speichern |
| `get_message_body` | Klartext-Inhalt der ersten passenden Nachricht lesen (für Belege ohne PDF) |
| `flag_message` | Fahne an genau einer Nachricht setzen/entfernen, optional mit Farbe; bei mehrdeutigem Schlüssel passiert nichts |

## Installation

```bash
npm install
```

Kein Build-Schritt: reines ESM-JavaScript, läuft direkt mit Node (>= 18).

## Konfiguration

Die zu durchsuchenden Mailboxen stehen in einer lokalen `config.json`, die
**nicht** eingecheckt wird (in `.gitignore`). Vorlage kopieren und die eigenen
Konten eintragen:

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

Format je Eintrag `<Konto>:<Mailbox>`. Die exakten Namen liefert das Tool
`list_mailboxes`. Fehlt die `config.json`, greifen generische Platzhalter.

Alternativ übergibt der Aufrufer die Mailboxen je Tool direkt im
`mailboxes`-Parameter.

## Lokal testen

Mit dem MCP Inspector zum Durchklicken der Tools:

```bash
npm run inspect
```

Oder direkt starten (wartet dann auf JSON-RPC über stdin):

```bash
npm start
```

Beim ersten echten Lauf fragt macOS nach Automatisierungs-Zugriff auf Mail.
Einmal erlauben.

## In Claude Code registrieren

```bash
claude mcp add apple-mail -- node /absolute/path/to/mcp-for-apple-mail/src/index.js
```

## In Claude Desktop registrieren

In `~/Library/Application Support/Claude/claude_desktop_config.json`:

```json
{
  "mcpServers": {
    "apple-mail": {
      "command": "node",
      "args": ["/absolute/path/to/mcp-for-apple-mail/src/index.js"]
    }
  }
}
```

## Beispielablauf

1. `list_mailboxes`, um die exakten Konto- und Mailboxnamen zu sehen.
2. `search_messages` mit `vendors: ["hosting", "software-vendor"]` und
   `fromDate: "2026-04-01"`, um zu sehen, welche Rechnungen als PDF vorliegen
   (Treffer zeigen die Anhangnamen in `ATT{...}`).
3. Pro Treffer `save_attachment` mit `subjKey`, `attKey` und `destPath`, z. B.
   nach dem Schema `YYYY-MM/YYYY-MM-DD <Anbieter> <Beleg>.pdf`.

## Grenzen

- Nur macOS mit Apple Mail.
- Anbieter mit reinem Portal liefern per Mail kein PDF und müssen weiter manuell
  geladen werden.
- Steht die Rechnungsnummer nur im Anhang, nicht im Betreff, erst mit
  `search_messages` prüfen, wo der Schlüssel steht.

## Lizenz

MIT

TDQS

A3.9/5.0

Scored across 5 tools

Disambiguation4/5

Most tools are clearly distinct in purpose: save_attachment extracts files, get_message_body reads text, flag_message toggles flags, list_mailboxes enumerates folders, search_messages queries. The main potential confusion is between get_message_body and save_attachment since both target 'the first matching message' and both depend on subjKey/senderKey, but their outputs differ enough that overlap is limited.

Naming Consistency3/5

All names follow a verb_noun snake_case convention (save_attachment, get_message_body, flag_message, list_mailboxes, search_messages), which is fairly consistent. The verbs vary in tone (save, get, flag, list, search) without a strong single pattern, but overall the naming is readable and predictable.

Tool Count4/5

Five tools is on the smaller side but appropriate for a narrowly-scoped mail-processing server aimed at handling invoices/attachments. Each tool serves a distinct, useful purpose and the count feels justified for the stated domain rather than overly thin.

Completeness3/5

The tools cover the core workflow of finding messages, reading bodies, extracting attachments, and flagging, which is reasonable. However, there are notable gaps: no way to move messages between mailboxes, delete messages, search by content within attachments beyond the first PDF, or handle multiple-attachment messages. The set is oriented around a narrow 'process invoices/receipts' workflow rather than general mail management.

Maintenance

ActivitySlowing
ResponsivenessNo issues