mcpField
I
intercom

intercom

ローカル
github.com/MuhammadTalhaMTAI・エージェント2110 週間前に更新

intercom について

intercom は、別々のマシン上にある Claude Code セッションを双方向メッセージでつなぐブリッジです。Channels API でセッションに通知し、HTTP で中継します。異なる開発者間やコンテナとホスト間の連携に対応し、送信・プロセスへの到達・返信を別々に追跡できます。

主な機能

  1. 012 つの Claude Code セッション間の双方向通信
  2. 02Channels API による受信メッセージ通知
  3. 03HTTP によるマシン間のメッセージ中継
  4. 04送信・到達・返信状態の追跡
  5. 05共有シークレットによる認証

活用シーン

  1. 01別マシンの開発者間で API 情報を共有
  2. 02フロントエンドとバックエンドのセッション連携
  3. 03コンテナ内のセッションとホストの接続
  4. 04メッセージの到達や返信の確認

MCP 対応

各マシンで MCP サーバーを stdio 経由でローカルの Claude Code セッションに接続し、`send_message` と `check_message` ツールを提供します。サーバー間のメッセージは HTTP で中継されます。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"muhammadtalhamt-intercom": {
"command": "npx",
"args": [
"-y",
"claude-intercom"
],
"env": {
"MY_ROLE": "<MY_ROLE>",
"REMOTE_HOST": "<REMOTE_HOST>",
"INTERCOM_SECRET": "<INTERCOM_SECRET>",
"INTERCOM_PORT": "<INTERCOM_PORT>",
"INTERCOM_HOST": "<INTERCOM_HOST>",
"INTERCOM_SEND_TIMEOUT_MS": "<INTERCOM_SEND_TIMEOUT_MS>"
}
}
}
}
起動コマンドnpx -y claude-intercom
設定が必要な環境変数
MY_ROLELabel for this instance, e.g. backend or frontend. Appears in message tags so the other side knows who is talking.
REMOTE_HOSTAddress of the other machine as host:port. A Tailscale address is recommended over a public one.
INTERCOM_SECRETシークレットShared secret authenticating messages between the two instances. Must match on both sides. There is no default: without it the intercom starts unpaired, binds no port, and refuses to send.
INTERCOM_PORTPort to listen on for incoming messages. Defaults to 8788.
INTERCOM_HOSTInterface to bind the listener to. Defaults to 0.0.0.0. Set 127.0.0.1 when a tunnel fronts the intercom, so only the tunnel can connect.
INTERCOM_SEND_TIMEOUT_MSHow long an outbound POST may hang before giving up. Defaults to 10000.

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
npmclaude-intercom2.1.0

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

Claude Intercom

Channels APIを使用した、Claude Code セッション間の双方向通信ブリッジです。

異なるマシン上の2つの Claude Code インスタンスで、リアルタイムに会話できます。一方がメッセージを送信すると、もう一方はチャンネル通知としてすぐに受信し、返信できます。

intercom-demo

Intercomがネイティブ機能ではできないこと

Claude Codeには、現在ネイティブのセッション間メッセージ機能があります。それでもIntercomが適しているケースを紹介します。

  • 別々の人同士で使えます。 これが最大のポイントです。ネイティブ機能は自分のセッション同士をつなぎます。受信トレイは自分のOSユーザーにひも付けられ、マシン間の配信には自分のRemote Controlが使われます。各自のノートPCで作業するバックエンド開発者とフロントエンド開発者は別々のアカウントを使うため、ネイティブ機能ではつなげられません。この2人をつなぐホットラインこそ、Intercomが実現するものです。
  • ネイティブのWindowsに対応しています。 ネイティブのメッセージ機能はmacOSとLinuxのみです。IntercomはHTTP経由で動作するBunなので、OSを問いません。
  • Anthropicではなく、自分のネットワークを使います。 ネイティブのマシン間メッセージはAnthropicのサーバーを経由します。Intercomは、自分のネットワーク、VPN、またはトンネル経由で直接POSTします。
  • あらゆるプロバイダーに対応します。 Bedrock、Vertex、Foundry、およびテレメトリが無効になっている環境でも動作します。そうした環境では、ネイティブのメッセージ機能が無効になっています。
  • コンテナーとホスト間で通信できます。 ネイティブの検出機能はディスク上のファイルを介して動作するため、コンテナー内のセッションからホスト上のセッションを確認できません。Intercomには、到達可能なポートがあれば十分です。
  • 配信状況を正確に把握できます。 send_messageはsent、delivered-to-process、answeredを別々の状態として報告し、check_messageツールも提供します。相手がメッセージを受け取らなかった場合も分かるため、返ってくるはずのない返事を前提にする必要がありません。

