claude-intercom
Enables cross-session communication between Claude Code sessions, allowing them to discover, message, and interact with each other through async messaging and synchronous question-answering.
list_sessions— Discover recent or currently live Claude Code sessions, optionally filtered by scope (recent,live,all) or project name.whoami— Identify your own session ID, project, and working directory so other sessions can address you.send_message— Send an async message to another session's inbox; optionally push it live into their tmux terminal.read_messages— Read your inbox of cross-session messages, with an option to show only unread ones.reply— Reply to a specific received message by ID, delivering your response to the original sender's inbox (and optionally their live terminal).ask— Inject a question directly into a live session's terminal and wait for its synchronous answer, read back from its transcript (configurable timeout). Can also resume idle sessions headlessly.Hands-off pickup — An optional Stop hook automatically reads and processes incoming messages without manual
read_messagescalls.
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., "@claude-intercom Ask the data-pipeline session if the ETL job finished."
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.
claude-intercom
An MCP server that lets Claude Code sessions talk to each other.
Run many Claude Code sessions at once (e.g. with agent-deck, tmux, or just several terminals) and let them:
list_sessions— discover recent sessions and see which are live right nowwhoami— find out which session you aresend_message— drop an async message into another session's inboxread_messages— pick up messages other sessions sent youreply— answer a message you receivedask— ask a live session a question and get its answer back synchronously
No daemon, no database. Messages are plain JSON files under ~/.claude-intercom/, and sessions are discovered from Claude Code's own transcripts (~/.claude/projects/).
How it works
Discovery. Every Claude Code session writes a transcript to
~/.claude/projects/<project>/<session-id>.jsonl.list_sessionsreads those for the session id, project, first prompt (as a title), and last-active time.Liveness. A session is "live" if its
claudeprocess is running inside a tmux pane. The server correlates tmux panes → processes → the session id each one has open.Self-identity. The server walks up from its own process to the parent
claudeprocess and useslsofto find which transcript that process has open — that's you. (Override withCLAUDE_INTERCOM_SESSIONif detection ever fails.)Live delivery /
ask. For a live target, the message is typed into its tmux pane withtmux send-keys. Forask, the server then tails the target's transcript and returns the assistant text that appears in response.
Heads up: live delivery and
askinterrupt whatever the target session is doing, exactly as if you typed into its terminal. Asyncsend_message(the default) does not — the recipient sees it when it next callsread_messages.
Related MCP server: claude-session-bridge
Requirements
Node.js ≥ 18
tmux,ps, andlsofonPATH(standard on macOS/Linux) — only needed for liveness, live delivery, andask. Async messaging works without them.
Install
From source (recommended today)
git clone https://github.com/AriOliv/claude-intercom
cd claude-intercom
npm install
npm run buildThen register it with Claude Code (user scope = available in every session):
claude mcp add intercom -s user -- node "$(pwd)/dist/index.js"If you run several Claude Code config dirs, register it in each:
CLAUDE_CONFIG_DIR=~/.claude claude mcp add intercom -s user -- node "$(pwd)/dist/index.js"
CLAUDE_CONFIG_DIR=~/.claude-ari claude mcp add intercom -s user -- node "$(pwd)/dist/index.js"Via npx (once published to npm)
claude mcp add intercom -s user -- npx -y claude-intercomOr add it to your MCP config manually:
{
"mcpServers": {
"intercom": {
"command": "node",
"args": ["/absolute/path/to/claude-intercom/dist/index.js"]
}
}
}Usage
In any Claude Code session:
"List the other sessions I have open."
"Ask the litellm session whether the model-selection refactor is merged yet."
"Tell the BRLA session I'm done with the migration — it can rebase."
"Check my intercom inbox."
Configuration
Env var | Default | Purpose |
|
| Where Claude Code stores |
|
| Where messages are stored |
| (auto) | Force this server's session identity (a session id) |
| (empty) | Extra flags passed to |
Reaching idle sessions
ask works whether the target is live or idle. A live session (running in a
tmux pane) gets the question typed into its terminal. An idle session — one
whose transcript exists but isn't currently running — is resumed headlessly with
claude -p --resume <id> in its own cwd, so you can still reach it; the thread
continues in the same transcript. Set CLAUDE_INTERCOM_RESUME_FLAGS if those
headless resumes need extra flags.
Hands-off pickup (optional Stop hook)
hooks/pickup-stop.mjs is a Claude Code Stop hook: when a session finishes a
turn, it pulls any unread messages addressed to that session and feeds them back
so the session handles them (and replies) without anyone calling read_messages.
Register it in settings.json:
{ "hooks": { "Stop": [ { "hooks": [
{ "type": "command", "command": "node /absolute/path/to/claude-intercom/hooks/pickup-stop.mjs" }
] } ] } }Development
npm install
npm run build # compile to dist/
npm run dev # run from source with tsxLimitations
Liveness, live delivery, and
askassume sessions run inside tmux. Plain-terminal sessions still work forlist_sessionsand asyncsend_message/read_messages.askreads the answer by tailing the target's transcript; it returns the assistant text produced after the question, capped at ~4k chars. It's pragmatic, not a structured RPC.A session only checks its inbox when something calls
read_messages(or you tell it to). Pair it with a hook or a polling loop if you want hands-off pickup.
License
MIT
Available Tools
6 toolsaskA
Ask a LIVE session a question and wait for its answer. Injects the question into the target's running terminal, then reads the answer back from its transcript. Only works on sessions marked live in list_sessions. Note: this interrupts what the target is currently doing.
Inputs: to (required), question (required), wait_seconds.
list_sessionsA
List Claude Code sessions discovered on this machine — recent ones and which are currently live (running in a tmux pane). Use scope='live' to see only sessions you can reach right now, or pass a project filter.
Inputs: scope, project, limit.
read_messagesA
Read intercom messages other sessions have sent to you. Call this at the start of a turn (or when prompted) to pick up cross-session messages. Marks them read.
Inputs: unread_only.
replyA
Reply to a message in your inbox. Looks up the original sender by message id and delivers your reply to their inbox (and live, if they're running).
Inputs: message_id (required), text (required), deliver_live.
send_messageA
Send an async message to another Claude Code session. It lands in that session's intercom inbox; the recipient reads it with read_messages on its next turn. Set deliver_live=true to also inject it immediately into the recipient's live tmux pane (this interrupts whatever it's doing).
Inputs: to (required), text (required), deliver_live.
whoamiA
Identify which Claude Code session this is (its id, project, and cwd). Useful so other sessions can message you back.
Inputs: no named parameters.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 6 tools
Each tool targets a distinct action: listing sessions, asking live sessions, reading messages, replying, sending async messages, and identifying the current session. Even though 'send_message' with deliver_live=true overlaps with 'ask' in interrupting a session, the synchronous vs async distinction is clear.
Most tools use a verb_noun pattern (list_sessions, read_messages, send_message) but two are single verbs (ask, reply) and whoami is a fixed phrase. The naming is clear and follows imperative verbs, but the pattern isn't perfectly uniform.
6 tools is a well-scoped set for intercom functionality across Claude Code sessions. Each tool serves a necessary role without redundancy or excessive specialization.
The set covers core operations: discover sessions, communicate (ask, send, reply, read), and identify self. Missing a 'peek' or 'list messages' without marking read, but this is a minor gap for the domain.
Maintenance
Related MCP Connectors
The team layer for AI coding agents: shared contracts, collision alerts, E2EE sessions.
Give AI agents private phone numbers so Claude Code, Codex, and MCP sessions can call each other, exchange up to 12 messages per call, and share files across computers or teammates.
Let your AI sessions talk to each other — messaging, tasks, sessions, and alerts
Shared memory and mail for your AI agents. Verified with Claude Code; other MCP clients in testing.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables multiple Claude Code sessions to communicate and coordinate through broadcast and peer-to-peer messaging.2 npm1MIT
- AlicenseNot gradedqualityCmaintenanceEnables multiple Claude Code sessions to communicate and share results automatically, with optional orchestration for hands-off workflow coordination.14 npmMIT
- AlicenseNot gradedqualityDmaintenanceEnables Claude Code instances to discover and communicate with each other across different sessions, supporting peer-to-peer messaging and coordination.20 npmMIT
- AlicenseNot gradedqualityDmaintenanceEnables peer-to-peer communication between Claude Code sessions, allowing them to send messages, hand off tasks, and coordinate across worktrees without manual intervention.MIT