
Stalwart Mail Mcp
io.github.cybersmurfv2.3.0更新於 Oct 2, 2026
Mail and contacts on a self-hosted Stalwart server via JMAP: search, read, OCR, send, drafts.
概覽
讓助理透過 JMAP 在自架的 Stalwart 郵件伺服器上搜尋、閱讀、OCR、草擬、寄送郵件並管理聯絡人。
- 功能
- 使用信箱本身的認證透過 JMAP 連線 Stalwart 信箱。工具可列出信箱帳號與資料夾、搜尋郵件與郵件串、依 id 取得郵件與附件、擷取 PDF 文字並對掃描檔做 OCR、寄送新郵件或回覆、建立、寄送和刪除草稿,以及搜尋或新增聯絡人。另有遠端模式,可把伺服器跑在 Stalwart 旁邊當成自訂連接器。
- 適用情境
- 適合自架 Stalwart 郵件伺服器、希望助理協助分類、閱讀與回覆郵件(含掃描附件)的情境,不必在伺服器上安裝任何東西。也適用於小型自架環境中的共用信箱與通訊錄。
- 執行需求
- 以本機程序執行(npx 或 Claude Desktop 擴充套件),需要 Node.js。必須提供 STALWART_URL、STALWART_USER 與 STALWART_PASSWORD(或 OAuth 權杖),並能連線該伺服器。選用 OCR 需要服務商金鑰或本機模型;MAIL_LANG 等變數可調整行為。
安裝
在 SourceWeft 中
- 開啟 儀表板中的 Stalwart Mail Mcp,將其新增到工作區。
- 為需要使用其工具的對話啟用該服務。
Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。
其他 MCP 客戶端
參照 儲存庫 中的啟動說明。
README
Stalwart Mail MCP
An MCP server that lets Claude Desktop (or any MCP client that speaks stdio) work with a mailbox on your own Stalwart mail server: search and read mail including attachments and scans, reply in a thread, send, keep drafts, and look up or add contacts.
It talks JMAP with the mailbox's own credentials. Nothing is installed on the server.
There is also a remote mode: the same server run next to Stalwart, added to Claude as a custom connector, so the mailbox works in claude.ai, the mobile apps and every desktop chat — people sign in through Stalwart's own OAuth and the server holds no credentials. See docs/remote.md.
How it fits into a small self-hosted setup — reverse proxy, what to expose, shared mailboxes, branded builds for a family or a team — is described in docs/small-infrastructure.md.
Tools
Names carry a prefix, mail_ by default (a branded build can change it).
Sending is immediate and cannot be undone, so the tool descriptions tell the model to send only on the user's explicit instruction and to create a draft otherwise.
Install
Claude Desktop (extension)
Download stalwart-mail.mcpb from the
latest release and open it —
Claude Desktop offers to install it. Or build it yourself:
Fill in the server address, the mailbox e-mail and password. Optional: the language and a Mistral API key for OCR. The password is kept in the operating system's keychain.
Any MCP client (stdio)
The server is on npm as stalwart-mail-mcp
and in the MCP Registry as
io.github.cybersmurf/stalwart-mail-mcp, so no checkout is needed:
Claude Code: claude mcp add stalwart-mail --env STALWART_URL=https://mail.example.com --env [email protected] --env STALWART_PASSWORD=… -- npx -y stalwart-mail-mcp
Claude on the web, desktop chat and phone
Run the server next to Stalwart (stalwart-mail-mcp --http, or the Docker image) and add its
URL as a custom connector — step by step in docs/remote.md.
Configuration
What it is allowed to do
Every capability is a switch in the extension settings (or an env variable above), all on by default. A capability that is off is not offered as a tool at all, so it holds regardless of what the client's approval prompts remember:
- sending off → a mailbox Claude can read and draft in, but never send from;
- sending, drafts and contact edits off → a read-only mailbox;
- saving attachments off →
get_attachmentreads the file from a temporary copy and is annotated read-only; with saving on it writes to the download folder and is annotated as a writing tool, which clients may treat differently when asking for approval.
Approvals themselves ("allow once / always allow") belong to the client, not to this server. In Claude Desktop they are set per tool in the extension's settings; a client may ask again after an update that changes a tool's definition.
Attachments and OCR
mail_get_attachment downloads the file and returns what the model can read:
- text files as text, HTML converted to text;
- PDFs as text page by page (
page_from/page_tofor long ones); - PDF pages without a text layer (scans) and photos go to the OCR provider you choose —
the result is markdown including tables, and those pages are marked
(OCR). A mixed PDF sends only its scanned pages; - images are returned as images; anything above ~600 kB or in HEIC is downscaled on macOS
(
sips); - other types (docx, xlsx, zip…) are only saved, and the path is returned.
Without a provider, or with ocr: false, a scan comes back as an image of page 1 (macOS) with
a note. OCR is the only thing in this server that sends content anywhere besides your mail
server — to the provider you picked, or nowhere at all with a local model.
OCR providers
MAIL_OCR_API_KEY, MAIL_OCR_MODEL and MAIL_OCR_BASE_URL complete the choice. Examples:
Providers that take images only get each scanned page as a PNG taken out of the PDF (the scan itself, scaled to 2000 px). A page that is not one big picture cannot be handed to them and is reported as unread; Mistral and Anthropic read any PDF. Pages are sent three at a time.
Things to expect: a local model can need a minute or more per dense page, which may exceed
your client's tool timeout — read long scans in page ranges. General vision models transcribe
well but, like every OCR, can misplace cells in tables with graphics; preview: true adds the
page image so the model can check. With anthropic, a declined request is retried
server-side on a fallback model (fallbacks: "default") on the current Claude models.
node test/live-ocr.mjs runs the provider configured in the environment against a scanned
fixture (or your own file) and prints the result.
Languages
Tool titles, descriptions, output and error messages are localized. English is the source, Czech is written by hand, and German, Spanish, French, Italian, Dutch, Polish, Portuguese and Slovak are machine translations that no native speaker has reviewed yet — corrections are welcome.
To add or fix a language edit src/locales/<code>.ts (copy en.ts, keep the {placeholders}
and line breaks) and register it in src/locales/index.ts. A locale may be partial; missing
keys fall back to English. npm run test:offline checks every locale against the English keys.
Branded builds (presets)
For a family or a team you can ship an extension where the server address is pre-filled and
people only type their e-mail and password. A preset is a folder with its own manifest.json
(and optionally icon.png); see presets/example.
The preset's manifest sets MAIL_TOOL_PREFIX, MAIL_BRAND, MAIL_LANG or
MAIL_DOWNLOAD_DIR through env, and gives server_url a default. Keep the preset's name
stable so Claude Desktop treats new builds as updates.
Tests
The offline test covers attachments, OCR, the tool prefix, language selection and locale
consistency. The smoke test creates a draft and deletes it; with --send it leaves one test
message in the mailbox.
Good to know
- A wrong password gets the IP banned by Stalwart after a few attempts. The server signs in on the first tool call, not at start, so restarting the client does not cause bans; calling tools repeatedly with a wrong password does.
- Built for and used with Stalwart 0.16. The mail part is plain RFC 8620/8621 and may work with other JMAP servers, but that is untested; contacts need JMAP for Contacts (RFC 9610).
Email/querywith"inMailbox": nullis rejected by Stalwart — the filter must be absent or carry an id.- The extension bundle is one CommonJS file (~3.8 MB, most of it pdf.js from
unpdf); the.cjsextension matters becausepackage.jsonsays"type": "module". - A tool result in Claude Desktop is capped at about 1 MB, hence the 600 kB limit for inline images.
License
MIT
來源:README.md,提交 b137704
工具
0版本歷史
1- v2.3.0最新Oct 2, 2026

