mcpField
T
Tailscale MCP Server

Tailscale MCP Server

ローカル
yaw.shクラウド・インフラ351 週間前に更新

Tailscale MCP Server について

Tailscale MCP Serverは、Tailscale v2管理APIをAIアシスタントに公開し、tailnetを対話的に管理します。デバイス、ACL、DNS、キー、ユーザーなどを横断し、読み取りや変更を型付きツールで組み合わせたい管理者向けです。

主な機能

  1. 01Tailscale v2管理APIを幅広くカバー
  2. 02型付きツールと構造化レスポンス
  3. 03ツールグループと読み取り専用モードの設定
  4. 04変更承認を制御する書き込みヒント
  5. 05オプションのローカルCLI診断とAPIリソース

活用シーン

  1. 01最終確認時刻やキー有効期限でデバイスを検索
  2. 02DNS関連の監査ログ変更を確認して要約
  3. 03ACL変更案の作成と検証
  4. 04古い認証キーのローテーション

MCP 対応

サーバーはMCPクライアントに97個の管理APIツール、オプションのローカルCLI診断6個、カタログツール1個、リソース4個を公開します。ツールグループと読み取り専用設定で利用可能な機能を制御できます。

設定

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

mcp.json · 共通設定
{
"mcpServers": {
"yawlabs-tailscale": {
"command": "npx",
"args": [
"-y",
"@yawlabs/tailscale-mcp"
]
}
}
}
起動コマンドnpx -y @yawlabs/tailscale-mcp

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

パッケージ
npm@yawlabs/tailscale-mcp0.23.0

ツール

98

掲載時のツール一覧 · 2 週間前に更新

パラメーター型必須説明
toolNamestringいいえ確認する特定のツール。例:'tailscale_delete_device'。省略すると、すべてのグループを一覧表示します。

詳細

@yawlabs/tailscale-mcp

Add to Yaw MCP

ワンクリックでローカルの Yaw MCP 設定に追加され、すべての Yaw Terminal セッションで利用できるようになります。または、以下の手順で手動インストールしてください。

npm version License: MIT GitHub stars Release

テイルネットについてエージェントに質問し、その回答に基づいて操作させることができます。 Tailscale v2 API 全域にわたる管理 API ツール 97 個、オプションのローカル CLI 診断ツール 6 個、常時有効なカタログツール 1 個、リソース 4 個を備えています。デバイス、ACL、DNS、キーとトラスト認証情報、ユーザー、招待、Webhook、ログストリーミング、ポスチャー、サービス、組織のテイルネットに対応しています。1900 件以上のユニットテストと、オプトイン方式の実テイルネット統合テストスイートを基盤としています。

Yaw Labs が開発・保守しています。

API がすでにあるのに、これを使う意味は?

Tailscale API に curl でアクセスすることもできます。目的は curl を置き換えることではなく、スクリプトを書かずにエージェントが複数エンドポイントのワークフローを 1 回のターンで組み立てられるようにすることです。

  • 「30 日間チェックインしておらず、キーの有効期限が無効になっているデバイスはどれですか?」 — デバイスを一覧表示し、lastSeen でフィルタリングします(オンラインのデバイスには値がありません)。さらに keyExpiryDisabled でフィルタリングし、表を返します。3 つのエンドポイントを 1 つの質問で処理します。
  • 「午前 2 時に誰かが DNS を壊しました。過去 24 時間に誰が何を変更しましたか?」 — 監査ログを取得し、DNS 関連の実行者とエンドポイントでフィルタリングして、各変更の変更前と変更後を読み取り、英語で要約します。
  • 「tag:mobile から tag:dashboard へのアクセスを許可し、tag:db へのアクセスは禁止する ACL 変更を、コメントを維持したまま下書きしてください」 — 現在の HuJSON を読み取り、最小限の差分を提案して API に対して検証し、適用用の差分を返します。
  • 「90 日を超えたすべての認証キーをローテーションし、新しいキーを表示してください」 — 順に処理し、対応するタグを付けて新しいキーを作成し、古いキーを失効させます。
  • 「CI パイプライン用に、devices:core:read と dns:read のスコープを持つ OAuth クライアントを作成してください」 — keyType=client を指定して tailscale_create_key からトラスト認証情報を作成し、認証情報を一度だけ返します(すぐに保存してください)。

各手順は curl でも実行できます。エージェントはそれらを組み立てて実行します。価値があるのはそこです。ツール群はそのために設計されています。エージェントが情報を統合できるよう、すべての読み取りエンドポイントを主要機能として提供し、すべての書き込みエンドポイントに destructiveHint または idempotentHint のタグを付けているため、MCP クライアントで設定どおりに変更操作を制御できます。

CI ジョブで 1 つのエンドポイントだけが必要なら、curl を使ってください。よくある Git からの ACL 適用には、CLI サブコマンドも用意しています。MCP は、対話的で探索的な、「何が必要なのかまだ分からない」作業向けです。

スキルや tailscale CLI ではなく MCP を使う理由

もっともな疑問です。どちらにもそれぞれの用途があります。この MCP が優れている点は次のとおりです。

  • 幅広い管理 API をカバーします。 tailscale CLI の対象は、実行されたノードです。ACL、ユーザー、招待、Webhook、ログストリーミング、ポスチャー連携、認証キー、OAuth クライアント、フェデレーション ID などの管理機能は、v2 HTTP API にあります。結局、curl を実行することになります。
  • 文字列の解析ではなく、型付きのツールインターフェイスを提供します。 すべてのツールに Zod で検証される入力スキーマと構造化されたレスポンスがあります。スキーマの変更で壊れるような、脆弱な tailscale status --json | jq パイプラインは必要ありません。
  • 複数のクライアントで使え、更新はバージョンの引き上げで反映されます。 MCP サーバーは Claude Code、Claude Desktop、Cursor、Windsurf、VS Code など、MCP に対応するあらゆる環境で動作します。Agent Skills 標準に沿って書かれたスキルもエージェント間で共有できますが、内容は自分で保守する文章です。バージョンを引き上げて npx で配布すれば、Tailscale がエンドポイントを追加するたびに、スキルの指示を書き直す必要はありません。
  • 書き込みはデフォルトで安全です。 各ツールは readOnlyHint / destructiveHint / idempotentHint を宣言しているため、クライアントは読み取り時の確認を省略し、変更時には確認を必須にできます。CLI を実行するスキルでは、これを表現できません。
  • 実際のテストがあります。 1900 件以上のユニットテストで、すべてのツールの入力検証、API の形式、エラー処理を確認しています。さらに、形状のずれを検出するための、任意で実行できるライブ tailnet 統合テストスイート(RUN_INTEGRATION_TESTS=1 と tailnet API キーが必要です)もあります。多くのスキルは独自のテスト層を持たない短い Markdown のプロンプトです。ベンダーが出力形式を変更しても、何も検出してくれません。

すでに Tailscale のワークフローの 10% をカバーするスキルがあるなら、それを使い続けてください。MCP は残りの 90% のためのものです。

Tailscale 公式の MCP エンドポイントやスキルについては? 2026-09-19 時点では、それぞれ異なる問題を解決しており、ここでそれらと重複する機能はありません。Tailscale 公式の MCP ツールは、Aperture 内の 2 つのアルファ版組み込みコネクターです。Tailnet の Tailnet_provision_node は、ユーザーが承認したあと、エージェントが新しいノードを 1 台だけ追加できるように、1 回限りの認証キーを返します。Tailscale SSH の TailnetSSH_list_machines と TailnetSSH_run_command は、SSH が有効なマシンを検出し、そのうちの 1 台でコマンドを 1 つ実行します。これらの利用には Aperture が必要です。tailscale/tailscale-skill はアルファ版のナレッジ専用スキルです。エージェントが v2 API に curl する方法を教える参考資料で、独自のサーバーはありません。どちらも管理 API を型付きツールとして公開していないため、このサーバーとの機能の重複はほとんどありません。また、現時点では Aperture を介してこのサーバーを利用することもできません。このサーバーは stdio を使用し、Aperture がプロキシできるのは URL でアクセス可能な Streamable-HTTP または SSE サーバーだけです。どちらの製品もアルファ版なので、この段落の日付は有効期限として扱ってください。

信頼性を示す情報

