Tailscale について
Tailscale のノードと tailnet を管理する MCP サーバーです。ローカルノードは CLI、tailnet はコントロールプレーン REST API で操作し、権限階層とプリセットでツールを絞り込めます。読み取り専用リソース、プロンプト、診断コマンドも備えています。
主な機能
- 01CLI によるローカルノード管理
- 02REST API による tailnet 管理
- 03階層とプリセットによるツール制限
- 04ノードと tailnet の読み取り専用リソース
- 05プロンプトと引数補完
活用シーン
- 01ローカルノードの状態確認
- 02tailnet のデバイスとポリシーの照会
- 03許可された範囲での設定変更
- 04接続の診断やポリシーのレビュー
MCP 対応
MCP サーバーとして、クライアントに Tailscale のノード・tailnet 用ツール、リソース、プロンプト、補完機能を公開します。ノード用ツールには tailscale CLI、tailnet 用ツールにはコントロールプレーンの認証情報が必要です。標準の stdio に加え、トークン保護付き HTTP にも対応します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
npx -y @tailscale-mcp/tailscale-mcpTAILSCALE_API_KEYシークレットA control-plane API access token. One of this, the OAuth client pair, or the OAuth JWT file is needed for the tailnet tools; without any of them only the local tools are offered.TAILSCALE_OAUTH_CLIENT_IDシークレットAn OAuth client id, used with TAILSCALE_OAUTH_CLIENT_SECRET when there is no API access token.TAILSCALE_OAUTH_CLIENT_SECRETシークレットThe OAuth client secret that goes with TAILSCALE_OAUTH_CLIENT_ID.TAILSCALE_TAILNETThe tailnet the control-plane tools act on. Without it they act on the one the credential belongs to.TAILSCALE_MCP_PRESETWhich tools are offered: minimal, core or full.TAILSCALE_MCP_ALLOW_WRITEOffer the tools that change something. Read-only without it.TAILSCALE_MCP_ALLOW_DESTRUCTIVEOffer the tools that remove or sever something. Implies the write tier.ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
tailscale-mcp
Tailscale の MCP サーバーです。実行先のノードは tailscale コマンドラインインターフェースを通じて操作し、その背後にある tailnet はコントロールプレーンの REST API を通じて操作します。
186 個のツールを、動詞ごとに 1 つ用意しています。実際のパラメーターを受け取り、誠実なアノテーションを備えています。Tailscale が返す JSON は変更せずに返すため、Tailscale のドキュメントで学んだ内容をそのまま活用できます。失敗した場合は、大量の標準エラーではなく、固定のエラーコードとヒントが返されます。
どちらの機能も任意で、片方がなくても致命的な問題にはなりません。tailscale バイナリがなければ、このノードを操作するツールは提供されません。コントロールプレーンの認証情報がなければ、tailnet を操作するツールは提供されません。tailscale-mcp diagnose を実行すると、このマシンでどちらを利用できるかがわかります。
macOS では、このバイナリは Tailscale アプリケーションが /usr/local/bin にインストールする tailscale shim です。アプリケーションバンドル内の実行ファイルは代わりに使えず、その用途では受け付けられません。ログインシェルの外で実行すると、応答する代わりに GUI が起動するため、ローカルツールは提供されても、呼び出すたびに失敗します。
インストール
| チャンネル | 方法 |
|---|---|
| npm | npx -y @tailscale-mcp/tailscale-mcp — お使いのマシン用のリリースバイナリをダウンロードし、リリースに付属する SHA256SUMS で検証できない場合は実行を拒否します |
| コンテナー | docker run -i --rm -e TAILSCALE_API_KEY ghcr.io/tailscale-mcp/tailscale-mcp |
| Homebrew | brew trust tailscale-mcp/tap && brew install tailscale-mcp/tap/tailscale-mcp — Homebrew 6 では、信頼済みにするまでサードパーティーの tap を読み込みません。また、そのエラーを認識しているプラットフォームごとに 1 回、Invalid formula エラーとして報告します |
| バンドル | 使用するプラットフォーム向けの .mcpb をリリースからダウンロードして開きます。Claude Desktop など、バンドルをインストールする MCP クライアント向けです |
| ソースから | cargo install tailscale-mcp |
リリースアーカイブはリリースページにあり、それぞれの隣に SHA256SUMS が用意されています。対応プラットフォームは、macOS と Linux の x86_64 および arm64、Windows の x86_64 です。
クライアントの接続先に設定する
tailscale-mcp setup claude-code
を実行すると、クライアント(claude-code、claude-desktop、vscode、cursor、zed)向けの設定例が表示され、記述先も案内されます。何も書き込みません。設定例を貼り付けるのはユーザー自身で、次のセクションで説明する理由から、認証情報も含まれません。
npm からインストールした場合、事前のインストールは不要で、クライアントに設定を持たせることができます。
{
"mcpServers": {
"tailscale": {
"command": "npx",
"args": ["-y", "@tailscale-mcp/tailscale-mcp"],
"env": {
"TAILSCALE_MCP_ALLOW_WRITE": "true"
}
}
}
}
これだけで起動できます。認証情報がなければ、このノードを操作するツールは提供されますが、tailnet を操作するツールは非表示になります。tailscale-mcp diagnose を実行すると、どちらを利用できるかがわかります。
認証
setup は認証情報を出力しません。出力先のファイルは、内容を読み返さずに課題やチャットへ貼り付ける人がいるためです。認証情報の追加は、別途、意識して行う手順です。上記の env ブロックには、次の2種類のいずれかを指定します。API アクセストークン:
"env": {
"TAILSCALE_API_KEY": "tskey-api-…",
"TAILSCALE_MCP_ALLOW_WRITE": "true"
}
または OAuth クライアント:
"env": {
"TAILSCALE_OAUTH_CLIENT_ID": "k123456CNTRL",
"TAILSCALE_OAUTH_CLIENT_SECRET": "tskey-client-…",
"TAILSCALE_MCP_ALLOW_WRITE": "true"
}
連携 ID 用の JWT ファイルなど、その他の形式については認証情報の表をご覧ください。どちらの方法も、すべてのツールで利用できます。どちらを選ぶかは、サーバーで何ができるかには関係しないため、ほかの観点から選ぶ価値があります。
長期的に使うものには、OAuth クライアントをおすすめします。 その理由は、クライアント設定の「性質」にあります。つまり、誰かが一度作成すると、その後は忘れられ、ツールがインストールされている限り秘密情報を保持するファイルだからです。
API アクセストークンは、3つの点で適していません。ユーザー個人に紐づき、そのユーザーができることすべてを許可するため、ファイルが漏洩すると、有効にしたツールだけでなくアカウント全体が危険にさらされます。また、有効期限が切れます。作成後に誰も見ていないファイルの場合、認証情報の期限切れではなく、サーバーが理由もなく動作しなくなったように見えます。さらに、それ自体がベアラートークンであるため、保存されているものが、そのまま扉を開ける鍵になります。
OAuth クライアントは、これらの点をすべて逆転させます。テールネットに紐づくため、設定したユーザーがいなくなっても有効で、ユーザー本人のアクセス権に影響を与えずに取り消せます。スコープを使って、有効にしたツールセットが実際に呼び出す機能に権限を絞れます。自然に期限切れになることはなく、ファイルに保存されるのは鍵そのものではなく、鍵を発行する手段です。このサーバーに渡されるトークンの有効期間は1時間なので、バックアップや画面共有から取得したコピーも、使われる頃にはほとんど価値がありません。
API アクセストークンはコントロールプレーンで最初に提示される認証方法であり、まず試すには手軽です。ファイルを長期的に使うなら、後から置き換える価値があります。
ティアとプリセット
セッションで提供される機能は、互いに独立した2つの設定で決まります。
ティアは、ツールに許可される操作の危険度です。読み取りツールは何も変更せず、常に提供されます。書き込みツールは、元に戻せる設定を変更します。破壊的ツールは、削除したり、単純には元に戻せない形で何かを公開したりします。たとえば、デバイスの削除、鍵の取り消し、サービスのインターネットへの公開などです。読み取りは常に有効です。書き込みと破壊的操作は、有効にするまで無効です。許可されたティアを超えるツールは、呼び出されたときに拒否されるのではなく、一覧に表示されません。
プリセットは、提供される機能の範囲を決めます。minimal は、エージェントが質問に回答し、よくある問題を修正するために必要な機能を提供します。core は、日常的な管理機能を追加します。full は、テールネット全体に関わる機能や、元に戻せない操作に関わる機能を追加します。どのプリセットにも含まれず、名前を指定して有効にする必要があるツールセットが2つあります。Tailscale 独自の診断機能を提供する local-debug と、任意の tailscale サブコマンドを実行する単一のツールである local-passthrough です。
| プリセット | 読み取り | --allow-write を指定 | --allow-destructive を指定 | ツールセット |
|---|---|---|---|---|
minimal | 37 | 51 | 55 | 4 |
core(デフォルト) | 57 | 106 | 126 | 13 |
full | 68 | 126 | 155 | 18 |
--toolsets +local-debug,+local-passthrough を full に追加すると、186個すべてのツールが利用できます。
破壊的ツールの中には、confirm: true 引数も必要とするものがあります。これらは、テールネット全体に影響する操作や、このサーバーが操作しているノードまたはテールネットからサーバー自身を切り離す可能性がある操作です。たとえば、ノードからログアウトする、自身のデバイスを削除する、呼び出し元を締め出すポリシーをデプロイするといった操作です。サーバーがそれらの操作の是非を判断するのではなく、呼び出し元に意図した操作であることを明示させます。
- docs/tools.md — すべてのツール、そのティア、および機能を説明します。コードから生成されます。
- docs/configuration.md — すべての環境変数とフラグ、およびデフォルト値を説明します。
- docs/errors.md — すべてのエラーコードと対処方法を説明します。
リソース、プロンプト、補完
9つのリソース(固定リソース8つと、デバイス識別子で指定するテンプレート1つ)により、クライアントはローカルノードのステータス、設定、netcheckレポート、tailnet lockの状態に加え、tailnetのポリシーファイル、デバイス、DNS設定、各種設定を取得できます。これらは読み取り専用で、対応するサーフェスが有効な場合にのみ表示され、サブスクリプションはありません。
3つのプロンプトが一連のツール呼び出しを誘導します。diagnose_connectivity、review_policy_change、audit_tailnet_accessです。これらにもリソースと同じルールが適用されます。それぞれ、必要なサーフェスが有効な場合にのみ表示されます。また、両方のサーフェスから読み取るdiagnose_connectivityは、セッションで実行可能な手順までで停止します。
2つのサーフェスが公開する4つの引数スロットのうち、3つは補完されるため、クライアントは値を推測に任せず提示できます。デバイステンプレートの識別子、diagnose_connectivityのピア、そしてaudit_tailnet_accessの対象です。対象にはユーザー、タグ、デバイスの順で候補が提示されるため、デバイスが数千台あるtailnetでも、プロトコルが送信する100個の値の中に少数のユーザーを表示できます。4つ目のreview_policy_changeの目標は意図を説明する文章であり、これを補完すると意図を捏造することになります。提示される値はすべて、サーバーが受け付ける値です。デバイスは、2台のマシンで同じものが使われる可能性のあるホスト名ではなく、MagicDNS名で提示されます。また、値を返せないソースはエラーではなく何も補完しません。仕様の要求に従い、このメソッドにはレート制限が設けられています。キー入力ごとにリクエストが発生するためです。
このプロトコルが補完するのは、プロンプトの引数とリソーステンプレートの変数だけで、それ以外はありません。ツールの引数は補完できないため、上記4つのスロットには役立ちますが、186個のツールには役立ちません。クライアントによってサポート状況は異なります。Claude Codeはリソーステンプレートを補完し、VS Codeは両方を補完しますが、どちらにも対応していないクライアントもいくつかあります。そのため、この機能は対応クライアントでは改善となり、それ以外では何の影響もありません。
トランスポート
デフォルトはStdioです。--httpを指定すると、代わりにStreamable HTTPを127.0.0.1:8449で提供します。TAILSCALE_MCP_HTTP_TOKENのベアラートークン、ホストとオリジンの許可リスト、リクエスト本文のサイズ制限、アドレスごとのレート制限、および認証不要のヘルスエンドポイントを備えています。ループバック以外のアドレスにバインドするには、そのトークンを設定するか、--http-no-authを明示的に指定する必要があります。
セキュリティ
各ティアの役割。 許可されたティアを超えるツールはツール一覧に含まれないため、呼び出し元は名前を推測しても実行できず、モデルも提示されていないツールを使うよう誘導されることはありません。デフォルトは読み取り専用です。破壊的な操作を含むティアに confirm を加えることで、確認に値する操作に対する二重のシグナルになります。シークレットが引数リスト、ログ行、エラーメッセージに渡ることはありません。生成されたキーや招待 URL は一度だけ、そのまま返され、ここにコピーが保存されることもありません。すべてのツール結果とエラーは、返される際に同じ方法で機密情報がマスキングされます。
各ティアが担わないこと。 ティアは認可システムでも、サンドボックスでもありません。
- ティアは呼び出し元ではなく、サーバーの属性です。1 つのサーバーに接続するすべてのユーザーが、同じツールを利用します。2 人の呼び出し元に異なる権限を与える必要がある場合は、サーバーを 2 つ実行してください。
- ティアを許可すると、そのティアに含まれるすべてのツールが許可されます。ツールごとの切り替えはありません。セッションから利用できる範囲を狭めるには、より大まかな設定項目である
--toolsetsを使用してください。 - 実際の境界となるのは認証情報です。読み取り専用の OAuth クライアントを使用すれば、このサーバーが何を提供していても、テイルネットへの書き込みツールはコントロールプレーンで失敗します。頼るべき境界はここです。認証情報のスコープを制限し、ティアを使ってうっかりした操作を防いでください。
- ローカルツールは、このサーバーを実行しているユーザーとして動作します。Tailscale 独自のオペレーター確認が適用されるため、オペレーターではないユーザーに拒否されるコマンドは、ここでも
needs_operatorとともに拒否されます。ただし、オペレーターとして実行されるサーバーは、オペレーターができることを実行できます。 - 読み取り操作も無害とは限りません。読み取りティアは、ノード名、アドレス、ユーザー、ポリシーなど、実際のネットワークトポロジーを返します。ツールの出力を読み取れるものは、すべてそれを読み取れます。
サーバーが権限を昇格させることはありません。 sudo を使わず、権限昇格を求めず、自身の権限を変更したり、何かをインストールしたりすることもありません。起動時のユーザーとして tailscale バイナリを実行し、渡されたコントロールプレーンの認証情報を送信します。要求者を理由に Tailscale が拒否した場合、その拒否は回避されず、そのまま返されます。ファイルを書き込むツールは 4 つあります。うち 3 つは、呼び出しで指定されたパスに証明書、Taildrop による配信ファイル、メトリクスファイルを書き込みます。残る tailscale_configure_kubeconfig は、クライアント自身が編集する kubeconfig に書き込みます。4 つともサーバー実行ユーザーとして書き込みます。また、プリセットには含まれない tailscale_run も同じユーザーとして実行され、名前を指定して呼び出すと、これらと同じ書き込みや、tailscale バイナリが行えるその他すべての操作を実行できます。
HTTP では、デフォルトで慎重な設定が適用されます。ループバック接続のみ、トークン必須、ブラウザーのオリジンを許可しない設定です。これらはそれぞれ、意図的にフラグで緩和できます。
その他の Tailscale MCP サーバーとの比較
このサーバーは、先行する 3 つのサーバー(rtailscale、HexSleeves/tailscale-mcp、YawLabs/tailscale-mcp)の機能をすべて含み、さらに拡張したものです。ただし、例外が 4 つあり、以下の表に記載されています。
| 機能 | rtailscale | HexSleeves | YawLabs | このサーバー |
|---|---|---|---|---|
| デバイス:一覧表示、取得 | はい | 一覧表示のみ | はい | はい。以下の tailnet-devices 内 |
| デバイス:認可、削除、有効期限切れ、名前変更、IP 設定、キーの有効期限 | 認可、削除 | 認可、削除、有効期限切れ | はい | はい。15 個のツールをすべて含む |
| デバイスのルート、タグ | ルート取得 | はい | はい | はい。以下の tailnet-devices 内 |
| ポスチャ属性 | — | — | はい | はい。以下の tailnet-devices 内 |
| ポリシーファイル:取得、設定、プレビュー、検証 | 取得 | 取得、設定、検証 | はい。If-Match を使用 | はい。書き込みごとにバージョン識別子を使用 |
| DNS:ネームサーバー、設定、検索パス、スプリット DNS | 取得 | はい | 11 個のツール | 11 個のツール |
| 認証キー | 一覧表示 | はい | はい | 5 個のツール |
| OAuth クライアント | — | — | 4 個のツール | 5 個のツール |
| ユーザー | 一覧表示 | — | 7 個のツール | 7 個のツール |
| Tailnet の設定、連絡先 | — | 一部 | 5 個のツール | 5 個のツール |
| Webhook | — | はい | 7 個のツール | 7 個のツール |
| ポスチャ統合 | — | — | 5 個のツール | 5 個のツール |
| 監査ログとネットワークフローログ、ログストリーミング | — | — | 9 個のツール | 8 個のツール |
| 招待:デバイスとユーザー | — | — | 11 個のツール | 11 個のツール |
| サービス | — | — | 7 個のツール | 7 個のツール |
| 組織の Tailnet | — | — | 3 個のツール | 3 個のツール |
| ローカルのステータス、IP、whois、whoami、バージョン | — | ステータス、バージョン | 4 個のツール | 25 個のツール |
| Ping、netcheck、routecheck、DNS クエリ、出口ノード | — | ping、出口ノード | ping、netcheck | はい。上記の local-status 内 |
| 設定、起動、停止、ログイン、ログアウト、プロファイル | — | 起動、停止 | — | 8 個のツール |
| Serve と funnel | — | — | — | 10 個のツール |
| Taildrive、ファイル転送、証明書、kubeconfig | — | — | — | 11 個のツール |
| Tailnet lock | — | スタブ | — | 8 個のツール、およびステータスとログ |
| Tailscale 独自のデバッグ機能 | — | — | — | 30 個のツール |
任意の tailscale サブコマンド | — | — | — | 1 個のツール。デフォルトでは無効 |
| リソース | 1 | 4 | 4 | 9 |
| プロンプト | 1 | 2 | 0 | 3 |
| トランスポート | stdio、HTTP | stdio、HTTP | stdio | stdio、HTTP |
| ツール数 | 1 個、10 個のアクションを含む | 19 個、そのうち 1 個はスタブ | 102 | 186 個のツール |
YawLabs より少ない項目が 1 行ありますが、機能が欠けているわけではありません。相手のツールのうち 2 つは、このサーバーが個別に公開しているエンドポイントをまとめたものです。1 つは 1 回の呼び出しで両方のログタイプのストリーム設定を取得するツール、もう 1 つは 1 回の呼び出しでデバイスのリストを認可するツールです。どちらも、ここでは項目ごとのツールを繰り返し呼び出すことで利用できます。相手側の列ではカウントされますが、この列ではカウントされないため、ログの行は 9 対 8 となっています。
他の実装にはあり、この実装には意図的に含まれていないものが 4 つあります。
- 設定ファイルはありません。 rtailscale は
config.tomlを読み込みます。ここでは、すべて環境変数またはフラグで設定します。MCP クライアントの設定で指定できるのはその方法だからです。設定の参照元がもうひとつあると、設定を見つけにくい場所が増えてしまいます。 - ツールスキーマのリソースはありません。 rtailscale は独自のツールスキーマをリソースとして提供します。MCP にはすでに
tools/listがあり、同じ情報を別途用意すると、両者の内容が食い違う可能性があります。 - このリリースでは、ブラウザクライアント向けの OAuth リソースサーバーモードはありません。 rtailscale は OAuth リソースサーバーとして動作し、ブラウザクライアントが認証できるようにする機能を備えています。ここでの HTTP トランスポートはベアラートークンを受け取ります。これは拒否ではなく、先送りです。
- 列挙型の値を追加で指定する環境変数はありません。 他の実装では、いくつかの設定でドキュメントに記載された値以外も受け付けるか、まったくドキュメント化されていない変数から値を読み取ります。ここではすべての設定がdocs/configuration.mdに記載されており、許可された値以外を指定すると、選択肢を示す起動エラーになります。
開発
cargo test --workspace --all-targets # the whole suite, offline
cargo clippy --workspace --all-targets -- -D warnings
cargo fmt --all --check
テストスイートの実行に tailscale バイナリ、認証情報、ネットワークは必要ありません。tailscale バイナリは偽物で、コントロールプレーンには偽の HTTP サーバーを使います。実際のノードと tailnet を必要とするエンドツーエンドテストは、環境変数が設定されている場合にのみ実行され、設定されていない場合はスキップされたことを報告します。
docs/tools.md は生成されます。ツールを追加または変更した後は、次を実行してください。
UPDATE_DOCS=1 cargo test -p tailscale-mcp --test docs_are_current
アーキテクチャ上の決定はdocs/adr/に、このコードベースで準拠する用語はCONTEXT.mdに、開発中に行ったすべての判断はDECISIONS.mdに、リリース手順はRELEASING.mdに記載されています。
ライセンス
Apache-2.0。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。