macOSまたはLinuxを使っていて、自分のセッション同士をつなぎたいだけなら、ネイティブ機能のほうがシンプルです。そちらをお使いください。それ以外の用途が、Intercomの出番です。

なぜ使うのか?

バックエンド開発者とフロントエンド開発者が、それぞれ別のマシンでClaude Codeを実行している場合、現状ではSlack、Discord、コピー&ペーストを使って質問を中継する必要があります。Claude Intercomを使うと、2つのAIセッション間に直接つながるホットラインを作成できます。一方のClaudeが、もう一方にエンドポイント、スキーマ、実装の詳細などを尋ね、実際のコードベースに基づいた回答を得られます。

アーキテクチャ

Machine A                          Machine B
(e.g. backend dev)                 (e.g. frontend dev)

Claude Code A                      Claude Code B
     |                                  |
     +-- intercom.ts ---HTTP POST----> intercom.ts --+
     |   (channel)     <--HTTP POST--  (channel)     |
     |                                               |
     +-- stdio (MCP) --+        +-- stdio (MCP) -----+
                        |        |
                   Claude A    Claude B

両方のインスタンスで同じintercom.tsファイルを実行します。それぞれがHTTPメッセージを受信し、Channels APIを介してローカルのClaude Codeセッションに渡します。また、Claudeが呼び出せるsend_messageおよびcheck_messageツールも公開します。

必要条件

Claudeを使ってセットアップする

各マシンのClaude Codeセッションにこれを貼り付けると、セットアップ全体を案内してくれます。まずマシンAで実行し、発行されたシークレットを保管してから、マシンBで実行してください。

Set up claude-intercom on this machine so this Claude Code session can message
a Claude Code session on my other machine.

Work through this in order, and stop and ask me whenever you need something
only I can tell you.

1. Check prerequisites. Confirm `bun --version` works and that `claude --version`
   is 2.1.80 or newer. If Bun is missing, tell me how to install it for my OS
   and stop there.

2. Work out how the two machines will reach each other. Run `tailscale ip -4`.
   If that returns an address we'll use Tailscale. If Tailscale isn't installed,
   tell me it's the recommended option and ask whether I want to install it or
   use something else.

3. Ask me these, one at a time:
   - a short role name for THIS machine, e.g. "frontend", "vps", "laptop"
   - the address of the OTHER machine (hostname or IP)
   - whether this is the first machine I'm setting up or the second

4. Handle the shared secret.
   - First machine: generate a strong random secret, show it to me once, and
     tell me I'll need it when I run this on the other machine.
   - Second machine: ask me to paste the secret from the first one.
   Both machines must end up with exactly the same secret.

5. Write `.mcp.json` in this project with an "intercom" server: command `npx`,
   args `["-y", "claude-intercom"]`, and env `MY_ROLE`, `REMOTE_HOST` (the other
   machine plus `:8788`), `INTERCOM_SECRET`, `INTERCOM_PORT` set to 8788.
   If `.mcp.json` already exists, merge the intercom entry into it instead of
   overwriting the file. Make sure `.mcp.json` is gitignored, it holds the secret.

6. Tell me to restart Claude Code on this machine with:
   `claude --dangerously-load-development-channels server:intercom`
   and explain that the flag is needed because the channels capability is still
   experimental, and that messages only arrive while both sides are running.

7. Once both machines are up, tell me to test it by asking one session to send
   a message to the other. Remind me that `send_message` reports sent /
   delivered-to-process / answered separately, so "delivered" means the remote
   process accepted it, not that the other Claude has read it.

Don't invent configuration keys. The only environment variables are MY_ROLE,
REMOTE_HOST, INTERCOM_SECRET, INTERCOM_PORT and INTERCOM_SEND_TIMEOUT_MS.