「積極的に保守しています」と主張しながら、テストが見えない新しいリポジトリなど信頼に値しない、という Reddit の批判はもっともです。実際に確認できる情報は次のとおりです。

  • 1900 件以上のテスト(node --test)で、すべてのツールの入力検証、API の形式、エラー処理を確認しています。npm test を実行すると、ローカルでテストが通ることを確認できます。
  • release.sh によるローカルのリリースフロー:リンティング、テスト、バージョン更新、タグ付け、プッシュ、npm への公開、MCP Registry への公開を、すべてワークステーションから実行します。面倒を見る必要がある CI ワークフローはありません。
  • Dependabot のアラートがこのリポジトリに表示され、放置されずに修正されます。
  • すべてのツールに、OpenAPI 仕様に記載された実際のエンドポイントが指定されています。 ツール一覧にあるものは、現行の v2 API に記載されたパスを呼び出します。プレースホルダーの 404 ツールはありません。ただし、ここで主張する内容の範囲には限界があります。このリポジトリには、記録済みのライブ通信は含まれていません(fixtures/live/ が空なのは意図的です)。また、稼働中の tailnet での観測に基づく主張もありません。

Issue と PR はトリアージしています。問題があれば、github.com/YawLabs/tailscale-mcp/issues に報告してください。

クイックスタート

1. API キーを設定する

Tailscale Admin Console > Settings > Keys から API キーを取得し、MCP クライアントが参照できる場所に設定します。ステップ 2 の .mcp.json の env ブロックはすべてのプラットフォームで同じように機能するため、こちらを優先してください。代わりにシェルプロファイル(~/.bashrc、~/.zshrc、~/.config/fish/config.fish)からエクスポートする場合は、次のようにします。

macOS / Linux / WSL(bash、zsh):

export TAILSCALE_API_KEY="tskey-api-..."

fish:

set -Ux TAILSCALE_API_KEY tskey-api-...

Windows(PowerShell 5.1 および 7)— [Environment]::SetEnvironmentVariable を使うとユーザー用に値が永続化されます。$env: だけの場合はセッション中のみ有効です。

[Environment]::SetEnvironmentVariable('TAILSCALE_API_KEY', 'tskey-api-...', 'User')

2. プロジェクトのルートに .mcp.json を作成する

macOS / Linux / WSL:

{
  "mcpServers": {
    "tailscale": {
      "command": "npx",
      "args": ["-y", "@yawlabs/tailscale-mcp@latest"]
    }
  }
}

Windows:

{
  "mcpServers": {
    "tailscale": {
      "command": "cmd",
      "args": ["/c", "npx", "-y", "@yawlabs/tailscale-mcp@latest"]
    }
  }
}

Windows で追加の手順が必要なのはなぜですか? Windows では npx は .cmd ファイルであり、Node 20+ は .cmd ファイルの直接起動を拒否します。cmd /c でラップするのが標準的な回避策です。

3. 再起動して承認する

Claude Code(または MCP クライアント)を再起動し、プロンプトが表示されたら Tailscale MCP サーバーを承認します。

以上です。エージェントに次のように尋ねてみましょう。

「過去 7 日間に確認されていない Tailscale デバイスを一覧表示して」

「昨日の監査ログにある ACL の変更をすべて要約して」

「tag:ci がポート 5000 のみで tag:registry に到達できる ACL ルールを作成して」

ツールが多すぎますか?使用するツールを絞り込めます。

97 個のツールはかなりの数です。すでに MCP サーバーを 12 個ほど使っていて、クライアントが重く感じられる場合は、このサーバーが公開するツールを減らせます。組み合わせ可能な設定項目は 3 つです。

以下の env ブロックには、説明対象の変数のみを示しています。認証情報はクイックスタートのとおり環境から取得します。多くのシステムではクライアントの JSON 設定は全ユーザーが読み取れ、誤ってコミットしやすいため、認証情報はそちらではなくシェルプロファイルに設定してください。

オプション 1:TAILSCALE_PROFILE(プリセット、最も簡単)
{
  "env": {
    "TAILSCALE_PROFILE": "core"
  }
}
  • minimal(20 個のツール)— status、devices、audit。tailnet を監視し、監査ログを読み取ります。
  • core(52 個のツール)— acl、dns、keys、users を追加します。日常的な管理に必要な機能です。
  • full(97 個のツール、デフォルト)— すべてを使用します。環境変数を省略した場合と同じです。

プロファイル名は大文字と小文字を区別せず、前後の空白も無視されます(Core は core を選択します)。TAILSCALE_TOOLS と TAILSCALE_WRITE_GROUPS のグループ名では、大文字と小文字が区別されます。

オプション 2:TAILSCALE_TOOLS(グループを明示的に指定)
{
  "env": {
    "TAILSCALE_TOOLS": "devices,acl,dns,audit"
  }
}

グループ名をカンマ区切りで指定します。両方が設定されている場合、TAILSCALE_PROFILE を上書きします。プリセットが希望に合わない場合に使用してください。

有効なグループ名:status、devices、acl、dns、keys、users、tailnet、org-tailnets、webhooks、posture、audit、invites、services、log-streaming。local-cli グループも利用できますが、TAILSCALE_LOCAL_CLI=1 が設定されている場合に限ります。ローカル CLI との統合を参照してください。

オプション 3:TAILSCALE_READONLY(変更を伴う操作を除外)
{
  "env": {
    "TAILSCALE_PROFILE": "core",
    "TAILSCALE_READONLY": "1"
  }
}

1 または true に設定すると、readOnlyHint: true のないツールをすべて除外します。TAILSCALE_PROFILE または TAILSCALE_TOOLS と組み合わせると、対象はそれらとの積集合になります。最大限に絞り込む場合に組み合わせてください。

読み込まれた設定の確認

サーバーは起動時に、適用中のフィルターを標準エラー出力に記録します。

@yawlabs/tailscale-mcp v0.22.0 ready (20 tools, profile=minimal, readonly)

TAILSCALE_PROFILE と TAILSCALE_TOOLS の両方が設定されている場合は、TAILSCALE_TOOLS が優先されます。どちらのフィルターが適用されたかが一目で分かるよう、バナーにはプロファイルが上書きされたことが示されます。どちらが適用されたか推測する必要はありません。

@yawlabs/tailscale-mcp v0.22.0 ready (22 tools, profile=core (overridden by TAILSCALE_TOOLS), groups=devices,acl)

「(overridden)」の表示は、実質的なプロファイル(minimal / core)の場合にのみ付きます。profile=full は何も変更しないプリセットなので、TAILSCALE_TOOLS と併せて設定されていても、この表示は付きません。

フィルターを設定していない場合、起動時にプロファイルを案内するヒントが表示されます。

エージェントがどのように知るのか

上記はすべてstderr、つまりMCPクライアントのログです。モデルには見えないため、エージェントから見ると、非表示にされたツールも、そもそも作られていないツールも同じに見えます。そのため、エージェントは制限を報告せず、回避策を探すことになります。

tailscale_tool_groups はこのギャップを埋めます。フィルターの設定にかかわらず常に登録され、次のようにインバンドで質問に答えます。

> "Why can't you delete that device?"

  tailscale_tool_groups({ toolName: "tailscale_delete_device" })

  {
    "tool": "tailscale_delete_device",
    "available": false,
    "group": "devices",
    "kind": "write",
    "reason": "TAILSCALE_WRITE_GROUPS is set to \"dns\", which does not grant writes here",
    "toEnable": "add \"devices\" to TAILSCALE_WRITE_GROUPS (e.g. \"dns,devices\")"
  }

これにより、エージェントが通常は区別できない次の3つのケースを区別できます。

ケースエージェントが行うべきこと
どの設定でも、そのようなツールは存在しない別の方法を探します。どの設定を変更しても使えるようにはなりません
ツールは存在するが、そのグループが読み込まれていないtoEnable を報告し、回避策を探さないでください
ツールは存在し、読み込まれているが、そのグループでは書き込みが非表示になっている同様です。修正するのはあなたであり、回避策ではありません

引数なしで呼び出すと、すべてのグループとその利用可否を一覧表示し、非表示になっているものについては、それを復元するために必要な環境変数の変更を正確に示します。ネットワークにアクセスせず、認証情報も必要ないため、サーバーの設定が誤っている場合でも機能します。

書き込み可能な領域の範囲指定

TAILSCALE_WRITE_GROUPS には、エージェントが書き込みできる領域を指定します。それ以外はすべて読み取り可能なままです。

{
  "env": {
    "TAILSCALE_WRITE_GROUPS": "devices,keys"
  }
}

この設定では、41個の読み取りツールすべてに加え、devices と keys の18個の書き込みツールを利用でき、残りの38個の書き込みツールは非表示になります。ACL、DNS、ユーザー、tailnet、webhook、posture、サービス、招待、org-tailnet、ログストリーミングに関する書き込みツールは登録されません。未設定の場合、書き込みは制限されません。これが配布時のデフォルトです。

