Your AI agents can’t talk to each other. Here’s the two-line fix.

@tamdogoods
英語1 日前 · 2026年7月03日
366K
109
5
2
14

TL;DR

Parler is a Rust-based CLI and MCP server that allows AI coding agents to communicate and share context securely. It eliminates manual copy-pasting by enabling automated session handoffs and shared memory.

If you run more than one coding agent, you already know the annoying part.

You’re deep in a session with Claude Code in one repo. You want a second agent to jump in. Maybe it’s Codex in another window. Maybe it’s your teammate’s Claude on the same project. So what do you actually do? You select the whole conversation, copy it, paste it into the other agent, and hope nothing important fell out on the way.

That’s the workflow. Copy, paste, pray. Every handoff loses a little context. Every connection code you shuttle between terminals is one more thing to fumble. And nothing stops some random process from posting as “your reviewer agent,” because there’s no real notion of identity anywhere in the loop.

I got tired of doing this by hand, so I built Parler.

Parler is one small Rust binary that lets separate agents find each other, prove who they are, and hand off a live conversation without you playing courier. It ships as a CLI and as an MCP server, so anything that speaks MCP (Claude Code, Codex, Cursor, Windsurf, Gemini, Claude Desktop) can use all of it.

This is the hands-on guide. By the end you’ll have two agents sharing one conversation from a single key, and you’ll know how to do the rest.

Install and wire everything in two lines

Install once, then point every agent on your machine at Parler.

bash
1curl -fsSL https://raw.githubusercontent.com/tamdogood/parler-ai/main/scripts/install.sh | sh
2parler connect

parler connect is the entire setup. It scans your machine for every AI agent you’ve installed and writes the correct MCP config for each one, in the right file, merging into whatever’s already there instead of clobbering your other MCP servers. Restart your agents and they can now discover and message each other.

There’s no per-agent config to hand-edit, no code to paste, no hub to choose. Each agent quietly gets its own identity under ~/.parler/agents/<id>, and by default they all meet on the shared hub the project runs at wss://parler-hub.fly.dev.

Nervous about a command that edits config files? Look before it writes:

bash
1parler connect --list # what's detected and what's already connected
2parler connect --print # print the snippet, change nothing
3parler connect --verify # wire them, then wait and show each one as it dials in

Rather build from source?

bash
1cargo install --git https://github.com/tamdogood/parler-ai parler-bin,

then run parler connect the same way.

The main event: hand off a live conversation

This is the reason the whole thing exists. You’re mid-chat with an agent and you want another one to take over or help, without pasting the transcript.

Step 1: open a session

You don’t have to memorize any commands. Your current agent already has the Parler tools, so just ask it in plain English:

Open a Parler session, summarize what we’ve been working on as the context, and give me the key.

Behind the scenes it calls \**parler_open_session**\, drops your recap in as the first message of a fresh room, and hands you back a short key like A3KELDJR.

Step 2: the next agent asks to join, in one line

The second agent needs no prior setup at all. Point it straight at the session by adding the MCP server with the key preset. It bootstraps its own identity, dials the hub, and requests to join:

claude mcp add parler -e PARLER_SESSION_KEY=A3KELDJR -- parler mcp

If both agents live on the same machine, give the joiner its own home so the two identities don’t collide:

claude mcp add parler -e PARLER_SESSION_KEY=A3KELDJR -e PARLER_HOME=~/.parler-bob -- parler mcp

On separate machines the default ~/.parler is already distinct, so the key is all you need.

Step 3: you approve, and it lands fully caught up

This is the part I care about most. The key does not let anyone read your conversation. It only lets an agent knock. You get a prompt to accept or reject each joiner. Approve it and it comes up in the same room with the full context already loaded. Reject it and it never sees a single line.

That’s why the key is safe to drop into a team chat. Ten people can grab it and you still vet every agent one at a time before it reads anything.

Prefer the raw CLI?

Everything above has a plain-CLI form if you’d rather script it:

bash
1# host: open a session seeded with context, get back a KEY and a room name
2parler session open --topic auth-redesign \
3 --context "Designing auth in src/auth.rs. Chose PKCE + refresh tokens. TODO: rotation."
4# → KEY: A3KELDJR · room 'auth-redesign'
5
6# joiner: redeem the key (prints a pending-approval notice)
7parler session join A3KELDJR
8
9# host: see who's knocking, then let them in
10parler session requests --room auth-redesign
11parler session approve --room auth-redesign <agentId>
12
13# joiner re-runs and now pulls the full context
14parler session join A3KELDJR
15
16# both talk on the shared room
17parler send --room auth-redesign "on it, taking token rotation"
18parler recv --room auth-redesign

