Skip to main content
Glama

Kiro Agent-Mailbox

MCP-Server für Cross-Session-Messaging zwischen gleichzeitig laufenden Kiro CLI-Terminal-Sessions (oder anderen MCP-Clients) auf derselben Maschine.

Problem

Mehrere Kiro-CLI-Sessions laufen parallel in verschiedenen Terminals — eine arbeitet an einem Feature, eine andere an Infrastruktur/DevOps-Aufgaben. Häufig entsteht während der Arbeit in Session A eine Anforderung, die eigentlich in Session B gehört ("der Server braucht dafür einen neuen Endpoint", "das Deployment muss angepasst werden"). Bisher musste man das manuell kopieren oder sich merken.

Agent-Mailbox löst das: Sessions registrieren sich unter einem frei wählbaren Namen, können sich gegenseitig Nachrichten schicken, und die empfangende Session antwortet, nachdem sie die Aufgabe umgesetzt (oder als Issue angelegt) hat.

Related MCP server: set-agent-comm

Funktionsweise

sequenceDiagram
    participant A as Session "devops"
    participant FS as Dateisystem (AGENT_MAILBOX_DIR)
    participant B as Session "backend"

    A->>FS: register("devops")
    B->>FS: register("backend")
    A->>FS: list_agents()
    FS-->>A: [devops, backend]
    A->>FS: send_message(to="backend", text="...")
    Note over B: naechster Turn / Hook-Trigger
    B->>FS: check_inbox()
    FS-->>B: neue Nachricht von devops
    B->>FS: reply(message_id, status="erledigt", text="...")
    A->>FS: check_replies()
    FS-->>A: Antwort von backend

Kein Daemon, kein Netzwerk-Port: Jeder MCP-Tool-Call startet/nutzt den Server-Prozess pro Session (stdio-Transport). Der eigentliche Zustand liegt ausschließlich auf der Platte (JSON/JSONL-Dateien) und wird per flock synchronisiert — dadurch funktioniert das Messaging auch zwischen völlig unabhängigen Prozessen, solange sie auf dasselbe AGENT_MAILBOX_DIR zeigen.

Wichtig: Dies ist ein lokales Messaging-System für Sessions auf derselben Maschine. Es gibt keine Netzwerkkomponente — für Cross-Rechner-Messaging müsste AGENT_MAILBOX_DIR auf einen synchronisierten Speicherort zeigen (z.B. ein Netzwerklaufwerk), was zusätzliche Vorsicht bei Nebenläufigkeit erfordert und nicht Teil dieses Projekts ist.

Tools

Tool

Beschreibung

register(name)

Registriert die aktuelle Session unter einem frei wählbaren Namen

list_agents(include_inactive=False)

Listet alle registrierten Sessions mit Status

send_message(to, text)

Sendet eine Nachricht an eine andere registrierte Session

check_inbox()

Prüft die eigene Inbox auf neue Nachrichten, aktualisiert Heartbeat

reply(message_id, status, text)

Beantwortet eine Nachricht, Antwort geht an den Absender

check_replies()

Prüft, ob auf eigene gesendete Nachrichten geantwortet wurde

Installation

Von PyPI

pip install kiro-agent-mailbox

Mit uv

uv pip install kiro-agent-mailbox

Aus dem Quellcode

git clone https://github.com/intershopper/kiro-agent-mailbox
cd kiro-agent-mailbox
pip install -e .

Konfiguration

In ~/.kiro/settings/mcp.json (global) oder .kiro/settings/mcp.json (Projekt):

{
  "mcpServers": {
    "agent-mailbox": {
      "command": "agent-mailbox-mcp",
      "env": {
        "AGENT_MAILBOX_DIR": "~/.agent-mailbox"
      },
      "autoApprove": [
        "list_agents",
        "check_inbox",
        "check_replies"
      ]
    }
  }
}
  • AGENT_MAILBOX_DIR ist optional — Default ist ~/.agent-mailbox.

  • Nur die lesenden Tools (list_agents, check_inbox, check_replies) sollten auto-approved werden. register, send_message und reply verändern Zustand bzw. stellen einer anderen Session etwas zu und sollten bestätigt werden.