まず、これをお読みください。この設定でフィルターされるのはツール一覧であり、API トークンではありません。 どの設定でも、サーバーは tailnet 全体に対する完全な権限を持つ認証情報を1つ保持します。シェルも使えるエージェントなら、同じトークンを使って curl api.tailscale.com を実行し、この設定で非表示にされた操作もすべて実行できます。実際に必要な領域に合わせて、Tailscale OAuth クライアント自体のスコープを制限してください(ツールグループごとのスコープ)。その制限はこのプロセスの外でも有効ですが、この設定は有効ではありません。TAILSCALE_WRITE_GROUPS は、認証情報のスコープ制限を手軽に補完するものであり、置き換えるものではありません。

権限付与に実際に含まれるもの

グループ名は TAILSCALE_TOOLS と同じです。グループごとの書き込みツールは次のとおりです。

グループ書き込みグループ書き込み
devices13webhooks5
invites7posture3
dns6services3
keys5tailnet3
users5log-streaming3
org-tailnets2acl1

status、audit、およびオプトインの local-cli グループには書き込みツールが一切含まれないため、これらを許可しても何も変わりません。

devices は最も広範な権限であり、設定される可能性が最も高いグループです。 compose ファイルで write=devices と記述すると「デバイス管理」のように見えますが、rename_device に加えて、delete_device、set_devices_authorized、expire_device、deauthorize_device、set_device_routes、set_device_tags、update_device_key も許可されます。これ以上細かく設定する方法はありません。実際に「安全なサブセット」と言えるのは rename_device だけであり、1つのツールしか役に立たない設定項目に意味はありません。

3つの権限付与は tailnet 管理者と同等です

keys、users、acl はブロックされていません。CI でのキーのローテーションには keys が正当に必要となるためです。ただし、次の点を理解したうえで許可してください。

  • keys — tailscale_create_key は、呼び出し元が指定した任意のスコープ(policy_file や all を含む)を持つ OAuth クライアントを発行します。その認証情報はエージェントのセッション終了後も有効であり、ここでの設定やその他の設定の影響を受けません。
  • users — tailscale_update_user_role は owner を受け付けます。
  • acl — tailscale_update_acl は tailnet 内のすべてのプリンシパルに対するポリシーを書き換えます。

これらのいずれかを許可すると、サーバーは起動時にこの内容を出力します。

制限される範囲と、制限されない範囲

エージェントが書き込みできる場所を制限します。許可された範囲内での重大度は制限しません。許可されたグループ内の書き込みは、許可の方向に関するものも含め、すべて自動で実行されます。人間がキーボードを操作している場合は、TAILSCALE_REQUIRE_APPROVAL=1 と併用してください。ただし、無人のエージェントでは、この組み合わせに効果がない点にご注意ください。プロンプトを表示しないクライアントは、プロンプトを表示する代わりに、これらの呼び出しを拒否します。

優先順位と、設定を間違えた場合の動作
状況結果
未設定、空、空白のみ、またはカンマのみ書き込みゲートはありません。値なしで -e VAR を指定しても、すべての書き込みが暗黙に取り消されることはありません。
TAILSCALE_READONLY=1 も設定されている読み取り専用が優先されます。バナーには readonly (TAILSCALE_WRITE_GROUPS ignored) と表示されます。
名前のスペルミス(devises)何も許可せず、スペルミスの名前を示します。TAILSCALE_TOOLS とは異なり、フォールバックはありません。書き込み許可のスペルミスでフォールバックが発生すると、書き込みを制限しようとしている時点で、56 個すべての書き込み権限を渡すことになるためです。
一部にスペルミスがある(devices,dnss)正しい名前のグループを許可し、残りについて警告します。
許可されたグループが TAILSCALE_TOOLS / TAILSCALE_PROFILE によって読み込まれていない名前のスペルミスではないため、別途警告します。この場合、許可は効果を持ちません。
none、all、off、*予約語ではありません。不明なグループ名として扱われるため、何も許可されません。書き込みを一切許可しない場合は TAILSCALE_READONLY=1 を使用し、すべての書き込みを許可する場合は未設定のままにします。サーバーが正しい綴りを案内します。

名前の大文字と小文字は区別され、TAILSCALE_TOOLS と同じです。

アップグレード時の保証: このパッケージをアップグレードしても、エージェントが書き込みできる範囲が広がることはありません。人間が名前を入力するまで、新しいグループは誰にも許可されません。ただし、すでに許可されている範囲内にツールが追加されることはあります。ピン留めされたテストにより、これは気付かれない変更ではなく、差分でレビューされる変更になります。

起動時のバナーに、適用された設定が表示されます。

@yawlabs/tailscale-mcp v0.22.0 ready (59 tools, write=devices,keys)

取り消し不能なツールで承認を必須にする

readOnlyHint / destructiveHint は参考情報です。MCP の仕様では、クライアントはアノテーションを信頼できないものとして扱う必要があると定められており、ほとんどのクライアントはこれらを承認の条件にしていません。TAILSCALE_REQUIRE_APPROVAL=1 を設定すると、対応クライアントが適用する、より強いシグナルが追加されます。

{
  "env": {
    "TAILSCALE_REQUIRE_APPROVAL": "1"
  }
}

その後、9 つのツールに _meta["anthropic/requiresUserInteraction"] が付与されます。これにより、許可ルールがあれば通常は自動承認される呼び出しでも、確認プロンプトが必ず表示されます。

ツール対象となる理由
tailscale_update_acltailnet 内のすべてのデバイスを締め出す可能性があります。保存していない限り、以前の HuJSON(コメントを含む)は失われます。
tailscale_delete_deviceデバイスを再登録する必要があります。
tailscale_delete_user削除を取り消せません。
tailscale_delete_tailnettailnet 全体を破壊します。
tailscale_delete_keyシークレットは二度と返されません。
tailscale_delete_oauth_app同上です。
tailscale_delete_webhook同上です。
tailscale_delete_log_stream_config同上です。
tailscale_delete_posture_integration同上です。

基準は**「このサーバーが、手元に残っている情報を使って取り消せないこと」**です。これは destructiveHint: true が付いた 23 個のツールよりも範囲を絞っています。tailscale_suspend_user は意図的に対象外です。tailscale_restore_user で元に戻せるためです。同様に、tailscale_authorize_device で元に戻せる tailscale_deauthorize_device も対象外です。また、すべて置き換えるセッターも対象外です。これらには書き込む前に読み取れる get_* の対になるツールがあります。

意図的にオプトイン方式にしています。有効にする前にお読みください。 プロンプトを表示しないクライアントモード(無人エージェントや CI の実行など)では、このフラグを設定すると、対象の呼び出しは実行されず拒否されます。人間がキーボードを操作している場合には適切なデフォルト設定ですが、誰も操作していない場合には適切ではありません。そのため、設定しない限りオフのままです。

アノテーションに対応したクライアントが必要です。Claude Code は v2.1.199 で対応しました。認識しないクライアントはこのアノテーションを無視するため、変数を設定しても、設定しない場合より悪い結果にはなりません。

別途、常に有効な機能として、リクエストではなく tailnet の規模に応じてレスポンスサイズが大きくなるツール(tailscale_list_devices、tailscale_list_users、tailscale_get_acl、tailscale_diff_acl_access、tailscale_get_audit_log、tailscale_get_network_flow_logs、tailscale_local_status)では、_meta["anthropic/maxResultSizeChars"] を宣言します。これにより、大きくても正当な結果が、エージェントがタスクの途中で読み直さなければならないファイル参照に切り詰められず、インラインのままになります。最後のツールだけはオプトインが必要です。TAILSCALE_LOCAL_CLI=1 によって登録された場合は上限を宣言し、それ以外の場合は完全に登録されません。

mcp.hosting / mcph での使用

このサーバーを mcp.hosting(@yawlabs/mcph ローカルエージェント経由)で実行する場合、2 つのフィルタリング層は問題なく連携します。

  1. サーバー側 — TAILSCALE_PROFILE / TAILSCALE_TOOLS / TAILSCALE_READONLY によって、mcph が認識する前にツールの範囲を絞り込みます。読み込まれていないツールは、そもそも登録されません。
  2. クライアント側 — mcph の mcp_connect_activate({ tools: [...] }) によって、さらに tools/list に表示するツールを絞り込みます。そのリストにないツールも mcp_connect_dispatch から引き続き利用できるため、機能が失われることはありません。

mcph ユーザーに推奨するパターン:mcp.hosting のサーバー設定で TAILSCALE_PROFILE=core(または、さらに範囲を絞ったプロファイル)を設定し、その上で会話ごとの有効化を mcph に任せます。サーバーはデフォルトで軽量な状態を保ち、臨時のニーズには mcp_connect_dispatch で幅広いツールを利用できます。

認証

API キー(最も簡単): シェルまたは MCP 設定で TAILSCALE_API_KEY を設定します。