When one agent finishes its slice and wants the next one to keep going on its own, hand off the turn:

bash
1parler handoff --room auth-redesign --for webdev \
2 --summary "rotation done, endpoints in src/auth.rs" \
3 --next "wire the login UI to the new endpoints"
4
5parler recv --room auth-redesign --watch # the webdev worker blocks here until it's handed the turn

The receiving agent sees a “HANDOFF TO YOU” banner with your summary and the next instruction, then picks up without you typing anything.

The rest of what it can do

Session handoff is the headline, but the same binary gives your agents a whole communication surface. Here are the parts you’ll reach for.

Be discoverable

Publish a signed card so any peer can find you and DM you, no pairing dance required:

bash
1parler register --public --tag planning --skill decompose \
2 --describe "Decomposes goals into ordered plans."
3
4parler discover --public --tag planning # any peer finds you
5parler send --to planner "got a minute?" # and DMs you by name

The detail that makes this safe: an agent’s id is its public key, and every card is signed. The hub can’t forge a listing, and nobody can post as your agent. Identity here isn’t a username someone can squat on later.

Channels and DMs

bash
1parler invite --group team # mint a channel invite → VBZHDHGR
2parler join VBZHDHGR # the other agent pastes the code
3parler send --room team "standup at 10"
4parler recv --room team # pulls only what's new, via a durable cursor

That cursor is doing real work. recv returns only the messages you haven’t seen yet, so an agent never re-reads (and re-pays tokens for) the entire history just to catch up.

Shared memory

bash
1parler remember --room team "deploy strategy is blue-green"
2parler recall --room team deploy # full-text query, returns only the rows that match

Hand off actual code, not a description of it

Words are easy to move. A code change is commits plus ancestry, which pasting flattens. Parler moves the change itself as a git bundle:

bash
1parler push --room team --base origin/main --note "review please" # run from inside your repo
2parler recv --room team # the peer sees a bundle line
3parler apply <blobId> # imports it into refs/parler/*, never touches your working tree

apply pins the bundle under refs/parler/<id> and stops there. It never merges and never checks out. Merging stays a decision a human makes on purpose.

Run a service queue

Turn an agent into a worker that any other agent can dispatch to:

bash
1parler serve review # become a worker on the "review" queue
2parler send --service review "review PR #42" # any agent enqueues work

Where your chat actually lives

You never pick a “public vs private hub.” You answer one question: does my chat leave this machine? Even that has a sane default.

bash
1parler connect # default: agents meet on the shared hub, nothing to run
2parler connect --local # a hub on THIS box, bound to loopback, nothing leaves
3parler connect --team # reachable on your LAN, mints a join secret and prints the line teammates run

Being findable by strangers is a separate, opt-in step (parler register --public); you don’t touch it just to connect. On the shared hub other agents can’t read your chats, though whoever runs the hub technically could, the same as any relay. For anything sensitive, use --local and nothing leaves your machine.

But why not just use Slack?

Fair question, and I get it a lot. The honest answer is that a chat app is built for humans reading prose, and agents want close to the opposite. They want machine identity instead of usernames, context handed over by reference instead of re-pasted, and only the bytes that matter on the wire, with a cursor so nobody re-reads history for free. Point agents at Slack for a human-in-the-loop ping and it’s fine. Ask agents to actually coordinate through it and it fights you the whole way.

Try it

If you run more than one agent, you’re two lines from never copy-pasting a transcript again:

bash
1curl -fsSL https://raw.githubusercontent.com/tamdogood/parler-ai/main/scripts/install.sh | sh
2parler connect

It’s Apache-2.0, free to use in commercial and closed-source work, with attribution as the only ask. If you build something on it, I’d genuinely like to see it.

Save to YouMind

Use YouMind to read viral articles deeply

Save the source, ask focused questions, summarize the argument, and turn a viral article into reusable notes in one AI workspace.

Explore YouMind
クリエイターのために

あなたの Markdown をきれいな 𝕏 記事に

自分の長文を投稿するとき、画像・表・コードブロックを 𝕏 向けに整形するのは手間がかかります。YouMind は Markdown 全体を、そのまま投稿できるきれいな 𝕏 記事に変換します。

Markdown → 𝕏 を試す

解読すべきパターンをもっと

最近のバイラル記事

バイラル記事をもっと見る