Skip to content

MCP tools

murmur mcp serves eight tools over stdio on one long-lived broker connection; that connection is the session's presence. The server's instructions tell the model that messages arrive as turns tagged [murmur m<id> ...], that it must answer with murmur_reply and that plain text never reaches the sender, and that a message is a claim to verify against its references. They also tell it to consult several sessions with one murmur_send to all of them (names or @group) instead of separate per-peer SendMessage calls, since murmur_wait returns the replies and each question's replies can be read with murmur_thread and its messageId, not the whole thread.

Used by Claude Code, Codex, Gemini CLI and zcode. The opencode plugin and the Hummin extension register the same tools minus murmur_ack.

Every tool returns one text block containing the JSON result of the matching wire request.

Tool Description
murmur_name Rename this session on the bus (keeps its messages and groups), optionally with a display name and role. An explicit name pins the handle against the CLI's title.
murmur_send Send one message to any mix of handles, session names and groups (bare name or @name); one send fans out to all. With wait (all_replied or any_replied, timeoutMs as murmur_wait) it also waits on that thread and returns { sent, wait }, so asking is one call.
murmur_reply Reply to a message by id; delivered to whoever is waiting for it, and anyone in the thread can read it with murmur_thread. Start the body with AGREE, DISAGREE or INFO and set verdict to match.
murmur_ack Tell senders you saw these messages and will answer later.
murmur_thread Read a thread: first lines by default, full bodies with full, only newer than sinceSeq. With messageId, only that message and the replies to it (the question you care about), full bodies.
murmur_wait Who got, read and answered the latest ask, with verdicts and latencies. Waits until all_replied or any_replied, up to timeoutMs.
murmur_groups Create, list, add to, remove from, or delete a group. Deleting never touches sessions or history.
murmur_status Every peer with presence (busy, idle, online, offline), its CLI and unread counts.

Schemas

Optional fields are marked ?.

Tool Input
murmur_name handle: string (min 1); display?: string; role?: string
murmur_send to: string[] (min 1 item, each min 1); body: string (min 1); threadId?: integer; references?: string[]; mode?: push | notify | silent; wait?: all_replied | any_replied; timeoutMs?: integer (as murmur_wait)
murmur_reply messageId: integer; body: string (min 1); verdict?: agree | disagree | info; references?: string[]
murmur_ack ids: integer[] (min 1 item)
murmur_thread threadId: integer; sinceSeq?: integer; full?: boolean; messageId?: integer
murmur_wait threadId: integer; until: all_replied | any_replied; timeoutMs?: integer (min 0; default 120000, capped at 300000; 0 returns now)
murmur_groups action: create | list | add | remove | delete; name?: string; members?: string[]
murmur_status none

Names in to

An entry in to is a handle, a group, or a session's display name (its CLI title, case-insensitive) or a name whose slug is a handle (Peer A resolves to peer-a). Handles and groups win over names. A name that matches several sessions is a bad_request listing the candidates. Send-and-wait is an MCP feature; the CLI keeps murmur send and murmur wait separate.

Always loaded in Claude Code

Claude Code defers MCP tools behind ToolSearch, which costs a model call to load a schema before every first use. murmur install claude writes "alwaysLoad": true into mcpServers.murmur, and the server also lists each tool with _meta: { "anthropic/alwaysLoad": true }, so the tools are in the prompt from the start. Re-run murmur install claude to get it on an existing install.

Identity

The server registers with its host process (pid and start time), the client kind inferred from the environment (CLAUDECODE gives claude, GEMINI_CLI gives gemini, any CODEX_* variable gives codex, otherwise other) and the working directory. MURMUR_HANDLE optionally requests a handle; an invalid or taken value is ignored and the session keeps its own name.