OAuth(スコープを指定したアクセス): きめ細かな権限を設定するには、代わりに TAILSCALE_OAUTH_CLIENT_ID と TAILSCALE_OAUTH_CLIENT_SECRET を設定します。Tailscale 管理コンソール > Settings > Trust credentials で OAuth クライアントを作成し、読み込むツールグループに応じて以下に記載されているスコープを設定します。

サーバーは最初に API キーを確認し、設定されていない場合は OAuth にフォールバックします。どちらも設定されていない場合、ツールは設定すべき項目を明確に伝えるエラーを返します。サーバーは起動したままなので、MCP クライアントが再起動を繰り返すことはありません。

Tailnet: 通常のセットアップで必要となる設定として、認証情報に紐づく Tailnet(-)が自動的に使われます。明示的に指定する場合は、管理コンソールの Settings > General に表示されている Tailnet ID を TAILSCALE_TAILNET に設定します。形式は T1234CNTRL のような文字列です。2025 年 10 月より前に作成された Tailnet では従来の組織名も引き続き使えますが、それ以降に作成された Tailnet には使用できる組織名がありません。OpenAPI 仕様に従い、いずれの場合も Tailnet ID が推奨される識別子です。

TAILSCALE_OAUTH_TAILNET — API 専用 Tailnet(tailscale_create_org_tailnet で作成されたもの)を対象にします。このような Tailnet には通常のクライアント認証情報のやり取りでは接続できません。作成元の Tailnet に属する OAuth クライアント(all スコープ)で認証し、トークンリクエストに対象の Tailnet を指定します。新しい Tailnet の ID をここに設定します。この設定は TAILSCALE_TAILNET とは意図的に分離されており、ほかのすべてのユーザーのデフォルトのトークン取得処理は変わりません。この設定を使う場合は、TAILSCALE_TAILNET を未設定(または -)のままにして、ツールリクエストがトークンに従うようにしてください。2 つの設定で異なる Tailnet を指定すると、Tailnet のスコープが適用されるすべてのツールが 403 を返し、サーバーは起動時に警告します。

ツールグループごとの OAuth スコープ

各 TAILSCALE_TOOLS グループで OAuth クライアントに必要なスコープです。読み込むグループには Read 列のスコープを付与し、変更を許可するグループには Write 列のスコープも追加します。Notes 列には、それ以外にグループが必要とする権限が記載されています。all:read(すべての読み取りスコープ)と all(すべてのスコープ)が、最も広範な権限です。

グループ読み取り書き込み備考
statusdevices:core:read、feature_settings:readなしデバイス一覧とテイルネット設定を読み取り、どちらか一方が拒否された場合でも、もう一方の結果を返します。
devicesdevices:core:read、devices:routes:read、devices:posture_attributes:readdevices:core、devices:routes、devices:posture_attributesルートツールでは devices:routes の組み合わせを使用し、ポスチャー属性ツールでは devices:posture_attributes の組み合わせを使用します。それ以外は devices:core を使用します。devices:core を持つ認証情報は、少なくとも1つのタグを付けて作成する必要があります。
aclpolicy_file:read、devices:core:read、devices:posture_attributes:readpolicy_file、devices:posture_attributesTailscale では、policy_file:read および policy_file に加えてデバイススコープが必要です。principals を省略し、tailscale_diff_acl_access がユーザー一覧を取得する場合は、users:read も必要です。
dnsdns:readdns未検証。 OpenAPI 仕様では DNS 操作にスコープが指定されておらず、参照元の信頼認証情報のドキュメントにも、tailscale_get_dns_configuration と tailscale_set_dns_configuration の背後にあるエンドポイント /dns/configuration は記載されていません。
keysauth_keys:read、oauth_keys:read、federated_keys:read、api_access_tokens:read、oauth_apps:readauth_keys、oauth_keys、federated_keys、api_access_tokens、oauth_appsキースコープはキーの種類ごとに異なります。認証キーには auth_keys、OAuth クライアントには oauth_keys、フェデレーション ID には federated_keys、個人用 API アクセストークンには api_access_tokens(読み取りと削除のみ)を使用します。管理する種類のスコープだけを付与してください。テイルネット内のすべてのアクセストークンを一覧表示できるのは、all:read と all のみです。OAuth アプリツールでは oauth_apps を使用します。また、tailscale_create_oauth_app で allowedNodeAttributes を送信する場合は、devices:posture_attributes も必要です。
usersusers:readusers
tailnetfeature_settings:read、account_settings:readfeature_settings、account_settings設定はフィールドごとに分かれています。ネットワークフローログには logs:network:read / logs:network、HTTPS 証明書には networking_settings:read / networking_settings、外部管理 ACL の2つのフィールドには policy_file:read / policy_file が必要です。それ以外は feature_settings で管理します。連絡先ツールでは account_settings を使用します。
org-tailnetstailnets:readtailnetstailscale_delete_tailnet には all が必要です(上記の TAILSCALE_OAUTH_TAILNET を参照)。
webhookswebhooks:readwebhooks
posturefeature_settings:readfeature_settings同じスコープでほとんどのテイルネット設定も管理されるため、ポスチャー統合を管理できるクライアントは、それらの設定も変更できます。
auditlogs:configuration:read、logs:network:readなしtailscale_get_audit_log では前者を、tailscale_get_network_flow_logs では後者を使用します。
invitesdevice_invites:readdevice_invites(削除のみ)デバイス招待の作成、再送、承諾(tailscale_create_device_invite、tailscale_resend_device_invite、tailscale_accept_device_invite)には、OAuth クライアントのトークンを使用できません。また、ユーザー招待の作成、削除、再送(tailscale_create_user_invite、tailscale_delete_user_invite、tailscale_resend_user_invite)は、ユーザー所有のキーでのみ許可されます。これらには TAILSCALE_API_KEY を使用してください。ユーザー招待の読み取りに必要なスコープは仕様に記載されていません。
servicesservices:readservicestailscale_list_service_hosts、tailscale_get_service_device_approval、tailscale_set_service_device_approval には services と devices:core の両方が必要なため、このうち読み取りを行う2つは読み取り専用クライアントでは動作しません。
log-streaminglog_streaming:readlog_streamingプライベートエンドポイントへのストリーミングには device_invites と policy_file も必要です。tailscale_create_aws_external_id と tailscale_validate_aws_trust_policy の両方に log_streaming が必要ですが、後者は読み取り操作です。
local-cliなしなしローカルの tailscale バイナリを実行し、管理 API は呼び出しません。
スコープは、2026-09-19 時点の Tailscale のOpenAPI 仕様から取得しています。仕様に記載のない DNS の行と、acl 行のデバイススコープは、トラスト認証情報のドキュメントに基づいています。すべてドキュメントから読み取ったものであり、tailnet に対して実際に確認したものではありません。

信頼性とデバッグ

429 およびゲートウェイエラーの再試行(組み込み)。 HTTP 429、502、503、504 は、べき等メソッド(GET、PUT、DELETE)で最大 3 回再試行され、Retry-After ヘッダー(秒を表す整数形式と HTTP-date 形式の両方)が尊重されます。このヘッダーがない場合は、ジッターを加えた指数バックオフにフォールバックし、各待ち時間は最大 30 秒です。環境変数の設定は不要です。デフォルトで有効になっています。「90 日を過ぎたキーをすべてローテーションする」といったワークフローが、Tailscale のテナント単位のレート制限によって処理の途中で失敗することはなくなります。また、ゲートウェイの一時的な障害によってツール呼び出し全体が失敗することもありません。OpenAPI 仕様では、すべてのデバイス操作とサービス操作について、504 は「request took too long to process, please try again later」というメッセージとともに記載され、ログの読み取りでは 502 が記載されています。HTTP 500 は再試行されません。これは、前段の何かがタイムアウトしたのではなく、サーバーがリクエストを処理できなかったことを意味するためです。POST と PATCH は、どのステータスの場合も再試行されません。ゲートウェイエラー後に再試行した DELETE が 404 になった場合、タイムアウトした試行ですでにリソースが削除されていた可能性があるため、その旨がエラーに示されます。

TAILSCALE_DEBUG=1 — すべての HTTP メソッド、URL、ステータス、経過時間を stderr に記録します。認証ヘッダーは決して記録されません。ツールが予期しないエラーを返し、実際に送信されたリクエストを確認したい場合に使用してください。例:

[tailscale-mcp] GET https://api.tailscale.com/api/v2/tailnet/-/devices
[tailscale-mcp]   <- 200 (148ms)

TAILSCALE_MAX_CONCURRENT=N — 実行中の API リクエスト数を N 件までに制限します。デフォルトは無制限です(有効にしないユーザーの動作は変わりません)。再試行で吸収できる範囲よりも厳しい制限がある tailnet に対して、エージェントが多数のリクエストを一斉に送る場合に便利です。

