Tailnet MCP bridge について
Tailnet MCP bridgeは、Tailscale tailnet内のMCPサーバーに接続するための、ホスト型エージェントやサンドボックスクライアント向けstdio MCPサーバーです。Tailscaleノードを内蔵し、サーバーを公開インターネットに出さずにStreamable HTTPエンドポイントへ転送します。
主な機能
- 01stdioをStreamable HTTPにブリッジ
- 02タグ付きデバイスとしてtailnetに参加
- 03MCPサーバーを公開インターネットから隔離
- 04サーバー再起動後にセッションを復旧
- 05未到達のリクエストのみ再試行
活用シーン
- 01ホスト型エージェントのサンドボックスをtailnet内サーバーに接続
- 02tailscale serveで公開したMCPサーバーに接続
- 03サーバー再起動後もMCPセッションを維持
MCP 対応
stdio MCPサーバーとして動作し、リクエストをtailnet内のStreamable HTTP MCPサーバーに転送します。クライアントのMCP接続を中継し、独自のツールは提供しません。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
docker run -i --rm -e TS_AUTHKEY ghcr.io/zedong-peng/tailnet-mcp:v0.3.0TS_AUTHKEYシークレットTagged, pre-authorized auth key; only needed the first timeローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ghcr.io/zedong-peng/tailnet-mcp:v0.3.0stdioツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
tailnet-mcp
tailnet 内の Streamable HTTP MCP サーバーにすべての通信を転送する、stdio MCP サーバーです。
ホスト型エージェント(Grok、クラウド型コーディングエージェント、サンドボックス化されたアシスタント)が MCP サーバーを利用する方法は、通常 2 つあります。URL 経由:ベンダーのサーバーが接続するため、サーバーをパブリックインターネット上に置く必要があります。コマンド経由:エージェントが自分のコンピューター上でプロセスを起動しますが、そのコンピューターは tailnet に参加しておらず、そこで tailscaled を実行することもできません(root 権限がなく、TUN も使えません)。tailnet-mcp はコマンド経由で動作します。Tailscale ノード(tsnet)を組み込み、タグ付きデバイスとして tailnet に参加して、stdio とサーバーの間を中継します。サーバーは tailscale serve の背後に置かれ、インターネットに公開されることはありません。
agent ──stdio──▶ tailnet-mcp (tag:agent) ══tailnet══▶ tailscale serve ──▶ MCP server on 127.0.0.1
インストール
Releases から linux または darwin、amd64 または arm64 向けの静的バイナリをダウンロードし、SHA256SUMS と照合してください。または、自分でビルドすることもできます。
CGO_ENABLED=0 go install github.com/zedong-peng/tailnet-mcp@latest
または、/home/nonroot/.local/state/tailnet-mcp にボリュームをマウントして、イメージ ghcr.io/zedong-peng/tailnet-mcp を実行します。MCP Registry にも io.github.zedong-peng/tailnet-mcp として登録されています。
使い方
-
推測されにくいパスを使い、サーバーを tailnet 内だけに公開します。
tailscale serve --bg --https=8443 --set-path=/$(openssl rand -hex 16) http://127.0.0.1:8080/mcp -
エージェント用のタグを付けた、事前認証済みのワンタイム認証キーを作成し(管理コンソールまたは API)、エージェントのコンピューターから一度ログインします。
TS_AUTHKEY=tskey-auth-... tailnet-mcp -hostname my-agent -url https://server.tailnet.ts.net:8443/<path> -check-checkは接続して、サーバーのツールを stderr に出力して終了します。ノードキーは-stateに保存されます(既定値は~/.local/state/tailnet-mcp/<hostname>)。永続ストレージに保存してください。タグ付きノードは期限切れにならないため、キーを再度使う必要はありません。 -
キーを含めず、同じコマンドをエージェントの MCP サーバーとして登録します。
tailnet-mcp -hostname my-agent -url https://server.tailnet.ts.net:8443/<path>
各プロセスはそれぞれ独立した tailnet ノードです。2 つ目のサーバーを使う場合は、別の -hostname を指定して 2 つ目のプロセスを実行してください。
セキュリティを強化する
エージェントは信頼できない入力(Web ページ、メール)を読み取るため、ツールで許可されていることなら何でも実行するよう仕向けられる可能性があると考えてください。エージェントの振る舞いに依存しない、次の 3 つの層で保護します。
-
ネットワーク。 タグには必要なポートへの grant だけを与え、それ以外は許可しません。
"grants": [ {"src": ["tag:my-agent"], "dst": ["server"], "ip": ["tcp:8443"]}, ], "tests": [ {"src": "tag:my-agent", "accept": ["server:8443"], "deny": ["server:22", "server:443"]}, ],すべてを許可する grant(
"src": ["autogroup:member"], "dst": ["*"])はタグ付きデバイスには適用されないため、そのタグが得られるのはこの grant だけです。 -
パス。
tailscale serve --set-pathは秘密のパスでのみ応答し、ポート上のほかのパスには 404 を返します。tailnet 内のほかのデバイスは、ポートを推測してもサーバーを利用できません。 -
サーバー。 エージェント側ではなく、データが存在する場所で権限を強制します。たとえば、下書きの保存のみ可能なメールサーバーや、共有コレクション 1 つの閲覧専用メンバーとして設定されたパスワード保管庫アカウントです。examples/private-tools では、両方の設定例を紹介しています。
動作
- 最初のリクエストの前に、応答があるまでサーバーのノードに ping を送信します。再起動直後は、サーバーにノードへの古いパスが残っている場合があり、最初の接続がタイムアウトすることがあります。
- サーバーに到達しなかったリクエストのみ再試行するため、ツール呼び出しが二重に送信されることはありません。
- サーバーが再起動してセッションを忘れた場合(404、またはセッションに関する 400)、ブリッジは
initializeを再送し、リクエストを再送信します。クライアント側では気付きません。 - リクエストに失敗すると、理由を含む JSON-RPC エラーが返されるため、クライアントが返ってこない応答を待ち続けることはありません。
- EOF を受信すると、
DELETEでセッションを終了します。ログは stderr に出力され、stdout には MCP フレームのみが出力されます。-vを指定すると、tsnet 自身のログも出力されます。
未対応:サーバーが応答以外でメッセージを送信できるようにする、オプションの GET ストリームです。ほとんどのツールサーバーと同様に、サーバーは各リクエストに対して個別に応答します。
比較
mcp-remoteなどの標準入出力と HTTP のブリッジでは、サーバーへのネットワーク経路が必要です。エージェントのサンドボックス内では、公開 URL が必要になります。- サンドボックス内での
tailscale upには、root 権限と TUN デバイスが必要です。タグ付きキーではなくユーザーとしてログインすると、サンドボックスからそのユーザーが tailnet 全体にアクセスできてしまいます。 - Tailscale Aperture はサーバー側のゲートウェイです。HTTP MCP サーバーを集約し、ユーザーごとにツールを付与します。サンドボックス化されたエージェントを tailnet に接続するものではないため、両者は併用できます。
ビルドとテスト
go test -race ./...
CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" .
v* をタグ付けすると、4 つのバイナリ、イメージ、レジストリエントリーが公開されます。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。