手動で設定したい場合は、以下の手順をご覧ください。

クイックスタート

1. インストール

インストールは不要です。両方のマシンで、初回実行時にnpxが取得します。

ただし、PATHにBunが必要です。サーバーはHTTPリスナーにBun.serveを使用し、npxのエントリーポイントからBunに処理を引き継ぎます。

ソースから実行しますか?
git clone https://github.com/MuhammadTalhaMT/claude-intercom.git
cd claude-intercom
bun install

その場合は、以下の設定でnpx形式の代わりに"command": "bun"と"args": ["/path/to/claude-intercom/intercom.ts"]を使用してください。

### 2. 設定

サンプル設定をプロジェクトの .mcp.json にコピーします。

まずシークレットを生成し、両方のマシンで同じ値を使用します。

openssl rand -base64 32

次に、設定ファイルに直接入力するのではなく、Claude Code を起動するシェルでシークレットをエクスポートします。

export INTERCOM_SECRET='the-value-you-just-generated'

.mcp.json はプロジェクトファイルであり、プロジェクトファイルはコミットされます。Claude Code は .mcp.json 内の ${VAR} を展開します。対象は command、args、env、url、headers です。そのため、シークレット自体を環境の外に出すことなく、以下の設定をリポジトリに追加してチームメイトと共有できます。

マシン A(例:バックエンド — 固定 IP または VPS):

{
  "mcpServers": {
    "intercom": {
      "command": "npx",
      "args": ["-y", "claude-intercom"],
      "env": {
        "MY_ROLE": "backend",
        "REMOTE_HOST": "MACHINE_B_IP:8788",
        "INTERCOM_SECRET": "${INTERCOM_SECRET}",
        "INTERCOM_PORT": "8788"
      }
    }
  }
}

マシン B(例:フロントエンド — NAT の背後にあってもかまいません):

{
  "mcpServers": {
    "intercom": {
      "command": "npx",
      "args": ["-y", "claude-intercom"],
      "env": {
        "MY_ROLE": "frontend",
        "REMOTE_HOST": "MACHINE_A_IP:8788",
        "INTERCOM_SECRET": "${INTERCOM_SECRET}",
        "INTERCOM_PORT": "8788"
      }
    }
  }
}
3. 起動

両方のマシンで実行します。

claude --dangerously-load-development-channels server:intercom
4. やり取りする

どちらかの Claude Code セッションで、次のように指示します。

「ダッシュボードで利用できる API エンドポイントを、もう一人の開発者に尋ねてください。」

Claude は send_message ツールを使用して、メッセージをもう一方のマシンに POST します。もう一方の Claude はチャンネル通知としてメッセージを受け取り、返信します。

2 台のマシンを接続する

Tailscale を使用します。 両方のマシンにインストールすると、自分の tailnet 上で安定したプライベートアドレスが割り当てられます。そのうえで、各マシンの接続先に相手の tailnet アドレスを指定します。

"REMOTE_HOST": "other-machine:8788"

これは、インターネットにポートを公開するよりもはるかに安全です。パブリックリスナーもポートフォワーディングも不要で、ISP によって IP アドレスが再割り当てされてもアドレスは変わりません。また、デバイスの ID は共有文字列だけに依存せず、Tailscale によって確認されます。外部から一切アクセスできないようにするには、INTERCOM_HOST に tailnet アドレスを設定します。トンネルも使用している場合は、127.0.0.1 を指定します。

代替手段:ngrok

Tailscale を使用できない場合は、ngrok も引き続き使用できます。

# On the machine behind NAT
ngrok http 8788
"REMOTE_HOST": "your-subdomain.ngrok-free.app"