TAILSCALE_REQUEST_BUDGET_MS=N — 再試行とその待ち時間を含む、リクエストごとの合計実時間予算です。デフォルトは 90000(90 秒)です。次の再試行にかかると予測される時間が予算を超える場合、処理を保留せず、直ちにエラーを返します。ゲートウェイの 5xx の場合、この予測には直前に失敗した試行の所要時間も含まれます。504 が返るのは、ゲートウェイがすでに待機した後であるため、再試行にもおそらく同じだけの時間がかかります。そこで予算の残りを使い切ると、クライアントには 504 ではなく応答が返らなくなります。ゲートウェイの 5xx の後に再試行する呼び出しは、その時点からこの予算の半分までに制限されます。デフォルトでは 45 秒で、一般的な MCP クライアントのタイムアウト下限である 60 秒を下回ります。これらの試行ではバックオフではなくゲートウェイの待ち時間が発生するため、連続すると、429 の再試行では起こらないものの、クライアントのタイムアウトを超える可能性があります。この値を大きくすると、上限もそれに応じて上がります。429 の再試行では、いずれの場合も予算全体が使われます。MCP クライアント側のタイムアウトがより短い場合は、この値を小さく調整してください。べき等でないメソッド(POST、PATCH)は再試行されず、予算に関係なく直ちに返されます。

TAILSCALE_RETRY_BASE_DELAY_MS=N — 再試行間の指数バックオフの基本待ち時間です。試行 N では base * 2^N(最大 30 秒、ジッターを加算)待機します。デフォルトは 1000(1 秒)で、再試行をすべて使い切る場合の待ち時間は、およそ 1 秒 + 2 秒 + 4 秒になります。TAILSCALE_REQUEST_BUDGET_MS と併用します。予算だけを下げても再試行回数は増えず、デフォルトのバックオフで予算を早く使い切って、より早く諦めることになります。「積極的に再試行し、早く失敗させたい」場合は、両方の値を小さくしてください。サーバーから送信された Retry-After ヘッダーは、常にこの値より優先されます。 TAILSCALE_EXTRA_WEBHOOK_EVENTS=eventA,eventB — このパッケージの最新リリース後にTailscaleが提供するWebhookイベントタイプを、オプトインで追加するための回避策です。Webhookツールは、入力ミスや古いイベント名をすぐに明確なエラーで検出できるよう、subscriptionsを厳密な静的カタログと照合して検証します。カタログに反映される前の新しいイベントが必要な場合は、ここにカンマ区切りで列挙すると、スキーマで受け付けられるようになります。2つのカテゴリ購読(categoryTailnetManagement、categoryDeviceMisconfigurations)はカタログに含まれているため、ここに追加する必要はありません。静的リストに反映されるよう、issueを作成してください。

TAILSCALE_EXTRA_POSTURE_PROVIDERS=providerA,providerB — デバイスポスチャ統合プロバイダー向けの、同様の回避策です。tailscale_create_posture_integrationは、providerを静的リスト(falcon、fleet、huntress、intune、jamfpro、kandji、kolide、sentinelone)と照合して検証します。このパッケージに反映される前にTailscaleが新しいプロバイダーを追加した場合、リリースを待たずにここに列挙してください。このフィールドは以前、選択肢が固定された列挙型だったため、新たにサポートされたプロバイダーは単に検証されないのではなく、作成できない状態になっていました。

より分かりやすいエラーメッセージ。 {"message":"..."}や{"error":"..."}形式のJSONエラー本文は、表示前に中身を取り出すため、生のJSONではなく説明文を確認できます。本文にdata配列も含まれている場合(ACLエンドポイントがポリシーテストの失敗を報告する際に使用します)、メッセージの下に表示されます。そのため、ポリシーが拒否されたときに、単にtest(s) failedと表示されるのではなく、どのユーザーのどのアサーションが失敗したかが分かります。401エラーでは引き続き、該当する場合はWindowsの環境変数に関するヒントも含めた、複数行の完全な認証エラーフォーマッターが使われます。

ローカル CLI 連携(オプトイン)

ほとんどのツールは Tailscale v2 管理 API と通信し、tailnet について説明します。場合によっては、このマシンから見た状態を確認したいことがあります。実際に接続されているか、どの DERP リージョンに接続しているか、my-laptop がここからどれくらい離れているか、といった情報です。これらの情報は管理 API ではなく、ローカルの tailscale バイナリから取得します。

TAILSCALE_LOCAL_CLI=1 を設定すると(シェルまたは .mcp.json の env ブロック内)、読み取り専用の診断ツールが 6 つ追加されます。

ツール対応する CLI コマンド用途
tailscale_local_statustailscale status --json [--peers=false] [--active]このマシンの接続状態と認識可能なピア。peers: false と activeOnly: true でピアマップを絞り込めます
tailscale_pingtailscale ping <target>別の tailnet ノードへのレイテンシー確認(直接接続か DERP リレー経由か)
tailscale_netchecktailscale netcheck --format=jsonNAT タイプ、DERP レイテンシーマップ、IPv4/IPv6 のサポート状況
tailscale_local_versiontailscale version実際に実行中のクライアントのバージョン
tailscale_local_whoamitailscale whoamiこのマシンがどのユーザーとデバイスとして認証されているか(tailscale >= 1.102.1 が必要)
tailscale_local_service_listtailscale service listこのノードから見える Tailscale Services(tailscale >= 1.102.1 が必要)

要件:tailscale バイナリを見つけられる必要があります。まず PATH を検索し、次に以下のデフォルトのインストール先を検索します。TAILSCALE_BINARY を設定すると、任意の絶対パスで両方を上書きできます。

プラットフォームPATH 以外の検索先備考
macOS/Applications/Tailscale.app/Contents/MacOS/Tailscale、/opt/homebrew/bin/tailscale、/usr/local/bin/tailscale標準のインストールでは CLI はアプリバンドル内に置かれ、PATH には追加されません。Dock または Spotlight から起動した MCP クライアントも、シェルのものではなく最小限の PATH を引き継ぐため、ターミナルでは tailscale が動作していても、単純な検索では見つからないことがあります。
Linux/usr/bin/tailscale、/snap/bin/tailscalesnap のラッパーは、最小限の PATH には含まれないことがあります。
Windows—インストーラーによって tailscale.exe がマシンの PATH に追加されます。TAILSCALE_BINARY を設定する場合は、Git Bash のパス(/c/...)ではなく Windows のパス(C:/Program Files/Tailscale/tailscale.exe)を使用してください。Git Bash の表記は MSYS プロンプトで入力すると変換されますが、JSON 設定や .env から読み込まれる場合は変換されません。
WSL/usr/bin/tailscale、/snap/bin/tailscaleこれらのツールが報告するのは Linux ノードであり、ディストリビューション内に Tailscale をインストールし、そこで tailscaled を実行する必要があります。 WSL の新規インストールでは、利用可能な tailscale は Windows 版のみです。Linux プロセスから tailscale.exe を実行することはできません。また、TAILSCALE_BINARY を /mnt/c/.../tailscale.exe に設定すると、ここにあるすべてのツールが「このマシン」の情報を示す一方で、Windows ホストの Self、ピア、whoami の ID、netcheck の結果が報告されます。tailscale.exe が自動的に選択されることは意図的にありません。

これらのツールを実行するために MCP サーバーを root で実行する必要はありません。どれも診断用であり、状態を変更する操作ではないためです。昇格が必要な操作(tailscale up、set --advertise-routes、lock sign)は意図的に公開していません。

オプトインを有効にすると、起動バナーにも反映されます。@yawlabs/tailscale-mcp v0.22.0 ready (103 tools, local-cli=on) — 6 つのローカル CLI ツールが、デフォルトの 97 個に追加されます。

リソース(4)

MCP リソースでは、クライアントがツールを呼び出さずに参照できる読み取り専用データを公開します。

リソースURI説明
Tailnet の状態tailscale://tailnet/statusデバイス数と tailnet の設定
デバイスtailscale://tailnet/devices状態と IP アドレスを含むすべてのデバイス
ACL ポリシーtailscale://tailnet/aclACL ポリシー全体(HuJSON を保持)
DNS 設定tailscale://tailnet/dnsネームサーバー、検索パス、スプリット DNS、MagicDNS

ツール(97 + オプトイン 6)