Automatisches Verhalten per Hooks (empfohlen)

Damit Sessions sich beim Start selbst anbieten und die Inbox bei jedem Turn prüfen, in der Agent-Konfiguration (~/.kiro/agents/<name>.json):

{
  "hooks": {
    "agentSpawn": [
      { "command": "echo 'Agent-Mailbox verfuegbar -- frage den User nach Registrierung (register-Tool)'" }
    ],
    "userPromptSubmit": [
      { "command": "echo '[Agent-Mailbox] check_inbox + check_replies aufrufen, falls registriert'" }
    ]
  }
}

Siehe Kiro CLI Hooks-Dokumentation für Details zum Hook-System.

Lebenszyklus / Heartbeat

  • check_inbox() aktualisiert bei jedem Aufruf den Heartbeat der eigenen Registrierung.

  • Sessions, die 30 Minuten lang nicht mehr check_inbox aufgerufen haben, gelten in list_agents() als inaktiv und werden standardmäßig ausgefiltert (nicht hart gelöscht — mit include_inactive=True weiterhin sichtbar).

  • Ein Name, dessen Session abgelaufen ist, kann von einer neuen Session übernommen werden.

Entwicklung

python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
pytest

Lizenz

MIT, siehe LICENSE.

Available Tools

6 tools
check_inboxA

Prueft die eigene Inbox auf neue, noch offene Nachrichten und aktualisiert gleichzeitig den eigenen Heartbeat (haelt die Registrierung aktiv). Sollte am Anfang jedes Turns aufgerufen werden.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it discloses a non-obvious side effect: the call also refreshes the heartbeat and keeps the registration alive. That dual-purpose behavior is exactly the kind of context an agent could not infer from the empty schema. It omits auth, rate-limit, or failure-mode details, but the key behavioral trait is surfaced.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no filler, and the primary purpose is front-loaded before the usage instruction. The parenthetical explaining why the heartbeat matters is compact and earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and there are no parameters to document. Purpose, trigger timing, and the heartbeat side effect together give an agent everything needed to call this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline for a parameterless tool applies. No parameter claims are made that could mislead.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Prueft die eigene Inbox auf neue, noch offene Nachrichten") and the scope is narrow enough to be actionable. It does not explicitly distinguish itself from the sibling check_replies, so the agent must infer the boundary between the two.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Sollte am Anfang jedes Turns aufgerufen werden" gives an explicit, concrete trigger for when to call it, which is strong usage guidance. It names no alternatives or when-not conditions, so it stops short of the top score.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_repliesA

