Relay について
Relayは、Claude DesktopとClaude Codeの間でファイル、コード、指示を受け渡すMCPメッセージバスです。両者のコンテキストを分離し、メッセージは変更せずに転送します。取得は通常ユーザーが実行します。
主な機能
- 01クライアント間でのメッセージ送受信
- 02共有メッセージバッファの消去
- 03受信時のシステム通知
- 04起動時の未読メッセージ表示
- 05最新メッセージへの直接アクセス
活用シーン
- 01Desktopの草案をCodeに送り実装
- 02CodeのコードをDesktopにレビュー依頼
- 03セッション間でエラー、設定、指標を共有
MCP 対応
Claude DesktopとClaude Code向けのMCPサーバーとして動作し、メッセージの送信、取得、消去ツールを提供します。最新メッセージに直接アクセスするリソースも利用できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Relay
情報(ファイル、コード、データ、コメント、指示など)を Claude Desktop と Claude Code の間でやり取りしながら、それぞれのメインコンテキストウィンドウを分離したままにする、シンプルなツールです。
どちらの Claude も自律的にメッセージを送信できます。相手側からの入力が必要になったら、そのまま送信します。メッセージが届くとシステム通知が表示されます。準備ができたら取得してください。
なぜ必要なのでしょうか? Desktop と Code にはそれぞれ異なる強みがあります。Desktop は会話(計画立案、アイデア出し、レビュー、文章の反復改善)に優れています。Code は実行(ファイルの編集、コマンドの実行、エラーへの対処)に優れています。しかし、両者はコンテキストを共有しません。Desktop で何かを下書きして Code に実装させたい場合や、書いているコードについて Desktop の意見を聞きたい場合、アプリ間でコピー&ペーストする必要があります。
Relay を使えば、質問を手動で指定したり、ウィンドウ間でコピー&ペーストしたりすることなく、両者をつなげられます。これは Anthropic に統合されていて然るべき基本機能です。
操作はユーザーが制御できます。 通常、取得はユーザーが行う操作です。get または /get と入力します。モデルは相手側からの入力が必要だと判断したときに、送信や取得を行うこともできますが、バックグラウンドで自動同期することはありません。LLM 同士の会話が制御不能になり、トークンを消費し続けることもありません。
簡単な例
[In Desktop]
You: Send my last error message to Code.
Desktop: [sends via relay]
[notification pops up in Code's terminal]
[In Code]
You: /get
Code: Got it. That's from line 47 in parser.py—the regex isn't matching.
[fixes the bug]
詳細な例
[In Code]
You: My classifier's stuck at 72% accuracy. Send the
training config and last epoch's metrics to Desktop.
Code: [sends config.yaml and metrics via relay]
[System notification appears that a message has been sent to Desktop]
[In Desktop]
You: /get
Desktop: [fetches config and metrics]
The loss curve suggests you're underfitting. Learning
rate 1e-5 is conservative for a model this size...
You: What would you try?
Desktop: Bump to 3e-5, add warmup steps, and your batch size
of 8 is small—if memory allows, try 16. Also the
class imbalance is brutal: 80/15/5 split. Consider
weighted loss or oversampling the minority classes.
You: Specify the changes.
Desktop: [sends updated config via relay]
[System notification appears that a message has been sent to Code]
[In Code]
You: /get
Code: Got it. Updating config.yaml and adding class weights
to the loss function.
[edits files, starts training run]
Epoch 12: accuracy up to 79%, but precision on
class 2 dropped. Want Desktop's take?
You: Yeah, send the confusion matrix.
Code: [sends via relay]
[In Desktop]
You: /get
Desktop: Class 2 is getting confused with class 0—they may be
semantically close. I need more examples.
[automatically sends request to Code via relay]
使い方
Desktop では get、Code では /get と入力して、相手側からのメッセージを確認します。これが主な操作方法です。
コマンドのバリエーション:
/get— Desktop からメッセージを取得して実行します/get status— メッセージ数と最終アクティビティを表示します/get clear— バッファー内のすべてのメッセージを消去します/get <message>— Desktop にメッセージを送信します
リソースへのアクセス: @relay:messages://latest を使ってメッセージを直接参照することもできます。/get より高速で、プランモードでも動作します。
起動時のプレビュー: Code の起動時に、Desktop から届いた未読メッセージのプレビューが表示されます。/get を使うと、メッセージの全文を確認できます。
送信は簡単で、明示的な操作も必要ありません。「これでよさそうか Desktop に聞いて」や「README を Code に送って」と伝えると、モデルが意図を認識して Relay を自動的に呼び出します。
通知
メッセージが届くとシステム通知が表示されるため、相手側を確認するタイミングがわかります。手動でポーリングする必要はありません。
| プラットフォーム | 方法 | 備考 |
|---|---|---|
| macOS | osascript | ネイティブの通知センター |
| Linux | notify-send | libnotify が必要です |
| Windows | PowerShell toast | ネイティブのトースト通知 |
サウンド: 通知音を有効にするには --sound を追加します。値を指定しない場合は、プラットフォームのデフォルトが使用されます。値を指定すると、そのサウンドが使用されます。
| プラットフォーム | デフォルト | カスタム例 |
|---|---|---|
| macOS | blow | --sound tink |
| Linux | freedesktop のメッセージサウンド | --sound /path/to/sound.oga |
| Windows | システムのデフォルト | --sound ms-winsoundevent:Notification.IM |
通知の表示時間と表示動作は、OS の設定で制御されます。
設計哲学
トランスポートであり、記憶ではありません。 リレーはメッセージバスです。メッセージの要約、圧縮、書き換え、解釈は行いません。共有される隠れたコンテキストや、統合されたシステムプロンプト、エージェント間のプランニングもありません。メッセージは変更されずに渡されます。これにより、関心事を明確に分離し、認識上の歪みを防ぎます。
基本的にユーザーが制御します。 メッセージの取得は通常、バックグラウンドプロセスではなく、明示的なユーザー操作(get または /get)によって行われます。これにより、コンテキストの際限ない増大やフィードバックループを防げます。ただし、モデルは相手側からの入力が必要だと判断した場合、自律的にメッセージを送信または取得できます。システムはこれを可能にしますが、推奨はしていません。
インターフェースは独立しています。 Desktop と Code は、それぞれ単独で完全に使用できます。Code を使わずに Desktop で長時間会話したり、Desktop を使わずに Code で何時間もデバッグしたりできます。リレーは必要なときに両者を接続しますが、依存関係は作りません。また、どちらのインターフェースも既存のサブスクリプションを利用するため、API コストはかかりません。
必要最小限の機能です。 リレーが行うのは、送信、取得、消去の 3 つです。オーケストレーション、調停、合意形成、自律的な動作は提供しようとしません。この制約は意図的なものです。マルチエージェント設計の多くは、明確に保つべき境界を曖昧にすることで失敗します。
自然に拡張できます。 複数の Code セッションを同じ Desktop に接続し、適切な会話にメッセージを送れます。追加の MCP 対応ピア、代替ストレージバックエンド、プロジェクトごとのバッファー、読み取り専用のオブザーバーも、この設計から自然に拡張できます。
これにより、人間が介在し、明示的に同期するマルチエージェントメッセージバスという、独自のインフラストラクチャクラスが定義されます。
設計に関する注意事項
リレーはグローバルです。 ~/.relay_buffer.db のバッファーは、すべてのプロジェクトで共有されます。Desktop は作業中のプロジェクトを認識しないため、プロジェクトごとに分離するのは現実的ではありません。これは意図的な設計です。1 人のユーザー、1 台のマシン、1 つのリレーです。
Code でプロジェクトを切り替えても、リレーはそのまま引き継がれます。前のプロジェクトの古いメッセージが残っている場合があります。新しく始めたい場合は、/get clear を使用してください。
大きなファイルは時間がかかります。 1、2 ページ程度のメッセージなら、リレーは高速です。大きなファイルの場合は、目的のインターフェースに直接ドラッグするほうが速くなります。付随するコンテキストは、引き続きリレー経由で送信できます。
セットアップ
uvx とは何ですか? uvx は、Python パッケージをグローバルにインストールせずに直接実行します。依存関係も自動的に処理します。まだインストールしていない場合は、curl -LsSf https://astral.sh/uv/install.sh | sh を実行してください(詳しくは astral.sh/uv をご覧ください)。
1. Claude Desktop を設定する
Claude Desktop の設定に追加します。
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Linux:
~/.config/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"relay": {
"command": "uvx",
"args": ["mcp-server-relay", "--client", "desktop", "--sound"]
}
}
}
Claude Desktop を再起動し、次の指示を記憶するよう伝えます。
覚えておいてください。ユーザーが「get」または「/get」だけを入力したら、relay_fetch を使ってリレーから最近のメッセージを取得してください。
「Show me my memory edits.」と言うと、記録されたことを確認できます。
2. Claude Code を設定する
プロジェクトのルートにある .mcp.json に追加します。
{
"mcpServers": {
"relay": {
"command": "uvx",
"args": ["mcp-server-relay", "--client", "code"]
}
}
}
注:通知を両側に送るのは Desktop なので、--sound が必要なのは Desktop だけです。
3. /get コマンドと起動フックをインストールする
uvx mcp-server-relay --setup-code
これにより、/get スラッシュコマンドと、Code の起動時に保留中のメッセージを表示する SessionStart フックがインストールされます。
代替方法:GitHub からインストールする
uvx を使用したくない場合は、リポジトリをクローンして直接実行します。
git clone https://github.com/mhcoen/mcp-relay.git
cd mcp-relay
python -m venv .venv
.venv/bin/pip install -e .
その後、設定ではフルパスを使用します。
Claude Desktop(claude_desktop_config.json):
{
"mcpServers": {
"relay": {
"command": "/path/to/mcp-relay/.venv/bin/python",
"args": ["/path/to/mcp-relay/relay_server.py", "--client", "desktop", "--sound"]
}
}
}
Claude Code(.mcp.json):
{
"mcpServers": {
"relay": {
"command": "/path/to/mcp-relay/.venv/bin/python",
"args": ["/path/to/mcp-relay/relay_server.py", "--client", "code"]
}
}
}
/path/to/mcp-relay を実際にクローンした場所に置き換えてください。
ツール
| ツール | 説明 |
|---|---|
relay_send(message, sender) | メッセージを送信します(sender:「desktop」または「code」) |
relay_fetch(limit, reader, unread_only) | 最近のメッセージを取得します。既読としてマークすることもできます |
relay_clear() | バッファー内のすべてのメッセージを削除します |
技術的な詳細
- バッファー:
~/.relay_buffer.dbにある SQLite - ローリングウィンドウ:最大 20 件のメッセージ(最も古いものから削除)
- メッセージの上限:1 件あたり 8 KB
- アイドルタイムアウト:1 時間(非アクティブになるとサーバーは自動的に終了します)
- トランスポート:stdio(標準の MCP)
- Python:3.9 以降
作者
Michael Coen — [email protected] · [email protected]
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。