ステータス(ツール 1 個) | ツール | 説明 | |------|-------------| | `tailscale_status` | API 接続を確認し、tailnet の情報とデバイス数を表示します |
デバイス(17 ツール)
ツール説明
tailscale_list_devicesデバイスの一覧を取得します(デフォルトのフィールドのみ。fields: "all" を指定すると、ルート、接続状況、SSH、ディストリビューション、ポスチャ ID が追加されます)。デバイスがオンラインの場合、lastSeen は表示されません
tailscale_get_deviceデバイスを 1 台取得します(完全なレコードを取得するには fields: "all" を指定します)
tailscale_authorize_device承認待ちのデバイスを承認します
tailscale_deauthorize_deviceデバイスの承認を取り消します
tailscale_set_devices_authorized1 回の呼び出しで複数のデバイスを承認/承認解除します(並列処理、ID ごとのエラー報告)
tailscale_delete_devicetailnet からデバイスを削除します
tailscale_rename_deviceデバイスの名前を変更します(FQDN またはベース名を指定します。空文字列を指定すると OS のホスト名に戻ります)
tailscale_expire_deviceデバイスのキーを期限切れにし、再認証を強制します
tailscale_get_device_routesアドバタイズ済みおよび有効なサブネットルートを取得します
tailscale_set_device_routesサブネットルートを有効または無効にします
tailscale_get_device_posture_attributesデバイスのすべてのポスチャ属性を取得します
tailscale_set_device_posture_attributeカスタムポスチャ属性を設定します(有効期限と監査ログのコメントは任意です)
tailscale_delete_device_posture_attributeカスタムポスチャ属性を削除します
tailscale_set_device_tagsデバイスに ACL タグを設定します
tailscale_set_device_ipデバイスの Tailscale IPv4 アドレスを設定します
tailscale_update_device_keyデバイスのキー設定を更新します(例:キーの有効期限を無効にします)
tailscale_batch_update_posture_attributes複数のデバイスのカスタムポスチャ属性を一括更新します
ACL/ポリシー(5 ツール)— HuJSON の書式を保持し、ETag による安全性を確保
ツール説明
tailscale_get_acl書式を保持した ACL ポリシー(HuJSON)と ETag を取得します
tailscale_update_aclACL ポリシーを更新します(同時編集を安全に行うには ETag が必要です。初回の書き込みには ts-default を指定します)
tailscale_validate_aclポリシーを適用せずに検証します
tailscale_preview_aclユーザーまたは IP に適用されるルールをプレビューします
tailscale_diff_acl_access提案されたポリシーと現在のポリシーを比較し、アクセス権を得るユーザーと失うユーザーを確認します
DNS(11 ツール)
ツール説明
tailscale_get_nameserversDNS ネームサーバーを取得します
tailscale_set_nameserversDNS ネームサーバーを設定します
tailscale_get_search_pathsDNS 検索パスを取得します
tailscale_set_search_pathsDNS 検索パスを設定します
tailscale_get_split_dnsスプリット DNS 設定を取得します
tailscale_set_split_dnsスプリット DNS 設定を設定します(全置換。null を指定するとドメインをクリアします)
tailscale_update_split_dnsスプリット DNS 設定を更新します(部分マージ。null を指定するとドメインを削除します)
tailscale_get_dns_preferencesDNS 設定(MagicDNS)を取得します
tailscale_set_dns_preferencesDNS 設定(MagicDNS)を設定します
tailscale_get_dns_configuration統合 DNS 設定(すべての設定を 1 回の呼び出しで取得)を取得します
tailscale_set_dns_configuration統合 DNS 設定(すべての設定を 1 回の呼び出しで取得)を設定します
キー/信頼認証情報(9 ツール)— 認証キー、OAuth クライアント、フェデレーション ID、OAuth アプリに対応 | ツール | 説明 | |------|-------------| | `tailscale_list_keys` | キーを一覧表示します(デフォルトのセットは認証情報によって異なります。テールネット全体を対象にするには `all=true` を指定します:認証キー、API アクセストークン、OAuth クライアント、フェデレーション ID) | | `tailscale_get_key` | あらゆる種類のキーの詳細を取得します | | `tailscale_create_key` | 認証キー、OAuth クライアント(`keyType=client`)、またはフェデレーション ID(`keyType=federated`)を作成します | | `tailscale_delete_key` | このサーバーが実行に使用している API アクセストークンを含め、あらゆる種類のキーを削除します | | `tailscale_update_key` | キーの説明、スコープ、タグ、またはフェデレーションのクレーム設定を更新します | | `tailscale_create_oauth_app` | サードパーティによるデバイスのプロビジョニング用 OAuth アプリを作成します(Tailscale アルファ版) | | `tailscale_get_oauth_app` | OAuth アプリの名前、リダイレクト URI、スコープを取得します | | `tailscale_list_oauth_apps` | テールネットに登録されているすべての OAuth アプリを一覧表示します | | `tailscale_delete_oauth_app` | OAuth アプリを削除し、デバイスをプロビジョニングする権限を取り消します |
ユーザー(7 個のツール)
ツール説明
tailscale_list_usersテールネット内のすべてのユーザーを一覧表示します
tailscale_get_user特定のユーザーの詳細を取得します
tailscale_approve_user保留中のユーザーを承認します
tailscale_suspend_userユーザーを一時停止し、アクセスを取り消します
tailscale_restore_user一時停止中のユーザーを復元します
tailscale_update_user_roleユーザーのロール(オーナー、管理者、メンバーなど)を更新します
tailscale_delete_userユーザーとそのすべてのデバイスを削除します
テールネット設定(5 個のツール)
ツール説明
tailscale_get_tailnet_settingsテールネットの設定(HTTPS、デバイス承認、キーの有効期限など)を取得します
tailscale_update_tailnet_settingsテールネットの設定(HTTPS 証明書、承認、自動更新、キーの有効期限、ポスチャ、リージョナルルーティング、ネットワークフローロギング、外部 ACL 管理)を更新します
tailscale_get_contactsテールネットの連絡先を取得します
tailscale_set_contactsテールネットの連絡先を設定します
tailscale_resend_contact_verification連絡先の確認メールを再送信します
Webhook(7 個のツール)
ツール説明
tailscale_list_webhooksWebhook を一覧表示します
tailscale_get_webhook特定の Webhook を取得します
tailscale_create_webhookWebhook を作成します(生の JSON、または providerType を使って Slack/Mattermost/Google Chat/Discord 向けにフォーマット)
tailscale_update_webhookWebhook のエンドポイント URL および/またはサブスクリプションを更新します
tailscale_delete_webhookWebhook を削除します
tailscale_rotate_webhook_secretWebhook のシークレットをローテーションします
tailscale_test_webhookWebhook の配信を確認するテストイベントを送信します
ポスチャ連携(5 個のツール)
ツール説明
tailscale_list_posture_integrationsポスチャ連携を一覧表示します
tailscale_get_posture_integrationポスチャ連携を取得します
tailscale_create_posture_integrationポスチャ連携を作成します
tailscale_update_posture_integrationポスチャ連携を更新します
tailscale_delete_posture_integrationポスチャ連携を削除します
Tailscale サービス(7 個のツール)
ツール説明
tailscale_list_servicesテールネット内のすべての Tailscale サービスを一覧表示します
tailscale_get_service特定のサービスの詳細を取得します
tailscale_update_serviceサービスの設定を更新します
tailscale_delete_serviceサービスを削除します
tailscale_list_service_hostsサービスをホストしているデバイスを一覧表示します
tailscale_get_service_device_approvalサービスをホストするデバイスの承認状況を取得します
tailscale_set_service_device_approvalサービスをホストするデバイスを承認または拒否します
組織の Tailnet(3 ツール)— API 専用の Tailnet。OAuth 認証が必要です

Tailnet 全体をプログラムで作成・削除できます。エージェントごとのサンドボックス、テナントごとの分離、一時的な CI 環境などに便利です。組織では、デフォルトで元の Tailnet を含めて 10 個の Tailnet を利用できます。ここにある他のすべてのグループとは異なり、これらのエンドポイントは /organizations 配下にあり、OAuth クライアント(作成には tailnets スコープ、その後 Tailnet にアクセスするには all スコープ)のみで認証します。また、作成された Tailnet は管理コンソールでは管理されません。いずれか 1 つを対象に操作するには、TAILSCALE_OAUTH_TAILNET を設定してください。