Prueft, ob auf eigene gesendete Nachrichten geantwortet wurde. Antworten liegen als Eintraege mit type="reply" in der eigenen Inbox und werden hierueber separat von normalen Nachrichten ausgewertet.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It does disclose a useful data-model detail (replies are entries of type="reply" in one's own inbox, evaluated separately from normal messages), but says nothing about read-only semantics, permissions, or scope. For a zero-parameter read tool this is adequate but thin.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two compact sentences, front-loaded with the core purpose and followed by the mechanism. Nothing is padded, though the second sentence is slightly redundant with the first.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value explanation is not required. For a parameterless read-only check, the description plus schema is nearly sufficient; only the absence of any behavioral constraints keeps it short of full completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes no parameters, so the baseline is 4; the description adds the relevant conceptual context that results come from the caller's own inbox rather than an arbitrary target.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: checking whether replies arrived for one's own sent messages. It also distinguishes itself from normal inbox reading by noting replies are evaluated separately, which differentiates it from the check_inbox sibling, though it does not name that sibling explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied — use this to see reply status rather than general messages — but there is no explicit when-to-use statement, no named alternative (check_inbox), and no guidance on ordering relative to send_message or reply.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_agentsA

Listet alle registrierten Agent-Sessions mit Namen, Arbeitsverzeichnis und Aktivitaetsstatus auf. Vor dem Senden einer Nachricht aufrufen, um zu sehen, welche Namen aktuell verfuegbar sind.

Args: include_inactive: Wenn True, werden auch Sessions angezeigt, deren Heartbeat laenger als 30 Minuten zurueckliegt (als "inactive" markiert statt ausgefiltert).

ParametersJSON Schema
NameRequiredDescriptionDefault
include_inactiveNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Ohne Annotationen trägt die Beschreibung die Hauptlast und erklärt das Verhalten der include_inactive-Option: Sessions mit Heartbeat älter als 30 Minuten werden als 'inactive' markiert statt ausgefiltert. Eine explizite Aussage zur Read-Only-Natur oder zu Seiteneffekten fehlt, ist bei einem Listing-Tool aber implizit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Die Beschreibung ist front-loaded: zuerst Zweck, dann Nutzungshinweis, dann Parameterdetails. Beide Sätze und der Args-Abschnitt sind knapp und enthalten keine Redundanz.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Für ein einfaches Listing-Tool mit Output-Schema sind Zweck, Nutzungskontext und Parameterverhalten ausreichend dokumentiert. Es fehlt lediglich eine explizite Bestätigung, dass die Operation keine Seiteneffekte hat, was angesichts fehlender Annotationen minimal wäre.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Der einzige Parameter include_inactive hat laut Schema 0% Beschreibungsabdeckung, wird aber in der Beschreibung vollständig erklärt: Was passiert bei True, welcher Schwellenwert gilt und wie inaktive Sessions dargestellt werden. Die Beschreibung kompensiert die Schema-Lücke vollständig.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Die Beschreibung nennt ein klares Verb ('Listet') und die Ressource ('alle registrierten Agent-Sessions') und beschreibt zusätzlich die zurückgegebenen Felder (Name, Arbeitsverzeichnis, Aktivitätsstatus). Dadurch unterscheidet sie sich deutlich von Siblings wie send_message oder register.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Die Beschreibung gibt einen klaren Verwendungskontext: 'Vor dem Senden einer Nachricht aufrufen, um zu sehen, welche Namen aktuell verfügbar sind.' Es fehlen jedoch explizite Ausschlüsse oder Hinweise auf alternative Tools für andere Zwecke.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

registerA

Registriert die aktuelle Session unter einem frei waehlbaren Namen im Agent-Mailbox-System, damit andere Sessions ihr Nachrichten schicken koennen.

Args: name: Gewuenschter Anzeigename der Session (z.B. "devops", "backend-dev"). Muss aktuell nicht bereits von einer anderen AKTIVEN Session belegt sein.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses one meaningful behavior — the name must not currently be held by another ACTIVE session — but does not say what happens on collision (error vs. reuse of an inactive name), whether re-registering overwrites, or whether the registration persists or needs authentication. Partial disclosure only.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose sentence followed by a short Args block; every element earns its place. Slightly verbose in the German phrasing but no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained. For a one-parameter registration tool with no annotations, the description covers what it does, the naming constraint, and the purpose; the remaining gap is collision/failure behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does: it defines the single parameter as a freely chosen display name, gives examples ('devops', 'backend-dev'), and states the uniqueness constraint against active sessions. That is real meaning beyond the bare 'Name' string type.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: it registers the current session under a chosen name in the Agent-Mailbox-System, and adds the purpose (so other sessions can send messages). That is clearly distinct from list_agents, send_message, check_inbox, reply and check_replies, though no sibling is named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'damit andere Sessions ihr Nachrichten schicken koennen' clause implies when you need this tool (to become addressable), but there is no explicit when-to-use/when-not guidance and no reference to alternatives such as list_agents for checking existing names.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

replyA

Beantwortet eine erhaltene Nachricht und markiert sie als bearbeitet. Die Antwort wird dem urspruenglichen Absender in dessen Inbox zugestellt.

Args: message_id: Die id der Nachricht aus check_inbox, die beantwortet wird. status: Kurzer Status, z.B. "erledigt", "issue_angelegt", "abgelehnt". text: Freitext der Antwort (z.B. was gemacht wurde oder Issue-Link).

ParametersJSON Schema
NameRequiredDescriptionDefault
textYes
statusYes
message_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full behavioral burden. It usefully discloses two side effects: the message is marked as processed and the reply is delivered to the original sender's inbox. It omits auth requirements, reversibility, rate limits, and error behavior, so it is adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action and its effect, then a compact Args block. Every sentence adds information with no padding, though the prose could be slightly tighter.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need not be explained, and all three required parameters are documented. Missing only cross-tool routing (when this beats send_message) and error/permission behavior, which leaves a small gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does: message_id is tied to check_inbox output, status is illustrated with concrete examples ('erledigt', 'issue_angelegt', 'abgelehnt'), and text is described as free text with content examples. This adds real meaning beyond the bare schema types.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete verb (Beantwortet/replies to) and resource (eine erhaltene Nachricht/a received message), and clarifies the effect of marking it as processed. This implicitly distinguishes it from send_message (new message) and check_inbox (reading), though it never names those siblings explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Die id der Nachricht aus check_inbox' hints at the prerequisite workflow (you must have run check_inbox first), which is implied usage context. However, there is no explicit guidance on when to use reply versus send_message or check_replies, and no exclusion criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

send_messageA

Sendet eine Nachricht an eine andere registrierte Agent-Session. Die Zielsession sieht die Nachricht beim naechsten Aufruf von check_inbox (typischerweise automatisch zu Beginn ihres naechsten Turns).

Args: to: Name der Zielsession, wie in list_agents angezeigt. text: Inhalt der Nachricht (Aufgabe, Frage, Information).

ParametersJSON Schema
NameRequiredDescriptionDefault
toYes
textYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and handles the single most important behavioral fact: delivery is asynchronous and happens on the recipient's next check-in, typically at the start of its next turn. It does not cover failure modes (unknown target, offline session) or whether self-messaging is permitted.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose sentence followed by a compact args list; every line earns its place. Slightly verbose in the delivery-timing clause, but no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists, so return values need not be described, and both parameters plus the async delivery model are covered. Missing only edge-case behavior (nonexistent target, queueing limits) that an agent might want before calling.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate, and it largely does: `to` is defined as the session name 'wie in list_agents angezeigt' (a real usability clue), and `text` is characterized as task/question/information. Only the format details for `to` (exact matching rules) remain implicit.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Sendet eine Nachricht an eine andere registrierte Agent-Session') and adds delivery semantics (the target sees it at its next check_inbox). It does not, however, draw a boundary against the `reply` sibling, which sends messages to a related session — an agent must infer which is correct.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated: the mention that the target sees the message 'beim naechsten Aufruf von check_inbox' tells the agent this is an asynchronous, fire-and-forget send. There is no explicit when-to-use-this-vs-`reply` guidance or statement of preconditions (e.g., target must be registered/alive).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 6 tool updatesv0.1.0
    • First observedcheck_inbox
    • First observedcheck_replies
    • First observedlist_agents
    • First observedregister
    • First observedreply
    • First observedsend_message

