palaver について
palaverは、セッションやマシンをまたいでAIコーディングエージェント間のメッセージを中継する、アーカイブ済みのセルフホスト型サービスです。MCPツールとコマンドラインからメッセージを転送し、エージェントを起動できます。
主な機能
- 01セルフホスト型WebSocketリレー
- 02ピアやロール宛てのメッセージ送信
- 03オフラインメッセージのキュー
- 04受信箱とメッセージ用MCPツール
- 05tmuxによるエージェント起動
- 06スクリプトやCI向けコマンドライン
活用シーン
- 01エージェント間のコードレビュー依頼
- 02ロール別エージェント群の連携
- 03マシンをまたぐメッセージ転送
- 04スクリプトやCIからのメッセージ送信
MCP 対応
各エージェントはpalaver mcpをMCPサーバーとして実行し、ピア一覧、メッセージ送信、受信待機、受信箱の読み取りを行うツールを利用します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
npx -y palaver-agentsPALAVER_RELAYRelay URL, e.g. ws://10.0.0.5:7777 or wss://relay.example.comPALAVER_TOKENシークレットShared or per-member relay tokenPALAVER_NAMEThis agent's peer name (letters, digits, _ and -)PALAVER_ROLESComma-separated roles for @role messagesローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
palaver は hoptell に移行しました。 このリポジトリはアーカイブされており、メンテナンスは終了しています。新しいパッケージは
npm install -g hoptellでインストールしてください。npm パッケージpalaver-agentsは非推奨です。移行するには、環境変数PALAVER_*をHOPTELL_*に変更し、設定ファイルを~/.config/palaver/.envから~/.config/hoptell/.envに移動してください。デフォルトの状態ディレクトリは~/.hoptellになりました(以前は~/.palaver)。
palaver
AI コーディングエージェント同士が、セッション、マシン、アカウント、ツールを越えて会話できるようにします。
palaver は、Claude Code、Codex、Antigravity(agy)、その他の MCP 対応エージェントを、LAN または VPN 上で自分で実行する小さな
リレー経由で接続します。エージェントにはピアの一覧表示やメッセージ送信のツールが提供され、受信メッセージがアイドル状態のエージェントを起動するため、ノート PC の Claude セッションから同僚のワークステーション上の Codex セッションにレビューを依頼し、誰も入力することなく回答を受け取れます。
laptop: Claude Code ──┐ ┌── Codex :workstation
laptop: Codex ──┼── palaver relay (LAN) ─┼── Claude Code :workstation
CI box: Claude Code ──┘ one tiny process └── ...
- セルフホスト可能で、アカウントは不要です。 Node プロセスを 1 つ実行します。エージェントごとに異なる Claude または OpenAI アカウントを使用できます。エージェント間のメッセージはリレー経由でのみ送信され、各エージェントは通常どおり それぞれの AI プロバイダーと通信します。
- エージェントを起動します。 Claude Code には到着したメッセージがプッシュされます。Codex(または任意の ターミナルエージェント)には tmux 経由で貼り付けられます。それ以外のエージェントはポーリングできます。
- チームと群れに対応します。 エージェントは役割(
reviewer、backend、…)を通知します。名前を指定して 1 つの エージェントに、役割を指定して該当するすべてのエージェントに(@reviewer)、または全員に(@all)送信できます。 - 小規模で監査しやすい設計です。 JavaScript 約 1,200 行、依存関係は 2 つ(
wsと MCP SDK)です。
palaver は、受け取った内容に基づいて動作する可能性のあるエージェント間でプレーンテキストをやり取りします。権限を緩和して実行しているエージェントを接続する前に、セキュリティをお読みください。
仕組み
| 部分 | 機能 |
|---|---|
palaver relay | 1 台のマシン上の WebSocket ハブです。ピアを認証し、オフラインのピア宛てメッセージを(メモリ上に)キューイングします。 |
palaver mcp | 各エージェントセッションが実行する MCP サーバーです。list_peers、send_message、wait_for_message、read_inbox のツールを提供します。 |
palaver tmux | ターミナルエージェントを tmux で実行し、受信メッセージを貼り付けて起動させます。 |
palaver send / list / wait / listen | MCP を使わないスクリプト、CI ジョブ、エージェント向けの CLI です。 |
受信メッセージがエージェントに届く仕組み:
| エージェント | 起動方法 | 受信メッセージ |
|---|---|---|
| Claude Code(プッシュ) | claude --dangerously-load-development-channels server:palaver | <channel source="palaver"> イベントとしてセッションにプッシュされます |
| Claude Code(通常) | claude | MCP サーバーが Claude にバックグラウンドで palaver listen を実行し続けるよう依頼します。コマンドが戻ると Claude が起動します |
Antigravity(agy) | agy | 通常の Claude Code と同様に、バックグラウンドで palaver listen を実行します |
| Codex、Antigravity、または任意のターミナルエージェント | palaver tmux <name> -- codex | エージェントのプロンプトに貼り付けられます |
| その他すべて | — | wait_for_message / read_inbox ツール、または palaver wait |
プッシュには Claude Code のチャンネル(リサーチプレビュー)を使用します。カスタムチャンネルには --dangerously-load-development-channels フラグが必要です。また、このフラグを指定して起動するたびに、Claude Code は「development channels」に関する警告の確認を求めます。palaver はこのフラグを検出して動作を切り替えます。検出結果を上書きするには PALAVER_PUSH=channel|listener を設定してください。このフラグを指定しない場合、セッションで最初のプロンプトを送信した後にバックグラウンドリスナーが起動します。
クイックスタート
要件:Node.js 20 以降。Codex/ターミナルエージェントを起動するには tmux 3.2 以降も必要です。macOS および Linux でサポートされています。Windows ではリレーとポーリング用ツールのみ動作します。
1. インストール(すべてのマシン)
npm install -g palaver-agents # puts `palaver` on your PATH
ソースからインストールする場合はこちらです:git clone https://github.com/EminUZUN/palaver && cd palaver && npm install && npm link。
Claude Code ユーザーは、代わりに palaver をプラグインとしてインストールできます。リレー URL とトークン(Claude Code のセキュアストレージに保存されます)の入力を求められ、別途 MCP を登録する必要はありません:
/plugin marketplace add EminUZUN/palaver
/plugin install palaver@palaver
claude --dangerously-load-development-channels plugin:palaver@palaver # with push
リレーイメージは ghcr.io/eminuzun/palaver で、サーバーは MCP Registry に io.github.EminUZUN/palaver として登録されています。
2. リレーを起動する(1 台)
mkdir -p ~/.config/palaver
cat > ~/.config/palaver/.env <<EOF
PALAVER_TOKEN=$(openssl rand -hex 32)
PALAVER_HOST=192.0.2.10
EOF
chmod 600 ~/.config/palaver/.env
palaver relay
上記のリレー設定で、192.0.2.10 をこのマシンの LAN または VPN アドレスに置き換えてください。
Docker を使う場合は、同じアドレスを指定し、... を生成したトークンに置き換えてください:
docker run -d -p 192.0.2.10:7777:7777 -e PALAVER_TOKEN=... ghcr.io/eminuzun/palaver。
このアドレスのみでポートを公開してください。ホストアドレスを指定しない場合、-p 7777:7777 はデフォルトですべてのホストアドレスで公開されます。examples/ を参照してください。ヘルスチェック:GET /healthz。
3. 各マシンを設定する
~/.config/palaver/.env(chmod 600):
PALAVER_RELAY=ws://192.0.2.10:7777
PALAVER_TOKEN=<the same token>
確認:palaver list を実行すると接続し、ピアが表示されます(まだありません)。
4. エージェントを接続する
Claude Code:MCP サーバーを一度登録します(ユーザースコープ、すべてのプロジェクト):
claude mcp add --scope user palaver -- palaver mcp
エージェントが palaver を見つけられない場合(たとえば nvm を使用している場合)、ここおよび以下の設定では、command -v palaver で表示されるフルパスを使用してください。
次に、プッシュを有効にして Claude を起動します:
PALAVER_NAME=laptop-claude claude --dangerously-load-development-channels server:palaver
このリポジトリのクローン内では、.mcp.json がサーバーを自動的に登録します。
Codex:~/.codex/config.toml に追加します:
[mcp_servers.palaver]
command = "palaver"
args = ["mcp"]
tool_timeout_sec = 1800 # wait_for_message can block up to 1500s
default_tools_approval_mode = "approve" # optional: no approval prompt per palaver tool call
次に、メッセージで Codex が起動するよう、tmux 経由で Codex を起動します:
palaver tmux laptop-codex -- codex
起動スクリプトはピア名を -c オーバーライドとして Codex に渡します。これは、対話型 Codex が、シェルの環境を引き継がない共有デーモンから MCP サーバーを起動するためです。Ctrl-b d でデタッチし、tmux attach -t palaver-laptop-codex で再接続します。
Antigravity(agy):MCP サーバーを一度登録します:
agy mcp add palaver palaver mcp
PALAVER_NAME=laptop-agy agy # listener mode, after your first prompt
palaver tmux laptop-agy --roles gemini -- agy # or: woken through tmux
5. 試してみる
いずれかのエージェントに 「palaver のピアを一覧表示して、laptop-codex に挨拶して」 と尋ねます。
組織での利用
palaver に中央サービスはありません。各組織が独自のリレーを運用し、エージェントはユーザーのマシンから接続します。
-
リレーを実行する:ネットワーク内で、Docker イメージ(
examples/docker-compose.yml)または systemd ユニット(examples/palaver-relay.service)を、VPN または TLS プロキシの背後で実行します。 -
メンバーごとのトークンを発行する:メンバーファイルを使用します(チームとスウォームを参照)。これにより、他の人のエージェント名を使用できなくなります。
-
クライアントを展開する:Claude Code プラグイン、または
npm install -g palaver-agentsと Codex および Antigravity 用の MCP 設定を使用します。 -
チャネルを許可リストに追加する(Claude Code):管理設定を使うと、ユーザーは開発フラグとそのプロンプトなしで
claude --channels plugin:palaver@palaverを起動できます:{ "channelsEnabled": true, "allowedChannelPlugins": [{ "marketplace": "palaver", "plugin": "palaver" }] }
チームとスウォーム
名前。 各エージェントにはピア名があります(PALAVER_NAME。デフォルトは<hostname>-<pid>):
使用できる文字は英字、数字、_、-です。すでに使用中の名前で新しい接続が行われると、古い接続は置き換えられます。
ロール。 PALAVER_ROLES=reviewer,backend(またはpalaver tmux <name> --roles reviewer -- codex)。
list_peersでロールを確認できます。@reviewer宛てのメッセージは、そのロールを持つオンラインのすべてのピアに届き、@allはオンラインのすべてのピアに届きます。ビジー状態のピアでは、未確認メッセージの後ろにキューイングされます。オフラインのピアには、ファンアウトされたメッセージはキューイングされません。名前を指定したダイレクトメッセージは、ピアがオフラインの間もキューイングされます(リレーのメモリ上で、ピアごとに最大50件)。ロールは、作業を振り分けるためにエージェントが自分で設定するラベルです。権限を表すものではありません。
複数人での利用。 他の人があなたのエージェントになりすませないよう、各ユーザーに個別のトークンを割り当てます。リレー上にメンバーファイルを作成します(chmod 600):
{ "members": [
{ "name": "alice", "token": "<openssl rand -hex 32>" },
{ "name": "bob", "token": "sha256:<hex sha256 of bob's token>" } ] }
palaver relay --members members.jsonを実行するか、PALAVER_MEMBERSを設定します。メンバーは<member>という名前、または<member>-で始まる名前(alice-claude、alice-codex-2)のみ使用できます。リレーは、aliceとalice-bobのように重複するメンバー名を拒否します。メンバーファイルと共有のPALAVER_TOKENを併用できます。トークンを持つユーザーは任意の名前を使用できます。チームを分ける場合は、リレーを個別に実行してください。リレーは単一の小さなプロセスです。
1台のマシンでのスウォームの例:
palaver tmux alice-planner --roles planner -- claude
palaver tmux alice-codex-1 --roles backend -- codex
palaver tmux alice-codex-2 --roles backend -- codex
palaver tmux alice-reviewer --roles reviewer -- claude
続いてプランナーに次のように指示します:「タスクを分割し、バックエンドの作業を@backendに送り、結果を@reviewerに送ってください」。
安全策。 各接続から送信できるメッセージは10秒あたり最大30件です。そのため、互いに返信し続ける2つのエージェントは、全員にメッセージを送りつける代わりに制限に達します。メッセージはプレーンテキストで、最大100,000文字です。
CLI
palaver relay --host <ip> [--port 7777] [--members file.json]
palaver mcp
palaver tmux <name> [--roles a,b] -- <agent command...>
palaver list
palaver send <to> <message...> # to: name, @role or @all; sends as $PALAVER_NAME without going online
palaver wait [seconds] # goes online as $PALAVER_NAME and prints the next message
palaver listen <name> [seconds] # waits on <name>'s local inbox (no relay connection)
設定は環境変数から取得されます。環境変数がない場合は、$PALAVER_ENV、~/.config/palaver/.env、<package>/.envのうち、最初に存在するファイルから取得されます。.env.exampleを参照してください。設定ファイルでは、二重引用符で囲まれた値はJSON形式のエスケープ(\"、\\、\n)をデコードし、単一引用符で囲まれた値はそのまま扱われます。空の値は未設定として扱われます。
| 変数 | 使用者 | 意味 |
|---|---|---|
PALAVER_RELAY | ピア | リレーURL。ws://host:7777、またはTLS経由のwss:// |
PALAVER_TOKEN | 両方 | 共有シークレット、またはメンバー個別のトークン |
PALAVER_NAME | ピア | このエージェントのピア名 |
PALAVER_ROLES | ピア | カンマ区切りのロール |
PALAVER_PUSH | ピア | channelまたはlistener。検出結果を上書きします |
PALAVER_HOME | ピア | ローカルの状態ディレクトリ(デフォルトは~/.palaver) |
PALAVER_HOST、PALAVER_PORT | リレー | 待ち受けアドレス(必須)とポート(デフォルトは7777) |
PALAVER_MEMBERS | リレー | メンバーごとのトークンを記載したメンバーファイル |
セキュリティ
palaver は、あるエージェントから別のエージェントへテキストを届けます。その点を踏まえて計画してください。
- 有効なトークンを持つ人なら誰でも、あなたのエージェントにメッセージを送信できます。権限を緩和して実行しているエージェント(
--dangerously-skip-permissions、自動承認)は、その内容に基づいて動作する可能性があります。トークンは秘密にし、グループではメンバーごとに異なるトークンを使い、リレーはプライベートネットワークまたは VPN 上でのみ実行してください。 - メッセージにはラベルが付けられますが、信頼されるわけではありません。 エージェントには、palaver のメッセージはユーザーではなく、ほかのエージェントから届くと伝えられます。メッセージのテキストでチャンネルタグを閉じたり、メッセージの境界を偽装したりすることはできません。これはモデルへの指針であり、サンドボックスではありません。
- 信頼できるネットワークの外では TLS を使用してください。 リレーは平文の
ws://で通信します。VPN(WireGuard、Tailscale)または TLS プロキシの背後に配置してください。たとえば Caddy の場合は次のようにします。caddy reverse-proxy --from relay.example.com --to 127.0.0.1:7777を実行してから、PALAVER_RELAY=wss://relay.example.comを使用してください。 - tmux による入力は、稼働中のターミナルに文字を入力します。 インジェクターが入力するのは、エージェントを起動したペインだけで、別のペインには入力しません。また、画面上の承認プロンプトを検出すると、入力を一時停止します。これは画面の表示に基づくベストエフォートです。自動承認モードよりも、危険な操作の前に確認を求めるエージェントを優先してください。プロンプトのように見えるメッセージ自体が入力されることはありません。その場合、エージェントには
read_inboxで取得するよう短い通知が届きます。そのペインで入力途中だったテキストがある場合、メッセージと一緒に送信されます。 - ローカルの受信トレイは
~/.palaver/inbox/<name>/(0700/0600)にあります。各メッセージには、リレーが確認した送信者名が記録されます。
脆弱性を報告するには、SECURITY.md をご覧ください。
制限事項
- リレーはオフラインキューをメモリ上に保持するため、リレーを再起動するとキューは失われます。
- 配信は少なくとも 1 回行われます。「配信済み」とは、受信側のマシンがエージェントの受信トレイにメッセージを保存したか、セッションに送信したことを意味し、エージェントがそれに基づいて動作したことを意味するものではありません。確認されなかったメッセージは、受信側が再接続した後に再配信されるため、まれに 2 回届くことがあります。受信側が確認していないメッセージは最大 50 件まで受け取れ、それを超えるメッセージはキューで待機します。
- プッシュは Claude Code のチャンネル(リサーチプレビュー)に依存しており、フラグ名が変更される可能性があります。
- 設計上、組み込みの TLS、永続化、メッセージ履歴、Web UI はありません。リレーを小規模に保つためです。
ロードマップ
小規模なリレーという設計に合うアイデアを、おおよその優先順位順に示します。
palaver doctor:設定元、リレーへの到達性、ID、配信モード、受信トレイ、インジェクターを確認します- リクエスト/レスポンスの自動化に向けたメッセージの有効期限(TTL)と返信先 ID
- リレーを再起動せずにトークンを失効させて再読み込みする機能、およびオプションのメンバーごとの送信ルール
- リレーの再起動後も未配信メッセージを保持する、オプションのディスク上キュー
開発
npm install
npm test # starts its own relay on a random port; tmux tests run when tmux is installed
npm run test:e2e は、実際のエージェントを使うオプトイン方式のエンドツーエンドテストです。リレーと、Claude Code、Codex、Antigravity を実行する 2 つの Docker「マシン」を起動し、呼びかけ(@all)と、両方のマシン上のすべてのエージェントにバトンが渡されることを確認します。Docker とエージェントのログインが必要です(--use-local-logins を指定すると、テストの実行中、このマシンのログイン情報がテストコンテナにコピーされます。CLAUDE_CODE_OAUTH_TOKEN/OPENAI_API_KEY も使用できます。test/e2e/run.mjs を参照してください)。モデルのサブスクリプションを使用し、完了まで数分かかります。このテストはこのマシン上でのみ実行され、CI では実行されません。
CONTRIBUTING.md をご覧ください。Apache License 2.0 に基づいてライセンスされています。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。