ツール説明
tailscale_list_org_tailnets組織の Tailnet を一覧表示します(limit / cursor によるページネーションに対応)
tailscale_create_org_tailnetAPI 専用の Tailnet を作成します。OAuth クライアントシークレットは一度だけ返されます
tailscale_delete_tailnetTailnet を削除します(設定済みのもの、または明示的に指定した tailnet)。元に戻せません。confirmTailnet が一致する必要があります
ログストリーミング(7 ツール)
ツール説明
tailscale_list_log_stream_configsログストリーミング設定(監査ログとネットワークログの両方)を一覧表示します
tailscale_get_log_stream_configログの種類に応じたログストリーミング設定を取得します
tailscale_set_log_stream_configログの送信先を設定します(Axiom、Datadog、Splunk など)
tailscale_delete_log_stream_configログストリーミング設定を削除します
tailscale_get_log_stream_statusログストリーミングが正常に配信されているか確認します
tailscale_create_aws_external_idS3 のロールベースのログストリーミング用に AWS 外部 ID を作成/取得します(reusable のデフォルトは true です。リンクされるまでは同じ ID が返されます)
tailscale_validate_aws_trust_policyS3 ログストリーミング用の AWS IAM ロールの信頼ポリシーを検証します
デバイス招待(6 ツール)
ツール説明
tailscale_list_device_invites特定のデバイスへの招待を一覧表示します
tailscale_create_device_inviteデバイスへの招待を作成します
tailscale_get_device_inviteデバイスへの招待を取得します
tailscale_delete_device_inviteデバイスへの招待を削除します
tailscale_accept_device_inviteデバイス共有の招待を承諾します
tailscale_resend_device_inviteデバイスへの招待メールを再送信します
ユーザー招待(5 ツール)
ツール説明
tailscale_list_user_invites未承諾(まだ承諾されていない)のユーザー招待を一覧表示します
tailscale_create_user_inviteユーザー招待を作成します
tailscale_get_user_inviteユーザー招待を取得します
tailscale_delete_user_inviteユーザー招待を削除します
tailscale_resend_user_inviteユーザー招待メールを再送信します
ログ記録(2 ツール)
ツール説明
tailscale_get_audit_log設定監査ログ(誰が、いつ、何を変更したか)を取得します。サーバー側で実行者/対象/イベントを指定する任意のフィルターに対応します
tailscale_get_network_flow_logsデバイス間のネットワークトラフィックのフローログを取得します
ローカル CLI(6 ツール、オプトイン)— ローカル CLI 統合を参照してください | ツール | 説明 | |------|-------------| | `tailscale_local_status` | このマシンから見た tailnet の状態(自身の接続状態、ピア、DERP リージョン)。`peers: false` または `activeOnly: true` で絞り込めます | | `tailscale_ping` | このマシンから別の tailnet ノードへのレイテンシー測定 | | `tailscale_netcheck` | NAT タイプ、DERP レイテンシーマップ、IPv4/IPv6 サポートの診断 | | `tailscale_local_version` | ローカルの `tailscale` バイナリのバージョン | | `tailscale_local_whoami` | このマシンがどのユーザーおよびデバイスとして認証されているか(tailscale >= 1.102.1 が必要) | | `tailscale_local_service_list` | *この* ノードから見える Tailscale Services(tailscale >= 1.102.1 が必要) |

GitOps:CI から ACL をデプロイする

「マージ時に Git から ACL をデプロイする」というシンプルなワークフローには、MCP サーバーもエージェントも必要ありません。組み込みの CLI を使います。

# PR check: validate the proposed policy without touching the tailnet
npx -y @yawlabs/tailscale-mcp@latest validate-acl tailscale/acl.json

# On merge: ETag fetch + validate + deploy with If-Match, fail-closed at every step
npx -y @yawlabs/tailscale-mcp@latest deploy-acl tailscale/acl.json

どの CI システムでも動作します。環境変数として TAILSCALE_API_KEY を設定してください。TAILSCALE_TAILNET は任意です。未設定の場合はキー自身の tailnet を対象とし、明示的に指定する場合は Tailnet ID を設定します。どちらのコマンドも失敗時にはゼロ以外で終了します。deploy-acl は ETag がない場合はデプロイを拒否するため、Admin Console での同時編集が気づかれないまま上書きされることはありません。また、412 を同時編集の競合として報告するため、再実行して解決できます。

検証でポリシーテストの失敗が報告されると、CI ログにはユーザー名とアサーション(For user [email protected]: / Errors found:)が記録されます。これは上流の gitops-pusher が出力するものと同じ詳細です。SCIM グループが同期されていない場合など、検証の 警告 でも実行は失敗します。これは gitops-pusher および Tailscale 独自の Go クライアントと同じ動作です。検出された内容を確認できるよう、警告のテキストも併せて出力されます。

PR で検証し、マージ時にデプロイする、GitHub Actions の完全なワークフローです。

name: tailscale-acl
on:
  pull_request:
    paths: ["tailscale/acl.json"]
  push:
    branches: [main]
    paths: ["tailscale/acl.json"]

jobs:
  acl:
    runs-on: ubuntu-latest
    env:
      TAILSCALE_API_KEY: ${{ secrets.TAILSCALE_API_KEY }}
      TAILSCALE_TAILNET: T1234CNTRL # Tailnet ID from Settings > General; or omit: defaults to the key's tailnet
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with: { node-version: 22 }
      - name: Validate ACL
        if: github.event_name == 'pull_request'
        run: npx -y @yawlabs/tailscale-mcp@latest validate-acl tailscale/acl.json
      - name: Deploy ACL
        if: github.event_name == 'push'
        run: npx -y @yawlabs/tailscale-mcp@latest deploy-acl tailscale/acl.json

再現性のあるデプロイを行うには、@latest を固定バージョンに置き換えてください。

代わりに curl で独自に実装する場合: Tailscale の ACL エンドポイントが ETag ヘッダーを返すのは GET の場合だけで、HEAD では返しません。curl -I(HEAD)で ETag を取得しようとすると、空の値が黙って返されます。空の If-Match は、ガードなしでデプロイされて同時編集が上書きされるか、ガードに引っかかってデプロイが失敗する結果になります。GET で ETag を取得し(curl -fsS -D - -o /dev/null ...)、値が空の場合はジョブを失敗させてください。上記の CLI はこれらをすべて処理します。

任意: Admin Console をロックして、Git と異なる手動編集を防止できます。エージェントに次のように依頼してください。

「aclsExternallyManagedOn を true に設定し、aclsExternalLink にリポジトリの URL を設定してください」

これにより、リポジトリへのリンクを示す読み取り専用のバナーが Tailscale Admin Console に表示されます。読み取りや調査には MCP を使い、デプロイは CI に任せてください。

要件

  • サーバーの実行には Node.js 20.11 以降(開発には 22 以降。テストスクリプトは node --test に glob を渡すため、Node 21 以降でサポートされています)
  • Tailscale API キーまたは OAuth クライアントの認証情報

oam.js での実行(任意)

oam.js はこのサーバーを変更せずに実行し、tailscale-mcp コマンドが使用するのは常に 最新の oam リリース(現在は 0.18.0) のみです。公開済みの oam 0.18.0 で検証済みです。完全な MCP ハンドシェイク、97 個すべての管理 API ツールと tailscale_tool_groups、4 個すべてのリソース、同一のエラーレスポンス、クリーンな標準出力のプロトコルストリームを確認しています。配布済みバンドルからだけでなく、ビルド手順なしで TypeScript ソースから直接実行した場合も同様です。

oam 0.18.0 が最小バージョンです。 ここで最低バージョンを定めることが重要なのは、0.9.0 より前のリリースでは child_process.execFile の引数がシェル経由で処理され、空白で再分割されたうえ、引数内のシェルのメタ文字が実行されていたためです。このサーバーはローカル CLI ツール全体で tailscale バイナリをシェル経由で呼び出すため、これは理論上の問題ではなく、実際に到達可能なバグでした。

tailscale-mcp コマンド(bin/tailscale-mcp.mjs)が実行環境を選択する方法は次のとおりです。

  • TAILSCALE_MCP_RUNTIME=auto(デフォルト) — クライアントが oam 0.18.0 以降で oam run を使ってすでに起動している場合、サーバーはそのプロセス内で実行されます。それ以外の場合、OAM_BIN が 0.18.0 以降ならそれを使い、そうでなければ見つかったすべての oam バイナリにバージョンを問い合わせます。対象は、設定されている場合の OAM_INSTALL_DIR、次に Windows では %LOCALAPPDATA%\oam\bin と ~/.oam/bin、それ以外では ~/.oam/bin、最後に PATH です。その中で最低バージョン以上の最も新しいものを使用します(同じバージョンの場合はインストール済みのコピーが優先されます)。見つからなければ Node で実行します。0.18.0 より古い oam ホストがサーバー自体を実行することはありません。使用可能な最新の oam に引き継ぐか、PATH 上の Node に引き継ぐか、どちらもない場合はエラーで終了します。oam を探す際、渡された OAM_BIN が使われなかった場合は、その理由を標準エラーに出力します。見つかったものの使われなかった oam バイナリは、使用可能な oam が見つからなかった場合に限り、それぞれの理由とともに出力されます。
  • TAILSCALE_MCP_RUNTIME=oam — 同じですが、Node にフォールバックせずエラーで終了します。エラーには、実際に見つかったものに応じた対処方法が記載されます。最低バージョンより古い oam の場合は oam self-update、起動できないバイナリの場合はバイナリの確認、何も見つからなかった場合は oam のインストールです(oam のビルドが公開されていない linux-arm64 では、インストールしても解決しません)。
  • TAILSCALE_MCP_RUNTIME=node — 常に Node を使います。npx の場合はプロセス内で実行し、クライアントが oam run でコマンドを起動した場合は PATH 上の Node に引き継ぎます。

