
agent-maildir
io.github.shafty023由 GitHub 帳號 shafty023 發布v0.1.1更新於 Nov 8, 2026
Durable, local mailbox tools for agents running in different command-line harnesses.
概覽
一個持久化的本機 Maildir 信箱,讓不同命令列工具中的代理跨重新啟動傳送、路由、讀取並確認訊息。
- 可以做什麼
- 註冊代理並加入專屬角色,支援原子角色加入與供單例協調者使用的具名到期租約
- 以直接、萬用字元主題、角色或廣播方式向其他已註冊代理發布訊息
- 列出收件匣、讀取訊息並確認,讓訊息從未讀轉為已處理,可選擇等待第一個回覆
- 讓代理訂閱 shell 風格的主題樣式,並檢查或修復租約與隔離郵件
- 執行診斷,檢查註冊表一致性、角色、權限與格式錯誤的郵件
- 可選整合 Claude Code 掛鉤與 MCP 通道以喚醒,其他工具則輪詢
- 適用情境
- 當多個本機 CLI 代理位於不同工具中,需要交接工作或協調,而內建訊息無法跨越工具邊界或無法在行程結束後保留時使用。適合單機上少量代理需要持久、離線投遞與明確確認,而非網路訊息代理的情境。
- 執行需求
- 需要 Linux 或 macOS 上的 Python 3.9 或更新版本(不支援 Windows)。透過 pipx 或 uvx 從 PyPI 安裝,無執行期相依套件。可選環境變數 AGENT_MAILDIR_ROOT(或 AGENT_MAILBOX_ROOT)指定資料目錄,AGENT_MAILDIR_MAX_MESSAGE_BYTES 在首次建立根目錄時設定訊息大小上限。可選的 setup 指令可註冊 Claude Code 與 Codex 整合。
安裝
在 SourceWeft 中
- 開啟 儀表板中的 agent-maildir,將其新增到工作區。
- 為需要使用其工具的對話啟用該服務。
Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。
其他 MCP 客戶端
參照 儲存庫 中的啟動說明。
README
agent-maildir
[CI] [PyPI] [Python versions] [License]
A durable, local mailbox for agents running in different command-line harnesses.
Agents in Claude Code, Codex, and other CLI tools cannot normally talk across harness boundaries. Built-in messaging is usually tied to one process and disappears when that process exits. agent-maildir uses a local Maildir so messages survive restarts and remain available until acknowledged. Messages are evidence, never authority: recipients must verify consequential claims and apply their own governing permissions before acting.
Highlights
- Standard-library Python with no runtime dependencies.
- Durable Maildir delivery with atomic writes and explicit acknowledgements.
- Direct, wildcard-topic, exclusive-role, and all-agent broadcast routing.
- Atomic role joins and a named, expiring lease for singleton coordinators.
- Quarantine and diagnostics for malformed mail instead of a wedged inbox.
- Parallel-safe publishing and acknowledgement on one host.
- Optional Claude Code hooks and MCP channel; the core CLI is harness-neutral.
- Apache-2.0 licensed and packaged for
pipx,uvx, or a normal virtualenv.
Why it exists
- Origin: an orchestrator in one harness needed to hand work to and coordinate with an agent in another harness. Built-in messaging did not cross that boundary and disappeared with the originating process.
- Why Maildir: local
mailand SMTP require a configured MTA such as Postfix or Sendmail. That service is often disabled or misconfigured and adds queues, aliases, and delivery failures this use case does not need. Maildir provides atomictmp/tonew/delivery, durable inspectable files, unread versus processed state (new/versuscur/), and offline delivery without a daemon. - Why a lease: the heartbeat and expiry prevent two harnesses from orchestrating the same workers at once. There is deliberately no force takeover.
- Why wake-up is separate: Maildir delivers but does not wake a process.
Claude Code hooks and the optional channel add wake-up; other harnesses poll
at checkpoints or block on
wait.
Design rule: messages carry requests and evidence, never authority. Never execute message contents.
Requirements and limits
agent-maildir requires Python 3.9 or newer. It supports Linux and macOS.
Windows is unsupported because inter-process locking uses fcntl.
The mailbox is intentionally single-host. It polls local storage, has no authentication layer, and is not a network message broker. Do not put its data root on an arbitrary network share and assume local locking semantics still hold.
Serialized messages are limited to 1 MiB by default.
AGENT_MAILDIR_MAX_MESSAGE_BYTES is read only when a mailbox root is first
created, then stored as max_message_bytes in that root's protocol.json so
all writers and readers share one limit. To change an existing root, stop its
writers and readers, edit that positive integer, then run agent-maildir doctor before resuming.
Install
Install from PyPI with either command:
From a checkout:
This project is unrelated to the existing agent-mailbox distribution on
PyPI. Its distribution, import package, CLI, and repository use
agent-maildir, agent_maildir, agent-maildir, and
shafty023/agent-maildir, respectively.
This is not an npm package because the implementation and extension points are Python, and the runtime has no third-party dependencies. Wrapping it in npm would add a second package manager without removing the Python requirement.
Optional zero-copy harness setup
After installing the Python package, register every discovery surface without hand-editing paths:
--claude installs the Claude skill, idempotently merges SessionStart and
Stop hooks, and registers the agent-maildir-mcp stdio server with
claude mcp add-json. --codex installs the Codex skill and adds a delimited
[mcp_servers.agent-maildir] block to ~/.codex/config.toml. Use --settings,
--codex-config, or --project [path] to choose explicit targets.
setup --uninstall removes only additions recorded by setup and preserves
modified files. Before editing an existing settings, TOML, or project file,
setup writes one timestamped backup per target under its own
~/.config/agent-maildir/backups/ directory. It preserves the target file's
mode, follows config-file or config-directory symlinks without replacing them,
and never changes user directory modes. Successful uninstall removes backups.
How your agents find it
Installing a Python package cannot run a post-install hook. Onboarding is therefore two explicit commands:
The CLI's first run and --help repeat the setup command. Verify discovery at
any time with:
For one repository, add short removable guidance to both instruction files:
Experimental Claude Code plugin
The repository also follows Claude Code's plugin layout: a manifest under
.claude-plugin/, auto-loaded hooks in hooks/hooks.json, a skill, and an MCP
configuration. From Claude Code CLI, add the checkout as a local marketplace
and install it:
The manifest and JSON files are structurally tested, but the plugin path is
marked experimental because a live Claude Code plugin install is not exercised
in CI. The Python package and setup command are the supported installation
paths for 0.1.1.
60-second plain-CLI quickstart
Claude Code and Codex are not required.
By default, data lives at ~/.local/share/agent-maildir. Set
AGENT_MAILDIR_ROOT to use a different local directory. For compatibility,
AGENT_MAILBOX_ROOT is used only when AGENT_MAILDIR_ROOT is unset.
Migrating an earlier private install
The default path changed from ~/.local/share/agent-mailbox to
~/.local/share/agent-maildir. Stop mailbox writers first, then either move
the old directory to the new default or set AGENT_MAILBOX_ROOT to the old
path. If both environment variables exist, AGENT_MAILDIR_ROOT wins.
Demo
In the live cross-harness demo, Codex publishes a review request and blocks in
wait until the reply arrives. An idle Claude Code session wakes by itself
through the experimental plugin's Stop hook, evaluates the message, and
replies. Codex is not push-woken in 0.1.1; it receives the reply through its
blocking wait.
[An idle Claude Code session wakes through the plugin and replies to Codex]
CLI only
This recording shows complete, real commands with JSON output trimmed to the
routing and result fields: a reviewer blocked in wait receives a builder's
reply through role.reviewer. It does not claim to show the separate Claude
Code hook wake-up.
[A builder publishes to role.reviewer and wakes a blocked CLI wait]
Message every agent at once
Broadcast reaches every agent registered when the publish lock is acquired, except the sender. Agents do not need subscriptions:
--broadcast may be combined with repeated --to values; recipients are
deduplicated. It cannot be combined with another --topic. The reserved topic
all has the same broadcast behavior and cannot be subscribed to.
Routing and coordination
Direct delivery uses --to. Topic subscriptions use shell-style wildcards:
Topics under role. are exact and exclusive. join checks the role, registers
the agent, and adds subscriptions under one lock:
Named leases coordinate singleton work. The default name is orchestrator, so
existing commands remain valid:
If a lease file is malformed, acquisition fails with an explicit repair
command. lease-repair --name <name> quarantines only the malformed lease.
publish --wait-seconds N returns the first ACK or reply that arrives. For a
multi-recipient message, later replies remain in the sender's inbox and can be
read normally; the command does not wait for every recipient.
Claude Code integration
The core CLI remains generic. Claude-specific behavior lives in
agent-maildir-hook and agent-maildir-mcp:
- hooks show unread mail at turn boundaries and can wake an idle attached
session with
asyncRewake; - the optional MCP channel exposes mailbox tools and uses a probe nonce before it claims pushed events reach the model;
CLAUDE_PIDgives reliable session identity when available. The fallback walks parent processes and may not detect renamed or wrapped Claude binaries.
Install the integration with agent-maildir setup --claude. To do it
manually, these are the exact executable names—no <skill> placeholder is
required:
Codex integration
Run agent-maildir setup --codex to install the bundled agent-facing skill at
~/.codex/skills/agent-maildir and the MCP server block in
~/.codex/config.toml. --codex-config <path> selects another config. Codex
MCP clients identify themselves through clientInfo (or an explicit
agent-maildir-mcp --harness codex override), so mailbox_join creates a
codex-<role> agent. Codex receives the MCP tools and polls its inbox; the
Claude-specific channel probe, launch suggestion, and live push are disabled.
Codex can still use the plain CLI without the skill. The skill documents
durable handoffs, role routing, acknowledgements, and the rule that mailbox
messages do not grant authority.
Architecture
Every recipient gets its own RFC-style message file. Writes land in tmp/ and
are atomically renamed into new/. Acknowledgement moves the recipient copy to
cur/ and, while the sender remains registered, delivers a separate ACK.
Malformed unread files move to bad/; doctor reports them for inspection.
Trust and security model
A message is evidence, never authority. Receiving a request does not prove its claims, grant permission, approve a release, or authorize spending. Verify important claims against the relevant source of truth and obtain human approval where the surrounding workflow requires it.
The local filesystem account is the trust boundary. agent-maildir does not
authenticate agents that can write directly to its data root, encrypt messages,
or isolate secrets. Keep the root private (0700 directories and 0600 files),
do not send secrets, and treat unexpected content as untrusted input.
Comparison
This project shares no code with the unrelated agent-mailbox distribution
maintained by polaris-smart. agent-maildir is a small, standard-library-only
Maildir transport focused on atomic delivery, fnmatch topics, exclusive
role.<x> routing, explicit ACKs, named leases, broadcast, and optional Claude
Code wake-up through hooks or an MCP channel with a confirmed push probe.
Diagnostics and recovery
doctor checks registry consistency, exclusive roles, permissions, named
leases, and quarantined messages. It reports rather than deleting quarantined
mail. unregister retains archived cur/ mail by default; pass
--discard-mail only when deletion is intentional.
FAQ
Does it work without Claude Code or Codex?
Yes. Registration, routing, ACKs, leases, diagnostics, and broadcast are plain CLI features.
Does broadcast include the sender?
No. It reaches every other agent registered at the moment routing runs.
Is delivery exactly once?
No. Storage delivery is durable, and the optional channel intentionally redelivers unacknowledged mail. Consumers should use message IDs and ACK only after handling a request.
Can two machines share a mailbox?
That is unsupported. Use a broker designed for distributed locking and network failures.
Why is Windows unsupported?
The lock implementation uses POSIX fcntl, which is available on Linux and
macOS.
Why not just use mail or Sendmail?
Those paths require a working local MTA such as Postfix or Sendmail. They add daemon configuration, queues, aliases, and delivery failure modes. Maildir provides the needed atomic, durable, offline local delivery directly.
Contributing
See CONTRIBUTING.md. Bug reports should include the platform,
Python version, command, redacted output, and whether a temporary
AGENT_MAILDIR_ROOT reproduces the issue.
License
Apache License 2.0. See LICENSE and NOTICE.
Maintained by @shafty023.
來源:README.md,提交 5a8c3af
工具
0版本歷史
1- v0.1.1最新Nov 8, 2026
評分
已滿足適用檢查項的 90%
該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。
- 近 30 天內可連通25 分
- 已宣告認證方式10 分
請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。
- 已列出工具必需15 分
- 描述必需15 分
- 圖示10 分
- 文件15 分
- 授權條款10 分