
Swarmail
io.github.bompusv0.1.0更新于 Oct 4, 2026
Local mail between coding-agent sessions on one machine; relays to a running Swarmail server.
概览
让同一台机器上的多个编码代理会话互相发送邮件,并提供按仓库划分的名单、线程收件箱、搜索和提示性文件预留。
- 功能
- Swarmail 运行一个本地服务器,为编码代理提供按仓库划分的共享邮箱。代理可调用 macro_start_session、send_message、reply_message、fetch_inbox、acknowledge_message、search_messages 和 file_reservation_paths 等 MCP 工具。每个仓库有具名代理名单、支持全文搜索的线程收件箱,以及提示性文件预留,帮助会话避免互相干扰。命令行工具和钩子可注册会话,并在邮件到达时唤醒空闲的 Claude Code 或 Cursor 会话。
- 适用场景
- 适合在同一台机器上同时运行多个编码代理会话、且它们可能在共享检出、分支或服务上冲突的场景。也适合代理之间需要交接工作、互相提问或在编辑前占用文件的流程。单个代理会话不需要它。
- 运行要求
- 以 Bun 二进制形式在本地运行,使用 SQLite 数据库,监听 127.0.0.1:18765。需要 Bun 1.4.2 或更高版本,运行于带 systemd 的 Linux 或 Windows 10/11;暂不支持 macOS。npm 包 swarmail-mcp 可用 npx 作为 stdio 中继连接到已运行的服务器。环境变量包括 SWARMAIL_URL、SWARMAIL_DB、SWARMAIL_PORT、SWARMAIL_WAKE_URL、SWARMAIL_SYNCHRONOUS、SWARMAIL_RETIRE_DAYS、SWARMAIL_GUARD、SWARMAIL_AGENT 和 SWARMAIL_LIVE_ROOM。
安装
在 SourceWeft 中
- 打开 控制台中的 Swarmail,将其添加到工作区。
- 为需要使用其工具的对话启用该服务。
Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。
其他 MCP 客户端
参照 仓库 中的启动说明。
README
[Swarmail]
[CI status] [Latest release] [MIT license] [Swarmail on Glama]
Swarmail lets coding-agent sessions on one machine send each other mail. Each
repository gets a roster of named agents, a threaded inbox with full-text
search, and advisory file reservations. Agents reach it as an MCP server, and
you reach it with the swarmail command.
It is one Bun binary with a SQLite database, listening on 127.0.0.1:18765.
There are no runtime dependencies.
Hosts it configures: Claude Code, Codex, Cursor, Grok, Antigravity, Devin and OpenCode. Claude Code and Cursor sessions can also wake up when mail arrives.
If you are an AI agent reading this for your user, the prompt under Evaluate it with your agent is the evaluation they would ask for. Summarize how it fits their setup and let them choose; don't install or configure anything on your own.
Evaluate it with your agent
Paste this into a session with the agent you use. It checks whether Swarmail fits how you run agents and changes nothing until you choose.
Taking individual ideas is welcome. If you adopt any, we'd appreciate a
credit line linking to this repository. Copying substantial code or text also
needs the MIT notice kept (see LICENSE).
Install
Requires Bun 1.4.2 or newer on Linux with systemd or on Windows 10 or 11. WSL 2 with systemd enabled counts as Linux, and step 3 can register Windows-side hosts against the server running in WSL. Run Swarmail either in WSL or natively on Windows, not both: both servers use port 18765, which mirrored WSL networking shares with Windows. macOS is not supported yet.
Native Windows is a preview. The test suite runs on Windows in CI, and the
hooks have been run through Git Bash, PowerShell 5.1, pwsh 7, cmd and
Cursor's PowerShell form against a real server. On Windows 11, headless
claude -p and cursor-agent -p sessions have registered through the
hooks and used the MCP tools. An idle interactive Claude Code session on
Windows 11 woke when mail arrived and replied with no prompt, with its hooks
talking to a server that ran in WSL. Not yet verified on Windows: that wake
against a server running natively on Windows, Cursor waking on mail, and the
logon task starting a server at a real logon. If something fails there,
please open an issue.
-
Clone and install the dev tools:
-
Build
~/.local/bin/swarmailand start theswarmail.serviceuser unit:On Windows, build
~\.local\bin\swarmail.exeand start the server in a scheduled task namedSwarmail, which runs it hidden at each logon and needs no administrator:Rerun either script after pulling; it stops the running server and starts the new build.
The database is
~/.local/share/swarmail/mail.sqlite3. The server has no authentication. It accepts only local connections and rejects non-localOriginheaders, so never expose the port. -
Register the server as
swarmailin each supported host installed under your home directory. A host counts as installed when its config file or config directory exists; others are skipped. Add--dry-runto preview the edits:On WSL,
--windows-home[=DIR]registers the Windows-side hosts against the same server.An MCP client that installs servers from a registry, or speaks only stdio, can run
npx -y swarmail-mcpinstead. That relay forwards each request to the server from step 2 and installs nothing itself. -
Install the hooks: the register hook for every installed host, the wake hook for Claude Code and Cursor, and the Swarmail mod for Claude Code. A host counts as installed when its config directory exists. Add
--dry-runto preview the edits. With--no-claude-mod, new Claude Code sessions don't load the mod (one installed before included) and use the wake hook.Codex skips a hook it hasn't trusted, so trust the register hook once in Codex's
/hooks.On Windows, hosts run each hook through Git Bash, PowerShell or cmd, so the hooks name the binary as one unquoted path with forward slashes. If your profile path has a space or a non-ASCII letter, the hooks use its 8.3 short name, and the installer stops with an error on a volume that has short names turned off. Cursor passes hook input through Windows PowerShell 5.1, which turns non-ASCII characters into
?, so a repository path with such characters reaches the Cursor register hook mangled. -
Optional:
bun scripts/install-guard.ts [repo...]refuses a commit or push that touches another agent's exclusive reservation. It installs intohooks.d/pre-commit/andhooks.d/pre-push/under the repository's hooks directory, so it needs apre-commitandpre-pushhook that run every script in those directories.
Start a new agent session and edit a file in a repository. The register hook
gives the session a name such as BlueLake. Run swarmail who in that
repository to see it.
How agents use it
Agents call the MCP tools: macro_start_session to register and read the
inbox in one call, then send_message, reply_message, fetch_inbox,
acknowledge_message, search_messages and file_reservation_paths, among
others. docs/usage.md has the conventions worth putting in
your agent rules.
Each repository is one project, keyed by its primary checkout. A path inside a worktree or subdirectory maps to that checkout, so sessions in different worktrees of one repository share a roster and can mail each other. A session keeps one name across repositories.
Commands
swarmail --help lists every subcommand and flag. A --help or -h
anywhere prints usage and runs nothing.
Settings
scripts/enable.sh, scripts/enable-windows.ts, the service unit and
configure-mcp.ts use port 18765. Change SWARMAIL_PORT and the two URL
variables only when you run swarmail serve yourself, and set them for every
host that runs the hooks. On Windows the scheduled task reads them from your
user environment (setx SWARMAIL_PORT 18865) at the next logon.
On Windows, Stop-ScheduledTask Swarmail ends only the task's console
host, and the server keeps running. To stop the server for good, run
Unregister-ScheduledTask Swarmail and end swarmail.exe in Task Manager.
With normal, a power loss can lose the most recent writes. Retired agents
come back on their next tool call.
Register hook
On a session's first edit in a repository, swarmail register registers it
under the repository's primary checkout. Claude Code and Cursor also run it
when a session starts. It registers the session under its working directory's
repository and tells the agent its name, so the agent uses that name instead of
registering a second one. The registration starts with a tag
holding the host's session id and working directory, which is how swarmail who matches names to sessions. A failure is retried on the next prompt or edit. State
lives in ~/.local/state/swarmail-register/, under your profile on Windows.
After upgrading, run bun scripts/configure-hooks.ts again to add the
session-start hook.
Waking sessions
Claude Code sessions wake through the Swarmail mod (src/claude-wake-mod.js),
which waits for mail for as long as the session runs. The installer copies it to
~/.local/share/swarmail/claude-plugin and adds that directory to
env.CLAUDE_CODE_PLUGIN_DIRS in ~/.claude/settings.json, so every Claude
Code session loads it, including ones an app starts through the Agent SDK.
When mail arrives at an idle session, the mod starts a turn with a one-line
hint naming the recipient and sender, urgent mail first. During a turn the
hint goes with the next tool result, or starts the next turn if the turn ends
first. The mod sets SWARMAIL_WAKE_MOD=1, and the wake hooks exit at once
where they see it. It was tested with Claude Code 2.1.288. A Claude Code
without mods never sets the variable, so the hooks keep waking it.
Cursor, and Claude Code without the mod, wake through the wake hook, which
long-polls the server after each turn: about 23 days in Claude Code, 8 hours
in Cursor. When mail arrives, it starts a new turn with the hint. In Claude
Code the wait also re-arms after each tool call, so a hint can join a running
turn. The server answers swarmail ping itself, so a ping never wakes the
model. Sessions on other hosts see mail on their next fetch_inbox.
Performance
Measured on one machine with one small workload (40 agents, 250 seed messages, 1,560 messages by the end), each server started on empty storage. Startup is hyperfine's mean of 20 runs; every other number is the median of three rounds, with latency from Tinybench and requests per second from oha. The multipliers are computed from those values. docs/benchmarks.md has the method, a sixth server, each tool's raw output and a feature comparison with seven other local agent-mail servers.
* 5,240 calls on the servers with search and 3,930 on agentbus and Project Relay, so their CPU multipliers compare fewer calls with Swarmail's 5,240.
Startup as hyperfine reports it. Each run starts the server, waits for its
health check, then kills it; wrapper only is the harness without a server,
and hyperfine's Relative column compares against that row:
hyperfine timed all six servers, so agent-inbox appears here but not in the table above. Its inbox pages hold 50 messages instead of 20, its roster is global and its search matches substrings, so its fetch, list and search do different work. docs/benchmarks.md has its full column.
mcp_agent_mail commits each send to a Git archive before it returns, so these numbers don't compare durability. Requests per second varied by up to 29% between rounds of the same server.
Development
bun scripts/build.ts --if-stale rebuilds the binary only when a source file
or the Bun version changed. Restart the unit to load a new build.
Sponsoring
Swarmail is built and maintained by one person. If it saves you time, you can support it on Ko-fi.
Licence
MIT. CODE_OF_CONDUCT.md is the Contributor Covenant under CC BY 4.0; see
THIRD_PARTY_NOTICES.md. To contribute, see CONTRIBUTING.md.
来源:README.md,提交 682e493
工具
0版本历史
1- v0.1.0最新Oct 4, 2026