値の大文字・小文字は区別されません。それ以外の値は標準エラーに警告が出力され、auto として扱われます。Windows では oam.exe のみが対象です。oam.cmd/oam.bat のシムは実行されず、使用可能な oam が見つからなかった場合に限り、標準エラーにその名前が出力されます。

サンドボックス化(オプトイン)

TAILSCALE_MCP_SANDBOX=1 を設定すると、oam の --permission モデルで実行されます。ネットワークアクセスは api.tailscale.com:443 のみに制限されます。これは OAuth トークン交換を含め、バンドルが接続する唯一のホストであり、すべてのリクエストは HTTPS です。ファイルシステムへのアクセスは禁止されます。ローカル CLI ツールは tailscale バイナリをシェル経由で呼び出すため、子プロセスの起動は許可されたままです。その子プロセスはサーバーの環境変数を継承しますが、サンドボックス内では許可された変数のみが含まれます。そのため、TAILSCALE_* の設定に加え、バイナリを見つけるための PATH と、Windows プログラムの起動に必要な変数(SYSTEMROOT、WINDIR、SYSTEMDRIVE、TEMP/TMP、USERPROFILE、HOMEDRIVE/HOMEPATH、APPDATA、LOCALAPPDATA)、さらに HOME が許可リストに含まれています。oam は、Windows がすべての子プロセスに追加する変数も、このフィルター済み環境から取得するため、これらがないと CLI は SYSTEMROOT のない状態で起動します。oam はこれらの名前を大文字・小文字も含めて完全一致で照合するため、Windows ではクライアントが Explorer から継承した環境で使用されている表記(Path、SystemRoot、SystemDrive、windir など)も、ランチャーがそれぞれ許可します。

サンドボックス内では、TAILSCALE_BINARY は Node ベースのラッパースクリプトではなく、ネイティブの tailscale CLI を指す必要があります。Node と同様、oam は権限フラグを NODE_OPTIONS 経由ですべての子プロセスに渡すため、Node はそこで --allow-net と --allow-env を拒否し、何も実行する前に終了します。ネイティブ CLI はこの変数を無視します。 デフォルトではなくオプトイン方式なのは、誤った許可を与えても明確なエラーにならないためです。oam は、許可されていない環境変数を例外をスローするのではなく、process.env から存在しない状態にすることで拒否します。そのため、許可が不十分な TAILSCALE_API_KEY は「拒否」ではなく「未認証」として読み取られます。ランチャーの環境変数許可リストは、実際に配布バンドルが読み取る環境変数に基づいています。新しい process.env の参照を追加した場合は、その環境変数を許可リストにも追加してください。

サンドボックスは tailscale-mcp コマンドによって適用されます。このコマンドは、クライアントが oam run でコマンドを起動した場合でも、新しい oam プロセスを起動します。これは、--permission がプロセスレベルのフラグだからです。起動可能な oam が見つからない場合、TAILSCALE_MCP_RUNTIME=auto はサンドボックスなしでサーバーを起動します。これをエラーにするには、TAILSCALE_MCP_RUNTIME=oam を設定してください。TAILSCALE_MCP_RUNTIME=node は Node で実行するため、サンドボックスは適用されません。

サンドボックスは CLI のサブコマンドにも適用されます。また、ファイルシステムへのアクセスが拒否されるため、tailscale-mcp validate-acl <file> / deploy-acl <file> はポリシーファイルを読み取れません。これらのコマンドでは TAILSCALE_MCP_SANDBOX の設定を解除してください。たとえば、サーバー用にシェルプロファイルでこの環境変数をエクスポートしている場合は、TAILSCALE_MCP_SANDBOX= tailscale-mcp validate-acl policy.hujson を実行します。

{
  "mcpServers": {
    "tailscale": {
      "command": "oam",
      "args": ["run", "/path/to/tailscale-mcp/dist/index.js"]
    }
  }
}

ご自身のハードウェアで起動時間を計測してください。 MCP クライアントはセッションごとにこのサーバーをコールドスタートするため、実際に発生するコストは起動時間です。計測したマシンでは、node が勝り、ウォームアップ後の 10 回の実行で oam run の 1554ms に対して 437ms でした(先に行った 5 回の計測では 326ms 対 427ms でした。マシンが高負荷だったため、数値の大きさにはばらつきがあるものの、傾向を示す結果として捉えてください)。これらの実行では 0.18.0 の最低バージョンより前の oam を使っており、その後は再計測していないため、現在の性能ランキングとして解釈しないでください。

公開されている tailscale-mcp コマンドは、見つかった中で最も新しい利用可能な oam を優先します(上記を参照)。oam がない場合、この処理のコストはほとんどありません。確認するのはファイルの存在だけで、サブプロセスは起動しません。また、npm がすでに起動した Node プロセス内でサーバーを起動します。一方、oam がインストールされている場合、このコマンドは Node を起動し、見つかったすべての oam バイナリに対して --version を実行して最新のものを選び、その後で oam を起動するため、ランタイムを直接指定する場合より常に遅くなります。oam の場合は上記の設定、Node の場合は node /path/to/tailscale-mcp/dist/index.js をクライアントに指定してください。TAILSCALE_MCP_RUNTIME=node を設定すると、oam を完全にスキップします。

このリポジトリで oam が優位になる場面は 2 つあります。どちらもオプトイン方式で、npm パッケージには影響しません。

  • npm run check:oam — oam check(tsgo、TypeScript 7 ネイティブ)を使って型チェックします。計測値は 4015ms で、tsc --noEmit の 7680ms に対して同じくエラーなしの結果でした。ポータブルなデフォルトとしては、引き続き npx tsc --noEmit を使ってください。
  • npm run build:binary:oam — oam compile を使ってスタンドアロンバイナリをビルドします(計測値は約 57.7 MB)。bin/<platform>-<arch>/(クロスビルドの場合は bin/$TAILSCALE_MCP_BINARY_TARGET/)に書き出し、scripts/stage-release-asset.mjs がそれを公開アセット名でステージングします。このバイナリを再配布する場合、oam のランタイムが埋め込まれているため、oam の LICENSE、NOTICE、THIRD_PARTY_LICENSES.md も同梱してください。クロスビルド(TAILSCALE_MCP_BINARY_TARGET=<platform>-<arch>)では、対象プラットフォーム用の oam リリースバイナリをキャリアとしてダウンロードし、リリースの署名付き RELEASE-MANIFEST と照合します。検証には、oam の scripts/oam-release-keys/ にあるリリースキーを使い、ssh-keygen -Y verify(OpenSSH 8.1 以降)を実行します。署名、マニフェスト、チェックサムのいずれかが検証できない場合、処理を中止します。oam がリリースへの署名を始める前に公開された v0.18.0 より古い OAM_VERSION は、そのタグ用に scripts/oam-release-keys/presigning-sums に固定されたダイジェストと SHA256SUMS ファイルが一致した場合に限り、SHA256SUMS のみを使って検証します。

ソースは意図的にランタイムに依存しない状態に保っています。oam: のインポートは一切なく、テストには引き続き node:test を使います。これにより、Node のフォールバックは名目上だけでなく、実際に利用できるものになります。なお、oam を実行すると、作業ディレクトリの oam/ にバイトコードキャッシュが書き込まれます。ここはすでに .gitignore に含まれています。

貢献

貢献を歓迎します。PR のワークフローと AI エージェントのガイドラインについては、CONTRIBUTING.mdをご覧ください。誤字修正以外の内容で PR を作成する前に、まずイシューを作成してご相談ください。

git clone https://github.com/YawLabs/tailscale-mcp.git
cd tailscale-mcp
npm install
npm run lint       # Biome check
npm run lint:fix   # Auto-fix
npm run build      # tsc + esbuild bundle
npm test           # node --test (full suite)

ご自身の tailnet を使って統合テストを行うには、TAILSCALE_API_KEY を設定して node dist/index.js を実行してください。

セキュリティ

脆弱性を見つけましたか? SECURITY.mdをご覧ください。公開イシューではなく、GitHub の非公開脆弱性報告機能をご利用ください。

ライセンス

MIT

X で @YawLabs をフォロー

コメント

MCP は初めてですか?

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

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