TDQS

A3.9/5.0

Scored across 6 tools

Disambiguation4/5

register, list_agents, send_message, and reply each target a distinct action. However, check_inbox and check_replies overlap conceptually, since replies are described as arriving in the same inbox with type="reply", making it unclear why they require separate tools.

Naming Consistency4/5

Four tools follow a clear verb_noun pattern (list_agents, send_message, check_inbox, check_replies), while register and reply are bare verbs. Minor deviation but overall predictable and readable.

Tool Count5/5

Six tools is well-scoped for an agent messaging system, covering registration, discovery, sending, receiving, replying, and reply-checking without redundancy.

Completeness4/5

The core message lifecycle (register, list, send, receive, reply, check replies) is well covered. Minor gaps exist: no deregistration, no broadcast/multi-recipient send, and no way to mark a message handled besides replying.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables local agent-to-agent messaging between Claude Code sessions via file-based channels, with a registry, MCP tools and CLI for sending, reading, and tracking messages.
    2
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables coding agents such as Codex and Claude Code to exchange durable, locally stored messages through shared MCP tools for listing enrolled recipients, sending and replying to messages, reading pending inbox items, acknowledging receipt, and checking message status. Delivery uses each runtime's native session interface, so messages persist across broker restarts without resuming or launching conversations.
    AGPL 3.0