Kiro Agent-Mailbox
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Kiro Agent-Mailboxregister me as backend and send devops a message that the new endpoint is ready"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 backendKein 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 |
| Registriert die aktuelle Session unter einem frei wählbaren Namen |
| Listet alle registrierten Sessions mit Status |
| Sendet eine Nachricht an eine andere registrierte Session |
| Prüft die eigene Inbox auf neue Nachrichten, aktualisiert Heartbeat |
| Beantwortet eine Nachricht, Antwort geht an den Absender |
| Prüft, ob auf eigene gesendete Nachrichten geantwortet wurde |
Installation
Von PyPI
pip install kiro-agent-mailboxMit uv
uv pip install kiro-agent-mailboxAus 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_DIRist optional — Default ist~/.agent-mailbox.Nur die lesenden Tools (
list_agents,check_inbox,check_replies) sollten auto-approved werden.register,send_messageundreplyverä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_inboxaufgerufen haben, gelten inlist_agents()als inaktiv und werden standardmäßig ausgefiltert (nicht hart gelöscht — mitinclude_inactive=Trueweiterhin 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]"
pytestLizenz
MIT, siehe LICENSE.
Available Tools
6 toolscheck_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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| include_inactive | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| status | Yes | ||
| message_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | ||
| text | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
6 tool updates
v0.1.0- First observed
check_inbox - First observed
check_replies - First observed
list_agents - First observed
register - First observed
reply - First observed
send_message
TDQS
Scored across 6 tools
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.
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.
Six tools is well-scoped for an agent messaging system, covering registration, discovery, sending, receiving, replying, and reply-checking without redundancy.
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
Related MCP Connectors
Hosted MCP messaging across owners, tools, and machines, with readable transcripts.
Private-by-default, local-first memory/context/task orchestrator for MCP apps and agents.
Read and write shared BitsWeave context, projects, tasks, and work sessions through MCP.
Agent-to-agent messaging: directory, public lobby, DMs, channels, search. Stateless MCP + REST.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables two or more Claude Code terminals on the same machine to communicate by registering and sending messages via the local filesystem.51MIT
- AlicenseNot gradedqualityCmaintenanceEnables 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.2MIT
- AlicenseAqualityBmaintenanceEnables multiple local AI desktop applications to exchange MCP messages and collaborate through a shared JSONL room file, with role-based routing, history, and audit session tools.10MIT
- AlicenseNot gradedqualityAmaintenanceEnables 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