ngrok のホスト名は自動的に検出され、HTTPS に切り替わります。Cloudflare、Caddy、自前のリバースプロキシなど、ほかのトンネルを使用する場合は、REMOTE_HOST にスキームを明示的に記述します(https://your-host)。そうしないと、シークレットが暗号化されていない HTTP で送信されます。

この設定では、共有シークレットだけで保護された、パブリックに到達可能なエンドポイントが Claude セッションの前面に置かれることに注意してください。強力なシークレットを選び、リスナーにアクセスできるのがトンネルだけになるよう INTERCOM_HOST=127.0.0.1 の設定も検討してください。

ツール

send_message

メッセージを送信し、id をすぐに返します。返信を待つことはありません。返信は後から、独立した受信メッセージとして届きます。

引数必須説明
messageはい送信するテキスト
replyToいいえ返信先を送信者が特定できるように、返信対象となる受信メッセージの id を指定します
expectReplyWithinいいえ返信にかかると見込まれる時間です。"30s"、"5m"、"2h" を指定します

確認応答では、もう一人の開発者がメッセージを受け取ったとは意図的に断定しません。HTTP 200 によって確認できるのは、リモートのプロセスがメッセージを受け付けたことだけであり、もう一方の Claude が実際に読んだかどうかはわかりません。

check_message

このツールは、送信後に結果を待たないチャンネルでは確認できない疑問に答えます。返信が遅れているのか、それとも届かないのかを確認できます。id を渡すか、省略すると未完了の項目がすべて一覧表示されます。

各メッセージは、次の 3 つの状態のいずれかになります。

状態意味
sent送信を試みましたが、リモートプロセスから確認応答がありません。もう一方のマシンに接続できない可能性があります
delivered-to-process相手のインターコムがメッセージを受け取りました。相手の Claude が読んだかどうかはわかりません。そのセッションはアイドル状態、終了済み、または利用枠超過の可能性があります
answeredこの id を指定する replyTo を含む返信が届きました

「期限超過」の判定には expectReplyWithin が必要です。これは全体に適用されるタイムアウトではなくメッセージごとに設定するため、エンドポイントの簡単な確認と長時間の調査が、同じ時間基準で評価されることはありません。

設定

環境変数必須デフォルト説明
MY_ROLEはいdeveloper-aこのインスタンスのラベル(メッセージタグに表示されます)
REMOTE_HOSTはいlocalhost:8789相手側のマシンのアドレス(host:port またはトンネル URL)。ngrok 以外の TLS トンネルでは https:// を含めてください
INTERCOM_SECRETはいなし共有シークレット。両側で一致している必要があります。デフォルト値はありません。未設定の場合、ドキュメント用のプレースホルダーのままの場合、または ${VAR} が展開されずに残っている場合、インターコムは接続を拒否します
INTERCOM_PORTいいえ8788受信メッセージを待ち受けるポート
INTERCOM_HOSTいいえ0.0.0.0リスナーをバインドするインターフェース。トンネルを前段に置く場合は 127.0.0.1 を使用してください
INTERCOM_SEND_TIMEOUT_MSいいえ10000送信 POST を諦めるまで待機する時間

動作の仕組み

  1. Claude Code が intercom.ts をサブプロセス(stdio 経由の MCP サーバー)として起動します
  2. スクリプトが claude/channel 機能を宣言し、これによって Channel として登録されます
  3. 受信メッセージを待ち受ける HTTP サーバーを起動します
  4. メッセージが届くと(共有シークレットで認証後)、method: 'notifications/claude/channel' を指定して mcp.notification() を呼び出します
  5. Claude Code は通知をメッセージ ID を含む <channel> タグとして会話に表示します
  6. Claude はこれを読み取り、replyTo にその ID を設定した send_message を使って返信できます。これにより、リモートマシンに POST が送信されます
  7. 元の送信側は replyTo を自身の送信記録と照合し、そのメッセージを answered とマークします

stdio を使う部分は、HTTP に置き換えられる実装上の詳細ではありません。これによってサーバーが特定の実行中の Claude Code セッションに接続されます。claude/channel 機能はその接続を通じて登録され、mcp.notification() が会話に届くのもこのためです。これをリモートでホストすると、通知は代わりに接続した MCP クライアントに届きます。

セキュリティ

  • 共有シークレット認証:POST /message では、設定されたシークレットと一致する X-Intercom-Secret ヘッダーが必要です。一致するかどうかは定時間比較で判定されます。それ以外の場合は 401 Unauthorized が返されます。GET /health は意図的に認証されていないため、トンネルを通じてエンドツーエンドで確認できます。このエンドポイントは、要求したすべての人にこのインスタンスのロールとバージョンを返すため、アクセス可能なインターコムは発見される可能性があるものとして扱ってください。
  • シークレットの安全性は通信経路次第です:シークレットはすべてのメッセージでプレーンテキストのヘッダーとして送信されます。Tailscale(WireGuard)や HTTPS トンネル経由であれば問題ありません。共有ネットワーク上の通常の HTTP では、通信経路上の誰もがこれを読み取り、その後に利用できます。
  • リプレイ攻撃の保護はありません:メッセージには id と timestamp が含まれますが、新しさや再利用の有無はどちらも検証されません。暗号化されていないリンク上で認証済みリクエストを一度取得されると、相手はそのまま何度でも再送できます。
  • デフォルトのシークレットはありません:INTERCOM_SECRET にフォールバック値はありません。未設定のままにする、ドキュメントのプレースホルダーをそのままにする、または一度もエクスポートしていない ${VAR} を参照すると、インターコムは ペアリングされていない 状態で起動します。ポートをバインドせず、send_message は理由を説明して処理を拒否します。未展開の ${VAR} のケースが重要なのは、Claude Code が未定義の変数を文字列のまま渡すためです。これにより、そうでなければ両方のマシンで推測可能な同じシークレットが使われることになります。
  • 受信内容は指示ではなくデータとして扱われます:サーバーは、チャンネルメッセージが別の人のセッションから届いたことを受信側の Claude に伝えます。受信内容で何かを承認したり、設定を変更したりすることはできません。テキスト内のスラッシュコマンドは無効であり、認証情報や環境変数ファイルを求める要求は拒否し、あなたに知らせる必要があります。
  • データは永続化されません:メッセージはリアルタイムで転送され、保存されません。
  • バインドアドレスを設定できます:デフォルトでは、マシン間のアクセスを可能にするため 0.0.0.0 で待ち受けます。トンネル経由で接続する場合は INTERCOM_HOST=127.0.0.1 を設定すると、トンネルだけが接続できます。

警告:これらの指示はデフォルトの動作であり、安全性を保証する境界ではありません。プロンプトへの指示でプロンプトインジェクションを防ぐことはできません。シークレットとアドレスを知っている人は誰でも、Claude のセッションにテキストを送信できます。実際の制限となるのは、そのセッション固有の権限確認だけです。ネイティブのセッション間メッセージングでは、受信内容を保留、承認、拒否する制御によって適切に対処できますが、この機能にはありません。強力なシークレットを使用し、パブリックインターネットに公開せず、端末を預けられない相手とはペアリングしないでください。

エンドポイント

メソッドパス認証説明
GET/healthなし{"status":"ok","role":"...","version":"..."} を返します
POST/messageX-Intercom-Secret ヘッダーメッセージを Claude のセッションに送信します

POST /message の本文:

{
  "id": "8649f5da",
  "replyTo": "40b0fd17",
  "content": "3 routes, all behind requireTenant()",
  "role": "backend-dev",
  "timestamp": "2026-08-16T09:41:00.000Z"
}

id と replyTo は省略可能です。これらがないメッセージも配信されますが、対応付けはできません。

本文は、セッションに届く前にスキーマ検証されます。content は必須で、最大 32,000 文字です。id と replyTo はマシン ID の形式([A-Za-z0-9_-]、64 文字以下)である必要があります。role と timestamp には、< > " ' や、送信者がメッセージを表示する <channel …> ラッパーを偽造するために使える Unicode の制御文字、ゼロ幅文字、双方向表示の上書き文字を含めることはできません。それ以外の場合は 400 が返され、本文が 64 KB を超える場合は 413 が返されます。

ユースケース

  • バックエンドとフロントエンドの連携:バックエンドの Claude が、実際のコードベースを使ってフロントエンドの Claude からの API に関する質問に答えます。
  • チームを分けたモノレポ:異なるパッケージを担当する別々の Claude セッションが連携できます。
  • コードレビューの連携:ある Claude がコードをレビューし、指摘事項を作者の Claude セッションに送信します。
  • CI/CD 通知:CI の Webhook をインターコムに向け、ビルド結果を Claude のセッションに送信します。

Star History

Star History Chart

License

MIT

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。